krkr2 中文文档 下载 App

选项分支与剧情流程控制

最基础的选项

; 显示一个选项分支框
[select]

; 选项一:点击后跳转到指定 scenario 标签
[goto target="branch_a" text="去找她"]
[goto target="branch_b" text="继续工作"]

; 选项取消(不想选)
[selectcancel]

对应的目标位置在 scenario 里标记:

; ...之前的剧情...

[select]
[goto target="branch_a" text="去找她"]
[goto target="branch_b" text="继续工作"]
[selectcancel]

; ======= 分支 A =======
; 这里的 @ 是 KAG 标签标记语法
; KAG 不会执行 @ 开头的行,只是用来定位

@branch_a
; 去找她的剧情
主角:(我应该去看看她。)
[click]

; ======= 分支 B =======
@branch_b
; 继续工作的剧情
主角:(工作要紧。)
[click]

jump 和 call 的区别

标签行为典型场景
jump跳转到目标后不回来剧情分支、标题画面进入游戏
call跳转到子流程,执行完 [return] 后回到原地通用事件(播放 CG、BGM 切换等)
; 跳转到 main.ks 的 title 标签
[jump storage="scenario/main.ks" target="title"]

; 调用公共函数(子流程)
[call storage="scenario/common.ks" target="play_bgm"]

; common.ks 里:
@play_bgm
[playbgm storage="bgm/title.ogg" loop=true]
[return]  ← 回到调用点

条件判断:if 和变量

KAG 里可以直接用变量

变量用 [set] 设置,用 [eval] 输出,用 [if] 判断:

; 设置变量
[set variable="age" value=18]
[set variable="name" value="hero"]

; 输出变量
今年 [eval exp="age"] 岁的 [eval exp="name"] 登场。

; 条件判断(类似 if)
[if exp="age >= 18"]
可以喝酒了。
[endif]

; 带 else
[if exp="score >= 80"]
成绩优秀!
[else]
继续加油吧。
[endif]

变量作用域

数组和对象

; 数组
[set variable="inventory" value="new Array()"]
[tjs]
inventory.push("钥匙");
inventory.push("药水");

; 判断数组里有没有东西
[if exp="inventory.length > 0"]
你身上有东西。
[endif]

嵌套条件

[if exp="score >= 80"]
  [if exp="age >= 18"]
    成年人,成绩优秀。
  [else]
    未成年人,成绩优秀。
  [endif]
[else]
  成绩不够。
[endif]

也可以用逻辑运算符简化:

[if exp="score >= 80 && age >= 18"]
成年人且成绩优秀。
[endif]

while 和 for 循环

; while 循环
[while exp="counter < 5"]
计数器:[eval exp="counter"]
[tjs] counter++;
[endwhile]

; for 循环(用 TJS2 更直观)
[tjs]
for (var i = 0; i < 5; i++) {
    // 循环体
}

实际游戏脚本里循环用得不多,主要在处理列表数据或重复动作时。

标签跳转的最佳实践

模块化剧情

; main.ks 只负责串联
[call storage="scenario/common.ks" target="init"]

; 序章
[call storage="scenario/prologue.ks" target="start"]

; 第一章
[call storage="scenario/chapter1.ks" target="start"]

; 第二章
[call storage="scenario/chapter2.ks" target="start"]

每个章节一个文件,互不干扰,方便协作和维护。

公共流程抽取

; common.ks 里放通用逻辑
@show_cg
[bg storage="cg/current.tlg" time=500]
[tjs]
KAG.manager.waitClick();
[bg clear time=500]
[return]

存档与变量持久化

; 玩家存档时自动保存所有全局变量和当前场景位置
[save]

; 读档
[load]

; 程序自动触发存档/读档(比如选项分支后自动存)
[tjs]
KAG.manager.save(slotNumber);

存档时自动保存的内容: