doodle/pkg/play_scene_menubar.go
Noah Petherbridge a10a09a818 Cheats Menu UI
* Added a Cheats Menu UI accessible from the Settings window's "Experimental"
  tab and from there you can enable the Cheats Menu from the "Help" screen of
  the gameplay mode.
* Commonly used cheats all have corresponding buttons to click on, especially
  helpful for touchscreen devices like the Pinephone where keyboard input
  doesn't always work reliably.
* The buttons in the Cheats Menu just automate entry of the cheat commands.
* `boolProp` command has a new `flip` option to toggle their value (e.g.
  `boolProp show-hidden-doodads flip`)
2023-01-02 12:36:12 -08:00

99 lines
2.5 KiB
Go

package doodle
import (
"git.kirsle.net/SketchyMaze/doodle/pkg/levelpack"
"git.kirsle.net/SketchyMaze/doodle/pkg/shmem"
"git.kirsle.net/SketchyMaze/doodle/pkg/usercfg"
"git.kirsle.net/SketchyMaze/doodle/pkg/windows"
"git.kirsle.net/go/render"
"git.kirsle.net/go/ui"
)
// Set up the menu bar for Play Scene.
func (u *PlayScene) setupMenuBar(d *Doodle) *ui.MenuBar {
menu := ui.NewMenuBar("Main Menu")
////////
// Game menu
gameMenu := menu.AddMenu("Game")
gameMenu.AddItem("Story Mode", func() {
// TODO: de-duplicate code from MainScene
if u.winLevelPacks == nil {
u.winLevelPacks = windows.NewLevelPackWindow(windows.LevelPack{
Supervisor: u.Supervisor,
Engine: d.Engine,
OnPlayLevel: func(lp levelpack.LevelPack, which levelpack.Level) {
if err := d.PlayFromLevelpack(lp, which); err != nil {
shmem.FlashError(err.Error())
}
},
OnCloseWindow: func() {
u.winLevelPacks.Hide()
},
})
}
u.winLevelPacks.MoveTo(render.Point{
X: (d.width / 2) - (u.winLevelPacks.Size().W / 2),
Y: (d.height / 2) - (u.winLevelPacks.Size().H / 2),
})
u.winLevelPacks.Show()
})
gameMenu.AddItemAccel("New drawing", "Ctrl-N", d.GotoNewMenu)
gameMenu.AddItemAccel("Open drawing", "Ctrl-O", d.GotoLoadMenu)
gameMenu.AddSeparator()
gameMenu.AddItem("Quit to menu", func() {
d.Goto(&MainScene{})
})
gameMenu.AddItemAccel("Quit", "Escape", func() {
d.ConfirmExit()
})
////////
// Level menu
levelMenu := menu.AddMenu("Level")
levelMenu.AddItem("Restart level", u.RestartLevel)
levelMenu.AddItem("Retry from checkpoint", func() {
u.SetImperfect()
u.RetryCheckpoint()
})
levelMenu.AddSeparator()
levelMenu.AddItemAccel("Edit level", "E", u.EditLevel)
// Hilariously broken, someday!
if usercfg.Current.EnableFeatures {
levelMenu.AddSeparator()
levelMenu.AddItemAccel("New viewport", "v", func() {
pip := windows.MakePiPWindow(d.width, d.height, windows.PiP{
Supervisor: u.Supervisor,
Engine: u.d.Engine,
Level: u.Level,
Event: u.d.event,
})
pip.Show()
})
}
helpMenu := d.MakeHelpMenu(menu, u.Supervisor)
if usercfg.Current.EnableCheatsMenu {
helpMenu.AddSeparator()
helpMenu.AddItem("Cheats Menu", func() {
if u.cheatsWindow != nil {
u.cheatsWindow.Hide()
u.cheatsWindow.Destroy()
u.cheatsWindow = nil
}
u.cheatsWindow = u.d.MakeCheatsWindow(u.Supervisor)
u.cheatsWindow.Show()
})
}
menu.Supervise(u.Supervisor)
menu.Compute(d.Engine)
return menu
}