01先选择脚本版本,再学习语法
这份46页《ZKok 4.0教学课程》由飞梦提供PDF下载,文档元数据署名约拿、日期为2002年4月27日。它并非46页统一的4.0规范:前十一课讲早期ZRobot,十二、十三课解释2.0迁移3.0及新语言,十五课处理3.0迁移4.0,末尾另收命令问答、变量和两坑牧系实例。
ZKok/ZRobot围绕游戏返回的文字控制脚本。%scene列操作,%bc在收到反馈时决定重试、跳步或转段,%public_bc处理全局事件,%variable保存可轮换的值。IKOK借用了部分写法,却有独立的版本变化,不能把两个工具的所有同名指令视为相同。
02第一步:列出动作、等待与循环
游戏命令行由“等待秒数:行为控制段:命令”三部分组成;时间与反馈段可以留空。命令发出后等待指定时间,再进入下一条;走到正文段末尾时按该段条件决定是否重复。初学时先把动作按顺序写出来,再逐步增加反馈。#开头是注释,开头的#%ZRobot.dll在原例中也是注释。
%scene begin
10::invoke on xxxxx
# 執行 invoke, 再等 10 秒
10::cast fireball on xxxxx
# 執行 cast, 再等 10 秒
10::recharge
# 執行 recharge, 再等 10 秒
# 等完 10 秒,重複執行。03把按键工具的时序移到ZRobot
KeyText的pause作用在下一动作之前,ZRobot时间写在当前动作之后。迁移时删除{loop},将第一个pause移到最后一条动作,其他动作的等待取它后面的pause;原动作之间没有pause就填0。GkkMaster的重复次数要展开:前n−1次保留本行间隔,最后一次接下一行的等待,循环最后一行接首行等待。若不改写GkkMaster代码,教材另提可用ZMaster。
{loop}
{pause 5.0}say hi
{pause 10.0}say 555
say 666 <--- 這一行沒有{pause ???}, 把它看成是{pause 0}
{pause 20.0}say bye%scene begin
10.0::say hi
0::say 555
20.0::say 666
5.0::say bye3 say hi 5 <--- 這是當前行
5 say bye 1 <--- 這是下一行
轉成
3::say hi
3::say hi
3::say hi
3::say hi
# 以上是 5-1 = 4 次
5::say hi04第二步:用完成与失败反馈控制等待
固定等待不足以区分“忙碌”“正在战斗”“MP恢复”和“施法完成”。冥思时忙碌可稍后retry,精神恢复可再次冥思,完成消息用next提前结束等待;战斗中不能冥思,则等待战斗结束的经验消息。双施第一发杀死目标后第二发会报找不到目标,这也是应该结束该动作的反馈。
反馈段分为命令自身指定的bc与整个scene指定的bc。同一句“精神恢复”在冥思和战斗中需要不同处理;复用bc前先检查它适用的动作。教程建议先列动作、列完成和重试条件、写bc,最后组合,而不是把所有行动都塞进全局匹配。
%bc meditate_bc
retry:1:你正忙著呢。
# 等一秒,再重發當前命令
retry::你得到了( %* )點經驗。
# 戰鬥結束了,立即重發當前命令
# 這個匹配描述使用的模式匹配,在下一節有詳細說明
retry::你的精神恢復正常,可以冥想了。
# 可以冥想了,立即重發當前命令
next::你深深地吸了一口氣,從深沈的冥思中醒來 !
# 結束冥想,立即進入下一步。
# 這是二轉 ID 深冥的顯示。如果沒二轉,要注意結束的信息不一樣。100:meditate_bc:meditate05第三步:准确匹配服务器文字
可在ZTerm显示区双击消息,把它放入命令输入框后复制,保留繁简字、空格、标点。长消息可能被客户端强制折行,教材对长度仅记62/63/64字符的疑问,没有确认一个阈值;以>>标识的强制换行应接回原句,逻辑上本来分段的消息则不能随意合成。
| 写法 | 匹配意义 |
|---|---|
| 固定文字 | 逐字匹配。 |
| %% | 字面百分号。 |
| %* | 任意内容,可为空。 |
| %+ | 任意内容,至少一个字符。 |
| %$ | 字母、数字、下划线或空格,至少一个字符。 |
| %# | 一个或多个数字。 |
| %b | 将各通配位置依出现顺序保存到%0~%9。 |
| %x?/%X? | 在枚举变量的左值/右值中匹配一项,并把指针移到该项。 |
| %i?/%z? | 匹配成功后移动/复位变量指针,自身不占文字;不是在部分匹配时提前修改。 |
例如获取经验时数值变化,可用%*;施法目标和“喃喃自语”的可变部分也可用通配符。把%*加在首尾可处理版本增加的描述,但不能因此忽略本应区别的成功与失败消息。
在后面的收人/开除示例中,%b 按出现顺序分配捕获结果:第一处 %+ 存入 %0,第二处 %$ 存入 %1,后续两处 %* 分别存入 %2、%3。因此 banish %1 取的是括号内捕获的角色 ID。
开除分支执行 banish %1 后 return next;收人分支写作“20:test_bc:accept ??????”,问号是站位占位符,未提供实际地址,不能直接运行。
%public_bc
call:banish:%b%+(%$)告訴你 : %*開我%*
call:banish:%b【換成你的城市名】%+(%$)%*開我%*
call:banish:%b【換成你的城市名】%+(%$)%*開除%*
call:accept:%*向你申請戶籍 !
%scene banish
::banish %1
return next
%scene accept
20:test_bc:accept ?????? 問號就是指定的位置不要說你不懂
return next06枚举变量、数值变量与左右值
枚举变量的每行可定义左值和右值,第一次指向第一行;小写变量名取左值、大写取右值。数值变量不写%variable段,第一次使用为0,用(a=1)、(a=a+1)、(a=a+2)赋值。枚举变量的数字赋值会按值数取模,例如三项变量赋10后指向第1号、即第二项;给它赋一个已有字符串则定位到相应项,赋不存在字符串的结果原问答未说明。
| 版本 | 变量与赋值 |
|---|---|
| 2.0 | 10个枚举变量0~9;%v0/%V0分别取左右值;旧表达式的=与==都是相等判断。 |
| 3.0 | 扩为26个a~z,A~Z不额外增加26个,0~9分别是a~j的别名。%v2、%vc、%Vc同为c左值;%V2、%vC、%VC同为c右值。 |
| 3.0标识规则 | 数字变量由首字母标识,后续字母数字只是注释;$后的首字母标识字符串变量。不能借多写几个字母得到IKOK式多词独立变量。 |
| 3.0临时变量 | $0~$4:每个栈结点各有五个,只作数值运算。 |
字面字符串可用单引号或双引号包围,必须同类引号结束,不能跨行;数字常量由0~9组成。一行只写一条命令或标号。标号是不含空格和冒号、不以数字或#开头的文字,末尾加冒号。
| 设置条件 | 赋值 | %oa | %va |
|---|---|---|---|
| 没有定义列表 | (a = 10) | 10 | 10 |
| 没有定义列表 | ($a = "abc") | ??? | abc |
| 列表依次为 xxx、yyy、abc | (a = 10) | 1(10 % 3 = 1) | yyy |
| 相同三项列表 | ($a = "abc") | 2 | abc |
| 相同三项列表 | ($a = "sadf") | ??? | ??? |
%variable a #初始化變量段 a
hi HI
bb BB
cc CC
dd DD
ee EE
%scene begin #gkk 顯示
::say %va #你說道:hi
::say %vA #你說道:HI
::say %oa #你說道:0
::%ia #變量段 a 內容下移一行
::say %va #你說道:bb
::say %vA #你說道:BB
::say %oa #你說道:1
::%ia #變量段 a 內容下移一行
::say %va #你說道:cc
::say %vA #你說道:CC
::say %oa #你說道:2
::%da #變量段 a 內容上移一行
::say %va #你說道:bb
::say %vA #你說道:BB
::say %oa #你說道:1
::%za #變量段 a 內容返回第一行
::say %va #你說道:hi
::say %vA #你說道:HI
::say %oa #你說道:0
stop%scene begin #第一次用數值變量 b 時,數值變量 b 的值為 0
::say %ob #你說道:0
::(b=b+1) #數值變量 b 的值加一
::say %ob #你說道:1
::%ib #數值變量 b 的值加一
::say %ob #你說道:2
::%db #數值變量 b 的值減一
::say %ob #你說道:1
::%zb #數值變量 b 的值清 0
::say %ob #你說道:007枚举的三个用途:限定、顺序与随机
枚举取值全局共用。旧教程先用变量9限制发送者ID,避免任何人说同一句话都触发断线,再用变量0轮换womana至womanx施法,最后用变量8右值随机选回复;这三种行为分别依赖集合匹配、指针前进和随机替换。
%variable 9
dela
kings
xxkx
...
%bc begin_bc
....
shutdown::%+(%x9)告訴你 : %*機器人%*
....
或者
...
call:answer_gm:%b%+(%x9)告訴你 : %*機器人%*
...
%scene answer_gm
::tell %v9 %0 大人,我正在忙,你不要亂猜啦。
::@return%variable 0
womana
womanb
womanc
......
womanx
%scene begin
50:invoke_bc:invoke on %v0
::%i0
50:recharge_bc:recharge
50:recharge_bc:recharge%variable 8
:我怎麼會是機器人呢?
:你不要瞎猜了。
:就算是,也沒影響別人呀。
:...
%scene answer_gm
::tell %v9 %0 大人,%X8
::@return08变量替换速查与版本差异
| 替换 | 含义 |
|---|---|
| %n/%N | 英文角色ID/中文角色名。 |
| %K | nick,不能与角色名混为一项。 |
| %C(旧)/%k(3.0) | 角色职业。 |
| %Y/%y(3.0) | 所在城邦/所属组织。 |
| %h/%H;%m/%M | 当前/最大HP;当前/最大MP。 |
| %g/%E(3.0) | 身上金币/经验值。 |
| %pc/%PC、%px、%py(2.0) | 自身位置、横坐标、纵坐标;3.0改%sc、%sx、%sy。 |
| %(x,y) | 把相对坐标转换为目标位置。 |
| %e0~%e9(旧) | 环境属性。 |
| %0~%9;%a0~%a9(3.0) | 此前匹配捕获的内容。 |
| %v?/%V? | 当前枚举项的左值/右值。 |
| %p?/%P? | 把左值/右值当位置转换。 |
| %o?/%O?(3.0) | 当前指针/枚举项总数;数值变量的%o?为数值本身。 |
| %i?/%d? | 3.0数值加/减一并返回改变后的值,或枚举指针前进/后退;一般枚举移动越界回绕。2.0的%i替换只前进并返回空值。 |
| %I? | 2.0前进时绕回首项返回1,否则0;3.0已在末项时不再前进、返回1,否则前进并返回0。 |
| %D?(3.0) | 值为0或枚举已在首项时不减并返回1,否则减一/后退并返回0。 |
| %z?/%Z? | 数值清零或枚举指针复位;2.0的%z返回空值。 |
| %x?/%X?(替换) | 从枚举左值/右值随机选取;与反馈匹配中的同名写法作用不同。 |
09表达式:旧版与3.0的运算符
| 用途 | 2.0 | 3.0 |
|---|---|---|
| 赋值与相等 | =、==用于相等判断。 | =赋值;==相等,!=不等。 |
| 数值运算 | + − * /,%%为取余。 | + − * / %;−也可作一元取负。 |
| 逻辑 | &、|、^、!。 | &&、||、^^、!。 |
| 位运算 | 旧课未另列。 | &、|、^、<<、>>;一元^取反。 |
| 比较 | > >= < <= = == !=;相等/不等可比较字符串。 | > >= < <= == !=。 |
| 字符串 | 旧课仅说明相等/不等。 | +、<<、>>;原附表未详解两个移位符的字符串含义。 |
| 下标 | 旧课未列。 | 变量.数字;左边须由%variable定义。 |
早期表达式课明确提醒运算没有通常的优先级,应写括号。3.0章扩充了运算符,却没有另给完整优先级表,复合判断继续明确加括号。3.0的%在二元位置取余,在一元位置进行变量替换。
if (%h > 400)
...
endif
if (%m < 1000)
...
endif10分段、调用与返回
正文段格式为%scene 名称:场景反馈段:重复表达式。名称不可省;段末才计算重复表达式,空表达式表示持续重复。每条命令的bc额外处理本动作。#命令不发给服务器,@开头的早期控制命令由机器人处理;3.0兼容旧@控制写法时,会忽略该行原来的时间与bc栏。
| 控制 | 行为 |
|---|---|
| goto/@goto | 转到标号或正文段;目标不能为空。 |
| jump | 3.0仅找正文段,比同时找标号的goto直接。 |
| call/@call | 保存当前执行状态后转子段;早期文档栈深最多10,溢出停止。 |
| return/@return | 返回调用点;空栈返回会停止。scene发起call默认进入下一条,bc发起call默认重试原动作。 |
| return retry/next/ignore/时间 | 返回后分别重做、进入下一条、仅弹栈继续或覆盖等待;早期还列keep恢复原状态。 |
| pop | 只弹出保存的调用状态,不跳回;用于不再需要返回的分支。 |
| again | 直接重新执行本段,不检查段末条件。 |
| end | 去段末,检查重复条件后决定是否继续。 |
| ifgoto (条件) 标号 | 条件满足时跳标号。 |
| @skip 条件 | 早期控制:真则略过下一条,假则继续。 |
教材示范MP不足时call冥思段,治疗、冥思至精神恢复后return retry;进入战斗则转kill_npc,用重复call与%i逐个对目标晕击与吸魂。双施例改用第二个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 new_begin_bc
goto:jinyan:你說道 : 1
goto:jineng:你說道 : 2
%scene begin begin_bc
20::say 你是想打經驗(say 1)還是想練技能(say 2)%scene meditate_seg
100:heal_bc:cast double_heal on
# 也可以用強力恢得
100:meditate_bc:meditate
%bc meditate_bc
return:retry:你的精神正好, 不需要冥想
...
* 為當前運行的正文段加入一行行為控制
%scene begin begin_bc
...
%bc begin_bc
...
call:meditate_seg:你的法力不夠!!
...100:med2_bc:meditate
...
%bc med2_bc
goto:kill_npc:你正在戰鬥中,無法冥想。
next::你的精神狀態。。。。。。
......::@call for_npc
::%i0
::@call for_npc
::%i0
....
%scene for_npc
50:stun_bc:cast stun on %v0
50:soul_bc:cast soul_steal on %v0
::@return11条件、循环与段末计数
| 结构 | 使用方法 |
|---|---|
| if / elif / else / endif | 3.0只在scene中使用。 |
| do 条件 / loop 条件 | 前后条件可省,省略为真;相应条件非0继续循环。 |
| foreach 变量 / loop | 逐项枚举,循环自身推进指针,不再手动%i。loop也可带表达式。 |
| break/continue | 结束循环/转下一轮,scene与bc中都可使用。 |
| on (条件) | 在bc内按条件启用后续规则;如MP高于300重试,低于等于300进入下一步。 |
例如在同一行为控制段中,用 on (%m > 300) 启用 retry 规则,用 on (%m <= 300) 启用 next 规则;阈值和动作属于这个示例。do/loop、foreach、break 与 continue 的一般用法见上表,循环自身已推进枚举指针,不必再次自增。
示例在 stun_bc 条件判断后,以 50:stun_bc:cast stun on %v0 和 50:storm_bc:cast mind_storm on %v0 配合正文命令;%v0 保持来源写法。
%bc stun_bc
retry::你上一個動作....
...
on (%m > 300)
retry::%i0你...
on (%m <= 300)
next::%i0你...
%scene begin
50:stun_bc:cast stun on %v0
50:storm_bc:cast mind_storm on %v0第八课的sayhi例在段末用(%I0==0)控制五次发言,再说bye;深度恢复例还以MP>300限制。指针应在成功、目标不在或目标已有该效果时前进,失败时继续处理当前目标。原例误写%scane,另一处jingyan/jinyan及begin_bc/new_begin_bc命名不一致,均不是新语法。
%scene sayhi::(%I0 == 0)
5::say hi
%scane begin
::%z0
::@call sayhi
10::say bye
%variable 0
a
b
c
d
e%variable 0
a
b
c
d
e
下面的例子是,當角色的法力值大於 300 時,依次對周圍的施展深恢,否則就用一次心爆。
%variable 0
mana
manb
...
manx
%scene begin
::@call drnpc
50:mind_bc:cast mind_blast on %v0
%scene drnpc::(%m > 300)
50:dr_bc:cast deep_recover on %v0
%bc dr_bc
next::%i0<成功的消息>
next::%i0<NPC 不存在的消息>
next::%i0<NPC 已經有深恢的消息>
next::<法術失敗的消息>
retry::<正忙的消息>
...12反馈命令、优先顺序与运行控制
| 命令 | 用途与限制 |
|---|---|
| retry [时间] | 等待后重做当前命令;等待中命令bc关闭,场景bc仍有效。 |
| next [时间] | 提前结束当前动作,等待后进入下一条;同样暂时关闭命令bc。 |
| delay 时间 | 重设当前等待,保持当前命令bc。 |
| change bc名 | 改用另一个命令bc,直至动作结束、重试或再次change。 |
| ignore | 忽略整条已匹配消息。 |
| priority | ZKOK默认顺序:全局bc→场景bc→命令bc。 |
| priority inverse | ZKOK反转顺序:命令bc→场景bc→全局bc;这与IKOK历史版临时不接收public_bc的说明不同。 |
| restart [场景] | 复位后从指定段开始,省略从begin;指定不存在的段会停止。 |
| pause/stop/run | 暂停/停止/继续机器人。此处run不是@&run移动。 |
| shutdown | 关闭GKK;后收录问答支持shutdown 300在300秒后重连,0或无参数不重连。早期第十一课则写参数忽略,属版本差异。 |
| echo/@echo | 制造一条内部消息供bc匹配,不发给游戏;3.0仅scene使用。 |
| log、show、prompt | 写记录、在ZTerm显示、弹提示;早期bc的log与prompt作用于被匹配消息。 |
保留重启消息匹配示例:restart::@restart;也可restart:second_begin:@restart。整点维护提示的原例用shutdown:600:万王之王的世界将在1分?后重新启动。问号本来就在原文,必须按实际回包核对。
13相对坐标、罗盘位置与移动
第21页图中玩家在(5,10),纵向0~20;偶数行11个位置、奇数行10个,顶上重复的横向数字表示交错位置,不是20个独立横格。图中@标出四角常用放NPC位置,*为其他可放物件点,#是玩家。
| 写法 | 用途 |
|---|---|
| (x,y) | 相对当前角色的可见位置。 |
| [x,y] | 罗盘绝对坐标,主要用于行走、奔跑。 |
| NPC/物品名 | 可用中英文名称;同名对象的选择不确定。 |
| %(x,y)、%p变量、%P变量 | ZRobot位置转换后用于游戏指令。 |
| @&click/@&look/@&kill | 点击物件/查看人物/攻击人物。 |
| @&go/@&run | 走到/跑到目标位置。 |
50:fire_bc:cast fireball on %(0,0)
50:fire_bc:cast fireball on %(0,1)
50:fire_bc:cast fireball on %(1,0)更新后的 ZKok 允许字符串相加,计算式须加括号。以下移动至当前位置横、纵各减 3 的坐标;50 是命令行中原有的等待值。
50:run_bc:("@&run [" + (%sx - 3) + "," + (%sy - 3) + "]")%variable 5
(0,0)
(0,1)
(1,0)
(1,1)
(2,0)
(2,1)
(0,18)
(0,17)
(1,18)
(1,17)
...
(10,20)
%scene fightall::(%I5 == 0)
20:soul_steal_bc:cast soul_steal on %p514到达判断、HP/MP与时间陷阱
trap设置后持续有效,restart或同名trap不带参数时取消。可用trap hplow 350,400,在HP低于350时触发@hplow、回升400后复位;MP使用mplow,位置用trap position x,y,时间用trap time。问答另写trap hp 200,300,附表没有解释hp是否是hplow别名,保留这个未决差异。
%public_bc
call:drink:@hplow
%scene begin
trap hplow 350,400
%scene drink
0.1:drink_bc:drink potion
return
%bc drink_bc
stop::What?到达[50,100]可布置地面消息,或发送移动后循环检查%sx/%sy,或设position陷阱等@position。不能只靠固定50秒等待断言已经到达。
do ((%sx != 67) || (%sy != 108))
1::
loop
如果要跑到[50,100], 可採用的幾種方法:
1. 在[50,100]處設置地面信息
2. 用%sx, %sy, %sc 等來判斷
::@&run [50,100]
do
1::
loop ((%sx != 50) || (%sy != 100))
3. 使用 trap
%scene ...
trap position (50,100)
50:run_bc:@&run [50,100]
%bc run_bc
next::@position15弹窗与快捷键:3.0迁移4.0
| 用途 | 旧写法与变化 |
|---|---|
| 快捷键 | @'1~@'8对应F1~F8,@"1~@"8对应Shift+F1~F8。 |
| 按钮 | @%0关闭;@%1~@%9选择第1~9个按钮。finger/who原例1上一页、2下一页、3结束、0取消。 |
| 3.0输入与列表 | @$内容输入单行文字;选择列表时@$数字选第几项,0不选,然后另发@%按钮。 |
| 4.0 | 把@$参数合入@%:如@%1 10000,或@%1 罗盘/@%1 2。脚本中百分号须转义为@%%。 |
3.0脚本迁移4.0还应核对GB/Big5转换造成的字形差异、弹窗文字变化,以及首尾增加的消息;不要把旧匹配字串不适用误判成循环本身有错。
research 10
@%%1 1000016从ZRobot2.0迁移到3.0
- 把初始化段的public_bc设置改为%public_bc段。
- 把hp_low/hp_restore和mp_low/mp_restore改为begin中的trap hplow/mplow。原begin改名raw_begin,保留原场景bc,再从新begin转入。
- 将相等判断的=改为==;保留真正赋值用=。
- 自身坐标由%pc/%px/%py改为%sc/%sx/%sy;旧字母c、x、y已属于扩充后的变量。
- 复核%I枚举终点行为、操作符以及旧@控制行时间被忽略的影响。
#%ZRobot.dll
hp_low:???
hp_restore:???
mp_low:???
mp_restore:???
public_bc:<全局共用行為控制段名>
...
%bc <全局共用行為控制段名>
...
...
%scene begin:<begin 段用行為控制段名>:...
...在改成 3.0 的格式時,可按下面的方法
#%ZRobot.dll
%public_bc
... (全司供用的行為控制段內容)
...
%scene begin
trap hplow <hp_low_value>,<hp_restore_value>
trap mplow <mp_low_value>,<mp_restore_value>
goto raw_begin
%scene raw_begin:<begin 段用行為控制段名>:...
...17小写转换
| 表达式 | 结果 |
|---|---|
| %{%1%} | 将捕获变量 1 的大写字母转为小写 |
| %{%VA%} | 先取变量 a 的右值,再转小写 |
| %{VA%} | VA 没有 % 替换标记,原样保留 |
示例在收到“加潜能”的私聊或回答后调用 pot 分支。Cast pote??? on %{%1%} 中的 pote??? 是原始未填全法术名,不能替换为猜测的法术。
%scene begin
100:wait_bc:
%bc wait_bc
call:pot:%b%*(%*)告訴你:加潛能
call:pot:%b%*(%*)回答你:加潛能
%scene pot
50:pot_bc:Cast pote??? on %{%1%}
return retry18额点调整与自动启动
setup dex -n
setup con n....\ZTerm.exe C:\StartKok.txt
帳號名:帳號密碼:角色名:角色密碼:伺服器启动文件每行填写一组账号、角色与服务器,以冒号分隔;可把ZTerm启动命令做成快捷方式。这里展示的是原教程的占位格式。
19两坑牧系示例的坐标与执行顺序
相对坐标使用小括号,罗盘绝对坐标使用中括号。原教程把视野描述为 10×20,端点为 (0,0) 与 (10,20);这些坐标用于当时客户端的可见范围。
- 变量 a 的两项是 [72,152]、[52,150];begin 中 ::%ia 把索引加一,然后 20::@&run %va 移向另一坑。原文建议跑不到时把 20 秒改为 30 秒。
- goto kill 进入攻击段;按表中 24 个相对坐标依次执行 1:kill_bc:@&kill (坐标)。
- 之后用 100:holy_word_bc:cast holy_word on 施放圣言,等待值为 100;kill_bc 遇无生物消息回 begin。
- holy_word_bc 对忙碌、什么也没发生、MP 不足、上个动作未完成和结束圣祷消息重试;不在战斗时来源写 goto:run,但后文只定义 purify。
- purify 使用 foreach s、100:purify_bc:purify %ps、loop 遍历尸体;安葬成功、灵魂散去、暂不可处理时 next,没有待净化灵魂时回 begin。
%variable s
# 這是變數段,每個變數段定一個變數,ZRobot只允許有26個變數,變數名可以是"a"-"z"("A"-"Z", "0"-"9"),這裡是定義變數s。
(0,2)
(0,3)
(1,2)
(1,3)
(2,2)
(2,3)
(7,3)
(8,2)
(8,3)
(9,2)
(9,3)
(10,2)
(0,20)
(0,19)
(1,20)
(1,19)
(2,20)
(2,19)
(7,19)
(8,20)
(8,19)
(9,20)
(9,19)
(10,20)
# 以上是npc的相對座標,zkk的相對座標是以你為中心,所能看到的螢幕分成10x20的方格,左上為(0,0)右下為(10,20)注意必須是小括號,如果你是大臣開啟網格就明白了。
%variable a
[72,152]
[52,150]
# 以上是定義變數a為用羅盤測出的座標,必須用中括號,這裡是兩個坑的中心座標(就是站在骷髏頭上的座標)
%scene begin
#每一個程式碼必須有的,也是從這裡開始執行程式碼的。
::%ia
# 變數a內的值加1,例如,原來變數a是[72,152],執行這個命令後成為[52,150]
20::@&run %va
# @&run 是跑的指令,後面可以是座標和相對座標,%va是變數a的內容,20是執行@&run [52,150]命令20秒,就是向第2個坑跑20秒,跑不到?就改成30秒
goto kill
# goto 跳轉到指定標號或指定正文段,這裡是轉到%scene kill
%scene kill
# 定義正文段kill,zkok可以存在多個正文段
1:kill_bc:@&kill (0,2)
1:kill_bc:@&kill (0,3)
1:kill_bc:@&kill (1,2)
1:kill_bc:@&kill (1,3)
1:kill_bc:@&kill (2,2)
1:kill_bc:@&kill (2,3)
1:kill_bc:@&kill (7,3)
1:kill_bc:@&kill (8,2)
1:kill_bc:@&kill (8,3)
1:kill_bc:@&kill (9,2)
1:kill_bc:@&kill (9,3)
1:kill_bc:@&kill (10,2)
1:kill_bc:@&kill (0,20)
1:kill_bc:@&kill (0,19)
1:kill_bc:@&kill (1,20)
1:kill_bc:@&kill (1,19)
1:kill_bc:@&kill (2,20)
1:kill_bc:@&kill (2,19)
1:kill_bc:@&kill (7,19)
1:kill_bc:@&kill (8,20)
1:kill_bc:@&kill (8,19)
1:kill_bc:@&kill (9,20)
1:kill_bc:@&kill (9,19)
1:kill_bc:@&kill (10,20)
# @&kill (0,2)是鏢相對座標(0,2)處的npc,kill_bc是根據行為控制段%bc kill_bc的內容,來決定鏢完了作什麼
100:holy_word_bc:cast holy_word on
# 放聖言,然後停100秒後執行下一個命令,如果holy_word_bc跟對應的行為控制段%bc holy_word_bc匹配的話,執行匹配的命令。
%bc kill_bc
# 定義行為控制段kill_bc
goto:begin:這裡沒有任何生物。
# 跟前面的鏢npc的命令對應,如果鏢npc,螢幕顯示:這裡沒有任何生物。那麼執行goto begin
%bc holy_word_bc
# 定義行為控制段holy_word_bc,跟放聖言對應
retry::你正忙著呢 !
# 當放聖言的指令發出後,螢幕顯示:你正忙著呢 !重新執行放聖言的指令
retry::但是什麼事也沒發生。
# 當放聖言的指令發出後,螢幕顯示:但是什麼事也沒發生。重新執行放聖言的指令
retry::你的法力不夠 !!
retry::你上一個動作沒有完成, 不能施法!
retry::你在胸口畫出一個神聖的印記,結束了你的聖禱。
goto:run:你現在不在戰鬥中。
# 當放聖言的指令發出後,螢幕顯示:你現在不在戰鬥中。跳轉到 run,這裡的作用是用聖言殺死npc後跳轉到淨化段。
%scene purify
#定義purify
foreach s
# foreach 和loop 配合使用,執行它們中間的命令,遇到loop ,foreach 後面跟著的變數加1
100:purify_bc:purify %ps
# 淨化相對座標處的屍體
loop
%bc purify_bc
next::你面無表情地將%*的屍體埋葬, 並安撫他的亡靈, 眼中流露出難得一見的慈悲。
# 淨化指令發出後,螢幕顯示:你面無表情地將%*的屍體埋葬, 並安撫他的亡靈, 眼中流露出難得一見的慈悲。執行下一個命令,就是淨化下一個。(%*可以代替任意字元)
next::一個朦朧的靈魂從你眼前飄過, 向你微笑後, 散入無盡的天空。
next::你現在還不能處理這具屍體。
goto:begin:這裡並沒有需要淨化的靈魂。
# 淨化玩了,重新開始。20原稿中未完成或含糊的地方
- accept ??????需要填入收人的指定位置,Cast pote???不是完整法术ID。
- 两坑示例holy_word_bc转run,但原稿没有定义run,只给出purify净化段;不能把说明当作已补齐控制流。
- 深度恢复/冥思示例有%scane、begin_bc/new_begin_bc、jingyan/jinyan名称不一致。
- 第39页给字符串变量赋不存在枚举值后的%oa/%va结果仍写???;不编造一个运行结果。
- 早期关闭命令参数忽略、后期shutdown秒数重连,以及2.0/3.0的%I与等号差异,均按就近版本阅读。
本页保存的是历史脚本知识,尚未在相应旧客户端执行。反馈文字、法术、地点及账号配置需要和实际运行版本对应。
↗来源与版本
飞梦/17KOK、渔夫与2001年典藏版出现数值或机制冲突时,以飞梦所记相应服务器的后续有效规则为正文依据;同站更新按明确生效日期处理。旧规则保留年代与服别,未明日期的差异就近说明;原资料对照用于追溯。
对照原资料
查看 5 份来源与保存记录
zkok4.0 教学课程PDF版-软件下载
查看保存记录
- 来源编号
17-d9a7b9c249e82822- 保存时间
- 2026-09-07
原文署名:飞梦
ZKok 4.0教学课程PDF(46页)
查看保存记录
- 来源编号
17-zkok-manual-pdf- 保存时间
- 2026-09-10
- 原始位置
- PDF页序与页脚1~46逐页一致;已读全部正文,回看21与29~36页图表。
原文署名:约拿(PDF元数据)
