Files
gplan-2/design/gdd/a4-terrain-variation.md
T
2026-09-14 18:18:49 +08:00

518 lines
65 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# A4 地形变异(Terrain Variation)
> **状态**:Approved · lean 格式
> **版本**:v1.0-lean · 2026-09-13 · 作者:user + agents(lean 门禁:systems-designer 审查 Formulas · qa-lead 审查 Acceptance Criteria)
> **承载支柱**:P1 主(信息诚实边界——"不可推理"永不伪装成"可推理")· P3(信息维度变体——定价通货从雷险换信息+AP;迷雾仅其信息切面)· P2(暗面警示——雾区奖励可预期性切面)· P4(地牢氛围本体承载)
> **层级**:Layer 1 Foundation · Milestone MVP · 设计顺序第 3 位(上游 D2、A3 已 Approved)
> **一句话**:A4 定义扫雷图上的地形变异——基础规则之上的区域性规则偏离;MVP 唯一变异为迷雾(边界可见、内容隐蔽),并以变异框架承载岩浆/冰冻等后续变异逐个加入。
> **复核注记**:art-director 未经咨询(Lean 模式)——生产前人工复核视觉规格与 art-bible 一致性(creative-director 已在两轮独立评审中终裁幻想节处置)。
## 速览
| 关键问题 | 答案 |
|---|---|
| 定位 | 变异的定义与交互规则 owner——在基础扫雷规则上叠加区域性规则偏离的框架 + MVP 迷雾;玩家不"使用"A4,而是在挖掘中遭遇并应对它 |
| 拥有 | VariationTable 8 字段定义(D2 回填 owner)· F1 候选池门控谓词 · 信息剥夺边界与双向效应 · 生成期布置约束声明(执行归 A1)· 零特判原则的规则面(义务是"不加分支")· 未来变异扩展框架 |
| 不拥有 | 布置算法与区域参数(A1 BoardGenTable)· 挖/旗执行(A2)· 呈现(D1)· 教学文案(D5)· 奖励内容与定价(B4/B1)· 道具(A5)· 全局变异语义(C3)· 玩法数值字面量与随机 |
| 上游输入 | D2 VariationTable schema 承载 + ConfigDB 读取(hard——唯一玩法上游);A3 价目 `ap_per_round` / `dig_ap_cost` 文档层引用(零运行时接口消费) |
| 下游输出 | 候选池门控 + cell_constraint + 出生区排除(A1)· 变体属性只读查询契约(A2)· 呈现规格(D1)· 教学口径(D5)· 定价硬约束与条款 5 对账输入(B4/B1)· counter_item_ids 预留(A5)· scope=global 枚举位(C3) |
| 硬约束 | 生成期布置约束(雾区仅非 0 安全格——区内无雷、无 0 格)· 零特判原则 · fog unlock_level=2 · hide_numbers⇒safe_nonzero 跨字段校验致命 · 厚度 ≤2 / f ≤ 8×雷密度 硬边界 |
A4 是定义层系统:变异由棋盘生成(A1)布置在图上,玩家在挖掘中遭遇并应对——看见迷雾边界那一刻决策就出现:如何安排挖掘顺序让 0 格连锁免费吃掉雾格(连锁路由),链不可达的雾残段按全价续付清图还是停手/弃图(A3 风险退出权衡;垂直切片起再加"是否用道具买情报",A5)。清图判定含雾格——雾是清图的必经段而非可绕过的支线,"绕开走"的真实形态是 A3 的停手/弃图风险退出。
没有 A4,游戏失去两样东西:难度只能靠雷数单调缩放、关卡间"解锁新变异"的推进感(P4 越下越险)消失;且"无法推理"的格子会以埋伏形式随机出现——迷雾把"你推不出来"从暗处的埋伏变成明处的选择,是 P3"风险与收益同源"在空间维度的载体,也是对 P1"我算对了"的诚实兜底:推不出的区域被显式标注、可绕行、可买情报,而不是让玩家在自以为可推理的局面上撞墙。
## 体验锚点
> 情绪目标一句话:**站在洞口前的权衡感**——迷雾不制造惊喜或惊吓,它制造一个看得见边界的承诺:"里面有价值,进去的代价是 AP 溢价与放弃雾格数字这份推理原料。"(玩家每轮都在看见并应对变异——直接感知)
| 支柱 | 关键词 | 机制承诺 |
|---|---|---|
| P1 我算对了的诚实边界 | "数字不再说话" | 迷雾是游戏对玩家的坦白——把"无法推理"从埋伏变成路标:雾外仍可用区外数字推理雾边缘的雷(跨雾推理——被雾边已知约束放大的常规推理体验,"隔着雾也算出来了",是常规推理在雾边的延伸、非独立机制);进雾每一步是承诺而非计算;基础区可推理率生成保证归 A1,A4 负责"不可推理"永不伪装成"可推理";"里面有价值"是契约而非愿望——由 B4 三条定价硬约束兜底(义务清单 B4-①②③) |
| P3 风险与收益同源(信息切面) | "不赌命,赌信息与行动力" | 雾区无雷是玩家可见知识——雾的"险"在信息与行动力的双重定价:盲区预算按链不可达雾格全价收紧,链可达雾格经邻接 0 格连锁免费开出(两态口径);变异框架是 P3 的长期载体,迷雾仅其信息切面,P3 雷险维度由岩浆/冰冻(垂直切片起)承接;真实耦合点在雾边(Rule 5 双向效应——A1 按双向净效应建模) |
| P2 规划的延迟兑现(暗面警示) | "边界可见、内容隐蔽" | 雾内奖励若不可见,规划退化成探索惊喜(创意风险 #1,CD 门禁登记 B4/A4 落实)——Core Rules 定迷雾信息呈现规则的精确切面,奖励可见性/探测机制的接口在此预留、内容归 B4/A5 |
| P4 地牢氛围的本体承载 | "趴在地图上的黑暗" | 迷雾是"下探黑暗"隐喻的直接具象——未探索的黑暗是有形状、有边界、趴在地图上的实体;后续变异(岩浆/冰冻)延续"越深越险的地貌"叙事(随关卡解锁) |
反向护栏(裁剪判据):迷雾绝不能制造"被骗感"——若雾区边界不可见、或进洞无额外价值,迷雾退化为纯负体验税(纯 AP 税);任何让雾区"隐性化"的设计默认砍掉。"里面有价值"由 B4 三条定价硬约束兜底:两条防税下界 + 一条防福利上界——防 level 2 首发关(小图低密、链免开占比结构性最高)"链免开 + 锚上浮"双白拿的福利板化与"雾=免费奖励"先验(后者会在后期雾变厚、全价残段出现时恰触发被骗感护栏)。
- 参考感受:Into the Breach 的信息诚实(游戏从不用隐藏信息骗你——本作反其道而行,把"信息缺失本身"诚实标注)· 杀戮尖塔地图的路径承诺(看得见的未知,选定的风险)。
## 全局流程
### 地形布置流程(A1 生成期——A4 只声明约束与门控,算法归 A1)
```
A1 生成新扫雷图(雷图 · 尺寸 · biome,(level_index, node_depth) 维度)
│ ① 求布置候选池 pool = F1(level_index, board_biome)
│ pool = ∅(雾未解锁 / biome_tag 全不匹配)→ 静默布置普通图,不报错(EC1)
│ ② 池非空 → 逐候选按 cell_constraint=safe_nonzero 求可行域
│ 非可行(非 0 安全格面积或连通分量不足)→ 跳过雾布置,本图为合法无变异图(EC2 降级)
│ 实际达成区数 k < 参数要求 N → 尽力布置可行分量,按 shortfall 分级上报降级率(禁放宽 Rule 3 硬塞)
│ ③ 可行域内布置雾区,硬边界逐项成立:
│ · 雾格 ∈ 非 0 安全格(区内无雷、无 0 格)
│ · 厚度 ≤2(≡ 任意 3×3 窗口非全雾)· f ≤ 8×雷密度 · 雾占比 < 全覆盖(EC10)
│ · 出生 3×3 及其初始展开可达域内无变异格(保守上界 = 出生 3×3 经 0 格最大
│ flood 闭包外扩 1 格——任意 A2 展开定义的超集,Rule 7)
│ · 区域随机选取经 board_gen 流取号(回放确定性)
│ ④ 生成期计算并输出链不可达雾格占比(B1 条款 5 对账输入,验收⑤)
▼
棋盘产物(格状态 + 变异标记 + 出生区)→ A2 install_board 持有生成期快照
```
### 雾揭示流程(运行期——零特判,A2 执行逻辑无变异分支)
```
玩家挖格 c(全价 dig_ap_cost)或 0 格连锁传播至 c(连锁展开零价)
│ A2 只读查询格变体属性(生成期快照)
▼
c 是雾格?
├─ 否 → 正常开格:显示数字(8 邻雷数恒真,值不因雾改变)
└─ 是 → 开出、不显示数字(未开时专属纹理已标出区域边界)
· 来源 = 连锁 → 免费(链可达雾格——EC4;雾格恒非 0,级联止于雾格)
· 来源 = 单格挖掘 → 全价 dig_ap_cost(链不可达雾格)
· 计入清图进度 · 安全格奖励照常入库 · 雾内插旗合法但轮末判定恒不中
```
### 出口分发
| 出口 | 触发 | 行为 | 依据 |
|---|---|---|---|
| 普通图(无变异) | 候选池为空(未解锁 / biome_tag 全不匹配) | 静默布置、不报错、无 warning——两种来源同待遇 | EC1 / F1 Output Range |
| 无雾图(降级产物) | cell_constraint 无解(面积或连通分量不足) | 跳过雾布置,图仍合法;shortfall 分级上报降级率 | EC2 |
| 合法雾图 | 可行域内布置成功 | 产物携带变异标记;占比参数域校验通过;输出链不可达占比 | Rule 3 / Rule 6 |
| 参数域拒绝 | 雾占比 ≥ 全覆盖(极端参数) | BoardGenTable 参数校验拒绝(雾占比上限 × 可推理率下限联动不等式) | EC10 |
## 核心规则
> 每条规则两段:**人话**(作用于哪个系统、什么情况下、谁触发、触发后发生什么;效果与情况用枚举表)→ **举证**(计算方法/公式;纯流程规则明写"无计算")。
#### 规则 1:每种变异都是配置表里的一行声明,不含任何专属代码
**人话**:这条管变异怎么被定义。每种变异是配置表 VariationTable 里的一行具名声明,一共声明四件事——见下表。框架自身不含运行时逻辑:变异带来的行为改变,发生在"信息规则 × 既有系统行为"的交集里,定义行只声明交集参数,不写任何处理代码。
| 声明项 | 字段 | 回答的问题 |
|---|---|---|
| 身份 | variant_id / display_name / unlock_level / biome_tag | 叫什么、第几关解锁、在哪些地形主题出现 |
| 信息规则 | info_mask | 隐藏玩家的什么信息 |
| 布置约束 | cell_constraint | 允许落在什么样的格子上 |
| 作用域 | scope | 管一块区域(region),还是全局(global——为后续预留) |
**举证**:无计算(定义框架)。字段 schema 定稿与默认值见「Tuning Knobs·VariationTable schema 定稿」表(本 GDD 回填 owner,承载归 D2)。
#### 规则 2:迷雾边界看得见,里面的数字看不见
**人话**:这条管 MVP 唯一的变异——迷雾。它是作用域为 region 的信息剥夺变异,玩家在挖掘中遭遇它时,行为规则只有两条:
| 情况 | 玩家看到什么 |
|---|---|
| 雾格还没开 | 专属纹理标出雾区范围——边界可见、内容隐蔽 |
| 雾格被开出(亲手挖或连锁带到) | 照常开出,但不显示数字 |
**举证**:无计算(两条行为规则)。呈现规格(纹理、边界可读性、已开雾格样式)归 D1,见「呈现与 UI 契约」节与依赖节 D1 行。
#### 规则 3:雾只铺在贴着雷的安全格上——雾里永远没雷、没 0 格
**人话**:这条管棋盘生成时雾往哪儿摆,是本 GDD 的承重规则(用户定稿)。生成器布置雾区只能选"非 0 安全格"——8 邻里至少含 1 雷的安全格,于是雾区里既无雷、也无 0 格。约束由本 GDD 声明、棋盘生成器在生成期强制执行,谁都不许为布置成功率放宽它。玩家侧的承诺是明牌:"雾区无雷"由教学与图例传达。正因雾里没雷没 0 格,既有规则才能对雾全面惰性化——下一条讲的就是这个。
**举证**:计算见「数值结论与推导·结构推论」——厚度 ≤2(可判定谓词 ≡ 任意 3×3 窗口非全雾)与面积必要上界 f ≤ 8×雷密度的推导与验算都在该节;约束逐项落点见下方实现参照表;执行义务登记 A1 验收⑫;数据载体 = cell_constraint 字段;"雾区无雷"等可教知识清单见「规则 3/5 的实现参照——雾元知识信息源」。
#### 规则 4:既有系统不为雾改任何行为,代码里零变异分支
**人话**:这条管雾与游戏其余部分的关系,同为承重规则。连锁、数字计数、清图判定、插旗、行动价目、结算——既有系统一律不感知"这格是不是雾格":雾不改变它们任何行为,代码里也不许出现"如果是雾格就……"的分支。雾格能被如此"无视",靠的正是上一条"雾里没雷没 0 格"的布置约束。六个系统面在雾下的具体表现见下方实现参照表。
**举证**:无计算(架构纪律)。挖掘侧义务 = 执行逻辑零变异分支("不加分支"而非"加处理",见依赖节下游 A2 行);A4 文件集零随机、零字面量走静态扫描(AC-7/AC-10)。
#### 规则 5:雾只藏雾格的数字,藏的同时倒送两样补偿
**人话**:这条管信息剥夺的边界——"雾到底藏了什么"的账目。藏的只有一样:未开雾格的数字;不藏的有三样,见下表。雾外数字对雾外雷的计数照常,雾边界推理仍可行、只是原料变少。剥夺之外并存增益,净效应双向、随雾形与雷密度变化——建模必须两边都算,不许只算一边:
| 信息 | 雾下状态 |
|---|---|
| 未开雾格的数字 | 藏——唯一被剥夺的 |
| 雾区边界 | 不藏——专属纹理可见 |
| 已开格的全部信息 | 不藏 |
| 奖励入库过程 | 不藏 |
| 效应方向 | 内容 |
|---|---|
| 剥夺(减项) | 雾格数字本可作区外雷的推理源,其寂静使雾边附近的线索变少 |
| 增益(加项) | 雾格保证无雷且必邻区外雷;雾形携带雷簇位置(k 格雾区外环必含 ≥⌈k/8⌉ 雷);雾边邻格雷候选域收缩、局部更易解——"雾边 = 推理锚" |
**举证**:净效应双向且依赖雾形/雷密度——A1 可推理率参数须按生成后实测净效应建模、禁单向补偿(验收④);外环雷下界 ⌈k/8⌉ 的推导见「数值结论与推导·结构推论」;玩家可推理、可教的雾知识清单见「规则 3/5 的实现参照——雾元知识信息源」。
#### 规则 6:雾摆多大摆哪儿归棋盘生成器,A4 只管入场资格
**人话**:这条管雾区摆放的决定权。A4 不拥有布置算法:摆几个雾区、每个多大、摆在哪,与雷图共生,由 A1 生成算法 + BoardGenTable 参数(按关卡×深度两维逐行,A1 回填)决定;布置随机从棋盘生成专用随机流(board_gen 流)取号,每次生成新扫雷图绑定一次,同种子必出同图。A4 对摆放的唯一参与是资格把关:变异的解锁关号不高于当前关卡序号,才进入这一关的布置候选池。
**举证**:门控的计算形式是集合谓词 F1(unlock_level 直接整数比较 + biome_tag 通配/交集),见「数值结论与推导·F1 布置候选门控」;取号机制 = RngService scope 绑定(每次生成新扫雷图);区域数量/尺寸/占比参数域见「枚举·板形参数」表。
#### 规则 7:出生区及其连锁可达范围永不长雾
**人话**:这条管玩家的落点安全。开局站立的 3×3 出生区,连同从它出发顺 0 格连锁能自动展开到的范围,永不含任何变异——生成器布置时硬性排除。可达范围由生成期确定性算出(不依赖挖掘系统运行期的展开行为定义),取保守上界:从出生 3×3 经 0 格连锁能扩散到的最大范围(flood 闭包)再外扩 1 格,比挖掘系统实际能展开的范围只大不小。防的是"开局即瞎"与"开局预开雾格";叠加"初始展开无奖励"(定稿口径),初始展开触及雾格在构造上不可能——双保险。
**举证**:无计算(几何排除)。可达域保守上界构造见 A1 GDD;回验项(挖掘侧实际展开域 ⊆ 生成侧排除域——"构造上不可能"仅在超集关系下成立)登记 A2 GDD 门禁;"初始展开无奖励优先于连锁入库语义"保留(EC4);出生区排除登记验收③。
#### 规则 8:A4 的代码不写死数字、不掷随机
**人话**:这条管数据纪律。变异的全部定义数据放配置表 VariationTable——本 GDD 是该表回填 owner,字段 schema 见 Tuning Knobs 节。A4 相关代码零玩法数值字面量、零随机:布置随机落在棋盘生成器的专用随机流里,A4 自己既不掷随机数也不写死玩法数字,一切读表。
**举证**:无计算(数据纪律)。schema 定稿与 knob 划分见「Tuning Knobs」节;机器验收 = 静态扫描零命中(AC-7)与字面量人工口径(AC-10)。
#### 规则 9:新变异将来按同一框架加行,不另起炉灶
**人话**:这条管变异框架怎么长出新居民。岩浆、冰冻在 MVP 不建行(CD 门禁:无 MVP 容器),随垂直切片关卡解锁建行;将来某变异需要新规则字段时,走 D2 接口漂移规则同步回写本 GDD 与 D2,不在表外私加字段。精英/Boss 图的全局变异只预留一个"全局"作用域枚举位(scope=global),语义归 C3 GDD 定稿——本 GDD 只保证枚举位存在,不预写语义。
**举证**:无计算(扩展纪律)。MVP 行集内容事实(恰含 fog 一行)见「枚举·VariationTable 行集」;global 行出现时的 warning 校验见「枚举·VariationTable schema 校验类别」表;接口漂移规则归 D2。
### 规则 3 的实现参照——生成期布置约束(几何硬边界)
| 约束项 | 内容 | 执行 / 落点 |
|---|---|---|
| 雾区格类 | 仅非 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 裁定 |
### 规则 4 的实现参照——零特判六面
| 系统行为 | 雾下的行为 | 性质 |
|---|---|---|
| 连锁展开 | 触发与传播只看真实数字;雾格恒非 0 → 雾格自身永不传播连锁(不开出新级联);但雾格可被邻接 0 格的连锁免费开出(EC4——"不传播"≠"不被开") | flood fill 代码零变异分支 |
| 数字计数 | 数字 = 周围 8 格雷数恒真;雷全在雾外,任何数字的值不因雾存在而改变 | 恒真定理 |
| 清图判定 | 雾格照常计入"安全格全开"判定——雾是清图必经段 | 恒等 |
| 旗 | 雾内插旗合法(价目照常)但恒标不中(无雷) | 合法、无害、无意义 |
| 行动价目 | 挖/旗/移动成本雾内外一致 | A3"地形成本修饰"钩子本 GDD 搁置——启用须回 A3 重议 per-cell 成本接口 |
| 结算 | 雾格安全格奖励照常入库与结算 | B1/B4 无需感知雾 |
### 规则 3/5 的实现参照——雾元知识信息源(玩家可推理、可教的雾知识清单)
| 元知识 | 信息源 | 消费方 |
|---|---|---|
| 雾区无雷 | 生成期布置约束(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 教学警示"雾内插旗纯损" |
## 枚举
### VariationTable 行集(MVP 表内容——恰含 fog 一行,AC-1 内容事实断言)
| 行 | 字段取值 | 产出点 | 语义 |
|---|---|---|---|
| "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 容器),垂直切片随关卡解锁建行 |
### 板形参数(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(验收⑮) |
### 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 |
## 数值结论与推导
> 口径总纲:本 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 静默布置普通图不报错(验收⑥)。
#### 推导
```
pool(level_index, board_biome) = { v ∈ VariationTable |
(v.unlock_level ≤ level_index) ∧ (v.biome_tag = ∅ ∨ v.biome_tag ∩ board_biome ≠ ∅) }
eligible(v, L, B) :⇔ v ∈ pool(L, B) ——成员判定形式(AC-3 消费)
```
**Variables:**
| 变量 | 类型 | 范围 | 说明 |
|---|---|---|---|
| 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⌉ 雷(雾形携带雷簇位置信息——雾边 = 推理锚)。
#### 推导
```
非 0 安全格 ⇔ 8 邻域含 ≥1 雷;雷不可能为雾格(区内无雷)
⇒ 每个雾格 x:∃雷 m ∈ N₈(x)(非雾雷邻居)
① 厚度:3×3 全雾窗口的中心格 8 邻全雾 ⇒ 8 邻无雷 ⇒ 中心为 0 格,
与"雾格 ∈ 非 0 安全格"矛盾 ⇒ 任意 3×3 窗口非全雾 ⟺ 厚度 ≤2
(雾区恒为雷集切比雪夫 1-膨胀出的边界带)
② 面积上界:每雾格 ≥1 个雷邻居,每雷至多作为 8 个雾邻格的见证
⇒ f ≤ 8×|M|(f = 雾格数,|M| = 雷数)
③ 外环雷下界:k 格雾区的外环(雾邻界外格集)承载全部雷邻居见证,
外环每格至多邻 8 个雾格 ⇒ |外环雷| ≥ ⌈k/8⌉ ——雾形本身携带雷簇位置信息(Rule 5 增益侧)
```
**Variables:**
| 变量 | 类型 | 范围 | 说明 |
|---|---|---|---|
| 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 仅是可行性输入、不提供雾成本显著性保证——局限如实登记。
#### 推导
```
价目不变:挖/旗/移动成本雾内外一致(零特判,Rule 4)
雾格 AP 成本两态:
链可达雾格 → 免费(邻接非雾 0 格连锁展开零价——EC4)
链不可达雾格 → 全价 dig_ap_cost 结算
雾致预算增量 = 链不可达雾格数 × dig_ap_cost (量纲闭合:格 × AP/格)
计入清图总预算需求 → 参与 A1 BoardGenTable 设计期核算
总预算可用量与全量校验(全量待挖下界 ≤ 可用预算)口径归 A1/A3 契约,非本 GDD 定义
```
**Variables:**
| 变量 | 类型 | 范围 | 说明 |
|---|---|---|---|
| 链不可达雾格数 | 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——聚合指标会被雾板污染或反向掩盖)。
## 状态
| 阶段 | 载体 | Owner | 行为 |
|---|---|---|---|
| 定义(构建期) | VariationTable .tres | D2 承载 / A4 回填 | ConfigDB 加载校验;热重载走 D2 既有门(战斗中拒绝,EC8) |
| 布置(生成期) | 棋盘格变体属性 | A1 | 生成新扫雷图时经 board_gen 流取号;unlock_level 门控候选池 + cell_constraint 强制 + 出生区排除 |
| 生效(执行期) | 格属性只读查询 | A2 / D1 消费 | 开格时读"是否雾格"决定数字显示与否;零运行时写入 |
| 消亡(随图) | 棋盘实例销毁 | A2 | 清图换新图 / 刷新 / 战斗结束——变异属性随棋盘实例消亡,无跨图存续 |
不变式:A4 无运行时状态机——变异是棋盘格的只读属性,随图生成、随图消亡;生效期零运行时写入、无跨图存续。
## 边界情况
| 条件 | 行为 | 依据 |
|---|---|---|
| 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 教学不得写死"第二关解锁",须跟随表值动态适配 | Tuning Knobs / D5 |
| EC10 雾区覆盖全部非 0 安全格(极端参数) | 规则上合法、参数域上拒绝——最大雾占比须 < 全覆盖并被 BoardGenTable 参数校验拒绝(雾占比上限 × 可推理率下限联动不等式,可判定谓词形式);呈现注记:该构型下 0 格连锁仍会预开雾口袋(EC4),实际为"0 格岛 + 已开无字雾口袋 + 链不可达全价雾残段"的拼合,非"全图近无数字" | 验收⑩ |
| EC11 两个雾区相邻 | 规则上仍是两个独立布置实例(各有独立布置身份与独立 board_gen 取号);呈现合并为一片归 D1 渲染域,无规则歧义;定向粒度:counter_item_ids 是 variant 行级(类型级)字段——两实例共享同一 fog 行清单,实例级定向在现 schema 下不存在;若 A5 期需要实例级定向,走新字段(非本表 knob) | 验收⑪ / A5 期注记 |
## 依赖
**上游**:
| 系统 | 性质 | 接口要点 |
|---|---|---|
| D2 | hard | VariationTable schema 承载与 ConfigDB 读取(本 GDD 为该表回填 owner,8 字段 schema 见 Tuning Knobs 节);新字段走接口漂移规则 |
| A3 | 相邻契约 | 零运行时接口消费(Foundation 层;A3"地形成本修饰"价目钩子本 GDD 搁置——启用须回 A3 重议 per-cell 成本接口);预算注记在文档层引用 `ap_per_round` / `dig_ap_cost` 两值(数值节与 Tuning Knobs 跨 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——教学文案不得写死解锁关号) |
### 跨 GDD 义务清单(systems-index 门禁记录——对侧 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 图全局变异)由本节显式化,不与索引冲突。
## 呈现与 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 |
## Tuning Knobs
### VariationTable schema 定稿(D2 回写义务——本 GDD 为回填 owner)
| 字段 | 类型/范围 | 默认(fog 行) | knob | 说明 |
|---|---|---|---|---|
| variant_id | String(主键) | "fog" | ✗ | 变异标识;A1 候选池与 A2 查询的键 |
| display_name | String | "迷雾" | ✗ | 图例/教学用名(本地化归 D6) |
| unlock_level | int [1, 999] | 2 | ✓ | 首次可布置关卡序号(game-concept 解锁序列:普通数字→迷雾→岩浆/冰冻);本表为定义表(数值恒定)非进度成长表,键 = variant_id,进度语义承载于此列——D2 Rule 4 豁免,语义写入 schema 注释 |
| scope | enum {region, global} | region | ✗ | 作用域;global 仅预留枚举位(语义归 C3,MVP 不产生 global 行) |
| info_mask | enum {none, hide_numbers} | hide_numbers | ✗ | 信息规则:该变异隐藏什么;新信息规则走接口漂移 |
| cell_constraint | enum {any, safe_nonzero} | safe_nonzero | ✗ | 布置约束:允许落在什么格子上——Rule 3 承重规则的数据载体,A1 生成期强制执行 |
| biome_tag | StringList 可空 | [] | ✓ | 关联 biome 主题(AD 门禁换皮约束);空 = 全 biome 可用 |
| counter_item_ids | StringList 默认空 | [] | ✗ | 可穿透该变异的 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 |
## 开放问题
| # | 问题 | owner | 时机 |
|---|---|---|---|
| 1 | 雾面积/数量参数回填与 P1 验证:BoardGenTable 雾区域数/尺寸/占比默认值——须在厚度 ≤2(≡ 任意 3×3 窗口非全雾)/ f ≤ 8d 硬边界内定义,含最低雾出现率与降级率埋点口径;可推理率参数按雾边双向净效应建模;雾占比与可推理率的联动曲线(A1 的 P1 生成端保障核心 + 本 GDD 15 项验收的数值侧);占比参数双重身份:难度旋钮 × 情报旋钮——雾形携带雷簇位置信息(Rule 5 推理锚),占比/数量调参同时改变"雾 = 雷簇探测器"强度与首遇显著度(总占比/最大区域尺寸下限口径随 BoardGenTable 一并定,防首关雾低于注意阈值致 P4 解锁拍哑火) | A1 | 第 5 位 |
| 2 | 探测显影的时效与定价:EC6 留白——临时/永久显影、道具成本、counter_item_ids 首个回填 + 悬空引用校验补全(D2 条件性夹具义务兑现) | A5 | 第 11 位 |
| 3 | 创意风险 #1 的 B4 侧兑现:奖励预知的呈现方案(A4 侧切面已定——雾不额外隐藏内容);雾区奖励在效果当量对照表的落位——受三条定价硬约束(B4-①②③),成本口径按链不可达雾格计;①的 per-AP 平价与②③的定量谓词归 B4/B1 对账闭合 | B4 | 第 8 位 |
| 4 | scope=global 语义:精英/Boss 图全局变异的构成、施加时机、与零特判原则及 cell_constraint 覆盖的相容性重审(C3-1) | C3 | 第 12 位 |
| 5 | 岩浆/冰冻规则设计:变异框架的下一批居民、P3 雷险维度的承接者;需新字段时走接口漂移规则回写本 GDD 与 D2 | 垂直切片期 | 随关卡解锁建行 |
| 6 | 变异解锁曲线复核:"每关至少引入一个新元素"的推进节奏随 C3 难度曲线定稿复核;D5 教学动态适配表值(EC9),不写死解锁关号 | C3 + D5 | 低优先 |
| 7 | 标错惩罚与雾内旗:若惩罚上线,雾内旗恒受罚的一致性推论纳入实测观察项(EC5);EC5 推论在 A2 原型会话前置确认(防 D5 教学返工) | A2 前原型小补丁 | 联动 A3 OQ2 |
| 8 | 已开雾格 tint / 雾区全开完成信号的裁决:现处"验收候选"悬空态(本 OQ 登记终结悬空);裁决须同时覆盖——与 0 格的可判定区分(0 格 = "八邻无雷"推理信息,视觉混淆污染推理——tint 为当前唯一区分手段)与 EC11 合并呈现下的完成信号粒度(视觉合并域 = 信号单元,禁实例级双响) | D1 + CD | D1 GDD 前 |
## 版本历史
| 版本 | 日期 | 改动 |
|---|---|---|
| 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 |