101 lines
2.4 KiB
Go
101 lines
2.4 KiB
Go
package game
|
|
|
|
import (
|
|
"image"
|
|
"log/slog"
|
|
"openquell/assets"
|
|
"openquell/config"
|
|
|
|
"github.com/hajimehoshi/ebiten/v2"
|
|
)
|
|
|
|
type PlayScene struct {
|
|
Game *Game
|
|
CurrentLevel int
|
|
Levels []*Level
|
|
Next SceneName
|
|
Whoami SceneName
|
|
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) {
|
|
min := []int{}
|
|
for _, level := range assets.Project.Levels {
|
|
level := level
|
|
scene.Levels = append(scene.Levels, NewLevel(game, 32, level))
|
|
min = append(min, level.PropertyByIdentifier("minmoves").AsInt())
|
|
}
|
|
|
|
scene.Game.Observer.SetupLevelScore(min)
|
|
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 {
|
|
return false
|
|
}
|
|
|
|
func (scene *PlayScene) Update() error {
|
|
scene.Levels[scene.CurrentLevel].Update()
|
|
|
|
switch {
|
|
case scene.Game.Input.ActionIsJustPressed(config.Abort):
|
|
scene.SetNext(Popup)
|
|
|
|
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)
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (scene *PlayScene) 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)
|
|
}
|