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;
 }