Source code for evennia.contrib.tutorials.evadventure.rooms

"""
EvAdventure rooms.

The base EvAdventure room has a modified display header that shows a little mini-map.

All EvAdventure rooms inherit from this room, and it is integral to combat as well as
the dungeon generation. But one can also mix with other non-EvAdventure rooms (you will
just not be able to fight in them).

"""

from copy import deepcopy

from evennia import AttributeProperty, DefaultCharacter, DefaultRoom
from evennia.utils.utils import inherits_from

CHAR_SYMBOL = "|w@|n"
CHAR_ALT_SYMBOL = "|w>|n"
ROOM_SYMBOL = "|bo|n"
LINK_COLOR = "|B"

_MAP_GRID = [
    [" ", " ", " ", " ", " "],
    [" ", " ", " ", " ", " "],
    [" ", " ", "@", " ", " "],
    [" ", " ", " ", " ", " "],
    [" ", " ", " ", " ", " "],
]
_EXIT_GRID_SHIFT = {
    "north": (0, 1, "||"),
    "east": (1, 0, "-"),
    "south": (0, -1, "||"),
    "west": (-1, 0, "-"),
    "northeast": (1, 1, "/"),
    "southeast": (1, -1, "\\"),
    "southwest": (-1, -1, "/"),
    "northwest": (-1, 1, "\\"),
}


[docs]class EvAdventureRoom(DefaultRoom): """ Simple room supporting some EvAdventure-specifics. """ allow_combat = AttributeProperty(False, autocreate=False) allow_pvp = AttributeProperty(False, autocreate=False) allow_death = AttributeProperty(False, autocreate=False)
[docs] def format_appearance(self, appearance, looker, **kwargs): """Don't left-strip the appearance string""" return appearance.rstrip()
[docs] def get_display_header(self, looker, **kwargs): """ Display the current location as a mini-map. """ # make sure to not show make a map for users of screenreaders. # for optimization we also don't show it to npcs/mobs if not inherits_from(looker, DefaultCharacter) or ( looker.account and looker.account.uses_screenreader() ): return "" # build a map map_grid = deepcopy(_MAP_GRID) dx0, dy0 = 2, 2 map_grid[dy0][dx0] = CHAR_SYMBOL for exi in self.exits: dx, dy, symbol = _EXIT_GRID_SHIFT.get(exi.key, (None, None, None)) if symbol is None: # we have a non-cardinal direction to go to - indicate this map_grid[dy0][dx0] = CHAR_ALT_SYMBOL continue map_grid[dy0 + dy][dx0 + dx] = f"{LINK_COLOR}{symbol}|n" if exi.destination != self: map_grid[dy0 + dy + dy][dx0 + dx + dx] = ROOM_SYMBOL # Note that on the grid, dy is really going *downwards* (origo is # in the top left), so we need to reverse the order at the end to mirror it # vertically and have it come out right. return " " + "\n ".join("".join(line) for line in reversed(map_grid))
[docs]class EvAdventurePvPRoom(EvAdventureRoom): """ Room where PvP can happen, but noone gets killed. """ allow_combat = AttributeProperty(True, autocreate=False) allow_pvp = AttributeProperty(True, autocreate=False)