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 只是为你增加了新的功能,而不会颠覆你已有的知识。