using Civilization.Core.Actions; using Civilization.Core.Interfaces; using Civilization.Core.Units; namespace Civilization.Core.Game; public class GameState(GameMap map, List players) { private readonly Dictionary _units = new(); private readonly Dictionary _cities = new(); public GameMap Map { get; } = map; public List Players { get; } = players; public TurnManager TurnManager { get; } = new(players); public ActionQueue ActionQueue { get; } = new(); public IEnumerable Units => _units.Values; public Player CurrentPlayer => TurnManager.CurrentPlayer; public IEnumerable Cities => _cities.Values; public void NextTurn() { foreach (var listener in GetAllTurnListeners(CurrentPlayer.Id)) listener.OnTurnEnd(this); TurnManager.AdvanceTurn(); foreach (var listener in GetAllTurnListeners(CurrentPlayer.Id)) listener.OnTurnStart(this); ActionQueue.ExecuteAll(new GameActionContext(this)); } public void AddUnit(Unit unit) => _units.Add(unit.Id, unit); public Unit? FindUnit(Guid id) => _units.GetValueOrDefault(id); public IEnumerable GetUnitsForPlayer(int playerId) => _units.Values.Where(u => u.OwnerId == playerId); public void RemoveUnit(Guid id) { // Later, let's check if player can remove this unit (e.g. his turn, unit is not in combat, etc.) _units.Remove(id); } public void AddCity(City city) => _cities.Add(city.Id, city); public City? FindCity(Guid id) => _cities.GetValueOrDefault(id); public IEnumerable GetCitiesForPlayer(int playerId) => _cities.Values.Where(c => c.OwnerId == playerId); private IEnumerable GetAllTurnListeners(int playerId) { foreach (var unit in GetUnitsForPlayer(playerId)) yield return unit; foreach (var city in GetCitiesForPlayer(playerId)) yield return city; } }