package main import ( "image/color" "log" "github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2/inpututil" // "muhq.space/muhqs-game/go/game" "muhq.space/muhqs-game/go/ui" ) const ( START_BUTTON_WIDTH = 150 START_BUTTON_HEIGHT = 50 ) type StartMenu struct { app *app width, height int playerName string startDeck string remote string mapPath string widgets []ui.Widget } func NewStartMenu(app *app) *StartMenu { m := &StartMenu{app: app} return m } func (m *StartMenu) build() { playerLabel := ui.NewCenteringFixedTextBox( (m.width-START_BUTTON_WIDTH)/2-START_BUTTON_WIDTH, (m.height-START_BUTTON_HEIGHT)/2-START_BUTTON_HEIGHT, START_BUTTON_WIDTH, START_BUTTON_HEIGHT, "name:", ) playerLabel.Bg = color.Black m.widgets = append(m.widgets, playerLabel) playerInput := ui.NewTextInput( (m.width-START_BUTTON_WIDTH)/2, (m.height-START_BUTTON_HEIGHT)/2-START_BUTTON_HEIGHT, START_BUTTON_WIDTH, START_BUTTON_HEIGHT, "player name", ) if m.playerName != "" { playerInput.AddInput([]rune(m.playerName)) } m.widgets = append(m.widgets, playerInput) m.widgets = append(m.widgets, ui.NewSimpleButton( (m.width-START_BUTTON_WIDTH)/2, (m.height-START_BUTTON_HEIGHT)/2, START_BUTTON_WIDTH, START_BUTTON_HEIGHT, "Start", func(*ui.SimpleButton) { m.playerName = playerInput.Text() m.app.active = m.next() })) } func (m *StartMenu) Update() error { if m.widgets == nil { m.build() } x, y := ebiten.CursorPosition() var activeWidget ui.Widget for _, w := range m.widgets { if !w.Contains(x, y) { continue } activeWidget = w break } if activeWidget == nil { return nil } scrollX, scrollY := ebiten.Wheel() if scrollX != 0 || scrollY != 0 { if scrollable, ok := activeWidget.(ui.Scrollable); ok { scrollable.Scroll(int(scrollX), int(scrollY)) } } if textInput, ok := activeWidget.(*ui.TextInput); ok { // var input []rune // ebiten.AppendInputChars(input) input := ebiten.InputChars() if len(input) > 0 { textInput.AddInput(input) } textInput.HandleKey() } if inpututil.IsMouseButtonJustPressed(ebiten.MouseButtonLeft) { if btn, ok := activeWidget.(ui.Button); ok { btn.Click(x, y) } } return nil } func (m *StartMenu) Draw(screen *ebiten.Image) { for _, w := range m.widgets { w.Draw(screen) } } func (m *StartMenu) Layout(width, height int) (int, int) { return m.width, m.height } func (m *StartMenu) next() ebiten.Game { if m.remote != "" { log.Fatal("Remote games are currently not implemented") } g := newGame(m.app).loadMap(m.mapPath).addActivePlayer(m.playerName, m.startDeck) if m.mapPath == "the-kraken" { idx := len(g.gameState.Players) color := playerColors[idx] g.gameState.AddKraken() g.gameState.Players[idx].Color = color } return g.Start() }