From 38878687c43c11791752b2ac7bc551405d03af80 Mon Sep 17 00:00:00 2001 From: Charles Peyrat Date: Sat, 16 Jan 2021 00:35:41 +0100 Subject: [PATCH] Add new room type : rectangular rooms --- squirrelbattle/mapgeneration/broguelike.py | 52 +++++++++++++++++++--- 1 file changed, 45 insertions(+), 7 deletions(-) diff --git a/squirrelbattle/mapgeneration/broguelike.py b/squirrelbattle/mapgeneration/broguelike.py index 6cdf3f8..70247aa 100644 --- a/squirrelbattle/mapgeneration/broguelike.py +++ b/squirrelbattle/mapgeneration/broguelike.py @@ -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: """