Example #1
0
 public Order(string unitId, OrderType orderType, FormationFacing newFacing = FormationFacing.NORTH, EncounterPosition?newPosition = null)
 {
     this.UnitId      = unitId;
     this.OrderType   = orderType;
     this.NewFacing   = newFacing;
     this.NewPosition = newPosition;
 }
Example #2
0
 public Unit(string unitId, FactionName unitFaction, EncounterPosition rallyPoint, UnitOrder standingOrder,
             FormationType unitFormation, FormationFacing unitFacing)
 {
     this.UnitId                    = unitId;
     this.UnitFaction               = unitFaction;
     this.LeftFlank                 = true;
     this.RightFlank                = true;
     this.RallyPoint                = rallyPoint;
     this.AverageTrackerX           = new AverageTracker();
     this.AverageTrackerY           = new AverageTracker();
     this.StandingOrder             = standingOrder;
     this.UnitFormation             = unitFormation;
     this.UnitFacing                = unitFacing;
     this.EntityIdInForPositionZero = null;
     this.OriginalUnitStrength      = 0;
     this._BattleReadyEntityIds     = new List <string>();
     this._RoutedEntityIds          = new List <string>();
     this._DeadEntityIds            = new List <string>();
 }
Example #3
0
 public static FormationFacing RightOf(this FormationFacing facing)
 {
     if (facing == FormationFacing.NORTH)
     {
         return(FormationFacing.EAST);
     }
     else if (facing == FormationFacing.EAST)
     {
         return(FormationFacing.SOUTH);
     }
     else if (facing == FormationFacing.SOUTH)
     {
         return(FormationFacing.WEST);
     }
     else
     {
         return(FormationFacing.NORTH);
     }
 }
Example #4
0
 private static Tuple <int, int> Rotate(int x, int y, FormationFacing facing)
 {
     if (facing == FormationFacing.NORTH)
     {
         return(new Tuple <int, int>(x, y));
     }
     else if (facing == FormationFacing.EAST)
     {
         return(new Tuple <int, int>(-y, x));
     }
     else if (facing == FormationFacing.SOUTH)
     {
         return(new Tuple <int, int>(-x, -y));
     }
     else if (facing == FormationFacing.WEST)
     {
         return(new Tuple <int, int>(y, -x));
     }
     else
     {
         throw new NotImplementedException();
     }
 }
Example #5
0
 private static Tuple <int, int> ToNorthCoordinates(int dx, int dy, FormationFacing facing)
 {
     if (facing == FormationFacing.NORTH)
     {
         return(new Tuple <int, int>(dx, dy));
     }
     else if (facing == FormationFacing.EAST)
     {
         return(new Tuple <int, int>(dy, -dx));
     }
     else if (facing == FormationFacing.SOUTH)
     {
         return(new Tuple <int, int>(-dx - 1, -dy));
     }
     else if (facing == FormationFacing.WEST) // TODO: uh, is that...right. test out east/west alignment.
     {
         return(new Tuple <int, int>(-dy - 1, dx));
     }
     else
     {
         throw new NotImplementedException();
     }
 }
Example #6
0
        private static Unit CreateAndDeployUnit(Random seededRand, EncounterState state, FactionName faction,
                                                Lane lane, int lanePosition, UnitOrder order, FormationType type, FormationFacing facing, int size,
                                                Func <int, Unit, Entity> entityFn, CommanderAIComponent commanderAI)
        {
            var center = lane.PositionFor(facing, lanePosition);
            var unit   = new Unit(Guid.NewGuid().ToString(), faction, center, order, type, facing);

            state.AddUnit(unit);
            commanderAI.RegisterUnit(unit);
            lane.RegisterUnitAtPosition(unit, lanePosition);

            var width = (int)Math.Ceiling(Math.Sqrt(size));

            List <EncounterPosition> positions = new List <EncounterPosition>();

            for (int x = 0 - width; x < width; x++)
            {
                for (int y = 0 - width; y < width; y++)
                {
                    positions.Add(new EncounterPosition(x, y));
                }
            }
            GameUtils.Shuffle(seededRand, positions);

            for (int i = 0; i < size; i++)
            {
                var entity = entityFn(i, unit);
                state.PlaceEntity(entity, new EncounterPosition(center.X + positions[i].X, center.Y + positions[i].Y));
                unit.RegisterBattleReadyEntity(entity);
            }

            return(unit);
        }
Example #7
0
        public static Tuple <int, int> VectorFromCenterRotated(EncounterPosition center, int tx, int ty, FormationFacing facing)
        {
            int dx = tx - center.X;
            int dy = ty - center.Y;

            return(ToNorthCoordinates(dx, dy, facing));
        }
Example #8
0
        public static EncounterPosition RotateAndProject(EncounterPosition origin, int x, int y, FormationFacing facing)
        {
            var vec = Rotate(x, y, facing);

            return(new EncounterPosition(origin.X + vec.Item1, origin.Y + vec.Item2));
        }
Example #9
0
 // Line indices are "lower towards enemy" - 0th = skirmishers, first = hastatus, third = triarius, highest = reserves
 public EncounterPosition PositionFor(FormationFacing facing, int line, int interval = 15)
 {
     // The facing has to be swapped in order for the position to work - an army FACING north should be DEPLOYED south
     return(AIUtils.RotateAndProject(LaneCenter, 0, -interval * line - interval / 5, facing.Opposite()));
 }