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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class BSPRoomGenerator(RoomGenerator):
 | 
			
		||||
    '''Generate a rooms-and-corridors style map with BSP.'''
 | 
			
		||||
class OneBigRoomGenerator(RoomGenerator):
 | 
			
		||||
    '''Generates one big room in the center of the map.'''
 | 
			
		||||
 | 
			
		||||
    @dataclass
 | 
			
		||||
    class Configuration:
 | 
			
		||||
        '''Configuration parameters for BSPRoomGenerator.'''
 | 
			
		||||
    def _generate(self) -> bool:
 | 
			
		||||
        if self.rooms:
 | 
			
		||||
            return True
 | 
			
		||||
 | 
			
		||||
        minimum_room_size: Size
 | 
			
		||||
        maximum_room_size: Size
 | 
			
		||||
        origin = Point(self.size.width // 4, self.size.height // 4)
 | 
			
		||||
        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(
 | 
			
		||||
        minimum_room_size=Size(7, 7),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue