目录

MBS — Mud Bot Script Language, dzp 的 MUD 机器人脚本引擎

教程

MBS 初体验

1.1 mbs.Wait

首先来个简单的:大家梦寐以求的 Wait 来啦。

BOT bar.Test11 {
    uptime; xixi;
    okLog 等待 3 秒钟再继续。;
    mbs.Wait 3;
    uptime; haha;
    gaoding;
};

运行,你会发现如同我们预期的那样,xixi 和 haha 之间隔了 3 秒钟。 这种延迟处理在写机器的时候很重要,懂的都懂。

细心的朋友们可能已经注意到了,okLog 的结果常常会比 uptime 出现得还早一些。 这是因为本地命令会立即执行,而服务器命令则会排队执行。有关这个话题后面还会继续介绍。

1.2 mbs.WaitFor

然后不光可以 Wait,还可以 WaitFor。

BOT bar.Test12 {
    xixi;
    okLog 等待正则表达式「点了点头」,你可以用 nod、qnod、ok 之中的任何一个表情来让机器继续执行。;
    mbs.WaitFor 点了点头;
    haha;
    gaoding;
};

和 Wait 固定的时间间隔不同,WaitFor 可以等待特定的文本,所以它本质上是一个触发驱动而不是定时器驱动的延迟处理。

1.3 mbs.WaitLine

WaitFor 有个简化版本,叫做 WaitLine,功能差不多,但是严格匹配整行。

BOT bar.Test13 {
    xixi;
    okLog 请使用 ok 表情来让机器继续执行。;
    mbs.WaitLine 你点了点头:好!;
    haha;
    gaoding;
};

有了它,有时候可以让触发器看起来更简洁一些。

1.4 小结1

有了前面三个小例子,大家应该能猜出来 MBS 是干啥用的了。在这里稍微解释总结一下:

BOT 看起来很像是别名,实际上它最后就是生成了个别名。你可以用 #alias bar.Test1 来看它的源代码。但这里暂时先不展开讨论,因为我们还有一些基本概念需要厘清。

基本概念

2.1 本地命令和服务器命令

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

未完,待续