private void GenerateEvaluateMessageFor(AILayer_Booster.BoosterDefinitionWrapper boosterDefinitionWrapper) { if (boosterDefinitionWrapper.LastComputedPriority == 0f) { return; } CityBoosterNeeds cityBoosterNeeds = new CityBoosterNeeds(); cityBoosterNeeds.CityGuid = this.aiEntityCity.City.GUID; cityBoosterNeeds.BoosterPriority = boosterDefinitionWrapper.LastComputedPriority; cityBoosterNeeds.BoosterDefinitionName = boosterDefinitionWrapper.BoosterDefinitionName; cityBoosterNeeds.TimeOut = 1; ulong currentMessageId = base.AIEntity.AIPlayer.Blackboard.AddMessage(cityBoosterNeeds); boosterDefinitionWrapper.CurrentMessageId = currentMessageId; }
private SynchronousJobState SynchronousJob_StartBooster() { SynchronousJobState result; if (this.boosterDefinitionWrappers == null || base.AIEntity == null || base.AIEntity.AIPlayer == null) { result = SynchronousJobState.Failure; } else { DepartmentOfScience agency = base.AIEntity.Empire.GetAgency <DepartmentOfScience>(); bool flag = agency.GetTechnologyState("TechnologyDefinitionAllBoosterLevel1") == DepartmentOfScience.ConstructibleElement.State.Researched || agency.GetTechnologyState("TechnologyDefinitionAllBoosterLevel2") == DepartmentOfScience.ConstructibleElement.State.Researched; for (int i = this.boosterDefinitionWrappers.Count - 1; i >= 0; i--) { CityBoosterNeeds cityBoosterNeeds = null; if (this.boosterDefinitionWrappers[i] != null && base.AIEntity.AIPlayer.Blackboard.TryGetMessage <CityBoosterNeeds>(this.boosterDefinitionWrappers[i].CurrentMessageId, out cityBoosterNeeds) && cityBoosterNeeds.AvailabilityState == CityBoosterNeeds.CityBoosterState.Available) { StaticString x = this.boosterDefinitionWrappers[i].BoosterDefinitionName; if (x == "BoosterIndustry" || x == "FlamesIndustryBooster") { if (this.aiEntityCity.City.SimulationObject.Children.Exists((SimulationObject C) => C.Tags.Contains("BoosterDecreaseCityProduction4"))) { goto IL_275; } } if (agency.GetResearchPropertyValue("UnlockedTechnologyCount") <= 16f || flag || x == "BoosterFood" || x == "BoosterCadavers") { if (cityBoosterNeeds.BoosterGuid.IsValid && this.departmentOfEducation[cityBoosterNeeds.BoosterGuid] != null && this.departmentOfEducation[cityBoosterNeeds.BoosterGuid].Constructible != null) { x = this.departmentOfEducation[cityBoosterNeeds.BoosterGuid].Constructible.Name; } OrderBuyoutAndActivateBooster orderBuyoutAndActivateBooster = new OrderBuyoutAndActivateBooster(base.AIEntity.Empire.Index, x, cityBoosterNeeds.BoosterGuid, false); orderBuyoutAndActivateBooster.TargetGUID = this.aiEntityCity.City.GUID; base.AIEntity.Empire.PlayerControllers.AI.PostOrder(orderBuyoutAndActivateBooster); this.boosterDefinitionWrappers[i].CurrentMessageId = 0UL; cityBoosterNeeds.BoosterGuid = 0UL; cityBoosterNeeds.AvailabilityState = CityBoosterNeeds.CityBoosterState.Success; base.AIEntity.AIPlayer.Blackboard.CancelMessage(cityBoosterNeeds); } } IL_275 :; } result = SynchronousJobState.Success; } return(result); }
protected internal override void Evaluate() { base.Evaluate(); AILayer_ResourceManager layer = base.AIEntity.GetLayer <AILayer_ResourceManager>(); layer.BoostersInUse.Clear(); if (!base.AIEntity.Empire.SimulationObject.Tags.Contains(FactionTrait.FactionTraitReplicants1)) { for (int i = 0; i < this.departmentOfEducation.VaultCount; i++) { BoosterDefinition boosterDefinition = this.departmentOfEducation.VaultItems[i].Constructible as BoosterDefinition; if (boosterDefinition != null && boosterDefinition.Name == "BoosterScience") { layer.BoostersInUse.Add(this.departmentOfEducation.VaultItems[i].GUID.ToString()); break; } } } this.boosterNeedsMessages.Clear(); this.boosterNeedsMessages.AddRange(base.AIEntity.AIPlayer.Blackboard.GetMessages <CityBoosterNeeds>(BlackboardLayerID.Empire)); for (int j = 0; j < this.boosterNeedsMessages.Count; j++) { if (this.boosterNeedsMessages[j].BoosterGuid.IsValid) { VaultItem vaultItem = this.departmentOfEducation[this.boosterNeedsMessages[j].BoosterGuid]; if (vaultItem != null) { StaticString staticString = vaultItem.Constructible.Name; if (staticString == AIBoosterManager_CityResources.boosterCadavers) { staticString = AIBoosterManager_CityResources.boosterFood; } if (staticString == "FlamesIndustryBooster") { staticString = "BoosterIndustry"; } if (this.availableBoosterByDefinitionName.ContainsKey(staticString)) { this.availableBoosterByDefinitionName[staticString].Remove(vaultItem.GUID); if (this.availableBoosterByDefinitionName[staticString].Count == 0) { this.availableBoosterByDefinitionName.Remove(staticString); } } this.boosterNeedsMessages[j].AvailabilityState = CityBoosterNeeds.CityBoosterState.Available; } } } this.boosterNeedsMessages.RemoveAll((CityBoosterNeeds match) => match.AvailabilityState > CityBoosterNeeds.CityBoosterState.Pending); this.boosterNeedsMessages.Sort((CityBoosterNeeds left, CityBoosterNeeds right) => - 1 * left.BoosterPriority.CompareTo(right.BoosterPriority)); for (int k = 0; k < this.boosterNeedsMessages.Count; k++) { CityBoosterNeeds cityBoosterNeeds = this.boosterNeedsMessages[k]; StaticString boosterDefinitionName = cityBoosterNeeds.BoosterDefinitionName; if (this.availableBoosterByDefinitionName.ContainsKey(cityBoosterNeeds.BoosterDefinitionName)) { int num = this.availableBoosterByDefinitionName[cityBoosterNeeds.BoosterDefinitionName].Count - 1; GameEntityGUID boosterGuid = this.availableBoosterByDefinitionName[cityBoosterNeeds.BoosterDefinitionName][num]; this.availableBoosterByDefinitionName[cityBoosterNeeds.BoosterDefinitionName].RemoveAt(num); if (num == 0) { this.availableBoosterByDefinitionName.Remove(cityBoosterNeeds.BoosterDefinitionName); } cityBoosterNeeds.BoosterGuid = boosterGuid; cityBoosterNeeds.AvailabilityState = CityBoosterNeeds.CityBoosterState.Available; layer.BoostersInUse.Add(boosterGuid.ToString()); this.boosterNeedsMessages.RemoveAt(k); k--; } } this.evaluableMessages.Clear(); this.evaluableMessages.AddRange(base.AIEntity.AIPlayer.Blackboard.GetMessages <EvaluableMessage_CityBooster>(BlackboardLayerID.Empire)); this.evaluableMessages.RemoveAll((EvaluableMessage_CityBooster match) => match.State != BlackboardMessage.StateValue.Message_InProgress || match.EvaluationState != EvaluableMessage.EvaluableMessageState.Pending || match.EvaluationState != EvaluableMessage.EvaluableMessageState.Obtaining); this.evaluableMessages.Sort((EvaluableMessage_CityBooster left, EvaluableMessage_CityBooster right) => - 1 * left.Interest.CompareTo(right.Interest)); for (int l = 0; l < this.evaluableMessages.Count; l++) { EvaluableMessage_CityBooster cityBoosterEvaluableMessage = this.evaluableMessages[l]; int num2 = this.boosterNeedsMessages.FindIndex((CityBoosterNeeds match) => match.BoosterDefinitionName == cityBoosterEvaluableMessage.BoosterDefinitionName); if (num2 >= 0) { CityBoosterNeeds cityBoosterNeeds2 = this.boosterNeedsMessages[num2]; cityBoosterEvaluableMessage.Refresh(this.globalPriority, cityBoosterNeeds2.BoosterPriority, cityBoosterNeeds2.CityGuid); this.boosterNeedsMessages.RemoveAt(num2); } else if (cityBoosterEvaluableMessage.EvaluationState == EvaluableMessage.EvaluableMessageState.Obtaining) { cityBoosterEvaluableMessage.Refresh(0f, 0f, cityBoosterEvaluableMessage.CityGuid); } else { base.AIEntity.AIPlayer.Blackboard.CancelMessage(this.evaluableMessages[l]); this.evaluableMessages.RemoveAt(l); l--; } } for (int m = 0; m < this.boosterNeedsMessages.Count; m++) { CityBoosterNeeds cityBoosterNeeds3 = this.boosterNeedsMessages[m]; BoosterGeneratorDefinition boosterGenerator = this.constructibleElementHelper.GetBoosterGenerator(base.AIEntity.Empire, cityBoosterNeeds3.BoosterDefinitionName); if (boosterGenerator != null) { EvaluableMessage_CityBooster evaluableMessage_CityBooster = new EvaluableMessage_CityBooster(cityBoosterNeeds3.CityGuid, cityBoosterNeeds3.BoosterDefinitionName, boosterGenerator.Name, 1, AILayer_AccountManager.EconomyAccountName); evaluableMessage_CityBooster.SetInterest(this.globalPriority, cityBoosterNeeds3.BoosterPriority); base.AIEntity.AIPlayer.Blackboard.AddMessage(evaluableMessage_CityBooster); } } }