MBS — Mud Bot Script Language, dzp 的 MUD 机器人脚本引擎
首先来个简单的:大家梦寐以求的 Wait 来啦。
BOT bar.Test11 {
uptime; xixi;
okLog 等待 3 秒钟再继续。;
mbs.Wait 3;
uptime; haha;
gaoding;
};
运行,你会发现如同我们预期的那样,xixi 和 haha 之间隔了 3 秒钟。 这种延迟处理在写机器的时候很重要,懂的都懂。
细心的朋友们可能已经注意到了,okLog 的结果常常会比 uptime 出现得还早一些。 这是因为本地命令会立即执行,而服务器命令则会排队执行。有关这个话题后面还会继续介绍。
然后不光可以 Wait,还可以 WaitFor。
BOT bar.Test12 {
xixi;
okLog 等待正则表达式「点了点头」,你可以用 nod、qnod、ok 之中的任何一个表情来让机器继续执行。;
mbs.WaitFor 点了点头;
haha;
gaoding;
};
和 Wait 固定的时间间隔不同,WaitFor 可以等待特定的文本,所以它本质上是一个触发驱动而不是定时器驱动的延迟处理。
WaitFor 有个简化版本,叫做 WaitLine,功能差不多,但是严格匹配整行。
BOT bar.Test13 {
xixi;
okLog 请使用 ok 表情来让机器继续执行。;
mbs.WaitLine 你点了点头:好!;
haha;
gaoding;
};
有了它,有时候可以让触发器看起来更简洁一些。
有了前面三个小例子,大家应该能猜出来 MBS 是干啥用的了。在这里稍微解释总结一下:
#wait 功能。
BOT 看起来很像是别名,实际上它最后就是生成了个别名。你可以用 #alias bar.Test1 来看它的源代码。但这里暂时先不展开讨论,因为我们还有一些基本概念需要厘清。
前面 1.1 的时候提到,okLog 会抢在 uptime 之前出现结果,这是因为,okLog 是一个本地命令,而 uptime 是一个服务器命令。
本地命令和服务器命令混合在一起的时候,本地命令会立即顺序执行,而服务器命令会进入命令队列,排队依次执行。
事实上,有两种不同类型的本地命令,一种是别名,就像前面的 okLog。另一种是客户端命令,就是 # 号开头的那些。
没错,BOT 上下文中可以很好地和原生的 TinTin++ 语法命令进行融合。请看例子:
BOT bar.Test21 {
#3 xixi;
#local times {@math.Random{1;5}};
#loop 1 {$times} {_} {haha};
gaoding;
};
这里利用了 PaoTin++ 函数 math.Random 来取一个 1 到 5 之间的随机数,来决定 haha 的次数。
可见,MBS 和原生语法可以结合地非常紧密。再举个稍微复杂些的例子:
BOT bar.Test22 {
#foreach {foo;bar;baz;hello;world} {word} {
#local type {@math.Random{0;1}};
#if { $type == 0 } {
say $word;
};
#else {
response $word;
};
};
};
这里,我们用一个随机函数,来决定到底用 response 还是用 say。运行一下看看效果:
嗯,效果很好。这意味着我们的 MBS 作为用纯 TinTin++ 实现的一种 DSL,它本身仍然可以和 TinTin++ 一起混合使用,而不必重新发明整套的流程控制语句。
这也意味着,对于有经验的 TinTin++ 玩家来说,MBS 只是为你增加了新的功能,而不会颠覆你已有的知识。