《叙事策划与叙事工艺》卷二《叙事引擎与分支系统》全 50 篇。卷一回答的是「一个故事能不能先被写成一份规格」;这一卷回答的是:这份规格能不能被一台机器执行——而且是可复现地、可断言地、可跨语言地执行?
站内的叙事内容基本落在两端:一端是引擎怎么实现(game/client/ 的打字机、立绘口型、字幕时间轴、过场系统,game/server/ 的 NPC 对话状态架构),一端是散文式的叙事经验(game/indie/ 的分支对话长文、game/industry/ 的叙事设计概览)。中间那一段——同一份规格在 Python 仿真、TypeScript 内核与浏览器原型三处跑出来的状态摘要是否逐位相同——没有人占。 而这一段恰恰是可计算、可跑、可证伪的一段。这一卷补的就是这一段。
做法还是那句话:一份叙事规格,三处消费。config/story_spec.json 是唯一真源(世界 / 角色 / 弧光 / 节拍 / 场景图 / 对话 / 条件 / 状态 / 结局 / 度量),卷一让它「可穷举」,这一卷让它「可执行」——条件求值器、效果应用、状态推进、确定性回放、存档往返、可玩原型。三处读的是同一个文件,产出的是逐位相同的状态摘要。改一个条件或一个阈值,三处同步改变且仍然互相一致。
贯穿全书的是虚构的三夜悬疑叙事 《雾港夜航》(工程名 mistport)与工具链 inkwell:config/ 放规格,sim/ 是 Python 侧的执行与穷举,core/ 是 TypeScript 确定性内核,web/ 把内核内联进单文件 HTML 供无头浏览器真玩。本页是《叙事引擎与分支系统》的全书目录:按章节顺序列出全部 50 篇,点击标题直达正文,也可以从各节末尾的「阅读导航」按顺序通读,或先看目录篇
里的分工说明与可运行性口径。
全书概览
| 项目 | 内容 |
|---|---|
| 书稿 | 《叙事策划与叙事工艺》卷二《叙事引擎与分支系统》 |
| 篇数 | 50 篇(正文 16 章 48 节 + 目录篇 + 附录 A) |
| 贯穿案例 | 三夜悬疑叙事《雾港夜航》(mistport) |
| 核心主张 | 一份叙事规格,三处消费;同一选择序列跨语言给出同一个状态摘要 |
| 可运行性 | 六档 S / P / W / D / X / B |
| 前置 | 卷一《叙事结构与可执行规格》 (16 章 48 节) |
| 后继 | 卷三《叙事体验与路径度量》 (16 章 48 节) |
三卷怎么分
| 卷 | 书名 | 回答的问题 |
|---|---|---|
| 卷一 | 叙事结构与可执行规格 | 一个故事怎么写成规格,这份规格自洽吗、可达吗、可覆盖吗 |
| 卷二 | 叙事引擎与分支系统 | 这份规格怎么被执行:状态机、条件求值、确定性回放、可玩原型 |
| 卷三 | 叙事体验与路径度量 | 玩家真的走出来的路径是什么形状,怎么用代理指标度量它 |
与站内既有内容的分工
- 独立游戏的叙事设计与分支对话 (约 1076 行)是散文式的叙事经验:分支怎么写、条件怎么设计、好感度怎么调,代码与清单不可跑。本卷第 2、6、8 章把同一批问题变成可判定的执行语义——条件变成可求值的表达式树,分支汇聚变成可判定的合法性,好感度阈值变成有不变量的状态机。
- Phaser 分支叙事 与 Phaser 选择后果日志 是具体引擎 API 的实现;本卷第 3 章做的是语言无关的状态推进语义——效果怎么应用、为什么必须幂等、差量怎么算。
- Godot 对话历史与后果日志 是引擎里的选择回看 UI;本卷第 4 章做的是确定性回放——同一条选择序列在两次运行里推进出的状态必须逐位相同,并给出可断言的摘要。
- Phaser 过场系统 做的是过场编排与演出;本卷第 9、10 章做的是可玩原型与无头断言——把规格内联进单文件 HTML,用 Playwright 注入选择序列真玩,断言终局状态与结局。
- NPC 对话状态架构 与 叙事分支状态架构 是服务端的同步与持久化;本卷第 1、11、14 章做的是单机内核的状态机与存档往返,不涉及网络、不涉及数据库。
- Godot 本地化与字体 是引擎里的字体与本地化实现;本卷第 12 章做的是文本表与键的一致性,明确不评价译文质量。
- 《游戏设计》卷一《玩法机制与可执行规格》 的真源是数值与规则(伤害 / 资源 / 随机性),消费对象是一局战斗的状态轨迹;本卷的真源是结构与条件,消费对象是故事在玩家选择下的展开路径。两者共享「整数化 + 确定性 + proxy 口径」的工程纪律,但不共享任何规格字段。
本卷 16 章
第一部分 · 引擎内核(第 1–4 章)
- 第 1 章 叙事引擎的最小构成
- 第 2 章 条件求值
- 第 3 章 状态推进与效果
- 第 4 章 确定性回放
第二部分 · 分支状态空间(第 5–8 章)
- 第 5 章 分支状态空间与可达性
- 第 6 章 死路、汇流与不可达
- 第 7 章 分支宽度与深度控制
- 第 8 章 好感度系统与阈值门
第三部分 · 可玩原型与持久化(第 9–12 章)
- 第 9 章 W 层:可玩的分支对话原型
- 第 10 章 W 层:Playwright 注入路径与断言
- 第 11 章 存档、读档与状态快照
- 第 12 章 本地化与文本表
第四部分 · 一致、回归与装配(第 13–16 章)
第 13 章 三处消费的一致
第 14 章 叙事引擎的可测试性与回归
第 15 章 引擎的规模与性能
第 16 章 装配:把规格交给卷三
附录
可运行性
本卷沿用六档口径:S 是 Python 侧的执行与穷举(条件求值、效果应用、BFS 可达状态枚举、死路与汇流检测、规模扫描),P 是 TypeScript 确定性内核(node --test),W 是浏览器可玩原型(Playwright 无头真玩),D 是规格文本与清单,X 是需真实环境、命令行不可复现的部分(正文逐处标注),B 是参数扰动与相变扫描(软告警不硬失败)。每一节至少有一个 S / P / W 档的代码块,且正文里的每个数字都来自本机实跑。
怎么读
想先看主张,从目录篇 开始,那里有分工说明与可运行性口径。想直接动手,从第 2 章 开始写条件求值器,再依次做第 3 章的效果应用与第 4 章的确定性回放。想先玩起来,直接跳到第 9 章 。只关心结论,看第 13.1 节 的跨语言摘要与第 16.1 节 的装配检查表。