last_light/game/state/pauseGameState.go

108 lines
2.3 KiB
Go

package state
import (
"mvvasilev/last_light/render"
"mvvasilev/last_light/ui"
"mvvasilev/last_light/util"
"github.com/gdamore/tcell/v2"
"github.com/gdamore/tcell/v2/views"
)
type PauseGameState struct {
prevState PausableState
unpauseGame bool
returnToMainMenu bool
pauseMenuWindow *ui.UIWindow
buttons []*ui.UISimpleButton
currButtonSelected int
}
func PauseGame(prevState PausableState) *PauseGameState {
s := new(PauseGameState)
s.prevState = prevState
highlightStyle := tcell.StyleDefault.Attributes(tcell.AttrBold)
s.pauseMenuWindow = ui.CreateWindow(uint16(render.TERMINAL_SIZE_WIDTH)/2-15, uint16(render.TERMINAL_SIZE_HEIGHT)/2-7, 30, 14, "PAUSED", tcell.StyleDefault)
s.buttons = make([]*ui.UISimpleButton, 0)
s.buttons = append(
s.buttons,
ui.CreateSimpleButton(
uint16(s.pauseMenuWindow.Position().X())+3,
uint16(s.pauseMenuWindow.Position().Y())+1,
"Resume",
tcell.StyleDefault,
highlightStyle,
func() {
s.unpauseGame = true
},
),
)
s.buttons = append(
s.buttons,
ui.CreateSimpleButton(
uint16(s.pauseMenuWindow.Position().X())+3,
uint16(s.pauseMenuWindow.Position().Y())+3,
"Exit To Main Menu",
tcell.StyleDefault,
highlightStyle,
func() {
s.returnToMainMenu = true
},
),
)
s.currButtonSelected = 0
s.buttons[s.currButtonSelected].Highlight()
return s
}
func (pg *PauseGameState) OnInput(e *tcell.EventKey) {
if e.Key() == tcell.KeyEsc {
pg.unpauseGame = true
}
if e.Key() == tcell.KeyDown {
pg.buttons[pg.currButtonSelected].Unhighlight()
pg.currButtonSelected = util.LimitIncrement(pg.currButtonSelected, 1)
pg.buttons[pg.currButtonSelected].Highlight()
}
if e.Key() == tcell.KeyUp {
pg.buttons[pg.currButtonSelected].Unhighlight()
pg.currButtonSelected = util.LimitDecrement(pg.currButtonSelected, 0)
pg.buttons[pg.currButtonSelected].Highlight()
}
if e.Key() == tcell.KeyEnter {
pg.buttons[pg.currButtonSelected].Select()
}
}
func (pg *PauseGameState) OnTick(dt int64) GameState {
if pg.unpauseGame {
pg.prevState.Unpause()
return pg.prevState
}
if pg.returnToMainMenu {
return NewMainMenuState()
}
return pg
}
func (pg *PauseGameState) OnDraw(c views.View) {
pg.prevState.OnDraw(c)
pg.pauseMenuWindow.Draw(c)
for _, b := range pg.buttons {
b.Draw(c)
}
}