Source code for donjuan.dungeon

from typing import Dict, List, Optional, Union

from donjuan.edge import Edge
from donjuan.grid import Grid, SquareGrid
from donjuan.hallway import Hallway
from donjuan.room import Room
from donjuan.space import Space


[docs]class Dungeon: def __init__( self, n_rows: Optional[int] = 5, n_cols: Optional[int] = 5, grid: Optional[Grid] = None, rooms: Optional[Dict[str, Room]] = None, hallways: Optional[Dict[str, Hallway]] = None, randomizers: Optional[List["Randomizer"]] = None, ): self._grid = grid or SquareGrid(n_rows, n_cols) self._rooms = rooms or {} self._hallways = hallways or {} self._randomizers = randomizers or [] self.room_entrances: Dict[Union[int, str], List[Edge]] = {}
[docs] def add_room(self, room: Room) -> None: self._rooms[room.name] = room
[docs] def add_hallway(self, hallway: Hallway) -> None: self.hallways[hallway.name] = hallway
@property def grid(self) -> Grid: return self._grid @property def hallways(self) -> Dict[str, Hallway]: return self._hallways @property def n_cols(self) -> int: return self.grid.n_cols @property def n_rows(self) -> int: return self.grid.n_rows @property def randomizers(self) -> List["Randomizer"]: return self._randomizers @property def rooms(self) -> Dict[str, Room]: return self._rooms
[docs] def randomize(self) -> None: """ For each item in :attr:`randomizers`, run the :meth:`Randomizer.randomize_dungeon` method on this dungeon. """ for rng in self.randomizers: rng.randomize_dungeon(self) return
[docs] def emplace_rooms(self) -> None: """ Replace the cells in the :attr:`grid` with the cells of the :attr:`rooms`. """ for room_name, room in self.rooms.items(): self.emplace_space(room) return
[docs] def emplace_space(self, space: Space) -> None: """ Replace the cells in the :attr:`grid` with the cells of the `Space`, and automatically link them with the `Edge`s in the `Grid`. Args: space (Space): room to emplace in the :attr:`grid` """ for cell in space.cells: self.grid.cells[cell.y][cell.x] = cell self.grid.link_edges_to_cells() assert cell.edges is not None, "problem linking edges to cell" return