public override void Execute(Army army, global::PlayerController playerController, out Ticket ticket, EventHandler <TicketRaisedEventArgs> ticketRaisedEventHandler, params object[] parameters) { ticket = null; List <GameEntityGUID> list = new List <GameEntityGUID>(); int num = 0; PathfindingMovementCapacity pathfindingMovementCapacity = PathfindingMovementCapacity.None; for (int i = 0; i < parameters.Length; i++) { if (parameters[i] is Unit) { Unit unit = parameters[i] as Unit; num += (int)unit.GetPropertyValue(SimulationProperties.UnitSlotCount); list.Add(unit.GUID); pathfindingMovementCapacity = unit.GenerateContext().MovementCapacities; } else { if (!(parameters[i] is IEnumerable <Unit>)) { return; } foreach (Unit unit2 in (parameters[i] as IEnumerable <Unit>)) { num += (int)unit2.GetPropertyValue(SimulationProperties.UnitSlotCount); list.Add(unit2.GUID); if (pathfindingMovementCapacity == PathfindingMovementCapacity.None) { pathfindingMovementCapacity = unit2.GenerateContext().MovementCapacities; } else { pathfindingMovementCapacity &= unit2.GenerateContext().MovementCapacities; } } } } IGameService service = Services.GetService <IGameService>(); IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>(); IPathfindingService service3 = service.Game.Services.GetService <IPathfindingService>(); bool flag = false; bool flag2 = false; if (this.CanTransferTo(army, army.WorldPosition, ref flag, ref flag2, service2, num) && this.TransferTo(army, army.WorldPosition, list, service2, playerController, out ticket, ticketRaisedEventHandler)) { return; } for (int j = 0; j < 6; j++) { WorldPosition neighbourTile = service2.GetNeighbourTile(army.WorldPosition, (WorldOrientation)j, 1); if (service3.IsTilePassable(neighbourTile, pathfindingMovementCapacity, (PathfindingFlags)0) && service3.IsTransitionPassable(army.WorldPosition, neighbourTile, pathfindingMovementCapacity, (PathfindingFlags)0)) { if (this.CanTransferTo(army, neighbourTile, ref flag, ref flag2, service2, num) && this.TransferTo(army, neighbourTile, list, service2, playerController, out ticket, ticketRaisedEventHandler)) { return; } } } }
public static WorldPosition GetValidArmySpawningPosition(Army army, IWorldPositionningService worldPositionningService, IPathfindingService pathfindingService) { WorldOrientation worldOrientation = WorldOrientation.East; for (int i = 0; i < 6; i++) { WorldPosition neighbourTile = worldPositionningService.GetNeighbourTile(army.WorldPosition, worldOrientation, 1); if (neighbourTile.IsValid && !worldPositionningService.IsWaterTile(neighbourTile) && pathfindingService.IsTransitionPassable(army.WorldPosition, neighbourTile, army, PathfindingFlags.IgnoreFogOfWar, null) && pathfindingService.IsTileStopableAndPassable(neighbourTile, army, PathfindingFlags.IgnoreFogOfWar, null)) { return(neighbourTile); } worldOrientation = worldOrientation.Rotate(1); } return(WorldPosition.Invalid); }
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 District GetValidDistrictToTarget(Army army = 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); for (int i = 0; i < this.districts.Count; i++) { District district = this.districts[i]; if (District.IsACityTile(district)) { for (int j = 0; j < 6; j++) { WorldPosition neighbourTile = service2.GetNeighbourTile(district.WorldPosition, (WorldOrientation)j, 1); if (!service2.IsWaterTile(neighbourTile)) { if (army == null || service3.IsTileStopable(neighbourTile, army, PathfindingFlags.IgnoreFogOfWar | PathfindingFlags.IgnoreZoneOfControl, null)) { for (int k = 0; k < this.districts.Count; k++) { District district2 = this.districts[k]; if (district2.WorldPosition == neighbourTile) { if (service3.IsTransitionPassable(district2.WorldPosition, district.WorldPosition, PathfindingMovementCapacity.Ground, PathfindingFlags.IgnoreArmies | PathfindingFlags.IgnoreDiplomacy | PathfindingFlags.IgnoreFogOfWar | PathfindingFlags.IgnoreZoneOfControl | PathfindingFlags.IgnoreSieges)) { Army armyAtPosition = service2.GetArmyAtPosition(district2.WorldPosition); if (armyAtPosition == null || armyAtPosition == army) { return(district2); } } break; } } } } } } } return(this.districts[0]); }
private bool CanIAttackTheCityFromTheDistrict(District district, GridMap <District> districtsMap, Army army, IPathfindingService pathfindingService, IWorldPositionningService worldPositionningService) { if (district == null) { return(false); } if (worldPositionningService.IsWaterTile(district.WorldPosition)) { return(false); } using (new UnityProfilerSample("IsTileStopable")) { if (!pathfindingService.IsTileStopableAndPassable(district.WorldPosition, army, PathfindingFlags.IgnoreDiplomacy | PathfindingFlags.IgnoreFogOfWar | PathfindingFlags.IgnoreZoneOfControl | PathfindingFlags.IgnoreSieges, null)) { return(false); } } for (int i = 0; i < 6; i++) { WorldPosition neighbourTile = worldPositionningService.GetNeighbourTile(district.WorldPosition, (WorldOrientation)i, 1); if (!worldPositionningService.IsWaterTile(neighbourTile)) { District value = districtsMap.GetValue(neighbourTile); if (value != null && District.IsACityTile(value)) { using (new UnityProfilerSample("IsTransitionPassable")) { if (pathfindingService.IsTransitionPassable(district.WorldPosition, neighbourTile, army, OrderAttack.AttackFlags, null)) { return(true); } } } } } return(false); }
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; PathfindingMovementCapacity pathfindingMovementCapacity = PathfindingMovementCapacity.None; 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; } if (unit.SimulationObject.Tags.Contains(DownloadableContent16.SeafaringUnit)) { failureFlags.Add(ArmyAction.NoCanDoWhileSeafaring); return(false); } num2 += (int)unit.GetPropertyValue(SimulationProperties.UnitSlotCount); num++; pathfindingMovementCapacity = unit.GenerateContext().MovementCapacities; } else { if (!(parameters[i] is IEnumerable <Unit>)) { failureFlags.Add(ArmyAction.NoCanDoWhileHidden); return(false); } foreach (Unit unit2 in (parameters[i] as IEnumerable <Unit>)) { if (unit2.Garrison == null) { failureFlags.Add(ArmyAction.NoCanDoWhileHidden); return(false); } 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; } if (unit2.SimulationObject.Tags.Contains(DownloadableContent16.SeafaringUnit)) { if (!failureFlags.Contains(ArmyAction.NoCanDoWhileSeafaring)) { failureFlags.Add(ArmyAction.NoCanDoWhileSeafaring); } } else { num2 += (int)unit2.GetPropertyValue(SimulationProperties.UnitSlotCount); num++; float propertyValue = unit2.GetPropertyValue(SimulationProperties.Movement); if (propertyValue < num3) { num3 = propertyValue; } if (pathfindingMovementCapacity == PathfindingMovementCapacity.None) { pathfindingMovementCapacity = unit2.GenerateContext().MovementCapacities; } else { pathfindingMovementCapacity &= unit2.GenerateContext().MovementCapacities; } } } } } if (failureFlags.Contains(ArmyAction.NoCanDoWhileSeafaring)) { if (num == 0) { failureFlags.Add(ArmyAction.NoCanDoWhileHidden); } return(false); } 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; if (this.CanTransferTo(army, army.WorldPosition, ref flag2, ref flag3, service2, num2)) { return(true); } for (int j = 0; j < 6; j++) { WorldPosition neighbourTile = service2.GetNeighbourTile(army.WorldPosition, (WorldOrientation)j, 1); if (service3.IsTilePassable(neighbourTile, pathfindingMovementCapacity, (PathfindingFlags)0) && service3.IsTransitionPassable(army.WorldPosition, neighbourTile, pathfindingMovementCapacity, (PathfindingFlags)0)) { if (this.CanTransferTo(army, neighbourTile, ref flag2, ref flag3, service2, num2)) { return(true); } } } if (flag2 || flag3) { failureFlags.Add(ArmyAction_TransferUnits.NotEnoughSlotsInNeighbouringGarrisonForTransfer); } else { failureFlags.Add(ArmyAction_TransferUnits.NoNeighbouringCityAvailable); } return(false); }
protected void SpawnArmy(QuestBehaviour questBehaviour) { if (!string.IsNullOrEmpty(this.ArmyDroplist)) { IGameService service = Services.GetService <IGameService>(); if (service == null || service.Game == null) { Diagnostics.LogError("Failed to retrieve the game service."); return; } global::Game game = service.Game as global::Game; if (game == null) { Diagnostics.LogError("Failed to cast gameService.Game to Game."); return; } IDatabase <Droplist> database = Databases.GetDatabase <Droplist>(false); if (database == null) { return; } string text = this.ArmyDroplist; if (this.ArmyDroplistSuffix != string.Empty) { text = text + "_" + this.ArmyDroplistSuffix; } Droplist droplist; if (!database.TryGetValue(text, out droplist)) { Diagnostics.LogError("Cannot retrieve drop list '{0}' in quest definition '{1}'", new object[] { text, questBehaviour.Quest.QuestDefinition.Name }); return; } if (!string.IsNullOrEmpty(this.EmpireArmyOwnerVarName)) { global::Empire empire = null; object obj; if (questBehaviour.TryGetQuestVariableValueByName <object>(this.EmpireArmyOwnerVarName, out obj)) { if (obj is global::Empire) { empire = (obj as global::Empire); } else if (obj is int) { empire = game.Empires[(int)obj]; } if (empire != null) { this.EmpireArmyOwner = empire; } } } global::Empire empire2 = this.EmpireArmyOwner; if (empire2 == null || empire2 is LesserEmpire || this.UseBehaviorInitiatorEmpire) { empire2 = questBehaviour.Initiator; } if (this.UseBehaviorInitiatorEmpire) { this.EmpireArmyOwner = questBehaviour.Initiator; } if (this.EmpireArmyOwner is MajorEmpire && (this.EmpireArmyOwner as MajorEmpire).ELCPIsEliminated) { return; } Droplist droplist2; DroppableArmyDefinition droppableArmyDefinition = droplist.Pick(empire2, out droplist2, new object[0]) as DroppableArmyDefinition; if (droppableArmyDefinition != null) { int num = 0; if (this.ScaleWithMaxEra) { num = DepartmentOfScience.GetMaxEraNumber() - 1; } int val = 0; IDatabase <AnimationCurve> database2 = Databases.GetDatabase <AnimationCurve>(false); AnimationCurve animationCurve; if (database2 != null && database2.TryGetValue(QuestBehaviourTreeNode_Action_SpawnArmy.questUnitLevelEvolution, out animationCurve)) { float propertyValue = questBehaviour.Initiator.GetPropertyValue(SimulationProperties.GameSpeedMultiplier); val = (int)animationCurve.EvaluateWithScaledAxis((float)game.Turn, propertyValue, 1f); val = Math.Max(0, Math.Min(100, val)); } num = Math.Max(num, val); StaticString[] array = Array.ConvertAll <string, StaticString>(droppableArmyDefinition.UnitDesigns, (string input) => input); bool flag = false; IDatabase <UnitDesign> database3 = Databases.GetDatabase <UnitDesign>(false); for (int i = 0; i < array.Length; i++) { UnitDesign unitDesign; if (database3.TryGetValue(array[i], out unitDesign) && unitDesign != null && unitDesign.Tags.Contains(DownloadableContent16.TagSeafaring)) { flag = true; break; } } IEnumerable <WorldPosition> enumerable = null; questBehaviour.TryGetQuestVariableValueByName <WorldPosition>(this.ForbiddenSpawnLocationVarName, out enumerable); List <WorldPosition> list = this.SpawnLocations.ToList <WorldPosition>().Randomize(null); IWorldPositionningService service2 = game.Services.GetService <IWorldPositionningService>(); IPathfindingService service3 = game.Services.GetService <IPathfindingService>(); Diagnostics.Assert(service2 != null); WorldPosition worldPosition = WorldPosition.Invalid; if (!questBehaviour.Quest.QuestDefinition.IsGlobal) { PathfindingMovementCapacity pathfindingMovementCapacity = PathfindingMovementCapacity.Water; if (!flag) { pathfindingMovementCapacity |= PathfindingMovementCapacity.Ground; } for (int j = 0; j < list.Count; j++) { WorldPosition worldPosition2 = list[j]; if (DepartmentOfDefense.CheckWhetherTargetPositionIsValidForUseAsArmySpawnLocation(worldPosition2, pathfindingMovementCapacity)) { if (enumerable != null) { if (enumerable.Contains(worldPosition2)) { goto IL_330; } this.AddPositionToForbiddenSpawnPosition(questBehaviour, worldPosition2); } worldPosition = worldPosition2; break; } IL_330 :; } if (!service3.IsTileStopable(worldPosition, PathfindingMovementCapacity.Ground | PathfindingMovementCapacity.Water, PathfindingFlags.IgnoreFogOfWar)) { worldPosition = WorldPosition.Invalid; } if (!worldPosition.IsValid && list.Count > 0) { List <WorldPosition> list2 = new List <WorldPosition>(); Queue <WorldPosition> queue = new Queue <WorldPosition>(); worldPosition = list[0]; bool flag2 = false; if (worldPosition.IsValid) { flag2 = service2.IsWaterTile(worldPosition); } do { if (queue.Count > 0) { worldPosition = queue.Dequeue(); } for (int k = 0; k < 6; k++) { WorldPosition neighbourTileFullCyclic = service2.GetNeighbourTileFullCyclic(worldPosition, (WorldOrientation)k, 1); if (!list2.Contains(neighbourTileFullCyclic) && list2.Count < 19) { queue.Enqueue(neighbourTileFullCyclic); list2.Add(neighbourTileFullCyclic); } } if (!DepartmentOfDefense.CheckWhetherTargetPositionIsValidForUseAsArmySpawnLocation(worldPosition, pathfindingMovementCapacity) || !service3.IsTileStopable(worldPosition, PathfindingMovementCapacity.Ground | PathfindingMovementCapacity.Water, PathfindingFlags.IgnoreFogOfWar) || flag2 != service2.IsWaterTile(worldPosition)) { worldPosition = WorldPosition.Invalid; } }while (worldPosition == WorldPosition.Invalid && queue.Count > 0); } if (!worldPosition.IsValid) { string format = "Cannot find a valid position to spawn on: {0}"; object[] array2 = new object[1]; array2[0] = string.Join(",", list.Select(delegate(WorldPosition position) { WorldPosition worldPosition3 = position; return(worldPosition3.ToString()); }).ToArray <string>()); Diagnostics.LogError(format, array2); return; } } OrderSpawnArmy orderSpawnArmy; if (worldPosition.IsValid) { list.Clear(); list.Add(worldPosition); WorldOrientation worldOrientation = WorldOrientation.East; for (int l = 0; l < 6; l++) { WorldPosition neighbourTile = service2.GetNeighbourTile(worldPosition, worldOrientation, 1); bool flag3 = flag == service2.IsWaterTile(neighbourTile); if (neighbourTile.IsValid && flag3 && service3.IsTileStopable(worldPosition, PathfindingMovementCapacity.Ground | PathfindingMovementCapacity.Water, PathfindingFlags.IgnoreFogOfWar)) { list.Add(neighbourTile); } worldOrientation = worldOrientation.Rotate(1); } orderSpawnArmy = new OrderSpawnArmy(this.EmpireArmyOwner.Index, list.ToArray(), num, true, this.CanMoveOnSpawn, true, questBehaviour.Quest.QuestDefinition.IsGlobal || this.ForceGlobalArmySymbol, array); } else { orderSpawnArmy = new OrderSpawnArmy(this.EmpireArmyOwner.Index, list.ToArray(), num, true, this.CanMoveOnSpawn, true, questBehaviour.Quest.QuestDefinition.IsGlobal || this.ForceGlobalArmySymbol, array); } orderSpawnArmy.GameEntityGUID = this.ArmyGUID; Diagnostics.Log("Posting order: {0} at {1}", new object[] { orderSpawnArmy.ToString(), worldPosition }); if (!string.IsNullOrEmpty(this.TransferResourceName) && this.TransferResourceAmount > 0) { Ticket ticket; this.EmpireArmyOwner.PlayerControllers.Server.PostOrder(orderSpawnArmy, out ticket, new EventHandler <TicketRaisedEventArgs>(this.OrderSpawnArmy_TicketRaised)); return; } this.EmpireArmyOwner.PlayerControllers.Server.PostOrder(orderSpawnArmy); } } }
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); } } } } } } }
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); }