11.3 对话树的遍历与校验
把 48 个对话节点当成一张有向图,环、不可达节点、死路三类缺陷就都成了可判定的性质。本节用 DFS 三色标记找环、BFS 从起点算可达性与层号,实测三类缺陷均为 0:115 条选项去重后只有 56 条唯一跳转,5 个无出口节点全是结局,与 na_00 的 BFS 状态空间穷举口径互证。
category
把 48 个对话节点当成一张有向图,环、不可达节点、死路三类缺陷就都成了可判定的性质。本节用 DFS 三色标记找环、BFS 从起点算可达性与层号,实测三类缺陷均为 0:115 条选项去重后只有 56 条唯一跳转,5 个无出口节点全是结局,与 na_00 的 BFS 状态空间穷举口径互证。
同一节点在不同状态下渲染出不同台词,靠的是 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 条死门,全程只软告警不硬失败。
阈值门就是条件里的 ['aff', 名, '>=', 整数]:它可能长在选项的 when、节点的 line_when 或结局的 when 上。S 层把全规格 15 条门限抽成一张表,在 20000 条采样路径上给出每条门限的跨越率、最高到达与缺口,基线 0 条死门;P 层断言门限未达时选项不可选、恰好达到时可选的边界行为。
好感度只有两个动作:从 characters[].affinity.init 起一个整数,之后每次写入都走 add 再夹回 [0,100]。S 层静态清点出 4 个变量共 66 次写入、8 种增量,并点出声明了却从不推进的 lin 与 hai;P 层用 300 条采样路径断言值域恒定,并以「把某个 add 放大到百万级仍被夹回」的负例证明 clamp 不是冗余算子。
本套的核心主张:台词文本不是规格的输入端,而是规格的一种渲染产物。同一条 dialogue 记录(line 加 line_when 加 line_else)在不同状态下渲染出不同台词。本节给出四分支渲染规则、用 d_tc_2 做最小演示、反向断言文本不进状态,并写死边界——只做文本的结构,不评价文本质量。
一份散文大纲要变成可执行的规格,中间隔着一层「骨架」:meta 头部加九段内容字段。本节给出散文语句到字段的逐句映射表,列出 world、characters、beats、scene_graph、dialogue、conditions、state、endings、metrics 九段各自承载什么,并用一份 S 层脚本按实际键序逐段打印规模摘要。
叙事可以被拆成四个最小构成:世界(派系、地点、设定、规则)、角色(目标、恐惧、秘密、弧光)、事件(幕、节拍、场景、对话节点)、选择(选项与跳转)。本节用《雾港夜航》的 story_spec.json 把四者逐项清点:4 个派系与 14 个地点、6 个角色、16 个节拍与 48 个对话节点、115 个选项,并跑通一份 S 层清点脚本。
《叙事策划与叙事工艺》卷一《叙事结构与可执行规格》目录:16 章 48 节,把一个故事写成可执行规格 story_spec.json,让同一份规格被 S 层穷举、P 层确定性内核与 B 层参数扰动三处消费,产出逐位一致的状态摘要。本页给出七处分工说明、六档可运行性口径、《雾港夜航》规格总览与全书 16 章 48 节完整清单。