示例#1
0
    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);
    }
示例#3
0
    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);
    }
示例#5
0
    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);
 }
示例#7
0
    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);
    }
示例#8
0
 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);
 }
示例#9
0
    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);
    }
示例#10
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);
     }
 }
示例#11
0
    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));
    }
示例#12
0
    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);
    }
示例#16
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);
    }