protected override void CreateLocalNeeds(StaticString context, StaticString pass)
    {
        base.CreateLocalNeeds(context, pass);
        float propertyValue = this.Empire.GetPropertyValue(SimulationProperties.MinorFactionSlotCount);
        int   count         = this.departmentOfTheInterior.AssimilatedFactions.Count;
        bool  flag          = false;

        if (propertyValue <= (float)count)
        {
            flag = true;
            if (this.game.Turn - 14 <= this.lastAssimilationTurn)
            {
                return;
            }
        }
        List <MinorFaction> list = new List <MinorFaction>();

        this.departmentOfTheInterior.GetAssimilableMinorFactions(ref list);
        if (list.Count == 0)
        {
            return;
        }
        this.UpdateUnitCategories();
        this.FactionToDeassimilate = string.Empty;
        int   num  = -1;
        float num2 = 0f;

        UnitBodyDefinition[] values = this.unitBodyDefinitionDatabase.GetValues();
        int   index = -1;
        float num3  = float.MaxValue;

        for (int i = 0; i < list.Count; i++)
        {
            Faction faction = list[i];
            bool    flag2   = this.departmentOfTheInterior.IsAssimilated(faction);
            float   num4;
            if (this.MinorfactionScores.TryGetValue(faction.Name, out num4))
            {
                float num5 = (float)this.departmentOfTheInterior.GetNumberOfOwnedMinorFactionVillages(list[i], true);
                float num6 = (float)this.departmentOfTheInterior.GetNumberOfOwnedMinorFactionVillages(list[i], false) - num5;
                float num7 = num4 * (num5 + num6 * 0.5f);
                if (flag2)
                {
                    num7 *= 1.7f;
                }
                float num8 = 0f;
                using (IEnumerator <UnitBodyDefinition> enumerator = (from match in values
                                                                      where match.Affinity != null && match.Affinity.Name == faction.Affinity.Name
                                                                      select match).GetEnumerator())
                {
                    while (enumerator.MoveNext())
                    {
                        UnitBodyDefinition unitBodyDefinition = enumerator.Current;
                        if (flag2)
                        {
                            int num9 = 0;
                            Func <Construction, bool> < > 9__2;
                            foreach (City gameEntity in this.departmentOfTheInterior.Cities)
                            {
                                ConstructionQueue constructionQueue = this.departmentOfIndustry.GetConstructionQueue(gameEntity);
                                if (constructionQueue != null)
                                {
                                    IEnumerable <Construction> pendingConstructions = constructionQueue.PendingConstructions;
                                    Func <Construction, bool>  selector;
                                    if ((selector = < > 9__2) == null)
                                    {
                                        selector = (< > 9__2 = ((Construction c) => c.ConstructibleElement is UnitDesign && (c.ConstructibleElement as UnitDesign).UnitBodyDefinition == unitBodyDefinition && (c.GetSpecificConstructionStock(DepartmentOfTheTreasury.Resources.Production) > 0f || c.IsBuyout)));
                                    }
                                    int num10 = pendingConstructions.Count(selector);
                                    num9 += num10;
                                }
                            }
                            if (this.departmentOfTheInterior.Cities.Count < num9 * 4)
                            {
                                goto IL_2E5;
                            }
                        }
                        float num11 = this.intelligenceAIHelper.GetAIStrengthBelief(base.AIEntity.Empire.Index, unitBodyDefinition.Name);
                        if (this.UnitTypes[unitBodyDefinition.SubCategory] == 0 || (flag2 && this.UnitTypes[unitBodyDefinition.SubCategory] == 1))
                        {
                            num11 = AILayer.Boost(num11, 0.8f);
                        }
                        num8 = Mathf.Max(num8, num11);
                    }
                }
                float num12 = num7 * num8;
                if (!flag2 && (num < 0 || num12 > num2))
                {
                    num  = i;
                    num2 = num12;
                }
                if (flag2 && num12 < num3)
                {
                    index = i;
                    num3  = num12;
                }
            }
            IL_2E5 :;
        }
        if (num < 0 || num2 < 0.7f)
        {
            return;
        }
        if (flag)
        {
            if (num2 <= num3)
            {
                return;
            }
            this.FactionToDeassimilate = list[index].Name;
        }
        Faction faction2 = list[num];
        EvaluableMessage_Assimilation evaluableMessage_Assimilation = base.AIEntity.AIPlayer.Blackboard.FindFirst <EvaluableMessage_Assimilation>(BlackboardLayerID.Empire, (EvaluableMessage_Assimilation match) => match.EvaluationState == EvaluableMessage.EvaluableMessageState.Pending || match.EvaluationState == EvaluableMessage.EvaluableMessageState.Validate);

        if (evaluableMessage_Assimilation == null)
        {
            evaluableMessage_Assimilation = new EvaluableMessage_Assimilation(AILayer_AccountManager.AssimilationAccountName);
            base.AIEntity.AIPlayer.Blackboard.AddMessage(evaluableMessage_Assimilation);
        }
        evaluableMessage_Assimilation.Refresh(1f, 1f, faction2.Name);
    }
Esempio n. 2
0
    private void ComputeScoresByDistance()
    {
        City[] knownCities = this.GetKnownCities(true);
        Dictionary <AILayer_CreepingNode.EvaluableCreepingNode, float> dictionary = new Dictionary <AILayer_CreepingNode.EvaluableCreepingNode, float>();
        double num  = Math.Pow((double)this.worldPositionningService.World.WorldParameters.Columns, 2.0);
        double num2 = Math.Pow((double)this.worldPositionningService.World.WorldParameters.Rows, 2.0);
        float  num3 = (float)Math.Sqrt(num + num2);
        float  num4 = 1f;
        float  num5 = 0f;

        for (int i = 0; i < this.availableNodes.Count; i++)
        {
            AILayer_CreepingNode.EvaluableCreepingNode evaluableCreepingNode = this.availableNodes[i];
            float num6 = num3;
            float num7 = num3;
            foreach (City city in knownCities)
            {
                float num8 = (float)this.worldPositionningService.GetDistance(evaluableCreepingNode.pointOfInterest.WorldPosition, city.WorldPosition);
                if (city.Empire.Index == base.AIEntity.Empire.Index)
                {
                    if (num8 < num6)
                    {
                        num6 = num8;
                    }
                }
                else if (num8 < num7)
                {
                    num7 = num8;
                }
            }
            if (num6 <= 0f || num7 <= 0f)
            {
                dictionary.Add(evaluableCreepingNode, 0f);
            }
            else
            {
                float num9  = num6 + num7;
                float num10 = num7 / num9;
                if (num10 < num4)
                {
                    num4 = num10;
                }
                if (num10 > num5)
                {
                    num5 = num10;
                }
                float value = num10 * num7 * evaluableCreepingNode.nodeDefinition.AIPreferences.ScoringByDistanceMultiplier;
                dictionary.Add(evaluableCreepingNode, value);
            }
        }
        float num11 = float.MaxValue;
        float num12 = float.MinValue;

        foreach (float num13 in dictionary.Values)
        {
            float num14 = num13;
            if (num14 < num11)
            {
                num11 = num14;
            }
            if (num14 > num12)
            {
                num12 = num14;
            }
        }
        float num15 = num5 - num4;

        for (int k = 0; k < this.availableNodes.Count; k++)
        {
            AILayer_CreepingNode.EvaluableCreepingNode evaluableCreepingNode2 = this.availableNodes[k];
            float value2 = dictionary[evaluableCreepingNode2];
            float num16  = (num11 == num12) ? this.NormalizationFailSafeValue : Mathf.InverseLerp(num11, num12, value2);
            evaluableCreepingNode2.score = AILayer.Boost(evaluableCreepingNode2.score, num16 * num15 * this.DistanceWeight);
        }
    }
Esempio n. 3
0
    private void ScoreWatchtowerNodes()
    {
        City[]       knownCities = this.GetKnownCities(false);
        List <float> list        = new List <float>();

        for (int i = 0; i < this.availableNodes.Count; i++)
        {
            AILayer_CreepingNode.EvaluableCreepingNode evaluableCreepingNode = this.availableNodes[i];
            if (evaluableCreepingNode.pointOfInterest.Type != "WatchTower")
            {
                list.Add(0f);
            }
            else
            {
                float num  = float.MaxValue;
                int   num2 = 0;
                for (int j = 0; j < knownCities.Length; j++)
                {
                    City  city = knownCities[j];
                    float num3 = (float)this.worldPositionningService.GetDistance(evaluableCreepingNode.pointOfInterest.WorldPosition, city.WorldPosition);
                    if (num3 < num)
                    {
                        num  = num3;
                        num2 = j;
                    }
                }
                float num4 = 0f;
                if (knownCities.Length != 0)
                {
                    num4 = 1f / num;
                    DiplomaticRelation diplomaticRelation = knownCities[num2].Empire.GetAgency <DepartmentOfForeignAffairs>().GetDiplomaticRelation(base.AIEntity.Empire);
                    if (diplomaticRelation != null)
                    {
                        string a = diplomaticRelation.State.Name;
                        if (!(a == "DiplomaticRelationStateWar"))
                        {
                            if (!(a == "DiplomaticRelationStateTruce"))
                            {
                                if (!(a == "DiplomaticRelationStateColdWar"))
                                {
                                    if (!(a == "DiplomaticRelationStatePeace"))
                                    {
                                        if (!(a == "DiplomaticRelationStateAlliance"))
                                        {
                                            num4 *= 0f;
                                        }
                                        else
                                        {
                                            num4 *= this.TowerMultiplierForAlliance;
                                        }
                                    }
                                    else
                                    {
                                        num4 *= this.TowerMultiplierForPeace;
                                    }
                                }
                                else
                                {
                                    num4 *= this.TowerMultiplierForColdWar;
                                }
                            }
                            else
                            {
                                num4 *= this.TowerMultiplierForTruce;
                            }
                        }
                        else
                        {
                            num4 *= this.TowerMultiplierForWar;
                        }
                    }
                }
                list.Add(num4);
            }
        }
        if (list.Count > 0)
        {
            float num5 = list.Min();
            float num6 = list.Max();
            for (int k = 0; k < list.Count; k++)
            {
                if (!(this.availableNodes[k].pointOfInterest.Type != "WatchTower"))
                {
                    float num7        = (num5 == num6) ? this.NormalizationFailSafeValue : Mathf.InverseLerp(num5, num6, list[k]);
                    float score       = this.availableNodes[k].score;
                    float boostFactor = num7 * this.TowersWeight;
                    this.availableNodes[k].score = AILayer.Boost(score, boostFactor);
                }
            }
        }
    }
    protected override State Execute(AIBehaviorTree aiBehaviorTree, params object[] parameters)
    {
        DepartmentOfScience agency = aiBehaviorTree.AICommander.Empire.GetAgency <DepartmentOfScience>();

        if (agency != null && !agency.CanPillage())
        {
            return(State.Failure);
        }
        if (!this.downloadableContentService.IsShared(DownloadableContent11.ReadOnlyName))
        {
            return(State.Failure);
        }
        Army army;

        if (base.GetArmyUnlessLocked(aiBehaviorTree, "$Army", out army) != AIArmyMission.AIArmyMissionErrorCode.None)
        {
            return(State.Failure);
        }
        if (!aiBehaviorTree.Variables.ContainsKey(this.TargetListVarName))
        {
            return(State.Failure);
        }
        if (!string.IsNullOrEmpty(this.OpportunityMaximumTurnName) && aiBehaviorTree.Variables.ContainsKey(this.OpportunityMaximumTurnName))
        {
            this.OpportunityMaximumTurn = (float)aiBehaviorTree.Variables[this.OpportunityMaximumTurnName];
        }
        List <IWorldPositionable> list = aiBehaviorTree.Variables[this.TargetListVarName] as List <IWorldPositionable>;

        if (list == null)
        {
            aiBehaviorTree.ErrorCode = 10;
            return(State.Failure);
        }
        if (list.Count == 0)
        {
            aiBehaviorTree.ErrorCode = 10;
            return(State.Failure);
        }
        AIEntity_Empire entity          = aiBehaviorTree.AICommander.AIPlayer.GetEntity <AIEntity_Empire>();
        float           num             = 0.1f;
        float           propertyValue   = army.GetPropertyValue(SimulationProperties.MaximumMovement);
        PointOfInterest pointOfInterest = null;

        for (int i = 0; i < list.Count; i++)
        {
            PointOfInterest pointOfInterest2 = list[i] as PointOfInterest;
            if (pointOfInterest2 != null && pointOfInterest2.Region.City != null && pointOfInterest2.PointOfInterestImprovement != null && DepartmentOfDefense.CanStartPillage(army, pointOfInterest2, false))
            {
                float num2 = 0.5f;
                if (entity != null)
                {
                    num2 = this.ComputePillageInterest(pointOfInterest2, entity, army) * 0.5f;
                }
                if (num2 >= 0f)
                {
                    float num3 = (float)this.worldPositionningService.GetDistance(army.WorldPosition, pointOfInterest2.WorldPosition) / propertyValue;
                    if (num3 <= this.MaximumTurnDistance)
                    {
                        float num4 = 0.5f - num3 / this.MaximumTurnDistance;
                        num2 = AILayer.Boost(num2, num4 * 0.5f);
                        float propertyValue2 = pointOfInterest2.GetPropertyValue(SimulationProperties.PillageDefense);
                        float propertyValue3 = pointOfInterest2.GetPropertyValue(SimulationProperties.MaximumPillageDefense);
                        num2 = AILayer.Boost(num2, (1f - propertyValue2 / propertyValue3) * 0.2f);
                        if (num2 > num)
                        {
                            num             = num2;
                            pointOfInterest = pointOfInterest2;
                        }
                    }
                }
            }
        }
        if (pointOfInterest != null)
        {
            if (this.OpportunityMaximumTurn > 0f)
            {
                int num5 = 0;
                int num6 = 0;
                if (aiBehaviorTree.Variables.ContainsKey(this.OpportunityMainTargetPosition))
                {
                    WorldPosition mainTargetPosition = (WorldPosition)aiBehaviorTree.Variables[this.OpportunityMainTargetPosition];
                    if (!AIBehaviorTreeNode_Decorator_EvaluateOpportunity.IsDetourWorthCheckingFast(this.worldPositionningService, army, pointOfInterest.WorldPosition, mainTargetPosition, out num6, out num5))
                    {
                        return(State.Failure);
                    }
                }
                int remainingTurnToPillage        = DepartmentOfDefense.GetRemainingTurnToPillage(army, pointOfInterest);
                IAIDataRepositoryAIHelper service = AIScheduler.Services.GetService <IAIDataRepositoryAIHelper>();
                Diagnostics.Assert(service != null);
                float       num7 = 1f;
                AIData_Army aidata_Army;
                if (service.TryGetAIData <AIData_Army>(army.GUID, out aidata_Army))
                {
                    num7 = aiBehaviorTree.AICommander.GetPillageModifier(aidata_Army.CommanderMission);
                }
                if ((float)(num5 - num6 + remainingTurnToPillage) > this.OpportunityMaximumTurn * num7)
                {
                    return(State.Failure);
                }
            }
            if (aiBehaviorTree.Variables.ContainsKey(this.Output_TargetVarName))
            {
                aiBehaviorTree.Variables[this.Output_TargetVarName] = pointOfInterest;
            }
            else
            {
                aiBehaviorTree.Variables.Add(this.Output_TargetVarName, pointOfInterest);
            }
            return(State.Success);
        }
        return(State.Failure);
    }
Esempio n. 5
0
    private void ComputeScoresByResource()
    {
        Dictionary <StaticString, int> dictionary            = new Dictionary <StaticString, int>();
        IEnumerable <EvaluableMessage_ResourceNeed> messages = base.AIEntity.AIPlayer.Blackboard.GetMessages <EvaluableMessage_ResourceNeed>(BlackboardLayerID.Empire, (EvaluableMessage_ResourceNeed match) => match.EvaluationState == EvaluableMessage.EvaluableMessageState.Pending || match.EvaluationState == EvaluableMessage.EvaluableMessageState.Validate);

        if (messages.Any <EvaluableMessage_ResourceNeed>())
        {
            foreach (EvaluableMessage_ResourceNeed evaluableMessage_ResourceNeed in messages)
            {
                if (evaluableMessage_ResourceNeed.MissingResources != null)
                {
                    foreach (MissingResource missingResource in evaluableMessage_ResourceNeed.MissingResources)
                    {
                        if (dictionary.ContainsKey(missingResource.ResourceName))
                        {
                            Dictionary <StaticString, int> dictionary2 = dictionary;
                            StaticString resourceName;
                            int          num = dictionary2[resourceName = missingResource.ResourceName];
                            dictionary2[resourceName] = num + 1;
                        }
                        else
                        {
                            dictionary.Add(missingResource.ResourceName, 1);
                        }
                    }
                }
            }
        }
        List <float> list = new List <float>();
        int          i    = 0;

        while (i < this.availableNodes.Count)
        {
            AILayer_CreepingNode.EvaluableCreepingNode evaluableCreepingNode = this.availableNodes[i];
            PointOfInterest pointOfInterest = evaluableCreepingNode.pointOfInterest;
            CreepingNodeImprovementDefinition nodeDefinition = evaluableCreepingNode.nodeDefinition;
            float num2 = 0f;
            if (!(pointOfInterest.Type == "ResourceDeposit"))
            {
                goto IL_184;
            }
            string x;
            if (pointOfInterest.PointOfInterestDefinition.TryGetValue("ResourceName", out x))
            {
                num2 = 0.5f;
                if (dictionary.ContainsKey(x))
                {
                    num2 = Mathf.Max(num2, (float)dictionary[x]);
                    goto IL_184;
                }
                goto IL_184;
            }
IL_17E:
            i++;
            continue;
IL_184:
            list.Add(num2);
            goto IL_17E;
        }
        if (list.Count > 0)
        {
            float num3 = list.Min();
            float num4 = list.Max();
            for (int j = 0; j < list.Count; j++)
            {
                if (!(this.availableNodes[j].pointOfInterest.Type != "ResourceDeposit"))
                {
                    float num5        = (num3 == num4) ? this.NormalizationFailSafeValue : Mathf.InverseLerp(num3, num4, list[j]);
                    float score       = this.availableNodes[j].score;
                    float boostFactor = num5 * this.ResourceWeight;
                    this.availableNodes[j].score = AILayer.Boost(score, boostFactor);
                }
            }
        }
    }
    protected override State Execute(AIBehaviorTree aiBehaviorTree, params object[] parameters)
    {
        if (!this.downloadableContentService.IsShared(DownloadableContent20.ReadOnlyName))
        {
            return(State.Failure);
        }
        Army army;

        AIArmyMission.AIArmyMissionErrorCode armyUnlessLocked = base.GetArmyUnlessLocked(aiBehaviorTree, "$Army", out army);
        if (armyUnlessLocked != AIArmyMission.AIArmyMissionErrorCode.None)
        {
            return(State.Failure);
        }
        if (!aiBehaviorTree.Variables.ContainsKey(this.TargetListVarName))
        {
            return(State.Failure);
        }
        if (!string.IsNullOrEmpty(this.OpportunityMaximumTurnName) && aiBehaviorTree.Variables.ContainsKey(this.OpportunityMaximumTurnName))
        {
            this.OpportunityMaximumTurn = (float)aiBehaviorTree.Variables[this.OpportunityMaximumTurnName];
        }
        List <IWorldPositionable> list = aiBehaviorTree.Variables[this.TargetListVarName] as List <IWorldPositionable>;

        if (list == null)
        {
            aiBehaviorTree.ErrorCode = 10;
            return(State.Failure);
        }
        if (list.Count == 0)
        {
            aiBehaviorTree.ErrorCode = 10;
            return(State.Failure);
        }
        AIEntity_Empire entity          = aiBehaviorTree.AICommander.AIPlayer.GetEntity <AIEntity_Empire>();
        float           num             = 0.1f;
        float           propertyValue   = army.GetPropertyValue(SimulationProperties.MaximumMovement);
        PointOfInterest pointOfInterest = null;

        for (int i = 0; i < list.Count; i++)
        {
            PointOfInterest pointOfInterest2 = list[i] as PointOfInterest;
            if (pointOfInterest2 != null)
            {
                if (pointOfInterest2.CreepingNodeImprovement != null)
                {
                    CreepingNode creepingNode = null;
                    IGameEntity  gameEntity   = null;
                    if (this.gameEntityRepositoryService.TryGetValue(pointOfInterest2.CreepingNodeGUID, out gameEntity))
                    {
                        creepingNode = (gameEntity as CreepingNode);
                    }
                    if (creepingNode != null)
                    {
                        if (DepartmentOfDefense.CanDismantleCreepingNode(army, creepingNode, false))
                        {
                            float num2 = 0.5f;
                            if (entity != null)
                            {
                                num2 = this.ComputeDestroyInterest(creepingNode, entity, army) * 0.5f;
                            }
                            if (num2 >= 0f)
                            {
                                float num3 = (float)this.worldPositionningService.GetDistance(army.WorldPosition, pointOfInterest2.WorldPosition);
                                float num4 = num3 / propertyValue;
                                if (num4 <= this.MaximumTurnDistance)
                                {
                                    float num5 = 0.5f - num4 / this.MaximumTurnDistance;
                                    num2 = AILayer.Boost(num2, num5 * 0.5f);
                                    float life    = creepingNode.Life;
                                    float maxLife = creepingNode.MaxLife;
                                    num2 = AILayer.Boost(num2, (1f - life / maxLife) * 0.2f);
                                    if (num2 > num)
                                    {
                                        num             = num2;
                                        pointOfInterest = pointOfInterest2;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        if (pointOfInterest != null)
        {
            if (this.OpportunityMaximumTurn > 0f)
            {
                int num6 = 0;
                int num7 = 0;
                if (aiBehaviorTree.Variables.ContainsKey(this.OpportunityMainTargetPosition))
                {
                    WorldPosition mainTargetPosition = (WorldPosition)aiBehaviorTree.Variables[this.OpportunityMainTargetPosition];
                    if (!AIBehaviorTreeNode_Decorator_EvaluateOpportunity.IsDetourWorthCheckingFast(this.worldPositionningService, army, pointOfInterest.WorldPosition, mainTargetPosition, out num7, out num6))
                    {
                        return(State.Failure);
                    }
                }
            }
            if (aiBehaviorTree.Variables.ContainsKey(this.Output_TargetVarName))
            {
                aiBehaviorTree.Variables[this.Output_TargetVarName] = pointOfInterest;
            }
            else
            {
                aiBehaviorTree.Variables.Add(this.Output_TargetVarName, pointOfInterest);
            }
            return(State.Success);
        }
        return(State.Failure);
    }
Esempio n. 7
0
    protected override void RefreshObjectives(StaticString context, StaticString pass)
    {
        base.RefreshObjectives(context, pass);
        base.GatherObjectives(AICommanderMissionDefinition.AICommanderCategory.Defense.ToString(), ref this.globalObjectiveMessages);
        base.ValidateMessages(ref this.globalObjectiveMessages);
        AILayer_War layer = base.AIEntity.GetLayer <AILayer_War>();

        base.GlobalPriority.Reset();
        AILayer_Strategy layer2 = base.AIEntity.GetLayer <AILayer_Strategy>();

        base.GlobalPriority.Add(layer2.StrategicNetwork.GetAgentValue("InternalMilitary"), "Strategic Network 'InternalMilitary'", new object[0]);
        AILayer_ArmyManagement layer3 = base.AIEntity.GetLayer <AILayer_ArmyManagement>();
        float worldColonizationRatio  = this.worldAtlasHelper.GetWorldColonizationRatio(base.AIEntity.Empire);
        bool  flag     = layer.WantWarWithSomoeone() || layer.NumberOfWar > 0;
        City  mainCity = this.departmentOfTheInterior.MainCity;
        bool  flag2    = false;

        if (this.departmentOfTheInterior.NonInfectedCities.Count < 4)
        {
            List <IGarrison> list = new List <IGarrison>();
            list.AddRange(this.departmentOfDefense.Armies.ToList <Army>().FindAll((Army match) => !match.IsSeafaring && !match.IsSettler && match.UnitsCount > 3).Cast <IGarrison>());
            if (list.Count > 1)
            {
                flag2 = true;
            }
        }
        for (int i = 0; i < this.departmentOfTheInterior.Cities.Count; i++)
        {
            City city = this.departmentOfTheInterior.Cities[i];
            if (this.IsObjectiveValid(AICommanderMissionDefinition.AICommanderCategory.Defense.ToString(), city.Region.Index, true))
            {
                GlobalObjectiveMessage globalObjectiveMessage = this.globalObjectiveMessages.Find((GlobalObjectiveMessage match) => match.RegionIndex == city.Region.Index);
                if (globalObjectiveMessage == null)
                {
                    globalObjectiveMessage = base.GenerateObjective(city.Region.Index);
                    globalObjectiveMessage.LocalPriority = new HeuristicValue(0f);
                    this.globalObjectiveMessages.Add(globalObjectiveMessage);
                }
                globalObjectiveMessage.TimeOut = 1;
                globalObjectiveMessage.LocalPriority.Reset();
                if (flag2 && city == mainCity)
                {
                    bool flag3 = !AILayer_Military.AreaIsSave(city.WorldPosition, 15, this.departmentOfForeignAffairs, false, false);
                    if (!flag3)
                    {
                        foreach (Region region in this.worldPositionningService.GetNeighbourRegions(city.Region, false, false))
                        {
                            if (region.IsLand && region.Owner is MajorEmpire)
                            {
                                DiplomaticRelation diplomaticRelation = this.departmentOfForeignAffairs.GetDiplomaticRelation(region.Owner);
                                if (diplomaticRelation.State.Name == DiplomaticRelationState.Names.War || diplomaticRelation.State.Name == DiplomaticRelationState.Names.ColdWar || diplomaticRelation.State.Name == DiplomaticRelationState.Names.Truce)
                                {
                                    flag3 = true;
                                    break;
                                }
                            }
                        }
                    }
                    if (flag3)
                    {
                        globalObjectiveMessage.LocalPriority  = new HeuristicValue(1f);
                        globalObjectiveMessage.GlobalPriority = new HeuristicValue(1f);
                    }
                }
                else
                {
                    globalObjectiveMessage.GlobalPriority = base.GlobalPriority;
                    AICommanderWithObjective aicommanderWithObjective = layer3.FindCommander(globalObjectiveMessage);
                    if (aicommanderWithObjective != null && aicommanderWithObjective is AICommander_Defense)
                    {
                        AICommander_Defense aicommander_Defense = aicommanderWithObjective as AICommander_Defense;
                        globalObjectiveMessage.LocalPriority.Add(AILayer_Military.GetCityDefenseLocalPriority(city, this.unitRatioBoost, aicommander_Defense.ComputeCurrentUnitInDefense()), "CityDefenseLocalPriority", new object[0]);
                    }
                    else
                    {
                        globalObjectiveMessage.LocalPriority.Add(AILayer_Military.GetCityDefenseLocalPriority(city, this.unitRatioBoost, -1), "CityDefenseLocalPriority", new object[0]);
                    }
                    HeuristicValue heuristicValue = new HeuristicValue(0f);
                    heuristicValue.Add(worldColonizationRatio, "colonization ratio", new object[0]);
                    heuristicValue.Multiply(0.2f, "(constant)", new object[0]);
                    globalObjectiveMessage.LocalPriority.Boost(heuristicValue, "Colonization boost", new object[0]);
                    if (flag)
                    {
                        globalObjectiveMessage.LocalPriority.Boost(0.3f, "Want war", new object[0]);
                    }
                    AIData_City aidata_City;
                    if (this.aiDataRepositoryAIHelper.TryGetAIData <AIData_City>(city.GUID, out aidata_City) && aidata_City.IsAtWarBorder)
                    {
                        globalObjectiveMessage.LocalPriority.Boost(0.3f, "War border", new object[0]);
                    }
                    if ((float)this.endTurnService.Turn < this.unitInGarrisonTurnLimit)
                    {
                        globalObjectiveMessage.LocalPriority.Boost(-0.3f, "turn under 'unitInGarrisonTurnLimit' ({0})", new object[]
                        {
                            this.unitInGarrisonTurnLimit
                        });
                    }
                }
            }
        }
        MajorEmpire majorEmpire = base.AIEntity.Empire as MajorEmpire;

        if (majorEmpire == null || majorEmpire.ConvertedVillages.Count == 0)
        {
            return;
        }
        if (mainCity == null)
        {
            return;
        }
        float num = AILayer_Military.GetCityDefenseLocalPriority(mainCity, this.unitRatioBoost, AICommanderMission_Garrison.SimulatedUnitsCount);

        num *= this.villageDefenseRatioDeboost;
        num *= base.GlobalPriority;
        for (int k = 0; k < this.VillageDOFPriority.Count; k++)
        {
            this.VillageDOFPriority[k].Reset();
        }
        float num2 = 0f;

        for (int l = 0; l < majorEmpire.ConvertedVillages.Count; l++)
        {
            Village village = majorEmpire.ConvertedVillages[l];
            AILayer_Military.VillageDefensePriority villageDefensePriority = this.VillageDOFPriority.Find((AILayer_Military.VillageDefensePriority match) => match.Village.GUID == village.GUID);
            if (villageDefensePriority == null)
            {
                villageDefensePriority = new AILayer_Military.VillageDefensePriority();
                villageDefensePriority.Reset();
                villageDefensePriority.Village = village;
                this.VillageDOFPriority.Add(villageDefensePriority);
            }
            villageDefensePriority.ToDelete          = false;
            villageDefensePriority.FirstUnitPriority = num;
            float num3 = (float)this.worldPositionningService.GetDistance(village.WorldPosition, mainCity.WorldPosition);
            villageDefensePriority.DistanceToMainCity = num3;
            if (num3 > num2)
            {
                num2 = num3;
            }
        }
        for (int m = this.VillageDOFPriority.Count - 1; m >= 0; m--)
        {
            AILayer_Military.VillageDefensePriority villageDefensePriority2 = this.VillageDOFPriority[m];
            if (villageDefensePriority2.ToDelete)
            {
                this.VillageDOFPriority.Remove(villageDefensePriority2);
            }
            else
            {
                float num4 = villageDefensePriority2.DistanceToMainCity / num2;
                if (majorEmpire.ConvertedVillages.Count > 1)
                {
                    villageDefensePriority2.FirstUnitPriority = AILayer.Boost(villageDefensePriority2.FirstUnitPriority, num4 * -0.1f);
                }
            }
        }
    }
Esempio n. 8
0
    private float GenerateMessageScoreForIndustry()
    {
        float result = 0f;

        if (!AILayer_Colonization.IsAbleToColonize(base.AIEntity.Empire))
        {
            result = 1f;
        }
        else if (this.aiEntityCity.City.BesiegingEmpire == null && this.constructionQueue.PendingConstructions.Count > 0)
        {
            ConstructibleElement constructibleElement = this.constructionQueue.Peek().ConstructibleElement;
            if (constructibleElement != null && (constructibleElement.SubCategory == "SubCategoryWonder" || constructibleElement.SubCategory == "SubCategoryVictory"))
            {
                return(1f);
            }
        }
        else
        {
            float num = 0f;
            float num2;
            for (int i = 0; i < this.departmentOfTheInterior.Cities.Count; i++)
            {
                num2 = (float)this.departmentOfTheInterior.Cities[i].CityImprovements.Count;
                if (num2 > num)
                {
                    num = num2;
                }
            }
            num2 = (float)this.aiEntityCity.City.CityImprovements.Count;
            float num3 = 1f - num2 / num;
            float num4 = 0f;
            if (!this.departmentOfTheTreasury.TryGetNetResourceValue(this.aiEntityCity.City, "Production", out num4, false))
            {
                num4 = 0f;
            }
            if (num4 == 0f)
            {
                num4 = 1f;
            }
            bool  flag  = false;
            bool  flag2 = false;
            float num5  = 0f;
            if (!this.departmentOfTheTreasury.TryGetResourceStockValue(this.aiEntityCity.City, DepartmentOfTheTreasury.Resources.Production, out num5, false))
            {
                num5 = 0f;
            }
            num5 += this.aiEntityCity.City.GetPropertyValue(SimulationProperties.NetCityProduction);
            num5  = Math.Max(1f, num5);
            for (int j = 0; j < this.constructionQueue.Length; j++)
            {
                Construction construction = this.constructionQueue.PeekAt(j);
                if (DepartmentOfTheTreasury.CheckConstructiblePrerequisites(this.aiEntityCity.City, construction.ConstructibleElement, new string[]
                {
                    ConstructionFlags.Prerequisite
                }))
                {
                    if (!flag2)
                    {
                        float num6 = 0f;
                        for (int k = 0; k < construction.CurrentConstructionStock.Length; k++)
                        {
                            if (construction.CurrentConstructionStock[k].PropertyName == "Production")
                            {
                                num6 += construction.CurrentConstructionStock[k].Stock;
                                if (construction.IsBuyout)
                                {
                                    num6 = DepartmentOfTheTreasury.GetProductionCostWithBonus(this.aiEntityCity.City, construction.ConstructibleElement, "Production");
                                }
                            }
                        }
                        float num7 = DepartmentOfTheTreasury.GetProductionCostWithBonus(this.aiEntityCity.City, construction.ConstructibleElement, "Production") - num6;
                        num5 -= num7;
                        if (num5 < 0f && !construction.ConstructibleElementName.ToString().Contains("BoosterGenerator"))
                        {
                            flag  = true;
                            flag2 = true;
                        }
                        if (construction.ConstructibleElementName.ToString().Contains("BoosterGenerator"))
                        {
                            flag2 = true;
                        }
                    }
                    float num8 = 0f;
                    for (int l = 0; l < construction.CurrentConstructionStock.Length; l++)
                    {
                        if (construction.CurrentConstructionStock[l].PropertyName == "Production")
                        {
                            num8 += construction.CurrentConstructionStock[l].Stock;
                        }
                    }
                    float num9 = DepartmentOfTheTreasury.GetProductionCostWithBonus(this.aiEntityCity.City, construction.ConstructibleElement, "Production") - num8;
                    num3 = AILayer.Boost(num3, this.ComputeCostBoost(num9 / num4));
                }
            }
            if (this.aiEntityCity.City.BesiegingEmpire != null)
            {
                num3 = AILayer.Boost(num3, 0.5f);
            }
            if (!flag && !flag2)
            {
                flag = true;
            }
            if (!flag)
            {
                num3 = 0f;
            }
            result = num3;
        }
        return(result);
    }
Esempio n. 9
0
 private void GenerateRetrofitUnitMessage(AICommander commander)
 {
     for (int i = 0; i < commander.Missions.Count; i++)
     {
         IGameService service = Services.GetService <IGameService>();
         Diagnostics.Assert(service != null);
         IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>();
         Diagnostics.Assert(service2 != null);
         AICommanderMissionWithRequestArmy aicommanderMissionWithRequestArmy = commander.Missions[i] as AICommanderMissionWithRequestArmy;
         AIData_Army aidata_Army;
         if (aicommanderMissionWithRequestArmy != null && (aicommanderMissionWithRequestArmy.Completion == AICommanderMission.AICommanderMissionCompletion.Initializing || aicommanderMissionWithRequestArmy.Completion == AICommanderMission.AICommanderMissionCompletion.Pending || aicommanderMissionWithRequestArmy.Completion == AICommanderMission.AICommanderMissionCompletion.Running) && aicommanderMissionWithRequestArmy.AIDataArmyGUID.IsValid && aicommanderMissionWithRequestArmy.AllowRetrofit && this.aiDataRepository.TryGetAIData <AIData_Army>(aicommanderMissionWithRequestArmy.AIDataArmyGUID, out aidata_Army))
         {
             bool   flag   = true;
             Region region = service2.GetRegion(aidata_Army.Army.WorldPosition);
             if (region == null || region.Owner != aidata_Army.Army.Empire)
             {
                 flag = false;
             }
             float       num   = 0f;
             bool        flag2 = false;
             AIData_Unit unitData;
             for (int j = 0; j < aidata_Army.Army.StandardUnits.Count; j++)
             {
                 if (this.aiDataRepository.TryGetAIData <AIData_Unit>(aidata_Army.Army.StandardUnits[j].GUID, out unitData) && unitData.RetrofitData.MayRetrofit && unitData.RetrofitData.MilitaryPowerDifference > 0f)
                 {
                     flag2 = true;
                     num  += unitData.RetrofitData.MilitaryPowerDifference;
                 }
             }
             if (flag2)
             {
                 float propertyValue = aidata_Army.Army.GetPropertyValue(SimulationProperties.MilitaryPower);
                 float num2;
                 bool  flag3;
                 bool  flag4;
                 aicommanderMissionWithRequestArmy.ComputeNeededArmyPower(out num2, out flag3, out flag4);
                 float num3 = commander.GetPriority(aicommanderMissionWithRequestArmy);
                 if (num <= 0f)
                 {
                     num3 = AILayer.Boost(num3, -0.9f);
                 }
                 else if (!flag3 && propertyValue < num2)
                 {
                     num3 = AILayer.Boost(num3, 0.2f);
                 }
                 DepartmentOfForeignAffairs agency = base.AIEntity.Empire.GetAgency <DepartmentOfForeignAffairs>();
                 Predicate <EvaluableMessage_RetrofitUnit> < > 9__0;
                 for (int k = 0; k < aidata_Army.Army.StandardUnits.Count; k++)
                 {
                     if (this.aiDataRepository.TryGetAIData <AIData_Unit>(aidata_Army.Army.StandardUnits[k].GUID, out unitData) && unitData.RetrofitData.MayRetrofit && unitData.RetrofitData.MilitaryPowerDifference > 0f)
                     {
                         Blackboard <BlackboardLayerID, BlackboardMessage> blackboard = commander.AIPlayer.Blackboard;
                         BlackboardLayerID blackboardLayerID = BlackboardLayerID.Empire;
                         BlackboardLayerID layerID           = blackboardLayerID;
                         Predicate <EvaluableMessage_RetrofitUnit> filter;
                         if ((filter = < > 9__0) == null)
                         {
                             filter = (< > 9__0 = ((EvaluableMessage_RetrofitUnit match) => match.ElementGuid == unitData.Unit.GUID));
                         }
                         EvaluableMessage_RetrofitUnit evaluableMessage_RetrofitUnit = blackboard.FindFirst <EvaluableMessage_RetrofitUnit>(layerID, filter);
                         if (evaluableMessage_RetrofitUnit == null || evaluableMessage_RetrofitUnit.State != BlackboardMessage.StateValue.Message_InProgress)
                         {
                             evaluableMessage_RetrofitUnit = new EvaluableMessage_RetrofitUnit(unitData.Unit.GUID);
                             commander.AIPlayer.Blackboard.AddMessage(evaluableMessage_RetrofitUnit);
                         }
                         float num4 = 0f;
                         for (int l = 0; l < unitData.RetrofitData.RetrofitCosts.Length; l++)
                         {
                             if (unitData.RetrofitData.RetrofitCosts[l].ResourceName == DepartmentOfTheTreasury.Resources.EmpireMoney)
                             {
                                 num4 += unitData.RetrofitData.RetrofitCosts[l].Value;
                             }
                         }
                         if (agency.IsInWarWithSomeone() && unitData.RetrofitData.MilitaryPowerDifference > unitData.Unit.UnitDesign.Context.GetPropertyValue(SimulationProperties.MilitaryPower) && flag && this.diplomacyLayer != null && this.diplomacyLayer.GetMilitaryPowerDif(false) < 0.5f * propertyValue)
                         {
                             evaluableMessage_RetrofitUnit.SetInterest(1f, 1f);
                         }
                         else
                         {
                             evaluableMessage_RetrofitUnit.SetInterest(this.retrofitGlobalPriority, num3);
                         }
                         evaluableMessage_RetrofitUnit.UpdateBuyEvaluation("Retrofit", 0UL, num4, (int)BuyEvaluation.MaxTurnGain, 0f, 0UL);
                         evaluableMessage_RetrofitUnit.TimeOut = 1;
                     }
                 }
             }
         }
     }
 }
Esempio n. 10
0
    private void GeneratePopulationBuyoutMessage()
    {
        if (!DepartmentOfTheInterior.CanBuyoutPopulation(this.aiEntityCity.City))
        {
            return;
        }
        this.GeneratePopulationBuyoutMessage_ELCPGlobalPopulationInfo();
        List <EvaluableMessage_PopulationBuyout> list = new List <EvaluableMessage_PopulationBuyout>(this.aiEntityCity.Blackboard.GetMessages <EvaluableMessage_PopulationBuyout>(BlackboardLayerID.City, (EvaluableMessage_PopulationBuyout message) => message.CityGuid == this.aiEntityCity.City.GUID && message.EvaluationState != EvaluableMessage.EvaluableMessageState.Obtained && message.EvaluationState != EvaluableMessage.EvaluableMessageState.Cancel));
        EvaluableMessage_PopulationBuyout        evaluableMessage_PopulationBuyout;

        if (list.Count == 0)
        {
            evaluableMessage_PopulationBuyout = new EvaluableMessage_PopulationBuyout(this.aiEntityCity.City.GUID, 1, AILayer_AccountManager.EconomyAccountName);
            this.aiEntityCity.Blackboard.AddMessage(evaluableMessage_PopulationBuyout);
        }
        else
        {
            evaluableMessage_PopulationBuyout = list[0];
        }
        float num = 0f;

        for (int i = 0; i < AILayer_Population.GainPerPopulation.Length; i++)
        {
            num += this.aiEntityCity.City.GetPropertyValue(AILayer_Population.GainPerPopulation[i]);
        }
        float num2          = num / AILayer_Population.GlobalPopulationInfos[this.Empire.Index].bestGainPerPop * 0.5f;
        float propertyValue = this.aiEntityCity.City.GetPropertyValue(SimulationProperties.Population);

        if (propertyValue == AILayer_Population.GlobalPopulationInfos[this.Empire.Index].lowestPopulation)
        {
            num2 = AILayer.Boost(num2, 0.2f);
        }
        float populationBuyOutCost = DepartmentOfTheTreasury.GetPopulationBuyOutCost(this.aiEntityCity.City);
        float num3;

        if (!this.departmentOfTheTreasury.TryGetResourceStockValue(base.AIEntity.Empire.SimulationObject, DepartmentOfTheTreasury.Resources.EmpireMoney, out num3, false))
        {
            num3 = 1f;
        }
        float num4 = (num3 - populationBuyOutCost) / num3 / 0.8f;

        if (this.departmentOfForeignAffairs.IsInWarWithSomeone())
        {
            num4 -= 0.05f;
        }
        num2 = AILayer.Boost(num2, num4);
        ConstructionQueue constructionQueue = this.departmentOfIndustry.GetConstructionQueue(this.aiEntityCity.City);

        if (propertyValue > 1f)
        {
            for (int j = constructionQueue.Length - 1; j >= 0; j--)
            {
                if (constructionQueue.PeekAt(j).ConstructibleElementName.ToString().Contains("Settler"))
                {
                    num2 = AILayer.Boost(num2, -1f);
                    break;
                }
            }
        }
        Diagnostics.Log("ELCP {0}/{1} GeneratePopulationBuyoutMessage score: {2}, cost: {3}", new object[]
        {
            this.Empire,
            this.aiEntityCity.City.LocalizedName,
            num2,
            populationBuyOutCost
        });
        evaluableMessage_PopulationBuyout.Refresh(1f, num2, populationBuyOutCost, int.MaxValue);
    }