private bool AskForArmy(int numberOfUnits) { if (!base.AIDataArmyGUID.IsValid && numberOfUnits > 0 && this.armySpawnTicket == null) { PathfindingContext pathfindingContext = new PathfindingContext(this.Camp.City.GUID, this.Camp.City.Empire, this.Camp.City.StandardUnits); WorldPosition armyPosition; if (!DepartmentOfTheInterior.TryGetWorldPositionForNewArmyFromCity(this.Camp.City, this.pathfindingService, pathfindingContext, out armyPosition)) { return(false); } if (this.Camp.City.StandardUnits.Count == 0) { return(false); } numberOfUnits = Mathf.Min(this.Camp.City.StandardUnits.Count, numberOfUnits); if (numberOfUnits > 0) { GameEntityGUID[] array = new GameEntityGUID[numberOfUnits]; for (int i = 0; i < numberOfUnits; i++) { array[i] = this.Camp.City.StandardUnits[i].GUID; } OrderTransferGarrisonToNewArmy order = new OrderTransferGarrisonToNewArmy(base.Commander.Empire.Index, this.Camp.City.GUID, array, armyPosition, null, false, true, true); base.Commander.Empire.PlayerControllers.AI.PostOrder(order, out this.armySpawnTicket, null); } } return(false); }
protected override bool TryComputeArmyMissionParameter() { if (this.RegionTarget == null || base.AIDataArmyGUID == GameEntityGUID.Zero) { base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail; return(false); } base.ArmyMissionParameters.Clear(); Army army = this.aiDataRepository.GetAIData <AIData_Army>(base.AIDataArmyGUID).Army; if (army == null || !army.GUID.IsValid) { return(false); } if (this.game.Turn == 0 && army.StandardUnits != null && army.StandardUnits.Count > 1 && army.GetPropertyValue(SimulationProperties.Movement) > 1f) { List <Unit> list = army.StandardUnits.ToList <Unit>().FindAll((Unit U) => !U.IsSettler); if (list != null) { IGameService service = Services.GetService <IGameService>(); IPathfindingService service2 = service.Game.Services.GetService <IPathfindingService>(); IWorldPositionningService service3 = service.Game.Services.GetService <IWorldPositionningService>(); WorldPosition validArmySpawningPosition = AILayer_ArmyRecruitment.GetValidArmySpawningPosition(army, service3, service2); if (validArmySpawningPosition.IsValid) { OrderTransferGarrisonToNewArmy order = new OrderTransferGarrisonToNewArmy(base.Commander.Empire.Index, army.GUID, list.ConvertAll <GameEntityGUID>((Unit unit) => unit.GUID).ToArray(), validArmySpawningPosition, StaticString.Empty, false, true, true); Ticket ticket; base.Commander.Empire.PlayerControllers.Server.PostOrder(order, out ticket, new EventHandler <TicketRaisedEventArgs>(this.OrderSplitUnit)); return(false); } } } if (this.RegionTarget == null || this.RegionTarget.IsRegionColonized() || !army.IsSettler) { return(base.TryCreateArmyMission("MajorFactionRoaming", new List <object> { this.RegionTarget.Index, false })); } if (base.AIDataArmyGUID == GameEntityGUID.Zero || this.PositionIndex >= this.ListOfPosition.Length) { return(false); } if (base.Commander.Empire.GetAgency <DepartmentOfTheInterior>().Cities.Count == 0) { return(base.TryCreateArmyMission("ColonizeAtImmediatly", new List <object> { this.ListOfPosition[this.PositionIndex] })); } return(base.TryCreateArmyMission("ColonizeAt", new List <object> { this.ListOfPosition[this.PositionIndex] })); }
protected override bool TryComputeArmyMissionParameter() { base.ArmyMissionParameters.Clear(); if (base.AIDataArmyGUID == GameEntityGUID.Zero) { return(false); } if (this.POI == null) { base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail; return(false); } Army army = this.aiDataRepository.GetAIData <AIData_Army>(base.AIDataArmyGUID).Army; if (army.Hero != null) { OrderChangeHeroAssignment orderChangeHeroAssignment = new OrderChangeHeroAssignment(base.Commander.Empire.Index, army.Hero.GUID, GameEntityGUID.Zero); orderChangeHeroAssignment.IgnoreCooldown = true; base.Commander.Empire.PlayerControllers.AI.PostOrder(orderChangeHeroAssignment); return(true); } if (army.StandardUnits.Count((Unit x) => x.UnitDesign.UnitBodyDefinition.SubCategory == "SubCategoryFlying" && x.GetPropertyValue(SimulationProperties.LevelDisplayed) >= 4f) == 0) { this.Success(); } if (army.StandardUnits.Count <= 1) { return(base.TryCreateArmyMission("VisitQuestRuin", new List <object> { this.RegionTarget.Index, this.POI })); } Unit item = army.StandardUnits.First((Unit x) => x.UnitDesign.UnitBodyDefinition.SubCategory == "SubCategoryFlying" && x.GetPropertyValue(SimulationProperties.LevelDisplayed) >= 4f); List <Unit> second = new List <Unit> { item }; List <Unit> list = army.StandardUnits.Except(second).ToList <Unit>(); WorldPosition validArmySpawningPosition = AILayer_ArmyRecruitment.GetValidArmySpawningPosition(army, this.worldPositionningService, this.pathfindingService); if (!validArmySpawningPosition.IsValid || list.Count == 0) { return(base.TryCreateArmyMission("MajorFactionRoaming", new List <object> { this.RegionTarget.Index, true })); } OrderTransferGarrisonToNewArmy order = new OrderTransferGarrisonToNewArmy(base.Commander.Empire.Index, army.GUID, list.ConvertAll <GameEntityGUID>((Unit unit) => unit.GUID).ToArray(), validArmySpawningPosition, StaticString.Empty, false, true, true); base.Commander.Empire.PlayerControllers.Server.PostOrder(order); return(true); }
private bool AskForArmy(int numberOfUnits) { if (!base.AIDataArmyGUID.IsValid && this.armySpawnTicket == null) { if (this.City.BesiegingEmpire != null) { int maxValue = int.MaxValue; for (int i = 0; i < this.City.Districts.Count; i++) { if (District.IsACityTile(this.City.Districts[i])) { Army armyAtPosition = this.worldPositionningService.GetArmyAtPosition(this.City.Districts[i].WorldPosition); if (armyAtPosition != null && armyAtPosition.Empire == this.City.Empire) { int distanceToBesieger = this.GetDistanceToBesieger(this.City.Districts[i].WorldPosition); if (distanceToBesieger < maxValue) { base.AIDataArmyGUID = armyAtPosition.GUID; } if (distanceToBesieger == 1) { return(false); } } } } if (base.AIDataArmyGUID.IsValid) { return(false); } } PathfindingContext pathfindingContext = new PathfindingContext(this.City.GUID, this.City.Empire, this.City.StandardUnits); WorldPosition armyPosition; if (!DepartmentOfTheInterior.TryGetWorldPositionForNewArmyFromCity(this.City, this.pathfindingService, pathfindingContext, out armyPosition)) { return(false); } if (this.City.StandardUnits.Count == 0) { return(false); } numberOfUnits = Mathf.Min(this.City.StandardUnits.Count, numberOfUnits); GameEntityGUID[] array = new GameEntityGUID[numberOfUnits]; for (int j = 0; j < numberOfUnits; j++) { array[j] = this.City.StandardUnits[j].GUID; } OrderTransferGarrisonToNewArmy order = new OrderTransferGarrisonToNewArmy(base.Commander.Empire.Index, this.City.GUID, array, armyPosition, null, false, true, true); base.Commander.Empire.PlayerControllers.AI.PostOrder(order, out this.armySpawnTicket, null); } return(false); }
private void OrderTransferUnitToNewArmyTicketRaised(object sender, TicketRaisedEventArgs e) { this.createFirstArmyTicket = null; if (e.Result != PostOrderResponse.Processed) { for (int i = 0; i < this.UnitGuids.Length; i++) { IGameEntity gameEntity; if (this.gameEntityRepositoryService.TryGetValue(this.UnitGuids[i], out gameEntity)) { Unit unit = gameEntity as Unit; if (unit != null && (double)unit.GetPropertyValue(SimulationProperties.Movement) < 0.001) { base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail; } return; } } base.Completion = AICommanderMission.AICommanderMissionCompletion.Initializing; return; } OrderTransferGarrisonToNewArmy orderTransferGarrisonToNewArmy = e.Order as OrderTransferGarrisonToNewArmy; AIData_Army aidata = this.aiDataRepository.GetAIData <AIData_Army>(orderTransferGarrisonToNewArmy.ArmyGuid); if (aidata != null) { aidata.UnassignArmyMission(); for (int j = 0; j < this.UnitGuids.Length; j++) { AIData_Unit aidata_Unit; this.aiDataRepository.TryGetAIData <AIData_Unit>(this.UnitGuids[j], out aidata_Unit); if (aidata_Unit == null) { Diagnostics.LogWarning("[AICommanderMission_RegroupArmyAt] no AIData for Unit {0}", new object[] { this.UnitGuids[j].ToString() }); } else { aidata_Unit.TryUnLockUnit(base.InternalGUID); } } base.AIDataArmyGUID = aidata.GameEntity.GUID; if (!aidata.AssignCommanderMission(this)) { Diagnostics.LogWarning(string.Format("LOCKING Problem in [AICommanderMission_RegroupArmyAt]", new object[0])); } } }
private bool WaitingOnArmyTicket() { if (this.armySpawnTicket != null && this.armySpawnTicket.Raised) { if (this.armySpawnTicket.PostOrderResponse == PostOrderResponse.Processed) { OrderTransferGarrisonToNewArmy orderTransferGarrisonToNewArmy = this.armySpawnTicket.Order as OrderTransferGarrisonToNewArmy; if (this.armySpawnTicket != null) { base.AIDataArmyGUID = orderTransferGarrisonToNewArmy.ArmyGuid; } } this.armySpawnTicket = null; } return(this.armySpawnTicket != null); }
private void DoRazeInfectedCity() { Construction currentConstructionRaze = this.GetCurrentConstructionRaze(); if (currentConstructionRaze != null) { OrderCancelConstruction order = new OrderCancelConstruction(this.City.Empire.Index, this.City.GUID, currentConstructionRaze.GUID); Ticket ticket; this.playerControllerRepository.ActivePlayerController.PostOrder(order, out ticket, new EventHandler <TicketRaisedEventArgs>(this.OnOrderResponse)); } else { bool flag = !Amplitude.Unity.Runtime.Runtime.Registry.GetValue <bool>(OvergrownCityPanel.gameplaySettingOvergrownCityImmediateRazePath, true); if (flag) { DepartmentOfIndustry agency = this.City.Empire.GetAgency <DepartmentOfIndustry>(); IEnumerable <DepartmentOfIndustry.ConstructibleElement> availableConstructibleElementsAsEnumerable = agency.ConstructibleElementDatabase.GetAvailableConstructibleElementsAsEnumerable(new StaticString[0]); DepartmentOfIndustry.ConstructibleElement constructibleElement = availableConstructibleElementsAsEnumerable.FirstOrDefault((DepartmentOfIndustry.ConstructibleElement m) => m.Name == OvergrownCityPanel.CityConstructibleActionInfectedRaze); OrderQueueConstruction order2 = new OrderQueueConstruction(this.City.Empire.Index, this.City.GUID, constructibleElement, string.Empty); Ticket ticket2; this.playerControllerRepository.ActivePlayerController.PostOrder(order2, out ticket2, new EventHandler <TicketRaisedEventArgs>(this.OnOrderResponse)); } else { WorldPosition firstAvailablePositionForArmyCreation = this.GetFirstAvailablePositionForArmyCreation(); if (this.City.StandardUnits.Count > 0 && firstAvailablePositionForArmyCreation.IsValid) { OrderTransferGarrisonToNewArmy order3 = new OrderTransferGarrisonToNewArmy(this.City.Empire.Index, this.City.GUID, (from m in this.City.Units select m.GUID).ToArray <GameEntityGUID>(), firstAvailablePositionForArmyCreation, StaticString.Empty, false, false, false); Ticket ticket3; this.playerControllerRepository.ActivePlayerController.PostOrder(order3, out ticket3, new EventHandler <TicketRaisedEventArgs>(this.OrderTransferGarrisonToNewArmy_TicketRaised)); } else { this.SendOrderDestroyCity(); } this.Hide(true); } } }
private bool WaitingOnArmyTicket() { if (this.armySpawnTicket != null && this.armySpawnTicket.Raised) { if (this.armySpawnTicket.PostOrderResponse == PostOrderResponse.Processed) { OrderTransferGarrisonToNewArmy orderTransferGarrisonToNewArmy = this.armySpawnTicket.Order as OrderTransferGarrisonToNewArmy; if (orderTransferGarrisonToNewArmy != null) { base.AIDataArmyGUID = orderTransferGarrisonToNewArmy.ArmyGuid; if (this.HighPriority) { base.TryGetArmyData(); } } } else if (this.armySpawnTicket.PostOrderResponse == PostOrderResponse.PreprocessHasFailed) { base.Success(); } this.armySpawnTicket = null; } return(this.armySpawnTicket != null); }
protected override bool TryComputeArmyMissionParameter() { if (this.ticket != null) { if (this.ticket.Raised) { this.ticket = null; } return(false); } if (base.AIDataArmyGUID.IsValid && this.TargetCity != null && this.TargetCity.Empire == base.Commander.Empire && this.aiDataRepository.GetAIData <AIData_City>(this.TargetCity.GUID) != null) { AIData_Army aidata = this.aiDataRepository.GetAIData <AIData_Army>(base.AIDataArmyGUID); if (aidata != null) { List <object> list = new List <object>(); list.Add(this.TargetCity); if (this.TargetCity.MaximumUnitSlot > this.TargetCity.CurrentUnitSlot + aidata.Army.CurrentUnitSlot) { return(base.TryCreateArmyMission("DefendCity_Bail", list)); } if (aidata.Army.CurrentUnitSlot > 1) { GameEntityGUID[] array = new GameEntityGUID[1]; for (int i = 0; i < aidata.Army.StandardUnits.Count; i++) { if (aidata.Army.StandardUnits[i].IsSettler && aidata.Army.StandardUnits[i].GetPropertyValue(SimulationProperties.Movement) > 0f) { array[0] = aidata.Army.StandardUnits[i].GUID; break; } } WorldPosition neighbourFirstAvailablePositionForArmyCreation = DepartmentOfDefense.GetNeighbourFirstAvailablePositionForArmyCreation(aidata.Army); if (neighbourFirstAvailablePositionForArmyCreation.IsValid && array[0].IsValid) { OrderTransferGarrisonToNewArmy order = new OrderTransferGarrisonToNewArmy(base.Commander.Empire.Index, base.AIDataArmyGUID, array, neighbourFirstAvailablePositionForArmyCreation, null, false, true, true); base.Commander.Empire.PlayerControllers.AI.PostOrder(order, out this.ticket, null); } return(false); } return(base.TryCreateArmyMission("ReachTarget", list)); } } Diagnostics.Assert(AIScheduler.Services != null); IIntelligenceAIHelper service = AIScheduler.Services.GetService <IIntelligenceAIHelper>(); Diagnostics.Assert(service != null); List <Region> list2 = new List <Region>(); if (service.TryGetListOfRegionToExplore(base.Commander.Empire, 0.95f, ref list2)) { foreach (Region region in list2) { if (AILayer_Exploration.IsRegionValidForExploration(base.Commander.Empire, region)) { return(base.TryCreateArmyMission("ExploreAt", new List <object> { region.Index })); } } return(false); } return(false); }
protected override bool TryComputeArmyMissionParameter() { if (this.RegionTarget == null) { base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail; return(false); } base.ArmyMissionParameters.Clear(); if (base.AIDataArmyGUID == GameEntityGUID.Zero) { return(false); } this.POI = this.SelectPOI(); if (this.POI == null) { base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail; return(false); } AICommander_Victory comm = base.Commander as AICommander_Victory; if (comm == null) { return(false); } Army army = this.aiDataRepository.GetAIData <AIData_Army>(base.AIDataArmyGUID).Army; int num = army.StandardUnits.Count((Unit x) => x.UnitDesign.Name.ToString().Contains(comm.VictoryDesign)); float propertyValue = army.GetPropertyValue(SimulationProperties.Movement); if (propertyValue <= 0.01f) { base.State = TickableState.NoTick; return(false); } if (num > 5 || this.worldPositionningService.IsWaterTile(army.WorldPosition)) { return(base.TryCreateArmyMission("VisitQuestRuinFinal", new List <object> { this.RegionTarget.Index, this.POI })); } if (num == 0) { return(base.TryCreateArmyMission("MajorFactionWarRoaming", new List <object> { this.RegionTarget.Index, true })); } if (num <= 0 || army.StandardUnits.Count - num <= 0) { List <AICommanderMission> list = comm.Missions.FindAll((AICommanderMission x) => x is AICommanderMission_VictoryRuinFinal && x.AIDataArmyGUID.IsValid); List <Army> list2 = new List <Army>(); Func <Unit, bool> < > 9__4; foreach (AICommanderMission aicommanderMission in list) { Army army2 = this.aiDataRepository.GetAIData <AIData_Army>(aicommanderMission.AIDataArmyGUID).Army; if (army2 != army) { IEnumerable <Unit> standardUnits = army2.StandardUnits; Func <Unit, bool> selector; if ((selector = < > 9__4) == null) { selector = (< > 9__4 = ((Unit y) => y.UnitDesign.Name.ToString().Contains(comm.VictoryDesign))); } int num2 = standardUnits.Count(selector); if (num2 > 0 && num2 < 6) { list2.Add(army2); } } } int num3 = (int)base.Commander.Empire.GetPropertyValue(SimulationProperties.ArmyUnitSlot); Predicate <Unit> < > 9__5; foreach (Army army3 in list2) { if (this.worldPositionningService.GetDistance(army.WorldPosition, army3.WorldPosition) == 1 && this.worldPositionningService.IsWaterTile(army.WorldPosition) == this.worldPositionningService.IsWaterTile(army3.WorldPosition) && this.pathfindingService.IsTransitionPassable(army.WorldPosition, army3.WorldPosition, army, PathfindingFlags.IgnoreArmies | PathfindingFlags.IgnoreFogOfWar, null)) { float propertyValue2 = army3.GetPropertyValue(SimulationProperties.Movement); if ((propertyValue > propertyValue2 || (propertyValue == propertyValue2 && army.GUID < army3.GUID) || (army.StandardUnits.Count >= num3 && propertyValue > 0.01f)) && army3.StandardUnits.Count < num3) { List <Unit> list3 = army.StandardUnits.ToList <Unit>(); Predicate <Unit> match; if ((match = < > 9__5) == null) { match = (< > 9__5 = ((Unit z) => z.UnitDesign.Name.ToString().Contains(comm.VictoryDesign))); } List <Unit> list4 = list3.FindAll(match); int num4 = list4.Count - 1; while (num4 >= 0 && list4.Count + army3.StandardUnits.Count > num3) { list4.RemoveAt(num4); num4--; } OrderTransferUnits order = new OrderTransferUnits(base.Commander.Empire.Index, army.GUID, army3.GUID, list4.ConvertAll <GameEntityGUID>((Unit unit) => unit.GUID).ToArray(), false); Ticket ticket; base.Commander.Empire.PlayerControllers.Server.PostOrder(order, out ticket, new EventHandler <TicketRaisedEventArgs>(this.OrderTransferUnitToArmyTicketRaised)); return(true); } if (army.StandardUnits.Count < num3) { return(base.TryCreateArmyMission("ELCPWait", new List <object>())); } } } int num5 = int.MaxValue; Army army4 = null; foreach (Army army5 in list2) { int distance = this.worldPositionningService.GetDistance(army.WorldPosition, army5.WorldPosition); if (distance < num5) { num5 = distance; army4 = army5; } } if (army4 != null && army4.GUID > army.GUID && army4.GetPropertyValue(SimulationProperties.Movement) > 0.01f) { army4 = null; } if (army4 != null) { return(base.TryCreateArmyMission("ReachTarget", new List <object> { army4 })); } return(base.TryCreateArmyMission("ELCPWait", new List <object>())); } if (army.IsInEncounter || army.IsLocked) { return(base.TryCreateArmyMission("ELCPWait", new List <object>())); } WorldPosition validArmySpawningPosition = AILayer_ArmyRecruitment.GetValidArmySpawningPosition(army, this.worldPositionningService, this.pathfindingService); if (!validArmySpawningPosition.IsValid) { return(base.TryCreateArmyMission("MajorFactionWarRoaming", new List <object> { this.RegionTarget.Index, true })); } List <Unit> list5 = army.StandardUnits.ToList <Unit>().FindAll((Unit x) => !x.UnitDesign.Name.ToString().Contains(comm.VictoryDesign)); OrderTransferGarrisonToNewArmy order2 = new OrderTransferGarrisonToNewArmy(base.Commander.Empire.Index, army.GUID, list5.ConvertAll <GameEntityGUID>((Unit unit) => unit.GUID).ToArray(), validArmySpawningPosition, StaticString.Empty, false, true, true); Ticket ticket2; base.Commander.Empire.PlayerControllers.Server.PostOrder(order2, out ticket2, new EventHandler <TicketRaisedEventArgs>(this.OrderSplitUnit)); return(true); }
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); } }
private bool AskForArmy(bool mustAttack = false) { if (!base.AIDataArmyGUID.IsValid) { if (this.armySpawnTicket == null) { int maxValue = int.MaxValue; for (int i = 0; i < this.City.Districts.Count; i++) { if (District.IsACityTile(this.City.Districts[i])) { Army armyAtPosition = this.worldPositionningService.GetArmyAtPosition(this.City.Districts[i].WorldPosition); if (armyAtPosition != null && armyAtPosition.Empire == this.City.Empire) { int distanceToBesieger = this.GetDistanceToBesieger(this.City.Districts[i].WorldPosition); if (distanceToBesieger < maxValue) { base.AIDataArmyGUID = armyAtPosition.GUID; } if (distanceToBesieger == 1) { return(false); } } } } if (base.AIDataArmyGUID.IsValid) { return(false); } WorldPosition invalid = WorldPosition.Invalid; PathfindingContext pathfindingContext = new PathfindingContext(this.City.GUID, this.City.Empire, this.City.StandardUnits); if (!DepartmentOfTheInterior.TryGetWorldPositionForNewArmyFromCity(this.City, this.pathfindingService, pathfindingContext, out invalid)) { return(false); } if (!base.AIDataArmyGUID.IsValid && this.City.StandardUnits.Count > 0) { List <GameEntityGUID> list = new List <GameEntityGUID>(); for (int j = 0; j < this.City.StandardUnits.Count; j++) { if (this.City.StandardUnits[j].GetPropertyValue(SimulationProperties.Movement) > 0f && !this.City.StandardUnits[j].IsSettler) { list.Add(this.City.StandardUnits[j].GUID); } } if (list.Count == 0) { return(false); } OrderTransferGarrisonToNewArmy order = new OrderTransferGarrisonToNewArmy(base.Commander.Empire.Index, this.City.GUID, list.ToArray(), invalid, null, false, true, true); base.Commander.Empire.PlayerControllers.AI.PostOrder(order, out this.armySpawnTicket, null); } } else if (this.armySpawnTicket.Raised) { if (this.armySpawnTicket.PostOrderResponse == PostOrderResponse.Processed) { OrderTransferGarrisonToNewArmy orderTransferGarrisonToNewArmy = this.armySpawnTicket.Order as OrderTransferGarrisonToNewArmy; if (this.armySpawnTicket != null) { base.AIDataArmyGUID = orderTransferGarrisonToNewArmy.ArmyGuid; } } this.armySpawnTicket = null; } } if (!base.AIDataArmyGUID.IsValid) { return(false); } List <object> list2 = new List <object>(); list2.Add(this.City); if (mustAttack) { return(base.TryCreateArmyMission("DefendCity_BreakSiegeNow", list2)); } return(base.TryCreateArmyMission("DefendCity_BreakSiege", list2)); }
protected override bool TryGetArmyData() { if (this.createFirstArmyTicket != null) { return(false); } if (base.AIDataArmyGUID.IsValid) { return(true); } if (this.currentTicket != null) { return(false); } IGameEntity gameEntity; if (!this.gameEntityRepositoryService.TryGetValue(this.SourceGuid, out gameEntity)) { base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail; return(false); } for (int i = this.UnitGuids.Length - 1; i >= 0; i--) { AIData_Unit aidata_Unit; this.aiDataRepository.TryGetAIData <AIData_Unit>(this.UnitGuids[i], out aidata_Unit); if (aidata_Unit == null) { Diagnostics.LogWarning("[AICommanderMission_RegroupArmyAt] no AIData for Unit {0}", new object[] { this.UnitGuids[i].ToString() }); } else { if (aidata_Unit.IsUnitLocked() && !aidata_Unit.IsUnitLockedByMe(base.InternalGUID)) { WorldPosition worldPosition = WorldPosition.Invalid; if (aidata_Unit.Unit.Garrison is IWorldPositionable) { worldPosition = (aidata_Unit.Unit.Garrison as IWorldPositionable).WorldPosition; } Diagnostics.LogWarning(string.Format("{1} {2} LOCKING: Unit shouldn't be in use, current unit state: {0}", aidata_Unit.GetLockingStateString(), base.Commander.Empire, worldPosition)); base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail; return(false); } if (aidata_Unit.Unit.UnitDesign.Tags.Contains(DownloadableContent9.TagSolitary)) { Diagnostics.LogWarning("You cannot regroup Colossus or Solitary unit with something else."); base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail; return(false); } } } IGarrison garrison = gameEntity as IGarrison; if (garrison == null) { base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail; return(false); } if (this.AICommanderRegroupArmies != null && this.AICommanderRegroupArmies.RequestUnitListMessageID != 0UL) { RequestUnitListMessage requestUnitListMessage = base.Commander.AIPlayer.Blackboard.GetMessage(this.AICommanderRegroupArmies.RequestUnitListMessageID) as RequestUnitListMessage; if (requestUnitListMessage == null) { base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail; return(false); } requestUnitListMessage.ExecutionState = RequestUnitListMessage.RequestUnitListState.Regrouping; } bool flag = false; for (int j = 0; j < this.UnitGuids.Length; j++) { if (!garrison.ContainsUnit(this.UnitGuids[j])) { flag = true; break; } } if (flag) { List <GameEntityGUID> list = new List <GameEntityGUID>(); for (int k = 0; k < this.UnitGuids.Length; k++) { if (garrison.ContainsUnit(this.UnitGuids[k])) { list.Add(this.UnitGuids[k]); } } this.UnitGuids = list.ToArray(); } if (this.UnitGuids.Length == 0) { base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail; return(false); } WorldPosition armyPosition = WorldPosition.Invalid; Army army = gameEntity as Army; if (army != null) { AIData_Army aidata = this.aiDataRepository.GetAIData <AIData_Army>(gameEntity.GUID); Diagnostics.Assert(aidata != null); if (army.GetPropertyValue(SimulationProperties.Movement) <= 0f) { return(false); } if (aidata.CommanderMission != null) { aidata.CommanderMission.Interrupt(); } if (aidata.Army.IsInEncounter || aidata.Army.IsLocked) { return(false); } if (aidata.Army.StandardUnits.Count != this.UnitGuids.Length) { armyPosition = AILayer_ArmyRecruitment.GetValidArmySpawningPosition(aidata.Army, this.worldPositionningService, this.pathfindingService); int num = (int)base.Commander.Empire.GetPropertyValue(SimulationProperties.ArmyUnitSlot); if (aidata.Army.StandardUnits.Count > num) { Array.Resize <GameEntityGUID>(ref this.UnitGuids, num); } } else { if (!aidata.AssignCommanderMission(this)) { base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail; return(false); } base.AIDataArmyGUID = gameEntity.GUID; return(true); } } else if (gameEntity is Village) { Village village = gameEntity as Village; if (village.IsInEncounter) { return(false); } WorldPosition worldPosition2 = village.WorldPosition; WorldOrientation worldOrientation = WorldOrientation.East; if (this.AICommanderRegroupArmies.FinalPosition.IsValid) { worldOrientation = this.worldPositionningService.GetOrientation(worldPosition2, this.AICommanderRegroupArmies.FinalPosition); } for (int l = 0; l < 6; l++) { WorldPosition neighbourTile = this.worldPositionningService.GetNeighbourTile(worldPosition2, worldOrientation, 1); if (DepartmentOfDefense.CheckWhetherTargetPositionIsValidForUseAsArmySpawnLocation(neighbourTile, PathfindingMovementCapacity.Ground | PathfindingMovementCapacity.Water) && this.pathfindingService.IsTransitionPassable(village.WorldPosition, neighbourTile, this.pathfindingContext, PathfindingFlags.IgnoreFogOfWar, null) && this.pathfindingService.IsTilePassable(neighbourTile, this.pathfindingContext, (PathfindingFlags)0, null) && this.pathfindingService.IsTileStopable(neighbourTile, this.pathfindingContext, (PathfindingFlags)0, null)) { if (this.worldPositionningService.GetArmyAtPosition(neighbourTile) == null) { armyPosition = neighbourTile; break; } } else { worldOrientation = worldOrientation.Rotate(1); } } } else if (gameEntity is City) { City city = gameEntity as City; if (city.IsInEncounter) { return(false); } if (!DepartmentOfTheInterior.TryGetWorldPositionForNewArmyFromCity(city, this.pathfindingService, this.pathfindingContext, out armyPosition)) { return(false); } } else { Diagnostics.LogError(string.Format("[AICommanderMission_RegroupArmyAt] The garrison {0} is not valid.", garrison.GUID)); } if (armyPosition.IsValid) { if (army != null && army.WorldPath != null && army.WorldPath.Destination != army.WorldPosition) { OrderGoTo orderGoTo = new OrderGoTo(army.Empire.Index, army.GUID, army.WorldPosition); orderGoTo.Flags = (PathfindingFlags)0; base.Commander.Empire.PlayerControllers.AI.PostOrder(orderGoTo, out this.currentTicket, new EventHandler <TicketRaisedEventArgs>(this.MoveOrder_TicketRaised)); if (this.currentTicket != null) { return(false); } if (!this.orderExecuted) { Diagnostics.LogError("[AICommanderMission_RegroupArmyAt] new cancelation move order was not executed, from {0} to {1}", new object[] { army.WorldPosition, army.WorldPosition }); return(false); } } for (int m = 0; m < this.UnitGuids.Length; m++) { AIData_Unit aidata_Unit2; this.aiDataRepository.TryGetAIData <AIData_Unit>(this.UnitGuids[m], out aidata_Unit2); if (aidata_Unit2 == null) { Diagnostics.LogWarning("[AICommanderMission_RegroupArmyAt] no AIData for Unit {0}", new object[] { this.UnitGuids[m].ToString() }); } else if (!aidata_Unit2.IsUnitLockedByMe(base.InternalGUID)) { aidata_Unit2.TryLockUnit(base.InternalGUID, base.GetType().ToString(), AIData_Unit.AIDataReservationExtraTag.Regrouping, base.Commander.GetPriority(this)); } } OrderTransferGarrisonToNewArmy order = new OrderTransferGarrisonToNewArmy(base.Commander.Empire.Index, this.SourceGuid, this.UnitGuids, armyPosition, "Regroup", false, true, true); base.Commander.Empire.PlayerControllers.Server.PostOrder(order, out this.createFirstArmyTicket, new EventHandler <TicketRaisedEventArgs>(this.OrderTransferUnitToNewArmyTicketRaised)); } return(false); }
protected override void ExecuteMainTask() { if (this.Fortress.StandardUnits.Count == 0) { base.BehaviorState = ArmyWithTask.ArmyBehaviorState.Sleep; base.State = TickableState.NoTick; return; } float num = float.MaxValue; GameEntityGUID[] array = new GameEntityGUID[base.Garrison.StandardUnits.Count]; for (int i = 0; i < base.Garrison.StandardUnits.Count; i++) { array[i] = base.Garrison.StandardUnits[i].GUID; float propertyValue = base.Garrison.StandardUnits[i].GetPropertyValue(SimulationProperties.Movement); if (num > propertyValue) { num = propertyValue; } } if (num < 2f) { base.BehaviorState = ArmyWithTask.ArmyBehaviorState.Sleep; base.State = TickableState.NoTick; return; } if (base.CurrentMainTask == null) { base.State = TickableState.Optional; return; } WorldPosition armyPosition = WorldPosition.Invalid; Fortress fortress = base.Garrison as Fortress; for (int j = 0; j < 6; j++) { WorldPosition neighbourTile = this.worldPositionService.GetNeighbourTile(fortress.WorldPosition, (WorldOrientation)j, 1); if (DepartmentOfDefense.CheckWhetherTargetPositionIsValidForUseAsArmySpawnLocation(neighbourTile, PathfindingMovementCapacity.Water)) { armyPosition = neighbourTile; break; } } if (!armyPosition.IsValid) { for (int k = 0; k < fortress.Facilities.Count; k++) { for (int l = 0; l < 6; l++) { WorldPosition neighbourTile2 = this.worldPositionService.GetNeighbourTile(fortress.Facilities[k].WorldPosition, (WorldOrientation)l, 1); if (DepartmentOfDefense.CheckWhetherTargetPositionIsValidForUseAsArmySpawnLocation(neighbourTile2, PathfindingMovementCapacity.Water)) { armyPosition = neighbourTile2; break; } } } } OrderTransferGarrisonToNewArmy order = new OrderTransferGarrisonToNewArmy(base.Garrison.Empire.Index, base.Garrison.GUID, array, armyPosition, null, false, true, true); base.Garrison.Empire.PlayerControllers.AI.PostOrder(order); this.Unassign(); this.WantToKeepArmyFitness.Reset(); base.State = TickableState.NoTick; base.BehaviorState = ArmyWithTask.ArmyBehaviorState.Succeed; }