97 lines
1.6 KiB
Go
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,
|
|
}
|
|
}
|