internal EnemyAnalyzing(List<IUnit> enemies) { this.enemies = enemies; SquadNumbers = new int[enemies.Count]; squads = new List<EnemySquad>(); EnemySquad squad = new EnemySquad(); foreach (IUnit unit in enemies) squad.units.Add(unit); squads.Add(squad); }
private void Separate(EnemySquad squad) { //erase squad numbers for (int i = 0; i < squad.units.Count; i++) SquadNumbers[i] = 0; //generate squads int NewSquadInd = 1; for (int i = 0; i < squad.units.Count; i++) { if (SquadNumbers[i] == 0) { SquadNumbers[i] = NewSquadInd; NewSquadInd++; } for (int j = i + 1; j < squad.units.Count; j++) if (GameVector.DistanceSquared(squad.units[i].Position, squad.units[j].Position) < OneSquadDistanceSq) { if (SquadNumbers[j] == 0) SquadNumbers[j] = SquadNumbers[i]; else { for (int k = 0; k < squad.units.Count; k++) if (SquadNumbers[k] == SquadNumbers[j]) SquadNumbers[k] = SquadNumbers[i]; } } } List<IUnit> NewUnits = new List<IUnit>(); bool Finished = true; int currNumber = SquadNumbers[0]; for (int i = 0; i < squad.units.Count; i++) if (SquadNumbers[i] == currNumber) { NewUnits.Add(squad.units[i]); SquadNumbers[i] = 0; } else Finished = false; EnemySquad NewSquad=null; while (!Finished) { currNumber = 0; Finished = true; NewSquad = null; for (int i = 0; i < squad.units.Count; i++) { if (SquadNumbers[i] > 0 && currNumber == 0) { currNumber = SquadNumbers[i]; NewSquad = new EnemySquad(); Finished = false; } if (currNumber > 0 && SquadNumbers[i] == currNumber) { NewSquad.units.Add(squad.units[i]); SquadNumbers[i] = 0; } } if (NewSquad!=null) { squads.Add(NewSquad); } } squad.units = NewUnits; }
internal void UnionWith(EnemySquad enemySquad) { foreach (IUnit unit in enemySquad.units) units.Add(unit); }
internal bool MustBeUnionedWith(EnemySquad enemySquad) { //get nearest units GameVector center1=this.GetPosition().Center, center2=enemySquad.GetPosition().Center; float MinDistSq1=float.MaxValue,MinDistSq2=float.MaxValue; IUnit nearestUnit1=null,nearestUnit2=null; foreach (IUnit unit in units) if (GameVector.DistanceSquared(unit.Position, center2) < MinDistSq1) { nearestUnit1 = unit; MinDistSq1 = GameVector.DistanceSquared(unit.Position, center2); } foreach (IUnit unit in enemySquad.units) if (GameVector.DistanceSquared(unit.Position, center1) < MinDistSq2) { nearestUnit2 = unit; MinDistSq2 = GameVector.DistanceSquared(unit.Position, center1); } //find if it's needed to be unioned if (nearestUnit2!=null) foreach (IUnit unit in units) if (GameVector.DistanceSquared(nearestUnit2.Position, unit.Position) < EnemyAnalyzing.OneSquadDistanceSq) return true; if (nearestUnit1 != null) foreach (IUnit unit in enemySquad.units) if (GameVector.DistanceSquared(nearestUnit1.Position, unit.Position) < EnemyAnalyzing.OneSquadDistanceSq) return true; return false; }