Add new room type : rectangular rooms
This commit is contained in:
parent
c854d41579
commit
38878687c4
|
@ -25,8 +25,9 @@ DEFAULT_PARAMS = {
|
|||
"loop_threshold": 15,
|
||||
"spawn_per_region": [1, 2],
|
||||
"room_chances" : {
|
||||
"circular" : 5,
|
||||
"chunks" : 1,
|
||||
"circular" : 3,
|
||||
"chunks" : 2,
|
||||
"rectangle" : 1,
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -216,7 +217,8 @@ class Generator:
|
|||
return False
|
||||
# see if the path ahead is clear. needed in the case of non convex room
|
||||
for i in range(length + 1):
|
||||
if room[y + i * dy][x + i * dx] != Tile.EMPTY:
|
||||
if not(0 <= y + i * dy < rh and 0 <= x + i * dx < rw) \
|
||||
or room[y + i * dy][x + i * dx] != Tile.EMPTY:
|
||||
return False
|
||||
for i in range(length):
|
||||
room[y + i * dy][x + i * dx] = Tile.FLOOR
|
||||
|
@ -252,17 +254,15 @@ class Generator:
|
|||
if room[y][x] == Tile.EMPTY and \
|
||||
Generator.build_door(room, y, x, dy, dx, length):
|
||||
break
|
||||
else:
|
||||
return None, None
|
||||
|
||||
return y + length * dy, x + length * dx, dy, dx
|
||||
|
||||
def create_chunk_room(self, spawnable: bool = True) \
|
||||
-> Tuple[List[List[Tile]], int, int, int, int]:
|
||||
"""
|
||||
Create and return as a tile grid a room that is composed of multiple
|
||||
create and return as a tile grid a room that is composed of multiple
|
||||
overlapping circles of the same radius
|
||||
Also return door info so we know how to place the room in the level
|
||||
also return door info so we know how to place the room in the level
|
||||
"""
|
||||
height, width = 15, 15
|
||||
nb_chunks, r = 6, 3
|
||||
|
@ -341,6 +341,42 @@ class Generator:
|
|||
|
||||
return room, door_y, door_x, dy, dx
|
||||
|
||||
def create_rectangle_room(self, spawnable: bool = True) \
|
||||
-> Tuple[List[List[Tile]], int, int, int, int]:
|
||||
"""
|
||||
create and return as a tile grid a rectangular room
|
||||
also return door info so we know how to place the room in the level
|
||||
"""
|
||||
|
||||
shrt, lng = randint(3, 6), randint(6, 12)
|
||||
if random() < .5:
|
||||
height, width = shrt, lng
|
||||
else:
|
||||
height, width = lng, shrt
|
||||
|
||||
room = []
|
||||
|
||||
h_sup, w_sup, h_off, w_off = self.corr_meta_info()
|
||||
min_w, max_w = w_off + 1, width + w_off
|
||||
min_h, max_h = h_off + 1, height + h_off
|
||||
for i in range(height + h_sup + 2):
|
||||
room.append([])
|
||||
for j in range(width + w_sup + 2):
|
||||
if min_h <= i <= max_h and min_w <= j <= max_w:
|
||||
room[-1].append(Tile.FLOOR)
|
||||
else:
|
||||
room[-1].append(Tile.EMPTY)
|
||||
|
||||
# log all placed tiles as spawn positions
|
||||
if spawnable:
|
||||
self.register_spawn_area(room)
|
||||
|
||||
# attach exit
|
||||
door_y, door_x, dy, dx = self.attach_door(room, h_sup, w_sup,
|
||||
h_off, w_off)
|
||||
|
||||
return room, door_y, door_x, dy, dx
|
||||
|
||||
def create_random_room(self, spawnable: bool = True) \
|
||||
-> Tuple[List[list], int, int, int, int]:
|
||||
"""
|
||||
|
@ -361,6 +397,8 @@ class Generator:
|
|||
return self.create_circular_room(spawnable = spawnable)
|
||||
elif key == "chunks":
|
||||
return self.create_chunk_room(spawnable = spawnable)
|
||||
elif key == "rectangle":
|
||||
return self.create_rectangle_room(spawnable = spawnable)
|
||||
|
||||
def register_spawn_area(self, area: List[List[Tile]]) -> None:
|
||||
"""
|
||||
|
|
Loading…
Reference in New Issue