package game import ( "log/slog" "openquell/assets" "github.com/hajimehoshi/ebiten/v2" ) type LevelScene struct { Game *Game CurrentLevel int Levels []*Level Next SceneName Whoami SceneName UseCache bool } // Implements the actual playing Scene func NewLevelScene(game *Game, startlevel int) Scene { scene := &LevelScene{Whoami: Play, Next: Play, Game: game} scene.GenerateLevels(game) scene.SetLevel(startlevel) return scene } func (scene *LevelScene) GenerateLevels(game *Game) { min := []int{} for _, level := range assets.Project.Levels { level := level scene.Levels = append(scene.Levels, NewLevel(game, 32, level)) level.PropertyByIdentifier("min-moves") min = append(min, level.PropertyByIdentifier("min-moves").AsInt()) } scene.Game.Observer.SetupLevelScore(min) scene.Game.Observer.SetupMaxLevels(len(min)) scene.Game.Levels = scene.Levels } func (scene *LevelScene) SetLevel(level int) { scene.CurrentLevel = level scene.Levels[scene.CurrentLevel].SetupGrid(scene.Game) } // Interface methods func (scene *LevelScene) SetNext(next SceneName) { scene.Next = next } func (scene *LevelScene) GetNext() SceneName { // FIXME: set to winner or options screen return scene.Next } func (scene *LevelScene) ResetNext() { scene.Next = scene.Whoami } func (scene *LevelScene) Clearscreen() bool { return false } func (scene *LevelScene) Update() error { scene.Levels[scene.CurrentLevel].Update() switch { case ebiten.IsKeyPressed(ebiten.KeyEscape): scene.SetNext(Popup) } return nil } func (scene *LevelScene) Draw(screen *ebiten.Image) { // FIXME: why not in Update() ?!?!?! if scene.CurrentLevel != scene.Game.Observer.CurrentLevel { slog.Debug("level", "current", scene.CurrentLevel, "next", scene.Game.Observer.CurrentLevel) scene.CurrentLevel = scene.Game.Observer.CurrentLevel scene.Levels[scene.CurrentLevel].SetupGrid(scene.Game) } screen.Clear() scene.Levels[scene.CurrentLevel].Draw(screen) }