private void DoPostInvasionDefense(MilitaryTask Task) { --this.defenseTurns; if (this.defenseTurns <= 0) { Task.EndTask(); } else { switch (this.TaskStep) { case -1: bool flag1 = true; foreach (Ship ship in (List<Ship>)this.Ships) { if (!ship.disabled && ship.hasCommand && ship.Active) { if ((double)Vector2.Distance(ship.Center, this.Position + ship.FleetOffset) > 5000.0) flag1 = false; int num = ship.InCombat ? 1 : 0; if (!flag1) break; } } if (!flag1) break; this.TaskStep = 2; this.FormationWarpTo(Task.AO, MathHelper.ToRadians(HelperFunctions.findAngleToTarget(this.findAveragePosition(), Task.AO)), Vector2.Normalize(Task.AO - this.findAveragePosition())); using (List<Ship>.Enumerator enumerator = this.Ships.GetEnumerator()) { while (enumerator.MoveNext()) enumerator.Current.GetAI().HasPriorityOrder = true; break; } case 0: List<Planet> list1 = new List<Planet>(); foreach (Planet planet in this.Owner.GetPlanets()) { if (planet.HasShipyard) list1.Add(planet); } IOrderedEnumerable<Planet> orderedEnumerable1 = Enumerable.OrderBy<Planet, float>((IEnumerable<Planet>)list1, (Func<Planet, float>)(planet => Vector2.Distance(Task.AO, planet.Position))); if (Enumerable.Count<Planet>((IEnumerable<Planet>)orderedEnumerable1) <= 0) break; Vector2 fVec = Vector2.Normalize(Task.AO - Enumerable.First<Planet>((IEnumerable<Planet>)orderedEnumerable1).Position); Vector2 vector2 = Enumerable.First<Planet>((IEnumerable<Planet>)orderedEnumerable1).Position; this.MoveToNow(vector2, Math.Abs(MathHelper.ToRadians(HelperFunctions.findAngleToTarget(vector2, Task.AO))), fVec); this.TaskStep = 1; break; case 1: bool flag2 = true; foreach (Ship ship in (List<Ship>)this.Ships) { if (!ship.disabled && ship.hasCommand && ship.Active) { if ((double)Vector2.Distance(ship.Center, this.Position + ship.FleetOffset) > 5000.0) flag2 = false; int num = ship.InCombat ? 1 : 0; if (!flag2) break; } } if (!flag2) break; this.TaskStep = 2; this.FormationWarpTo(Task.AO, MathHelper.ToRadians(HelperFunctions.findAngleToTarget(this.findAveragePosition(), Task.AO)), Vector2.Normalize(Task.AO - this.findAveragePosition())); using (List<Ship>.Enumerator enumerator = this.Ships.GetEnumerator()) { while (enumerator.MoveNext()) enumerator.Current.GetAI().HasPriorityOrder = true; break; } case 2: bool flag3 = false; if ((double)Vector2.Distance(this.findAveragePosition(), Task.AO) < 15000.0) { foreach (Ship ship in (List<Ship>)this.Ships) { lock (ship) { if (ship.InCombat) { flag3 = true; ship.HyperspaceReturn(); ship.GetAI().OrderQueue.Clear(); break; } } } } if (!flag3 && (double)Vector2.Distance(this.findAveragePosition(), Task.AO) >= 5000.0) break; this.TaskStep = 3; break; case 3: this.EnemyClumpsDict.Clear(); List<Ship> list2 = new List<Ship>(); List<GameplayObject> nearby1 = UniverseScreen.ShipSpatialManager.GetNearby(this.Position); for (int index1 = 0; index1 < nearby1.Count; ++index1) { Ship ship1 = nearby1[index1] as Ship; if (ship1 != null && ship1.loyalty != this.Owner && (ship1.loyalty.isFaction || this.Owner.GetRelations()[ship1.loyalty].AtWar || this.Owner.isFaction) && (!list2.Contains(ship1) && (double)Vector2.Distance(ship1.Center, Task.AO) < (double)Task.AORadius && !this.EnemyClumpsDict.ContainsKey(ship1.Center))) { this.EnemyClumpsDict.Add(ship1.Center, new List<Ship>()); this.EnemyClumpsDict[ship1.Center].Add(ship1); list2.Add(ship1); List<GameplayObject> nearby2 = UniverseScreen.ShipSpatialManager.GetNearby(this.Position); for (int index2 = 0; index2 < nearby2.Count; ++index2) { Ship ship2 = nearby2[index2] as Ship; if (ship2 != null && ship2.loyalty != this.Owner && (ship2.loyalty == ship1.loyalty && (double)Vector2.Distance(ship1.Center, ship2.Center) < 10000.0) && !list2.Contains(ship2)) this.EnemyClumpsDict[ship1.Center].Add(ship2); } } } if (this.EnemyClumpsDict.Count == 0) { if ((double)Vector2.Distance(this.findAveragePosition(), Task.AO) <= 10000.0) break; this.FormationWarpTo(Task.AO, 0.0f, new Vector2(0.0f, -1f)); break; } else { List<Vector2> list3 = new List<Vector2>(); foreach (KeyValuePair<Vector2, List<Ship>> keyValuePair in this.EnemyClumpsDict) list3.Add(keyValuePair.Key); IOrderedEnumerable<Vector2> orderedEnumerable2 = Enumerable.OrderBy<Vector2, float>((IEnumerable<Vector2>)list3, (Func<Vector2, float>)(clumpPos => Vector2.Distance(this.findAveragePosition(), clumpPos))); List<Ship> list4 = new List<Ship>(); foreach (Ship toAttack in (IEnumerable<Ship>)Enumerable.OrderByDescending<Ship, int>((IEnumerable<Ship>)this.EnemyClumpsDict[Enumerable.First<Vector2>((IEnumerable<Vector2>)orderedEnumerable2)], (Func<Ship, int>)(ship => ship.Size))) { float num = 0.0f; foreach (Ship ship in (IEnumerable<Ship>)Enumerable.OrderByDescending<Ship, int>((IEnumerable<Ship>)this.Ships, (Func<Ship, int>)(ship => ship.Size))) { if (!list4.Contains(ship) && ((double)num == 0.0 || (double)num < (double)toAttack.GetStrength())) { ship.GetAI().OrderAttackSpecificTarget(toAttack); ship.GetAI().Intercepting = true; list4.Add(ship); num += ship.GetStrength(); } } } List<Ship> list5 = new List<Ship>(); foreach (Ship ship in (List<Ship>)this.Ships) { if (!list4.Contains(ship)) list5.Add(ship); } foreach (Ship ship in list5) { ship.GetAI().OrderAttackSpecificTarget(list4[0].GetAI().Target as Ship); ship.GetAI().Intercepting = true; } this.TaskStep = 4; break; } case 4: float num1 = 0.0f; float num2 = 0.0f; float num3 = 0.0f; float num4 = 0.0f; foreach (Ship ship in (List<Ship>)this.Ships) { num1 += ship.Ordinance; num2 += ship.OrdinanceMax; foreach (Weapon weapon in ship.Weapons) { if (weapon.BombTroopDamage_Max <= 0) { if ((double)weapon.OrdinanceRequiredToFire > 0.0) num3 = weapon.DamageAmount / weapon.fireDelay; if ((double)weapon.PowerRequiredToFire > 0.0) num4 = weapon.DamageAmount / weapon.fireDelay; } } } float num5 = num3 + num4; if ((double)num3 >= 0.649999976158142 * (double)num5 && (double)num1 <= 0.100000001490116 * (double)num2) { this.TaskStep = 5; break; } else { bool flag4 = false; foreach (Ship ship in (List<Ship>)this.Ships) { if (!ship.InCombat) { flag4 = true; break; } } if (!flag4) break; this.TaskStep = 3; break; } case 5: List<Planet> list6 = new List<Planet>(); foreach (Planet planet in this.Owner.GetPlanets()) { if (planet.HasShipyard) list6.Add(planet); } IOrderedEnumerable<Planet> orderedEnumerable3 = Enumerable.OrderBy<Planet, float>((IEnumerable<Planet>)list6, (Func<Planet, float>)(p => Vector2.Distance(this.Position, p.Position))); if (Enumerable.Count<Planet>((IEnumerable<Planet>)orderedEnumerable3) <= 0) break; this.Position = Enumerable.First<Planet>((IEnumerable<Planet>)orderedEnumerable3).Position; foreach (Ship ship in (List<Ship>)this.Ships) ship.GetAI().OrderResupply(Enumerable.First<Planet>((IEnumerable<Planet>)orderedEnumerable3), true); this.TaskStep = 6; break; case 6: float num6 = 0.0f; float num7 = 0.0f; foreach (Ship ship in (List<Ship>)this.Ships) { ship.GetAI().HasPriorityOrder = true; num6 += ship.Ordinance; num7 += ship.OrdinanceMax; } if ((double)num6 != (double)num7) break; this.TaskStep = 0; break; } } }
private void DoExplorePlanet(MilitaryTask Task) { bool flag1 = true; foreach (Building building in Task.GetTargetPlanet().BuildingList) { if (!string.IsNullOrEmpty(building.EventTriggerUID)) { flag1 = false; break; } } bool flag2 = false; foreach (Ship ship in (List<Ship>)this.Ships) { if (ship.TroopList.Count > 0) flag2 = true; } foreach (PlanetGridSquare planetGridSquare in Task.GetTargetPlanet().TilesList) { if (planetGridSquare.TroopsHere.Count > 0 && planetGridSquare.TroopsHere[0].GetOwner() == this.Owner) { flag2 = true; break; } } if (flag1 || !flag2 || Task.GetTargetPlanet().Owner != null) { Task.EndTask(); } else { switch (this.TaskStep) { case 0: List<Planet> list1 = new List<Planet>(); foreach (Planet planet in this.Owner.GetPlanets()) { if (planet.HasShipyard) list1.Add(planet); } IOrderedEnumerable<Planet> orderedEnumerable1 = Enumerable.OrderBy<Planet, float>((IEnumerable<Planet>)list1, (Func<Planet, float>)(planet => Vector2.Distance(Task.AO, planet.Position))); if (Enumerable.Count<Planet>((IEnumerable<Planet>)orderedEnumerable1) <= 0) break; Vector2 fVec = Vector2.Normalize(Task.AO - Enumerable.First<Planet>((IEnumerable<Planet>)orderedEnumerable1).Position); Vector2 vector2 = Enumerable.First<Planet>((IEnumerable<Planet>)orderedEnumerable1).Position; this.MoveToNow(vector2, Math.Abs(MathHelper.ToRadians(HelperFunctions.findAngleToTarget(vector2, Task.AO))), fVec); foreach (Ship ship in (List<Ship>)this.Ships) ship.GetAI().HasPriorityOrder = true; this.TaskStep = 1; break; case 1: bool flag3 = true; bool flag4 = false; foreach (Ship ship in (List<Ship>)this.Ships) { if (!ship.disabled && ship.hasCommand && ship.Active) { if ((double)Vector2.Distance(ship.Center, this.Position + ship.FleetOffset) > 5000.0) flag3 = false; if (ship.InCombat) flag4 = true; if (!flag3) break; } } if (!flag3 && !flag4) break; this.TaskStep = 2; Vector2 MovePosition = Task.GetTargetPlanet().Position + Vector2.Normalize(this.findAveragePosition() - Task.GetTargetPlanet().Position) * 50000f; this.Position = MovePosition; this.FormationWarpTo(MovePosition, MathHelper.ToRadians(HelperFunctions.findAngleToTarget(this.findAveragePosition(), Task.AO)), Vector2.Normalize(Task.AO - this.findAveragePosition())); break; case 2: bool flag5 = true; foreach (Ship ship in (List<Ship>)this.Ships) { ship.GetAI().HasPriorityOrder = false; if (!ship.disabled && ship.hasCommand && ship.Active) { if ((double)Vector2.Distance(ship.Center, this.Position + ship.FleetOffset) > 5000.0) flag5 = false; if (!flag5) break; } } if (!flag5) break; foreach (Ship ship in (List<Ship>)this.Ships) { ship.GetAI().State = AIState.HoldPosition; if (ship.Role == "troop") ship.GetAI().HoldPosition(); } this.InterceptorDict.Clear(); this.TaskStep = 3; break; case 3: this.EnemyClumpsDict.Clear(); List<Ship> list2 = new List<Ship>(); List<GameplayObject> nearby1 = UniverseScreen.ShipSpatialManager.GetNearby(this.Position); for (int index1 = 0; index1 < nearby1.Count; ++index1) { Ship ship1 = nearby1[index1] as Ship; if (ship1 != null) { ship1.GetAI().HasPriorityOrder = false; if (ship1.loyalty != this.Owner && (ship1.loyalty.isFaction || this.Owner.GetRelations()[ship1.loyalty].AtWar) && (!list2.Contains(ship1) && (double)Vector2.Distance(ship1.Center, Task.AO) < (double)Task.AORadius && !this.EnemyClumpsDict.ContainsKey(ship1.Center))) { this.EnemyClumpsDict.Add(ship1.Center, new List<Ship>()); this.EnemyClumpsDict[ship1.Center].Add(ship1); list2.Add(ship1); List<GameplayObject> nearby2 = UniverseScreen.ShipSpatialManager.GetNearby(this.Position); for (int index2 = 0; index2 < nearby2.Count; ++index2) { Ship ship2 = nearby2[index2] as Ship; if (ship2 != null && ship2.loyalty != this.Owner && (ship2.loyalty == ship1.loyalty && (double)Vector2.Distance(ship1.Center, ship2.Center) < 10000.0) && !list2.Contains(ship2)) this.EnemyClumpsDict[ship1.Center].Add(ship2); } } } } if (this.EnemyClumpsDict.Count == 0) { this.TaskStep = 5; break; } else { List<Vector2> list3 = new List<Vector2>(); foreach (KeyValuePair<Vector2, List<Ship>> keyValuePair in this.EnemyClumpsDict) list3.Add(keyValuePair.Key); IOrderedEnumerable<Vector2> orderedEnumerable2 = Enumerable.OrderBy<Vector2, float>((IEnumerable<Vector2>)list3, (Func<Vector2, float>)(clumpPos => Vector2.Distance(this.findAveragePosition(), clumpPos))); List<Ship> list4 = new List<Ship>(); foreach (Ship toAttack in this.EnemyClumpsDict[Enumerable.First<Vector2>((IEnumerable<Vector2>)orderedEnumerable2)]) { float num = 0.0f; foreach (Ship ship in (List<Ship>)this.Ships) { if (!list4.Contains(ship) && ((double)num == 0.0 || (double)num < (double)toAttack.GetStrength())) { ship.GetAI().Intercepting = true; ship.GetAI().OrderAttackSpecificTarget(toAttack); list4.Add(ship); num += ship.GetStrength(); } } } List<Ship> list5 = new List<Ship>(); foreach (Ship ship in (List<Ship>)this.Ships) { if (!list4.Contains(ship)) list5.Add(ship); } foreach (Ship ship in list5) ship.GetAI().OrderAttackSpecificTarget(list4[0].GetAI().Target as Ship); this.TaskStep = 4; if (this.InterceptorDict.Count != 0) break; this.TaskStep = 4; break; } case 4: float num1 = 0.0f; float num2 = 0.0f; float num3 = 0.0f; float num4 = 0.0f; foreach (Ship ship in (List<Ship>)this.Ships) { num1 += ship.Ordinance; num2 += ship.OrdinanceMax; foreach (Weapon weapon in ship.Weapons) { if ((double)weapon.OrdinanceRequiredToFire > 0.0) num3 = weapon.DamageAmount / weapon.fireDelay; if ((double)weapon.PowerRequiredToFire > 0.0) num4 = weapon.DamageAmount / weapon.fireDelay; } } float num5 = num3 + num4; if ((double)num3 >= 0.5 * (double)num5 && (double)num1 <= 0.100000001490116 * (double)num2) { this.TaskStep = 5; break; } else { bool flag6 = false; foreach (Ship ship in (List<Ship>)this.Ships) { if (!ship.InCombat) { flag6 = true; break; } } if (!flag6) break; this.TaskStep = 3; break; } case 5: foreach (Ship ship in (List<Ship>)this.Ships) { ship.GetAI().Intercepting = true; ship.GetAI().OrderLandAllTroops(Task.GetTargetPlanet()); } this.Position = Task.GetTargetPlanet().Position; this.AssembleFleet(this.facing, Vector2.Normalize(this.Position - this.findAveragePosition())); break; } } }
private void DoGlassPlanet(MilitaryTask Task) { if (Task.GetTargetPlanet().Owner == this.Owner || Task.GetTargetPlanet().Owner == null) Task.EndTask(); else if (Task.GetTargetPlanet().Owner != null & Task.GetTargetPlanet().Owner != this.Owner && !Task.GetTargetPlanet().Owner.GetRelations()[this.Owner].AtWar) { Task.EndTask(); } else { switch (this.TaskStep) { case 0: List<Planet> list1 = new List<Planet>(); foreach (Planet planet in this.Owner.GetPlanets()) { if (planet.HasShipyard) list1.Add(planet); } IOrderedEnumerable<Planet> orderedEnumerable1 = Enumerable.OrderBy<Planet, float>((IEnumerable<Planet>)list1, (Func<Planet, float>)(planet => Vector2.Distance(Task.AO, planet.Position))); if (Enumerable.Count<Planet>((IEnumerable<Planet>)orderedEnumerable1) <= 0) break; Vector2 fVec = Vector2.Normalize(Task.AO - Enumerable.First<Planet>((IEnumerable<Planet>)orderedEnumerable1).Position); Vector2 vector2 = Enumerable.First<Planet>((IEnumerable<Planet>)orderedEnumerable1).Position; this.MoveToNow(vector2, Math.Abs(MathHelper.ToRadians(HelperFunctions.findAngleToTarget(vector2, Task.AO))), fVec); this.TaskStep = 1; break; case 1: bool flag = true; foreach (Ship ship in (List<Ship>)this.Ships) { if (!ship.disabled && ship.hasCommand && ship.Active) { if ((double)Vector2.Distance(ship.Center, this.Position + ship.FleetOffset) > 15000.0) flag = false; int num = ship.InCombat ? 1 : 0; if (!flag) break; } } if (!flag) break; Vector2 MovePosition = Task.GetTargetPlanet().Position + Vector2.Normalize(this.findAveragePosition() - Task.GetTargetPlanet().Position) * 150000f; this.Position = MovePosition; this.FormationWarpTo(MovePosition, MathHelper.ToRadians(HelperFunctions.findAngleToTarget(this.findAveragePosition(), Task.AO)), Vector2.Normalize(Task.AO - this.findAveragePosition())); foreach (Ship ship in (List<Ship>)this.Ships) ship.GetAI().HasPriorityOrder = true; this.TaskStep = 2; break; case 2: if (Task.WaitForCommand && (double)this.Owner.GetGSAI().ThreatMatrix.PingRadarStr(Task.GetTargetPlanet().Position, 30000f, this.Owner) > 250.0) break; foreach (Ship ship in (List<Ship>)this.Ships) ship.GetAI().OrderBombardPlanet(Task.GetTargetPlanet()); this.TaskStep = 4; break; case 4: float num1 = 0.0f; float num2 = 0.0f; float num3 = 0.0f; float num4 = 0.0f; foreach (Ship ship in (List<Ship>)this.Ships) { num1 += ship.Ordinance; num2 += ship.OrdinanceMax; foreach (Weapon weapon in ship.Weapons) { if ((double)weapon.OrdinanceRequiredToFire > 0.0) num3 = weapon.DamageAmount / weapon.fireDelay; if ((double)weapon.PowerRequiredToFire > 0.0) num4 = weapon.DamageAmount / weapon.fireDelay; } } float num5 = num3 + num4; if ((double)num3 >= 0.5 * (double)num5 && (double)num1 <= 0.100000001490116 * (double)num2) { this.TaskStep = 5; break; } else { this.TaskStep = 2; break; } case 5: List<Planet> list2 = new List<Planet>(); foreach (Planet planet in this.Owner.GetPlanets()) { if (planet.HasShipyard) list2.Add(planet); } IOrderedEnumerable<Planet> orderedEnumerable2 = Enumerable.OrderBy<Planet, float>((IEnumerable<Planet>)list2, (Func<Planet, float>)(p => Vector2.Distance(this.Position, p.Position))); if (Enumerable.Count<Planet>((IEnumerable<Planet>)orderedEnumerable2) <= 0) break; this.Position = Enumerable.First<Planet>((IEnumerable<Planet>)orderedEnumerable2).Position; foreach (Ship ship in (List<Ship>)this.Ships) ship.GetAI().OrderResupply(Enumerable.First<Planet>((IEnumerable<Planet>)orderedEnumerable2), true); this.TaskStep = 6; break; case 6: float num6 = 0.0f; float num7 = 0.0f; foreach (Ship ship in (List<Ship>)this.Ships) { if (ship.GetAI().State != AIState.Resupply) { this.TaskStep = 5; return; } else { ship.GetAI().HasPriorityOrder = true; num6 += ship.Ordinance; num7 += ship.OrdinanceMax; } } if ((double)num6 != (double)num7) break; this.TaskStep = 0; break; } } }
private void DoCohesiveClearAreaOfEnemies(MilitaryTask Task) { switch (this.TaskStep) { case 0: this.TaskStep = 1; this.DoCohesiveClearAreaOfEnemies(Task); break; case 1: List<ThreatMatrix.Pin> list1 = new List<ThreatMatrix.Pin>(); Dictionary<ThreatMatrix.Pin, float> dictionary1 = new Dictionary<ThreatMatrix.Pin, float>(); foreach (KeyValuePair<Guid, ThreatMatrix.Pin> keyValuePair1 in this.Owner.GetGSAI().ThreatMatrix.Pins) { if (!(keyValuePair1.Value.EmpireName == this.Owner.data.Traits.Name) && (EmpireManager.GetEmpireByName(keyValuePair1.Value.EmpireName).isFaction || this.Owner.GetRelations()[EmpireManager.GetEmpireByName(keyValuePair1.Value.EmpireName)].AtWar) && (!list1.Contains(keyValuePair1.Value) && (double)Vector2.Distance(keyValuePair1.Value.Position, Task.AO) < (double)Task.AORadius)) { dictionary1.Add(keyValuePair1.Value, keyValuePair1.Value.Strength); list1.Add(keyValuePair1.Value); foreach (KeyValuePair<Guid, ThreatMatrix.Pin> keyValuePair2 in this.Owner.GetGSAI().ThreatMatrix.Pins) { if (!(keyValuePair2.Value.EmpireName == this.Owner.data.Traits.Name) && keyValuePair2.Value.EmpireName == keyValuePair1.Value.EmpireName && ((double)Vector2.Distance(keyValuePair1.Value.Position, keyValuePair2.Value.Position) < 150000.0 && !list1.Contains(keyValuePair2.Value))) { Dictionary<ThreatMatrix.Pin, float> dictionary2; ThreatMatrix.Pin index; (dictionary2 = dictionary1)[index = keyValuePair1.Value] = dictionary2[index] + keyValuePair2.Value.Strength; } } } } float strength = this.GetStrength(); this.targetPosition = Vector2.Zero; foreach (KeyValuePair<ThreatMatrix.Pin, float> keyValuePair in dictionary1) { if ((double)strength > (double)keyValuePair.Value * 1.35000002384186 && (double)keyValuePair.Value > 750.0) this.targetPosition = keyValuePair.Key.Position; } if (this.targetPosition != Vector2.Zero) { Vector2 fvec = Vector2.Normalize(Task.AO - this.targetPosition); this.FormationWarpTo(this.targetPosition, Math.Abs(MathHelper.ToRadians(HelperFunctions.findAngleToTarget(this.targetPosition, Task.AO))), fvec); this.TaskStep = 2; break; } else { this.Task.EndTask(); break; } case 2: if ((double)this.Owner.GetGSAI().ThreatMatrix.PingRadarStr(this.targetPosition, 20000f, this.Owner) == 0.0) { this.TaskStep = 1; break; } else { if ((double)Vector2.Distance(this.targetPosition, this.findAveragePosition()) >= 25000.0) break; this.TaskStep = 3; break; } case 3: this.EnemyClumpsDict.Clear(); List<Ship> list2 = new List<Ship>(); Vector2 averagePosition = this.findAveragePosition(); List<GameplayObject> nearby1 = UniverseScreen.ShipSpatialManager.GetNearby(this.Position); for (int index1 = 0; index1 < nearby1.Count; ++index1) { Ship ship1 = nearby1[index1] as Ship; if (ship1 != null && ship1.loyalty != this.Owner && (ship1.loyalty.isFaction || this.Owner.GetRelations()[ship1.loyalty].AtWar) && (!list2.Contains(ship1) && (double)Vector2.Distance(ship1.Center, averagePosition) < 50000.0 && !this.EnemyClumpsDict.ContainsKey(ship1.Center))) { this.EnemyClumpsDict.Add(ship1.Center, new List<Ship>()); this.EnemyClumpsDict[ship1.Center].Add(ship1); list2.Add(ship1); List<GameplayObject> nearby2 = UniverseScreen.ShipSpatialManager.GetNearby(this.Position); for (int index2 = 0; index2 < nearby2.Count; ++index2) { Ship ship2 = nearby2[index2] as Ship; if (ship2 != null && ship2.loyalty != this.Owner && (ship2.loyalty == ship1.loyalty && (double)Vector2.Distance(ship1.Center, ship2.Center) < 10000.0) && !list2.Contains(ship2)) this.EnemyClumpsDict[ship1.Center].Add(ship2); } } } if (this.EnemyClumpsDict.Count == 0) { Task.EndTask(); break; } else { List<Vector2> list3 = new List<Vector2>(); foreach (KeyValuePair<Vector2, List<Ship>> keyValuePair in this.EnemyClumpsDict) list3.Add(keyValuePair.Key); IOrderedEnumerable<Vector2> orderedEnumerable = Enumerable.OrderBy<Vector2, float>((IEnumerable<Vector2>)list3, (Func<Vector2, float>)(clumpPos => Vector2.Distance(this.findAveragePosition(), clumpPos))); List<Ship> list4 = new List<Ship>(); foreach (Ship toAttack in this.EnemyClumpsDict[Enumerable.First<Vector2>((IEnumerable<Vector2>)orderedEnumerable)]) { float num = 0.0f; foreach (Ship ship in (List<Ship>)this.Ships) { if (!list4.Contains(ship) && ((double)num == 0.0 || (double)num < (double)toAttack.GetStrength())) { ship.GetAI().Intercepting = true; ship.GetAI().OrderAttackSpecificTarget(toAttack); list4.Add(ship); num += ship.GetStrength(); } } } List<Ship> list5 = new List<Ship>(); foreach (Ship ship in (List<Ship>)this.Ships) { if (!list4.Contains(ship)) list5.Add(ship); } foreach (Ship ship in list5) { ship.GetAI().Intercepting = true; ship.GetAI().OrderAttackSpecificTarget(list4[0].GetAI().Target as Ship); } this.TaskStep = 4; break; } case 4: float num1 = 0.0f; float num2 = 0.0f; float num3 = 0.0f; float num4 = 0.0f; foreach (Ship ship in (List<Ship>)this.Ships) { num1 += ship.Ordinance; num2 += ship.OrdinanceMax; foreach (Weapon weapon in ship.Weapons) { if ((double)weapon.OrdinanceRequiredToFire > 0.0) num3 = weapon.DamageAmount / weapon.fireDelay; if ((double)weapon.PowerRequiredToFire > 0.0) num4 = weapon.DamageAmount / weapon.fireDelay; } } float num5 = num3 + num4; if ((double)num3 >= 0.5 * (double)num5 && (double)num1 <= 0.100000001490116 * (double)num2) { this.TaskStep = 5; break; } else { bool flag = false; foreach (Ship ship in (List<Ship>)this.Ships) { if (!ship.GetAI().BadGuysNear || ship.isInDeepSpace) { flag = true; break; } } if (!flag) break; this.TaskStep = 3; break; } case 5: foreach (Ship ship in (List<Ship>)this.Ships) ship.GetAI().OrderResupplyNearest(); this.TaskStep = 6; break; case 6: float num6 = 0.0f; float num7 = 0.0f; foreach (Ship ship in (List<Ship>)this.Ships) { if (ship.GetAI().State != AIState.Resupply) { Task.EndTask(); return; } else { ship.GetAI().HasPriorityOrder = true; num6 += ship.Ordinance; num7 += ship.OrdinanceMax; } } if ((double)num6 != (double)num7) break; this.TaskStep = 1; break; } }