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); }
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); }
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)); }