chainsol icon

Untitled

chainsol | PRO | 06/13/17 01:50:04 AM UTC | 0 ⭐ | 492 👁️ | Never ⏰ | []
Python |

3.54 KB

|

None

|

0 👍

/

0 👎

from evennia.commands.default.muxcommand import MuxCommand
from evennia.utils.evmenu import EvMenu
 
# Following this are the menu nodes. EvMenu
# imports all these as nodes, so be careful
# what functions you put here
def node_get_1(caller):
    # This is the first node called by EvMenu.
    # It just sets a prompt, and since the only
    # command is _default, it just passes that
    # to the next node.
    text = "Please enter first description:\n"
    options = ({'key': '_default',
        'goto': 'node_get_2'},) # goto tells EvMenu where to go next
 
    return text, options # call signature - every function for an
                         # evmenu has to return text, options
 
def node_get_2(caller, raw_string):
    # each node is passed the text entered
    # via raw_string. technically we should use
    # raw_string.strip()
    # _menutree is set by EvMenu on the caller.
    # use it to store info you need through the menu
    # it deletes itself after
    caller.ndb._menutree.desc1 = raw_string
    text = "Please enter second description:\n"
    options = ({'key': '_default',
        'goto': 'node_get_3'},)
    return text, options
 
def node_get_3(caller, raw_string):
    caller.ndb._menutree.desc2 = raw_string
    text = "Please enter third description:\n"
    options = ({'key': '_default',
        'goto': 'node_final'},)
    return text, options
 
def node_final(caller, raw_string):
    # final node, lots going on here
 
    # first we pull our descriptions out of the _menutree
    desc1 = caller.ndb._menutree.desc1
    desc2 = caller.ndb._menutree.desc2
    # we're passed a final string from the last node
    desc3 = raw_string
 
    # in our initialization of EvMenu, we added these arguments.
    # EvMenu stores this info in _menutree automagically.
    player_a = caller.ndb._menutree.player_a
    player_b = caller.ndb._menutree.player_b
 
    # past here, do as you will with the data. this is an example
    player_a.msg(desc1)
    player_b.msg(desc2)
 
    # so here, we could just use caller.location.msg, or you could uncomment the confusing generator.
    # up to you
    """
    players = [con for con in caller.location.contents if con.has_player]
    for player in players:
        player.msg(desc3)
    """
    caller.location.msg_contents(desc3, exclude=[player_a, player_b])
 
    text = "Successfully completed spell!"
    return text, None
 
class CmdSpell(MuxCommand):
    """
    Cast a Spell
 
    Usage:
         +spell [target-1] [target-2]
    """
    key = "+spell"
    locks = "cmd:all()"
 
    def func(self):
        if not self.args:
            self.msg("You must provide a target for your spell.")
            return
        if ' ' in self.args:
            arg1, arg2 = self.args.split(' ', 1)
            playerA = self.caller.search(arg1)
            playerB = self.caller.search(arg2)
 
            # just in case we don't get a player target, we return if so
            if not playerA or not playerB:
                self.caller.msg("Couldn't find those players")
                return
            # this calls EvMenu with our menu. It imports from the
            # module we give it, in this case, our own module.
            # in practice you should store your menus somewhere else.
            EvMenu(self.caller, 'commands.spells',
                   startnode='node_get_1', # this is the initial node
                   player_a=playerA, # any data we give as kwargs is passed
                   player_b=playerB) # to the menu in caller.ndb._menutree

Comments