Exemple #1
0
    private bool BuildWorldPath()
    {
        this.TemporaryWorldPath.Clear();
        if (this.LastHighlightedWorldPosition == WorldPosition.Invalid)
        {
            return(false);
        }
        if (base.IsTransferable(WorldCursor.HighlightedWorldPosition))
        {
            return(false);
        }
        if ((!base.PathfindingService.IsTileStopable(this.LastHighlightedWorldPosition, base.PathfindingContext, (PathfindingFlags)0, null) || !base.PathfindingService.IsTilePassable(this.LastHighlightedWorldPosition, base.PathfindingContext, (PathfindingFlags)0, null) || this.OtherEmpireCreepingNodeAtPosition(this.Army.Empire, this.LastHighlightedWorldPosition)) && base.PathfindingService.IsTransitionPassable(this.GarrisonPosition, this.LastHighlightedWorldPosition, base.PathfindingContext, PathfindingFlags.IgnoreArmies | PathfindingFlags.IgnoreOtherEmpireDistrict | PathfindingFlags.IgnoreDiplomacy | PathfindingFlags.IgnorePOI | PathfindingFlags.IgnoreSieges | PathfindingFlags.IgnoreKaijuGarrisons, null))
        {
            return(true);
        }
        PathfindingFlags pathfindingFlags = PathfindingFlags.IgnoreArmies;
        District         district         = base.WorldPositionningService.GetDistrict(this.GarrisonPosition);

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

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

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

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

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