protected override bool TryComputeArmyMissionParameter()
    {
        if (!base.AIDataArmyGUID.IsValid)
        {
            base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail;
            return(false);
        }
        AIData_Army aidata = this.aiDataRepository.GetAIData <AIData_Army>(base.AIDataArmyGUID);

        if (aidata == null || aidata.Army == null)
        {
            base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail;
            return(false);
        }
        if (aidata.Army.IsLocked || aidata.Army.IsInEncounter)
        {
            return(false);
        }
        if (this.AICommanderRegroupArmies.MissionHasAllUnits(this))
        {
            RequestGarrisonMessage requestGarrisonMessage = null;
            if (this.AICommanderRegroupArmies != null && this.AICommanderRegroupArmies.RequestUnitListMessageID != 0UL)
            {
                requestGarrisonMessage = (base.Commander.AIPlayer.Blackboard.GetMessage(this.AICommanderRegroupArmies.RequestUnitListMessageID) as RequestGarrisonMessage);
            }
            if (requestGarrisonMessage == null)
            {
                RequestGarrisonCampMessage requestGarrisonCampMessage = null;
                if (this.AICommanderRegroupArmies != null && this.AICommanderRegroupArmies.RequestUnitListMessageID != 0UL)
                {
                    requestGarrisonCampMessage = (base.Commander.AIPlayer.Blackboard.GetMessage(this.AICommanderRegroupArmies.RequestUnitListMessageID) as RequestGarrisonCampMessage);
                }
                if (requestGarrisonCampMessage == null)
                {
                    base.Completion = AICommanderMission.AICommanderMissionCompletion.Success;
                    return(false);
                }
                IGameEntity gameEntity;
                if (!this.gameEntityRepositoryService.TryGetValue(requestGarrisonCampMessage.CampGuid, out gameEntity))
                {
                    base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail;
                    return(false);
                }
                Camp camp = gameEntity as Camp;
                if (camp == null)
                {
                    base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail;
                    return(false);
                }
                if (!this.AICommanderRegroupArmies.FinalPosition.IsValid)
                {
                    this.AICommanderRegroupArmies.FinalPosition = camp.GetValidDistrictToTarget(aidata.Army).WorldPosition;
                    requestGarrisonCampMessage.FinalPosition    = this.AICommanderRegroupArmies.FinalPosition;
                }
                Army armyAtPosition = this.worldPositionningService.GetArmyAtPosition(this.AICommanderRegroupArmies.FinalPosition);
                if (armyAtPosition != null && armyAtPosition.GUID != base.AIDataArmyGUID)
                {
                    this.AICommanderRegroupArmies.FinalPosition = camp.GetValidDistrictToTarget(aidata.Army).WorldPosition;
                    requestGarrisonCampMessage.FinalPosition    = this.AICommanderRegroupArmies.FinalPosition;
                }
                bool flag = false;
                for (int i = 0; i < camp.Districts.Count; i++)
                {
                    if (camp.Districts[i].Type != DistrictType.Exploitation && camp.Districts[i].Type != DistrictType.Improvement && this.worldPositionningService.GetDistance(this.AICommanderRegroupArmies.FinalPosition, camp.Districts[i].WorldPosition) <= 1)
                    {
                        flag = true;
                        break;
                    }
                }
                if (!flag)
                {
                    this.AICommanderRegroupArmies.FinalPosition = camp.GetValidDistrictToTarget(aidata.Army).WorldPosition;
                    requestGarrisonCampMessage.FinalPosition    = this.AICommanderRegroupArmies.FinalPosition;
                }
                if (aidata.Army.WorldPosition == this.AICommanderRegroupArmies.FinalPosition)
                {
                    base.Completion = AICommanderMission.AICommanderMissionCompletion.Success;
                    return(false);
                }
            }
            else
            {
                IGameEntity gameEntity2;
                if (!this.gameEntityRepositoryService.TryGetValue(requestGarrisonMessage.CityGuid, out gameEntity2))
                {
                    base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail;
                    return(false);
                }
                City city = gameEntity2 as City;
                if (city == null)
                {
                    base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail;
                    return(false);
                }
                if (city.IsInEncounter)
                {
                    return(false);
                }
                if (city.BesiegingEmpire != null)
                {
                    base.Completion = AICommanderMission.AICommanderMissionCompletion.Fail;
                    return(false);
                }
                if (!this.AICommanderRegroupArmies.FinalPosition.IsValid)
                {
                    this.AICommanderRegroupArmies.FinalPosition = city.GetValidDistrictToTarget(aidata.Army).WorldPosition;
                    requestGarrisonMessage.FinalPosition        = this.AICommanderRegroupArmies.FinalPosition;
                }
                Army armyAtPosition2 = this.worldPositionningService.GetArmyAtPosition(this.AICommanderRegroupArmies.FinalPosition);
                if (armyAtPosition2 != null && armyAtPosition2.GUID != base.AIDataArmyGUID)
                {
                    this.AICommanderRegroupArmies.FinalPosition = city.GetValidDistrictToTarget(aidata.Army).WorldPosition;
                    requestGarrisonMessage.FinalPosition        = this.AICommanderRegroupArmies.FinalPosition;
                }
                bool flag2 = false;
                for (int j = 0; j < city.Districts.Count; j++)
                {
                    if (city.Districts[j].Type != DistrictType.Exploitation && city.Districts[j].Type != DistrictType.Improvement && this.worldPositionningService.GetDistance(this.AICommanderRegroupArmies.FinalPosition, city.Districts[j].WorldPosition) <= 1)
                    {
                        flag2 = true;
                        break;
                    }
                }
                if (!flag2)
                {
                    this.AICommanderRegroupArmies.FinalPosition = city.GetValidDistrictToTarget(aidata.Army).WorldPosition;
                    requestGarrisonMessage.FinalPosition        = this.AICommanderRegroupArmies.FinalPosition;
                }
                if (aidata.Army.WorldPosition == this.AICommanderRegroupArmies.FinalPosition)
                {
                    base.Completion = AICommanderMission.AICommanderMissionCompletion.Success;
                    return(false);
                }
            }
        }
        if (this.targetTransferArmy != null)
        {
            if (this.targetTransferArmy.Army == null)
            {
                this.targetTransferArmy = null;
            }
            else
            {
                if (!this.targetTransferArmy.Army.IsInEncounter && !this.targetTransferArmy.Army.IsLocked)
                {
                    return(false);
                }
                this.targetTransferArmy = null;
            }
        }
        foreach (AICommanderMission aicommanderMission in this.AICommanderRegroupArmies.Missions)
        {
            AICommanderMission_RegroupArmyAt aicommanderMission_RegroupArmyAt = (AICommanderMission_RegroupArmyAt)aicommanderMission;
            if (aicommanderMission_RegroupArmyAt != this && aicommanderMission_RegroupArmyAt.targetTransferArmy == aidata)
            {
                if (!aidata.Army.IsLocked && !aidata.Army.IsInEncounter)
                {
                    return(false);
                }
                aicommanderMission_RegroupArmyAt.targetTransferArmy = null;
            }
        }
        if (this.AICommanderRegroupArmies != null && this.AICommanderRegroupArmies.AIPlayer != null && this.AICommanderRegroupArmies.AIPlayer.AIEntities != null)
        {
            AIEntity_Empire aientity_Empire = this.AICommanderRegroupArmies.AIPlayer.AIEntities.Find((AIEntity match) => match is AIEntity_Empire) as AIEntity_Empire;
            if (aientity_Empire != null)
            {
                AICommanderMission_PrivateersHarass aicommanderMission_PrivateersHarass = aientity_Empire.GetCommanderMissionBasedOnItsArmyRequestArmy(this.AICommanderRegroupArmies.RequestUnitListMessageID) as AICommanderMission_PrivateersHarass;
                if (aicommanderMission_PrivateersHarass != null && aicommanderMission_PrivateersHarass.TargetCity != null && !aidata.Army.IsPrivateers && base.TryCreateArmyMission("ConvertToPrivateers", new List <object>
                {
                    aicommanderMission_PrivateersHarass.TargetCity
                }))
                {
                    base.State = TickableState.NeedTick;
                    RequestUnitListMessage requestUnitListMessage = base.Commander.AIPlayer.Blackboard.GetMessage(this.AICommanderRegroupArmies.RequestUnitListMessageID) as RequestUnitListMessage;
                    if (requestUnitListMessage != null)
                    {
                        requestUnitListMessage.ExecutionState = RequestUnitListMessage.RequestUnitListState.Regrouping;
                    }
                    return(true);
                }
            }
        }
        WorldPosition worldPosition;

        if (this.IsMaster)
        {
            if (this.IsArmyBesiegingACity(base.AIDataArmyGUID) && !aidata.Army.IsPrivateers)
            {
                return(false);
            }
            if (this.CanTransferToNearMission())
            {
                return(false);
            }
            AICommanderMission_RegroupArmyAt aicommanderMission_RegroupArmyAt2 = null;
            int num = int.MaxValue;
            foreach (AICommanderMission aicommanderMission2 in this.AICommanderRegroupArmies.Missions)
            {
                AICommanderMission_RegroupArmyAt aicommanderMission_RegroupArmyAt3 = (AICommanderMission_RegroupArmyAt)aicommanderMission2;
                if (aicommanderMission_RegroupArmyAt3 != this)
                {
                    WorldPosition unitsToRegroupPosition = aicommanderMission_RegroupArmyAt3.GetUnitsToRegroupPosition();
                    if (unitsToRegroupPosition.IsValid)
                    {
                        int distance = this.worldPositionningService.GetDistance(aidata.Army.WorldPosition, unitsToRegroupPosition);
                        if (distance < num)
                        {
                            num = distance;
                            aicommanderMission_RegroupArmyAt2 = aicommanderMission_RegroupArmyAt3;
                        }
                    }
                }
            }
            if (aicommanderMission_RegroupArmyAt2 == null)
            {
                if (!this.AICommanderRegroupArmies.FinalPosition.IsValid)
                {
                    base.Completion = AICommanderMission.AICommanderMissionCompletion.Success;
                    return(false);
                }
                worldPosition = this.AICommanderRegroupArmies.FinalPosition;
            }
            else
            {
                worldPosition = aicommanderMission_RegroupArmyAt2.GetUnitsToRegroupPosition();
            }
        }
        else
        {
            if (this.CanTransferToNearMission())
            {
                return(false);
            }
            AICommanderMission_RegroupArmyAt masterMission = this.AICommanderRegroupArmies.MasterMission;
            if (masterMission == null)
            {
                return(false);
            }
            worldPosition = masterMission.GetUnitsToRegroupPosition();
        }
        base.State = TickableState.NoTick;
        if (aidata.Army.GetPropertyValue(SimulationProperties.Movement) > 0f)
        {
            int num2 = Math.Min(4, Math.Max(1, (this.worldPositionningService.GetDistance(worldPosition, aidata.Army.WorldPosition) - 1) / 2));
            PathfindingContext pathfindingContext = aidata.Army.GenerateContext();
            pathfindingContext.Greedy = true;
            PathfindingResult pathfindingResult = this.pathfindingService.FindPath(pathfindingContext, aidata.Army.WorldPosition, worldPosition, PathfindingManager.RequestMode.Default, null, PathfindingFlags.IgnoreFogOfWar, null);
            if (pathfindingResult != null)
            {
                int           num3           = 0;
                WorldPosition worldPosition2 = WorldPosition.Invalid;
                foreach (WorldPosition worldPosition3 in pathfindingResult.GetCompletePath())
                {
                    if (worldPosition3 != pathfindingResult.Start)
                    {
                        num3++;
                        if ((num3 <= num2 || !worldPosition2.IsValid) && worldPosition3 != worldPosition && this.pathfindingService.IsTileStopable(worldPosition3, aidata.Army, (PathfindingFlags)0, null))
                        {
                            worldPosition2 = worldPosition3;
                        }
                        if (num3 >= num2 && worldPosition2.IsValid && base.TryCreateArmyMission("ReachPosition", new List <object>
                        {
                            worldPosition2
                        }))
                        {
                            base.State = TickableState.NeedTick;
                            this.SetRequestMessageExecutionState(RequestUnitListMessage.RequestUnitListState.Regrouping);
                            return(true);
                        }
                    }
                }
            }
            if (base.Commander.Empire.SimulationObject.Tags.Contains(FactionTrait.FactionTraitMimics1))
            {
                DepartmentOfTheInterior agency = base.Commander.Empire.GetAgency <DepartmentOfTheInterior>();
                if (agency.NonInfectedCities.Count > 0 && base.TryCreateArmyMission("ReachPositionMykara", new List <object>
                {
                    agency.NonInfectedCities[0].WorldPosition
                }))
                {
                    base.State = TickableState.NeedTick;
                    this.SetRequestMessageExecutionState(RequestUnitListMessage.RequestUnitListState.Regrouping);
                    return(true);
                }
            }
        }
        return(false);
    }
Exemple #2
0
 ushort[] ICadasterService.Connect(City city, PathfindingMovementCapacity movementCapacity, bool proxied)
 {
     if (city == null)
     {
         throw new ArgumentNullException("city");
     }
     if ((movementCapacity & PathfindingMovementCapacity.Water) == PathfindingMovementCapacity.Water)
     {
         StaticString  type  = new StaticString("DistrictImprovement");
         StaticString  y     = new StaticString("DistrictImprovementDocks");
         WorldPosition start = WorldPosition.Invalid;
         for (int i = 0; i < city.Districts.Count; i++)
         {
             District district = city.Districts[i];
             if (district.Type == DistrictType.Improvement && district.GetDescriptorNameFromType(type) == y)
             {
                 start = district.WorldPosition;
                 break;
             }
         }
         if (!start.IsValid)
         {
             return(null);
         }
         DepartmentOfForeignAffairs agency = city.Empire.GetAgency <DepartmentOfForeignAffairs>();
         this.OceanPathfindingWorldContext.RegionIndexList.Clear();
         this.OceanPathfindingWorldContext.RegionIndexList.Add((int)this.WorldPositionningService.GetRegionIndex(city.WorldPosition));
         for (int j = 0; j < city.Region.Borders.Length; j++)
         {
             Region region = this.WorldPositionningService.GetRegion(city.Region.Borders[j].NeighbourRegionIndex);
             if (region.Owner == null || !(region.Owner is MajorEmpire) || region.Owner.Index == city.Empire.Index || agency.GetDiplomaticRelation(region.Owner).HasActiveAbility(DiplomaticAbilityDefinition.TradeRoute))
             {
                 this.OceanPathfindingWorldContext.RegionIndexList.Add(city.Region.Borders[j].NeighbourRegionIndex);
             }
         }
         Diagnostics.Assert(city.CadastralMap != null);
         Diagnostics.Assert((city.CadastralMap.ConnectedMovementCapacity & PathfindingMovementCapacity.Water) == PathfindingMovementCapacity.Water);
         List <ushort> list  = new List <ushort>();
         List <Region> list2 = new List <Region>();
         List <Region> list3 = new List <Region>();
         list3.Add(city.Region);
         int k = 0;
         int l = 2;
         while (l > 0)
         {
             l--;
             list2.AddRange(list3);
             list3.Clear();
             while (k < list2.Count)
             {
                 Region region2 = list2[k];
                 for (int m = 0; m < region2.Borders.Length; m++)
                 {
                     short  regionIndex = (short)region2.Borders[m].NeighbourRegionIndex;
                     Region region3     = this.WorldPositionningService.GetRegion((int)regionIndex);
                     if (region3 != null && !list2.Contains(region3))
                     {
                         if (region3.City != null)
                         {
                             Diagnostics.Assert(region3.City.CadastralMap != null);
                             if ((region3.City.CadastralMap.ConnectedMovementCapacity & PathfindingMovementCapacity.Water) == PathfindingMovementCapacity.Water)
                             {
                                 for (int n = 0; n < region3.City.Districts.Count; n++)
                                 {
                                     District district2 = region3.City.Districts[n];
                                     if (district2.Type == DistrictType.Improvement && district2.GetDescriptorNameFromType(type) == y)
                                     {
                                         PathfindingFlags pathfindingFlags = PathfindingFlags.IgnoreAll;
                                         pathfindingFlags &= ~PathfindingFlags.IgnoreMovementCapacities;
                                         pathfindingFlags &= ~PathfindingFlags.IgnorePOI;
                                         PathfindingContext pathfindingContext = new PathfindingContext(GameEntityGUID.Zero, city.Empire, PathfindingMovementCapacity.Water);
                                         pathfindingContext.RefreshProperties(1f, 1f, false, false, 1f, 1f);
                                         bool flag = false;
                                         if (!this.OceanPathfindingWorldContext.RegionIndexList.Contains(region2.Borders[m].NeighbourRegionIndex))
                                         {
                                             flag = true;
                                             this.OceanPathfindingWorldContext.RegionIndexList.Add(region2.Borders[m].NeighbourRegionIndex);
                                         }
                                         PathfindingResult pathfindingResult = this.PathfindingService.FindPath(pathfindingContext, start, district2.WorldPosition, PathfindingManager.RequestMode.Default, this.OceanPathfindingWorldContext, pathfindingFlags, null);
                                         if (flag)
                                         {
                                             this.OceanPathfindingWorldContext.RegionIndexList.Remove(region2.Borders[m].NeighbourRegionIndex);
                                         }
                                         if (pathfindingResult == null)
                                         {
                                             pathfindingResult = this.PathfindingService.FindPath(pathfindingContext, start, district2.WorldPosition, PathfindingManager.RequestMode.Default, null, pathfindingFlags, null);
                                         }
                                         if (pathfindingResult != null)
                                         {
                                             ushort item = this.Reserve(new Road
                                             {
                                                 FromRegion     = (short)city.Region.Index,
                                                 ToRegion       = (short)region3.Index,
                                                 WorldPositions = pathfindingResult.GetCompletePath().ToArray <WorldPosition>(),
                                                 PathfindingMovementCapacity = PathfindingMovementCapacity.Water
                                             });
                                             list.Add(item);
                                         }
                                     }
                                 }
                             }
                         }
                         if (region3.IsOcean)
                         {
                             list3.AddOnce(region3);
                         }
                         else
                         {
                             list2.Insert(k, region3);
                             k++;
                         }
                     }
                 }
                 k++;
             }
         }
         this.OceanPathfindingWorldContext.RegionIndexList.Clear();
         return(list.ToArray());
     }
     else
     {
         if (city.Region.Borders != null)
         {
             List <ushort> list4 = new List <ushort>();
             for (int num = 0; num < city.Region.Borders.Length; num++)
             {
                 short  regionIndex2 = (short)city.Region.Borders[num].NeighbourRegionIndex;
                 Region region4      = this.WorldPositionningService.GetRegion((int)regionIndex2);
                 if (region4 != null && region4.City != null)
                 {
                     if (proxied)
                     {
                         if ((movementCapacity & PathfindingMovementCapacity.Ground) != PathfindingMovementCapacity.Ground)
                         {
                             goto IL_75D;
                         }
                         Diagnostics.Assert(region4.City.CadastralMap != null);
                         if ((region4.City.CadastralMap.ConnectedMovementCapacity & PathfindingMovementCapacity.Ground) != PathfindingMovementCapacity.Ground)
                         {
                             goto IL_75D;
                         }
                     }
                     bool flag2 = false;
                     if (region4.City.CadastralMap.Roads != null)
                     {
                         for (int num2 = 0; num2 < region4.City.CadastralMap.Roads.Count; num2++)
                         {
                             ushort num3 = region4.City.CadastralMap.Roads[num2];
                             Road   road = this.roads[(int)num3];
                             if (road != null && (city.Region.Index == (int)road.FromRegion || city.Region.Index == (int)road.ToRegion) && (road.PathfindingMovementCapacity & movementCapacity) != PathfindingMovementCapacity.None)
                             {
                                 if (this.RoadModified != null)
                                 {
                                     this.RoadModified(this, new RoadEventArgs(num3, road));
                                 }
                                 flag2 = true;
                                 list4.Add(num3);
                             }
                         }
                     }
                     if (!flag2)
                     {
                         PathfindingFlags pathfindingFlags2 = PathfindingFlags.IgnoreAll;
                         pathfindingFlags2 &= ~PathfindingFlags.IgnoreMovementCapacities;
                         pathfindingFlags2 &= ~PathfindingFlags.IgnorePOI;
                         pathfindingFlags2 &= ~PathfindingFlags.IgnoreRoad;
                         PathfindingContext pathfindingContext2 = new PathfindingContext(GameEntityGUID.Zero, city.Empire, movementCapacity);
                         pathfindingContext2.RefreshProperties(1f, 1f, false, false, 1f, 1f);
                         pathfindingContext2.RemoveMovementCapacity(PathfindingMovementCapacity.FrozenWater);
                         Diagnostics.Assert(this.pathfindingWorldContext != null && this.pathfindingWorldContext.RegionIndexList != null && this.pathfindingWorldContext.RegionIndexList.Count == 2);
                         this.pathfindingWorldContext.RegionIndexList[0] = (int)this.WorldPositionningService.GetRegionIndex(city.WorldPosition);
                         this.pathfindingWorldContext.RegionIndexList[1] = (int)this.WorldPositionningService.GetRegionIndex(region4.City.WorldPosition);
                         PathfindingResult pathfindingResult2 = this.PathfindingService.FindPath(pathfindingContext2, city.WorldPosition, region4.City.WorldPosition, PathfindingManager.RequestMode.Default, this.pathfindingWorldContext, pathfindingFlags2, null);
                         if (pathfindingResult2 == null)
                         {
                             pathfindingFlags2 |= PathfindingFlags.IgnorePOI;
                             pathfindingResult2 = this.PathfindingService.FindPath(pathfindingContext2, city.WorldPosition, region4.City.WorldPosition, PathfindingManager.RequestMode.Default, this.pathfindingWorldContext, pathfindingFlags2, null);
                         }
                         if (pathfindingResult2 != null)
                         {
                             ushort item2 = this.Reserve(new Road
                             {
                                 FromRegion     = (short)city.Region.Index,
                                 ToRegion       = (short)region4.Index,
                                 WorldPositions = pathfindingResult2.GetCompletePath().ToList <WorldPosition>().ToArray(),
                                 PathfindingMovementCapacity = movementCapacity
                             });
                             list4.Add(item2);
                         }
                     }
                 }
                 IL_75D :;
             }
             return(list4.ToArray());
         }
         return(null);
     }
 }
Exemple #3
0
    private bool BuildWorldPath()
    {
        this.TemporaryWorldPath.Clear();
        if (this.LastHighlightedWorldPosition == WorldPosition.Invalid)
        {
            return(false);
        }
        if (base.IsTransferable(WorldCursor.HighlightedWorldPosition))
        {
            return(false);
        }
        if ((!base.PathfindingService.IsTileStopable(this.LastHighlightedWorldPosition, base.PathfindingContext, (PathfindingFlags)0, null) || !base.PathfindingService.IsTilePassable(this.LastHighlightedWorldPosition, base.PathfindingContext, (PathfindingFlags)0, null) || this.OtherEmpireCreepingNodeAtPosition(this.Army.Empire, this.LastHighlightedWorldPosition)) && base.PathfindingService.IsTransitionPassable(this.GarrisonPosition, this.LastHighlightedWorldPosition, base.PathfindingContext, PathfindingFlags.IgnoreArmies | PathfindingFlags.IgnoreOtherEmpireDistrict | PathfindingFlags.IgnoreDiplomacy | PathfindingFlags.IgnorePOI | PathfindingFlags.IgnoreSieges | PathfindingFlags.IgnoreKaijuGarrisons, null))
        {
            return(true);
        }
        PathfindingFlags pathfindingFlags = PathfindingFlags.IgnoreArmies;
        District         district         = base.WorldPositionningService.GetDistrict(this.GarrisonPosition);

        if (district != null && (district.Type == DistrictType.Center || district.Type == DistrictType.Extension) && district.City != null && district.City.BesiegingEmpireIndex != -1)
        {
            pathfindingFlags &= ~PathfindingFlags.IgnoreArmies;
        }
        Army army = null;

        if (this.LastHighlightedWorldPosition != WorldPosition.Invalid)
        {
            army = base.WorldPositionningService.GetArmyAtPosition(this.LastHighlightedWorldPosition);
        }
        bool flag  = base.VisibilityService.IsWorldPositionDetectedFor(this.LastHighlightedWorldPosition, this.Army.Empire) || (army != null && !army.IsCamouflaged);
        bool flag2 = base.WorldPositionningService.GetDistance(this.GarrisonPosition, this.LastHighlightedWorldPosition) <= this.Army.LineOfSightVisionRange;

        if (flag && flag2)
        {
            pathfindingFlags &= ~PathfindingFlags.IgnoreArmies;
        }
        PathfindingResult pathfindingResult = base.PathfindingService.FindPath(base.PathfindingContext, this.GarrisonPosition, this.LastHighlightedWorldPosition, PathfindingManager.RequestMode.Default, null, pathfindingFlags, null);

        if (base.WorldPositionningService != null && pathfindingResult != null && this.LastHighlightedWorldPosition != WorldPosition.Invalid)
        {
            if (!base.PathfindingService.IsTileStopable(this.LastHighlightedWorldPosition, base.PathfindingContext, (PathfindingFlags)0, null))
            {
                WorldPosition lastHighlightedWorldPosition = this.LastHighlightedWorldPosition;
                WorldPosition position = pathfindingResult.GetCompletePath().Last <WorldPosition>();
                bool          flag3    = base.WorldPositionningService.IsWaterTile(lastHighlightedWorldPosition);
                bool          flag4    = base.WorldPositionningService.IsWaterTile(position);
                if (flag3 != flag4)
                {
                    World world = (base.GameService.Game as global::Game).World;
                    List <WorldPosition> neighbours = lastHighlightedWorldPosition.GetNeighbours(world.WorldParameters);
                    List <WorldPosition> list       = new List <WorldPosition>();
                    for (int i = 0; i < neighbours.Count; i++)
                    {
                        if (base.WorldPositionningService.IsWaterTile(neighbours[i]) == flag3 && !base.WorldPositionningService.HasRidge(neighbours[i]) && base.PathfindingService.IsTileStopable(neighbours[i], base.PathfindingContext, (PathfindingFlags)0, null))
                        {
                            list.Add(neighbours[i]);
                        }
                    }
                    if (list.Count > 0)
                    {
                        PathfindingResult pathfindingResult2 = null;
                        float             num = float.MaxValue;
                        for (int j = 0; j < list.Count; j++)
                        {
                            PathfindingResult pathfindingResult3 = base.PathfindingService.FindPath(base.PathfindingContext, this.GarrisonPosition, list[j], PathfindingManager.RequestMode.Default, null, pathfindingFlags, null);
                            if (pathfindingResult3 != null && pathfindingResult3.GetCost() < num)
                            {
                                num = pathfindingResult3.GetCost();
                                pathfindingResult2 = pathfindingResult3;
                            }
                        }
                        if (pathfindingResult2 != null)
                        {
                            pathfindingResult = pathfindingResult2;
                        }
                    }
                }
            }
            else if (this.OtherEmpireCreepingNodeAtPosition(this.Army.Empire, this.LastHighlightedWorldPosition))
            {
                List <WorldPosition> list2 = pathfindingResult.GetCompletePath().ToList <WorldPosition>();
                if (list2.Count > 0)
                {
                    list2.RemoveAt(list2.Count - 1);
                    PathfindingResult pathfindingResult4 = base.PathfindingService.FindPath(base.PathfindingContext, this.GarrisonPosition, list2.Last <WorldPosition>(), PathfindingManager.RequestMode.Default, null, pathfindingFlags, null);
                    if (pathfindingResult4 != null)
                    {
                        pathfindingResult = pathfindingResult4;
                        this.TemporaryWorldPath.Build(pathfindingResult, this.WorldArmy.Army.GetPropertyValue(SimulationProperties.MovementRatio), int.MaxValue, false);
                        return(true);
                    }
                }
            }
        }
        if (pathfindingResult == null)
        {
            return(base.PathfindingService.IsTransitionPassable(this.GarrisonPosition, this.LastHighlightedWorldPosition, base.PathfindingContext, PathfindingFlags.IgnoreArmies | PathfindingFlags.IgnoreOtherEmpireDistrict | PathfindingFlags.IgnoreDiplomacy | PathfindingFlags.IgnorePOI | PathfindingFlags.IgnoreSieges | PathfindingFlags.IgnoreKaijuGarrisons, null));
        }
        Army army2 = this.WorldArmy.Army;

        this.TemporaryWorldPath.Build(pathfindingResult, army2.GetPropertyValue(SimulationProperties.MovementRatio), int.MaxValue, false);
        return(true);
    }