protected override void ExecuteNeeds(StaticString context, StaticString pass) { base.ExecuteNeeds(context, pass); using (IEnumerator <EvaluableMessage_Assimilation> enumerator = base.AIEntity.AIPlayer.Blackboard.GetMessages <EvaluableMessage_Assimilation>(BlackboardLayerID.Empire, (EvaluableMessage_Assimilation match) => match.EvaluationState == EvaluableMessage.EvaluableMessageState.Validate && match.ChosenBuyEvaluation != null).GetEnumerator()) { if (enumerator.MoveNext()) { EvaluableMessage_Assimilation evaluableMessage_Assimilation = enumerator.Current; this.validatedAssimilationMessage = evaluableMessage_Assimilation; AIScheduler.Services.GetService <ISynchronousJobRepositoryAIHelper>().RegisterSynchronousJob(new SynchronousJob(this.SynchronousJob_Assimilate)); } } }
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); }