设为首页收藏本站

万王之王 KOK King of Kings

用户名  找回密码
 註冊
查看: 2873|回复: 30

ZKOK教程(全)

[复制链接]
发表于 2009-7-6 12:47 | 显示全部楼层 |阅读模式
第一课
////////////////////////////////////////////////////////
// 下面是简单的例子,
%scene begin
   10::invoke on xxxxx        <--- 执行invoke, 再等10秒
   10::cast fireball on xxxxx <--- 执行cast, 再等10秒
   10::recharge               <--- 执行recharge, 再等10秒
                              <--- 等完10秒,重复执行。

////////////////////////////////////////////////////////
// 基本格式

<文件头>
%scene begin                 <--- 这一行是必需的
   <执行时间>::<gkk命令>
   <执行时间>::<gkk命令>
   ....
   <执行时间>::<gkk命令>
<文件尾>

////////////////////////////////////////////////////////
// 机器人将重复执行下去。

////////////////////////////////////////////////////////
“时间”是一个数值,是以秒为单位的。但可以精确到0.1秒
   下面的时间描述是正确的
       5   5.0   5.3   0   0.0   0.5
   下面的时间描述是错误的
       500ms <--- 被认成500秒
   下面的描述将被取舍
       5.43  <--- 被认成5.4秒

////////////////////////////////////////////////////////
// 特别需要注意,这里的执行时间,是指后面gkk命令的执行时间。
// 即先发命令,再等, 而不是先等,再发命令。
// 这是唯一要注意的.
// 怎么样, 复杂吗???
 楼主| 发表于 2009-7-6 12:47 | 显示全部楼层
第二课
// 加入命令的行为控制
ok, 你已经会编写靠时间驱动的机器人了吧.
是不是觉得只靠时间, 效率不好.

最典型的. 冥想, 发出去命令, 从失败的立即结束, 到恢复几百点mp的长时冥想.
怎么设时间才好呢? 怎么设时间也不好, 只有通过行为控制.

讲解之前, 介绍通常情况下, 玩家对一个命令的结果有以下几种反应
    (1) 不能做, 等等, 能做了再发一次. (如上次施法没结束)
    (2) 失败了, 那再来一次.
    (3) 失败了, 算了吧, 法力也耗了, 还是做下一步, 恢复法力吧.
    (4) 成功了. 等动作结束吧, 结束了, 做下一步.
    (5) 其它.  其它的内容就多了, 通常也是机器人无法做的. 这里也就不考虑了.

下面以冥想为例, 讲解.

1. 分析你发送的命令, 会有多少种反应:

    比如当你发冥想的时候, 可能有的情况:
        (1) 你正忙著呢. <---- oh, 上个动作还没完呢.
        (2) 你正在战斗中, 无法冥想.
        (3) 你为精神状态不好, 不能冥想
        (4) 你开始冥想了, 一堆垃圾信息传了过来, 最后, 告诉你, 你冥想结束了.

2. 确定对应每种情况, 你想如何处理.

    (1) 你正忙著呢. oh, 上个动作还没完呢.
        当然是等几秒, 再冥想了.
    (2) 你正在战斗中, 无法冥想.
        等战斗结束了再冥想. 做法上可能有区别,这里用的是
            等待"你得到了( ???? )点经验"这句消息出来后, 再冥想.
    (3) 你为精神状态不好, 不能冥想
        可能有多种作法,比如, 不冥想了,做下一步吧。 这里采用的是
            等出现"你的精神恢复正常,可以冥想"的消息时, 再开始冥想.
    (4) 你开始冥想了, 一堆垃圾信息传了过来, 最后, 告诉你, 你冥想结束了.
        一收到"冥想结束"的消息, 立即开始下一个动作吧.


3. 确定各显示的消息中, 是否存在变化的内容, 这些内容对判断没有影响
    比如:
        "你得到了( ???? )点经验."
    ????是一个数字, 但多少一点关系都没有. 怎么办, 在下一步里, 要把
这些用"%*"替换.
        "你得到了( %* )点经验."

3. 把上面的分析结果, 编成zrobot的一组代码.

    先要给这组内容起个名字. 比如是为冥想写的, 可以叫 meditate_bc.
    将所匹配的文本, 要做的控制动作, 等合成一行代码.
    结果变成了

    %bc meditate_bc
        retry:1:你正忙著呢。    <--- 等一秒,再重发当前命令
        retry::你得到了( %* )点经验。
                                <--- 战斗结束了,立即重发当前命令
        retry::你的精神恢复正常,可以冥想了。
                                <--- 可以冥想了,立即重发当前命令
        next::你深深地吸了一口气,从深沈的冥思中醒来 !
                                <--- 结束冥想,立即进入下一步。
                                <--- 这是有深冥的显示。要注意。

4. 为你原来的冥想命令添加行为控制。

    原来的机器人:

    %scene begin
        .....
        50::meditate
        ....

    变成
        ...
        50:meditate_bc:meditate
        ...

5. 把原来的%scene begin段, 再加上你这些%bc段, 就构成一个完整的机器人代码了。

////////////////////////////////////////////////////////////////
// %bc段的格式简介

    %bc <名字>
        <行为控制命令>:<命令参数>:<所匹配的gkk显示文本信息>
        <行为控制命令>:<命令参数>:<所匹配的gkk显示文本信息>
        <行为控制命令>:<命令参数>:<所匹配的gkk显示文本信息>
        ......

    <行为控制命令>
        retry   重做当前命令, 如果命令参数是一个数字, 表示等多少秒之后再重做
        next    结束当前命令,开始下一个。 如果命令参数是一个数字, 表示等多少秒之后再进入下一行。
 楼主| 发表于 2009-7-6 12:48 | 显示全部楼层
本帖最后由 q2a3z4w 于 2009-7-6 12:52 编辑

第三课
对于有双重施法的角色,
同样的信息是成双出现的, 怎么办?

让一个cast命令使用两个%bc段

其方法如下:

%scene begin
    .....
    100:cast1_bc:cast ??? on ???
    .....

%bc cast1_bc
    retry::你上一个动作没有完成,不能施法.
    next::<施法失败的各种信息>
    ...
    change:cast2_bc:你想起动双重施法,但失败了。
    change:cast2_bc:<施展该法术的显示信息>
%bc cast2_bc
    next::这里没有这个人。       <--- 第一个施法结果导致npc死忙,会出现这种结果
    next::<施展该法术的显示信息> <--- 如果该信息不是法术结束时的消息,
                                        在next后两个冒号之间,加入延迟时间, 如
                                            next:3:.......

///////////////////////////////////////////////////////////
// 大家会想, 要是写多重施放, 是不是设成几, 就得写几个%bc段.
答: 如果你非得用这种方法, 确实要写几个%bc段.
    但是.............你为什么不用"你的身体恢正常了"这句话呢?




第四课
到此为止, 你应该能够编写很多提高运行效率的机器人代码了.
也就是说, 每个命令之间延迟时间的设计已经不重要了, 你完全可以
用100来替带.
下面介绍点在编写过程中要注意的几点.

1. 在%bc段的比较文本一定是完整的gkk显示信息. 如果你希望
    只要头几个文本相同就可以的话, 要在后面加上"%*"

    例如: 一定要写成
        next:5:你喃喃念道%*
    如果你写成
        next:5:你喃喃念道

        那么该行永远也不会被匹配执行了.
   
2. 一定要仔细考虑该命令到底会出现多少种情况?
    如果漏掉几种, 你的机器人效率会不时的降低.

    比如在双重施法上, 双施成功了, 但第一个法术的实施
杀死了npc, 那么第二个法术就不会启动, 而显示
    "这里没有这个人."

    如果你没注意到这点, 有时机器人就会傻等一段时间.


///////////////////////////////////////////////////////////////
// 这里我介绍一下我设计zrobot的思路. 以便于大家的理解.

原来的gkk机器人, 能做的事就是 发一个命令, 等一段时间, 再发一个命令, 再等...
一遍做完了, 再重新开始.
这时候, 机器人的设计有两个内容:
     (1) 你要懂得某职业练功/打经验的方法.
     (2) 确定各动作的执行时间, 并且要去掉方法中的智能判断部份.
          比如, 某法术容易失效, 那就连续多发几次, 保证成功. 这就是一种
            去掉判断的实例

  发命令->等->发命令->等-> ... -> 到头就重新开始. 这种形式, 我在设计
zrobot时, 必需要保留!!! 原因不言自明.  这部份内容, 在zrobot中, 称作正文段

对于只用上面的方法, 出现了下面几个问题:
    (1) 命令执行出现失败情况该怎么办?
    (2) 因为服务器变慢, 导致上个动作没结束. 怎么办?
    (3) 速度又变快了, 还要等那么长时间, 不太划算?
    (4) 有些命令本来执行时间就是变化的. 如meditate(冥想)
    (5) ...

zrobot最开始的目的, 就是要解决上面的问题!!!!!!!!!!!
而真人在遇到上面的情况时, 通常会做的事有:
    (1) 重发一次命令(即重做)
    (2) 命令即然提前结束, 开始下一步动作吧.

根据文本信息, 控制/改变正文段的执行状态, 就成了我最初设计zrobot的
想法.  这部份内容, 形成了%bc段, 即行为控制段.
在设计行为控制段时, 我的中心思想就是让它不能向gkk发送命令, 只是
改变执行状态.     最终向gkk发送命令的, 一定还是正文段的事.
(这大概是导致复杂的一个原因吧 !!!!)
改变状态的这种操作, 被称做行为控制命令.

随着需求的增多, 行为控制段和正文段的结构发生些变化, 功能也增
多, 但设计zrobot的中心思想和基本规则还是没变的.

正文段/行为控制段可被分拆分多个, 这是最开始就有的, 这符合结构
化的设计思想.

正文段的重大变化是在行为规则的选取上, 最开始是整个正文段使用
一组行为控制, 其后发现, 一个正文段中的命令序列中, 显示信息可
能有问题, 造成歧义. 于是变成了, 一个正文段对应一个行为控制段.
这被称为基本行为控制段, 在正文段的每一行, 还允许增加专属自已的
行为控制段, 这被称做附加行为控制段.
(其实, 基本行为控制段的作用因此被削弱了. 有时, 没有基本行为控
制段也可以.)

针对每一个命令编写特定的行为控制段, 表面看是增加复杂度, 其实
是变得相对简单. 你在编写的过程中, 只要专注于该命令的各种显示
信息就行了, 哪个信息是失败的信息, 不同原因的失败该如何处理?
哪个信息是成功的信息. 哪个信息将会导致以后信息的分枝(即差异)

我现在就在想, 如果所有职业, 所有法术, 命令的行为控制段都有人
分析出来, 形成一个行为控制段库, 以后每做一个机器人, 大概只要
想执行序列了吧. 然后把用到的各命令对应的行为控制库含进来....

行为控制不是必需的, 当一个代码没有任何行为控制段时, 就只有时
间驱动了, 这时和其它的机器人也没什么区别的. 在格式上, 也绝对
不麻烦. 但如果不用行为控制, 你是不觉得zrobot大材小用了?


下面总结简单制作zrobot机器人代码的思想

1. 确定一个机器人的执行序列. (这里哪个机器人都得面对的)
2. 为序列中每个步骤(即一个命令) 设计它的结束依据/重做依据.
3. 每个命令的行为控制依据构成一个(或几个)行为控制段.
4. 把这个序列描述, 再添加上所有对应这些命令的行为控制段.

如果上面的内容能理解了, 制作zrobot的机器人应该就不难了, 剩下的
变成了 "zrobot是否能实现这个功能", "zrobot如何实现这个功能的"
这些问题了.
 楼主| 发表于 2009-7-6 12:48 | 显示全部楼层
第四课
到此为止, 你应该能够编写很多提高运行效率的机器人代码了.
也就是说, 每个命令之间延迟时间的设计已经不重要了, 你完全可以
用100来替带.
下面介绍点在编写过程中要注意的几点.

1. 在%bc段的比较文本一定是完整的gkk显示信息. 如果你希望
    只要头几个文本相同就可以的话, 要在后面加上"%*"

    例如: 一定要写成
        next:5:你喃喃念道%*
    如果你写成
        next:5:你喃喃念道

        那么该行永远也不会被匹配执行了.
   
2. 一定要仔细考虑该命令到底会出现多少种情况?
    如果漏掉几种, 你的机器人效率会不时的降低.

    比如在双重施法上, 双施成功了, 但第一个法术的实施
杀死了npc, 那么第二个法术就不会启动, 而显示
    "这里没有这个人."

    如果你没注意到这点, 有时机器人就会傻等一段时间.


///////////////////////////////////////////////////////////////
// 这里我介绍一下我设计zrobot的思路. 以便于大家的理解.

原来的gkk机器人, 能做的事就是 发一个命令, 等一段时间, 再发一个命令, 再等...
一遍做完了, 再重新开始.
这时候, 机器人的设计有两个内容:
     (1) 你要懂得某职业练功/打经验的方法.
     (2) 确定各动作的执行时间, 并且要去掉方法中的智能判断部份.
          比如, 某法术容易失效, 那就连续多发几次, 保证成功. 这就是一种
            去掉判断的实例

  发命令->等->发命令->等-> ... -> 到头就重新开始. 这种形式, 我在设计
zrobot时, 必需要保留!!! 原因不言自明.  这部份内容, 在zrobot中, 称作正文段

对于只用上面的方法, 出现了下面几个问题:
    (1) 命令执行出现失败情况该怎么办?
    (2) 因为服务器变慢, 导致上个动作没结束. 怎么办?
    (3) 速度又变快了, 还要等那么长时间, 不太划算?
    (4) 有些命令本来执行时间就是变化的. 如meditate(冥想)
    (5) ...

zrobot最开始的目的, 就是要解决上面的问题!!!!!!!!!!!
而真人在遇到上面的情况时, 通常会做的事有:
    (1) 重发一次命令(即重做)
    (2) 命令即然提前结束, 开始下一步动作吧.

根据文本信息, 控制/改变正文段的执行状态, 就成了我最初设计zrobot的
想法.  这部份内容, 形成了%bc段, 即行为控制段.
在设计行为控制段时, 我的中心思想就是让它不能向gkk发送命令, 只是
改变执行状态.     最终向gkk发送命令的, 一定还是正文段的事.
(这大概是导致复杂的一个原因吧 !!!!)
改变状态的这种操作, 被称做行为控制命令.

随着需求的增多, 行为控制段和正文段的结构发生些变化, 功能也增
多, 但设计zrobot的中心思想和基本规则还是没变的.

正文段/行为控制段可被分拆分多个, 这是最开始就有的, 这符合结构
化的设计思想.

正文段的重大变化是在行为规则的选取上, 最开始是整个正文段使用
一组行为控制, 其后发现, 一个正文段中的命令序列中, 显示信息可
能有问题, 造成歧义. 于是变成了, 一个正文段对应一个行为控制段.
这被称为基本行为控制段, 在正文段的每一行, 还允许增加专属自已的
行为控制段, 这被称做附加行为控制段.
(其实, 基本行为控制段的作用因此被削弱了. 有时, 没有基本行为控
制段也可以.)

针对每一个命令编写特定的行为控制段, 表面看是增加复杂度, 其实
是变得相对简单. 你在编写的过程中, 只要专注于该命令的各种显示
信息就行了, 哪个信息是失败的信息, 不同原因的失败该如何处理?
哪个信息是成功的信息. 哪个信息将会导致以后信息的分枝(即差异)

我现在就在想, 如果所有职业, 所有法术, 命令的行为控制段都有人
分析出来, 形成一个行为控制段库, 以后每做一个机器人, 大概只要
想执行序列了吧. 然后把用到的各命令对应的行为控制库含进来....

行为控制不是必需的, 当一个代码没有任何行为控制段时, 就只有时
间驱动了, 这时和其它的机器人也没什么区别的. 在格式上, 也绝对
不麻烦. 但如果不用行为控制, 你是不觉得zrobot大材小用了?


下面总结简单制作zrobot机器人代码的思想

1. 确定一个机器人的执行序列. (这里哪个机器人都得面对的)
2. 为序列中每个步骤(即一个命令) 设计它的结束依据/重做依据.
3. 每个命令的行为控制依据构成一个(或几个)行为控制段.
4. 把这个序列描述, 再添加上所有对应这些命令的行为控制段.

如果上面的内容能理解了, 制作zrobot的机器人应该就不难了, 剩下的
变成了 "zrobot是否能实现这个功能", "zrobot如何实现这个功能的"
这些问题了.
 楼主| 发表于 2009-7-6 12:48 | 显示全部楼层
第五课
// zrobot的运行机制
当装入zrobot机器人,编辑好机器人代码后,就可以选择“执行机器人”了。

初始化步骤:
1. zrobot读入机器人代码(分析并生成内部结构.)。
2. 找到名称为"begin"的正文段(%scene段) 开始执行

zrobot的基本执行是以时间来驱动的,但时间的长度定义不计较
发送命令 -> 等一段时间 -> 发送下一个命令 -> 再等一段时间...

(上面的内容是在正文段中描述的。)

当在发送命令之后等待的这段时间里。指定的行为控制段开始起作用。
zrobot分析每行gkk的显示,如果与某条行为控制行中的内容匹配,
则执行该行的行为控制命令。
比如:
“你正忙著呢。。。” -> 发送的命令没执行,重发送当前命令
“你从冥想状态醒来。。。” -> 不用再等了,已经结束,快做下一步吧。
“你的法力不够。。。” -> 当前法力不够,转到负责冥想的正文段吧

/////////////////////////////////////////////////////////////////
// 注意
* 当zrobot需要跳转到某个正文段开始执行,而该正文段没有找到时,zrobot会
停止机器人的运行。
* 如果压栈数量超过10次后,仍要压栈时。zrobot停止运行。
* 已经在栈底,仍要弹栈返回时。zrobot停止运行。


/////////////////////////////////////////////////////////////////
// 发送kok命令

当zrobot向gkk发送命令时,会先对该命令进行一次替换操作。

例如:
reply 我的城邦名是%y

如果你所在城邦是 "慢王之王"
那么,真正发送给kok的就是
reply 我的城邦名是慢王之王

命令中,以"%"开始的特定字符串组合将被替换。具体的说明参考replace.txt

/////////////////////////////////////////////////////////////////
// 匹配

对于匹配gkk的主屏显示消息,zrobot并不是简单的比较。还具有一定的模式匹配,
替换匹配等内容,可以减少很多代码。如果没有这些匹配方式,有些
代码将无法实现。
比如,你希望记录所有人对你tell的内容。你只需要一行
%bc ...
...
log::%+(%$)对你说:%*
...

或者,你想要记录别人对你的通辑
...
log::%+的%+发布了%k %n(%n)的通辑令,全面通辑$+
...

/////////////////////////////////////////////////////////////////
// 模式匹配结果的记录与使用

如果你在匹配过程中使用了模式匹配,在有些情况下,你希望用到匹配的结果
例如:
当匹配 “xxx(xxx)对你说:??????”时,你希望回答
“关于??????的问题,我过后会回答你。”
这就用到了两个匹配结果。第一个是谁tell的你。另一个是tell你的内容。
(之所以使用谁tell你,是因为无法保证你发送reply时,可能有别人又tell
你了.所以用tell命令更好一些。)

这样,设计出的匹配字符串:
%+(%$)对你说:$*%b

遇到有人tell你,让zrobot替你回答, 回答的命令应该写成
tell %1 %0朋友,关于%2的问题,我过后会回答你的
 楼主| 发表于 2009-7-6 12:49 | 显示全部楼层
第六课
// zrobot机器人代码的文件格式为:
<文件头>
段标识符 段头描述
段实体

段标识符 段头描述
段实体

...

段标识符 段头描述
段实体
<文件尾>


当编写zrobot机器人代码时,要注意以个几点
(1) 空行被忽略。
(2) 对于不识别的段标识符,整个段被忽略
(3) zrobot区分大小写!!!!!!!!!!!!!!!!!!!


////////////////////////////////////////////////////////////////
// 关于行的分解。

zrobot机器人代码的代码行是基础.
了解zrobot对行的分解是为了让你更灵活地按自已的风格编写zrobot的机器人代码

(1) zrobot机器人代码文本的每个行都是由多少(或0)个单词加一个句子构成的。

(2) 并不是有多少个分隔符,就分解出多少个词/句子,而是zrobot根据不同的段
不同的要求而决定的。多出来的分隔符会被认为是句子中的内容

例如
aaa bbb ccc ddd eee
* 如果zrobot需要二个词加一个句,该行被分解为
"aaa", "bbb", "ccc ddd eee"
* 如果zrobot需要三个词加一个句,该行被分解为
"aaa", "bbb", "ccc", "ddd eee"
* 如果zrobot需要六个词加一个句,该行被分解为
"aaa", "bbb", "ccc", "ddd", "eee", "", ""
这时候因为内容不够,产生了一个空词和一个空句

(3) 通常情况下,使用空格或tab来分开这些词。但同样也可以有":"来分割,
使用“:”除了更容易理解外,有有一个目的是为了产生空词.

例如
aaa:bbb:ccc:ddd:eee
如果zrobot需要二个词加一个句,该行被分解为
"aaa", "bbb", "ccc:ddd:eee"
如果zrobot需要三个词加一个句,该行被分解为
"aaa", "bbb", "ccc", "ddd:eee"
如果zrobot需要六个词加一个句,该行被分解为
"aaa", "bbb", "ccc", "ddd", "eee", "", ""
这时候因为内容不够,产生了一个空词和一个空句

如果要产生中间空词,可以使用
aaa::ccc:ddd:eee
当zrobot需要两个以上词时,就分解成了
"aaa", "", "ccc......

(4) 如果是利用空格或tab分割,那么空格/tab数量是任意的,但如果是用“:”,
则只能用一个, 另外,当":"被zrobot认为是分隔符时,":"两边的空格/tab被忽略。

比如,要分解五个词
aaa    bbbb
被分解成
"aaa", "bbbb", "", "", "", "" <- 三个空词加一个空句
aaa::::bbbb
被分解成
"aaa", "", "", "", "bbbb", "", <- 三个空词加一个空句, 但注意位置。

例二: 分解两个词
aaa:bbbb

aaa     :       bbbb
含义是一样的。都被分成"aaa", "bbbb"

zrobot并不分析多余的“:”
比如,当只需要一个词时
aaa:bbb ccc dddd
被分解成
"aaa", "bbb ccc ddd"

aaa::bbb ccc ddd"
被分解成
"aaa", ":bbb ccc ddd"
这时候,分解出的句子是以":"开头的。
 楼主| 发表于 2009-7-6 12:49 | 显示全部楼层
第七课
// 在介绍了一些基本的制作方法后, 再重新理解一下zrobot要用到的名词.

段:
    zrobot把一个机器人代码定义为多个段的组成,不同的段有不同的功能
        如 正文段(%scene段)定义了向kok发送的命令序列和定时   
    段的描述是以段标识行开始和之后的一组非段标识行(实体)构成,行数
    是任意的,直到遇到下个段标识行

行:
    即以回车结束的一个文本行。
    通常情况,zrobot会将行头的空格和制表符被忽略。
        例如:行"   abc"和"abc"是等效的。
    一行由多个(含0个)“词”加一个“句子”构成

词:
    不含空格, tab,回车换行等控制字符和":"的字符串

句子:
    不以空格和tab开头,不含回车换行的字符串
        !!!注意,只是不以空格/tab开头,中间是允许有空格/tab的。
    每行只能有一个“句”, 且“句”只能是一行最后的部份。

空词/空句:
    不含任何字符的词或句被称为空词,空句。

分隔符
    空格,tab和":"是行中分隔各词/句子的特殊字符,被称作分隔符

段标识行
    一行的第一个非空格/tab字符是以"%"开始的行,被认为是段标识行

注释行
    一行的第一个非空格/tab字符是以"#"开始的行,被认为是注释行,注
释行被当做空行来处理,通常的处理情况都是忽略掉。

段实体:
    跟随在一个段标识行之后,下一个段标识行之前的所有非段标识行被称
做该段的段实体

段标识符和段头描述
    段标识行中,第一个词被称做段标识符,其它部份被称为段头描述

正文段, 又叫动作序列段,场景段(%scene 段)
    根据该段实体定义的内容,机器人将按顺序,向kok发送命令,并做时间延迟。
通过行为控制,执行情况可以改变

begin正文段
    一个机器人代码可以有多个正文段,但开始执行只能是从begin段开始。

行为控制段(%bc 段)
    根据kok的主屏显示输出以及一些trigger,控制/改变正文段的执行状态

命令:
    如果不特指的话,是指向送给gkk的命令, 不过有些命令不真正发给gkk,而
是在zkok就被分析执行了。这种命令以"@"开始。通常这些命令是执行zkok的
某些功能

行为控制命令:
    行为控制命令是在行为控制段中的执行命令,它只控制zkok, 而不是gkk。
通常用来改变zrobot的执行顺序,状态的。

变量段
    定义一个变量,zrobot允许定义十个变量,变量名只能是"0" - "9"
段的实体定义了该变量可能使用的值(有顺序关系)
通常变量的目的是为了减少正文段/行为控制段的内容。

中断向量段
    一些不是由kok显示消息导致的事件,被称为中断向量。中断向量。中断
向量的动作将在中断向量段中定义
 楼主| 发表于 2009-7-6 12:50 | 显示全部楼层
第八课
正文段是向kok发送命令的主体
其基本思想是采用“发命令”,等一段时间,再发命令,再等的循环机器。

用户可以指定该正文段是执行一次,还是一直循环执行下去,除了@call和
@return之外,正文段本身没有控制流程的机制,如何控制执行序列,是在
行为控制段中描述的。

下面详细介绍正文段的格式

////////////////////////////////////////////////////////////////////
// %scene 段

%scene <name> <bc> <next_scene> <注释句子>
段实体内容

<name>       定义了该段的名称,不能为空单词!!!
<bc>         每个正文段可以选择一个行为控制段来控制该段的执行,
             可以为空,如果为空,表示不需要行为控制。
<next_scene> 如果这部份为空,表示该scene一直执行,直到有行为控制来改变。
             如果不为空,则表示该scene只执行一次,执行结束后,跳到
<next_scene>指定的%scene段继续执行。
             !需要注意,如果<next_scene>指定的%scene段查找不到,机器人
   会因此停止运行。
正文段行中的句子被忽略,可用于写注释信息.


段里的内容定义了执行序列,每行文本定义一个,其格式为
<timer> <bc> <command>

<timer>      是一个数字,表示该行命令执行要花费的时间, 以秒为单位,
             但精确到小数点后一位,可以是0。
内容可为空
<bc>         每个%scene段定义了一个行为控制段,这是其本的。
             另外,当执行该命令时,可附加一个行为控制段。
                 这个行为控制段的内容只在该命令执行期间有效
通常其内容只与该命令有关
             这部份内容可为空
<command>    <command>是个句子,是具体发送给kok的执行命令。
             但如果命令是以“#”可头的,则不发送命令。
这部份内容可为空

例如:
30::
空等30秒
30::cast fireball on woman
执行cast fireball on woman, 等待30秒后进入下一个步骤
30:wait_can_meditate30:wait_can_meditate)
空等30秒,但附加指定了wait_can_meditate行为控制段,
30:cast_fireball:cast fireball on woman
执行cast fireball on woman, 等待30秒后进入下一个步骤
指定了附加的行为控制段,来控制该命令的执行情况.

*** 注意下面的描述是错误的。
cast fireball on woman
其含义是执行on woman命令,使用名称为fireball的附加行为控制段,
执行时间是cast(即0)秒。
应使用下面的定义
::cast fireball on woman

***  !!!需要注意,其内容不是等<timer>秒后,再执行命令,而是执行命令
       再等<timer>秒后,执行一个步骤。


*** 一个机器人代码必需有名称为begin的%scene段,机器人启动后,会
查找begin段,并开始执行其中的内容,如果没有begin段,机器人将什么也不做。
 楼主| 发表于 2009-7-6 12:50 | 显示全部楼层
第九课
行为控制段
行为控制段是区别于其它现有kok机器人的重要内容,因为zkok能够跟踪kok
的显示,这样zrobot就可以根据这些显示变换执行的情况。
*** 注意,行为控制段只是改变执行的状态和顺序,具体发送给kok那些命令,
仍然要在正文段中定义

////////////////////////////////////////////////////////////////////
// %bc段

%bc <name> <注释句子>
段实体,行为控制段内容

<name>   指定该行为控制段的名称,不能为空

行为控制段中的内容,每一行定义一个行为控制,其格式为

<control_command> <argument> <match_message>

(<match_message>是句子)
其含义是如果kok主屏显示输出的内容与<match_message>匹配,则执行
<control_command>的控制命令, <argument>是供<control_command>使用时
的参数,根据<control_command>的要求,参数可以为空。

下面是个例子,比如:

retry::你正忙著呢!

表示如果遇到“你正忙著呢!”这句消息,就重新执行当前命令


<control_command>有以下定义
retry       重做当前运作
            参数是一个时间,表示过多长时间后再重做
next        结束当前动作,开始执行下一步
            参数是一个时间,表示过多长时间后再执行
            该命令会取消当前命令的附加行为控制段。
            但下一个命令的附加行为控制段并不被应用。
            这时候只能使用%scene共用的基本行为控制段。
time        只是改变当前的延迟时间。不关心之前是否有retry/next
            不修改原有的附加行为控制段
            参数是新的延迟时间。
again       重新运行当前的正文段,忽略该正文段的next_scene
            取消当前命令的附加行为控制段。
            参数是延迟时间
end         结束当前的正文段
            由next_scene决定是重新开始运行当前段,还是跳到一个
            新的%scene段.
            参数是延迟时间
goto        强行停止当前的%scene, 转而开始指定的%scene
参数是指定的新的%scene段名
该参数不能为空
restart     复位所有状态,重新开始机器人的执行。
参数是一个%scene段id,如果为空, 则从"begin"段开始执行。
否则直接跳转到指定正文段。
错误的段名会导致机器人停止运行.
call        将当前状态压栈,停止当前的%scene, 转而开始指定的
            %scene段。
参数是指定的新的%scene段名
该参数不能为空, 空会导致机器人停止运行。
只能压10次,再压的话,将停止机器人的执行。
pop         弹栈
如果栈已经为空,将停止机器人的执行。
参数有下面几种:
ignore: 只是弹栈,但不恢复原状态。
retry: 恢复压栈前的状态, 重做压栈前正在进行的动作。
next: 恢复压栈前的状态, 结束压栈前正在正行的动作,进入下一个动作
<number>: 恢得压栈前的状态, 修改延迟时间
空: 恢复压栈前的状态
change      替换当前命令的附加行为控制段(和在%scene命令行指定的附
            加行为控制段功能类似,用于动态改变)
            %scene的当前命令结束后,该设定失效。
            能数是一个%bc段名
该参数不能为空
            整个%scene的基本行为控制段在该正文段的运行期间不能修改
trigger     产生软中断.
prompt      弹出对话框,显示匹配的消息
            参数被忽略
log         将匹配的消息存贮的log文件中
            参数被忽略

关于显示信息与<match_message>的匹配,请参考match.txt
 楼主| 发表于 2009-7-6 12:51 | 显示全部楼层
第十课
变量段
每个变量段定一个变量,zrobot只允许有10个变量,且变量名是固定的,
即从"0", "1", ... "9"

用户在变量段中设定该变量的所有可能的值。zrobot的变量值有两个内容,
即左值和右值。也称为 v_value 和 v_value
区别在于左值是一词
而右值是一个句子

////////////////////////////////////////////////////////////////////
// %variable

%variable <name> <注释句子>
段实体, 即定义该变量可能出现的值

<name> 只能是"0"到“9”,如果是其它的值,该段将会忽略掉。

段内容每行定义了该变量可能设定的值,格式为
<v_value> <v_value>

<v_value>是单词,<v_value>是句子

最常用的,用v_value定义npc英文名字,用v_value是中文内容
前面的值在正文段中用于替换命令内容,后面的则在行为控制段中用于显示匹配.


下面是一个例子
%variable 0
womana:女人一号
womanb:女人二号
womanc:女人三号
womand:女人四号
......
%scene begin shengzhe_bc
...
100::cast <magic_id> on %v0
...

%bc shengzhe_bc  <-- 这是一个行为控制段,请参考阅读 bc.txt
......
retry:100:%i0一个火球向%v0发去......   
<--- 这行显示的内容可能并不正确,只是举例。
next::你得到了( %# )点经验。
......
有关%v0, %i0, %#, %v0的含义,参考replace.txt和match.txt


////////////////////////////////////////////////////////////////////
// 运行中的变量

* 当开始运行时,所有变量指向第一个值。

* 用户可以指定变量使用下一个值,或回到第一个值。或者随机产生一个数值x,
  将该变量值变成第x个。

* 如果在行为控制段中指定对该变量的模式匹配,那么在成功后,
  该变量的值也指向匹配的值。

* 变量的取值是全局共用的。

* 对于将某变量的变量值变成下一个的操作, 如果当前变量值是最后一个,下
  一个的含义就是指向第一个值,同时,系统可能会产生一个trigger。
您需要登录后才可以回帖 登录 | 註冊

本版积分规则

QQ|手机版|小黑屋|万王之王 king of kings    

GMT+8, 2018-5-22 08:39

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表