예제 #1
0
 private static bool TryGetGridForMap(int mapId, out PlayerAvoidanceGrid grid)
 {
     for (var i = 0; i < grids.Count; i++)
     {
         if (grids[i].mapId == mapId)
         {
             grid = grids[i];
             return(true);
         }
     }
     grid = new PlayerAvoidanceGrid();
     return(false);
 }
예제 #2
0
        private static int CalculatePathCostInCell(PlayerAvoidanceGrid grid, int cellIndex)
        {
            var sources     = grid.sources;
            var pathCostSum = 0;

            for (int i = 0; i < sources.Count; i++)
            {
                if (sources[i].cellIndex == cellIndex)
                {
                    pathCostSum += sources[i].addedCost;
                }
            }
            return(pathCostSum);
        }
예제 #3
0
        public static void AddAvoidanceSource(Thing source, int pathCost)
        {
            AssertMap(source);
            pathCost = Mathf.Max(0, pathCost);
            if (!TryGetGridForMap(source.Map.uniqueID, out PlayerAvoidanceGrid grid))
            {
                grid = new PlayerAvoidanceGrid(source.Map);
                grids.Add(grid);
            }
            var cellIndex    = CellIndicesUtility.CellToIndex(source.Position, source.Map.Size.x);
            var previousCost = CalculatePathCostInCell(grid, cellIndex);
            var currentCost  = Mathf.Min(byte.MaxValue, previousCost + pathCost);

            grid.byteGrid[cellIndex] = (byte)currentCost;
            grid.sources.Add(new AvoidanceSource(source.thingIDNumber, cellIndex, currentCost - previousCost));
        }