Пример #1
0
        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);
        }
Пример #2
0
        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));
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
        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);
            }
        }
Пример #5
0
        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);
        }
Пример #6
0
 public int UnitCount(Powers power) => OccupiedMapNodes.Where(kvp => kvp.Value.Power == power).Select(kvp => kvp.Value).Count();