# Source code for evennia.contrib.grid.xyzgrid.example

    """
    Example xymaps to use with the XYZgrid contrib. Build outside of the game using
    the `evennia xyzgrid` launcher command.

    First add the launcher extension in your mygame/server/conf/settings.py:

        EXTRA_LAUNCHER_COMMANDS['xyzgrid'] = 'evennia.contrib.grid.xyzgrid.launchcmd.xyzcommand'

    Then

        evennia xyzgrid init
        evennia xyzgrid add evennia.contrib.grid.xyzgrid.map_example
        evennia xyzgrid build

    """

    from evennia.contrib.grid.xyzgrid import xymap_legend

    # default prototype parent. It's important that
    # the typeclass inherits from the XYZRoom (or XYZExit)
    # if adding the evennia.contrib.grid.xyzgrid.prototypes to
    # settings.PROTOTYPE_MODULES, one could just set the
    # prototype_parent to 'xyz_room' and 'xyz_exit' here
    # instead.

    ROOM_PARENT = {
        "key": "An empty room",
        "prototype_key": "xyz_exit_prototype",
        # "prototype_parent": "xyz_room",
        "typeclass": "evennia.contrib.grid.xyzgrid.xyzroom.XYZRoom",
        "desc": "An empty room.",
    }

    EXIT_PARENT = {
        "prototype_key": "xyz_exit_prototype",
        # "prototype_parent": "xyz_exit",
        "typeclass": "evennia.contrib.grid.xyzgrid.xyzroom.XYZExit",
        "desc": "A path to the next location.",
    }

    # ---------------------------------------- map1
    # The large tree
    #
    # this exemplifies the various map symbols
    # but is not heavily prototyped

    MAP1 = r"""
                           1
     + 0 1 2 3 4 5 6 7 8 9 0

     8   #-------#-#-------I
          \               /
     7     #-#---#     t-#
           |\    |
     6   #i#-#b--#-t
           |     |
     5     o-#---#
              \ /
     4     o---#-#
          /    d
     3   #-----+-------#
               |       d
     2         |       |
               v       u
     1         #---#>#-#
              /
     0       #-T

     + 0 1 2 3 4 5 6 7 8 9 0
                           1
    """

    class TransitionToCave(xymap_legend.TransitionMapNode):
        """
        A transition from 'the large tree' to 'the small cave' map. This node is never spawned
        into a room but only acts as a target for finding the exit's destination.

        """

        symbol = "T"
        target_map_xyz = (1, 0, "the small cave")

    # extends the default legend
    LEGEND_MAP1 = {"T": TransitionToCave}

    # link coordinates to rooms
    PROTOTYPES_MAP1 = {
        # node/room prototypes
        (3, 0): {
            "key": "Dungeon Entrance",
            "desc": "To the east, a narrow opening leads into darkness.",
        },
        (4, 1): {
            "key": "Under the foilage of a giant tree",
            "desc": "High above the branches of a giant tree blocks out the sunlight. A slide "
            "leading down from the upper branches ends here.",
        },
        (4, 4): {
            "key": "The slide",
            "desc": "A slide leads down to the ground from here. It looks like a one-way trip.",
        },
        (6, 1): {
            "key": "Thorny path",
            "desc": "To the east is a pathway of thorns. If you get through, you don't think you'll be "
            "able to get back here the same way.",
        },
        (8, 1): {"key": "By a large tree", "desc": "You are standing at the root of a great tree."},
        (8, 3): {"key": "At the top of the tree", "desc": "You are at the top of the tree."},
        (3, 7): {
            "key": "Dense foilage",
            "desc": "The foilage to the east is extra dense. It will take forever to get through it.",
        },
        (5, 6): {
            "key": "On a huge branch",
            "desc": "To the east is a glowing light, may be a teleporter to a higher branch.",
        },
        (9, 7): {
            "key": "On an enormous branch",
            "desc": "To the west is a glowing light. It may be a teleporter to a lower branch.",
        },
        (10, 8): {
            "key": "A gorgeous view",
            "desc": "The view from here is breathtaking, showing the forest stretching far and wide.",
        },
        # default rooms
        ("*", "*"): {
            "key": "Among the branches of a giant tree",
            "desc": "These branches are wide enough to easily walk on. There's green all around.",
        },
        # directional prototypes
        (3, 0, "e"): {"desc": "A dark passage into the underworld."},
    }

    for key, prot in PROTOTYPES_MAP1.items():
        if len(key) == 2:
            # we don't want to give exits the room typeclass!
            prot["prototype_parent"] = ROOM_PARENT
        else:
            prot["prototype_parent"] = EXIT_PARENT

    XYMAP_DATA_MAP1 = {
        "zcoord": "the large tree",
        "map": MAP1,
        "legend": LEGEND_MAP1,
        "prototypes": PROTOTYPES_MAP1,
    }

    # -------------------------------------- map2
    # The small cave
    # this gives prototypes for every room

    MAP2 = r"""
    + 0 1 2 3

    3   #-#-#
        |x|
    2 #-#-#
        |  \
    1   #---#
        |  /
    0 T-#-#

    + 0 1 2 3

    """

    # custom map node
    class TransitionToLargeTree(xymap_legend.TransitionMapNode):
        """
        A transition from 'the small cave' to 'the large tree' map. This node is never spawned
        into a room by only acts as a target for finding the exit's destination.

        """

        symbol = "T"
        target_map_xyz = (3, 0, "the large tree")

    # this extends the default legend (that defines #,-+ etc)
    LEGEND_MAP2 = {"T": TransitionToLargeTree}

    # prototypes for specific locations
    PROTOTYPES_MAP2 = {
        # node/rooms prototype overrides
        (1, 0): {
            "key": "The entrance",
            "desc": "This is the entrance to a small cave leading into the ground. "
            "Light sifts in from the outside, while cavernous passages disappear "
            "into darkness.",
        },
        (2, 0): {
            "key": "A gruesome sight.",
            "desc": "Something was killed here recently. The smell is unbearable.",
        },
        (1, 1): {
            "key": "A dark pathway",
            "desc": "The path splits three ways here. To the north a faint light can be seen.",
        },
        (3, 2): {
            "key": "Stagnant water",
            "desc": "A pool of stagnant, black water dominates this small chamber. To the nortwest "
            "a faint light can be seen.",
        },
        (0, 2): {"key": "A dark alcove", "desc": "This alcove is empty."},
        (1, 2): {
            "key": "South-west corner of the atrium",
            "desc": "Sunlight sifts down into a large underground chamber. Weeds and grass sprout "
            "between the stones.",
        },
        (2, 2): {
            "key": "South-east corner of the atrium",
            "desc": "Sunlight sifts down into a large underground chamber. Weeds and grass sprout "
            "between the stones.",
        },
        (1, 3): {
            "key": "North-west corner of the atrium",
            "desc": "Sunlight sifts down into a large underground chamber. Weeds and grass sprout "
            "between the stones.",
        },
        (2, 3): {
            "key": "North-east corner of the atrium",
            "desc": "Sunlight sifts down into a large underground chamber. Weeds and grass sprout "
            "between the stones. To the east is a dark passage.",
        },
        (3, 3): {
            "key": "Craggy crevice",
            "desc": "This is the deepest part of the dungeon. The path shrinks away and there "
            "is no way to continue deeper.",
        },
        # default fallback for undefined nodes
        ("*", "*"): {"key": "A dark room", "desc": "A dark, but empty, room."},
        # directional prototypes
        (1, 0, "w"): {"desc": "A narrow path to the fresh air of the outside world."},
        # directional fallbacks for unset directions
        ("*", "*", "*"): {"desc": "A dark passage"},
    }

    # this is required by the prototypes, but we add it all at once so we don't
    # need to add it to every line above
    for key, prot in PROTOTYPES_MAP2.items():
        if len(key) == 2:
            # we don't want to give exits the room typeclass!
            prot["prototype_parent"] = ROOM_PARENT
        else:
            prot["prototype_parent"] = EXIT_PARENT

    XYMAP_DATA_MAP2 = {
        "map": MAP2,
        "zcoord": "the small cave",
        "legend": LEGEND_MAP2,
        "prototypes": PROTOTYPES_MAP2,
        "options": {"map_visual_range": 1, "map_mode": "scan"},
    }

    # This is read by the parser
    XYMAP_DATA_LIST = [XYMAP_DATA_MAP1, XYMAP_DATA_MAP2]