From 95e7bfcf4285d529a4abd045e5c1b52f802083b2 Mon Sep 17 00:00:00 2001 From: Noah Petherbridge Date: Sun, 28 Mar 2021 17:20:15 -0700 Subject: [PATCH] Doodad sprites and lots more documentation --- docs/about.md | 10 +- docs/controls.md | 21 ++ docs/custom-doodads/edit-in-game.md | 2 +- docs/custom-doodads/index.md | 8 +- docs/custom-levels/index.md | 32 ++- docs/doodad-tool.md | 21 +- docs/doodads.md | 260 ++++++++++++++++++----- docs/hacking.md | 7 +- docs/hotkeys.md | 2 +- docs/images/doodads/bird.gif | Bin 0 -> 14943 bytes docs/images/doodads/blue-button.png | Bin 0 -> 785 bytes docs/images/doodads/blue-door.gif | Bin 0 -> 4603 bytes docs/images/doodads/blue-key.png | Bin 0 -> 732 bytes docs/images/doodads/blue-off.png | Bin 0 -> 668 bytes docs/images/doodads/blue-on.png | Bin 0 -> 713 bytes docs/images/doodads/button-a.gif | Bin 0 -> 1722 bytes docs/images/doodads/button-b.gif | Bin 0 -> 1696 bytes docs/images/doodads/crumbly-floor.gif | Bin 0 -> 13078 bytes docs/images/doodads/electric-door.gif | Bin 0 -> 12989 bytes docs/images/doodads/exit-flag.png | Bin 0 -> 932 bytes docs/images/doodads/green-key.png | Bin 0 -> 714 bytes docs/images/doodads/orange-button.png | Bin 0 -> 805 bytes docs/images/doodads/orange-off.png | Bin 0 -> 669 bytes docs/images/doodads/orange-on.png | Bin 0 -> 717 bytes docs/images/doodads/red-azulian.gif | Bin 0 -> 3433 bytes docs/images/doodads/red-key.png | Bin 0 -> 699 bytes docs/images/doodads/small-key-door.gif | Bin 0 -> 4812 bytes docs/images/doodads/small-key.png | Bin 0 -> 682 bytes docs/images/doodads/start-flag.png | Bin 0 -> 6541 bytes docs/images/doodads/sticky-button.gif | Bin 0 -> 1742 bytes docs/images/doodads/switch-right.gif | Bin 0 -> 1729 bytes docs/images/doodads/switch.gif | Bin 0 -> 1763 bytes docs/images/doodads/trapdoor-down.gif | Bin 0 -> 11059 bytes docs/images/doodads/warp-blue-off.png | Bin 0 -> 685 bytes docs/images/doodads/warp-blue-on.png | Bin 0 -> 850 bytes docs/images/doodads/warp-door-blue.gif | Bin 0 -> 12735 bytes docs/images/doodads/warp-door-orange.gif | Bin 0 -> 12735 bytes docs/images/doodads/warp-door.gif | Bin 0 -> 12721 bytes docs/images/doodads/warp-orange-off.png | Bin 0 -> 687 bytes docs/images/doodads/warp-orange-on.png | Bin 0 -> 832 bytes docs/images/doodads/yellow-key.png | Bin 0 -> 728 bytes docs/index.md | 11 +- docs/licenses.md | 183 ++++++++++++++++ docs/profile-directory.md | 2 +- mkdocs.yml | 6 +- 45 files changed, 479 insertions(+), 86 deletions(-) create mode 100644 docs/controls.md create mode 100644 docs/images/doodads/bird.gif create mode 100644 docs/images/doodads/blue-button.png create mode 100644 docs/images/doodads/blue-door.gif create mode 100644 docs/images/doodads/blue-key.png create mode 100644 docs/images/doodads/blue-off.png create mode 100644 docs/images/doodads/blue-on.png create mode 100644 docs/images/doodads/button-a.gif create mode 100644 docs/images/doodads/button-b.gif create mode 100644 docs/images/doodads/crumbly-floor.gif create mode 100644 docs/images/doodads/electric-door.gif create mode 100644 docs/images/doodads/exit-flag.png create mode 100644 docs/images/doodads/green-key.png create mode 100644 docs/images/doodads/orange-button.png create mode 100644 docs/images/doodads/orange-off.png create mode 100644 docs/images/doodads/orange-on.png create mode 100644 docs/images/doodads/red-azulian.gif create mode 100644 docs/images/doodads/red-key.png create mode 100644 docs/images/doodads/small-key-door.gif create mode 100644 docs/images/doodads/small-key.png create mode 100644 docs/images/doodads/start-flag.png create mode 100644 docs/images/doodads/sticky-button.gif create mode 100644 docs/images/doodads/switch-right.gif create mode 100644 docs/images/doodads/switch.gif create mode 100644 docs/images/doodads/trapdoor-down.gif create mode 100644 docs/images/doodads/warp-blue-off.png create mode 100644 docs/images/doodads/warp-blue-on.png create mode 100644 docs/images/doodads/warp-door-blue.gif create mode 100644 docs/images/doodads/warp-door-orange.gif create mode 100644 docs/images/doodads/warp-door.gif create mode 100644 docs/images/doodads/warp-orange-off.png create mode 100644 docs/images/doodads/warp-orange-on.png create mode 100644 docs/images/doodads/yellow-key.png create mode 100644 docs/licenses.md diff --git a/docs/about.md b/docs/about.md index 0359a4b..cc47baa 100644 --- a/docs/about.md +++ b/docs/about.md @@ -1,6 +1,6 @@ -# About Project: Doodle +# About _Sketchy Maze_ -Project: Doodle is a "drawing-based maze game" themed around hand-drawn mazes +**Sketchy Maze** is a "drawing-based maze game" themed around hand-drawn maps on paper. ![Screenshot of the level editor](images/about.png) @@ -10,8 +10,8 @@ and then drag and drop pre-made "[doodads](doodads.md)" into your level for interactive things like keys, doors and buttons. This is an **early alpha build** of the game. Longer term it will include a couple -built-in "single player campaigns" of multiple themed levels, but for now it -just includes a couple example levels and the editor itself. +of built-in "single player campaigns" of multiple themed levels, but for now it +just includes a few example levels and the editor itself. ## Inspiration @@ -27,7 +27,7 @@ you've got!) When you're drawing with a pen and paper, the level can be anything you want. You can draw a castle or a cave, place little gizmos and traps throughout the -level (doors, keys, buttons and things) to create puzzles. Do you want the red +level (doors, keys, buttons and things) and create puzzles. Do you want the red pixels to mean "fire" and burn the player? Or do you want to decorate the tops of "bloody" spikes with red? Either way, the 'fire' attribute on that color will do the job and you can draw whatever shape you want for your level hazards. diff --git a/docs/controls.md b/docs/controls.md new file mode 100644 index 0000000..fadf2ae --- /dev/null +++ b/docs/controls.md @@ -0,0 +1,21 @@ +# Controls + +**Sketchy Maze** currently uses a mouse and keyboard for inputs, but eventually +will be usable from gamepad controllers, especially if it branches out and +targets platforms other than desktop computers in the future. + +## During Gameplay + +While playing a level, the following keys are used to control the player character: + +* **Left** and **Right** arrow keys move the player left or right. +* **Up** arrow to make the player jump. +* **Space Bar** is used to "activate" certain doodads. Currently, only the + [Warp Doors](doodads.md#warp-doors) require deliberate activation; Buttons and + Switches activate _automatically_ when the player character (or other mobile + doodad) touches them. + +## Hotkeys + +See the [Hotkeys](hotkeys.md) page for shortcut keys, especially around the +Level Editor feature. diff --git a/docs/custom-doodads/edit-in-game.md b/docs/custom-doodads/edit-in-game.md index d25c276..78805ca 100644 --- a/docs/custom-doodads/edit-in-game.md +++ b/docs/custom-doodads/edit-in-game.md @@ -1,6 +1,6 @@ # Drawing a Doodad In-Game -Project: Doodle has support for drawing your custom doodad sprites in-game, +Sketchy Maze has support for drawing your custom doodad sprites in-game, although for now you may find it more comfortable to use an [external image editor](edit-external.md) instead. diff --git a/docs/custom-doodads/index.md b/docs/custom-doodads/index.md index 67fa6fc..ea86f9e 100644 --- a/docs/custom-doodads/index.md +++ b/docs/custom-doodads/index.md @@ -1,10 +1,10 @@ # Creating Custom Doodads -Project: Doodle is designed to be modder friendly and provides tools to help +Sketchy Maze is designed to be modder friendly and provides tools to help you create your own custom doodads to use in your levels. You can draw the sprites for the doodad either in-game or using an external -image editor. Then, you can program their logic using JavaScript to make them +image editor. Then, you can program their behavior using JavaScript to make them "do" stuff in-game and interact with the player and other doodads. * Drawing your Doodad's Sprites @@ -17,7 +17,7 @@ image editor. Then, you can program their logic using JavaScript to make them Your copy of the game should have shipped with a `doodad` command-line tool bundled with it. On Windows it's called `doodad.exe` and should be in the same -folder as the game executable. On Mac OS, it is inside the .app bundle. +folder as the game executable. On Mac OS, it is located inside the .app bundle. The `doodad` tool provides a command-line interface to create and inspect doodad and level files from the game. You'll need to use this tool, at the very @@ -40,4 +40,4 @@ $ doodad install-script index.js custom.doodad $ doodad show --script custom.doodad ``` -More info on the [`doodad` tool](../doodad-tool.md) here. +More info on the [`doodad` program](../doodad-tool.md) here. diff --git a/docs/custom-levels/index.md b/docs/custom-levels/index.md index 001c95b..79bb9c6 100644 --- a/docs/custom-levels/index.md +++ b/docs/custom-levels/index.md @@ -33,7 +33,7 @@ You can change these settings later if you change your mind. ### Wallpaper -The wallpaper affects the "theme" of your level. Project: Doodle is themed around +The wallpaper affects the "theme" of your level. Sketchy Maze is themed around hand-drawn mazes on paper, so the built-in themes look like various kinds of paper. @@ -119,6 +119,10 @@ Levels are designed to have a limited color palette, and this is your selection of colors for the level or doodad you're drawing. You can click on "Add Color" to create more rows as needed. +> **NOTICE:** Modifying the color of an existing swatch on your Palette will also +> change any pixels _already on your level_ to the new color. Drawings in this +> game use an indexed palette, similar to GIF and some PNG images! + ### Color Attributes The **Attributes** column toggles behaviors on or off for this color. In the default @@ -143,11 +147,12 @@ or `#0099FF` for light blue. Colors can be entered in the following formats (the # prefix is actually optional): * 3-digit hexadecimal: `#F0F` or `#09F` -* 6-digital hexadecimal: `#0099FF` or `#FC390E` -* 8-digit RGBA: `#0000FF99` +* 6-digit hexadecimal: `#0099FF` or `#FC390E` +* 8-digit RGBA: `#0000FF99` - a color with semi-transparency! -You can also set the color to be **semi-transparent** by providing an -additional two hex characters for its alpha channel: +You can set the color to be **semi-transparent** by providing the 8-digit RGBA +color code; the extra two digits control the transparency between 00 (fully +invisible) and FF (fully opaque). ![Enter an RGBA color value for see-thru colors](../images/palette-rgba.png) @@ -163,17 +168,18 @@ pressing the `d` key, the Doodads window will appear in the level editor: Doodads are objects you drag and drop into your level to add interactive elements such as enemies and buttons. Mousing over a doodad will tell you its name, and -the pager buttons at the bottom can show more options. +the pager buttons at the bottom can show more options. See the +[list of built-in doodads](../doodads.md) for details on what each one does. Click and drag a doodad from the Doodads window onto your level to place it. -When the **Doodad Tool** is active on the left toolbar, when you mouse over an +While the **Doodad Tool** is active on the left toolbar, when you mouse over an existing doodad on your level, and orange box will appear around it. You may click and drag to move this doodad somewhere else. Right-click it to remove it from your level. -* Left click: move a doodad somewhere else on your level. -* Right click: remove the doodad from your level. +* Left click: **move a doodad** somewhere else on your level. +* Right click: **removes the doodad** from your level. Doodads provide various useful features to your level: @@ -188,6 +194,14 @@ Doodads provide various useful features to your level: To connect buttons to control doors, use the **Link Tool.** +### How do I remove a doodad from my level? + +Select the **Doodad Tool** +to adjust the doodads already on your level. + +To remove a doodad: either **right-click on it** or else drag it from your level +back into the Doodads window and release, and it will be gone from your level. + ## Link Tool The **Link Tool** diff --git a/docs/doodad-tool.md b/docs/doodad-tool.md index 02c3ef0..eb429b5 100644 --- a/docs/doodad-tool.md +++ b/docs/doodad-tool.md @@ -14,9 +14,14 @@ The `doodad` tool should be in the same place as the game executable. On Windows, the program is called `doodad.exe` and comes in the zip file next to the game executable, `doodle.exe`. -On Linux, it will typically be at `/opt/project-doodle/doodad`. +On Linux, it will typically be at `/opt/sketchymaze/doodad` if you installed +the game from a .rpm or .deb package, or else for Flatpak it's included within +the app bundle and invoked like so: -On Mac OS, it is found inside the .app bundle. + $ flatpak run com.sketchymaze.Doodle doodad --help + +On Mac OS, it is found inside the .app bundle; right-click the 'Sketchy Maze.app' +to find the option to browse inside the .app bundle. ## Usage @@ -29,11 +34,11 @@ subcommand and `--help` to get help on that command, for example: doodad convert --help ``` -# Examples +## Examples Here are some common scenarios and use cases for the doodad tool. -## Show +### Show ```bash # Usage: @@ -84,14 +89,14 @@ Chunks: Use -chunks or -verbose to serialize Chunks ``` -## Convert +### Convert ```bash # Usage: doodad convert [options] ``` -### Creating a Doodad from PNG images +#### Creating a Doodad from PNG images Suppose you have PNG images named "frame0.png" through "frame3.png" and want to create a doodad from those images. This will convert them to the doodad @@ -105,13 +110,13 @@ doodad convert frame0.png frame1.png frame2.png frame3.png custom.doodad doodad convert --tag color=blue frame{0,1,2,3}.png custom.doodad ``` -### Convert a level to a PNG image +#### Convert a level to a PNG image ```bash doodad convert my.level output.png ``` -### Create a level from a PNG image +#### Create a level from a PNG image ```bash doodad convert level.png output.level diff --git a/docs/doodads.md b/docs/doodads.md index 384c8ac..1f08178 100644 --- a/docs/doodads.md +++ b/docs/doodads.md @@ -1,123 +1,287 @@ -# Doodads +# Built-in Doodads -Project:Doodle comes with several built-in doodads that you can use in your +Sketchy Maze comes with several built-in doodads that you can use in your levels. You may also [create your own](custom-doodads/index.md) custom doodads and program them to do whatever you want! +Doodads are available in the Level Editor by clicking on the + **Doodad Tool** +and then dragging a doodad onto your level. See the [Doodad Tool](custom-levels/index.md#doodad-tool) +for more information. + +* [Flags](#flags) + * [Start Flag](#start-flag) + * [Exit Flag](#exit-flag) +* [Doors & Trapdoors](#doors-trapdoors) + * [Locked Doors & Keys](#locked-doors-keys) + * [Small Key Doors](#small-key-doors) + * [Warp Doors](#warp-doors) + * [Trapdoors](#trapdoors) + * [Crumbly Floor](#crumbly-floor) +* [Gizmos](#gizmos) + * [Buttons](#buttons) + * [Sticky Button](#sticky-button) + * [Switches](#switches) + * [Electric Door](#electric-door) +* [Boolean State Doodads](#boolean-state-doodads) + * [State Button](#state-button) + * [State Blocks](#state-blocks) + * [Blue & Orange Warp Doors](#blue-orange-warp-doors) +* [Creatures](#creatures) + * [Red Bird](#red-bird) + * [Red Azulian (test mob)](#red-azulian-test-mob) + --- -## Flags +# Flags -The **Start Flag** sets the player spawn point in your level. There should be -only one start flag. +## Start Flag -The **Exit Flag** sets a goal point for the level. The player must touch this -flag to win the level. +![Start Flag](images/doodads/start-flag.png) ---- +The **Start Flag** sets the player spawn point in your level. There should be +only one start flag per level. -## Trapdoors +Multiple Start Flags in one level is considered to be an error; a warning is +flashed on-screen and the player will spawn at one of the flags at random. -Trapdoors come in four varieties: **Left**, **Right**, **Up**, or down (**Trapdoor**). +A level without a Start Flag will spawn the player at the 0,0 coordinate at +the top-left corner of the level, and flash an error about the missing Start +Flag. -A trapdoor is a one-way passage. If the player or other mobile doodad touches -the door from the "correct" side, the door will swing open. After the mobile -doodad has passed, the door will swing shut again. +## Exit Flag -When the door is shut, you can not open it from the "wrong" side and it behaves -as a solid wall. If the door is open you may run in from the wrong side. +![Exit Flag](images/doodads/exit-flag.png) + +The **Exit Flag** sets a goal point for the level. The player must touch this +flag to win the level. --- +# Doors & Trapdoors + ## Locked Doors & Keys +![Blue Locked Door](images/doodads/blue-door.gif) ![Blue Key](images/doodads/blue-key.png) + There are four pairs of **Colored Locked Doors and Keys** you can use on your level. Colored doors are locked and behave as a solid wall until the player or another mobile doodad "picks up" the Key of the same color. The doors may then be permanently unlocked if the player walks into them while holding the key. -Should the player lose the keys later, previously opened doors will remain -unlocked but the player will need to find another key to open more doors. +The **Colored Keys** are not consumed when used; with one key the player can +unlock many doors of the same color unless they lose the key. Currently there is +no method to lose keys except for the "drop all items" [cheat code](hacking.md#cheat-codes). + +A locked door has a golden padlock over its sprite; after being unlocked, the +padlock is missing even while the door is closed. Should the player lose the keys +later, previously opened doors will remain unlocked but the player will need to +find another key to open more doors. + +![Red Key](images/doodads/red-key.png) ![Green Key](images/doodads/green-key.png) ![Yellow Key](images/doodads/yellow-key.png) ![Blue Key](images/doodads/blue-key.png) -Each key/door pair also has a distinct shape: +Each key/door pair also has a distinct shape for color-impaired players: * **Red Key** (triangle) * **Green Key** (cross) * **Yellow Key** (star) * **Blue Key** (diamond) ---- +## Small Key Doors -## Electric Door +![Small Key Door](images/doodads/small-key-door.gif) ![Small Key](images/doodads/small-key.png) -The sci-fi electric door can only be opened when it receives a "power" signal -from a linked button or switch. See [Linked Doodads](#linked-doodads) below. +**Small Key Doors** are doors which consume the **Small Key** when unlocked. The +player or other mobile doodad may carry several Small Keys and they can only +unlock as many Small Key Doors as the number of keys they hold. -When the door receives a "power: on" signal it will open and allow passage to -the player or other mobile doodads. When it receives a "power: off" signal it -will close. +The Small Key Door is permanently unlocked after unlocking it once. A golden +padlock appears on the door when it's locked, which disappears after unlocking. + +## Warp Doors + +![Warp Door](images/doodads/warp-door.gif) + +The **Warp Door** allows the player character to fast travel between two remote +locations within the same level. The door is brown in color with a yellow "W" +symbol. + +To connect the doors together, drag two doors into your level and then use the +**Link Tool** to connect them. During gameplay, walk the player character to one +of the doors and press the Space Key to open it. The door will swing open and +shut and the player character exits from the other door. + +If a Warp Door is not linked to another door, a message will display indicating +that the door is "locked" and it can not be entered by the player. + +**See also:** the [Blue & Orange Warp Doors](#blue-orange-warp-doors) tied to the +[State Blocks](#state-blocks). + +## Trapdoors + +![Trapdoor](images/doodads/trapdoor-down.gif) + +A **Trapdoor** is a one-way passage. If the player or other mobile doodad touches +the door from the "correct" side, the door will swing open. After the mobile +doodad has passed, the door will swing shut again. + +When the door is shut, you can not open it from the "wrong" side and it behaves +as a solid wall. If the door is open you may run in from the wrong side. + +Trapdoors come in four variants: downward-facing (default), rightward, leftward +and upwards. + +## Crumbly Floor + +![Crumbly Floor](images/doodads/crumbly-floor.gif) + +The **Crumbly Floor** behaves as a solid ceiling when hit from below, and a +solid floor when walked on from above, but watch out! The floor will shake +and collapse after a moment beneath your feet. + +The floor will respawn after a while and forbids passage from the underside +of the doodad. --- +# Gizmos + +The gizmo doodads work best when **Linked** to other doodads in your level. For +example, a Button linked to an Electric Door will cause the door to open whenever +the button is pressed. + +**See also:** [Link Tool](custom-levels/index.md#link-tool) + ## Buttons -**Buttons** will emit a "power: on" signal to all doodads that they are -[Linked](#linking-doodads) to when the button is pressed by the player or -another mobile doodad. +![Button Type A](images/doodads/button-a.gif) ![Button Type B](images/doodads/button-b.gif) + +**Buttons** will emit a `power: on` signal to all doodads that they are +[linked to](custom-levels/index.md#link-tool) when the button is pressed by the +player or another mobile doodad. -When the button stops being pressed, it will emit a "power: off" signal to +When the button stops being pressed, it will emit a `power: off` signal to all connected doodads, which will generally close electric doors. -Buttons come in three varieties: +Buttons come in two varieties which are cosmetic only: * **Button:** a button with a grey arrow that pops back up when pressed. * **Button Type B:** a variation without the grey arrow but behaves the same. -* **Sticky Button:** a button with a red arrow that stays pressed in once pressed. -When a sticky button is pressed, it emits a "power: on" signal once and stays -pressed in forever. If the Sticky Button itself _receives_ "power: on" from another -button, it will pop back up. +## Sticky Button ---- +![Sticky Button](images/doodads/sticky-button.gif) + +The **Sticky Button** is a variant of the Button but with a red arrow on its side. + +When the Sticky Button is pressed, it will emit a `power: on` signal and it will +**remain pressed** forever -- unless the button itself receives a `power: on` +signal from another linked doodad, then it will pop back up and can be pressed +again. ## Switches -**Switches** will emit a `power: on` signal to [linked](#linked-doodads) doodads -when touched by the player or other mobile doodad, and then a `power: off` +![Switch](images/doodads/switch.gif) ![Switch Right](images/doodads/switch-right.gif) + +**Switches** will emit a `power: on` signal to any [linked](custom-levels/index.md#link-tool) +doodads when touched by the player or other mobile doodad, and then a `power: off` signal when touched again. -They come in various aesthetic flavors: +Switches come in a few different styles (all cosmetic in nature and behave the +same way): -* Wall switch (left, right) -* Floor switch -* On/Off "background" wall switch facing the screen +* On/Off "background" wall switch that faces the screen. +* Side-profile switches to attach to the side of a wall (left and right). +* Side-profile floor switch. ---- +## Electric Door -## Crumbly Floor +![Electric Door](images/doodads/electric-door.gif) -The **Crumbly Floor** behaves as a solid ceiling when hit from below, and a -solid floor when walked on from above, but watch out! The floor will shake -and collapse after a moment beneath your feet. +The sci-fi **Electric Door** can only be opened when it receives a "power" signal +from a linked button or switch. See [Linked Doodads](custom-levels/index.md#link-tool). -The floor will respawn after a while and forbids passage from the underside -of the doodad. +When the door receives a "power: on" signal it will open and allow passage to +the player or other mobile doodads. When it receives a "power: off" signal it +will close. --- +# Boolean State Doodads + +The **Boolean State Doodads** are a series of doodads which have a mutually +exclusive state from one another, with their state toggled by the "ON/OFF" +State Button. + +## State Button + +![Blue "On"](images/doodads/blue-button.png) ![Orange "Off"](images/doodads/orange-button.png) + +The **State Button** globally toggles the boolean state for all doodads in the +level which are sensitive to the state. + +The player character must jump into the ON/OFF block from below and hit it with +their head. From above, the ON/OFF block acts like a solid floor that the player +or other mobile doodads can stand on top of. + +In the future it will be possible to bonk the ON/OFF block from the sides or +top with enough force, but currently only hitting it from the bottom will flip +its state. + +* When the button is **OFF**, all **blue** state doodads are active. This is the default state. +* When the button is **ON**, all **orange** state doodads are active. + ## State Blocks +![Blue "On"](images/doodads/blue-on.png) ![Blue "Off"](images/doodads/blue-off.png) + +![Orange "Off"](images/doodads/orange-off.png) ![Orange "On"](images/doodads/orange-on.png) + **State Blocks** are blue and orange squares that keep opposite state from one another. In one state the block is solid, in another it is passable. The ON/OFF block will toggle all state blocks on the level to their opposite setting whenever it's touched by the player or other mobile doodad. +## Blue & Orange Warp Doors + +![Blue Warp Door](images/doodads/warp-door-blue.gif) ![Blue "Off" Door](images/doodads/warp-blue-off.png) + +![Orange "Off" Door](images/doodads/warp-orange-off.png) ![Orange Warp Door](images/doodads/warp-door-orange.gif) + +The **Blue & Orange Warp Doors** are variants of the [Warp Door](#warp-doors) that +are sensitive to the ON/OFF State Blocks. These doors can only be opened while the +door is in the "ON" (active) state -- when "OFF" (drawn as a hollow dotted outline) +the door can not be opened by the player. However, a player may still **exit** from +a de-activated door. + +The **Blue Warp Door** is active at the same time as the **Blue State Blocks**, +and vice versa for the **Orange Warp Door.** + --- +# Creatures + +## Red Bird + +![Bird](images/doodads/bird.gif) + +The **Bird** is a simple creature which flies left and right across your level, +changing direction when it encounters an obstacle. + +In the future, the bird will dive-bomb the player character in a diagonal +trajectory when it sees a shot it can take. This will harm the player if the +bird hits. If the bird hits the player, or misses and touches the ground, it +will fly back up to its original altitude and continue its A.I. program of +flying back and forth and searching for the player. + +Currently, however, the bird is harmless and does not dive bomb the player. + ## Red Azulian (Test Mob) +![Red Azulian](images/doodads/red-azulian.gif) + The red Azulian is a test mobile character. Not really an enemy, as he doesn't care about the player. diff --git a/docs/hacking.md b/docs/hacking.md index 89d3e5d..3d07d51 100644 --- a/docs/hacking.md +++ b/docs/hacking.md @@ -1,8 +1,9 @@ # Hacking -This page discusses some advanced features of the game. +This page discusses some advanced features of the game and targets a more +technical audience. -I've always loved it when developers kept debugging features in their released +I've always loved it when developers keep debugging features in their released games, and playing around with those and figuring out what makes the game tick. I purposely left some debug features in the game that you can play around with. @@ -216,7 +217,7 @@ undefined >$ d.EditDrawing("filename.level") ``` -It helps if you run Project: Doodle itself from a command line terminal, +It helps if you run Sketchy Maze itself from a command line terminal, so you can see its developer console output also on your terminal window. Using `Object.keys(d)` will show all the exported functions and variables from the internal game state. diff --git a/docs/hotkeys.md b/docs/hotkeys.md index 89a967e..b3851d0 100644 --- a/docs/hotkeys.md +++ b/docs/hotkeys.md @@ -1,6 +1,6 @@ # Shortcut Keys -Here are all the hotkeys/shortcuts used within Project: Doodle. +Here are all the hotkeys/shortcuts used within Sketchy Maze. * [Global Shortcuts](#global-shortcuts) * [Level Editor](#editor-only) diff --git a/docs/images/doodads/bird.gif b/docs/images/doodads/bird.gif new file mode 100644 index 0000000000000000000000000000000000000000..6c633c7667dd4966e73d09ab005f330d131bf9fe GIT binary patch literal 14943 zcmeHOdsI_L8vkw*lJMH)RYVIkfVxnH4Jch$#bbyVpvVRU3@;%MLIMfI5MDu63>EBR zEk^|esyswNLY2b$K$N0YDJ+QV14StaT3xkvrA2GEr_D}6cd^}d_w=vr;>F17_g#oh4hD#8)MW7}-*lguw|~!v!auX=p&iS~iOt;N`(26UYoz1+m%T9Dj}{ z)6)wLMXHqv5lZ+Xgj*0^tVAb>@O6E?U>bj> z$H@jvLJ(|}5#elfZ8iuqlAptZ=de(s)X7n&rKr<k{uL5M6? zK|08RZ?FgbpMd(HGPAfD;w4^&D#FYkz-Uyb`*HyQZ70CDr8?a=bvoU*^#J4%fbO&z z`}A4>pC_okbf#{84Ztto0;oTFcBWEL0dTAsz;0N~x^5R$I!KzU9D`3XH?-C;M<#=X8jCUVby@PHWx)p{rLL1s@3KZx=U$3b zGo@L<@-?}KZ+W&n%961bkxk8imE;_|;{m&~$7e~8+lqQM%TJjdZ1uY9a%Fgo53eMn z$ah|-Fr6tY3#KtmO}*5qt8>aJ_0jpBdjJ%3vtmW%O--iSBNUSklYrGtm0@i`N3<>U z^YqRDL04N$1G9%9dTlhPE(~4|x3$5Vv9Zyo}3)SeAG4lI44ek8hp%g^}}$_X0ntKUcEA8PV22bK@7%9CLb_>zLF3 zUz{#P+0U|mAz8JpVq9s&`nY|e*+&k^o^~n8izeou zo>zCzdOPLKyI!vGwpy0R%7yWTEJ5KNcgm^cuGt^gt?qpPbDrhq#~bPrkDEX3I%>}vJk)E3PE{(dOblj*u%FPATiJa4`2oRe1Y#-G}Uti}dkGy3z@~waNBqMO4!sBEu?LQ$Y7FdwV-FmA;5dYiL+C%t5c)Si453RyIn9TXvn>=M z4em$#*dAAgP4AH_6MObGh>qKDS=;9q8e*voc9;sWNqrXZ|KtY+-SDSllZdQ`3@lKA!BrXx`gazXqt- zD+|nOWEJnSGHErT>~GkeQoT2(c&*xm{vo}+VSh~ruRwUn%!DAi8?`YPdot$^5SN>V z*QRRfUTN0eY#g)Ob5L{pU5)d2w$`-&X(9MN!e&e;3ztNGBzupjQw;c{Pw?#qCf14a+=c`WkJcmpgeC~ zxVd18JdyL;Uh`sWLFoy>PTxdQ?p1MSPPAiLlnYb4UtGA7sBm^+SoBBpmLFbs>~|!1 ze01kMd4wv(hE_yV)AJM>AJQhVd=o3xibmZ{Rp)KwN0XwmHS252XarH2nVBMaha(8J zYa+Bs()UH#WO>S4uhwdJ`ky`#>GxVnM%U?>KH4j$S* z@_OyrYd3=y^&9s|Zuojz4@Qkmbxho4c6~KvdvcN-*m|pkj^pTdPgXu3zIvZATtm15};)c8~tm6O3YMst#o1MNm-n3)7zwC7H zF@)aQB>kO@Ml72Isrc+ldUA>M{(}pVu6;`#nw_hUG1vb!`^G2Kz|G40E<)P&rsMG1tPHRH YbUz$Z8oxS*Umg1yzdH63Q+nCo0pHX_MgRZ+ literal 0 HcmV?d00001 diff --git a/docs/images/doodads/blue-button.png b/docs/images/doodads/blue-button.png new file mode 100644 index 0000000000000000000000000000000000000000..9df37be4a69bb443b7a9ba393c694ec5f06b5677 GIT binary patch literal 785 zcmV+s1Md8ZP)EX>4Tx04R}tkv&MmKpe$iQ>7vm2MdZQWT=8*MO4I5t5Adrp;lNGFg)WK9P8q>4rtTK|H-_ z>74h8L#!ZYh|h^f4Z0xlBi9v|-#F(T7IO?@AxHhDdZ}G zkz)a6sE{2$_#gc4*33;#xJkh%(EeiEA45Q37pPZl`}^3o>nDK!8MxA#{&EeN`6RvC z)WSzV_cm~G-PDvl;Bp7(d(ve?b|gPdA(sQ*&*+=dK+i4Ex#srP*vIJukfg5SH^9Lm zFr26Cb&q#eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{008MpL_t(o!|hp74#OY_eVCr4JDg|oaO+jr&+Le?mNw4e z0$;`w@&de9R6@4I3;?{+zC|1F>#O_SVnreV2oj`8dt(cxK?<-m1yBG>tH*wA&+UUP zU=o`K=rld*rFYhQ>7Dgf$)xg%R1OI`znZ_s=N9X0fg_y;9?NMw^QH!lk*6A< zG+ulC0>Y0XeiZQw2xq;s-dW%0a3}jh4h2{Dd&dg-9mljqqL3GsK?1-F-+GHOz)AI3 P00000NkvXXu0mjf!dYHl literal 0 HcmV?d00001 diff --git a/docs/images/doodads/blue-door.gif b/docs/images/doodads/blue-door.gif new file mode 100644 index 0000000000000000000000000000000000000000..8bf19e305e3c8ca32cf4d012d0ba4a20bb70901b GIT binary patch literal 4603 zcmeHKX;f257Os%6gLW$*C{70(7gT6O5d>@zWHo41kgc0T2&*I*5)hR|pcP~@k;M=| zK!ONiiGTt^466_}St5(Fw2CN8RFt7@MM+n%&*14Z&it5P(}#P`d+&R5`2={QEv#&?Kusun$jtVb>3*!4j+QnO0cp@>WomlV!o*^S_6{9bwOBR* zPo$u<0U-JXkYNGZ!O;mV`3%T`^Bkz7KpIdA{K)X zD3EQBn!>RuK#cbK0=s>I@!n)15eDsoLF(>AKiGhn!)NR+!XY9|Bm~0FEt+VEavpwm z$KX>PUaG(XSOFV=1!&*~0)Y=8fB>KgpMKCo0Y_oE$yfMm7x`Goa)T@%fQO6&;3Oad z+#(-{J_3w^wv=3o=T4nP7edYi0P#_waCRdAl1Tu3q6vlb*M!1PIRGGs0jTp^;-Ab0 zKz|PUX-hu!EC5!X2Oy`SY02qE2cR+<0Of}y92vLR5E9`>=cEYb&MoisT^VK6$798=QyE){5jE!_GCP}H-+D?)c zXejMjZdBqRX`Yl^Bt z>~FN78{0~nJ1bhdRl4}H9sR2Y+r-6x){uEZTQ$-oE+H{Guti4tm2~opN$%T;5uKNU znQbEzztzlrWbhw08E!@GD4ED&~EUnZ%!^==JLuH_8rE6Cjws%bB`bkGm_yd+Pp zdVZgp*k)W2I5= z@x1J@=*f*Y1P!k+GjCdESG{l=KKQ}$quta!q;gZ1a)^{1cYl7jqG?32gxtg&X+0Z( zlENfMv!5X1X)4mF$NF90^Wwj+v{hIm$hAy-WfXS6ij{$(Y1o}QuPotZL(=nUz-*p1 z4$m++_;#0hcYCkLwyT58D*n?4c{;IAS#9JKy{U(@%0P%oNwd!4(Uz8%QwUqlPv)uA0M#j%HD4duXtGj8 zVK4Ixexl`5bLs2Zv%ORDJ#$+7e9wh%J{Wev$G|a$6n7>;FFO9Rb`mY+N2(zsje7p- zj`ZwnE9n{6H{HlBSkEkGv2UstmftF?P`Q1lx{7l+t5&(DA&+~nq@MR}OS?qVeVOhC zF)_QUK8_d?+22(*G*abm`>Y?W-%EODwwGC!syj$6BE;F5IqZ#CASfnJblWN>T4yINZ(`u@vwT)sIs*M|l;VHe#ON!!`(%2b zSet_8-VEpnApUx~^QfQT+@0+1iu8YmS+wp(9nRi{`J%-9bE^)cZtp-x)|<}dij z^ZivAW=#5&uD(sM>==0`|HrYhnKK)L&jlTi_#wc+G(6fk#+ekAfF{x|8zrfE`6M#d z;4)G(m9vAdGOe%2-N@HrUC1deVDE`9yJb^UTy?uTpL34OtkbKgX)z_Kh|^9!MB@7X5sva%`%l=SjQ3ysNxp=7BB}$$2-p3yG2vF#FiU za^VPR6#BGQckOu@m5TXO09SW`Et3z=pj^^UEksjWmA zGsrnrL0iXj=cULm4yOKCQ+ME-v(~= w#)jLm>}lH)d^s7}o~+q-%Vi);M1& literal 0 HcmV?d00001 diff --git a/docs/images/doodads/blue-key.png b/docs/images/doodads/blue-key.png new file mode 100644 index 0000000000000000000000000000000000000000..11e435505989be54bde7fb533ee3509da11f9635 GIT binary patch literal 732 zcmV<20wev2P)EX>4Tx04R}tkv&MmKpe$i(~2S$5j%)DWT@g`K~%(1t5Adrp;l;i>s5Oi(#2^TSJ6x7Cd0O_tqy@z;xM`D3n8b(L zpKov|$5ASkN~Kb%^sj=mCvWlKLfb=phGD{hHIy-5@2bfJwnyEhuWrOHdoQcyyJR-m zoCr>*wrWX&b(Au~$BeOTl3XubU?;9U}J!Zm`;LQ&J O0000EX>4Tx04R}tkv&MmKpe$iQ>7vm2MdZQWT=8*MO4I5t5Adrp;lNGFg)WK9P8q>4rtTK|H-_ z>74h8L#!ZYh|h^f4Z0xlBi9v|-#F(T7IO?@AxHhDdZ}G zkz)a6sE{2$_#gc4*33;#xJkh%(EeiEA45Q37pPZl`}^3o>nDK!8MxA#{&EeN`6RvC z)WSzV_cm~G-PDvl;Bp7(d(ve?b|gPdA(sQ*&*+=dK+i4Ex#srP*vIJukfg5SH^9Lm zFr26Cb&q#eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{004AJL_t(o!|j%HX5Wx-jIu8T989VtgXnaTEX>4Tx04R}tkv&MmKpe$iQ>7vm2MdZQWT=8*MO4I5t5Adrp;lNGFg)WK9P8q>4rtTK|H-_ z>74h8L#!ZYh|h^f4Z0xlBi9v|-#F(T7IO?@AxHhDdZ}G zkz)a6sE{2$_#gc4*33;#xJkh%(EeiEA45Q37pPZl`}^3o>nDK!8MxA#{&EeN`6RvC z)WSzV_cm~G-PDvl;Bp7(d(ve?b|gPdA(sQ*&*+=dK+i4Ex#srP*vIJukfg5SH^9Lm zFr26Cb&q#eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{005y$L_t(o!|j>L4S+BV1lNd4LM;?WO;Af(fd}UY#38_z zX8(>RiJh!$)2z1dLV+{IGW?xVi2&?1PYjC?%O7 zqzkF3Q3Mf$vB)B<1jP`AB1=+Yfrj*AYGR1q&YjWxvicl&;NItV&-4F3&wb9lN2xlR zU!Y4zI=+Jsv)Sx+y9rW%igp$EURRhb&8ocLIAg+@`NE|wn1 z5r*)3POMTW%9V0uZceV00|cHrgViC*0jxGBOA}0G)oCXDBSeTLeG)Qs28X>!tuCdf zAhG%e{MvYx#jh1a6f7NWG&u}F2txvy!Ol8~wZw-SoOYhOi6sV$&PaThIFqFpB!0{1 z^;`Uz=Ndl?2q9rB$`y1r2{BW%jrH5uU|~5ci4Kw|&1kjJ27<~hHuBuav$f7eFXs>b zh*2in2@Q>DbR|Iv70RFn13g@*MID^TqR~bf2g+$)9>kyM_p8aJCs!>DL3S?Aj6-+{Z;e3fXL+c;QxFGoIO|Wy!;Z=-}7L)ZD97vdQ6M2Y{ayl-7_V87yF=H!m-a6X zN;>zHw7B9^zO~1kn{JtyNb&g^?)1(zH-+u)UhZ<`D>H6(_l7U4|J`Cc{j}9*JN@*( z^^-1WKY723M})Ge)ywmTlUJT+TUG?o9_^?&Az9ISf243T?Ah?*v_^D(OvXMMGRGg! e)<&GvwpD*B7`I5hvb@C6#@92CpYA;c6#fG0dw)Lw literal 0 HcmV?d00001 diff --git a/docs/images/doodads/button-b.gif b/docs/images/doodads/button-b.gif new file mode 100644 index 0000000000000000000000000000000000000000..7c9c0d1538ba04b4c2e8eac2c33daf20e0d4d28e GIT binary patch literal 1696 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 literal 0 HcmV?d00001 diff --git a/docs/images/doodads/electric-door.gif b/docs/images/doodads/electric-door.gif new file mode 100644 index 0000000000000000000000000000000000000000..932747dd3b38c1043fe2f9fa0fa5d7dbe4b8c9cb GIT binary patch literal 12989 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 literal 0 HcmV?d00001 diff --git a/docs/images/doodads/orange-button.png b/docs/images/doodads/orange-button.png new file mode 100644 index 0000000000000000000000000000000000000000..fbf2cde382788b501ce1f69f3c9ac91aaccc4bf3 GIT binary patch literal 805 zcmV+=1KRwFP)EX>4Tx04R}tkv&MmKpe$iQ>7vm2MdZQWT=8*MO4I5t5Adrp;lNGFg)WK9P8q>4rtTK|H-_ z>74h8L#!ZYh|h^f4Z0xlBi9v|-#F(T7IO?@AxHhDdZ}G zkz)a6sE{2$_#gc4*33;#xJkh%(EeiEA45Q37pPZl`}^3o>nDK!8MxA#{&EeN`6RvC z)WSzV_cm~G-PDvl;Bp7(d(ve?b|gPdA(sQ*&*+=dK+i4Ex#srP*vIJukfg5SH^9Lm zFr26Cb&q#eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{008|-L_t(o!|hqy4Z|P|JX@WF4#!Lk*Q`Q+3ZhDAVu$jO zYzYZDgq+Skz=ZIz7!Uz~TtxP5l>1VDtGUR70Dw!7Gg`vNGlML_(h5KU;PETRMjLIf z+-EFe%K%*_M=kWGdJDa&epWGwL*RD@hSPCJW6qxM7$p~xniOQsrx{aIeQK;>GKOy! z{s~r;qqQ(e!QRTzo{K#BYx$UoaL;k7*D^n3dD4LG0#p+2;fInK(W+ptAq jXX>zf5U0+}AOYYFpxlp6xq2ob00000NkvXXu0mjf0EX>4Tx04R}tkv&MmKpe$iQ>7vm2MdZQWT=8*MO4I5t5Adrp;lNGFg)WK9P8q>4rtTK|H-_ z>74h8L#!ZYh|h^f4Z0xlBi9v|-#F(T7IO?@AxHhDdZ}G zkz)a6sE{2$_#gc4*33;#xJkh%(EeiEA45Q37pPZl`}^3o>nDK!8MxA#{&EeN`6RvC z)WSzV_cm~G-PDvl;Bp7(d(ve?b|gPdA(sQ*&*+=dK+i4Ex#srP*vIJukfg5SH^9Lm zFr26Cb&q#eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{004DKL_t(o!|j(QYs{L=9q&n zNydwzK|jjAJH>jCSFSRXsSTy~u0Y+YQAy(ye=EX>4Tx04R}tkv&MmKpe$iQ>7vm2MdZQWT=8*MO4I5t5Adrp;lNGFg)WK9P8q>4rtTK|H-_ z>74h8L#!ZYh|h^f4Z0xlBi9v|-#F(T7IO?@AxHhDdZ}G zkz)a6sE{2$_#gc4*33;#xJkh%(EeiEA45Q37pPZl`}^3o>nDK!8MxA#{&EeN`6RvC z)WSzV_cm~G-PDvl;Bp7(d(ve?b|gPdA(sQ*&*+=dK+i4Ex#srP*vIJukfg5SH^9Lm zFr26Cb&q#T02y>eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{005;)L_t(o!|j>D4S*mFMSlsC;4BX3Ogamz-~obOnkWX- zCjTF}kdjB*!Vd_V%8mkqk`)4=4pt%Wu+ky3O~~B10-PvnJJ6JpzU!GW@#(^KLNAfo zF>X>%P=dNUo_g24)#Mo7Ol&5CS~4YHn&fv=G9sE1f)doVDH&>eniAG1L4BGMzLc;= z2})4Qri3pg&QjmMZ}MRma@imOxIUe%LIS`EN8mir6ek6g00000NkvXXu0mjf(&;pP literal 0 HcmV?d00001 diff --git a/docs/images/doodads/red-azulian.gif b/docs/images/doodads/red-azulian.gif new file mode 100644 index 0000000000000000000000000000000000000000..9d93f3aa3e3e5339ea786629eee5cbec693b82d7 GIT binary patch literal 3433 zcmZ?wbhEHbRA5kG_{hL8lY!ws5X}VA42nNlI7Jwk85I8sIv1rTmZYXAlxLP?D7bt2 z1~4f8=k{|A33hf2a5d61U}glV|Ih8|>>T9oInF$Kt817zzI0UZcr-vEgxLD+9V>~t`j3CLs+ zDGCX42Kr3|$W};4VkaT7lQW9`=K>X(02QgE#wX~sriAx0i21_su9|NnnhWnf^R%)sz>!vFuj z7ykeMcM$^v^Bo3;19=Gj`3o2rEWQH8Cm_UB<})zxw=gg)+I9pXm^7V%VS76RgT&2( z#G*v7Ma)2wDJ_kG;nQ*k2Hr>p2H^_~3|!H`kOKxB5P;+v7GGyz2muC`&skv7oW;PP zmJT#L28YKvfEwTdhgS_W02y>Zc7Reo15^H-{*|ZS@-Loa(x`RtD1XOU!+YX-i$63z zEm-vA)~@_z+Z-RPx+`6^w?8&5f3eQ(lFrOS@~3ZoDA}vS zb*UkzXhP;!D-QMKTj?`?Jl=La{G4w5ndJ-;6#+{HSFogg`|>1!aPAt-N{}oznw5rH zRw{>PC6|P#fLs=(?Bk{J!d!FB<(6tLJ9cWD@GdsSZo4_`w|9sCfiIC0(L3fJ+P9?aV*wB@8cGrRBW#!wBNM5vl@~buQ{_4-WYx}>mK1&z= z@|`i@gqlZM@QUe^)W5Oa7|l|k!fdp5LR31#sCFvAUpsBx3ap)Oir%;M?cyxhe8yY( zx37&9uy!i$3Ar2`(zS?f=7GhVIG>z!xb9~#Ti5qu=GXSSe1u&=FI3;TZt}yeRewYx%|n|7Cwwzl W8XEj!lhY1~_Qr=>z6UZeSOWkq;q}P? literal 0 HcmV?d00001 diff --git a/docs/images/doodads/red-key.png b/docs/images/doodads/red-key.png new file mode 100644 index 0000000000000000000000000000000000000000..38db17399b7ce28fe853fb5c4046b4deb5df7909 GIT binary patch literal 699 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 literal 0 HcmV?d00001 diff --git a/docs/images/doodads/small-key.png b/docs/images/doodads/small-key.png new file mode 100644 index 0000000000000000000000000000000000000000..11e4eca0c732efb86766d1e3f0188aa244ebaf33 GIT binary patch literal 682 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 literal 0 HcmV?d00001 diff --git a/docs/images/doodads/switch.gif b/docs/images/doodads/switch.gif new file mode 100644 index 0000000000000000000000000000000000000000..d97b4a6bc6bd6afd69c7c758c20d089d6a43954b GIT binary patch literal 1763 zcmeH|ZAg<*6vzK=^DUJutwc*^SQ1T}Gt{&qoi;}*^R1kTx%Um+)NLwRhWLV&eUKcP zA-x#UJ_tdYM$wBVg-IY}rBN0YR$7sUL5V({XIA5_O!xG-GA0GzW0Dx-xb1dJxDnI`zz@*KYFYq-J%E3gg$3YDcOP9{rc z>;BokJ_frs9)_}O{W)e)ua{b5Q2|bTirAqlGFyrBi6hIbMJ%5r_EqT>YT`CxftfZ) zJjD8ybNqp2or5`q@HJ#C+WXRxV(b-pm*&Xfp)`tBocqz{#FtHOmKCHWrl7 z<{ZWz(Nkl}%Ahfrp4E^*iWJDehY}?)pa52c(r6-&1?e;&zev8nBVR^YO3E@oMHvYw zgb@lyKG=^yF=X@2wP+(m4wsW>Jm5USFkjXIu8qJ<1H(+8W0;v%fcp%%ZJN(7JPSlm zk-uTy7kma-S_8Cp_Rc$%O+Z&2;5S^PFe@B|xb)^|wZP;>z)KGJ3;;{^Qs<~~Wb8c7 zKLIkSS;-H8=2O6W9W9=_$idwx;dkTy8uPP(5U@4aKOdapmcn!W$Ch$ixC0@ZI%3A3 zSNKTwzluv8mDdW!ZhpLS+K}KBmHhVlMC@Q?cYaS({Wfdgh~1tbl%)9%?)TPrJ=NIy zrUD>8?1OOmen&w5{$a&Pcn8loQMb-DG}Z61e@@WxKq zTl3lubQZ4^mDWeJ->*?mUMM}itD!M-?W$_~<`}ssyXJkz_qLppfP%4UV?N%53D<0I t-}9-xTu`|2MaQUaMBvj~aZq}wvbrj;raZSUHKq2zQT_2oo1Z&ke*nYcgE#;H literal 0 HcmV?d00001 diff --git a/docs/images/doodads/trapdoor-down.gif b/docs/images/doodads/trapdoor-down.gif new file mode 100644 index 0000000000000000000000000000000000000000..21a371c7bfcfca1b5c11e71e935dbf8c2393edf4 GIT binary patch literal 11059 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 T!A`5E00000NkvXXu0mjfc{M4- literal 0 HcmV?d00001 diff --git a/docs/images/doodads/warp-blue-on.png b/docs/images/doodads/warp-blue-on.png new file mode 100644 index 0000000000000000000000000000000000000000..4921faf009a01c159aa4600a311711628302e041 GIT binary patch literal 850 zcmV-Y1FigtP)EX>4Tx04R}tkv&MmKpe$iQ>7vm2MdZQWT=8*MO4I5t5Adrp;lNGFg)WK9P8q>4rtTK|H-_ z>74h8L#!ZYh|h^f4Z0xlBi9v|-#F(T7IO?@AxHhDdZ}G zkz)a6sE{2$_#gc4*33;#xJkh%(EeiEA45Q37pPZl`}^3o>nDK!8MxA#{&EeN`6RvC z)WSzV_cm~G-PDvl;Bp7(d(ve?b|gPdA(sQ*&*+=dK+i4Ex#srP*vIJukfg5SH^9Lm zFr26Cb&q#eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{00AmVL_t(&-tE~x4uUWg2Jr6@PEtmW;DVQ7(Vdfcp0aQR zMtYSx7?F?$`xGd~uagj({@x!5ML{!o9AM-C0AtcBoI{3#jKe_kP@1C0yrf^u&7&3w zUIW0bHpIrm-_VcR|CY}%~Ti08fVNjB7wc~*QaXuC)BQ-C%bKk#IIlNAdY zv+;~PbZ%3~6f<2gbZ(c@gce*v*iv9iSvMovVM{@E!dSu(INK8e0M!Y&48j+q^pJD! zacy45*9N#1K25XU3J)~$`km^oSpu+G;~!}JcY-}a2qARf9L;wH) literal 0 HcmV?d00001 diff --git a/docs/images/doodads/warp-door-blue.gif b/docs/images/doodads/warp-door-blue.gif new file mode 100644 index 0000000000000000000000000000000000000000..4af0f2c20b80a4627bca8df574fd25e2a48aeae8 GIT binary patch literal 12735 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 IPo~l6F9{>os{jB1 literal 0 HcmV?d00001 diff --git a/docs/images/doodads/warp-door-orange.gif b/docs/images/doodads/warp-door-orange.gif new file mode 100644 index 0000000000000000000000000000000000000000..ccfa42cdbdb11b7466f16b00687897d6dc8868b6 GIT binary patch literal 12735 zcmeHNX;f3!7T!q+lhD301uCrp0YwG@sRKN%42lSqc@VV-VK8Dy2mvZMATv^#WEL@D zhR7`7@E9y0hz2Pv1_37oEs9j(NkuH_33S!2_0;~>ch6eM`PROBpL6d{&Ug3OXPcRC z-?+(587yHMz$Xyy1OY!2_*bB*75IEuYD#lLqB007Eqr0Z^mJo+dXR&ttOH~-^Y5%d ziN9>uHhVi0BkOH?+ByWBK##x7+{DDz%-Bpn z@cJMYLx3|7mZ2PQ^Fa7K!kSEUg9r}_b|F&;sXVcOf8pl1_!hV1<}?EW`Q zIl$!8kdi)9Qt_bqq6zTMOV~qzj|edBPyo8Q#U^+}2~S@KJJhS7k0O|XIeZ7!Kn8aR z04f{;7HFZ~7fJlV7F{=fkNua6_SVSC9a&Ls)`Yb$W{; zoP;p|@h+b~qY5B$8sPUtK7XFW=l`AyKo|jN_I+zlX9H|}iR6iIWh&Kv7De8uH!?Uk2W+PdU> zg!;d_K&s=7kcWn4c(=2;17D99H#}raf07w=*5!nRF~^qY0|U~!(Bk%Hme@`)rBvqUY5Z)*p$ zaK~x&Z_~ssiFxy~wW+T)#b(Bo*&4A^DY2}?5}P$SQ3iwEt`01xwd}!82O~WE6LDZH zvBVx2OJFR4vBdkr3ydW&mcU{OESC82CIn*%j3qFZz*quf2`n%1S6<_j$xDQx{Djep zcVy@Y3mZ|sBB8@vw#-pZFZ5PMZ6v8G;GT}wz{RvLALH0Amy?g)n7HDkBb`v#Ys1LC zPjw7eI@Rtr^LUsO)3>@?U5i=oSeTw=7g%$;XwHDPk3Hd^nLSqB?prw@A3u?I#Q*S7 z-4g-fVIl4j2Lt0`{f_%ZF^rRm8O&&xEg6{_31^Zt&Z(xj8WnOF1tbxX(#`%kJIaNt zoHvz~ROm#NR~m`bUnG-+uj;fka#S0nZry52mFkebAvD-qa=Wsne~8Xgz2Da}Tr%F* zDlOdF)HyWy=*IK0nXw9d*2GAM$o!<=GUfd%nofv*t~RE|P!f*(OhJ^|(LLDeC#Ip5 zG@fK_uk@qnH^zH$X8D_AYc0#GGkU%-OQP?6G=0Flr!Bo$o*G8=e`uLwVD&R+qDHca z&1D+Dj`1(gE-)@sl8f9d%ICZhD`Kcq{s zNCk^jKE_Bzz(MakA|NcRMjS-np&O%U?}EF`C$lYwQXQO&gCA0pRO?Hhy>t&Whz=0T ztG-hd{hAg*9_1C71f~@3?H2oHeThtAz{&HY?zH00XEty|gIa0c&}|8tK@pYuT2P|C=O zE{*O1R_4f~>*L4!d&8ohNgoRzzWwXnKm~=F=fg1*{R>qyBI4w$`oc|O`9+oYo1;Wm zJnEIvb~KHWCe4Pw+NI{UJz8ENb!fwr{q6B`hC8LqC}aBTX{#F}COl<%wyJjJ5u1c~ zyK>waZ-jz{TdZ?+tt^#yYOm@k)T9rY4)v<{M>9srhoN;?p-ccnsNi7dNWC>e4mf)`ld^<;-sR+CokS7spMI zEZL-|+qH`PI$y7>W6(59SF&zI>M8ehmiYZj_x)Sbxp)&po`a0USf%{gf#D_sk$4R6 z8paF{h$P@}Ox(dZ*HaOpEU)BrMjG8ISv=S-&NRux;$-33-FZbBJ4?4YSDBPCDmc|f zm$qCnY}nAGf1&bn%f)LE_1Cr9JCnLjc9-A05!w15N>+~4(OY-!4&{Un3_j%K-Ya-8 z`jk6SJl6JX>c!y8*~ixGx!m6x7x-jR#b3xcEHc0r_9uC2`u@lOTiA;g5?IKOh5VmZ z$d4^-Y+++{PH3kBA7z~r_QuANbl4vI|7wqoCF!sv9pK35jfGV}V-?Tg LG=4lMjfQ^!xn|J= literal 0 HcmV?d00001 diff --git a/docs/images/doodads/warp-door.gif b/docs/images/doodads/warp-door.gif new file mode 100644 index 0000000000000000000000000000000000000000..5c6bb0cd2d43609ae0d1e00dacfa2c94fa22bf41 GIT binary patch literal 12721 zcmeHNc~DbV7rzNf1Qa{6Q@3CN7j~qe&{|oPA{4@oh#x{&j2IF^z)uuqUt9JiAYu|A zBt%FA0mY9+0YPjKVb}t-%A!S)DtuCbmV7VZl+IN2&(7DrJM;2>bM86!zI!t7_s%`{ zSXm$5x8HjQumv*!m~96hMyN2mZGmB+sTGJsV5Ob3tqEes^ ztou<9?7DHV0c-_IU^me5#)pv2a5&p{Grs3G*AK*FgI;a%SnpBzkVwYYF9Z(&0t+b} z#FHsh2%mtk(HSaPjA;;-$Dj1}h457fYf+#Fgz%tP?z4iY#5iCXBOwUnDb9`-(AvbF z!3O*R`}_gpPf|ogNXZaVQu8GSK@%X|SFo=bpBH1|=}_q5mYaBq8~lP?oS?fJbZr4v zz#4o5Z~zN@Kqw%9(|`)Jp?eS{2?35!zxf*WpDx?uAS)lpiU9DCg(V;XBJf_e2jV{g z(t+Blb3^?18Z3(t8_WSfKN5*%)d5(S1;B6VBGDp4B>IgBfW!y@%|Wa7Bsu{5-azv7 zRhilq06vKYfLYtRD)h+%pe_Lb8TuImmHP z6ZeDS0RWsKXW0q>$S(juBLEuQbB%>dLI%G(?t?n-90;_;bBNypAh9G_KeD9TVa;uD zej?ybW9QJ_nK{jdELu9T^7r*6j1!lXjFA!ZC&NfTU%hHGmZ??2`DfgiIw_aDO6^vko!}5ZmLhit}33kI6l{?DgNt92^HN2kvFJcZo zb9P=%V*1IVG5yEpi;B&vUtCLXk(S?iggx5o-?3fuyp}%F*XFfjn}*UaxWYkpv4)w7 z>HOx&3^l8CZG2E`2Zi-@*6y!zrEW?E2nuxw3tCdM<2&e@Nz>U$)O3!+o}ze@!EP@X zs+%r-u+zm12|h*~FiWhk2h0*MOTa9#R(Juk1k4g}ECI(7AKrw(ECI6w%n~q5z$^jh zC4SFq{B80Q(NKQkz3DlLC1ogIVc%h`P~p09Q{)3$O60P(h2vH2 zLHxzk)XC!WA!j4>qe5e%&-uij3QI`}z8D-&HqVrxQ4%~3(DF6YE@fz5QP1`=V=>63 zN*GM}mmx)8SE8@E@2}wS^x`Y|W|+DgSS9pry_QCXdV}nP2W>gB9dh@PgT0&~eoMcQ zBv60c*E7tS=xdcjw>EVOr=H$_H9kAeLlsPpbYK>zg4dg$*xnQ+`H9B323Zvow^2os z(9u2E8Z4!$oiUM&b5{LU@^f=fgjLCxNj0{WRkWT>Rv9GEr!yz5d)o5Y%7kb_$e3-B ziTy*yWVK8gol7xaNDN_jvJ!J2{mRMysjJ+cW0FIlI$yChFYafcrJp+-uc_SVN23zU z`GlSY$L`#zgP6UpFAHppd0r``*9%*}$og5~P9kFc;qTu*9KDP1+(tuV*MogF?#$WX5SO0>R44OQd!uf*mbp@&RdwDyg|5;mQ}^kAjn0!D&UuFiMtXSZ zhMJzSIUAv2>~=g|43KXjjl=1twi!r zC=BYVY##5@oybcKOox=cpLI4|LIjsQ>{07;ABYxak3@B8b`MbVN1ooBxY*wt9sg49 zLd@{c&yT`XRAyfdCr1)VH_YaYScl z4@-+Av=sL4?kjOScGypv!5vs91s$Ax!^>LG9Jd(n_n zqPR0P&)CIR=n%ke)Og#aZ^ErPmo{HCcVL^1qC6snn+A?VJdKu-!RTszC1A8ghZn+AiSa}F`;ot6pDg6mE!eXY$Vk` zGmo50a?6wscS^C$@U=;1T|Qb|Mmth|$o-l{1)0aFGP`-;mT7}=li_uKeanrzv32*f z+dDJ5lDjLvzaQ87AACWPY{Y{f9tn#g2L{I&%pXgijK1Jbvd7zAPQM;}GxrQfpJ)Ek zxFo_#Zutp|fM0AlGWc5_m%=YL{KbYt{(n@+4}YwL|fDCj@Yk4o=d+rO$BbGgv8){!{7mM+pQzV*Klm7)}2NO#!iq literal 0 HcmV?d00001 diff --git a/docs/images/doodads/warp-orange-off.png b/docs/images/doodads/warp-orange-off.png new file mode 100644 index 0000000000000000000000000000000000000000..476703a5db35acdcf9c2b3557b9259cc05d6fb33 GIT binary patch literal 687 zcmV;g0#N;lP)EX>4Tx04R}tkv&MmKpe$iQ>7vm2MdZQWT=8*MO4I5t5Adrp;lNGFg)WK9P8q>4rtTK|H-_ z>74h8L#!ZYh|h^f4Z0xlBi9v|-#F(T7IO?@AxHhDdZ}G zkz)a6sE{2$_#gc4*33;#xJkh%(EeiEA45Q37pPZl`}^3o>nDK!8MxA#{&EeN`6RvC z)WSzV_cm~G-PDvl;Bp7(d(ve?b|gPdA(sQ*&*+=dK+i4Ex#srP*vIJukfg5SH^9Lm zFr26Cb&q#eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{004(cL_t(&-tF4434kyVK+(&s;*ideA)Q4VBO)SV5mUTh zX;2bEo|Pr`mO0j`MmgWN>o?ERdHMhV002ovPDHLkV1m8mC_n%J literal 0 HcmV?d00001 diff --git a/docs/images/doodads/warp-orange-on.png b/docs/images/doodads/warp-orange-on.png new file mode 100644 index 0000000000000000000000000000000000000000..01a6a616c6cba9d352eecae79f08a2569d4f41af GIT binary patch literal 832 zcmV-G1Hb%EX>4Tx04R}tkv&MmKpe$iQ>7vm2MdZQWT=8*MO4I5t5Adrp;lNGFg)WK9P8q>4rtTK|H-_ z>74h8L#!ZYh|h^f4Z0xlBi9v|-#F(T7IO?@AxHhDdZ}G zkz)a6sE{2$_#gc4*33;#xJkh%(EeiEA45Q37pPZl`}^3o>nDK!8MxA#{&EeN`6RvC z)WSzV_cm~G-PDvl;Bp7(d(ve?b|gPdA(sQ*&*+=dK+i4Ex#srP*vIJukfg5SH^9Lm zFr26Cb&q#eSad^gZEa<4bO1wgWnpw> zWFU8GbZ8()Nlj2!fese{009_DL_t(&-tE~<4uc>N1>o1lli<=Lbi-*_x%VO-$c;x} zDOYJ1H1(&{f;*DjE5JCtcgb+dqA%qY@$m#bruh;#pO+jvPg|F=^+o1Sxyn735S;e0000< KMNUMnLSTZ??rDes literal 0 HcmV?d00001 diff --git a/docs/images/doodads/yellow-key.png b/docs/images/doodads/yellow-key.png new file mode 100644 index 0000000000000000000000000000000000000000..c83c7386a9f92070c4432260bcf264a1cdba3cf7 GIT binary patch literal 728 zcmV;}0w?{6P)EX>4Tx04R}tkv&MmKpe$i(~2S$5j%)DWT@g`K~%(1t5Adrp;l;i>s5OivPG^vMsG+av!J`xv|s;|y`DNe$4$}`sdC8P33uKAIE%p3_KBywIPsML z;~CO(%TwviY$m2v_C&wA=N@t%EHSt@oKo$rng^>JtGgXL*6jhV=2$LB4HotQ0000< KMNUMnLSTY(j5av{ literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md index af59981..56ec5dc 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,14 +1,16 @@ -# Welcome to Project: Doodle +# Welcome to _Sketchy Maze_ ![](images/main-menu.png) -[Project: Doodle](about.md) is a drawing-based maze game themed around hand-drawn +[Sketchy Maze](about.md) is a drawing-based maze game themed around hand-drawn maps on paper. You can draw a level for a 2D platformer game, drag-and-drop -"doodads" such as buttons and doors into your level, and play it. +"doodads" such as buttons and doors into your level, play it and share your +levels with others. ## Table of Contents -* [About Project: Doodle](about.md) +* [About Sketchy Maze](about.md) +* [Gameplay Controls](controls.md) * [Creating Custom Levels](custom-levels/index.md) * [The Built-in Doodads](doodads.md) * [Creating Custom Doodads](custom-doodads/index.md) @@ -18,3 +20,4 @@ maps on paper. You can draw a level for a 2D platformer game, drag-and-drop * [Shortcut Keys](hotkeys.md) * [The `doodad` command-line tool](doodad-tool.md) * [Hacking and debugging](hacking.md) +* [Open Source Licenses](licenses.md) diff --git a/docs/licenses.md b/docs/licenses.md new file mode 100644 index 0000000..b0aa98a --- /dev/null +++ b/docs/licenses.md @@ -0,0 +1,183 @@ +# Open Source Licenses + +## DejaVu Fonts + +_(from https://dejavu-fonts.github.io/License.html)_ + +Fonts are © Bitstream (see below). DejaVu changes are in public domain. Explanation of copyright is on [Gnome page on Bitstream Vera fonts](http://gnome.org/fonts/). Glyphs imported from [Arev](https://dejavu-fonts.github.io/Bitstream_Vera_Derivatives.html) fonts are © Tavmjung Bah (see below) + +### Bitstream Vera Fonts Copyright + +Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream Vera is a trademark of Bitstream, Inc. + +Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: + +The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. + +The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Bitstream" or the word "Vera". + +This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Bitstream Vera" names. + +The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the names of Gnome, the Gnome Foundation, and Bitstream Inc., shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from the Gnome Foundation or Bitstream Inc., respectively. For further information, contact: fonts at gnome dot org. + +### Arev Fonts Copyright + +[Original text](http://tavmjong.free.fr/FONTS/ArevCopyright.txt) + +Copyright (c) 2006 by Tavmjong Bah. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy of the fonts accompanying this license ("Fonts") and associated documentation files (the "Font Software"), to reproduce and distribute the modifications to the Bitstream Vera Font Software, including without limitation the rights to use, copy, merge, publish, distribute, and/or sell copies of the Font Software, and to permit persons to whom the Font Software is furnished to do so, subject to the following conditions: + +The above copyright and trademark notices and this permission notice shall be included in all copies of one or more of the Font Software typefaces. + +The Font Software may be modified, altered, or added to, and in particular the designs of glyphs or characters in the Fonts may be modified and additional glyphs or characters may be added to the Fonts, only if the fonts are renamed to names not containing either the words "Tavmjong Bah" or the word "Arev". + +This License becomes null and void to the extent applicable to Fonts or Font Software that has been modified and is distributed under the "Tavmjong Bah Arev" names. + +The Font Software may be sold as part of a larger software package but no copy of one or more of the Font Software typefaces may be sold by itself. + +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL TAVMJONG BAH BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. + +Except as contained in this notice, the name of Tavmjong Bah shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Font Software without prior written authorization from Tavmjong Bah. For further information, contact: tavmjong @ free . fr. + + +## Go Modules + +### github.com/robertkrimen/otto + +``` +Copyright (c) 2012 Robert Krimen + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### github.com/satori/go.uuid + +``` +Copyright (C) 2013-2018 by Maxim Bublis + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +``` + +### github.com/urfave/cli + +``` +MIT License + +Copyright (c) 2016 Jeremy Saenz & Contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +``` + +### github.com/veandco/go-sdl2 + +``` +Copyright (c) 2013, Go-SDL2 Authors +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, +this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright +notice, this list of conditions and the following disclaimer in the +documentation and/or other materials provided with the distribution. + * Neither the name of Go-SDL2 nor the names of its contributors may be +used to endorse or promote products derived from this software without specific +prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` + +### github.com/vmihailenco/msgpack + +``` +Copyright (c) 2013 The github.com/vmihailenco/msgpack Authors. +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +``` diff --git a/docs/profile-directory.md b/docs/profile-directory.md index a3cc9e8..ee331d5 100644 --- a/docs/profile-directory.md +++ b/docs/profile-directory.md @@ -1,6 +1,6 @@ # Profile Directory -Project: Doodle stores your user-created levels and custom doodads in your +Sketchy Maze stores your user-created levels and custom doodads in your operating system's profile directory for your account. This will typically be found at the following locations based on your platform: diff --git a/mkdocs.yml b/mkdocs.yml index a0c6dc0..f08d51b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,16 +1,18 @@ -site_name: "Project: Doodle Guidebook" +site_name: "Sketchy Maze: Guidebook" use_directory_urls: false nav: - Home: index.md - About: about.md + - Controls: controls.md - "Creating Levels": custom-levels/index.md - "Built-in Doodads": doodads.md - "Creating Doodads": custom-doodads/index.md - "Drawing Doodads": custom-doodads/edit-in-game.md - "Doodad Scripts": custom-doodads/scripts.md - "Shortcut Keys": hotkeys.md - - "`doodad` Tool": doodad-tool.md + - "`doodad` Program": doodad-tool.md - "Hacking": hacking.md + - "Open Source Licenses": licenses.md theme: readthedocs markdown_extensions: - toc: