A4 地形变异(Terrain Variation)
状态:Approved · 版本:v2 · 2026-09-14
一句话:定义地形变异——基础规则上的区域性规则偏离;MVP 唯一变异为迷雾。
推演件:design/gdd/analysis/a4-terrain-variation.md(推导、论证与开放问题 OQ1–8 全在那里)
承载支柱:P1 主(信息诚实边界——"不可推理"永不伪装成"可推理")· P3(信息维度变体——定价通货从雷险换信息+AP;迷雾仅其信息切面)· P2(暗面警示——雾区奖励可预期性切面)· P4(地牢氛围本体承载)
层级:Layer 1 Foundation · Milestone MVP · 设计顺序第 3 位(上游 D2、A3 已 Approved)
设计目的
A4 是定义层系统:在基础扫雷规则上叠加区域性规则偏离的框架 + MVP 迷雾。变异由棋盘生成(A1)布置在图上、玩家在挖掘中遭遇并应对——看见迷雾边界那一刻决策就出现。没有 A4,难度只能靠雷数单调缩放、关卡间"解锁新变异"的推进感消失,且"无法推理"的格子会以埋伏形式随机出现;迷雾把"你推不出来"从暗处的埋伏变成明处的选择——显式标注、可绕行、可买情报,是 P1"我算对了"的诚实兜底、P3"风险与收益同源"在空间维度的载体。
- 数字不再说话是明示不是陷阱:雾外仍可用区外数字推理雾边缘的雷(跨雾推理——被雾边已知约束放大的常规推理体验,非独立机制);"不可推理"永不伪装成"可推理"(基础区可推理率生成保证归 A1)。
- 不赌命,赌信息与行动力:雾格成本两态——链可达雾格经邻接 0 格连锁免费开出、链不可达雾格按全价收紧盲区预算;"里面有价值"是契约而非愿望,由 B4 三条定价硬约束兜底(义务清单 B4-①②③)。
- 边界可见、内容隐蔽:雾内奖励若不可见,规划退化成探索惊喜(创意风险 #1,CD 门禁登记 B4/A4 落实)——Core Rules 定迷雾信息呈现规则的精确切面,奖励可见性/探测机制的接口在此预留、内容归 B4/A5。
- 趴在地图上的黑暗:未探索的黑暗是有形状、有边界、趴在地图上的实体;岩浆/冰冻随关卡解锁延续"越深越险的地貌"叙事(P4 越下越险)。
设计意图:雾是清图的必经段而非可绕过的支线,"绕开走"的真实形态是 A3 的停手/弃图风险退出(垂直切片起再加"是否用道具买情报",A5);玩家每轮都在看见并应对变异——直接感知。
系统范围
负责:
- 变异的定义与交互规则 owner——玩家不"使用"A4,而是在挖掘中遭遇并应对它
- VariationTable 8 字段定义(D2 承载,本 GDD 回填 owner)
- F1 候选池门控谓词(variant_pool_gate)
- 信息剥夺边界与双向效应(雾藏什么、不藏什么、补什么)
- 生成期布置约束声明(执行归 A1)
- 零特判原则的规则面(义务是"不加分支")
- 未来变异扩展框架(加行即用 + 接口漂移回写)
不负责:
- 布置算法与区域参数(A1 BoardGenTable)
- 挖/旗执行逻辑(A2)
- 呈现(D1)
- 教学文案(D5)
- 奖励内容与定价(B4/B1)
- 道具(A5)
- 全局变异语义(C3)
- 玩法数值字面量与随机(数据表 + RngService 封闭流)
核心循环
地形布置(A1 生成期——A4 只声明约束与门控,算法归 A1)
雾揭示(运行期——零特判,A2 执行逻辑无变异分支)
出口分发
| 出口 |
触发 |
行为 |
依据 |
| 普通图(无变异) |
候选池为空(未解锁 / biome_tag 全不匹配) |
静默布置、不报错、无 warning——两种来源同待遇 |
EC1 / F1 Output Range |
| 无雾图(降级产物) |
cell_constraint 无解(面积或连通分量不足) |
跳过雾布置,图仍合法;shortfall 分级上报降级率 |
EC2 |
| 合法雾图 |
可行域内布置成功 |
产物携带变异标记;占比参数域校验通过;输出链不可达占比 |
Rule 3 / Rule 6 |
| 参数域拒绝 |
雾占比 ≥ 全覆盖(极端参数) |
BoardGenTable 参数校验拒绝(雾占比上限 × 可推理率下限联动不等式) |
EC10 |
变异定义框架(VariationTable)
规则:
- Rule 1:每种变异是配置表 VariationTable 里的一行具名声明,只声明四件事(见下表);框架自身不含运行时逻辑——变异带来的行为改变发生在"信息规则 × 既有系统行为"的交集里,定义行只声明交集参数,不写任何处理代码。
- Rule 8:A4 相关代码零玩法数值字面量、零随机:变异的全部定义数据放配置表 VariationTable(本 GDD 为该表回填 owner),布置随机落在棋盘生成器的专用随机流里,A4 自己既不掷随机数也不写死玩法数字,一切读表(机器验收 = 静态扫描零命中 + 字面量人工口径,见验收标准 AC-7 / AC-10)。
- Rule 9:新变异(岩浆、冰冻)将来按同一框架加行,不另起炉灶,MVP 不建行(CD 门禁:无 MVP 容器)、随垂直切片关卡解锁建行,需要新规则字段时走 D2 接口漂移规则同步回写本 GDD 与 D2、不在表外私加字段;精英/Boss 图的全局变异只预留一个"全局"作用域枚举位(scope=global),语义归 C3 GDD 定稿——本 GDD 只保证枚举位存在,不预写语义。
| 声明项 |
字段 |
回答的问题 |
| 身份 |
variant_id / display_name / unlock_level / biome_tag |
叫什么、第几关解锁、在哪些地形主题出现 |
| 信息规则 |
info_mask |
隐藏玩家的什么信息 |
| 布置约束 |
cell_constraint |
允许落在什么样的格子上 |
| 作用域 |
scope |
管一块区域(region),还是全局(global——为后续预留) |
VariationTable 行集(MVP 表内容——恰含 fog 一行)
| 行 |
字段取值 |
产出点 |
语义 |
| "fog"(迷雾) |
unlock_level=2 · scope=region · info_mask=hide_numbers · cell_constraint=safe_nonzero · biome_tag=[] · counter_item_ids=[] |
game-concept 解锁序列:普通数字→迷雾→岩浆/冰冻;本 GDD 回填 D2 |
MVP 唯一变异;岩浆/冰冻不建行(CD 门禁:无 MVP 容器),垂直切片随关卡解锁建行 |
VariationTable schema 校验类别(诊断封闭枚举)
| 类别 |
级别 |
触发条件 |
语义 |
| 重复键 |
致命 |
variant_id 重复 |
D2 Rule 6 既有类别 |
| unlock_level 域外 |
致命 |
unlock_level ∉ [1, 999](含 0) |
域校验 |
| 跨字段 hide_numbers⇒safe_nonzero |
致命 |
info_mask=hide_numbers ∧ cell_constraint=any |
Rule 4"雾格恒非 0 / 级联止于雾格"是承重规则(Rule 3)的寄生结论而非 hide_numbers 的本性——无此校验,未来 hide_numbers + any 行将静默击穿 EC4(连锁不再止于雾格) |
| scope=global |
warning |
MVP 出现 global 行 |
枚举域内合法数据、语义未定稿(C3)——不致命;运行期无消费者故无行为;C3 定稿语义并落地前不得移除该 warning |
设计意图:加变异永远是加数据行而非改代码;承重行为全部寄生在布置约束上(见「布置约束与生成期门控」节)。
迷雾:信息剥夺边界与零特判
规则:
- Rule 2:迷雾是作用域为 region 的信息剥夺变异,玩家在挖掘中遭遇它:未开雾格以专属纹理标出雾区范围——边界可见、内容隐蔽;被开出(亲手挖或连锁带到)时照常开出、不显示数字(呈现规格归 D1)。
- Rule 4:既有系统不为雾改任何行为,代码里零变异分支:连锁、数字计数、清图判定、插旗、行动价目、结算一律不感知"这格是不是雾格",代码里不许出现"如果是雾格就……"的分支;挖掘侧义务 = 执行逻辑零变异分支("不加分支"而非"加处理",见依赖节 A2 行)。
- Rule 5:雾只藏一样东西——未开雾格的数字;不藏雾区边界(专属纹理可见)、不藏已开格的全部信息、不藏奖励入库过程;雾外数字对雾外雷的计数照常,雾边界推理仍可行、只是原料变少。剥夺之外并存增益,净效应双向、随雾形与雷密度变化——建模必须两边都算,不做单向补偿(A1 可推理率参数须按生成后实测净效应建模,验收④):减项 = 雾格数字本可作区外雷的推理源,其寂静使雾边附近的线索变少;加项 = 雾格保证无雷且必邻区外雷、雾形携带雷簇位置(k 格雾区外环必含 ≥⌈k/8⌉ 雷)、雾边邻格雷候选域收缩局部更易解——"雾边 = 推理锚"。
- 反向护栏:迷雾绝不制造"被骗感"——若雾区边界不可见或进洞无额外价值,迷雾退化为纯负体验税(纯 AP 税);任何让雾区"隐性化"的设计默认砍掉。
零特判六面(既有系统在雾下的表现)
| 系统行为 |
雾下的行为 |
性质 |
| 连锁展开 |
触发与传播只看真实数字;雾格恒非 0 → 雾格自身永不传播连锁(不开出新级联);但雾格可被邻接 0 格的连锁免费开出(EC4——"不传播"≠"不被开") |
flood fill 代码零变异分支 |
| 数字计数 |
数字 = 周围 8 格雷数恒真;雷全在雾外,任何数字的值不因雾存在而改变 |
恒真定理 |
| 清图判定 |
雾格照常计入"安全格全开"判定——雾是清图必经段 |
恒等 |
| 旗 |
雾内插旗合法(价目照常)但恒标不中(无雷) |
合法、无害、无意义 |
| 行动价目 |
挖/旗/移动成本雾内外一致 |
A3"地形成本修饰"钩子本 GDD 搁置——启用须回 A3 重议 per-cell 成本接口 |
| 结算 |
雾格安全格奖励照常入库与结算 |
B1/B4 无需感知雾 |
雾元知识信息源(玩家可推理、可教的雾知识清单)
| 元知识 |
信息源 |
消费方 |
| 雾区无雷 |
生成期布置约束(Rule 3)——生成保证而非运行期判定 |
D5 教学必授 + D1 图例(MVP 验收两条) |
| 每雾格必邻区外雷 |
Rule 3 结构推论(可推导即可教——P1 诚实原则) |
D5 教学候选(口径归 D5 裁定) |
| 雾格恒非 0 · 级联止于雾界 |
Rule 3 寄生结论 + hide_numbers⇒safe_nonzero 跨字段校验 |
D5 教学(防"连锁莫名断了"的被骗感——D1 必含要点) |
| 雾边候选域收缩 · 局部更易解 |
Rule 5 增益侧(外环雷下界 ⌈k/8⌉) |
A1 可推理率建模(双向净效应) |
| 雾格成本两态(链可达免费 / 链不可达全价) |
承重数学节预算注记 |
A3/B1 对账;D5 玩家侧保守启发式教学("雾格按全价做预算,连锁白开当惊喜"——链可达性取决于未开 0 格的隐藏拓扑,玩家决策时点不可求值,明教两态反生免费期待、恰触发反向护栏被骗感) |
| 雾内旗恒空 |
Rule 4 旗面(雾区无雷) |
D5 教学警示"雾内插旗纯损" |
设计意图:零特判可行的先决条件是"雾里没雷没 0 格"——既有规则对雾全面惰性化靠的是构造而非补丁。
布置约束与生成期门控
规则:
- Rule 3(承重):生成器布置雾区只能选"非 0 安全格"——8 邻里至少含 1 雷的安全格,于是雾区里既无雷、也无 0 格;约束由本 GDD 声明、棋盘生成器在生成期强制执行,谁都不许为布置成功率放宽它;玩家侧的承诺是明牌:"雾区无雷"由教学与图例传达。
- Rule 6:A4 不拥有布置算法:摆几个雾区、每个多大、摆在哪,与雷图共生,由 A1 生成算法 + BoardGenTable 参数(按关卡×深度两维逐行,A1 回填)决定;布置随机从棋盘生成专用随机流(board_gen 流)取号(RngService scope 绑定),每次生成新扫雷图绑定一次,同种子必出同图;A4 对摆放的唯一参与是资格把关——变异的解锁关号不高于当前关卡序号,才进入这一关的布置候选池。
- Rule 7:开局站立的 3×3 出生区,连同从它出发顺 0 格连锁能自动展开到的范围,永不含任何变异——生成器布置时硬性排除;可达范围由生成期确定性算出(不依赖挖掘系统运行期的展开行为定义),取保守上界:出生 3×3 经 0 格连锁能扩散到的最大范围(flood 闭包)再外扩 1 格,比挖掘系统实际能展开的范围只大不小(构造见 A1 GDD);防"开局即瞎"与"开局预开雾格",叠加"初始展开无奖励"(定稿口径)后初始展开触及雾格在构造上不可能——双保险;回验项(挖掘侧实际展开域 ⊆ 生成侧排除域——"构造上不可能"仅在超集关系下成立)登记 A2 GDD 门禁。
生成期布置约束(几何硬边界)
| 约束项 |
内容 |
执行 / 落点 |
| 雾区格类 |
仅非 0 安全格——区内无雷、无 0 格(非 0 安全格 = 8 邻域含 ≥1 雷) |
A1 生成期强制(A4 声明 cell_constraint 数据载体) |
| 玩家可见知识 |
"雾区无雷" |
D5 教学必授 + D1 图例条目(MVP 验收两条) |
| 几何硬边界 |
每个雾格必有非雾雷邻居 ⇒ 雾区任意处厚度 ≤2——可判定谓词 ≡ 任意 3×3 窗口非全雾(3×3 实心雾块中心必为 0 格,不可能成雾) |
登记 A1 验收⑫;推导与验算见承重数学节 |
| 面积必要上界 |
雾面积占比存在依赖雷密度的必要上界 f ≤ 8×雷密度——雾区恒为雷集切比雪夫 1-膨胀出的边界带 |
同上 |
| 参数域 |
"区域数量/尺寸/占比"参数(A1 BoardGenTable 域)必须在此边界内定义 |
OQ1 联动;验收⑫⑩ |
| 正常形态 |
1~2 格宽雾带是雾的正常形态 |
视觉规格须按最坏宽度验收(AC-9) |
| 可推导元知识 |
"每个雾格必邻区外雷"由规则可推出 |
按 P1 诚实原则(可推导即可教)纳入教学候选,口径归 D5 裁定 |
板形参数(A1 BoardGenTable 域——A4 引用不拥有,禁止两表间复制参数,D2 Rule 1)
| 参数 |
维度 |
约束与义务 |
产出点 / 消费方 |
| 区域数量 N |
(level_index, node_depth) |
要求 N 区而实际达成 k<N 时尽力布置可行分量、按 shortfall 分级上报(EC2 部分达成契约) |
A1 生成 / 降级率埋点 |
| 区域尺寸 / 位置 |
同上 |
须在厚度 ≤2(≡ 任意 3×3 窗口非全雾)硬边界内定义 |
A1(Rule 3 结构推论) |
| 雾面积占比 f |
同上 |
f ≤ 8×雷密度必要上界;占比 < 全覆盖(EC10 参数域拒绝);× 可推理率下限联动不等式 |
A1 / B1 对账输入 |
| 链不可达雾格占比 |
同上 |
生成期计算并输出(B1 条款 5 对账输入的生产者义务——防输入变量有名无源) |
A1 → B1 |
| 最低雾出现率 / 降级率阈值 |
(level_index, node_depth) 批量 |
批量统计断言:每 (level_index, node_depth) 批量板断言出现率下限 / 降级率上限(防形容词级观测);阈值与样本量归 A1 GDD 定;出现率下限经图尺寸/雷密参数侧保证,禁放宽 Rule 3 达成 |
A1(验收⑭) |
| 可推理率生成参数 |
同上 |
按雾边双向净效应建模(寂静减项 × 推理锚增项),禁单向补偿——义务形式为 BoardGenTable 域内可判定谓词 |
A1(P1 生成端保障核心) |
| board_biome |
非空域校验 |
F1 输入前提,fail-fast 闭合 |
A1(验收⑮) |
状态(定义→布置→生效→消亡)
| 阶段 |
载体 |
Owner |
行为 |
| 定义(构建期) |
VariationTable .tres |
D2 承载 / A4 回填 |
ConfigDB 加载校验;热重载走 D2 既有门(战斗中拒绝,EC8) |
| 布置(生成期) |
棋盘格变体属性 |
A1 |
生成新扫雷图时经 board_gen 流取号;unlock_level 门控候选池 + cell_constraint 强制 + 出生区排除 |
| 生效(执行期) |
格属性只读查询 |
A2 / D1 消费 |
开格时读"是否雾格"决定数字显示与否;零运行时写入 |
| 消亡(随图) |
棋盘实例销毁 |
A2 |
清图换新图 / 刷新 / 战斗结束——变异属性随棋盘实例消亡,无跨图存续 |
不变式:A4 无运行时状态机——变异是棋盘格的只读属性,随图生成、随图消亡;生效期零运行时写入、无跨图存续。
设计意图:决定权切分——"谁有资格出现"归 A4(门控),"摆多大摆哪"归 A1(算法 + 参数);出生区排除的保守上界让 A2 的展开定义保持自由。
承重数学(F1 门控 · 结构推论 · 预算增量 · 条款 5 对账)
口径总纲:本 GDD 无平衡公式——迷雾的全部数量参数(区域数/尺寸/位置/与雷密度及图尺寸的交互)归 A1 BoardGenTable,且须在 Rule 3 结构推论硬边界(厚度 ≤2【≡ 任意 3×3 窗口非全雾】/ f ≤ 8d)内定义。A4 侧定量内容仅三条:F1 门控谓词、结构推论承重数学、雾致预算增量注记。
F1 布置候选门控(variant_pool_gate)
结论:pool 是集合谓词(MVP 规模 ≤1)——unlock_level 直接整数比较(无 D2 R1 floor 解析:unlock_level 是定义表列,非进度表行键);biome_tag 空集 = 通配(全 biome 可用),非匹配失败;空池合法,A1 静默布置普通图不报错(验收⑥)。
| 变量 |
类型 |
范围 |
说明 |
| level_index |
int |
≥1 |
当前关卡序号;与 unlock_level 直接整数比较(无 D2 R1 floor 解析——unlock_level 是定义表列,非进度表行键) |
| v.unlock_level |
int |
[1, 999] |
VariationTable 列(fog 默认 2) |
| v.biome_tag |
StringSet |
∅ 或非空 |
∅ = 通配(全 biome 可用),非匹配失败 |
| board_biome |
StringSet |
非空 |
当前图 biome 标签集;值域与来源归 A1(BoardGenTable biome 字段,A1 回填)——本 GDD 只声明集合类型语义 |
Output Range:pool 为集合(MVP 规模 ≤1);逐项判定输出 bool;空池(如 level 1 雾未解锁)合法——A1 静默布置普通图,不报错(验收⑥)。
| level_index |
pool |
验算 |
| 1 |
∅ |
雾未解锁——空池合法,静默布置普通图 |
| 2 |
{fog} |
fog.unlock_level=2、biome_tag=∅ 通配任意 board_biome |
| 3(magma 建行后) |
{fog, magma} |
未来 magma(unlock_level=3);A1 从池中选取时必须消费 board_gen 流(回放确定性——验收⑧) |
结构推论(Rule 3 承重数学——厚度、面积上界、外环雷下界)
结论:非 0 安全格 ⇒ 每雾格必有非雾雷邻居 ⇒ 雾区任意处厚度 ≤2,可判定谓词 ≡ 任意 3×3 窗口非全雾(度量钉死为窗口谓词而非"直线连续行程 ≤2"——宽 3 对角带无任何全雾 3×3 窗、完全合法,按行程读法会误拒);雾面积占比存在依赖雷密度的必要上界 f ≤ 8×雷密度;k 格雾区外环必含 ≥⌈k/8⌉ 雷(雾形携带雷簇位置信息——雾边 = 推理锚)。
| 变量 |
类型 |
范围 |
说明 |
| f |
int |
≥0 |
雾格总数(雾面积占比的分子) |
| |M| |
int |
≥0 |
雷数(雷密度分母 = 全格数) |
| k |
int |
≥1 |
单个雾区格数 |
| N₈(x) |
格集 |
—— |
x 的 8 邻 |
| 构型 |
谓词判定 |
验算 |
| 3×3 实心雾块 |
不可能成雾 |
中心格 8 邻全雾 ⇒ 8 邻无雷 ⇒ 0 格,与非 0 安全格矛盾 |
| 宽 3 对角雾带 |
合法 |
无任何全雾 3×3 窗;按"直线连续行程 ≤2"读法会误拒——度量钉死为窗口谓词 |
| f > 8×|M| |
违反必要上界 |
见②——参数域拒绝(EC10 联动) |
| k 格雾区 |
|外环雷| ≥ ⌈k/8⌉ |
见③——雾边 = 推理锚,禁单向建模(验收④) |
雾致预算增量(唯一 A4 侧定量注记)
结论:雾不改变 AP 价目,但改变清图预算构成,雾格 AP 成本分两态——链可达免费开出(EC4)、链不可达按全价 dig_ap_cost 结算;雾致预算增量 = 链不可达雾格数 × dig_ap_cost,计入清图总预算需求,参与 A1 BoardGenTable 设计期聚合核算(非逐板运行期强制,违例动作 = 修正参数,验收⑤);该增量对 A3 F1 条款 5 仅是可行性输入、不提供雾成本显著性保证——局限如实登记。
| 变量 |
类型 |
范围 |
说明 |
| 链不可达雾格数 |
int |
≥0 |
A1 生成期计算并输出(B1 条款 5 对账输入的生产者义务——验收⑤) |
| dig_ap_cost |
int |
A3 knob(=1) |
归 A3 所有,本 GDD 引用不拥有 |
| 情形 |
预算增量 |
验算 / 说明 |
| 链可达雾格(邻接非雾 0 格) |
0 |
连锁展开零价——免费开出(EC4) |
| 链不可达雾格 |
dig_ap_cost / 格 |
全价结算;增量 = 链不可达雾格数 × dig_ap_cost |
| 稀疏图(链可达占比高) |
全价假设高估 |
系统性高估雾成本——高估方向为预算安全侧(level-designer 评审发现) |
对 A3 F1 条款 5 的对账(三腿入账——构成变化而非消解)
| 腿 |
效应 |
方向 |
| 雷险腿 |
雾区无雷、不产生 50/50 赌雷 |
消解(消解声称仅对此腿成立) |
| 信息腿 |
雾边寂静减少推理原料(推高弃图)与雾边推理锚增益(Rule 5)方向相反——净效应实测、非定理("50/50 减少可能反向利好清图"成立,"必然推高弃图"不采纳) |
双向 |
| AP 腿 |
链不可达雾格全价无连锁折扣,抬高清图成本——敌方结算时间税随之上行 |
推高弃图 |
对账契约要点:
- 雾面积占比与链不可达占比为 B1 条款 5 对账输入变量;链不可达占比的生产者义务 = A1 生成期计算输出(验收⑤)——防输入变量有名无源。
- B1 闭合对账须雾板/无雾板两态分别验算支配性不等式——A3 provisional 验算只在无雾图形况做过。
- 两条方向性护栏:①雾板净当量优势带上界(雾板 vs 无雾板 EV 差的容许带——防福利方向);②防钓鱼方向(与 A3 OQ6 防钓鱼约束对账):雾板下界抬升不得使"弃图刷雾板"支配"即刷"——逐板奖励差分 × 最低雾出现率 × 8 RAP 刷新会构造出 A3 OQ6 明令防的刷新钓鱼环;解法(关卡层常量锚 / 防钓鱼不等式 / 与 OQ6 显式对账)归 B4/B1。
- playtest 弃图率/完成度指标雾板分层观测(注记回执 A3 OQ3——聚合指标会被雾板污染或反向掩盖)。
边界情况(EC1–EC11)
| 条件 |
行为 |
| EC1 候选池为空(雾未解锁如 level 1,或 biome_tag 全不匹配) |
A1 静默布置普通数字图——空池合法、非错误、无 warning(两种来源同待遇)。依据 F1 Output Range / 验收⑥ |
| EC2 cell_constraint 无解(非 0 安全格面积或连通分量尺寸不足以布置任何雾区——图太小 / 雷太密 / 雷太稀致雷膨胀皮肤碎裂 / 参数要求过高;判据含连通性而非仅总面积——雾域恒为雷集边界带,总面积充足但碎裂成小分量时同样无解) |
本次布置雾的尝试失败 → 跳过雾布置,本图为合法无变异图(A1 生成算法的降级产物);禁止放宽约束硬塞——Rule 3 承重规则不为布置成功率让步;部分达成契约:BoardGenTable 要求 N 区而仅达成 k<N(k=0 即本条主判据)时,尽力布置已可行分量、实际达成区数按 shortfall 分级上报——雾量是难度轴,不得静默偏离参数值(level 2 雾解锁关恰为小图低密高发关——静默降级会系统性落空 P4"解锁新变异"推进感且无指标可查)。依据验收⑦⑬⑭ |
| EC3 雾区邻接出生 3×3 |
允许——约束谓词 = 出生 3×3 格集及其生成期可计算的初始展开可达域内无变异格(Rule 7),邻接本身不构成违反;初始展开是否 flood-fill 传播归 A2 定稿、A4 不预设——Rule 7 生成期可达域排除使该未定行为无害化:无论 A2 最终如何定义展开,开局都不可能预开雾格。依据 Rule 7 / 验收⑨ |
| EC4 连锁传播开到雾格 |
雾格被开出(免费——连锁展开零价,含链开的雾格)、无数字显示、级联自然停止(雾格非 0 格不传播)——零特判的自然结果("不传播"≠"不被开",本条即链可达雾格免费开出的规则落点);连锁开的雾格照常计入清图进度、奖励照常入库;"级联自然停止"由 hide_numbers⇒safe_nonzero 跨字段校验保证(未来 hide_numbers + any 行不得静默击穿本条)。依据 Rule 4 / A2×4① |
| EC5 玩家在雾格插旗 |
合法、耗 1 AP、旗照常立在未开雾格上;轮末判定恒不中(雾区无雷)——判定逻辑零特判自然覆盖;前瞻推论:若 A2 期实测引入标错惩罚,雾内旗按"非雷格上的旗"恒受罚(一致性推论,无 A4 特判)——D5 教学须警示"雾内插旗纯损"。依据 A2×4② / OQ7 |
| EC6 探测道具作用于雾区(A5 期生效) |
效果 = 未开雾格数字显影(恢复推理原料,非排雷——雾内无雷可排);对已开雾格无效(已开格无数字可显);显影时效(临时/永久)归 A5 GDD 定稿。依据 A5 接口预留 / OQ2 |
| EC7 VariationTable 出现 scope=global 行(MVP 不应发生) |
schema 校验 warning(枚举域内合法数据、语义未定稿)——不致命;运行期无消费者故无行为;C3 定稿语义并落地前不得移除该 warning。依据 schema 校验 / C3 验收项 |
| EC8 战斗中热重载修改 VariationTable |
走 D2 既有门(战斗中 reload 拒绝);已布置在当前棋盘上的变异属性不受表重载影响(棋盘实例持有生成期快照,非活引用)。依据 D2 / A2×4④ |
| EC9 unlock_level 调参为 1 |
合法 knob 操作(域内、无跨字段耦合)——第一关即遇雾,教学压力前移;D5 教学不得写死"第二关解锁",须跟随表值动态适配。依据调参表 / D5 |
| EC10 雾区覆盖全部非 0 安全格(极端参数) |
规则上合法、参数域上拒绝——最大雾占比须 < 全覆盖并被 BoardGenTable 参数校验拒绝(雾占比上限 × 可推理率下限联动不等式,可判定谓词形式);呈现注记:该构型下 0 格连锁仍会预开雾口袋(EC4),实际为"0 格岛 + 已开无字雾口袋 + 链不可达全价雾残段"的拼合,非"全图近无数字"。依据验收⑩ |
| EC11 两个雾区相邻 |
规则上仍是两个独立布置实例(各有独立布置身份与独立 board_gen 取号);呈现合并为一片归 D1 渲染域,无规则歧义;定向粒度:counter_item_ids 是 variant 行级(类型级)字段——两实例共享同一 fog 行清单,实例级定向在现 schema 下不存在;若 A5 期需要实例级定向,走新字段(非本表 knob)。依据验收⑪ / A5 期注记 |
呈现与 UI 契约
视觉身份锚三条硬约束(game-concept 定稿)+ D1 呈现义务:
| # |
约束 / 义务 |
内容 |
归属 |
| 1 |
形状+颜色双通道(视觉锚 2) |
未开雾纹理不能只靠色相(原型紫色)区分——必须绑定形状冗余(图标/纹理图案),色弱可辨;形状方案归 art-bible(排期门禁:D1 GDD 前创建至少 §1–4,登记见 systems-index 门禁增补记录——AC-9 阈值委托的违约判定挂此门);art-bible 缺位期以原型 v3 紫色迷雾格为临时明度基线,AC-9 今日即可评估,art-bible 就位后强制复测 |
art-bible / D1 |
| 2 |
绘制优先级固定(视觉锚 3) |
数字 > 小人 > 旗 > 变异纹理 > 底色——雾纹理不得干扰雾外数字辨识;已开雾格 = 地板无字(不留雾残留遮蔽) |
D1 |
| 3 |
调色板交换优先(视觉锚 4) |
雾纹理须支持 biome 色板变体(biome_tag 字段的换皮对应)——新 biome 不新增雾资产,只换色板 |
art-bible |
| 4 |
边界可读性 = 硬指标 |
未开雾格的区域边界在任何色板下必须可读——"明处的选择"幻想的视觉前提(P1 诚实边界的呈现面),与"数字可读性 × 暗色氛围"样张测试(game-concept 风险登记第 1 条)同批验证;原型 v3 紫色迷雾格已验证基线可读性,正式色值/形状归 art-bible 格子样张测试定稿 |
art-bible / D1 |
| 5 |
"雾区无雷"知识的静态传达 |
D1 MVP 验收两条 + 必含要点枚举(义务清单 D1-①②③)——D5 里程碑在 Alpha,雾在 MVP level 2 即首遇,D1 是 MVP 唯一活载体(对比 A1×15/A2×4,本知识此前零验收落点) |
D1 |
| 6 |
已开雾格负空间与结束拍 |
已开雾格 = 地板无字(负空间呈现,防误读为 bug)+ 底色层 tint 残留与雾区全开一次性完成信号(D1 验收候选——"站在洞口前"承诺的结束拍与清图进度可读;tint 处于视觉锚 3 最低层,与视觉锚 2"不留雾残留遮蔽"的冲突口径:遮蔽禁的是遮挡数字/实体的雾残留,tint 是底色层标记不犯此条;转正与否及完成信号粒度(视觉合并域 = 信号单元,禁实例级双响)归 OQ8 裁决) |
D1 |
| 7 |
结算与 HUD 负空间 |
结算界面无 A4 附加项(雾格奖励 = 普通安全格奖励,无独立归因类别——P2 标注归 B1);无 HUD 常显字段(变异是棋盘属性非资源,与 A3 的 AP/RAP 不同) |
B1 / D1 |
| 8 |
动效与音频 |
雾格开出瞬间的"雾散"过渡(可选,MVP 不承诺)归 B5/D1 表现里程碑,非 A4 义务;无音频需求(雾开出音效归 D4 Alpha 期) |
B5 / D4 |
依赖与输出
| 方向 |
系统 |
性质 |
接口要点 |
| 上游 |
D2 |
hard |
VariationTable schema 承载与 ConfigDB 读取(唯一玩法上游;本 GDD 为该表回填 owner,8 字段 schema 见调参表节);新字段走接口漂移规则 |
| 上游 |
A3 |
相邻契约 |
零运行时接口消费(Foundation 层;A3"地形成本修饰"价目钩子本 GDD 搁置——启用须回 A3 重议 per-cell 成本接口);预算注记在文档层引用 ap_per_round / dig_ap_cost 两值(承重数学节与调参表跨 GDD 引用);A3 F1 条款 5 对账三腿入账见承重数学节,登记 B1 强制检查点输入项 |
| 下游 |
A1 |
hard |
候选池门控(F1)+ cell_constraint 生成期强制 + 出生区及其生成期可达域排除(保守上界 = flood 闭包外扩 1 格);区域数量/尺寸/位置参数归 BoardGenTable(A1 回填,本 GDD 不定数值)且须在厚度 ≤2 / f ≤ 8d 硬边界内定义;布置随机经 board_gen 流;可推理率生成参数按雾边双向净效应建模(禁单向补偿)——共 15 项登记 A1 验收(义务清单 A1-①…⑮,缺项即 blocking) |
| 下游 |
A2 |
hard |
变体属性只读查询(开格时决定数字显示与否)+ 零特判原则(A2 执行逻辑无变异分支——义务是"不加分支"而非"加处理");雾格开启结果照常上报(安全格)——登记 A2 验收四项(义务清单 A2-①…④,缺项即 blocking) |
| 下游 |
A5 |
soft(垂直切片) |
counter_item_ids 消费 + 探测类道具语义 = 雾内数字显影(恢复推理原料,非排雷,EC6);悬空引用校验 + 条件性夹具随 A5 首个道具 id 回填(D2"首个引用字段 owner 补"条款的 A4 侧兑现) |
| 下游 |
B1 |
soft(注记级) |
运行期结算不感知变异(雾格奖励 = 普通安全格奖励);设计期 F1 条款 5 对账输入:三腿入账 + 雾板/无雾板两态验算 + 两条方向性护栏(优势带 / 防钓鱼)+ playtest 指标雾板分层(义务清单 B1-1) |
| 下游 |
B4 |
soft |
雾区奖励内容/密度归 B4 表 + A1 参数;三条定价硬约束(义务清单 B4-①②③,B4 GDD 验收项);定价成本口径按链不可达雾格计(承重数学节注记);奖励预知方案(创意风险 #1)A4 侧切面已定:雾不额外隐藏内容,预知归 B4 呈现 + A5 探测 |
| 下游 |
C3 |
soft(垂直切片) |
scope=global 枚举位(精英/Boss 图全局变异);global 行出现前须先定稿语义(MVP warning 校验);落地时重审 cell_constraint 覆盖与零特判原则是否仍成立(含 hide_numbers⇒safe_nonzero 跨字段校验相容性) |
| 下游 |
D1 |
soft |
雾纹理呈现规格(区域边界可读 / 形状+颜色双通道 / 绘制优先级 / 已开雾格 = 地板无字)+ MVP 验收两条与必含要点枚举(义务清单 D1-①②③)+ 已开雾格 tint / 雾区全开完成信号(验收候选,OQ8)+ 已开雾格与 0 格可判定区分(0 格携带"八邻无雷"推理信息,视觉混淆会污染推理——tint 为当前唯一区分手段,转正与否随 OQ8 裁决) |
| 下游 |
D5 |
soft |
"雾区无雷"教学口径 + 教学要点(雾 = 盲区不赌命 · 雾内旗恒空 · 清图含雾格 · 雾内无连锁折扣(连锁止于雾界属正常)· 雾格成本两态的玩家侧保守启发式)+ "每雾格必邻区外雷"教学候选(口径归 D5 裁定)+ 解锁序列动态适配(EC9——教学文案不得写死解锁关号) |
开放问题 OQ1–8 全量登记于推演件 design/gdd/analysis/a4-terrain-variation.md。
跨 GDD 义务清单(对侧 GDD 门禁评审逐项核对落位,缺项即 blocking)
| 编号 |
内容 |
对侧 |
状态 |
| A1-① |
候选池门控(F1) |
A1 |
已登记 |
| A1-② |
cell_constraint 生成期强制 |
A1 |
已登记 |
| A1-③ |
出生区及其初始展开可达域永不含雾(可达域 A1 生成期确定性计算,保守上界 = flood 闭包外扩 1 格) |
A1 |
已登记 |
| A1-④ |
可推理率参数按雾边双向净效应建模(寂静减项 × 推理锚增项,禁单向补偿——义务形式为 BoardGenTable 域内可判定谓词) |
A1 |
已登记 |
| A1-⑤ |
清图预算按增量构成核算(雾致预算增量 = 链不可达雾格数 × dig_ap_cost,计入清图总预算需求;设计期聚合校验、违例 = 调参修正)+ 链不可达雾格占比生成期计算输出(B1 条款 5 对账输入生产者义务) |
A1 |
已登记 |
| A1-⑥ |
空池静默(未解锁或 biome_tag 全不匹配时跳过、不报错) |
A1 |
已登记 |
| A1-⑦ |
降级静默、产物合法(EC2) |
A1 |
已登记 |
| A1-⑧ |
多变异选取消费 board_gen 流(回放确定性) |
A1 |
已登记 |
| A1-⑨ |
EC3 邻接出生区合法(约束谓词 = 出生 3×3 格集及其可达域内无变异格,邻接不构成违反) |
A1 |
已登记 |
| A1-⑩ |
EC10 雾占比参数域(< 全覆盖拒绝 × 可推理率下限联动,可判定谓词) |
A1 |
已登记 |
| A1-⑪ |
EC11 双雾区实例独立(布置身份与 board_gen 取号独立) |
A1 |
已登记 |
| A1-⑫ |
厚度 ≤2(≡ 任意 3×3 窗口非全雾,非直线行程读法)/ f ≤ 8d 硬边界——区域尺寸/占比参数须在边界内定义(Rule 3 结构推论) |
A1 |
已登记 |
| A1-⑬ |
EC2 触发判据含连通分量尺寸(非仅总面积;含部分达成契约——实际达成区数按 shortfall 分级上报) |
A1 |
已登记 |
| A1-⑭ |
降级率按 (level_index, node_depth) 埋点 + 最低雾出现率参数义务(禁放宽 Rule 3 达成;义务形式为批量统计断言——每 (level_index, node_depth) 批量板断言出现率下限 / 降级率上限,阈值与样本量归 A1 GDD 定,防形容词级观测) |
A1 |
已登记 |
| A1-⑮ |
board_biome 非空域校验(F1 输入前提,fail-fast 闭合) |
A1 |
已登记 |
| A2-① |
EC4 连锁开雾格(无数字 + 级联停止 + 计入清图 + 奖励入库) |
A2 |
已登记 |
| A2-② |
EC5 雾内旗恒不中(含标错惩罚上线后的一致性推论) |
A2 |
已登记 |
| A2-③ |
开格上报携带变体标记(数字显示判定的数据源) |
A2 |
已登记 |
| A2-④ |
EC8 棋盘持有生成期变异快照、不受表重载影响 |
A2 |
已登记 |
| B4-① |
雾内奖励档位下界 ≥ 最低档安全格 buff 当量——防雾格沦为"全图单位 AP 期望收益最低格"的纯税(注记:A3 条款 2 教义的对照基准为连锁放大边际收益,本锚仅是反淹没下界、不保证 per-AP 平价——per-AP 检查归 B1/B4 对账) |
B4 |
已登记(B4 GDD 验收项) |
| B4-② |
清图奖励锚随雾成本负担联动上浮——口径 = 链不可达雾格数 × dig_ap_cost,与定价成本同分母;上浮形态须为关卡层常量或受 B1 防钓鱼不等式约束(定量曲线归 B4) |
B4 |
已登记(B4 GDD 验收项) |
| B4-③ |
雾板净当量优势带上界(防福利方向——雾在 level 2 小图低密关链免开占比结构性最高,仅单向防税下界会使雾板退化为零成本糖果区;谓词定量归 B4) |
B4 |
已登记(B4 GDD 验收项) |
| B1-1 |
F1 条款 5 对账输入:三腿入账(雷险腿消解 + 信息腿双向净效应 + AP 腿链不可达全价)+ 雾板/无雾板两态验算 + 两条方向性护栏(优势带 / 防钓鱼)+ playtest 弃图率/完成度指标雾板分层 |
B1 |
已登记(强制检查点输入项) |
| D1-① |
图例含"迷雾 = 无雷盲区"条目——条目恒在、不设解锁门、可随时回看(MVP 验收) |
D1 |
已登记 |
| D1-② |
首遇提示一次性触发:触发谓词 = 首个实际含雾格的板进入可操作状态(挖掘阶段开始)时——生成期一次查询即判定,免疫 EC2 降级板误触发与 EC3 贴脸雾 t=0 歧义;"一次性"作用域 = 每 run 一次(MVP 无持久化设施,存档级"一生一次"归 Alpha D3/C4 后重议);可在图例回看 |
D1 |
已登记 |
| D1-③ |
提示与图例必含要点枚举(A4 持验收权——D1 文案缺任一要点即验收不通过):雾 = 无雷盲区不赌命 · 雾格不传播连锁(连锁止于雾界属正常——防"连锁莫名断了"的被骗感)· 雾内插旗纯损;文案与呈现形态定稿归 D1 GDD(硬约束:非模态、不劫持输入、不打断挖掘流) |
D1 |
已登记 |
| D1-④ |
已开雾格 tint 残留 / 雾区全开一次性完成信号(验收候选——"站在洞口前"承诺的结束拍与清图进度可读;转正与否及完成信号粒度归 OQ8 裁决) |
D1 |
已登记(候选,OQ8) |
| C3-1 |
scope=global 语义定稿 + 落地重审(cell_constraint 覆盖与零特判原则,含跨字段校验相容性) |
C3 |
已登记 |
| A5-1 |
counter_item_ids 首个道具 id 回填 + 悬空引用校验 + 条件性夹具补全(D2"首个引用字段 owner 补"条款兑现) |
A5 |
已登记(A5 期) |
| D5-1 |
"雾区无雷"教学口径 + 要点集(雾=盲区不赌命 / 雾内旗恒空 / 清图含雾格 / 无连锁折扣·止于雾界正常 / 成本两态保守启发式)+ "每雾格必邻区外雷"教学候选 + 解锁动态适配(EC9) |
D5 |
已登记 |
双向一致性核对(systems-index 依赖分层表):A1 ← A4, D2 ✅ · A2 ← A1, A3, A4 ✅ · A5 ← A2, A4, B4 ✅ · Foundation 层含 A4、无上游 ✅——无单向依赖遗漏;C3 与 A4 的关系(精英/Boss 图全局变异)由本节显式化,不与索引冲突。
P0 最小闭环
- A1 生成新扫雷图:求 F1 候选池(unlock_level ≤ 当前关卡序号且 biome_tag 匹配才入池)——池空则静默出普通图(无变异,EC1)。
- 池非空则在可行域(非 0 安全格)内布置雾区:硬边界逐项成立(厚度 ≤2 / f ≤ 8×雷密度 / 雾占比 < 全覆盖 / 出生 3×3 及可达域排除 / board_gen 流取号);不可行则降级为合法无变异图(EC2)。
- 玩家开局:出生区及连锁可达域永无雾;看见雾区边界(专属纹理)——边界可见、内容隐蔽。
- 玩家挖格或 0 格连锁传播至雾格:A2 只读查询变体属性——雾格照常开出、不显示数字;连锁来源免费、单格挖掘全价 dig_ap_cost(两态)。
- 连锁路由决策:玩家安排挖掘顺序让 0 格连锁免费吃掉雾格;链不可达雾残段权衡"全价续付清图"还是"停手/弃图"(A3 风险退出;垂直切片起再加"是否用道具买情报",A5)。
- 雾格计入清图进度、安全格奖励照常入库;既有系统零变异分支;雾内插旗合法但轮末判定恒不中。
- 清图判定含雾格——全部安全格(含雾格)开满即触发清图结算;链不可达占比等生成期输出回流 B1 条款 5 对账。
P1 / P2 后置
| 优先级 |
内容 |
后置原因 |
| P1 |
岩浆/冰冻变异建行 |
MVP 无容器(CD 门禁);变异框架已就位、加行即用,随垂直切片关卡解锁建行;P3 雷险维度由其承接(OQ5) |
| P1 |
探测道具消费 counter_item_ids(EC6 显影) |
A5 期生效;显影时效/定价归 A5 GDD 定稿(OQ2) |
| P1 |
scope=global 全局变异语义 |
C3 语义未定稿;MVP 仅预留枚举位 + warning 校验(OQ4) |
| P2 |
"雾散"开出过渡动效 |
可选,MVP 不承诺——归 B5/D1 表现里程碑,非 A4 义务 |
| P2 |
雾开出音效 |
D4 Alpha 期 |
| P2 |
A3"地形成本修饰"per-cell 价目钩子 |
本 GDD 搁置——启用须回 A3 重议 per-cell 成本接口 |
| P2 |
首遇提示"一生一次"作用域 |
MVP 每 run 一次(无持久化设施);存档级归 Alpha D3/C4 后重议 |
| P2 |
变异解锁曲线复核 |
"每关至少引入一个新元素"的推进节奏随 C3 难度曲线定稿复核(OQ6) |
调参表
VariationTable schema 定稿(D2 回写义务——本 GDD 为回填 owner)
| 字段 |
域 |
默认(fog 行) |
knob |
owner |
说明 |
| variant_id |
String(主键) |
"fog" |
✗ |
A4 回填 / D2 承载 |
变异标识;A1 候选池与 A2 查询的键 |
| display_name |
String |
"迷雾" |
✗ |
A4 回填 / D2 承载 |
图例/教学用名(本地化归 D6) |
| unlock_level |
int [1, 999] |
2 |
✓ |
A4 回填 / D2 承载 |
首次可布置关卡序号(game-concept 解锁序列:普通数字→迷雾→岩浆/冰冻);本表为定义表(数值恒定)非进度成长表,键 = variant_id,进度语义承载于此列——D2 Rule 4 豁免,语义写入 schema 注释 |
| scope |
enum {region, global} |
region |
✗ |
A4 回填 / D2 承载 |
作用域;global 仅预留枚举位(语义归 C3,MVP 不产生 global 行) |
| info_mask |
enum {none, hide_numbers} |
hide_numbers |
✗ |
A4 回填 / D2 承载 |
信息规则:该变异隐藏什么;新信息规则走接口漂移 |
| cell_constraint |
enum {any, safe_nonzero} |
safe_nonzero |
✗ |
A4 回填 / D2 承载 |
布置约束:允许落在什么格子上——Rule 3 承重规则的数据载体,A1 生成期强制执行 |
| biome_tag |
StringList 可空 |
[] |
✓ |
A4 回填 / D2 承载 |
关联 biome 主题(AD 门禁换皮约束);空 = 全 biome 可用 |
| counter_item_ids |
StringList 默认空 |
[] |
✗ |
A4 回填 / D2 承载 |
可穿透该变异的 A5 道具清单(预留,A5 期回填——探测=雾内数字显影);非平衡 knob(内容回填字段,与"结构冻结"归类一致) |
knob 效应与真 owner
| Knob |
默认 |
调过高 |
调过低 |
| unlock_level(fog 行) |
2 |
变异内容推迟,关卡间"解锁新变异"的推进感断裂(每关至少引入一个新元素的节奏被打破) |
教学压力前移——玩家尚未在纯数字环境建立推理信任即遇信息剥夺(P1 落差语义丧失;D5 教学须跟随实际值动态适配,EC9) |
| biome_tag(fog 行) |
[](全 biome 可用) |
收窄出现范围——某些 biome 无雾,多样性下降 |
——(空集即基线,无"更低") |
- 非 knob 字段(结构冻结):scope(MVP 恒 region——开放 global 是 C3 的语义义务而非调参)、info_mask / cell_constraint(fog 行值即规则定义本身,修改 = 改规则,须走本 GDD 修订流程而非调参)、counter_item_ids(A5 期内容回填,非平衡 knob)。
- Knob 交互与真 owner:迷雾的实际手感参数——区域数量 / 区域尺寸 / 雾面积占比 / 与雷密度的联动——全部在 A1 BoardGenTable((level_index, node_depth) 维度,A1 回填),那是难度曲线的函数;A4 的表只管"资格";禁止在两表间复制参数(单一事实源,D2 Rule 1);unlock_level 与 BoardGenTable 的难度轴正交(门控定"谁入池",表参数定"摆多大/摆哪"——systems-designer 审查确认无冲突)。
- 跨 GDD 引用:A3 的
ap_per_round(8)与 dig_ap_cost(1)均归 A3 所有,本 GDD 不重复列出;雾致预算增量构成仅消费 dig_ap_cost(承重数学节注记),清图总预算的可用量口径归 A1/A3 契约。
验收标准
测试口径
| 口径 |
要点 |
| 测试载体 |
godot --headless --script(承 D2 冒烟框架;脚本 extends SceneTree、autoload 显式实例化)——A4 是定义层系统,冒烟域 = 定义层(schema / 门控谓词 / 校验);布置层 = A1 集成(15 项,义务清单 A1-①…⑮)· 执行层 = A2 集成(4 项,义务清单 A2-①…④)——deferral 以对侧登记为生效条件,A1×15 / A2×4 清单已同步 systems-index 门禁记录 |
| 致命用例协议 |
独立进程协议承 D2 AC-2b(runner manifest 逐条登记"调用→期望退出码";单进程内只做测试通道收集断言) |
| 夹具注入 |
经 --data-root 注入,五根齐备(3 根致命错误夹具 + 1 根 warning 夹具 + 1 根合法数据变体夹具,见夹具清单) |
| 期望值推导纪律 |
由表值推导不写死——unlock_level 与 biome_tag 均为 knob,推导纪律适用两者(防 EC9 及 biome_tag 调参假失败) |
| 诊断卫生 |
每用例先 reset_diagnostics()(承 D2 冒烟协议,全局声明) |
| runner manifest |
四行退出码登记:dup→≠0 · oob→≠0 · mask→≠0 · global→0(biome_tag 根仅进程内测试通道消费、无退出码行,AC-3 前置断言其零诊断加载) |
| 豁免声明 |
空表/缺表/类型错类别由 D2 AC-2 同类别夹具承载,A4 不设专属夹具(loader 级类别、与表内容无关,D2 夹具可承载;空表情形另由 AC-1"恰含一行"间接兜底) |
| 悬空引用处置 |
counter_item_ids 为 D2 schema 首个引用型字段——MVP 显式声明不校验悬空引用(字段恒空、A5 未回填);A5 GDD 回填首个道具 id 时补悬空校验 + 条件性夹具(义务清单 A5-1) |
夹具清单
| 夹具根 |
内容 |
级别 |
服务 |
| variation_dup_key |
重复 variant_id;与 D2 AC-2 重复键夹具独立同型(A4 表首用,避免跨表耦合) |
致命 |
AC-4 / AC-4b |
| variation_unlock_oob |
unlock_level=0 |
致命 |
AC-4b |
| variation_mask_constraint |
info_mask=hide_numbers + cell_constraint=any 跨字段违规(EC4"级联止于雾格"承重保证的测试落点) |
致命 |
AC-4 / AC-4b |
| variation_global_scope |
scope=global 行 |
warning 级、非错误(游戏通道 0 退出) |
AC-6 |
| variation_biome_tag |
合法门控测试行:biome_tag=[ice]、unlock_level=1 |
合法(无对应校验类别) |
AC-3 |
AC 清单(Given-When-Then,编号不变)
| AC |
Given |
When |
Then |
覆盖 |
| AC-1 |
干净检出(默认表根) |
冒烟加载 Core Rules-3 表清单 |
VariationTable 加载成功、恰含 fog 一行(无岩浆/冰冻行——内容事实断言);fog 行非 knob 六字段(variant_id/display_name/scope/info_mask/cell_constraint/counter_item_ids)与 schema 定稿值逐一相符("fog"/"迷雾"/region/hide_numbers/safe_nonzero/∅);unlock_level 与 biome_tag 两个 knob 字段仅作类型域断言、期望 = 表读值(不作定值断言——合法调参不得假失败) |
Core Rule 8 / 义务清单 |
| AC-2 |
fog 行表值 (u, tag=∅)(默认行),board_biome 任意非空集(全腿作用于干净检出默认表根——仅 fog 一行) |
对 (level_index=u) 求 pool;仅当 u>1,再对 (level_index=u−1) 求 pool |
level_index=u 时恒含 fog;u>1 时 u−1 腿 pool=∅(u=1 时 u−1=0 越出 level_index≥1 域、不测——F1 前置域);tag≠∅ 交集推导分支由 AC-3 夹具腿承载(默认表根仅 fog 一行、tag 恒 ∅,该分支在默认根不可构造;夹具根上 ice 行 unlock_level=1、u−1 腿不真) |
F1 |
| AC-3 |
前置断言:夹具根零诊断加载(每用例 reset_diagnostics() 后加载,防 schema 演进劣化静默);eligible(v, L, B) := v ∈ pool(L, B)(F1 谓词的成员判定形式)。第一腿:fog.biome_tag=∅(默认行);第二腿:夹具根 variation_biome_tag(测试行 biome_tag=[ice]、unlock_level=1 写入夹具规格——防门控腿掩蔽 biome 腿,并承载 tag≠∅ 交集推导语义) |
第一腿在 level_index=u(fog.unlock_level 表读值)以任意非空 board_biome(单/多元素集各一)求 eligible;第二腿在 level_index=1 以 board_biome={dungeon} 与 {dungeon, ice} 分别求 eligible(v=测试行) |
第一腿恒 true(通配语义——∅ 不因 board_biome 取值失败);第二腿 false / true(单元素 {dungeon} 不交集 → false;{dungeon, ice} 交集 → true) |
F1 通配与交集 |
| AC-4 |
夹具根 variation_dup_key 与 variation_mask_constraint |
load_tables(root, collect_only=true)(测试通道) |
错误清单各含重复键类别 / 跨字段校验类别(hide_numbers⇒safe_nonzero) |
schema 校验 |
| AC-4b |
夹具根 variation_dup_key、variation_unlock_oob(unlock_level=0)与 variation_mask_constraint |
各以独立 headless 进程跑游戏通道 collect_only=false |
三进程均非 0 退出且错误清单完整(D2 Rule 6 加载期致命——"游戏内真的会死") |
schema 校验致命 |
| AC-5 |
schema 实例构造(实例化一律走 class_name 直引、不经 load()/preload()——AC-7 扫描豁免条款;程序构造免夹具) |
validate() 作用于 unlock_level ∈ {0, 1000};∈ {1, 999} |
{0, 1000} 均域错误;{1, 999} 均合法 |
域校验 |
| AC-6 |
夹具根 variation_global_scope(每用例先 reset_diagnostics()) |
测试通道加载;同夹具游戏通道独立进程 |
诊断收集器 warning 恰一条且来源类别 = global 语义注记、其余表零诊断(防他表 schema 演进以无关诊断稀释断言);游戏通道以 0 退出(非致命半句) |
EC7 |
| AC-7 |
A4 文件集(schema/谓词/冒烟脚本) |
按 D2 AC-9 模式静态扫描(randomize() / RandomNumberGenerator / ConfigDB 外 data 表加载) |
零命中(扫描域扩入 A4;schema class_name 直引实例化豁免——AC-5 程序构造前提,承 D2 AC-9 模式) |
Core Rule 8 |
| AC-8 |
ConfigDB 加载完成 |
脚本解析 design/registry/entities.yaml 的 variation_table 条目 |
与 ConfigDB VariationTable 8 字段定义(字段名/类型/域/knob 标记)逐一相等;定值断言仅限非 knob 字段,knob 字段(unlock_level/biome_tag)对账口径 = registry 随调参同步或本 AC 豁免其值(防 EC9 调参经此后门假失败);对账域显式排除 mvp_content 与 fog_ap_note(前者含 knob 活值登记);缺任一即失败(仿 A3 AC-10a) |
D2 回写义务 |
| AC-9 |
(人工·视觉)边界可读 / 双通道 / 色板变体 |
归 art-bible 格子样张测试(AD 门禁),非冒烟域——阈值委托的排期门与违约判定挂 systems-index 门禁增补记录;art-bible 缺位期以原型 v3 紫色为临时明度基线,就位后强制复测 |
操作化口径("可读"须为可判定谓词,防形容词验收):① 形状通道 = 色板无关线稿资产 + 对全部底色的明度对比数值下限(阈值 art-bible 定、须存在);② 新增 biome 色板强制重跑样张清单(AD 门禁复测项);③ 样张须含最坏用例:宽度 1 雾带(每格即全边界——Rule 3 结构推论下的正常形态)、"旗 × 雾纹理 × 边界"三重叠加格、宽度 1 雾带两侧毗邻数字格(视觉锚 1"纹理不干扰数字辨识"的真实威胁面在邻格——雾格自身无数字) |
呈现契约 1/4 |
| AC-10 |
(人工·字面量)A4 文件集 |
纳入 D2 AC-14 项目级扫描 |
人工三要素口径,引用不另设(与 A3 AC-10b 同型) |
Core Rule 8 |
版本历史
| 版本 |
日期 |
改动 |
| v2 |
2026-09-14 |
两件套格式迁移:按模板 v2 拆分——本文只装结论,公式推导论证/数值锚定论证/候选方案取舍/体验锚点论证/已裁决争议与开放问题 OQ1–8 迁 design/gdd/analysis/a4-terrain-variation.md;规则改编号人话句、边界情况改条件|行为两列表;全部规则、数值、AC/EC/义务清单/OQ 编号原样保留,零规则变更 |
| v1.0-lean |
2026-09-13 |
格式迁移:legacy 原稿按 lean 样例(docs/lean-gdd-sample-b1.md)重排——正文修订注记剥离收敛至本表;速览/体验锚点/枚举/义务台账/开放问题转表格,布置与揭示流程转字符画;F1 门控谓词、厚度 ≤2 / f ≤ 8d 结构推论、雾致预算增量公式本体与验算全保留;语义与 2026-09-08 定稿对齐,零规则变更 |
| rev2 |
2026-09-08 |
同日 re-review 六项 blocking 同日核销(CD 终裁建议 delta 核销免第三轮 full 评审,用户拍板照此放行——A3 先例):① systems-index 登记闭环补全(A1×15 全枚举——⑤扩链不可达占比生产者义务、⑬扩部分达成、⑭增批量统计断言形式条款,A2×4、D1×2、B4×3、B1 条款 5 输入,registry referenced_by 补 B1/B4);② knob 口径统一(counter_item_ids 非 knob 误标修正、AC-1 改双 knob 表读值断言、AC-8 排除 mvp_content/fog_ap_note);③ 校验与 AC 可执行性(新增第五夹具 variation_mask_constraint、manifest 第四行、AC-3 夹具根零诊断前置、AC-2 钉死默认表根);④ 修订残留失实清理("探路"改连锁路由 + 续付/退出两轴、雾格成本两态口径、厚度钉死 3×3 窗口谓词防对角带误拒、夹具计数改 3 致命 + 1 warning + 1 合法、预算改增量构成——原"≤ 轮数上限 × ap_per_round"不等式作废("轮数上限"在 A3 契约无定义、恒真空转)、Upstream 改零运行时接口消费);⑤ B4 约束簇(②改链不可达同分母口径——原"雾面积"分母脱钩作废、增③防福利上界、防钓鱼张力对账 A3 OQ6、①per-AP 平价注记);⑥ MVP 验收契约(D1 必含要点补"雾格不传播连锁"、首遇提示谓词改"首个含雾板进入可操作状态"——原"雾格首次与已开区相邻"作废(贴脸雾 t=0 即真、远雾图滞后)、一次性作用域 = 每 run、EC2 部分达成契约、A1⑤ 设计期聚合校验);顺带:D5 成本教学改玩家侧保守全价启发式、Rule 7 可达域保守上界 + A2 展开域 ⊆ A1 排除域回验、OQ1 占比双重身份、新增 OQ8、AC-9 补 art-bible 指针与宽度 1 雾带邻格用例——明细见 review log |
| rev1 |
2026-09-08 |
full 独立评审(game-designer · systems-designer · qa-lead · economy-designer · level-designer · ux-designer 六专员 + creative-director 终裁)八项 blocking 同日核销:① 可推理率对账公理自相矛盾 + Rule 5 单向建模——改双向净效应、厚度 ≤2 / f ≤ 8d / ⌈k/8⌉ 结构推论入文(登记 A1 验收);② Player Fantasy"三选项"失实——改诚实版(雾 = 清图必经段、绕开 = A3 风险退出、买情报标注 A5 期)+ B4 两条定价硬约束 + P3 降格"信息切面"("清图判定豁免雾格"选项经裁决否决——违反零特判承重规则);③ "雾格全部全价"半假——改链不可达两态口径;④ EC2 判据扩连通分量 + 降级率埋点与最低雾出现率义务;⑤ EC3 预设 A2 未定义行为——Rule 7 可达域生成期确定性计算、邻接合法结论保留;⑥ AC 四处硬伤(AC-1 写死 unlock_level=2 等)+ deferral 闭环——A1 清单 11→15 扩容并登记 systems-index 门禁记录;⑦ EC11 定向粒度改 variant 行级、实例级定向归 A5 期新字段;⑧ "雾区无雷"教学零 MVP 落点——登记 D1 MVP 验收两条 + AC-9 操作化;顺带:hide_numbers⇒safe_nonzero 跨字段校验、EC10 升格参数域拒绝、已开雾格 tint 完成信号候选、"跨雾推理"措辞降调——明细见 review log |
| v1 |
2026-09-08 |
初稿定稿:承重规则"生成期布置约束(雾区仅非 0 安全格)+ 零特判原则 + fog unlock_level=2"用户拍板;lean 门禁 systems-designer 审查 Formulas(排除声明成立、谓词改集合语义、补下游验收项与预算构成注记)、qa-lead 审查 Acceptance Criteria;评审日志 design/gdd/reviews/a4-terrain-variation-review-log.md |