Beispiel #1
0
        private List <Link> GenerateProspectiveLinks(List <int> indexToTile)
        {
            Dictionary <int, int> tileToIndexLookup = new Dictionary <int, int>();

            for (int i = 0; i < indexToTile.Count; i++)
            {
                tileToIndexLookup[indexToTile[i]] = i;
            }
            List <Link> linkProspective = new List <Link>();
            List <int>  list            = new List <int>();

            for (int srcIndex = 0; srcIndex < indexToTile.Count; srcIndex++)
            {
                int srcTile = indexToTile[srcIndex];
                list.Clear();
                list.Add(srcTile);
                int found = 0;
                Find.WorldPathFinder.FloodPathsWithCost(list, (int src, int dst) => Caravan_PathFollower.CostToMove(3300, src, dst, null, perceivedStatic : true), null, delegate(int tile, float distance)
                {
                    if (tile != srcTile && tileToIndexLookup.ContainsKey(tile))
                    {
                        found++;
                        linkProspective.Add(new Link
                        {
                            distance = distance,
                            indexA   = srcIndex,
                            indexB   = tileToIndexLookup[tile]
                        });
                    }
                    return(found >= 8);
                });
            }
            linkProspective.Sort((Link lhs, Link rhs) => lhs.distance.CompareTo(rhs.distance));
            return(linkProspective);
        }
        private static float GetCostToMove(float initialNextTileCostLeft, bool firstInPath, int initialTicksAbs, int curResult, int caravanTicksPerMove, int curTile, int nextTile)
        {
            if (firstInPath)
            {
                return(initialNextTileCostLeft);
            }
            int value = initialTicksAbs + curResult;

            return((float)Caravan_PathFollower.CostToMove(caravanTicksPerMove, curTile, nextTile, value));
        }
Beispiel #3
0
        public static float ApproxTilesPerDay(int caravanTicksPerMove, int tile, int nextTile, StringBuilder explanation = null, string caravanTicksPerMoveExplanation = null)
        {
            if (nextTile == -1)
            {
                nextTile = Find.WorldGrid.FindMostReasonableAdjacentTileForDisplayedPathCost(tile);
            }
            int num = Mathf.CeilToInt((float)Caravan_PathFollower.CostToMove(caravanTicksPerMove, tile, nextTile, null, perceivedStatic: false, explanation, caravanTicksPerMoveExplanation) / 1f);

            if (num == 0)
            {
                return(0f);
            }
            return(60000f / (float)num);
        }
Beispiel #4
0
        private static float GetCostToMove(float initialNextTileCostLeft, bool firstInPath, int initialTicksAbs, int curResult, int caravanTicksPerMove, int curTile, int nextTile)
        {
            float result;

            if (firstInPath)
            {
                result = initialNextTileCostLeft;
            }
            else
            {
                int value = initialTicksAbs + curResult;
                result = (float)Caravan_PathFollower.CostToMove(caravanTicksPerMove, curTile, nextTile, new int?(value), false, null, null);
            }
            return(result);
        }
        public static int CostToDisplay(Caravan caravan, int start, int end, float yearPercent = -1f)
        {
            if (start != end && end != -1)
            {
                return(Caravan_PathFollower.CostToMove(caravan.TicksPerMove, start, end, yearPercent));
            }
            int num = caravan.TicksPerMove;

            num += WorldPathGrid.CalculatedCostAt(start, false, yearPercent);
            Tile  tile = Find.WorldGrid[start];
            float num2 = 1f;

            if (tile.roads != null)
            {
                for (int i = 0; i < tile.roads.Count; i++)
                {
                    num2 = Mathf.Min(num2, tile.roads[i].road.movementCostMultiplier);
                }
            }
            return(Mathf.RoundToInt((float)num * num2));
        }
        public static float ApproxTilesPerDay(int caravanTicksPerMove, int tile, int nextTile, StringBuilder explanation = null, string caravanTicksPerMoveExplanation = null)
        {
            if (nextTile == -1)
            {
                nextTile = Find.WorldGrid.FindMostReasonableAdjacentTileForDisplayedPathCost(tile);
            }
            int   end  = nextTile;
            float num  = (float)Caravan_PathFollower.CostToMove(caravanTicksPerMove, tile, end, null, false, explanation, caravanTicksPerMoveExplanation);
            int   num2 = Mathf.CeilToInt(num / 1f);
            float result;

            if (num2 == 0)
            {
                result = 0f;
            }
            else
            {
                result = 60000f / (float)num2;
            }
            return(result);
        }
 public static int CostToMove(Caravan caravan, int start, int end, int?ticksAbs = null)
 {
     return(Caravan_PathFollower.CostToMove(caravan.TicksPerMove, start, end, ticksAbs, false, null, null));
 }
 private int CostToMove(int start, int end)
 {
     return(Caravan_PathFollower.CostToMove(this.caravan, start, end, null));
 }
        public static int EstimatedTicksToArrive(int from, int to, WorldPath path, float nextTileCostLeft, int caravanTicksPerMove, int curTicksAbs)
        {
            int num  = 0;
            int num2 = from;
            int num3 = 0;
            int num4 = Mathf.CeilToInt(20000f) - 1;
            int num5 = 60000 - num4;
            int num6 = 0;
            int num7 = 0;
            int num8;

            if (CaravanRestUtility.WouldBeRestingAt(from, (long)curTicksAbs))
            {
                num += CaravanRestUtility.LeftRestTicksAt(from, (long)curTicksAbs);
                num8 = num5;
            }
            else
            {
                num8 = CaravanRestUtility.LeftNonRestTicksAt(from, (long)curTicksAbs);
            }
            while (true)
            {
                num7++;
                if (num7 >= 10000)
                {
                    break;
                }
                if (num6 <= 0)
                {
                    if (num2 == to)
                    {
                        return(num);
                    }
                    bool flag  = num3 == 0;
                    int  start = num2;
                    num2 = path.Peek(num3);
                    num3++;
                    float num9;
                    if (flag)
                    {
                        num9 = nextTileCostLeft;
                    }
                    else
                    {
                        int   num10       = curTicksAbs + num;
                        float yearPercent = (float)GenDate.DayOfYear((long)num10, 0f) / 60f;
                        num9 = (float)Caravan_PathFollower.CostToMove(caravanTicksPerMove, start, num2, yearPercent);
                    }
                    num6 = Mathf.CeilToInt(num9 / 1f);
                }
                if (num8 < num6)
                {
                    num  += num8;
                    num6 -= num8;
                    num  += num4;
                    num8  = num5;
                }
                else
                {
                    num  += num6;
                    num8 -= num6;
                    num6  = 0;
                }
            }
            Log.ErrorOnce("Could not calculate estimated ticks to arrive. Too many iterations.", 1837451324);
            return(num);
        }
 public static int CostToMove(Caravan caravan, int start, int end, float yearPercent = -1f)
 {
     return(Caravan_PathFollower.CostToMove(caravan.TicksPerMove, start, end, yearPercent));
 }
 private static int <GenerateProspectiveLinks> m__2(int src, int dst)
 {
     return(Caravan_PathFollower.CostToMove(3500, src, dst, null, true, null, null));
 }