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; }
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>(); }
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); } }
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(); } }
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(); } }
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); }
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)); }
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)); }
// 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())); }