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 DoClaimDefense(MilitaryTask Task) { 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.GetTargetPlanet().Position - 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.GetTargetPlanet().Position))), fVec); this.TaskStep = 1; break; 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.GetTargetPlanet().Position, MathHelper.ToRadians(HelperFunctions.findAngleToTarget(this.findAveragePosition(), Task.GetTargetPlanet().Position)), Vector2.Normalize(Task.GetTargetPlanet().Position - this.findAveragePosition())); using (List<Ship>.Enumerator enumerator = this.Ships.GetEnumerator()) { while (enumerator.MoveNext()) enumerator.Current.GetAI().HasPriorityOrder = true; break; } case 2: bool flag2 = false; if ((double)Vector2.Distance(this.findAveragePosition(), Task.GetTargetPlanet().Position) < 15000.0) { foreach (Ship ship in (List<Ship>)this.Ships) { lock (ship) { if (ship.InCombat) { flag2 = true; ship.HyperspaceReturn(); ship.GetAI().OrderQueue.Clear(); break; } } } } if (!flag2 && (double)Vector2.Distance(this.findAveragePosition(), Task.GetTargetPlanet().Position) >= 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.GetAI().HasPriorityOrder = false; if (ship1.loyalty != this.Owner && (ship1.loyalty.isFaction || this.Owner.GetRelations()[ship1.loyalty].AtWar || ship1.isColonyShip && !this.Owner.GetRelations()[ship1.loyalty].Treaty_NAPact) && (!list2.Contains(ship1) && (double)Vector2.Distance(ship1.Center, Task.GetTargetPlanet().Position) < (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) { using (List<Ship>.Enumerator enumerator = this.Ships.GetEnumerator()) { while (enumerator.MoveNext()) { Ship current = enumerator.Current; if (!(current.GetAI().State == AIState.Orbit )) current.GetAI().OrderOrbitPlanet(Task.GetTargetPlanet()); else if (current.GetAI().State == AIState.Orbit && (current.GetAI().OrbitTarget == null || current.GetAI().OrbitTarget != null && current.GetAI().OrbitTarget != Task.GetTargetPlanet())) current.GetAI().OrderOrbitPlanet(Task.GetTargetPlanet()); } 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().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 flag3 = false; foreach (Ship ship in (List<Ship>)this.Ships) { if (!ship.InCombat) { flag3 = true; break; } } if (!flag3) 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 DoAssaultPlanet(MilitaryTask Task) { if (Task.GetTargetPlanet().Owner == this.Owner || Task.GetTargetPlanet().Owner == null || Task.GetTargetPlanet().Owner != null && !this.Owner.GetRelations()[Task.GetTargetPlanet().Owner].AtWar) { if (Task.GetTargetPlanet().Owner == this.Owner) { MilitaryTask militaryTask = new MilitaryTask(); militaryTask.AO = Task.GetTargetPlanet().Position; militaryTask.AORadius = 50000f; militaryTask.WhichFleet = Task.WhichFleet; militaryTask.SetEmpire(this.Owner); militaryTask.type = MilitaryTask.TaskType.DefendPostInvasion; this.Owner.GetGSAI().TaskList.QueuePendingRemoval(Task); this.Task = militaryTask; lock (GlobalStats.TaskLocker) this.Owner.GetGSAI().TaskList.Add(Task); } else Task.EndTask(); } else { float num1 = 0.0f; foreach (Ship ship in (List<Ship>)this.Ships) num1 += ship.GetStrength(); if ((double)num1 == 0.0) Task.EndTask(); int num2 = 0; int num3 = 0; foreach (Ship ship in (List<Ship>)this.Ships) { if ((double)ship.GetStrength() > 0.0) ++num3; num2 += ship.TroopList.Count; } if (num2 == 0) { foreach (Troop troop in Task.GetTargetPlanet().TroopsHere) { if (troop.GetOwner() == this.Owner) ++num2; } } if (num2 == 0 || num3 == 0) { if (num3 == 0) Task.IsCoreFleetTask = false; Task.EndTask(); this.Task = (MilitaryTask)null; this.TaskStep = 0; } else { switch (this.TaskStep) { case 0: List<Planet> list1 = new List<Planet>(); this.Owner.GetPlanets().thisLock.EnterReadLock(); foreach (Planet planet in this.Owner.GetPlanets().OrderBy(combat=> combat.ParentSystem.DangerTimer)) { if (planet.HasShipyard ) list1.Add(planet); } this.Owner.GetPlanets().thisLock.ExitReadLock(); 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) { 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; } else { Task.EndTask(); break; } case 1: bool flag1 = true; this.Ships.thisLock.EnterReadLock(); 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; this.Ships.thisLock.ExitReadLock(); } else if (ship.GetAI().BadGuysNear) { this.Ships.thisLock.ExitReadLock(); Task.EndTask(); flag1 = false; } int num4 = ship.InCombat ? 1 : 0; if (!flag1) break; } } if (!flag1) break; this.Ships.thisLock.ExitReadLock(); this.TaskStep = 2; Vector2 MovePosition = Task.GetTargetPlanet().Position + Vector2.Normalize(this.findAveragePosition() - Task.GetTargetPlanet().Position) * 125000f; this.Position = MovePosition; this.FormationWarpTo(MovePosition, MathHelper.ToRadians(HelperFunctions.findAngleToTarget(this.findAveragePosition(), Task.AO)), Vector2.Normalize(Task.AO - this.findAveragePosition())); break; case 2: bool flag2 = true; this.Ships.thisLock.EnterReadLock(); 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) > 25000.0) flag2 = false; if (!flag2) break; } } this.Ships.thisLock.ExitReadLock(); if (!flag2) break; this.Ships.thisLock.EnterReadLock(); foreach (Ship ship in (List<Ship>)this.Ships) { ship.GetAI().HasPriorityOrder = false; ship.GetAI().State = AIState.HoldPosition; if (ship.BombBays.Count > 0) ship.GetAI().OrderBombardPlanet(Task.GetTargetPlanet()); else if (ship.Role == "troop") ship.GetAI().HoldPosition(); } this.Ships.thisLock.ExitReadLock(); this.InterceptorDict.Clear(); this.TaskStep = 3; break; case 3: float num5 = 0.0f; float num6 = 0.0f; float num7 = 0.0f; float num8 = 0.0f; this.Ships.thisLock.EnterReadLock(); foreach (Ship ship in (List<Ship>)this.Ships) { num5 += ship.Ordinance; num6 += ship.OrdinanceMax; foreach (Weapon weapon in ship.Weapons) { if ((double)weapon.OrdinanceRequiredToFire > 0.0) num7 = weapon.DamageAmount / weapon.fireDelay; if ((double)weapon.PowerRequiredToFire > 0.0) num8 = weapon.DamageAmount / weapon.fireDelay; } } this.Ships.thisLock.ExitReadLock(); float num9 = num7 + num8; if ((double)num7 >= 0.5 * (double)num9 && (double)num5 <= 0.100000001490116 * (double)num6) { this.TaskStep = 5; break; } else { foreach (Ship key in (List<Ship>)Task.GetTargetPlanet().system.ShipList) { if (key.loyalty != this.Owner && (key.loyalty.isFaction || this.Owner.GetRelations()[key.loyalty].AtWar) && ((double)Vector2.Distance(key.Center, Task.GetTargetPlanet().Position) < 15000.0 && !this.InterceptorDict.ContainsKey(key))) this.InterceptorDict.Add(key, new List<Ship>()); } List<Ship> list2 = new List<Ship>(); foreach (KeyValuePair<Ship, List<Ship>> keyValuePair in this.InterceptorDict) { List<Ship> list3 = new List<Ship>(); if ((double)Vector2.Distance(keyValuePair.Key.Center, Task.GetTargetPlanet().Position) > 20000.0 || !keyValuePair.Key.Active) { list2.Add(keyValuePair.Key); foreach (Ship ship in keyValuePair.Value) { lock (ship) { ship.GetAI().OrderQueue.Clear(); ship.GetAI().Intercepting = false; ship.GetAI().OrderOrbitPlanet(Task.GetTargetPlanet()); ship.GetAI().State = AIState.AwaitingOrders; ship.GetAI().Intercepting = false; } } } foreach (Ship ship in keyValuePair.Value) { if (!ship.Active) list3.Add(ship); } foreach (Ship ship in list3) keyValuePair.Value.Remove(ship); } foreach (Ship key in list2) this.InterceptorDict.Remove(key); foreach (KeyValuePair<Ship, List<Ship>> keyValuePair1 in this.InterceptorDict) { List<Ship> list3 = new List<Ship>(); foreach (Ship ship in (List<Ship>)this.Ships) { if (ship.Role != "troop") list3.Add(ship); } List<Ship> list4 = new List<Ship>(); foreach (KeyValuePair<Ship, List<Ship>> keyValuePair2 in this.InterceptorDict) { list4.Add(keyValuePair2.Key); foreach (Ship ship in keyValuePair2.Value) list3.Remove(ship); } foreach (Ship toAttack in (IEnumerable<Ship>)Enumerable.OrderByDescending<Ship, float>((IEnumerable<Ship>)list4, (Func<Ship, float>)(ship => ship.GetStrength()))) { IOrderedEnumerable<Ship> orderedEnumerable2 = Enumerable.OrderByDescending<Ship, float>((IEnumerable<Ship>)list3, (Func<Ship, float>)(ship => ship.GetStrength())); float num4 = 0.0f; foreach (Ship ship in (IEnumerable<Ship>)orderedEnumerable2) { if ((double)num4 != 0.0) { if ((double)num4 >= (double)toAttack.GetStrength() * 1.5) break; } ship.GetAI().Intercepting = true; list3.Remove(ship); ship.GetAI().OrderAttackSpecificTarget(toAttack); this.InterceptorDict[toAttack].Add(ship); num4 += ship.GetStrength(); } } } if (this.InterceptorDict.Count == 0 || (double)this.Owner.GetGSAI().ThreatMatrix.PingRadarStr(Task.GetTargetPlanet().Position, 25000f, this.Owner) < 500.0) this.TaskStep = 4; lock (GlobalStats.TaskLocker) { this.Owner.GetGSAI().TaskList.thisLock.EnterReadLock(); using (List<MilitaryTask>.Enumerator resource_0 = this.Owner.GetGSAI().TaskList.GetEnumerator()) { while (resource_0.MoveNext()) { MilitaryTask local_43 = resource_0.Current; if (local_43.WaitForCommand && local_43.GetTargetPlanet() != null && local_43.GetTargetPlanet() == Task.GetTargetPlanet()) local_43.WaitForCommand = false; } this.Owner.GetGSAI().TaskList.thisLock.ExitReadLock(); break; } this.Owner.GetGSAI().TaskList.thisLock.ExitReadLock(); } } case 4: int num10 = 0; foreach (Ship ship in (List<Ship>)this.Ships) { if (ship.BombBays.Count > 0 && (double)ship.Ordinance / (double)ship.OrdinanceMax > 0.200000002980232) { num10 += ship.BombBays.Count; ship.GetAI().OrderBombardPlanet(Task.GetTargetPlanet()); } } float num11 = 0.0f; float num12 = 0.0f; float num13 = 0.0f; float num14 = 0.0f; foreach (Ship ship in (List<Ship>)this.Ships) { num11 += ship.Ordinance; num12 += ship.OrdinanceMax; foreach (Weapon weapon in ship.Weapons) { if ((double)weapon.OrdinanceRequiredToFire > 0.0) num13 = weapon.DamageAmount / weapon.fireDelay; if ((double)weapon.PowerRequiredToFire > 0.0) num14 = weapon.DamageAmount / weapon.fireDelay; } } float num15 = num13 + num14; if ((double)num13 >= 0.5 * (double)num15 && (double)num11 <= 0.100000001490116 * (double)num12) { this.TaskStep = 5; break; } else { bool flag3 = true; float groundStrOfPlanet = this.GetGroundStrOfPlanet(Task.GetTargetPlanet()); float num4 = 0.0f; foreach (Ship ship in (List<Ship>)this.Ships) { foreach (Troop troop in ship.TroopList) num4 += (float)troop.Strength; } if ((double)num4 > (double)groundStrOfPlanet || num10 < 6) { flag3 = true; } else { int num16 = 0; foreach (Ship ship in (List<Ship>)this.Ships) { if (ship.BombBays.Count > 0) { ++num16; if ((double)ship.Ordinance / (double)ship.OrdinanceMax > 0.200000002980232) { flag3 = false; break; } } } if (num16 == 0) flag3 = true; } if (flag3) { foreach (Ship ship in (List<Ship>)this.Ships) { if (ship.BombBays.Count > 0) { ship.GetAI().State = AIState.AwaitingOrders; ship.GetAI().OrderQueue.Clear(); } } this.Position = Task.GetTargetPlanet().Position; this.AssembleFleet(this.facing, Vector2.Normalize(this.Position - this.findAveragePosition())); using (List<Ship>.Enumerator enumerator = this.Ships.GetEnumerator()) { while (enumerator.MoveNext()) enumerator.Current.GetAI().OrderLandAllTroops(Task.GetTargetPlanet()); break; } } else { this.Ships.thisLock.EnterReadLock(); using (List<Ship>.Enumerator enumerator = this.Ships.GetEnumerator()) { while (enumerator.MoveNext()) { Ship current = enumerator.Current; if (current.BombBays.Count > 0) current.GetAI().OrderBombardPlanet(Task.GetTargetPlanet()); } this.Ships.thisLock.ExitReadLock(); break; } this.Ships.thisLock.ExitReadLock(); } } case 5: List<Planet> list5 = new List<Planet>(); this.Owner.GetPlanets().thisLock.EnterReadLock(); foreach (Planet planet in this.Owner.GetPlanets()) { if (planet.HasShipyard) list5.Add(planet); } this.Owner.GetPlanets().thisLock.ExitReadLock(); IOrderedEnumerable<Planet> orderedEnumerable3 = Enumerable.OrderBy<Planet, float>((IEnumerable<Planet>)list5, (Func<Planet, float>)(p => Vector2.Distance(this.Position, p.Position))); if (Enumerable.Count<Planet>((IEnumerable<Planet>)orderedEnumerable3) > 0) { 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; } else { Task.EndTask(); break; } case 6: float num17 = 0.0f; float num18 = 0.0f; foreach (Ship ship in (List<Ship>)this.Ships) { ship.GetAI().HasPriorityOrder = true; num17 += ship.Ordinance; num18 += ship.OrdinanceMax; } if ((double)num17 < (double)num18 * 0.899999976158142) break; this.TaskStep = 0; break; } } } }