diff --git a/Changes.md b/Changes.md index 59b31c4..b7f0614 100644 --- a/Changes.md +++ b/Changes.md @@ -1,5 +1,51 @@ # Changes +## v0.5.0-alpha + +Project: Doodle is renamed to Sketchy Maze in this release. + +New Features: + +* **New Tutorial Levels:** the bundled levels demonstrate the built-in doodads + and how they interact and shows off several game features. +* **Level Editor:** you can now set the Title and Author of the level you're + editing by using the Level->Page Settings window. +* The **Inventory HUD** in Play Mode now shows a small number indicator for items + which have quantity, such as the Small Key. Colored Keys do not have quantity + and don't show a number: those are permanent collectibles. +* **Fire Pixels:** when the player character dies by touching a "Fire" pixel + during gameplay, the death message uses the **name** of the color instead + of calling it "fire." For example, if you name a color "spikes" and give + it the Fire attribute, it will say "Watch out for spikes!" if the player + dies by touching it. +* New cheat code: `give all keys` gives all four colored keys and 99x Small Keys + to the player character. The `drop all items` cheat clears your inventory. + +New Doodads: + +* **Warp Doors** allow the player character to fast travel to another location + on the map. Drag two Warp Doors into your level and use the Link Tool to + connect them together. Doors without an exit link will be "locked" and don't + open. +* **Small Key Doors** are locked doors which consume the Small Keys when unlocked, + unlike the colored doors where the key is multi-use. The player character can + hold many small keys at once and only unlock as many doors as he has keys. + +Updated Doodads: + +* **Several doodads** were increased in size to better match the player character: + Colored Locked Doors, Trapdoors, the Crumbly Floor and Electric Door, and the + blue and orange Boolean State Blocks. +* **Colored Doors** now have a visual locked vs. unlocked state: while locked, a + golden padlock hangs from the door, which goes away after it's been unlocked. +* **Switches** now interact differently with Electric Doors: the door will _always_ + toggle its current state regardless of the 'power' setting of the Switch. +* **Buttons** which are linked to a **Sticky Button** will press and stay down + if the linked Sticky Button is pressed. Or in other words, the Sticky Button + makes all linked Buttons act sticky too and stay pressed while the Sticky + Button is pressed. If the Sticky Button is released later (e.g. by receiving + power from a Switch) it releases its linked Buttons as well. + ## v0.4.0-alpha This update brings improvements to the editor; you can now fully draw all the diff --git a/cmd/doodle/main.go b/cmd/doodle/main.go index 3b285c8..0a33fa1 100644 --- a/cmd/doodle/main.go +++ b/cmd/doodle/main.go @@ -15,6 +15,7 @@ import ( "git.kirsle.net/apps/doodle/pkg/bindata" "git.kirsle.net/apps/doodle/pkg/branding" "git.kirsle.net/apps/doodle/pkg/log" + "git.kirsle.net/apps/doodle/pkg/shmem" "git.kirsle.net/apps/doodle/pkg/sound" "git.kirsle.net/go/render/sdl" "github.com/urfave/cli/v2" @@ -85,6 +86,10 @@ func main() { Name: "experimental", Usage: "enable experimental Feature Flags", }, + &cli.BoolFlag{ + Name: "offline", + Usage: "offline mode, disables check for new updates", + }, } app.Action = func(c *cli.Context) error { @@ -113,6 +118,11 @@ func main() { balance.FeaturesOn() } + // Offline mode? + if c.Bool("offline") { + shmem.OfflineMode = true + } + // SDL engine. engine := sdl.New( fmt.Sprintf("%s v%s", branding.AppName, branding.Version), diff --git a/pkg/balance/numbers.go b/pkg/balance/numbers.go index d2221b7..46ae609 100644 --- a/pkg/balance/numbers.go +++ b/pkg/balance/numbers.go @@ -48,7 +48,7 @@ var ( PlayerCharacterDoodad = "boy.doodad" // Level name for the title screen. - DemoLevelName = "example 1.level" + DemoLevelName = "Tutorial 3.level" ) // Edit Mode Values diff --git a/pkg/main_scene.go b/pkg/main_scene.go index 3378fba..ef6f36d 100644 --- a/pkg/main_scene.go +++ b/pkg/main_scene.go @@ -9,6 +9,7 @@ import ( "git.kirsle.net/apps/doodle/pkg/log" "git.kirsle.net/apps/doodle/pkg/native" "git.kirsle.net/apps/doodle/pkg/scripting" + "git.kirsle.net/apps/doodle/pkg/shmem" "git.kirsle.net/apps/doodle/pkg/uix" "git.kirsle.net/apps/doodle/pkg/updater" "git.kirsle.net/go/render" @@ -27,6 +28,7 @@ type MainScene struct { // UI components. labelTitle *ui.Label labelVersion *ui.Label + labelHint *ui.Label frame *ui.Frame // Main button frame // Update check variables. @@ -70,6 +72,17 @@ func (s *MainScene) Setup(d *Doodle) error { ver.Compute(d.Engine) s.labelVersion = ver + // Arrow Keys hint label (scroll the demo level). + s.labelHint = ui.NewLabel(ui.Label{ + Text: "Hint: press the Arrow keys", + Font: render.Text{ + Size: 16, + Color: render.Grey, + Shadow: render.Purple, + }, + }) + s.labelHint.Compute(d.Engine) + // "Update Available" button. s.updateButton = ui.NewButton("Update Button", ui.NewLabel(ui.Label{ Text: "An update is available!", @@ -144,6 +157,11 @@ func (s *MainScene) Setup(d *Doodle) error { // checkUpdate checks for a version update and shows the button. func (s *MainScene) checkUpdate() { + if shmem.OfflineMode { + log.Info("OfflineMode: skip updates check") + return + } + info, err := updater.Check() if err != nil { log.Error(err.Error()) @@ -244,6 +262,13 @@ func (s *MainScene) Draw(d *Doodle) error { }) s.labelVersion.Present(d.Engine, s.labelVersion.Point()) + // Hint label. + s.labelHint.MoveTo(render.Point{ + X: d.width - s.labelHint.Size().W - 32, + Y: d.height - s.labelHint.Size().H - 32, + }) + s.labelHint.Present(d.Engine, s.labelHint.Point()) + // Update button. s.updateButton.MoveTo(render.Point{ X: 24, diff --git a/pkg/shmem/globals.go b/pkg/shmem/globals.go index 5556252..08379e3 100644 --- a/pkg/shmem/globals.go +++ b/pkg/shmem/globals.go @@ -19,6 +19,9 @@ var ( // The level.Chunk.ToBitmap() uses this to cache a texture image. CurrentRenderEngine render.Engine + // Offline mode, if True then the updates check in MainScene is skipped. + OfflineMode bool + // Globally available Flash() function so we can emit text to the Doodle UI. Flash func(string, ...interface{})