From 9b75f1b0390adfe52bc4e4427724ccb6a7204fc4 Mon Sep 17 00:00:00 2001 From: Noah Petherbridge Date: Tue, 3 May 2022 21:15:39 -0700 Subject: [PATCH] Spit and polish * New built-in wallpaper: "Dotted paper (dark)" is a dark-themed wallpaper. * New built-in palette: "Neon Bright" with bright colors for dark levels. * New cheat: "warp whistle" to automatically win the level. * In case the user has a VERY LARGE screen resolution bigger than the full bounds of a Bounded level, the Play Scene will cap the size and center the level canvas onto the window. This is preferable to being able to see beyond the level's boundaries and hitting an invisible wall in-game. * Make the titlescreen Lazy Scroll work on unbounded levels. It can't bounce off scroll boundaries but it will reverse course if it reaches the level's furthest limits. * Bugfix: characters' white eyes were transparent in-game. Multiple culprits from the `doodad convert` tool defaulting the chroma key to white, to the SDL2 textures considering white to be transparent. For the latter, the game offsets the color by -1 blue. --- assets/wallpapers/dots-dark.png | Bin 0 -> 10419 bytes cmd/doodad/commands/convert.go | 20 ++++++++----- dev-assets/doodads/box/box.js | 1 - dev-assets/doodads/gems/totem.js | 8 ----- dev-assets/doodads/snake/snake.js | 4 --- pkg/balance/cheats.go | 1 + pkg/balance/theme.go | 4 +++ pkg/cheats.go | 18 ++++++++---- pkg/level/chunk.go | 5 ++++ pkg/level/palette_defaults.go | 38 ++++++++++++++++++++++++ pkg/main_scene.go | 39 +++++++++++++++++++++++-- pkg/play_scene.go | 47 ++++++++++++++++++++++++++---- pkg/uix/canvas_editable.go | 2 -- 13 files changed, 151 insertions(+), 36 deletions(-) create mode 100644 assets/wallpapers/dots-dark.png diff --git a/assets/wallpapers/dots-dark.png b/assets/wallpapers/dots-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..2f670aee736f12dd1678c8e6d2bf31e7021074be GIT binary patch literal 10419 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 hUpe_ta 500 * time.Millisecond) { state = states.attacking; @@ -88,7 +85,6 @@ function main() { // If we are attacking and gravity has claimed us back. if (state === states.attacking && Self.Grounded()) { - console.log("Landed again after jump!"); state = states.idle; jumpCooldownStart = time.Now(); Self.StopAnimation(); diff --git a/pkg/balance/cheats.go b/pkg/balance/cheats.go index 59f9d2d..c87ee81 100644 --- a/pkg/balance/cheats.go +++ b/pkg/balance/cheats.go @@ -30,6 +30,7 @@ var ( CheatGodMode = "god mode" CheatDebugLoadScreen = "test load screen" CheatUnlockLevels = "master key" + CheatSkipLevel = "warp whistle" ) // Global cheat boolean states. diff --git a/pkg/balance/theme.go b/pkg/balance/theme.go index 3c9e280..cffefb2 100644 --- a/pkg/balance/theme.go +++ b/pkg/balance/theme.go @@ -234,6 +234,10 @@ var ( Label: "Dotted paper", Value: "dots.png", }, + { + Label: "Dotted paper (dark)", + Value: "dots-dark.png", + }, { Label: "Blueprint", Value: "blueprint.png", diff --git a/pkg/cheats.go b/pkg/cheats.go index b133107..ccd2a2c 100644 --- a/pkg/cheats.go +++ b/pkg/cheats.go @@ -142,11 +142,6 @@ func (c Command) cheatCommand(d *Doodle) bool { d.FlashError("Use this cheat in Play Mode to clear your inventory.") } - case balance.CheatPlayAsBird: - balance.PlayerCharacterDoodad = "bird-red.doodad" - setPlayerCharacter = true - d.Flash("Set default player character to Bird (red)") - case balance.CheatGodMode: if isPlay { d.Flash("God mode toggled") @@ -181,6 +176,18 @@ func (c Command) cheatCommand(d *Doodle) bool { d.Flash("All locked Story Mode levels are again locked.") } + case balance.CheatSkipLevel: + if isPlay { + playScene.SetCheated() + playScene.ShowEndLevelModal( + true, + "Level Completed", + "Great job, you cheated and 'won' the level!", + ) + } else { + d.Flash("Use this cheat in Play Mode to instantly win the level.") + } + default: // See if it was an endorsed actor cheat. if filename, ok := balance.CheatActors[strings.ToLower(c.Raw)]; ok { @@ -195,6 +202,7 @@ func (c Command) cheatCommand(d *Doodle) bool { // If we're setting the player character and in Play Mode, do it. if setPlayerCharacter && isPlay { + playScene.SetCheated() playScene.SetPlayerCharacter(balance.PlayerCharacterDoodad) } diff --git a/pkg/level/chunk.go b/pkg/level/chunk.go index 63d3b38..368de07 100644 --- a/pkg/level/chunk.go +++ b/pkg/level/chunk.go @@ -194,6 +194,11 @@ func (c *Chunk) ToBitmap(mask render.Color) image.Image { for px := range c.Iter() { var color = px.Swatch.Color + // Don't draw perfectly white pixels, SDL2 will make them invisible! + if color == render.White { + color.Blue-- + } + // If the swatch has a pattern, mesh it in. if px.Swatch.Pattern != "" { color = pattern.SampleColor(px.Swatch.Pattern, color, px.Point()) diff --git a/pkg/level/palette_defaults.go b/pkg/level/palette_defaults.go index fba575e..f913501 100644 --- a/pkg/level/palette_defaults.go +++ b/pkg/level/palette_defaults.go @@ -10,6 +10,7 @@ var ( "Default", "Colored Pencil", "Blueprint", + "Neon Bright", } DefaultPalettes = map[string]*Palette{ @@ -98,6 +99,43 @@ var ( }, }, + "Neon Bright": { + Swatches: []*Swatch{ + { + Name: "ground", + Color: render.MustHexColor("#FFE"), + Solid: true, + Pattern: "noise.png", + }, + { + Name: "grass green", + Color: render.Green, + Solid: true, + Pattern: "noise.png", + }, + { + Name: "fire", + Color: render.MustHexColor("#F90"), + Pattern: "marker.png", + }, + { + Name: "electricity", + Color: render.Yellow, + Pattern: "perlin.png", + }, + { + Name: "water", + Color: render.MustHexColor("#09F"), + Pattern: "ink.png", + }, + { + Name: "hint", + Color: render.Magenta, + Pattern: "marker.png", + }, + }, + }, + "Blueprint": { Swatches: []*Swatch{ { diff --git a/pkg/main_scene.go b/pkg/main_scene.go index d01e1be..bebaa97 100644 --- a/pkg/main_scene.go +++ b/pkg/main_scene.go @@ -588,12 +588,47 @@ func (s *MainScene) LoopLazyScroll() { } } } else { + var ( + // Bounded and bordered levels will naturally hit + // an edge and stop scrolling + bounceY = currentScroll.Y == lastScrollValue.Y + bounceX = currentScroll.X == lastScrollValue.X + worldsize = s.canvas.Chunker().WorldSize() + viewport = s.canvas.Viewport() + ) + + // In case of unbounded levels, set limits ourself. + if !bounceX { + if viewport.X < worldsize.X || viewport.X > worldsize.W { + bounceX = true + + // Set the trajectory the right direction immediately. + if viewport.X < worldsize.X { + s.lazyScrollTrajectory.X = 1 + } else { + s.lazyScrollTrajectory.X = -1 + } + } + } + if !bounceY { + if viewport.Y < worldsize.Y || viewport.Y > worldsize.H { + bounceY = true + + // Set the trajectory the right direction immediately. + if viewport.Y < worldsize.Y { + s.lazyScrollTrajectory.Y = 1 + } else { + s.lazyScrollTrajectory.Y = -1 + } + } + } + // Lazy bounce algorithm. - if currentScroll.Y == lastScrollValue.Y { + if bounceY { log.Debug("LoopLazyScroll: Hit a floor/ceiling") s.lazyScrollTrajectory.Y = -s.lazyScrollTrajectory.Y } - if currentScroll.X == lastScrollValue.X { + if bounceX { log.Debug("LoopLazyScroll: Hit the side of the map!") s.lazyScrollTrajectory.X = -s.lazyScrollTrajectory.X } diff --git a/pkg/play_scene.go b/pkg/play_scene.go index 3424c9a..58ff74b 100644 --- a/pkg/play_scene.go +++ b/pkg/play_scene.go @@ -207,8 +207,6 @@ func (s *PlayScene) setupAsync(d *Doodle) error { // Initialize the drawing canvas. s.drawing = uix.NewCanvas(balance.ChunkSize, false) s.drawing.Name = "play-canvas" - s.drawing.MoveTo(render.Origin) - s.drawing.Resize(render.NewRect(d.width, d.height)) s.drawing.Compute(d.Engine) // Handler when an actor touches water or fire. @@ -294,9 +292,46 @@ func (s *PlayScene) setupAsync(d *Doodle) error { s.perfectRun = true s.running = true + // // Cap the canvas size in case the user has an ultra HD monitor that's bigger + // // than a bounded level's limits. + // s.screen.Compute(d.Engine) + // s.PlaceResizeCanvas() + return nil } +// PlaceResizeCanvas updates the Canvas size and placement on the screen, +// e.g. if an ultra HD monitor plays a Bounded level where the entirety of a +// level bounds is on-screen, the drawing should be cut there and the +// canvas centered. +func (s *PlayScene) PlaceResizeCanvas() { + var ( + width = s.d.width + height = s.d.height + menubar = 0 + ) + + if s.menubar != nil { + menubar = s.menubar.Size().H + height -= menubar + } + + if s.Level != nil && s.Level.PageType >= level.Bounded { + if s.Level.MaxWidth < int64(width) { + width = int(s.Level.MaxWidth) + } + if s.Level.MaxHeight < int64(height) { + height = int(s.Level.MaxHeight) + } + } + + s.drawing.Resize(render.NewRect(width, height)) + s.drawing.MoveTo(render.Point{ + X: (s.d.width / 2) - (width / 2), + Y: menubar, + }) +} + // SetPlayerCharacter changes the doodad used for the player, by destroying the // current player character and making it from scratch. func (s *PlayScene) SetPlayerCharacter(filename string) { @@ -682,8 +717,8 @@ func (s *PlayScene) Loop(d *Doodle, ev *event.State) error { s.supervisor.Loop(ev) // Has the window been resized? - if ev.WindowResized { - s.drawing.Resize(render.NewRect(d.width, d.height)) + if ev.WindowResized || s.drawing.Point().IsZero() { + s.PlaceResizeCanvas() s.screen.Resize(render.NewRect(d.width, d.height)) return nil } @@ -732,9 +767,9 @@ func (s *PlayScene) Draw(d *Doodle) error { } // Clear the canvas and fill it with white. - d.Engine.Clear(render.White) + d.Engine.Clear(balance.WindowBackground) - // Draw the level. + // Draw the canvas widget. s.drawing.Present(d.Engine, s.drawing.Point()) // Draw out bounding boxes. diff --git a/pkg/uix/canvas_editable.go b/pkg/uix/canvas_editable.go index 19c95d7..fb12fef 100644 --- a/pkg/uix/canvas_editable.go +++ b/pkg/uix/canvas_editable.go @@ -458,8 +458,6 @@ func (w *Canvas) loopEditable(ev *event.State) error { // See if any of the actors are below the mouse cursor. var WP = w.WorldIndexAt(cursor) - // log.Debug("ActorTool, cursor=%s WP=%s zoom=%d P=%s", cursor, WP, w.Zoom, ui.AbsolutePosition(w)) - var deleteActors = []*Actor{} for _, actor := range w.actors {