Files
learn-pub-sub-starter/internal/gamelogic/gamestate.go
2024-12-02 13:11:09 -07:00

97 lines
1.6 KiB
Go

package gamelogic
import (
"sync"
)
type GameState struct {
Player Player
Paused bool
mu *sync.RWMutex
}
func NewGameState(username string) *GameState {
return &GameState{
Player: Player{
Username: username,
Units: map[int]Unit{},
},
Paused: false,
mu: &sync.RWMutex{},
}
}
func (gs *GameState) resumeGame() {
gs.mu.Lock()
defer gs.mu.Unlock()
gs.Paused = false
}
func (gs *GameState) pauseGame() {
gs.mu.Lock()
defer gs.mu.Unlock()
gs.Paused = true
}
func (gs *GameState) isPaused() bool {
gs.mu.RLock()
defer gs.mu.RUnlock()
return gs.Paused
}
func (gs *GameState) addUnit(u Unit) {
gs.mu.Lock()
defer gs.mu.Unlock()
gs.Player.Units[u.ID] = u
}
func (gs *GameState) removeUnitsInLocation(loc Location) {
gs.mu.Lock()
defer gs.mu.Unlock()
for k, v := range gs.Player.Units {
if v.Location == loc {
delete(gs.Player.Units, k)
}
}
}
func (gs *GameState) UpdateUnit(u Unit) {
gs.mu.Lock()
defer gs.mu.Unlock()
gs.Player.Units[u.ID] = u
}
func (gs *GameState) GetUsername() string {
return gs.Player.Username
}
func (gs *GameState) getUnitsSnap() []Unit {
gs.mu.RLock()
defer gs.mu.RUnlock()
Units := []Unit{}
for _, v := range gs.Player.Units {
Units = append(Units, v)
}
return Units
}
func (gs *GameState) GetUnit(id int) (Unit, bool) {
gs.mu.RLock()
defer gs.mu.RUnlock()
u, ok := gs.Player.Units[id]
return u, ok
}
func (gs *GameState) GetPlayerSnap() Player {
gs.mu.RLock()
defer gs.mu.RUnlock()
Units := map[int]Unit{}
for k, v := range gs.Player.Units {
Units[k] = v
}
return Player{
Username: gs.Player.Username,
Units: Units,
}
}