added MinMoves to lvl files, added score system in game observer

This commit is contained in:
2024-02-28 19:58:05 +01:00
parent ebaeb51f68
commit 1c0f3d19d0
19 changed files with 112 additions and 78 deletions

View File

@@ -18,7 +18,7 @@ type Game struct {
Scenes map[SceneName]Scene
CurrentScene SceneName
Observer *observers.GameObserver
//Levels []*Level // fed in LevelScene.GenerateLevels()
Levels []*Level // fed in LevelScene.GenerateLevels()
Config *config.Config
}
@@ -35,6 +35,9 @@ func NewGame(width, height, cellsize int, cfg *config.Config, startscene SceneNa
Config: cfg,
}
game.Observer = observers.NewGameObserver(
&world, cfg.Startlevel, width, height, cellsize)
game.Scenes[Welcome] = NewWelcomeScene(game)
game.Scenes[Menu] = NewMenuScene(game)
game.Scenes[About] = NewAboutScene(game)
@@ -44,9 +47,6 @@ func NewGame(width, height, cellsize int, cfg *config.Config, startscene SceneNa
game.CurrentScene = startscene
game.Observer = observers.NewGameObserver(
&world, cfg.Startlevel, len(game.Levels), width, height, cellsize)
fmt.Println(game.World.Stats().String())
return game
@@ -57,24 +57,18 @@ func (game *Game) GetCurrentScene() Scene {
}
func (game *Game) Update() error {
gameobserver := observers.GetGameObserver(game.World)
// handle level ends
timer := gameobserver.StopTimer
timer := game.Observer.StopTimer
if timer.IsReady() {
// a level is either lost or won, we display a small popup
// asking the user how to continue from here
timer.Reset()
slog.Debug("timer ready", "lost", gameobserver.Lost, "retry", gameobserver.Retry)
if !gameobserver.Lost {
level := // current level?
score := ((level.MinMoves * 100) / gameobserver.Moves) / 30
gameobserver.AddScore()
}
slog.Debug("timer ready", "lost", game.Observer.Lost, "retry", game.Observer.Retry)
game.Observer.AddScore()
game.Scenes[Nextlevel] = NewNextlevelScene(game, gameobserver.Lost)
game.Scenes[Nextlevel] = NewNextlevelScene(game)
game.CurrentScene = Nextlevel
}
@@ -91,15 +85,15 @@ func (game *Game) Update() error {
if next != game.CurrentScene {
if next == Play && game.CurrentScene == Nextlevel {
// switched from nextlevel (lost or won) popup to play (either retry or next level)
if !gameobserver.Retry {
gameobserver.CurrentLevel++
if !game.Observer.Retry {
game.Observer.CurrentLevel++
}
gameobserver.Retry = false
game.Observer.Retry = false
}
if next == Play {
// fresh setup of actual level every time we enter the play scene
game.Scenes[Play].SetLevel(gameobserver.CurrentLevel)
game.Scenes[Play].SetLevel(game.Observer.CurrentLevel)
}
// make sure we stay on the selected scene
@@ -108,8 +102,8 @@ func (game *Game) Update() error {
// finally switch
game.CurrentScene = next
// FIXME: add some reset function to gameobserver for these kinds of things
gameobserver.Lost = false
// FIXME: add some reset function to game.Observer for these kinds of things
game.Observer.Lost = false
}
timer.Update()

View File

@@ -3,7 +3,6 @@ package game
import (
"log/slog"
"openquell/assets"
"openquell/observers"
"github.com/hajimehoshi/ebiten/v2"
)
@@ -34,9 +33,8 @@ func (scene *LevelScene) GenerateLevels(game *Game) {
min = append(min, level.MinMoves)
}
observer := observers.GetGameObserver(scene.Game.World)
observer.SetupLevelScore(min)
//scene.Game.Levels = scene.Levels
scene.Game.Observer.SetupLevelScore(min)
scene.Game.Levels = scene.Levels
}
func (scene *LevelScene) SetLevel(level int) {

View File

@@ -1,6 +1,7 @@
package game
import (
"fmt"
"image/color"
"log/slog"
"openquell/assets"
@@ -22,12 +23,11 @@ type NextlevelScene struct {
Lost bool
}
func NewNextlevelScene(game *Game, lost bool) Scene {
func NewNextlevelScene(game *Game) Scene {
scene := &NextlevelScene{
Whoami: Nextlevel,
Game: game,
Next: Nextlevel,
Lost: lost,
}
scene.SetupUI()
@@ -61,7 +61,7 @@ func (scene *NextlevelScene) Update() error {
func (scene *NextlevelScene) SetLevel(level int) {}
func (scene *NextlevelScene) Draw(screen *ebiten.Image) {
background := assets.Assets["background-popup"]
background := assets.Assets["background-popup-wide"]
op := &ebiten.DrawImageOptions{}
op.GeoM.Translate(
@@ -69,33 +69,33 @@ func (scene *NextlevelScene) Draw(screen *ebiten.Image) {
float64((scene.Game.ScreenHeight/2)-(background.Bounds().Dy()/2)),
)
screen.DrawImage(assets.Assets["background-popup"], op)
screen.DrawImage(background, op)
scene.Ui.Draw(screen)
}
func (scene *NextlevelScene) SetupUI() {
blue := color.RGBA{0, 255, 128, 255}
gameobserver := observers.GetGameObserver(scene.Game.World)
observer := observers.GetGameObserver(scene.Game.World)
rowContainer := gameui.NewRowContainer(false)
labeltext := "Success"
labeltext := fmt.Sprintf("Great! (Score: %d)", observer.GetLevelScore())
switch scene.Lost {
switch observer.Lost {
case true:
labeltext = "Failure"
labeltext = "Too bad!"
}
buttonRetry := gameui.NewMenuButton("Retry", *assets.FontRenderer.FontNormal,
func(args *widget.ButtonClickedEventArgs) {
scene.SetNext(Play)
gameobserver.Retry = true
observer.Retry = true
})
buttonNext := gameui.NewMenuButton("Next Level", *assets.FontRenderer.FontNormal,
func(args *widget.ButtonClickedEventArgs) {
scene.SetNext(Play)
gameobserver.Retry = false
observer.Retry = false
})
buttonAbort := gameui.NewMenuButton("Abort", *assets.FontRenderer.FontNormal,
@@ -104,7 +104,7 @@ func (scene *NextlevelScene) SetupUI() {
})
label := widget.NewText(
widget.TextOpts.Text(labeltext, *assets.FontRenderer.FontBig, blue),
widget.TextOpts.Text(labeltext, *assets.FontRenderer.FontNormal, blue),
widget.TextOpts.Position(widget.TextPositionCenter, widget.TextPositionCenter),
)