Exemple #1
0
    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);
    }
Exemple #3
0
    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);
                    }
                }
            }
        }
    }
Exemple #4
0
    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]);
    }
Exemple #5
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);
 }
Exemple #6
0
    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);
    }
Exemple #7
0
 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);
    }