7.1 场景图:节点、边与入口条件
场景图把 14 个场景写成一张图:节点带 enter_when,16 条边里 11 条无条件、5 条带条件。本节做结构校验(每条边两端都在 nodes 里)与邻接表,并用纯 xml.etree 出一张按幕分列的场景图 SVG;其中 5 个场景只有带条件的入口边,可达性完全取决于状态。
tag
场景图把 14 个场景写成一张图:节点带 enter_when,16 条边里 11 条无条件、5 条带条件。本节做结构校验(每条边两端都在 nodes 里)与邻接表,并用纯 xml.etree 出一张按幕分列的场景图 SVG;其中 5 个场景只有带条件的入口边,可达性完全取决于状态。
节拍表把结构写成一行一拍的 beat 序列,于是「顺序」变成可校验的约束:act 必须单调不减、scene 必须存在于 scene_graph、节点所属幕必须与节拍所属幕一致、每个场景节点至少被一拍覆盖。本节用可跑的 S 层脚本逐条校验并打印《雾港夜航》的 16 行节拍表。
弧光的每一段要对到一个好感度门限上。本节把《雾港夜航》六个角色按 cold/warm/trust 三门限做对齐,用「乐观最早跨越节拍」当上界:连把正向选项全选一遍都没能在声明转折节拍前越过门限的,就一定是错位。18 条里查出 4 条错位——砚的阶段①落后 4 拍,林与孩的 trust 门在乐观路径上都够不到。
故事里谁对谁是什么态度,规格里只有派系立场这一层。本节把 6 个角色之间的关系写成 6×6 整数矩阵,校验形状、值域与对角线,再用派系立场推出先验做一致性交叉检查:30 个非对角格里 2 个偏离先验,15 对里有 13 对不对称,而派系立场本身却完全对称。
目标、恐惧、秘密在叙事规格里都是自由文本,机器读不懂。本节给出一层可校验的锚点表,把每个字段锚到具体的场景、flag 与条件,再用 S 层脚本回规格做交叉引用检查:30 个字段锚点里 21 个可检查,并定位出 18 个 flag 里 7 个从不参与任何条件。
设定不是一次倒完的:lore[].reveal_flag 把「揭示时机」写成状态,某条设定何时被玩家知道,取决于它的 flag 在哪一步被置 1。本节沿 20000 条采样路径统计 6 条 lore 的首次揭示位置分布,并用纯 xml.etree 出一张暴露节奏 SVG——网格给每条 lore 落在哪一夜,折线给平均已揭示条数。
把卷一的三处消费——穷举、执行、度量——在同一份规格上串成一次预演:穷举给出覆盖率与结局可达性,执行把 seed 采样的第一条路径推进到底并算出整数 digest,度量给出张力 MAE 与结局分布熵。S 层与 P 层对同一路径复算,digest 逐位相同。
叙事策划与程序在规格上分工:策划写结构与条件,程序写内核与门禁,规格是两者唯一的接口。本节给出规格变更的机器可读 diff 与影响面评审(本机可复现),并把真实团队的评审会、冻结窗口与排期逐处标注为需真实业务环境、命令行不可复现,把能算与不能算的分开。
设定说「教会不承认灯塔之光」,规格里却可能允许玩家请执事去点灯。本节逐条检验 4 条 rule 与 6 条 lore 是否被行为兑现:lore 的 reveal_flag 是否真被选项置位并被条件读取,rule 是否有兑现它的门。S 层脚本输出对齐表,如实报告对不上的项——本案例 6 条 lore 全对齐,rule_curfew 未兑现。
把全部 48 条台词与 115 个选项渲染成一张 163 行的文本表,每行一个键,内联进单文件 HTML,再用 Playwright 无头打开,断言台词条数、选项条数、空文本行数与键指纹,截图到 out/shots/,并验两遍渲染确定性。末尾重申本章的做 / 不做边界:本套只做文本的结构,不评价文本质量。
同一条台词记录在不同状态下渲染出不同变体,这是条件文本的全部含义。本节枚举两个条件节点的整个定义域:d_tc_2 两分支两条文本;d_lt_2 声明了 line_when 却没写 line_else,101 个状态枚举下来只得到一条文本——结构分流了,文本没分流。变体退化因此成了一个可数的缺口,修法是在规格里补声明,而不是改台词。
台词里出现的角色名与地点名,在规格里其实是一次变量查找。本节给出文本模板的唯一文法(占位、转义与未知占位回落),由规格三段拼出 24 个绑定的命名实体表,并渲染全部 48 条 line 与 115 条选项文本统计占位出现次数:行内占位 0 处、字段级占位 48 处、可模板化点 33 处。只做文本的结构,不评价文本质量。
同一节点在不同状态下渲染出不同台词,靠的是 line_when 与 line_else 两个字段。本节把渲染规则写成四分支表,用 S 层脚本枚举全部 50 个渲染分支:48 个节点里只有 2 个带 line_when,其中 d_lt_2 声明了条件却没给 line_else,属规格层面的欠声明,回落到 line。
对话节点是字段化的记录:节点层八个字段、选项层五个字段,其中 goto 是选项的独立字段而非效果算子。本节给出两张字段表,用 S 层脚本校验 115 条跳转全部命中已声明节点并输出节点度数表,再用 P 层测试断言未知选项被拒绝、推进是纯函数。
把好感度沿采样路径画成曲线后,「形状」也成了一个可分类的量:单调上升 / 先升后平 / 单调下降 / 波动 / 全程不变,五类互斥。S 层统计 2000 条路径的形状占比并用纯 xml.etree 出图,B 层把初始值整体上下扰动 ±10,观察门限跨越率的相变——−10 档新增 9 条死门,全程只软告警不硬失败。
本套的核心主张:台词文本不是规格的输入端,而是规格的一种渲染产物。同一条 dialogue 记录(line 加 line_when 加 line_else)在不同状态下渲染出不同台词。本节给出四分支渲染规则、用 d_tc_2 做最小演示、反向断言文本不进状态,并写死边界——只做文本的结构,不评价文本质量。
叙事可以被拆成四个最小构成:世界(派系、地点、设定、规则)、角色(目标、恐惧、秘密、弧光)、事件(幕、节拍、场景、对话节点)、选择(选项与跳转)。本节用《雾港夜航》的 story_spec.json 把四者逐项清点:4 个派系与 14 个地点、6 个角色、16 个节拍与 48 个对话节点、115 个选项,并跑通一份 S 层清点脚本。
按领域与学习阶段整理的在线电子书与创作手记。覆盖 Rust、Lua、TypeScript、Python、Java(Spring Boot)、Go、AI Agent、MMO 服务器开发(Go 主线 + Java 21 双栈对照,四卷本 180 篇)、游戏开发(含 Cocos 四卷本与《游戏引擎实现原理》四卷本)、SLG 游戏产品设计(产品架构与经济系统 + 数值平衡与商业化运营,两卷本 100 篇)、小游戏开发实战(市场品类与产品设计 + 引擎实现与体验打磨 + 上线变现与长线运营 + 商业运营实战 + 跨平台发行与出海,五卷本 250 篇)、游戏美术与技术美术(美术制作与视觉规范 + 技术美术与管线工程 + 风格与品类美术实战,三卷本 150 篇)、游戏设计(玩法机制与可执行规格 + 策略、涌现与体验度量 + 原型、可玩性与品类,三卷本 150 篇)、计算机图形学(几何、变换与光栅化 + 着色、光照与纹理 + 光线追踪与全局光照,三卷本 150 篇)、叙事策划与叙事工艺(叙事结构与可执行规格 + 叙事引擎与分支系统 + 叙事体验与路径度量,三卷本 150 篇)与文学创作,从阅读指南进入,或按全书目录查找章节。