protected override State Execute(QuestBehaviour questBehaviour, EventEmpireWorldTerraformed e, params object[] parameters) { if (!e.Reversible && base.CheckAgainstQuestInitiatorFilter(questBehaviour, e.TerraformingEmpire as global::Empire, base.QuestInitiatorFilter) && e.TerraformedTiles.Length != 0) { IGameService service = Services.GetService <IGameService>(); World world = (service.Game as global::Game).World; IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>(); Diagnostics.Assert(service2 != null); for (int i = 0; i < e.TerraformedTiles.Length; i++) { QuestBehaviourTreeNode_Decorator_TerraformRegion.< > c__DisplayClass0_0 CS$ < > 8__locals1 = new QuestBehaviourTreeNode_Decorator_TerraformRegion.< > c__DisplayClass0_0(); CS$ < > 8__locals1.region = service2.GetRegion(e.TerraformedTiles[i]); bool flag = true; int k; int j; for (j = 0; j < CS$ < > 8__locals1.region.WorldPositions.Length; j = k + 1) { if (!service2.IsWaterTile(CS$ < > 8__locals1.region.WorldPositions[j]) && !service2.HasRidge(CS$ < > 8__locals1.region.WorldPositions[j]) && (!service2.ContainsTerrainTag(CS$ < > 8__locals1.region.WorldPositions[j], "TerrainTagVolcanic") || world.TemporaryTerraformations.Exists((World.TemporaryTerraformation tt) => tt.worldPosition == CS$ < > 8__locals1.region.WorldPositions[j]))) { flag = false; break; } k = j; } if (flag) { this.RegionTerraformed = flag; base.UpdateQuestVariable(questBehaviour, this.Output_RegionTerraformedVarName, this.RegionTerraformed); return(State.Success); } } } return(State.Running); }
public void Initialize(global::Empire dataOwner, Continent continent, IWorldPositionningService worldPositionningService) { this.DataOwner = dataOwner; this.Regions = new List <Region>(); this.EmpireWithRegion = new List <global::Empire>(); this.ColonizationPercentByEmpire = new List <float>(); this.Continent = continent; for (int i = 0; i < continent.RegionList.Length; i++) { Region region = worldPositionningService.GetRegion(continent.RegionList[i]); this.Regions.Add(region); if (region.IsLand) { int landRegionCount = this.LandRegionCount; this.LandRegionCount = landRegionCount + 1; } } this.CostalRegionRatio = (float)continent.CostalRegionList.Length / (float)this.LandRegionCount; this.Type = AILayer_Colonization.ContinentData.ContinentType.Continent; if (this.LandRegionCount == 0) { this.Type = AILayer_Colonization.ContinentData.ContinentType.Water; return; } if (this.CostalRegionRatio > 0.8f) { this.Type = AILayer_Colonization.ContinentData.ContinentType.Island; } }
private static bool ValidateTarget(Army myArmy, IGameEntity gameEntity, DepartmentOfForeignAffairs departmentOfForeignAffairs, bool canAttack, IGameEntityRepositoryService gameEntityRepositoryService, IWorldPositionningService worldPositionningService) { if (gameEntity == null) { return(false); } if (!gameEntityRepositoryService.Contains(gameEntity.GUID)) { return(false); } if (departmentOfForeignAffairs != null) { IGarrison garrison = gameEntity as IGarrison; if (gameEntity is Kaiju) { garrison = (gameEntity as Kaiju).GetActiveTroops(); gameEntity = garrison; } IWorldPositionable worldPositionable = gameEntity as IWorldPositionable; Region region = worldPositionningService.GetRegion(worldPositionable.WorldPosition); if (garrison == null || worldPositionable == null) { return(false); } if (canAttack) { if (!departmentOfForeignAffairs.CanAttack(gameEntity) || garrison.Empire.Index == myArmy.Empire.Index) { return(false); } } else if (!departmentOfForeignAffairs.IsEnnemy(garrison.Empire)) { return(false); } if ((garrison.Empire is MinorEmpire || garrison is Village) && region != null && region.IsRegionColonized() && departmentOfForeignAffairs != null && departmentOfForeignAffairs.IsEnnemy(region.Owner)) { return(false); } } Army army = gameEntity as Army; if (army != null) { if (myArmy.Empire is LesserEmpire && !(army.Empire is MajorEmpire)) { return(false); } District district = worldPositionningService.GetDistrict(army.WorldPosition); if (district != null && district.Type != DistrictType.Exploitation && army.Empire == district.Empire) { return(false); } if (!myArmy.HasSeafaringUnits() && army.IsNaval) { return(false); } } return(true); }
public override void ReadXml(XmlReader reader) { base.ReadXml(reader); IWorldPositionningService service = Services.GetService <IGameService>().Game.Services.GetService <IWorldPositionningService>(); this.RegionTarget = service.GetRegion(base.RegionIndex); }
public void MoveToRegion(WorldPosition position) { IGameService service = Services.GetService <IGameService>(); if (service == null) { Diagnostics.LogError("Cannot retreive the gameService."); return; } IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>(); if (service2 == null) { Diagnostics.LogError("Cannot retreive the worldPositionningService."); return; } Region region = service2.GetRegion(position); if (region == null) { Diagnostics.LogError("Cannot retreive the region."); return; } Garrison activeTroops = this.GetActiveTroops(); List <Unit> list = new List <Unit>(); foreach (Unit unit in activeTroops.StandardUnits) { if (unit.SimulationObject.Tags.Contains(DownloadableContent16.TransportShipUnit)) { list.Add(unit); } } if (list.Count > 0) { for (int i = 0; i < list.Count; i++) { list[i].SwitchToEmbarkedUnit(false); } if (this.OnArmyMode()) { this.KaijuArmy.SetSails(); } } this.MoveTo(position); if (this.OnArmyMode()) { this.ChangeToGarrisonMode(false); return; } if (this.OnGarrisonMode()) { this.LeaveCurrentRegion(); this.OwnRegion(region); } }
public bool IsWorldPositionObstructingVision(WorldPosition observerPosition, WorldPosition tilePosition, int observerHeight, bool ignoreFog) { if (!observerPosition.IsValid || !tilePosition.IsValid) { return(true); } Diagnostics.Assert(this.elevationMap != null); if ((int)observerPosition.Row >= this.elevationMap.Height || (int)observerPosition.Column >= this.elevationMap.Width || (int)tilePosition.Row >= this.elevationMap.Height || (int)tilePosition.Column >= this.elevationMap.Width) { return(true); } sbyte b = this.elevationMap.GetValue(tilePosition); PathfindingMovementCapacity tileMovementCapacity = this.pathfindingService.GetTileMovementCapacity(observerPosition, (PathfindingFlags)0); bool flag = tileMovementCapacity == PathfindingMovementCapacity.Water || tileMovementCapacity == PathfindingMovementCapacity.FrozenWater; sbyte b2 = (!flag) ? this.elevationMap.GetValue(observerPosition) : this.waterHeightMap.GetValue(observerPosition); if (this.ridgeMap.GetValue(tilePosition)) { b = (sbyte)((int)b + (int)this.ridgeHeight); } IWorldPositionningService service = base.Game.GetService <IWorldPositionningService>(); if (service == null) { return(false); } Region region = service.GetRegion(tilePosition); if (region != null && region.IsWasteland) { b = (sbyte)((int)b + (int)this.wastelandHeight); } if ((int)b - (int)b2 > observerHeight) { return(true); } if (service.GetDistance(tilePosition, observerPosition) <= 1) { return(false); } if (this.weatherService == null) { return(false); } if (region != null && region.IsOcean && !ignoreFog) { WeatherDefinition weatherDefinitionAtPosition = this.weatherService.GetWeatherDefinitionAtPosition(tilePosition); if (weatherDefinitionAtPosition != null && weatherDefinitionAtPosition.ObstructVisibility) { return(true); } } return(false); }
protected override State Execute(AIBehaviorTree aiBehaviorTree, params object[] parameters) { Army army; if (base.GetArmyUnlessLocked(aiBehaviorTree, "$Army", out army) > AIArmyMission.AIArmyMissionErrorCode.None) { return(State.Failure); } global::Empire empire = aiBehaviorTree.AICommander.Empire; if (empire == null) { aiBehaviorTree.ErrorCode = 10; return(State.Failure); } if (!(empire is MajorEmpire)) { return(State.Failure); } IGameService service = Services.GetService <IGameService>(); Diagnostics.Assert(service != null); IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>(); Diagnostics.Assert(service2 != null); Region region = service2.GetRegion(army.WorldPosition); if (region == null) { return(State.Failure); } bool flag = false; if (region != null && region.Owner == aiBehaviorTree.AICommander.Empire && !region.IsOcean) { flag = true; } if (flag) { if (this.Inverted) { return(State.Failure); } return(State.Success); } else { if (this.Inverted) { return(State.Success); } return(State.Failure); } }
public override State CheckCondition(QuestBehaviour questBehaviour, GameEvent gameEvent, params object[] parameters) { this.Initialize(questBehaviour); if (this.RegionIndex != -1) { IGameService service = Services.GetService <IGameService>(); Diagnostics.Assert(service != null); if (service.Game as global::Game == null) { return(State.Failure); } IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>(); global::Empire empire; if (gameEvent != null) { empire = (gameEvent.Empire as global::Empire); } else { empire = questBehaviour.Initiator; } DepartmentOfDefense agency = empire.GetAgency <DepartmentOfDefense>(); if (this.CheckAllArmies) { for (int i = 0; i < agency.Armies.Count; i++) { if ((int)service2.GetRegionIndex(agency.Armies[i].WorldPosition) == this.RegionIndex) { return(State.Success); } } } else { Army army = agency.GetArmy(this.ArmyGuid); if (army == null) { return(State.Failure); } Region region = service2.GetRegion(army.WorldPosition); if (region == null) { return(State.Failure); } if (this.RegionIndex == region.Index) { return(State.Success); } } } return(State.Failure); }
private void ReleaseKaijuArmyActions() { DepartmentOfDefense agency = this.Empire.GetAgency <DepartmentOfDefense>(); SimulationDescriptor value = this.SimulationDescriptorDatabase.GetValue(DepartmentOfTheInterior.ArmyStatusBesiegerDescriptorName); this.KaijuArmy.RemoveDescriptor(value); if (this.KaijuArmy.IsEarthquaker) { this.KaijuArmy.SetEarthquakerStatus(false, false, null); } if (this.KaijuArmy.PillageTarget.IsValid) { DepartmentOfDefense.StopPillage(this.KaijuArmy); } if (this.KaijuArmy.IsAspirating) { agency.StopAspirating(this.KaijuArmy); } if (this.KaijuArmy.IsDismantlingDevice) { ITerraformDeviceRepositoryService service = this.gameService.Game.Services.GetService <ITerraformDeviceRepositoryService>(); TerraformDevice device = service[this.KaijuArmy.DismantlingDeviceTarget] as TerraformDevice; agency.StopDismantelingDevice(this.KaijuArmy, device); } if (this.KaijuArmy.IsDismantlingCreepingNode) { CreepingNode creepingNode = null; if (this.gameEntityRepositoryService.TryGetValue <CreepingNode>(this.KaijuArmy.DismantlingCreepingNodeTarget, out creepingNode)) { agency.StopDismantelingCreepingNode(this.KaijuArmy, creepingNode); } } IWorldPositionningService service2 = this.gameService.Game.Services.GetService <IWorldPositionningService>(); Region region = service2.GetRegion(this.KaijuArmy.WorldPosition); if (region.City != null && region.City.Empire != this.Empire) { DepartmentOfTheInterior agency2 = region.City.Empire.GetAgency <DepartmentOfTheInterior>(); if (agency2 != null) { if (region.City.BesiegingEmpire == this.Empire && agency2.NeedToStopSiege(region.City)) { agency2.StopSiege(region.City); } agency2.StopNavalSiege(region.City, this.KaijuArmy); } IVisibilityService service3 = this.gameService.Game.Services.GetService <IVisibilityService>(); service3.NotifyVisibilityHasChanged(this.Empire); } }
private bool CanTransferTo(Army army, WorldPosition worldPosition, ref bool atLeastOneNeighbourgCityWithNotEnoughSlotsLeft, ref bool atLeastOneNeighbourgVillageWithNotEnoughSlotsLeft, IWorldPositionningService worldPositionningService, int transferringUnitSlot) { Region region = worldPositionningService.GetRegion(worldPosition); if (region.City != null && region.City.Empire == army.Empire) { int i = 0; while (i < region.City.Districts.Count) { if (region.City.Districts[i].Type != DistrictType.Exploitation && region.City.Districts[i].Type != DistrictType.Improvement && worldPosition == region.City.Districts[i].WorldPosition) { if (transferringUnitSlot + region.City.CurrentUnitSlot > region.City.MaximumUnitSlot) { atLeastOneNeighbourgCityWithNotEnoughSlotsLeft = true; break; } if (army.WorldPosition == worldPosition) { return(true); } if (region.City.BesiegingEmpireIndex < 0 || (army.Hero != null && army.Hero.CheckUnitAbility(UnitAbility.UnitAbilityAllowAssignationUnderSiege, -1))) { return(true); } break; } else { i++; } } } if (region != null && region.MinorEmpire != null) { BarbarianCouncil agency = region.MinorEmpire.GetAgency <BarbarianCouncil>(); if (agency != null) { Village villageAt = agency.GetVillageAt(worldPosition); if (villageAt != null && villageAt.HasBeenConverted && villageAt.Converter == army.Empire) { if (transferringUnitSlot + villageAt.CurrentUnitSlot <= villageAt.MaximumUnitSlot) { return(true); } atLeastOneNeighbourgVillageWithNotEnoughSlotsLeft = true; } } } return((region != null && region.City != null && region.City.Camp != null && worldPosition == region.City.Camp.WorldPosition && region.City.Camp.Empire == army.Empire && transferringUnitSlot + region.City.Camp.CurrentUnitSlot <= region.City.Camp.MaximumUnitSlot) || (region != null && region.Kaiju != null && region.Kaiju.KaijuGarrison != null && worldPosition == region.Kaiju.KaijuGarrison.WorldPosition && region.Kaiju.Empire.Index == army.Empire.Index && DepartmentOfScience.IsTechnologyResearched(army.Empire, "TechnologyDefinitionMimics1") && transferringUnitSlot + region.Kaiju.KaijuGarrison.CurrentUnitSlot <= region.Kaiju.KaijuGarrison.MaximumUnitSlot)); }
public bool CanChangeToGarrisonMode() { if (this.OnGarrisonMode()) { return(false); } if (this.IsStunned()) { return(false); } IWorldPositionningService service = this.GameService.Game.Services.GetService <IWorldPositionningService>(); Region region = service.GetRegion(this.KaijuArmy.WorldPosition); return(region == null || region.Owner == null); }
public void FillTargets(Army army, List <IGameEntity> gameEntities, ref List <StaticString> failureFlags) { if (army == null) { throw new ArgumentNullException("army"); } IGameService service = Services.GetService <IGameService>(); if (service == null) { return; } global::Game x = service.Game as global::Game; if (x == null) { return; } IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>(); Diagnostics.Assert(service2 != null); for (int i = 0; i < 6; i++) { WorldPosition neighbourTile = service2.GetNeighbourTile(army.WorldPosition, (WorldOrientation)i, 1); Region region = service2.GetRegion(neighbourTile); if (region != null && region.Kaiju != null) { Kaiju kaiju = region.Kaiju; if (this.IsKaijuValidForTame(army, kaiju, ref failureFlags, true) && !gameEntities.Contains(kaiju)) { gameEntities.Add(kaiju); } } Army armyAtPosition = service2.GetArmyAtPosition(neighbourTile); if (armyAtPosition != null && armyAtPosition is KaijuArmy) { KaijuArmy kaijuArmy = armyAtPosition as KaijuArmy; if (kaijuArmy != null) { Kaiju kaiju2 = kaijuArmy.Kaiju; if (kaiju2 != null && kaiju2.OnArmyMode() && !kaiju2.IsStunned() && !gameEntities.Contains(kaiju2)) { gameEntities.Add(kaijuArmy.Kaiju); } } } } }
public void SetGarrison(KaijuGarrison kaijuGarrison) { kaijuGarrison.Empire = this.Empire; kaijuGarrison.Kaiju = this; this.KaijuGarrison = kaijuGarrison; this.KaijuGarrison.StandardUnitCollectionChange += this.KaijuGarrison_StandardUnitCollectionChange; if (!this.OnArmyMode()) { IWorldPositionningService service = this.GameService.Game.Services.GetService <IWorldPositionningService>(); Region region = service.GetRegion(this.KaijuGarrison.WorldPosition); this.Region = region; this.Region.KaijuEmpire = this.KaijuEmpire; this.Region.KaijuGarrisonGUID = this.KaijuGarrison.GUID; this.Empire.AddChild(kaijuGarrison); } }
protected bool AreTradeRoutesPossibleWithEmpire() { IGameService service = Services.GetService <IGameService>(); Diagnostics.Assert(service != null); Diagnostics.Assert(service.Game != null); Diagnostics.Assert(service.Game is global::Game); IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>(); Diagnostics.Assert(service2 != null); Diagnostics.Assert(this.DiplomaticRelation != null && this.DiplomaticRelation.State != null); if (!this.DiplomaticRelation.HasActiveAbility(DiplomaticAbilityDefinition.TradeRoute)) { return(false); } Func <City, bool> func = delegate(City city) { if (city.CadastralMap.ConnectedMovementCapacity == PathfindingMovementCapacity.None) { return(false); } if (city.BesiegingEmpireIndex != -1) { return(false); } int num = Mathf.FloorToInt(city.GetPropertyValue(SimulationProperties.MaximumNumberOfTradeRoutes)); return(num > 0); }; foreach (City city2 in this.Empire.GetAgency <DepartmentOfTheInterior>().Cities) { if (func(city2)) { foreach (Region.Border border in city2.Region.Borders) { Region region = service2.GetRegion(border.NeighbourRegionIndex); if (region.City != null && region.City.Empire.Index == this.EmpireWhichReceives.Index && func(region.City)) { return(true); } } } } return(false); }
protected virtual bool CanMoveTo(GameInterface gameInterface, WorldPosition destination) { IWorldPositionningService service = gameInterface.Game.Services.GetService <IWorldPositionningService>(); Region region = service.GetRegion(this.army.WorldPosition); if (region == null || !region.BelongToEmpire(this.army.Empire) || region.City == null || region.City.BesiegingEmpire == null) { return(true); } bool flag = region.City.Districts.Any((District match) => match.Type != DistrictType.Exploitation && match.WorldPosition == this.army.WorldPosition); bool flag2 = region.City.Districts.Any((District match) => match.Type != DistrictType.Exploitation && match.WorldPosition == destination); if (flag) { return(flag2); } return(!flag2); }
private bool CanSellUnitsAndExplain() { this.SellButtonPriceLabel.AgeTransform.Visible = false; if (this.IsOtherEmpire || !this.DepartmentOfScience.CanTradeUnits(false)) { return(false); } if (this.selectedUnits.Count == 0) { this.SellButton.AgeTooltip.Content = "%ArmyEmptySelectionDescription"; return(false); } this.SellComputeCandidates(); if (this.salableUnits.Count == 0) { this.SellButton.AgeTooltip.Content = "%SellTabNoCandidateDescription"; return(false); } if (ELCPUtilities.UseELCPUnitSelling && this.Garrison is Army) { IWorldPositionningService service = base.GameService.Game.Services.GetService <IWorldPositionningService>(); Army army = this.Garrison as Army; Region region = service.GetRegion(army.WorldPosition); if (region == null || region.Owner != army.Empire) { this.SellButton.AgeTooltip.Content = "%SellTabNotInOwnRegionDescription"; return(false); } } float num = this.TotalSellPriceOfSalableUnits(); string text = GuiFormater.FormatStock(num, DepartmentOfTheTreasury.Resources.EmpireMoney, 0, true); string formattedLine = GuiFormater.FormatInstantCost(this.Garrison.Empire, num, DepartmentOfTheTreasury.Resources.EmpireMoney, true, 1); this.SellButtonPriceLabel.Text = text; this.SellButtonPriceLabel.AgeTransform.Visible = true; AgeUtils.CleanLine(formattedLine, ref this.monochromaticFormat); if (!this.Garrison.IsInEncounter) { this.SellButton.AgeTooltip.Content = string.Format(AgeLocalizer.Instance.LocalizeString("%SellTabOKDescription"), this.monochromaticFormat); return(true); } this.SellButton.AgeTooltip.Content = AgeLocalizer.Instance.LocalizeString("%ArmyLockedInBattleDescription"); return(false); }
private Village GetVillageFromPointOfInterest(PointOfInterest pointOfInterest, IWorldPositionningService worldPositionningService = null) { if (worldPositionningService == null) { IGameService service = Services.GetService <IGameService>(); Diagnostics.Assert(service != null); Diagnostics.Assert(service.Game != null); worldPositionningService = service.Game.Services.GetService <IWorldPositionningService>(); Diagnostics.Assert(worldPositionningService != null); } Region region = worldPositionningService.GetRegion(pointOfInterest.WorldPosition); if (region != null && region.MinorEmpire != null) { BarbarianCouncil agency = region.MinorEmpire.GetAgency <BarbarianCouncil>(); return(agency.GetVillageAt(pointOfInterest.WorldPosition)); } return(null); }
internal void AddVillage(Village village) { if (village.Empire != null && village.Empire != base.Empire) { Diagnostics.LogError("The barbarian council was asked to add a village (guid: {0}, empire: {1}) but it is still bound to another empire.", new object[] { village.GUID, village.Empire.Name }); return; } village.Empire = (global::Empire)base.Empire; IWorldPositionningService service = this.GameService.Game.Services.GetService <IWorldPositionningService>(); Region region = service.GetRegion(village.WorldPosition); village.Region = region; int num = this.villages.BinarySearch((Village match) => match.GUID.CompareTo(village.GUID)); if (num >= 0) { Diagnostics.LogWarning("The barbarian council was asked to add a village (guid #{0}) but it is already present in its list of villages.", new object[] { village.GUID }); return; } this.villages.Insert(~num, village); if (village.HasBeenPacified) { this.PacifyVillage(village, null); } base.Empire.AddChild(village); if (village.HasBeenConverted) { foreach (Unit simulationObjectWrapper in village.Units) { village.PointOfInterest.AddChild(simulationObjectWrapper); } } }
private bool TransferTo(Army army, WorldPosition worldPosition, List <GameEntityGUID> units, IWorldPositionningService worldPositionningService, global::PlayerController playerController, out Ticket ticket, EventHandler <TicketRaisedEventArgs> ticketRaisedEventHandler) { Region region = worldPositionningService.GetRegion(worldPosition); GameEntityGUID gameEntityGUID = GameEntityGUID.Zero; ticket = null; if (region.MinorEmpire != null) { BarbarianCouncil agency = region.MinorEmpire.GetAgency <BarbarianCouncil>(); if (agency != null) { Village villageAt = agency.GetVillageAt(worldPosition); if (villageAt != null) { gameEntityGUID = villageAt.GUID; } } } if (region.City != null && region.City.Camp != null && gameEntityGUID == GameEntityGUID.Zero && region.City.Camp.WorldPosition == worldPosition) { gameEntityGUID = region.City.Camp.GUID; } if (region.City != null && gameEntityGUID == GameEntityGUID.Zero) { gameEntityGUID = region.City.GUID; } if (region.Kaiju != null && region.Kaiju.KaijuGarrison != null && gameEntityGUID == GameEntityGUID.Zero && DepartmentOfScience.IsTechnologyResearched(army.Empire, "TechnologyDefinitionMimics1") && region.Kaiju.KaijuGarrison.WorldPosition == worldPosition) { gameEntityGUID = region.Kaiju.KaijuGarrison.GUID; } if (gameEntityGUID != GameEntityGUID.Zero) { OrderTransferUnits order = new OrderTransferUnits(army.Empire.Index, army.GUID, gameEntityGUID, units.ToArray(), false); playerController.PostOrder(order, out ticket, ticketRaisedEventHandler); return(true); } return(false); }
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; } } } } } }
public override bool CanExecute(Army army, ref List <StaticString> failureFlags, params object[] parameters) { if (!base.CanExecute(army, ref failureFlags, parameters)) { return(false); } if (army.HasCatspaw) { failureFlags.Add(ArmyAction.NoCanDoWhileHidden); return(false); } int num = 0; int num2 = 0; float num3 = float.MaxValue; bool flag = false; for (int i = 0; i < parameters.Length; i++) { if (parameters[i] is Unit) { Unit unit = parameters[i] as Unit; if (unit.UnitDesign != null && unit.UnitDesign.Tags.Contains(DownloadableContent9.TagSolitary)) { failureFlags.Add(ArmyAction.NoCanDoWhileHidden); return(false); } if ((unit.UnitDesign != null && unit.UnitDesign.Tags.Contains(Kaiju.LiceUnitTag)) || unit.UnitDesign.Tags.Contains(Kaiju.MonsterUnitTag)) { flag = true; } num2 += (int)unit.GetPropertyValue(SimulationProperties.UnitSlotCount); num++; } else { if (!(parameters[i] is IEnumerable <Unit>)) { failureFlags.Add(ArmyAction.NoCanDoWhileHidden); return(false); } foreach (Unit unit2 in (parameters[i] as IEnumerable <Unit>)) { if (unit2.UnitDesign != null && unit2.UnitDesign.Tags.Contains(DownloadableContent9.TagSolitary)) { failureFlags.Add(ArmyAction.NoCanDoWhileHidden); return(false); } if ((unit2.UnitDesign != null && unit2.UnitDesign.Tags.Contains(Kaiju.LiceUnitTag)) || unit2.UnitDesign.Tags.Contains(Kaiju.MonsterUnitTag)) { flag = true; } num2 += (int)unit2.GetPropertyValue(SimulationProperties.UnitSlotCount); num++; float propertyValue = unit2.GetPropertyValue(SimulationProperties.Movement); if (propertyValue < num3) { num3 = propertyValue; } } } } if (num == 0) { failureFlags.Add(ArmyAction_TransferUnits.NoUnitSelectedForTransfer); return(false); } if (num3 == 0f) { failureFlags.Add(ArmyAction_TransferUnits.NotEnoughMovementToTransfer); return(false); } if (flag) { failureFlags.Add(ArmyAction_TransferUnits.UntransferableUnitSelectedForTransfer); return(false); } IGameService service = Services.GetService <IGameService>(); IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>(); IPathfindingService service3 = service.Game.Services.GetService <IPathfindingService>(); bool flag2 = false; bool flag3 = false; PathfindingMovementCapacity pathfindingMovementCapacity = army.GenerateContext().MovementCapacities; for (int j = 0; j < parameters.Length; j++) { if (parameters[j] is Unit) { pathfindingMovementCapacity = (parameters[j] as Unit).GenerateContext().MovementCapacities; } else if (parameters[j] is IEnumerable <Unit> ) { pathfindingMovementCapacity = PathfindingMovementCapacity.All; foreach (Unit unit3 in (parameters[j] as IEnumerable <Unit>)) { if (unit3.Garrison != null) { pathfindingMovementCapacity &= unit3.GenerateContext().MovementCapacities; } } } } for (int k = 0; k < 6; k++) { bool flag4 = false; WorldPosition neighbourTile = service2.GetNeighbourTile(army.WorldPosition, (WorldOrientation)k, 1); if (service3.IsTilePassable(neighbourTile, pathfindingMovementCapacity, (PathfindingFlags)0) && service3.IsTransitionPassable(army.WorldPosition, neighbourTile, army, PathfindingFlags.IgnoreArmies, null) && service3.IsTileStopable(neighbourTile, pathfindingMovementCapacity, PathfindingFlags.IgnoreArmies)) { Region region = service2.GetRegion(neighbourTile); if (region.City != null && this.AllowedTransferTarget != ArmyAction_TransferUnits.AllowedTransferTargetType.Army) { for (int l = 0; l < region.City.Districts.Count; l++) { if (region.City.Districts[l].Type != DistrictType.Exploitation && neighbourTile == region.City.Districts[l].WorldPosition) { if (this.AllowedTransferTarget != ArmyAction_TransferUnits.AllowedTransferTargetType.Army) { if (num2 + region.City.CurrentUnitSlot <= region.City.MaximumUnitSlot) { return(true); } flag2 = true; } flag4 = true; break; } } } if (this.AllowedTransferTarget != ArmyAction_TransferUnits.AllowedTransferTargetType.Army && flag2) { failureFlags.Add(ArmyAction_TransferUnits.NotEnoughSlotsInNeighbouringGarrisonForTransfer); } Army armyAtPosition = service2.GetArmyAtPosition(neighbourTile); if (armyAtPosition != null && this.AllowedTransferTarget != ArmyAction_TransferUnits.AllowedTransferTargetType.City && armyAtPosition.Empire == army.Empire && !armyAtPosition.HasCatspaw) { if (armyAtPosition.SimulationObject.Tags.Contains(KaijuArmy.ClassKaijuArmy) && !DepartmentOfScience.IsTechnologyResearched(army.Empire, "TechnologyDefinitionMimics1")) { failureFlags.Add(ArmyAction.NoCanDoWhileHidden); return(false); } if (num2 + armyAtPosition.CurrentUnitSlot <= armyAtPosition.MaximumUnitSlot) { return(true); } flag3 = true; } else if (!flag4 && this.AllowedTransferTarget != ArmyAction_TransferUnits.AllowedTransferTargetType.City && armyAtPosition == null && num != army.StandardUnits.Count && service3.IsTileStopable(neighbourTile, army, (PathfindingFlags)0, null)) { return(true); } } } if (this.AllowedTransferTarget > ArmyAction_TransferUnits.AllowedTransferTargetType.City && flag3) { failureFlags.Add(ArmyAction_TransferUnits.NotEnoughSlotsInNeighbouringArmyForTransfer); } if (this.AllowedTransferTarget != ArmyAction_TransferUnits.AllowedTransferTargetType.Army) { failureFlags.Add(ArmyAction_TransferUnits.NoNeighbouringCityAvailable); } if (this.AllowedTransferTarget != ArmyAction_TransferUnits.AllowedTransferTargetType.City) { failureFlags.Add(ArmyAction_TransferUnits.NoNeighbouringArmyAvailable); } ArmyAction_TransferUnits.AllowedTransferTargetType allowedTransferTarget = this.AllowedTransferTarget; return(false); }
public override bool CanExecute(Army army, ref List <StaticString> failureFlags, params object[] parameters) { this.lastConvertCostDescription = string.Empty; if (!base.CanExecute(army, ref failureFlags, parameters)) { return(false); } if (army.IsNaval) { failureFlags.Add(ArmyAction.NoCanDoWhileHidden); return(false); } IGameService service = Services.GetService <IGameService>(); if (service == null) { failureFlags.Add(ArmyAction.NoCanDoWhileSystemError); return(false); } global::Game x = service.Game as global::Game; if (x == null) { failureFlags.Add(ArmyAction.NoCanDoWhileSystemError); return(false); } IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>(); if (service2 == null) { failureFlags.Add(ArmyAction.NoCanDoWhileSystemError); return(false); } if (parameters == null) { failureFlags.Add(ArmyAction.NoCanDoWhileHidden); return(false); } if (parameters.Length == 0) { failureFlags.Add(ArmyAction.NoCanDoWhileHidden); return(false); } List <Village> list = new List <Village>(); for (int i = 0; i < parameters.Length; i++) { if (parameters[i] is Village) { list.Add(parameters[i] as Village); } else if (parameters[i] is List <IGameEntity> ) { List <IGameEntity> list2 = parameters[i] as List <IGameEntity>; for (int j = 0; j < list2.Count; j++) { if (list2[j] is Village) { list.Add(parameters[i] as Village); } else if (list2[j] is PointOfInterest) { PointOfInterest pointOfInterest = list2[j] as PointOfInterest; Region region = service2.GetRegion(pointOfInterest.WorldPosition); if (region != null && region.MinorEmpire != null) { BarbarianCouncil agency = region.MinorEmpire.GetAgency <BarbarianCouncil>(); Village villageAt = agency.GetVillageAt(pointOfInterest.WorldPosition); if (villageAt != null) { list.Add(villageAt); } } } } } } if (list.Count == 0) { failureFlags.Add(ArmyAction.NoCanDoWhileHidden); return(false); } if (!this.ArmyCanConvert(army, failureFlags)) { return(false); } DepartmentOfTheTreasury agency2 = army.Empire.GetAgency <DepartmentOfTheTreasury>(); for (int k = list.Count - 1; k >= 0; k--) { if (!this.CanConvertVillage(army, list[k], agency2, failureFlags)) { list.RemoveAt(k); } } if (list.Count == 0) { return(false); } ArmyAction.FailureFlags.Clear(); return(true); }
public void FillTargets(Army army, List <IGameEntity> targets, ref List <StaticString> failureFlags) { if (targets == null) { targets = new List <IGameEntity>(); } IGameService service = Services.GetService <IGameService>(); if (service == null) { return; } IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>(); Diagnostics.Assert(service2 != null); IPathfindingService service3 = service.Game.Services.GetService <IPathfindingService>(); Diagnostics.Assert(service2 != null); base.ListNearbyVillages(army); if (base.PointsOfInterest.Count != 0) { for (int i = base.PointsOfInterest.Count - 1; i >= 0; i--) { PointOfInterest pointOfInterest = base.PointsOfInterest[i]; if (pointOfInterest.PointOfInterestImprovement != null && (pointOfInterest.Empire == null || pointOfInterest.Empire.Index != army.Empire.Index)) { Region region = service2.GetRegion(pointOfInterest.WorldPosition); if (region != null && region.MinorEmpire != null) { Village village = region.MinorEmpire.GetAgency <BarbarianCouncil>().Villages.FirstOrDefault((Village iterator) => iterator.WorldPosition == pointOfInterest.WorldPosition); if (village != null) { targets.Add(village); } } } } } List <WorldPosition> list = new List <WorldPosition>(); for (int j = 0; j < 6; j++) { WorldPosition neighbourTile = service2.GetNeighbourTile(army.WorldPosition, (WorldOrientation)j, 1); if (neighbourTile.IsValid && service3.IsTransitionPassable(army.WorldPosition, neighbourTile, army, PathfindingFlags.IgnoreArmies | PathfindingFlags.IgnoreOtherEmpireDistrict | PathfindingFlags.IgnoreDiplomacy | PathfindingFlags.IgnoreFogOfWar | PathfindingFlags.IgnoreZoneOfControl | PathfindingFlags.IgnorePOI | PathfindingFlags.IgnoreSieges | PathfindingFlags.IgnoreKaijuGarrisons, null)) { list.Add(neighbourTile); } } List <int> list2 = new List <int>(); for (int k = 0; k < list.Count; k++) { Region region2 = service2.GetRegion(list[k]); if (region2 != null && !list2.Contains(region2.Index)) { list2.Add(region2.Index); KaijuEmpire kaijuEmpire = region2.KaijuEmpire; if (kaijuEmpire != null) { KaijuCouncil agency = kaijuEmpire.GetAgency <KaijuCouncil>(); if (agency != null) { Kaiju kaiju = agency.Kaiju; if (kaiju != null && kaiju.OnGarrisonMode()) { KaijuGarrison kaijuGarrison = kaiju.KaijuGarrison; if (kaijuGarrison != null && list.Contains(kaijuGarrison.WorldPosition)) { targets.Add(kaijuGarrison); } } } } if (region2.City != null && region2.City.Empire != null && region2.City.Empire.Index != army.Empire.Index) { for (int l = 0; l < region2.City.Districts.Count; l++) { District district = region2.City.Districts[l]; if (list.Contains(district.WorldPosition) && district.Type != DistrictType.Exploitation) { targets.Add(district); } } if (region2.City.Camp != null && list.Contains(region2.City.Camp.WorldPosition)) { targets.Add(region2.City.Camp); } } } } global::Game game = service.Game as global::Game; if (game == null) { return; } for (int m = 0; m < game.Empires.Length; m++) { if (m != army.Empire.Index) { DepartmentOfDefense agency2 = game.Empires[m].GetAgency <DepartmentOfDefense>(); if (agency2 != null) { for (int n = 0; n < agency2.Armies.Count; n++) { Army army2 = agency2.Armies[n]; if (list.Contains(army2.WorldPosition)) { if (army2 is KaijuArmy) { KaijuArmy kaijuArmy = army2 as KaijuArmy; if (kaijuArmy != null && !kaijuArmy.Kaiju.OnArmyMode()) { goto IL_389; } } targets.Add(army2); } IL_389 :; } } DepartmentOfTheInterior agency3 = game.Empires[m].GetAgency <DepartmentOfTheInterior>(); if (agency3 != null) { for (int num = 0; num < agency3.TamedKaijuGarrisons.Count; num++) { KaijuGarrison kaijuGarrison2 = agency3.TamedKaijuGarrisons[num]; if (kaijuGarrison2 != null) { Kaiju kaiju2 = kaijuGarrison2.Kaiju; if (kaiju2 != null && kaiju2.OnGarrisonMode() && list.Contains(kaijuGarrison2.WorldPosition)) { targets.Add(kaijuGarrison2); } } } } } } }
protected override State Execute(AIBehaviorTree aiBehaviorTree, params object[] parameters) { Army army; if (base.GetArmyUnlessLocked(aiBehaviorTree, "$Army", out army) != AIArmyMission.AIArmyMissionErrorCode.None) { return(State.Failure); } if (this.currentTicket != null) { if (!this.currentTicket.Raised) { return(State.Running); } bool flag = this.currentTicket.PostOrderResponse == PostOrderResponse.PreprocessHasFailed || this.currentTicket.PostOrderResponse == PostOrderResponse.AuthenticationHasFailed; this.currentTicket = null; if (flag) { aiBehaviorTree.ErrorCode = 1; return(State.Failure); } return(State.Success); } else if (this.heroTicket != null) { if (!this.heroTicket.Raised) { return(State.Running); } if (this.heroTicket.PostOrderResponse != PostOrderResponse.Processed) { aiBehaviorTree.ErrorCode = 36; return(State.Failure); } this.heroTicket = null; return(State.Running); } else { if (!aiBehaviorTree.Variables.ContainsKey(this.DestinationVarName)) { aiBehaviorTree.LogError("{0} not set", new object[] { this.DestinationVarName }); return(State.Failure); } WorldPosition worldPosition = (WorldPosition)aiBehaviorTree.Variables[this.DestinationVarName]; if (!worldPosition.IsValid) { aiBehaviorTree.LogError("Destination is invalid.", new object[0]); aiBehaviorTree.ErrorCode = 2; return(State.Failure); } List <GameEntityGUID> list = new List <GameEntityGUID>(); foreach (Unit unit in army.StandardUnits) { list.Add(unit.GUID); } if (list.Count == 0) { return(State.Success); } bool flag2 = army.Hero != null; IGameService service = Services.GetService <IGameService>(); Diagnostics.Assert(service != null); IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>(); Diagnostics.Assert(service2 != null); IPathfindingService service3 = service.Game.Services.GetService <IPathfindingService>(); Diagnostics.Assert(service3 != null); City city = service2.GetRegion(worldPosition).City; if (city != null) { District district = service2.GetDistrict(worldPosition); if (district != null) { GameEntityGUID destinationGuid = GameEntityGUID.Zero; if (city.Camp != null && city.Camp.ContainsDistrict(district.GUID)) { destinationGuid = city.Camp.GUID; } else if (District.IsACityTile(district)) { destinationGuid = city.GUID; } if (destinationGuid.IsValid) { if (flag2) { if (!District.IsACityTile(district) || city.Hero != null) { this.UnassignHero(army); return(State.Running); } list.Add(army.Hero.GUID); } OrderTransferUnits order = new OrderTransferUnits(army.Empire.Index, army.GUID, destinationGuid, list.ToArray(), false); aiBehaviorTree.AICommander.Empire.PlayerControllers.AI.PostOrder(order, out this.currentTicket, null); return(State.Running); } } } Army armyAtPosition = service2.GetArmyAtPosition(worldPosition); if (armyAtPosition != null) { if (flag2) { if (armyAtPosition.Hero != null) { this.UnassignHero(army); return(State.Running); } list.Add(army.Hero.GUID); } OrderTransferUnits order2 = new OrderTransferUnits(army.Empire.Index, army.GUID, armyAtPosition.GUID, list.ToArray(), false); aiBehaviorTree.AICommander.Empire.PlayerControllers.AI.PostOrder(order2, out this.currentTicket, null); return(State.Running); } if (service3.IsTileStopable(worldPosition, army, (PathfindingFlags)0, null)) { OrderTransferGarrisonToNewArmy order3 = new OrderTransferGarrisonToNewArmy(army.Empire.Index, army.GUID, list.ToArray(), worldPosition, StaticString.Empty, false, true, true); aiBehaviorTree.AICommander.Empire.PlayerControllers.AI.PostOrder(order3, out this.currentTicket, null); return(State.Running); } aiBehaviorTree.LogError("No valid destination found.", new object[0]); aiBehaviorTree.ErrorCode = 2; return(State.Failure); } }