public static void UpdateTextMeshObjectsFor(List <VehicleDef> vehicleDefs)
 {
     for (int i = 0; i < worldPathTexts.Count; i++)
     {
         var      textMesh       = worldPathTexts[i];
         Tile     tile           = Find.WorldGrid[i];
         BiomeDef biome          = tile.biome;
         float    biomeCost      = vehicleDefs.Max(v => v.properties.customBiomeCosts.TryGetValue(biome, Find.WorldGrid[i].biome.movementDifficulty));
         float    hillinessCost  = vehicleDefs.Max(v => v.properties.customHillinessCosts.TryGetValue(tile.hilliness, WorldVehiclePathGrid.HillinessMovementDifficultyOffset(tile.hilliness)));
         float    roadMultiplier = VehicleCaravan_PathFollower.GetRoadMovementDifficultyMultiplier(vehicleDefs, i, -1);
         textMesh.Text = $"{(biomeCost + hillinessCost) * roadMultiplier}";
         textMesh.SetActive(true);
     }
 }
        public WorldPath FindPath(int startTile, int destTile, VehicleCaravan caravan, Func <float, bool> terminator = null)
        {
            if (startTile < 0)
            {
                Log.Error(string.Concat(new object[]
                {
                    "Tried to FindPath with invalid start tile ",
                    startTile,
                    ", caravan= ",
                    caravan
                }));
                return(WorldPath.NotFound);
            }
            if (destTile < 0)
            {
                Log.Error(string.Concat(new object[]
                {
                    "Tried to FindPath with invalid dest tile ",
                    destTile,
                    ", caravan= ",
                    caravan
                }));
                return(WorldPath.NotFound);
            }

            if (!WorldVehicleReachability.Instance.CanReach(caravan, destTile))
            {
                return(WorldPath.NotFound);
            }

            World      world = Find.World;
            WorldGrid  grid  = world.grid;
            List <int> tileIDToNeighbors_offsets = grid.tileIDToNeighbors_offsets;
            List <int> tileIDToNeighbors_values  = grid.tileIDToNeighbors_values;
            Vector3    normalized = grid.GetTileCenter(destTile).normalized;
            Dictionary <VehicleDef, float[]> movementDifficulty = WorldVehiclePathGrid.Instance.movementDifficulty;
            int num  = 0;
            int num2 = (caravan != null) ? caravan.TicksPerMove : 3300;
            int num3 = CalculateHeuristicStrength(startTile, destTile);

            statusOpenValue   += 2;
            statusClosedValue += 2;
            if (statusClosedValue >= 65435)
            {
                ResetStatuses();
            }
            calcGrid[startTile].knownCost     = 0;
            calcGrid[startTile].heuristicCost = 0;
            calcGrid[startTile].costNodeCost  = 0;
            calcGrid[startTile].parentTile    = startTile;
            calcGrid[startTile].status        = statusOpenValue;
            openList.Clear();
            openList.Push(new CostNode(startTile, 0));
            while (openList.Count > 0)
            {
                CostNode costNode = openList.Pop();
                if (costNode.cost == calcGrid[costNode.tile].costNodeCost)
                {
                    int tile = costNode.tile;
                    if (calcGrid[tile].status != statusClosedValue)
                    {
                        if (tile == destTile)
                        {
                            return(FinalizedPath(tile));
                        }
                        if (num > SearchLimit)
                        {
                            Log.Warning(string.Concat(new object[]
                            {
                                caravan,
                                " pathing from ",
                                startTile,
                                " to ",
                                destTile,
                                " hit search limit of ",
                                SearchLimit,
                                " tiles."
                            }));
                            return(WorldPath.NotFound);
                        }
                        int num4 = (tile + 1 < tileIDToNeighbors_offsets.Count) ? tileIDToNeighbors_offsets[tile + 1] : tileIDToNeighbors_values.Count;
                        for (int i = tileIDToNeighbors_offsets[tile]; i < num4; i++)
                        {
                            int num5 = tileIDToNeighbors_values[i];
                            if (calcGrid[num5].status != statusClosedValue && caravan.UniqueVehicleDefsInCaravan().All(v => WorldVehiclePathGrid.Instance.Passable(num5, v)) &&
                                (!caravan.HasBoat() || !(Find.World.CoastDirectionAt(num5).IsValid&& num5 != destTile)))
                            {
                                float  highestTerrainCost = caravan.UniqueVehicleDefsInCaravan().Max(v => movementDifficulty[v][num5]);
                                int    num6   = (int)(num2 * highestTerrainCost * VehicleCaravan_PathFollower.GetRoadMovementDifficultyMultiplier(caravan, tile, num5, null)) + calcGrid[tile].knownCost;
                                ushort status = calcGrid[num5].status;
                                if ((status != statusClosedValue && status != statusOpenValue) || calcGrid[num5].knownCost > num6)
                                {
                                    Vector3 tileCenter = grid.GetTileCenter(num5);
                                    if (status != statusClosedValue && status != statusOpenValue)
                                    {
                                        float num7 = grid.ApproxDistanceInTiles(GenMath.SphericalDistance(tileCenter.normalized, normalized));
                                        calcGrid[num5].heuristicCost = Mathf.RoundToInt(num2 * num7 * num3 * BestRoadDiscount);
                                    }
                                    int num8 = num6 + calcGrid[num5].heuristicCost;
                                    calcGrid[num5].parentTile   = tile;
                                    calcGrid[num5].knownCost    = num6;
                                    calcGrid[num5].status       = statusOpenValue;
                                    calcGrid[num5].costNodeCost = num8;
                                    openList.Push(new CostNode(num5, num8));
                                }
                            }
                        }
                        num++;
                        calcGrid[tile].status = statusClosedValue;
                        if (terminator != null && terminator(calcGrid[tile].costNodeCost))
                        {
                            return(WorldPath.NotFound);
                        }
                    }
                }
            }
            Log.Warning(string.Concat(new object[]
            {
                caravan,
                " pathing from ",
                startTile,
                " to ",
                destTile,
                " ran out of tiles to process."
            }));
            return(WorldPath.NotFound);
        }
Beispiel #3
0
 public VehicleCaravan() : base()
 {
     vPather  = new VehicleCaravan_PathFollower(this);
     vTweener = new VehicleCaravan_Tweener(this);
 }