选项分支与剧情流程控制
最基础的选项
; 显示一个选项分支框
[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]
变量作用域
- KAG 变量本质就是 TJS2 全局变量
- TJS2 的
var声明的是局部变量,KAG 不能直接访问 - KAG 用
[set]设置的变量是全局的,跨 scenario 文件也能访问 - 存档时全局变量会一起保存
数组和对象
; 数组
[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);
存档时自动保存的内容:
- 当前 scenario 文件和标签位置
- 所有全局变量(包括 KAG 和 TJS2 的)
- BGM 状态
- 图层状态(部分 KAG 配置)