////////////////////////////////////////////////////////////////////////////////// /* | */ /* PRIVATES */ /* | */ ////////////////////////////////////////////////////////////////////////////////// protected void shufflePaths(DungeonGrid grid, PathableArea area, Random rand) { double rateo = ((double)grid.countArea(area) / (double)grid.countPerimeter(area)); rateo = 5000 * (rateo); if (rateo > 9000) { rateo = 9000; } if (rateo < 1000) { rateo = 1000; } for (int x = area.position.x; x < area.sizeX + area.position.x; x++) { for (int y = area.position.y; y < area.sizeY + area.position.y; y++) { Coordinates position = new Coordinates(x, y); if (grid.hasDoorsTouching(position) || grid.hasForcedPathTouching(position)) { grid.grid[position.x, position.y] = Constants.PATH_MARKER; } else { int rnd = (rand.Next() % 10000) + 1; grid.grid[position.x, position.y] = rnd > rateo ? Constants.PATH_MARKER : Constants.PATHABLE_MARKER; } } } }
private static void checkArea(DungeonLayout layout, PathableArea area) { for (int x = area.position.x; x < area.sizeX + area.position.x; x++) { for (int y = area.position.y; y < area.sizeY + area.position.y; y++) { if (layout.grid.grid [x, y] != Constants.PATHABLE_MARKER) { throw new WrongLayoutDeclarationException("PathableArea declaration error. position: " + area.position.x + "," + area.position.y); } } } }
////////////////////////////////////////////////////////////////////////////////// /* | */ /* PRIVATES */ /* | */ ////////////////////////////////////////////////////////////////////////////////// private void recursiveMergePaths(DungeonGrid grid, PathableArea area, Random rand) { List <List <Coordinates> > tempPaths = grid.findAreas(Constants.PATH_MARKER, area.position, new Coordinates(area.position.x + area.sizeX, area.position.y + area.sizeY)); if (tempPaths.Count == 1) { return; } PathDistance closest = findClosestPaths(tempPaths, rand); grid.drawPath(closest.path_1, closest.path_2, rand); recursiveMergePaths(grid, area, rand); }
////////////////////////////////////////////////////////////////////////////////// /* | */ /* PRIVATES */ /* | */ ////////////////////////////////////////////////////////////////////////////////// private void mergePaths(DungeonGrid grid, PathableArea area, Random rand) { List <List <Coordinates> > tempPaths = grid.findAreas(Constants.PATH_MARKER, area.position, new Coordinates(area.position.x + area.sizeX, area.position.y + area.sizeY)); if (tempPaths.Count == 1) { return; } bool[,] linkedGraph = new bool[tempPaths.Count, tempPaths.Count]; for (int i = 0; i < tempPaths.Count; i++) { for (int j = 0; j < tempPaths.Count; j++) { linkedGraph [i, j] = (i == j ? true : false); } } int actual = 0; foreach (List <Coordinates> tempPath in tempPaths) { int linkTo = rand.Next() % tempPaths.Count; int count = 0; while (linkedGraph [actual, linkTo] && count < tempPaths.Count) { linkTo = (linkTo + 1) % tempPaths.Count; count++; } if (count == tempPaths.Count) { continue; } linkedGraph [actual, linkTo] = true; linkedGraph [linkTo, actual] = true; linkAll(linkedGraph, tempPaths.Count, actual, linkTo); PathDistance points = findClosestPoints(tempPath, tempPaths [linkTo]); grid.drawPath(points.path_1, points.path_2, rand); actual++; } }
public int countPerimeter(PathableArea area) { return(2 * (area.sizeX + area.sizeY)); }
public int countArea(PathableArea area) { return(area.sizeX * area.sizeY); }