命令提示语


提示语在MUD中相当普遍。提示语显示有关你角色的有用详情,这些详情很可能是你时刻想要留意的,例如健康值、法力值,等等。它也能显示游戏累计时长、天气等。许多新式的MUD客户端(包括Evennia自己的Web客户端)都能识别提示语并在正确位置显示出来(往往是在输入行的正上方)。通常它会一直保持不变直到明确被要求更新。

发送一个提示语

使用关键字 prompt 将提示语传给对象的 msg() 方法。被发送的提示语不包含任何换行符。
    self.msg(prompt="HP: 5, MP: 2, SP: 8")
你可以将普通文本和提示语(的更新)合并发送:
    self.msg("This is a text", prompt="This is a prompt")
你可以按需更新提示语,这一般通过相关属性的带外数据跟踪来实现(比如角色的健康值)。举例来说,当健康值被攻击命令改变时,你可以确保提示语也得到更新。

这里有一个来自命令类的提示语发送/更新的简单例子:
    from evennia import Command

    class CmdDiagnose(Command):
        """
        see how hurt your are

        Usage: 
          diagnose [target]

        This will give an estimate of the target's health. Also
        the target's prompt will be updated. 
        """ 
        key = "diagnose"

        def func(self):
            if not self.args:
                target = self.caller
            else:
                target = self.search(self.args)
                if not target:
                    return
            # try to get health, mana and stamina
            hp = target.db.hp
            mp = target.db.mp
            sp = target.db.sp

            if None in (hp, mp, sp):
                # Attributes not defined          
                self.caller.msg("Not a valid target!")
                return 

            text = "You diagnose %s as having " \
                   "%i health, %i mana and %i stamina." \
                   % (hp, mp, sp)
            prompt = "%i HP, %i MP, %i SP" % (hp, mp, sp)
            self.caller.msg(text, prompt=prompt)

每个命令都发送提示语

上述提示语的发送过程使用标准telnet指令(Evennia Web客户端获得一个特殊标记)。大部分MUD游戏的telnet客户端可以读懂并允许用户捕获这个标记,然后把提示语放对位置,直到它被更新。因此理论上你不需要为每个命令都发送一次更新。

然而,在一个多样的用户群中,你很难搞清楚使用了哪些客户端、用户的技术水平如何。因此每个命令都发送提示语是一个万全之策。当然你不必下手进入每个命令中修改。你可以修改命令基类成为你自己的命令类(比如 mygame/commands/command.py 文件夹中的 MuxCommand)并重载 at_post_command() 钩子。这个钩子总是在一个命令的主方法 func() 之后被调用。
from evennia import default_cmds

class MuxCommand(default_cmds.MuxCommand):
    # ...
    def at_post_command(self):
        "called after self.func()."
        caller = self.caller        
        prompt = "%i HP, %i MP, %i SP" % (caller.db.hp, 
                                          caller.db.mp, 
                                          caller.db.sp)
        caller.msg(prompt=prompt)

更改默认命令

如果你只打算像下面这样添加点小东西到Evennia的默认命令中而非直接修改它们,最简单的方法是仅仅通过多重继承把它们封装到你自己的基类中:
# in (for example) mygame/commands/mycommands.py

from evennia import default_cmds
# our custom MuxCommand with at_post_command hook
from commands.command import MuxCommand

# overloading the look command
class CmdLook(default_cmds.CmdLook, MuxCommand):
    pass
其结果是自定义类 MuxCommand 中的钩子将随着多重继承融入默认类 CmdLook。下一步你只需把它添加到你的默认命令集中:
# in mygame/commands/default_cmdsets.py

from evennia import default_cmds
from commands import mycommands

class CharacterCmdSet(default_cmds.CharacterCmdSet):
    # ...
    def at_cmdset_creation(self):
        # ...
        self.add(mycommands.CmdLook())
这将会自动用你的版本替换游戏中的默认命令 look。