Exemple #1
0
        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)
 {
 }