diff --git a/dev-assets/doodads/regions/Makefile b/dev-assets/doodads/regions/Makefile index 63b40ad..7d8c6b2 100644 --- a/dev-assets/doodads/regions/Makefile +++ b/dev-assets/doodads/regions/Makefile @@ -6,6 +6,10 @@ build: doodad convert -t "Goal Region" goal-128.png reg-goal.doodad doodad install-script goal.js reg-goal.doodad + # Checkpoint Region + doodad convert -t "Checkpoint Region" checkpoint-128.png reg-checkpoint.doodad + doodad install-script checkpoint.js reg-checkpoint.doodad + # Fire Region doodad convert -t "Fire Region" fire-128.png reg-fire.doodad doodad install-script fire.js reg-fire.doodad diff --git a/dev-assets/doodads/regions/checkpoint-128.png b/dev-assets/doodads/regions/checkpoint-128.png new file mode 100644 index 0000000..bc1c34e Binary files /dev/null and b/dev-assets/doodads/regions/checkpoint-128.png differ diff --git a/dev-assets/doodads/regions/checkpoint.js b/dev-assets/doodads/regions/checkpoint.js new file mode 100644 index 0000000..47f5669 --- /dev/null +++ b/dev-assets/doodads/regions/checkpoint.js @@ -0,0 +1,38 @@ +// Checkpoint Region +// Acts like an invisible checkpoint flag. +var isCurrentCheckpoint = false; + +function main() { + Self.Hide(); + setActive(false); + + // Checkpoints broadcast to all of their peers so they all + // know which one is the most recently activated. + Message.Subscribe("broadcast:checkpoint", function (currentID) { + setActive(false); + }); + + Events.OnCollide(function (e) { + if (isCurrentCheckpoint || !e.Settled) { + return; + } + + // Only care about the player character. + if (!e.Actor.IsPlayer()) { + return; + } + + // Set the player checkpoint. + SetCheckpoint(Self.Position()); + setActive(true); + Message.Broadcast("broadcast:checkpoint", Self.ID()) + }); +} + +function setActive(v) { + if (v && !isCurrentCheckpoint) { + Flash("Checkpoint!"); + } + + isCurrentCheckpoint = v; +} \ No newline at end of file diff --git a/pkg/cheats.go b/pkg/cheats.go index 99a19b6..5b3cf44 100644 --- a/pkg/cheats.go +++ b/pkg/cheats.go @@ -1,6 +1,8 @@ package doodle -import "git.kirsle.net/apps/doodle/pkg/balance" +import ( + "git.kirsle.net/apps/doodle/pkg/balance" +) // cheatCommand is a subroutine of the Command.Run() method of the Doodle // developer shell (commands.go). It looks for special cheat codes entered @@ -68,6 +70,16 @@ func (c Command) cheatCommand(d *Doodle) bool { d.Flash("Use this cheat in Play Mode to disable clipping for the player character.") } + case "show all actors": + if isPlay { + for _, actor := range playScene.drawing.Actors() { + actor.Show() + } + d.Flash("All invisible actors made visible.") + } else { + d.Flash("Use this cheat in Play Mode to show hidden actors, such as technical doodads.") + } + case "give all keys": if isPlay { playScene.Player.AddItem("key-red.doodad", 0) diff --git a/pkg/shell.go b/pkg/shell.go index 22117a0..e17a2e5 100644 --- a/pkg/shell.go +++ b/pkg/shell.go @@ -76,10 +76,11 @@ func NewShell(d *Doodle) Shell { // Make the Doodle instance available to the shell. bindings := map[string]interface{}{ - "d": d, - "RGBA": render.RGBA, - "Point": render.NewPoint, - "Rect": render.NewRect, + "d": d, + "Execute": s.Execute, + "RGBA": render.RGBA, + "Point": render.NewPoint, + "Rect": render.NewRect, "Tree": func(w ui.Widget) string { for _, row := range ui.WidgetTree(w) { d.Flash(row)