diff --git a/TODO.md b/TODO.md index 3003832..72898aa 100644 --- a/TODO.md +++ b/TODO.md @@ -2,18 +2,14 @@ - ignore comments in lvl files -- Start the game end timer and add a score FIXME: put the actual max - reachable score into the level definition along with the minimum - steps required to reach it, also add a step counter - - Grid Observer: https://github.com/mlange-42/arche/issues/374 -- Add some final message when the player reaches the last level, start - from scratch or a message to buy me some beer, whatever - - Add shaders for animation (player destruction etc) +- Start New game starts with last played level, better add a Resume + Game menu item for this and use Start New always for level 1. + - for finding caller: pc := make([]uintptr, 10) n := runtime.Callers(0, pc) diff --git a/game/level_scene.go b/game/level_scene.go index 3ebd8b4..f3e0dee 100644 --- a/game/level_scene.go +++ b/game/level_scene.go @@ -34,6 +34,7 @@ func (scene *LevelScene) GenerateLevels(game *Game) { } scene.Game.Observer.SetupLevelScore(min) + scene.Game.Observer.SetupMaxLevels(len(min)) scene.Game.Levels = scene.Levels } diff --git a/game/nextlevel_scene.go b/game/nextlevel_scene.go index 7e47fea..db3d279 100644 --- a/game/nextlevel_scene.go +++ b/game/nextlevel_scene.go @@ -75,6 +75,49 @@ func (scene *NextlevelScene) Draw(screen *ebiten.Image) { } func (scene *NextlevelScene) SetupUI() { + observer := observers.GetGameObserver(scene.Game.World) + slog.Debug("levels", "max", observer.MaxLevels, "current", observer.CurrentLevel) + if observer.MaxLevels == observer.CurrentLevel+1 { + scene.SetupUILast() + } else { + scene.SetupUIRetry() + } + +} + +func (scene *NextlevelScene) SetupUILast() { + blue := color.RGBA{0, 255, 128, 255} + observer := observers.GetGameObserver(scene.Game.World) + + rowContainer := gameui.NewRowContainer(false) + label1text := "Last level, congratulations!" + label2text := fmt.Sprintf("Your final score: %d", observer.GetLevelScore()) + + buttonMenu := gameui.NewMenuButton("Menu", *assets.FontRenderer.FontNormal, + func(args *widget.ButtonClickedEventArgs) { + scene.SetNext(Menu) + }) + + label1 := widget.NewText( + widget.TextOpts.Text(label1text, *assets.FontRenderer.FontNormal, blue), + widget.TextOpts.Position(widget.TextPositionCenter, widget.TextPositionCenter), + ) + + label2 := widget.NewText( + widget.TextOpts.Text(label2text, *assets.FontRenderer.FontNormal, blue), + widget.TextOpts.Position(widget.TextPositionCenter, widget.TextPositionCenter), + ) + + rowContainer.AddChild(label1) + rowContainer.AddChild(label2) + rowContainer.AddChild(buttonMenu) + + scene.Ui = &ebitenui.UI{ + Container: rowContainer.Container(), + } +} + +func (scene *NextlevelScene) SetupUIRetry() { blue := color.RGBA{0, 255, 128, 255} observer := observers.GetGameObserver(scene.Game.World) diff --git a/observers/game_observer.go b/observers/game_observer.go index cb4790a..359a442 100644 --- a/observers/game_observer.go +++ b/observers/game_observer.go @@ -28,6 +28,7 @@ type GameObserver struct { Entities map[ecs.ID]map[ecs.Entity]int LevelScore map[int]*Score // one score per level Id int + MaxLevels int } func (observer *GameObserver) GetListenerCallback(comp ecs.ID) listener.Callback { @@ -140,6 +141,10 @@ func (observer *GameObserver) SetupLevelScore(min []int) { } } +func (observer *GameObserver) SetupMaxLevels(count int) { + observer.MaxLevels = count +} + // set current level stats and reset counters func (observer *GameObserver) AddScore() { level := observer.CurrentLevel