コード例 #1
0
        public void Execute(ArcenSimContext Context, GameEntity BuildingEntity)
        {
            List <GameEntityTypeData> turretTypes = new List <GameEntityTypeData>();
            List <GameEntityTypeData> shieldTypes = new List <GameEntityTypeData>();

            for (int menuIndex = 0; menuIndex < BuildingEntity.TypeData.BuildMenus.Count; menuIndex++)
            {
                BuildMenu menu = BuildingEntity.TypeData.BuildMenus[menuIndex];
                for (int i = 0; i < menu.List.Count; i++)
                {
                    GameEntityTypeData entityData = menu.List[i];
                    if (entityData.Balance_FuelCost.FuelMultiplier > 0)
                    {
                        continue;
                    }
                    if (entityData.Balance_PowerCost.PowerMultiplier <= 0)
                    {
                        continue;
                    }
                    if (!entityData.CapIsPerPlanet)
                    {
                        continue;
                    }
                    List <GameEntityTypeData> listToAddTo = null;
                    if (entityData.RollupLookup[EntityRollupType.Combatants])
                    {
                        listToAddTo = turretTypes;
                    }
                    else if (entityData.RollupLookup[EntityRollupType.ProjectsShield])
                    {
                        listToAddTo = shieldTypes;
                    }
                    if (listToAddTo == null)
                    {
                        continue;
                    }
                    ArcenRejectionReason rejectionReason = BuildingEntity.Side.GetCanBuildAnother(entityData);
                    if (rejectionReason != ArcenRejectionReason.Unknown)
                    {
                        continue;
                    }
                    listToAddTo.Add(entityData);
                }
            }

            int remainingBudget = BuildingEntity.Side.NetPower;

            remainingBudget -= SpendBudgetOnItemsInList(Context, BuildingEntity.Side, BuildingEntity.WorldLocation, BuildingEntity.TypeData.Radius * 2, shieldTypes, (remainingBudget * 25) / 100);
            remainingBudget -= SpendBudgetOnItemsInList(Context, BuildingEntity.Side, BuildingEntity.WorldLocation, BuildingEntity.TypeData.Radius * 2, turretTypes, remainingBudget);
        }
コード例 #2
0
        public void ComputeCurrentState()
        {
            switch (this.Type)
            {
                #region Victory
            case ObjectiveType.Victory:
            {
                GameEntity masterController = World_AIW2.Instance.GetFirstEntityMatching(SpecialEntityType.AIKingUnit, EntityRollupType.KingUnits);
                if (masterController == null)
                {
                    this.State = ObjectiveState.Met;
                    break;
                }
                if (masterController.Combat.Planet.HumansHaveBasicIntel)
                {
                    this.State = ObjectiveState.NeedToAchieve;
                    this.RelatedPlanets.Add(masterController.Combat.Planet);
                    break;
                }
                this.State = ObjectiveState.NeedToFind;
            }
            break;

                #endregion
                #region GainFleetStrength
            case ObjectiveType.GainFleetStrength:
            {
                WorldSide  localSide = World_AIW2.Instance.GetLocalPlayerSide();
                GameEntity ark       = localSide.Entities.GetFirstMatching(SpecialEntityType.HumanKingUnit);
                if (ark == null)
                {
                    this.State = ObjectiveState.NotApplicable;
                    break;
                }
                List <BuildMenu>          menus             = ark.TypeData.BuildMenus;
                List <GameEntityTypeData> produceableTypes  = new List <GameEntityTypeData>();
                List <GameEntityTypeData> researchableTypes = new List <GameEntityTypeData>();
                bool foundAnyCurrentlyProduceable           = false;
                bool foundAnyTechsCurrentlyResearchable     = false;
                for (int i = 0; i < menus.Count; i++)
                {
                    BuildMenu menu = menus[i];
                    for (int j = 0; j < menu.List.Count; j++)
                    {
                        GameEntityTypeData item = menu.List[j];
                        if (item.BalanceStats.SquadFuelConsumption <= 0)
                        {
                            continue;
                        }
                        ArcenRejectionReason reason = localSide.GetCanBuildAnother(item);
                        switch (reason)
                        {
                        case ArcenRejectionReason.SideDoesNotHaveEnoughCap:
                            continue;

                        case ArcenRejectionReason.SideDoesNotHavePrerequisiteTech:
                            if (item.TechPrereq.NotOnMainTechMenu)
                            {
                                continue;
                            }
                            ArcenRejectionReason techRejectionReason = localSide.GetCanResearch(item.TechPrereq, false, false);
                            switch (techRejectionReason)
                            {
                            case ArcenRejectionReason.SideDoesNotHavePrerequisiteTech:
                                continue;

                            case ArcenRejectionReason.Unknown:
                                foundAnyTechsCurrentlyResearchable = true;
                                break;
                            }
                            researchableTypes.Add(item);
                            continue;

                        case ArcenRejectionReason.Unknown:
                            foundAnyCurrentlyProduceable = true;
                            break;
                        }
                        produceableTypes.Add(item);
                    }
                }
                this.State = ObjectiveState.NeedToAchieve;
                if (foundAnyCurrentlyProduceable)
                {
                    this.SubType = ObjectiveSubType.GainFleetStrength_ThroughProduction;
                    for (int i = 0; i < produceableTypes.Count; i++)
                    {
                        GameEntityTypeData entityType = produceableTypes[i];
                        if (localSide.GetCanBuildAnother(entityType) != ArcenRejectionReason.Unknown)
                        {
                            continue;
                        }
                        this.RelatedEntityTypes.Add(entityType);
                    }
                    this.RelatedEntityTypes.Sort(delegate(GameEntityTypeData Left, GameEntityTypeData Right)
                        {
                            FInt leftValue  = Left.BalanceStats.StrengthPerSquad * localSide.GetRemainingCap(Left);
                            FInt rightValue = Right.BalanceStats.StrengthPerSquad * localSide.GetRemainingCap(Right);
                            return(rightValue.CompareTo(leftValue));
                        });
                }
                else if (produceableTypes.Count > 0)
                {
                    this.SubType = ObjectiveSubType.GainFleetStrength_ThroughFuel;
                    GetPotentialCapturePlanets(localSide);
                    this.RelatedPlanets.Sort(delegate(Planet Left, Planet Right)
                        {
                            return(Right.ResourceOutputs[ResourceType.Fuel].CompareTo(Left.ResourceOutputs[ResourceType.Fuel]));
                        });
                }
                else if (foundAnyTechsCurrentlyResearchable)
                {
                    this.SubType = ObjectiveSubType.GainFleetStrength_ThroughSpendingScience;
                    for (int i = 0; i < researchableTypes.Count; i++)
                    {
                        GameEntityTypeData entityType = researchableTypes[i];
                        if (localSide.GetCanResearch(entityType.TechPrereq, false, false) != ArcenRejectionReason.Unknown)
                        {
                            continue;
                        }
                        this.RelatedEntityTypes.Add(entityType);
                    }
                    this.RelatedEntityTypes.Sort(delegate(GameEntityTypeData Left, GameEntityTypeData Right)
                        {
                            return(Right.BalanceStats.StrengthPerCap.CompareTo(Left.BalanceStats.StrengthPerCap));
                        });
                }
                else if (researchableTypes.Count > 0)
                {
                    this.SubType = ObjectiveSubType.GainFleetStrength_ThroughScience;
                    GetPotentialCapturePlanets(localSide);
                    this.RelatedPlanets.Sort(delegate(Planet Left, Planet Right)
                        {
                            FInt LeftValue  = Left.ResourceOutputs[ResourceType.Science] - Left.ScienceGatheredBySideIndex[localSide.SideIndex];
                            FInt RightValue = Right.ResourceOutputs[ResourceType.Science] - Right.ScienceGatheredBySideIndex[localSide.SideIndex];
                            return(RightValue.CompareTo(LeftValue));
                        });
                }
                else
                {
                    this.State = ObjectiveState.NotApplicable;
                }
            }
            break;

                #endregion
                #region ExploreGalaxy
            case ObjectiveType.ExploreGalaxy:
            {
                GetKnownPlanetsWithAtLeastOneUnitOf(WorldSideType.AI, EntityRollupType.ScramblesSensors);
                this.RelatedPlanets.Sort(delegate(Planet Left, Planet Right)
                    {
                        return(Left.OriginalHopsToHumanHomeworld.CompareTo(Right.OriginalHopsToHumanHomeworld));
                    });
                if (this.RelatedPlanets.Count > 0)
                {
                    this.State = ObjectiveState.NeedToAchieve;
                }
            }
            break;

                #endregion
                #region ClaimFlagship
            case ObjectiveType.ClaimFlagship:
            {
                GetKnownPlanetsWithAtLeastOneUnitOf(WorldSideType.NaturalObject, "Flagship");
                this.RelatedPlanets.Sort(delegate(Planet Left, Planet Right)
                    {
                        return(Left.OriginalHopsToHumanHomeworld.CompareTo(Right.OriginalHopsToHumanHomeworld));
                    });
                if (this.RelatedPlanets.Count > 0)
                {
                    this.State = ObjectiveState.NeedToAchieve;
                }
            }
            break;

                #endregion
                #region GetBonusShipType
            case ObjectiveType.GetBonusShipType:
            {
                GetKnownPlanetsWithAtLeastOneUnitOf(WorldSideType.AI, "AdvancedResearchStation");
                this.RelatedPlanets.Sort(delegate(Planet Left, Planet Right)
                    {
                        return(Left.OriginalHopsToHumanHomeworld.CompareTo(Right.OriginalHopsToHumanHomeworld));
                    });
                if (this.RelatedPlanets.Count > 0)
                {
                    this.State = ObjectiveState.NeedToAchieve;
                }
            }
            break;

                #endregion
                #region DestroyAIPReducer
            case ObjectiveType.DestroyAIPReducer:
            {
                GetKnownPlanetsWithAtLeastOneUnitOf(WorldSideType.AI, "DataCenter");
                this.RelatedPlanets.Sort(delegate(Planet Left, Planet Right)
                    {
                        return(Left.OriginalHopsToHumanHomeworld.CompareTo(Right.OriginalHopsToHumanHomeworld));
                    });
                if (this.RelatedPlanets.Count > 0)
                {
                    this.State = ObjectiveState.NeedToAchieve;
                }
            }
            break;
                #endregion
            }
        }