Example #1
0
    public bool CanExecuteDeviceDismantling(Army army, TerraformDevice device)
    {
        IPathfindingService service = base.Game.Services.GetService <IPathfindingService>();

        Diagnostics.Assert(service != null);
        int distance = this.WorldPositionningService.GetDistance(army.WorldPosition, device.WorldPosition);

        if (distance > 1)
        {
            return(false);
        }
        PathfindingFlags flags = PathfindingFlags.IgnoreArmies | PathfindingFlags.IgnoreOtherEmpireDistrict | PathfindingFlags.IgnoreDiplomacy | PathfindingFlags.IgnoreFogOfWar | PathfindingFlags.IgnoreSieges | PathfindingFlags.IgnoreKaijuGarrisons;

        return(service.IsTransitionPassable(army.WorldPosition, device.WorldPosition, army, flags, null));
    }
Example #2
0
 private bool CanToggleOverDevice(Army army, TerraformDevice device, ref List <StaticString> failureFlags)
 {
     if (army == null || device == null || device.Empire == army.Empire)
     {
         failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
         return(false);
     }
     if (device.DismantlingArmy != null)
     {
         if (device.DismantlingArmy == army)
         {
             return(true);
         }
         failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
         return(false);
     }
     else
     {
         IGameService service = Services.GetService <IGameService>();
         Diagnostics.Assert(service != null);
         IWorldPositionningService service2 = service.Game.Services.GetService <IWorldPositionningService>();
         Diagnostics.Assert(service2 != null);
         Army armyAtPosition = service2.GetArmyAtPosition(device.WorldPosition);
         if (device != null && device.DismantlingArmy == null && armyAtPosition != null && device.Empire.Index != army.Empire.Index)
         {
             failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
             return(false);
         }
         if (device.Empire != army.Empire && army.Empire is MajorEmpire && !(device.Empire is LesserEmpire))
         {
             DiplomaticRelation diplomaticRelation = army.Empire.GetAgency <DepartmentOfForeignAffairs>().DiplomaticRelations[device.Empire.Index];
             if (diplomaticRelation != null && diplomaticRelation.State != null && (diplomaticRelation.State.Name == DiplomaticRelationState.Names.Alliance || diplomaticRelation.State.Name == DiplomaticRelationState.Names.Peace))
             {
                 failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
                 return(false);
             }
         }
         IPathfindingService service3 = service.Game.Services.GetService <IPathfindingService>();
         Diagnostics.Assert(service3 != null);
         PathfindingFlags flags = PathfindingFlags.IgnoreArmies | PathfindingFlags.IgnoreOtherEmpireDistrict | PathfindingFlags.IgnoreDiplomacy | PathfindingFlags.IgnoreFogOfWar | PathfindingFlags.IgnoreSieges | PathfindingFlags.IgnoreKaijuGarrisons;
         if (!service3.IsTransitionPassable(army.WorldPosition, device.WorldPosition, army, flags, null))
         {
             failureFlags.Add(ArmyAction.NoCanDoWhileHidden);
             return(false);
         }
         return(true);
     }
 }
Example #3
0
    protected override State Execute(AIBehaviorTree aiBehaviorTree, params object[] parameters)
    {
        Army army;

        if (base.GetArmyUnlessLocked(aiBehaviorTree, "$Army", out army) != AIArmyMission.AIArmyMissionErrorCode.None)
        {
            return(State.Failure);
        }
        if (this.currentTicket != null)
        {
            if (!this.currentTicket.Raised)
            {
                return(State.Running);
            }
            bool flag = this.currentTicket.PostOrderResponse == PostOrderResponse.PreprocessHasFailed || this.currentTicket.PostOrderResponse == PostOrderResponse.AuthenticationHasFailed;
            this.currentTicket = null;
            if (flag)
            {
                aiBehaviorTree.ErrorCode = 29;
                aiBehaviorTree.LogWarning("OrderGotoFail", new object[0]);
                return(State.Failure);
            }
            if (army.GetPropertyValue(SimulationProperties.Movement) > 1.401298E-45f)
            {
                aiBehaviorTree.ErrorCode = 28;
                return(State.Running);
            }
            return(State.Success);
        }
        else
        {
            if (army.IsMoving)
            {
                return(State.Running);
            }
            if (!aiBehaviorTree.Variables.ContainsKey(this.PathVarName))
            {
                aiBehaviorTree.LogError("{0} not set", new object[]
                {
                    this.PathVarName
                });
                return(State.Failure);
            }
            WorldPath worldPath = aiBehaviorTree.Variables[this.PathVarName] as WorldPath;
            if (worldPath == null || worldPath.Length < 2)
            {
                aiBehaviorTree.LogError("Path is null.", new object[0]);
                aiBehaviorTree.ErrorCode = 3;
                return(State.Failure);
            }
            if (!worldPath.IsValid)
            {
                aiBehaviorTree.ErrorCode = 3;
                return(State.Failure);
            }
            if (this.TypeOfMove.Equals("AvoidEnemy") && this.IsEnemyDetectedOnPath(army))
            {
                aiBehaviorTree.ErrorCode = 23;
                return(State.Failure);
            }
            int num = -1;
            for (int i = 0; i < worldPath.WorldPositions.Length; i++)
            {
                if (worldPath.WorldPositions[i] == army.WorldPosition)
                {
                    num = i;
                    break;
                }
            }
            if (num == worldPath.Length - 1)
            {
                return(State.Success);
            }
            if (num == -1)
            {
                return(State.Failure);
            }
            if (this.ArmyCanTeleport == AIBehaviorTreeNode_Action_Move.TeleportState.NotChecked)
            {
                this.ArmyCanTeleport = AIBehaviorTreeNode_Action_Move.TeleportState.HasTeleport;
                if (!army.IsSolitary || !(army.Empire is MajorEmpire))
                {
                    this.ArmyCanTeleport = AIBehaviorTreeNode_Action_Move.TeleportState.NoTeleport;
                }
                else
                {
                    using (IEnumerator <Unit> enumerator = army.Units.GetEnumerator())
                    {
                        while (enumerator.MoveNext())
                        {
                            if (!enumerator.Current.CheckUnitAbility("UnitAbilityTeleportInRange", -1))
                            {
                                this.ArmyCanTeleport = AIBehaviorTreeNode_Action_Move.TeleportState.NoTeleport;
                                break;
                            }
                        }
                    }
                }
            }
            if (this.ArmyCanTeleport == AIBehaviorTreeNode_Action_Move.TeleportState.HasTeleport && Amplitude.Unity.Framework.Application.Preferences.EnableModdingTools)
            {
                Diagnostics.Log("ELCP {0} Army {1} has teleport {2} {3} {4} {5}", new object[]
                {
                    army.Empire,
                    army.LocalizedName,
                    worldPath.Destination,
                    worldPath.Length,
                    worldPath.ControlPoints.Length,
                    num
                });
            }
            if (this.ArmyCanTeleport == AIBehaviorTreeNode_Action_Move.TeleportState.HasTeleport && worldPath.ControlPoints.Length != 0 && worldPath.ControlPoints.Any((ushort cp) => cp > (ushort)num) && this.TryTeleportInRange(aiBehaviorTree, army, worldPath, num))
            {
                return(State.Running);
            }
            WorldPosition worldPosition = WorldPosition.Invalid;
            int           num3          = -1;
            int           num2          = 0;
            int           k;
            int           j;
            for (j = num + 1; j < worldPath.WorldPositions.Length; j = k + 1)
            {
                if (this.pathfindingService.IsTilePassable(worldPath.WorldPositions[j], army, (PathfindingFlags)0, null) && this.pathfindingService.IsTileStopable(worldPath.WorldPositions[j], army, (PathfindingFlags)0, null))
                {
                    worldPosition = worldPath.WorldPositions[j];
                    num2++;
                    if (num2 > 1)
                    {
                        break;
                    }
                }
                else if (worldPath.ControlPoints.Length != 0 && Array.Exists <ushort>(worldPath.ControlPoints, (ushort p) => (int)p == j))
                {
                    num3 = j;
                }
                k = j;
            }
            if (num3 >= 0)
            {
                List <WorldPosition> neighbours     = worldPath.WorldPositions[num3].GetNeighbours(this.game.World.WorldParameters);
                WorldPosition        worldPosition2 = (num3 > 0) ? worldPath.WorldPositions[num3 - 1] : army.WorldPosition;
                List <WorldPosition> neighbours2    = worldPosition2.GetNeighbours(this.game.World.WorldParameters);
                PathfindingFlags     flags          = PathfindingFlags.IgnoreArmies | PathfindingFlags.IgnoreOtherEmpireDistrict | PathfindingFlags.IgnoreDiplomacy | PathfindingFlags.IgnoreEncounterAreas | PathfindingFlags.IgnoreFogOfWar | PathfindingFlags.IgnoreZoneOfControl | PathfindingFlags.IgnorePOI | PathfindingFlags.IgnoreSieges | PathfindingFlags.IgnoreDistrict;
                if (Amplitude.Unity.Framework.Application.Preferences.EnableModdingTools)
                {
                    Diagnostics.Log("ELCP {0}/{1} AIBehaviorTreeNode_Action_Move posses: {2}/{3}", new object[]
                    {
                        army.Empire,
                        army.LocalizedName,
                        worldPosition2,
                        worldPath.WorldPositions[num3]
                    });
                }
                foreach (WorldPosition worldPosition3 in neighbours)
                {
                    if (Amplitude.Unity.Framework.Application.Preferences.EnableModdingTools)
                    {
                        Diagnostics.Log("ELCP {0}/{1} AIBehaviorTreeNode_Action_Move checking neighbor {2} {3} {4} {5} {6}", new object[]
                        {
                            army.Empire,
                            army.LocalizedName,
                            worldPosition3,
                            neighbours2.Contains(worldPosition3),
                            this.pathfindingService.IsTileStopable(worldPosition3, army, (PathfindingFlags)0, null),
                            this.pathfindingService.IsTransitionPassable(worldPosition2, worldPosition3, army, flags, null),
                            this.pathfindingService.IsTransitionPassable(worldPosition3, worldPath.WorldPositions[num3], army, flags, null)
                        });
                    }
                    if (neighbours2.Contains(worldPosition3) && this.pathfindingService.IsTileStopable(worldPosition3, army, (PathfindingFlags)0, null) && this.pathfindingService.IsTransitionPassable(worldPosition2, worldPosition3, army, flags, null) && this.pathfindingService.IsTransitionPassable(worldPosition3, worldPath.WorldPositions[num3], army, flags, null))
                    {
                        if (Amplitude.Unity.Framework.Application.Preferences.EnableModdingTools)
                        {
                            Diagnostics.Log("ELCP {0}/{1} AIBehaviorTreeNode_Action_Move {2} is a suitable alternative goal", new object[]
                            {
                                army.Empire,
                                army.LocalizedName,
                                worldPosition3
                            });
                        }
                        worldPosition = worldPosition3;
                        break;
                    }
                }
            }
            if (worldPosition == WorldPosition.Invalid)
            {
                aiBehaviorTree.ErrorCode = 3;
                return(State.Failure);
            }
            OrderGoTo orderGoTo = new OrderGoTo(army.Empire.Index, army.GUID, worldPosition);
            orderGoTo.Flags = PathfindingFlags.IgnoreFogOfWar;
            aiBehaviorTree.AICommander.Empire.PlayerControllers.AI.PostOrder(orderGoTo, out this.currentTicket, null);
            return(State.Running);
        }
    }
Example #4
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);
     }
 }
Example #5
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);
    }
Example #6
0
    public bool UpdateRegionDataPathes(AIRegionData regionData)
    {
        global::Empire      empire = base.Game.Empires[regionData.EmpireIndex];
        DepartmentOfScience agency = empire.GetAgency <DepartmentOfScience>();

        if (empire.GetAgency <DepartmentOfTheInterior>().Cities.Count <= 0)
        {
            return(true);
        }
        Region             region             = this.world.Regions[regionData.RegionIndex];
        PathfindingContext pathfindingContext = new PathfindingContext(GameEntityGUID.Zero, null, (!agency.HaveResearchedShipTechnology()) ? (PathfindingMovementCapacity.Ground | PathfindingMovementCapacity.FrozenWater) : (PathfindingMovementCapacity.Ground | PathfindingMovementCapacity.Water | PathfindingMovementCapacity.FrozenWater));

        pathfindingContext.RefreshProperties(1f, float.PositiveInfinity, false, false, float.PositiveInfinity, float.PositiveInfinity);
        pathfindingContext.Greedy = true;
        PathfindingFlags flags = PathfindingFlags.IgnoreArmies | PathfindingFlags.IgnoreEncounterAreas | PathfindingFlags.IgnoreFogOfWar | PathfindingFlags.IgnoreZoneOfControl;

        regionData.NormalPath = null;
        foreach (AIRegionData airegionData in this.regionDataByEmpires[empire.Index])
        {
            if (airegionData.IsColonizedByMe)
            {
                Region            region2           = this.world.Regions[airegionData.RegionIndex];
                PathfindingResult pathfindingResult = this.pathfindingService.FindPath(pathfindingContext, region2.City.WorldPosition, region.Barycenter, PathfindingManager.RequestMode.Default, null, flags, null);
                if (pathfindingResult != null && (regionData.NormalPath == null || regionData.NormalPath.CompletPathLength > pathfindingResult.CompletPathLength))
                {
                    regionData.NormalPath = pathfindingResult;
                }
            }
        }
        AISafetyData aisafetyData = this.safetyDataByEmpires[regionData.EmpireIndex];

        if (regionData.NormalPath != null && aisafetyData.UnsafeRegionIndexes.Count > 0)
        {
            bool flag = false;
            foreach (WorldPosition position in regionData.NormalPath.GetCompletePath())
            {
                int regionIndex = (int)this.worldPositionningService.GetRegionIndex(position);
                if (aisafetyData.UnsafeRegionIndexes.Contains(regionIndex))
                {
                    flag = true;
                    break;
                }
            }
            if (flag)
            {
                if (!aisafetyData.UnsafeRegionIndexes.Contains(region.Index))
                {
                    regionData.SafePath = null;
                    foreach (AIRegionData airegionData2 in this.regionDataByEmpires[empire.Index])
                    {
                        if (airegionData2.IsColonizedByMe)
                        {
                            Region            region3            = this.world.Regions[airegionData2.RegionIndex];
                            PathfindingResult pathfindingResult2 = this.pathfindingService.FindPath(pathfindingContext, region3.City.WorldPosition, region.Barycenter, PathfindingManager.RequestMode.Default, aisafetyData.SafePathfindingContext, flags, null);
                            if (pathfindingResult2 != null && (regionData.SafePath == null || regionData.SafePath.CompletPathLength > pathfindingResult2.CompletPathLength))
                            {
                                regionData.SafePath = pathfindingResult2;
                            }
                        }
                    }
                }
                else
                {
                    regionData.SafePath = null;
                }
            }
            else
            {
                regionData.SafePath = regionData.NormalPath;
            }
        }
        return(false);
    }