Make generation more sparse by asking for extra space around rooms; also add out of bounds option to Map.neighbourhood

This commit is contained in:
Charles Peyrat 2021-01-08 07:38:47 +01:00
parent 605696dddd
commit 641f5c7872
2 changed files with 10 additions and 3 deletions

View File

@ -194,7 +194,7 @@ class Map:
self.add_entity(dictclasses[entisave["type"]](**entisave)) self.add_entity(dictclasses[entisave["type"]](**entisave))
@staticmethod @staticmethod
def neighbourhood(grid, y, x, large=False): def neighbourhood(grid, y, x, large=False, oob=False):
""" """
Returns up to 8 nearby coordinates, in a 3x3 square around the input coordinate if large is Returns up to 8 nearby coordinates, in a 3x3 square around the input coordinate if large is
set to True, or in a 5-square cross by default. Does not return coordinates if they are out set to True, or in a 5-square cross by default. Does not return coordinates if they are out
@ -203,12 +203,12 @@ class Map:
height, width = len(grid), len(grid[0]) height, width = len(grid), len(grid[0])
neighbours = [] neighbours = []
if large: if large:
dyxs = product([-1, 0, 1], [-1, 0, 1]) dyxs = [[dy, dx] for dy, dx in product([-1, 0, 1], [-1, 0, 1])]
dyxs = dyxs[:5] + dyxs[6:] dyxs = dyxs[:5] + dyxs[6:]
else: else:
dyxs = [[0, -1], [0, 1], [-1, 0], [1, 0]] dyxs = [[0, -1], [0, 1], [-1, 0], [1, 0]]
for dy, dx in dyxs: for dy, dx in dyxs:
if 0 <= y+dy < height and 0 <= x+dx < width: if oob or (0 <= y+dy < height and 0 <= x+dx < width):
neighbours.append([y+dy, x+dx]) neighbours.append([y+dy, x+dx])
return neighbours return neighbours

View File

@ -39,9 +39,16 @@ class Generator:
for rx in range(rw): for rx in range(rw):
if room[ry][rx] == Tile.FLOOR: if room[ry][rx] == Tile.FLOOR:
ly, lx = y + ry - door_y, x + rx - door_x ly, lx = y + ry - door_y, x + rx - door_x
# tile must be in bounds and empty
if not(0 <= ly < lh and 0 <= lx < lw) or \ if not(0 <= ly < lh and 0 <= lx < lw) or \
level[ly][lx] == Tile.FLOOR: level[ly][lx] == Tile.FLOOR:
return False return False
# so do all neighbouring tiles bc we may
# need to place walls there eventually
for ny, nx in Map.neighbourhood(level, ly, lx, large=True, oob=True):
if not(0 <= ny < lh and 0 <= nx < lw) or \
level[ny][nx] != Tile.EMPTY:
return False
return True return True
@staticmethod @staticmethod