From 5c0d148471a9822bc2799df28a13b2f3232acb9a Mon Sep 17 00:00:00 2001 From: Florian Fischer Date: Wed, 9 Aug 2023 20:13:09 +0200 Subject: client: make key bindings dynamic --- go/client/game.go | 44 ++++++++--------------------- go/client/keybindings.go | 73 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 85 insertions(+), 32 deletions(-) create mode 100644 go/client/keybindings.go diff --git a/go/client/game.go b/go/client/game.go index 9c95deb2..58e4c63c 100644 --- a/go/client/game.go +++ b/go/client/game.go @@ -35,6 +35,8 @@ const ( type Game struct { app *app + keyBindings keyBindings + selectedObject interface{} handLayer *ui.HandView @@ -61,13 +63,19 @@ type Game struct { func newGame(app *app) *Game { g := &Game{ - app: app, + app: app, + keyBindings: make(keyBindings), Collection: ui.Collection{ Width: app.windowWidth, Height: app.windowHeight, }, } + // default key bindings + g.keyBindings[ebiten.MouseButtonLeft] = selection + g.keyBindings[ebiten.KeySpace] = pass + g.keyBindings[ebiten.KeyEscape] = reset + g.gameState = game.NewState() g.passButton = ui.NewSimpleButton(g.Width-PASS_BUTTON_WIDTH, @@ -520,38 +528,10 @@ func (g *Game) updateHighlight() { func (g *Game) Update() error { g.handlePlayerNotifications() - if inpututil.IsMouseButtonJustPressed(ebiten.MouseButtonLeft) { - x, y := ebiten.CursorPosition() - obj := g.findObjectAt(x, y) - - if g.prompt != nil { - if err := g.prompt.Add(obj); err != nil { - log.Println("Not added", obj, "to active prompt:", err) - g.handleSelection(obj, x, y) - } else { - g.updateHighlight() - } - } else { - g.handleSelection(obj, x, y) - } - } else if inpututil.IsKeyJustPressed(ebiten.KeySpace) { - g.passButton.Click(0, 0) - } else if inpututil.IsKeyJustPressed(ebiten.KeyQ) { + g.handleKeyBindings(g.keyBindings) + + if inpututil.IsKeyJustPressed(ebiten.KeyQ) { return ebiten.Termination - } else if inpututil.IsKeyJustPressed(ebiten.KeyEscape) { - g.removeChoice() - g.selectedObject = nil - g.ResetHover() - g.clearHighlights() - g.hideStore() - g.RemoveWidget(g.discardPileView) - if g.prompt != nil { - if g.prompt.Action().Targets().NoSelections() { - g.removePrompt() - } else { - g.prompt.ClearSelections() - } - } } if err := g.Collection.Update(); err != nil { diff --git a/go/client/keybindings.go b/go/client/keybindings.go new file mode 100644 index 00000000..a6b32cf9 --- /dev/null +++ b/go/client/keybindings.go @@ -0,0 +1,73 @@ +package main + +import ( + "log" + + "github.com/hajimehoshi/ebiten/v2" + "github.com/hajimehoshi/ebiten/v2/inpututil" +) + +type ( + keyAction func(*Game) bool + keyBindings map[interface{}]keyAction +) + +func (g *Game) handleKeyBindings(bindings keyBindings) { + for _k, a := range bindings { + var remove bool + switch k := _k.(type) { + case ebiten.MouseButton: + if inpututil.IsMouseButtonJustPressed(k) { + remove = a(g) + } + case ebiten.Key: + if inpututil.IsKeyJustPressed(k) { + remove = a(g) + } + } + + if remove { + delete(bindings, _k) + } + } +} + +func selection(g *Game) bool { + x, y := ebiten.CursorPosition() + obj := g.findObjectAt(x, y) + + if g.prompt != nil { + if err := g.prompt.Add(obj); err != nil { + log.Println("Not added", obj, "to active prompt:", err) + g.handleSelection(obj, x, y) + } else { + g.updateHighlight() + } + } else { + g.handleSelection(obj, x, y) + } + + return false +} + +func pass(g *Game) bool { + g.passButton.Click(0, 0) + return false +} + +func reset(g *Game) bool { + g.removeChoice() + g.selectedObject = nil + g.ResetHover() + g.clearHighlights() + g.hideStore() + g.RemoveWidget(g.discardPileView) + if g.prompt != nil { + if g.prompt.Action().Targets().NoSelections() { + g.removePrompt() + } else { + g.prompt.ClearSelections() + } + } + return false +} -- cgit v1.2.3