最初的编码


本文给你简短的、一步步的指导,教你如何第一次设置Evennia,这样你就可以很容易地修改、重载默认值。你只需要按这些步骤做一次。本文还会教你做一些最基本的调整。

在继续之前,请确保你已经按“准备开始”的指导安装了Evennia并已经可以运行了。你应该已经用 evennia --init foldername 命令创建了新的游戏目录。在以下内容中,我们假设这个文件夹的名字为“mygame”
建议你同时也看一下短文“编码简介”(尤其是关于ev接口的那部分内容,今后会对你有帮助)。

要学习本教程,你需要有操作电脑终端或命令行的基本知识。你还需要一个文本编辑器来编辑、创建源代码的文本文件。在网上有很多教程教你如何使用终端,也有很多优秀的免费文本编辑器。我们将假定你已经熟悉这些东西了。


你的第一个修改

下面你要在自定义的新模块中开始首次尝试,你可以尝试它以感受这个系统。还可以参阅“教程”以获取更多的有针对性的指导。

调整默认角色
我们将给默认角色添加一些简单的RPG属性。在下一节中,我们将使用一个新的命令来查看这些属性。

  1. 编辑 mygame/typeclasses/characters.py 修改 Character 类。at_object_creation 在其父类 DefaultCharacter 中也有定义,这会重载它。get_abilities 方法是在这个 Character 中新定义的。
    class Character(DefaultCharacter)
        # [...]
        def at_object_creation(self):
            """
            Called only at initial creation. This is a rather silly
            example since ability scores should vary from Character to
            Character and is usually set during some character
            generation step instead.
            """
            #set persistent attributes
            self.db.strength = 5
            self.db.agility = 4
            self.db.magic = 2
    
        def get_abilities(self):
            """
            Simple access method to return ability
            scores as a tuple (str,agi,mag)
            """
            return self.db.strength, self.db.agility, self.db.magic
    
  2. 重新加载(reload)服务器(重启之后你仍然可以保持连接到游戏)

更新你自身
注意,新属性只会添加在新创建的角色上(at_object_creation 只会在第一次创建对象时被调用)。所以,如果你现在对自己调用 get_abilities ,你会看到这些值并没有被设置。
#(你必须作为超级用户才能使用 @py 命令)
@py self.get_abilities()
<<< (None, None, None)
这是因为你的角色在你对 Character 类做修改之前就已经被创建了,at_object_creation() 函数不会被再次调用。

要修正它很简单,你可以通过 @typeclass 命令强制重新执行你自身的初始化钩子函数:
@typeclass/force self
这可以对你自身重新执行 at_object_creation(在代码中你可以调用 Character.swap_typeclass 并带上相同的参数)。你现在应该可以成功获取这些属性了:
@py self.get_abilities()
<<< (5, 4, 2)
参见“物体类型类教程”以获取更多的帮助,以及“类型类”和“属性”的文档以获得详细信息。

添加新的默认命令
前面使用的 @py 命令只适用于特权用户,我们希望任何一个玩家都能够看到这些属性。让我们添加一个新命令用来列出上一节中添加的属性。
  1. 打开 mygame/commands/command.py。原则上,你可以把你的命令放在任何地方,但这个模块已经导入了所有所需的模块而且还带有一些有用的文档。在这个文件的最后加上一个新的类:
        class CmdAbilities(Command):
            """
            List abilities
    
            Usage:
              abilities
    
            Displays a list of your current ability values.
            """
            key = "abilities"
            aliases = ["abi"]
            lock = "cmd:all()"
            help_category = "General"
    
            def func(self):
                "implements the actual functionality"
    
                str, agi, mag = self.caller.get_abilities()
                string = "STR: %s, AGI: %s, MAG: %s" % (str, agi, mag)
                self.caller.msg(string)
    
  2. 接下来编辑 mygame/commands/default_cmdsets.py ,在开始的地方加上
        from commands.command import CmdAbilities
    
  3. CharacterCmdSet 类接近底部的地方(在文件里有说明的)添加以下内容
        self.add(CmdAbilities())
    
  4. 重启(reload)服务器(没有人会因此断开连接)

现在你(以及其他人)应该可以像使用普通命令一样使用 abilities(或它的别名abi)了:
abilities
STR: 5, AGI: 4, MAG: 2
参见“添加命令教程”以获得更多例子,以及“命令”文档以获得有关命令系统的详细信息。

创建新的物体类型
让我们尝试创建一种新的物体类型,在这个例子中我们要创建一块“聪明的石头”,当你像这样看它的时候它会返回随机的文字。
> look stone

A very wise stone

This is a very wise old stone.
It grumbles and says: 'The world is like a rock of chocolate.'

  1. mygame/typeclasses/ 中创建一个新模块,这个例子中我们将它命名为 wiseobject.py
  2. 在模块中导入 Object 的基类(typeclasses.objects.Object)。它默认是空的,它 只是默认的 evennia.DefaultObject 的一个代理。
  3. 在你的模块中创建一个继承自 Object 的新类。重载钩子函数以添加新的功能。以下是文件内容的例子:
    from random import choice
    from typeclasses.objects import Object
    
    class WiseObject(Object):
        """
        An object speaking when someone looks at it. We
        assume it looks like a stone in this example.
        """
        def at_object_creation(self):
            "Called when object is first created"
            self.db.wise_texts = \
                    ["Stones have feelings too.",
                     "To live like a stone is to not have lived at all.",
                     "The world is like a rock of chocolate."]
    
        def return_appearance(self, looker):
            """
            Called by the look command. We want to return
            a wisdom when we get looked at.
            """
            # first get the base string from the
            # parent's return_appearance.
            string = super(WiseObject, self).return_appearance(looker)
            wisewords = "\n\nIt grumbles and says: '%s'"
            wisewords = wisewords % choice(self.db.wise_texts)
            return string + wisewords
    
  4. 检查你的代码是否有bug。在命令行或日志中会显示出回溯。如果你的代码中有严重的语法错误,源文件本身将无法被加载,这可能会导致整个命令集出现问题。如果遇到这种情况,修复bug并在命令行中重新加载服务器(没有人会因此断开连接)。
  5. 使用 @create/drop stone:wiseobject.WiseObject 创建一块会说话的石头。如果 @create 命令返回出错信息或者说它无法找到类型类(它会告诉你它搜索过的路径),重新检查代码中是否有bug,并且检查你给出的路径是否正确。@create 命令会在 mygame/typeclasses/ 中搜索类型类。
  6. look stone 命令来测试一下,你会看到默认的描述信息(“You see nothing special”),后面跟着以石头的智慧产生出的随机信息。使用 @desc stone = This is a wise old stone. 命令,让它看上去更漂亮些。参见建造者文档以获取更多信息。

请注意,at_object_creation 只会在石头初次创建时被调用一次。如果你在此之后修改了这个方法,已经创建过的石头无法自动应用这些变化。你需要像前文的 Character 例子一样,使用 @typeclass/force 命令让石头重新初始化。

at_object_creation 是一个特例,更改类型类的其他部分并不需要这样手动更新,你只需要执行 @reload,所有的变化就会自动应用到所有已存在的物体上了。


接下来做什么?

还有更多的教程,其中包括一个建立完整的MUSH风格的小游戏的教程 —— 即使你对MUSH游戏本身没兴趣,这对你也是有帮助的。建议你加入IRC聊天邮件列表,这样就可以和社区及其他开发人员保持联系了。


(原文:https://github.com/Evennia/evennia/wiki/First Steps Coding    翻译:卢铱俊)