Skip to content

行为与自动化 ​

平台上大多数世界根本不用行为,这完全没问题。创作者会用到行为,通常是因为手上有几件很具体的事,没法指望 AI 每次都做得一样。

触发、条件和效果的基础,见 行为。


什么时候值得用行为(什么时候不值得) ​

新手用行为最常犯的错是搞得太复杂。看到 + 行为 按钮,就觉得「什么都该自动化」。结果做了 30 条行为,干的都是写得好的设定本来就能搞定的事,世界玩起来反而很机械。

行为是用来求准的。 它解决的是 AI 一不稳定就会坏掉体验的问题:

问题为什么用行为
「好感正好到 75 时,玩家要收到提示」AI 不知道确切的数字,引擎知道
「进竞技场就换战斗音乐」AI 有一半时候会忘了写音频指令
「每 3 回合饥饿加一点」AI 有时第 2 回合就加,有时干脆忘了
「HP 归零的那一刻必须出死亡画面」这件事 AI 错一次都不行

设定是用来讲故事的。 它解决的是需要灵活、需要分寸的问题:

问题为什么用设定
「信任越高,NPC 说话方式跟着变」条件设定给 AI 的是表现上的指引,不是死板的脚本
「玩家到了某个地方就透露相关设定」关键词设定会自然地进到 AI 的上下文里
「进地牢时换一种氛围」设定能把氛围写清楚,行为只能给 AI 递一两句话

简单的判断办法: 如果你在行为的 告诉 AI 效果里写了一整段叙事文字,那多半应该写成一条设定。行为像开关和旋钮,真正的内容放在设定里。

Sakura Season 怎么两样一起用 ​

Sakura Season 是行为和设定配合得很好的例子。它有 9 条行为,干的都是同一件事:盯着好感的阈值。

设定 写每位女主角在不同好感时的表现(戒备、慢慢热络、露出软弱)。行为 负责那几个准确的时刻:好感 25 弹一个提示(「Hina 好像注意到你了……」),好感 50 给 AI 一段新指引,让它写她又想靠近又往后缩的样子,好感 75 弹一个成就提示,开启告白的剧情。

重活是设定干的。行为保证这几个节点在正好的时刻出现。


触发方式详解 ​

触发(什么时候触发)决定引擎 什么时候 去检查一条行为。

真正常用的几种 ​

变量越过阈值:最常用的触发。它在数值变量越过某条线的 那一刻 触发。

这和每回合检查「生命是不是低于 20」不一样。越线触发只在值真的跨过这条线时触发 一次。如果生命本来就是 10,一直是 10,它不会再触发。

要设三样:哪个变量、往哪个方向(上升到以上 或 下降到以下)、多少。

Wandering Diary 用了三条这样的行为来切换地区:distance 变量越过 50,玩家进入县城;越过 150,进入山区;越过 200,进入省城。每个阈值都会设一个新的 region 变量值,并弹一个提示。

变量变化:某个变量变了就触发。可以选一个变量来盯,也可以不选,这样任何变化都会触发,再用条件来收窄。

想对变量 等于某个值 做出反应、而不是对它 越过某条线 做反应时,用这个。比如:「每次地点变化时,看看地点是不是 dark_forest,是的话放恐怖音乐。」不管是什么改的,值每变一次,这条行为就重新检查一次。

每 N 回合:按固定间隔触发:设成 3,就在第 3、6、9、12……回合触发。想在某一回合只触发一次,就把 N 设成那一回合,最大触发次数 设成 1。

适合生存机制(饥饿一点点涨)、节奏事件(第 20 回合提醒时间不多了),或者定期提醒。

每回合:每次玩家和 AI 来回一轮后触发。少用。一条每回合都跑、每回合都弄出点动静的行为会让玩家烦。最好配上能把大多数回合筛掉的条件,或者只拿来在后台悄悄记账。

会话开始:新开一局时触发一次。适合做初始化:设初始值、显示欢迎消息、放开场音乐。

玩家点了某个按钮:玩家界面 里的按钮执行 让一条行为生效 时触发,或者你的界面代码调用 api.executeAction(id) 时触发。按钮还能把值传进来,见 按钮传值。

不太常用的触发 ​

玩家说出关键词:玩家的消息里有你写的某个词时触发。匹配选项和关键词设定一样:可以选全词匹配、正则(关键词写成 /.../flags),以及辅助关键词过滤(AND_ANY、AND_ALL、NOT_ANY、NOT_ALL)。

AI 说出关键词:同上,只是扫的是 AI 的回复。适合对 AI 写出来的东西做反应,比如「AI 提到『战斗开始』时换音乐」。

每隔几秒:按真实时间触发,但只在玩家开着游戏的时候走。适合在玩家读字或思考时也要往前走的东西,比如倒计时,或者一个会等得不耐烦的 NPC。要跟着故事节奏走的,用 每 N 回合。


条件:「如果……」这一关 ​

如果…… 用的条件系统和条件设定一样:同样 7 种比较方式(eq、neq、gt、gte、lt、lte、contains,画布上显示为 等于 / 不等于 / > / ≥ / < / ≤ / 包含),同样用全部/任一来组合。完整的比较方式说明见 写好条目的技巧:跟着状态走的设定。

条件留空的话,触发一对上,行为就执行。

触发对上了、但条件不成立时,条件不满足时告诉玩家 会给玩家弹一句提示。不写的话就什么都不发生,玩家也不知道按钮为什么没反应。

拿一个变量和另一个变量比 ​

默认情况下,条件是拿变量和一个固定的数字或文字比,比如「好感 ≥ 50」。但右边有一个 常量 / 变量 的切换。切到 变量,条件就变成拿两个实时的变量来比:

  • affinity > wariness:只在好感此刻压过戒心时触发
  • gold >= price:判断「买不买得起」,不用把价格写死

阈值本身不固定、会随着游戏变的时候,就用这个。同一套系统还有两个细节:

  • 左边可以写一个进到 JSON 变量里的 点路径:inventory.gold >= 100。
  • contains 除了匹配子字符串,也能判断 是否在数组里,所以 flags 是一个包含 "met-king" 的列表时,flags contains "met-king" 为真。

停止条件 ​

停止条件 和「如果……」正好相反:只要有一个停止条件成立,这条行为就不触发。用来做「触发到 X 为止」,比如一条每 5 回合的提醒,好感到 100 以后就该安静了。值又掉回去的话,行为会接着跑。想在触发固定次数后停下,用 最大触发次数。


效果:行为能做什么 ​

条件通过后,引擎按顺序执行效果。一条行为可以有好几个效果。

修改变量 ​

直接改一个变量。六种操作:设置、增加、减少、乘以、切换、追加。

值有三种模式:

  • 常量:一个固定的数字或文字。
  • 变量:另一个变量当前的值:health -= strength、score += combo、wallet += daily_income。引擎在行为触发的那一刻去读,所以算的永远是实时的值。
  • 随机:一个范围里的数、一次掷骰,或者从列表里抽一个。从列表里抽的时候可以避开最近抽过的几个,适合「今天来的客人」这种。

启用/禁用变量 ​

把一个变量打开或关掉。变量关着的时候,它不进 AI 的提示、不在玩家界面上显示、也不接受 AI 的修改,但值一直保留,条件、行为和你的界面代码照样读得到。适合配一个 什么时候 AI 看得到 设成 手动 的变量:只在地牢里才有的战利品、只在直播进行中才存在的分数。见 变量 → 什么时候 AI 看得到。

启用/禁用情境 ​

打开或关掉一个 情境。设成 只看启用开关 的情境就靠它。

告诉 AI ​

给 AI 塞一句玩家看不到的话,只在下一次的提示里出现。适合硬推一个剧情节点:「一只怪物出现了!描写一场随机遭遇。」

如果这段指引从此以后都要一直在(比如 Sakura Season 在好感 50 时加的那段又想靠近又往后缩的指引),就把它写成一条待命设定,改用 启用词条。

启用词条 / 禁用词条 ​

打开或关掉一条设定。一条行为启用一条待命设定,就能在对的时候透露隐藏的设定,而且它会一直开着,直到有东西把它关掉。

启用/禁用行为 ​

打开或关掉另一条行为。行为链就是这么做的:行为 A 在你进地牢时触发,打开行为 B(每回合的怪物遭遇)。行为 C 在你离开地牢时触发,把 B 关掉。

显示通知 ​

给玩家弹一个提示。四种样式:信息、成功、警告、错误。

解锁一个时刻 ​

给玩家一张小卡片,有标题、一句话和一张图,收进一个列表变量里,所以只会弹一次。见 时刻。

播放音乐 / 播放音效 / 停止音频 ​

放一首背景音乐、放一个一次性音效,或者停掉一条音轨。音轨从你的音频列表里选。

代码 ​

在 高级 里,行为还可以在玩家开着游戏的时候,在卡里跑一小段 JavaScript。用来做效果表格表达不了的事,比如洗牌。见 代码行为。


已发布世界里的真实做法 ​

好感阈值(Sakura Season) ​

最经典的用法。Sakura Season 三位女主角一共 9 条行为,每位都是同样的三档:

好感 25:一个不起眼的信息提示「Hina 好像注意到你了……」,同时把 story_phase 设成 "daily"。只触发一次(最大触发次数 1)。

好感 50:一个提示「Hina 开始把你当成特别的人了……」,加一段给 AI 的新指引,描写她又想靠近又往后缩的样子,同时把 story_phase 设成 "deepening"。只触发一次。

好感 75:高潮的开关。弹提示,给 AI 指引让它安排告白的场景,story_phase 设成 "climax"。只触发一次。

每条行为都是 变量越过阈值 + 上升到以上,正好触发一次,把给玩家的提示、给 AI 的指引和阶段变量的更新放在一起。现在要做同样的东西,就把每个阶段的指引写进一条待命设定,用 启用词条 打开它。

切换地区(Wandering Diary) ​

Wandering Diary 有一个 distance 变量,玩家走得越远它越大。三条 变量越过阈值 行为在距离 50、150、200 时切换 region 变量,每次都弹一个提示:「你终于走出荒野,进入了县城地界」「过了县城,眼前是一望无际的山脉」「远处出现了省城的轮廓」。

AI 完全不用记距离,也不用记各个地区的边界。

死亡触发 ​

Wandering Diary 和生存类模板用的是同一个办法:生命降到 1 以下时 变量越过阈值 触发,弹一个 错误 样式的提示。几个要点:

  • 优先级 100:死亡要比别的都先判断
  • 最大触发次数 1:死亡提示只弹一次(不过大多数世界不设这个,反正也不会第二次跌破零)
  • 有时会配一个 告诉 AI,让它描写角色的死亡

地牢激活链 ​

RPG 世界里常见的做法:行为 A 盯着「进入地牢」(关键词触发,或者 变量变化 加一个条件),然后用 启用/禁用行为 打开行为 B(每回合 触发、带冷却的怪物遭遇)。第三条行为盯着「离开地牢」,把 B 关掉。

这样怪物遭遇只限在特定区域里,AI 不用记玩家在不在地牢。如果地牢是一个 情境,可以不用这条链:把行为 B 放进这个情境里,它就只在情境开着时触发。


引擎怎么处理行为 ​

有事情发生时(一回合结束、来了一条消息、一个变量变了、按钮被按下、时钟走了一格),引擎把所有行为按优先级从高到低过一遍。对每一条,它会问:启用了吗?它所在的情境开着吗?触发和这次的事件对得上吗?「如果……」的条件过了吗?有没有停止条件成立?在冷却吗?到 最大触发次数 了吗?如果设了 发生概率(%),这次掷中了吗?全都过了,就按顺序执行它的效果。改变量的效果还可能引出别的行为,最多连 5 层,防止死循环。

玩家只看得到结果:一个提示、音乐变了、一个变量更新了。想知道一条行为为什么触发了、为什么没触发,就去 试玩,看 这回合。


控制行为什么时候触发 ​

优先级、冷却、最大触发次数和发生概率都在行为设置的 高级 里。

优先级 ​

数字大的先判断。好几条行为同时触发时,由优先级决定顺序。

实际用法:死亡判断设 100,剧情节点设 50,氛围效果设 10-20。不用太精确,保证要紧的行为在锦上添花的行为之前跑就行。

冷却 ​

触发之后,这条行为睡上这么多回合。冷却设成 5 的饥饿提醒不会每回合都烦玩家,两次提醒之间至少隔 5 回合。

最大触发次数 ​

这条行为总共最多触发这么多次。最大触发次数 设 1 就是一次性事件,最适合成就、第一次的新手提示和剧情节点。

发生概率(%) ​

本来会触发的时候,只有这个百分比的几率真的触发。留 100 就是每次都触发。适合随机事件:「每回合有 20% 的几率有陌生人来敲门。」

启用 ​

行为默认是启用的,但你可以把 启用 关掉,做成休眠的行为,等别的行为用 启用/禁用行为 来打开它。上面讲的地牢激活链就是靠这个。


常见错误 ​

设定就够用,却用行为搞复杂。 如果你发现自己在 告诉 AI 里写了很长的叙事文字,你多半需要的是条件设定。行为递一两句指引,设定提供成段的背景。

该用变量越过阈值,却用了变量变化。 变量变化 在变量每次变的时候都触发。如果你想要「生命低于 20 时提醒我」,用 变量越过阈值,它只在越线那一刻触发一次。变量变化 加一个 health < 20 的条件,会在 生命低于 20 期间的每一次变化 都触发,这多半不是你想要的。

频繁的触发忘了加冷却。 没有冷却的 每回合 行为每一回合都会触发。如果它会弹提示,玩家就会被刷屏。每次都问问自己:「玩家实际上多久该看到一次这个?」

一个只需要 3 条行为的世界做了 30 条。 Sakura Season 有 9 条行为:3 位女主角,每位 3 个阈值。大多数世界需要的更少,很多热门的卡一条都没有。先从设定和变量开始。只有发现 AI 在某件具体的事上不稳定时,再加行为。

不测试阈值。 如果你的行为在 health < 10 时触发,可生命实际上从来降不到那么低(因为你的设定让 AI「生命低于 30 时就描写玩家受伤」),它就永远不会触发。确认阈值和你的世界实际怎么运转对得上。


另见 ​

完整的规则 schema 和评估流程 → World Spec: Rules & Reactions