private void SendConvertVillageAction(Village village) { EvaluableMessage_VillageAction evaluableMessage_VillageAction = base.AIPlayer.Blackboard.FindFirst <EvaluableMessage_VillageAction>(BlackboardLayerID.Empire, (EvaluableMessage_VillageAction match) => match.RegionIndex == base.RegionIndex && match.VillageGUID == base.SubObjectiveGuid && match.AccountTag == AILayer_AccountManager.ConversionAccountName); if (evaluableMessage_VillageAction == null || evaluableMessage_VillageAction.EvaluationState == EvaluableMessage.EvaluableMessageState.Cancel) { evaluableMessage_VillageAction = new EvaluableMessage_VillageAction(base.RegionIndex, base.SubObjectiveGuid, AILayer_AccountManager.ConversionAccountName); this.villageConvertActionMessageId = base.AIPlayer.Blackboard.AddMessage(evaluableMessage_VillageAction); } else { this.villageConvertActionMessageId = evaluableMessage_VillageAction.ID; } evaluableMessage_VillageAction.TimeOut = 1; evaluableMessage_VillageAction.SetInterest(base.GlobalPriority, base.LocalPriority); evaluableMessage_VillageAction.UpdateBuyEvaluation("ConvertVillage", 0UL, AILayer_Village.GetVillageConversionCost(base.Empire as MajorEmpire, village), (int)BuyEvaluation.MaxTurnGain, 0f, 0UL); }
private List <IWorldPositionable> Execute_GetVillages(AIBehaviorTree aiBehaviorTree, Army army, IGameService gameService, List <IWorldPositionable> unfilteredTargetList) { List <IWorldPositionable> list = new List <IWorldPositionable>(); for (int i = 0; i < unfilteredTargetList.Count; i++) { PointOfInterest pointOfInterest = unfilteredTargetList[i] as PointOfInterest; if (pointOfInterest != null && !(pointOfInterest.Type != "Village") && pointOfInterest.Region != null && pointOfInterest.Region.MinorEmpire != null) { BarbarianCouncil agency = pointOfInterest.Region.MinorEmpire.GetAgency <BarbarianCouncil>(); if (agency != null) { Village villageAt = agency.GetVillageAt(pointOfInterest.WorldPosition); if (villageAt != null && !villageAt.HasBeenPacified && this.TypeOfDiplomaticRelation != "VillageConvert" && pointOfInterest.PointOfInterestImprovement != null && !villageAt.HasBeenInfected) { list.Add(villageAt); } else if (this.TypeOfDiplomaticRelation == "VillageConvert" && army.Empire is MajorEmpire && army.Empire.SimulationObject.Tags.Contains(AILayer_Village.TagConversionTrait) && villageAt.HasBeenPacified && DepartmentOfTheInterior.IsArmyAbleToConvert(army, true) && !villageAt.HasBeenConverted && !villageAt.HasBeenInfected) { DepartmentOfForeignAffairs agency2 = aiBehaviorTree.AICommander.Empire.GetAgency <DepartmentOfForeignAffairs>(); City city = villageAt.Region.City; if (city != null && city.Empire != aiBehaviorTree.AICommander.Empire) { DiplomaticRelation diplomaticRelation = agency2.GetDiplomaticRelation(city.Empire); if (diplomaticRelation == null || diplomaticRelation.State.Name != DiplomaticRelationState.Names.War || (diplomaticRelation.State.Name == DiplomaticRelationState.Names.War && pointOfInterest.PointOfInterestImprovement == null)) { goto IL_1FB; } } float num; army.Empire.GetAgency <DepartmentOfTheTreasury>().TryGetResourceStockValue(army.Empire.SimulationObject, DepartmentOfTheTreasury.Resources.EmpirePoint, out num, false); if (AILayer_Village.GetVillageConversionCost(army.Empire as MajorEmpire, villageAt) * 2f < num) { list.Add(villageAt); } } } } IL_1FB :; } return(list); }
public override void PopulateMission() { Tags tags = new Tags(); tags.AddTag(base.Category.ToString()); tags.AddTag("Village"); IGameEntity gameEntity; if (this.gameEntityRepositoryService.TryGetValue(base.SubObjectiveGuid, out gameEntity) && gameEntity is Village) { Village village = gameEntity as Village; bool flag = base.Empire.SimulationObject.Tags.Contains(AILayer_Village.TagConversionTrait); bool flag2 = this.departmentOfScience.CanBribe() && !village.HasBeenConverted && !village.HasBeenPacified; if (flag) { this.SendConvertVillageAction(village); } if (flag2) { this.SendBribeVillageAction(village); } bool flag3 = false; bool flag4 = false; if (this.villageBribeActionMessageId > 0UL) { EvaluableMessage_VillageAction evaluableMessage_VillageAction = base.AIPlayer.Blackboard.GetMessage(this.villageBribeActionMessageId) as EvaluableMessage_VillageAction; if (evaluableMessage_VillageAction != null && evaluableMessage_VillageAction.ChosenBuyEvaluation != null) { flag4 = true; } } if (village.HasBeenPacified && flag2 && !flag4) { flag4 = true; } if (this.villageConvertActionMessageId > 0UL) { EvaluableMessage_VillageAction evaluableMessage_VillageAction2 = base.AIPlayer.Blackboard.GetMessage(this.villageConvertActionMessageId) as EvaluableMessage_VillageAction; if (evaluableMessage_VillageAction2 != null && evaluableMessage_VillageAction2.ChosenBuyEvaluation != null) { flag3 = true; } } if (flag && !flag3) { float num; base.Empire.GetAgency <DepartmentOfTheTreasury>().TryGetResourceStockValue(base.Empire.SimulationObject, DepartmentOfTheTreasury.Resources.EmpirePoint, out num, false); if (AILayer_Village.GetVillageConversionCost(base.Empire as MajorEmpire, village) * 2f < num) { flag3 = true; } } if (flag) { tags.AddTag("Convert"); if (village.HasBeenConverted) { tags.AddTag("Hardway"); } else if (village.HasBeenPacified) { if (!flag3) { return; } } else if (flag2) { if (!flag3 || !flag4) { return; } tags.AddTag("Bribe"); } else { tags.AddTag("Hardway"); } } for (int i = base.Missions.Count - 1; i >= 0; i--) { if (base.Missions[i].MissionDefinition.Category.Contains(tags)) { return; } this.CancelMission(base.Missions[i]); } base.PopulationFirstMissionFromCategory(tags, new object[] { this.RegionTarget, base.SubObjectiveGuid }); } }
protected override State Execute(AIBehaviorTree aiBehaviorTree, params object[] parameters) { this.aiBehaviorTree = aiBehaviorTree; State result; if (this.ticket != null) { result = State.Running; } else { Army army; if (base.GetArmyUnlessLocked(aiBehaviorTree, "$Army", out army) > AIArmyMission.AIArmyMissionErrorCode.None) { result = State.Failure; } else if (!aiBehaviorTree.Variables.ContainsKey(this.TargetVarName)) { aiBehaviorTree.LogError("${0} not set", new object[] { this.TargetVarName }); result = State.Failure; } else { IGameEntity target = aiBehaviorTree.Variables[this.TargetVarName] as IGameEntity; if (!(target is IWorldPositionable)) { result = State.Failure; } else { IGameService service = Services.GetService <IGameService>(); Diagnostics.Assert(service != null); if (!service.Game.Services.GetService <IGameEntityRepositoryService>().Contains(target.GUID)) { result = State.Success; } else { AICommanderWithObjective commanderObjective = aiBehaviorTree.AICommander as AICommanderWithObjective; if (commanderObjective == null) { result = State.Failure; } else if (!(target is Village)) { aiBehaviorTree.ErrorCode = 2; result = State.Failure; } else { Village village = target as Village; if (village.HasBeenConverted) { if (village.HasBeenConvertedByIndex == aiBehaviorTree.AICommander.Empire.Index) { return(State.Success); } this.aiBehaviorTree.ErrorCode = 32; return(State.Failure); } else { EvaluableMessage_VillageAction evaluableMessage_VillageAction = aiBehaviorTree.AICommander.AIPlayer.Blackboard.FindFirst <EvaluableMessage_VillageAction>(BlackboardLayerID.Empire, (EvaluableMessage_VillageAction match) => match.RegionIndex == commanderObjective.RegionIndex && match.VillageGUID == target.GUID && match.AccountTag == AILayer_AccountManager.ConversionAccountName); if (evaluableMessage_VillageAction == null || evaluableMessage_VillageAction.EvaluationState == EvaluableMessage.EvaluableMessageState.Obtained) { float num; army.Empire.GetAgency <DepartmentOfTheTreasury>().TryGetResourceStockValue(army.Empire.SimulationObject, DepartmentOfTheTreasury.Resources.EmpirePoint, out num, false); if (AILayer_Village.GetVillageConversionCost(army.Empire as MajorEmpire, village) > num) { if (evaluableMessage_VillageAction == null) { this.aiBehaviorTree.ErrorCode = 32; return(State.Failure); } return(State.Success); } } else { if (evaluableMessage_VillageAction.EvaluationState == EvaluableMessage.EvaluableMessageState.Cancel) { this.aiBehaviorTree.ErrorCode = 32; return(State.Failure); } if (evaluableMessage_VillageAction.ChosenBuyEvaluation == null || evaluableMessage_VillageAction.ChosenBuyEvaluation.State != BuyEvaluation.EvaluationState.Purchased || evaluableMessage_VillageAction.EvaluationState != EvaluableMessage.EvaluableMessageState.Validate) { return(State.Failure); } } IEncounterRepositoryService service2 = service.Game.Services.GetService <IEncounterRepositoryService>(); if (service2 != null) { IEnumerable <Encounter> enumerable = service2; if (enumerable != null && enumerable.Any((Encounter encounter) => encounter.IsGarrisonInEncounter(army.GUID, false) || encounter.IsGarrisonInEncounter(target.GUID, false))) { return(State.Running); } } Diagnostics.Assert(AIScheduler.Services != null); if (service.Game.Services.GetService <IWorldPositionningService>().GetDistance(army.WorldPosition, village.WorldPosition) != 1) { aiBehaviorTree.ErrorCode = 12; result = State.Failure; } else { OrderConvertVillage order = new OrderConvertVillage(army.Empire.Index, army.GUID, village.WorldPosition); aiBehaviorTree.AICommander.Empire.PlayerControllers.AI.PostOrder(order, out this.ticket, new EventHandler <TicketRaisedEventArgs>(this.OrderConvertVillage_TicketRaised)); result = State.Running; } } } } } } } return(result); }