Note

You are reading an old version of the Evennia documentation. The latest version is here

.

# 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, "\\"),
    }

    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)

        def format_appearance(self, appearance, looker, **kwargs):
            """Don't left-strip the appearance string"""
            return appearance.rstrip()

        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))

    class EvAdventurePvPRoom(EvAdventureRoom):
        """
        Room where PvP can happen, but noone gets killed.

        """

        allow_combat = AttributeProperty(True, autocreate=False)
        allow_pvp = AttributeProperty(True, autocreate=False)

Note

You are reading an old version of the Evennia documentation. The latest version is here

.