openquell/game/play_scene.go

101 lines
2.4 KiB
Go
Raw Normal View History

package game
import (
"image"
2024-02-13 18:42:13 +01:00
"log/slog"
"openquell/assets"
"openquell/config"
"github.com/hajimehoshi/ebiten/v2"
)
type PlayScene struct {
2024-02-11 14:24:30 +01:00
Game *Game
CurrentLevel int
Levels []*Level
Next SceneName
Whoami SceneName
2024-02-07 18:01:58 +01:00
UseCache bool
MenuRect image.Rectangle
}
// Implements the actual playing Scene
func NewPlayScene(game *Game, startlevel int) Scene {
scene := &PlayScene{Whoami: Play, Next: Play, Game: game}
scene.GenerateLevels(game)
scene.SetLevel(startlevel)
scene.MenuRect = image.Rect(config.MenuRectX, config.MenuRectY,
config.MenuRectX+config.MenuRectCellsize,
config.MenuRectY+config.MenuRectCellsize)
return scene
}
func (scene *PlayScene) GenerateLevels(game *Game) {
2024-02-28 13:15:45 +01:00
min := []int{}
for _, level := range assets.Project.Levels {
level := level
scene.Levels = append(scene.Levels, NewLevel(game, 32, level))
2024-03-11 18:31:01 +01:00
min = append(min, level.PropertyByIdentifier("minmoves").AsInt())
}
2024-02-18 18:19:34 +01:00
scene.Game.Observer.SetupLevelScore(min)
2024-03-01 14:08:35 +01:00
scene.Game.Observer.SetupMaxLevels(len(min))
scene.Game.Levels = scene.Levels
}
func (scene *PlayScene) SetLevel(level int) {
scene.CurrentLevel = level
scene.Levels[scene.CurrentLevel].SetupGrid(scene.Game)
}
// Interface methods
func (scene *PlayScene) SetNext(next SceneName) {
scene.Next = next
}
func (scene *PlayScene) GetNext() SceneName {
// FIXME: set to winner or options screen
return scene.Next
}
func (scene *PlayScene) ResetNext() {
scene.Next = scene.Whoami
}
func (scene *PlayScene) Clearscreen() bool {
2024-02-18 18:19:34 +01:00
return false
}
func (scene *PlayScene) Update() error {
scene.Levels[scene.CurrentLevel].Update()
2024-02-18 18:19:34 +01:00
switch {
2024-04-16 19:10:32 +02:00
case scene.Game.Input.ActionIsJustPressed(config.Abort):
2024-02-18 18:19:34 +01:00
scene.SetNext(Popup)
2024-04-16 19:10:32 +02:00
case scene.Game.Input.ActionIsJustPressed(config.Activate):
// ok we're checking the menu button here, but drawing it in hud_system,
// because systems can't switch scenes
if image.Pt(ebiten.CursorPosition()).In(scene.MenuRect) {
scene.SetNext(Popup)
}
2024-02-18 18:19:34 +01:00
}
return nil
}
func (scene *PlayScene) Draw(screen *ebiten.Image) {
2024-02-26 14:43:03 +01:00
// FIXME: why not in Update() ?!?!?!
2024-02-18 18:19:34 +01:00
if scene.CurrentLevel != scene.Game.Observer.CurrentLevel {
slog.Debug("level", "current", scene.CurrentLevel,
"next", scene.Game.Observer.CurrentLevel)
2024-02-18 18:19:34 +01:00
scene.CurrentLevel = scene.Game.Observer.CurrentLevel
scene.Levels[scene.CurrentLevel].SetupGrid(scene.Game)
}
2024-02-26 14:43:03 +01:00
screen.Clear()
scene.Levels[scene.CurrentLevel].Draw(screen)
}