Add new room type : rectangular rooms
This commit is contained in:
		@@ -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:
 | 
			
		||||
        """
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user