private bool CanReachPositionInTurn(Army army, WorldPosition destination, int maximumNumberOfTurns, out int numberOfTurns) { numberOfTurns = maximumNumberOfTurns; IGameService service = Services.GetService <IGameService>(); Diagnostics.Assert(service != null); IPathfindingService service2 = service.Game.Services.GetService <IPathfindingService>(); Diagnostics.Assert(service2 != null); if (army.WorldPosition.Equals(destination)) { return(true); } PathfindingContext pathfindingContext = army.GenerateContext(); pathfindingContext.Greedy = true; PathfindingResult pathfindingResult = service2.FindPath(pathfindingContext, army.WorldPosition, destination, PathfindingManager.RequestMode.Default, null, PathfindingFlags.IgnoreFogOfWar, null); if (pathfindingResult == null) { return(false); } WorldPath worldPath = new WorldPath(); worldPath.Build(pathfindingResult, army.GetPropertyValue(SimulationProperties.MovementRatio), maximumNumberOfTurns, false); numberOfTurns = worldPath.ControlPoints.Length; if (worldPath.ControlPoints.Length < maximumNumberOfTurns) { return(true); } WorldPosition left = worldPath.WorldPositions[(int)worldPath.ControlPoints[maximumNumberOfTurns - 1]]; return(left == destination && left == worldPath.WorldPositions[worldPath.Length - 1]); }
private bool IsDetourWorthChecking(Army army, WorldPosition opportunityPosition, WorldPosition mainTargetPosition, out int numberOfTurnsTillMainTarget, out int numberOfTurnsAfterDetour) { int num = 0; int num2 = 0; int num3 = 0; numberOfTurnsTillMainTarget = 0; numberOfTurnsAfterDetour = 0; PathfindingContext pathfindingContext = army.GenerateContext(); pathfindingContext.Greedy = true; PathfindingResult pathfindingResult = this.pathfindingService.FindPath(pathfindingContext, army.WorldPosition, opportunityPosition, PathfindingManager.RequestMode.Default, null, PathfindingFlags.IgnoreFogOfWar, null); if (pathfindingResult == null) { if (this.worldPositionningService.GetDistance(army.WorldPosition, opportunityPosition) != 1) { return(false); } } else { num = pathfindingResult.CompletPathLength; } PathfindingResult pathfindingResult2 = this.pathfindingService.FindPath(pathfindingContext, army.WorldPosition, mainTargetPosition, PathfindingManager.RequestMode.Default, null, PathfindingFlags.IgnoreFogOfWar, null); if (pathfindingResult2 == null) { if (this.worldPositionningService.GetDistance(army.WorldPosition, mainTargetPosition) != 1) { return(false); } } else { num2 = pathfindingResult2.CompletPathLength; } if (num2 < num) { return(false); } PathfindingResult pathfindingResult3 = this.pathfindingService.FindPath(pathfindingContext, opportunityPosition, mainTargetPosition, PathfindingManager.RequestMode.Default, null, PathfindingFlags.IgnoreFogOfWar, null); if (pathfindingResult3 == null) { if (this.worldPositionningService.GetDistance(opportunityPosition, mainTargetPosition) != 1) { return(false); } } else { num3 = pathfindingResult3.CompletPathLength; } float propertyValue = army.GetPropertyValue(SimulationProperties.MaximumMovement); numberOfTurnsTillMainTarget = (int)((float)num2 / propertyValue); numberOfTurnsAfterDetour = (int)((float)(num + num3) / propertyValue); return(true); }
private bool POIAccessible(PointOfInterest POI) { IGameService service = Services.GetService <IGameService>(); IPathfindingService service2 = service.Game.Services.GetService <IPathfindingService>(); IWorldPositionningService service3 = service.Game.Services.GetService <IWorldPositionningService>(); PathfindingContext pathfindingContext = new PathfindingContext(GameEntityGUID.Zero, base.Empire, PathfindingMovementCapacity.Ground | PathfindingMovementCapacity.FrozenWater); pathfindingContext.RefreshProperties(1f, float.PositiveInfinity, false, false, float.PositiveInfinity, float.PositiveInfinity); foreach (WorldPosition worldPosition in WorldPosition.GetDirectNeighbourTiles(POI.WorldPosition)) { if (Amplitude.Unity.Framework.Application.Preferences.EnableModdingTools) { Diagnostics.Log("ELCP {0} AICommander_Victory POIAccessible checking {1}/{2}", new object[] { base.Empire, POI.WorldPosition, worldPosition }); } if ((!service3.IsWaterTile(worldPosition) || service3.IsFrozenWaterTile(worldPosition)) && service2.IsTileStopable(worldPosition, pathfindingContext, PathfindingFlags.IgnoreArmies | PathfindingFlags.IgnoreFogOfWar, null) && service2.IsTransitionPassable(worldPosition, POI.WorldPosition, pathfindingContext, PathfindingFlags.IgnoreArmies | PathfindingFlags.IgnoreFogOfWar | PathfindingFlags.IgnorePOI, null)) { if (Amplitude.Unity.Framework.Application.Preferences.EnableModdingTools) { Diagnostics.Log("valid"); } return(true); } if (Amplitude.Unity.Framework.Application.Preferences.EnableModdingTools) { Diagnostics.Log("not valid"); } } return(false); }
private WorldPath ComputeSafePathOpportunity(Army army, WorldPosition destination, WorldPath unsafePath) { if (this.SafePathOpportunityMax < 1f) { return(unsafePath); } bool flag = true; for (int i = 0; i < unsafePath.ControlPoints.Length; i++) { if (this.worldPositionningService.HasRetaliationFor(unsafePath.WorldPositions[(int)unsafePath.ControlPoints[i]], army.Empire)) { flag = false; break; } } if (!flag) { PathfindingContext pathfindingContext = army.GenerateContext(); pathfindingContext.Greedy = true; PathfindingResult pathfindingResult = this.pathfindingService.FindPath(pathfindingContext, army.WorldPosition, destination, PathfindingManager.RequestMode.AvoidToBeHurtByDefensiveTiles, null, this.currentFlags, null); if (pathfindingResult != null) { WorldPath worldPath = new WorldPath(); worldPath.Build(pathfindingResult, army.GetPropertyValue(SimulationProperties.MovementRatio), this.numberOfTurnForWorldPath, false); if (worldPath.IsValid && (float)worldPath.ControlPoints.Length < this.SafePathOpportunityMax * (float)unsafePath.ControlPoints.Length) { return(worldPath); } } } return(unsafePath); }
private bool CanPathToRegion(Region region) { foreach (Region region2 in this.worldPositionningService.GetNeighbourRegions(region, false, false)) { if (region2.Owner != null && region2.Owner.Index == base.AIEntity.Empire.Index) { return(true); } } PathfindingContext pathfindingContext; if (this.PathingOrigin is Army) { pathfindingContext = (this.PathingOrigin as Army).GenerateContext(); } else { pathfindingContext = new PathfindingContext(GameEntityGUID.Zero, base.AIEntity.Empire, PathfindingMovementCapacity.Ground); pathfindingContext.AddMovementCapacity(PathfindingMovementCapacity.FrozenWater); pathfindingContext.RefreshProperties(1f, 100f, false, false, 100f, 100f); DepartmentOfScience agency = base.AIEntity.Empire.GetAgency <DepartmentOfScience>(); DepartmentOfScience.ConstructibleElement technology; if (agency.TechnologyDatabase.TryGetValue("TechnologyDefinitionShip", out technology) && agency.GetTechnologyState(technology) == DepartmentOfScience.ConstructibleElement.State.Researched) { pathfindingContext.AddMovementCapacity(PathfindingMovementCapacity.Water); } } WorldPosition[] worldPositions = region.WorldPositions; int j = 0; while (j < worldPositions.Length) { WorldPosition worldPosition = worldPositions[j]; if (!this.worldPositionningService.IsWaterTile(worldPosition) && !this.worldPositionningService.HasRidge(worldPosition) && this.pathfindingService.IsTileStopable(worldPosition, pathfindingContext, (PathfindingFlags)0, null)) { if (this.pathfindingService.FindPath(pathfindingContext, (this.PathingOrigin as IWorldPositionable).WorldPosition, worldPosition, PathfindingManager.RequestMode.Default, null, PathfindingFlags.IgnoreArmies | PathfindingFlags.IgnoreEncounterAreas | PathfindingFlags.IgnoreFogOfWar | PathfindingFlags.IgnorePOI | PathfindingFlags.IgnoreSieges | PathfindingFlags.IgnoreTerraformDevices | PathfindingFlags.IgnoreKaijuGarrisons, null) == null) { if (Amplitude.Unity.Framework.Application.Preferences.EnableModdingTools) { Diagnostics.Log("ELCP {0}/{1} AILayer_Colonization:CanPathToRegion FAILED! from {3} to {2}/{5} with {4}", new object[] { base.AIEntity.Empire, this.PathingOrigin.LocalizedName, worldPosition, (this.PathingOrigin as IWorldPositionable).WorldPosition, pathfindingContext.MovementCapacities, region.LocalizedName }); } return(false); } return(true); } else { j++; } } return(false); }
private bool AskForArmy(int numberOfUnits) { if (!base.AIDataArmyGUID.IsValid && numberOfUnits > 0 && this.armySpawnTicket == null) { PathfindingContext pathfindingContext = new PathfindingContext(this.Camp.City.GUID, this.Camp.City.Empire, this.Camp.City.StandardUnits); WorldPosition armyPosition; if (!DepartmentOfTheInterior.TryGetWorldPositionForNewArmyFromCity(this.Camp.City, this.pathfindingService, pathfindingContext, out armyPosition)) { return(false); } if (this.Camp.City.StandardUnits.Count == 0) { return(false); } numberOfUnits = Mathf.Min(this.Camp.City.StandardUnits.Count, numberOfUnits); if (numberOfUnits > 0) { GameEntityGUID[] array = new GameEntityGUID[numberOfUnits]; for (int i = 0; i < numberOfUnits; i++) { array[i] = this.Camp.City.StandardUnits[i].GUID; } OrderTransferGarrisonToNewArmy order = new OrderTransferGarrisonToNewArmy(base.Commander.Empire.Index, this.Camp.City.GUID, array, armyPosition, null, false, true, true); base.Commander.Empire.PlayerControllers.AI.PostOrder(order, out this.armySpawnTicket, null); } } return(false); }
protected WorldPath ComputePathToPosition(ArmyWithTask army, WorldPosition targetPosition, WorldPath currentPath) { if (currentPath != null && currentPath.Destination == targetPosition && currentPath.Origin == army.Garrison.WorldPosition) { for (int i = 0; i < currentPath.WorldPositions.Length; i++) { if (currentPath.WorldPositions[i] == army.Garrison.WorldPosition) { return(currentPath); } } } IPathfindingContextProvider pathfindingContextProvider = army.Garrison as IPathfindingContextProvider; if (pathfindingContextProvider == null) { return(null); } PathfindingContext pathfindingContext = pathfindingContextProvider.GenerateContext(); pathfindingContext.Greedy = true; WorldPosition worldPosition = army.Garrison.WorldPosition; PathfindingResult pathfindingResult = this.pathfindingService.FindPath(pathfindingContext, worldPosition, targetPosition, PathfindingManager.RequestMode.Default, null, PathfindingFlags.IgnoreFogOfWar, null); if (pathfindingResult == null) { return(null); } WorldPath worldPath = new WorldPath(); worldPath.Build(pathfindingResult, army.Garrison.GetPropertyValue(SimulationProperties.MovementRatio), 1, false); return(worldPath); }
private bool AskForArmy(int numberOfUnits) { if (!base.AIDataArmyGUID.IsValid && this.armySpawnTicket == null) { if (this.City.BesiegingEmpire != null) { int maxValue = int.MaxValue; for (int i = 0; i < this.City.Districts.Count; i++) { if (District.IsACityTile(this.City.Districts[i])) { Army armyAtPosition = this.worldPositionningService.GetArmyAtPosition(this.City.Districts[i].WorldPosition); if (armyAtPosition != null && armyAtPosition.Empire == this.City.Empire) { int distanceToBesieger = this.GetDistanceToBesieger(this.City.Districts[i].WorldPosition); if (distanceToBesieger < maxValue) { base.AIDataArmyGUID = armyAtPosition.GUID; } if (distanceToBesieger == 1) { return(false); } } } } if (base.AIDataArmyGUID.IsValid) { return(false); } } PathfindingContext pathfindingContext = new PathfindingContext(this.City.GUID, this.City.Empire, this.City.StandardUnits); WorldPosition armyPosition; if (!DepartmentOfTheInterior.TryGetWorldPositionForNewArmyFromCity(this.City, this.pathfindingService, pathfindingContext, out armyPosition)) { return(false); } if (this.City.StandardUnits.Count == 0) { return(false); } numberOfUnits = Mathf.Min(this.City.StandardUnits.Count, numberOfUnits); GameEntityGUID[] array = new GameEntityGUID[numberOfUnits]; for (int j = 0; j < numberOfUnits; j++) { array[j] = this.City.StandardUnits[j].GUID; } OrderTransferGarrisonToNewArmy order = new OrderTransferGarrisonToNewArmy(base.Commander.Empire.Index, this.City.GUID, array, armyPosition, null, false, true, true); base.Commander.Empire.PlayerControllers.AI.PostOrder(order, out this.armySpawnTicket, null); } return(false); }
private bool TryTeleportInRange(AIBehaviorTree aiBehaviorTree, Army army, WorldPath path, int CurrentIndex) { List <StaticString> list = new List <StaticString>(); if (!this.armyAction_TeleportInRange.CanExecute(army, ref list, new object[0])) { return(false); } float teleportationRange = this.armyAction_TeleportInRange.GetTeleportationRange(army); PathfindingContext pathfindingContext = army.GenerateContext(); WorldPosition worldPosition = WorldPosition.Invalid; int i = path.WorldPositions.Length - 1; while (i >= CurrentIndex) { WorldPosition worldPosition2 = path.WorldPositions[i]; int distance = this.worldPositionningService.GetDistance(worldPosition2, army.WorldPosition); if (distance < 6) { return(false); } if (distance <= (int)teleportationRange && this.armyAction_TeleportInRange.CanTeleportTo(army, worldPosition2, this.pathfindingService, pathfindingContext, this.visibilityService, this.worldPositionningService)) { worldPosition = worldPosition2; if (Amplitude.Unity.Framework.Application.Preferences.EnableModdingTools) { Diagnostics.Log("executing from {0} to {1}, {2}", new object[] { army.WorldPosition, worldPosition, distance }); break; } break; } else { i--; } } this.armyAction_TeleportInRange.Execute(army, aiBehaviorTree.AICommander.Empire.PlayerControllers.AI, out this.currentTicket, null, new object[] { worldPosition }); return(true); }
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 AskForArmy(bool mustAttack = false) { if (!base.AIDataArmyGUID.IsValid) { if (this.armySpawnTicket == null) { int maxValue = int.MaxValue; for (int i = 0; i < this.City.Districts.Count; i++) { if (District.IsACityTile(this.City.Districts[i])) { Army armyAtPosition = this.worldPositionningService.GetArmyAtPosition(this.City.Districts[i].WorldPosition); if (armyAtPosition != null && armyAtPosition.Empire == this.City.Empire) { int distanceToBesieger = this.GetDistanceToBesieger(this.City.Districts[i].WorldPosition); if (distanceToBesieger < maxValue) { base.AIDataArmyGUID = armyAtPosition.GUID; } if (distanceToBesieger == 1) { return(false); } } } } if (base.AIDataArmyGUID.IsValid) { return(false); } WorldPosition invalid = WorldPosition.Invalid; PathfindingContext pathfindingContext = new PathfindingContext(this.City.GUID, this.City.Empire, this.City.StandardUnits); if (!DepartmentOfTheInterior.TryGetWorldPositionForNewArmyFromCity(this.City, this.pathfindingService, pathfindingContext, out invalid)) { return(false); } if (!base.AIDataArmyGUID.IsValid && this.City.StandardUnits.Count > 0) { List <GameEntityGUID> list = new List <GameEntityGUID>(); for (int j = 0; j < this.City.StandardUnits.Count; j++) { if (this.City.StandardUnits[j].GetPropertyValue(SimulationProperties.Movement) > 0f && !this.City.StandardUnits[j].IsSettler) { list.Add(this.City.StandardUnits[j].GUID); } } if (list.Count == 0) { return(false); } OrderTransferGarrisonToNewArmy order = new OrderTransferGarrisonToNewArmy(base.Commander.Empire.Index, this.City.GUID, list.ToArray(), invalid, null, false, true, true); base.Commander.Empire.PlayerControllers.AI.PostOrder(order, out this.armySpawnTicket, null); } } else if (this.armySpawnTicket.Raised) { if (this.armySpawnTicket.PostOrderResponse == PostOrderResponse.Processed) { OrderTransferGarrisonToNewArmy orderTransferGarrisonToNewArmy = this.armySpawnTicket.Order as OrderTransferGarrisonToNewArmy; if (this.armySpawnTicket != null) { base.AIDataArmyGUID = orderTransferGarrisonToNewArmy.ArmyGuid; } } this.armySpawnTicket = null; } } if (!base.AIDataArmyGUID.IsValid) { return(false); } List <object> list2 = new List <object>(); list2.Add(this.City); if (mustAttack) { return(base.TryCreateArmyMission("DefendCity_BreakSiegeNow", list2)); } return(base.TryCreateArmyMission("DefendCity_BreakSiege", list2)); }
private void CalculateRegroupPositionForWaitToAttack() { if (this.RegionTarget == null || this.RegionTarget.City == null || this.RegionTarget.City.Empire == base.Commander.Empire || !base.AIDataArmyGUID.IsValid) { return; } AIData_Army aidata = this.aiDataRepository.GetAIData <AIData_Army>(base.AIDataArmyGUID); if (aidata == null) { return; } PathfindingContext pathfindingContext = aidata.Army.GenerateContext(); pathfindingContext.Greedy = true; PathfindingResult pathfindingResult; if (this.targetFrontierPosition.IsValid) { Army armyAtPosition = this.worldPositionningService.GetArmyAtPosition(this.targetFrontierPosition); if (armyAtPosition == null) { pathfindingResult = this.pathfindingService.FindPath(pathfindingContext, aidata.Army.WorldPosition, this.targetFrontierPosition, PathfindingManager.RequestMode.Default, null, PathfindingFlags.IgnoreFogOfWar, null); if (pathfindingResult != null) { return; } } else if (armyAtPosition.GUID == base.AIDataArmyGUID) { return; } } if (this.worldPositionningService.GetRegion(aidata.Army.WorldPosition) == this.RegionTarget) { this.targetFrontierPosition = aidata.Army.WorldPosition; return; } IWorldAtlasAIHelper service = AIScheduler.Services.GetService <IWorldAtlasAIHelper>(); List <Region> list = new List <Region>(); service.ComputeNeighbourRegions(this.RegionTarget, ref list); list.RemoveAll((Region match) => match.Owner != base.Commander.Empire || !match.IsLand); int num = int.MaxValue; bool flag = false; foreach (Region region in list) { foreach (WorldPosition worldPosition in region.WorldPositions) { if (!this.worldPositionningService.IsWaterTile(worldPosition) && this.pathfindingService.IsTileStopableAndPassable(worldPosition, aidata.Army, PathfindingFlags.IgnoreFogOfWar, null)) { int distance = this.worldPositionningService.GetDistance(worldPosition, this.RegionTarget.City.WorldPosition); if (distance < num) { num = distance; this.targetFrontierPosition = worldPosition; flag = true; } } } } if (flag) { return; } pathfindingResult = this.pathfindingService.FindPath(pathfindingContext, aidata.Army.WorldPosition, this.RegionTarget.City.WorldPosition, PathfindingManager.RequestMode.Default, null, PathfindingFlags.IgnoreDiplomacy | PathfindingFlags.IgnoreFogOfWar, null); if (pathfindingResult == null) { this.targetFrontierPosition = aidata.Army.WorldPosition; return; } WorldPosition worldPosition2 = aidata.Army.WorldPosition; foreach (WorldPosition worldPosition3 in pathfindingResult.GetCompletePath()) { if (!(worldPosition3 == pathfindingResult.Start) && !(worldPosition3 == pathfindingResult.Goal) && this.pathfindingService.IsTileStopableAndPassable(worldPosition3, aidata.Army, PathfindingFlags.IgnoreFogOfWar, null)) { if ((int)this.worldPositionningService.GetRegionIndex(worldPosition3) == this.RegionTarget.Index) { break; } worldPosition2 = worldPosition3; } } this.targetFrontierPosition = worldPosition2; }
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); }
protected override State Execute(AIBehaviorTree aiBehaviorTree, params object[] parameters) { 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 = 1; return(State.Failure); } if (this.fastTravel) { Army army; if (this.CurrentPathCollection != null && base.GetArmyUnlessLocked(aiBehaviorTree, "$Army", out army) == AIArmyMission.AIArmyMissionErrorCode.None) { PointOfInterest pointOfInterest = this.worldPositionningService.GetPointOfInterest(this.CurrentPathCollection.ExitNode.WorldPosition); IGameService service = Services.GetService <IGameService>(); IQuestManagementService service2 = service.Game.Services.GetService <IQuestManagementService>(); IQuestRepositoryService service3 = service.Game.Services.GetService <IQuestRepositoryService>(); if (pointOfInterest != null && ELCPUtilities.CanSearch(army.Empire, pointOfInterest, service2, service3) && this.worldPositionningService.GetDistance(army.WorldPosition, pointOfInterest.WorldPosition) < 2 && this.pathfindingService.IsTransitionPassable(army.WorldPosition, pointOfInterest.WorldPosition, army, OrderAttack.AttackFlags, null)) { OrderInteractWith orderInteractWith = new OrderInteractWith(army.Empire.Index, army.GUID, "ArmyActionSearch"); orderInteractWith.WorldPosition = army.WorldPosition; orderInteractWith.Tags.AddTag("Interact"); orderInteractWith.TargetGUID = pointOfInterest.GUID; army.Empire.PlayerControllers.AI.PostOrder(orderInteractWith); } } this.fastTravel = false; this.CurrentPathCollection = null; } return(State.Success); } else { Army army2; if (base.GetArmyUnlessLocked(aiBehaviorTree, "$Army", out army2) != AIArmyMission.AIArmyMissionErrorCode.None) { return(State.Failure); } if (!aiBehaviorTree.Variables.ContainsKey(this.DestinationVarName)) { aiBehaviorTree.LogError("{0} not set", new object[] { this.DestinationVarName }); return(State.Failure); } if (this.AllowFastTravel && !(army2 is KaijuArmy) && aiBehaviorTree.AICommander.Empire is MajorEmpire && aiBehaviorTree.AICommander.Empire.SimulationObject.Tags.Contains(FactionTrait.FactionTraitMimics1)) { float propertyValue = army2.GetPropertyValue(SimulationProperties.MaximumNumberOfActionPoints); float propertyValue2 = army2.GetPropertyValue(SimulationProperties.ActionPointsSpent); if (propertyValue > propertyValue2) { return(this.MykaraExecute(aiBehaviorTree, army2)); } if (this.CurrentPathCollection != null) { this.CurrentPathCollection = null; this.WorldPath = null; } } if (army2.GetPropertyValue(SimulationProperties.Movement) < 0.001f) { aiBehaviorTree.ErrorCode = 24; return(State.Failure); } WorldPosition worldPosition = (WorldPosition)aiBehaviorTree.Variables[this.DestinationVarName]; aiBehaviorTree.LastPathfindTargetPosition = worldPosition; if (!worldPosition.IsValid) { aiBehaviorTree.ErrorCode = 3; return(State.Failure); } if (this.WorldPath != null && this.WorldPath.Destination == worldPosition) { return(State.Success); } this.currentFlags = PathfindingFlags.IgnoreFogOfWar; if (!aiBehaviorTree.AICommander.MayUseFrozenTiles()) { this.currentFlags |= PathfindingFlags.IgnoreFrozenWaters; } this.WorldPath = new WorldPath(); if (army2.WorldPosition == worldPosition) { aiBehaviorTree.ErrorCode = 4; return(State.Failure); } int distance = this.worldPositionningService.GetDistance(army2.WorldPosition, worldPosition); bool flag2 = this.pathfindingService.IsTransitionPassable(army2.WorldPosition, worldPosition, army2, (PathfindingFlags)0, null); if (distance == 1 && flag2 && !this.pathfindingService.IsTileStopable(worldPosition, army2, (PathfindingFlags)0, null)) { aiBehaviorTree.ErrorCode = 4; return(State.Failure); } PathfindingContext pathfindingContext = army2.GenerateContext(); pathfindingContext.Greedy = true; PathfindingResult pathfindingResult = this.pathfindingService.FindPath(pathfindingContext, army2.WorldPosition, worldPosition, PathfindingManager.RequestMode.Default, null, this.currentFlags, null); if (pathfindingResult == null && this.IgnoreArmies) { this.currentFlags |= PathfindingFlags.IgnoreArmies; pathfindingResult = this.pathfindingService.FindPath(pathfindingContext, army2.WorldPosition, worldPosition, PathfindingManager.RequestMode.Default, null, this.currentFlags, null); } if (pathfindingResult == null) { aiBehaviorTree.ErrorCode = 3; if (ELCPUtilities.ELCPVerboseMode) { Diagnostics.Log("ELCP {0}/{1} didnt find pathfindingResult to {2} with flags {3}", new object[] { army2.Empire, army2.LocalizedName, worldPosition, this.currentFlags }); } return(State.Failure); } this.WorldPath.Build(pathfindingResult, army2.GetPropertyValue(SimulationProperties.MovementRatio), this.numberOfTurnForWorldPath, false); this.WorldPath = this.ComputeSafePathOpportunity(army2, worldPosition, this.WorldPath); if (!this.WorldPath.IsValid) { aiBehaviorTree.ErrorCode = 3; if (ELCPUtilities.ELCPVerboseMode) { Diagnostics.Log("ELCP {0}/{1} worldpath invalid {2} with flags {3}", new object[] { army2.Empire, army2.LocalizedName, worldPosition, this.currentFlags }); } return(State.Failure); } if (aiBehaviorTree.Variables.ContainsKey(this.Output_PathVarName)) { aiBehaviorTree.Variables[this.Output_PathVarName] = this.WorldPath; } else { aiBehaviorTree.Variables.Add(this.Output_PathVarName, this.WorldPath); } return(State.Success); } }
private State MykaraExecute(AIBehaviorTree aiBehaviorTree, Army army) { WorldPosition worldPosition = (WorldPosition)aiBehaviorTree.Variables[this.DestinationVarName]; aiBehaviorTree.LastPathfindTargetPosition = worldPosition; if (!worldPosition.IsValid) { aiBehaviorTree.ErrorCode = 3; return(State.Failure); } if (this.CurrentPathCollection != null && this.CurrentPathCollection.ExitNode != null) { IFastTravelNodeGameEntity[] entryTravelNodesFor = this.departmentOfTransportation.GetEntryTravelNodesFor(army, this.armyAction_FastTravel.EntryPrerequisites); if (entryTravelNodesFor.Length != 0) { if (!entryTravelNodesFor.Contains(this.CurrentPathCollection.ExitNode) && this.departmentOfTransportation.GetExitTravelNodesFor(army, this.armyAction_FastTravel.EntryPrerequisites).Contains(this.CurrentPathCollection.ExitNode)) { return(this.FastTravelExecute(aiBehaviorTree, army)); } this.CurrentPathCollection = null; this.WorldPath = null; } } if (army.GetPropertyValue(SimulationProperties.Movement) < 0.001f) { aiBehaviorTree.ErrorCode = 24; return(State.Failure); } if (this.CurrentPathCollection != null && (this.CurrentPathCollection.PathFromNodeExitToDestination.Destination == worldPosition || (this.WorldPath != null && this.WorldPath.Destination == worldPosition))) { return(State.Success); } this.currentFlags = PathfindingFlags.IgnoreFogOfWar; if (!aiBehaviorTree.AICommander.MayUseFrozenTiles()) { this.currentFlags |= PathfindingFlags.IgnoreFrozenWaters; } this.WorldPath = new WorldPath(); if (army.WorldPosition == worldPosition) { aiBehaviorTree.ErrorCode = 4; return(State.Failure); } int distance = this.worldPositionningService.GetDistance(army.WorldPosition, worldPosition); bool flag = this.pathfindingService.IsTransitionPassable(army.WorldPosition, worldPosition, army, (PathfindingFlags)0, null); if (distance == 1 && flag && !this.pathfindingService.IsTileStopable(worldPosition, army, (PathfindingFlags)0, null)) { aiBehaviorTree.ErrorCode = 4; return(State.Failure); } PathfindingContext pathfindingContext = army.GenerateContext(); pathfindingContext.Greedy = true; PathfindingResult pathfindingResult = this.pathfindingService.FindPath(pathfindingContext, army.WorldPosition, worldPosition, PathfindingManager.RequestMode.Default, null, this.currentFlags, null); this.CurrentPathCollection = new AIBehaviorTreeNode_Action_GeneratePath.MykaraPathCollection(); this.CurrentPathCollection.NormalPath = this.WorldPath; this.CurrentPathCollection.PathToNodeEntrance = new WorldPath(); this.CurrentPathCollection.PathFromNodeExitToDestination = new WorldPath(); if (pathfindingResult != null) { this.WorldPath.Build(pathfindingResult, army.GetPropertyValue(SimulationProperties.MovementRatio), 10, false); this.WorldPath = this.ComputeSafePathOpportunity(army, worldPosition, this.WorldPath); if (Amplitude.Unity.Framework.Application.Preferences.EnableModdingTools) { Diagnostics.Log("ELCP: {0}/{1}/{2} original path: {3} {4} {5}", new object[] { army.Empire, army.LocalizedName, army.WorldPosition, pathfindingResult.CompletPathLength, this.WorldPath.Length, this.WorldPath.ControlPoints.Length }); } } bool flag2 = false; if (!this.WorldPath.IsValid || this.WorldPath.ControlPoints.Length > 2) { if (Amplitude.Unity.Framework.Application.Preferences.EnableModdingTools) { Diagnostics.Log("ELCP: {0}/{1} trying to find alternative path to target {2}", new object[] { army.Empire, army.LocalizedName, worldPosition }); } int num = int.MaxValue; int num2 = int.MaxValue; IFastTravelNodeGameEntity fastTravelNodeGameEntity = null; IFastTravelNodeGameEntity fastTravelNodeGameEntity2 = null; List <IFastTravelNodeGameEntity> list = this.departmentOfTransportation.GetEntryTravelNodesFor(army, this.armyAction_FastTravel.EntryPrerequisites).ToList <IFastTravelNodeGameEntity>(); list.AddRange(this.departmentOfTransportation.GetExitTravelNodesFor(army, this.armyAction_FastTravel.EntryPrerequisites)); foreach (IFastTravelNodeGameEntity fastTravelNodeGameEntity3 in list) { if (fastTravelNodeGameEntity3.GetTravelEntrancePositions().Length != 0) { int distance2 = this.worldPositionningService.GetDistance(fastTravelNodeGameEntity3.WorldPosition, army.WorldPosition); int distance3 = this.worldPositionningService.GetDistance(fastTravelNodeGameEntity3.WorldPosition, worldPosition); if (distance2 < num) { num = distance2; fastTravelNodeGameEntity = fastTravelNodeGameEntity3; if (distance2 == 1) { flag2 = true; } } if (distance3 < num2) { num2 = distance3; fastTravelNodeGameEntity2 = fastTravelNodeGameEntity3; } } } if (fastTravelNodeGameEntity != null && fastTravelNodeGameEntity2 != null && fastTravelNodeGameEntity != fastTravelNodeGameEntity2) { int num3 = 1; WorldPosition worldPosition2 = army.WorldPosition; if (!flag2) { worldPosition2 = this.GetValidTileForFastTravel(fastTravelNodeGameEntity.WorldPosition, army.WorldPosition, true); } if (worldPosition2.IsValid) { PathfindingResult pathfindingResult2 = this.pathfindingService.FindPath(pathfindingContext, army.WorldPosition, fastTravelNodeGameEntity.WorldPosition, PathfindingManager.RequestMode.Default, null, this.currentFlags, null); WorldPath worldPath = new WorldPath(); if (pathfindingResult2 != null) { worldPath.Build(pathfindingResult2, army.GetPropertyValue(SimulationProperties.MovementRatio), 10, false); num3 += worldPath.ControlPoints.Length; if (this.GetValidTileForFastTravel(fastTravelNodeGameEntity2.WorldPosition, worldPosition, false).IsValid) { PathfindingResult pathfindingResult3 = this.pathfindingService.FindPath(pathfindingContext, worldPosition, fastTravelNodeGameEntity2.WorldPosition, PathfindingManager.RequestMode.Default, null, this.currentFlags | PathfindingFlags.IgnoreArmies | PathfindingFlags.IgnorePOI, null); WorldPath worldPath2 = new WorldPath(); if (pathfindingResult3 != null) { worldPath2.Build(pathfindingResult3, army.GetPropertyValue(SimulationProperties.MovementRatio), 10, false); num3 += worldPath2.ControlPoints.Length; if (!this.WorldPath.IsValid || num3 < this.WorldPath.ControlPoints.Length) { this.CurrentPathCollection.EntryNode = fastTravelNodeGameEntity; this.CurrentPathCollection.ExitNode = fastTravelNodeGameEntity2; this.CurrentPathCollection.PathToNodeEntrance = worldPath; this.CurrentPathCollection.PathFromNodeExitToDestination = worldPath2; if (Amplitude.Unity.Framework.Application.Preferences.EnableModdingTools) { Diagnostics.Log("ELCP: {0}/{1} alternative path found through {2} {3}, {4} < {5}, {6}", new object[] { army.Empire, army.LocalizedName, fastTravelNodeGameEntity.WorldPosition + "/" + worldPath.Destination, fastTravelNodeGameEntity2.WorldPosition + "/" + worldPath2.Destination, num3, this.WorldPath.ControlPoints.Length, flag2 }); } } } } } } } } if (!this.WorldPath.IsValid && !this.CurrentPathCollection.PathToNodeEntrance.IsValid && (!flag2 || this.CurrentPathCollection.ExitNode == null)) { aiBehaviorTree.ErrorCode = 3; return(State.Failure); } WorldPath value = this.CurrentPathCollection.PathToNodeEntrance.IsValid ? this.CurrentPathCollection.PathToNodeEntrance : this.WorldPath; if (aiBehaviorTree.Variables.ContainsKey(this.Output_PathVarName)) { aiBehaviorTree.Variables[this.Output_PathVarName] = value; } else { aiBehaviorTree.Variables.Add(this.Output_PathVarName, value); } if (flag2 && this.CurrentPathCollection.ExitNode != null && this.departmentOfTransportation.GetExitTravelNodesFor(army, this.armyAction_FastTravel.EntryPrerequisites).Contains(this.CurrentPathCollection.ExitNode)) { if (Amplitude.Unity.Framework.Application.Preferences.EnableModdingTools) { Diagnostics.Log("ELCP: {0}/{1} initiating instant teleport {3} {2} to {4}", new object[] { army.Empire, army.LocalizedName, this.CurrentPathCollection.EntryNode.WorldPosition, army.WorldPosition, this.CurrentPathCollection.ExitNode }); } return(this.FastTravelExecute(aiBehaviorTree, army)); } return(State.Success); }
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); }