public UnitMove GetBuildMove(string mapNodeName, UnitType unitType) { Unit unit; MapNode mapNode = MapNodes.Get(mapNodeName); OccupiedMapNodes.TryGetValue(mapNode, out unit); if (unit != null) { throw new ArgumentException($"A {unit.Power} {unit.UnitType} unit occupies {mapNodeName} "); } if (!mapNode.Territory.IsSupplyCenter) { throw new ArgumentException($"Can't build in {mapNode.Territory} because it's not a supply center"); } if (!OwnedSupplyCenters.Any(kvp => kvp.Value.Contains(mapNode.Territory))) { throw new ArgumentException($"No power controls {mapNode.Territory}"); } Powers power = OwnedSupplyCenters.Where(kvp => kvp.Value.Contains(mapNode.Territory)).First().Key; var edge = Maps.BuildMap.AdjacentOutEdges(MapNodes.Get("build")).First(e => e.Target == mapNode); if (unitType == UnitType.Army) { unit = Army.Get(power); } else { unit = Fleet.Get(power); } UnitMove uBuild = new UnitMove(unit, edge); return(uBuild); }
public UnitMove GetMove(string sourceMapNodeName, string targetMapNodeName) { Unit unit; OccupiedMapNodes.TryGetValue(MapNodes.Get(sourceMapNodeName), out unit); if (unit == null) { throw new ArgumentException($"No unit occupies {sourceMapNodeName} "); } return(unit.GetMove(sourceMapNodeName, targetMapNodeName)); }
public void ApplyMoves(BoardMove boardMove, bool validate = false) { if (validate) { foreach (UnitMove move in boardMove) { if (move.IsDisband || move.IsHold) { continue; } if (move.IsBuild) { if (OccupiedMapNodes.ContainsKey(move.Edge.Target)) { throw new Exception($"Cannot build {move.Unit} at {move.Edge.Target} because a unit is already there"); } if (move.Edge.Target.Territory.HomeSupplyPower != move.Unit.Power) { throw new Exception($"Cannot build {move.Unit} at {move.Edge.Target} because it is not a home supply for {move.Unit.Power}"); } } else { if (OccupiedMapNodes[move.Edge.Source] != move.Unit) { throw new Exception($"{move.Unit} is not in {move.Edge.Source}"); } if (move.ConvoyRoute == null && !move.Unit.MyMap.AdjacentOutEdges(move.Edge.Source).Contains(move.Edge)) { throw new Exception($"{move.Edge} is not a valid edge for {move.Unit}"); } // todo add convoy check here } } } OccupiedMapNodes.Clear(); OccupiedTerritories.Clear(); foreach (UnitMove move in boardMove) { if (move.IsDisband) { continue; } if (validate && IsOccupied(move.Edge.Target.Territory)) { throw new Exception($"Territory {move.Edge.Target} has already been moved into during this BoardMove"); } OccupiedMapNodes.Add(move.Edge.Target, move.Unit); OccupiedTerritories.Add(move.Edge.Target.Territory, move.Unit); } }
protected void UpdateOwnedSupplyCenters() { foreach (var kvp in OccupiedMapNodes.Where(kvp => kvp.Key.Territory.IsSupplyCenter)) { Powers currentOwner = OwnedSupplyCenters.First(o => o.Value.Contains(kvp.Key.Territory)).Key; if (currentOwner == kvp.Value.Power) { continue; } OwnedSupplyCenters[kvp.Value.Power].Add(kvp.Key.Territory); OwnedSupplyCenters[currentOwner].Remove(kvp.Key.Territory); } }
public UnitMove GetConvoyMove(string startMapNodeName, string endMapNodeName, params string[] convoyMapNodes) { Unit unit; MapNode startMapNode = MapNodes.Get(startMapNodeName); MapNode endMapNode = MapNodes.Get(endMapNodeName); OccupiedMapNodes.TryGetValue(startMapNode, out unit); if (unit == null) { throw new ArgumentException($"No unit occupies {startMapNodeName} "); } List <MapNode> convoyRoute = new List <MapNode>(); foreach (string convoyMapNode in convoyMapNodes) { convoyRoute.Add(MapNodes.Get(convoyMapNode)); } UnitMove uConvoy = new UnitMove(unit, new UndirectedEdge <MapNode>(startMapNode, endMapNode), convoyRoute); return(uConvoy); }
public int UnitCount(Powers power) => OccupiedMapNodes.Where(kvp => kvp.Value.Power == power).Select(kvp => kvp.Value).Count();