建造入门


Evennia的默认命令与MUX有类似的风格,如果你以前使用过此类命令应该会对此比较熟悉。如果没有,你可能会对所用的 @ 符号感到困惑。这只是一种命名的约定 —— 超越角色的命令或与管理有关的操作往往以 @ 开头,这个符号本身没有什么含义。

默认的命令为以下样式(其中 [...] 表示可选部分):
命令[/开关/开关...] [参数...]
开关是一种特殊的、可选的标志,让命令执行起来有所不同。它总是直接跟在命令名称之后以斜杠(/)开始 。参数是输入给命令的一项或多项内容。当给某个对象赋值时,通常会使用等号(=)。

下面是一些命令的例子,使用 help <命令> 可以了解每个命令以及它们选项的详细内容。


走下神坛

如果你刚安装Evennia,你的第一个账号被称为用户#1,即超级用户或上帝用户。此用户非常强大,强大到可以超越许多游戏中的限制,比如锁。这很有用,但它也会隐藏掉一些你可能想要测试的功能。

想要暂时调低你的超级用户权限,可以使用 @quell 命令:
> @quell
这可以让你使用当前角色的权限,而不是你的超级用户权限。如果你没有改动过任何设置,你的角色应该有神级权限 —— 它不会像超级用户一样绕开锁,这对本页中的列子都适用。之后你可以使用 @unquell 回到超级用户权限。


创建物体

基本的物体可以是任何东西 —— 剑、花、非玩家角色,他们可以用 @create 命令创建:
> @create box
这会在你的行囊中创建一个新的默认类型的“box”(盒子)。使用命令inventory(或 i)可以看到它。“box”是一个比较短的名字,让我们给它重命名并加上几个别名。
> @name box = very large box;box;very;crate
现在我们将“盒子”改名为“非常大的盒子”(我们会这样看到它),但我们也可以通过其它名字来识别它 —— 如 crate 或前面所用的 box。我们也可以在 @create 命令中的名字后面直接给出这些别名,这是适用于所有的创建命令 —— 你可以在新建物体的名字后面加上一串用“;”分割的别名。如果你想不改变名字而只想添加别名,你可以使用@alias命令。

我们现在正带着箱,让我们放下它。
> drop box
如变戏法一般,它现在原封不动地放到了地上(使用/drop开关,你还可以在一条命令中创建并放下物体,如:@create/drop box)。
> examine box
这将显示有关盒子对象的一些技术细节(你通常可以把examine缩写为ex)。现在我们暂时忽略显示出来的信息。

试着观察盒子,看看显示的(默认)描述。
> look box
让我们添加一些特性。
> @describe box = This is a large and very heavy box. (这是一个又大又重的盒子)
如果你使用 get 命令,我们可以拿起盒子。到目前为止一切都还好,但如果我们真的想让它变成一个又大又重的盒子,人们就应该无法轻易地搬动它。为了避免出现这种情况,我们需要将它锁定。这可以通过给它分配一个锁来完成。确保盒子已放在当前房间中并使用这个命令:
> @lock box = get:false()
锁是一个很大的话题,在这里只讨论我们正在做的事情。这会锁定盒子,没有人能拿起它,除了超级用户,他们能超越所有的锁并把它捡起来。请确保你已经降低了你的超级用户权限,现在试试看拿起盒子:
> get box
You can't get that. (你无法拿起它。)
是不是觉得显示出来的默认错误消息看起来很呆板?get 命令会查找一个名为 get_err_msg 的属性,以此来返回更适合的错误信息(我们只是正好知道这些,你需要深入 get 命令的代码把它找出来)。你可以使用 @set 命令来设置属性:
> @set box/get_err_msg = It's way too heavy for you to lift. (它太重了,你拿不起来。)
再试着拿起它,你应该可以看到回显出的更好的错误信息。


活动起来

脚本是强大的工具,它可以在对象上添加与时间相关的效果。让我们来使用第一个脚本。在 game/gamesrc/scripts/examples/bodyfunctions.py 中有一个脚本的例子叫做 BodyFunctions。我们需要用 @script 添加它:
> @script self = examples.bodyfunctions.BodyFunctions
(请注意,只要你指向的是 gamesrc/scripts 中的目录,你就不必提供完整路径)。稍等片刻你就会发现自己开始随机做动作。
> @script self
这会显示出你自己身上脚本的详情(同时也检查工作状态)。你会看到还需要多少时间触发下一步动作。如果倒数到零的时候什么也没发生,不要惊慌,在这个脚本中有一个随机数发生器,它会决定是说还是不说,所以不是每次触发都会看到输出。

如果你厌倦了你的角色的“自我活动”,可以用以下命令终止脚本
> @script/stop self = examples.bodyfunctions.BodyFunctions


按你的按钮

如果我们回到所做的盒子,现在你可以对它做的也就只有那么点乐趣。这只是一个笨笨的通用对象。即使给它改名为石头并且改变它的描述信息,它也不会变得更聪明。然而,将自定义类型类脚本和基于对象的命令结合起来使用,你可以扩展各种物体,让它们变成你想象的的那样独特、复杂、有互动。

让我们举个例子。到目前为止,我们只用默认的名为 Object 的类型类创建了物体,让我们创建更有趣的物体。在 game/gamesrc/objects/ 的 examples 目录中有一个模块 red_button.py。它包含了一个神秘的 redButton 类型类。

让我们自己来创建一个!
> @create/drop button:examples.red_button.RedButton
如同 Python 中的 import 一样,我们引入了 python 类 RedButton。Evennia 默认会在 game/gamesrc/objects/ 中进行搜索,所以你不必每次都写完整路径。就是这样 —— 一个红色按钮。

RedButton 是一个示例物体,用于展示 Evennia 的一些功能。你会发现,在所有 game/gamesrc/ 的examples文件夹中都有控制它的类型类命令

如果你等待一段时间(请确认你已经放下了它!)按钮会动人地闪耀起来。你何不按(push)它一下...?当然啦,一个红色的大按钮就是用来按的。你知道你想这么做。


给自己造间房子

塑造游戏世界的主要命令是 @dig。例如,如果你处在虚空中,你可以像这样挖一条通道到你的新房子:
> @dig house = large red door;door;in,to the outside;out
这会创建一个名为“house”的新房间。房间名称和别名起始、结束处的空格都将被忽略,所以如果你想要,可以添加更多空格。这条命令将在你当前的位置直接创建一个名为“large red door”的出口,并且在 house 中创建一个名为“to the outside”的相应出口以返回虚空。我们还给这些出口定义了别名,这样人们就不必每次都写完整的名字了。

如果你想用标准的罗盘方向(北、西、西南等),你同样可以用 @dig。Evennia还提供了一个限定版的 @dig 命令,有助于罗盘方向的使用(也包括上/下和进入/退出),这就是 @tunnel 命令:
> @tunnel sw = cliff(悬崖)
这会创建一个新的房间“cliff”,有出口“southwest”(西南)指向它,而路径“northeast”(东北)从悬崖指回你的当前位置。

你可以使用 @open 命令从你当前位置创建新的出口:
> @open north;n = house
这会打开一个出口 north(别名为 n)到先前创建的房间house。

如果你有很多名为 house 的房间,你会看到一个同名房间的列表并要选择连接到哪一个。你也可以指定它的数据库号(#dbref),这是每个对象唯一的。你可以通过 examine 命令查看它,或通过 @objects 命令来查看最新建造的对象信息。

通过north出口进入你的“house”或 @teleport(传送)过去:
> north
或:
> @teleport house
要手动打开一个返回虚空的出口(如果你没有用 @dig 命令做过):
> @open door = limbo
(或给虚空的数据库号#2)


调整一下

你可以使用 @find 命令查找东西。假设你已回到虚空,让我们传送大盒子到我们的 house(房子)。
> @teleport box = house
very large box is leaving Limbo, heading for house. (大盒子正离开虚空前往房子。)
Teleported very large box -> house. (大盒子传送到 -> 房子)
我们仍然可以用 @find 找到盒子:
> @find box
One Match(#1-#8): (一个匹配)
very large box(#8) - src.objects.objects.Object
知道了盒子的 #数据库号(在这个例子中是#8),你可以抓住盒子并把它放回这里而不需先前往房子:
> @teleport #8 = here
(你通常可以用here来表示你的当前位置,要表示你自己可以使用 self 或 me)。现在盒子应该回到虚空和你在一起了。

我们现在厌倦盒子了,让我们来销毁它。
> @destroy box
你可以使用逗号分隔的对象列表(或如果他们不在同一位置,可以使用他们的#数据库号)以在一个命令中销毁多个物体。


添加帮助条目

保持更新帮助文件是建设的一个重要组成部分。你可以用 @sethelp 命令新建、删除、添加现有的帮助条目。
> @sethelp/add MyTopic = 此帮助主题是关于...


添加一个世界

在简短地介绍了建造功能之后,你可能想看看更加充实的例子。Evennia自带的一个世界教程可以让你探索。

首先,你要用 @unquell 命令切换回超级用户。然后让自己进入虚空并运行以下命令:
> @batchcommand contrib.tutorial_world.build
这将需要执行一段时间(请耐心等待,不要再次运行这条命令)。你会看到建造世界的命令在滚动着为你创建一切。

最后,你会看到一个离开虚空的新出口,名为 tutorial(教程)。除了可以在世界教程中做单人小冒险外,它还提供了学习Evennia建造(及编码)的不错例子。

读读批处理文件看它到底是如何一步步建造起来的。这里有关于世界教程的详细信息。