last_light/game/state/game_over_state.go
2024-06-06 23:17:22 +03:00

84 lines
2.1 KiB
Go

package state
import (
"fmt"
"mvvasilev/last_light/engine"
"mvvasilev/last_light/game/systems"
"mvvasilev/last_light/game/ui"
"github.com/gdamore/tcell/v2"
)
type GameOverState struct {
inputSystem *systems.InputSystem
gameOverTitle *engine.Raw
deathText *ui.UILabel
backToMainMenuBtn *ui.UISimpleButton
returnToMainMenu bool
}
func CreateGameOverState(inputSystem *systems.InputSystem) *GameOverState {
gos := &GameOverState{
inputSystem: inputSystem,
gameOverTitle: engine.CreateRawDrawable(
14, 1, tcell.StyleDefault.Attributes(tcell.AttrBold).Foreground(tcell.ColorYellow),
"_____ _____ ",
"| __ \\ | _ | ",
"| | \\/ __ _ _ __ ___ ___ | | | |_ _____ _ __ ",
"| | __ / _` | '_ ` _ \\ / _ \\ | | | \\ \\ / / _ \\ '__|",
"| |_\\ \\ (_| | | | | | | __/ \\ \\_/ /\\ V / __/ | ",
" \\____/\\__,_|_| |_| |_|\\___| \\___/ \\_/ \\___|_| ",
),
deathText: ui.CreateUILabel(
14, 8, 51, 5,
fmt.Sprintf(
"For all your efforts, your endeavour was ultimately cut short. "+
"You have been left bleeding out on the dungeon floor. Your remains "+
"will serve as a warning to future seekers of the last light.",
),
tcell.StyleDefault,
),
}
gos.backToMainMenuBtn = ui.CreateSimpleButton(
engine.TERMINAL_SIZE_WIDTH/2-len("Back to Main Menu")/2,
16,
"Back to Main Menu",
tcell.StyleDefault,
tcell.StyleDefault.Attributes(tcell.AttrBold),
func() {
gos.returnToMainMenu = true
},
)
gos.backToMainMenuBtn.Highlight()
return gos
}
func (gos *GameOverState) InputContext() systems.InputContext {
return systems.InputContext_Menu
}
func (gos *GameOverState) OnTick(dt int64) GameState {
if gos.inputSystem.NextAction() == systems.InputAction_Menu_Select {
gos.backToMainMenuBtn.Select()
}
if gos.returnToMainMenu {
return CreateMainMenuState(systems.CreateTurnSystem(), gos.inputSystem)
}
return gos
}
func (gos *GameOverState) CollectDrawables() []engine.Drawable {
return []engine.Drawable{
gos.gameOverTitle,
gos.deathText,
gos.backToMainMenuBtn,
}
}