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

65 KiB
Raw Blame History

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