From a059fa9bb1ace39cf5fdcfd489a90f5d778c9344 Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Wed, 20 Aug 2025 14:44:06 +0200 Subject: add game and settings menus --- go/client/challenges.go | 7 ++++--- go/client/game.go | 19 +++++++++++++++---- go/client/gameMenu.go | 25 +++++++++++++++++++++++++ go/client/settings.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 89 insertions(+), 7 deletions(-) create mode 100644 go/client/gameMenu.go create mode 100644 go/client/settings.go (limited to 'go/client') diff --git a/go/client/challenges.go b/go/client/challenges.go index ca6e3563..6956282b 100644 --- a/go/client/challenges.go +++ b/go/client/challenges.go @@ -4,6 +4,7 @@ import ( "github.com/hajimehoshi/ebiten/v2" "muhq.space/muhqs-game/go/activities" "muhq.space/muhqs-game/go/game" + "muhq.space/muhqs-game/go/ui" ) var availChallenges = map[string]func(string) *game.LocalState{ @@ -21,11 +22,11 @@ type challenges struct { func newChallengesMenu(app *app, playerName string) *challenges { var m *challenges - labels := []string{} - handlers := []func(){} + labels := make([]string, 0, len(availChallenges)) + handlers := make([]func(*ui.SimpleButton), 0, len(availChallenges)) for k, start := range availChallenges { labels = append(labels, k) - handlers = append(handlers, func() { + handlers = append(handlers, func(*ui.SimpleButton) { s := start(m.playerName) m.startChallenge(s) }) diff --git a/go/client/game.go b/go/client/game.go index eae065c6..f4262f67 100644 --- a/go/client/game.go +++ b/go/client/game.go @@ -34,17 +34,17 @@ const ( STATE_BAR_WIDTH = 300 POC_BUTTON_WIDTH = 150 - - AUTO_PROGRESS_PROMPT = true ) type Game struct { - app *app + app *app + settings *settings keyBindings keyBindings selectedObject any + menuButton *ui.ImageButton handLayer *ui.HandView discardBtn *ui.ImageButton stateBar *ui.StateBar @@ -77,6 +77,7 @@ type Game struct { func newGame(app *app, gameState game.State) *Game { g := &Game{ app: app, + settings: newSettings(), gameState: gameState, keyBindings: make(keyBindings), Collection: ui.Collection{ @@ -92,6 +93,16 @@ func newGame(app *app, gameState game.State) *Game { g.keyBindings[ebiten.KeyEscape] = reset g.keyBindings[ebiten.KeyQ] = func(ui.InputEvent, *Game) (bool, error) { return false, ebiten.Termination } + menuImg := ebiten.NewImageFromImage(assets.GetIcon("menu.png")) + g.menuButton = ui.NewImageButton( + g.Width-menuImg.Bounds().Dx()-10, + 10, + menuImg, + func(*ui.ImageButton) { + activities.PushActivity(newGameMenu(g)) + }) + g.AddWidget(g.menuButton) + g.passButton = ui.NewSimpleButton(g.Width-PASS_BUTTON_WIDTH, g.Height-DEFAULT_BUTTON_HEIGHT, PASS_BUTTON_WIDTH, @@ -504,7 +515,7 @@ func (g *Game) updateButtons() { passButtonLabel = "confirm" } - if AUTO_PROGRESS_PROMPT && !targets.Cur().AllowSelection() { + if g.settings.gameplay["autoProgressPrompt"].(bool) && !targets.Cur().AllowSelection() { g.progressPrompt() return } diff --git a/go/client/gameMenu.go b/go/client/gameMenu.go new file mode 100644 index 00000000..82287f38 --- /dev/null +++ b/go/client/gameMenu.go @@ -0,0 +1,25 @@ +package main + +import ( + "muhq.space/muhqs-game/go/activities" + "muhq.space/muhqs-game/go/ui" +) + +func newGameMenu(g *Game) *activities.ButtonList { + var bl *activities.ButtonList + labels := []string{ + "wincondition", + "settings", + } + handlers := []func(*ui.SimpleButton){ + func(*ui.SimpleButton) { + g.showMessage(g.gameState.Map().WinCondition.String()) + activities.PopActivity() + }, + func(*ui.SimpleButton) { + activities.PushActivity(newSettingsMenu(g)) + }, + } + bl = activities.NewButtonList(g.Width, g.Height, labels, handlers) + return bl +} diff --git a/go/client/settings.go b/go/client/settings.go new file mode 100644 index 00000000..02f23211 --- /dev/null +++ b/go/client/settings.go @@ -0,0 +1,45 @@ +package main + +import ( + "fmt" + "log" + + "muhq.space/muhqs-game/go/activities" + "muhq.space/muhqs-game/go/ui" +) + +type settings struct { + gameplay map[string]any +} + +func newSettings() *settings { + return &settings{ + gameplay: map[string]any{ + "autoProgressPrompt": true, + }, + } +} + +func newSettingsMenu(g *Game) *activities.ButtonList { + var bl *activities.ButtonList + s := g.settings + labels := make([]string, 0, len(s.gameplay)) + handlers := make([]func(*ui.SimpleButton), 0, len(s.gameplay)) + + for k, v := range s.gameplay { + name := "gameplay." + k + labels = append(labels, fmt.Sprintf("%s: %v", name, v)) + handlers = append(handlers, func(btn *ui.SimpleButton) { + switch typedVal := v.(type) { + case bool: + s.gameplay[k] = !typedVal + default: + log.Panicf("Unhandled settings %s type %T", name, typedVal) + } + btn.UpdateLabel(fmt.Sprintf("%s: %v", name, s.gameplay[k])) + }) + } + + bl = activities.NewButtonList(g.Width, g.Height, labels, handlers) + return bl +} -- cgit v1.2.3