Add two new room generators
- OneBigRoomGenerator - RandomRectRoomGenerator
This commit is contained in:
parent
9d00f3b638
commit
85b059dbd4
1 changed files with 45 additions and 7 deletions
|
@ -97,15 +97,53 @@ class RoomGenerator:
|
||||||
tiles[pt.x, pt.y] = StairsDown
|
tiles[pt.x, pt.y] = StairsDown
|
||||||
|
|
||||||
|
|
||||||
class BSPRoomGenerator(RoomGenerator):
|
class OneBigRoomGenerator(RoomGenerator):
|
||||||
'''Generate a rooms-and-corridors style map with BSP.'''
|
'''Generates one big room in the center of the map.'''
|
||||||
|
|
||||||
@dataclass
|
def _generate(self) -> bool:
|
||||||
class Configuration:
|
if self.rooms:
|
||||||
'''Configuration parameters for BSPRoomGenerator.'''
|
return True
|
||||||
|
|
||||||
minimum_room_size: Size
|
origin = Point(self.size.width // 4, self.size.height // 4)
|
||||||
maximum_room_size: Size
|
size = Size(self.size.width // 2, self.size.height // 2)
|
||||||
|
room = RectangularRoom(Rect(origin, size))
|
||||||
|
|
||||||
|
self.rooms.append(room)
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
class RandomRectRoomGenerator(RoomGenerator):
|
||||||
|
'''Generate rooms by repeatedly attempting to place rects of random size across the map.'''
|
||||||
|
|
||||||
|
NUMBER_OF_ATTEMPTS_PER_ROOM = 5
|
||||||
|
|
||||||
|
def _generate(self) -> bool:
|
||||||
|
number_of_attempts = 0
|
||||||
|
|
||||||
|
minimum_room_size = self.configuration.minimum_room_size
|
||||||
|
maximum_room_size = self.configuration.maximum_room_size
|
||||||
|
|
||||||
|
width_range = (minimum_room_size.width, maximum_room_size.width)
|
||||||
|
height_range = (minimum_room_size.height, maximum_room_size.height)
|
||||||
|
|
||||||
|
while len(self.rooms) < self.configuration.number_of_rooms:
|
||||||
|
size = Size(random.randint(*width_range), random.randint(*height_range))
|
||||||
|
origin = Point(random.randint(0, self.size.width - size.width),
|
||||||
|
random.randint(0, self.size.height - size.height))
|
||||||
|
candidate_room_rect = Rect(origin, size)
|
||||||
|
|
||||||
|
overlaps_any_existing_room = any(candidate_room_rect.intersects(room.bounds) for room in self.rooms)
|
||||||
|
if not overlaps_any_existing_room:
|
||||||
|
self.rooms.append(RectangularRoom(candidate_room_rect))
|
||||||
|
number_of_attempts = 0
|
||||||
|
continue
|
||||||
|
|
||||||
|
number_of_attempts += 1
|
||||||
|
if number_of_attempts > RandomRectRoomGenerator.NUMBER_OF_ATTEMPTS_PER_ROOM:
|
||||||
|
break
|
||||||
|
|
||||||
|
return True
|
||||||
|
|
||||||
DefaultConfiguration = Configuration(
|
DefaultConfiguration = Configuration(
|
||||||
minimum_room_size=Size(7, 7),
|
minimum_room_size=Size(7, 7),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue