public void DoLongRangePlanning(WorldSide side, ArcenLongTermPlanningContext Context) { Galaxy galaxy = World_AIW2.Instance.SetOfGalaxies.Galaxies[0]; side.Entities.DoForEntities(GameEntityCategory.Ship, delegate(GameEntity entity) { if (entity.LongRangePlanningData == null) { return(DelReturn.Continue); // if created after the start of this planning cycle, skip } if (!entity.TypeData.GetHasTag(DEVOURER_TAG)) { return(DelReturn.Continue); // if not the Big D, skip (shouldn't happen, but if somebody mods in a reclamator gun for the thing, etc) } if (entity.LongRangePlanningData.FinalDestinationPlanetIndex != -1 && entity.LongRangePlanningData.FinalDestinationPlanetIndex != entity.LongRangePlanningData.CurrentPlanetIndex) { return(DelReturn.Continue); // if heading somewhere else, skip } Planet planet = World_AIW2.Instance.GetPlanetByIndex(entity.LongRangePlanningData.CurrentPlanetIndex); List <GameEntity> threatShipsNotAssignedElsewhere = new List <GameEntity>(); threatShipsNotAssignedElsewhere.Add(entity); FactionUtilityMethods.Helper_SendThreatOnRaid(threatShipsNotAssignedElsewhere, side, galaxy, planet, true, Context); return(DelReturn.Continue); }); }
public void DoLongRangePlanning(WorldSide side, ArcenLongTermPlanningContext Context) { ArcenSparseLookup <Planet, List <GameEntity> > unassignedThreatShipsByPlanet = new ArcenSparseLookup <Planet, List <GameEntity> >(); side.Entities.DoForEntities(GameEntityCategory.Ship, delegate(GameEntity entity) { if (entity.LongRangePlanningData == null) { return(DelReturn.Continue); // if created after the start of this planning cycle, skip } Planet planet = World_AIW2.Instance.GetPlanetByIndex(entity.LongRangePlanningData.CurrentPlanetIndex); if (entity.TypeData.GetHasTag(DYSON_SPHERE_TAG)) { // the sphere itself } else { // something the sphere spawned if (entity.LongRangePlanningData.FinalDestinationPlanetIndex != -1 && entity.LongRangePlanningData.FinalDestinationPlanetIndex != entity.LongRangePlanningData.CurrentPlanetIndex) { return(DelReturn.Continue); // if heading somewhere else, skip } if (!unassignedThreatShipsByPlanet.GetHasKey(planet)) { unassignedThreatShipsByPlanet[planet] = new List <GameEntity>(); } unassignedThreatShipsByPlanet[planet].Add(entity); } return(DelReturn.Continue); }); int pairCount = unassignedThreatShipsByPlanet.GetPairCount(); for (int i = 0; i < pairCount; i++) { ArcenSparseLookupPair <Planet, List <GameEntity> > pair = unassignedThreatShipsByPlanet.GetPairByIndex(i); FactionUtilityMethods.Helper_SendThreatOnRaid(pair.Value, side, World_AIW2.Instance.SetOfGalaxies.Galaxies[0], pair.Key, false, Context); } }
public static void Helper_SendThreatOnRaid(List <GameEntity> threatShipsNotAssignedElsewhere, WorldSide worldSide, Galaxy galaxy, Planet planet, bool IgnorePathCosts, ArcenLongTermPlanningContext Context) { for (int k = 0; k < galaxy.Planets.Count; k++) { Planet otherPlanet = galaxy.Planets[k]; otherPlanet.FactionPlanning_CheapestRaidPathToHereComesFrom = null; otherPlanet.FactionPlanning_CheapestRaidPathToHereCost = FInt.Zero; } List <Planet> potentialAttackTargets = new List <Planet>(); List <Planet> planetsToCheckInFlood = new List <Planet>(); planetsToCheckInFlood.Add(planet); planet.FactionPlanning_CheapestRaidPathToHereComesFrom = planet; for (int k = 0; k < planetsToCheckInFlood.Count; k++) { Planet floodPlanet = planetsToCheckInFlood[k]; floodPlanet.DoForLinkedNeighbors(delegate(Planet neighbor) { FInt totalCostFromOriginToNeighbor = floodPlanet.FactionPlanning_CheapestRaidPathToHereCost + 1; if (!potentialAttackTargets.Contains(neighbor)) { potentialAttackTargets.Add(neighbor); } if (neighbor.FactionPlanning_CheapestRaidPathToHereComesFrom != null && neighbor.FactionPlanning_CheapestRaidPathToHereCost <= totalCostFromOriginToNeighbor) { return(DelReturn.Continue); } neighbor.FactionPlanning_CheapestRaidPathToHereComesFrom = floodPlanet; neighbor.FactionPlanning_CheapestRaidPathToHereCost = totalCostFromOriginToNeighbor; planetsToCheckInFlood.Add(neighbor); return(DelReturn.Continue); }); } if (potentialAttackTargets.Count <= 0) { return; } if (!IgnorePathCosts) { potentialAttackTargets.Sort(delegate(Planet Left, Planet Right) { return(Left.AIPlanning_CheapestRaidPathToHereCost.CompareTo(Right.AIPlanning_CheapestRaidPathToHereCost)); }); int lastIndexToRetain = potentialAttackTargets.Count / 4; for (int k = lastIndexToRetain + 1; k < potentialAttackTargets.Count; k++) { potentialAttackTargets.RemoveAt(k--); } } Planet threatTarget = potentialAttackTargets[Context.QualityRandom.Next(0, potentialAttackTargets.Count)]; List <Planet> path = new List <Planet>(); Planet workingPlanet = threatTarget; while (workingPlanet != planet) { path.Insert(0, workingPlanet); workingPlanet = workingPlanet.FactionPlanning_CheapestRaidPathToHereComesFrom; } if (path.Count > 0) { GameCommand command = GameCommand.Create(GameCommandType.SetWormholePath); for (int k = 0; k < threatShipsNotAssignedElsewhere.Count; k++) { command.RelatedEntityIDs.Add(threatShipsNotAssignedElsewhere[k].PrimaryKeyID); } for (int k = 0; k < path.Count; k++) { command.RelatedPlanetIndices.Add(path[k].PlanetIndex); } Context.QueueCommandForSendingAtEndOfContext(command); } }
public void DoLongRangePlanning(WorldSide side, ArcenLongTermPlanningContext Context) { }