命令批处理器


想要了解什么是批处理器、为什么要使用批处理器,可以看这里。本文介绍的是命令批处理器,代码批处理请看这里


基本用法

批处理器是专供超级用户使用的,用以下方式调用:
> @batchcommand path.to.batchcmdfile
path.to.batchcmdfile 是以“.ev”结尾的批处理文件的路径。路径以python格式给出,是以批处理文件夹为起始的相对路径,批处理文件夹在 settings 文件的 BATCH_IMPORT_PATH 中设置。默认文件夹是 game/gamesrc/world。所以,如果你想运行 game/gamesrc/world/examples/batch_cmds.ev 的批处理文件例子,你可以用
> @batchcommand examples.batch_cmds
命令批处理文件包含一张以注释分割的Evennia的游戏内命令列表。批处理器会从头到尾执行批处理文件。请注意,批处理并不会因命令执行失败而停止(因为没有什么通用的方法能让批处理器知道各种不同命令执行失败时的样子),因此你要密切关注输出的内容,或使用交互模式(见下文)在更多控制的条件下一步步执行该文件。


批处理文件

批处理文件是包含Evennia命令的纯文本文件。就像你写在游戏中的命令一样,但你可以更自由地使用换行。

以下是 *.ev 文件的语法规则,你会发现它真的很简单:
  • 所有以符号 #(井号)开头的行都被认为是注释。所有非注释行都被认为是命令或它们的参数。
  • 注释行是有实际功能的 —— 它们标志前一条命令的结束。所以永远不要把两条命令紧挨着写在文件中,要用注释把它们分割开,不然第二条命令会被当成第一条命令的参数。而且,大量使用注释也是个好习惯。
  • 以单词 #INSERT 开始的行既是注释行,也代表了一个特殊指令。语法是 #INSERT <path.batchfile>,它会将指定的命令批处理文件导入到当前文件。插入的批处理文件(以 .ev 结尾的文件)会在写 #INSERT 指令的地方执行。
  • 命令行中的多余的空格将被忽略。
  • 一个完全空的行会被转换成文本换行符,两个空行表示一个新段落(这种输入方式显然只与接受这种格式的命令相关联,如 @desc 命令) 。
  • 文件中的最后一条命令不需要用注释来结束。
  • 你不能在批处理文件中嵌套另一个 @batchcommand 语句。如果你想将多个批处理文件连接在一起,使用 #INSERT 指令。你也不能在批处理文件中执行 @batchcode 命令,这两种批处理器是不兼容的。

下面是 game/gamesrc/commands/examples/batch_cmds.ev 示例文件中的内容。
#
# This is an example batch build file for Evennia.
# 这是一个Evennia批处理建造文件的例子。
#

# This creates a red button
# 这会创建一个红色按钮
@create button:examples.red_button.RedButton
# (This comment ends input for @create)
# (这个注释结束了@create的输入)
# Next command. Let's create something.
# 下一条命令,让我们创造些东西。
@set button/desc = 
  This is a large red button. Now and then 
  it flashes in an evil, yet strangely tantalizing way. 

  A big sign sits next to it. It says: 


-----------

 Press me! 

-----------


  ... It really begs to be pressed! You 
know you want to! 

# (This ends the @set command). Note that single line breaks 
# and extra whitespace in the argument are ignored. Empty lines
# translate into line breaks in the output.
# (这结束了 @set 命令)。请注意,参数中的单个换行符
# 及多余的空格会被忽略。在输出时空行被
# 转换为换行符。

# This inserts the commands from another batch-cmd file named
# batch_insert_file.ev.
# 在这里插入另一个命令批处理文件
# batch_insert_file.ev。
#INSERT examples.batch_insert_file

# Now let's place the button where it belongs (let's say limbo #2 is
# the evil lair in our example)
# 现在,让我们把按钮放到它该去的地方(在我们的例子中,假设虚空#2
# 是邪恶的巢穴)
@teleport #2
# (This comments ends the @teleport command.)
# (这条注释结束了 @teleport 命令。 )
# Now we drop it so others can see it.
# The very last command in the file needs not be ended with #.
# 现在我们放下它,让其他人也可以看到它。
# 文件中的最后一条命令不需要用#结束。
drop button
用 @batchcommand 调用该文件,测试它一下。一个按钮会被创建、描述,并放到虚空中。当用户调用命令时,所有的命令都会被执行。请注意,当你与按钮交互时,你可能会发现它的描述信息会发生变化??,不再显示前面你自己定义的说明,这个特定的物体就是这么工作的。


交互模式

交互模式可以让你控制批处理文件单步执行。这对调试很有用,而且,如果你有一个较大的批处理文件但只更新其中的一小部分,重新运行整个文件是不划算的(而且如果有 @create 命令的话,在运行结束时会产生出多余的相同名称的对象)。使用带 /interactive 参数的 @batchcommand 命令可以进入交互模式。
> @batchcommand/interactive examples.batch_cmds
你会看到:
01/04: @create button:examples.red_button.RedButton  (hh for help) 
这说明你在 @create 命令上,这是批处理文件四条命令中的第一条。要注意,此时 @create 命令还没有实际执行!

想要看将要执行的完整命令,可以使用 ll(批处理版的“look”)。使用 pp 会实际执行当前的命令(这会实际 @create 按钮)—— 请确认它在按计划工作。使用 nn(下一步)前往下一条命令。使用 hh 获取帮助列表。

如果发现了错误,在批处理文件中修改它们,然后使用 rr 重新加载文件。你会仍然处在之前的命令上,可以根据需要用 pp 命令重新执行它。这构成了一个简单的调试循环。如前面提到的,它可以让你重运行单个出错的命令,这对较大的批处理文件是非常有用的。请注意,在许多情况下命令会依赖于先前执行过的命令(比如这个例子中的 @create 执行失败了,后面的命令也就失去了操作的对象)。

使用 nn 和 bb (next和back)可以在文件中移动,例如 nn 12 会向前跳12步(不会执行其中的任何命令)。在交互模式下,Evennia的所有普通命令同样可以工作。


限制和注意事项

命令批处理器的伟大之处在于它可以自动进行小规模的建造,或在反复测试新命令和对象时不必写很多的代码。在用命令批处理器建造更大更复杂的世界时,有一些事项你需要注意。

主要的问题是,当你在执行批处理命令的脚本时,你(作为超级用户角色)实际上是在游戏世界中到处移动并按顺序创建房间的,就像你手动一条条输入这些命令一样。你在编写文件时必须考虑到这一点,这样你就可以“走”(或传送)到正确的地方了。

这也意味着在设计和添加某些类型的对象时会有陷阱。下面是一些例子:
  • 会改变你命令集的房间:假设你要建立一个“黑暗”的房间,它会对房间里的人的命令集做很多限制(也许你需要先打开灯的开关才能继续其他动作)。在批处理脚本中,你创建了这个房间然后传送进它 —— 结果马上进入到黑暗状态,正常的建造命令都无法工作了...
  • 自动传输:有些房间会自动将进入房间的人传送到另一个地方(比如像一个陷阱房)。你同样会被传送走。
  • 移动:如果你添加了具有侵略性的小怪,他们可能会攻击你,把你拖入战斗。如果他们有AI,他们甚至会在你建造的时候一直跟在你边上;或者他们可能会在你给他们添加描述和装备之前就跑开了!
解决这些问题的办法是未雨绸缪。要确保超级用户永远不会受到任何游戏效果的影响。给对象添加一个开关,并确保它在建造过程中始终处于关闭状态。这些都是可行的,你需要记牢它们。


其他事项

你需要以你“自己”的身份来建造可被认为是有益的。你可能会考虑修改默认的命令以允许超级用户之外的人调用批处理器,但由于仍然会做正常的访问权限检查,即使别有用心的人使用了批处理器也无法造成太大的损害(这是代码批处理器的主要缺点)。

GNU Emacs的用户可能会发现使用evennia模式Emacs的有趣功能。Emacs的主模式可以在 src/utils/evennia-mode.el 找到。在Emacs编辑.ev文件时,它会提供正确的语法高亮显示和 <Tab> 缩进。请参阅文件中的安装说明。