feat(game): implement MatchManager for game rules and state
This commit is contained in:
66
internal/game/match_manager.go
Normal file
66
internal/game/match_manager.go
Normal file
@@ -0,0 +1,66 @@
|
||||
package game
|
||||
|
||||
import (
|
||||
"github.com/soer/football/internal/entities"
|
||||
)
|
||||
|
||||
type GameState int
|
||||
|
||||
const (
|
||||
Playing GameState = iota
|
||||
GoalPause
|
||||
MatchEnded
|
||||
)
|
||||
|
||||
type MatchManager struct {
|
||||
World *World
|
||||
ScoreRed int
|
||||
ScoreBlue int
|
||||
State GameState
|
||||
MatchDuration float64
|
||||
CurrentTime float64
|
||||
PauseDuration float64
|
||||
PauseTimer float64
|
||||
}
|
||||
|
||||
func NewMatchManager(world *World, matchDuration, pauseDuration float64) *MatchManager {
|
||||
return &MatchManager{
|
||||
World: world,
|
||||
State: Playing,
|
||||
MatchDuration: matchDuration,
|
||||
PauseDuration: pauseDuration,
|
||||
}
|
||||
}
|
||||
|
||||
func (m *MatchManager) Update() {
|
||||
switch m.State {
|
||||
case Playing:
|
||||
team, scored := m.World.CheckGoal()
|
||||
if scored {
|
||||
if team == entities.TeamRed {
|
||||
m.ScoreRed++
|
||||
} else {
|
||||
m.ScoreBlue++
|
||||
}
|
||||
m.State = GoalPause
|
||||
m.PauseTimer = m.PauseDuration
|
||||
} else {
|
||||
m.World.Update()
|
||||
m.CurrentTime += 1.0
|
||||
}
|
||||
|
||||
if m.CurrentTime >= m.MatchDuration {
|
||||
m.State = MatchEnded
|
||||
}
|
||||
|
||||
case GoalPause:
|
||||
m.PauseTimer -= 1.0
|
||||
if m.PauseTimer <= 0 {
|
||||
m.World.ResetPositions()
|
||||
m.State = Playing
|
||||
}
|
||||
|
||||
case MatchEnded:
|
||||
// Do nothing
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user