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)); }
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); } }
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); } }
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); } }
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); }
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); }