doodle/pkg/cheats.go
Noah Petherbridge 302506eda9 Cheat: $ d.SetPlayerCharacter("anything.doodad")
Too restricted by the cheat codes to play as certain characters
on-demand? Use the JS shell in the developer console to set any doodad
you want:

    $ d.SetPlayerCharacter("key-blue")
    $ d.SetPlayerCharacter("anvil")
    $ d.SetPlayerCharacter("box.doodad")

The .doodad suffix is optional.

Interesting behaviors when playing as odd doodads:

* Most non-mobile doodads don't collide with each other, so you can pass
  through doors and not activate buttons if you play as a key or a
  trapdoor. Non-mobile doodads also generally have antigravity so you
  can fly freely around the map.
* Non-mobile doodads can not open Warp Doors or interact with the Exit
  Flag. You'll have to change back to a creature such as "boy" or
  "azu-blue" to win the level.
* If you are a key, the Thief can collect you! This removes your player
  doodad from the level and soft locks the game. No worries, another
  call to d.SetPlayerCharacter() will put you back on the map!
* If the doodad name isn't found, you'll play as the built-in fallback
  doodad, which is just a red "X" shape. It has anti-gravity and does
  not generally interact with any doodad (can not push buttons or
  collect keys - but it can pass through doors and other obstacles. Can
  not win the level goal flag, though!)
2022-04-29 21:39:53 -07:00

202 lines
5.9 KiB
Go

package doodle
import (
"time"
"git.kirsle.net/apps/doodle/pkg/balance"
"git.kirsle.net/apps/doodle/pkg/modal/loadscreen"
)
// IsDefaultPlayerCharacter checks whether the DefaultPlayerCharacter doodad has
// been modified
// SetPlayerCharacter -- this is designed to be called in-game with the developer
// console. Sets your player character to whatever doodad you want, not just the
// few that have cheat codes. If you set an invalid filename, you become the
// dummy default doodad sprite (a red "X").
func (d *Doodle) SetPlayerCharacter(filename string) {
balance.PlayerCharacterDoodad = filename
if playScene, isPlay := d.Scene.(*PlayScene); isPlay {
playScene.SetPlayerCharacter(balance.PlayerCharacterDoodad)
}
}
// cheatCommand is a subroutine of the Command.Run() method of the Doodle
// developer shell (commands.go). It looks for special cheat codes entered
// into the command shell and executes them.
//
// Returns true if a cheat was intercepted, false if the command is not a cheat.
func (c Command) cheatCommand(d *Doodle) bool {
// Some cheats only work in Play Mode.
playScene, isPlay := d.Scene.(*PlayScene)
// If a character cheat is used during Play Mode, replace the player NOW.
var setPlayerCharacter bool
// Cheat codes
switch c.Raw {
case balance.CheatUncapFPS:
if fpsDoNotCap {
d.Flash("Reset frame rate throttle to factory default FPS")
} else {
d.Flash("Unleashing as many frames as we can render!")
}
fpsDoNotCap = !fpsDoNotCap
case balance.CheatEditDuringPlay:
if isPlay {
playScene.drawing.Editable = true
playScene.SetCheated()
d.Flash("Level canvas is now editable. Don't edit and drive!")
} else {
d.FlashError("Use this cheat in Play Mode to make the level canvas editable.")
}
case balance.CheatScrollDuringPlay:
if isPlay {
playScene.drawing.Scrollable = true
playScene.SetCheated()
d.Flash("Level canvas is now scrollable with the arrow keys.")
} else {
d.FlashError("Use this cheat in Play Mode to make the level scrollable.")
}
case balance.CheatAntigravity:
if isPlay {
playScene.SetCheated()
playScene.antigravity = !playScene.antigravity
playScene.Player.SetGravity(!playScene.antigravity)
if playScene.antigravity {
d.Flash("Gravity disabled for player character.")
} else {
d.Flash("Gravity restored for player character.")
}
} else {
d.FlashError("Use this cheat in Play Mode to disable gravity for the player character.")
}
case balance.CheatNoclip:
if isPlay {
playScene.SetCheated()
playScene.noclip = !playScene.noclip
playScene.Player.SetNoclip(playScene.noclip)
playScene.antigravity = playScene.noclip
playScene.Player.SetGravity(!playScene.antigravity)
if playScene.noclip {
d.Flash("Clipping disabled for player character.")
} else {
d.Flash("Clipping and gravity restored for player character.")
}
} else {
d.FlashError("Use this cheat in Play Mode to disable clipping for the player character.")
}
case balance.CheatShowAllActors:
if isPlay {
playScene.SetCheated()
for _, actor := range playScene.drawing.Actors() {
actor.Show()
}
d.Flash("All invisible actors made visible.")
} else {
d.FlashError("Use this cheat in Play Mode to show hidden actors, such as technical doodads.")
}
case balance.CheatGiveKeys:
if isPlay {
playScene.SetCheated()
playScene.Player.AddItem("key-red.doodad", 0)
playScene.Player.AddItem("key-blue.doodad", 0)
playScene.Player.AddItem("key-green.doodad", 0)
playScene.Player.AddItem("key-yellow.doodad", 0)
playScene.Player.AddItem("small-key.doodad", 99)
d.Flash("Given all keys to the player character.")
} else {
d.FlashError("Use this cheat in Play Mode to get all colored keys.")
}
case balance.CheatDropItems:
if isPlay {
playScene.SetCheated()
playScene.Player.ClearInventory()
d.Flash("Cleared inventory of player character.")
} else {
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.CheatPlayAsBoy:
balance.PlayerCharacterDoodad = "boy.doodad"
setPlayerCharacter = true
d.Flash("Set default player character to Boy")
case balance.CheatPlayAsAzuBlue:
balance.PlayerCharacterDoodad = "azu-blu.doodad"
setPlayerCharacter = true
d.Flash("Set default player character to Blue Azulian")
case balance.CheatPlayAsThief:
balance.PlayerCharacterDoodad = "thief.doodad"
setPlayerCharacter = true
d.Flash("Set default player character to Thief")
case balance.CheatPlayAsAnvil:
balance.PlayerCharacterDoodad = "anvil.doodad"
setPlayerCharacter = true
d.Flash("Set default player character to the Anvil")
case balance.CheatGodMode:
if isPlay {
d.Flash("God mode toggled")
playScene.SetCheated()
playScene.godMode = !playScene.godMode
if playScene.godMode {
d.FlashError("God mode enabled.")
} else {
d.Flash("God mode disabled.")
}
} else {
d.FlashError("Use this cheat in Play Mode to toggle invincibility.")
}
case balance.CheatDebugLoadScreen:
loadscreen.ShowWithProgress()
loadscreen.SetSubtitle("Loading: /dev/null", "Loadscreen testing.")
go func() {
var i float64
for i = 0; i < 100; i++ {
time.Sleep(100 * time.Millisecond)
loadscreen.SetProgress(i / 100)
}
loadscreen.Hide()
}()
case balance.CheatUnlockLevels:
balance.CheatEnabledUnlockLevels = !balance.CheatEnabledUnlockLevels
if balance.CheatEnabledUnlockLevels {
d.Flash("All locked Story Mode levels can now be played.")
} else {
d.Flash("All locked Story Mode levels are again locked.")
}
default:
return false
}
// If we're setting the player character and in Play Mode, do it.
if setPlayerCharacter && isPlay {
playScene.SetPlayerCharacter(balance.PlayerCharacterDoodad)
}
return true
}