设计游戏状态
每个有趣的世界都在追踪某些东西。大逃杀追踪 40 名学生的存活状态。樱花季追踪三条独立的感情线。流浪日记同时追踪同伴态度、道具栏和位置状态。变量系统就是你赋予世界记忆的方式。
本指南教你如何选择和设计变量——这些决策将塑造世界的游玩体验。关于变量类型和指令的基础知识,请参阅入门指南:变量。
创作决策:应该追踪什么?
在打开编辑器之前,先问自己:玩家需要感受到什么是真实的?
在生存游戏中,答案是资源——生命值、饥饿度、弹药。玩家需要感受到匮乏。在恋爱游戏中,是关系深度——玩家需要感受到自己的选择在朝着某个方向积累。在推理游戏中,是知识标志——玩家需要感受到调查在不断收窄。
不需要为每件事都创建变量。AI 能很好地自行处理叙事细节——除非天气在机制上有意义,否则不需要 current_weather 变量。追踪那些驱动决策和后果的东西。
一个好的判断标准:如果这个值应该影响 AI 接下来写什么,就创建变量。如果只是氛围点缀,让 AI 自由发挥。
变量的生命周期
变量有清晰的生命周期:你在编辑器中定义它(类型、默认值、约束),玩家开始新会话时它被初始化为默认值,游玩过程中 AI 通过方括号指令修改它,规则引擎可能在条件满足时进一步修改,每回合结束时整个游戏状态被持久化到数据库。
如果你向一个已有玩家在玩的世界添加新变量,现有存档在下次加载时会自动获得默认值。如果删除变量,它会被静默过滤掉。你可以放心地迭代变量设计,不会破坏任何人的存档。
选择合适的类型
四种变量类型(number、string、boolean、JSON)在入门指南:变量中有介绍。设计决策在于何时使用哪种,因为这个选择会影响 AI 与你的世界的交互方式。
Number:当值是渐进变化的、需要设置事件阈值、或变化幅度有意义时使用。数值类型的最小/最大值由引擎强制执行,所以你不需要浪费 prompt 空间告诉 AI「别让生命值低于零」。
String:当值是标签而非数量时使用——地点、心情、故事阶段。不要用 string 表示两种状态的值(锁定/解锁),用 boolean 代替。
Boolean:当某件事要么发生了要么没发生。最简单的类型,AI 最容易管理,也是条件条目和规则的理想开关。
JSON:当单个变量需要存储结构化数据时:有属性的道具栏、有多重关系的阵营图、有嵌套进度的任务日志。不要用 JSON 存简单值——[health: -10] 比 [stats.health: -10] 更可靠。
编写行为规则——四问公式
入门指南:变量介绍了行为规则的基础知识,也展示了模糊规则和具体规则的区别。本节教你持续写出优秀行为规则的公式。
好的行为规则回答四个问题:
1. 这些值代表什么? 给 AI 一个图例。对于数值,描述每个范围在叙事上代表什么。对于字符串,列出有效状态。对于布尔值,解释 true 和 false 在故事中的含义。
2. 什么触发变化? 具体描述触发场景。对于关系变量,「善意互动增加好感度」就够了。对于 HP,「受到物理伤害减少生命值」也可以。给出的示例越多,AI 越一致。
3. 应该变化多少? 这是大多数创作者投入不足的地方。给出幅度范围。小事件应该产生小变化,大事件应该产生大变化。没有这个指导,AI 要么过度反应(每次互动 +20 好感度),要么反应不足(差点死掉才改 2 点生命值)。
4. 极限是什么? 限制每回合的最大变化量。这能防止剧烈波动破坏沉浸感。「每回合变化不超过 15」能让节奏保持自然。
TIP
通常两到四句话就够了。如果你的行为规则比一小段话还长,请简化。AI 很聪明——给它概念和边界就行,不需要给它一本规则书。
一些值得了解的事
delete 操作从 JSON 对象中删除一个键或从 JSON 数组中删除一个元素——但它无法通过常规的 [var: delete ...] 方括号语法使用。指令解析器不接受 delete 所需的裸字符串或数字。两种可行路径:在 AI 输出中使用 <UpdateVariable> JSON Patch 块(参见 AI 指令与宏),或在规则动作的 modify-variable 中使用 operation: "delete"。
变量的 category 字段(stat、inventory、resource、flag、relationship、custom)是组织性的——它不改变变量的行为,但帮助 AI 理解每个变量的角色,也帮助你在变量很多时保持编辑器整洁。
已发布世界中的真实模式
关系追踪
如入门指南:变量所示,樱花季为每位女主角使用独立的数值变量,行为规则指定了幅度范围。这是最简单的方式,对 2-5 个角色效果很好。
另一种方案:用单个 JSON 对象存储所有关系。
{
"aria": { "trust": 50, "romance": 0, "met": true },
"kael": { "trust": 30, "romance": 0, "met": false }
}当角色很多时更简洁,因为 AI 可以用点路径更新任何角色([relationships.aria.trust: +10]),你也可以通过 merge 添加新角色。代价是:独立数值变量对 AI 更简单易懂,也更不容易出错。
选择独立变量:当你有 2-5 个角色且需要最高可靠性时。选择 JSON 对象:当你有很多角色或需要动态添加新角色时。
道具栏系统
最简单的道具栏是使用 append 的字符串变量——如入门指南:变量中大逃杀的死亡名单所示。要实现带属性的道具栏,使用 JSON 数组:
[
{"id": "torch", "name": "Torch", "qty": 1},
{"id": "bread", "name": "Bread", "qty": 2}
]添加道具用 push。移除道具用 delete 加索引。行为规则应该告诉 AI 使用哪种方式:
Use push with a full item object to add items. To remove an item, use delete with the array index. Inventory limit: 10 items. When limit reached, the character must drop something first.
地点与场景状态
一个名为 location 的字符串变量(默认值:「starting village」)通常就足够了。AI 在玩家移动时写 [location: set "dark forest"],基于地点关键词的条目注入相应的场景描述。
对于需要追踪场景多个方面的复杂世界,使用 JSON 对象:
{
"area": "castle",
"room": "throne-room",
"time": "night",
"alert-level": "high"
}AI 可以更新单个方面:潜入守卫之后 [scene.alert-level: set "low"]。
关于完整的指令语法(包括全部 9 种操作、简写陷阱和 JSON 变量的点路径表示法),请参阅 AI 指令与宏。
常见错误
过度追踪。 不需要为每件事创建变量。如果 AI 能在叙事中自行处理某件事而不需要背后的数字,就跳过变量。你添加的每个变量都是 AI 需要管理的更多状态和需要编写的更多指令。最好的世界追踪 5-15 个东西,不是 50 个。
模糊的行为规则。 「追踪生命值」什么都没告诉 AI。「轻伤减少 5-15,重伤减少 15-25,0 = 死亡场景」告诉了 AI 一切所需。行为规则是变量能用和被忽略之间的分水岭。
简单值用了 JSON。 如果你只需要一个数字,就用 number。[health: -10] 比 [stats.health: -10] 更简单可靠。把 JSON 留给真正的结构化数据。
数值变量忘记设 min/max。 没有边界,AI 可能把生命值推到 -47 或金币推到 999999。每个数值变量都设最小和最大值。引擎自动限制——这是免费的保险。
不测试幅度。 玩你的世界 10 个回合,检查数字是否感觉合理。如果好感度在三次互动中从 15 跳到 80,你的幅度范围太宽了。如果 20 个回合后几乎没动,就太窄了。
ID 对 AI 不友好。 使用简单可读的 ID,如 health、player-gold、aria-trust。避免空格、特殊字符,或可能与内置宏冲突的名称(user、char、time、date)。
延伸阅读
完整变量 schema → World Spec: Variables
