added MinMoves to lvl files, added score system in game observer
This commit is contained in:
@@ -1,10 +1,9 @@
|
||||
package observers
|
||||
|
||||
import (
|
||||
"math/rand"
|
||||
"openquell/components"
|
||||
|
||||
"log/slog"
|
||||
|
||||
"github.com/mlange-42/arche/ecs"
|
||||
"github.com/mlange-42/arche/ecs/event"
|
||||
"github.com/mlange-42/arche/generic"
|
||||
@@ -19,30 +18,30 @@ type Score struct {
|
||||
// current level. The Entities map will be reset on each level
|
||||
// initialization in grid/grid.go
|
||||
type GameObserver struct {
|
||||
World *ecs.World
|
||||
CurrentLevel, Width int
|
||||
Height, Cellsize, Score int
|
||||
StopTimer *components.Timer
|
||||
Lost bool // set to true if player is struck or something, by default: win!
|
||||
Retry bool
|
||||
NextlevelText string
|
||||
Entities map[ecs.ID]map[ecs.Entity]int
|
||||
LevelScore []Score // one score per level
|
||||
World *ecs.World
|
||||
CurrentLevel, Width, Moves int
|
||||
Height, Cellsize, Score int
|
||||
StopTimer *components.Timer
|
||||
Lost bool // set to true if player is struck or something, by default: win!
|
||||
Retry bool
|
||||
NextlevelText string
|
||||
Entities map[ecs.ID]map[ecs.Entity]int
|
||||
LevelScore map[int]*Score // one score per level
|
||||
Id int
|
||||
}
|
||||
|
||||
func (observer *GameObserver) GetListenerCallback(comp ecs.ID) listener.Callback {
|
||||
return listener.NewCallback(
|
||||
func(world *ecs.World, event ecs.EntityEvent) {
|
||||
observer.RemoveEntity(event.Entity, comp)
|
||||
slog.Debug("player removed")
|
||||
},
|
||||
event.EntityRemoved,
|
||||
comp,
|
||||
)
|
||||
}
|
||||
|
||||
func NewGameObserver(world *ecs.World, startlevel, levelcount,
|
||||
width, height, cellsize int) *GameObserver {
|
||||
func NewGameObserver(
|
||||
world *ecs.World, startlevel, width, height, cellsize int) *GameObserver {
|
||||
observer := &GameObserver{
|
||||
CurrentLevel: startlevel,
|
||||
StopTimer: &components.Timer{},
|
||||
@@ -50,6 +49,7 @@ func NewGameObserver(world *ecs.World, startlevel, levelcount,
|
||||
Height: height,
|
||||
Cellsize: cellsize,
|
||||
World: world,
|
||||
Id: rand.Intn(1000),
|
||||
}
|
||||
|
||||
playerID := ecs.ComponentID[components.Player](world)
|
||||
@@ -73,8 +73,6 @@ func NewGameObserver(world *ecs.World, startlevel, levelcount,
|
||||
observer.Entities[obstacleID] = make(map[ecs.Entity]int)
|
||||
observer.Entities[particleID] = make(map[ecs.Entity]int)
|
||||
|
||||
observer.LevelScore = make([]Score, levelcount)
|
||||
|
||||
resmanger := generic.NewResource[GameObserver](world)
|
||||
resmanger.Add(observer)
|
||||
|
||||
@@ -82,8 +80,9 @@ func NewGameObserver(world *ecs.World, startlevel, levelcount,
|
||||
}
|
||||
|
||||
func GetGameObserver(world *ecs.World) *GameObserver {
|
||||
observerID := ecs.ResourceID[GameObserver](world)
|
||||
observer := world.Resources().Get(observerID).(*GameObserver)
|
||||
resmanger := generic.NewResource[GameObserver](world)
|
||||
observer := resmanger.Get()
|
||||
|
||||
return observer
|
||||
}
|
||||
|
||||
@@ -134,14 +133,29 @@ func (observer *GameObserver) RemoveEntities() {
|
||||
}
|
||||
|
||||
func (observer *GameObserver) SetupLevelScore(min []int) {
|
||||
observer.LevelScore = make(map[int]*Score, len(min))
|
||||
|
||||
for level, minmoves := range min {
|
||||
observer.LevelScore[level].Min = minmoves
|
||||
observer.LevelScore[level] = &Score{Min: minmoves}
|
||||
}
|
||||
}
|
||||
|
||||
// to be called from scenes where player wins or looses
|
||||
func (observer *GameObserver) AddScore(level, moves int) {
|
||||
observer.LevelScore[level].Score = ((observer.LevelScore[level].Min * 100) / moves) / 30
|
||||
// set current level stats and reset counters
|
||||
func (observer *GameObserver) AddScore() {
|
||||
level := observer.CurrentLevel
|
||||
moves := observer.Moves
|
||||
|
||||
if observer.Lost {
|
||||
observer.LevelScore[level].Score = 0
|
||||
} else {
|
||||
observer.LevelScore[level].Score = ((observer.LevelScore[level].Min * 100) / moves) / 30
|
||||
}
|
||||
|
||||
observer.Moves = 0
|
||||
}
|
||||
|
||||
func (observer *GameObserver) AddMove() {
|
||||
observer.Moves++
|
||||
}
|
||||
|
||||
func (observer *GameObserver) GetScore() int {
|
||||
@@ -153,6 +167,6 @@ func (observer *GameObserver) GetScore() int {
|
||||
return sum
|
||||
}
|
||||
|
||||
func (observer *GameObserver) GetLevelScore(level int) int {
|
||||
return observer.LevelScore[level].Score
|
||||
func (observer *GameObserver) GetLevelScore() int {
|
||||
return observer.LevelScore[observer.CurrentLevel].Score
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user