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); }
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); } }
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); }
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); }
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); } } } }
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); }
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; } } } } } }
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); }