From 03363a761b37ae821d5c77d9081e371eb90c2f56 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Mon, 14 Sep 2026 21:21:35 +0800 Subject: [PATCH] =?UTF-8?q?docs(gdd):=20=E5=BD=92=E6=A1=A3=E6=97=A7=20GDD?= =?UTF-8?q?=20=E4=BD=93=E7=B3=BB=E4=B8=BA=E5=8F=AA=E8=AF=BB=E5=8F=82?= =?UTF-8?q?=E8=80=83=EF=BC=8C=E5=BB=BA=E7=AB=8B=E5=BE=AA=E7=8E=AF=E5=BC=8F?= =?UTF-8?q?=E6=96=B0=E6=96=87=E6=A1=A3=E9=AA=A8=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLAUDE.md | 6 +- design/archive/gdd-2026-09-14/README.md | 5 + .../gdd-2026-09-14}/a1-board-generation.md | 0 .../gdd-2026-09-14}/a2-minesweeper-rules.md | 0 .../gdd-2026-09-14}/a3-action-economy.md | 0 .../gdd-2026-09-14}/a4-terrain-variation.md | 0 .../a5-minesweeper-aux-items.md | 0 .../analysis/a1-board-generation.md | 0 .../analysis/a2-minesweeper-rules.md | 0 .../analysis/a3-action-economy.md | 0 .../analysis/a4-terrain-variation.md | 0 .../analysis/a5-minesweeper-aux-items.md | 0 .../gdd-2026-09-14}/analysis/b1-settlement.md | 0 .../analysis/b2-enemy-system.md | 0 .../analysis/b3-status-effect.md | 0 .../analysis/b4-reward-item-economy.md | 0 .../analysis/c2-adventure-structure.md | 0 .../analysis/c3-difficulty-curve.md | 0 .../analysis/d1-hud-framework.md | 0 .../analysis/d2-data-config.md | 0 .../gdd-2026-09-14}/b1-settlement.md | 0 .../gdd-2026-09-14}/b2-enemy-system.md | 0 .../gdd-2026-09-14}/b3-status-effect.md | 0 .../gdd-2026-09-14}/b4-reward-item-economy.md | 0 .../gdd-2026-09-14}/c2-adventure-structure.md | 0 .../gdd-2026-09-14}/c3-difficulty-curve.md | 0 .../gdd-2026-09-14}/d1-hud-framework.md | 0 .../gdd-2026-09-14}/d2-data-config.md | 0 .../gdd-2026-09-14}/game-concept.md | 0 .../gdd-2026-09-14}/game-pillars.md | 0 .../gdd-cross-review-2026-09-14.md | 0 design/{gdd => archive/gdd-2026-09-14}/gdd.md | 0 .../reviews/a1-board-generation-review-log.md | 0 .../a2-minesweeper-rules-review-log.md | 0 .../reviews/a3-action-economy-review-log.md | 0 .../a4-terrain-variation-review-log.md | 0 .../a5-minesweeper-aux-items-review-log.md | 0 .../reviews/b1-settlement-review-log.md | 0 .../reviews/b2-enemy-system-review-log.md | 0 .../reviews/b3-status-effect-review-log.md | 0 .../b4-reward-item-economy-review-log.md | 0 .../c2-adventure-structure-review-log.md | 0 .../reviews/c3-difficulty-curve-review-log.md | 0 .../reviews/d1-hud-framework-review-log.md | 0 .../reviews/d2-data-config-review-log.md | 0 .../d2-data-config.pre-revision-2026-09-07.md | 0 ...l-reward-polarity-2026-09-13-review-log.md | 0 .../gdd-2026-09-14}/systems-index.md | 0 design/gdd/00-游戏概念.md | 3 + design/gdd/01-核心循环.md | 3 + design/gdd/02-系统清单.md | 58 ++ design/gdd/03-内容规模.md | 3 + design/gdd/04-美术音频方向.md | 3 + design/gdd/05-不做清单.md | 3 + .../legacy-2026-09-13/a1-board-generation.md | 416 -------- .../legacy-2026-09-13/a2-minesweeper-rules.md | 379 ------- .../legacy-2026-09-13/a3-action-economy.md | 220 ---- .../legacy-2026-09-13/a4-terrain-variation.md | 223 ----- design/gdd/legacy-2026-09-13/b1-settlement.md | 675 ------------- .../gdd/legacy-2026-09-13/b2-enemy-system.md | 354 ------- .../gdd/legacy-2026-09-13/b3-status-effect.md | 320 ------ .../b4-reward-item-economy.md | 395 -------- .../legacy-2026-09-13/c3-difficulty-curve.md | 284 ------ .../gdd/legacy-2026-09-13/d1-hud-framework.md | 375 ------- .../gdd/legacy-2026-09-13/d2-data-config.md | 274 ----- design/gdd/legacy-2026-09-13/game-concept.md | 153 --- design/gdd/legacy-2026-09-13/game-pillars.md | 29 - design/gdd/legacy-2026-09-13/systems-index.md | 284 ------ .../a1-board-generation.md | 681 ------------- .../a2-minesweeper-rules.md | 704 ------------- .../legacy-2026-09-14-v1/a3-action-economy.md | 455 --------- .../a4-terrain-variation.md | 517 ---------- .../a5-minesweeper-aux-items.md | 534 ---------- .../gdd/legacy-2026-09-14-v1/b1-settlement.md | 945 ------------------ .../legacy-2026-09-14-v1/b2-enemy-system.md | 605 ----------- .../legacy-2026-09-14-v1/b3-status-effect.md | 533 ---------- .../b4-reward-item-economy.md | 735 -------------- .../c2-adventure-structure.md | 316 ------ .../c3-difficulty-curve.md | 526 ---------- .../legacy-2026-09-14-v1/d1-hud-framework.md | 771 -------------- .../legacy-2026-09-14-v1/d2-data-config.md | 629 ------------ design/gdd/systems/冒险循环/元进度.md | 3 + design/gdd/systems/冒险循环/关卡节点地图.md | 3 + design/gdd/systems/冒险循环/冒险结构.md | 3 + design/gdd/systems/冒险循环/难度曲线与Boss.md | 3 + design/gdd/systems/战斗循环/增益状态.md | 3 + design/gdd/systems/战斗循环/奖励道具经济.md | 3 + design/gdd/systems/战斗循环/战斗结算.md | 3 + design/gdd/systems/战斗循环/战斗表现.md | 3 + design/gdd/systems/战斗循环/敌人系统.md | 3 + design/gdd/systems/排雷循环/地形变异.md | 3 + design/gdd/systems/排雷循环/排雷玩法.md | 3 + design/gdd/systems/排雷循环/棋盘生成.md | 3 + design/gdd/systems/排雷循环/行动经济.md | 3 + design/gdd/systems/排雷循环/辅助道具.md | 3 + design/gdd/systems/表现与支撑/HUD框架.md | 3 + design/gdd/systems/表现与支撑/存档序列化.md | 3 + design/gdd/systems/表现与支撑/教学引导.md | 3 + design/gdd/systems/表现与支撑/数据配置.md | 3 + design/gdd/systems/表现与支撑/设置与本地化.md | 3 + design/gdd/systems/表现与支撑/音频.md | 3 + production/session-state/active.md | 2 + 102 files changed, 143 insertions(+), 12335 deletions(-) create mode 100644 design/archive/gdd-2026-09-14/README.md rename design/{gdd => archive/gdd-2026-09-14}/a1-board-generation.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/a2-minesweeper-rules.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/a3-action-economy.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/a4-terrain-variation.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/a5-minesweeper-aux-items.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/analysis/a1-board-generation.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/analysis/a2-minesweeper-rules.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/analysis/a3-action-economy.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/analysis/a4-terrain-variation.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/analysis/a5-minesweeper-aux-items.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/analysis/b1-settlement.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/analysis/b2-enemy-system.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/analysis/b3-status-effect.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/analysis/b4-reward-item-economy.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/analysis/c2-adventure-structure.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/analysis/c3-difficulty-curve.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/analysis/d1-hud-framework.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/analysis/d2-data-config.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/b1-settlement.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/b2-enemy-system.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/b3-status-effect.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/b4-reward-item-economy.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/c2-adventure-structure.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/c3-difficulty-curve.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/d1-hud-framework.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/d2-data-config.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/game-concept.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/game-pillars.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/gdd-cross-review-2026-09-14.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/gdd.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/reviews/a1-board-generation-review-log.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/reviews/a2-minesweeper-rules-review-log.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/reviews/a3-action-economy-review-log.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/reviews/a4-terrain-variation-review-log.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/reviews/a5-minesweeper-aux-items-review-log.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/reviews/b1-settlement-review-log.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/reviews/b2-enemy-system-review-log.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/reviews/b3-status-effect-review-log.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/reviews/b4-reward-item-economy-review-log.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/reviews/c2-adventure-structure-review-log.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/reviews/c3-difficulty-curve-review-log.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/reviews/d1-hud-framework-review-log.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/reviews/d2-data-config-review-log.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/reviews/d2-data-config.pre-revision-2026-09-07.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/reviews/proposal-reward-polarity-2026-09-13-review-log.md (100%) rename design/{gdd => archive/gdd-2026-09-14}/systems-index.md (100%) create mode 100644 design/gdd/00-游戏概念.md create mode 100644 design/gdd/01-核心循环.md create mode 100644 design/gdd/02-系统清单.md create mode 100644 design/gdd/03-内容规模.md create mode 100644 design/gdd/04-美术音频方向.md create mode 100644 design/gdd/05-不做清单.md delete mode 100644 design/gdd/legacy-2026-09-13/a1-board-generation.md delete mode 100644 design/gdd/legacy-2026-09-13/a2-minesweeper-rules.md delete mode 100644 design/gdd/legacy-2026-09-13/a3-action-economy.md delete mode 100644 design/gdd/legacy-2026-09-13/a4-terrain-variation.md delete mode 100644 design/gdd/legacy-2026-09-13/b1-settlement.md delete mode 100644 design/gdd/legacy-2026-09-13/b2-enemy-system.md delete mode 100644 design/gdd/legacy-2026-09-13/b3-status-effect.md delete mode 100644 design/gdd/legacy-2026-09-13/b4-reward-item-economy.md delete mode 100644 design/gdd/legacy-2026-09-13/c3-difficulty-curve.md delete mode 100644 design/gdd/legacy-2026-09-13/d1-hud-framework.md delete mode 100644 design/gdd/legacy-2026-09-13/d2-data-config.md delete mode 100644 design/gdd/legacy-2026-09-13/game-concept.md delete mode 100644 design/gdd/legacy-2026-09-13/game-pillars.md delete mode 100644 design/gdd/legacy-2026-09-13/systems-index.md delete mode 100644 design/gdd/legacy-2026-09-14-v1/a1-board-generation.md delete mode 100644 design/gdd/legacy-2026-09-14-v1/a2-minesweeper-rules.md delete mode 100644 design/gdd/legacy-2026-09-14-v1/a3-action-economy.md delete mode 100644 design/gdd/legacy-2026-09-14-v1/a4-terrain-variation.md delete mode 100644 design/gdd/legacy-2026-09-14-v1/a5-minesweeper-aux-items.md delete mode 100644 design/gdd/legacy-2026-09-14-v1/b1-settlement.md delete mode 100644 design/gdd/legacy-2026-09-14-v1/b2-enemy-system.md delete mode 100644 design/gdd/legacy-2026-09-14-v1/b3-status-effect.md delete mode 100644 design/gdd/legacy-2026-09-14-v1/b4-reward-item-economy.md delete mode 100644 design/gdd/legacy-2026-09-14-v1/c2-adventure-structure.md delete mode 100644 design/gdd/legacy-2026-09-14-v1/c3-difficulty-curve.md delete mode 100644 design/gdd/legacy-2026-09-14-v1/d1-hud-framework.md delete mode 100644 design/gdd/legacy-2026-09-14-v1/d2-data-config.md create mode 100644 design/gdd/systems/冒险循环/元进度.md create mode 100644 design/gdd/systems/冒险循环/关卡节点地图.md create mode 100644 design/gdd/systems/冒险循环/冒险结构.md create mode 100644 design/gdd/systems/冒险循环/难度曲线与Boss.md create mode 100644 design/gdd/systems/战斗循环/增益状态.md create mode 100644 design/gdd/systems/战斗循环/奖励道具经济.md create mode 100644 design/gdd/systems/战斗循环/战斗结算.md create mode 100644 design/gdd/systems/战斗循环/战斗表现.md create mode 100644 design/gdd/systems/战斗循环/敌人系统.md create mode 100644 design/gdd/systems/排雷循环/地形变异.md create mode 100644 design/gdd/systems/排雷循环/排雷玩法.md create mode 100644 design/gdd/systems/排雷循环/棋盘生成.md create mode 100644 design/gdd/systems/排雷循环/行动经济.md create mode 100644 design/gdd/systems/排雷循环/辅助道具.md create mode 100644 design/gdd/systems/表现与支撑/HUD框架.md create mode 100644 design/gdd/systems/表现与支撑/存档序列化.md create mode 100644 design/gdd/systems/表现与支撑/教学引导.md create mode 100644 design/gdd/systems/表现与支撑/数据配置.md create mode 100644 design/gdd/systems/表现与支撑/设置与本地化.md create mode 100644 design/gdd/systems/表现与支撑/音频.md diff --git a/CLAUDE.md b/CLAUDE.md index 82c43895..a77614f4 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -16,9 +16,9 @@ ## Project Layout -- `design/gdd/` — 独立版入口 `gdd.md`(6 节讲清游戏:概念/循环/系统清单/规模/美术/不做清单——人类读者与 30 秒 pitch 的入口层,只导航不另立事实)+ 概念、支柱、系统索引、逐系统 GDD(lean 模板:`.claude/docs/templates/game-design-document.md`;2026-09-13 前的旧版全文备份在 `design/gdd/legacy-2026-09-13/`) -- `design/registry/entities.yaml` — 跨系统事实登记表(已锁数值;仅 owner GDD 可修订,冲突须显式提出) -- `design/gdd/reviews/` — design-review 日志(含 delta 复核清单) +- `design/gdd/` — 现行设计文档(2026-09-14 重建的循环式新骨架):6 份顶层文档(`00-游戏概念` / `01-核心循环` / `02-系统清单`〔根索引〕 / `03-内容规模` / `04-美术音频方向` / `05-不做清单`)+ `systems/` 按四个循环组织子系统文档(排雷循环 / 战斗循环 / 冒险循环 / 表现与支撑),子系统一律中文见名知意命名、不带编号前缀;文档增删必须同步 `02-系统清单.md` +- `design/archive/gdd-2026-09-14/` — 旧版 GDD 体系归档(只读参考,不再维护,不作事实引用) +- `design/registry/entities.yaml` — 跨系统事实登记表(已锁数值;仅 owner 文档可修订,冲突须显式提出) - `production/` — stage、session-state、gate-checks - `prototypes/` — `dungeon-sweeper-vertical-slice/` 垂直切片(概念 demo 已删除,验证报告留档 `docs/prototype-report-minesweeper-battle-concept.md`) diff --git a/design/archive/gdd-2026-09-14/README.md b/design/archive/gdd-2026-09-14/README.md new file mode 100644 index 00000000..1b1d5003 --- /dev/null +++ b/design/archive/gdd-2026-09-14/README.md @@ -0,0 +1,5 @@ +# 旧版 GDD 体系归档(2026-09-14) + +本目录是 2026-09-14 前的旧版 GDD 体系,已封存只读、不再维护。 +现行文档见 `design/gdd/`。 +已锁数值事实源以 `design/registry/entities.yaml` 与 `data/tables/` 为准,本目录不作事实引用。 diff --git a/design/gdd/a1-board-generation.md b/design/archive/gdd-2026-09-14/a1-board-generation.md similarity index 100% rename from design/gdd/a1-board-generation.md rename to design/archive/gdd-2026-09-14/a1-board-generation.md diff --git a/design/gdd/a2-minesweeper-rules.md b/design/archive/gdd-2026-09-14/a2-minesweeper-rules.md similarity index 100% rename from design/gdd/a2-minesweeper-rules.md rename to design/archive/gdd-2026-09-14/a2-minesweeper-rules.md diff --git a/design/gdd/a3-action-economy.md b/design/archive/gdd-2026-09-14/a3-action-economy.md similarity index 100% rename from design/gdd/a3-action-economy.md rename to design/archive/gdd-2026-09-14/a3-action-economy.md diff --git a/design/gdd/a4-terrain-variation.md b/design/archive/gdd-2026-09-14/a4-terrain-variation.md similarity index 100% rename from design/gdd/a4-terrain-variation.md rename to design/archive/gdd-2026-09-14/a4-terrain-variation.md diff --git a/design/gdd/a5-minesweeper-aux-items.md b/design/archive/gdd-2026-09-14/a5-minesweeper-aux-items.md similarity index 100% rename from design/gdd/a5-minesweeper-aux-items.md rename to design/archive/gdd-2026-09-14/a5-minesweeper-aux-items.md diff --git a/design/gdd/analysis/a1-board-generation.md b/design/archive/gdd-2026-09-14/analysis/a1-board-generation.md similarity index 100% rename from design/gdd/analysis/a1-board-generation.md rename to design/archive/gdd-2026-09-14/analysis/a1-board-generation.md diff --git a/design/gdd/analysis/a2-minesweeper-rules.md b/design/archive/gdd-2026-09-14/analysis/a2-minesweeper-rules.md similarity index 100% rename from design/gdd/analysis/a2-minesweeper-rules.md rename to design/archive/gdd-2026-09-14/analysis/a2-minesweeper-rules.md diff --git a/design/gdd/analysis/a3-action-economy.md b/design/archive/gdd-2026-09-14/analysis/a3-action-economy.md similarity index 100% rename from design/gdd/analysis/a3-action-economy.md rename to design/archive/gdd-2026-09-14/analysis/a3-action-economy.md diff --git a/design/gdd/analysis/a4-terrain-variation.md b/design/archive/gdd-2026-09-14/analysis/a4-terrain-variation.md similarity index 100% rename from design/gdd/analysis/a4-terrain-variation.md rename to design/archive/gdd-2026-09-14/analysis/a4-terrain-variation.md diff --git a/design/gdd/analysis/a5-minesweeper-aux-items.md b/design/archive/gdd-2026-09-14/analysis/a5-minesweeper-aux-items.md similarity index 100% rename from design/gdd/analysis/a5-minesweeper-aux-items.md rename to design/archive/gdd-2026-09-14/analysis/a5-minesweeper-aux-items.md diff --git a/design/gdd/analysis/b1-settlement.md b/design/archive/gdd-2026-09-14/analysis/b1-settlement.md similarity index 100% rename from design/gdd/analysis/b1-settlement.md rename to design/archive/gdd-2026-09-14/analysis/b1-settlement.md diff --git a/design/gdd/analysis/b2-enemy-system.md b/design/archive/gdd-2026-09-14/analysis/b2-enemy-system.md similarity index 100% rename from design/gdd/analysis/b2-enemy-system.md rename to design/archive/gdd-2026-09-14/analysis/b2-enemy-system.md diff --git a/design/gdd/analysis/b3-status-effect.md b/design/archive/gdd-2026-09-14/analysis/b3-status-effect.md similarity index 100% rename from design/gdd/analysis/b3-status-effect.md rename to design/archive/gdd-2026-09-14/analysis/b3-status-effect.md diff --git a/design/gdd/analysis/b4-reward-item-economy.md b/design/archive/gdd-2026-09-14/analysis/b4-reward-item-economy.md similarity index 100% rename from design/gdd/analysis/b4-reward-item-economy.md rename to design/archive/gdd-2026-09-14/analysis/b4-reward-item-economy.md diff --git a/design/gdd/analysis/c2-adventure-structure.md b/design/archive/gdd-2026-09-14/analysis/c2-adventure-structure.md similarity index 100% rename from design/gdd/analysis/c2-adventure-structure.md rename to design/archive/gdd-2026-09-14/analysis/c2-adventure-structure.md diff --git a/design/gdd/analysis/c3-difficulty-curve.md b/design/archive/gdd-2026-09-14/analysis/c3-difficulty-curve.md similarity index 100% rename from design/gdd/analysis/c3-difficulty-curve.md rename to design/archive/gdd-2026-09-14/analysis/c3-difficulty-curve.md diff --git a/design/gdd/analysis/d1-hud-framework.md b/design/archive/gdd-2026-09-14/analysis/d1-hud-framework.md similarity index 100% rename from design/gdd/analysis/d1-hud-framework.md rename to design/archive/gdd-2026-09-14/analysis/d1-hud-framework.md diff --git a/design/gdd/analysis/d2-data-config.md b/design/archive/gdd-2026-09-14/analysis/d2-data-config.md similarity index 100% rename from design/gdd/analysis/d2-data-config.md rename to design/archive/gdd-2026-09-14/analysis/d2-data-config.md diff --git a/design/gdd/b1-settlement.md b/design/archive/gdd-2026-09-14/b1-settlement.md similarity index 100% rename from design/gdd/b1-settlement.md rename to design/archive/gdd-2026-09-14/b1-settlement.md diff --git a/design/gdd/b2-enemy-system.md b/design/archive/gdd-2026-09-14/b2-enemy-system.md similarity index 100% rename from design/gdd/b2-enemy-system.md rename to design/archive/gdd-2026-09-14/b2-enemy-system.md diff --git a/design/gdd/b3-status-effect.md b/design/archive/gdd-2026-09-14/b3-status-effect.md similarity index 100% rename from design/gdd/b3-status-effect.md rename to design/archive/gdd-2026-09-14/b3-status-effect.md diff --git a/design/gdd/b4-reward-item-economy.md b/design/archive/gdd-2026-09-14/b4-reward-item-economy.md similarity index 100% rename from design/gdd/b4-reward-item-economy.md rename to design/archive/gdd-2026-09-14/b4-reward-item-economy.md diff --git a/design/gdd/c2-adventure-structure.md b/design/archive/gdd-2026-09-14/c2-adventure-structure.md similarity index 100% rename from design/gdd/c2-adventure-structure.md rename to design/archive/gdd-2026-09-14/c2-adventure-structure.md diff --git a/design/gdd/c3-difficulty-curve.md b/design/archive/gdd-2026-09-14/c3-difficulty-curve.md similarity index 100% rename from design/gdd/c3-difficulty-curve.md rename to design/archive/gdd-2026-09-14/c3-difficulty-curve.md diff --git a/design/gdd/d1-hud-framework.md b/design/archive/gdd-2026-09-14/d1-hud-framework.md similarity index 100% rename from design/gdd/d1-hud-framework.md rename to design/archive/gdd-2026-09-14/d1-hud-framework.md diff --git a/design/gdd/d2-data-config.md b/design/archive/gdd-2026-09-14/d2-data-config.md similarity index 100% rename from design/gdd/d2-data-config.md rename to design/archive/gdd-2026-09-14/d2-data-config.md diff --git a/design/gdd/game-concept.md b/design/archive/gdd-2026-09-14/game-concept.md similarity index 100% rename from design/gdd/game-concept.md rename to design/archive/gdd-2026-09-14/game-concept.md diff --git a/design/gdd/game-pillars.md b/design/archive/gdd-2026-09-14/game-pillars.md similarity index 100% rename from design/gdd/game-pillars.md rename to design/archive/gdd-2026-09-14/game-pillars.md diff --git a/design/gdd/gdd-cross-review-2026-09-14.md b/design/archive/gdd-2026-09-14/gdd-cross-review-2026-09-14.md similarity index 100% rename from design/gdd/gdd-cross-review-2026-09-14.md rename to design/archive/gdd-2026-09-14/gdd-cross-review-2026-09-14.md diff --git a/design/gdd/gdd.md b/design/archive/gdd-2026-09-14/gdd.md similarity index 100% rename from design/gdd/gdd.md rename to design/archive/gdd-2026-09-14/gdd.md diff --git a/design/gdd/reviews/a1-board-generation-review-log.md b/design/archive/gdd-2026-09-14/reviews/a1-board-generation-review-log.md similarity index 100% rename from design/gdd/reviews/a1-board-generation-review-log.md rename to design/archive/gdd-2026-09-14/reviews/a1-board-generation-review-log.md diff --git a/design/gdd/reviews/a2-minesweeper-rules-review-log.md b/design/archive/gdd-2026-09-14/reviews/a2-minesweeper-rules-review-log.md similarity index 100% rename from design/gdd/reviews/a2-minesweeper-rules-review-log.md rename to design/archive/gdd-2026-09-14/reviews/a2-minesweeper-rules-review-log.md diff --git a/design/gdd/reviews/a3-action-economy-review-log.md b/design/archive/gdd-2026-09-14/reviews/a3-action-economy-review-log.md similarity index 100% rename from design/gdd/reviews/a3-action-economy-review-log.md rename to design/archive/gdd-2026-09-14/reviews/a3-action-economy-review-log.md diff --git a/design/gdd/reviews/a4-terrain-variation-review-log.md b/design/archive/gdd-2026-09-14/reviews/a4-terrain-variation-review-log.md similarity index 100% rename from design/gdd/reviews/a4-terrain-variation-review-log.md rename to design/archive/gdd-2026-09-14/reviews/a4-terrain-variation-review-log.md diff --git a/design/gdd/reviews/a5-minesweeper-aux-items-review-log.md b/design/archive/gdd-2026-09-14/reviews/a5-minesweeper-aux-items-review-log.md similarity index 100% rename from design/gdd/reviews/a5-minesweeper-aux-items-review-log.md rename to design/archive/gdd-2026-09-14/reviews/a5-minesweeper-aux-items-review-log.md diff --git a/design/gdd/reviews/b1-settlement-review-log.md b/design/archive/gdd-2026-09-14/reviews/b1-settlement-review-log.md similarity index 100% rename from design/gdd/reviews/b1-settlement-review-log.md rename to design/archive/gdd-2026-09-14/reviews/b1-settlement-review-log.md diff --git a/design/gdd/reviews/b2-enemy-system-review-log.md b/design/archive/gdd-2026-09-14/reviews/b2-enemy-system-review-log.md similarity index 100% rename from design/gdd/reviews/b2-enemy-system-review-log.md rename to design/archive/gdd-2026-09-14/reviews/b2-enemy-system-review-log.md diff --git a/design/gdd/reviews/b3-status-effect-review-log.md b/design/archive/gdd-2026-09-14/reviews/b3-status-effect-review-log.md similarity index 100% rename from design/gdd/reviews/b3-status-effect-review-log.md rename to design/archive/gdd-2026-09-14/reviews/b3-status-effect-review-log.md diff --git a/design/gdd/reviews/b4-reward-item-economy-review-log.md b/design/archive/gdd-2026-09-14/reviews/b4-reward-item-economy-review-log.md similarity index 100% rename from design/gdd/reviews/b4-reward-item-economy-review-log.md rename to design/archive/gdd-2026-09-14/reviews/b4-reward-item-economy-review-log.md diff --git a/design/gdd/reviews/c2-adventure-structure-review-log.md b/design/archive/gdd-2026-09-14/reviews/c2-adventure-structure-review-log.md similarity index 100% rename from design/gdd/reviews/c2-adventure-structure-review-log.md rename to design/archive/gdd-2026-09-14/reviews/c2-adventure-structure-review-log.md diff --git a/design/gdd/reviews/c3-difficulty-curve-review-log.md b/design/archive/gdd-2026-09-14/reviews/c3-difficulty-curve-review-log.md similarity index 100% rename from design/gdd/reviews/c3-difficulty-curve-review-log.md rename to design/archive/gdd-2026-09-14/reviews/c3-difficulty-curve-review-log.md diff --git a/design/gdd/reviews/d1-hud-framework-review-log.md b/design/archive/gdd-2026-09-14/reviews/d1-hud-framework-review-log.md similarity index 100% rename from design/gdd/reviews/d1-hud-framework-review-log.md rename to design/archive/gdd-2026-09-14/reviews/d1-hud-framework-review-log.md diff --git a/design/gdd/reviews/d2-data-config-review-log.md b/design/archive/gdd-2026-09-14/reviews/d2-data-config-review-log.md similarity index 100% rename from design/gdd/reviews/d2-data-config-review-log.md rename to design/archive/gdd-2026-09-14/reviews/d2-data-config-review-log.md diff --git a/design/gdd/reviews/d2-data-config.pre-revision-2026-09-07.md b/design/archive/gdd-2026-09-14/reviews/d2-data-config.pre-revision-2026-09-07.md similarity index 100% rename from design/gdd/reviews/d2-data-config.pre-revision-2026-09-07.md rename to design/archive/gdd-2026-09-14/reviews/d2-data-config.pre-revision-2026-09-07.md diff --git a/design/gdd/reviews/proposal-reward-polarity-2026-09-13-review-log.md b/design/archive/gdd-2026-09-14/reviews/proposal-reward-polarity-2026-09-13-review-log.md similarity index 100% rename from design/gdd/reviews/proposal-reward-polarity-2026-09-13-review-log.md rename to design/archive/gdd-2026-09-14/reviews/proposal-reward-polarity-2026-09-13-review-log.md diff --git a/design/gdd/systems-index.md b/design/archive/gdd-2026-09-14/systems-index.md similarity index 100% rename from design/gdd/systems-index.md rename to design/archive/gdd-2026-09-14/systems-index.md diff --git a/design/gdd/00-游戏概念.md b/design/gdd/00-游戏概念.md new file mode 100644 index 00000000..c0e8c00b --- /dev/null +++ b/design/gdd/00-游戏概念.md @@ -0,0 +1,3 @@ +# 游戏概念 + +> 旧版参考:../archive/gdd-2026-09-14/game-concept.md diff --git a/design/gdd/01-核心循环.md b/design/gdd/01-核心循环.md new file mode 100644 index 00000000..e1e1254b --- /dev/null +++ b/design/gdd/01-核心循环.md @@ -0,0 +1,3 @@ +# 核心循环 + +> 旧版参考:../archive/gdd-2026-09-14/gdd.md diff --git a/design/gdd/02-系统清单.md b/design/gdd/02-系统清单.md new file mode 100644 index 00000000..0a258c04 --- /dev/null +++ b/design/gdd/02-系统清单.md @@ -0,0 +1,58 @@ +# 系统清单 + +本文件是新文档树的根索引:承载整棵树的形状与每个节点的一句话概要,读者靠本索引决定进入哪个节点。**文档增删必须同步本索引。** + +## 顶层文档 + +| 文档 | 管什么 | +|---|---| +| `00-游戏概念.md` | 一句话概念、目标受众、世界观命名、术语层级 | +| `01-核心循环.md` | 玩家醒来→做什么→得到什么→又想做什么,一条线讲清 | +| `02-系统清单.md` | 本文件:循环 × 子系统总表 + 文档树导航 | +| `03-内容规模.md` | 几个关卡、几种敌人、几种道具——做多少砍多少 | +| `04-美术音频方向.md` | 参考图、参考游戏、风格关键词 | +| `05-不做清单.md` | 明确写:这些我不要 | + +## systems/ 四个循环 + +### 排雷循环(`systems/排雷循环/`) + +| 文件 | 一句话概要 | +|---|---| +| `棋盘生成.md` | 棋盘怎么生成、怎么保证可推理可通关 | +| `排雷玩法.md` | 挖格、插旗、连锁展开等扫雷规则本体 | +| `行动经济.md` | 每轮行动点怎么花、停手与刷新的代价 | +| `地形变异.md` | 格子的非雾变异(岩浆/冰冻等,待定);**雾格已从设计中移除** | +| `辅助道具.md` | 扫雷侧辅助道具(显影、探测类) | + +### 战斗循环(`systems/战斗循环/`) + +| 文件 | 一句话概要 | +|---|---| +| `战斗结算.md` | 轮末结算的编排与逐行兑现 | +| `敌人系统.md` | 敌人数据、行为环、意图呈现 | +| `增益状态.md` | 增益/减益状态的容器、叠层与衰减 | +| `奖励道具经济.md` | 奖励产出、道具库存与使用窗口 | +| `战斗表现.md` | 战斗动画与演出(旧体系未单独成文) | + +### 冒险循环(`systems/冒险循环/`) + +| 文件 | 一句话概要 | +|---|---| +| `关卡节点地图.md` | 单关内的节点链与推进 | +| `冒险结构.md` | 整局冒险的关卡序列、失败与大奖励 | +| `难度曲线与Boss.md` | 难度曲线、期望值带与 Boss 设计 | +| `元进度.md` | 跨局成长(旧体系未单独成文) | + +### 表现与支撑(`systems/表现与支撑/`) + +| 文件 | 一句话概要 | +|---|---| +| `HUD框架.md` | 界面布局与呈现层契约 | +| `数据配置.md` | 数值表与单一事实源管线 | +| `存档序列化.md` | 存档契约与版本迁移 | +| `音频.md` | 音乐音效方向与实现 | +| `教学引导.md` | 新手教学与提示 | +| `设置与本地化.md` | 设置项与多语言 | + +> 旧版参考:`../archive/gdd-2026-09-14/systems-index.md` diff --git a/design/gdd/03-内容规模.md b/design/gdd/03-内容规模.md new file mode 100644 index 00000000..da301bad --- /dev/null +++ b/design/gdd/03-内容规模.md @@ -0,0 +1,3 @@ +# 内容规模 + +> 旧版参考:../archive/gdd-2026-09-14/gdd.md diff --git a/design/gdd/04-美术音频方向.md b/design/gdd/04-美术音频方向.md new file mode 100644 index 00000000..f6700408 --- /dev/null +++ b/design/gdd/04-美术音频方向.md @@ -0,0 +1,3 @@ +# 美术音频方向 + +> 旧版参考:../archive/gdd-2026-09-14/game-concept.md diff --git a/design/gdd/05-不做清单.md b/design/gdd/05-不做清单.md new file mode 100644 index 00000000..80833807 --- /dev/null +++ b/design/gdd/05-不做清单.md @@ -0,0 +1,3 @@ +# 不做清单 + +> 旧版参考:../archive/gdd-2026-09-14/gdd.md diff --git a/design/gdd/legacy-2026-09-13/a1-board-generation.md b/design/gdd/legacy-2026-09-13/a1-board-generation.md deleted file mode 100644 index 954b8c60..00000000 --- a/design/gdd/legacy-2026-09-13/a1-board-generation.md +++ /dev/null @@ -1,416 +0,0 @@ -# A1 扫雷棋盘生成(Board Generation) - -> **Status**: In Revision(2026-09-09 full /design-review:MAJOR REVISION NEEDED——8 blocking 同日修订【B1 P1 可推理率两项达标判据+target 绝对锚 · B2 AC-6(a) 改写 · B3 雷数取整+布雷语义钉死 · B4 F2≡Schema 合流 · B5 AC-11 前提腿 · B6 断言 B 收紧达成区占比 · B7 第三轴登记约定 · B8 F2c 成本闸+禁墙钟】+ cheap-now 包【σ 打包修复 · 注记③改口 · |U|÷|F| 删承诺 · monotone_in_depth+断言 E · EC5 玩家侧语义 · N≥1 零雷护栏】;用户拍板三决策:两项判据+限雾 0.25 / target 域 [0.85,1] / 第三轴登记约定+后门。日志:`design/gdd/reviews/a1-board-generation-review-log.md`)· 原 Designed(2026-09-08/09 一次会话定稿;lean 门禁:systems-designer 起草 Formulas〔F1–F5 + 三轴分离口径〕· qa-lead 起草/验证 AC〔19 条 + A4×15 逐项映射;"覆盖矩阵无洞"自称经 2026-09-09 评审修正为 5 处标注问题,见日志〕;CD-GDD-ALIGN 按 lean 跳过,生产前人工复核 Player Fantasy) -> **Author**: user + agents(systems-designer〔Formulas〕· qa-lead〔AC〕;四结构决策〔生成-验证循环 / 接受最优+零合法接受最不坏 / 推理域 single_subset 冻结 / 密度浮点〕与 F4 严格零红线为用户拍板) -> **Last Updated**: 2026-09-09 -> **Implements Pillar**: P1(主——可推理率生成端保障,"出题人义务")· P4(越下越险的难度物质)· P3(雾成本空间面,间接) -> **Layer**: 2 Core · **Milestone**: MVP · **设计顺序**: 第 5 位 - -## Overview - -A1 是**确定性棋盘生成器**:每当战斗编排需要一张新扫雷图,A1 从 `(level_index, node_depth)` 难度参数(BoardGenTable)出发,一次性生成完整棋盘——尺寸、雷的布设、初始 3×3 安全区及其展开可达域、以及(该关已解锁的)变异布置。全部随机取数只经 `board_gen` 流(scope = 每次生成新图),同种子同参数必产同图——可回放是生成侧的硬承诺。玩家永不看见生成器,但每一轮都在体验它的产物:**P1"我算对了"的生成端保障就落在这里**——可推理率最低门槛是 A1 的承重设计,保证出题人出的题在生成时刻就可解;玩家感受到的不是"生成算法",而是"连续挖掘不坠入纯赌局、雾区边界诚实、越深越险"的棋盘品质。 - -所有权边界:A1 拥有**生成算法与 BoardGenTable 回填**(D2 Rule 3,schema 先行数值回填的 A1 兑现);变异的**约束声明归 A4、生成期强制归 A1**(候选池门控、cell_constraint、出生区排除、厚度/占比硬边界——A4×15 验收清单的执行主体);挖掘执行归 A2、换图编排归 B1、难度曲线调参归 C3(C3 仅依赖 A1 的**配置 schema**——类型依赖,难度参数经编排器/D2 传递,禁止反向调用生成)。没有 A1,游戏没有难度轴(关卡×深度)、没有 P1 的源头保证、A4 的变异无布置载体、C3 的曲线无落点——它是 Core 层的地基,也是全项目验收债务最集中的系统(A4×15 清单 + 最小安全格数下限 + 链不可达占比生产者义务都在此落位)。 - -## Player Fantasy - -**间接承重**(Section A 定稿:玩家永不看见生成器,但每轮都在体验它的产物)。A1 的情绪目标一句话:**"这局能算"的底气**——玩家不知道生成器的存在,但每一次"我算对了"都踩在它铺的地基上。A1 不制造情绪,它制造情绪的**前提条件**: - -- **P1 的源头保证**:可推理率生成参数 = **出题人义务**——每张图在生成时刻就承诺"从初始安全区出发,逻辑可推导的挖掘占比不低于门槛"。玩家输给的是自己选的赌(雾区/终局盲猜),而不是不可解的局。这是 D2"公平可信"的玩法侧对偶:D2 保证同种子同结果(可复现),A1 保证同参数同品质(可推理)。 -- **P4 的难度物质**:越下越险不是文案,是 BoardGenTable 的 (level_index, node_depth) 两轴数据——雷密、尺寸、雾占比随深度爬升,"下探"的体感由生成参数直接雕刻。 -- **P3 的空间面**:雾区"里面有价值"的承诺由生成期布置约束兑现——雾区无雷、雾贴雷簇(A4 Rule 3 结构推论),玩家在洞口前的权衡是真实的信息权衡而非装饰。 - -参考感受:扫雷原版"每局必有解"的玩家信念(原版实际不保证——本作把这份信念变成生成端契约);Into the Breach 每张谜题可解的设计诚实。**反向护栏(裁剪判据)**:**"纯猜局"是 P1 的死亡体验**——生成端若让玩家频繁坠入不可推理局面,结算端再华丽也救不回掌控感;A1 的红线 = 生成参数使可推理率跌破门槛即为**阻塞缺陷**(验收红线,非调参建议)。 - -> 注:`creative-director` 未经咨询——Lean 模式(仅 D/H 两节委托专家),生产前请人工复核本节情绪定位。 - -## Detailed Design - -### Core Rules - -1. **五阶段确定性生成管线**:① **参数解析**(BoardGenTable 行,D2 R1 floor 解析)→ ② **布雷(取整与落位钉死——B3 修订 2026-09-09)**:雷数 N = `round(mine_density × (W×H − 9))`(先定数,9 = 出生 3×3 恒排除);落位 = 在"全格 − 出生 3×3"域经 board_gen 流均匀布雷后,计算 0 格 flood 闭包及外扩 1 环,**落在环内的雷移除(只减不增——"先布后删",不重投、无迭代、确定性终止)**;初始 3×3 及可达域内恒无雷;N ≥ 1 由加载期谓词保证(R3 修订——零雷板拒绝)。实际雷数 |M| ≤ N,漂移 = 环内移除量、入指标集观测→ ③ **变异布置**(先布雷后布雾——雾的 cell_constraint=safe_nonzero 要求雷先就位)→ ④ **生成-验证循环**(布雾完成后测可推理率——A4 要求的雾边双向净效应因此内生于测量;不达标重试)→ ⑤ **产出与上报**(棋盘 + 生成期指标)。五阶段顺序冻结;每阶段失败语义见 States 表。 -2. **可推理率定义(承重,P1)**:`inferability = 求解器确定性推导格数 ÷ 总安全格数`。推理器 = **单点规则 + 子集消减**(MVP 冻结此域——改域 = 改可推理率定义,走 GDD 修订非调参);模拟从初始展开后的可见状态出发,与玩家信息严格同步(未开格不可见、禁作弊读取雷位)。行参数 `inferability_target ∈ [0.85,1]`(B1 修订收窄——域下限即"纯猜局红线"的**绝对锚**可判定载体)是 P1 门槛的可判定形式;每图输出实际 inferability 与 inferability_core(剔除雾格后的可推理率,B1 修订——生成期指标,审计与批量断言的数据源)。 -3. **生成-验证循环与降级**:实测 inferability < target → 重试(同图种子实例内继续取数,**不重开 scope**——回放序列仍是 master_seed + scope 计数器的确定函数);上限 `max_gen_attempts` 次后**接受可推理率最高的尝试出图 + 强告警埋点**(用户定稿)——运行期不死锁、开发期暴露参数问题;降级率按 (level_index, node_depth) 埋点 + 调参期批量统计断言(A4 ⑭ 同款,红线:inferability < target 的图批量占比须为 0 或趋零,阈值与样本量本 GDD 定——见 Tuning Knobs)。 -4. **初始安全区与可达域**:3×3 无雷;可达域 = 从出生区经 0 格的 flood 闭包**外扩 1 格**(保守上界,任意 A2 展开定义的超集),生成期确定性计算(不依赖 A2 运行期行为);可达域内永无变异(A4 Rule 7);**A2 实际展开域 ⊆ A1 排除域**(A2 GDD 回验项)。 -5. **变异布置执行(A4 约束的执行侧)**:候选池门控(消费 `variant_pool_gate` 谓词)→ `cell_constraint` 生成期强制(雾格只落 8 邻含雷的非 0 安全格)→ 出生区及可达域排除 → **雾形硬边界**(厚度≤2【≡任意 3×3 窗口非全雾】/ f≤8×mine_density)→ 区域参数来自行参数(region_count / target_ratio);多变异选取消费 board_gen 流、**双实例布置身份与取号独立**(A4 EC11);布置无解 → 降级(跳过变异、产物合法无变异图、实际达成数按 shortfall 分级上报——A4 EC2 契约)。 -6. **board_gen 流纪律**:一次 `open_stream("board_gen")` = 一张图的全部取数(布雷/雾形/变异选取/重试共用该实例);流外零随机、`randomize()` 禁用(D2 Rule 5)。 -7. **清图预算构成(设计期聚合义务,A4 ⑤)**:雾致预算增量 = 链不可达雾格数 × `dig_ap_cost`(A3 价目,只读引用);生成期**计算并输出链不可达雾格占比**(B1 条款 5 对账输入的生产者义务);调参期聚合校验违例 = 修正行参数(非运行期强制)。 -8. **最小安全格数下限**:`min_safe_count`——安全格总数低于下限的参数组合在加载期参数域校验拒绝(A3 EC5 退化图刷清图奖励的钓鱼对冲;生成期产物不变式断言)。 -9. **biome 数据字段**:BoardGenTable 行携带 `board_biome`(StringSet **非空**,域校验致命——A4 ⑮);biome 挂行参数、**战斗域恒定**(同 (level,depth) 行的 biome 静态恒定——A3 OQ6 防钓鱼的结构保证,无逐图重掷接口存在)。 -10. **零特判产物 + 数值承载**:生成器不产生需要既有系统特判的棋盘(数字计数恒真、清图判定含雾格——A4 Rule 4 的产物侧兑现);BoardGenTable 为**首个进度键表回填**(键 (level_index, node_depth),depth-0 锚行前置——D2 Rule 4/6);A1 代码零字面量、读取经 ConfigDB。 - -### BoardGenTable Schema 定稿(D2 回写义务) - -| 字段 | 类型/范围 | knob | 说明 | -|---|---|---|---| -| board_width / board_height | int [8, 64] | ✓ | 图尺寸(MVP 量级护栏,非推导界) | -| mine_density | float (0, 0.5] | ✓ | 雷密度(尺寸解耦;f≤8d 分母对齐;上界为 MVP 护栏) | -| inferability_target | float [0, 1] | ✓ | **P1 门槛**——可推理率下限(承重 knob) | -| solver_rules | enum {single, single_subset} | ✗ 冻结 | 推理规则域(MVP 恒 single_subset——定义域非调参) | -| min_safe_count | int [1, 999] | ✓ | 最小安全格数下限(A3 EC5 对冲) | -| max_gen_attempts | int [1, 32] | ✓ | 生成-验证循环重试上限 | -| fog_region_count | int [0, 32] | ✓ | 雾区域数参数(0 = 本行无雾) | -| fog_target_ratio | float [0, 1) | ✓ | 雾面积占比参数(跨字段校验见下) | -| board_biome | StringSet 非空 | ✓ | 图类型标签(F1 输入前提;域校验致命) | - -**校验**:R1 键结构((level_index, node_depth) + depth-0 锚行,D2 既有);域校验全谱(inferability_target 域 [0.85,1]——B1 修订收窄,P1 绝对锚);**跨字段可判定谓词(A4 ⑩ 参数域化;本行 = F2 规范合取形的展开——B4 修订 2026-09-09:原三条款速记缺 count=0 ⇒ f=0 腿、在 (count=0, f>0) 角点上与 F2 答案相反,已废)**:`(fog_region_count = 0 ⇒ fog_target_ratio = 0)` ∧ `fog_region_count ≥ 1 ⇒ (0 < fog_target_ratio ≤ 8 × mine_density ∧ fog_target_ratio < 1 ∧ fog_target_ratio ≤ 0.25)`(f≤8d / 禁全覆盖 / **雾占比绝对上限 0.25——B1 修订:MVP 量级护栏非推导界,堵"极雾行以雾元知识撑满可推理率"的度量空心**);**布雷数下限(R3 修订)**:`round(mine_density × (W×H − 9)) ≥ 1`(零雷板拒绝);**min_safe 可行性谓词(F2b,2026-09-08 增补)**:`W×H − round(mine_density × (W×H − 9)) ≥ min_safe_count`(sound 保守、论证见 F2;计数可行 ≠ 连通可行,clearable 生成期闸不可互替);**成本可行性谓词(F2c,B8 修订)**:`max_gen_attempts × W × H ≤ 16384`(provisional 量级护栏,正式值归 OQ2 ADR;**运行期禁墙钟时间逃生——文本级契约**:耗时依赖输出即破同种子同图);**字段标记 `monotone_in_depth`(可选,非 knob——R2 修订)**:难度方向声明(size/density/target 类标记;fog_region_count 允许教学性非单调、不标),F4 断言 E 载体,只校验方向不校验数值、数值所有权仍归 C3——以上违规均加载期致命。 - -**第三轴落点登记(B7 修订 2026-09-09,用户拍板:登记约定 + 预留后门)**:game-concept 定稿难度 = f(关卡序号, 节点深度, **精英/Boss 修饰**),本表冻结键 (level_index, node_depth) 对第三轴的约定如下——① **Boss 图 = 各 level 最大深度(Dmax)行**:关底 Boss 恒为该关最后节点,Dmax 行即 Boss 行(线性关零成本表达);② **精英节点**:schema 预留 `elite_` / `boss_` 前缀字段命名空间(与 D2 DifficultyTable Rule 4 对称;本 GDD 不定义任何修饰数值、不预写修饰枚举);③ **C1/C3 定稿强制重审(OQ6)**:若节点形态使精英性无法由 (level_index, node_depth) 唯一确定(分支地图同深度并存精英与普通节点),走 D2 Rule 4 既有改键通道(接口漂移迁移)——迁移退路已在冻结当下登记,不再是无后门的死冻结。 - -### States and Transitions - -生成管线为无状态函数(每次调用独立、可重放)——五阶段失败语义: - -| 阶段 | 失败条件 | 语义 | -|---|---|---| -| 参数解析 | 行缺失(R1 保证有行)/ 参数域违例 | 加载期校验已拦(D2);运行期不失败 | -| 布雷 | N = 0(round(d×(W×H−9)) = 0——零雷板加载期拒绝,R3 修订:A3 EC5 钓鱼活体 + F4 全断言隐形穿越) | 运行期不失败(域内 N ≥ 1 恒可布;先布后删见 Core Rule 1②) | -| 变异布置 | cell_constraint 无解(连通分量不足——A4 EC2) | **静默降级**:跳过变异、产物合法、shortfall 上报(⑦⑬) | -| 验证循环 | 三分支(F5 验收算子):达标尝试存在 → **达标即出**(k*,非全局 argmax;达标 = F5 两项判据:inferability 与 inferability_core 各 ≥ target——B1 修订);attempts 用尽无达标但有合法 → **接受最优 + 强告警埋点**(Rule 3);attempts 用尽且**零合法** → **接受最不坏(确定性劣度字典序)+ 最高级告警 + 非法产物标记**(用户定稿 2026-09-08——玩家永不卡死,红线由 F4 断言 A′ 批量守) | -| 产出 | —— | 棋盘 + 八项指标集(实际 inferability【含 metric_version】 / inferability_core【剔除雾格后的可推理率,B1 修订】 / 实际雾占比【定式 = \|F\| ÷ (W×H)——与 mine_density 同分母族、f≤8d 口径自洽,qa-lead G3 补全 2026-09-09】 / 实际雷数与实际 \|S\|【B3 修订——先布后删漂移观测量,|M| ≤ N 断言载体】 / 链不可达占比 fog_burden_ratio / Δbudget_fog / attempts_used / 降级标记【含非法产物标记】) | - -### Interactions with Other Systems - -| 系统 | 方向 | 接口契约 | -|---|---|---| -| D2 | 双向 | BoardGenTable schema + 数值回填(本 GDD 义务,首个进度键表);R1 行解析;`board_gen` 流(换图时 open_stream 一次) | -| A4 | 执行主体 | **A4×15 验收清单逐项落位**(Dependencies 节全表引用,本文是 15 项的唯一执行落点);消费 VariationTable / variant_pool_gate | -| A2 | A1 → A2 | 棋盘产物(格状态 + 变异标记 + 出生区);初始展开执行归 A2(免费/计入清图/无奖励——A3 定);**A2 实际展开域 ⊆ A1 排除域**(A2 GDD 回验项);挖开上报携带变体标记(A2×4 之一) | -| B1 | 间接 | 换图编排为调用方(编排器经 B1 触发,B1 GDD 定接线);生成期指标输出 = 条款 5 对账输入(链不可达占比生产者义务) | -| C3 | 类型依赖 | BoardGenTable schema 消费方(曲线调参经 D2/编排器,禁反向调用生成——索引 C3←A1 方向说明);曲线导出工具(C3 期交付物)+ **A1 定稿前的临时抽查载体**(D2 OQ5 排期倒挂,本 GDD OQ 承接) | -| B4 | 间接 | board_biome = 图类型上下文(差异化插槽输入;行参数静态恒定——防钓鱼结构保证) | -| D1/B5 | 无直接 | 棋盘呈现归 D1/A2;biome 色板变体的数据源(AD 换皮) | - -## Formulas - -> systems-designer 代理起草(lean 门禁,2026-09-08;2026-09-09 full 评审 B1/B3/B4/B6/B8/R2/R4/R5 修订)。**口径总纲**:F1 度量**风险轴**(免赌开据占比 + 剔除雾格的第二判据)、F3 度量**成本轴**(AP 负担)、F2/F2b/F2c 守**参数域**(加载期可判定——F2c 成本上限为确定性死线,禁墙钟逃生)、F5 定**验收算子**(循环三分支 + 两项判据达标)、F4 守**批量红线**(调参期)——三轴分离,禁互相折算:雾板可推理率高而预算负担仍在,恰为两轴必须分开的理由。推理器与布置算法的实现选型不在本节(ADR 期事务),本节只定行为契约。 - -### F1 可推理率度量(inferability_measure) - -``` -inferability(B) = |R∞(B)| ÷ |S(B)| -inferability_core(B) = |R∞(B) ∖ F(B)| ÷ max(1, |S(B) ∖ F(B)|) ——剔除雾格后的可推理率(B1 修订 2026-09-09:防雾元知识单独撑满门槛) - -R₀ = 出生 3×3 ∪ (出生 3×3 经 0 格的 flood 闭包) ——生成期确定计算,剔除"外扩 1 格"环 -R∞ = R₀ 在下列两条闭包算子下的最小不动点: - ① 连锁:x ∈ R 且 x 为 0 格 ⇒ x 的 8 邻安全格全部入 R - (真实级联——雾格可被链开但不传播,A4 Rule 4) - ② 推导开据:c ∈ S∖R 且 c 与 R 8 邻接,且求解器在可见信息态上 - 能以合法信息源唯一判定 c 非雷 ⇒ c 入 R -合法信息源(穷尽枚举;新增信息源 = 改可推理率定义 = GDD 修订,非调参): - (a)数字约束——可见数字格上以冻结规则域 solver_rules(single_subset)推理 - (b)雾元知识——c 属于可见雾区 ⇒ c 非雷("雾区无雷"为玩家可见知识, - A4 Rule 3 / D5 教学义务——建模知情玩家,非作弊读取雷位) -``` - -**口径钉死注记(承重,Core Rule 2 的精确化)**:① Core Rule 2"确定性推导格数"钉死为**免赌确定揭示格数**——初始展开 ∪ 连锁揭示 ∪ 推导开据三通道全部计入分子。字面窄读(仅数字推导)会使任意好图远低于常规门槛,非立法本意。② **初始展开格计入分子与分母**(S 含初始格、R₀ ⊆ R∞)——与 P1 承诺语句"从初始安全区出发,逻辑可推导的挖掘占比不低于门槛"对齐。③ **雾格入分子的两通道(R5 修订改口——原"两通道全覆盖"在算子邻接要求下非定理:恒无 R 邻格的雾格不入分子)**:链可达雾格经算子①入分子;**与 R∞ 邻接的**链不可达雾格经信息源(b)入分子;恒无 R 邻格的雾格计入终局残余——与挖掘相邻性(A3 限 8 向相邻)口径对齐,公式本身不变。雾格挖掘是**零雷险**行为(玩家可见知识),故计入"免赌"口径;其 AP 全价代价不在此度量、由 F3 单独承载(两轴分离);"免赌 ≠ 可推理"的度量空心风险由第二达标判据(inferability_core,B1 修订)与 F2 雾占比绝对上限 0.25 合围。④ 求解器初始可见态取 **0 格 flood 闭包内芯**而非保守可达域全体("外扩 1 格"环非自动展开的必然产物,计入会高估玩家信息);须与 A2 立对偶回验:既有"A2 实际展开域 ⊆ A1 排除域"之外,新增"**A1 求解器初始态 ⊆ A2 实际初始展开域**"(度量保真回验,登记 A2 GDD;若 A2 定稿展开更小,回退口径 = 出生 3×3 最小态)。⑤ **次序无关性(度量不变式)**:两算子对 R 单调 ⇒ 最小不动点唯一、与开据次序无关——实现可任意定序而度量不变(行为契约,兼防一类实现方差 bug)。⑥ 每图指标输出携带 `metric_version`(当前 1)——防推理器实现漂移静默改定义(联动 F4 基线)。(B1 修订未动 R∞ 定义——度量口径不变、仅验收判据增列与指标集扩容,version 不跳变;未来改 R∞/信息源域则 version=2 + 向量重制。) - -**附带合法性不变式(clearable,新增)**: - -``` -clearable(B) :⇔ ∀c ∈ S:c 与出生 3×3 在"安全格 8 邻接图"上连通 -``` - -理由:inferability 门槛**不蕴含**可清图——终局对赌残余(拉低可推理率)与矿壳包围的不可达安全格(使 `cleared` 永不可达)是正交缺陷;1 个不可达格在 126 安全格的板上仅拉低 0.008,0.95 门槛照过,而该板是功能性残废。故清图可达性是**合法性**谓词(违规 = 尝试作废重试,非"接受最优"候选),与质量度量分属两闸(验收算子见 F5)。 - -**Variables:** - -| 变量 | 类型 | 范围 | 说明 | -|---|---|---|---| -| B | 棋盘实例 | —— | 一次尝试的产物(含雷布、雾布、出生区) | -| S(B) | 格集 | ⊆ 全格 | 安全格全集(分母;含雾格、含初始格、含不可达格) | -| F(B) | 格集 | ⊆ S | 雾格集(雾区无雷,由布置约束保证) | -| R₀ / R∞ | 格集 | R₀ ⊆ R∞ ⊆ S | 求解器初始可见态 / 免赌揭示闭包 | -| solver_rules | enum | {single_subset} 冻结 | 推理规则域(定义域非调参;信息源(a)的边界) | - -**Output Range:** inferability ∈ [0, 1]、inferability_core ∈ [0, 1](无雾板两值恒等)。正常域:合法产物下下界 ≥ 9/|S|。极端行为:`target = 1` 要求全图零非确定残余(小图高密下结构性难达——合法参数,由 F4 红线暴露、不加载期拒绝);`target < 0.85` 随 B1 域收窄加载期拒绝(原"`inferability_target = 0` 恒过"形态消失)。不可达安全格若存在则先触发 clearable 违例(合法性闸),不会以"拉低质量分"方式静默出图。 -**Example:** 12×12 图(144 格),mine_density=0.15 → N = round(0.15×135) = 20(B3 修订钉死口径;设环内移除 0,|M|=20)、S=124;雾 2 区共 9 格。R₀=21,全图 0 级联闭包 58(含 5 个链可达雾格);数字推导开据 51 + 雾元知识开据 4(链不可达雾格)+ 推导触发级联 8 = 63 → R∞=121;残余 3 格 = 一处终局非确定对 + 1 孤立残余格。inferability = 121/124 ≈ **0.976** ≥ target 0.95;inferability_core = (121−9)/(124−9) = 112/115 ≈ **0.974** ≥ 0.95 → 两项判据达标,attempts_used=1。 - -### F2 雾占比参数域谓词(fog_domain_ok)+ F2b min_safe 可行性谓词 + F2c 成本可行性谓词 - -``` -fog_domain_ok(r) :⇔ (r.fog_region_count = 0 ∧ r.fog_target_ratio = 0) - ∨ (r.fog_region_count ≥ 1 ∧ 0 < r.fog_target_ratio ≤ min(8 × r.mine_density, 0.25) - ∧ r.fog_target_ratio < 1) (0.25 = 雾占比绝对上限——B1 修订 2026-09-09) - -min_safe_feasible(r) :⇔ r.board_width × r.board_height - − round(r.mine_density × (r.board_width × r.board_height − 9)) - ≥ r.min_safe_count (9 = 出生 3×3 恒排除的下界;sound 保守) - -布雷数下限(R3 修订 2026-09-09):round(r.mine_density × (r.board_width × r.board_height − 9)) ≥ 1 - (零雷板拒绝——初始展开即 cleared 的 A3 EC5 钓鱼活体、标中旗经济恒空、F4 全断言隐形穿越) - -cost_feasible(r) :⇔ r.max_gen_attempts × r.board_width × r.board_height ≤ 16384 - (F2c——B8 修订 2026-09-09;C = 16384 为 provisional 量级护栏,正式值归 OQ2 ADR; - 运行期无墙钟时间逃生【文本级契约:耗时依赖输出即破同种子同图】,确定性死线必须加载期可判定) -``` - -**与 Schema 节既定校验的关系**:F2 是 Schema 节跨字段谓词的**规范化合取形**,等价(B4 修订 2026-09-09:原三条款速记缺 `fog_region_count = 0 ⇒ fog_target_ratio = 0` 腿,在 (count=0, f>0) 角点上与 F2 答案相反——Schema 节已改采本规范形消除分歧;该角点已入 AC-2 违例集)。**必要上界推导(边计数)**:每雾格 ≥1 条到非雾雷的邻接边 ⇒ 邻接边数 ≥ |F|;每雷 ≤ 8 邻 ⇒ |F| ≤ 8|M| ⇒ f ≤ 8d。**必要 ≠ 充分**:连通性缺口(雷膨胀皮肤碎裂,A4 EC2)不由本式判定,由静默降级 + F4 兜底。**F2b 为 Schema 校验行 delta(2026-09-08 本节同批回写)**——min_safe_count 原仅产物侧不变式(Rule 8),参数侧联合不可行域(小图×高密×高下限)现于加载期拦截;**sound 性论证(B3 修订补)**:N = round(d×(W×H−9)) 先定数、先布后删只减不增 ⇒ |M| ≤ N ⇒ |S| = W×H − |M| ≥ W×H − round(d×(W×H−9))——钉死 round 取整后恒成立(其他取整为非法实现)。**注记**:计数可行 ≠ 连通可行——clearable 生成期闸不可互替。违规均加载期致命。**F2 裁决边界注记(B1/B8 修订)**:下文"不加第三条跨字段校验"的裁决拒绝的是 *inferability 可行性* 静态联合谓词(无可判定静态界)——雾占比绝对上限 0.25(度量语义护栏)与 F2c 成本谓词(确定性成本死线)均有可判定形式且不声称预测 inferability,不在该裁决覆盖内。 - -**与 inferability_target 的联合可行域——裁决:不加第三条跨字段校验。** 理由:① **无可判定静态界**——inferability 由 0 格拓扑、雾形、出生位置主导,聚合参数不决定它,任何 sound 加载期联合谓词要么空洞要么误杀;② 架构既定——暴露机制就是"运行期接受最优不死锁 + 强告警埋点 + 调参期批量断言",第三闸重复且更弱;③ **补偿保证(与 F4 绑定生效)**:F4 红线 + 降级率埋点使联合不可行域在首次批量生成时必然现形。**回写义务(advisory,非校验)**:Tuning Knobs 注记——target、fog_target_ratio、mine_density 同向调高时降级率**结构性**上行,属参数域边界而非实现缺陷。 - -**Output Range:** bool,加载期判定;违规 = 致命(D2 Rule 6 通道)。极端:d=0.5 时 8d=4,`f<1` 成为绑定约束;d→0 时几乎任何正 f 均被拒——小雾量在稀雷图结构性不可布,属正确拒绝;f > 0.25 恒拒(B1 上限腿,与 d 无关);attempts×W×H > 16384 恒拒(F2c,B8)。 -**Example:** (d=0.15, f*=0.12, count=2) ✓ 放行;(d=0.06, f*=0.50):0.50 > 0.48 ✗ 致命;(count=3, f*=0) 一致性腿 ✗;(count=0, f*=0) ✓(level 1 无雾行标准形);(count=0, f*=0.05) ✗ 致命(count=0 ⇒ f=0 腿——B4 修订角点,原三条款速记误放行);(d=0.15, f*=0.85, count=32) ✗ 致命(0.85 > 0.25 雾占比绝对上限——B1 修订,极雾行加载期判死)。F2b:10×10、d=0.10、min_safe=50 → 100 − round(0.10×91) = 91 ≥ 50 ✓。F2c:10×10×16 = 1600 ✓、12×12×16 = 2304 ✓、64×64×32 = 131072 ✗ 致命(B8——该组合原可合法入库,GDScript 估算换图相位同步卡顿秒级至百秒级)。 - -### F3 清图预算增量构成(fog_budget_increment) - -``` -U(B) = F(B) ∖ Chain₀(B) Chain₀(B) = R₀ 经算子①(0 格级联)单独闭包的可达集 -Δbudget_fog(B) = |U(B)| × dig_ap_cost (量纲闭合:格 × AP/格) -fog_burden_ratio(B) = |U(B)| ÷ max(1, |S(B) ∖ Chain₀(B)|) -``` - -**口径钉死注记**:① A4 排除声明与 A1 Rule 7 所称"链不可达雾格占比"的 **B1 条款 5 对账精确口径 = fog_burden_ratio**(付费格分母——雾在最小清图 AP 负担中的权重);雾内部分母版本 |U|/|F| **不单列输出**——可由指标集(实际雾占比 + Chain₀/U 重算)按需还原〔R9 修订:原"仅作调参诊断附输出"承诺零落点,删承诺〕,不作对账输入。② 分母 = |S ∖ Chain₀| = 最小清图付费挖掘格数(初始展开与连锁免费、其余每格 dig_ap_cost——A3 价目只读引用),分母下限 1 防全连锁退化板除零。③ 链可达性取决于未开 0 格隐藏拓扑,玩家决策时点不可求值——本式是**生成期**事后度量(A4"玩家侧按全价做预算"的保守启发式不与本式冲突,两口径服务不同主体)。**聚合义务(A4 ⑤ 公式化)**:逐板计算入指标集;调参期按行批量聚合出核算报告供 C3 修正行参数。**无运行期强制**;A1 只拥有**量**的计算与输出,不拥有"够不够"的判(归 A1/A3 契约与 C3)。 - -**Variables:** - -| 变量 | 类型 | 范围 | 说明 | -|---|---|---|---| -| U(B) | 格集 | ⊆ F | 链不可达雾格集(全价段) | -| Chain₀(B) | 格集 | R₀ ⊆ Chain₀ ⊆ S | 纯 0 级联可达集(免费段,含初始展开) | -| dig_ap_cost | int [1,8] | 当前 1 | A3 价目,只读引用(knob 归 A3) | - -**Output Range:** Δbudget_fog ∈ [0, |F| × dig_ap_cost];fog_burden_ratio ∈ [0, 1]。fog_region_count=0 → 两值恒 0。极端:U=F(雾区全部链不可达)→ 雾板退化为纯 AP 税——A4 反向护栏与 B4 定价约束③的观测对象;U=∅(雾全链免开)→ 雾零成本——B4"糖果区"病理在此指标上直接现形。 -**Example:** F1 例板:F=9、链可达雾 5 → U=4;dig_ap_cost=1 → **Δbudget_fog = 4 AP**;付费格 = 124 − 58 = 66 → **fog_burden_ratio ≈ 0.061**。 - -### F4 批量统计断言(batch_statistical_assertions,调参期离线) - -``` -批量域 = BoardGenTable 全部行键 (L, D)(R1 floor 解析保证任意请求点归行) -批(L,D) = { generate(L, D, derive_at("board_gen", σ(L,D) + i)) : i ∈ [0, N) } - (derive_at 纯函数、不推运行期计数器;σ 基址清单入版本库,批量跨迭代可复现) - -断言 A(可推理率红线,用户定稿):∀行:|{ b : inferability(b) < target行 ∨ inferability_core(b) < target行 }| = 0 ——严格零(B1 修订:两项判据批量对照) -断言 A″(target 绝对下限,B1 修订 2026-09-09):∀行:target行 ≥ 0.85(provisional 锚——加载期域 [0.85,1] 之外的调参期兜底) -断言 A′(非法产物零容忍,F5 配套):∀行:|{ b : 非法产物标记 }| = 0 -断言 B(雾出现下限 + 降级率上限,仅 count ≥ 1 行):实际达成区数 = fog_region_count 的板占比 ≥ 0.95(B6 修订收紧——原"含雾板占比 ≥ 0.95"对部分达成 shortfall 失明〔count=2 全板只达成 1 区时原式满分〕;收紧后一并承载 A4⑭"出现率下限/降级率上限"两件套) -断言 E(难度方向 advisory,R2 修订):对 schema 标记 monotone_in_depth 的字段,同 level 沿 depth 弱递增——违例 warning 级开火(不拦合法呼吸位设计,调参期人工复核) -断言 B′(反向断言,仅 count = 0 行):含雾板数 = 0(门控泄漏 = bug 信号,转 bug 流程非调参) -报告 C:按行 p10/p50/p90(实际 inferability)、p50/p90(Δbudget_fog 与 fog_burden_ratio) - ——p10 供 B1 条款 3 对账(消费 actuals 分布而非 target 参数) -诊断 D(非断言):重试率(attempts_used ≥ 2 占比)、attempts_used 均值、EC2 shortfall 分级分布 - -MVP 默认:N = 256/行;σ(L,D) = 10^9 + 2^20·L + 2^12·D(R4 修订:原 1000·L+D 打包在 D≥1000 时精确碰撞〔(1,1001) ≡ (2,1)〕且同 L 相邻深度行批量区间 255/256 种子重叠;新打包使行区间 [σ, σ+255] 两两不交;远离运行期取号域不变。登记种子按失效协议全部重搜——夹具 σ 为登记时值) -``` - -**阈值裁定理由**:① **红线严格零**(用户定稿):A1 反向护栏已定"跌破门槛 = 阻塞缺陷"——任何一例失败即触发参数修正会话,迫使决策显式化;运行期"接受最优/最不坏"是安全网,批量红线是调参期纪律。② **N=256**:95% 下限的稳定通过要求真实出现率 ≥ 0.98(3σ 余量 ≈ 99.97%)。③ **雾出现下限 0.95 而非 1.0**:EC2 连通性降级是合法运气事件,5% 容差容纳自然方差;系统性病理(level 2 小图低密关雾成片失败)呈现 ~0% 出现率,与 0.95 相距悬殊,检出无歧义。(B6 修订:断言 B 收紧为达成区占比后,本容差同时容纳完全降级与部分达成两类合法运气事件。)④ 断言 B′ 零成本反向杠杆:门控 bug(如 level 1 出雾)一例即现形。⑤ 成本:行数 × 256 板 × ≤32 attempts 的生成+求解模拟,离线分钟级(成立域 = worklist 级求解实现 ∧ 大面积行稀少;naive 全板扫描实现 + 数行 48×64 板即小时级——B8 修订条件化,分片续跑义务见 OQ2)。 - -**Variables:** - -| 变量 | 类型 | 范围 | 说明 | -|---|---|---|---| -| N | int | 256(MVP 默认) | 每行批量样本量 | -| σ(L,D) | int | ≥0 | 批量种子基址(版本库清单) | -| target行 | float [0,1] | 行读值 | 该行 inferability_target(期望由表值推导,不写死) | - -**Output Range:** 各断言 bool;报告 C 为数值表。极端:target 1.0 的行在断言 A 下大概率开火(合法、预期信号);断言 B′ 失败即实现缺陷而非参数问题。 -**Example:** 行 (2,0)(fog unlock 关)N=256:inferability 两项判据达标 256/256 → A 通过;达成区数 = count 的板 251/256 = 0.980 ≥ 0.95 → B 通过;重试率 3.1% → 诊断记录。行 (3,2) 达成区数 = count 的板 220/256 = 0.859 < 0.95 → B 失败 → 修正行参数(区域数/尺寸/密度侧保证,禁放宽 A4 Rule 3)。 - -### F5 生成-验证验收算子(attempt_acceptance) - -``` -合法尝试集 Lm = { B_k : legality(B_k), 1 ≤ k ≤ max_gen_attempts } -legality(B) :⇔ clearable(B) ∧ ( |S(B)| ≥ min_safe_count ) - ∧ 结构不变式全过(雾约束 cell_constraint / 出生区及可达域排除 / - 厚度≤2【任意 3×3 窗口非全雾】/ f≤8d / 数字计数恒真 / 初始展开不触雾) - -B_out = B_{k*},k* = min{ k : B_k ∈ Lm ∧ inferability(B_k) ≥ target ∧ inferability_core(B_k) ≥ target }(达标须两项判据同时满足——B1 修订:剔除雾格判据防止"雾区无雷"知识单独撑线) - (达标即出、非全局 argmax——重试语义的自然形式化) -若 k* 不存在且 Lm ≠ ∅:B_out = B_{k**},k** = min{ k : inferability(B_k) = max_{j∈Lm} inferability(B_j) } - + 强告警埋点 + 降级标记(tie 取最早,零额外取数) -若 Lm = ∅(attempts 耗尽零合法):接受最不坏尝试出图(用户定稿 2026-09-08)——确定性劣度字典序 - k*** = min{ k : (不可达安全格数, max(0, min_safe_count − |S(B_k)|), k) 字典序最小 } - + 最高级告警 + 非法产物标记(玩家永不卡死;批量红线由 F4 断言 A′ 守) -``` - -**注记**:① 全部尝试共用同一 board_gen 流实例(Rule 3/6),k*、k**、k*** 与 B_out 同为流取数的确定函数——回放语义闭合。**scope 事件边界操作定义 = 生成函数完整返回**(重试不产生新取号)——D3 快照切点天然落在边界外(D2"消费侧遵守"条款的 A1 具体化);**生成期表值单次读取**(行参数在生成开始时快照,生成期内不重读——防热重载撕裂 attempt 语义,A4 EC8 同族)。② 合法性闸(clearable/min_safe)在质量评分**之前**:不可清图产物不进入"接受最优"候选——否则质量分会掩盖功能残废。③ "接受最不坏"分支的确定性劣度 = (不可达安全格数, min_safe 缺口, 序号) 字典序——零额外取数、可重放。④ B1 编排不得把 attempt 边界当 scope 事件(登记 B1 接线注记)。 - -### 显式排除声明(R4 式) - -本 GDD **无平衡曲线公式**。BoardGenTable 每行数值(尺寸/密度/门槛/雾参数的具体取值及其随 (level_index, node_depth) 的曲线)归 **C3 调参**(经 D2 R1 解析/编排器传递,禁反向调用生成);A1 只拥有 schema 域、跨字段可判定谓词(F2/F2b/F2c)、生成算法行为契约与度量口径(F1/F3/F5)。逐项排除清单: - -- **每行难度数值与曲线** → C3(含 max_gen_attempts 取值策略)。本 GDD 的 MVP 参考行仅为 schema 自洽性证明,非平衡事实、非回填默认值。 -- **挖掘风险不等式**(A3 F1 条款 3)→ **B1 单一闭合对账 owner**。A1 义务止于供给锚值 = **actuals 分布(F4 报告 C 的 p10)而非 target 参数**。措辞登记(registry 级,防口径漂移):"inferability 是盘面级免赌占比(生成侧);P(安全) 是单格认知概率(决策侧、经济口径)——免赌集内 P(安全) 恒 = 1(含雾格),风险讨论收缩到残余集(其安全格占比 ≤ 1 − inferability)。inferability 是 P(安全) 的**生成端结构性上界代理之占比形式**,不是 P(安全) 本身。" -- **弃图支配性**(条款 5)→ **B1 闭合**。A1 供给锚值 = 实际 inferability 分布 + fog_burden_ratio(生产者义务);两态验算与两条方向性护栏归 B1/B4。 -- **清图总预算可用量与全量校验判据** → A1/A3 契约(A4 排除声明既定);A1 只算**量**(F3),不拥有"够不够"的判。 -- **推理器实现**(single_subset 具体规则集、数据结构、传播算法)与**布置算法** → ADR 期事务;GDD 只冻结行为契约(合法信息源穷举、禁作弊读取、次序无关性、规则域枚举冻结、metric_version)。 -- **战斗侧 / 奖励定价 / biome 词表** → B1/B2/B3/B4/C1/D1 域;A1 的 board_biome 仅是非空 StringSet 数据字段。 - -### MVP 参考行(provisional——仅 schema 自洽性证明,C3 持调参所有权) - -| 字段 | L1·D0 参考行 | L2·D0 形状校验行 | -|---|---|---| -| board_width / board_height | 10 / 10 | 12 / 12 | -| mine_density | 0.10 | 0.12 | -| inferability_target | 0.95 | 0.92 | -| solver_rules | single_subset(冻结) | 同左 | -| min_safe_count | 50 | 60 | -| max_gen_attempts | 16 | 16 | -| fog_region_count / fog_target_ratio | 0 / 0(level 1 候选池空标准形——A4 F1) | 1 / 0.10(≤8×0.12 ✓——F4 断言 B 首个真实考验行) | -| board_biome | {"dungeon"}(词表 owner 未定稿,仅占位) | 同左 | - -自洽性验证:F2/F2b/F2c 全过(10×10×16 = 1600、12×12×16 = 2304 ≤ 16384);期望 |S| ≈ 91、R₀ ≈ 12–20 → inferability 期望 ≥ 0.95(L1 无雾 ⇒ core ≡ inferability;L2 雾 ~14/144 格、core 判据轻度收窄仍期望 ≥ 0.92——两项判据同时达标,B1 修订;attempts_used ≈ 1,F4 全绿理论位形)。 - -## Edge Cases - -- **EC1 If 候选池为空**(雾未解锁如 level 1,或 biome_tag 全不匹配):静默布置无变异图——空池合法非错误(A4 EC1/F1 的 A1 执行语义;参考行 L1 即此形态)。 -- **EC2 If cell_constraint 无解**(非 0 安全格面积或**连通分量尺寸**不足——A4 EC2 判据含连通性):本次布置尝试失败 → 跳过变异、产物为合法无变异图;BoardGenTable 要求 N 区而实际达成 k 0.25 加载期拒绝(F2 雾占比绝对上限腿,B1 修订)** | 雾存在感弱、P4 推进感哑火 | -| board_biome | {"dungeon"} | ——(词表 owner 未定稿,暂只校验非空) | —— | - -- **非 knob(结构冻结)**:solver_rules(定义域)、键结构与 depth-0 锚(第三轴登记约定见 Schema 节——B7:Boss=Dmax 行约定 + elite_/boss_ 命名空间预留 + OQ6 重审门)、五阶段顺序、合法信息源穷举枚举、F4 断言 A/A′ 严格零阈值(用户定稿——改阈值走 GDD 修订)、先布雷后布雾顺序、attempt 边界 = scope 事件边界、target 域下限 0.85 / 雾占比上限 0.25 / F2c 常数 16384(provisional 量级护栏——调整走 GDD 修订非调参,B1/B8 修订)。 -- **工具参数(登记默认非玩法 knob)**:N=256/行、σ 基址公式(版本库清单)。 -- **Knob 交互**:density × fog_target_ratio 同向调高 → 降级率结构性上行(F2 advisory);target × density 联合可行域无静态闸(F2 裁决,F4 兜底);尺寸 × min_safe 联合(F2b)。**跨 GDD 引用**:`ap_per_round`/`dig_ap_cost` 归 A3、`unlock_level`/`cell_constraint` 归 A4——禁止两表间复制参数(D2 Rule 1)。 - -## Visual/Audio Requirements - -A1 无自有渲染面——视觉义务是**数据供给规格**,呈现归 D1/A2/B5: - -1. **biome/tag = 换皮数据锚**(AD 门禁,game-concept 视觉锚 4):BoardGenTable.board_biome 与产物携带的 biome 标签是新 biome 色板变体的唯一数据源——新 biome 不新增资产只换色板,前提是 A1 产物正确携带标签。 -2. **变异格标记保真**:产物的雾格标记是 D1"边界可见"呈现(A4 D1 行规格)与"已开雾格 = 地板无字"的数据前提——标记错误即呈现欺骗(P1 诚实边界的生成侧根基)。 -3. **雾区连通域信息**:EC6 双雾区呈现合并归 D1 渲染域,A1 只保证实例身份与取号独立(AC-14),不保证视觉分离——D1 侧规格不受 A1 约束。 -4. **数字可读性的生成侧前提**:数字 = 8 邻雷数恒真(AC-6(g) 断言)——数字可信是"数字可读性"样张测试(game-concept 风险 #1)的逻辑前提。 - -无音频需求。 - -> 注:`art-director` 未经咨询——Lean 模式,生产前请人工复核本节与 art-bible 的一致性。 - -## UI Requirements - -A1 不拥有 UI。呈现义务全部经下游:棋盘渲染与开格反馈归 A2/D1、雾纹理规格归 A4 D1 行、生成期指标不面向玩家(遥测/审计域)。无 HUD 常显字段、无结算面——玩家对 A1 的全部感知都经"棋盘本体"。 - -## Acceptance Criteria - -> **测试载体与口径声明**:A1 是生成函数系统——冒烟载体 = `godot --headless --script`(承 D2 冒烟框架;脚本 extends SceneTree、autoload 显式实例化)。**被测函数面**:`generate(level_index, node_depth, rng) -> Board`(+ 生成期指标集);**度量独立入口(qa-lead 裁决,分解面声明)**:推理器(R∞/inferability/metric_version)、F3 度量(Chain₀/U/Δbudget_fog/fog_burden_ratio)、合法性谓词(legality/clearable)以**独立纯函数入口**暴露——生成函数内嵌调用与独立入口**同一实现**,独立入口不引入新逻辑、仅暴露 F1/F3/F5 已定义的函数;独立入口的行为断言即内嵌调用的行为(次序无关性、防作弊等白盒性质测试以此为载体;若实现期 ADR 裁决推理器不可独立调用,AC-7/8/9/12 的单元腿须降级重议——登记缺口 G1,门禁评审列为 A1 实现契约条款)。**只读观测量**:产物格状态(雷布/数字/0 格/雾区标记/出生区)+ 八项指标(实际 inferability【含 metric_version】/inferability_core【B1 修订】/实际雾占比【= |F| ÷ (W×H)】/实际雷数与实际 |S|【B3 修订】/fog_burden_ratio/Δbudget_fog/attempts_used/降级标记【含非法产物标记与 shortfall】)。**测试种子取号**:经 `derive_at("board_gen", σ)` 纯函数(D2 R2 预览语义的测试侧合法用途,不推运行期计数器);测试脚本以该种子构造流实例属测试通道合法动作(AC-18 扫描豁免域);运行期 replay 语义(open_stream 全真路径)另测(AC-5)。 -> -> **夹具策略(裁决)**:默认根 = **MVP 参考行 L1·D0 / L2·D0**(干净检出)——参考行是 GDD 定稿的 schema 自洽性证明行,期望全部由表读值推导,对 C3 调参免疫;行为变体经 `--data-root` 夹具根注入(禁拷入 `data/tables/`),黄金图板与病态板经 Board class_name 直引**程序构造**(不经生成器、不经 load()/preload()——A4 AC-5 先例)。夹具规格登记: -> -> | 夹具根 | 内容(F2/F2b 均过,除违例根外) | 用途 | -> |---|---|---| -> | `a1_fog_domain` | f>8d 违例行 | AC-2/3(致命) | -> | `a1_min_safe` | 10×10/d=0.10/min_safe=92(F2b 违例:100−round(0.10×91)=91<92) | AC-2/3(致命) | -> | `a1_biome_empty` | board_biome=∅ 行(A4⑮) | AC-2/3(致命) | -> | `a1_pool_empty` | VariationTable 测试行(biome_tag=[ice]、unlock_level=1,承 A4 `variation_biome_tag` 同型)+ BoardGenTable 两行:(1,0) board_biome={dungeon}(pool=∅)/ (1,1) board_biome={dungeon,ice}(pool 非空) | AC-13 | -> | `a1_high_target@k` | 12×12/d=0.12/target=1.0/fog=1 区 0.05/min_safe=60/attempts=k∈{1,2} | AC-5/11 | -> | `a1_ec5@k` | 10×10/d=0.45/min_safe=1/target=0.85(B1 域收窄后合法档——原 target=0 已越域)/fog=0/attempts=k∈{1,2,8,16};σ* 登记(@1 零合法验证种子) | AC-12 | -> | `a1_two_regions` | 10×10/d=0.15/count=2/f=0.12/target=0.85/attempts=16;σ 登记 | AC-14 | -> | `a1_ec2_press` | f := 8×d 计算值恰界行(程序内动态赋值);σ*′ 登记(shortfall>0 搜索种子) | AC-15 | -> -> 登记种子(σ 值)依赖管线确定性:一经验证恒成立;实现或定义变更致失效 → 按失效协议重搜并登记(与黄金向量失效协议同源)。 -> -> **黄金图回归向量协议(D2 R2 先例同源)**:五类手工核验小板,每板 = **显式坐标规格**(尺寸/雷集/雾区格集/出生 3×3,程序构造不经生成器)+ **登记常数**((|R∞|,|S|) 整数对、**含雾板另登记 (|R∞∖F|, |S∖F|) core 整数对——B1 修订,由既有坐标规格派生、向量不重制**、关键格 R∞ 成员表、clearable、Chain₀/U 格集、Δbudget_fog、fog_burden_ratio 比对形 = 整数对 (|U|, max(1,|S∖Chain₀|))、metric_version=1——整数对比对,禁浮点容差)+ **逐格手工推导记录**(每格声明信息源 ∈ {数字约束(a)、雾元知识(b)、0 格级联①},入版本库随向量文件——此即手工常数的登记依据)。**板设计要求**:ⅰ 纯数字推理板(无雾;须含仅 single_subset 规则可开的推导格);ⅱ 链密集板(0 格级联闭包主导);ⅲ 含雾板(须同时含:链可达雾、链不可达雾、邻接出生 3×3 的雾区、寂静减项证据格、雾锚增项证据格【雾元知识开据格】);ⅳ 终局对赌残余板(inferability 严格 ∈ (0,1) 的非确定残余);ⅴ 不可达安全格板(clearable 违例形态)。**比对内容**:度量独立入口 + 合法性谓词输出与登记常数逐位相等。**失效处置协议**:失配 → 先按冻结定义复核手工推导 → 推导无误即实现缺陷(修实现);`solver_rules`/合法信息源域/metric_version 变更 = **换 solver_rules 即失效,走 GDD 修订 + 向量重制**(推理域冻结的非调参性质的行为侧兑现)。 -> -> **期望值推导纪律**:行为类 AC 期望 = ConfigDB/表读值推导(inferability_target/min_safe_count/max_gen_attempts/fog_region_count/unlock_level/dig_ap_cost/σ 公式全读值),不写死玩法数值;**唯一例外** = 黄金图向量手工常数(依据 = 上述手工推导记录);参考行 GDD 自注期望(|S|≈91 等)为说明非断言,任何 AC 不采用。 -> -> **致命类独立进程协议**:承 D2 AC-2b / A4 AC-4b——runner manifest 逐条登记"夹具根 → 期望退出码"(AC-3 三行,均 ≠0);单进程内只做测试通道收集断言。每用例先 `reset_diagnostics()`(承 D2 冒烟协议;warning/error 断言一律经诊断收集器)。 -> -> **out-of-scope 覆盖声明**(deferral 以对侧登记为生效条件):**O1 B1 接线**——attempt 边界非 scope 事件的编排侧断言、指标对账消费(actuals p10 非 target)归 B1 GDD AC(A1 侧生成半边已由 AC-5 计数器断言覆盖);**O2 F4 全量**——N=256/行 × 全行的断言 A 严格零/B 0.95/报告 C/诊断 D = 调参期离线批量工具域(工具本体为 A1 交付物,登记 OQ;σ 基址清单入版本库),冒烟仅载缩样(AC-10),生效条件 = 批量工具交付登记;**O3 A2 集成**——双包含回验(A2 实际展开域 ⊆ A1 排除域;A1 求解器初始态 ⊆ A2 实际初始展开域)登记 A2 GDD(A1 半边由 AC-6(a) 测试 BFS 对照承载);**O4 fault-injection 缺载体**——EC7 生成中热重载(同步单调用无重入点,构造性成立且注入不可)、EC10 内部异常 fatal、EC4 tie-取最早(需精确同分尝试)deferral 至实现期注入设施或可选种子搜索会话;**O5 性能预算**——生成耗时/换图相位无定稿预算值(Tuning Knobs OQ),perf-profile 期承载;**O6 呈现域**——EC6 雾区视觉合并归 D1、biome 色板换皮归 D1/art-bible;**O7 C3 全行审计**——曲线导出工具全行矩阵 diff 为 C3 期交付物(D2 OQ5 既有排期)。 - -**Schema 与加载期校验** - -- **AC-1(干净检出加载)** GIVEN 干净检出(默认根 = MVP 参考行),WHEN 冒烟加载 Core Rules-3 表清单,THEN ConfigDB Ready:BoardGenTable 含 (1,0)/(2,0) 锚行(R1 结构义务;**不断言行总数**——C3 加行免疫)、九字段类型域断言(域 = Schema 表范围)、`solver_rules` 定值 = single_subset(非 knob 冻结——唯一值断言)、其余八 knob 字段仅域断言(参考行值 provisional,期望由表读值推导);诊断收集器零 error 零 warning(域内零诊断)。 -- **AC-2(F2/F2b/biome 谓词·测试通道·程序构造)**(每腿先 `reset_diagnostics()`)GIVEN BoardGenTable schema **class_name 直引程序构造行实例**(A4 AC-5 先例),WHEN `validate()` 作用于违例集 {f>8d;fog_region_count≥1 ∧ f=0(一致性腿);f≥1(禁全覆盖腿);**fog_region_count=0 ∧ f=计算正值(count=0 ⇒ f=0 腿——B4 修订角点,原三条款速记对该输入误放行)**;**f=0.30 ∧ d=0.15(> 0.25 绝对上限腿,8d=1.2 未绑定——B1 修订)**;**mine_density := 0.4/(W×H−9) 计算值(round = 0 → 布雷数下限腿,R3 修订)**;**attempts×W×H > 16384(F2c 成本上限——B8 修订)**;F2b 违例(10×10/d=0.10/min_safe=92——边界值由 F2b 公式对构造参数求值导出);board_biome=∅},THEN 各含对应**致命**类别;WHEN 作用于合法集 {count=0∧f=0(L1 标准形);f := 8×d **计算值**恰界(防浮点字面量歧义);min_safe := W×H−round(d×(W×H−9)) **计算值**恰界;board_biome={未定稿占位词}(EC13——只校验非空、值域不校验)},THEN 零诊断。 -- **AC-3(致命·独立进程)** GIVEN 夹具根 `a1_fog_domain`/`a1_min_safe`/`a1_biome_empty`,WHEN 各以独立 headless 进程跑游戏通道 `load_tables(root, collect_only=false)`,THEN 三进程均非 0 退出且错误清单完整。**runner manifest 登记**:fog_domain→≠0 · min_safe→≠0 · biome_empty→≠0。 - -**生成确定性与回放** - -- **AC-4(生成确定性)** GIVEN 默认根 L2 行与登记种子 σ₀,WHEN `generate(2, 0, rng)` 以 `derive_at("board_gen", σ₀)` 播种之流实例执行两遍,THEN 两遍产物格状态**逐格相同** + 八项指标集全等(含 attempts_used);WHEN 以 σ₁≠σ₀ 同行生成,THEN 格状态与 σ₀ 产物不全同(种子接入退化护栏)。 -- **AC-5(运行期 replay 与 scope 边界)** GIVEN `set_master_seed(42)` 后的 RngService(全真路径),WHEN 以第 1、2 次 `open_stream("board_gen")` 实例分别驱动 generate,THEN 产物与 `derive_at("board_gen", 0/1)` 播种产物逐格相同(生成侧无流外取数);GIVEN 夹具根 `a1_high_target@2`(target=1.0 必触发重试),WHEN generate 前后读 RngService 只读计数器,THEN 差**恰 1**(attempts>1 共用一次 open_stream——attempt 边界非 scope 事件、重试不重开取号);WHEN 同帧连续两次 generate(EC14),THEN 计数器差 2、各产物与各自 σ 播种产物一致(串行生效、无锁语义)。 - -**产物合法性不变式** - -- **AC-6(产物合法性不变式套件)** GIVEN 缩样产物集(默认根 L1·D0/L2·D0 各 N=8;σᵢ = 10⁹+2²⁰·L+2¹²·D+i【F4 公式缩样版——R4 修订同步】i∈[0,8)),WHEN 对每板断言,THEN 全板全腿通过:(a) 出生 3×3 内零雷零变异;R₀ 芯(0 格 flood 闭包——**测试侧朴素 BFS 重算**,仅依赖"0 格 8 邻传播"公开定义)内零雷零变异;闭包外扩 1 格环内零变异(Rule 4/A4③——**环内可有雷**:芯内数字格的邻雷恒在环内,禁断言环内零雷〔B2 修订 2026-09-09:原"可达域内零雷零变异"为构造性不可满足超额断言——所引义务原文只禁变异不禁雷〕);(b) R₀ 芯(去外扩环)内零变异(初始展开不触雾);(c) 雾格 ⊆ cell_constraint 合法集——非雷、非 0、8 邻含雷(A4②);(d) 任意 3×3 窗口非全雾(厚度≤2 窗口谓词,A4⑫);(e) 雾格数 ≤ 8×雷数(f≤8d 产物侧);(f) |S| ≥ min_safe_count(表读值,Rule 8);(g) 非雷格数字值 ≡ 8 邻雷数(数字计数恒真,Rule 10);(h) 全板零非法产物标记。 -- **AC-7(合法性谓词·程序构造病态板)** GIVEN Board class_name 直引程序构造板(与黄金向量同批构造设施),WHEN 合法性谓词作用于:雷墙包围孤立安全格板 → clearable=false(违例类别=不可达安全格);|S|0 搜索,协议同 AC-12;搜索无解的后备语义见缺口 G4),WHEN generate,THEN 降级标记=雾布置降级、shortfall < count 表读值、产物仍过 AC-6 全腿(合法少变异/无变异图)、error 级诊断零新增(静默降级——warning/埋点级不算违静默)。 - -**指标与一致性** - -- **AC-16(指标完备与 F1/F3 一致性·A4⑤)** GIVEN 任意冒烟产物(AC-6/10/14/15 批次复用),THEN 八项指标字段完备(实际 inferability【含 metric_version=1——F1 注记⑥登记值】/inferability_core【B1 修订】/实际雾占比【= |F| ÷ (W×H)】/实际雷数与实际 |S|【B3 修订——并断言 |M| ≤ round(d×(W×H−9)) 表读值】/fog_burden_ratio/Δbudget_fog/attempts_used/降级标记【含非法产物标记+shortfall】);F1/F5 两项判据重算一致:inferability_core = |R∞∖F| ÷ max(1, |S∖F|);F3 重算一致:从产物重算 Chain₀/U → Δbudget_fog = |U|×dig_ap_cost(A3 表读值)、fog_burden_ratio 以整数对 (|U|, max(1, |S∖Chain₀|)) 比对(付费格分母口径——B1 条款 5 对账精确形);fog_region_count=0 行(L1)雾相关四值恒 0 且 core = inferability。 -- **AC-17(registry 对账·B3 AC-18 先例)** **生效前提注明:registry `board_gen_table` 条目与本 AC Phase 5b 同批回填——无条件断言,条目缺位即失败(非条件豁免)**。GIVEN ConfigDB 加载完成,WHEN 脚本解析 `design/registry/entities.yaml` 的 `board_gen_table` 条目,THEN 与 BoardGenTable 九字段**定义**(字段名/类型/域/knob 标记)逐一相等;值对账仅限非 knob 字段(solver_rules=single_subset);八 knob 字段值不对账(参考行 provisional——C3 调参豁免,同 A4 AC-8 口径)。 -- **AC-18(静态扫描·零随机/单点访问/零 UI)** GIVEN A1 文件集(生成器/度量入口/谓词/schema/冒烟脚本),WHEN 按 D2 AC-9 模式静态扫描,THEN 玩法代码文件集零 `randomize()`、零自建 RandomNumberGenerator 构造(**tests/ 路径豁免**——derive_at 取号需以种子构造流实例,D2 预览语义的测试侧落地;玩法文件集不豁免)、零 ConfigDB 外 data 表加载(schema class_name 直引豁免——A4 AC-5 先例)、零 Control/场景类 import;AC-1 headless 实跑通过合成判定(Rule 7)。 -- **AC-19(人工·字面量)** A1 文件集纳入 D2 AC-14 项目级扫描(人工三要素口径,引用不另设——A4 AC-10 同型)。 - -**覆盖矩阵(qa-lead 交付,验收评审用;2026-09-09 full 评审修正——原"无洞"自称不成立:5 处标注问题见日志;③ 经 B2 修复、⑭ 经 B6 修复、⑩ 角点经 B4 修复、④ 减项归因与 F3 注记① 经 B1 core 常数/删承诺修复,⑬ 差分夹具与 ⑪ 差分承载仍登记 R9 未核销)**:Core Rule 1→AC-4/5/6(c)/16(布雷语义 B3) · 2→AC-8/9/10(a)/16(两项判据 B1) · 3→AC-10/11/12 · 4→AC-6(a)(b)/7(芯/环口径 B2) · 5→AC-6(c)(d)(e)/13/14/15 · 6→AC-4/5/14/18 · 7→AC-16 · 8→AC-2/3/6(f) · 9→AC-1/2/3/13 · 10→AC-6(g)/17/18/19 · F1→AC-8/9/7/16 · F2/F2b/F2c→AC-2/3(角点/上限/布雷数下限/成本上限——B1/B4/B8/R3) · F3→AC-16 · F4→AC-10(全量 O2;断言 A″/E 属 O2) · F5→AC-10(e)/11/12/7 · EC1→13 · EC2→15 · EC3→7/8 · EC4→11(tie O4)· EC5→12(玩家侧语义登记 B1/D1 域)· EC6→14(合并 O6)· EC7→O4 · EC8→10(c) · EC9→2/11 · EC10→O4 · EC11(F2b)→2/3 · EC12→2/15 · EC13→2 · EC14→5 · A4①→13 · ②→6(c) · ③→6(a)(b)(B2 修复)· ④→8/16(core 常数补强)· ⑤→16 · ⑥→13 · ⑦→15 · ⑧→4/14 · ⑨→7/8 · ⑩→2/3(B4 修复)· ⑪→14(间接承载——共置+确定性,无取号耦合差分)· ⑫→6(d)(e)/2 · ⑬→15(部分覆盖:面积判据实现同样通过 a1_ec2_press——差分夹具 R9 未核销)· ⑭→10/O2(B6 修复:断言 B 收紧达成区占比)· ⑮→2/3。 - -## Open Questions - -1. **F4 全量批量工具的 owner 排期**(owner:A1 交付物 / C3 消费;deadline:C3 调参期前):调参期红线工具(断言 A/A′/B/B′ + 报告 C + 诊断 D,N=256/行)——qa-lead G7;**与 D2 OQ5 曲线导出工具同批登记排期**(排期倒挂:A1 定稿→首行数值回填→即需抽查;临时载体 = 冒烟缩样 AC-6/10,统计意义有限,如实登记)。 -2. **生成性能预算与异步化选项(B8 修订扩写 2026-09-09)**(owner:实现期 ADR / perf-profile;deadline:Technical Setup):① **预算数值定稿**——F2c 谓词形式已冻结(`max_gen_attempts × W×H ≤ C`),C = 16384 为 provisional 占位,ADR 裁定正式 C 与 headless debug 基准(如"64×64 单次求解 ≤ X ms");② **解空间圈定**——死路二:attempts 并行化(毁 board_gen 流序即毁回放)、分帧/协程化(跨帧在飞 open_stream 实例与 D2 快照切点契约冲突,需 D3 扩容修订);活路四:同步 + 加载幕(B1 换图相位)、主线程分帧 + D3 快照扩容修订、WorkerThread + D2 EC13 单线程假设接口漂移修订(join 先于任何快照切出)、B1 预测性预生成(线性图结构的死时间生成——scope 计数器推进时点须入回放语义);③ **实现姿态约束**:最小不动点可经单调 worklist 传播实现(次序无关性不强制全板重扫描——F1 注记⑤),禁全对全子集比较(ADR 验收底线);④ **F4 全量工具须支持分片续跑**("分钟级"成立域 = worklist 实现 ∧ 大面积行稀少,见 F4⑤)。 -3. **度量独立入口分解面确认**(owner:实现期 ADR;deadline:实现期):推理器/F3 度量/合法性谓词三入口暴露(AC-7/8/9/12 单元腿前提——qa-lead G1);若 ADR 裁决不暴露,四条 AC 单元腿降级重议。 -4. **biome 词表 owner 定稿**(owner:B4/C1 域 + AD 门禁;deadline:垂直切片前):board_biome 值域现只校验非空(EC13);词表定稿后补域校验 + 参考行占位值替换(接口漂移)。 -5. **黄金向量手工推导第二人复核**(owner:A1 定稿评审;deadline:A1 /design-review):五板逐格推导记录入版本库后安排复核(qa-lead G8——推导错误即假失配)。 -6. **精英/Boss 第三轴落点重审(B7 修订登记 2026-09-09)**(owner:C1/C3 GDD;deadline:C1 定稿时):节点形态定稿后强制重审——① Dmax 行约定是否覆盖全部 Boss 场景 ② 精英节点是否需第三键维 / `elite_`/`boss_` 字段激活(分支地图同深度并存精英与普通节点时);激活即走 D2 Rule 4 改键通道 + 本表 schema 修订(接口漂移迁移,退路已登记 Schema 节)。 diff --git a/design/gdd/legacy-2026-09-13/a2-minesweeper-rules.md b/design/gdd/legacy-2026-09-13/a2-minesweeper-rules.md deleted file mode 100644 index ac40ce41..00000000 --- a/design/gdd/legacy-2026-09-13/a2-minesweeper-rules.md +++ /dev/null @@ -1,379 +0,0 @@ -# A2 排雷玩法规则(Minesweeper Rules) - -> **Status**: **Approved**(2026-09-09 full /design-review:四专员〔game-designer/systems-designer/qa-lead/ux-designer〕+ CD 终审 NEEDS REVISION 六 blocking 同日修订核销,用户拍板放行【A3/A4/A1/B3 先例】;日志 `design/gdd/reviews/a2-minesweeper-rules-review-log.md`);lean 门禁:systems-designer 起草 Formulas〔F1–F4 + 反例 B 阻断缺口〕· qa-lead 起草/验证 AC〔23 条 = AC-1…22 + AC-1b + 覆盖矩阵 + 夹具坐标规格〕 -> **Author**: user + agents(systems-designer〔Formulas〕· qa-lead〔AC〕;初始展开=R₀ 恰等 / 批次语义序仲裁 / 移动瞬移语义 / install 四不变式 为本会话定稿;2026-09-09 full 评审修订:game-designer / systems-designer / qa-lead / ux-designer 四专员 + creative-director 终审) -> **Last Updated**: 2026-09-09 -> **Implements Pillar**: P1(主——"每一步都算数"的执行面:连锁放大推理兑现、数字恒真、拒绝可辨)· P4(小人边缘探索的氛围本体)· P3(旗承诺与雷险的规则执行面)· P2(三事件流 = 结算归因的数据源) -> **Layer**: 2 Core · **Milestone**: MVP · **设计顺序**: 第 6 位(上游 A1/A3/A4/D2 均 Approved) - -> **术语与约定**(2026-09-09 评审增补——按 CLAUDE.md 用语纪律豁免通道,白话首定义集中于此;已登记 registry 术语条目): -> - **双包含回验**:A1 与 A2 互检两条包含关系——**臂①** A2 实际初始展开域 ⊆ A1 生成期排除域(保证开局不触雷不触变异);**臂②** A1 求解器初始可见态 ⊆ A2 实际初始展开域(保证 A1 的度量不吃亏)。**恰等** = 两集合逐格相等(不多开不少开)。 -> - **零特判**:A2 代码不为变异写任何 if 分支——变异只是随格携带的只读标记透传,行为差异全部由生成端约束保证。 -> - **规范序**:事件发射的固定顺序(触发格 BFS、8 邻行主序)——同输入必得同顺序,禁实现自选遍历序。 -> - **语义序仲裁**:批次内不按玩家提交顺序、而按"清图挖 > 停手 > 其余"的固定类别顺序结算。 -> - **双发射源**:`round_end` 有两个合法发射者——棋盘路径(ap_exhausted/cleared)由 A2 发、停手路径(stopped)由 A3 直发,payload 同构。 -> - **三源拒绝**:拒绝原因来自三个互异来源——棋盘面(board_face)/ 资源面(resource_face,AP 不足)/ 相位(phase,非 Active)。 -> - **单意图批 / 便捷形**:`settle_batch` 只装一个意图时 ≡ 直接调 `try_dig` 等便捷 API,行为逐项相同。 -> - **作废(voided)**:轮次结束后未获执行的批次意图——零棋盘效果、零扣费、零事件,区别于非法拒绝。 - -## Overview - -A2 是扫雷层的**玩法规则引擎**:它持有 A1 产出的棋盘(格状态 + 变异标记 + 出生区),接收玩家的动作意图(挖 / 插旗 / 拔旗 / 移动 / 停手),执行全部棋盘面规则——小人控制、8 向相邻判定、连锁展开(flood fill)、数字提示、旗子棋盘状态、清图判定——并把发生的事实以**恰好三种事件**外发:`cell_revealed`(开格事实)、`flag_judged`(轮末标旗判定)、`round_end`(轮次结束·棋盘路径)。资源账本归 A3(A2 判棋盘面合法性后调用 `try_spend`,禁止自行扣减)、轮次编排归 B1、奖励内容归 B4、呈现归 D1——A2 不依赖任何下游(TD-SYSTEM-BOUNDARY 唯一回边),是全项目的**事件源头系统**(B4/D1/D5 挂其事件,瓶颈系统,规则一次定稳)。 - -玩家感知到的 A2 是"扫雷本身":点开一格、连锁撕开一片、数字逐格亮起、旗子立上可疑格——但 A2 自身不含任何数值与随机:价目读 A3、板面读 A1、变异只透传快照标记(零特判)、零 RNG 流、零 UI 依赖,`--headless --script` 可完整驱动(D2 Rule 7 工程债的规则层落点:**棋盘规则层与输入/呈现解耦**——输入是意图对象、输出是事件流,D1 与输入设备皆可替换)。没有 A2,游戏没有可玩的扫雷:A1 的板、A3 的预算、B1 的结算都失去了发生地。初始展开的定义落点(免费、计入清图进度、无奖励——A3 EC5 委派)与"标错惩罚"悬案(OQ1 登记)由本 GDD 承载。 - -## Player Fantasy - -**直接承载**(玩家每一次点击都在与之互动——Section A 定稿:直接感知)。A2 的情绪目标一句话:**"每一步都算数"的手感**——按下去的每一格都立刻、诚实地回应:数字亮起是推理原料的兑现,连锁展开是一次正确推断被免费放大成一整片区域,旗子立上是"我赌这里"的承诺落地。 - -- **P1"我算对了"的执行面**:A1 保证题出得可解,A2 保证解的过程不被规则欺骗——数字恒真透传(雾格只是不显示,数据层永不说谎)、连锁传播与生成端度量同构(F2 ≡ A1 F1 算子①)、每个拒绝都携带可辨原因(棋盘面/资源面/相位三源)。玩家的掌控感在规则层的对偶是:**系统回应的每一格都与玩家推演的一致**。 -- **P4 地牢下探的氛围本体**:小人从出生安全区向雷图边缘探索,点击已探明区瞬移穿行、在未开边界挖掘——Microsoft Minesweeper Adventure 式的"边缘探索"由 A2 的移动规则直接承载;**已引爆雷格可通行**(工程债定稿)让雷不再是探索的终点,而是走过的伤疤。 -- **P3 风险与收益同源的规则面**:挖开雷格不是死亡而是事实上报(`kind=mine`,敌方优势在轮末结算兑现);旗子插上可疑格是零信息收益的纯粹承诺(雾内旗恒不中也被诚实判定)——A2 不裁决得失,只保证事实流真实,让"赌"与"算"的结果都可见。 -- **P2 规划延迟兑现的数据源**:结算明细的每一行归因(安全格增益/标中旗削弱/雷→伏击/清图奖励)都溯源到 A2 的事件流——`reward_eligible`、`channel`、`hit` 字段是 P2"可归因"的字段落点。 - -参考感受:经典扫雷连锁展开的"哗啦一片"爽感(本作保留其免费与瞬时,剥夺其 chord 双击——每个决策都值得花一 AP,快开是对预算意义的稀释,已登记 CD 创意风险 #3 的兑付节拍补偿归 B1/B4);Into the Breach 的信息诚实(拒绝你的规则从不含糊其辞)。**反向护栏(裁剪判据)**:任何"规则层说谎"的形态——数字失真、连锁静默变异分支、拒绝原因含混——都是 P1 的死亡体验,默认砍掉;呈现层的隐藏(雾格无字)必须以数据层恒真为前提。 - -> 注:`creative-director` 未经咨询——Lean 模式(仅 D/H 两节委托专家),生产前请人工复核本节情绪定位。 - -## Detailed Design - -### Core Rules - -> 符号约定(全 GDD 通用):U = 全格集;M ⊆ U 雷集;S = U ∖ M 安全格全集;F ⊆ S 雾格集;G 旗集;O ⊆ U 已开集;B3 = 出生 3×3;num(x) ∈ {0..8} 为 x 的真实数字(8 邻雷数,A1 AC-6(g) 数字恒真);N₈(x) 为 8 邻。 - -1. **系统形态与解耦义务(承重)**:A2 是纯规则引擎——输入 = A1 棋盘产物 + 玩家意图序列,输出 = 三事件流;**零随机**(不消费任何 RNG 流:给定棋盘与意图序列,事件流逐位确定,D2 Rule 5)、**零数值字面量**(D2 Rule 1)、**零表读取**(价目经 A3 账本、板面经 A1 产物、变异经产物内快照——A2 玩法文件集禁现 `ConfigDB.*` 引用,D2 登记的"A2 无直接依赖"由此成立)、**零 UI/输入设备依赖**(D2 Rule 7:规则层与输入/呈现解耦,`--headless --script` 可完整运行;输入设备 → D1 → 意图 → A2 是唯一通路)。 -2. **三事件回边契约(发射面封闭,systems-index 回边裁决)**:A2 只外发 `cell_revealed` / `flag_judged` / `round_end` 三事件,B4/B1/D1 订阅——增删事件 = 接口漂移修订。payload 定稿: - - `cell_revealed{cell, kind ∈ {safe, mine}, digit, variant_ids, channel ∈ {initial, chain, dig}, reward_eligible}`——**digit 恒真透传**(仅 kind=safe 携带;雾格携带真实数字、呈现隐藏归 D1,判定数据源 = `variant_ids`——A2×4 之三);**reward_eligible**:channel=initial 恒 false(初始展开无奖励)、channel ∈ {chain, dig} ∧ kind=safe 恒 true(含链开雾格——A4 EC4)、kind=mine 恒 false;事件发射序 = 规范序(初始/连锁 = 触发格 BFS、8 邻行主序固定序——确定性规范)。 - - `flag_judged{cell, hit}`——轮末统一判定批,每轮末对**判定基线旗位**逐旗一条(基线 = 轮次结束事务开始时的旗位;枚举序 = 行主序扫描,确定性)。 - - `round_end{path_tag ∈ {ap_exhausted, cleared}, continuation_hint ∈ {same_board, new_board}}`——**棋盘路径由 A2 外发**(Rule 9),核心字段逐字段取自 A3 `last_round_end`(读取权为接口契约),与 A3 stopped 路径 payload **同构**;stopped 路径由 A3 直发、A2 禁双发(Rule 10)。 - - **事件序契约**:同一轮次结束事务内 `flag_judged ×N` **先于** `round_end`(全路径统一——stop 意图由 A2 在委托 A3 前先发旗判定,因停手不改旗位,基线等价);B1 结算触发 = Waiting 相位编排点,不依赖事件到达序(登记 B1 强制项)。 -3. **棋盘产物消费与 install 校验域**:`install_board(board)` 装板(受理域 = {Idle, Waiting} 编排边界相位 + **Active·仅弃图刷新路径**〔2026-09-12 D4 修订:B1 `refresh_board` 编排内、A3 扣费成功为前提;其余 Active 装板仍拒绝——防轮内换板原则对非刷新路径不变〕)。装板 = 持有产物快照(变异标记为**生成期快照**,非 VariationTable 活引用——A2×4 之四:抗表重载)→ 校验四条**结构不变式**(violation = 拒绝 + `board_invalid` + error 级诊断,fail-fast 不静默;**诊断类别封闭枚举:`{inv1_mine_in_spawn, inv2a_variant_in_spawn, inv2b_variant_in_r0, inv3_digit_invariant, inv4_r0_equals_s}`**——AC-1b/AC-2 按枚举名断言,2026-09-09 评审补;产物只能经程序构造或 A1 产生,运行期不存在该输入源):① B3 内无雷;② B3 ∪ R₀ 内无变异格(A4 Rule 7 消费侧兜底);③ 数字恒真(num(x) ≡ 8 邻雷数——A2 全部规则的地基);④ **R₀ ≠ S**(清图退化板拒绝——防"初始展开即整图"使轮次棋盘路径出口结构性不可达,A2 状态机良构性守卫;生产面由 A1 legality 闸保证,本条为纵深防御,**非 A1 clearable 闸的复验**——不可达安全格板 A2 照常运行)。校验过后执行初始展开(Rule 4)+ 小人落位 B3 中心格。 -4. **初始展开(A3 EC5 委派的定义落点,本 GDD 承载)**:`O₀ = R₀ = B3 ∪ (B3 经 0 格的 flood 闭包)`——**与 A1 F1 求解器初始态恰等**(同算子同板同值;显式**不含**"外扩 1 环"——环是 A1 排除域的生成期安全边距,多开破**恰等**(臂②)与恒不开雷定理(环内可有雷)、少开破臂②)。四属性:**免费**(零 `try_spend` 调用、账本零写入);**计入清图进度**(rem₀ = |S ∖ O₀|);**无奖励**(channel=initial、`reward_eligible=false`——game-concept 定稿,优先于 EC4 入库语义;下游 B1/B4 不得入库,登记验收);**永不触雷触雾**(R₀ ∩ M = ∅ 是 A2 侧可独立证明的定理——B3 无雷 + 闭包只经安全格;触雾由 A1 排除域保证 + 本侧不变式②兜底)。执行时点 = install 事务内一次(板级一次,跨轮不重放)。**双包含回验(A1 登记,门禁缺项即 blocking)**:臂① `R₀ ⊆ A1 排除域`(构造性成立——两个集合项均为排除域子项);臂② `A1 求解器初始态 = R₀ ⊆ O₀`(**恰等**)→ **A1 回退口径(出生 3×3 最小态)不触发**,度量保真零降级。 -5. **动作价目执行与棋盘面合法性**:A2 是挖/插/拔的调用方——先判棋盘面合法性,后调 A3 `try_spend(action_kind)`,任一环节拒绝即整体拒绝(false + 状态不变 + 诊断)。**棋盘面拒绝目录(board_face 全枚举)**:挖——目标非 8 向相邻 / 目标已开 / 目标有旗(EC11:须先拔旗);插旗——目标非相邻 / 目标已开 / 目标已有旗;拔旗——目标非相邻 / 目标无旗;移动——目标未开 / 无 BFS 路径。**资源面拒绝(resource_face)= A3 try_spend 返回 false**(AP 不足);**相位拒绝(phase)= A3 非 Active 或无板态**。三源枚举携于 `ActionOutcome{accepted, reject_reason, sub_reason}`,D1 拒绝呈现的数据源(A3 双源契约的扩容版——三源)。**board_face 拒绝携带 sub_reason 封闭枚举**(2026-09-09 评审 UX-1 定稿——"须先拔旗"与"非相邻"等玩家语义截然不同的情形必须数据可分;本枚举为 A2 自有 provisional API 面,批后修改 = 接口漂移):`sub_reason ∈ {not_adjacent, target_revealed, target_concealed, flag_present, flag_absent, no_path, out_of_catalog}`——挖:not_adjacent/target_revealed/flag_present;插旗:not_adjacent/target_revealed/flag_present(已有旗);拔旗:not_adjacent/flag_absent;移动:target_concealed/no_path;**目录外输入(越界坐标等)= out_of_catalog**(debug 级诊断,不与玩家语义混桶——EC9)。**D1 呈现义务:每次拒绝须玩家可感知呈现**(文案归 D1,映射源 = 本枚举;登记 D1×6 强制项)。**A2 不可自行扣减资源**(A3 Rule 9);`try_spend` 返回 true 后若本次事务内轮次结束,A2 读 `last_round_end` 组包外发(Rule 10)。连锁规模与清图事实由 A2 作为动作参数上报:`request_dig(chain_size, clears_map)`(F2)。 -6. **连锁展开(flood fill)**:dig 开出 num=0 的格 → 8 邻**未插旗**安全格免费连锁全开,逐格递推至无非 0 新格(F2,与 A1 F1 算子①在 G=∅ 域逐字同构——install 时旗集恒空,见 F2 注)。**连锁不越旗**:旗格不入链、不作传播源(经典扫雷 flood 惯例——系统不替玩家毁约,EC3"旗是承诺标记"的反向保证;旗由此成为玩家可用的链阻断器:花 1 AP 保护一格不被误链——2026-09-09 评审 GD-1 定稿)。连锁格:免费(仅首格耗 `dig_ap_cost`)、计入清图进度、`channel=chain`、`reward_eligible=true`、**含链开雾格**(雾格可被链开、永不传播——生成约束恒非 0,代码零变异分支,A2×4 之一)。chain_size 上报 = 附加格数(不含首格);clears_map 上报 ≡ F1 谓词本事务尾求值(单一谓词两个名字,禁第二套实现)。 -7. **小人移动**:点击已开格 → 小人**瞬移**至该格(规则层一次事务完成位置更新;逐格动画是呈现语义,归 D1)。合法条件 = 目标已开 ∧ 经已开区的 8 邻 BFS 连通("已探明区" = O 全体,**含已引爆雷格**);`compute_move_path(cell)` 返回该 BFS 路径(固定 8 邻行主序序,确定性)——**路径 = 合法性载体 + D1 移动路径预览的数据源**(表现归属归 D1 GDD,systems-index 2026-09-07 门禁登记项)。移动免费(`move_ap_cost=0` 冻结,**不经账本**——A3 AC 前言的 A2 侧承载)、零事件外发。 -8. **旗子系统(棋盘单态,A3 Rule 8 的 A2 落点)**:已插旗 = 棋盘状态归 A2——跨轮保留、随图存续,清图/刷新换图/战斗结束随之消失(retire/重装即清空);无口袋旗资源、数量无上限;**旗恒在未开格上**(插旗目标须未开 + 连锁不越旗——Core Rule 6,两路共同保证的结构不变式)。插旗 = 1 AP + 棋盘 +1 标记;拔旗 = 1 AP + 标记移除;挪旗 = 拔 + 插(2 AP,A3 EC3/EC7);挖已插旗格拒绝(EC11)。**轮末统一判定**:每轮结束事务开始时对旗位逐旗判定 `flag_judged{cell, hit = [cell ∈ M]}`——被拔的旗不判;雾内旗合法且恒 `hit=false`(判定逻辑零特判自然覆盖,A2×4 之二;标错惩罚上线后的一致性推论见 OQ1)。**诚实重复上报**:旗留雷上跨轮则每轮末重复 `hit=true`——**兑付去重归 B1/B4**(资格以雷格实例为键、每雷至多兑付一次、拔旗重插不恢复资格——A3 Rule 8/OQ5,A2 是纯事实源,不做任何去重)。旗动作(插/拔)零事件外发(非开格非判定;D1/D4 反馈经调用返回值命令式驱动——发射面封闭的已声明代价)。 -9. **轮次出口与批次仲裁(A3 EC4 deferral 的承接落点)**:玩家意图经 D1 提交至 **`settle_batch(intents)`**(A2 唯一结算入口;单意图批 = 平凡形,语义 ≡ 逐意图结算——等价性护栏;`try_dig` 等单动作 API 为便捷形)。stop 意图**经批次入口委托** `A3.request_stop()`(A3 仍为 stopped 轮 round_end 的发射者——Rule 9 双发射源裁决不变;D1 不直调 A3,登记 D1 接线强制项)。批次 = 单一结算事务,语义序仲裁(F4):**cleared 类 dig 先结算 → stop 次之 → 其余意图按到达序**;轮次结束首次为真处确定胜者,其后意图全部**作废**(false + voided 标记:零棋盘效果、零 AP 扣减、零事件——区别于非法拒绝)。四组合 {cleared×stopped、stopped×ap_exhausted} × 两到达序与 A3 Rule 3 优先级逐项一致、RAP 记账随胜者(批次 cleared 胜出 → 剩余 AP 作废不入 RAP)。 -10. **round_end 棋盘路径外发**:触发 = dig 结算事务内 A3 仲裁轮次结束(ap_exhausted 或 cleared 胜出);A2 读 `last_round_end` 恰一次组包外发(Rule 2 payload);外发前先发本轮 `flag_judged ×N`(事件序契约)。**零窗口**:AP 归 0 瞬间轮次即结束(A3 Rule 3),A2 无 0-AP 操作窗口可构造。 -11. **已引爆雷格(工程债定稿,systems-index 门禁修正记录)**:挖开雷格 → `cell_revealed{kind=mine, channel=dig, reward_eligible=false}`(无 digit 字段)、**轮次不结束**、格子入 O(**可通行**——此后成为移动 BFS 合法通道,小人可站立、可经其续挖);不计清图进度(恒 ∉ S)、不可再挖、不可插旗(已开格);同轮可连续挖开多雷(每雷独立事实)。**雷格通行 = 有价捷径**(2026-09-09 评审 GD-2 注记):挖已知雷 = 1 AP + 雷→敌方优势,经 P3 风险管线计价、非免费通道;A1 clearable 闸按"安全格 8 邻接图"连通计(挖雷通路不计入),合法板上"被迫挖雷过路"的构图被生成期拦截——本条服务的是玩家**主动**抄近路的权衡与降级板的兜底通路。 -12. **无 chord(有意排除,game-concept 定稿的 A2 承载)**:不存在双击快开/数字和弦——点击已开数字格 = 移动。验收形态 = API 面封闭枚举"无对应入口"(AC 前言),新增快开入口 = 接口漂移修订。 - -### States and Transitions - -A2 的板级生命周期(轮次节拍权威在 A3/B1——A2 以 A3 相位观测量为闸,不自持轮次状态): - -| 板态 | 进入条件 | 行为/出口 | -|---|---|---| -| NoBoard | 冷启动 / `retire_board()` 后 | 全部动作 API 拒绝(phase 源);`install_board` 受理(Idle/Waiting) | -| Installed·Active | 装板完成 ∧ A3 phase=Active | 接受全部动作意图;dig/旗经 `try_spend`,移动免费直达;**弃图刷新 = retire + install(D4 2026-09-12——B1 `refresh_board` 编排,装板后回本板态)**;轮次结束事务(Rule 10)→ Installed·Frozen | -| Installed·Frozen | A3 phase=Waiting(三路径任一收轮) | 全部动作意图拒绝(phase 源);棋盘/旗/小人**全态冻结**;`install_board`(换新图)/`retire_board` 受理(编排边界) | -| Retired | `retire_board()` 或战斗终结后编排调用 | 旗/小人/事件分段终结(事件捕获以 install 为段界)——板实例与变异快照一同消亡 | - -**输入 × 相位 × 板态矩阵**(动作意图 ∈ {dig, flag_place, flag_pull, move, stop};编排调用 ∈ {install_board, retire_board}): - -| 输入 | NoBoard | Installed·Active | Installed·Frozen | -|---|---|---|---| -| 动作意图(含 stop) | 拒绝(phase) | 受理(经批次结算器) | 拒绝(phase;A3 侧按同一致相位矩阵同判——两侧判定一致) | -| install_board | 受理(Idle/Waiting) | **受理(仅弃图刷新路径——D4 2026-09-12,B1 `refresh_board` 编排;非刷新路径仍拒绝——防轮内换板)** | 受理(换新图 = 全态重置 + 初始展开重放) | -| retire_board | 幂等受理 | 拒绝(板态) | 受理 | - -无独立运行期状态机分支于变异/雾(零特判)——板态只有上述四态,变体属性是格级只读快照。 - -### Interactions with Other Systems - -| 系统 | 方向 | 接口契约 | -|---|---|---| -| A1 | 上游 hard(产物消费) | 棋盘产物 = 格状态 + 变异标记 + 出生区(Board class_name 数据契约);**双包含回验两臂落点在本 GDD**(Rule 4:臂① 展开域 ⊆ 排除域、臂② 求解器初始态 ⊆ 展开域【恰等,A1 回退口径不触发】——门禁缺项即 blocking);install 结构不变式①②③④为消费侧信任边界(fail-fast);**A1 修订义务登记**:F5 legality 增 `R₀ ≠ S` + F4 批量断言严格零("初始展开即 cleared"反例 B 与 N=1 行整行退化——本 GDD EC1,systems-index 门禁块登记) | -| A3 | 上游 hard(账本) | `try_spend(action_kind)` 唯一扣减入口(A2 禁自行扣减);`request_dig(chain_size, clears_map)` 参数上报(A2 计算);stop 意图委托 `request_stop()`(A3 直发 stopped round_end);轮末读 `last_round_end` 组包棋盘路径 round_end(读取权 = 接口契约);相位观测量(Idle/Active/Waiting)= A2 动作闸的对侧来源;**A3 API 面零改动**(settle_batch 是 A2 侧入口,P4 注记) | -| A4 | 上游 soft(快照透传) | 变异属性经 A1 产物快照只读携带、随 `cell_revealed.variant_ids` 透传——A2 执行逻辑零变异分支(零特判原则,义务是"不加分支");**A2×4 清单落位(缺项即 blocking)**:EC4 连锁开雾格(Core Rule 6)· EC5 雾内旗恒不中(Core Rule 8)· 开格上报携带变体标记(Core Rule 2)· EC8 生成期快照抗表重载(Core Rule 3) | -| D2 | **无直接依赖(登记事实)** | A2 零表读取、零 ConfigDB 引用(Core Rule 1)——参数经 A3 账本、板面经 A1 产物;D2 Interactions 表"A2 无直接依赖"行为本 GDD 证实 | -| B1 | 下游 hard(编排,未设计——provisional 登记) | 消费 `round_end`(棋盘路径)与全事件流结算;**B1 强制项三条(systems-index 门禁块登记)**:① 结算触发 = Waiting 相位编排点、不依赖事件到达序(stopped 轮 A3 直发 round_end 与 A2 旗判定批的到达序不承载语义)② `reward_eligible=false`(initial 通道)的格不得进入奖励入库(A3 EC5 委派闭环)③ 诚实重复上报的去重义务(资格以雷格实例为键);换图编排 = `install_board`/`retire_board` 的调用方(接线归 B1 GDD) | -| B4 | 下游 soft(订阅,未设计) | 清图奖励触发(cleared 路径)与安全格奖励内容归 B4——A2 只上报棋盘面资格事实(`reward_eligible`/`channel`),内容与折算不经 A2;**连锁批量授予的溢出吸收设计**(2026-09-09 评审登记:13 格链 × B3 max_stack=2 ⇒ 大量"溢出未生效"行进结算明细,P2 画面反向伤害连锁幻想——溢出转一次性资源/治疗或显式接受,裁决归 B1/B4,义务条目化进 systems-index) | -| D1 | 下游 hard(呈现,未设计) | 棋盘/小人/旗/数字渲染;数字显示判定消费 `variant_ids`(雾格无字——digit 恒真透传是前提);**D1×6 强制项(缺项即 blocking,systems-index 门禁块登记;2026-09-09 评审由 D1×1 扩容)**:① stop 意图经 `settle_batch` 提交、不直调 A3(单一结算序保证)② 四种格态一眼可辨(已开 0 格地板 / 已开雾格无字 / 未开格 / 未开雾格——左键"已开=移动/未开=挖"消歧的感知前提;后果不对称:误挖 = 1 AP + 可能触雷且不可逆)③ 悬停预承诺(光标区分移动/挖/旗目标语义)+ 可挖域(8 向相邻)常驻指示 + 怀旧扫雷玩家 chord 肌肉记忆首遇提示("点击数字格 = 移动小人"——非模态、每 run 一次,A4 先例)④ 已引爆雷格"可通行可读"呈现(Visual/Audio §3 升入本台账)⑤ `compute_move_path` 呈现语义定稿(合法性指示 vs 穿行动画轨道——P4 氛围载体;BFS 行主序路径可能视觉绕路,形态归 D1 裁决)⑥ **单意图帧输入收集**(stop 点击终结当帧收集;F4 语义序退为防御性兜底)+ 批次 voided 呈现义务(至少 stop 被作废须可感知——防 [dig清, stop] 静默改判清图、剩余 AP 清零不入 RAP)+ **每次拒绝玩家可感知**(文案归 D1,映射源 = reject_reason + sub_reason) | -| D5 | 下游 soft(Alpha) | 小人三动作 + 连锁/旗/收轮的教学口径以本 GDD 规则为准;教学条目:雾内旗纯损、雷格可通行、**旗挡链(连锁止于旗属正常——GD-1 配套)**、**挖到雷 = 敌方优势而非死亡**(经典扫雷玩家最大预期违背)、**已开雾格无字属正常**(A4 D1 条目的 D5 侧交叉引用)——挂 OQ1/EC5/EC17 | -| D4 | 下游 soft(Alpha) | 挖掘/连锁/雷格/收轮音效挂三事件流;**旗/移动反馈经调用返回值命令式驱动**(两动作零事件外发——发射面封闭的已声明代价,Core Rule 7/8)(systems-index 依赖分层 D4 ← A2,B1) | -| A5 | 预留(垂直切片) | 探测类道具的显影面可能挂 A2 查询接口(未开格数字显影)——接口归 A5 GDD 定稿,本 GDD 不预写(OQ4) | - -## Formulas - -> systems-designer 代理起草(lean 门禁,2026-09-09)。**口径总纲**:F1 定**终局判定谓词**(状态轴)、F2 定**连锁展开算子**(执行轴)、F3 定**初始展开域**(对偶轴——A1 度量与 A2 行为的接缝)、F4 定**批次仲裁**(事务轴)——四条均为行为契约,禁互相折算。本节零平衡公式(见排除声明)、零随机、零字面量、零 UI 依赖。 - -### F1 清图判定谓词(clear_predicate) - -``` -cleared(σ) :⇔ O(σ) ∩ S(B) = S(B) 等价形:|S(B) ∖ O(σ)| = 0 -rem(σ) = |S(B) ∖ O(σ)| ——剩余安全格计数;rem = 0 ⟺ cleared -``` - -**求值时点(穷举,此外零求值点)**:① install 初始展开事务尾(不变式④保证此处恒 false);② **每次 dig 执行完成点**(连锁完成后;批次内即逐 dig 求值——F4"批次 = 单一结算事务"说的是批次作为原子性单位,不改本条逐 dig 粒度,与 A3 `request_dig` 按次调用上报的契约一致)。插旗/拔旗/移动不改 O → 结构上不可能触发 cleared。**不计项(零特判推论)**:雷格恒 ∉ S(已引爆雷格入 O 作 BFS 通道但不入判定);旗不入 O 不入 S(带旗未开格照常计入 rem——"全图标旗不挖"永不 cleared);雾格照常计入(A4 Rule 4)。**A3 对偶**:`clears_map` 参数 ≡ 本谓词在该动作事务尾的求值——单一谓词两个名字,禁第二套实现。 - -**Variables:** - -| 变量 | 类型 | 范围 | 说明 | -|---|---|---|---| -| σ | 棋盘状态 | —— | (B, O, G) 三元组;B 由 A1 产物给定 | -| O(σ) | 格集 | R₀ ⊆ O ⊆ U | 已开集(含初始格、连锁格、已引爆雷格) | -| S(B) | 格集 | U ∖ M | 安全格全集(含雾格、含 R₀ 格、含不可达格) | -| rem(σ) | int | [0, \|S\|] | rem₀ = \|S ∖ R₀\|;rem=0 即 cleared 路径 | - -**Output Range:** cleared ∈ bool。**Example:** 10×10 板、|S|=88、R₀=20 → rem₀=68;挖开末 1 安全格(chain_size=3 连锁)→ O ∩ S = S → cleared,A2 经 `last_round_end` 外发 `(cleared, new_board)`。 - -### F2 连锁展开闭包(chain_closure)+ chain_size / clears_map 上报参数 - -``` -Chain(O, c) = μX.[ O ∪ {c} ⊆ X ∧ ∀x ∈ X:( x ∈ S ∧ num(x) = 0 ⇒ N₈(x) ∩ S ∖ G ⊆ X ) ] -dig(c) 的棋盘效果:O′ = Chain(O, c);事件:cell_revealed × |O′ ∖ O|(BFS 规范序) -chain_size(dig(c)) = |O′ ∖ (O ∪ {c})| ——附加格数,不含首格(A3 AC-2/AC-6b 期望依赖) -clears_map(dig(c)) = [ S ⊆ O′ ] ——≡ F1 本事务尾求值 -``` - -**与 A1 F1 算子①逐字同构(G = ∅ 域)**:A1 生成期与 A2 install/初始展开时旗集恒空,`S ∖ G = S`,两算子逐项相等(R↔X 换名后:触发谓词同〔成员资格 ∧ **真实数字**=0——禁读显示值,雾格显示空 ≠ 0 格〕;传播目标同〔8 邻**安全格**——雷永不入链〕;封闭域同〔S〕;单调最小不动点语义同〔次序无关性两侧成立——worklist 任意定序、结果唯一〕)。**A2 运行期旗非空时传播集排除旗格**(连锁不越旗,Core Rule 6——经典 flood 惯例;双包含回验不受影响:回验只在 install 时点发生,彼时 G = ∅)。**增量合法性引理**:Cl 单调幂等 ⇒ 逐动作增量求值 ≡ 一次全量闭包(与 A1 生成期同值)。同构主张范围 = 算子①本身(A2 无算子②推导项,不主张 O = R∞)。**零特判**:雾格恒非 0(VariationTable 跨字段校验承重)⇒ 可被链开、永不传播——两个方向都是定理不是分支;旗格不入链是集合减法(`∖ G`)不是分支,GD-1 评审确认不违零特判纪律(旗是 A2 一等规则对象,非变异属性)。 - -**Variables:** - -| 变量 | 类型 | 范围 | 说明 | -|---|---|---|---| -| c | 格 | U ∖ O | 挖掘目标(棋盘面合法性先行,Core Rule 5) | -| O / O′ | 格集 | 见 F1 | 挖前/挖后已开集 | -| num(x) | int {0..8} | x ∈ S | 真实数字(非显示值——漂移风险 D1,见注) | -| chain_size | int | [0, \|S\|−1] | A3 request_dig 第一参数 | -| clears_map | bool | —— | 第二参数;≡ F1 cleared | - -**Output Range:** chain_size=0 ⟺ c 非 0 格或其安全邻已全开。**Example:** b_chain 板挖 (3,6)(0 格)→ 级联 13 格一次开尽墙下封闭区(雷墙与板底之间的口袋形安全区,下称"封闭区"),chain_size=13、clears_map 视余量而定;全程 ap 只扣首格 1。 - -### F3 初始展开域(initial_expansion_domain)+双包含回验 - -``` -O₀ = R₀(B) = μX.[ B3 ⊆ X ∧ ∀x ∈ X:( x ∈ S ∧ num(x) = 0 ⇒ N₈(x) ∩ S ⊆ X ) ] - ≡ A1 F1 "出生 3×3 ∪ flood 闭包" 逐字(同算子同板 ⇒ 同值);显式不含外扩 1 环。 - -性质 1(恒不开雷,定理):R₀ ∩ M = ∅(B3 无雷 + 闭包只收安全格)——初始展开零雷险由 A2 独立可证。 -双包含回验(registry board_gen_table.a2_dual_containment 的 A2 落点): - 臂① R₀ ⊆ 排除域(以最终产物板计:出生 3×3 ∪ 闭包 ∪ 外扩 1 环)——构造性成立; - 臂② A1 求解器初始态 = R₀ ⊆ O₀ = R₀ ——恰等; - ⇒ A1 回退口径(出生 3×3 最小态)不触发,度量保真零降级。 - 注:臂①给"不触变异"保证(经排除域);"不触雷"由性质 1 独立给出(环内可有雷,两义务来源分开陈述)。 -退化守卫(不变式④):R₀ ≠ S——install 拒绝清图退化板(EC1;非 A1 clearable 闸复验)。 -``` - -**Variables:** - -| 变量 | 类型 | 范围 | 说明 | -|---|---|---|---| -| B3 | 格集 \|B3\|=9 | ⊆ U | 出生 3×3(产物携带);小人出生 = B3 中心格 | -| R₀ = O₀ | 格集 | B3 ⊆ R₀ ⊆ S | 初始展开域;下界 9(无 0 格传播时) | - -**Output Range:** |R₀| ∈ [9, |S|−1](上端点被不变式④排除)。**域非空前提**:非空 ⟺ |S| ≥ 10——|S| = 9 的板必有 S = B3 ⇒ R₀ = S,由不变式④在 install 拒绝(EC1 同族),不产生运行态 R₀;现行 A1 参数域(W,H ≥ 8)下 |S| ≤ 9 仅程序构造板可达。**Example:** b_spawn 板(7×7、竖墙雷 6 枚):R₀ = x≥2 全安全格 35 格,臂① R₀ ⊆ 排除域(35 + 域外安全 8 + 环内雷)✓、臂② 测试侧朴素 BFS 重算逐格恰等 ✓。 - -### F4 批次仲裁(settle_batch) - -``` -类别函数(排序用,批次初始态求值): - class(I) = C_dig 若 I = dig(c) 且执行后 clears_map = true(真模拟 F2——禁计数器捷径: - "rem=1 则任意 dig 必清"为假,反例 = 挖雷不入 S) - = C_stop 若 I = stop - = C_other 其余(非清 dig / flag ×2 / move) -语义序 ≺:C_dig ≺ C_stop ≺ C_other;同类内按到达序(稳定序——多 cleared-dig 时最先者执行胜出, - 其余作废;未钉死类内序会使事件流与奖励格归属漂移——规范性义务)。 -结算循环:按 ≺ 逐意图执行;轮次结束首次为真处定胜者 ω,其后意图全部【作废】 - (false + voided:零棋盘效果、零 AP 扣减、零事件——区别于非法拒绝)。 -胜者 → 出口映射(RAP 记账随胜者;键 = 胜者意图类型 × **结算时点** clears_map 真值): - dig 胜 ∧ 结算时点 clears_map=true → (cleared, new_board);RAP += 0(剩余作废,A3 Rule 5) - ——C_dig 胜者恒满足;非清 C_other dig 可因前序 C_other dig 执行变清图,按结算时点真值入此行 - C_stop 胜 → 先发 flag_judged ×N(基线 = 事务开始旗位,停手不改旗)→ 委托 - A3.request_stop() → (stopped, same_board);RAP += remaining_ap(1:1) - 耗尽 AP 的 C_other → (ap_exhausted, same_board);RAP += 0(不变式 remaining=0) - 不结束轮次 → 无 round_end,继续下一意图 -棋盘路径 round_end 由 A2 恰一次外发;stopped 由 A3 直发(双发射源纪律,A2 禁双发)。 -``` - -**四组合真值表(≡ A3 Rule 3 优先级 cleared > stopped > ap_exhausted)**: - -| # | 批次(到达序) | 结果 | RAP | -|---|---|---|---| -| 1 | [dig清, stop] | (cleared, new_board),stop 作废 | +0(作废) | -| 2 | [stop, dig清] | 语义序重排 → 同 #1 | +0 | -| 3 | [stop, dig耗] | (stopped, same_board),dig 作废 | += remaining | -| 4 | [dig耗, stop] | 语义序重排 → 同 #3 | += remaining | - -**到达序无关性(精确口径,2026-09-09 评审收窄)**:**(path_tag, continuation_hint, AP/RAP 终值) 对任意到达序不变(全批域)**。执行/作废划分的到达序无关性**仅对异类竞争成立**({C_dig, C_stop} 与耗尽的组合——四组合真值表);**同类多成员批(C_dig 或 C_other)内,执行成员、棋盘终态(旗位/小人位)与划分由类内稳定序(到达序)决定——不同到达序 = 不同输入**,均为合法确定行为非缺陷(例:ap=1 下 [move, dig耗] 两意图均执行、[dig耗, move] 的 move 作废且小人位不同;[flag_place, dig耗] 旗入板、[dig耗, flag_place] 旗作废)。cell_revealed/旗事件流同理以到达序为规范序。**反例检验(语义序的存在性证明)**:朴素到达序下 #4 产出 (ap_exhausted, RAP+0)——违反 stopped > ap_exhausted;#2 吞掉清图高光——违反 cleared > stopped(EC10 同族缺陷)。**分类时点**:排序用批次初态、胜者路径用结算时点真值。C_dig 成员最先执行 ⇒ 其二态恒重合;C_other dig 的二态可因**前序 C_other dig** 执行而分歧(其批内前缀不可能含 C_dig/stop——二者任一执行即收轮、C_other 全体作废),分歧时按结算时点真值定胜者;该前缀无 stop ⇒ 与 A3 Rule 3(cleared > stopped)不可能冲突。 - -**Variables:** - -| 变量 | 类型 | 范围 | 说明 | -|---|---|---|---| -| ⟨I₁,…,Iₙ⟩ | 意图序列 | n ≥ 1 | 到达序;∈ {dig, flag_place, flag_pull, move, stop} | -| class(I) | enum 三类 | —— | 排序类别(批次初态求值) | -| ω | 意图 ∪ {∅} | —— | 胜者;∅ = 轮次继续 | - -**Output Range:** (path_tag ∪ {无}, continuation_hint ∪ {无}, RAP 增量, 每意图 ∈ {执行, 作废, 拒绝})。**Example:** ap=3、rem=1、批次 [stop, dig(末格)]:C_dig 先结算 → try_spend true、ap 3→2、事务内 cleared 胜出 → 外发 (cleared, new_board)、RAP+0;stop 作废。到达序翻转结果逐项相同(#1/#2)。 - -### 显式排除声明(R4 式) - -本 GDD **无平衡公式**。全部数值归位:**A3**(价目、ap_per_round、RAP 规则——F4 只消费 try_spend/request_stop/last_round_end 行为契约,零数值所有权);**A1**(雷布/尺寸/密度/可推理率/R₀ 与排除域定义版权——F3 是其运行期镜像,A1 侧定义修订 = 接口漂移 + metric_version 联动,A2 禁独立改动);**A4**(变异约束——F2 只消费"雾格恒非 0"生成保证);**B 系**(奖励档位/标中旗判定/结算编排——A2 只输出事件流);**C3**(曲线)。A2 拥有的全部 = 四条行为契约。零概率/期望公式(零随机——确定性由 AC-19 行为断言承载:同板同意图序列 ⇒ 事件流逐位相同)。**与 A1 度量的漂移风险清单(实现期红线)**:① 0 格判定必须读真实数字 num(x) 禁读显示值;② 初始展开禁加外扩环(破臂①)、禁只开 3×3(破臂②);③ clears_map 与 cleared 同一实现;④ chain_size 不含首格、链不开雷、含链开雾格;⑤ A1 R₀/算子修订 = metric_version 跳变 + 本 GDD 同步修订;⑥ 双包含臂①排除域以**最终产物板**计(先布后删无迭代,placed 基准可小于最终 R₀——A1 Rule 4 措辞修订义务,EC1)。 - -## Edge Cases - -- **EC1 If 初始展开即整图(R₀ = S,清图退化板)**:install 拒绝——不变式④ fail-fast(`board_invalid` + error 诊断),非合同内行为。**理由**:此类板使轮次棋盘路径出口结构性不可达,破坏 A2 状态机良构性;生产面由 A1 legality 闸拦截。**跨 GDD 阻断缺口(systems-designer 反例 B,主会话独立复算证实,登记 A1 修订义务)**:A1 现行"布雷数下限 N ≥ 1"必要不充分——8×8 板 8 雷 placed、先布后删幸存 1 颗距离-2 雷,最终板全 0 格连通 → R₀ = S,且 F4 断言 A(inferability=1.0)零拦截、N=1 参数行 100% 退化;**义务 = A1 F5 legality 增 `R₀ ≠ S`(违例 = 尝试作废重试,clearable 同款)+ F4 批量断言严格零 + Rule 4 排除域基准措辞(最终板计)**;A2 侧不变式④为纵深防御,双包含两臂不受影响。 -- **EC2 If install 产物违例**(B3 内雷 / B3∪R₀ 内变异 / 数字不恒真 / R₀=S):拒绝 + 状态不变 + error 恰一类别(不变式①–④)——信任边界 fail-fast;违例板只能由程序构造错误产生(A1 产物经生成期合法性闸),运行期不存在该输入源。 -- **EC3 If 挖已插旗格**:拒绝(board_face)——须先拔旗(1 AP)再挖;旗是"别挖这里"的承诺标记(A3 EC11 的棋盘面判定落点)。 -- **EC4 If 连锁传播开到雾格**(A2×4①):雾格被**免费**开出(channel=chain)、digit 恒真透传 + variant_ids 非空(呈现隐藏归 D1)、级联自然停止(雾格非 0 不传播)、计入清图、`reward_eligible=true` 奖励照常入库——零特判的自然结果,代码零变异分支。 -- **EC5 If 玩家在雾格插旗**(A2×4②):合法、耗 1 AP、旗立在未开雾格上;轮末判定恒 `hit=false`(雾区无雷——判定逻辑零特判自然覆盖)。**标错惩罚上线后的一致性推论(OQ1 前瞻登记)**:雾内旗按"非雷格上的旗"恒受罚——无 A4/A2 特判;D5 教学须警示"雾内插旗纯损"。 -- **EC6 If 同批次多结束路径竞争**:F4 语义序仲裁,四组合与 A3 Rule 3 逐项一致(真值表)、RAP 记账随胜者、作废意图零副作用(零棋盘写/零扣减/零事件——被作废的旗不进轮末判定,无幽灵旗);胜出后余意图作废,棋盘只读查询逐格不变。**联合清图让位条款(2026-09-09 评审登记)**:批内个体非清的 dig 联合可清图时,stop 仍先执行并胜出(C_stop ≺ C_other)——联合清图高光被停手让位,为语义序的显式设计后果(单意图帧提交下生产面不可构造——D1×6⑥ 单意图帧约束;F4 语义保留为防御性兜底,AC-10 义务不豁免)。 -- **EC7 If 最后 1 AP 挖开最后安全格**:cleared 与 ap_exhausted 同时成立 → A3 事务内 cleared 胜出(EC10)→ A2 外发 `(cleared, new_board)` 恰一条、剩余 AP 作废不入 RAP——防"耗尽优先"实现把清图高光结算为最差结局。 -- **EC8 If 战斗中热重载修改 VariationTable**(A2×4④):板持**生成期变异快照**(非活引用)——行为零变化;A2 零表读取使抗重载为构造性,行为级代理 = 换根重放事件流逐位相同(AC-18)。 -- **EC9 If 拒绝目录外溢**:board_face 全枚举见 Core Rule 5——目录外输入(越界坐标等)按 board_face 拒绝 + `sub_reason=out_of_catalog`(debug 级诊断,不与玩家语义混桶)+ debug 诊断禁静默吞;三源(board_face/resource_face/phase)互异可判定(D1 呈现数据源;玩家面文案归 D1,映射源 = sub_reason 枚举)。 -- **EC10 If 挖开雷格**:`kind=mine` 事件(无 digit)、轮次不结束、reward_eligible=false、格子可通行(工程债)可经其 BFS 续挖;同轮连续挖多雷 = 每雷独立事实事件;rem 不变(雷 ∉ S)。 -- **EC11 If 换图/刷新/战斗结束**:`install_board`(新板)= 旗/小人/已开集全量重置 + 初始展开重放;`retire_board` = 板实例与变异快照消亡——旗标记随图存续语义(A3 Rule 8)的 A2 侧终点。 -- **EC12 If 非 Active 相位动作请求**:拒绝(phase 源)、零事件、全态不变——A2 与 A3 两侧按同一相位矩阵各自判定、结论一致;不存在 0-AP 窗口(A3 Rule 3 的对侧消费)。 -- **EC13 If 批次内旗动作与终局意图竞争**:旗动作 ∈ C_other → 被 cleared-dig/stop 压新作废;判定基线 = **轮次结束事务开始时旗位**(作废旗动作不留痕)——语义序使基线与到达序无关。 -- **EC14 If 移动边界**:目标未开 / 无 BFS 路径 / 目标即当前格 → board_face 拒绝或幂等受理(目标格 = 当前格定义为零移动,合法受理);`compute_move_path` 对不可达格返回空——预览与执行同源。 -- **EC15 If 同批次多个 cleared-dig**:类内稳定序——到达序最先者执行并胜出,其余作废;(path_tag, RAP) 天然唯一,稳定序规范的是事件流与奖励格归属(F4 注 T1,AC-10 用例 e)。 -- **EC16 If install 与 A3 相位组合非法**(如非刷新路径的 Active 装板〔刷新路径已受理——D4 2026-09-12〕/ NoBoard 动作):编排面拒绝(板态/相位源)——B1 编排错误 fail-fast 暴露,禁静默(A3"拒绝 + debug 诊断"口径同族,进程致命保留给数据通道)。 -- **EC17 If 连锁前沿遇旗(GD-1 定稿,连锁不越旗)**:旗格不入链、不作传播源——被旗挡的格保持未开 + 带旗,仅经该格可达的后续格本轮不被链开(经其他路径可达者照常开出);chain_size 只计实开格;旗格轮末判定照常(`hit` 按其是否为雷——误标安全格留待玩家自拔,自己的承诺自己付 1 AP 撤回,与 OQ1 惩罚逻辑自洽)。零特判合规:传播集 `∖ G` 是集合减法非分支(F2 注)。 - -## Dependencies - -**Upstream**:A1(hard——棋盘产物与双包含回验出据方)· A3(hard——账本与轮次出口仲裁)· A4(soft——变异快照经 A1 产物透传,零运行时分支)。D2 为**登记的无直接依赖**(Core Rule 1 零表读取——D2 Interactions 表事实的 A2 侧证实)。无其他上游。 - -**Downstream**: - -| 依赖方 | 性质 | 接口 | -|---|---|---| -| B1 | hard(未设计,provisional) | 消费 round_end(棋盘路径)+ 三事件流;换图编排调 install_board/retire_board;**B1×3 强制项(缺项即 blocking,systems-index 门禁块登记)**:① 结算触发 = Waiting 相位编排点、不依赖事件到达序 ② reward_eligible=false(initial)格不入奖励库 ③ 标中旗兑付去重(资格以雷格实例为键——A2 诚实重复上报的对侧) | -| B4 | soft(未设计) | 清图奖励/安全格奖励内容(消费 reward_eligible/channel 事实,内容不经 A2);标中旗 debuff 兑付(经 B1) | -| D1 | hard(未设计) | 渲染 + 数字显示判定消费 variant_ids + 路径预览(compute_move_path)+ 三源拒绝呈现(含 sub_reason 玩家语义映射)+ 格态可辨/悬停预承诺/voided 呈现/单意图帧收集(详见 Interactions 表);**D1×6 强制项(缺项即 blocking,systems-index 门禁块登记)**——① stop 意图经 settle_batch 提交、不直调 A3(原 D1×1)② 格态一眼可辨 ③ 悬停预承诺+可挖域指示+chord 首遇提示 ④ 雷格可通行可读 ⑤ 路径呈现语义定稿 ⑥ 单意图帧收集 + voided 呈现 + 拒绝可感知 | -| D5 | soft(Alpha) | 教学口径来源(三动作/连锁免费/雾内旗纯损/雷格可通行) | -| D4 | soft(Alpha) | 音效挂三事件流 | -| A5 | soft(垂直切片) | 探测显影查询接口预留(OQ4,本 GDD 不预写) | - -**门禁义务落位表(本 GDD 门禁评审逐项核对,缺项即 blocking)**: - -| 义务 | 来源 | 承载位置 | -|---|---|---| -| A2×4 ① EC4 连锁开雾格(无数字+级联停止+计入清图+奖励入库) | A4 | Core Rule 6 + EC4 → AC-6 | -| A2×4 ② EC5 雾内旗恒不中(含标错惩罚一致性推论) | A4 | Core Rule 8 + EC5 → AC-12 | -| A2×4 ③ 开格上报携带变体标记 | A4 | Core Rule 2 + F2 注 → AC-6/18/20 | -| A2×4 ④ EC8 生成期变异快照抗表重载 | A4 | Core Rule 3 + EC8 → AC-18 | -| 双包含臂① A2 展开域 ⊆ A1 排除域 | A1 | Core Rule 4 + F3 → AC-3 | -| 双包含臂② A1 求解器初始态 ⊆ A2 展开域(恰等,回退口径不触发) | A1 | Core Rule 4 + F3 → AC-3 | -| 初始展开定义落点(免费/计入清图/无奖励) | A3 EC5 委派 | Core Rule 4 → AC-1 | -| round_end 棋盘路径外发 + payload 同构 | A3 Rule 9 | Core Rule 2/10 → AC-7/8/9 | -| EC4 批次四组合仲裁 + RAP 随胜者 | A3 EC4 deferral | Core Rule 9 + F4 + EC6 → AC-10 | -| 已引爆雷格可通行(工程债) | systems-index 门禁修正记录 | Core Rule 11 + EC10 → AC-15 | -| 标错惩罚以 OQ 登记(实测义务保留,不阻塞设计) | systems-index 2026-09-09 偏离登记 | OQ1(/design-review 核对在位) | - -**跨 GDD 新登记义务汇总**(本 GDD 出具,随 systems-index 门禁块登记):A1 修订义务 ×2(F5 legality 增 R₀≠S + F4 断言严格零;Rule 4 排除域基准措辞——EC1)· B1×3 · D1×6(2026-09-09 评审由 D1×1 扩容,见上表)· **B1/B4 增补两条(同批登记)**:高光兑现节点条目化(创意风险 #2/#3 合并——含 chord 缺席的标中旗即时兑现补偿候选,清单外散文登记会丢失——B3 先例)· 连锁批量授予溢出吸收设计(见 B4 行)。 - -**双向一致性核对**:A2 ← A1, A3, A4 ✅(索引依赖分层)· B4 ← A2,B3,D2 ✅ · D1 ← A2,A3,B1 ✅ · D4 ← A2,B1 ✅ · D5 ← A2,A3,B1 ✅ · A5 ← A2,A4,B4 ✅ · D2 表"A2 无直接依赖" ✅——无单向遗漏。 - -## Tuning Knobs - -**A2 零专属 knob(结构冻结系统,显式排除声明)**。A2 的全部手感参数都在邻接系统:节奏与价目归 A3(`ap_per_round`/`dig_ap_cost`/`flag_place_ap_cost`/`flag_pull_ap_cost`/`rap_refresh_cost`)、板面与推理保障归 A1(BoardGenTable 九字段)、变异资格归 A4(unlock_level)——**禁止在 A2 侧复制任何参数**(D2 Rule 1 单一事实源)。A2 拥有的是**规则结构**,修订走本 GDD 修订流程非调参:三事件面封闭、初始展开=R₀ 恰等、连锁免费、移动/初始展开不经账本、无 chord、批次语义序、四条 install 不变式、瞬移移动语义。 - -- **跨 GDD knob 联动观测**(引用不拥有):`flag_pull_ap_cost`(A3)= 挪旗成本与 OQ1 标错惩罚的双重定价位(A3 OQ2 复核落点——若实测推翻拔旗 1 AP,A2 行为零改动、仅价目表值变化);`ap_per_round` 决定每轮可兑现的确定动作供给(A3 OQ3 供给指标)。 -- **A2 侧可观测指标(非 knob,遥测域)**:每消耗 1 AP 点击数(≤ 2 护栏,P4 点击摩擦——D1 观测)、连锁规模分布、批次数/轮。 - -## Visual/Audio Requirements - -A2 无自有渲染面——视觉义务是**数据供给规格 + D1 呈现义务登记**: - -1. **数字可读性的数据前提**:digit 恒真透传(含雾格)是"数字是主角"(视觉锚 1)的逻辑地基——呈现层任何隐藏/遮罩都不改数据层真值;已开雾格 = 地板无字(负空间,防误读为 bug)。 -2. **绘制优先级固定**(视觉锚 3):数字 > 小人 > 旗 > 变异纹理 > 底色——小人所在格用边框高亮而非覆盖文本;A2 的事件流是 D1 分层绘制的输入。 -3. **三 channel 驱动动效语义**(D1/B5 消费):initial(开局整片亮起——"地牢初醒")、chain(连锁撕开——P1 高光时刻的动效载体;**连锁止于旗的呈现已登记 D1/教学**——GD-1 配套)、dig(单格回应);kind=mine 事件 = 已引爆雷格视觉态(已开底 + 雷图标 + **可通行可读**——工程债的呈现半边:玩家必须看得出"这是走过的雷、能走";**已升入 D1×6④ 义务台账**——单节登记不生效,2026-09-09 评审修正)。 -4. **变异标记保真**:variant_ids 透传错误即呈现欺骗(雾格显影/隐藏全链路的数据源)。 -5. **无 MVP 音频**:挖掘/连锁/旗/雷格/收轮音效挂 D4(Alpha,依赖分层 D4 ← A2,B1);事件流已含全部触发点。 - -> 注:`art-director` 未经咨询——Lean 模式,生产前请人工复核本节与 art-bible(排期门禁:D1 GDD 前创建 §1–4)的一致性。 - -## UI Requirements - -A2 不拥有 UI。登记 D1 义务(承接 + 新增): - -- **输入模型**:鼠标驱动(PC 主输入)——左键已开格 = 移动 / 未开相邻格 = 挖、右键 = 插/拔旗、停手按钮 = `settle_batch([stop])`;**全部意图经 `settle_batch` 提交**(D1×6① 强制项,Interactions 表)——单帧多意图时 A2 语义序仲裁兜底(F4);**D1×6⑥:输入收集以单意图帧为单位**(stop 点击终结当帧收集),F4 语义序退为防御性兜底。触屏/Gamepad 非 MVP 门禁(意图对象架构使后续接入零数据层障碍)。 -- **输入消歧的感知前提(D1×6②③)**:左键双义的消歧完全依赖玩家一瞥判对已开/未开——四种格态(已开 0 格地板/已开雾格无字/未开格/未开雾格)一眼可辨、悬停光标区分移动/挖/旗目标语义、可挖域(8 向相邻)常驻指示为硬前提(后果不对称:误挖 = 1 AP + 可能触雷且不可逆)。 -- **三源拒绝呈现**:board_face(sub_reason 封闭枚举——Core Rule 5)/ resource_face(AP 不足)/ phase(收轮中)——D1 可辨呈现,每次拒绝玩家可感知(AC-21 为数据源验收)。 -- **voided 呈现义务(D1×6⑥)**:作废意图(至少 stop 被作废)须玩家可感知——防 [dig清, stop] 静默改判清图、剩余 AP 清零不入 RAP 的读感欺骗。 -- **移动路径预览**:`compute_move_path` 返回 BFS 路径,呈现语义(合法性指示 vs 穿行动画轨道)归 D1 GDD 裁决定稿(D1×6⑤;systems-index 2026-09-07 门禁登记项——悬案的数据面已备)。 -- **输入摩擦护栏观测(2026-09-09 评审规格化)**:每轮原始输入动作数(含被拒/作废)∶ 当轮 AP 消耗 ≤ 2(A3 P4 载体;"点击"以设备中立"输入动作数"计)——归 D1 遥测(A2 只收意图对象、不收原始输入),≤2 为 playtest 待验证假设(挂 A3 OQ3);远距目标两击摩擦的复合意图(点击远格 = 自动 move+dig)登记为 D1 评估项(MVP 可裁决不做、留痕)。 -- 结算明细无 A2 附加项(效果归因全部经事件流字段由 B1 呈现,P2)。 - -## Acceptance Criteria - -> **测试载体与口径声明**:A2 是纯规则引擎——冒烟载体 = `godot --headless --script`(承 D2 冒烟框架;脚本 extends SceneTree、autoload 显式实例化)。**A2 冒烟 = Core-Core 集成**:被测面 = A2 规则引擎 + **真 A3 实例**(资源全经真账本 `try_spend` 驱动——A2 不可自行扣减;冒烟另以 B1 编排角色最小形驱动 `notify_round_start()`/`notify_settlement_done()`,仅开轮/收轮;B1 就绪后改走真实调用方,断言口径不变)。棋盘输入 = Board class_name 直引**程序构造**(不经生成器、不经 load()/preload()——A4 AC-5/A1 夹具先例;板规格即 A1 产物 schema 的坐标级实例化,A1 未实现不阻塞本冒烟)。**API 面(provisional,封闭枚举)**:`install_board(board)` · `settle_batch(intents)`(**D1 唯一提交入口**;单意图批 = 平凡形)· `try_dig/try_flag_place/try_flag_pull/try_move(cell)`(便捷形 ≡ 对应单意图批)· `compute_move_path(cell)`(只读)· `retire_board()`;intent ∈ {dig, flag_place, flag_pull, move, **stop**}(stop 执行 = 批事务内委托 A3.request_stop)。`ActionOutcome{accepted, outcome ∈ {executed, voided, rejected}, reject_reason ∈ {board_face, resource_face, phase, board_invalid}, sub_reason(仅 board_face 携带——封闭枚举见 Core Rule 5:not_adjacent/target_revealed/target_concealed/flag_present/flag_absent/no_path/out_of_catalog)}`。**无 chord 负空间**:封闭枚举即"无对应 API"的验收形态,新增快开入口 = 接口漂移。 -> **事件捕获断言面**:B1/D1 未设计 → 以事件捕获列表断言,分订两发射面——A2 面(cell_revealed / round_end 棋盘路径 / flag_judged)+ A3 直发面(stopped round_end)。**payload 口径钉死**:① digit 恒真透传(仅 kind=safe 携带;雾格携带真值——呈现隐藏归 D1,判定源 = variant_ids,A2×4③);② reward_eligible:channel=initial 恒 false、chain/dig ∧ safe 恒 true(含链开雾格)、kind=mine 恒 false;③ round_end 核心字段 ≡ A3.last_round_end 逐字段(同构)。**只读观测量**:A2 侧 = 已开集/旗集/小人位/事件捕获;A3 侧 = ap/rap/phase/last_round_end。多步 GIVEN 均给出构造序列。 -> **夹具策略(程序构造小板,每用例先 `reset_diagnostics()`)**:**行为夹具根 = 零**(A2 无数据表、无加载期校验类别——`--data-root` 通道在本域无消费者;资源面非默认价目分支经 D2 R3 debug override 构造,A3 AC-7 同款)。**登记常数协议(A1 黄金向量同源)**:每板登记 (R₀ 成员集, |R₀|, |S|, 关键格 digit, 级联集) + 逐格手工推导记录入版本库;失效处置 = 先复核推导、推导无误即实现缺陷。板清单(W=H=7 或 8;**spawn = 出生 3×3 中心格坐标,逐板显式登记**:b_spawn / b_flag / b_batch / b_mine_walk / b_degenerate = (3,3),b_chain / b_fog = **(3,2)**——按默认"板中心"读法该两板 B3 = {2..4}² 会含 y=4 雷墙雷、违反不变式①,板不可安装;2026-09-09 评审修正并纳入 OQ3 复核范围): -> -> | 板 | 规格(坐标级要点) | 服务 | -> |---|---|---| -> | `b_spawn` | M = {(1,y): y∈[0,6]∖{3}} 竖墙 6 雷留缺口;R₀=35、\|S\|=43、未开 8 格;(1,3) digit=2 | 安装五属性/双包含/挖掘/移动/相位 | -> | `b_chain` | spawn=(3,2);M = y=4 横墙 6 雷留 (3,4) 缺口;R₀=28(y∈[0,3] 全安全格);墙下封闭区 14 格;(3,6) 为 0 格、级联集 \|C\|=13 | 连锁/双包含/链不越旗 | -> | `b_fog` | spawn=(3,2);b_chain 几何 + M += {(5,0),(6,1)};雾 F = {(0,5),(1,5)}(链可达)∪ {(6,0)}(链不可达);雾格 digit 2/3/2、厚度≤2 ✓;R₀ 常数随 M 变化按板重算((6,2)/(6,3) 退出 R₀) | 雾链两态/雾旗/快照/零特判/回放 | -> | `b_fog_bare` | b_fog 同 M 同几何、variant 标记剥离 | AC-20 同构对板 | -> | `b_flag` | b_spawn 同几何复用;(1,2)/(1,4) 雷 = hit 旗靶、(0,3) 安全 = miss 旗靶 | 旗生命周期/轮末判定/三源拒绝 | -> | `b_batch` | b_spawn 同几何复用(未开恰 8 格支持构造) | 批次四组合/两收轮路径 | -> | `b_mine_walk` | M = {(3,5)} 单雷;(3,4) digit=1 ∈ R₀ | 雷格挖开/已引爆可通行 | -> | `b_degenerate` | 8×8、M = {(7,7)} 单雷角——R₀ = S(全 0 格连通,构造性退化) | 不变式④ install 拒绝 | -> | `b_invalid_*` | ① mine_spawn:b_spawn+M+=(3,3) ② fog_spawn:b_fog+F+=(3,2) ③ fog_flood:b_fog+F+=(5,1)(R₀ 成员)④ digit:b_spawn+数字篡改 | 不变式①②③④ 各一(AC-2) | -> -> **期望值推导纪律**:行为类 THEN 数值 = ConfigDB A3 表读值推导(ap_per_round/各价目经测试通道读取)⊕ 板登记常数;不写死玩法数值;唯一例外 = 登记常数。默认价目全 1 AP 下"AP 不足"分支不可构造(A3 EC2 同款)——资源面分支显式承载于 debug override 非默认表值(AC-21)。 -> **致命类独立进程协议:零行 manifest(显式声明)**——D2 AC-2b 协议适用前提 = 加载期数据通道致命;A2 无加载期校验,install 违例 = `board_invalid` 拒绝 + error 诊断(进程致命保留给数据通道;实现期 ADR 若裁决升格,回本节补 manifest 行)。 -> **out-of-scope 覆盖声明(deferral 以对侧登记为生效条件)**:**B1**——轮次编排接线(Waiting 出口/next_round_mode/request_refresh 代理)、结算兑付与 P2 来源标注、**兑付去重**(诚实重复上报的对侧,A3 Rule 8/OQ5)、EC8 末轮判定次序、双发射源消费序(对侧登记:systems-index B1×8 义务清单 + 本 GDD B1×3,生效条件成立);**B4**——奖励内容与差异化插槽、debuff 档位(对侧登记:A4 三条定价硬约束);**D1**——数字显示消费 variant_ids、三源呈现、路径预览表现、点击摩擦观测(对侧登记:A4 D1×2 + 本 GDD D1×6);**A5**——显影接口(OQ4);**A1×A2 双包含端到端集成用例**——"A1 真生成器产物 → A2 install"全链路回验两系统实现后集成冒烟承载(本 GDD 冒烟用程序构造板,登记 deferral,2026-09-09 评审补);**标错惩罚**——OQ1 登记,本节仅承一致性推论预告(惩罚前 AC-12 只断言 hit=false)。 - -**安装与初始展开** - -- **AC-1(安装 + 初始展开五属性 + A3 EC5 定义落点)** GIVEN 真 A3 实例(phase=Idle)与 `b_spawn`,WHEN `install_board(b_spawn)`,THEN accepted=true 且事件捕获**仅**含 cell_revealed 批,逐事件断言:① **免费**——A3 ap 仍=表读值(零 try_spend)且诊断零新增;② **计入清图**——构造序列挖尽未开 8 格(登记常数)时恰在第 8 次触发 `round_end{cleared, new_board}`(无超前/滞后);③ **无奖励**——全部 reward_eligible=false(channel=initial);④ **永不触雷触雾**——全部 kind=safe;⑤ **恰等 R₀(有序断言)**——事件**有序列表** ≡ 测试侧朴素 BFS 重算 R₀ 的行主序枚举,逐格逐序相等(规范序钉死——DFS/列主序等"错误但确定"的实现不可通过;登记常数 |R₀|=35 为独立锚)。随后 `notify_round_start()` → Active。〔覆盖 Core Rule 4;A3 EC5 委派〕 -- **AC-1b(不变式④·清图退化板拒绝)** GIVEN `b_degenerate`(R₀=S 构造板),WHEN `install_board`,THEN accepted=false、reject_reason=board_invalid、error 诊断恰一条类别=**inv4_r0_equals_s**(枚举见 Core Rule 3);WHEN 随后 `install_board(b_spawn)`,THEN accepted=true(拒绝原子性)。〔覆盖 EC1/不变式④〕 -- **AC-2(不变式①–③·违例板 fail-fast)** GIVEN `b_invalid_mine_spawn`/`b_invalid_fog_spawn`/`b_invalid_fog_flood`/`b_invalid_digit` 各板(每用例先 reset_diagnostics),WHEN 各 `install_board`,THEN 均 accepted=false、board_invalid、error 恰一对应类别(**inv1_mine_in_spawn / inv2a_variant_in_spawn / inv2b_variant_in_r0〔"R₀ 触雾"归此——②的 R₀ 子情形〕/ inv3_digit_invariant**,封闭枚举见 Core Rule 3)。〔覆盖 Core Rule 3/EC2〕 -- **AC-3(双包含回验两臂——门禁缺项即 blocking)** GIVEN `b_chain` 与 `b_fog` 各 install 后捕获的初始域格集 E(B),测试侧按 A1 F1/Rule 4 公开定义朴素重算 R₀(B) 与排除域 X(B)=R₀∪外扩 1 环(**X(B) 以最终产物板计**——先布后删后基准,A1 Rule 4 措辞修订义务 EC1),THEN **臂①** E(B) ⊆ X(B);**臂②** E(B) ≡ R₀(B) **逐格恰等**(不欠展开也不过度展开——A1 回退口径不触发的行为面)。两板全用例通过。〔覆盖 Core Rule 4/F3;registry a2_dual_containment〕 - -**挖掘、连锁与雾** - -- **AC-4(挖掘基元 + 数字恒真透传 + 单意图批等价护栏)** GIVEN `b_spawn` Active、小人于 R₀ 内,WHEN `try_dig(c)`(相邻未开),THEN executed、A3 ap −dig_ap_cost(表读值,真 try_spend)、事件恰一条 `{cell=c, kind=safe, channel=dig, reward_eligible=true, digit ≡ 测试侧重算 8 邻雷数}`;WHEN `try_dig`(非相邻 / 已开格 / 有旗格),THEN rejected+board_face(sub_reason 分别 = not_adjacent / target_revealed / flag_present)、零事件、ap 不变;**等价护栏用例**:同构造态分别驱动 `try_dig(c)` 与 `settle_batch([dig c])`(各新轮),THEN 事件流/ap/棋盘只读观测量/诊断逐项相同(Core Rule 9 单意图批 ≡ 便捷形)。〔覆盖 Core Rule 5/9;A3 Rule 2〕 -- **AC-5(连锁展开 + 链不越旗)** GIVEN `b_chain`,WHEN 构造序列挖 (3,4)→移→挖 (3,5)→移→`try_dig((3,6))`(0 格),THEN 第三次 executed 且 ap 总耗 = 3×dig_ap_cost(级联免费——非 3+13 格);事件:channel=chain 批恰 |C|=13 条(登记常数)**且序 ≡ 测试侧 BFS 行主序枚举**、全 reward_eligible=true、digit 恒真透传、事件数 = chain_size + 1(一致性恒等式);级联止于非 0 格(链只经 0 格扩);链格计入清图(挖尽封闭区后余格清图即 cleared)。**分支 2(链不越旗——EC17)**:构造至小人立于 (3,5) 后 `try_flag_place((2,5))`(未开相邻,1 AP)→ 再 `try_dig((3,6))`,THEN (2,5) 保持未开 + 带旗(零 cell_revealed)、chain_size=12(级联集减 1——(1,5)/(1,6) 经 (2,6) 照常开出,仅旗格本身被挡)、旗格轮末判定照常。〔覆盖 Core Rule 6/F2/EC17〕 -- **AC-6(连锁开雾格——A2×4①③ 承载;原 EC4 专项断言编号化,2026-09-09 评审)** GIVEN `b_fog`,WHEN 同 AC-5 构造至 (3,6) 级联,THEN 四项逐验:① 链可达雾 (0,5),(1,5) 免费开出(channel=chain、ap 无雾附加扣减);② variant_ids 含 "fog" 且 digit=2/3 恒真透传(呈现判定数据源——A2×4③ 同板证);③ 级联停止(级联集与 b_chain 同构板逐格同形——雾格只作叶);④ reward_eligible=true 且计入 cleared 判定。**另一用例(链不可达全价)**:小人移至 (5,1) 后 `try_dig((6,0))` → executed、channel=dig、耗 1 AP 全价、variant_ids 非空、digit=2 透传。〔覆盖 A2×4①③;A4 EC4/fog_ap_note 两态执行侧〕 - -**结束路径与批次仲裁** - -- **AC-7(cleared 路径 + payload 同构 + 同帧竞争)** 用例 1(同帧竞争,EC7 钉死):GIVEN `b_batch` 构造至"未开恰 1、**ap=1**"(cleared 与 ap_exhausted 同事务成立——"耗尽优先"缺陷仅在此构造可检出),WHEN `try_dig(末格)`,THEN executed、A2 面 `round_end{cleared, new_board}` 恰一条(ap_exhausted 不触发)、其字段 ≡ A3 `last_round_end` 同帧读值(组包数据源行为面)、与 stopped 路径 payload 同构(字段集/类型一致)、rap 不变(剩余作废);用例 2(剩余作废非平凡分支):同构造 ap=k≥2,WHEN `try_dig(末格)`,THEN cleared 恰一条、rap 不变(k−1 > 0 作废非平凡)。〔覆盖 Core Rule 10/EC7;A3 Rule 5/6/9/EC10〕 -- **AC-8(ap_exhausted 路径 + 零窗口)** GIVEN `b_batch` 未开 ≥2、ap=1,WHEN `try_dig(非末格)`,THEN executed、`round_end{ap_exhausted, same_board}` 恰一条、A3 remaining_ap=0 不变式;WHEN 紧接任意 `try_*`,THEN 全部 rejected+phase、零事件。〔覆盖 Core Rule 10;A3 Rule 3/EC1/EC14〕 -- **AC-9(stopped 路径 + 直发面捕获)** GIVEN `b_batch` Active 未开完、ap=k≥1,WHEN `settle_batch([stop])`,THEN **A3 直发面**捕获 `round_end{stopped, same_board}` 恰一条(A2 面零 round_end——双发射源行为面)、rap = 前值 + k(1:1,表读值推导)、事件序 = flag_judged ×N 先于 round_end(事件序契约)。〔覆盖 Core Rule 9;A3 Rule 4/9〕 -- **AC-10(批次四组合仲裁 + 耗尽型救援 + 联合清图——A3 EC4 deferral 义务兑现)** GIVEN `b_batch`(每用例新轮新构造):**a**〔dig清→stop〕→ cleared 胜出、rap 不变(作废);**b**〔stop→dig清〕→ 与 a 同结果(同 path_tag/同 rap 终态/同事件数——异类序无关性);**c**〔dig→stop,ap=1 耗尽型构造:新轮 7 次非清挖〕→ **语义序救援用例**:stopped 胜出(朴素到达序将产出 (ap_exhausted, RAP+0)——语义序校正为 (stopped, RAP+1))、rap += 1(表读值推导)、被弃 dig 格仍未开(续轮同图可证);**d**〔stop→dig,同 ap=1 构造〕→ 与 c 同结果;**e**〔dig清₁→dig清₂ 同批〕→ 类内稳定序:到达序最先者执行胜出、恰一条 cleared、第二 dig 作废零副作用;**f**〔非清 dig₁→非清 dig₂ 联合清图;多步 GIVEN:前轮挖雷 (1,2) 开道(雷格可通行的构造性利用)→ 挖尽 x=0 列余格 → 停手收轮;新轮未开恰 {(0,3),(1,3)}、ap=8〕→ dig₁ 执行不清图(rem 2→1)、dig₂ 结算时点 clears_map=true 胜出 → cleared、两意图均执行、rap 不变(出口映射按结算时点真值键控——F4)。全用例断言:作废意图零棋盘写/零扣减/零事件(棋盘只读查询逐格不变)、round_end 恰一条;c/d 断言 `flag_judged ×N` 先于 `round_end`(事件序契约)。〔覆盖 Core Rule 9/F4/EC6/EC13/EC15;**A3 冒烟不可构造用例在本节兑现,deferral 生效**〕 - -**旗** - -- **AC-11(旗插拔挪 + 挖旗格拒绝)** GIVEN `b_flag`、小人于 (2,3),WHEN 依次插 (1,4)、插 (1,2) 后拔 (1,2)(挪旗),THEN 全 executed、ap 合计 −(place+pull)×2(表读值)、旗集随动、零事件外发;WHEN `try_dig((1,4))`(有旗),THEN rejected+board_face(EC11 落点);WHEN 插非相邻/插已开/插已有旗/拔无旗/拔非相邻,THEN 各 rejected+board_face。〔覆盖 Core Rule 5/8;A3 EC3/EC7/EC11〕 -- **AC-12(轮末统一判定 + 雾旗恒不中 + 诚实重复上报——A2×4②)** 分支 1:GIVEN `b_flag` 插 (1,4)(雷)与 (0,3)(安全,经挖 (1,3) 后站立可达),前置断言验"被拔的不判"(插 (1,2) 后拔,轮末无该条目),WHEN `settle_batch([stop])`,THEN flag_judged 恰 2 条**集合断言**:{(1,4),true}、{(0,3),false}(行主序枚举);分支 2(雾旗):GIVEN `b_fog` 小人相邻未开雾格插旗,WHEN 轮末,THEN `{cell,hit=false}` 恒(雾区无雷零特判;标错惩罚上线后"恒受罚"推论 = OQ1,惩罚前不可判定);分支 3(重复上报):分支 1 收轮后 `notify_settlement_done(same_board)`+`notify_round_start` 续轮旗仍在,WHEN 再停手,THEN 再次 `{(1,4),true}`——A2 逐轮诚实重复上报,**去重归 B1/B4(out-of-scope)**。〔覆盖 A2×4②;A4 EC5;A3 Rule 8/OQ5 上报半〕 -- **AC-13(旗随图存续 + 初始展开不重放)** GIVEN `b_flag` 已插 2 旗 stopped 收轮,WHEN 续轮(same_board),THEN 旗集不变且**事件捕获零新增 cell_revealed**(初始展开板级一次、跨轮不重放——每轮重放的违例实现在此用例现形);WHEN `retire_board()` + `install_board(b_fog)`,THEN 旗集 = 空、初始展开照常(按新板)。〔覆盖 Core Rule 8/EC11;A3 Rule 8/EC9〕 - -**移动与雷格** - -- **AC-14(移动 BFS + 确定性 + 免费)** GIVEN `b_spawn` 小人于 (3,3),WHEN `compute_move_path((2,3))` 两次,THEN 逐格相同(确定性)且全格 ∈ 已开集、相邻步 8 向合法;WHEN `try_move((2,3))`,THEN executed、位置更新、**ap 不变**(不经账本)、零事件。**拒绝/幂等四对(输入-输出显式配对)**:① move 未开格 → rejected+board_face(sub_reason=target_concealed);② move 已开但 BFS 不可达格 → rejected+board_face(sub_reason=no_path)**且** `compute_move_path` 对同格返回空(预览与执行同源,一用例双断言);③ move 目标 = 当前格 → executed 幂等(零移动:位置不变、零事件、ap 不变——EC14);④ 正常移动分支保持。〔覆盖 Core Rule 7/EC14;A3 Rule 2 移动行/P4〕 -- **AC-15(雷格挖开 + 已引爆可通行——工程债)** GIVEN `b_mine_walk`、小人于 (3,4),WHEN `try_dig((3,5))`,THEN executed、ap −1、事件恰一条 `{kind=mine, channel=dig, 无 digit 字段, reward_eligible=false}`、**轮次不结束**(两面零 round_end);WHEN `try_move((3,5))`,THEN executed(**可通行**——工程债验收落点)、位置=(3,5);WHEN 经雷格续挖 (3,6),THEN 正常受理。〔覆盖 Core Rule 11/EC10;systems-index 工程债登记〕 - -**相位、重置、快照** - -- **AC-16(相位拒绝)** GIVEN NoBoard 或 Installed·Frozen(Idle/Waiting 两分支),WHEN 依次 dig/flag×2/move/`settle_batch([stop])`,THEN 全部 rejected+phase、棋盘只读查询与事件面逐字不变;GIVEN Active,WHEN `install_board`/`retire_board`,THEN 拒绝(板态——EC16)。〔覆盖 States 矩阵/EC12/EC16;A3 输入×相位矩阵对侧〕 -- **AC-17(retire/重装重置)** GIVEN `b_spawn` 已装且部分挖掘,WHEN `retire_board()`,THEN 全动作拒绝(phase;无板态)、事件分段边界确立(跨段断言禁止——防前图泄漏);WHEN `install_board(b_flag)`,THEN 初始展开按新板重算、无前板残留(旗/小人位/已开集)。〔覆盖 Core Rule 3/EC11〕 -- **AC-18(快照抗表重载——A2×4④)** GIVEN `b_fog` 基线事件流 E₀ 已捕获,WHEN 测试通道换根加载变异表(B3 AC-15 换根模式)后重放同一意图序列(新 A3 实例+新 install),THEN 事件流与 E₀ **逐位相同**(含 variant_ids)——生成期快照非活引用;A2 零表读取(AC-22③)使抗重载为构造性,本用例为行为级代理。〔覆盖 A2×4④;A4 EC8〕 - -**确定性与零特判** - -- **AC-19(确定性回放)** GIVEN 同坐标规格独立构造的 `b_fog` ×2(各配全新 A3 实例),WHEN 同一定长意图序列驱动两遍(含挖/链/雾链/插拔旗/移动/多意图批/停手收轮——覆盖三 channel、flag_judged 与批次仲裁),THEN 两遍事件捕获列表**逐位相同**(数、序、全字段)。〔覆盖 Core Rule 1;D2 Rule 5 的 A2 层〕 -- **AC-20(零特判行为代理——A2×4③ 反向证成)** GIVEN (`b_fog`, `b_fog_bare`) 同构对(同雷布同 digit、仅 variant 标记差异),WHEN 同一意图序列各驱动一遍,THEN 两事件流**除 variant_ids 外逐位相同**(差分容许域 = 该字段且仅该字段)——连锁/清图/旗判定/价目/收轮全不感知变异。〔覆盖 A4 Rule 4 零特判;Core Rule 1〕 - -**拒绝原因与扫描** - -- **AC-21(三源拒绝区分 + sub_reason 玩家语义)** GIVEN `b_flag` + debug override `action_economy.flag_place_ap_cost=2`(D2 R3 域内值;**承载声明**:默认价目下资源面分支不可构造,同 A3 AC-7)构造 ap=1,WHEN `try_flag_place`(棋盘面合法),THEN rejected+**resource_face**、全态不变;WHEN `try_dig`(非相邻),THEN **board_face + sub_reason=not_adjacent**;WHEN `try_dig((1,4))`(有旗格),THEN **board_face + sub_reason=flag_present**("须先拔旗"与"非相邻"数据可分——UX-1 定稿验收);WHEN Waiting 相位任意动作,THEN **phase**——三源互异可判定;**目录外用例(EC9)**:WHEN `try_dig((-1,-1))`(越界),THEN rejected+board_face + **sub_reason=out_of_catalog** + 诊断收集器恰一条 debug(非静默吞)。〔覆盖 Core Rule 5/EC9;A3 EC2 对侧〕 -- **AC-22(静态扫描·零随机/零表读取/零 UI——承 D2 AC-9/10 模式)** GIVEN A2 文件集(规则引擎/事件载荷/冒烟脚本/夹具规格),THEN:① 零 `randomize()`、零自建 RNG 构造(**tests/ 豁免不启用**——A2 确定性回放不需种子,严于 A1 先例);② 零 ConfigDB 外 data 表加载(Board class_name 直引豁免);③ **零 `ConfigDB.*` 属性读取**(A2 全部输入经 A3 账本与 A1 产物——设计决策;实现期 ADR 若裁决需读表,走接口漂移修订本条);④ 零 `extends Control/Node2D`、零 `.tscn` preload;⑤ AC-1 在 `godot --headless --script` 实跑通过(退出码 0 + 断言收集器零失败)作为本项判定(Rule 7);⑥ 纳入 D2 AC-14 项目级人工三要素字面量扫描(warning 级 + 人工复核,成员清单随实现建立并入——B3 AC-19 同款)。〔覆盖 Core Rule 1;D2 Rule 1/2/5/7〕 - -**覆盖矩阵(验收评审用)**:Core Rule 1→AC-19/20/22 · 2→AC-4/6/7/8/9(payload 前言钉死)· 3→AC-1b/2/17/18 · 4→AC-1/3(A3 EC5 委派 + 双包含)· 5→AC-4/11/21 · 6→AC-5/AC-6 · 7→AC-14 · 8→AC-11/12/13 · 9→AC-4 等价护栏/AC-9/10 · 10→AC-7/8 · 11→AC-15 · 12(无 chord 负空间)→API 封闭枚举 · F1→AC-1②/5/7 · F2→AC-5/AC-6 · F3→AC-1⑤/3 · F4→AC-10 · EC1→AC-1b · EC2→AC-2 · EC3→AC-11 · EC4→AC-6 · EC5→AC-12 · EC6→AC-10 · EC7→AC-7 用例 1 · EC8→AC-18 · EC9→AC-21 目录外用例 · EC10→AC-15 · EC11→AC-13/17 · EC12→AC-16 · EC13→AC-10c/d · EC14→AC-14 四对 · EC15→AC-10e · EC16→AC-16 · EC17→AC-5 分支 2 · **A2×4①→AC-6 · ②→AC-12 · ③→AC-6/AC-18/AC-20 · ④→AC-18 · 双包含①→AC-3 · ②→AC-3 · A3 EC4 deferral→AC-10 · 工程债→AC-15 · OQ1 在位→OQ 节**。(23 条 = AC-1…AC-22 + AC-1b;2026-09-09 评审将原"EC4 腿"编号为 AC-6 并补 EC17。) - -## Open Questions - -1. **标错惩罚(已拍板偏离登记,2026-09-09 用户拍板——systems-index 门禁留档)**(owner:用户 + 原型小补丁会话;deadline:垂直切片前置 playtest 合并会话前):门禁原要求"标错惩罚用原型小补丁实测后再写本 GDD"(2026-09-07 CD/PR 门禁),现改为以本 OQ 形式登记、不阻塞设计——**候选方案 = 敌方伏击 +1**(标错旗在轮末判定 `hit=false` 时为敌方追加 1 层伏击;量纲随 B2 ambush 定稿联动),**实测义务随本 OQ 保留**、实测依赖 playtest 会话与先推进设计主链的偏离理由已留档。本惩罚兼任**双重职责**(A3 OQ2):误标税 + 停手轮/死 RAP 态下旗滥用的唯一价格。**一致性推论(上线时生效,无特判)**:雾内旗恒受罚(A4 EC5)、判定载体 = 本 GDD `flag_judged.hit=false` 事实流(B1/B4 消费,A2 零改动)。**惩罚重复性裁决项(2026-09-09 评审增补,实测会话前钉死)**:hit=true 兑付有去重(每雷实例一次,B1×3③),hit=false 惩罚**无去重声明**——按现行轮末判定载体,忘拔的错旗默认每轮 +1 伏击(5 轮 = +5),与一次性收益严重不对称;候选 = 随旗实例去重 / 显式接受每轮累计("流血"设计),须在原型实测会话前落定,防实测数据混淆"一次性过重"与"累积过重"。落地动作:原型 v3 补丁实测(可与 v3 终验合并会话)→ 实测支持则修订本 GDD(判定批扩展)+ registry;否决则关闭 OQ 并在 A3 OQ2 另定价旗滥用。**A2 /design-review 须核对本 OQ 在位,缺位即 blocking。** -2. **事件外发载体与捕获 API(实现期 ADR 确认项)**(owner:实现期 ADR):signal vs 回调注册、事件捕获断言面的落地形态——**依赖事件捕获列表的 THEN(AC-1/3/4/5/6/7–10/12/13/15–20 的事件序列断言)**为纸面契约,ADR 未确认前该子集不视为可执行(A1 缺口 G1"度量独立入口"同型);返回值/诊断/静态扫描类断言(AC-1b/2/11/14/16/21/22 及各 AC 的 reject 分支)不在此限、现在即可执行(2026-09-09 评审范围收窄)。 -3. **夹具登记常数第二人复核**(owner:A2 /design-review):各板 (spawn 坐标、R₀ 成员集/级联集/digit) 手工推导记录入版本库后安排复核——推导错误即假失配/假通过(A1 OQ5 同型);**spawn 坐标为 2026-09-09 评审新增登记项**(b_chain/b_fog=(3,2),默认中心读法产出不变式①违例板)。 -4. **A5 探测道具接口预留**(owner:A5,第 11 位):显影(未开雾格数字显影)对 A2 查询面的需求形态——接口归 A5 GDD 定稿,本 GDD 不预写(Interactions A5 行)。 -5. **D1 输入接线确认**(owner:D1,第 10 位):stop 意图经 `settle_batch` 提交的接线义务(D1×6① 强制项)与单帧多意图的真实构造性——**2026-09-09 评审升格**:单意图帧输入收集已从本 OQ 升格为 D1×6⑥ 登记约束(stop 点击终结当帧收集或等效;若 D1 保证单意图帧,四组合仲裁退化为结构不可构造——义务仍由 AC-10 冒烟承载,不豁免)。 -6. **拔旗价目与旗滥用观测联动**(owner:A3 OQ2/OQ3,低优先):`flag_pull_ap_cost` 复核与"停手轮旗动作占比"指标的 A2 侧观测量(旗动作批占比)——A2 零改动,遥测口径随 A3 复核会话对齐。 diff --git a/design/gdd/legacy-2026-09-13/a3-action-economy.md b/design/gdd/legacy-2026-09-13/a3-action-economy.md deleted file mode 100644 index b4e4c86e..00000000 --- a/design/gdd/legacy-2026-09-13/a3-action-economy.md +++ /dev/null @@ -1,220 +0,0 @@ -# A3 行动经济(Action Economy) - -> **Status**: Approved(2026-09-07 三轮 re-review 8 条文本级 blocking 同日全部核销;用户拍板接受修订并标记 Approved、免独立 delta 核销——核销依据见评审日志第三轮对照表与放行记录;不设第四轮全量评审) -> **Author**: user + agents(数值继承原型 v2/v3 实测结论与 game-concept 定稿;2026-09-07 三轮 full review:game-designer · systems-designer · qa-lead · economy-designer · creative-director;本轮修订由三轮评审结论推导,跨文档回写见评审日志) -> **Last Updated**: 2026-09-07(三轮评审修订版 · 评审日志:`design/gdd/reviews/a3-action-economy-review-log.md`) -> **Implements Pillar**: P1(主)· P2(次)· P3(旗稀缺性→AP 机会成本)· P4(移动免费的氛围归属) -> **Layer**: 1 Foundation · **Milestone**: MVP · **设计顺序**: 第 2 位(上游 D2 已 Approved,本次修订含 D2 delta 回写) - -## Overview - -A3 定义玩家在每个轮次里的行动预算与支出规则:每轮固定 AP(行动点 8),每种动作的统一价目(挖 1 AP、插旗 1 AP、拔旗 1 AP、移动免费、连锁展开免费),以及两条轮次出口的资源去向——**主动停手**把剩余 AP 按 1:1 转存进 **RAP 池**(remain action point,战斗域风险资源,攒满 `rap_refresh_cost` 可刷新雷图),**清图**则剩余 AP 直接作废、只产出清图奖励(内容归 B4)。A3 是玩家 agency 的计量器:扫雷侧的每个决策都花 AP,所有收益以**战斗效果**(安全格→主角 buff、标中旗→怪物 debuff、踩雷→怪物 buff,2026-09-07 用户三向效果定稿)直接进入轮次结算——A3 自身不产生、不折算任何抽象"资源点"。 - -对节奏的真实作用:AP 不减少总点击量,它把点击**摊销**进多个轮次并插入结算节拍;真正的决策压缩器是**连锁展开**(1 次点击兑现一片区域)与**停手**(主动放弃剩余格子换取风险退出权)。停手已退出战斗经济(不产出任何战斗收益)——它是纯粹的风险管理工具:"这轮我不想赌"的出口,而非另一条收入流。没有 A3,挖/旗/停手就没有统一成本语言;A3 自身不含任何随机性与表现面——纯资源账本,执行归 A2、兑付归 B1、显示归 D1。 - -## Player Fantasy - -直接承载(玩家每轮都在与之互动)。A3 服务支柱的体验锚点: - -- **P1"我算对了"的节拍器**:AP 预算把推理的兑现切进轮次节拍——推理本身免费完成,AP 决定"本轮能把多少已推出的结论兑现";取舍的真实落点在**构成选择**(确定动作供给 >8 时先兑现哪些)与**轮末尾巴**(赌不确定格 vs 停手攒 RAP),供给 ≤8 时确定动作可近乎无代价延后(棋盘跨轮存续)——决策密度由 A1 供给兜底,监测归 OQ3 供给指标。连锁展开免费是推理的放大器——一次正确的推断被免费兑现成一整片区域,紧张但不窒息。终局碎片区的零风险收尾可能跨轮完成,是节奏阀的有意代价。 -- **P2"规划的延迟兑现"**:每个安全格的 buff 当场入库、结算明细可见;停手改产 RAP 后,"何时收手"不再兑换成战斗现金,而是兑换成**风险退出权**——面对纯盲猜时,攒 RAP 换一张新图是"我不赌"的体面出口(2026-09-07 结构修订,原"停手折算现金"作废)。 -- **P3"风险与收益同源"**:三向效果映射(用户定稿)使同源原则具象——标中旗削弱敌人、踩雷强化敌人、挖安全格强化自己;旗子无数量上限(2026-09-07 修订),稀缺性由 **AP 机会成本**承载(8 向相邻限制约束的是当轮几何而非总量——跨轮小人可走遍全图):插一面旗 = 放弃一次挖掘(连锁富集区该成本放大、死 RAP 态碎片区趋零,条件性与其对冲见 OQ2 双重职责);挖已插旗格须先拔旗(EC11)——承诺有重量。 -- **P4 地牢氛围的承载项**:小人移动免费、挖/旗限相邻,服务"边缘探索"的地牢感(P4)而非经济杠杆——移动成本不是调参对象,点击摩擦护栏归 A2/D1 观测(每消耗 1 AP ≤ 2 次点击)。 - -参考感受:扫雷原版的无限额被本作刻意打破,预算把节奏从"点完为止"改为"每轮取舍";价目均匀分布是有意的 MVP 简化,异质性钩子(地形成本修饰)已为 A4 预留(Rule 2)。无 chord(双击快开)是**有意偏离经典扫雷**——保护"每格兑现都花 AP"的预算意义;正确标雷缺一键兑现节拍已登记 CD 创意风险 #3(与 #2 高光缺失合并归 B1/B4)。 - -## Detailed Design - -### Core Rules - -1. **每轮硬重置(仅 AP)**:轮次开始时 AP=8(`ap_per_round`);上轮剩余不累积、不结转。**RAP 是唯一跨轮携带量**(战斗域,见 Rule 11)。 -2. **统一价目表**(A3 定价、A2 执行,全部动作的唯一消耗口径;挖/插/拔均限小人 8 向相邻格;**无 chord**——有意偏离经典扫雷的双击快开,保护 AP 预算的决策意义,A2 承载): - - | 动作 | 消耗 | 备注 | - |---|---|---| - | 挖开格 | `dig_ap_cost`(1 AP) | **仅限小人 8 向相邻格**;若触发连锁展开(flood fill),**连锁部分免费**(v2 定稿:推理的放大器),连锁开的格计入清图进度 | - | 插旗 | `flag_place_ap_cost`(1 AP) | 仅限相邻格(v3 统一行动经济);**无旗子实物资源**——旗为棋盘标记,数量无上限(2026-09-07 用户修订) | - | 拔旗 | `flag_pull_ap_cost`(1 AP) | 仅限相邻格(与挖/插对称);移除棋盘标记、无返还物(无口袋旗可返)——"拔旗耗 AP"为本 GDD 确认的 v3 条文读法(OQ2 挂原型补丁复核) | - | 移动小人 | 0(冻结) | 点击已开格移动,BFS 限已探明区(A2 承载);免费服务 P4 探索氛围,非经济杠杆、调参豁免 | - | 连锁展开 | 0(冻结) | 免费,含连锁开的格计入清图进度 | - -3. **资源耗尽语义与结束仲裁**:AP 归 0 的瞬间轮次满足 `ap_exhausted` 结束条件(path_tag)——不存在 0-AP 操作窗口。**三条结束路径同帧/同批次竞争时按固定优先级仲裁:`cleared` > `stopped` > `ap_exhausted`**,与到达顺序无关,单一动作结算事务内一次判定、禁止双重折算(EC4/EC10)。 -4. **停手(提前结束扫雷阶段)**:轮次中任意时刻可主动停手 → 轮次结束(path_tag=`stopped`),剩余 AP **1:1 转存 RAP 池**(无乘数、非战斗资源,2026-09-07 用户修订——原 ×2 折算作废);本图未开完 → 下轮继续同图。 -5. **清图**:全部安全格开完 → 轮次结束(path_tag=`cleared`),**剩余 AP 直接作废**(不折算、不入 RAP——2026-09-07 用户拍板)+ 清图奖励。清图奖励内容归 **B4**,且是**差异化插槽**:B4 奖励表须预留按图类型(A1 的 biome/tag 上下文)分支的结构位——A3 只上报 `cleared`,不拥有奖励内容、不感知图类型。下轮换新图。 -6. **单一出口**:三种结束路径都只向 B1 输出 `(path_tag, continuation_hint)`(`continuation_hint`:stopped/ap_exhausted→same_board、cleared→new_board),仅作编排提示;权威换图指令是 B1 回发的 `next_round_mode`(Rule 9)。无任何折算数值进入结算——结算明细的效果项全部为 buff/debuff/清图奖励(P2 归因标注归 B1)。 -7. **数值承载于 D2**:全部数值存 D2 `ActionEconomyTable`(字段清单见 Schema 定稿节),经 ConfigDB 类型化属性读取;A3 代码零玩法数值字面量(D2 Rule 1)、零随机(本系统不涉及任何 RNG 流,P1)。 -8. **旗子单态**(2026-09-07 修订,原双态作废):**已插旗 = 棋盘状态,归 A2**——跨轮保留、随图存续,清图或刷新换图时随之消失;**口袋旗资源不存在**(数量无上限,稀缺性由 AP 价目承载)。插旗 = 1 AP + 棋盘 +1 面标记;拔旗反向(标记移除)。已插旗的兑付语义见 OQ5——硬约束:兑付一次性、当轮结算、**兑付资格以雷格实例为键**(每颗雷在本次战斗内至多兑付一次,资格随首次兑付消费;放置实例仅为当轮结算的兑付载体)、拔旗重插同一雷格**不恢复已消费的资格**(堵死 2 AP/轮的重插农场,2026-09-07 三轮评审改定)、禁止逐轮重复兑付;换图后新图的雷为新实例,资格自然重置。 -9. **账本独占与事件搭载**(二轮评审修订):A3 独占资源账本,唯一扣减入口 `try_spend(action_kind) -> bool`——余量检查、扣减、结束仲裁在同一事务内原子完成;A2 只判**棋盘面合法性**(相邻、目标格状态、无 chord)并执行棋盘效果,是挖/插/拔的调用方。**`round_end` 双发射源**(2026-09-07 修订,systems-index 回边裁决已同步):棋盘路径(ap_exhausted/cleared)由 A2 外发(原裁决不变);**停手路径(stopped)由 A3 直发**——停手为非棋盘输入,由输入层直调 A3,A3 仲裁后自行外发,payload 与 A2 路径同构 `(path_tag, continuation_hint)`(纯停手轮不存在"无发射者"漏洞)。A3 另存 `last_round_end` 只读记录(测试/审计断言落点,**同时是 A2 组包 round_end payload 的合法数据源**:A2 调用 `try_spend` 返回 true 后,若本次事务内轮次结束,A2 读取 `last_round_end` 组包外发——该读取权为接口契约的一部分,非仅测试设施)。Waiting 出口消费 B1 回发的 `next_round_mode ∈ {same_board, new_board}` 与 `battle_over` 信号。 -10. **下游经济契约**(F1,2026-09-07 结构性改写):全部扫雷收益以战斗效果直兑,无抽象点数;契约条款见 Formulas 节 F1,登记为 B1 GDD 验收项。 -11. **RAP 池(remain action point)**(2026-09-07 新增;决策主体与多次受理三轮评审钉死): - - **来源唯一**:停手转存(1:1,无乘数);清图与 ap_exhausted 的剩余 AP 均不入 RAP。 - - **生命周期 = 战斗域**:战斗内跨轮次、跨扫雷图累积;`battle_over` 进入 Idle 时清零(用户拍板:每场战斗清零;清零的可见反馈与教学落点见 UI Requirements——防"攒的钱凭空没了"读感)。跨战斗携带为未来选项,若开放须修订本条 + 登记 D3/C2 持久化归属(OQ7)。 - - **支出唯一**:刷新雷图。**决策主体 = 玩家**(经 D1 刷新入口在**挖掘期(Active 相位)**发起;**B1 `refresh_board` 挖掘期刷新编排内调用** `request_refresh() -> bool`——2026-09-12 D4 修订:刷新决策前移挖掘期,原"结算编排期 Waiting 相位代理调用"退役;禁止"RAP 满即自动刷")。`rap ≥ rap_refresh_cost`(默认 8)时扣减并**当场换新图继续挖**(AP 不重置、本轮剩余 AP 保留;A2 装板受理域已同步修订——Active·仅刷新路径;**刷新获得的新图不产生清图奖励**(它不是清图));不足则拒绝、状态不变(EC13)。**每轮上限 `refresh_cap_per_round`(默认 2)**——2026-09-12 D1 提案采纳(原"无结构性次数上限/冷却"作废;RoundStart 重置计数,超限拒绝,EC15)。**旧板旗随旧板作废**(零兑付、旗 AP 不返还——拔旗不返还同族;A2 EC11 换图全量重置承载;D4 修订裁决)。**经济注记(修订预警)**:原定价"8 RAP + 敌方时间税"的时间税半句对当场刷新**失效**(无结算发生)——价格实际 = 8 RAP + 每轮 2 次上限;OQ3 弃图率/刷新率预警阈值联动复核。MVP 无 RAP 上限。 - - **无战斗收益**:RAP 不折算、不兑付任何战斗效果——纯风险退出资源。 - -### ActionEconomyTable Schema 定稿(D2 回写义务,2026-09-07 三次回填) - -> 2026-09-07 RAP 结构修订 delta:删除 `flags_per_round` / `flag_unit_cost` / `stop_multiplier` / `clear_multiplier` 四字段(旗上限与折算乘数均作废),新增 `rap_refresh_cost`。全部字段单行全局、int 类型;knob 列 = 是否开放调参(非 knob 字段仍入表——代码零字面量,修订须走本 GDD 修订流程)。D2 Core Rules 表行、Status 行与 registry 已同步回写。**2026-09-12 D4 修订 delta**:新增每轮刷新上限规则(默认 2——Rule 11/EC15);config 结构位 `refresh_cap_per_round` 预留,**D2/registry 字段回写随实现批次**(届时 AC-10a 七字段清单同步扩为八字段)。 - -| 字段 | 类型/范围 | 默认 | knob | 说明 | -|---|---|---|---|---| -| ap_per_round | int [1, 32] | 8 | ✓ | 每轮行动点(v2 实测定稿;双重身份:节奏 knob 兼停手 RAP 转存规模 knob) | -| dig_ap_cost | int [1, 8] | 1 | ✓ | 挖单格成本(域下限 1:0 = 无预算系统失效,越域校验拒绝) | -| flag_place_ap_cost | int [0, 8] | 1 | ✓ | 插旗 AP 成本(旗无实物资源,仅此一项消耗) | -| flag_pull_ap_cost | int [0, 8] | 1 | ✓ | 拔旗 AP 成本(OQ2 复核落点) | -| rap_refresh_cost | int [1, 64] | 8 | ✓ | RAP 刷新门槛;默认 8 = `ap_per_round`,使"满 AP 一轮停手 = 恰好一刷"成为基线节拍;单字段域内任意值均可运作(仅节奏差异),跨字段约束见下 | -| move_ap_cost | int | 0 | ✗ 冻结 | 移动免费(P4 承载,调参豁免) | -| chain_ap_cost | int | 0 | ✗ 冻结 | 连锁展开免费(v2 定稿) | - -**跨字段校验(2026-09-07 三轮评审增补,D2 validate() 级)**:任一动作成本字段(`dig_ap_cost` / `flag_place_ap_cost` / `flag_pull_ap_cost`)**≤ `ap_per_round`**——违反即 Rule 6 加载期致命。依据:dig=8 × ap=1 双双域内会使挖掘永久不可用、cleared/ap_exhausted 双不可达(软锁循环),属结构失效而非节奏差异,与本表"域下限 1 = 零预算系统失效"同族。归 ActionEconomyTable schema 类 `validate()` 跨字段类别(D2 既有"schema validate() 收集后致命"机制承载,无需新增 D2 校验通道);违规夹具登记为 D2 校验双通道条件性夹具(同悬空引用待遇)。域上界注记:dig/flag 上限 8、refresh 上限 64 为 MVP 量级护栏(非推导界),随调参需要修订。 - -### States and Transitions - -轮次内资源状态机(**本表为 A3 资源侧视图,编排权威序列以 B1 轮次生命周期编排章节为准**;A3 只暴露资源余量、`last_round_end` 并消费 B1 信号;**可观测相位域 = {Idle, Active, Waiting}**——RoundEnd 与 RoundStart 均为单事务内的瞬态,不可观测、不作为任何测试 GIVEN): - -| 状态 | 进入条件 | 行为/出口 | -|---|---|---| -| RoundStart | `notify_round_start()`(B1 编排;战斗首轮要求当前 Idle) | AP←8(硬重置);RAP 不动(跨轮保留)→ Active | -| Active | 预算就绪 | 接受耗 AP 动作并经 `try_spend` 原子扣减;每个动作结算事务内按优先级仲裁(cleared > stopped > ap_exhausted)→ RoundEnd(胜出 path_tag) | -| RoundEnd(瞬态) | 任一结束路径胜出 | 停手:RAP += remaining_ap(1:1);ap_exhausted:不变式断言 remaining_ap=0,违反即致命;清图:剩余 AP 作废。写 `last_round_end` → Waiting | -| Waiting | 结算完成前不接受 round_start(AC-14) | 消费 B1 信号:`next_round_mode=same_board` → 下轮 RoundStart(同图——stopped/ap_exhausted 轮**恒 same_board**,2026-09-12 D4 修订);`new_board` → 下轮 RoundStart(新图,A1 经 B1 编排生成——仅 cleared 轮)→ RAP 保留;`battle_over` → Idle(RAP 清零)。~~`request_refresh()` 在此相位受理~~(作废——刷新决策前移挖掘期,2026-09-12 D4 修订) | -| Idle | 战斗终结 | 不响应任何动作请求;RAP=0、ap=0;下一场战斗由 B1 发 round_start 重启(唯一出口) | - -**输入 × 相位矩阵(2026-09-07 三轮评审增补)**:全部 8 个 API 返回 bool;非法输入 = **拒绝(false)+ 状态不变 + debug 诊断**——fail-fast 不静默吞编排错误,但不采用进程致命(D2 语义的致命保留给数据通道)。 - -| 输入 | Idle | Active | Waiting | -|---|---|---|---| -| `notify_round_start` | 受理(RoundStart) | 拒绝 | 拒绝(settlement 消费后受理——AC-14 门) | -| `request_dig` / `request_flag_place` / `request_flag_pull` / `request_stop` | 拒绝 | 受理(经 `try_spend`) | 拒绝 | -| `request_refresh` | 拒绝 | **受理(Rule 11——挖掘期当场换图,2026-09-12 D4 修订)** | ~~受理(Rule 11)~~ 拒绝(原受理相位——刷新决策前移挖掘期) | -| `notify_settlement_done` | 拒绝 | 拒绝 | 受理(重复调用拒绝) | -| `notify_combat_end` | 拒绝 | 拒绝 | 受理(→ Idle,RAP 清零) | - -### Interactions with Other Systems - -| 系统 | 方向 | 接口契约 | -|---|---|---| -| A2 | 双向 | A2 判棋盘面合法性(相邻、目标格状态、无 chord)并执行棋盘效果,调用 `try_spend`;**A2 不可自行扣减资源**;`round_end` 由 A2 外发**棋盘路径**(ap_exhausted/cleared),停手路径由 A3 直发(Rule 9,systems-index 已同步);连锁规模与"图已开完"由 A2 作为动作参数上报;旗标记的棋盘状态归 A2 | -| B1 | 双向 | B1 结算消费 round_end payload;**挖掘期刷新编排(`refresh_board`)内调用** `request_refresh()`(玩家经 D1 发起,Rule 11——2026-09-12 D4 修订,原结算编排期代理退役);向 A3 回发 `next_round_mode`/`battle_over`(stopped/ap_exhausted 轮**恒 same_board**、cleared 轮恒 new_board——回发违约 = fail-fast);结算明细来源标注(安全格增益/标中旗削弱/清图奖励/雷→伏击,P2 归因);EC8 判定次序归 B1;**F1 五条款验收方兼闭合对账 owner**(对照表 + 挖掘风险不等式 + 弃图支配条款的单一签字人,强制检查点) | -| B4 | 相邻 | 清图奖励归 B4(差异化插槽:按图类型分支,结构位预留);标中旗 = 怪物 debuff 档位归 B4(OQ5 锚约束)——均不经 A3 账本 | -| D2 | 双向 | `ActionEconomyTable` schema 字段清单已三次回写 D2(最后一次 2026-09-07 RAP 修订 delta);读取经 ConfigDB | -| D1 | A3 → D1 | 当前 AP 与 **RAP** 是 HUD 常显字段;**刷新入口(玩家发起,Rule 11)**与 `battle_over` 时 RAP 清零的可见反馈(登记 D1 GDD 验收项);动作非法原因双源:棋盘面(A2 判)/ 资源面(A3 判),D1 呈现 | -| D5 | A3 → D5 | AP/旗(价目)/停手/RAP 的教学口径以本 GDD 价目表为准;须含"RAP 战斗结束清零"条目(防"存的钱凭空没了"误读) | - -**定稿回写义务**(D2 接口漂移规则,已执行三轮):① 首轮回填(2026-09-07)——值侧四项 + registry 登记;② 二次回填(同日)——schema 十字段交付;③ 本轮 RAP 修订 delta——四字段删除 + `rap_refresh_cost` 新增,D2 Core Rules 表行/Status 行、AC-7 示例值、registry 同步回写。 - -## Formulas - -### F1 下游经济契约(downstream_effect_contract,2026-09-07 结构性改写;三轮评审增补条款 4/5 并钉死闭合 owner) - -> 原 F1(停手 ×2 / 清图 ×1 折算)与原 F2(挖/停/清激励不等式)**整体作废**:停手改产 RAP 后退出战斗经济,"挖 vs 停"在同一量纲下的比较不复存在——二轮评审击穿 F2 的两条数学缺陷(②博弈树错误、①缺风险项)连同其修正方案一并作废,不再修复而是移除病灶。折算公式不存在(无乘数、无点数),`clear_multiplier < stop_multiplier` 结构不变量随之删除。契约为对效果侧的**五条款**(systems-index 门禁记录 ①–⑤ 已同步): - -1. **单一当量对照条款**:B1 须出**效果档位对照表**(1 最低档安全格 buff = ? 当量;debuff/清图奖励/敌方增益均对照归一),对全部收益来源**单一换算**——分源改率 = 契约作废,须回本 GDD 重议。此为原"线性率条款"的存续形态(归 OQ1;注意与现行 OQ6 清图奖励插槽区分)。 -2. **标中旗锚条款**(三轮评审补第二锚):标中旗的怪物 debuff 档位当量必须**严格大于**最低档安全格 buff 当量——否则插旗在最优情形下也只是打平,P3 旗循环经济空心;**且对照基准须为连锁放大的边际挖掘收益**(单 AP 平均挖掘当量,含连锁期望放大;provisional 下限 1:1,B4/B1 定稿校准)——只对最低档比较会使旗理性萎缩到碎片区。每战标中旗总吞吐(N 旗 = N debuff)无单档上限可依恃,由 B1 按条款 1 对照表对账;插旗挤占清图进度的边际轮成本由 B4 定档时核算,或在其 GDD 声明 MVP 忽略并给理由。owner:B4 表设计 + B1 对照验收。 -3. **挖掘风险条款**(三轮评审显式化,原"共同验收"改单一 owner):挖掘决策 EV 健康不等式 **P(安全) × 安全格 buff 当量下界 > P(雷) × 敌方增益当量上界**,两端分别锚定 **A1 可推理率生成参数**(P1 下限,决定 P(安全) 的玩家可达上界)与 **B2 惩罚上限表值**(上限值登记为 B2 GDD 验收项);**B1 为单一闭合对账 owner**(A1/B2 供给锚值,B1 签字验收),provisional 目标带以原型临时值(伏击 +3 / 敌 18HP/4ATK)代默认表给出首版示例、随 B2 表回填刷新;登记为 **B1 GDD 强制检查点**。P1 支柱要求 A1 可推理率使玩家能推高 P(安全)——本条款是"可推理率"的经济侧验收形态(二轮评审 #2 的存续形态收敛为可判定谓词)。 -4. **清图奖励条款**:清图奖励 > 0,量级与差异化分支归 B4(输入含 A1 图类型上下文;原 +10 临时锚降级为 B4 插槽的 provisional 参考)。 -5. **清图 vs 弃图刷新支配性条款**(三轮评审新增,原 F2 跨轮激励职责的认领):清图奖励当量下界须使 **"推到底清图"的期望当量 ≥ "确定格挖完即弃图刷新"的期望当量**,即 C ≥ 弃图所节省的期望雷险当量 + 轮数差 × 敌方结算强度当量(inputs:B4 的 C、B2 惩罚上限、A1 雷密度/可推理率、B1 结算强度;B1 闭合对账)——否则每图最优解退化为"捞完确定格就弃",清图高光节拍、B4 差异化插槽、game-concept"图完成"循环全部空心。**注记(原文登记)**:该环强度与 A1 可推理率**反向耦合**——可推理率越低(迷雾/终局 50/50 越多),弃图越优,玩家对 P1 失败的理性回应会反过来饿死清图内容;故本条款是 P1 失败模式的经济对冲,与条款 3 共同登记 B1 强制检查点。provisional 验算:+10 锚对默认 8 AP 图形况粗验通过,正式锚随 B4/B2/B1 表值定稿。 - -**登记为 B1 GDD 验收项**(systems-index 门禁已同步改写为 ①–⑤)。playtest 复核归 OQ3,当量归一归 OQ1。 - -## Edge Cases - -- **EC1 If AP=0 后仍有动作请求**:全部拒绝(返回 false)——轮次已在归 0 瞬间结束,不存在 0-AP 窗口(Rule 3)。 -- **EC2 If AP 不足以支付动作**(含插旗/拔旗——旗无实物资源,拒绝只看 AP):拒绝、状态不变;`last_round_end` 不变。 -- **EC3 If 玩家拔旗再插他格(挪旗)**:合法——插+拔合计耗 2 AP(插 1 + 拔 1,默认值下);相对"直接改插他格"多耗的 1 AP(拔旗)即"防免费重排"的有意代价。旗标记的移除/重建为 A2 棋盘操作,A3 只见 AP −2。 -- **EC4 If 同帧/同批次多结束路径竞争**:按 Rule 3 总仲裁 `cleared` > `stopped` > `ap_exhausted`,与到达顺序无关、单次判定。**"先停后挖"腿的批次语义在 A3 冒烟 API 上不可构造**(同步单调用无事务批次概念)——该腿显式 deferral 至 A2 集成测试承载(systems-index 门禁登记,非静默豁免);A3 冒烟承载"先挖后停"腿(AC-8)。 -- **EC5 If 连锁展开开完全图**:连锁免费;清图判定以"安全格全部开完"为准(含连锁开的格)→ 正常触发 `cleared`。RoundStart 的初始 3×3 自动展开同理(退化小图属既有行为,不设独立分支;**退化图刷清图奖励的钓鱼风险登记为 A1/B1 下游约束**——最小安全格数下限归 A1 生成参数验收;初始展开的定义落点——免费、计入清图进度、无奖励——归 A2 GDD 承载,本 GDD 仅经 `chain_size`/`clears_map` 参数引用其结果)。 -- **EC6 If 满 AP 停手**:合法——RAP +8(= `rap_refresh_cost`,恰好可达一刷,Rule 11 基线节拍,有意;该节拍与 OQ3"纯停手轮占比"预警同源,调参时联动评估)。**诚实声明(形态限定版,三轮评审改写——"病灶不存在"句式必须附形态限定与反例推演)**:①纯停手零挖掘环(停→刷→停)零战斗进账,唯一代价是敌方每轮照常结算(时间税自惩)——该退化形态结构自惩成立;②但理性玩家的真实风险环是"**挖完全部确定格 → 不确定即停 → 攒满刷新**":该环**有真实战斗进账、零踩雷风险**,刹车只有三个——清图奖励弃失(下界由 F1 条款 5 守住)、8 RAP 成本、时间税。本条不声称该环"病灶不存在";其健康性由 F1 条款 5(支配性不等式)+ OQ3 弃图率/完成度指标守门。 -- **EC7 If 同轮内插旗后又拔旗**:AP 合计消耗 2(插 1 + 拔 1,默认值下);旗标记由 A2 移除,A3 无旗状态可返。 -- **EC8 If 战斗最后一轮的收益兑现**:敌人已全灭时 B1 结算先判胜,当轮 buff/debuff/清图奖励是否兑现 = B1 判定次序域,A3 无断言义务(out-of-scope);A3 义务仅为每轮无条件输出一条 `(path_tag, continuation_hint)`。 -- **EC9 If 跨轮/跨图资源携带**:RAP 是**唯一**跨轮携带量(战斗域,跨图也保留);停手不是战斗资源机制——无复利问题;AP 腿每轮硬重置;旗标记随图存续(A2 域)。RAP 战斗结束清零(AC-11)。 -- **EC10 If 最后 1 AP 挖开最后安全格**:`cleared` 与 `ap_exhausted` 同时成立 → **清图胜出**:输出 `(cleared, new_board)`、剩余 AP 作废 + 清图奖励 + 换图,`ap_exhausted` 不触发。防"耗尽优先"实现把清图高光结算为最差结局、训练玩家永远留最后一格停手。 -- **EC11 If 挖已插旗的格**:拒绝——须先拔旗(1 AP,默认值下)再挖。旗是"别挖这里"的承诺标记,挖旗格合法化会催生零风险滥用;误标改主意的代价 = 拔旗 1 AP(P3 承诺重量)。棋盘面判定归 A2(out-of-scope 声明见 AC 前言)。 -- **EC12 If RAP 生命周期边界**:MVP 无上限;战斗结束(Idle)强制清零;跨战斗携带若未来开放,须修订本条与 Rule 11 并登记 D3 持久化归属 + C2 冒险域语义(OQ7)——禁止静默超域。 -- **EC13 If RAP 不足时请求刷新**:`request_refresh()` 返回 false、RAP 不变、相位不变(受理相位〔Active——2026-09-12 D4 修订〕内的资源不足拒绝;与 AC-14 的相位非法拒绝区分——后者附 debug 诊断,两者均为 bool 口径)。 -- **EC14 If 清图/耗尽轮次产生剩余 AP**:清图剩余 AP 作废(不入 RAP,Rule 5);ap_exhausted 恒 remaining_ap=0(不变式断言)。两路径 RAP 增量恒为 0(AC-4/AC-6 断言)。不变式断言的实现载体为 debug 断言(冒烟无 fault-injection 载体;行为级代理 = AC-4 的 rap 不变断言)。 -- **EC15 If 同一轮内多次请求刷新**(2026-09-12 D4 修订——原"同一 Waiting 相位内"):**受理至每轮上限 `refresh_cap_per_round`(默认 2)为止**,超限拒绝(resource_face;轮内计数、RoundStart 重置——原"无结构性次数上限/冷却"作废)。每次独立检查 `rap ≥ rap_refresh_cost` 并扣减;无冷却。每次刷新都当场换新图且不产生清图奖励(Rule 11)。**注**:挖掘期当场刷新无结算发生——原"敌方时间税"自惩半句失效(Rule 11 经济注记,OQ3 联动复核)。 - -## Dependencies - -**Upstream**:D2(hard——ActionEconomyTable schema 与 ConfigDB 读取;本 GDD 为该表回填 owner,三轮回填已完成)。A1 为**间接事实依赖**(新图生成经 B1 编排调用,A3 不直接消费 A1 接口,仅 Waiting 出口消费其结果信号)。无其他玩法上游(Foundation 层)。 - -**Downstream**: - -| 依赖方 | 性质 | 接口 | -|---|---|---| -| A2 | hard | 账本调用(`try_spend`)+ 价目表执行 + round_end 棋盘路径外发(Rule 9,payload 组包读取 `last_round_end`);A2 校验棋盘面合法性,资源合法性归 A3;旗标记棋盘状态归 A2;**EC4"先停后挖"批次仲裁 deferral 至 A2 集成测试(义务清单见 systems-index 门禁记录)** | -| B1 | hard | RoundEnd 输出 `(path_tag, continuation_hint)`;挖掘期刷新编排(`refresh_board`)内调用 `request_refresh()`(D4 2026-09-12);回发 `next_round_mode`/`battle_over`;**F1 契约验收项**(效果档位对照表单一线性换算) | -| B4 | soft | 清图奖励差异化插槽(按图类型分支);标中旗 debuff 档位(OQ5/F1 条款 2 锚约束) | -| D1 | soft | AP/RAP HUD 常显;刷新入口与 RAP 清零反馈;非法原因双源呈现 | -| D5 | soft | 教学口径来源(含 RAP/刷新/RAP 战斗末清零) | - -## Tuning Knobs - -| Knob | 默认 | 调过高 | 调过低 | -|---|---|---|---| -| ap_per_round | 8 | 决策带宽膨胀、节奏拖长(v1 的 12 已实测否决);**双重身份**:满停 RAP 转存随之增大(8→12 使满停一刷后的富余 +4) | "想清楚的事做不完",违反 P1 | -| dig_ap_cost | 1 | ——(>1 使"连锁免费"的相对收益畸变,未实测) | 0 = 无预算系统失效(schema 域 [1,8] 拒绝) | -| flag_place_ap_cost | 1 | 插旗迟疑,P3 标雷策略萎缩 | 插旗无成本,旗标记泛滥(棋盘噪音) | -| flag_pull_ap_cost | 1 | 挪旗昂贵,误标惩罚过重 | 挪旗近免费,承诺无重量(OQ2 复核落点) | -| rap_refresh_cost | 8 | 刷新太贵,风险退出权萎缩、盲猜局被迫赌(违反 P1 兜底) | 刷新近免费,图来回刷节奏拖沓;敌方时间税仍自惩但体验烦躁 | - -- **Knob 交互**:`rap_refresh_cost : ap_per_round` 比值 = "停几轮换一刷"(默认 1:1 = 满停即一刷;该节拍与 OQ3 纯停手预警同源,联动评估);`ap_per_round × 插旗占比` 与 A1 布雷密度共同决定标雷全周期可行性(A1 定稿后强制复核);效果侧健康(F1 五条款)无单一系统 knob 可控——对照表/闭合对账归 B1、惩罚上限归 B2、奖励分支归 B4(对账归 OQ1);刷新率应急阈值(OQ3)的评估须与 B2 结算强度联动,勿独立调参。 -- **已冻结项**:AP 8 来自原型 v2 实测(12 点被否);移动/连锁 0 成本为结构冻结;**RAP 1:1 转存与战斗域生命周期为结构**(非 knob,修订走 GDD 流程;跨战斗携带 = OQ7 预留开关);旗数量无上限为结构(用户 2026-09-07 拍板)。 - -## Visual/Audio Requirements - -无专属表现面。AP/RAP 余量变化与"资源不足"反馈的呈现归 D1/A2;本系统无音频需求。 - -## UI Requirements - -A3 不拥有 UI,但对外暴露三个必须可读的状态:当前 AP、当前 RAP(D1 常显;**刷新入口为玩家发起**(Rule 11),入口可用性由 B1/D1 呈现);`battle_over` 时 RAP 清零须有可见反馈(登记 D1 GDD 验收项——防"攒的钱凭空没了"读感)。动作非法的原因需可区分且**双源**——棋盘面非法(非相邻格/挖旗格等,A2 判定)/ 资源面非法(AP 不足 / RAP 不足,A3 判定),D1 呈现(原因读数的测试承载声明见 AC 前言 out-of-scope)。结算明细的效果项带来源标注(B1 呈现,P2)。交互成本指标(每消耗 1 AP ≤ 2 次点击)归 A2/D1 观测(P4 免费移动的点击摩擦护栏)。 - -## Acceptance Criteria - -> **测试载体与注入口径**:A3 是被动账本,挖/插/拔的棋盘面执行归 A2(设计顺序第 6 位)、轮次节拍归 B1(第 9 位)——均未实现。冒烟脚本(`--headless --script`,承 D2 冒烟框架)**直接驱动 A3 最小 API 面**;A2/B1 就绪后改走真实调用方,断言口径不变。 -> **API 面**:`notify_round_start()` · `request_dig(chain_size: int, clears_map: bool) -> bool` · `request_flag_place() -> bool` · `request_flag_pull() -> bool` · `request_stop() -> bool` · `request_refresh() -> bool` · `notify_settlement_done(next_round_mode) -> bool` · `notify_combat_end() -> bool`。**全部 8 个 API 布尔返回 = 受理/拒绝**——"拒绝"直接断言返回值(三轮评审统一口径:notify_* 与 request_* 同为 bool;相位非法拒绝附 debug 诊断、非进程致命;受理矩阵见 States 节输入×相位表)。`chain_size` = 连锁**附加**格数(不含首格,≥0;首格恒耗 1 AP);`clears_map` = 本次动作后全图安全格开完。 -> **只读观测量**:`ap` · `rap` · `phase` · `last_round_end`(记录 path_tag / continuation_hint,可空)。**相位观测域 = {Idle, Active, Waiting}**;RoundEnd 为事务内瞬态、不可观测,不作为 GIVEN。 -> **口径声明**:`notify_settlement_done` 仅记录编排意图,phase 停留 Waiting(AC-11 断言);轮次开启仍由 `notify_round_start` 触发(AC-14 的门不被绕过)。各 AC 的 THEN 具体数值按**当前 ConfigDB 表值推导**(默认 8/1/1/1/8 下的具体数见各 AC;测试读取表值计算期望,不写死)。**夹具一致性(三轮评审增补)**:冒烟经 `chain_size`/`clears_map` 参数注入棋盘事实(信任方向见 Interactions A2 行)——各 AC 使用独立夹具图,`clears_map=false` 腿的安全格余量在夹具中显式登记(防"传 false 却实际清图"的夹具失配假失败)。**覆盖声明(out-of-scope)**:EC11 与挖/插/拔相邻性(A2 棋盘面域,A2 GDD 承载 AC,systems-index 门禁登记);旗标记棋盘状态与跨轮留旗(A2 域);EC8 末轮判定次序(B1 域);移动/连锁 0 成本不经账本(A2 侧承载);刷新的换图生成与奖励内容(B1/A1/B4 域);**资源面拒绝原因的读数区分**(UI 要求"可区分",但冒烟 API 无原因观测量——bool + 构造上下文可推断,呈现归 D1/A2 集成测试);跨字段校验违规(`validate()` 级,归 D2 校验双通道条件性夹具)。多步 GIVEN 均给出构造序列。`last_round_end` 为单槽记录:同值双发射不可区分(跨值覆盖由 AC-8/AC-9 值断言承担,同值双发防御归 A2 集成)。 - -**预算与价目** -- **AC-1a** GIVEN phase=Idle(冷启动,rap=0),WHEN `notify_round_start()`,THEN 返回后 ap=8、rap=0、phase=Active。 -- **AC-1b** GIVEN 上轮以 `(stopped)` 结束且 rap=3、`notify_settlement_done(same_board)` 已消费,WHEN `notify_round_start()`,THEN ap=8(硬重置)、**rap=3(不变——RAP 跨轮保留)**、phase=Active。 -- **AC-2** GIVEN Active ap=8,WHEN `request_dig(chain_size, false)` 以 chain_size ∈ {0, 1, 5} 各在新轮次执行一次,THEN 每次返回 true 且扣减恒为 1(连锁免费:chain_size=5 时 ap 8→7 而非 8→2)。 -- **AC-3a** GIVEN ap=8,WHEN `request_flag_place()`,THEN true、ap=7(旗标记为 A2 域,A3 无旗观测量)。 -- **AC-3b** GIVEN ap≥1(AC-3a 产物 ap=7),WHEN `request_flag_pull()`,THEN true、ap=6。 -- **AC-16** GIVEN AC-3a 产物(已插 1 旗、ap=7,旗构造经 `request_flag_place()`——A3 冒烟无棋盘观测量),WHEN `request_flag_pull()` 后 `request_flag_place()`,THEN 两调用均 true、AP 合计 −2(挪旗成本,EC3)、轮次不结束。 - -**结束路径与 RAP** -- **AC-4** GIVEN ap=1(构造:新轮 7 次 `request_dig(0,false)`)且 `clears_map=false`,WHEN `request_dig(0, false)`,THEN true、轮次立即结束,`last_round_end=(ap_exhausted, same_board)`、rap 不变(+0,EC14)。(前置:该格非最后安全格。) -- **AC-4b** GIVEN ap=1 且仅剩 1 个安全格(构造同上, digs 作用于预设夹具图),WHEN `request_dig(0, true)`,THEN true、`last_round_end` **值等于** `(cleared, new_board)`(清图胜出,EC10)、rap 不变;不存在第二条输出。 -- **AC-5** GIVEN Active ap=3 且图未开完(构造:5 次非清图挖,8−5=3),WHEN `request_stop()`,THEN true、`last_round_end=(stopped, same_board)`、**rap=3**(1:1 转存,恰一条输出);`notify_settlement_done(same_board)` 后 `notify_round_start()` → ap=8、rap=3。 -- **AC-5b** GIVEN Active 且 rap ≥ `rap_refresh_cost`(构造:满 AP 停手 → rap=8 → `notify_round_start()` 回 Active——RAP 跨轮保留),WHEN `request_refresh()`,THEN true、rap=0、**phase 不变(Active——2026-09-12 D4 修订:挖掘期当场换图,A2 装板受理联动)**。另 GIVEN Active 且 rap=3(构造:前轮挖 5 后 `request_stop()` → rap=3 → `notify_round_start()`),WHEN `request_refresh()`,THEN **false**、rap=3、phase 不变(EC13)。~~原 Waiting 期构造~~(作废——D4 修订)。 -- **AC-6** GIVEN ap=5(构造:3 次非清图挖),WHEN `request_dig(0, true)`,THEN true、`last_round_end=(cleared, new_board)`、**rap 不变(剩余 AP 作废,Rule 5/EC14)**;WHEN 随后 `notify_settlement_done(new_board)`、`notify_round_start()`,THEN 新轮 ap=8、**rap 仍= 前值(RAP 跨图保留,EC9 的 cleared 腿)**。 -- **AC-6b** GIVEN 冷启动 ap=8、夹具图恰余 4 个安全格,WHEN `request_dig(3, true)`(附加 3 格连锁开完全部余量;chain_size 不含首格),THEN true、ap=7、`last_round_end` **值等于** `(cleared, new_board)`、rap 不变——连锁免费且连锁格计入清图判定(EC5),单次判定。 -- **AC-8** GIVEN Active、剩余安全格恰 1、ap≥1(先挖后停腿——A3 冒烟可测子集),WHEN `request_dig(0, true)` 后 `request_stop()`,THEN 第二调用返回 **false**、`last_round_end=(cleared, new_board)` 恰一条、phase=Waiting(EC4;**stop-first 腿 deferral 至 A2 集成**,门禁登记)。 -- **AC-15** GIVEN Active ap=8 且图未开完,WHEN `request_stop()`,THEN true、`last_round_end=(stopped, same_board)`、**rap=8**(满停 = 刷新门槛恰可达,Rule 11 基线节拍,EC6)。 - -**非法与拒绝** -- **AC-7** GIVEN ap=1(构造:7 次非清图挖)且 debug override `flag_place_ap_cost=2`、`flag_pull_ap_cost=2`(域 [0,8] 内,经 D2 R3 注入)。**承载声明**:默认价目下全动作 1 AP,"AP 不足"腿(EC2)在默认表值下不可构造(ap≥1 恒可支付、ap=0 即收轮),故本 AC 显式承载于非默认表值夹具。WHEN 依次 `request_flag_place()`、`request_flag_pull()`、`request_dig(0,false)`,THEN 前两者 false(AP 不足,EC2)、最后者 true(ap 1→0,触发 ap_exhausted);`last_round_end` 断言只含末次记录。 -- **AC-9** GIVEN phase=Waiting(经 ap_exhausted 路径构造;RoundEnd 瞬态不可观测),WHEN 依次 `request_dig(0,false)`、`request_flag_place()`、`request_flag_pull()`、`request_stop()`,THEN 全部 **false**、ap/rap 不变、`last_round_end` 不变(无第二条输出)。 -- **AC-11** GIVEN phase=Waiting 且 rap>0(构造:停手轮后),WHEN `notify_settlement_done(same_board)`,THEN 返回 true 且 **phase 仍= Waiting**(仅记录编排意图,AC-14 门不被绕过);WHEN 随后 `notify_combat_end()`,THEN 返回 true、phase=Idle、**rap=0**(战斗域清零,EC12)、ap=0。 -- **AC-12** GIVEN phase=Idle,WHEN 任何动作/停手/刷新请求,THEN 全部 false、`last_round_end` 保持 null、phase 不变。 -- **AC-13** GIVEN phase=Idle,WHEN `notify_round_start()`(新战斗首轮),THEN 返回 true、phase=Active、ap=8(Idle 唯一出口;RoundStart 瞬态不作断言落点)。 -- **AC-14** GIVEN phase=Waiting 且结算未完成(未消费 next_round_mode),WHEN `notify_round_start()`,THEN 返回 **false**、phase 停留 Waiting、`last_round_end` 不变(fail-fast = 拒绝 + debug 诊断,不静默吞编排错误;统一 bool 口径,非进程致命)。 -- **AC-18** GIVEN phase=Active(冷启动后、未挖任何格),WHEN 依次 `notify_round_start()`、`notify_settlement_done(same_board)`、`notify_combat_end()`,THEN 全部返回 **false**、ap/rap/phase/`last_round_end` 均不变(输入×相位矩阵 Active 列全覆盖;防 B1 双启动静默 AP←8 重置)。`request_refresh` 于 Active **受理**已移入 AC-5b(2026-09-12 D4 修订——原 Active 拒绝腿作废)。 - -**确定性与配置** -- **AC-17** GIVEN **全新 A3 实例**(同一 ConfigDB 表;每遍以新实例构造,无跨实例状态),WHEN 同一动作序列驱动两遍,THEN 两遍 `last_round_end` 序列与 rap 轨迹逐项相同(零随机的行为级证据,D2 AC-15 的 A3 层前身)。 -- **AC-10a** GIVEN ConfigDB 加载完成,WHEN 脚本解析 `design/registry/entities.yaml` 的 `action_economy` 条目,THEN 与 `ConfigDB.action_economy` 七字段(ap_per_round / dig_ap_cost / flag_place_ap_cost / flag_pull_ap_cost / rap_refresh_cost / move_ap_cost / chain_ap_cost)逐一相等;registry 缺任一字段即失败。 -- **AC-10b** A3 文件集纳入 D2 AC-14 项目级扫描域(引用其人工三要素口径,不另设自动化字面量硬 THEN——字面量判定误报率高,D2 已定性为 warning 级 + 人工复核)。 - -## Open Questions - -1. **效果档位对照表与闭合对账**(owner:B1,第 9 位;原折算率与归一表义务合并存续于此——注意与现行 OQ6 清图奖励插槽区分):安全格 buff / 标中旗 debuff / 清图奖励 / 敌方增益的统一当量对照与换算由 B1 GDD 定稿,须满足 F1 五条款;**B1 兼任条款 3(挖掘风险不等式)与条款 5(弃图支配性)的单一闭合对账 owner**(A1/B2/B4 供给锚值,B1 签字验收),两项均登记 B1 GDD 强制检查点;每战标中旗总吞吐对账归本条。 -2. **拔旗耗 AP 复核 + 标错惩罚双重职责**(owner:A2 前原型小补丁,与标错惩罚实测合并会话):本 GDD 按"拔旗 1 AP、移除标记"定稿;复核改动现已有 knob 落点(`flag_pull_ap_cost`),若实测推翻则调 knob 并回写 registry。**标错惩罚现承担双重职责**(三轮评审登记):误标税 + 停手轮/死 RAP 态下旗滥用的唯一价格——RAP 无上限 + 满溢态使碎片区插旗机会成本趋零,"可疑格全插旗、永不拔"的滑向由本惩罚定价;OQ3"停手轮旗动作占比"指标联动观测。 -3. **playtest 预注册指标**(owner:垂直切片前置 playtest;三轮评审置换与增补):**弃图率 = refresh/(clear+refresh)**(>30% 观察、>50% 干预——provisional 预注册);**刷新时已开格完成度直方图**(完成度 <60% 的刷新占比 >50% 即信号);**停手轮旗动作占比**(>50% 即信号——投机旗/死 RAP 态检测,联动 OQ2);**确定动作供给 >8 的轮占比**(P1 决策密度兜底监测,与 A1 密度联合验收);刷新率/战斗(>3 次即观察信号,阈值评估与 B2 结算强度联动,勿独立调参);纯停手轮占比(**>20–30% 即观察信号**);停手时机分布、每轮犹豫时长、终局碎片区(清图完成度 >80%)轮次数。**失明声明(如实记录,三轮评审)**:原三指标(刷新率/纯停手占比/碎片区轮次)对"挖完全部确定格→停→刷"环结构性失明——该环停手轮先挖后停(非纯停手)、温和变体刷新率低、开到 >80% 即弃使碎片区读数反而变低(病态呈现为健康);故增前三项直测该环。应急方案(触发后启动):`rap_refresh_cost` 调参 / 刷新冷却(连续刷新须间隔 N 轮)/ 刷新新图保留已开格结构(重议级)。原"分级乘数/停手门槛"应急方案随折算作废而删除。 -4. **AP 耗尽的软提示**(owner:D5,低优先):本 GDD 定"AP=0 即收轮";教学若发现新手困惑,加提示不改规则。可扩展覆盖"RAP 达标刷新引导"与"RAP 战斗末清零提示"(D1 清零反馈的对应教学条目)。 -5. **标中旗兑付语义细化**(owner:B4/B1;A3 硬约束已定稿):标中旗 = **怪物 debuff**(2026-09-07 三向效果定稿,原"B4 最低档安全格同档"锚作废)。硬约束(兑付键三轮评审改定):兑付一次性、当轮结算、**兑付资格以雷格实例为键**(每雷本次战斗至多兑付一次,资格随首次兑付消费;放置实例仅为当轮结算载体)、拔旗重插同一雷格不恢复已消费资格(堵重插农场)、禁止逐轮重复兑付;换图后新雷为新实例。档位锚见 F1 条款 2(严格 > 最低档 + 连锁放大边际基准 + 总吞吐对账)。标错惩罚归 game-concept 待定问题(OQ2 合并会话,双重职责见 OQ2)。 -6. **清图奖励差异化插槽**(owner:B4,结构位预留 + A1 上下文):清图奖励未来按随机图类型(biome/tag)分支——B4 奖励表 schema 须预留图类型维度的结构位(2026-09-07 用户提出);A3 只上报 `cleared`,图上下文经 B1 传递,不经 A3。**约束(三轮评审登记)**:图类型上下文在战斗域内恒定(biome 挂关卡层、不逐图重掷)——否则 `request_refresh` 退化为 biome 重掷钓鱼口;该约束登记 A1/B4 共同验收。 -7. **RAP 跨战斗生命周期开关**(owner:垂直切片 knob 复核):MVP 每场战斗清零(用户拍板);若实测支持跨战斗存蓄(Boss 图连刷策略),须修订 Rule 11/EC12 + 登记 D3 持久化归属与 C2 冒险域语义。 diff --git a/design/gdd/legacy-2026-09-13/a4-terrain-variation.md b/design/gdd/legacy-2026-09-13/a4-terrain-variation.md deleted file mode 100644 index a1be5045..00000000 --- a/design/gdd/legacy-2026-09-13/a4-terrain-variation.md +++ /dev/null @@ -1,223 +0,0 @@ -# A4 地形变异(Terrain Variation) - -> **Status**: **Approved**(2026-09-08 两轮独立评审:full 8 阻塞 + 同日 re-review【六专员 + creative-director 终裁】6 阻塞均同日核销;CD 终裁建议 delta 核销免第三轮 full 评审,用户拍板照此放行【A3 先例】。日志与两轮阻塞→修复对照表:`design/gdd/reviews/a4-terrain-variation-review-log.md`。承重规则不变:生成期布置约束 + 零特判原则 + fog unlock_level=2) -> **Author**: user + agents(lean 门禁:systems-designer 审查 Formulas · qa-lead 审查 Acceptance Criteria;承重规则"生成期布置约束"为 2026-09-08 用户定稿;2026-09-08 full 独立评审与同日 re-review:game-designer · systems-designer · qa-lead · economy-designer · level-designer · ux-designer · creative-director 终裁——两轮修订全部由评审结论与终审裁决直接推导,无新增设计决策) -> **Last Updated**: 2026-09-08 -> **Implements Pillar**: P1(主——信息诚实边界,"不可推理"永不伪装成"可推理")· P3(信息维度变体——定价通货从雷险换信息+AP)· P2(暗面警示——雾区奖励可预期性切面)· P4(地牢氛围本体承载) -> **Layer**: 1 Foundation · **Milestone**: MVP · **设计顺序**: 第 3 位(上游 D2 已 Approved;A3 已 Approved) - -## Overview - -A4 定义扫雷图上的**地形变异**:在基础扫雷规则之上叠加的、区域性的规则偏离。基础版扫雷图上所有格子遵守同一套规则——开格出数字,数字即推理的原料;变异让某片区域的格子"不那么规矩"。MVP 唯一变异是**迷雾**:迷雾区的格子开出后**不显示数字**(未开时即以纹理标出区域范围,原型 v3 紫色迷雾格已验证可读性)——玩家看得见"哪里推不出来",但推不出区内的具体情况。变异框架同时保证岩浆、冰冻等后续变异(垂直切片起随关卡解锁)能在不推翻既有规则的前提下逐个加入。 - -玩家不"使用"A4:变异由棋盘生成(A1)布置在图上,玩家在挖掘中**遭遇并应对**它——看见迷雾边界那一刻,决策就出现了:如何安排挖掘顺序让 0 格连锁免费吃掉雾格(**连锁路由**)、链不可达的雾残段是按全价续付清图还是停手/弃图(A3 风险退出权衡)(垂直切片起再加"是否用道具买情报",A5)。诚实口径(2026-09-08 评审修正;同日 re-review 再修正"探路"残留——雾区无雷是玩家可见知识,探路零信息收益零命险,不构成选项,真实决策面 = 连锁路由 + 续付/退出):清图判定含雾格,**雾是清图的必经段而非可绕过的支线**;"绕开走"的真实形态是 A3 的停手/弃图风险退出——权衡发生在路由顺序、AP 预算与清图/弃图时机上。没有 A4,游戏失去两样东西:难度只能靠雷数单调缩放,关卡间"解锁新变异"的推进感(P4 越下越险)消失;且"无法推理"的格子会以埋伏形式随机出现——迷雾把"你推不出来"从暗处的埋伏变成明处的选择,是 P3"风险与收益同源"在空间维度的载体,也是对 P1"我算对了"的诚实兜底:推不出的区域被显式标注、可绕行、可买情报,而不是让玩家在自以为可推理的局面上撞墙。A4 只拥有变异的**定义与交互规则**:布置算法归 A1、挖/旗执行归 A2、呈现归 D1,数值落在 D2 的 VariationTable(本 GDD 为回填 owner)。 - -## Player Fantasy - -**直接承载**(玩家每轮都在看见并应对变异——Section A 定稿:直接感知)。A4 的情绪目标一句话:**站在洞口前的权衡感**——迷雾不制造惊喜或惊吓,它制造一个看得见边界的承诺:"里面有价值,进去的代价是 AP 溢价与放弃雾格数字这份推理原料。"**"里面有价值"不是愿望而是契约**——由 B4 三条定价硬约束兜底(两条防税下界:雾内奖励档位下界 ≥ 最低档安全格 buff 当量、清图奖励锚随雾成本负担联动上浮【口径 = 链不可达雾格,与定价成本同分母】;一条防福利上界:雾板净当量优势带上界——防"链免开 + 锚上浮"双白拿的福利板化,Interactions B4 行登记 B4 验收):防"进洞无额外价值"触发本节反向护栏、使迷雾退化为纯 AP 税,也防雾在 MVP 首发关(level 2 小图低密、链免开占比结构性最高)退化为零成本糖果区——后者会让玩家建立"雾=免费奖励"先验,待后期雾变厚全价残段出现时恰触发本节"被骗感"护栏(2026-09-08 评审修正;同日 re-review 增防福利腿与同分母口径)。 - -体验锚点(按支柱): - -- **P1"我算对了"的诚实边界**:迷雾是游戏对玩家的坦白——"从这里开始,数字不再说话"。它把"无法推理"从埋伏变成路标:玩家在雾外仍可用区外数字推理雾边缘的雷(**跨雾推理**——被雾边已知约束放大的常规推理体验,"隔着雾也算出来了";措辞按 2026-09-08 评审降调:非独立机制,是常规推理在雾边的延伸);进了雾,每一步是承诺而非计算。这份坦白本身就是掌控感的护城河:玩家输给的是自己选的赌,不是信息欺骗。基础区的可推理率生成保证归 A1,A4 负责的是"不可推理"**永不伪装成**"可推理"。 -- **P3"风险与收益同源"——降格声称(2026-09-08 评审修正:原"信息维度变体"强声称不过 P3 自家裁剪判据——雾 MVP 行对三向效果循环全惰性:无雷险入、无标中收益出)**:迷雾的"险"不在雷(**雾区无雷**——生成期约束的玩家可见知识),而在**信息与行动力的双重定价**:进雾不赌命,盲区预算按**链不可达雾格全价**收紧(链可达雾格经邻接 0 格连锁免费开出——两态口径,Formulas 注记;2026-09-08 re-review 修正本句"每格花 AP"全价残留)。诚实口径:**变异框架是 P3 的长期载体,迷雾仅是其信息切面;P3 的雷险维度由岩浆/冰冻(垂直切片起)承接**。迷雾真实的 P3 耦合点在雾边(Rule 5 双向效应)——雾边推理的原料与候选域变化由 A1 按双向净效应建模。 -- **P2"规划的延迟兑现"的暗面警示**:雾内奖励若不可见,规划退化成探索惊喜(创意风险 #1,CD 门禁登记 B4/A4 落实)——本系统在 Core Rules 定迷雾的**信息呈现规则**("边界可见、内容隐蔽"的精确切面),奖励可见性/探测机制的接口在此预留、内容归 B4/A5。 -- **P4 地牢氛围的本体承载**:迷雾是"下探黑暗"隐喻的直接具象——未探索的黑暗不再是抽象的未开格,而是有形状、有边界、趴在地图上的实体;后续变异(岩浆/冰冻)延续"越深越险的地貌"叙事(随关卡解锁)。 - -参考感受:Into the Breach 的信息诚实(游戏从不用隐藏信息骗你——本作反其道而行,把"信息缺失本身"诚实标注);杀戮尖塔地图的路径承诺(看得见的未知,选定的风险)。**反向护栏(裁剪判据)**:迷雾绝不能制造"被骗感"——若雾区边界不可见、或进洞无额外价值,迷雾退化为纯负体验税;任何让雾区"隐性化"的设计默认砍掉。 - -> ~~注:`creative-director` 未经咨询——Lean 模式(仅 D/H 两节委托专家),生产前请人工复核本节情绪定位。~~(2026-09-08 full 独立评审已咨询 creative-director 并终裁本节处置:幻想节按 MVP 事实诚实改写;"清图判定豁免雾格"选项经裁决**否决**——违反零特判承重规则。) - -## Detailed Design - -### Core Rules - -1. **变异定义框架**:变异 = 具名规则包(VariationTable 一行)。每个变异定义四件事:**身份**(variant_id / display_name / unlock_level / biome_tag)、**信息规则**(info_mask——隐藏什么)、**布置约束**(cell_constraint——允许落在什么格子上)、**作用域**(scope——region / global 预留)。框架自身不含运行时逻辑:逻辑存在于"信息规则 × 既有系统行为"的交集,变异定义只声明交集参数。 -2. **迷雾(MVP 唯一变异)**:region 作用域的信息剥夺变异,规则两条:未开雾格以专属纹理显示区域范围(边界可见);开出(无论挖掘或连锁)**不显示数字**。 -3. **生成期布置约束(承重规则,2026-09-08 用户定稿)**:迷雾区只能布置在**非 0 安全格**上——区内**无雷、无 0 格**。约束在 A1 生成期强制执行(A4 声明约束、A1 实现)。**"雾区无雷"是玩家可见知识**(教学与图例传达,D5 义务)。由此迷雾对既有规则全面惰性化——见 Rule 4。 - **结构推论(2026-09-08 评审增补:约束的几何硬边界,登记 A1 验收)**:非 0 安全格 = 8 邻域含 ≥1 雷 ⇒ 每个雾格必有**非雾雷邻居** ⇒ 雾区任意处**厚度 ≤2**(可判定谓词:≡ **任意 3×3 窗口非全雾**——3×3 实心雾块中心必为 0 格,不可能成雾。度量钉死为窗口谓词而非"直线连续行程 ≤2":宽 3 对角带无任何全雾 3×3 窗、完全合法,按行程读法会误拒——2026-09-08 re-review 钉死)——雾区恒为雷集切比雪夫 1-膨胀出的边界带,且雾面积占比存在依赖雷密度的必要上界(f ≤ 8×雷密度)。"区域数量/尺寸/占比"参数(A1 BoardGenTable 域)必须在此边界内定义(OQ1 联动);1~2 格宽雾带是雾的正常形态,视觉规格须按最坏宽度验收(AC-9)。可推导元知识:"每个雾格必邻区外雷"由规则可推出——按 P1 诚实原则(可推导即可教)纳入教学候选,口径归 D5 裁定。 -4. **零特判原则**:既有系统行为**一律不感知变异状态**—— - - **连锁展开**:触发与传播只看真实数字;雾格恒非 0 → 雾格自身**永不传播**连锁(不开出新级联);但雾格**可被邻接 0 格的连锁免费开出**(EC4——"不传播"≠"不被开",2026-09-08 评审澄清)。flood fill 代码零变异分支。 - - **数字计数**:数字 = 周围 8 格雷数恒真;雷全在雾外,任何数字的值不因雾存在而改变。 - - **清图判定**:雾格照常计入"安全格全开"判定。 - - **旗**:雾内插旗合法(价目照常)但**恒标不中**(无雷)——合法、无害、无意义。 - - **行动价目**:挖/旗/移动成本雾内外一致(A3"地形成本修饰"钩子**本 GDD 搁置**——启用须回 A3 重议 per-cell 成本接口)。 - - **结算**:雾格安全格奖励照常入库与结算(B1/B4 无需感知雾)。 -5. **信息剥夺边界**:迷雾隐藏的**仅有未开雾格的数字**。不隐藏:区域边界、已开格的全部信息、奖励入库过程。剥夺的实质是**推理原料**——雾格数字本可作为区外雷的推理源,其寂静使雾边界附近线索变少;区外数字对雾外雷的计数照常 → 雾边界推理仍可行但原料减少。**双向效应(2026-09-08 评审修正,禁单向建模)**:剥夺之外并存增益——雾格 = 已知无雷且必邻区外雷的非 0 格(Rule 3 结构推论),雾形本身携带雷簇位置信息(k 格雾区外环必含 ≥⌈k/8⌉ 雷;雾边邻格的雷候选域收缩、局部更易解),即"雾边 = 推理锚"。净效应双向且依赖雾形/雷密,A1 可推理率参数须按**生成后实测净效应**建模、禁止单向补偿(登记 A1 验收)。 -6. **布置权归 A1**:A4 不拥有布置算法。区域数量/尺寸/位置与雷图共生(约束执行)归 A1 生成算法 + BoardGenTable 参数((level_index, node_depth) 维度,A1 回填);布置随机经 `board_gen` 流取号(RngService scope 绑定:每次生成新扫雷图)。A4 对布置的唯一参与:**unlock_level 门控**——`level_index ≥ unlock_level` 的变异进入该关布置候选池。 -7. **出生区无雾**:初始 3×3 安全区及其自动展开范围永不含任何变异(A1 布置硬约束,登记 A1 验收项;**展开可达域由 A1 生成期确定性计算**——不依赖 A2 的运行期展开行为定义,2026-09-08 评审修正;**可达域取保守上界:从出生 3×3 经 0 格的最大 flood 闭包外扩 1 格**,任意 A2 展开定义的超集;A2 GDD 门禁登记回验项:**A2 实际展开域 ⊆ A1 排除域**——"构造上不可能"仅在超集关系下成立,2026-09-08 re-review 增)——防"开局即瞎"与"开局预开雾格"。初始展开**无奖励**(game-concept 定稿)优先于 EC4 入库语义;经本条生成期排除,初始展开触及雾格在构造上不可能发生(双保险)。 -8. **数值承载于 D2**:VariationTable(本 GDD 回填 owner,schema 见下节);A4 相关代码零玩法数值字面量、零随机(布置随机在 A1,经 board_gen 流)。 -9. **未来变异扩展规则**:岩浆/冰冻无 MVP 行(CD 门禁:无 MVP 容器),随垂直切片关卡解锁建行;新变异需新规则字段时走 D2 接口漂移规则回写本 GDD 与 D2;精英/Boss 图**全局变异**(C3 域)= scope=global 预留位,语义归 C3 GDD 定稿——本 GDD 只保证枚举位存在,不预写语义。 - -### VariationTable Schema 定稿(D2 回写义务) - -| 字段 | 类型/范围 | 默认(fog 行) | knob | 说明 | -|---|---|---|---|---| -| variant_id | String(主键) | `"fog"` | ✗ | 变异标识;A1 候选池与 A2 查询的键 | -| display_name | String | `"迷雾"` | ✗ | 图例/教学用名(本地化归 D6) | -| unlock_level | int [1, 999] | 2 | ✓ | 首次可布置关卡序号(game-concept 解锁序列:普通数字→迷雾→岩浆/冰冻);本表为定义表(数值恒定)非进度成长表,键 = variant_id(D2 占位已定),进度语义承载于此列——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**(内容回填字段,与 Tuning Knobs 节"结构冻结"归类一致——2026-09-08 re-review 修正原 ✓ 误标) | - -**校验**:variant_id 唯一(重复键致命,D2 Rule 6 既有类别);unlock_level ≥ 1(域校验);`scope=global` 行在 MVP 出现即 warning(C3 未定稿语义前不应出现——诊断收集器 warning 级承载);**跨字段校验 `info_mask=hide_numbers ⇒ cell_constraint=safe_nonzero`(2026-09-08 评审增补,违规致命)**——Rule 4"雾格恒非 0 / 级联止于雾格"是承重规则(Rule 3)的寄生结论而非 hide_numbers 的本性:无此校验,未来 hide_numbers + any 行将静默击穿 EC4(连锁不再止于雾格)。MVP 表内容恰含 fog 一行有效定义(内容事实,非 schema 校验;岩浆/冰冻不建行)。 - -### States and Transitions - -A4 无运行时状态机——变异是棋盘格的只读属性,生命周期四阶段: - -| 阶段 | 载体 | Owner | 行为 | -|---|---|---|---| -| 定义(构建期) | VariationTable .tres | D2 承载 / A4 回填 | ConfigDB 加载校验;热重载走 D2 既有门(战斗中拒绝,EC8) | -| 布置(生成期) | 棋盘格变体属性 | A1 | 生成新扫雷图时经 board_gen 流取号;unlock_level 门控候选池 + cell_constraint 强制 + 出生区排除 | -| 生效(执行期) | 格属性只读查询 | A2 / D1 消费 | 开格时读"是否雾格"决定数字显示与否;零运行时写入 | -| 消亡(随图) | 棋盘实例销毁 | A2 | 清图换新图 / 刷新 / 战斗结束——变异属性随棋盘实例消亡,无跨图存续 | - -### Interactions with Other Systems - -| 系统 | 方向 | 接口契约 | -|---|---|---| -| D2 | 双向 | VariationTable 8 字段回填(本 GDD 义务,schema 见上节);读取经 ConfigDB;新字段走接口漂移规则 | -| A1 | A4 → A1(定义消费) | 候选池门控(unlock_level)+ cell_constraint 生成期强制 + 出生区及其生成期可达域排除(登记 A1 验收);区域数量/尺寸/位置参数归 BoardGenTable(A1 回填,本 GDD 不定数值)且须在**厚度≤2 / f≤8d 硬边界**内定义(Rule 3 结构推论);布置随机经 board_gen 流;**可推理率生成参数按雾边双向净效应建模**(雾格数字不可作推理源 = 寂静减项;雾格已知无雷且必邻区外雷 = 推理锚增项——禁单向补偿,登记 A1 验收) | -| A2 | A2 → A4(只读查询) | 开格时查询格变体属性决定数字显示与否;**零特判原则**(A2 执行逻辑无变异分支——连锁/旗/清图行为照旧);雾格开启结果照常上报(安全格) | -| A3 | 契约相邻 | 价目不受变异影响(地形成本修饰钩子搁置,启用须回 A3 重议 per-cell 成本接口);**A3 F1 条款 5 对账注记(2026-09-08 评审修正——原"迷雾耦合消解"表述作废)**:雷险腿消解(雾区无雷不产生 50/50)+ 信息腿双向净效应 + AP 腿(链不可达雾格全价抬高清图成本与敌方结算时间税)三腿入账——见 Formulas 节对账注记,登记 B1 条款 5 强制检查点输入项 | -| B1 | 无感知(注记级) | 运行期结算不感知变异(雾格奖励 = 普通安全格奖励);设计期 F1 条款 5 对账注记同 A3 行(三腿入账,雾板/无雾板两态验算);**两态验算另须含两条方向性护栏(2026-09-08 re-review 登记,定量谓词归 B1/B4 对账闭合)**:① 雾板净当量优势带上界(雾板 vs 无雾板 EV 差的容许带——防福利方向);② 防钓鱼方向(与 A3 OQ6 防钓鱼约束对账):雾板下界抬升不得使"弃图刷雾板"支配"即刷"——逐板奖励差分 × 最低雾出现率 × 8 RAP 刷新会构造出 A3 OQ6 明令防的刷新钓鱼环,此处登记张力、解法(关卡层常量锚 / 防钓鱼不等式 / 与 OQ6 显式对账)归 B4/B1;playtest 弃图率/完成度指标**雾板分层**观测(注记回执 A3 OQ3——聚合指标会被雾板污染或反向掩盖,2026-09-08 评审增补) | -| B4 | 接口预留 | 雾区奖励内容/密度归 B4 表 + A1 参数。**三条定价硬约束(2026-09-08 评审登记两条 + 同日 re-review 增第三条;B4 GDD 验收项)**:① 雾内奖励档位下界 ≥ 最低档安全格 buff 当量——防雾格沦为"全图单位 AP 期望收益最低格"的纯税(注记:A3 条款 2 教义的对照基准为连锁放大边际收益,本锚仅是反淹没下界、不保证 per-AP 平价——per-AP 检查归 B1/B4 对账);② 清图奖励锚随**雾成本负担**联动上浮(口径 = 链不可达雾格数 × dig_ap_cost,与定价成本**同分母**——原"雾面积"口径与成本分母可双向脱钩、作废;上浮形态须为关卡层常量或受 B1 行②防钓鱼不等式约束,定量曲线归 B4);③ **雾板净当量优势带上界**(防福利方向——雾在 level 2 小图低密关链免开占比结构性最高,仅单向防税下界会使雾板退化为零成本糖果区,谓词定量归 B4)。定价成本口径按**链不可达雾格**计(Formulas 注记)。奖励预知方案(创意风险 #1)的 A4 侧切面已定:雾不额外隐藏内容,预知归 B4 呈现 + A5 探测 | -| A5 | A4 → A5(接口预留) | counter_item_ids 字段;探测类道具对雾的语义 = **雾内数字显影**(恢复推理原料,非排雷——雾内无雷);A5 期定稿 | -| C3 | 预留 | scope=global 枚举位(精英/Boss 图全局变异);global 行出现前须先定稿语义(MVP warning 校验) | -| D1 | A4 → D1(呈现规格) | 未开雾格专属纹理(区域边界可读);**形状+颜色双通道**(色弱冗余,视觉锚 2);绘制优先级 数字>小人>旗>变异纹理>底色(视觉锚 3);已开雾格 = 地板无字 | -| D5 | A4 → D5(教学口径) | **"雾区无雷"为必须教授的玩家可见知识**;教学要点:雾 = 盲区不赌命、雾内旗恒空、清图含雾格、**雾内无连锁折扣(连锁止于雾界属正常——防"连锁莫名断了"的被骗感)**、雾格成本口径(系统侧两态:链可达免费开出/链不可达全价;**玩家侧教学按保守启发式——"雾格按全价做预算,连锁白开当惊喜"**:链可达性取决于未开 0 格的隐藏拓扑,玩家决策时点不可求值,明教两态反生免费期待、恰触发反向护栏被骗感,2026-09-08 re-review 修正);可推导元知识"每雾格必邻区外雷"入教学候选(P1 诚实:可推导即可教,口径归 D5 裁定);教学文案不得写死解锁关号(EC9) | - -## Formulas - -> systems-designer 代理已审查(lean 门禁,2026-09-08):排除声明成立、谓词改集合语义、补四条下游验收项与预算构成注记,均已并入。**2026-09-08 full 独立评审**(systems-designer 重审 + level-designer 新发现):F1 边界代入无退化、谓词健壮性确认;lean 版"雾格全部全价"结论**部分作废**(改链不可达两态,见排除声明);条款 5"消解"改三腿入账。 - -### F1 布置候选门控(variant_pool_gate) - -`pool(level_index, board_biome) = { v ∈ VariationTable | (v.unlock_level ≤ level_index) ∧ (v.biome_tag = ∅ ∨ v.biome_tag ∩ board_biome ≠ ∅) }` - -**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 静默布置普通图,不报错(登记 A1 验收)。 -**Example:** fog(unlock_level=2, biome_tag=∅):level 1 → pool=∅;level 2 → pool={fog};未来 magma(unlock_level=3)在 level 3 起 pool={fog, magma},A1 从池中选取时**必须消费 board_gen 流**(回放确定性,登记 A1 验收)。 - -### 显式排除声明(R4 式) - -本 GDD **无平衡公式**——迷雾的全部数量参数(区域数/尺寸/位置/与雷密度及图尺寸的交互)归 A1 BoardGenTable,且须在 Rule 3 结构推论的硬边界(厚度≤2【≡任意 3×3 窗口非全雾】 / f≤8d)内定义。唯一 A4 侧定量注记(2026-09-08 full 评审改两态口径;同日 re-review 再改增量构成):**雾不改变 AP 价目,但改变清图预算构成,且雾格 AP 成本分两态**——雾格永不**传播**连锁,但**可被邻接非雾 0 格免费链开**(EC4):**链可达雾格免费开出、链不可达雾格按全价 `dig_ap_cost` 结算**。**雾致预算增量构成(2026-09-08 re-review 改写——原"≤ 轮数上限 × ap_per_round"不等式作废:"轮数上限"在 A3 契约中不存在【A3 轮次无界、AP 每轮硬重置】,该式恒真空转,且只约束雾增量却命名"清图预算校验"、诱导充分性误读)**:`雾致预算增量 = 链不可达雾格数 × dig_ap_cost`(量纲闭合:格 × AP/格),作为一项**计入清图总预算需求**参与 A1 BoardGenTable 的设计期核算;总预算可用量与全量校验(全量待挖下界 ≤ 可用预算)的口径归 A1/A3 契约,非本 GDD 定义。稀疏图链可达占比高,全价假设会系统性高估雾成本(level-designer 评审发现)。核算为**设计期(调参期)聚合义务**而非逐板运行期强制,违例动作 = 修正 BoardGenTable 参数(登记 A1 验收⑤)。**该增量对 A3 F1 条款 5 仅是可行性输入、不提供雾成本显著性保证——此局限如实登记**(2026-09-08 re-review)。 - -**对 A3 F1 条款 5 的对账注记(2026-09-08 full 评审修正——原"迷雾耦合消解"表述作废)**:雾对条款 5(清图 vs 弃图支配性)的影响是**构成变化而非消解**,三腿一并入账—— - -- **雷险腿(消解 ✓)**:雾区无雷、不产生 50/50 赌雷(原消解声称仅对此腿成立); -- **信息腿(仍在,双向)**:雾边寂静减少推理原料(推高弃图),与雾边推理锚增益(Rule 5)方向相反——净效应实测、非定理(终审裁决:game-designer"50/50 减少可能反向利好清图"成立,"必然推高弃图"不采纳); -- **AP 腿(新增,推高弃图)**:链不可达雾格全价无连锁折扣,抬高清图成本——敌方结算时间税随之上行。 - -雾面积占比与链不可达占比为 **B1 条款 5 对账输入变量**(链不可达占比的**生产者义务** = A1 生成期计算并输出,登记 A1 验收⑤——2026-09-08 re-review 补,防输入变量有名无源),B1 闭合对账须**雾板/无雾板两态分别验算**支配性不等式(A3 provisional 验算只在无雾图形况做过)+ **两条方向性护栏**(雾板净当量优势带 / 防钓鱼,见 Interactions B1 行——2026-09-08 re-review 登记)——登记 B1 强制检查点输入项。 - -### 下游定量验收项登记 - -- **A1**:清图预算按**增量构成**核算——雾致预算增量 = 链不可达雾格数 × dig_ap_cost,计入清图总预算需求参与**设计期(调参期)聚合校验**,违例 = 修正 BoardGenTable 参数(非逐板运行期强制;原"雾区全价、无 0 折扣"口径与"≤ 轮数上限"不等式均作废——链可达雾格经 0 格连锁免费开出、"轮数上限"无定义);且生成期须计算并输出**链不可达雾格占比**(B1 条款 5 对账输入的生产者义务——2026-09-08 re-review 补)。 -- **A1**:候选池为空(未解锁或 biome_tag 全不匹配)须静默跳过、不报错。 -- **A1**:池内多变异时的选取必须消费 RngService 的 board_gen 流(回放确定性)。 -- **C3**:scope=global 落地时须重审 cell_constraint 覆盖与零特判原则是否仍成立(含 `hide_numbers⇒safe_nonzero` 跨字段校验的相容性)。 - -## Edge Cases - -- **EC1 If 候选池为空**(雾未解锁如 level 1,或 biome_tag 全不匹配):A1 静默布置普通数字图——空池合法、非错误、无 warning(F1 Output Range 行为;两种来源同待遇)。 -- **EC2 If cell_constraint 无解**(非 0 安全格**面积或连通分量尺寸**不足以布置任何雾区——图太小/雷太密/雷太稀致雷膨胀皮肤碎裂/参数要求过高;判据含连通性而非仅总面积——Rule 3 结构推论使雾域恒为雷集边界带,总面积充足但碎裂成小分量时同样无解,2026-09-08 评审修正):本次布置雾的尝试失败 → **跳过雾布置,本图为合法无变异图**(A1 生成算法的降级产物)。禁止放宽约束硬塞——Rule 3 承重规则不为布置成功率让步。**部分达成契约(2026-09-08 re-review 增补)**:BoardGenTable 要求 N 区而生成仅达成 k 小人 > 旗 > **变异纹理** > 底色——雾纹理不得干扰雾外数字辨识;已开雾格 = 地板无字(不留雾残留遮蔽)。 - 3. **调色板交换优先**(视觉锚 4):雾纹理须支持 biome 色板变体(biome_tag 字段的换皮对应)——新 biome 不新增雾资产,只换色板。 -- **边界可读性 = 硬指标**:未开雾格的区域边界在任何色板下必须可读——这是"明处的选择"幻想的视觉前提(P1 诚实边界的呈现面),与"数字可读性 × 暗色氛围"样张测试(game-concept 风险登记第 1 条)同批验证。 -- 原型 v3 紫色迷雾格已验证基线可读性;正式色值/形状归 art-bible 格子样张测试定稿。 -- 动效(可选,MVP 不承诺):雾格开出瞬间的"雾散"过渡——归 B5/D1 表现里程碑,非 A4 义务。**无音频需求**(雾开出音效归 D4 Alpha 期)。 - -> 注:`art-director` 未经咨询——Lean 模式。生产前请人工复核本节与 art-bible 的一致性。 - -## UI Requirements - -A4 不拥有 UI。三个呈现义务归 D1:① 未开雾格纹理(区域边界可读——上述视觉规格,AC-9 操作化口径);② **"雾区无雷"知识的静态传达入口——登记 D1 MVP 验收两条(2026-09-08 评审登记:D5 里程碑在 Alpha,雾在 MVP level 2 即首遇,D1 是 MVP 唯一活载体;对比 A1×15/A2×4,本知识此前零验收落点):(a) 图例含"迷雾 = 无雷盲区"条目——**条目恒在、不设解锁门、可随时回看**;(b) 首遇提示触发 = **首个实际含雾格的板进入可操作状态(挖掘阶段开始)时一次性触发**——生成期一次查询即判定,免疫 EC2 降级板误触发、免疫 EC3 贴脸雾 t=0 歧义(原谓词"雾格首次与已开区相邻"在贴脸雾图生成瞬间即为真、在远雾图严重滞后,作废——2026-09-08 re-review 修正);"一次性"作用域 = **每 run 一次**(MVP 无持久化设施,存档级"一生一次"归 Alpha D3/C4 后重议);可在图例回看;**(c) 提示与图例的必含要点枚举(A4 持验收权的枚举对象——D1 文案缺任一要点即验收不通过)**:雾 = 无雷盲区不赌命、**雾格不传播连锁(连锁止于雾界属正常——防"连锁莫名断了"的被骗感;此为前次阻塞 8 第二知识源的 MVP 落点,2026-09-08 re-review 补)**、雾内插旗纯损;文案与呈现形态定稿归 D1 GDD(硬约束:非模态、不劫持输入、不打断挖掘流)**;③ 已开雾格 = 地板无字(负空间呈现,防误读为 bug)+ **底色层 tint 残留与雾区全开一次性完成信号(2026-09-08 评审采纳,登记 D1 验收候选——"站在洞口前"承诺的结束拍与清图进度可读;tint 处于视觉锚 3 最低层,与视觉锚 2"不留雾残留遮蔽"的冲突口径:遮蔽禁的是遮挡数字/实体的雾残留,tint 是底色层标记不犯此条;转正与否及完成信号粒度(视觉合并域 = 信号单元,禁实例级双响)登记 OQ8 裁决)**。结算界面无 A4 附加项(雾格奖励 = 普通安全格奖励,无独立归因类别——P2 标注归 B1)。无 HUD 常显字段(变异是棋盘属性非资源,与 A3 的 AP/RAP 不同)。 - -## Acceptance Criteria - -> **测试载体与口径声明**:A4 是定义层系统——冒烟载体 = `godot --headless --script`(承 D2 冒烟框架;脚本 extends SceneTree、autoload 显式实例化)。**三层切分**:定义层(本 GDD 冒烟域 = schema/门控谓词/校验)· 布置层(A1 集成,**15 项**登记见 Dependencies)· 执行层(A2 集成,4 项登记见 Dependencies)——deferral 以对侧登记为生效条件;**A1×15/A2×4 清单已同步登记 systems-index 门禁记录(2026-09-08 评审增补)——A1/A2 GDD 门禁评审逐项核对落位,缺项即 blocking**。**致命用例独立进程协议**承 D2 AC-2b(runner 清单逐条登记"调用→期望退出码";单进程内只做测试通道收集断言)。夹具经 `--data-root` 注入,五根齐备(**3 根致命错误夹具 + 1 根 warning 夹具 + 1 根合法数据变体夹具**——2026-09-08 re-review 修正原"3 根错误夹具"计数失实:global_scope 为 warning 级非错误;并新增跨字段致命夹具):`variation_dup_key`(与 D2 AC-2 重复键夹具**独立同型**——A4 表首用,避免跨表耦合;致命)/ `variation_unlock_oob`(unlock_level=0,致命)/ `variation_mask_constraint`(info_mask=hide_numbers + cell_constraint=any 跨字段违规,**致命**——2026-09-08 re-review 新增:EC4"级联止于雾格"的承重保证此前零测试落点)/ `variation_global_scope`(**warning 级、非错误**——游戏通道 0 退出)/ `variation_biome_tag`(**合法门控测试行** biome_tag=[ice]、unlock_level=1,服务 AC-3,无对应校验类别)。期望值**由表值推导不写死**(unlock_level/biome_tag 为 knob,推导纪律适用两者——2026-09-08 re-review 修正原"唯一 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"恰含一行"间接兜底,2026-09-08 评审增补)。 - -**定义与内容** -- **AC-1** GIVEN 干净检出,WHEN 冒烟加载 Core Rules-3 表清单,THEN 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 字段仅作类型域断言、期望 = 表读值**(不作定值断言、不写死——EC9 及 biome_tag 调参防打假;biome_tag 定值断言系 2026-09-08 re-review 撤销:合法调参不得假失败)。 -- **AC-2(门控相对边界;全腿作用于干净检出默认表根——仅 fog 一行,2026-09-08 re-review 钉死载体根)** GIVEN fog 行表值 (u, tag=∅)(默认行),board_biome 取任意非空集,WHEN 对 (level_index=u) 求 pool,THEN 恒含 fog;**仅当 u>1**,GIVEN 同 board_biome 对 (level_index=u−1) 求 pool,THEN ∅(u=1 时 u−1=0 越出 level_index≥1 域、不测——F1 前置域,2026-09-08 评审修正。原 GIVEN 的 tag≠∅ 推导分支移交 AC-3 夹具腿——该分支在默认表根永不触发(死文本)、在夹具根上 u−1 腿不真(ice 行 u=1 入池),2026-09-08 re-review 修正)。 -- **AC-3(通配与交集,结构性断言;`eligible(v, L, B) := v ∈ pool(L, B)`——F1 谓词的成员判定形式,2026-09-08 评审补定义)** **前置断言:夹具根零诊断加载**(每用例 `reset_diagnostics()` 后加载,防 schema 演进劣化静默——2026-09-08 re-review 增)。第一腿 GIVEN fog.biome_tag=∅(默认行),WHEN 在 **level_index=u(fog.unlock_level 表读值)**以任意非空 board_biome(单/多元素集各一)求 eligible,THEN 恒 true(原句缺 L 参量——L=1 时按字面为假,2026-09-08 re-review 修正);第二腿 GIVEN 夹具根 variation_biome_tag(测试变异行 biome_tag=[ice]、**unlock_level=1 写入夹具规格——防门控腿掩蔽 biome 腿**;本腿同时承载 AC-2 移交的 tag≠∅ 交集推导语义),WHEN 在 level_index=1 以 board_biome={dungeon} 与 {dungeon, ice} 分别求 eligible(v=测试行),THEN false / true。 - -**校验与致命** -- **AC-4(重复键/跨字段·测试通道)** GIVEN 夹具根 variation_dup_key 与 variation_mask_constraint,WHEN `load_tables(root, collect_only=true)`,THEN 错误清单各含重复键类别 / 跨字段校验类别(`hide_numbers⇒safe_nonzero`——2026-09-08 re-review 增)。 -- **AC-4b(致命·独立进程)** GIVEN 夹具根 variation_dup_key、variation_unlock_oob(unlock_level=0)与 variation_mask_constraint,WHEN 各以独立 headless 进程跑游戏通道 `collect_only=false`,THEN 三进程均非 0 退出且错误清单完整(D2 Rule 6 加载期致命——"游戏内真的会死")。 -- **AC-5(域边界,程序构造免夹具;实例化一律走 class_name 直引、不经 load()/preload()——AC-7 扫描豁免条款,2026-09-08 评审增补)** GIVEN schema 实例构造,WHEN `validate()` 作用于 unlock_level ∈ {0, 1000},THEN 均域错误;∈ {1, 999} 均合法。 -- **AC-6(global warning·非致命)** GIVEN 夹具根 variation_global_scope,WHEN 测试通道加载,THEN 诊断收集器 warning 恰一条**且来源类别 = global 语义注记、其余表零诊断**(每用例先 `reset_diagnostics()`;防他表 schema 演进以无关诊断稀释断言——2026-09-08 评审增补);**同夹具游戏通道独立进程以 0 退出**(非致命半句)。 - -**静态与一致性** -- **AC-7(零随机与单点访问)** GIVEN A4 文件集(schema/谓词/冒烟脚本),WHEN 按 D2 AC-9 模式静态扫描(`randomize()`/`RandomNumberGenerator`/ConfigDB 外 data 表加载),THEN 零命中(扫描域扩入 A4;**schema class_name 直引实例化豁免**——AC-5 程序构造前提,承 D2 AC-9 模式)。 -- **AC-8(registry 一致)** GIVEN ConfigDB 加载完成,WHEN 脚本解析 `design/registry/entities.yaml` 的 `variation_table` 条目,THEN 与 ConfigDB VariationTable 8 字段**定义**(字段名/类型/域/knob 标记)逐一相等,**定值断言仅限非 knob 字段;knob 字段(unlock_level/biome_tag)对账口径 = registry 随调参同步或本 AC 豁免其值**(防 EC9 调参经此后门假失败);对账域**显式排除 `mvp_content` 与 `fog_ap_note`**(前者含 knob 活值登记——2026-09-08 re-review);缺任一即失败(仿 A3 AC-10a)。 -- **AC-9(人工·视觉)** 边界可读/双通道/色板变体验收归 art-bible 格子样张测试(AD 门禁),非冒烟域(阈值委托的排期门与违约判定 = systems-index 2026-09-07 门禁增补记录;**art-bible 缺位期以原型 v3 紫色为临时明度基线,就位后强制复测**——2026-09-08 re-review 增)。**操作化口径(2026-09-08 评审增补——"可读"须为可判定谓词,防形容词验收)**:① 形状通道 = 色板无关线稿资产 + 对全部底色的明度对比数值下限(具体阈值 art-bible 定,须存在);② 新增 biome 色板强制重跑样张清单(登记 AD 门禁复测项);③ 样张须含最坏用例:**宽度 1 雾带**(每格即全边界——Rule 3 结构推论下的正常形态)、"旗 × 雾纹理 × 边界"三重叠加格,与**宽度 1 雾带两侧毗邻数字格**(视觉锚 1"纹理不干扰数字辨识"的真实威胁面在邻格——雾格自身无数字,2026-09-08 re-review 增)。 -- **AC-10(人工·字面量)** A4 文件集纳入 D2 AC-14 项目级扫描(人工三要素口径,引用不另设——与 A3 AC-10b 同型)。 - -**悬空引用处置**(qa-lead 发现的 D2 条件性夹具义务首兑现点):counter_item_ids 为 D2 schema 中**首个引用型字段**——MVP 显式声明**不校验**悬空引用(字段恒空、A5 未回填);A5 GDD 回填首个道具 id 时补悬空校验 + 条件性夹具(已登记 Dependencies 节 A5 行)。 - -## Open Questions - -1. **雾面积/数量参数回填与 P1 验证**(owner:A1,第 5 位):BoardGenTable 的雾区域数/尺寸/占比默认值——**须在 Rule 3 结构推论硬边界(厚度≤2【≡任意 3×3 窗口非全雾】 / f≤8d)内定义**,含最低雾出现率与降级率埋点口径;可推理率参数按雾边**双向净效应**建模(寂静减项 × 推理锚增项);雾占比与可推理率的联动曲线(A1 的 P1 生成端保障核心 + 本 GDD 登记 15 项验收的数值侧);**占比参数双重身份声明(2026-09-08 re-review 登记):难度旋钮 × 情报旋钮——雾形携带雷簇位置信息(Rule 5 推理锚),占比/数量调参同时改变"雾 = 雷簇探测器"强度与首遇显著度(总占比/最大区域尺寸下限口径随 BoardGenTable 一并定,防首关雾低于注意阈值致 P4 解锁拍哑火)**。 -2. **探测显影的时效与定价**(owner:A5,第 11 位):EC6 留白——临时/永久显影、道具成本、counter_item_ids 首个回填 + 悬空引用校验补全(D2 条件性夹具义务兑现)。 -3. **创意风险 #1 的 B4 侧兑现**(owner:B4,第 8 位):奖励预知的呈现方案(A4 侧切面已定:雾不额外隐藏内容);雾区奖励在效果当量对照表的落位——**受三条定价硬约束(Interactions B4 行:① 档位下界 ≥ 最低档安全格 buff 当量;② 清图奖励锚随雾成本负担上浮【链不可达同分母口径】;③ 雾板净当量优势带上界——防福利,B4 GDD 验收项)**,成本口径按链不可达雾格计;①的 per-AP 平价与②③的定量谓词归 B4/B1 对账闭合。 -4. **scope=global 语义**(owner:C3,第 12 位):精英/Boss 图全局变异的构成、施加时机、与零特判原则及 cell_constraint 覆盖的相容性重审(Formulas 节 C3 验收项)。 -5. **岩浆/冰冻规则设计**(owner:垂直切片期,随关卡解锁建行):变异框架的下一批居民、P3 雷险维度的承接者;需新字段时走接口漂移规则回写本 GDD 与 D2。 -6. **变异解锁曲线复核**(owner:C3 + D5,低优先):"每关至少引入一个新元素"的推进节奏随 C3 难度曲线定稿复核;D5 教学动态适配表值(EC9),不写死解锁关号。 -7. **标错惩罚与雾内旗**(owner:A2 前原型小补丁,联动 A3 OQ2):若惩罚上线,雾内旗恒受罚的一致性推论纳入实测观察项(EC5);EC5 推论在 A2 原型会话**前置确认**(防 D5 教学返工——2026-09-08 评审增补)。 -8. **已开雾格 tint / 雾区全开完成信号的裁决**(owner:D1 + CD,deadline:D1 GDD 前):现处"验收候选"悬空态(无 owner 无裁决时点,2026-09-08 re-review 登记本 OQ 终结悬空);裁决须同时覆盖:与 0 格的可判定区分(0 格 = "八邻无雷"推理信息,视觉混淆污染推理——tint 为当前唯一区分手段)与 EC11 合并呈现下的完成信号粒度(视觉合并域 = 信号单元,禁实例级双响)。 diff --git a/design/gdd/legacy-2026-09-13/b1-settlement.md b/design/gdd/legacy-2026-09-13/b1-settlement.md deleted file mode 100644 index def6580d..00000000 --- a/design/gdd/legacy-2026-09-13/b1-settlement.md +++ /dev/null @@ -1,675 +0,0 @@ -# B1 战斗结算规则(Combat Settlement Rules) - -> **Status**: Designed(2026-09-10 一次会话定稿;lean 门禁:systems-designer 起草 Formulas〔F0–F5 + 对账义务清单〕· qa-lead 起草/验证 AC〔43 条 + 覆盖矩阵 + 缺口预检 12 项〕已咨询;CD-GDD-ALIGN 按 lean 跳过,生产前人工复核 Player Fantasy;art-director 按 lean 跳过,生产前人工复核 Visual/Audio 与 art-bible 一致性。**F0 归一口径裁决已定**〔瞬时当量 + m_w 值域 [60,85]/默认 −65——B3 红警裁决落定,回执走接口漂移〕· 条款①③⑤闭合首版验算完成〔actuals p10 交付后强制重跑〕· 高光双落〔#2 完美排雷 P_perfect=×2 / #3 标中旗高光标记〕· 23 条上游义务全落位) -> **Revision 1**(2026-09-10 /design-review NEEDS REVISION → 同日修订批:8 blocking 核销——①完美排雷 ×2 落真实双份交付载体〔用户拍板〕+ 高光行有效兑付语义/零兑付降级 ②条款⑤计价模型重推为挖穿残余池口径、verdict 翻转为未闭合→C3/B4 约束包 + 多敌验算腿 + ι→1 域守卫 + 护栏 B 输入登记与双读数 ③流水协议补 target/effect_id/pool_value 字段分层 + enemy_action/flag_miss 来源枚举 ④hit=false"标旗未中"零值行(每雷实例一次去重)⑤P_perfect ÷100 换算成文 + 载体域收窄 {100,200} ⑥AC-18 腿 2 改写 ⑦F4 V_safe 标签更正 + 期望口径敏感性读数 ⑧clamp 字段统一八字段;recommended 21 项中 19 项留后续批次;日志 `reviews/b1-settlement-review-log.md`) -> **Author**: user + agents -> **Last Updated**: 2026-09-10 -> **Implements Pillar**: P2(主——"扫雷的因、战斗的果"的兑现面)· P3(雷的双面兑付)· P1(条款③不等式 = 掌控感的经济侧验收) - -## Overview - -B1 是战斗域的**编排与结算中枢**:轮次生命周期的唯一 owner——A2/A3 的 `round_end`(双发射源:A2 棋盘路径 + A3 停手路径)到达后,由 B1 在 **Waiting 相位编排点**触发结算(不依赖事件到达序),按**段序骨架**驱动全部战斗域系统完成一次兑付:**授予段 → 道具使用窗口 → 增益/减益段 → 道具段 → 战斗段 → 衰减段 → 判定段**;判定产出三种结局(敌人全灭 → 胜利 / 主角死亡 → 失败 / 否则 → 下一轮次),并向 A3 回发 `next_round_mode` / `battle_over`、向 A1 发起换图生成、编排挖掘期弃图刷新(`refresh_board`——A3 扣费 + A2 retire + A1 generate + A2 install + B4 roll_board,2026-09-12 D4 修订;原结算编排期 Waiting 刷新代理作废)。它是全项目唯一有权调用 B2/B3/B4 战斗域接口的编排方,也是 A3 F1 五条款经济契约的验收方与条款①③⑤的**单一闭合对账 owner**。 - -**双层口径**:对内,B1 是纯逻辑编排账本——零随机(`rng_service` 流封闭不含结算流)、零 UI 依赖、结算逻辑禁 await/动画,输出契约为**可回放步骤流**(同种子同动作序列 ⇒ 结算步骤流逐行相同——D2 AC-15"战斗级可回放"deferred→B1 的兑现义务);对外,它是 MVP 战斗体验的**本体**:战斗动画归 B5(垂直切片),当前每轮结束时玩家面对的结算明细屏就是战斗本身——扫雷的因(挖格/标旗/停手)在这里逐行兑现为战斗的果,每行携带来源标注(伤害道具 / 安全格增益 / 标中旗削弱 / 清图奖励 / 雷→伏击),P2"可归因"的呈现半边由这份流水直接承载。 - -边界(B1 不拥有什么):单位状态与行为环归 B2、状态实例容器归 B3、奖励内容与 roll 归 B4、行动价目归 A3、棋盘面规则归 A1/A2、结算明细的呈现归 D1/B5。B1 拥有的是:段序、次序、判定时机、伤害公式的消费侧语义(clamp/地板/换算方向)、明细流水协议,以及全部上游义务账本(B3×8 / B2×6 / A2×3 / B4×6)的兑付落点——没有 B1,三套战斗域 API 面全部失联,胜负没有判定者,A2/A3 的事件没有消费者,P2 的兑现没有现场。 - -当前内容态注记(2026-09-11 用户裁决改写):主角伤害来源 = **基础攻击(HeroTable.atk 域 [1,999]、0 加载拒绝——恒在)+ B4 奖励侧增量(刀/attack_up 等)**;胜负判定消费 B2 存活集素材,接口就绪与胜利路径存在是两件事——本 GDD 战斗段含主角先手攻击步(Core Rule 10 / F3 ⓪)。 - -*(实现口径注:编排器类结构、事件总线载体〔autoload 单例 vs 直连——TD 门禁 2026-09-07 登记〕、步骤流的落地形态不在本 GDD——实现期 ADR 域;本 GDD 只定行为契约与次序。)* - -## Player Fantasy - -**直接承载**(Section A 定框答案:玩家不操作 B1 的任何编排逻辑,但每一轮都直接面对它的工作成果——结算明细屏)。B1 的情绪目标一句话:**"这一轮的一切,都是我算出来的"**——轮次结束、结算展开的那一刻,玩家看到的不是系统在打架,而是自己前几轮扫雷决策的逐行回放:第三轮挖到的刀正在削它的血(这一行是我挖的)、标中的旗还在削弱它(这是我赌对的)、上一轮踩的雷喂了它伏击(这是我贪的代价)。P2"扫雷的因、战斗的果"在 B1 从口号变成每轮一次的可见仪式。 - -体验锚点(按支柱): - -- **P2 可归因的兑现现场**:结算明细逐行携带来源标注(伤害道具 / 安全格增益 / 标中旗削弱 / 清图奖励 / 雷→伏击)——P2 裁剪判据"玩家能说出这个结果是我哪步扫雷带来的"的**最终兜底在 B1 流水协议**:若一行明细说不出来源,即 B1 失职(呈现归 D1/B5,数据源与协议归 B1)。 -- **P1 掌控感的经济侧信任**:"挖下去是值得的"——挖掘决策 EV 健康不等式(A3 F1 条款③)由 B1 闭合签字,玩家不需要知道不等式,但每一轮"继续挖比收手好"的隐性判断都踩在这份对账上;条款⑤(清图支配性)守的是"推到底"不会在数学上吃亏。 -- **P3 雷的两面同框**:敌方伏击行与标中旗削弱行在同一份明细、同一种呈现语言——玩家由此学会"雷是赌桌不是陷阱":我贪它就吃壮,我标中它就被拆。 -- **判定的可归因**:胜利/失败不是随机裁决——"它死了是因为我的刀攒够了"(抢杀窗口兑现)、"我死了是因为那一轮喂太多"(灾难轮代价),判定素材(存活集/HP)全部可回溯到此前明细行。 -- **高光兑现节点(情绪需求登记,机制裁决归 D 节检查点)**:game-concept 创意风险 #2("我算对了"缺爆发结算)与 #3(chord 缺席的标中旗节拍缺失)的机制本体归 B1 强制检查点——本节只锚定情绪目标:玩家需要"完美排雷被加倍兑现"与"标中的一瞬立刻有回报"两类高光节拍,缺失则长战斗退化为匀速流水账。 - -参考感受:杀戮尖塔的逐卡结算反馈(打出去的每张牌的效果逐个可见——延迟满足的兑付面);Into the Breach 回合解析的因果清晰。**反向对照**:game-concept 已识别风险 #1 的病灶本身——"自动战斗沦为无聊过场"——B1 的明细流水就是那个"兑现层必须可见、有反馈"的答案;若结算被做成黑箱数字雨,本作的 agency 前移设计即告失败。 - -**反向护栏**:结算明细绝不能有无来源的行——每行必须能回答"从哪来"(P2);判定绝不能不可归因(P1);敌我两侧的增减益必须同构呈现(P3)。任何让明细"合并到看不出来源"的呈现优化,须先确认归因链在数据层仍可还原(行协议归 B1,合并呈现归 D1/B5 裁决)。 - -> 注:`creative-director` 未经咨询——Lean 模式(仅 D/H 两节委托专家),生产前请人工复核本节情绪定位。 - -## Detailed Design - -### Core Rules - -1. **编排唯一性(调用权集中,B3/B2/B4"授予集中在编排"同款原则的总端点)**:B1 是战斗域全部跨系统调用的唯一发起方——B2(spawn/query_*/apply_damage/advance/despawn_all)、B3(notify_battle_start/apply_effect/query_active/decay_round/notify_battle_end)、B4(roll_board/grant/grant_clear/stock/use/query_inventory/clear_inventory/retire_mapping)、A3(`refresh_board` 编排内 `request_refresh` 调用〔D4 2026-09-12〕 + notify_settlement_done/notify_combat_end 回发)、A1(generate 换图编排)、A2(install_board/retire_board 调用方)。A2/B3/B4 零相互直调(各 GDD"零直接接口"声明的对侧);D1 经 `settle_batch` 提交意图、不直调 A3(A2 D1×6① 的对侧确认)。B1 自身**零随机**(`rng_service` 流封闭不含结算流;若未来需结算随机,走 D2 Rule 5 增流通道 + P1 评审——MVP 无此需求)、零 UI 依赖(headless 债)、结算逻辑禁 await/动画(可回放步骤流的承重约束)。 -2. **结算触发 = Waiting 相位编排点(A2 义务①落位)**:B1 的结算触发条件 = 轮次结束事务达成(`path_tag` 可用),**不依赖事件到达序**——stopped 轮 A3 直发 `round_end` 与 A2 `flag_judged` 批的到达先后不承载语义(事件序契约 `flag_judged` < `round_end` 全路径统一,仅为数据完整性服务)。实现载体(事件订阅 vs 相位轮询)归实现期 ADR;行为契约 = 触发判定只读 A3 相位观测量与 `last_round_end`。 -3. **轮 facts 批处理收集**:B1 订阅三事件流(A2 事件面 referenced_by 含 B1),按轮缓冲 `cell_revealed ×N` 与 `flag_judged ×N`,**轮末统一转化**(与 A2"轮末统一判定"同构——不在挖掘期即时写任何战斗域容器)。处理序 = 事件规范序(A2 发射序:cell_revealed 行主序 BFS 序、flag_judged 行主序)。**事实→授予恰一次转化是 B1 编排义务(B3 义务② / B2 义务② / B4 义务②——B3 不去重、B4 幂等仅兜底)**:每格受理、每雷转化、每旗判定各恰一次,由 B1 的轮 facts 缓冲保证(一事件只进一次转化)。 -4. **段序骨架(B4 义务①落位——用户 2026-09-09 拍板原文)**:每轮结算按固定段序解析——**授予段(含 grant_clear 兑付)→ 道具使用窗口(授予段后、增益/减益段前)→ 增益/减益段 → 道具段 → 战斗段 → 衰减段 → 判定段**。核心序拍板不变:buff/debuff > 道具 > 战斗。段序为**结构冻结**(修订走 GDD 流程非调参);段内细则归本 GDD 各段规则。**窗口选择序列 = 结算回放的输入事件**(可回放步骤流的两类输入 = 意图序列 + 窗口选择序列)。 -5. **授予段(次序规则 = B3 义务①"确定次序"的 B1 定稿)**:三批依次转化,批内按事件规范序—— - 1. **cell_revealed 批**:逐格受理——`kind=mine` → 伏击转化(见规则 6);`kind=safe ∧ reward_eligible=true` → 调 B4 `grant(cell)`,返回快照分流:**buff 类**调 B3 `apply_effect(effect_id, source={safe_cell, origin_cell, round_index})`;**即时类(instant_aoe / instant_heal——2026-09-11 两级奖励裁决)当场兑付**:`instant_aoe` = 对全体存活敌各 `power` 点(逐个 `apply_damage`、受击即死),`instant_heal` = 主角回复 `power`(clamp,满血 → "奖励未生效"行零兑付)——不调 stock、不进库存、不出窗口;**道具类**调 B4 `stock(item)` 入关卡域库存。**`reward_eligible=false`(initial 通道)格不入奖励库(A2 义务②落位——A3 EC5 委派闭环)**;`channel` 不入 B1 判定(eligibility 字段已由 A2 封装,零特判)。**每格受理恰一次**(B1 轮 facts 缓冲承载;B4 E18 幂等为编排瑕疵兜底)。满层拒绝(apply_effect 返回 false)= 零兑付 + "奖励未生效"明细行(无折算——用户拍板),**行携带可聚合计数/批次字段(B4 义务②)**;连锁批量授予溢出 = **显式接受**(B1/B4 共裁完成——B4 E3 已裁显式接受,B1 侧同款承接,无转换补偿)。 - 2. **flag_judged 批**:逐旗判定——`hit=true ∧ 该雷格实例资格未消费` → 调 B3 `apply_effect(weaken, source={flag_hit, origin_cell, round_index})` + 资格消费入集合;`hit=true ∧ 资格已消费` → **去重跳过(A2 义务③落位——A2 诚实重复上报的对侧)**,零明细行(重复兑付从未发生)或 debug 诊断;`hit=false` → 零兑付 + **"标旗未中"零值行**(source=flag_miss、value=0、可聚合计数字段、highlight=`perfect_broken` 标记——本板完美谓词已破的归因锚,Core Rule 13#2;**去重语义 = 每雷格实例一次**,与兑付资格同键——A2 逐轮对在场旗重报 hit=false 的重复上报零新增行,防逐轮惩罚轰炸)。标错惩罚未上线(A2 OQ1 实测后走接口漂移补惩罚语义——本行是归因痕迹非惩罚,预留注记保持)。**兑付资格以雷格实例为键,B1 持有已消费资格集合(战斗域跨轮累积)**;换图后新图新雷 = 新实例,资格自然重置(A3 Rule 8)。**标中旗兑付明细行携带高光标记(创意风险 #3 落地——数据面,呈现归 D1)**。 - 3. **cleared 轮清图奖励(B4 义务③落位——B3 OQ4 关闭条件)**:调 B4 `grant_clear()` → 预分配身份兑付,分流同上(source=clear_reward;B3 source_class 枚举已含)。兑付后同结算窗口即可选用(窗口锚点收益面)。**完美板(Core Rule 13#2)本段追加第二份同身份兑付**(道具类再 `stock` 一次 / buff 类再 `apply_effect` 一次——第二份走既有授予通道,`grant_clear` 本身仍恰一次)。**若清图槽为 buff 行且满层** → 零兑付 + "奖励未生效"行(合法例外,B4 E11 拍板对侧);完美板高光行降级不发(Core Rule 13#2 降级规则)。 -6. **伏击转化与 cap 预截流(B2 义务②⑥落位)**:`mines_r` = 本轮 cell_revealed 批中 `kind=mine` 计数 → 调 B2 `ambush_grant_plan(mines_r, cap)`(cap = EnemyTable 行值快照)→ 前 `granted_r` 颗雷(事件规范序——B2 建议序采纳)逐颗调 B3 `apply_effect(ambush, source={mine_hit, origin_cell, round_index})`;`overflow_r` 颗逐颗产"溢出未生效"明细行(含来源)。**每颗雷恰一次转化**(B1 缓冲 + B2 计划面双保险)。伏击池 L 为 side 共享(B2 F2),dur=1 → 本结算读值恒 = granted_r,轮末衰减清零。 -7. **道具使用窗口(B4 义务④前半落位;单件制 2026-09-11 用户拍板)**:授予段完成后打开——**窗口数据组装 = B4 `query_inventory` 投影 + B1 侧守卫预判 `usable_now`**(满血治疗包禁选——B1 读 B2 hero hp 判定,B4 零跨系统读纪律不破;伤害道具在窗口时点恒可用——结构推论:敌死亡只发生于道具段,窗口打开时存活敌 ≥1)。**玩家至多选用一件或跳过**(2026-09-11 用户拍板"先不需要多选"——原"任意多件 + 同窗顺序逐件动态重判"作废;>1 件的选择提交 = 编排违例,取首件 + 诊断)。零选择 = 跳过恒合法。窗口期选择收集与棋盘输入不竞争(单意图帧先例);呈现(窗口形态/时机指示/usable_now 禁选态/空库存不弹窗政策)归 D1(D1 义务②)。**窗口选择序列登记为结算回放输入事件**。 -8. **增益/减益段(B3 义务③⑤⑦落位)**:调 B3 `query_active(hero)` / `query_active(enemy)` 读值(插入序;六归因字段 + 授予时快照投影)→ 经 **SettlementTable 效果语义映射**(effect_id 为键——percent→乘数换算方向与合成值地板的成文落点在 Formulas F2)合成到攻防算式 → 逐条产效果明细行。**结算明细按授予流水逐条标注来源(B3 义务⑦——合并实例只持首授归因字段,per-layer 来源还原的数据源 = B1 授予流水;B1 按 apply_effect 调用流水展开,非按容器实例)**。敌方侧语义 = side-wide(全体存活敌单位——B3 单敌假设回验后的多敌兼容读法;target_ref 单体寻址扩展位上线时随批补归集语义——B3 接口漂移条款的 B1 随批义务)。 -9. **道具段(B4 义务④后半落位;单件制 2026-09-11)**:窗口选定件(至多一件)生效——**伤害道具**:D = power(恒定表值,不吃任何 percent 修正——B4 F4 拍板对侧),目标 = B2 `default_target()` 固定顺位最前存活敌,调 B2 `apply_damage(u, D)`,击杀结果(该敌 hp=0 → Dead)**进流水(H3 抢杀窗口感知数据前置)**;**治疗包**:满血守卫(读 hero hp,满 → 拒绝不烧包 + "使用被拒"行),`hp' = min(hp + power, max_hp)`(clamp 归 B1)。**零效果判定读 B2 存活集**(选定刀施加时已无存活敌——前序刀全灭情形:**照常消耗**(Used 不可逆)+ "已消耗未生效"明细行——B4 E10 拍板的 B1 侧承接,守卫所有权不对称:满血守卫是表局部判定、零效果判定须读 B2 存活集)。产道具明细行(含来源 {cell, round} 归因)。 -10. **战斗段(B2 义务①③⑤落位;2026-09-11 用户裁决增补主角先手攻击)**:段首**主角先手攻击**——对 `default_target()`(存活敌行主序最前者,与道具段同源)施加 **D_hero = HeroTable.atk ×(1 + attack_up 载荷)**(attack_up = 唯一吃修正的攻击增益——percent 池加算/clamp/地板走 F2/F3 既有语义;"道具伤害恒定表值不吃修正"的拍板不变,刀仍恒定表值);算式见 F3 ⓪;击杀 → 死亡即不动手(受击即死同款);产伤害明细行(**source_class = hero_attack**——2026-09-11 新增来源值,接口漂移随批登记,target 字段照常)。存活敌清空 → 敌方循环空转(零行动行)径入衰减段。随后对每个存活敌单位(行主序生成序)执行循环,**结算内调用序钉死:`query_attack` → `apply_damage` → `advance`**(倒序读到下一拍——B2 义务①;**每结算每存活敌恰一次 advance,hero 不在推进域**——主角无行为环,环接口对 hero 句柄拒绝): - - `query_attack(u, L, m_amb)` → 分量二元组 {baseline, attach}(L = 本结算伏击池层数读值——授予段后的当轮值);`charge` 拍 → 零作用,产"蓄力"明细行(数字兑现面——玩家把观察到的姿态与明细对上); - - `attack`/`heavy` 拍 → 敌方伤害 = F2 构成(后置加法),经 hero 侧减伤合成(SettlementTable 语义映射,Formulas F3)→ clamp/地板(Formulas)→ 调 B2 `apply_damage(hero, D')` → 产伤害明细行(分量二元组 + 减伤后终值——P2 归因的敌侧兑付面); - - **死亡判定时机(B2 义务③)**:敌 hp=0 在受击时即 Dead(道具段同款——死亡即不动手);**hero hp=0 → 战斗段立即短路中止**(剩余敌单位本结算不再作用、不再产行动明细行——用户拍板:死尸挨打行是归因噪音),径入判定段; - - 循环尾调 `advance(u)` 恰一次。 - 伏击池在敌作用中**共享不消耗**(同结算各敌读同一 L——B2 F2)。 -11. **衰减段(B3 义务④⑥落位)**:调 B3 `decay_round()` **恰一次,恒执行、含末轮**(先兑付后衰减的时序契约落点——dur=1 一次性语义的先决条件;最后一轮判胜后状态由 `notify_battle_end` 全清兜底,两种次序同终态,但次序钉死为段序骨架 = 衰减在判定前)。返回移除数 k 记入步骤流(衰减明细行聚合呈现归 D1 裁决)。 -12. **判定段(B2 义务③死亡时机 + game-concept 轮次流程 4)**:**hero hp=0 → 战斗失败**(防御性优先级先判——结构上敌我同结算双死不可达:我方伤敌在道具段与战斗段主角先手攻击〔均先于敌方行动兑付〕、敌方伤我全在主角攻击之后——敌行动时点若已敌全灭则先判胜;推理随 2026-09-11 主角先手攻击更新,本腿为纵深防御);否则**存活敌集 = ∅ → 战斗胜利**;否则 → 下一轮次。胜负判定明细行(终局行)。battle_over 触发清理编排(见编排专章)。 -13. **高光兑现节点(强制检查点——创意风险 #2/#3 机制本体,用户 2026-09-10 拍板双落;同日评审修订:×2 落真实双份交付载体——用户拍板)**: - - **#2 完美排雷(perfect_sweep)**:板级判定器——本板自 install 起全部 `flag_judged` 中 `hit=false` 计数 = 0 **且** `hit=true` 计数 ≥ 1 → 该板 cleared 轮的清图奖励兑付时追加"完美排雷"高光明细行 + **清图奖励身份第二份兑付(运行时真实双份——用户 2026-09-10 评审拍板)**:道具类身份 → B4 `stock(同源身份快照)` 第二次调用(玩家实得两件,如 clear_knife ×2);buff 类身份 → B3 `apply_effect(同身份)` 第二次授予(L+2,满层拒绝语义照旧——第二份被拒产"奖励未生效"行)。`grant_clear` 本身仍恰一次(B4 义务③不受影响——第二份走 stock/apply_effect 授予通道,第二份兑付恰一次 = B1 编排义务,可回放确定性函数)。**B4/B3 零接口修订**(两次调用均在既有受理域内)。当量语义 = F1 对照表 clear 行 × P_perfect÷100(**换算 ÷100 成文**;p_perfect 运行时载体域 = **{100, 200}**——100 = 仅高光无第二份、200 = 双份交付;非整数倍数乘数无运行时载体,域外值加载致命,Tuning Knobs 校验行)。**高光行 value = 实际有效兑付当量**(首份 + 第二份被接受部分;禁记名义值——"数字诚实可归因"反向护栏);**降级规则:清图槽首份即满层零兑付 → 高光行不发**(庆祝不打在空兑现上;完美谓词仍按板级事实成立,仅无兑付面)。零特判自然成立:雾内旗恒不中(A4 EC5)→ 雾板插雾旗计入误标(教学已警示"雾内插旗纯损",无变异分支)。 - - **#3 标中旗高光标记**:规则 5 已落(weaken 兑付行 highlight 标记);其即时节拍 = 标中旗当轮即兑付(weaken dur=1 本就当轮生效)+ 数据面标记供 D1 强调呈现——chord 缺席的兑付节拍缺失以"当轮兑付 + 明细强调"组合补偿,深度形态(即时 HUD 反馈动画)归 D1/垂直切片。**高光使用规则一句话:事件型高光(完美排雷)用独立高光行、属性型强调(标中旗/清图奖励 H2)用行字段标记**。 -14. **明细流水协议(输出契约——D1/B5/D4 消费面)**:步骤流 = 明细行序列 + 窗口输入事件标记,零 await 顺序写入。**行类型封闭枚举 13 类**:`效果行`(buff/debuff 兑付——effect_id/来源/单次授予贡献值/池合成值)、`伤害行`(分量二元组 + 减伤终值 + 击杀标记 + **target 目标字段**)、`治疗行`、`道具行`(入库/生效/语境注记;生效类携带 **target 目标字段**)、`奖励未生效行`(聚合计数字段)、`已消耗未生效行`、`使用被拒行`、`溢出未生效行`(伏击族;奖励族同名协议——B3 义务⑧/B2 义务⑥协议统一)、`标旗未中行`(零值归因行——Core Rule 5.2,可聚合 + perfect_broken 高光标记)、`蓄力行`、`衰减行`、`判定行`(胜负/继续)、`高光行`(完美排雷;清图奖励行 H2 强调标记由行字段承载)。**字段分层声明(公共 vs 行类型特有)**: - - **公共字段(13 类全必有)**:`type / source_class / origin_cell / round_index / display_name / value / highlight?`——P2 归因的字段落点。`origin_cell` 板级行(判定行/高光行/衰减行/清图奖励行)**可空**(空 = 板级事件,无格子归因);`highlight` 可空枚举,值集 = `{flag_hit, clear_reward_h2, perfect_broken}`(新增值 = 接口漂移)。 - - **行类型特有字段**:伤害行/道具行(生效)→ **`target`**(目标单位句柄 + display 名——"打到了谁、谁打的我"的显式数据源,禁消费方按行序重演 B2 目标状态机;多敌归因的字段级保障);效果行 → **`effect_id`**(D1 icon 映射与极性判别的键——B3 D1×4②③ 的桥,display_name 本地化后反查失效的防御)+ **`pool_value`**(池合成值);效果行/伤害行的 `value` 语义定死:**效果行 value = 该次授予的贡献值(L×m 投影)**,池合成值入 `pool_value`(同轮两旗各显贡献值 −65、pool_value = −130——防"−130% × 2 行 = −260%"误读;伤害行 value = 减伤终值 D' 不变);未生效四类 + 标旗未中行 → 可聚合计数/批次字段(既有)。**新字段均为输入的确定函数——回放逐行相等断言(AC-33)语义不受损**。 - - **source_class 封闭枚举 = B3 source_class ∪ {道具/判定扩展, enemy_action, flag_miss, hero_attack}**——`enemy_action` = 敌方行动行(战斗段伤害行/蓄力行)的来源标注(原枚举无值可填的缺口补齐);`hero_attack` = 主角先手攻击伤害行(2026-09-11 用户裁决新增——基础攻击恒存在的 P2 归因来源值,接口漂移随批登记);新增值 = 接口漂移,同步 source_label_map 键集。**未生效类行携带可聚合计数/批次字段**(合并呈现归 D1/B5 裁决,数据必须可聚合)。**无来源行 = 断言失败**(AC-42——P2 归因兜底)。本协议为 D1 各呈现义务清单(A2×6/B2×4/B3×4/B4×5)的统一数据源契约。 -15. **可回放性(D2 AC-15 deferred→B1 的兑现义务)**:同 master_seed 同意图序列同窗口选择序列 ⇒ 结算步骤流**逐行相同**。确定性来源:零随机(规则 1)+ 确定性输入(A2 事件流零随机 + 窗口选择为回放输入)+ 表值快照(B2 行值快照/B3 授予快照/B4 授予快照——热重载撕裂已被三侧快照纪律阻断)+ **attempt 边界非 scope 事件**(A1 F5 注记④——B1 编排不把生成重试当取号事件)。 -16. **数值承载于 D2(SettlementTable,B1 回填 owner——D2 Core Rules 占位行的兑现)**:SettlementTable(单行全局)承载段序字段名/来源标注映射/换算方向与地板规则标识(schema 定稿见 Tuning Knobs 节);B1 代码零玩法数值字面量(D2 Rule 1)、读取经 ConfigDB。**debug 热重载门:战斗开始 `set_reload_gate(true)`、battle_over 复位(D2 EC8——B1 是置位/复位唯一调用方;"战斗中真的被置位"的验收落点归本 GDD AC,D2 AC-16 只测门机制)**。 - -### 轮次生命周期编排(Round Lifecycle Orchestration) - -B1 是轮次节拍的**编排权威**(A3 States 表"编排权威序列以 B1 本章为准"的兑现)。可观测相位域复用 A3 {Idle, Active, Waiting};RoundStart/RoundEnd 为事务内瞬态(不作 GIVEN——A3 纪律同款)。 - -**战斗开始序列**(入口 = `begin_battle(encounter)`;encounter 上下文 (level_index, node_depth, hero_hp) 归 C1 供给〔未设计——MVP 冒烟直供,provisional〕): -① `set_reload_gate(true)`(D2 debug 门)→ ② B3 `notify_battle_start()`(容器开域)→ ③ B2 `spawn(L, D, hero_hp)`(行值快照实例化)→ ④ A2 `install_board(A1.generate(L, D))` + **B4 `roll_board(资格格清单)` 恰一次(B4 义务⑥——install 后、挖掘前;资格格清单 = S ∖ R₀,B1 从 A2 产物读取)** → ⑤ A3 `notify_round_start()` → Active。 - -**每轮结算序列**(Waiting 相位编排点触发——Core Rule 2): -① 轮 facts 收集(Core Rule 3)→ ② 段序骨架解析(Core Rule 4–12;窗口段暂停等玩家输入——窗口选择序列入回放)→ ③ 出口分发: -- **继续**:A3 `notify_settlement_done(same_board)` → `notify_round_start()`(同图续轮); -- **换图(new_board)**:A2 `retire_board()` + B4 `retire_mapping()` → A1 `generate(L, D)`(**attempt 边界非 scope 事件**)→ A2 `install_board(产物)` → B4 `roll_board(...)` 恰一次 → A3 `notify_settlement_done(new_board)` → `notify_round_start()`。**触发条件钉死(A3 契约义务——违约 fail-fast)**:`cleared` 轮恒走 new_board;`stopped`/`ap_exhausted` 轮**恒 same_board**(2026-09-12 D4 修订:刷新决策前移挖掘期——挖掘期弃图刷新走 **`refresh_board` 编排**〔玩家经 D1/组合根发起 → A3 `request_refresh()` 扣费 → 本换图全序,**无结算段、无 round_end、轮次不终结**〕;原 Waiting 期玩家刷新意图代理调用作废),回发 new_board 于 stopped/ap_exhausted = B1 违约(不变)。刷新图不产生清图奖励(A3 Rule 11——对挖掘期当场刷新同样成立:弃图非清图)。 -- **战斗结束(battle_over)**:B4 `retire_mapping()`(映射 = 板级、随战斗消亡——下一场战斗新板新 scope 批)→ B2 `despawn_all()` → B3 `notify_battle_end()`(状态全清)→ A3 `notify_combat_end()`(→ Idle,RAP 清零)→ `set_reload_gate(false)`。各调用**恰一次**(重复调用在各侧为拒绝 + 诊断——B1 编排纪律承载,幂等守卫兜底)。**库存不清**(2026-09-11 关内延续——库存关卡域跨战斗延续;原"battle_over 调 clear_inventory + 清空反馈行"作废)。 -- **关卡结束(level_clear——2026-09-11 新增编排入口;关卡结构归 C1/C2,落位前由上层显式调用)**:B4 `clear_inventory()` 恰一次(**清空前快照计数返回调用方**——"剩余道具 ×N 随关卡结束清空"反馈行〔D1 义务⑤〕/ 关卡末折算结构位〔OQ4 残余,C2〕的数据面)。victory(末层通关)与 defeat(关卡失败)皆然。 - -**回放切点**:快照语义 = master_seed + 各流 scope 计数器(D2 契约)+ 意图序列 + 窗口选择序列;scope 事件边界 = board install(A1 取号)/ board install(B4 取号)——B1 编排保证无在飞流实例跨界(D2 快照切点契约的消费侧遵守)。 - -### States and Transitions - -B1 战斗编排生命周期(容器级——B3/B2 状态容器跨图延续,由本表编排;战斗域生命周期 = 本机生命周期): - -| 状态 | 进入条件 | 行为/出口 | -|---|---|---| -| Uninit | 冷启动 / 战斗清理序列完成 | 唯一出口 `begin_battle(encounter)` | -| BattleSetup | `begin_battle` 受理 | 执行战斗开始序列(Core Rule 16 门置位 → 三容器开域 → 首图 install+roll)→ RoundActive;任一步拒绝 = fail-fast 上抛(编排违约显式暴露,不静默) | -| RoundActive | A3 `notify_round_start` 受理(A3 Active) | 不干预挖掘——A2 受理动作、A3 记账;B1 只缓冲事件流 | -| RoundWaiting | 轮次结束事务达成(A3 Waiting) | 执行每轮结算序列(facts 收集 → 段序 → 出口分发);窗口段为唯一玩家输入点 | -| BattleOver | 判定段产出胜/负 | 执行战斗结束序列 → Uninit | - -**编排不变式**:① 同一时刻至多一个结算事务在飞(窗口为事务内暂停点,非并发入口);② 段序恒全序执行(战斗段短路是段内规则、非跳段);③ 全部跨系统调用集中在 B1(Core Rule 1)——任一下游被 B1 以外语调用 = 架构违约(静态扫描域,Acceptance Criteria 节)。 - -### Interactions with Other Systems - -| 系统 | 方向 | 接口契约 | -|---|---|---| -| D2 | 双向(hard) | SettlementTable 回填(本 GDD owner,单行全局)+ ConfigDB 读取 + `set_reload_gate()` 唯一调用方(战斗开始置位/结束复位——D2 EC8 B1 落点,AC 节验收);零结算随机流(流封闭不变) | -| A2 | 下游 hard | 三事件流订阅(facts 缓冲);`install_board`/`retire_board` 调用方(换图编排);Waiting 相位观测量 = 结算触发条件;事件到达序不承载语义(A2 义务①);initial 格不入库由 eligibility 字段封装(A2 义务②) | -| A3 | 下游 hard | `request_refresh()` 于 `refresh_board` 挖掘期刷新编排内调用(玩家经 D1 发起——A3 Rule 11 玩家意图路径;D4 2026-09-12 前移挖掘期);回发 `notify_settlement_done(next_round_mode)` / `notify_combat_end()`;`last_round_end` 读取;**A3 F1 五条款验收方**(条款①②④⑤对账落 Formulas——B1 单一闭合 owner) | -| A1 | 下游 hard(间接接线) | `generate(L, D)` 换图编排调用方;**消费 actuals 分布(F4 报告 C p10)而非 target 参数(条款③⑤对账输入——A1 登记口径)**;attempt 边界非 scope 事件(编排注记);**EC5 零合法板玩家侧诚实呈现的 B1 半边**:非法产物标记 → 上抛呈现请求(提示/补偿/回退的形态归 D1 裁决——数据面 B1 供,登记 D1 义务) | -| B2 | 下游 hard | `spawn/query_alive/query_beat/query_attack/apply_damage/advance/default_target/ambush_grant_plan/despawn_all` 全调用面;调用序 query_attack→apply_damage→advance(B2 义务①);死亡判定时机(义务③——Core Rule 10);条款③闭合(义务④——Formulas);目标分流(义务⑤);伏击溢出行协议(义务⑥) | -| B3 | 下游 hard | 五 API 全调用面(编排期授予/兑付读值/轮末衰减/生命周期);义务①–⑧全落位(Core Rule 3/5/8/11 + Formulas F1/F2);**weaken 锚红警裁决 owner(Formulas 检查点——OQ1 归一口径前置)** | -| B4 | 下游 hard | 十 API 全调用面(roll_board 恰一次/grant/grant_clear/stock/use/query_inventory/**clear_inventory〔关卡末 level_clear 编排——2026-09-11〕**/retire_mapping/equivalence_supply);义务①–⑥全落位(Core Rule 4/5/7/9/编排专章;**2026-09-11 两级奖励批:授予段即时类当场兑付 + 窗口单件制 + battle_over 清库改关卡末**);usable_now 组装与守卫预判(义务④);关卡末清空快照计数(义务⑤) | -| D1 | 数据供给(hard,未设计——第 10 位) | 结算明细流水 = 统一数据源契约(Core Rule 14 行协议);**承接呈现义务台账**:A2×6(格态/悬停/voided/拒绝可感知等)、B2×4(血条/顺位/线索映射/伏击池)、B3×4(HUD 状态栏/icon/极性/全清去留)、B4×5(窗口/四类行/H2 强调/清空反馈)、B1 新增(高光行强调/完美排雷呈现/EC5 零合法板提示——本 GDD 登记,缺项即 blocking 随 D1 门禁评审) | -| B5 | 数据供给(soft,垂直切片) | 结算步骤流 = 战斗动画的回放脚本源(B5 ← B1 依赖的兑现);溢出行/origin_cell 可读形态呈现(B3×B5×2 义务的数据源) | -| D4 | 事件供给(soft,Alpha) | 音频挂点 = 明细行类型(拾取/生效/负反馈聚合——B4 音频挂钩点的事件源即 B1 流水行) | -| D5 | 口径供给(soft,Alpha) | 教学口径来源(结算来源标注/RAP 清零/库存清空/满层溢出——各上游教学条目的数据源经 B1 流水) | -| C1/C2 | 上游(provisional,未设计) | 遭遇上下文 (L, D, hero_hp) 供给(begin_battle 入参);跨战斗 HP 持久性归 C1/C2(B2 hp_persistence 对侧——MVP 冒烟以 max_hp 入参);战斗触发(节点移动碰非奖励点)归 C1 | -| C3 | 下游(soft,provisional) | 条款③⑤对账结果 = C3 调参约束输入(cap/atk 曲线 × B1 对账联动——B2 Tuning Knobs"禁止独立调参"的对账方);P_perfect 乘数调参所有权归 C3(provisional) | - -## Formulas - -> systems-designer 代理起草(lean 门禁,2026-09-10,受 B1 主会话委托,用户拍板全盘采纳)。本节为 A3 F1 五条款中 **①②③⑤ 的单一闭合对账落点**(条款④清图奖励量级归 B4——本节只消费其供给值 C)。全部公式**零随机**(同输入恒同输出——可回放步骤流的公式侧前提);期望值均为**设计期统计量**(对 A1 确定性流分布的批量统计,运行期无任何随机化——对账输入 = A1 F4 报告 C 的 actuals,非 target 参数)。数值默认全部 provisional(调参所有权归 C3);条款/义务引用带清单限定词。本节落定前,任何 m_w 数值修订被 B3 OQ1 前置步骤禁止——F0 即该裁决。 - -**术语白话**:**乘区** = 伤害公式里相乘的各段修正(本作两段:主角减伤池 × 敌方削弱池);**池** = 同一侧百分比修正的加总桶;**地板** = 数值不许越过的下界(本节地板 = 池最低 −100 百分点,即乘数最低 0);**免伤轮** = 主角该结算受到的伤害为 0 的结算;**溢杀** = 一刀超出目标剩余 HP 的部分——直接丢弃,不转移到下一个敌人;**当量** = 统一价值单位,1 当量 = 1 点主角 HP 的期望净变化;**瞬时口径** = 只数一个结算里兑现的价值(本节裁决口径);**全寿命口径** = 乘上它存活的结算次数(仅作派生量,不作锚);**残余盲猜端** = 图上推理不出、只能赌的那一小块;**完美排雷(P_perfect)** = 一张板上没插错一面旗、且至少标中一面时,清图奖励翻倍的乘数。 - -### F0 当量归一口径裁决(B3 OQ1 前置——本节钉死) - -**裁决**:条款② weaken 锚验收的当量归一口径采用 **"每结算瞬时当量"**(per-settlement instantaneous equivalence);**"每 AP 总暴露"分支排除**。 - -| 分支 | schema 可行性 | m_w 修订含义 | 连带后果 | 裁决 | -|---|---|---|---|---| -| **每结算瞬时当量** | 可行(m_w ∈ [51, 100] 域内) | 锚 = 每结算百分点档严格比较 | F2 越域界随移(AP 界 8×m_w / 表界 16×m_w);地板交叉层数 = ⌈100/m_w⌉ = 2;B4 参照零漂移 | **采纳** | -| 每 AP 总暴露 | **不可行**——需 m_w > 100,被 percent ∈ [−100, 100] schema 域禁止 | 无可行值 | 现实解 = B4 重定最低档参照——但 safe_cell 活行集 {knife_t1, knife_adv, heal_t1, defense_up_basic} 中无更弱 buff 行可指,需 B4 新增低档 buff 行或把锚从 buff 档位移到道具档位:接口漂移 + A4 硬约束①连锁 + 条款①对照表全表重排 | 排除 | - -**裁决理由(三条)**: - -1. **同分母性(数学面)**:瞬时口径下 weaken 与 defense_up 作用于**同一伤害流**(敌→主的同一批攻击实例,见 F2 乘区结构)——每结算当量比较 = 同分母的百分比比较,"严格大于"在百分点读法与 HP 点读法下**等价**,锚判定无量纲歧义。总暴露口径引入时长权重(defense_up dur=2 vs weaken dur=1 的 2:1 不对称),把内容调参 knob(duration)泄漏进锚判定——锚应只判档位,不判时长。 -2. **机制同构(架构面)**:B3 的兑付本来就按结算逐次进行(`query_active` 每结算读值、`decay_round` 每结算 −1)——瞬时口径是容器机制的**原生口径**。总暴露口径需要跨结算累计账本,而 B3 F2/B2 clause3_supply 已钉死"跨结算累计 = 轨迹量、非表值、不设上界"(dur=1 每结算清零无存量——**单结算自然边界**,用户 2026-09-09 定稿)——总暴露口径要求新建跨系统累计状态,与已锁事实冲突,直接排除。 -3. **schema 禁止(成本面)**:总暴露的锚算术需 m_w > 100 出 percent 域——改域 = percent 语义全表重定义(B3/B4/B1 三侧换算连锁、B3 AC-13/AC-16 校验域重写),接口漂移成本不成比例。 - -**推荐 m_w 修订值域与地板规则(可执行裁决)**: - -- **推荐值域 [60, 85],首版默认 −65**(provisional;终值 = 锚 owner B4/B1 共裁、调参所有权 C3,走接口漂移回写 registry)。 - - 下界 60 的依据:**条款②第一腿**(档位锚)要求 m_w ≥ 51(每结算 pp:65 > 50,严格大于 defense_up 的 |−50|,裕度 +30%);**条款②第二腿**(连锁放大边际基准,provisional 下限 1:1)在参考强度下要求每旗当量 ≥ 单安全格奖励期望当量 E_dig = 7.2 HP(F5 Variables),即 m_w/100 × D_ref ≥ 7.2 → **m_w ≥ 60**(零连锁板形)——两条腿的可行交集下界取 60。 - - 上界 85 的依据:> 85 仅在连锁贫瘠板增加裕度,而地板交叉层数恒为 2(见下)、边际层早已贬值;schema 顶 100 保留为绝对上界(对应第二腿校准上界 ≈ 1.96:1,见 F1 边界注记)。 -- **地板规则(B1 clamp 承载,F2 成文)**:每侧 percent 池 clamp ∈ [−100, +100] pp → 乘数域 [0, 2]。**地板交叉层数 = ⌈100/m_w⌉ = 2**(值域 [60, 85] 全域恒 2)——第 3 层起边际瞬时当量 = 0;单结算 weaken 池 HP 当量上界 = min(L×m_w, 100)/100 × D_inst(该结算实际裸伤害敞口)。 -- **B3 红警"7 层即触 B1 地板"预读更正**:该预读按 −400% 合成带估读(⌊400/51⌋ = 7);本节地板钉在**乘数零点(−100 pp)**→ 精确层数 = ⌈100/m_w⌉ = 2。裁决回执同步 B3 OQ1 与 registry `status_effect.anchor_warning`(见对账登记义务清单 #1/#2)——预读的实质结论(上调 m_w 的连带成本 = 地板提前到达、边际层贬值)不变且被本裁决吸收。 -- **连带后果(瞬时分支的义务清单)**:① B3 `StatusEffectTable.weaken.magnitude` −25 → 值域 [60, 85]/默认 −65,走接口漂移回写(B3 GDD 行表 + Tuning Knobs 联动行 + registry);B3 AC-14 腿 3 非平凡性复查:16 × 65 = 1040 越出 percent 域——腿保持非平凡 ✓。② F2 越域界随移:AP 界 = 8 × 65 = **−520%**、表界 = 16 × 65 = **−1040%**(合成值 B3 原样输出、B1 池 clamp 收口)。③ B4 侧零漂移:defense_up 参照保持("重定参照"是总暴露分支的现实解,未采纳)。④ **时长不对称显式接受**:瞬时口径下"每 AP 全寿命价值"defense_up(2 结算) : weaken(1 结算) ≈ 2:1 的不对称不入锚判定——吸收通道 = m_w 上探值域 60→85 段 + 高光 #3 即时节拍 + duration 为 knob;登记为裁决的显式接受项,与 B3 OQ7 playtest 证伪项联动观测。 -- **修订效果量(锚两腿在默认 65 下的读数,provisional @ D_ref=12)**:第一腿 = 7.8 vs 6.0 HP/结算(+30%,严格大于 ✓);第二腿(1:1 零链)= 7.8 vs 7.2 HP(+8% ✓)。历史红警算术(attack_up 口径 25 vs 100)随回执关闭:defense_up 口径复算 = 每结算 25 vs 50 pp(不过锚)→ 修订成立。 - -### F1 效果档位当量对照表(A3 F1 条款①——B3 义务⑤ 对照实物落点) - -``` -统一当量定义:E(·) ∈ 主角 HP 点(1 当量 = 1 点主角 HP 的期望净变化;与 B2 ambush 量纲、B4 F6 量纲建议同源) - -单一线性换算式(全部四源共用——分源改率 = A3 F1 条款①契约作废): - flat / 道具类(刀、治疗包、ambush): E = 值本身(HP 点恒等映射;ambush 按 k 个攻击拍线性展开) - percent 类(每结算、每层): E_inst = |L × m| ÷ 100 × D_exp - D_exp = 兑付结算的实际裸伤害敞口;对照表取参考敞口 D_ref - 完美乘数(显式 ÷100,运行时真实双份载体): E_clear(perfect) = power × P_perfect ÷ 100 - (P_perfect ∈ {100, 200}——载体 = 第二份兑付开关,Core Rule 13#2; - 200 ÷ 100 = ×2 = 两件实得,非账面乘数) - 时长(显式乘子,非分源改率): E_life = Σ结算 E_inst = E_inst × 兑付结算数 - -D_ref = SettlementTable.equivalence_ref_damage(单行全局 knob,provisional 默认 12 - = 单结算伏击结构上界 cap×m_amb〔B2 F4 已登记值〕,兼 attack 拍带 [4,16] 与 heavy 带 [8,20] 的中位代表) -``` - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 参考敞口 | D_ref | int | [1, 999] | SettlementTable 配置值(D2 回写义务,本 GDD owner);provisional 12;变更触发全对照表 + 条款③⑤重跑(联动义务) | -| 层数 | L | int | [1, max_stack] | B3 实例字段(授予快照) | -| 行值 | m | int | percent ∈ [−100,100]∧≠0 / flat ≥ 1 | StatusEffectTable 行值快照 | -| 兑付结算数 | — | int | [1, duration_settlements] | 剩余结算次数轨迹;对照表按满寿命取 | -| 道具威力 | power | int | [1, 999] | RewardTable 行值快照(恒定表值——已锁) | -| 攻击拍数 | k | int | [0, unit_count] | 该结算存活敌中 attack/heavy 拍单位数(B2 F4 供给,确定性可算) | -| 完美乘数 | P_perfect | percent | **{100, 200}**(载体域——非整数倍数无运行时载体,域外加载致命) | SettlementTable 配置值;provisional 200(×2 = 双份交付,Core Rule 13#2;换算入账恒 ÷100) | - -**Output Range:** E ∈ [0, +∞) HP 点(floor 语义见 F2——percent 池饱和后边际 E = 0);全表零负值(负值分支禁令,F3④)。 - -**默认根全部活行对照表(值全部 provisional,归 C3)**: - -| 行 | 源(source_class) | 类别 | 换算式 | E_inst(每结算/层) | 全寿命 E | 注 | -|---|---|---|---|---|---|---| -| knife_t1 | safe_cell | damage_item | E = power | —(库存轨迹量) | 4 | 窗口选用时点兑付 | -| knife_adv | safe_cell(雾池) | damage_item | E = power | — | 8 | | -| heal_t1 | safe_cell | heal_pack | E = min(power, max_hp − hp) | — | ≤ 4 | clamp 后真实当量;面值 4 = 上界读法(HP 满拒绝率——B4 预警②观测修正) | -| **defense_up_basic** | safe_cell | buff → defense_up | E_inst = 0.50 × D_ref;E_life = ×duration 2 | **6.0** | **12.0** | **最低档安全格 buff 当量 = 条款②锚对照实物**(tier_min_buff = 2 行——B4 F6 供给) | -| clear_knife | clear_default | damage_item | E = power ×(perfect 板 ? P_perfect ÷ 100 : 1) | — | 8(完美板 16——**真实双份**:两件实得,非账面乘数) | 条款④⑤载体(F5 消费) | -| attack_up(**死行**) | safe_cell(**未入池**——B4 F4 口径后果) | buff → hero_offense | E_inst = 0.50 × D_ref | (6.0) | (12.0) | **死行**:hero 伤害 = 道具恒定表值不吃修正 → 零消费点;换算式结构保留,复活走 B4 OQ1 连锁(锚参照回迁 + 全表重排) | -| weaken | flag_hit | debuff → enemy_output | E_inst = m_w/100 × D_ref | 修订后 65 → **7.8**(现值 −25 → 3.0,不过锚) | 7.8(dur=1) | 修订值域/默认见 F0 | -| ambush | mine_hit | 敌方增益(flat) | E = m_amb × k | k=1 → 3;满配 k=3 → 9 | 同左(dur=1 单结算自然边界) | 量纲已定稿(registry `ambush_unit_definition`) | - -**锚对照实物段(条款②用,B3 义务⑤)**:最低档安全格 buff = **defense_up_basic 行**(RewardTable tier=2,effect_id=defense_up)→ 每结算瞬时当量 **6.0 HP @ D_ref=12**;weaken 修订后每旗 **7.8 HP > 6.0**(严格大于 ✓,裕度 +30%)。第二腿(连锁放大边际基准,provisional 1:1):weaken 7.8 ≥ E_dig 7.2(零链板形 ✓,裕度 +8%)。**结构性边界注记**:第二腿在校准上探时的可满足上界 = m_w=100 ↔ 相对每结算百分点档 ≈ 1.96:1——连锁期望放大超过此比值的板形上,腿二不可满足为**结构性事实**(percent 瞬时档被 schema 域封顶),该情形的处置 = C3 板形参数(密度/连锁富集)与 m_w 联动约束,非数值修订可解——登记重跑义务(对账清单 #3/#8,连锁规模分布无既定供给方,见 #8 附注)。 - -**Example:** 一轮挖到 2 个安全格,均为 defense_up(L=2 同实例)→ E_inst = 2×50/100 × 12 = 12.0 HP/结算 × 2 结算 = 24.0 全寿命(名义值——饱和折减见 F4 敏感性)。同轮标中 1 旗 → weaken L=1 → 7.8 HP/结算。踩 1 雷(unit_count=1、attack 拍)→ 该结算敌方附加 +3 HP。 - -**边界注记**:归 B1——本表与单一线性换算的维护、D_ref 与 P_perfect 的 SettlementTable 承载;归 B4——行值/权重/tier/C 供给(F6);归 C3——全部 provisional 数值;归 B3——L×m 合成原样输出(本表输入侧)。 - -### F2 percent→乘数换算与合成地板(percent_to_multiplier——B3 义务③收口) - -``` -结算语义映射(SettlementTable 效果语义映射,effect_id 为键——B3 Rule 7 的 B1 侧成文): - attack_up → pool = hero_offense(MVP 无施加点 = 死行机制成因——B4 F4 口径后果;结构位保留) - defense_up → pool = hero_defense - weaken → pool = enemy_output - ambush → flat 附加(B2 F2 后置加法——不入乘区) - -敌→主单伤害实例(每结算、逐攻击行为): - P_pool = Σ(同池实例 L×m) (池内加算——B3 F2 加算语义的对侧承接) - P_pool ← clamp(P_pool, −100, +100) (合成地板:每池独立收口) - M_pool = 1 + P_pool ÷ 100 (换算方向:pp → 乘性因子;域 [0, 2]) - D' = floor( D_raw × M_hero_defense × M_enemy_output ) - (池间乘算;整数域 D' = D_raw × (100+P_h) × (100+P_e) ÷ 10000 向下取整——单一取整规则,结构性非 knob) - D_raw = query_attack(u, L, m_amb).total (B2 F2 分量合成 total;charge 拍 = 0; - 乘区作用于含伏击分量的全裸伤害——weaken 饱和轮伏击分量一并归零) -``` - -**三例逐一读法(B3 EC7 登记例的收口)**: - -| 例 | 合成值 | 池 clamp 后 | 乘数 | 读法 | -|---|---|---|---|---| -| weaken AP 界(L=8 × m_w,修订后 65) | −520% | −100 | **0** | 该结算全体存活敌输出归零;第 3–8 层边际瞬时当量 = 0(地板吸收)——明细行如实显示合成值与终值两端(P2) | -| weaken 表界(L=16 × m_w) | −1040% | −100 | **0** | 同上——地板规则不区分越域来源,越域深度仅入合成值显示与诊断计数 | -| defense_up 顶点(L=2 × −50) | −100% | −100(**恰在地板边界,未越域**) | **0** | 免伤轮(该结算 hero 承伤 = 0)——**合法设计顶点**,非 clamp 产物(B3 Tuning Knobs"连续两轮免伤读法"的对侧收口) | - -**免伤轮(×0)合法性结论**:**合法且为设计态**。乘数域 [0, 2] 的自然边界——hero 侧 defense_up 满层(连续两结算免伤)与 enemy 侧 weaken 饱和(单结算零输出)同为设计内结果;强度评估(免伤窗口是否过强)归 C3 对账联动(B3 Tuning Knobs 已登记禁独立调参),不属地板规则异常。D' = 0 时 B1 **不调 apply_damage**(B2 API 对 n ≤ 0 拒绝——负值分支禁令的实现面),改产**零值伤害行**(免伤/零输出轮必须可见——P2)。 - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 裸伤害 | D_raw | int | [0, ∞) | B2 F2 total 分量(charge 拍恒 0) | -| 池合成值 | P_pool | int(pp) | 越域可达 ±1040(修订后);clamp 后 [−100, +100] | B3 原样输出 → B1 clamp 收口 | -| 池乘数 | M_pool | 有理数 | [0, 2] | 1 + P_pool/100 | -| 终值 | D' | int | [0, D_raw × 4](两池同 +100 的结构上界;MVP 不可达) | floor 取整 | - -**Output Range:** D' ∈ [0, ∞) 整数,零负值分支;MVP 实际域 [0, 20](B2 参考带)。**Example:** ambusher heavy(atk=4, mult=2)L=4 → D_raw = 20;weaken L=2(65)→ P = −130 → clamp −100 → M = 0 → **D' = 0**(零值伤害行,不调 apply_damage)。weaken L=1 → 20 × 0.35 = 7 → **D' = 7**。再叠 defense_up L=1 → 20 × 0.5 × 0.35 = 3.5 → floor **3**。**边界注记**:归 B3——L×m 原样输出不 clamp(B3 义务⑧/EC7 对侧);归 B1——池归属映射、clamp、乘区次序、取整方向;归 C3——池值强度评估。 - -### F3 伤害合成、clamp/溢杀与死亡判定(damage_resolution——B2 义务③成文) - -``` -⓪ 主→敌(战斗段段首,主角先手攻击——2026-09-11 用户裁决,基础攻击恒存在〔HeroTable.atk 域 [1,999]、0 加载拒绝〕): - 目标 = B2 default_target()(固定顺位最前存活敌——与道具段②同源) - D_hero_raw = HeroTable.atk ×(1 + attack_up 载荷) (attack_up = 唯一吃修正的攻击增益,percent 池加算——F2 语义; - 刀不吃修正的拍板不变——B4 F4) - D_hero = F2 换算(池加算 → clamp 地板 → floor);D_hero = 0 → 零值伤害行(同①零值口径) - D_hero > 0 → apply_damage(target, D_hero);hp 归 0 → Dead(受击即死——死亡即不动手) - 明细行 source_class = hero_attack(2026-09-11 新增来源值——接口漂移随批,target 字段照常) - 存活敌清空 → 敌方循环空转(零行动行),径入衰减段 -① 敌→主(战斗段,逐存活敌,行主序生成序;结算内调用序钉死 query_attack → apply_damage → advance——B2 义务①): - D_raw = query_attack(u, L, m_amb).total (L = 本结算伏击池读值——授予段后的当轮值;charge 拍 = 0) - D' = F2 换算(语义映射 → 池加算 → clamp 地板 → 乘区 → floor) - D' = 0 → 不调 apply_damage,产零值伤害行(分量二元组 + 终值 0) - D' > 0 → apply_damage(hero, D');hp' = max(hp − D', 0)(递减与 floor 0 由 B2 承载) - 溢杀部分(D' − 受击前 hp)丢弃——无存续、无转移、无负 hp 态 - hero hp' = 0 → 战斗段立即短路(剩余敌本结算不作用、不产行动明细行——Core Rule 10) -② 主→敌(道具段,窗口选定件——至多一件,2026-09-11 单件制): - D = power(恒定表值,不吃任何 percent 修正——已锁;零乘区) - 目标 = B2 default_target()(固定顺位最前存活敌;死亡后顺延) - apply_damage(u, power);hp 归 0 → Dead(受击即死——道具段与战斗段同款;指针冻结 = 抢杀窗口) - 溢杀丢弃、不转移下一敌(下一件道具才打下一个目标) - 施加时已无存活敌 → 照常消耗(Used 不可逆)+ "已消耗未生效"明细行(B4 E10 承接,守卫不对称——Core Rule 9) -③ 负值分支禁令:任何公式分支不得产生负伤害/负治疗/负当量——percent 池地板 [−100, +100](F2)、 - flat 值 ≥ 0、hp ∈ [0, max_hp]、治疗 clamp 上界 max_hp(B4 F4 对侧:hp' = min(hp + power, max_hp))、 - apply_damage 入参 n ≤ 0 = B2 API 拒绝 + 诊断——D'=0 腿由此改走零值行(①) -④ 死亡判定数值边界:Dead ⇔ hp = 0(无负 hp 中间态);时机 = 受击即时(敌)/ 战斗段短路(hero); - 判定段 = 防御性优先级 hero 先判(双死结构不可达的纵深防御——Core Rule 12:我方伤敌在道具段与 - 战斗段主角先手攻击、均先于敌方行动兑付;敌方伤我在主角攻击之后——敌行动时点若已敌全灭则先判胜) -``` - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 裸伤害 | D_raw | int | [0, ∞) | B2 F2 total;分量二元组 {baseline, attach} 进伤害行(P2 归因) | -| 乘区终值 | D' | int | [0, ∞) | F2 输出;floor 取整 | -| 目标 hp | hp | int | [0, max_hp] | B2 单位状态;递减与 floor 由 B2 承载 | -| 道具威力 | power | int | [1, 999] | RewardTable 授予时快照(恒定) | -| 溢杀量 | — | int | [0, D') | 丢弃(会计面:明细行 value = D',击杀标记布尔——不记溢出量) | - -**Output Range:** 双向伤害 D ∈ [0, ∞)、hp ∈ [0, max_hp];零负值、零转移、零存续。**Example:** grub(atk=4)L=2 → D_raw = 10;weaken L=1(65)→ floor(10 × 0.35) = **3**。defense_up L=1 同结算 → floor(10 × 0.5 × 0.35) = **1**。knife_adv(power=8)打 hp=6 的敌 → hp 归 0 → Dead、溢杀 2 丢弃、击杀标记进流水、下一件刀打顺位后继。**边界注记**:归 B2——递减/floor 0/Dead 翻转/指针冻结;归 B1——本式全序、调用序、零值行、溢杀丢弃语义、死亡判定时机(B2 义务③的对侧兑现)。 - -### F4 条款③挖掘风险不等式闭合(A3 F1 条款③——B1 单一闭合 owner;B2 义务④兑现) - -``` -配对口径(B1 闭合定义——B2 F4"等量换算与不等式闭合归 B1"的兑现): - 决策单位 = 单格挖掘;评估点 = 残余盲猜端最坏点(信息端平凡通过,一并登记) - 主式:P(安全) × V_safe > P(雷) × V_mine - - 适用域守卫(2026-09-10 评审补):(1 − ι) × |S| < 1(残余盲猜集为空)⇒ 主式不评估、 - 由信息端平凡腿接管——零赌博板形不产生破线误判(P(雷) 式在空池退化,禁代入) - - P(雷) = |M| ÷ (|M| + (1 − ι) × |S|) (残余盲猜端上界:全部雷对 (1−ι)|S| 个残余安全格的池) - P(安全) = 1 − P(雷) - V_safe = E_life(最低档安全格 buff) = (|m_d|/100) × D_ref × duration_d = D_ref - (defense_up 口径:0.5 × D_ref × 2 = D_ref——恒等式。**标签更正(2026-09-10 评审)**: - 这是"锚行(最低档 buff)满寿命当量",**高于跨行期望 E_dig = 7.2(刀/治疗占比 65%), - 不是期望值的保守下界**——按期望口径读数为敏感性腿,见验算表注) - V_mine = k_max × m_amb = unit_count × m_amb (单雷边际敌方增益当量上界:1 雷 = 1 层伏击; - 默认行值 1×3 = 3;cap 溢出使第 cap+1 颗雷边际当量 = 0 → 灾难轮不等式自收紧) - - 信息端检查(平凡腿):P(安全) = 1(免赌集内)→ V_safe > 0 恒成立——"推理有回报"的登记面 -``` - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 实际雷数 | \|M\| | int | [1, W×H−9] | A1 产物指标/行参数推导 | -| 安全格数 | \|S\| | int | ≥ min_safe_count | 同上 | -| 可推理率 | ι | float | [0.85, 1] | **actuals p10(A1 F4 报告 C)**——未交付前以行 target 代 = **判式面的保守代理**(target ≥ 实际 p10 → P(雷) 偏高 → 主式更难过;对总暴露无效——低 ι 的真实代价不经本式入账,报告 C 交付按总暴露核对消费,非仅判式重跑),重跑义务(对账清单 #6) | -| 防御行值/时长 | m_d / duration_d | int / int | −50 / 2(provisional) | StatusEffectTable defense_up 行 | -| 参考敞口 | D_ref | int | [1, 999] | provisional 12 → V_safe = 12 | -| 伏击量纲/单位数 | m_amb / unit_count | int | 3(provisional)/ [1,3] | B2 行值 | - -**首版验算(A1 参考行参数代理;全部 provisional,actuals p10 交付后强制重跑)**: - -| 板形 | ι(target 代 p10) | P(雷) | 左臂 = P(安全)×12 | 右臂 = P(雷)×3 | 裕度 | 判定 | -|---|---|---|---|---|---|---| -| L1(10×10 d0.10,\|M\|=9,\|S\|=91) | 0.95 | 9/13.55 ≈ 0.664 | 4.03 | 1.99 | **≈2.0×** | ✓ | -| L2(12×12 d0.12,\|M\|=16,\|S\|=128) | 0.92 | 16/26.24 ≈ 0.610 | 4.68 | 1.83 | **≈2.6×** | ✓ | -| 满配语境(unit_count=3,V_mine=9,L1 板) | 0.95 | 0.664 | 4.03 | 5.98 | <1 | **✗ 破线** | - -- **双口径读数登记(2026-09-10 评审——防虚高裕度误用)**:上表左臂按锚行当量 V_safe=12(A3 条款③"最低档 buff 当量下界"的合同读法);**按跨行期望口径(左臂 = P(安全)×E_dig,E_dig = 7.2)复算:L1 裕度 ≈1.2×、L2 ≈1.5×**——二元结论不变(unit_count=1 过 / =3 破),但 C3 不得以 2.0×/2.6× 锚行读数作为 unit_count=2 放行依据;实现率折减(预警②④,0.6 provisional)下裕度进一步贴地。 - -**结论**:① 默认行值(unit_count=1)下两参考行**通过**(锚行口径 2.0–2.6× / 期望口径 1.2–1.5×——二元结论一致);信息端平凡通过(推理严格占优、盲挖不自杀——P1 经济侧验收形态成立)。② **满配语境(unit_count=3)最坏盲点破线**——登记为 C3 调参约束(B2 Tuning Knobs"cap × atk 禁独立调参"的扩展:unit_count > 1 的行须降密度或降 m_amb,联动条款⑤弃图压力——A3 条款⑤注记警示的 P1 失败模式;F5 侧多敌腿同批登记)。③ 敏感性:B4 预警④ buff 饱和的结构性零兑付使 V_safe 名义值高估——按 0.6 折减(provisional)复算 L1:左 2.42 vs 右 1.99 → 裕度 1.2×(仍过、变薄)——折减系数与饱和率随 playtest 重校。④ **破线参数区两轴登记(2026-09-10 评审补)**:unit_count 轴(②)与**板形密度 × 可推理率轴**(例:8×8 d0.5、ι=0.85 → P(雷) = 28/33.4 ≈ 0.838,左 1.95 < 右 2.51 破线)——C3 约束清单按两轴登记,密度调参入重跑义务(缺口预检 9 扩表义务)。 - -**与 clause3_supply 2.3× 预检的对齐说明**:registry 预检的 2.3× 系"pp 代理左臂(0.36×50)× cap 右臂(0.64×12)"的巧合近似——量纲混用(pp vs HP 经 1:1 百分点代理桥接)且右臂取结算聚合上界(cap×m_amb=12)与单格决策单位错配(多计 cap 倍)。本闭合改**统一 HP 当量 + 边际配对** → 严格裕度 ≈2.0×/2.6×——方向不变(同向通过),registry `clause3_supply.direction_precheck` 退役为历史记录、回执登记重算值(对账清单 #3)。 - -### F5 条款⑤清图 vs 弃图支配性闭合(A3 F1 条款⑤——B1 单一闭合 owner;2026-09-10 评审修订:计价模型改挖穿残余池口径,旧模型读数作废重推) - -> **模型修订缘由(评审阻塞项)**:旧模型 X_res/Δr 按每挖一格独立赌一次 P(雷) 计价——**漏计全池挖掘量**。清图必须挖穿残余盲猜区:随着安全格被挖走,池内雷占比持续上升,挖穿全部残余安全格的期望踩雷 ≈ |M|×n_s/(n_s+1)(均匀交错模型),远高于旧登记值(L1 旧 3.02 颗 vs 修后 7.38 颗)。旧模型系统性偏向"推到底",且该偏差是**模型漏项**(actuals 校准无法吸收)——旧登记读数(+19.7/+27.0 等)作废,verdict 翻转见下。 - -**术语白话(用语纪律)**:**挖穿计价** = 把残余盲猜区全部安全格挖完时平均会踩到多少雷,按"雷与安全格在池中均匀随机交错"计算——好比从一副混洗的牌里抽完所有安全牌,中途翻到雷牌的期望张数由牌组构成决定,不是每抽一张都按初始比例独立重赌。 - -``` -主判式(决策点 = "确定格挖完";策略对 = 推到底清图 vs 停手攒 RAP 刷新): - Δ_clear = [R_res + C_eff] − [X_res + Δr × s_ref] ≥ 0 - - n_s = (1 − ι) × |S| (残余盲猜安全格数——评估点同 F4; - 适用域守卫:n_s < 1(残余集为空)⇒ 主判式不评估、信息端平凡腿接管) - E[踩雷] = |M| × n_s ÷ (n_s + 1) (挖穿残余池期望踩雷——均匀交错模型; - n_s 增大时趋近 |M|:高盲板清图必然踩到几乎全部残余雷) - R_res = n_s × E_dig (残余安全格奖励期望当量) - C_eff = C × (perfect ? P_perfect ÷ 100 : 1) (C = 清图奖励当量 = power 恒等〔clear_knife = 8〕; - perfect 谓词 = 板级零误标 ∧ ≥1 标中——Core Rule 13;×2 = 真实双份交付〔Core Rule 13#2〕) - X_res = E[踩雷] × V_mine (挖穿全池雷险期望当量——V_mine 同 F4) - Δr = ⌈(n_s + E[踩雷]) ÷ AP_r⌉ (轮数差 = 残余区期望总挖掘次数上取整——安全格 + 踩雷格 - 均耗 AP;雾态增量叠算见注) - s_ref = D_ref (结算强度参考 = 当量参考敞口——同一 D_ref,单一换算) - E_dig = 0.40×E[刀] + 0.25×E[治疗] + 0.35×E_life(defense_up) - = 0.40×5 + 0.25×4 + 0.35×12 = 7.2 HP (默认根权重加权;治疗按面值 = 上界读法—— - 实现率折减入敏感性腿,同 F4③) - -**显式假设登记(2026-09-10 评审)**:停手侧的 RAP 机会收益按 **零** 计价(RAP 边际效用不入判式—— -图源充裕时 RAP 边际低,零价假设对"推到底"偏利一分;本假设下 verdict 已为负,若 C3 为 RAP -计价则结论只会更负——模型边界成文,非遗漏)。 - -保守地板式(A3 F1 条款⑤原文形式的可判定化——残余奖励不计入的下界要求): - C_eff ≥ X_res + Δr × s_ref -``` - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 残余盲猜安全格 | n_s | float | [0, \|S\|] | (1−ι)×\|S\|;**域守卫:n_s < 1(残余集为空)⇒ 主判式不评估、信息端平凡腿接管**(零赌博板形不误判) | -| 挖穿期望踩雷 | E[踩雷] | float | [0, \|M\|] | 均匀交错模型 \|M\|×n_s/(n_s+1) | -| 清图奖励当量 | C | int | ≥ 1(A3 条款④) | B4 供给(clear_knife power=8,provisional) | -| 完美乘数 | P_perfect | percent | **{100, 200}** | SettlementTable 配置值;provisional 200(真实双份交付——Core Rule 13#2;换算入账恒 ÷100) | -| 单格奖励期望 | E_dig | float | (0, ∞) | 默认根加权推导;实现率折减敏感性同 F4③ | -| 轮行动点 | AP_r | int | [1, 32] | A3 ActionEconomyTable(默认 8) | -| 雾负担比 | fog_burden_ratio | float | [0, 1] | A1 产物指标(付费格分母口径)——雾态 Δr 修正输入 | - -**四态验算(面值口径 E_dig=7.2;含多敌腿——2026-09-10 模型修订后重推,全部 provisional)**: - -| 板形 | n_s | E[踩雷] | X_res | Δr(代价) | R_res | Δ_clear(C=8 / 完美 16) | 判定 | -|---|---|---|---|---|---|---|---| -| L1 无雾态(ι=0.95,\|M\|=9,\|S\|=91) | 4.55 | 7.38 | 22.1 | 2(24) | 32.8 | **−5.3 / +2.7** | ✗ / ✓ | -| L2 雾态(ι=0.92,\|M\|=16,\|S\|=128) | 10.24 | 14.58 | 43.8 | 4(48) | 73.7 | **−10.1 / −2.1** | ✗ / ✗ | -| L1 × 满配语境(unit_count=3,V_mine=9) | 4.55 | 7.38 | 66.4 | 2(24) | 32.8 | **−49.6 / −41.6** | ✗ / ✗ | -| L2 × 满配语境 | 10.24 | 14.58 | 131.2 | 4(48) | 73.7 | **−97.5 / −89.5** | ✗ / ✗ | - -实现率折减口径(E_dig′ = 4.32 provisional——B4 预警②④联动):L1 = −18.5 / −10.5;L2 = −39.5 / −31.5——同向更差。 - -- **雾态增量(fog_burden_ratio 口径)**:雾格 = 雾元知识可推理安全格(P(安全)=1)→ 属确定格、两策略同挖、**不进残余集**(口径不变);雾的条款⑤效应 = 链不可达雾格的全价 AP 抬高轮数——Δr 增量 = \|U\| × dig_ap_cost ÷ AP_r(A1 例板 U=4 → 0.5 轮;修后模型复算:(24.82 + 4) ÷ 8 = 3.60 → 上取整仍 4——同轮吸收,本表读数不变);雾池档位加成对冲入 R_res 侧(E_fog 读数见护栏 A)。actuals fog_burden_ratio p50/p90 交付后重跑(对账清单 #6)。 -- **verdict(2026-09-10 模型修订——自旧模型"两态通过"翻转)**:**条款⑤当前未闭合**。挖穿计价下主判式两态为负(L1 仅完美双份翻正 +2.7——完美高光与清图支配性互 feed 的设计意图保留,但非完美态仍负 = 被支配),实现率折减与多敌语境更差。结构性解读:残余盲猜区越大(n_s ↑),清图的全池雷险越逼近"踩到全部残余雷"——"是否承担盲猜风险是策略点"(game-concept 设计本意)被本判式定量证实:**"推到底"的支配性只在残余集小时自然成立**。判据函数的角色 = **C3/B4 调参约束生成器**(非一次性通过标记);AC-40 断言"输出与登记约束包一致"。 -- **C3/B4 约束包(取代旧"保守地板缺口如实登记非阻塞"——该登记方向倒置:主判式 ✓ 恰是乐观侧)**: - ① **C 量级上调整向**:保守地板需求 L1 ≥ 46.1 / L2 ≥ 91.8(现值 C=8/完美 16——缺口 −38.1/−75.8);C 量级归 B4/C3,任何上调与护栏 B 口径联动复核(见护栏 B 双读数)。 - ② **或裁"清图非严格支配"为设计态**(C3 裁决,①②二选一):与 A4 定价硬约束②(清图锚随雾负担上浮——B4 已登记 MVP 结构性不可闭合)同向;如裁设计态,A3 条款⑤注记的 P1 对冲弱化须同步声明,B4 预警⑤(弃图率雾板分层观测)加权监控。 - ③ **多敌联动**:满配语境深度为负(−49.6/−97.5)与 F4③ 破线同向——unit_count > 1 行的放行判据 = **条款③⑤在全部登记行组合下同时成立**(C3 调参约束双条款并案)。 - -**两条方向性护栏(2026-09-10 模型修订后复核)**: - -- **护栏 A(雾板净当量优势带上界——B4 pricing_constraints③ 的 B1 判据;与残余池模型无关,读数不变)**:每链不可达雾格净优势 = (E_fog − E_dig) − s_ref ÷ AP_r = (11.1 − 7.2) − 1.5 = **+2.4 ∈ (0, 3]** ✓(下界 > 0 = 雾非纯税——A4 约束①方向;上界 = s_ref/4 provisional——雾优势不得压倒主线推进。突破条件:E_fog > 11.7 → C3 雾池联动禁区,禁独立调参)。 -- **护栏 B(防钓鱼——退化板刷清图奖励;2026-09-10 输入登记更正 + 双读数)**:上界判据 = ⌈(\|S\|_min − \|R₀\|_max) ÷ AP_r⌉ × s_ref ÷ 2 ≈ ⌈(50−20)/8⌉ × 12 ÷ 2 = **24**。**输入登记更正(评审绑定项)**:① \|S\|_min = min_safe_count 是 A1 行级 knob(C3 可调——调参时本护栏按当期行集重算,禁写死 50);② \|R₀\|_max = 20 系 A1 参考带经验值、**无登记供给方**(A1 自家 12×12 例板 R₀ = 21 已越 20)→ **登记 A1 产出义务:R₀ 规模分布上界(F4 报告 C 扩列,缺口预检 9 扩表)**;③ s_ref = D_ref = 12 作每轮时间税比真实敌方 DPS 期望(grub 4 / ambusher 均值 ≈4)**松 2.5–3 倍**——偏松方向 = 反钓鱼线上界放松。**双读数登记**:D_ref 口径上界 24 → C_eff = 16 ≤ 24 ✓;DPS 期望严格读数上界 ≈8 → C_eff = 16 越。**两读数的裁决归 C3**(与约束包①联动:C 上调时防钓鱼口径同步收紧复核);结构承载 = A1 min_safe_count + 布雷数下限 + A2 R₀≠S 三闸(B1 侧判据为对账复核,非运行期校验)不变。 - -**P_perfect 默认值建议与相容性(六条,2026-09-10 修订)**:**建议 ×2**(SettlementTable.p_perfect = 200 percent,provisional,调参所有权 C3;**运行时载体域 {100, 200}**——Core Rule 13#2 真实双份交付)。相容性六条:① 单一线性换算不破坏——乘子作用于 C 当量换算**之后**、**换算 ÷100 已成文**(F1 对照表行内显式列),非新增分源换算率(A3 条款①合规);② 与条款⑤同向且是**现参数下唯一使 L1 翻正的杠杆**(+8.0)——完美高光与清图支配性互 feed;但非完美态仍负 → **C 量级上调约束不因 P_perfect 消解**;③ 触发谓词 = 板级 flag 记录(零误标 ∧ ≥1 标中),**与踩雷正交**(盲挖踩雷不破坏 perfect,标错旗才破坏——标错以"标旗未中"零值行留痕,Core Rule 5.2);④ RAP 刷新路径零清图奖励 → 无 perfect farming 环(双份兑付不改此性质——刷新图无兑付点);⑤ 与 F0 weaken 修订同向(标中旗价值 ↑ → perfect 可达性 ↑——高光 #2/#3 互 feed);⑥ 上界受护栏 B 约束(16 ≤ 24 D_ref 口径 ✓;DPS 严格读数越线的裁决联动 C3——完美加成不得触碰钓鱼线)。 - -### 显式排除声明(R4 式) - -| 对象 | 归属 | 依据 | -|---|---|---| -| P_perfect 乘数值(×2 provisional——真实双份交付载体,运行时域 {100,200})与其调参 | **C3** | B1 Core Rule 13(机制本体归 B1,数值归 C3) | -| D_ref、E_dig、裕度目标带等全部本节 provisional 数值 | **C3**(调参)+ B1(对账重跑义务的执行方) | 各式 Variables | -| m_w 修订终值 | **B4/B1 锚 owner 共裁**(值域与默认建议由本节 F0 给出),调参所有权 C3 | B3 Rule 10 / A3 条款② | -| 敌我表值曲线(atk/hp/cap/unit_count/pattern) | **C3**(B2 行值供给) | B2 Tuning Knobs | -| 奖励行值/权重/tier/C 量级与差异化分支 | **B4/C3** | B4 F6 / A3 条款④ | -| 雷密度/可推理率/雾负担 actuals 分布 | **A1**(F4 报告 C 生产者) | A1 登记口径 | -| 清图总预算"够不够"的判、战斗长度/轮数曲线、遭遇构成 | **A1/A3 契约、C1/C3** | A1 F3 排除声明 | -| RAP 经济(刷新价、转存) | **A3** | A3 Rule 11 | -| 结算明细的呈现(高光行/零值行/聚合计数的可见形态) | **D1/B5** | B1 Core Rule 14 | -| **B1 只拥有**:统一当量换算规则(F1)、乘区/地板/取整语义(F2)、clamp/溢杀/死亡判定数值边界(F3)、条款③⑤不等式的闭合判据与配对口径(F4/F5)、明细行协议的数值字段 | **B1** | A3 F1 五条款 + B2 义务③④ + B3 义务③⑤ | - -### 对账登记义务清单(本节落定后的回写义务) - -1. **registry `status_effect.anchor_warning` 裁决回执**:归一口径 = 每结算瞬时当量(总暴露分支关闭——schema 域禁止 + 重定参照路径不采纳);m_w 修订值域 [60, 85]/默认 65;"7 层触地板"预读更正(地板 = 乘数零点 −100 pp,交叉层数 = ⌈100/m_w⌉ = 2);defense_up 参照保持。 -2. **registry `status_effect.mvp_content.weaken` + B3 GDD 行表/Tuning Knobs**:magnitude −25 → 值域 [60, 85]/默认 −65(接口漂移回写);B3 AC-14 腿 3 非平凡性复查回执(16×65 = 1040 越域 ✓);B3 OQ1/OQ6 关闭回执。 -3. **registry `clause3_supply.direction_precheck` 闭合回执**:统一当量重算值(**双口径登记 2026-09-10 评审更正**:锚行口径 ≈2.0×/2.6×、跨行期望口径 ≈1.2×/1.5×——二元结论一致;边际配对),pp 代理退役为历史记录;满配语境(unit_count=3)最坏盲点破线 → C3 调参约束登记(unit_count 轴 + 密度×可推理率轴——F4 结论④)。 -4. **registry 新条目 `clause5_dominance`(或并入 clause3_supply)**:F5 主判式(**2026-09-10 模型修订:挖穿残余池计价——旧模型读数作废**)+ **未闭合登记(两态为负、含多敌腿与实现率折减口径)与 C3/B4 约束包**(C 量级上调 or "接受清图非严格支配"设计态,二选一归 C3 裁;护栏 B s_ref 双读数联动)+ 两护栏结论 + actuals 重跑义务。 -5. **registry `reward_table`/`reward_config` 注记**:C_eff 口径(P_perfect 入账规则——**÷100 成文 + 真实双份交付、载体域 {100,200}**;当量 = power 恒等);attack_up 死行注记的换算侧确认(对照表死行条目)。 -6. **registry `board_gen_table.inferability_vs_p_safe` 消费回执**:P(安全) 代理公式(残余盲猜端上界式)+ actuals p10 输入接线路径(A1 F4 报告 C)。 -7. **D2 SettlementTable schema(B1 回填 owner)+ registry 新条目 `settlement_table`**:字段 = equivalence_ref_damage(D_ref)/ p_perfect(**载体域 {100,200}**——2026-09-10 修订)/ 效果池映射(effect_id → {hero_offense, hero_defense, enemy_output, flat_attach})/ 取整方向(floor,结构性)/ **pool_clamp_lo + pool_clamp_hi 两字段(2026-09-10 统一"八字段"口径——原 registry/D2"七字段 pool_clamp_lo_hi"措辞作废:registry 同批改写,D2 GDD 行按收编先例以本条为准)** / source_label_map(**键集 = B3 source_class ∪ {道具/判定扩展, enemy_action, flag_miss, hero_attack}**——2026-09-10 修订;hero_attack 2026-09-11 用户裁决增补)。 -8. **systems-index 门禁记录**:B1 强制检查点三项(条款①②③⑤)裁决落定登记;A3 OQ1(对照表)、B4 OQ5(T_fog_min 推导式——对照表已落定,改推导式与否由 B4 裁)/OQ6(weaken 联动)状态回写。**附注(新缺口)**:第二腿校准所需的**连锁规模分布**(c̄)无既定供给方——登记 A1 报告 C 扩列或 A2 telemetry 的归属 OQ。 - -## Edge Cases - -- **If 末图清图即胜利(cleared 与 battle_over 同结算)**:授予段先兑付清图奖励(含完美排雷判定)→ 窗口当轮即可选用清图奖励件(窗口锚点收益面)→ 道具段照常 → 战斗段无存活敌 = 空转(无行动行)→ 衰减段照常执行(B3 义务⑥恰一次)→ 判定段判胜 → battle_over 清理序列;未选用件随 `clear_inventory` 消亡 + 反馈行(B4 E15 对侧承接)。 -- **If 战斗段 hero hp=0**:立即短路——剩余敌单位本结算不作用、不产生任何行动明细行,径入判定段判负(用户拍板:死尸挨打行是归因噪音);短路后衰减段照常执行(结算完整性优先于战斗中断)。 -- **If 判定时 hero 与最后敌同时 hp=0**(结构上不可达——我方伤敌在道具段与战斗段主角先手攻击、均先于敌方行动兑付;敌方伤我在主角攻击之后,敌行动时点若已敌全灭则先判胜;推理随 2026-09-11 主角先手攻击更新):防御性规则 = **hero 先判**,判负(纵深防御,Core Rule 12)。 -- **If 减伤/削弱合成后 D'=0**(免伤轮 / weaken 饱和轮):**不调 `apply_damage`**(B2 API 对 n≤0 拒绝——负值分支禁令的实现面),改产零值伤害行(分量二元组 + 终值 0)——免伤与零输出必须可见(P2)。 -- **If 伤害超过目标剩余 hp(溢杀)**:溢出部分丢弃——无存续、无转移、无负 hp 态;明细行 value = D'、击杀标记为布尔(不记溢出量——会计面最小完整)。 -- **If 敌为 charge 拍而本轮踩雷**:伏击授予照常执行(授予段先于战斗段)、`query_attack` 返回零作用 → **本结算伏击池全部蒸发**(dur=1 轮末衰减清零——B2 EC8"蓄力轮蒸发"读怪奖励的对侧:明细 = 授予行 + 蓄力行,玩家可对照"这轮踩的雷白喂了");战斗段零伤害。 -- **If 全体存活敌同拍 charge**:战斗段 = N 行蓄力行、零 apply_damage、hero 承伤 0——合法状态非错误(B2 EC"全体蓄力"对侧)。 -- **If 伏击池 L=0 时敌攻击**:D_raw = 纯基线 atk(分量二元组 {atk, 0})——零伏击不是缺失分支,是 L=0 的自然读值。 -- **If 同窗多件治疗包顺序选用**:逐件动态重判——第 1 件推满后第 2 件被满血守卫拦截(不烧包 + "使用被拒"行);usable_now 预判在窗口数据组装时同步刷新(B4 义务④腿)。 -- **If 治疗包 power 超过当前缺血**:`hp' = min(hp + power, max_hp)` 部分回复、不拒绝(满血 = 零收益守卫、超量 = 部分收益——两分支语义互斥)。 -- **If 选定刀施加时已无存活敌**(前序刀全灭):**照常消耗**(Used 不可逆)+ 逐件"已消耗未生效"明细行(B4 E10 拍板承接——零效果判定读 B2 存活集,Core Rule 9);战斗段照常空转推进。 -- **If 窗口打开时库存为空**:跳过恒合法;呈现面 D1 可整体不弹窗(B4 E8 对侧);结算段序零停顿继续。 -- **If 挖掘期刷新 RAP 不足**:A3 `request_refresh` 返回 false、状态不变 → `refresh_board` 原样上抛拒绝(A3 EC13 对侧;刷新拒绝不是编排错误,是玩家决策的合法结果——D4 2026-09-12:本 EC 原"停手/耗尽轮 Waiting 期请求刷新"构造随刷新前移作废)。 -- **If 同轮多次刷新成功**(cap=2 内,A3 EC15 对侧——D4 2026-09-12 改写):每次成功独立走 `refresh_board` 编排(retire → generate → install → roll_board 恰一次/图)——挖掘期当场连刷合法;每次 generate 消费 board_gen 流新 scope、每次 roll_board 消费 reward_roll 流新 scope。第三次提交 → cap 拒绝。~~原"同一 Waiting 相位连环刷图"构造~~(作废)。 -- **If stopped/ap_exhausted 轮**:出口分发**恒 same_board**(D4 2026-09-12——刷新已前移挖掘期,本编排无刷新提交面)——回发 new_board = B1 违约(绕过 RAP"支出唯一"),fail-fast 上抛(A3 Rule 11 契约义务的 B1 侧)。 -- **If 换图生成产物带非法产物标记**(A1 EC5 零合法降级):编排不拒绝产物(玩家永不卡死),**上抛玩家侧呈现请求**(数据面 = 非法产物标记;提示/补偿/回退形态归 D1 裁决——登记 D1 义务);A2 `install_board` 若拒绝(不变式违例)= 程序级错误 → fail-fast 上抛(非玩家域)。 -- **If battle_over 清理序列中某调用被拒**(重复/错序——如 B3 域闭后再 end):debug 诊断 + 编排纪律修复;幂等守卫(各侧 false + 诊断)兜底,不中断清理序列的剩余步骤(清理必须完成——防半清理态跨战斗泄漏)。 -- **If 战斗中表热重载请求**(D2 `reload()`):`set_reload_gate(true)` 已置位 → D2 门拒绝返回 false(D2 EC8——"战斗中真的被置位"的 B1 侧落点;AC 节承载验收)。 -- **If 衰减段调用时容器已空**(全 dur=1 上轮清空):`decay_round()` 返回 0——合法结果、零明细行或聚合零计数(B3 EC13 对侧)。 -- **If 清图槽身份为 buff 且授予时已满层**:零兑付 + "奖励未生效"行(合法例外——B4 E11 拍板对侧);**完美板高光行降级不发**(Core Rule 13#2 降级规则——庆祝不打在空兑现上;完美谓词仍按板级事实成立,仅无兑付面,当量入账 = 实际兑付 0);若仅**第二份**兑付被拒(首份已落地)→ 高光行照发、value = 实际有效兑付(首份)当量 + "奖励未生效"行一条(Core Rule 13#2)。 -- **If 完美排雷谓词在 RAP 刷新图上**:刷新图不产生清图奖励(无兑付点)→ P_perfect 不触发;**板级 flag 计数随每次 board install 重置**(完美判定域 = 本板自 install 起的 flag_judged 全集——跨图不累积)。 -- **If 板内既有标中又有误标**:`hit=false ≥ 1` → 完美谓词不成立 → 正常兑付(无高光行)+ **本轮首个误标判定产"标旗未中"零值行(highlight=`perfect_broken`——"为什么没拿到完美"的归因锚,Core Rule 5.2;重复上报去重)**——零误标是全有或全无谓词,无部分完美档(两档扩展被否,用户拍板单档)。 -- **If 多敌(unit_count=3)同结算攻击**:行主序逐敌执行循环、共享同一 L(池共享不消耗);任一敌作用后 hero 死亡 → 短路中止剩余敌(顺序 = 生成序,先位敌先作用——顺位即威胁序的可观测面)。 -- **If 道具段击杀造成死亡即不动手**:该敌 Dead 后,战斗段 `query_alive` 已不含它——不出现行动行(指针冻结的明细面 = 缺席);抢杀窗口的兑付 = 击杀标记 + "重击未落地"归玩家从行序列推断(H3 感知数据前置——击杀结果进流水)。 -- **If 零威胁组合**(行 atk=0 ∧ cap=0;原"零伤害死局组合"随 2026-09-11 用户裁决收窄——hero atk=0 已被 HeroTable 域下界结构杜绝,战斗恒可定局):战斗可胜但零风险——内容态配置错误,护栏 owner = 实现期 ADR/D2 跨字段校验(B2 OQ9 并案,内容禁区非死局);B1 侧观测锚 = 战斗轮数异常遥测(进 C3/OQ 清单)。 -- **If 结算开始时 hero hp=0**:结构不可达(hp=0 只产生于战斗段 → 短路直入判定段 → battle_over;窗口属于判定"继续"后的下一结算)——防御断言:窗口打开前置检查 hero 存活,违反 = debug 断言(编排违例显式暴露)。 - -## Dependencies - -**Upstream**: - -| 系统 | 性质 | 接口 | 状态 | -|---|---|---|---| -| D2 | hard | SettlementTable schema 承载 + ConfigDB 读取(B1 回填 owner)+ `set_reload_gate()` 调用面(D2 EC8 唯一调用方) | Approved ✓ | -| A3 | hard | F1 五条款下游契约(B1 = 条款①②③⑤闭合 owner)+ `refresh_board` 挖掘期刷新编排〔D4 2026-09-12,替代原代理调用〕 + `notify_settlement_done`/`notify_combat_end` 回发 + `last_round_end` 读取 | Approved ✓ | -| A2 | hard(订阅) | 三事件流(cell_revealed/flag_judged/round_end)+ `install_board`/`retire_board` 调用方 + Waiting 相位观测量(A2 唯一回边的订阅端——TD-SYSTEM-BOUNDARY 裁决) | Approved ✓ | -| B2 | hard | 单位接口全调用面(spawn/query_*/apply_damage/advance/default_target/ambush_grant_plan/despawn_all)+ B2 义务①–⑥ | Approved ✓ | -| B3 | hard | 状态容器五 API 全调用面 + B3 义务①–⑧ | Approved ✓ | -| B4 | hard | 奖励/库存十 API 全调用面 + B4 义务①–⑥ | Approved ✓ | -| A1 | 间接 hard 接线 | `generate(L, D)` 换图编排调用方 + actuals 分布 p10 对账输入(F4 报告 C)+ attempt 边界非 scope 事件 | Approved ✓ | -| A4 | 对账锚(零运行时接口) | 条款⑤三腿入账(雷险消解/信息双向/AP 腿)+ 两方向性护栏 + 雾格零特判(B1 无变异分支) | Approved ✓ | -| C1/C2 | **provisional** | encounter 上下文 (L, D, hero_hp) 供给(begin_battle 入参);跨战斗 HP 持久性;战斗触发 | **未设计**——MVP 冒烟直供 | - -**B1 是项目首个全部玩法上游均已 Approved 的系统**——无 provisional 上游假设(C1/C2 除外,其缺位由 begin_battle 入参封装隔离)。 - -**Downstream**: - -| 依赖方 | 性质 | 接口 | -|---|---|---| -| D1 | hard(数据供给,未设计——第 10 位) | 结算明细流水 = 统一数据源契约(Core Rule 14 行协议);承接呈现义务台账(A2×6 / B2×4 / B3×4 / B4×5 / **B1 新增 ×3:高光行强调呈现、完美排雷呈现、EC5 零合法板提示**——缺项即 blocking,随 D1 GDD 门禁评审核对) | -| B5 | soft(垂直切片) | 结算步骤流 = 战斗动画的回放脚本源;溢出行/origin_cell 玩家可读形态(B3×B5×2 数据源) | -| D4 | soft(Alpha) | 音频挂点 = 明细行类型流(B4 音频挂钩点事件源) | -| D5 | soft(Alpha) | 教学口径数据源(来源标注/RAP 清零/库存清空/满层溢出/蓄力拍贪雷——各上游教学条目经 B1 流水兑现) | -| C3 | soft(provisional) | 条款③⑤对账结果 = 调参约束输入(unit_count>1 破线约束 / 保守地板缺口 / 护栏 A/B 突破条件);P_perfect/D_ref 调参所有权 | - -**双向一致性核对**(systems-index 依赖分层表):B1 ← A3,B2,B3,B4,D2 ✅(第 3 Feature 层)· D1 ← A2,A3,B1 ✅ · B5 ← B1,D1 ✅ · D4 ← A2,B1 ✅ · D5 ← A2,A3,B1 ✅ · A2 事件面 referenced_by 含 B1 ✅(订阅边)。**注记一条**:C3 ← D2,B2 与"C3 是否消费 B1 输出"悬案(systems-index 2026-09-07 TD 门禁登记)——本 GDD 落定条款③⑤对账后,**C3 消费 B1 对账结论的事实依赖成立**,C3 GDD 定稿时须回写索引(对账输出 = 调参约束清单,非运行时接口)。 - -## Tuning Knobs - -### SettlementTable Schema 定稿(D2 回写义务——B1 回填 owner,单行全局,Rule 4 豁免:单行全局常量/结构表,HeroTable/ActionEconomyTable 先例) - -| 字段 | 类型/域 | 默认 | knob | 说明 | -|---|---|---|---|---| -| equivalence_ref_damage(D_ref) | int [1, 999] | 12 | ✓ | 当量参考敞口(F1);**变更触发全对照表 + 条款③⑤对账重跑**(联动义务,禁独立调参) | -| p_perfect | int **{100, 200}**(percent) | 200 | ✓ | 完美排雷清图奖励**第二份兑付触发**(Core Rule 13 / F5——100 = 仅高光无第二份、200 = 真实双份交付;非整数倍数乘数无运行时载体,域外加载致命);上界受护栏 B 约束(防钓鱼线双读数:D_ref 口径 24 / DPS 严格读数 ≈8——裁决归 C3) | -| segment_order | StringList | [grant, item_window, buff_debuff, item, combat, decay, verdict] | ✗ 结构冻结 | 段序骨架的零字面量载体(B4 拍板序);**加载期校验恒等于拍板段序,违例致命**(防实现乱序静默漂移) | -| source_label_map | Dictionary(source_class → 文案键) | 封闭枚举全覆盖 | ✗ 结构冻结 | source_class → D1 呈现文案映射键(P2 归因的呈现侧数据源);**键集 = B3 source_class ∪ {道具/判定扩展, enemy_action, flag_miss}**(2026-09-10 修订;新增键 = 接口漂移) | -| effect_pool_map | Dictionary(effect_id → pool) | {attack_up→hero_offense, defense_up→hero_defense, weaken→enemy_output, ambush→flat_attach} | ✗ 结构冻结 | 效果语义映射(F2——B3 Rule 7 的 B1 侧载体);**新 effect_id 上线须随批登记映射,悬空 effect_id = 加载期致命**(引用型字段,B3/B4 dangling_ref_policy 同款) | -| pool_clamp_lo / pool_clamp_hi | int(pp) | −100 / +100 | ✗ 结构冻结 | percent 池地板域(F2);乘数域随之 [0, 2]。**字段口径注(2026-09-10 统一):本表为两字段、全表共八字段——registry/D2"七字段 pool_clamp_lo_hi"旧措辞已作废(registry 同批改写、D2 GDD 行按收编先例以本条为准)** | -| round_direction | enum {floor} | floor | ✗ 结构冻结 | 乘区取整方向(F2——单一取整规则,结构性非 knob) | - -**校验**:effect_id 主键唯一(ConfigDB 既有);effect_pool_map 键 ⊆ StatusEffectTable 活行集(跨表悬空致命——B4→B3 首引激活先例同款);segment_order 违例致命;**p_perfect ∈ {100, 200}**(运行时载体域——非整数倍数乘数无运行时载体,域外加载致命;100 = 完美必须 ≥ 不加倍的机制语义下界)。 - -### Knob 表 - -| Knob | 默认 | 调过高 | 调过低 | -|---|---|---|---| -| equivalence_ref_damage | 12 | 全当量表膨胀 → 条款③左臂虚高、锚裕度失真(重跑强制) | 当量坍缩 → weaken 锚第二腿破线(m_w≥60 下界的前提失效) | -| p_perfect | 200 | 载体域封顶 200({100,200}——C 量级上调走 B4 clear 池 knob,须与护栏 B 口径联动复核:防钓鱼线 D_ref 读数 24 / DPS 严格读数 ≈8) | =100 → 第二份兑付不触发(完美仅剩高光行、无实质增量——情绪奖励感最弱档,机制空转) | - -- **非 knob(结构冻结,修订走 GDD 流程非调参)**:段序骨架、乘区结构(两池乘算)、floor 取整、池 clamp 域、明细行协议、零随机、结算触发 = Waiting 相位、调用序(query_attack→apply_damage→advance)、衰减恒执行。 -- **Knob 交互**:D_ref × m_w(锚两腿共用 D_ref——B4/B1 共裁 m_w 时须同步核对 D_ref,禁独立调参);p_perfect × C(clear 池当量)——护栏 B 联动;D_ref × 条款⑤ s_ref(同值引用——改 D_ref 即改结算强度参考,两条款重跑)。 -- **调参所有权**:全部 knob provisional 归 C3;**每次调参须重跑 F1 对照表 + 条款②③⑤预检并同步 registry**(接口漂移义务——B2/B4 同款条款);actuals p10 交付后的强制重跑义务见 Formulas 对账清单 #6。 - -## Visual/Audio Requirements - -B1 无自有渲染面(Core 层 headless 债,Core Rule 1)——视觉义务是**数据面供给规格**,呈现归 D1/B5: - -1. **结算明细屏 = MVP 战斗本体**(双层口径的呈现面):数据源 = Core Rule 14 流水行协议(行类型封闭枚举 + 公共字段);屏级布局/节奏/滚动形态归 D1/B5。**每行 `value` 数值在暗色底上须高对比**(视觉锚 1——明细屏是 MVP 数字密度最高的屏)。 -2. **行类型区分 = 形状+色相双通道**(视觉锚 2):伤害/治疗/增益/削弱/未生效类行的视觉编码不得只靠色相——未生效类行(奖励未生效/已消耗未生效/使用被拒/溢出未生效)必须携带形状冗余(icon/划线等),防色弱玩家把"没生效"误读为普通行。 -3. **高光行数据面(B1 新增 ×3 的 D1 义务输入)**:perfect_sweep 高光行、标中旗 `highlight` 标记、清图奖励行 H2 强调标记——B1 只锁行字段(highlight 可空枚举),强调形态(放大/描边/音画同步)归 D1;**未生效类行按聚合计数呈现**(D1 义务③——数据可聚合字段已入协议,防逐行惩罚轰炸)。**伤害行/道具行的 `target` 字段与效果行的 `effect_id` 是 D1 多敌归因呈现与 B3 D1×4②③ icon/极性映射的直接数据源**(Core Rule 14 桥字段——display_name 本地化不劣化映射)。 -4. **零值伤害行可见性**:免伤轮/零输出轮的零值行是 P2 诚实语义的呈现对象——不得被"零值不显示"优化吞掉(归因链断点)。 -5. **音频挂钩点**(D4,Alpha):挂点事件 = 明细行类型流——道具行(入库)/效果行/伤害行/判定行/高光行/负反馈聚合(未生效类行数 >0 时单次结算至多一次——B4 音频注记对侧,防逐行惩罚轰炸);挂点事件源归 B1 流水,B4 零音频依赖的对侧同款。 - -> 注:`art-director` 未经咨询——Lean 模式,生产前请人工复核本节与 art-bible(§1–4 须在 D1 GDD 前创建——既有排期义务)的一致性;本节行类型双通道编码是 art-bible 的输入之一。 - -## UI Requirements - -B1 不拥有 UI。两项界面贡献的数据契约: - -- **道具使用窗口**(D1 域屏):窗口载荷 = B4 `query_inventory` 投影 + **B1 侧组装的 `usable_now` 预判字段**(满血治疗包禁选——Core Rule 7);选择序收集/跳过/窗口时机指示/触发政策归 D1(B4 D1 义务②同款);窗口选择序列 = 回放输入事件(Core Rule 4);窗口期输入与棋盘不竞争(单意图帧先例)。 -- **结算明细屏**(D1 域屏):数据源 = 流水行协议(Core Rule 14);终局判定行 = 胜负画面的数据锚;呈现形态归 D1。 - -**📌 UX Flag — B1 战斗结算规则**:本系统有 UI 贡献(结算明细屏 + 道具使用窗口)。在 Phase 4(Pre-Production)运行 `/ux-design` 为结算屏与窗口创建 UX 规格**先于**编写 epics——引用 `design/ux/[screen].md` 而非本 GDD。已登记 systems-index 备忘(Phase 5d)。 - -## Acceptance Criteria - -> **qa-lead 代理起草(lean 门禁,2026-09-10,受 B1 主会话委托;四项口径经用户拍板全盘采纳——AC-36 生效前提口径 / A2 三层声明 / A1 桩 / 对账断言形态)**:覆盖 16/16 Core Rules(每条至少一个 GIVEN-WHEN-THEN)、F1–F5 全公式(可判定判据;F0 的 AC 形态 = registry 对账)、**23 条上游义务逐一落位**(B3×8 / B2×6 / A2×3 / B4×6,引用带清单限定词)、强制检查点 5 项(reload gate 战斗中置位 / 结算可回放 D2 AC-15 兑现 / new_board 违约 fail-fast / roll_board 恰一次 / 衰减恰一次)、SettlementTable 加载校验三类别、EC 节全部条目(呈现侧与 playtest 侧以 out-of-scope 声明承载,覆盖口径见覆盖矩阵)。F4/F5 条款闭合的 AC 形态 = **对账断言**(以登记常数跑闭合判据函数、断言结论与登记一致——非 playtest);条款③⑤为 B1 强制检查点,本节即其执行器。 -> -> **测试载体与集成口径(Core-Battle 全集成——项目首个全部玩法上游 Approved 的系统)**:冒烟载体 = `godot --headless --script`(承 D2 冒烟框架;脚本 extends SceneTree 以获得 quit(code)、ConfigDB/RngService autoload 由脚本显式实例化)。各侧真假声明:**真 A3**(相位机全 API)+ **真 B2/B3/B4 容器实例**(class_name 直引实例化,B2/B3/B4 AC 前言先例;B2 多敌腿复用 `enemy_multi_unit` 夹具根)+ **真 A2 规则引擎**(程序构造板走 A2 既有板登记规格——b_spawn/b_flag/b_batch/b_chain/b_fog/b_mine_walk,登记常数直接复用 A2 AC 前言板清单;挖掘/插拔/停手经 `settle_batch` 真驱动——冒烟扮演 D1 提交意图,A2 D1×6① 同构)。**A1 侧 = 程序构造产物桩**(间接接线、非战斗域 Core 集成对象——换图 generate 调用点以 A1 产物 schema 坐标级程序构造板按登记序列返回;桩每次调用经 `open_stream("board_gen")` 取号恰一次、与真 A1 取号契约同构,scope 轨迹断言因此真实;attempt 重试不重开 scope 的语义归真 A1——登记 deferral);A1 真生成器 × A2 × B1 全链路集成 = 端到端集成冒烟,与 A2 OQ 登记的 A1×A2 双包含端到端同槽(生效条件 = A1 实现落地)。**C1/C2 provisional**:`begin_battle(encounter)` 入参冒烟直供(encounter 坐标复用 B2 行集登记 (L_g,D_g)/(L_a,D_a);hero_hp 按腿直供 max_hp/低值/缺血压值)。**D1/B5 未设计**:B1 输出契约断言面 = **步骤流捕获列表**(A2 事件捕获断言面先例)+ 回发捕获(`notify_settlement_done`/`notify_combat_end` 调用捕获)+ `set_reload_gate` 调用捕获;窗口选择与刷新意图 = 冒烟扮演 D1 经 B1 提交面注入(D1×② 的对侧)。**A2 OQ2 依赖声明**:A2 事件外发载体(signal vs 回调)归实现期 ADR——凡依赖经真 A2 事件流驱动 B1 的 THEN 子集,ADR 未落地前为纸面契约(A2 AC 前言收窄口径同款);备选登记 = **A2 半真(事件注入面直喂 B1 facts 缓冲 + A3 真)**,冒烟专设注入通道、不属产品 API,断言口径不变(B2/B3/B4"直接驱动最小 API 面→就绪后改走真实调用方"先例);本前言显式选择**优先真 A2 全集成**、半真仅为 ADR 前过渡载体。 -> -> **被测面与观测量**:B1 编排入口(provisional,实现期 ADR 定名——Overview 注记的 ADR 域):`begin_battle(encounter)` · 窗口选择提交面(扮演 D1)· 刷新意图提交面(扮演 D1——`refresh_board` 挖掘期刷新编排,D4 2026-09-12)· 结算事务(内部触发,冒烟经 A2/A3 驱动到达)。**步骤流 = 主断言面**:明细行序列 + 窗口输入事件标记(段界锚);**段序断言 = 步骤流行序**(授予类行 < 窗口标记 < 效果行 < 道具行 < 伤害/蓄力行 < 衰减行 < 判定行——全序断言)。上游只读观测量:A3 `ap/rap/phase/last_round_end` · B2 `query_alive/query_beat/query_attack/default_target` · B3 `query_active`(六归因字段+快照载荷)· B4 `query_identity/query_inventory` · RngService 公开只读 scope 计数器(board_gen/reward_roll 双流——roll_board/generate 恰一次的观测面,B4 AC-1 同款)· 诊断收集器。多步 GIVEN 均给出构造序列(板 + 意图序 + σ 起点)。 -> -> **期望值推导纪律**:全部 knob 按当前 ConfigDB 表读值推导、不写死——记号:`D_ref`(SettlementTable.equivalence_ref_damage)/ `P_pf`(p_perfect)/ `m_w`(weaken.magnitude)/ `m_d/D_a/M_a`(defense_up)/ `m_amb`(ambush.magnitude)/ `c_r`(所在行 cap)/ `a_g/h_g`〔grub〕/ `a_e/h_e/m_e/u_c_f`〔ambusher〕/ `M_h`(HeroTable.max_hp)、`A_h`(HeroTable.atk——主角先手攻击基值,2026-09-11 增补)/ `p_i`(RewardTable.power 读值)/ `AP_r`。**结构定值断言合法**:segment_order = 拍板序(结构冻结——加载校验恒等断言)、pool_clamp_lo/hi = −100/+100、round_direction = floor、effect_pool_map 四键(attack_up→hero_offense / defense_up→hero_defense / weaken→enemy_output / ambush→flat_attach)、行类型封闭枚举 13 类、公共字段全集 + 行类型特有字段分层(Core Rule 14——target/effect_id/pool_value)、source_label_map 封闭(键集含 enemy_action/flag_miss/hero_attack——2026-09-11 增补)。**非平凡性前提与 SKIP 纪律**(B3 AC-14 腿 3 先例):依赖修订后基线的腿(如 `m_w ≤ −51` 使 2 层即越域)前提不满足时输出显式 SKIP 标记防 CI 静默、不假失败;**两条"生效前提"AC**(F1 锚腿 / registry 对账)在接口漂移回写完成前失败 = 裁决未兑现的正确信号(B2 AC-16"不写软口径"先例)。**登记常数协议**(A1 黄金向量 / A2 板登记 / B4 Ψ·Φ 同源):① A2 板登记常数与 B2 行集登记坐标**直接复用不重制**(引用登记);② B1 新增 **σ 登记轨迹**(身份依赖腿——如"双治疗包同窗""刀全灭敌""清图槽身份"所需身份组合,master=42、经 `derive_at` 测试通道推导、预推进协议按 B4 时序口径)+ 登记构造序列(板 × 意图序 × 期望行数);**登记后安排第二人独立推导复核(A2 OQ3 / B4 同款义务)**;失效处置 = 先复核登记、登记无误即实现缺陷。每用例先 `reset_diagnostics()`(D2 冒烟协议,全局声明)。 -> -> **夹具策略**:① **默认根 `b1_default`** = D2 全表清单 + **SettlementTable 默认行**(D_ref=12 / P_pf=200 / segment_order=拍板序 / source_label_map 封闭全覆盖 / effect_pool_map 四键 / clamp −100/+100 / floor——B1 回填 owner 的首次表内容落地);② **致命根 ×3**(独立进程,manifest 见下):`b1_segorder_bad`(segment_order 置换两段——违例致命)、`b1_poolmap_dangling`(effect_pool_map 追加 ghost_effect 键——键 ⊆ StatusEffectTable 活行集跨表悬空致命)、`b1_pperfect_oob`(p_perfect=99——载体域 {100,200} 越下界致命);③ **SettlementTable schema 程序构造**(class_name 直引)承载域校验全谱(AC-4);④ 板 = A2 既有板规格复用、多敌根 = B2 `enemy_multi_unit` 复用、清图槽身份腿按 σ 登记轨迹(或 b4_golden 根复用);行为夹具根经 `--data-root=` 注入(仅 debug、不入 `data/tables/`——D2 夹具纪律);各 AC 声明其板/根,用例间无顺序依赖。 -> -> **致命类收窄豁免与 runner manifest**:B1 冒烟设**恰三行致命清单**(均为 SettlementTable 特有校验类别,独立 headless 进程、游戏通道,D2 AC-2b 协议同型)——runner manifest 退出码行:`segorder_violation→≠0` · `poolmap_dangling→≠0` · `pperfect_oob→≠0`。**负空间声明(B2 实例不变式先例)**:编排自守 fail-fast 断言——new_board 违约守卫、窗口打开前置 hero 存活断言、一事件双转化守卫、同一时刻至多一个结算事务在飞——**违规路径不可由公开 API 构造**(编排 API 单入口、单驱动方),不经冒烟断言、不入 manifest;其行为级证据 = 正腿断言(AC-30 腿1 未刷新恒 same_board / AC-15 腿1 窗口组装含存活前置观测)+ AC-43 静态扫描。其余致命类别(通用枚举域/域校验/R1 类)由 D2 AC-2 同类别 loader 级夹具承载(表无关,豁免声明收窄保留——B2/B3/B4 同款)。 -> -> **out-of-scope 覆盖声明(deferral 以对侧登记为生效条件)**:**D1 呈现全域**——结算明细屏布局/节奏/滚动、高光行强调形态(放大/描边/音画同步)、零值行可见性、未生效行聚合呈现、窗口呈现(形态/时机指示/usable_now 禁选态/触发政策/空库存不弹窗)、清空反馈可见性、H2 强调、EC5 零合法板提示补偿形态(deferral 生效条件 = Dependencies 节 D1 义务台账 A2×6/B2×4/B3×4/B4×5/B1×3 登记,缺项即 blocking);**B5**——步骤流作回放脚本源的消费、origin_cell/溢出行可读形态;**D4/D5**——音频挂点、教学口径(数据源 = 本节流水行,呈现/触发归对侧);**C3 数值**——全部 provisional(P_pf/D_ref/裕度带/E_dig 折减),**每次调参须重跑 AC-35/36/37/39/40 对账族**(D_ref × m_w 禁独立调参——Tuning Knobs 联动义务);**A1 actuals p10 重跑**——F4/F5 的 ι 以行 target 代 p10 为乐观代理,A1 F4 报告 C 交付后强制重跑(Formulas 对账清单 #6,登记于缺口预检 4);**条款⑤护栏 playtest 观测面**——预警⑤弃图率雾板分层/⑥速杀退化/零伤害死局战斗轮数遥测(playtest 域非冒烟;B1 侧仅供遥测锚);**m_w 修订终值**——B4/B1 锚 owner 共裁 + C3 调参(F0 推荐值域已裁,AC 以表读值记号承载);**attack_up 复活连锁**(B4 OQ1——hero_offense 池消费点上线时本节死行断言连锁回写);**标错惩罚 flag_miss 源路径**(A2 OQ1——惩罚上线时本节补 flag_judged{hit=false} → 伏击 +1 源路径 AC,A2 GDD 预告接口漂移);**C1/C2**——encounter 真实供给、跨战斗 HP 持久性、战斗触发(节点移动);**深度高光形态**(即时 HUD 反馈动画——D1/垂直切片);**事件外发载体形态**(实现期 ADR——B1 OQ 登记);**attempt 重试细节**(真 A1 域——B1 只保证 attempt 非 scope 事件,AC-33 以桩承载取号契约)。 - -**加载与 SettlementTable 校验(Core Rule 16)** - -- **AC-1(SettlementTable 加载基线与 schema 定稿——Core Rule 16;根 = b1_default)** GIVEN `b1_default` 经 `--data-root` 注入干净加载,WHEN 冒烟脚本读 SettlementTable,THEN **八字段**在位且:`segment_order` 读值 ≡ 拍板段序 `[grant, item_window, buff_debuff, item, combat, decay, verdict]`(**结构定值恒等断言——加载期校验的行为面**);`effect_pool_map` 四键逐一 = 定稿映射;`pool_clamp_lo/hi` = −100/+100、`round_direction` = "floor"(结构定值);`D_ref` 仅作域断言 [1,999]、`P_pf` 域断言 = {100,200}(knob 纪律不写死——载体域校验见 AC-4);`source_label_map` 键集 ⊇ B3 source_class ∪ {道具/判定扩展, enemy_action, flag_miss, hero_attack}(封闭枚举——Core Rule 14 来源标注的表侧承载;hero_attack = 2026-09-11 用户裁决增补)。WHEN 同根跑 B4/B3/B2 各自默认根加载行为(AC 跨引),THEN 零跨表冲突诊断(单根多系统共载——全集成冒烟的加载前提)。〔覆盖 Core Rule 16;Tuning Knobs schema 定稿〕 -- **AC-2(segment_order 违例致命;根 = `b1_segorder_bad`,manifest `segorder_violation`)** GIVEN 段序置换根(如 item_window 与 combat 互换),WHEN 冒烟 runner 以独立 headless 进程游戏通道加载(collect_only=false),THEN 进程非 0 退出且错误清单含 segment_order 类别——"防实现乱序静默漂移"的进程级落点。〔覆盖 Core Rule 16/Core Rule 4 结构冻结〕 -- **AC-3(effect_pool_map 悬空 effect_id 致命;根 = `b1_poolmap_dangling`,manifest `poolmap_dangling`)** GIVEN 映射含 `ghost_effect` 键根,WHEN 独立进程游戏通道加载,THEN 非 0 退出、错误含跨表悬空类别(B4→B3 首引激活先例同款——引用型字段 dangling_ref_policy)。〔覆盖 Core Rule 16;Tuning Knobs 校验行〕 -- **AC-4(p_perfect 域校验——程序构造 + 致命根双腿)** GIVEN SettlementTable schema 类直引实例,WHEN `validate()` 作用于 p_perfect ∈ {99, 150, 1000},THEN 各含域错误类别(**载体域 {100,200}**——150 等非整数倍数乘数无运行时载体,与 2026-09-10 修订同步);p_perfect = 100(仅高光)与 200(真实双份)零诊断。腿 2(loader 集成缝):`b1_pperfect_oob` 独立进程加载 → 非 0 退出(manifest `pperfect_oob`)。〔覆盖 Core Rule 16/Core Rule 13;Tuning Knobs 校验行〕 - -**生命周期编排与触发(编排专章 / Core Rule 1/2)** - -- **AC-5(战斗开始序列全序 + roll_board 恰一次 + gate 置位观测;板 = b_spawn)** GIVEN 全新 B1(Uninit)、真 A3(Idle)、真 B2/B3/B4 全新实例、A1 桩登记首板 = b_spawn、master=42。WHEN `begin_battle(encounter)`,THEN 步骤流/调用捕获流水**全序恰一次**:`set_reload_gate(true)` → B3 `notify_battle_start`(true)→ B2 `spawn`(true)→ A2 `install_board`(accepted)+ B4 `roll_board`(true)→ A3 `notify_round_start`(true、phase=Active);**reward_roll scope 计数器 = +1、board_gen scope = +1(各恰一 scope——B4 义务⑥/roll_board 恰一次的编排半,观测面 = D2 AC-4 公开计数器)**;`query_alive(enemy)` = u_c 个行值快照单位(B2 AC-1 跨引);A2 事件捕获含初始展开批(真 A2 install 行为);B3 `query_active` 双侧空。〔覆盖编排专章战斗开始序列;Core Rule 16①;B4 义务⑥〕 -- **AC-6(结算触发 = Waiting 相位编排点、不依赖事件到达序——A2 义务①)** 腿 1(触发只读观测量):GIVEN 构造至 A3 Waiting 且 `last_round_end` 可用(stopped 轮——经真 A2 `settle_batch([stop])` 到达),WHEN 结算事务受理,THEN 触发判定只读 A3 相位与 `last_round_end`(事件捕获序 = A2 管线序 flag_judged→round_end,结果正常)。腿 2(到达序置换判别):同一 stopped 轮捕获 {flag_judged 批, round_end} 两组消息,**装载层置换两组到达先后**分别驱动(冒烟捕获-重放,不增设 B1 注入 API),THEN 两遍结算步骤流**逐行相同**(到达先后不承载语义——事件序契约仅为数据完整性服务的可判定形式)。〔覆盖 Core Rule 2;A2×3 义务①;registry a2_event_surface.event_order〕 -- **AC-7(段序骨架全序断言——Core Rule 4 / B4 义务①)** GIVEN b_flag 满构造结算(登记构造序列:挖掘 ≥1 奖励格 + 插 (1,4) hit 旗 + 停手收轮;σ 登记使奖励格含道具类身份),WHEN 结算事务解析,THEN 步骤流行序全序断言:**授予段行**(入库道具行 / weaken 兑付归属效果段、溢出/未生效行若有)< **窗口标记**(open——段界锚)< 窗口标记(close/skip)< **效果行**(weaken/伏击授予的结算面读值行)< **道具行**(生效/使用被拒/已消耗未生效)< **伤害行/蓄力行** < **衰减行** < **判定行**(继续/胜负);任一段缺行时以段界锚与行类型域断言序(空段合法——结构冻结承载"恒全序执行");窗口标记**恒存在**(零选择 = skip 标记恒登记——回放输入完整性)。反向腿:segment_order 表值经 AC-2 恒等于拍板序——**段序为结构冻结、实现读表驱动非硬编码**(行序与表值一致性 = 本 AC 与 AC-2 合成判定)。〔覆盖 Core Rule 4;B4 义务①;Core Rule 14〕 -- **AC-8(继续出口 same_board 续轮)** GIVEN b_batch 部分挖掘后 stopped 收轮、结算完成(判定行 = 继续),WHEN 出口分发,THEN 回发捕获恰一条 `notify_settlement_done(same_board)` → A3 `notify_round_start`(true、phase=Active、**ap=AP_r 硬重置、rap 保留**——A3 AC-1b 跨引);A2 板状态延续(旗集/已开集不变——A2 AC-13 跨引);board_gen/reward_roll scope 计数器**零变化**(same_board 零生成零 roll)。〔覆盖编排专章继续腿;A3 Rule 5〕 - -**轮 facts、授予段与高光标记(Core Rule 3/5/13#3)** - -- **AC-9(facts 批处理 + 三恰一次转化——B3 义务② / B2 义务② / B4 义务②)** GIVEN b_flag 登记构造轮(挖掘 n 格含 m_0 雷格 + 插 f 旗含 h_0 hit),WHEN 轮末结算,THEN **每格受理恰一次**:B4 `grant` 调用捕获恰 n_safe 次(n_safe = 挖掘 safe 格数,登记推导)、B2 `ambush_grant_plan` 恰 1 次、B3 `apply_effect(weaken)` 恰 h_0 次、`apply_effect(ambush)` 恰 granted 次——**B1 轮 facts 缓冲保证一事件只进一次转化**(B3 不去重〔B3 义务②的对侧承载〕、B4 幂等仅为兜底:诊断收集器零"重复受理"诊断——幂等兜底未被触发的行为面);处理序 = 事件规范序(B3 义务①"确定次序"的 B1 落地:授予调用捕获序 ≡ A2 cell_revealed/flag_judged 行主序)。WHEN 同轮捕获事件批重复投递(装载层故障注入),THEN 步骤流与容器终态仍 = 单次投递结果(缓冲去重的判别腿)。〔覆盖 Core Rule 3/5;B3 义务①② / B2 义务② / B4 义务②〕 -- **AC-10(授予分流与归因 + initial 不入奖励库——A2 义务②;2026-09-11 增即时类腿)** 腿 1(分流):GIVEN σ 登记使挖掘格身份含 buff 类与道具类各 ≥1,WHEN 授予段解析,THEN buff 类格 → B3 `apply_effect(effect_id, source={safe_cell, origin_cell, round_index})`(B3 `query_active` 六归因字段逐一 = 调用实参——B3 AC-3 跨引);道具类格 → B4 `stock(item)`(B4 `query_inventory` 逐件来源 {cell, round} = 事件格与当轮——B4 AC-13 跨引);**即时类格(instant_aoe/instant_heal)→ 当场兑付:instant_aoe = 逐存活敌 `apply_damage(u, power)` + 单条伤害行(target = all_enemies + count 字段)、instant_heal = `b2.heal` clamp + 治疗行(满血 → "奖励未生效"行零兑付)——零 stock、零窗口(B4 Rule 1/3 两类交付轴的 B1 侧)**;**B4 只定"给哪行"、层数语义归 B3 合并**(同轮双 buff 格 → 单实例 L=2——B3 AC-9 同构)。腿 2(**initial 通道不入库**):GIVEN b_spawn install 后首轮(初始展开 35 格已发生——channel=initial、reward_eligible=false),WHEN 首结算,THEN **grant/stock/apply_effect 调用捕获全零**(R₀ 不入奖励库——A3 EC5 委派闭环的 B1 半边);`channel` 字段零特判(B1 判定只读 reward_eligible——eligibility 封装的行为面:同板 chain/dig 格正常入库形成对照)。〔覆盖 Core Rule 5.1;A2×3 义务②〕 -- **AC-11(满层零兑付 + "奖励未生效"行 + 聚合计数——B4 义务②后半)** GIVEN σ 登记轨迹使同轮/邻轮授予 defense_up 达 M_a 层满(B3 AC-11 构造的全集成版),WHEN 第 M_a+1 层授予受理(B3 apply 返回 false),THEN 步骤流产**"奖励未生效"行**:零折算(无补偿数值)、携带**可聚合计数/批次字段**(同结算多件可聚合——Core Rule 14 协议字段)、source 归因完整;B3 容器逐字不变(拒绝原子——B3 AC-11 跨引);**连锁批量授予溢出 = 显式接受**:b_chain 13 格批量授予腿(σ 登记)中溢出件逐件入行、零转换补偿(B4 E3 对侧)。〔覆盖 Core Rule 5.1;B4 义务②;B3 义务⑧邻接〕 -- **AC-12(标中旗兑付去重 + 高光标记——A2 义务③ / Core Rule 13#3)** 腿 1(兑付与高光):GIVEN b_flag 插 (1,4)(hit)收轮,WHEN 结算,THEN `apply_effect(weaken, source={flag_hit, (1,4), round_index})` 恰一次 + 效果行携带 **highlight 标记**(数据面——创意风险 #3 落地,呈现归 D1)+ 资格消费入集合(B1 自持)。腿 2(**诚实重复上报去重**):续轮(same_board)旗仍在,WHEN 再停手(A2 再次上报 {(1,4), true}——A2 AC-12 分支 3 同构造),THEN **零 weaken 兑付**(apply_effect(weaken) 捕获零新增、B3 weaken 实例数/L 不变)、**零明细行**(重复兑付从未发生)+ debug 诊断可选;资格集合不变。腿 3(拔旗重插不恢复):拔 (1,4) 重插 → 再收轮 → 仍零兑付(A3 Rule 8/OQ5——资格以雷格实例为键)。腿 4(换图重置):AC-28 换图后新板同坐标旗靶 → 兑付恢复(新实例资格自然重置)。腿 5(**误标零值行 + 每实例去重**——2026-09-10 修订):GIVEN 插 (0,3) miss 旗收轮,WHEN 结算,THEN **"标旗未中"零值行恰 1 条**(source=flag_miss、value=0、highlight=`perfect_broken`、可聚合计数字段——"为什么没拿到完美"的归因锚);续轮再停手(A2 重报同批 hit=false)→ **零新增行**(每雷格实例一次去重——防逐轮惩罚轰炸);换图后新板 miss 旗 → 新实例重新产行。〔覆盖 Core Rule 5.2;A2×3 义务③;Core Rule 13#2/#3〕 -- **AC-13(cleared 轮清图奖励——B4 义务③)** 腿 1(主路径):GIVEN b_spawn 挖尽未开 8 格触发 cleared(A2 AC-1② 同构造)、σ 登记清图身份,WHEN 结算授予段,THEN B4 `grant_clear()` **恰一次**(同批次重调幂等兜底——诊断零新增)、兑付分流同 AC-10(source=clear_reward)、**当轮窗口即可选用**(窗口清单含该件——Core Rule 7 窗口锚点收益面);完美板腿见 AC-35 腿1(× P_pf)。腿 2(清图槽 buff 满层 + **高光降级**——2026-09-10 修订):σ 登记清图身份 = defense_up 且已满层,THEN 零兑付 + "奖励未生效"行(合法例外——B4 E11 对侧);**完美板高光行捕获零次**(Core Rule 13#2 降级规则——首份即零兑付不发高光;完美谓词仍成立,对账入账 = 实际兑付 0);对照腿:仅第二份兑付被拒(首份落地)→ 高光行在案且 value = 首份实际当量 + "奖励未生效"行一条。腿 3(换图刷新图零 grant_clear):AC-28 场景中 refresh 图结算授予段 grant_clear 捕获零次(A3 Rule 11——roll 照常、兑付不调)。〔覆盖 Core Rule 5.3;B4 义务③;B3 OQ4 关闭条件〕 - -**伏击转化(Core Rule 6)** - -- **AC-14(雷→伏击恰一次 + cap 预截流 + 溢出行协议——B2 义务②⑥ / B3 义务⑧)** GIVEN b_flag 登记构造轮:单轮挖掘雷格 mines_r = 6(登记走位序列——walk 免费经已开格、6×dig ≤ AP_r;cap = c_r = 4 表读值),WHEN 结算授予段,THEN B2 `ambush_grant_plan(6, c_r)` 恰 1 次 → 返回 {granted=4, overflow=2}(守恒——B2 AC-8 跨引);**前 granted 颗雷(事件规范序)逐颗 `apply_effect(ambush, source={mine_hit, origin_cell, round_index})`**(捕获恰 4 次、B3 伏击池 L=4);**overflow 2 颗逐颗产"溢出未生效"行**(含来源 origin_cell + 可聚合计数字段——B2 义务⑥/B3 义务⑧协议统一);战斗段各敌伤害行 attach 分量 = 4×m_amb(池读值即时性);轮末衰减行 k 含伏击实例(dur=1 蒸发——B3 AC-8 跨引)。每雷恰一次:重复投递判别同 AC-9 腿 2。〔覆盖 Core Rule 6;B2 义务②⑥;B3 义务⑧〕 - -**道具使用窗口(Core Rule 7)** - -- **AC-15(窗口组装 + usable_now 预判 + 选择序 + 空库存跳过——B4 义务④前半)** 腿 1(组装与预判):GIVEN 战斗中 hero 满血(begin_battle 直供 M_h)、σ 登记库存含治疗包,WHEN 结算到达窗口段,THEN 窗口清单 = `query_inventory` 投影 + B1 组装 `usable_now` 字段:**治疗包 usable_now=false(满血禁选——B1 读 B2 hero hp 判定,B4 零跨系统读纪律不破的行为面:B4 诊断零"血量查询"类新增)**;伤害道具恒 true(结构推论——敌死亡只发生于道具段、窗口打开时存活敌 ≥1:本腿断言其投影真值)。腿 2(守卫双查):扮演 D1 强制提交满血治疗包选择,THEN "使用被拒"行 + 包 InStock 不变(B4 `use` 未被调——库存投影不变)。腿 3(**单件制——2026-09-11 拍板改写**,原"选择序 = 使用序"多件腿作废):提交多件 [刀₂, 刀₁] → **仅首件受理**(编排违例诊断 + 刀₂生效、刀₁不消耗——"窗口至多选用一件"的编排守卫面);单件提交 [刀₁],THEN 道具段生效;零选择提交(skip),THEN 窗口标记 close/skip、段序零停顿、库存不变。腿 4(空库存):无库存轮窗口标记照常(skip)、呈现面政策归 D1(数据面 = 窗口清单空)。〔覆盖 Core Rule 7;B4 义务④前半;D1 义务②对侧〕 -- **AC-16(同窗多件提交的编排守卫——B4 义务④腿;2026-09-11 单件制改写)** GIVEN begin_battle hero_hp = M_h − 2(登记直供偏移)、σ 登记库存含治疗包 ×2(power = p_i),WHEN 窗口提交 [包₁, 包₂],THEN **仅包₁ 受理生效**(治疗行 hp' = min(M_h−2+p_i, M_h)——**部分回复钳满**)、包₂ 零调用(InStock 不变)+ 编排违例诊断("窗口至多选用一件"——2026-09-11 单件制,原"逐件动态重判"腿随多件制作废;满血使用期守卫保留为纵深防御——跨结算场景仍可达:本结算被拒后下一结算窗口再判)。〔覆盖 Core Rule 7/EC;B4 义务④〕 - -**增益/减益段(Core Rule 8)** - -- **AC-17(语义映射 + 按授予流水逐条来源还原——B3 义务③⑦)** 腿 1(per-grant 展开):GIVEN 同轮两次 weaken 授予(互异 origin_cell 旗靶),WHEN 增益/减益段解析,THEN **效果行恰 2 条**(按 `apply_effect` 调用流水展开、非按容器单实例——合并实例只持首授归因,per-layer 来源还原的数据源 = B1 授予流水:每行 origin_cell 逐一 = 授予 origin_cell、每行携带 `effect_id` = weaken、**value = 该次授予贡献值(L×m_w 投影)**、**pool_value = 池合成值**(两行 value 各 −65 贡献、pool_value = −130——合成值不入 value 字段,防"两行各 −130%"叠加误读;Core Rule 14 字段分层));B3 `query_active` 读值(插入序+快照载荷)为行值来源(B3 AC-14 跨引)。腿 2(池归属映射):defense_up 行与 weaken 行同轮 → 效果行 pool 字段经 effect_pool_map 自 effect_id 派生 = hero_defense / enemy_output(映射消费的观测面)。腿 3(side-wide):`enemy_multi_unit` 根同轮 weaken L=1 → 战斗段**全体存活敌**伤害行均含减伤合成且 target 字段逐一可归(多敌兼容读法——B3 单敌假设回验后的 B1 侧);target_ref 单体寻址扩展位上线时随批补归集语义(接口漂移注记,非本节断言)。〔覆盖 Core Rule 8;B3 义务③⑤⑦〕 - -**道具段(Core Rule 9)** - -- **AC-18(刀恒定表值 + default_target 顺延 + 击杀进流水——B2 义务⑤ / B4 义务④)** 腿 1(恒定表值判别负断言):GIVEN 同结算 weaken L=1 存活(敌方减益在位——若刀伤吃 percent 修正即在此暴露)、σ 登记库存含刀,WHEN 道具段,THEN 伤害行 value = p_i **恒定**、零乘区(分量字段无池修正项——"不吃任何 percent 修正"的行级判别)。腿 2(目标 + 击杀标记 + target 字段——**2026-09-11 单件制改写**:原"同结算 σ 登记多件刀逐件顺延"随多件制作废——单件制下刀的目标顺延跨结算呈现):GIVEN `enemy_multi_unit` 根(ambusher 行 unit_count=3、余字段默认表值),σ 登记刀 ×3(每结算至多一件、跨结算序列),WHEN 连续结算各用一件,THEN 每条伤害行 target = `default_target()` 返回(顺位最前存活敌)、击杀标记布尔出现于目标 hp ≤ p_i 的件、[0] 死后下一结算顺延 [1]、再 [2] 同构,**击杀标记共 3 个**;被杀敌 Dead 即刻可观测(`query_beat` 冻结——**指针冻结进流水**,H3 抢杀窗口感知数据前置;死亡即不动手:后续结算战斗段 `query_alive` 不含它、零行动行)。腿 3(溢杀丢弃):hp=2 残敌 + p_i=4 刀 → 死、行 value = p_i、击杀标记布尔、无溢出量字段、零转移(下一件打 `default_target` 后继)。〔覆盖 Core Rule 9;B2 义务⑤;B4 义务④〕 -- **AC-19(满血守卫 + 守卫所有权不对称——B4 义务④)** 腿 1(表局部守卫):GIVEN hero 满血 + 库存治疗包(AC-15 腿 2 同构造),WHEN 提交选择,THEN "使用被拒"行、零 `use` 调用(**不烧包**)——满血守卫 = 表局部判定(max_hp 对比),**敌全灭构造下仍拦截**(对照腿:AC-20 场景敌已全灭 + 满血 + 提交治疗包 → 仍拒——守卫不读存活集的不对称可判定形式)。腿 2(clamp 归 B1):AC-16 已载部分回复钳满(hp' = min(hp+power, max_hp))。〔覆盖 Core Rule 9;B4 义务④;EC〕 -- **AC-20(零效果判定读存活集——B4 义务④ / B4 E10 承接;2026-09-11 单件制下改为负空间声明)** 原构造(同结算提交多件刀、末件零效果)随单件制作废——**结构不可达论证**:窗口打开时存活敌 ≥1(Core Rule 7 结构推论)∧ 单件恒打顺位最前存活敌 ⇒ 窗口提交的刀恒有目标,"已消耗未生效"行在单件制下不可达(零效果判定逻辑保留为防御分支——B1 读 B2 存活集;恢复多件制时本 AC 随批复活)。可达残余:多敌根下刀击杀标记断言由 AC-18 腿 2 承载。〔覆盖 Core Rule 9;B4 义务④;EC——负空间声明,B2 "违规路径不可由封闭 API 构造"先例同型〕 - -**战斗段(Core Rule 10)** - -- **AC-21(调用序钉死 + 每敌恰一次 advance + hero 不在推进域——B2 义务①)** 腿 1(grub 平凡环):GIVEN encounter=(L_g,D_g) 单 grub 结算,WHEN 战斗段解析,THEN 调用捕获序 = `query_attack` → `apply_damage` → `advance`(**每存活敌恰一次 advance**:捕获恰 1 次;伤害行 value = D′ 推导)+ 衰减行前完成。腿 2(ambusher 混合拍):encounter=(L_a,D_a) 连续结算 → beat 轨迹 = p_e 序(B2 AC-3 跨引)、每结算捕获 advance 恰 1。腿 3(**hero 不在推进域**):全结算 advance 捕获实参 ∈ 敌句柄集、零 hero 句柄(B2 侧对 hero 句柄拒绝为兜底——B2 AC 前言 API 口径跨引)。腿 4(行主序 + target 字段):`enemy_multi_unit` 根 → 行动/伤害行序 = 生成序且每行 target 字段可归至对应单位(顺位即威胁序的可观测面——Core Rule 14 目标字段)。〔覆盖 Core Rule 10;B2 义务①〕 -- **AC-22(F2/F3 行为级:分量行 / 减伤 / floor / 零值行 / 溢杀)** 腿 1(分量二元组):GIVEN b_mine_walk 单雷轮(L=1)+ grub attack,THEN 伤害行携带 {baseline=a_g, attach=m_amb, 终值} 且 **source_class = enemy_action、target = 受击单位句柄**(P2 归因敌侧兑付面——Core Rule 14 敌方行动来源与目标字段);L=0 轮(未踩雷)attach=0(自然读值非缺失分支)。腿 2(floor 取整):登记构造轮 L_amb=2 + weaken L=1(挖双雷 + 插一 hit 旗同轮——登记序列)→ D_raw = a_g+2×m_amb、D′ = floor(D_raw × (100+P_e)/100 × …) 按表读值推导(F3 Example:10→weaken→3 的记号化——非定值)。腿 3(**零值伤害行——不调 apply_damage**):GIVEN b_flag 双 hit 旗同轮(weaken L=2 → P_pool = 2×m_w;**非平凡前提 m_w ≤ −51**——F0 修订回写后恒满足,前提不满足时本腿 SKIP 标记),WHEN grub attack 拍结算,THEN 效果行显合成值 2×m_w 与终值两端、**伤害行 value=0、`apply_damage` 捕获零次、B2 hero hp 不变、诊断零新增**(负值分支禁令实现面——免伤/零输出必须可见);weaken dur=1 轮末蒸发(下轮恢复常态伤害——判别尾腿)。腿 4(defense_up 顶点恰在地板边界——判据函数腿):P_pool = 2×m_d = −100 恰边界未越域 → M=0 免伤轮合法设计顶点(B3 Tuning Knobs 对侧收口)——以 F2 判据函数对登记常数断言(行为级同路径由腿 3 承载,构造 σ 使双 defense_up 同格可达的成本显式豁免)。〔覆盖 Core Rule 10 / F2 / F3;B3 义务③收口;EC〕 -- **AC-23(charge 蓄力行 + 伏击蒸发——EC)** GIVEN (L_a,D_a) ambusher:结算 1 attack 后,结算 2 构造挖雷 ×1(L_amb=1),WHEN 战斗段(beat=p_e[1]=charge),THEN **蓄力行**(数字兑现面)+ `query_attack` 读值零作用 + **零伤害行**、hero hp 不变;授予段伏击授予行在案(先授予后蒸发的对照——玩家可对照"这轮雷白喂了");轮末衰减清池(下轮 attach=0)。腿 2(全体 charge):`enemy_multi_unit` 根同步轮转至 charge 拍结算 → 恰 u_c_f 条蓄力行、零 apply_damage、hero 承伤 0(合法状态非错误)。〔覆盖 Core Rule 10/EC;B2 EC8 对侧〕 -- **AC-24(hero 死亡短路 + 判定段 hero 先判——B2 义务③)** GIVEN `enemy_multi_unit` 根 + begin_battle hero_hp = 4(直供),WHEN 首结算战斗段(敌[0] attack 分量 ≥ 4),THEN 敌[0] 伤害行后 **hero hp=0 → 短路**:敌[1]/[2] **零行动行、零 advance 捕获**、径入衰减段(照常——结算完整性)→ 判定行 = 战斗失败(**hero 先判防御腿**——双死结构不可达:我方伤敌全在道具段先于战斗段,纵深防御不构造、判定行次序字段可读);battle_over 序列触发(AC-31)。〔覆盖 Core Rule 10/12;EC;B2 义务③〕 -- **AC-25(伏击池共享不消耗)** GIVEN `enemy_multi_unit` 根 + 登记轮 L_amb = 2(双雷),WHEN 战斗段逐敌解析,THEN 敌[0]/敌[1]/敌[2] 伤害行 attach 分量**均为 2×m_amb**(共享、非均分/消耗——每敌 `query_attack` 读同一 L);中途无池写捕获(B2 无池写 API——负空间跨引)。〔覆盖 Core Rule 10;B2 F2〕 - -**衰减段与判定段(Core Rule 11/12)** - -- **AC-26(衰减恰一次、恒执行含末轮——B3 义务④⑥)** 腿 1(每结算恰一):任一 AC 场景步骤流**衰减行恰 1 条/结算**(k 记入行值——B3 `decay_round` 返回值;调用捕获恰 1 次——double-decay 无守卫的对侧 = B1 编排纪律的行为面)。腿 2(**末轮恒执行**):末图清图胜利结算(AC-13 腿 1 场景 + 敌已全灭构造)→ 判定行 = 胜利**之前**衰减行在案(先兑付后衰减时序契约——"最后一轮 decay 判定"义务④的 B1 落点;battle_end 全清兜底使两序同终态、次序钉死为段序 = 行序可断言)。腿 3(空容器):全 dur=1 上轮清空后的结算 → 衰减行 k=0(B3 EC13 对侧——合法零行/聚合零计数)。〔覆盖 Core Rule 11;B3 义务④⑥〕 -- **AC-27(判定三出口)** 腿 1(胜利):敌全灭结算(AC-20 尾轮)→ 判定行 = 战斗胜利 → battle_over 序列(AC-31)。腿 2(失败):AC-24 已载。腿 3(继续):AC-8 已载。判定行公共字段 + 终局行在案(胜负画面数据锚)。〔覆盖 Core Rule 12〕 - -**出口分发、换图与战斗结束(编排专章)** - -- **AC-28(cleared 恒 new_board 换图编排全序——B4 义务⑥ + EC 非法产物腿)** GIVEN b_spawn cleared 判定、A1 桩登记板序列 [板₂](程序构造、坐标级登记),WHEN 出口分发,THEN 调用捕获**全序恰一次**:A2 `retire_board` → B4 `retire_mapping` → A1 `generate`(**board_gen scope +1——attempt 边界非 scope 事件:桩内重试零额外取号**)→ A2 `install_board` → B4 `roll_board`(**reward_roll scope +1——每图恰一次**)→ `notify_settlement_done(new_board)` → `notify_round_start`;新板资格格 roll 照常、grant_clear 零调用(AC-13 腿 3);完美计数随 install 重置(AC-35 腿 4 跨引)。腿 2(**非法产物上抛**):桩登记返回带非法产物标记板,WHEN install(accepted——编排不拒绝产物),THEN B1 **上抛玩家侧呈现请求**(回发捕获含呈现请求事件 + 数据面 = 非法标记;提示/补偿/回退形态归 D1——登记义务);A2 install 若拒绝(不变式违例)= fail-fast 上抛(A2 AC-1b/2 通道跨引,程序级非玩家域)。〔覆盖编排专章换图腿;B4 义务⑥;EC〕 -- **AC-29(挖掘期刷新编排 `refresh_board`——D4 2026-09-12 改写;A3 rap_rules)** 腿 1(当场换图):GIVEN Active 且 rap ≥ rap_refresh_cost,WHEN 扮演 D1 经 `refresh_board` 提交刷新,THEN A3 `request_refresh` → true、rap=0、**phase 不变(无结算段、无 round_end)** → 换图全序恰一次(A2 retire → A1 generate → A2 install → B4 roll_board;board_gen/reward_roll scope 各 +1——D2 快照切点观测面);同轮续挖可证新图。腿 2(cap 内连刷):同轮第二次提交 → 第二次完整编排;腿 3(cap 超限):第三次提交 → 拒绝(resource_face——`refresh_cap_per_round`=2)。腿 4(RAP 不足):rap < cost 提交 → false、状态不变(A3 EC13 对侧——非编排错误)。〔覆盖编排专章;A3 Rule 11/EC13/EC15;原 Waiting 期代理调用三腿随刷新前移作废〕 -- **AC-30(new_board 违约 fail-fast——强制检查点;D4 2026-09-12 改写)** 腿 1(**恒 same_board**):GIVEN stopped 轮与 ap_exhausted 轮(各构造),WHEN 出口分发,THEN 回发捕获 `notify_settlement_done(same_board)` 恰一条、**new_board 回发零次**、retire/generate/roll 捕获全零(刷新已前移挖掘期——本编排无刷新提交面,stopped/ap_exhausted 恒 same_board);**fail-fast 守卫半 = 自守 debug 断言**(内部违约路径不可由公开 API 构造——负空间声明,契约源 = registry `action_economy.rap_rules`,其存在性由 AC-43 扫描域 + 代码评审承载)。腿 2(反向闭合):cleared 轮 ⇒ new_board 恰一(AC-28 全序——两腿合成即契约全貌)。〔覆盖编排专章;A3 rap_rules;EC;强制检查点③〕 -- **AC-31(battle_over 清理全序恰一次 + 关卡末清库 + 拒绝不中断——B4 义务⑤;2026-09-11 关卡域改写)** 腿 1(battle_over 全序):GIVEN 判定行 = 胜/负任一,WHEN battle_over 序列,THEN 捕获**全序恰一次**:B4 `retire_mapping`(映射随战斗消亡——下一场战斗新板新批)→ B2 `despawn_all`(query 双侧空——B2 AC-6 跨引)→ B3 `notify_battle_end`(query 双侧空——B3 AC-2 跨引)→ A3 `notify_combat_end`(phase=Idle、**rap=0**——A3 AC-11 跨引)→ `set_reload_gate(false)`;**`clear_inventory` 不在 battle_over 序列中**(库存关卡域跨战斗延续——其缺席本身为断言腿:battle_over 后 query_inventory 逐字不变)。腿 2(关卡末清库):GIVEN 末层 victory 或 defeat,WHEN 编排方调 `level_clear()`,THEN `clear_inventory` 恰一次 + **返回清空前快照计数**("剩余道具 ×N 随关卡结束清空"反馈行——D1 义务⑤数据面;折算结构位归 C2);此后 stock/use → false + 诊断(B4 AC-3 分支 3 跨引)。腿 3(拒绝不中断):清理序列中注入重复调用(如 B3 域闭后再 end——诊断注入构造),THEN debug 诊断 + **序列剩余步骤照常完成**(幂等守卫兜底 false——防半清理态泄漏:后续 `begin_battle` 正常受理为尾腿)。〔覆盖编排专章 battle_over/level_clear 腿;B4 义务⑤;EC〕 -- **AC-32(reload gate"战斗中真的被置位"——强制检查点;D2 EC8 的 B1 侧)** 腿 1:GIVEN AC-5 战斗开始序列完成后(gate 捕获 = true 在案),WHEN 经 ConfigDB `reload()`(debug 构建),THEN **返回 false、ConfigDB 值不变、`config_reloaded` 不发**(D2 AC-16 的行为级 B1 侧——"战斗中真的被置位"由编排真调用承载,非模拟置位);战斗中经测试通道换根直调 `load_tables(collect_only=true)` 读值不受门约束(通道区分——D2 双通道口径注记)。腿 2(复位):AC-31 battle_over 完成后 `reload()` → true 且 `config_reloaded` 恰一次(D2 AC-16 跨引)。〔覆盖 Core Rule 16;D2 EC8;强制检查点①〕 - -**可回放(Core Rule 15)** - -- **AC-33(结算可回放——强制检查点;D2 AC-15 deferred→B1 兑现)** GIVEN 两套全新全栈实例(同 master=42、同根、同板登记序列、同 encounter),WHEN 同一**意图序列 + 窗口选择序列**驱动两遍(定长场景:含挖掘/连锁/插旗/停手/窗口选用/刷新换图至少各一——覆盖两类回放输入),THEN 两遍**步骤流逐行相同**(行数/行序/全字段含 value 与归因——同 master_seed 同意图序列同窗口选择序列 ⇒ 逐行相同;2026-09-10 注:新增 target/effect_id/pool_value 字段均为输入的确定函数,逐行相等断言域含之、回放语义不受损);判别腿:仅窗口选择序列不同(同意图)→ 步骤流在窗口标记处分歧、其前逐行相同(**窗口选择序列确为回放输入**的判别形式)。确定性来源行为面:B1 全程 `randomize`/RNG 零调用(AC-43)+ 表值快照(B2 AC-11/B3 AC-15/B4 AC-15 跨引)+ attempt 非 scope 事件(AC-28 腿 1)。〔覆盖 Core Rule 15;强制检查点②;D2 AC-15〕 -- **AC-34(scope 切点契约)** GIVEN AC-29 腿 2 连环刷图场景,WHEN 任一结算回放切点取快照(master_seed + 双流 scope 计数器 + 意图序列 + 窗口选择序列),THEN 无在飞流实例跨界(切点时刻双流计数器 = 已完成 install 数——桩与 B4 取号契约的观测面);续玩快照恢复驱动(D3 消费语义)= 端到端集成冒烟 deferral(生效条件 = D3 实现)。〔覆盖编排专章回放切点;Core Rule 15〕 - -**高光兑现节点(Core Rule 13)** - -- **AC-35(perfect_sweep 双向 + 真实双份兑付——强制检查点 #2)** 腿 1(触发 + **真实双份**——2026-09-10 修订):GIVEN b_flag 构造零误标 ∧ ≥1 标中(仅插 (1,4) hit 旗、无误标旗)→ 挖尽 cleared,WHEN 清图兑付,THEN **高光行**在案(value = 实际有效兑付当量)+ **清图奖励身份第二份兑付捕获恰一次**(道具类身份 → B4 `stock` 捕获恰 2 次 / buff 类身份 → B3 `apply_effect` 捕获恰 2 次——玩家实得两件;`grant_clear` 本身仍恰 1 次;等价入账 = power × P_pf ÷ 100 记号推导——**换算 ÷100 成文**,非新分源换算率)。腿 2(误标破完美):同构造 + 插 (0,3) miss 旗(hit=false ≥ 1)→ **无高光行**、正常兑付 + **"标旗未中"零值行在案(highlight=`perfect_broken`——AC-12 腿 5 同基)**(全有或全无谓词、无部分完美档)。腿 3(零标中):全板零旗 cleared → 无高光行(hit=true = 0 不满足谓词)。腿 4(刷新图不触发 + 计数重置):AC-28 换图后新板零 flag_judged → 完美谓词域 = 本板自 install 起(跨图不累积——前板误标不污染新板:构造前板含误标 + 换图后新板零误标有标中 → 新板 cleared 触发高光——**重置的判别正腿**);且刷新图本身零 grant_clear 无兑付点。腿 5(雾旗零特判):b_fog 雾内插旗计入误标(hit=false——A4 EC5)→ 破完美(无变异分支)。〔覆盖 Core Rule 13#2;EC×2〕 - -**公式闭合对账(F0–F5——B3 义务⑤ / B2 义务④)** - -- **AC-36(F1 对照表以 B3/B4 实例为对照实物——B3 义务⑤;条款①)** GIVEN 默认根 + 登记构造(每活行一 B3 实例:defense_up L=1 / weaken L=1 / ambush L=1×k=1;clear_knife 经 B4 grant_clear 快照),WHEN 结算兑付读值(query_active 快照载荷 / grant_clear power)经统一换算式 E(·)(SettlementTable `D_ref` 读值),THEN **E_inst 结论与登记对照表一致**:E_defense = |m_d|/100 × D_ref、E_weaken = |m_w|/100 × D_ref、E_ambush(k=1) = m_amb、E_clear = power ×(perfect ? P_pf ÷ 100 : 1)(**真实双份**——完美板两件实得、总当量 = 2×power;**单一线性换算**——全四源同式、零分源改率的行为面 = 各行共用同一 D_ref 读值);**锚两腿断言(B1 强制检查点执行器)**:E_weaken > E_defense(条款②腿一严格大于)∧ E_weaken ≥ E_dig 推导值(腿二 1:1 零链基准——登记常数);**生效前提 = registry 回执 #1/#2 落地(m_w 修订回写)**——现值 −25 下本断言失败即 F0 裁决未兑现的正确信号(非假失败;不写软口径)。**attack_up 死行**:hero_offense 池映射在位(结构)∧ 全结算伤害行/效果行零 hero_offense 消费点(MVP 内容态断言——复活走 B4 OQ1 连锁)。〔覆盖 F1;Core Rule 13;B3 义务⑤〕 -- **AC-37(F2 判据函数对账——B3 义务③收口)** GIVEN F2 闭合判据函数(语义映射 → 池加算 → clamp(W_d) → 乘区 → floor),WHEN 以登记构造跑 F2 三例读法(weaken AP 界 8×m_w / 表界 16×m_w / defense_up 顶点 2×m_d——全表读值记号),THEN 判据结论逐一与 F2 表一致:两越域例 clamp 后 M=0、顶点例恰边界未越域;**地板交叉层数 = ⌈100/|m_w|⌉ = 2**(F0 值域 [60,85] 全域恒 2——表读值推导);取整方向 = floor 单一规则(腿:半值例 D′ = floor 断言)。行为级交叉锚 = AC-22 腿 3。〔覆盖 F2;B3 义务③〕 -- **AC-38(F3 判据函数对账——B2 义务③成文)** GIVEN F3 判据函数(三分支全序 + 负值禁令 + 死亡边界),WHEN 以登记例跑(grub L=2 → weaken → floor 3 记号 / knife_adv p_i vs hp=6 残敌 → 死 + 溢杀丢弃 / D′=0 → 不调 apply_damage 分支),THEN 结论与 F3 一致:零负值(任意输入组合判据函数输出域 ≥ 0——参数化扫描)、Dead ⇔ hp=0 零负 hp 中间态、hero 先判优先级;行为级交叉锚 = AC-18/20/22/24。〔覆盖 F3;B2 义务③〕 -- **AC-39(F4 条款③闭合对账——B2 义务④;强制检查点)** GIVEN F4 闭合判据函数 + 登记常数(A1 参考行参数 |M|/|S|、ι = 行 target 代 p10 **乐观代理**、m_d/D_a、m_amb、D_ref 全表读值/登记推导),WHEN 闭合判据函数对 L1/L2 两板形与满配语境(unit_count=3)跑配对主式,THEN 结论与登记一致(**双口径登记 2026-09-10 评审**):L1 裕度 ≈2.0× ✓ / L2 ≈2.6× ✓(锚行口径;**期望口径 ≈1.2×/1.5× 同向通过——双口径断言,防虚高裕度误用**)/ **满配语境最坏盲点破线 ✗ → C3 调参约束输出**(对账结果 = 约束清单——C3 消费 B1 输出的事实依赖面);**适用域守卫腿(2026-09-10 补)**:登记构造 n_s < 1(残余集为空)→ 主式不评估、信息端平凡腿接管(零赌博板形不误判破线);信息端平凡腿 P(安全)=1 → V_safe > 0 恒真(登记面);registry `clause3_supply.direction_precheck` 退役注记 + 双口径重算值登记存在性(对账清单 #3 的 AC 侧)。**A1 actuals p10 交付后强制重跑**(缺口预检 4)。〔覆盖 F4;B2 义务④;强制检查点条款③〕 -- **AC-40(F5 条款⑤闭合对账——强制检查点;2026-09-10 模型修订:挖穿残余池口径)** GIVEN F5 闭合判据函数(**修后模型**:n_s = (1−ι)\|S\|、E[踩雷] = \|M\|×n_s/(n_s+1)、X_res = E[踩雷]×V_mine、Δr = ⌈(n_s+E[踩雷])÷AP_r⌉、C_eff = C×(perfect ? P_pf ÷ 100 : 1))+ 登记常数(ι/P(雷)/E_dig 权重推导/C=clear_knife power/P_pf/AP_r/fog_burden_ratio 登记代表值——全表读值/登记推导),WHEN 主判式对 **L1 无雾态/L2 雾态两板形 × {unit_count=1, unit_count=3} 四态组合 × {完美/非完美} 分支**跑,THEN 结论与**登记约束包**一致(2026-09-10 修订登记:L1 −5.3/+2.7、L2 −10.1/−2.1、L1 满配 −49.6/−41.6、L2 满配 −97.5/−89.5——**条款⑤未闭合,verdict = 未证明的约束生成器**);实现率折减腿(E_dig×0.6)同向更差读数在案;**保守地板需求输出**(L1 ≥ 46.1 / L2 ≥ 91.8——C 量级上调整向约束);**停手侧 RAP 零价假设登记存在性**(模型边界注记——判据函数输入分解可读);护栏 A(雾格净优势 +2.4 ∈ (0, 3]——B4 pricing_constraints③ 判据)✓ 与护栏 B **双读数**(D_ref 口径 C_eff = 16 ≤ 24 ✓ / DPS 严格读数越线——裁决项登记)双断言;**A4 三腿入账核对**:雷险消解腿(雾区无雷)/ 信息双向腿 / AP 腿(链不可达全价 Δr 增量)逐腿在判据函数输入分解中可读(variation_table.fog_ap_note 消费面)。全条为对账断言——**非 playtest**(弃图率等观测面归 C3 playtest,out-of-scope)。〔覆盖 F5;强制检查点条款⑤〕 -- **AC-41(F0 registry 对账 + SettlementTable registry 一致)** GIVEN 默认根加载,WHEN 脚本解析 `design/registry/entities.yaml`,THEN:① `status_effect.anchor_warning` 含 **F0 裁决回执注记**(归一口径 = 每结算瞬时当量 / 值域 [60,85] 默认 65 / 地板交叉层数 2 / defense_up 参照保持——对账清单 #1);② `status_effect.mvp_content.weaken` 值域修订注记 + `clause3_supply.direction_precheck` 闭合回执注记(#2/#3);③ `clause5_dominance`(或并入条目)注记存在(#4);④ **`settlement_table` 条目存在**且**八字段名**与 SettlementTable schema 逐一相等(pool_clamp_lo/hi 两字段——2026-09-10 统一口径)、effect_pool_map 四键一致、p_perfect 载体域 = {100,200}(#7——**生效前提 = Phase 5b/5d 回填完成**,不写软口径);⑤ knob 活值(D_ref/P_pf/m_w)不作定值对账(A4 AC-8 豁免同款)。〔覆盖 F0(裁决的 AC 形态 = registry 对账);Core Rule 16;对账清单 #1–#4/#7〕 - -**流水协议与静态扫描(Core Rule 14/1)** - -- **AC-42(行协议封闭枚举 + 字段分层 + 无来源行零容忍)** GIVEN 全部 AC 场景步骤流捕获全集(冒烟汇总断言——单用例跑全部行类型构造场景集),WHEN 逐行校验,THEN:`type` ∈ 封闭枚举 **13 类**(效果/伤害/治疗/道具/奖励未生效/已消耗未生效/使用被拒/溢出未生效/**标旗未中**/蓄力/衰减/判定/高光——封闭枚举即负空间:新增行类型 = 接口漂移);每行公共字段 `type/source_class/origin_cell/round_index/display_name/value/highlight?` 全在(**origin_cell 板级行可空**——Core Rule 14 可空声明;highlight 可空枚举 {flag_hit, clear_reward_h2, perfect_broken});**行类型特有字段断言**:伤害行/道具行(生效)携 `target`;效果行携 `effect_id` + `pool_value` 且 value = 单次授予贡献值语义;**source_class 值域 ⊆ source_label_map 键集 ∪ 判定/道具扩展 ∪ {enemy_action, flag_miss}**(`source_label_map` 表读值——新增 source_class = 接口漂移的表侧闸);**无来源行 = 断言失败**(P2"每行能回答从哪来"的兜底判据——Player Fantasy 反向护栏的机器可判定形式);未生效类四行 + 标旗未中行各携带聚合计数/批次字段(非空)。〔覆盖 Core Rule 14〕 -- **AC-43(静态扫描——编排唯一性单向检查 + 零随机/零 UI/禁 await;Core Rule 1)** GIVEN B1 文件集(编排器/判据函数/步骤流/冒烟脚本/夹具规格)与全项目非 tests/ 文件集,THEN:① **零 `randomize()`/`RandomNumberGenerator`/自建 RNG**(零随机——`rng_service` 流封闭不含结算流的代码侧对应;行为级硬证据 = AC-33);② 零 `extends Control/Node2D`、零 `.tscn` preload + AC-5 headless 实跑通过(合成判定——D2 AC-10 同款);③ **结算路径 `await` 零命中**(可回放步骤流承重约束——扫描域 = B1 结算/编排文件集,逐字面 warning 级 + 人工复核,D2 AC-14 纪律);④ **编排唯一性单向扫描**:全项目非 tests/ 文件集中 B2/B3/B4 API 符号(封闭枚举清单入扫描配置)命中文件 ⊆ B1 文件集("任一下游被 B1 以外语调用 = 架构违约"的机器可判定形式;B2/B3/B4 各侧 AC-17/19/21 的"相邻零引用"反向半句与此合成闭合);⑤ D2 AC-14 人工三要素字面量扫描(零玩法数值字面量的行为级硬证据 = AC-22/36/39/40 全表读值推导 + AC-41 registry 对账);⑥ A2/B3/B4 相互直调零命中(各侧"零直接接口"的对侧确认——扫描域同④)。〔覆盖 Core Rule 1;编排不变式③〕 - -**覆盖矩阵(qa-lead 交付,验收评审用)** - -- **Core Rules**:1→AC-43(单向扫描)+AC-33(零随机行为级)· 2→AC-6 · 3→AC-9 · 4→AC-7+AC-2 · 5→AC-9/10/11/12(腿5=标旗未中行)/13 · 6→AC-14 · 7→AC-15/16 · 8→AC-17 · 9→AC-18/19/20 · 10→AC-21/22/23/24/25 · 11→AC-26 · 12→AC-24/27 · 13→AC-35(#2 真实双份)+AC-12(#3+腿5)+AC-36(P_pf 入账)· 14→AC-42(13 类+字段分层)· 15→AC-33/34 · 16→AC-1/2/3/4/32/41 -- **Formulas**:F0→AC-41(registry 对账形态)· F1→AC-36 · F2→AC-37+AC-22 腿3 · F3→AC-38+AC-18/20/22/24 · F4→AC-39 · F5→AC-40 -- **上游义务 23 条**:B3①→AC-9 · ②→AC-9 · ③→AC-37/22 · ④→AC-26 腿2 · ⑤→AC-36 · ⑥→AC-26 腿1 · ⑦→AC-17 腿1 · ⑧→AC-14 ∥ B2①→AC-21 · ②→AC-9/14 · ③→AC-24/38 · ④→AC-39 · ⑤→AC-18 · ⑥→AC-14 ∥ A2①→AC-6 · ②→AC-10 腿2 · ③→AC-12 腿2/3 ∥ B4①→AC-7 · ②→AC-9/10/11 · ③→AC-13 · ④→AC-15/16/18/19/20 · ⑤→AC-31 · ⑥→AC-5/28——**23/23 全落位** -- **强制检查点 5 项**:reload gate→AC-32 · 可回放→AC-33 · new_board 违约→AC-30 · roll_board 恰一次→AC-5/28(scope 计数器观测)· 衰减恰一次→AC-26 -- **SettlementTable 校验**:segment_order→AC-2 · 悬空 effect_id→AC-3 · p_perfect 域→AC-4 · schema 定稿→AC-1/41 -- **EC(26 条)**:末图清图→AC-13/26 腿2/27/31 · hero 短路→AC-24 · 双死 hero 先判→AC-24 注(结构不可达不构造)· D'=0→AC-22 腿3 · 溢杀→AC-18 腿3 · charge 蒸发→AC-23 · 全体 charge→AC-23 腿2 · L=0→AC-22 腿1 · 同窗多包→AC-16 · 部分回复→AC-16/19 腿2 · 刀全灭→AC-20 · 空库存→AC-15 腿4 · RAP 不足→AC-29 腿3 · 连环刷图→AC-29 腿2 · 未刷新→AC-30 · 非法产物→AC-28 腿2 · 清理被拒→AC-31 腿2 · 战斗中 reload→AC-32 · 衰减空→AC-26 腿3 · 清图 buff 满层→AC-13 腿2(高光降级)· 完美刷新图→AC-35 腿4 · 标中+误标→AC-35 腿2+AC-12 腿5(标旗未中行)· 多敌共享 L→AC-25 · 死亡即不动手→AC-18 腿2 · 零伤害死局→负空间+遥测锚 OOS(C3/playtest)· 结算开始 hp=0→负空间 debug 断言(自守,前言声明)——**呈现半边全部 OOS 至 D1/B5(生效条件 = D1 义务台账登记)** -- **无洞声明**:Core Rules 16/16、F1–F5、义务 23/23、检查点 5/5、SettlementTable 校验 3/3 全部映射 AC;EC 除 2 条负空间自守(不可由公开 API 构造——B2 实例不变式先例)与呈现/playtest OOS 外全部 G-W-T 或对账断言承载。 - -**缺口预检(qa-lead;每项标 owner 与时机——B2/B4 先例)** - -1. **【阻塞级】A2 事件载体 ADR 依赖**:经真 A2 事件流驱动 B1 的 THEN 子集为纸面契约直至 A2 OQ2 落地;A2 半真备选(注入面+A3 真)已登记为过渡载体、断言口径不变。owner:实现期 ADR(与 A2 OQ2 同一裁决);时机:Technical Setup。 -2. **【阻塞级】σ 登记轨迹与取号约定**:身份依赖腿(双包/刀全灭/清图槽身份/完美板布置)依赖 σ 登记轨迹与生成器取号约定(B4 缺口 8 同源);登记后须第二人独立推导复核。owner:qa/实现期 ADR;时机:冒烟框架搭建 + ADR 定名。 -3. **m_w 修订回写未落地**:AC-36 锚腿为 F0 裁决执行器——registry 回执 #1/#2(接口漂移:B3 行表/Tuning Knobs/registry)完成前失败属正确信号;B3 AC-14 腿 3 非平凡性随批复查。owner:B4/B1 共裁 + C3;时机:接口漂移回写批(B1 定稿 Phase 5b 同批)。 -4. **A1 actuals p10 未交付**:F4/F5 以行 target 代 p10 乐观代理——交付后强制重跑 AC-39/40 并同步 registry(对账清单 #6);连带 |M|/|S| 分布与 fog_burden_ratio p50/p90。owner:A1(交付)→ B1(重跑);时机:A1 F4 报告 C 交付。 -5. **C1/C2 encounter 供给**:begin_battle 入参直供为 provisional——C1 定稿后接入真实遭遇上下文与跨战斗 HP 持久性,AC-5/24 的直供构造改为真实供给链。owner:C1/C2;时机:C1/C2 GDD。 -6. **【阻塞级】D1 呈现义务台账**:A2×6/B2×4/B3×4/B4×5/B1×3(高光行强调/完美排雷呈现/EC5 零合法板提示)缺项即 blocking——本节 AC 全部以数据面断言、呈现零覆盖。owner:D1;时机:D1 GDD 门禁评审。 -7. **SettlementTable registry 条目回填**:AC-41④ 生效前提 = Phase 5b/5d 回填 `settlement_table` + 对账清单 #1–#4 注记——回填未完成则 AC-41 失败(正确信号)。owner:本 GDD 定稿批;时机:定稿回填。 -8. **B1 扫描域成员清单登记**:AC-43 单向扫描的 B2/B3/B4 API 符号清单与 B1 文件集须登记入 D2 AC-9 项目级 CI 扫描配置(B3/B4 先例)。owner:Technical Setup;时机:B1 GDScript 产物落地即登记。 -9. **C3 调参对账重跑流程**:D_ref/P_pf/m_w 任一调参 → AC-36/39/40 + AC-2–4 夹具登记值连锁重跑(Tuning Knobs 联动义务的流程化);调参流程无此步骤则相关 AC 假失败。**2026-09-10 扩表(F4 结论④/护栏 B/条款⑤约束包联动)**:A1 行参数(mine_density/min_safe_count/ι target)与 B4 奖励权重/power 调参 → 同批重跑 AC-39/40(F4/F5 输入面);**A1 新增产出义务 = R₀ 规模分布上界(F4 报告 C 扩列)**——护栏 B \|R₀\|_max 的登记供给方。owner:C3(调参)+ qa(重制)+ A1(R₀ 分布产出);时机:每次调参 / 报告 C 扩列交付。 -10. **A1 桩 → 真 A1 全链路**:换图编排的 generate 真实集成(含 attempt 重试不重开 scope 语义、非法产物真分布)登记端到端集成冒烟(与 A1×A2 双包含端到端同槽)。owner:qa/A1;时机:A1 实现落地。 -11. **零伤害死局遥测锚**:EC 死局组合 B1 不设自愈分支——战斗轮数异常遥测的口径登记(进 C3/OQ 清单)。owner:C3/playtest;时机:垂直切片 playtest。 -12. **flag_miss 源路径预留**:A2 OQ1 标错惩罚上线时,本节补 `flag_judged{hit=false}` → 敌方伏击 +1 源路径 AC(A2 预告接口漂移——source_class 新枚举走 B3 修订)。owner:B1/A2/A3 联合;时机:惩罚实测采纳后修订批。 - -## Open Questions - -1. **事件总线载体**(owner:实现期 ADR——与 A2 OQ2 同一裁决;deadline:Technical Setup):signal vs 回调注册 vs 直连调用;B1 触发机制(事件订阅 vs 相位轮询)与 A2 事件捕获断言面同批落地。TD 门禁 2026-09-07 登记项的 B1 侧落点;AC-6/AC-33 相关 THEN 为纸面契约直至落地(缺口预检 1)。 -2. **m_w 修订终值共裁**(owner:B4/B1 锚 owner 共裁 + C3 调参;deadline:B1 /design-review 后的接口漂移回写批):F0 已裁值域 [60, 85]/默认 −65 与归一口径(瞬时);终值确认 + B3 StatusEffectTable 行表/Tuning Knobs/registry 三处回写执行(缺口预检 3);B3 AC-14 腿 3 非平凡性随批复查。 -3. **A1 actuals p10 交付后条款③⑤强制重跑**(owner:A1 交付 → B1 重跑;deadline:A1 F4 报告 C 交付):ι 以行 target 代 p10 为乐观代理——重跑 AC-39/40 + 同步 registry 重算值(对账清单 #6;缺口预检 4);连带 fog_burden_ratio p50/p90。 -4. **连锁规模分布供给方悬空**(owner:A1/A2 + B1 共裁;deadline:A1 报告 C 扩列或 A2 telemetry 定稿时):条款②第二腿(连锁放大边际基准)校准需要 c̄(每安全格连锁期望放大)——现无既定供给方;候选 = A1 F4 报告 C 扩列 or A2 遥测(Formulas 对账清单 #8 附注)。供给落定前第二腿以 1:1 零链下界运转。 -5. **EC5 零合法板玩家侧呈现形态**(owner:D1 裁决;deadline:D1 GDD):提示/补偿/回退三形态选型——B1 数据面(非法产物标记上抛)已就绪(AC-28 腿 2);B1 域内不做补偿逻辑(候选"确定性回退已知好种子"归实现期 ADR——A1 EC5 登记对侧)。 -6. **C1/C2 encounter 供给接线**(owner:C1/C2;deadline:C1/C2 GDD):begin_battle 入参直供(provisional)改真实遭遇上下文 + 跨战斗 HP 持久性(B2 hp_persistence 对侧承接);战斗触发(节点移动碰非奖励点)归 C1(缺口预检 5)。 -7. **深度高光形态**(owner:D1/B5;deadline:垂直切片):#3 标中旗高光的二期形态(即时 HUD 反馈动画/音画同步)——MVP 已落数据面标记 + 当轮兑付(Core Rule 13);旗落格高亮/姿态反馈等表现形态随 art-bible 与"战斗表现美术测试"定。 -8. **标错惩罚 flag_miss 源路径**(owner:B1/A2/A3 联合;deadline:A2 OQ1 实测采纳后修订批):候选"敌方伏击 +1"上线时——flag_judged{hit=false} 转化路径 + B3 source_class 新枚举(B3 结构冻结项走 GDD 修订)+ 惩罚重复性裁决(A2 OQ1 增补项:hit=false 无去重的不对称)联动关闭(缺口预检 12)。 -9. **hero atk 激活裁决参与**(owner:B4/B1;deadline:B4 OQ1 / C3 首调):激活须与 attack_up 死行复活联动(hero_offense 池消费点上线 → 对照表回迁 + AC-36/AC-18 死行断言连锁回写)——B2 Overview 胜利路径声明的后续;MVP 维持 atk=0。 -10. **B2 OQ1 两 face 归属**(owner:实现期 ADR;deadline:Technical Setup):`query_attack`/`ambush_grant_plan` 归 B2 供给面 vs B1 编排面——裁决归 B1 则 AC-14/22 相关腿迁移至 B1 冒烟(断言口径不变)。 -11. **零伤害死局遥测锚口径**(owner:C3/playtest;deadline:垂直切片 playtest):战斗轮数异常遥测的阈值与埋点(EC 死局组合 B1 无自愈分支——护栏 owner = 实现期 ADR/D2 跨字段校验,B2 OQ9 并案)(缺口预检 11)。 diff --git a/design/gdd/legacy-2026-09-13/b2-enemy-system.md b/design/gdd/legacy-2026-09-13/b2-enemy-system.md deleted file mode 100644 index e6d8616e..00000000 --- a/design/gdd/legacy-2026-09-13/b2-enemy-system.md +++ /dev/null @@ -1,354 +0,0 @@ -# B2 敌人系统(Enemy System / 战斗单位系统) - -> **Status**: Approved(2026-09-09 lean 定稿 + 同日 full 评审〔六专员 + CD 终裁〕NEEDS REVISION,8 blocking 同日核销后用户拍板收口——A3/A4/A1/B3 同日核销先例,免独立 re-review。评审日志:`design/gdd/reviews/b2-enemy-system-review-log.md`)。lean 门禁:systems-designer 起草 Formulas · qa-lead 起草/验证 AC;CD 视角随 full 评审补位。full 评审 8 blocking:当前内容态无胜利路径声明(Overview/Dependencies)· AC-7 恒假判别前提 + SKIP · 多敌夹具根改 ambusher 行 · OQ6 事件源类更正 + F3 重验触发补支 · 精英/Boss 编码位预登记 OQ7 · Rule 8 预告时序⑤ · 资产下限补受击/死亡/顺位 · 主角推进域排除(advance/query_beat 对 hero 拒绝)。CD 视角与 Player Fantasy/Visual/Audio 人工复核已随 full 评审补位 -> **Author**: user + agents(systems-designer〔Formulas〕· qa-lead〔AC + 缺口预检 7 项〕;九项结构决策〔多敌/HeroTable/视觉推测型/Peglin 行为环/每行集一敌种/side-wide/固定顺位/unit_count 字段/cap=4〕为用户拍板) -> **Last Updated**: 2026-09-09 -> **Implements Pillar**: P3(主——雷→敌方优势的收件人与同源兑付面)· P2(敌方增益行可归因)· P1(视觉推测型读怪 = 规划素材)· P4(间接——地牢住户) -> **Layer**: 2 Core · **Milestone**: MVP · **设计顺序**: 第 7 位 - -## Overview - -B2 是战斗域的**单位层**:定义"战斗双方是谁、各自有多强、带着什么词条、怎么受伤与死亡"。数据侧,它持有 D2 `EnemyTable` 的回填权——敌人类型(MVP 仅 1–2 种)、单位属性、雷触发的敌方优势词条(**伏击清单**)、意图可见性字段,行键 `(level_index, node_depth, enemy_id)`;行为侧,它承载 CD 门禁扩容的**战斗单位接口**——主角与敌人共用同一套受伤/死亡语义(扣血至 0 即倒下,双方同一判定),敌人以此成为自动战斗结算(B1)的操作对象。玩家不操作 B2 的任何部分——敌人由系统驱动、行为全确定(零随机,`rng_service` 流封闭,P1);但玩家每一轮都在**阅读**它:结算明细里"敌方获得伏击 +N"的行(P2 归因)、意图可见性预告的下轮威胁(P1 规划素材)。它是 P3 的主承载:**雷的代价需要一个收件人**——开雷喂给敌人的每份优势都落在 B2 定义的词条上,标中旗削弱的也是同一个它。 - -没有 B2,三件事失去落点:踩雷的敌方优势没有受益者(P3 断裂);胜负判定没有主体("敌人全灭 → 战斗胜利"无从判定);C3 的难度曲线没有施加对象("越下越难"成空话)。B2 的边界:它管单位"**是什么、多强、有什么词条、如何死**";"每轮按什么顺序怎么结算"归 B1 SettlementTable,"单位随冒险怎么变强"归 C3,"击杀后掉什么"归 B4。机制与内容分离(B3 先例):机制归本 GDD,内容行 MVP 收窄为 1–2 敌种 + 少量词条,名录扩展归垂直切片/Alpha。 - -MVP 战斗形态采**单敌人**假设(B3 Rule 1 回验义务的落点,见 Core Rules):一场战斗一个敌人单位,目标选择在 MVP 退化为恒定映射——但规则仍成文(目标选择规则是索引登记的 B2 职责),为多敌扩展预留语义位、不实现。 - -**基础攻击恒存在(2026-09-11 用户裁决——取代原"当前内容态无胜利路径"声明〔2026-09-09 full 评审 blocking ①,历史语境见 reviews/ 日志,不在此复述〕)**:HeroTable.atk = **基础攻击**,域 **[1,999]**——0 = 加载期校验拒绝,"0 基线 × 百分比增益恒零"的死锁自 schema 层杜绝,开发期任何内容态都不可能出现;MVP 值 = 6(原型锚 HERO_BASE_ATK,provisional 归 C3)。主角每结算战斗段**先手攻击**顺位最前存活敌(编排归 B1 战斗段;攻击是固定动作、非行为环——Rule 4 环仍为敌单位专属),attack_up 等百分比增益自此有恒定消费面。"敌人全灭 → 战斗胜利"(Rule 1 / game-concept 轮次流程 4)由**基础攻击 + 奖励侧增量**共同承载:B4 道具/增益是基础攻击之外的**规划面伤害**(囤刀、抢杀、爆发时点的决策素材),不再是唯一伤害来源;P2 归因不受损——每一分伤害仍逐行标注来源(hero_attack / 道具逐件实例)。原"atk MVP=0 机制开关、胜利路径依赖 B4 先行"条款与 OQ3"左臂载体悬空"的投影描述一并退役。 - -*(实现口径注:单位/词条的类结构与事件载体不在本 GDD——实现期 ADR 域。)* - -## Player Fantasy - -**直接承载**(Section A 定框答案:玩家不操作敌人,但每一轮都直接感受它)。B2 的情绪目标一句话:**"对面是个看得懂的对手,不是一个血条"**——它的威胁可推测(读姿态就知道下一拍是什么、大约多重)、可归因(它变强是因为我开错了雷)、可拆解(我标中的旗正在削弱它)。玩家对 B2 的正确感觉是"**赌桌对面的那个存在**":它不是环境伤害发生器,而是与我的排雷决策实时联动的一方——我谨慎,它就弱;我贪婪,它就一口一口吃壮。 - -体验锚点(按支柱): - -- **P3 同源的对面对象**:结算明细里"敌方获得伏击 +3(第 4 轮 · 雷)"的行,玩家能指认"这是我开的那颗雷喂的"——敌人的强度是玩家扫雷决策的**镜像**,威胁有源可溯。 -- **P1 可推测的威胁**:敌人不预告精确数值——"它弓起背了,下一拍是重击"式的读怪推理进入挖掘决策(形态↔行为映射稳定可学,MVP 双环最长 3 拍);精确数字在结算明细中兑现,结算前的世界靠观察而非读表。 -- **P2/P3 的拆台兑现**:标中旗的 weaken 落在同一个它身上——削弱行与伏击行在明细里使用同一呈现语言,玩家由此学会"它强是因为我喂的,它弱是因为我拆的"。 -- **P4 的地牢住户**:敌人是"越下越险"的具象——深层的敌人更凶(C3 施加),给下探氛围一个可见的刻度。 - -参考感受:Peglin(哥布林弹珠)的固定招式轮替(威胁因可预测而可规划——确定性环是可学习性的来源)+ 怪物猎人的读招(前摇姿态承载威胁信息、无数值面板——视觉推测的同构)。本作合成两者:**确定性环 × 视觉推测**。**反向对照**:半随机、不可归因的威胁与重掷线索的"猜怪"呈现——正是本作要避开的感受。 - -**反向护栏**:敌人的威胁绝不能是无源的暗账——若玩家说不出"它为什么变强 / 这一拳为什么这么重",归因链即失职(违反 P2/P3);视觉推测型下的对偶护栏:**线索必须稳定可学**(形态↔行为映射每 run 恒定,D1 义务②),任何让线索重掷或不可学的呈现设计默认砍掉(违反 P1)。血条/攻击力的数字可读性适用视觉锚 1(暗色底上高对比)。 - -> 注:`creative-director` 未经咨询——Lean 模式(仅 D/H 两节委托专家),生产前请人工复核本节情绪定位。 - -## Detailed Design - -> **决策记录(2026-09-09 用户拍板)**:多敌(同敌种 1–3 单位)· HeroTable 新增 · 意图视觉推测型(Peglin 行为类型学 + 确定性行为环,不搬其数字意图 UI)· 每 (L,D) 行集恰一敌种 · 效果 side-wide · 英雄侧固定顺位目标 · MVP 双敌种双环。 - -### Core Rules - -1. **战斗单位统一接口(CD 门禁扩容口径)**:战斗域恰两类单位——主角(hero)与敌人(enemy)——共用同一套受伤/死亡语义:单位持有 `hp / max_hp`,受伤 = hp 递减(clamp/负值/溢杀语义归 B1 结算公式域),`hp = 0` 即死亡;死亡判定**时机**归 B1 结算编排。主角死亡 = 战斗失败判定素材;敌单位全灭 = 战斗胜利判定素材(判定逻辑归 B1,game-concept 轮次流程 4)。B2 拥有单位状态与查询/受击接口;"谁在何时对谁造成多少"归 B1 SettlementTable。 -2. **敌人数模型(B3 Rule 1 单敌假设回验:不成立——定多敌,用户拍板)**:MVP 战斗 = **1–3 个同敌种敌人单位**(`unit_count` 表字段,knob),战斗内敌单位同种同属性(同一 EnemyTable 行实例化,行主序生成序)。回验结论触发 registry 预登记的接口漂移义务:**MVP 兼容路径 = 效果 side-wide**——enemy 侧 side-wide 从"该敌"改为"全体存活敌单位",B3 现接口**零变更兼容**(层数为 side 共享池,Rule 5);target_ref(单体寻址)登记为 **B3 扩展位义务**(首个单体效果上线时补列),B1 归集语义/D1 呈现裁决随批验收(义务清单见 Dependencies)。 -3. **敌种内容行(MVP 收窄:恰 2 敌种,索引 CD 门禁定稿)**:名录扩展归垂直切片/Alpha。每 (level_index, node_depth) 行集**恰一敌种**(用户拍板④——零选择规则、零实体键悬空风险);多敌种同深度的遭遇选择规则归 C1/C3(provisional 结构位)。MVP 双敌种(值全部 provisional): - - `grub`(蛆虫):行为环 [attack](平凡环);基线 hp/atk 暂按原型参考 18/4 占位(**出处待查**——D2 knobs 既有溯源义务) - - `ambusher`(伏击兽):行为环 [attack, charge, heavy](三拍环);heavy_multiplier provisional 2 - - MVP 分布 provisional 示例:L1 全深度 → grub、L2 全深度 → ambusher(曲线数值所有权归 C3,A1 参考行先例)。**注(2026-09-09 full 评审):行集按 (L,D) 逐坐标判定——同关内随深度切换敌种合法**(如 (2,0)→grub、(2,2)→ambusher);上例为最平合法特例、**非范本**,C3 调参勿默认照抄(防多样性无护栏)。 -4. **行为环(确定性节奏,Peglin 行为类型学转译)**:每敌种一个**行为环**——有序行为序列,战斗开始指向环首,**每次结算推进一格**(**轮到该单位行动时仍存活**才行动并推进;轮到它之前被击杀 → 本拍不打、指针冻结——"死亡即不动手"【2026-09-09 用户拍板,F1 承载】;**先作用后推进**,B3"先兑付后衰减"同款时序哲学),环尾回环首;跨轮次、跨扫雷图延续(战斗域),battle_over 随单位消亡。**行为类型封闭枚举(七类)**:`attack`(攻击:本结算对主角造成 atk 点伤害)/ `charge`(蓄力:本结算不作用——威胁空拍、规划窗口)/ `heavy`(重击:atk × heavy_multiplier)/ `guard`(自防)/ `boost`(自体强化)/ `hinder`(妨害雷图——Peglin"干扰弹板"的本作转译:敌方向棋盘施加变异类妨害)/ `summon`(召唤增援)。**MVP 实现恰前三类**;后四类为**预留语义位**(垂直切片/Alpha),EnemyTable.pattern 校验拒绝预留值(fail-fast,A1 solver_rules 冻结先例)——启用走本 GDD 修订(枚举封闭性),非调参。**零随机**:环推进是结算次数的确定函数(rng_service 流封闭,P1)。**行为环为敌单位专属(2026-09-09 full 评审 blocking ⑧)**:主角无行为环——advance/query_beat 等环接口对主角句柄一律拒绝(false / 空 + 诊断);"每结算恰一次推进"的编排口径相应为"每存活**敌**单位"(B1 义务①、AC 前言时序口径同款)。 -5. **雷触发的敌方优势(伏击清单,side-wide)**:MVP 伏击清单 = **{ambush}**(B3 表 mine_hit 源唯一效果行;新增词条须 B3 加行 + 锚连锁,非 MVP)。转化路径:A2 `cell_revealed{kind=mine}` 事实 → B1 结算编排期转化 → `apply_effect(ambush, source)`(side=enemy 共享池,B3 零接口变更)——**每颗雷恰一次转化**(B1 义务②,B3 EC6 对侧)。**惩罚上限表**:EnemyTable.`advantage_per_round_cap`(int [0,16],knob,**MVP 默认 4**【2026-09-09 D 节拍板——反灾难护栏定位:绑定阈 = 单轮 5–8 雷灾难轮;旧默认 8 使溢出协议死码(min(雷数≤8, 8) 恒等式),已废弃】)——单轮次内 side 池伏击授予上限;达限后转化改为**"溢出未生效"结算明细行**(B1 义务⑥协议,惩罚不静默蒸发,P2)。该字段是 A3 F1 条款 3 挖掘风险不等式的 **B2 供给表值**(口径见 F4——单结算自然边界,2026-09-09 用户定稿)。 -6. **伏击量纲定稿(B2 验收锚义务兑现——registry status_effect OQ2 关闭条件)**:`ambush.magnitude = +3 flat` 的单位 = **每层伏击为每次攻击类行为(attack/heavy)附加 3 点固定伤害**(flat = 主角 HP 点数;charge 拍不兑付伏击——空拍即无附加)。结算读法:B1 结算某敌单位攻击行为时,附加伤害 = side 池当前层数 L × 3。**条款 3 供给口径**(2026-09-09 用户定稿:单结算自然边界——debuff 一结算即逝,无每战累计上界):单结算单单位伏击附加上界 = cap × 3 = 12(MVP 默认);单结算 side 级结构上界 = unit_count × cap × 3(**满配语境 = unit_count 上界 3 → 3×4×3 = 36;默认行值 unit_count=1 下 = 12**——qa-lead 🔴-3 语境修正);跨结算累计 = 轨迹量、非表值、不设上界(dur=1 每结算清零无存量)——等量换算与不等式闭合归 B1(F4)。本条定稿后按接口漂移回写 registry `status_effect.ambush` 量纲注记(Phase 5b)。 -7. **目标选择规则(多敌下的真实规则)**:**敌 → 主**:全体存活敌单位按各自行为环当前拍对主角作用(主角是 hero 侧唯一单位,无选择)。**主 → 敌(用户定稿:固定顺位)**:单体作用默认作用于**存活敌单位中行主序(战斗开始生成序)最前者**,该单位死亡后顺延;AOE 作用于全体存活敌单位(无选择)。规则供 B1 结算消费;道具自带指定目标语义的扩展归 B4/B1 域。顺位可读性 = D1 呈现义务(玩家须能推测"下一个被打的是谁")。 -8. **意图可见性规格(视觉推测型,CD 门禁承重项定稿,用户拍板)**:**不直接显示下一轮结算的行为与数值**——威胁经敌种展示图像推测:① 图像↔行为映射**稳定可学**(同一敌种同一行为恒同一视觉状态,如 ambusher 蓄力拍 = 蓄力姿态);② 敌种形态暗示强度档位与环长;③ 映射**每 run 恒定、禁止重掷**(否则"读怪"退化"猜怪",违反 P1 裁剪判据);④ 精确数值在**结算明细中兑现**(P2 归因不变);⑤ **预告时序锁定(2026-09-09 full 评审 blocking ⑥)**:视觉状态呈现的是**即将执行的一拍**(当前拍预告)——**挖掘阶段全程可见**,结算时不另设独立意图播片(结算明细是数字兑现面、非意图预告面)。无挖掘期常驻预告,"下一拍是重击"的规划输入即不存在——抢杀窗口(F1 极端)、"蓄力拍前放心贪雷"教学(D5)、读怪幻想(本节)三者同时落空,故本条与 ①③ 同为承重项。线索清单与图像规格 = D1/B5 呈现义务(登记 systems-index,见 Dependencies);映射键 = enemy_id(B3 effect_id→icon 同款契约)。MVP 读怪对象 = 双敌种双环(最长 3 拍,学习成本低)。 -9. **主角战斗面(HeroTable 新增,用户拍板②;基础攻击定稿 2026-09-11 用户裁决)**:主角数值承载于 **HeroTable**(单行全局,D2 新增 schema 行,本 GDD 回填 owner,走 D2 接口漂移规则回写)。字段:`max_hp`(int [1,999],knob——MVP 值 provisional,出处待查)+ `atk`(int **[1,999]**,knob——**基础攻击恒存在**,MVP = 6(原型锚 HERO_BASE_ATK"每次结算的基础伤害",provisional 归 C3);**0 = 加载期校验拒绝**——原"机制开关/激活裁决归 B4/B1"条款作废:基础攻击不是开关,是恒在属性;后续解锁成长归 C4,曲线调参归 C3)。**消费面**:主角每结算战斗段**先手攻击**存活敌中行主序最前者(Rule 7 固定顺位;先于敌方行动——伤害算式/乘区/明细行协议归 B1 战斗段);attack_up(B3 +50 percent)的唯一消费面 = 本攻击——道具伤害恒定表值不吃修正(B4 F4 用户拍板)不受影响。**攻击无行为环**:主角攻击是战斗段固定动作,Rule 4"行为环为敌单位专属"不变。战斗开始时主角 hp 初始值由编排方入参供给(**跨战斗 HP 持久性归 C1/C2 域**,本 GDD 不定义;MVP 冒烟以 max_hp 入参)。主角与敌单位共用 Rule 1 接口。 -10. **实例化与属性基线**:战斗开始按遭遇坐标 (level_index, node_depth) 解析 EnemyTable 行(D2 R1:进度键 floor + enemy_id 精确匹配,悬空致命)→ 实例化 `unit_count` 个单位(行值快照——**授予时快照语义**,抗表热重载,B3 EC9 同款)。难度成长双通道:EnemyTable 行值随 (L,D) 变化 + C3 DifficultyTable 修饰(**接口未定,provisional**——修饰施加点与算式归 C3 定稿;B2 以实例化后数值运作)。 -11. **编排被动性**:B2 零随机、零 UI 依赖(Core 层 headless 债)、**零主动事件订阅**(A2 事件面 referenced_by 不含 B2——事实经 B1 转化驱动);B2 暴露单位状态查询与受击/推进接口,调用权集中归 B1 结算编排(B3"授予集中在编排"同款原则)。 - -### EnemyTable / HeroTable Schema 定稿(D2 回写义务) - -**EnemyTable**(键 `(level_index, node_depth, enemy_id)`——进度键 floor(D2 R1)+ 实体键精确匹配;**每行集恰一敌种**(行集内 enemy_id 唯一 = 表结构校验,违规加载期致命);本表**是**进度成长表(A1 BoardGenTable 同型,无 Rule 4 豁免);表非空(D2 Rule 6);**精英/Boss 编码位预登记 OQ7**——难度三维的精英/Boss 修饰在本键结构下无编码位,C1 定稿时强制核对): - -| 字段 | 类型/范围 | 说明 | -|---|---|---| -| enemy_id | String(行集内主键) | 实体键精确匹配(D2 Rule 4);意图视觉映射键(Rule 8④) | -| display_name | String | 图例/HUD/明细用名(本地化归 D6) | -| unit_count | int [1, 3] | 战斗构成单位数(knob;同敌种) | -| hp | int [1, 999] | 单位最大生命基线(knob;难度修饰前) | -| atk | int [0, 999] | 攻击基线(knob;attack 行为伤害基值) | -| heavy_multiplier | int [1, 16] | heavy 倍率(knob;无 heavy 拍的敌种不消费——非校验项,B3 max_stack 先例) | -| pattern | StringList | 行为环(元素 ∈ {attack, charge, heavy}——**MVP 校验域**;guard/boost/hinder/summon 预留、校验拒绝;环长 [1, 8]) | -| advantage_per_round_cap | int [0, 16] | 单轮伏击授予上限(knob;F1 条款 3 表值;0 = 该行敌种免疫伏击授予的合法极端) | - -**HeroTable**(单行全局——主角不随关卡自动成长,成长 = 天赋 C4 / 奖励侧;Rule 4 豁免同 ActionEconomyTable 先例;**D2 新增 schema 行,接口漂移回写义务见 Dependencies**): - -| 字段 | 类型/范围 | 说明 | -|---|---|---| -| max_hp | int [1, 999] | 主角最大生命(knob,MVP 值 provisional 出处待查) | -| atk | int [1, 999] | 基础攻击(knob,MVP = 6 原型锚 provisional;**0 = 加载拒绝**——零基线死锁 schema 层杜绝,2026-09-11 用户裁决) | - -### States and Transitions - -单位生命周期四态(战斗域;主角与敌单位同机): - -| 状态 | 进入条件 | 行为/出口 | -|---|---|---| -| Unspawned | 构造后未实例化 | 无接口副作用;唯一出口 = B1 编排实例化 | -| Alive | 实例化(行值快照 / hp 入参) | 可被指定目标(顺位)、按行为环作用、计入全灭判定;受击 hp 递减 | -| Dead | hp = 0(判定时机归 B1) | 移出顺位、不再作用、不计入"未灭";不可逆(MVP 无复活) | -| Despawned | battle_over(B1 编排) | 全部单位状态消亡,不跨战斗 | - -行为环指针 ∈ [0, 环长)——Alive 期间按结算推进(Rule 4);charge 空过是环位置语义、非独立状态。 - -实例不变式(debug 断言口径):hp ∈ [0, max_hp];敌单位数 = unit_count(战斗内不增——summon 未实现);指针 ∈ [0, 环长)。违规 = debug 断言中止(进程致命保留给 D2 数据通道,B3 同款)。 - -### Interactions with Other Systems - -| 系统 | 方向 | 接口契约 | -|---|---|---| -| D2 | 双向(hard) | EnemyTable schema + 双敌种行回填(本 GDD 义务)+ **HeroTable 新增**(接口漂移回写:D2 Core Rules 表清单 + registry);读取经 ConfigDB(R1 行解析:进度 floor + enemy_id 精确匹配) | -| B1 | 双向(hard,**provisional**——B1 未设计) | 结算编排期调用:存活集/顺位查询、行为环当前拍查询、属性快照、受击上报、环推进(每结算恰一次)、实例化/消亡通知;伤害公式/乘区/地板/死亡判定时机归 B1 SettlementTable;**B1 义务清单 6 项(缺项即 blocking,见 Dependencies)** | -| B3 | 相邻(零运行时依赖) | ambush/weaken 的量纲与作用域**验收锚归 B2**(Rule 6 兑现 registry OQ2);side-wide MVP 兼容声明(B3 零接口变更);**target_ref 扩展位义务**(首个单体效果上线时补列,随批:B1 归集/D1 呈现裁决) | -| B4 | soft(**provisional**) | 伤害道具默认目标消费(Rule 7);伏击清单扩展联动(新增 mine_hit 行时本 GDD 同步修订);B4 道具/增益 = 主角基础攻击之外的**规划面伤害**(2026-09-11 用户裁决后非唯一来源);attack_up 消费面 = 主角战斗段先手攻击(Rule 9 / B1 战斗段) | -| A2/A3 | 间接(零直接接口) | 雷/旗事实经 B1 转化;AP 界(单轮开雷 ≤ 8)= cap 默认值结构来源;weaken 档位锚归 B4/B1(A3 条款 2),B2 无表值 | -| A1 | 间接 | 雷数分布影响伏击吞吐——条款 3 对账消费 A1 actuals p10(B1 义务,非 B2 域) | -| C3 | 下游(soft,**provisional**) | 难度修饰施加点/算式归 C3 定稿(Rule 10);EnemyTable/HeroTable 曲线数值调参所有权归 C3(A1 参考行先例);多敌种同深度选择规则共裁;**新敌种投放节奏 = 关卡命脉**(MVP 敌信息总量 = 2 环 3 行为、L2 见底——每关须有新敌种或新环段投放;grub 单拍环 playtest 证伪项 OQ8) | -| C1 | 下游(soft,**provisional**) | 遭遇构成(战斗触发、(L,D) 供给、unit_count 覆盖)归 C1;跨战斗 HP 持久性归 C1/C2 | -| D1 | soft | **视觉推测型呈现义务 4 项(缺项即 blocking,见 Dependencies)**;敌单位 HUD(血条/顺位/姿态)呈现;顺位标记资产需求(Visual Req 2) | -| B5 | soft | 行为环视觉状态表现(蓄力姿态等——预告时序 Rule 8⑤);结算明细敌方行呈现(数据源 = B1 流水;**首个 heavy 兑付明细行分量高亮建议**——首遇校准课,ux 注记非硬义务) | -| D5 | soft | 读怪教学(敌种环模式可学、顺位规则)+ **"蓄力拍前放心贪雷"教学**(charge 轮伏击池蒸发 = 读怪奖励的涌现素材——F2 极端行为,2026-09-09 登记)+ **首次蓄力姿态一次性提示候选**("它在蓄力,这轮踩雷不挨打"——L1 grub 无 charge 拍、首课在 L2;MVP 可先上一次性提示、不等垂直切片完整教学。2026-09-09 full 评审增补)——垂直切片期 | - -**B1 侧义务清单(B2 GDD 门禁评审逐项核对落位,缺项即 blocking——B3 对 B1 登记先例)**:① 单位接口调用集中在结算编排、行为环推进**每结算恰一次**(double-advance 无守卫——信任编排,B3 义务⑥同款);**结算内调用序成文:兑付读值(query_attack)→ 受击上报(apply_damage)→ 推进(advance)**——倒序会读到下一拍(F2 依赖当前拍;2026-09-09 full 评审增补——比 double-advance 更常见的实现错误,B1 冒烟须回放结算步流)② 雷→伏击事实转化**恰一次**(每颗雷格实例至多一次;B3 EC6 对侧同款)③ 伤害 clamp/负值/溢杀语义与死亡判定时机成文(Rule 1 B1 域)④ F1 条款 3 闭合对账:消费 B2 `advantage_per_round_cap` 表值 + 伏击量纲(Rule 6 换算)+ **A1 actuals p10**(非 target 参数——A1 登记口径)⑤ 默认目标规则消费与单体/AOE 分流(Rule 7;顺位快照 = 生成序)⑥ 伏击 cap 溢出的"溢出未生效"明细行协议(Rule 5 后半;呈现归 B5/D1)。 - -**D1 侧义务清单(视觉推测型呈现,缺项即 blocking)**:① enemy_id→图像线索映射清单成文(形态/姿态↔行为状态;**预告时序 = 下一拍预告、挖掘期全程可见**〔Rule 8⑤〕;**含强度档位与环长直觉编码说明**〔Rule 8②——2026-09-09 full 评审补验收落点〕;形状+色相双通道,art-bible 约束)② 线索映射**全局恒定**(映射键 = enemy_id——跨 run 恒定、禁止重掷;Rule 8③ 的呈现侧承载)③ 单位顺位与存活可读(固定顺位规则的推测前提——Rule 7;顺位标记资产需求见 Visual Req 2)④ 敌方 side 池状态呈现口径(伏击层数经 B1 流水——B3 敌侧延伸)。 - -## Formulas - -> systems-designer 代理起草(lean 门禁,2026-09-09);四项口径经用户拍板:**cap 默认 4 · 死亡即不动手 · 条款 3 单结算自然边界 · C 节三处回写**。本节只含机制公式,平衡归属见文末显式排除声明。全部公式零随机、同输入恒同输出(可回放前提)。 - -**术语白话**:**拍** = 行为环里的一格行动(ambusher 的环 [攻击, 蓄力, 重击] 有三拍);**伏击池** = 敌方侧共享的伏击层数(本轮踩几颗雷就几层,轮末清零);**溢出** = 单轮踩雷超过上限的部分,转化为明细行可见、不生效。 - -### F1 行为环推进(ring_advance)——敌人按固定套路轮流出招 - -`beat(单位) = pattern[已行动次数 mod 环长];行动完成后 已行动次数 +1` - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 行为环 | pattern | StringList | 环长 [1,8];MVP 元素 ∈ {attack, charge, heavy} | EnemyTable 行值快照(Rule 10) | -| 已行动次数 | steps_u | int | [0, ∞) | 结算次数的确定函数(零随机) | -| 当前拍 | beat | enum | pattern 元素 | 本结算该单位的行动内容 | - -**死亡口径(2026-09-09 用户拍板 A"死亡即不动手")**:轮到该单位行动时**仍存活**才行动并推进;在轮到它之前被击杀 → 本拍不打、步数**冻结**(死亡即退场,MVP 无复活 → 永久冻结,随 battle_over 消亡);行动完成后才死 → 已行动已推进。**同步性质(定理)**:同种单位同指环首、每结算各恰推进一次(B1 义务①)→ 存活者**永远同拍**——任何死亡时序都不会让幸存者乱拍。 - -**Output Range:** 指针恒 ∈ [0, 环长);环长 1(grub)退化为恒等。**极端**:heavy 拍前被杀 → 重击永不兑现(冻结于该拍)——玩家"抢在重击前击杀"的读怪收益由此产生(P1)。 -**Example:** ambusher:结算 1 攻击(p→1)→ 结算 2 蓄力空拍(p→2)→ 结算 3 前被主角击杀 → 重击不兑现、指针冻结于 2。若结算 3 行动后才死 → 重击已兑现、p 回绕 0。 -**边界注记:** 归 B2——指针所有权、存活校验、冻结不变式、环首初始化、跨轮跨图延续。归 B1——死亡判定时机、结算内先后次序、每结算恰一次推进(义务①)。 - -### F2 攻击行为的裸伤害构成(raw_attack_damage)——敌人一下打多少的两块拼图 - -``` -attack 拍:D = atk + m_amb × L (基线 + 伏击附加;m_amb = StatusEffectTable.ambush.magnitude,provisional 3) -heavy 拍:D = atk × heavy_multiplier + m_amb × L -charge 拍:D = 0 (不读伏击池——空拍零兑付) -``` - -**合成序钉死**:伏击附加是**后置加法**,不进倍乘——ambusher(atk=4, mult=2)heavy 拍 L=4(cap=4 默认下游戏态上界,判别非平凡:20 ≠ 32)→ **4×2 + 12 = 20**,不是 (4+12)×2 = 32。〔2026-09-09 full 评审更正:原示例 L=5 超出默认 cap 游戏态域〔L ≤ min(雷数, cap) = 4〕,改为域内判别值;query_attack 的 L 为调用方注入的判别探针、B2 不校验其游戏态域〔游戏态域由 F3 预截流承载〕——探针取值与游戏态域分离,实现期若给 query_attack 加 L 域守卫须回改 AC-7。〕**池共享不消耗**:同一结算多个敌人的攻击各自读**同一个** L(共享、非均分、非先到先得);层数扣减唯一入口 = B3 轮末衰减(dur=1 轮末全清)。**分量供给建议**:B2 向 B1 供 (基线, 伏击) 二元组而非合后标量——结算明细"伏击 +N"的 P2 归因行需要分量边界。 - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 攻击基线 | atk | int [0,999](快照) | EnemyTable 行值 | 0 合法(纯伏击伤敌种) | -| 重击倍率 | heavy_multiplier | int [1,16](快照) | 仅 heavy 拍消费 | 无 heavy 拍不读(非校验项) | -| 伏击层数 | L | int [0, min(雷数, cap)] | 兑付时读值(B1 经 query_active) | dur=1 → L = 本轮受理授予数,无跨轮存量 | -| 伏击量纲 | m_amb | int flat ≥1;provisional 3 | B3 行值(**量纲 = 主角 HP 点数,本 GDD 定稿**) | 锚验收归 B4/B1 | - -**Output Range(默认表值——cap/atk/m_amb/mult 调参后随之重算)**:grub attack ∈ [4, 16];ambusher attack ∈ [4, 16]、heavy ∈ [8, 20]、charge ≡ 0(cap=4 封顶 L=4)。**极端**:charge 拍零兑付 → 蓄力轮授予的伏击层当轮**全部蒸发**(合法推论,反向 = 读怪奖励:"蓄力拍前放心贪雷"——已登记 D5 教学条目);无负值分支(clamp/地板归 B1)。**量级注记补正(2026-09-09 full 评审)**:"L≥2 伏击分量过半"仅 **attack 拍**成立(6/10);heavy 拍因基线 ×mult 过半点后移(6/14 < 半)——支配边界 L* = ⌈atk×mult/3⌉ 与"过半"口径按拍别分别读取。 -**Example:** grub(atk=4)本轮开雷 3 颗 → D = 4+9 = **13**;满编 3 grub、L=4 → 各 4+12=16、合计 48(伏击分量 36)。 -**边界注记:** 归 B1——L 读值、clamp/负值/溢杀、hero 侧减伤合成次序、死亡判定与"这一下是否兑现"。 - -### F3 伏击授予与溢出(ambush_grant_overflow)——一轮踩 N 颗雷,敌人实际吃几层 - -``` -granted_r = min(当轮新开雷数, cap) —— cap 判定在授予前(B1 预截流) -overflow_r = 当轮新开雷数 − granted_r —— 每颗溢出雷一行"溢出未生效"明细(含来源) -L_r = granted_r —— debuff 只活一结算:当轮兑付一次、轮末全清、无跨轮存量 -``` - -**守恒**:granted + overflow = 当轮雷数,零静默蒸发(P2)。**cap=4 默认(2026-09-09 用户拍板)**:绑定阈 = 单轮 5–8 雷的灾难轮——反灾难护栏定位;溢出协议获得真实消费域(旧默认 8 = min(雷数≤8, 8) 恒等式 → 溢出协议死码,已废弃)。**max_stack=16 结构不可达验证**:单轮 L ≤ min(8, cap=4) = 4 < 16,且 dur=1 无跨轮存量 → B3 满层拒绝对 ambush 行**双重不可达**(M=16 是死护栏非死字段)。重验触发(2026-09-09 full 评审修正):ambush.duration ≥ 2 ∨ AP 经济改动 ∨ **ambush 新增非 mine_hit 授予源**(原"cap 域漂移 >16"在 schema 域 [0,16] 内为死条款,替换——不可达性实际由 dur=1 ∧ AP≤8 承载、与 cap 无关;旗源授予不计入 mines_r、cap 预截流漏账,L 可达 16 触发 B3 满层拒绝、与 F3/B3 双溢出协议冲突——OQ6 标错惩罚采纳时强制重验)。 - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 当轮新开雷数 | mines_r | int [0, 8](结构界 = AP) | round facts 经 B1 收集 | 复开不可能(A2 棋盘面语义) | -| cap | int [0,16](行值 knob) | 默认 4 | 0 = 该行敌种免疫伏击(全溢出可见) | F1 条款 3 供给值的来源字段 | -| granted_r | int [0, 4] | B1 编排期逐雷 apply_effect | 每雷恰一次转化(义务②) | -| overflow_r | int [0, 8] | 明细行数 | 呈现归 B5/D1(义务⑥) | - -**Example:** cap=4、开雷 6 → 授 4 层 + 2 行溢出;本结算每个攻击行为 +12。cap=0 → 全溢出、伏击全无效但全部可见。 -**边界注记:** 归 B1——预截流编排、授予次序(行主序雷格序为建议序)、每雷恰一次、溢出行协议。 - -### F4 条款 3 供给口径(clause3_supply)——B2 交给 B1 对账的是什么(2026-09-09 用户定稿) - -**用户原话转写**:"不设(每战)上界——踩雷的 debuff 只存在一回合:在一次结算中有效,之后就没有 debuff 了。" - -``` -每结算敌方伏击暴露(精确式)= k × L × m_amb (k = 本结算存活敌中攻击/重击拍的单位数,确定性可算) -每结算结构上界 = unit_count × min(AP 上界, cap) × m_amb - (cap > AP 界时 cap 腿松弛——默认 3×min(8,4)×3 = 36;cap≥8 时真可达上界 72 而非 144。2026-09-09 full 评审收紧) -跨结算累计 = 轨迹量,非表值、不设上界 —— dur=1 每结算清零,无存量累积;战斗再长不叠加同一层 -``` - -**口径依据**:debuff 单结算寿命 = 自然边界(用户定稿)——B1 对账取"每结算"口径即可闭合,无需战斗长度假设。**B3 红警闭环**:ambush 量纲已由 F2 供给(registry OQ2 关闭条件);条款 3 **左臂**(安全格 buff 当量)载体 = 主角基础攻击(2026-09-11 用户裁决后恒在,attack_up 复活)与 B4 奖励行值——原"载体悬空(hero atk=0、B4 未设计)"口径退役(闭合回执见 registry clause3_supply,2026-09-10 B1 F4)。 - -**方向性预检(provisional,真实对账 = A1 actuals p10 + B1 归一表)**:盲猜端单格 P(雷) ≈ 0.5–0.7 量级、有信息挖掘端趋 0(A1 参考:密度 0.10 / target 0.95)——不等式的真实战场在残余盲猜集;cap=4 下右臂 = 0.64×12 ≈ 7.7;左臂按条款 2 **最低档**锚(+50pp)计 = 0.36×50 = 18——方向稳健裕度 ≈ **2.3×**。〔2026-09-09 full 评审更正:原"裕度 ≈4.7×"按左臂 +100(两层叠满)取值、与"最低档下界"语言矛盾;registry clause3_supply.direction_precheck 同步回写。〕**量级注记(支配边界)**:atk=4 时 L ≥ 2 伏击分量即过半——常态支配的修正入口 = 敌种 atk 曲线(C3 所有权)或 m_amb 锚(B4/B1 验收),本 GDD 权限外、仅登记方向;cap=4 只治尾部灾难(5–8 雷轮)。 - -### 显式排除声明(R4 式) - -| 对象 | 归属 | -|---|---| -| 伤害 clamp/地板/溢杀、乘区合成、减伤读法、死亡判定时机 | **B1** SettlementTable | -| F1 条款 3 不等式闭合对账(输入 = A1 actuals p10,非 target 参数) | **B1** 单一 owner | -| m_amb(+3)行值锚验收、weaken 档位 | **B4/B1**(A3 条款 2/3) | -| 敌种 hp/atk/pattern 曲线数值、难度修饰 | **C3** | -| 伤害道具/奖励池(hero 侧伤害来源) | **B4** | - -B2 只对"套路怎么转、一下打多少的两块拼图、一轮吃几层、交给 B1 对账的口径"负责。 - -## Edge Cases - -- **If 敌人在轮到它行动前被击杀**:本拍不打、指针冻结("死亡即不动手",F1 用户拍板 A);若行动完成后才死 → 已行动已推进(heavy 已兑现)。 -- **If 同种单位部分死亡**:存活者永远同拍(同步性质定理,F1)——幸存者轮转不受任何死亡时序干扰。 -- **If 全体敌单位死亡**:存活敌集 = ∅,"敌人全灭"成立、胜负判定归 B1;单体/AOE 无有效目标;敌侧伏击池随轮末衰减自然清空(无兑付者)。 -- **If 主角 hp = 0**:战斗失败判定素材(判定时机归 B1);battle_over → 全部单位 Despawned——不存在"主角死后敌继续攻击"的中间态。 -- **If 战斗中敌单位数 ≠ unit_count**:结构不可能(MVP 无 summon/增援/分裂)——出现即 debug 断言中止(实例不变式,B3 同款:进程致命保留给 D2 数据通道)。 -- **If 敌种行 cap = 0**(免疫伏击的合法极端):granted ≡ 0、每颗雷各一行"溢出未生效"明细(全部可见、全部无效——P2 诚实);该遭遇条款 3 右臂仅剩基线伤。 -- **If 单轮踩雷 5–8 颗(灾难轮)**:granted = 4、溢出 1–4 行;本结算每个攻击行为附加恒 +12(cap 反灾难护栏绑定域——F3)。 -- **If 全部存活敌同拍蓄力(charge 轮)**:零兑付(k=0);该轮新踩的雷照常授予、轮末照常全部蒸发(合法推论 + 读怪奖励,"蓄力拍前放心贪雷"——D5 教学条目已登记)。 -- **If 敌单位在 heavy 拍前被杀**:重击永不兑现、指针冻结于 heavy 拍——"抢杀窗口"读怪收益(P1)。 -- **If 敌种 pattern 环长 = 1(grub)**:mod 1 恒等 → 每拍 attack、无自然空窗(兑付率 ρ=1——该敌种伏击威胁无衰减节拍,量级注记见 Formulas)。 -- **If 战斗跨多张扫雷图**:单位状态(hp/指针)与敌侧伏击池**跨图延续**(战斗域,换图/刷新不清空——B3 EC8 同款);雷格兑付资格随图消亡,新图新雷新资格(A3/A2 域,B2 无从感知也无须感知)。 -- **If 战斗中热重载 EnemyTable/HeroTable**:D2 战斗中 reload 拒绝门(D2 EC8);已实例化单位不受任何表重载影响(行值快照,B3 EC9 同款)。 -- **If 行集缺行 / 请求敌种悬空**:D2 R1 实体键精确匹配 → 悬空引用**致命**(D2 Rule 6 通道);B2 无软回退(错误配置上线比崩溃更伤——P1/P2 信任底线)。 -- **If 遭遇坐标越界(level_index < 1 / node_depth < 0)**:D2 R1 前置守卫致命(D2 EC14)——B2 不自行 clamp。 -- **If unit_count = 1**:固定顺位顺延与 AOE 分流无消费者(Rule 7 空转)、AOE ≡ 单体——合法退化,非错误。 -- **If 主角 hp 入参越界(> max_hp 或 ≤ 0)**:拒绝实例化(false + debug 诊断,承 A3 拒绝口径;进程致命保留给 D2 数据通道)——编排方供给异常显式暴露,不静默吸收。 -- **If 同结算内"踩雷授予"与"敌攻击兑付"的先后**:授予在编排期先于兑付 → 本轮踩的雷当轮即兑付(若该轮有攻击拍);**读值语义半句归 B2**(AC-7 腿4——无内部缓存、无时间维度)、**次序半句归 B1**(义务①②编排域——qa-lead 🔴-4 切分)。 - -## Dependencies - -**Upstream(hard)**:D2 数据配置——EnemyTable schema + 双敌种行回填(本 GDD 为回填 owner)+ **HeroTable 新增**(走 D2 接口漂移规则回写其 Core Rules 表清单)+ ConfigDB 单点读取(R1 行解析)。无其他玩法上游;A2/A3/A1 的事实均经 B1 结算编排转化(零直接接口)。 - -**Downstream:** - -| 依赖方 | 性质 | 接口 | -|---|---|---| -| B1 | **hard(provisional——B1 未设计)** | 单位状态查询/受击/推进接口 + **B1 侧义务清单 6 项**(Detailed Design 节,缺项即 blocking——B3 对 B1 登记先例):① 推进每结算恰一次 ② 雷→伏击恰一次 ③ clamp/死亡时机成文 ④ 条款 3 对账(cap 表值 + 量纲 + A1 actuals p10)⑤ 默认目标/AOE 分流 ⑥ 溢出行协议 | -| C3 | soft(**provisional**) | 难度修饰施加点/算式;EnemyTable/HeroTable 曲线数值调参所有权(MVP 默认值全部 provisional——A1 参考行先例);多敌种同深度选择规则共裁 | -| C1 | soft(**provisional**) | 遭遇构成(战斗触发、(L,D) 供给、unit_count 覆盖语义);跨战斗 HP 持久性(归 C1/C2 域) | -| B3 | 相邻(**零运行时依赖**——验收锚关系非依赖边,B3 先例同款) | ambush 量纲/作用域验收锚已由本 GDD 兑现(F2);side-wide MVP 兼容(B3 接口零变更);**target_ref 扩展位义务**(首个单体效果上线时补列) | -| B4 | soft(**provisional**) | 伤害道具默认目标消费(固定顺位);伏击清单扩展联动(新增 mine_hit 行时本 GDD 同步修订);B4 道具/增益 = 基础攻击之外的规划面伤害(2026-09-11 裁决后非唯一来源);attack_up 消费面 = 主角先手攻击(Rule 9) | -| D1 | soft | **视觉推测型呈现义务 4 项**(Detailed Design 节,缺项即 blocking):图像线索清单成文(含预告时序 + 强度档位说明)/ 映射全局恒定(跨 run 禁重掷)/ 顺位与存活可读 / 敌方 side 池呈现口径 | -| B5 | soft | 行为环视觉状态表现(蓄力姿态等);结算明细敌方行呈现(数据源 = B1 流水) | -| D5 | soft | 读怪教学 + "蓄力拍前放心贪雷"教学(charge 轮蒸发涌现素材)——垂直切片期 | - -**双向一致性核对**(systems-index 依赖分层表):B2 ← D2 ✅(索引仅此一条硬边,其余为事实读取不列边——D2 注记口径);B1 ← …B2 ✅ · C3 ← D2,B2 ✅ · C1 ← C2,C3,B2,B4 ✅。**两条修订注记**:① **B3 单敌假设回验结果 = 不成立(定多敌)**——触发 B3 预登记的接口漂移条款("定多敌即触发 target_ref 接口漂移补列"):registry `status_effect.single_enemy_assumption` 注记更新 + systems-index 门禁记录登记(Phase 5b/5d 执行;B3 GDD 正文不改,以其"以 registry 为准"先例承载);② 索引 B2 行描述为窄口径("敌人类型/词条、目标选择规则"),Phase 5d 更新进度行时补 CD 门禁扩容身份(战斗单位系统)。 - -## Tuning Knobs - -| Knob(表行值,D2 承载) | 默认 | 调过高 | 调过低 | -|---|---|---|---| -| EnemyTable.unit_count | 1(provisional) | 同步轮转下**齐射爆发**(全攻轮 side 伤 ×N,非平滑) | =1 时 AOE 分流/顺位顺延零消费者(Rule 7 空转) | -| EnemyTable.hp | 18(provisional,出处待查) | 战斗拉长 → 伏击跨轮累计放大 | 秒杀级 → 惩罚无兑现窗口、伏击机制名存实亡 | -| EnemyTable.atk | 4(provisional,出处待查) | 伏击稀释 → 踩雷无感(P3"风险与收益同源"断) | 支配边界 L*→1,惩罚接管战斗、敌种属性被 C3 曲线稀释 | -| EnemyTable.heavy_multiplier | 2(provisional) | heavy+伏击同拍成秒杀拍(读怪规避价值升、容错归零) | =1 时 heavy ≡ attack、三拍环退化两拍(读怪素材坍缩) | -| EnemyTable.advantage_per_round_cap | **4(本 GDD 定稿)** | →8 时溢出协议死码回归、支配区扩大、条款 3 右臂膨胀 | ≤2 时 cap 常态绑定 → 边际惩罚归零("再多踩也不痛")、溢出行噪音、P3 归因梯度塌陷 | -| HeroTable.max_hp | provisional(出处待查) | 容错升、治疗道具贬值 | 灾难轮秒杀感(与 cap 交互) | -| HeroTable.atk | 6(原型锚,provisional 归 C3;**域 [1,999]、0 加载拒绝**——2026-09-11 用户裁决) | 击杀预算贬值 → 道具供给/敌 hp 曲线联动重算(C3,禁止独立调参) | 战斗拖长、基础攻击存在感稀薄(道具侧支配) | - -- **非 knob(结构冻结)**:行为枚举七类封闭(扩展 = GDD 修订非调参)、死亡即不动手、先作用后推进、伏击池共享读法、合成序后置加法、伏击量纲 = HP 点、固定顺位规则、每行集恰一敌种、零随机——修订走本 GDD 流程。 -- **Knob 交互**:cap × atk(支配边界 L* = ⌈atk×mult/3⌉ 联动)**禁止独立调参**——联动评估归 B1 条款 3 闭合对账;unit_count × cap(单结算上界双线性);heavy_multiplier × atk(heavy 拍支配)。pattern 内容(环长/charge 占比 → 兑付率 ρ)属内容行调参,所有权归 C3。**零伤害死局组合护栏(2026-09-09 full 评审登记,OQ9;2026-09-11 收窄)**:hero atk=0 已被 HeroTable schema 域下界杜绝([1,999],0 加载拒绝——2026-09-11 用户裁决),"全场恒零伤害、战斗永不定局"结构不可能;残余退化 = 行 atk=0 且 cap=0 → **无威胁敌**(战斗可胜但零风险——内容调参禁区注记,非死局);跨表量级护栏(atk×mult 上界 vs max_hp 域)owner = 实现期 ADR/D2 不变。混编遭遇(多敌种同战斗)下 side 池 cap 取哪行值未定义——当前结构(每行集恰一敌种)恒单行值,混编引入时随 OQ7 改键一并裁决。 -- **调参所有权注记**:MVP 全部默认值 provisional,曲线数值归 C3(A1 参考行先例);B1 条款 3 对账落定前,cap 与伏击量纲相关联调须重跑方向性预检并同步 registry(接口漂移义务)。 - -## Visual/Audio Requirements - -B2 无自有渲染面——视觉义务是**数据供给与规格锁定**,呈现归 D1/B5;但视觉推测型决策使本节的规格部分成为**承重项**(意图可见性的全部落点在图像线索): - -1. **敌种视觉身份(形状双通道)**:双敌种剪影必须一眼可辨(视觉锚 2:形状+颜色双通道,色弱可用性);敌种形态承载强度档位直觉编码("大个子多半有重击"式——Rule 8② 的呈现侧)。 -2. **行为环视觉状态(承重规格)**:每个敌种的每类行为(attack/charge/heavy)对应**恒定且互异**的视觉状态——ambusher 蓄力拍 = 可辨识的蓄力姿态;映射**每 run 恒定、禁止重掷**(Rule 8③ 护栏;线索清单成文义务 = D1×4①,art-bible 形状+色相双通道约束)。MVP 敌种视觉状态清单:grub 1 态(攻击)、ambusher 3 态(攻击/蓄力/重击)。**存活意图态之外,资产需求下限另含三类(2026-09-09 full 评审 blocking ⑦ 补齐)**:受击反馈(多敌同屏归因"谁挨了打"的 P2 前提——两敌种可共用通用受击反馈一组,须显式登记)、死亡表现("重击被掐灭""抢杀窗口"兑付可见性是 P1 兑付点——死亡瞬间须可辨识、不得直接消失)、顺位标记呈现元素(数据面 = B2 顺位查询;资产与呈现归 D1×4③、**同等 blocking**)。以上合称资产需求下限——D1/B5 照单生产,不得隐式缺席。 -3. **单位呈现数据供给**:hp/max_hp(血条数字)、顺位(固定顺位目标的可读前提,D1×4③)、存活态、当前拍视觉状态——数据源 = B2 单位状态查询(经 B1 编排流水)。 -4. **敌方增益呈现**:伏击池层数的 HUD 呈现口径(D1×4④——数据源 = B1 流水经 B3 投影);结算明细敌方行使用**分量二元组**("攻击 13 = 基线 4 + 伏击 9",F2 供给建议)——P2 归因的敌侧兑付面。 -5. **视觉锚适用与双舞台陷阱**:血条/伤害数字暗色底高对比(锚 1);**B2 无棋盘渲染面**——敌单位出现在棋盘上还是独立战斗场景 = B5 前的"战斗表现美术测试"锁定(game-concept 双舞台资产管线陷阱),B2 只锁上述数据面与状态清单,不预设舞台。**敌人层绘制优先级(2026-09-09 full 评审增补)**:锚 3 优先级表(数字>小人>旗>变异纹理>底色)不含敌单位——art-bible 创建前须裁决敌人层插入位置(姿态精灵与数字/旗/小人的遮挡关系),随"战斗表现美术测试"一并锁定;否则"哪些数字可信"的心智模型分裂。 -6. **音频**:MVP 无需求(攻击/死亡/蓄力音效归 D4 Alpha;临时 SFX 随垂直切片——AD 项先例);蓄力拍的音频前摇是"读招"的潜在第二通道,登记为垂直切片可选项(非 MVP 义务)。 - -> 注:`art-director` 未经咨询——Lean 模式(仅 D/H 两节委托专家),生产前请人工复核本节与 art-bible 的一致性(art-bible §1–4 须在 D1 GDD 前创建——索引既有排期义务,本节线索清单是其输入之一)。 - -## UI Requirements - -B2 不拥有 UI,有三项呈现义务(均为已登记义务的数据面):① 敌单位 HUD(血条/顺位/姿态——D1×4③);② 结算明细敌方行(分量二元组 + 伏击溢出行——B1 义务⑥协议、B5 呈现);③ 教学口径(读怪 + 蓄力贪雷——D5)。**MVP 无敌图鉴/敌人列表 UI**(敌种名录 2 个、学习成本内);名录扩展时再议(垂直切片)。 - -## Acceptance Criteria - -> **测试载体与注入口径**:B2 是单位层纯逻辑类——非 autoload、无场景依附、无自有渲染面。冒烟载体 = `godot --headless --script`(承 D2 冒烟框架;脚本 extends SceneTree 以获得 quit(code)、ConfigDB autoload 由脚本显式实例化)。单位容器与两表 schema 经 **class_name 直引实例化**(每用例全新实例、无跨用例状态——B3/A4 直引先例同款;AC-17 扫描对该实例化路径豁免)。B1 未实现(设计顺序第 9 位),冒烟**直接驱动 B2 最小 API 面**(B3"直接驱动最小 API 面"先例)——冒烟脚本扮演编排方,按"实例化 → 查询 → 受击 → 推进 → 消亡"的结算编排序列驱动;B1 就绪后改走真实调用方(结算编排),断言口径不变。 -> **API 面(provisional,封闭枚举——实现期 ADR 定名)**:`spawn(level_index, node_depth, hero_hp) -> bool`(解析遭遇行 → 行值快照 → 实例化 `unit_count` 个敌单位〔行主序生成序〕+ 主角〔hp 入参,MVP 冒烟以 max_hp 入参——Rule 9〕)· `query_alive(side) -> Array`(side ∈ {hero, enemy};生成序稳定枚举)· `query_beat(u) -> String`(当前拍 ∈ pattern 元素;**Dead 句柄保留只读可查**——冻结不变式的观测量;**hero 句柄 → 空 + 诊断**——主角无行为环〔Rule 4,2026-09-09 full 评审 blocking ⑧〕)· `query_attack(u, L, m_amb) -> {baseline, attach, total}`(F2 分量供给面;L/m_amb 由调用方供值 = B1 兑付读值的冒烟等价——B2 对 B3 **零运行时依赖**的边界由此保持;**L 为判别探针入参、B2 不校验其游戏态域**〔游戏态域由 F3 预截流承载〕;Dead 句柄 → {0, 0, 0} + 诊断)· `apply_damage(u, n) -> bool`(受击上报;hp 递减、floor 0 → Dead;**n ≤ 0 → false + 诊断**——无伤害作用非法)· `advance(u) -> bool`(存活才推进——"先作用后推进"的推进半;**false 分两级**:存活校验失败 = 轮到前被杀的**预期冻结、无诊断**〔EC1 常态路径——抢杀窗口是设计卖点,诊断刷屏会淹没信号〕;相位/句柄失效 = **false + 诊断**;**hero 句柄 → false + 诊断**)· `default_target() -> u|null`(固定顺位供给面)· `ambush_grant_plan(mines_r, cap) -> {granted, overflow}`(F3 机制算术纯函数——B1 预截流编排的消费面)· `despawn_all() -> bool`(battle_over 消亡)。**全部布尔/计数返回 = 受理/拒绝**(A3 全 API 布尔口径同款)——"拒绝"直接断言返回值,附 debug 诊断、非进程致命(承 A3 拒绝口径;进程致命保留给 D2 数据通道)。五个 query 面(query_alive / query_beat / query_attack / default_target / ambush_grant_plan)只读、无副作用。**封闭枚举即负空间验收形态**:无 summon/增援 API(EC5 负空间——战斗内不增员)、无复活 API(Dead 不可逆)、无重置/换图 API(EC11 跨图延续的结构前提)、无伏击池写 API(B2 无池——L 恒由调用方注入,EC17 读值语义);新增上述任何入口 = 接口漂移(GDD 修订非调参)。**ADR 前置裁决项**:`query_attack` / `ambush_grant_plan` 两 face 若实现期裁决归 B1(F2"供给建议"与 F3"预截流归 B1"边界注记存在张力),对应 AC 腿迁移至 B1 冒烟、断言口径不变(Open Questions①)。 -> **时序口径**:B2 无结算 API——"一次结算"在冒烟中 = 调用方对每个存活**敌**单位**恰一次** `advance`(含兑付读值与受击注入)的构造窗口〔主角无行为环、不在推进域内——Rule 4;2026-09-09 full 评审 blocking ⑧ 更正,原"每个存活单位"字面含主角、照做即环长取模除零〕——"每结算恰一次推进"是 B1 义务①,冒烟以构造序保证前提、不断言编排正确性;"轮到该单位之前被杀"在冒烟中 = 同一构造窗口内 `advance(u)` 之前的 `apply_damage(u, …)`。多步 GIVEN 均给出构造序列。 -> **只读观测量**:敌单位投影七字段 `enemy_id` · `hp` · `max_hp` · `atk` · `heavy_multiplier` · `pattern`(快照)· `advantage_per_round_cap`(快照)+ `beat`(当前拍)+ 存活态;hero 投影 `hp` · `max_hp` · `atk`。**相位无字段观测量**:Alive/Dead 由 query_alive 成员差分推断(Dead 句柄经 query_beat 冻结值可读);Despawned = **逻辑失效态**(状态位实现——容器为 RefCounted 纯逻辑类、对象不提前释放;失效句柄上查询返回空 + 诊断、作用接口拒绝〔AC-6 同款〕;瞬态纪律同 A3 RoundEnd);Unspawned 无观测量。**投影一律为快照**(pattern 等引用字段返回拷贝——原地改写返回值不影响容器,AC-11 腿 3);容器公开可写属性为零(hp 等仅经 apply_damage 变更——AC-17 扫描域)。〔2026-09-09 full 评审:原"销毁态不可观测"与 AC-6"query_beat 返回空 + 诊断"不可同真,统一为逻辑失效口径,防实现者走 Node + free() 路线〕实例不变式(hp ∈ [0, max_hp]、敌单位数 = unit_count、指针 ∈ [0, 环长))为 debug 断言自守——**违规路径不可由封闭 API 构造**(负空间),不经冒烟断言(进程致命保留给 D2 数据通道,States 节口径);其行为级证据 = AC-1(数)、AC-3(指针)、AC-4/AC-6(hp floor)。 -> **期望值推导纪律**:`hp`(18)/`atk`(4)/`heavy_multiplier`(2)/`unit_count`/`max_hp` 均为 provisional knob(Tuning Knobs 节)——各 AC 的 THEN 具体数值按**当前 ConfigDB 表值推导、不写死**(正文以 `h_g`/`a_g`〔grub 行〕、`h_e`/`a_e`/`m_e`〔ambusher 行〕、`u_c`、`M_h`、`c_r`〔所在行 cap〕、`p_g`/`p_e`〔pattern 表读值〕、`m_amb` = StatusEffectTable.ambush.magnitude 表读值〔仅作 AC-7 注入值来源〕等记号书写);`pattern` 环内容属内容行调参(C3 所有权)——轨迹断言一律按 p 表读值推导。**结构字段定值断言合法**:敌种 id 集 {grub, ambusher}(Rule 3 MVP 收窄定稿)、pattern 元素域 {attack, charge, heavy}(枚举封闭)、每行集恰一敌种、HeroTable 单行、HeroTable.atk 域 [1,999](0 加载拒绝——2026-09-11 用户裁决;MVP 值 6 provisional 不作定值断言)。L / mines_r / n 等入参为构造选择(显式登记),期望值由表读值推导。 -> **夹具策略**:① **默认根**(干净检出:EnemyTable 双敌种行 + HeroTable 单行)承载全部分支行为 AC;**行集登记常数协议**(A1 黄金向量 / A2 板登记同源):(L_g, D_g) = grub 行坐标、(L_a, D_a) = ambusher 行坐标,逐坐标手工推导记录入版本库;失效处置 = 先复核登记、登记无误即实现缺陷。② 根 `enemy_multi_unit`:D2 全表清单拷贝 + EnemyTable 仅将 **(L_a, D_a) 行(ambusher——三拍环)** `unit_count` 置 3(其余字段域内合法;**登记值 u_c_f = 3**)——承载多敌 AC。〔2026-09-09 full 评审 blocking ③ 更正:原改 (L_g, D_g) grub 行——环长 1 恒 attack,AC-9 混合拍 GIVEN 不可构造、AC-5 同步断言零判别力、AC-7 腿 4 双单位读值不可构造,三处死测试;改 ambusher 行后混合拍经对单单位重复 advance 构造(冒烟构造序可越出"每结算恰一次"契约——B2 无守卫、构造自由度成立)〕**显式声明:夹具值非 MVP 内容调参结论**(Tuning Knobs 默认 unit_count = 1——多敌语义在默认根上零消费者,本根是 Rule 2 的测试承载,仅供冒烟)。③ 根 `enemy_reloaded`:D2 全表清单拷贝 + EnemyTable 数值漂移(**登记:hp/atk/advantage_per_round_cap 各 +1、pattern 不动**——快照差分判定用)——服务 AC-11;换根加载经 `load_tables(root, collect_only=true)` 直调(**非 D2 `reload()` 路径**:不过 set_reload_gate、不发 config_reloaded——门语义归 D2 AC-16/B1,B3 AC-15 同款)。④ **致命根 ×2**(独立进程,manifest 见下):`enemy_rowset_dup_species`——D2 全表清单拷贝 + EnemyTable 默认行 + **追加一行与 (L_g, D_g) 行同 (level_index, node_depth) 而 enemy_id 相异**("grub_twin",其余字段域内合法)→ **每行集恰一敌种违规**,B2 表结构致命校验的进程级落点(B3 `status_effect_dup_key` 同型);`enemy_pattern_reserved`——D2 全表清单拷贝 + EnemyTable (L_g, D_g) 行 pattern **追加预留值 "guard"**(其余合法)→ **pattern MVP 校验域拒绝预留值**(Rule 4 fail-fast,A1 solver_rules 冻结先例)的 loader 集成缝落点。⑤ **HeroTable 可选根** `hero_extra_row`(HeroTable 置两行、域内合法——单行全局违规):单行校验落点若实现期 ADR/D2 裁定在 loader 缝则启用(manifest 行 `hero_rows>1→≠0`),否则程序构造承载(AC-13)——**可选、两处恰一承载**。⑥ **程序构造**(AC-12/AC-13):两 schema 类 class_name 直引实例,不经 `load()`/`preload()`。行为夹具根(②③)经 `--data-root=` 注入(仅 debug、不入 `data/tables/`——D2 夹具纪律);各 AC 声明其表根,用例间无顺序依赖。 -> **致命类收窄豁免与 runner manifest**:B2 冒烟设**恰两根致命夹具**(上列④——均为 B2 表特有校验类别):runner manifest 退出码行 `rowset_dup→≠0` · `pattern_reserved→≠0`(独立 headless 进程、游戏通道,D2 AC-2b 协议同型)——"游戏内真的会死"在本表两类别上的落点由此实证;其余致命类别(**D2 R1 悬空敌种/行集缺行〔EC13〕、遭遇坐标越界〔EC14〕、通用枚举域/域校验**)由 D2 AC-2 同类别 loader 级夹具承载(表无关,豁免声明收窄保留——B2 冒烟仅以合法坐标驱动 spawn);HeroTable 单行类别条件性(⑤);schema 侧以程序构造断言域类别(AC-12/13)。每用例先 `reset_diagnostics()`(D2 冒烟协议,全局声明)。 -> **覆盖声明(out-of-scope)**——下列各项不在本冒烟域,deferral 以 **Dependencies 节 B1×6 义务清单 + D1×4 义务清单**为生效条件(两清单均"缺项即 blocking",生效条件成立):**B1×①** 行为环推进每结算恰一次与结算内先后次序(double-advance 无守卫——冒烟单调用方次序即构造序,B3 义务⑥同款);**B1×②** 雷→伏击事实转化恰一次 + 编排期授予/预截流调用次序(F3 编排半、EC17"先转化后兑付"次序半句);**B1×③** 伤害 clamp/负值/溢杀语义与死亡判定时机(Rule 1 后半——冒烟只断言 hp 递减、floor 0 与 Dead 翻转,"这一下是否兑现"归 B1);**B1×④** F4 条款 3 闭合对账(cap 表值 + 量纲 + A1 actuals p10——冒烟只供分量面与 k 可算性);**B1×⑤** 默认目标消费与单体/AOE 分流(冒烟只断言 default_target 供给面);**B1×⑥** 溢出"溢出未生效"明细行协议(呈现归 B5/D1——冒烟只断言 overflow 计数会计)。**D1×①②** 图像线索清单成文与映射每 run 恒定(Rule 8 视觉面——视觉映射不可 GIVEN-WHEN-THEN,其验收形态 = 本前言映射键契约〔映射键 = enemy_id〕+ B2 侧行为级承载:行为环零随机可学〔AC-3/AC-15〕);**D1×③** 顺位与存活可读呈现;**D1×④** 敌方 side 池呈现口径(B3 敌侧延伸)。另有:**EC8 池蒸发腿**(dur=1 轮末清池——B3 AC-8/AC-9 既有覆盖,跨引不重复;B2 侧零兑付半 = AC-7 腿3/AC-9 腿1);**EC13/EC14 端到端致命**(D2 R1/EC14 既有通道——见 manifest 豁免);**Rule 10 后半**难度修饰施加点(C3 provisional——B2 以实例化后数值运作,修饰算式无表值可断);跨战斗 HP 持久性(C1/C2);曲线数值与遭遇分布定值(C3——AC-14 显式不作分布定值断言);~~atk 激活裁决(B4/B1)~~(已随 2026-09-11 用户裁决退役——基础攻击恒存在,域断言由 AC-13/AC-14 承载);Rule 8"不直接显示数值"负空间(无意图数值 API——本前言 API 封闭枚举承载)。**qa-lead 缺口预检 7 项已处置**(🔴-1/2 入 Open Questions①②;🔴-3/4 随批修正 F4 满配语境与 EC17 切分;5–7 承载于前言 ADR 裁决项/HeroTable 可选根/坐标登记协议)。 - -**生命周期与轮转** - -- **AC-1(实例化与快照基线——Rule 2/9/10;表根 = 默认根)** GIVEN ConfigDB 默认根加载完成、全新 B2 容器(Unspawned),WHEN `spawn(L_g, D_g, M_h)`(hero_hp = max_hp 表读值——MVP 冒烟口径),THEN true;`query_alive(enemy)` 恰 **u_c** 个单位(u_c = unit_count 表读值)、全部同 enemy_id、每单位投影 **hp = h_g、max_hp = h_g、atk = a_g、pattern = p_g、cap = c_r**(行值快照五字段逐一 = 表读值——Rule 10 授予时快照基线);`query_alive(hero)` 恰 1、hp = 入参值;`query_alive(enemy)` 投影序 = 行主序生成序(默认根 u_c=1 时平凡,多敌序断言由 AC-5 夹具根承载);WHEN Alive 相位再 `spawn(同坐标, M_h)`,THEN **false + 诊断**、容器不变(相位守卫——B3 EC11 输入×相位矩阵同款)。 -- **AC-2(主角 hp 入参守卫——EC16;表根 = 默认根)** GIVEN 默认根、全新实例,WHEN `spawn(L_g, D_g, hero_hp)` 分别取 hero_hp ∈ {M_h+1, 0, −1}(越界三腿:> max_hp / ≤ 0——EC16 口径),THEN 均 **false + 诊断**且 `query_alive` 双侧恒空(**拒绝原子性:无半实例化**——失败腿不留任何单位);WHEN `spawn(L_g, D_g, 1)`(域内下界合法值),THEN true——越界拒绝精确以域为界、不扩大拒绝域(编排方供给异常显式暴露、不静默吸收)。 -- **AC-3(F1 轮转主式 + 环长 1 恒等 + 跨图延续结构裁决——Rule 4、EC10、EC11;表根 = 默认根)** GIVEN `spawn` 完成(ambusher 坐标 (L_a, D_a))。腿 1(环首初始化):`query_beat(u)` = **p_e[0]**(战斗开始指向环首)。腿 2(推进与回绕):连续 `advance` → 均 true 且 beat 轨迹 = **p_e[k mod |p_e|] 逐拍断言**,|p_e| 次后回 p_e[0](环尾回环首——指针恒 ∈ [0, 环长) 的行为级证据)。腿 3(环长 1 恒等,grub 坐标):连续 3 次(构造选择)`advance` → beat **恒 = p_g[0]**(mod 1 恒等——每拍 attack、无自然空窗,兑付率 ρ=1 的行为级形式;**前提 |p_g| = 1 按表读值核对**——pattern 内容属 C3 内容行调参,前提不满足时本腿显式 SKIP、不假失败〔2026-09-09 full 评审,AC-4 同款〕)。腿 4(跨轮跨图延续 + 无重置入口,EC11):任意长的 advance/受击序列后,hp 与 beat 投影 = 驱动序列的确定函数——**除 `despawn_all` 外无任何 API 入口使单位状态重置**(结构性裁决;"换图"事件对 B2 不可观测(零接口),端到端"真实换图下单位状态延续"归 B1 集成(编排契约:仅 battle_over 调 despawn——B1 API 合规半句,非新增义务,B3 AC-10 裁决同款)。 -- **AC-4(死亡即不动手 / 已行动已推进——EC1、EC9;表根 = 默认根,前提按 p_e 表读值核对:|p_e| ≥ 3 且 p_e[1] = charge 且 p_e[2] = heavy**——默认表值满足;pattern 内容属内容行调参〔C3 所有权〕,前提不满足时本 AC 显式 SKIP、不假失败〔2026-09-09 full 评审更正:原"结构定值满足"与期望值推导纪律自相矛盾〕)** 腿 1(heavy 拍前被杀):构造推进至 charge 拍(beat = p_e[1]),WHEN `apply_damage(u, h_e + 5)` → true、hp 投影 = **0**(**溢杀 floor:hp ∈ [0, max_hp] 不变式自守**——clamp/溢杀语义归 B1×③ 的声明不变);WHEN `advance(u)` → **false(预期冻结级——无诊断,API 面两级 false 口径)**,且 `query_beat(u)` **仍 = p_e[1]——冻结于 heavy 前一拍,重击永不兑现**("死亡即不动手"+"抢在重击前击杀"读怪收益的行为级证据)。腿 2(行动后才死):新实例构造至 heavy 拍(beat = p_e[2]),`advance(u)` → **true**;随后 `apply_damage(u, h_e)` → Dead,`query_beat(u)` = **p_e[0]**(**已行动已推进**——heavy 拍已消费、指针回绕)。腿 3(不可逆):对 Dead 句柄 `apply_damage` → **false + 诊断**(MVP 无复活——States 不可逆)。 -- **AC-5(多敌同步轮转与同步定理——Rule 2、EC2;表根 = `enemy_multi_unit`,u_c_f = 3 夹具登记值〔ambusher 行,2026-09-09 full 评审 blocking ③〕)** GIVEN 夹具根 `spawn(L_a, D_a, M_h)` 完成。腿 1(同拍基线):spawn 后三单位 `query_beat` **恒等**(同种同指环首、同属性)。腿 2(死亡时序不乱拍):定义结算步 = 按生成序对各存活**敌**单位 `advance` 恰一次(B1 义务①的冒烟构造等价——hero 无环、不在推进域,Rule 4);在某步中于 `advance(u2)` **之前** `apply_damage(u2, h_e)` 杀之(轮到它前被杀——h_e = ambusher 行 hp 表读值)→ u2 本步不打(advance false、指针冻结);THEN 步末 `query_beat(u1)` = `query_beat(u3)`,且连续多步后幸存者 beat **恒相同**(**同步性质定理——任何死亡时序都不会让幸存者乱拍**,F1)。腿 3(单位数单调递减):全程 `query_alive(enemy)` 规模 ∈ {3, 2, 1} 严格递减、无增员(EC5 负空间的行为面——无 summon API)。 -- **AC-6(死亡状态机与全灭消亡——Rule 1、EC3、EC4;表根 = 默认根 + AC-5 根)** 腿 1(全灭,EC3):u_c 个单位逐一 `apply_damage` 致死 → `query_alive(enemy)` = **空 Array**(存活敌集 = ∅,"敌人全灭"成立——胜负判定归 B1);敌侧伏击池"无兑付者轮末清空"半 = B3 dur=1 decay(跨引 B3 AC,out-of-scope)。腿 2(主角死亡与消亡,EC4):`apply_damage(hero, M_h)` → hero hp = 0(失败判定素材——判定时机归 B1);`query_alive(enemy)` 仍含存活单位时 `despawn_all()` → true、`query_alive` **双侧空**(**全部单位 Despawned——不存在"主角死后敌继续攻击"的中间态**);Despawned 句柄上 `query_beat` 返回空 + 诊断、`advance`/`apply_damage` → false(域闭);WHEN 重复 `despawn_all()` → **false + 诊断**(重复调用守卫——B3 EC11 同款);WHEN 重新 `spawn` → true 且为新战斗(Despawned 后唯一出口——下一场重启、不跨战斗,States 表)。 - -**伤害构成与合成序** - -- **AC-7(F2 三拍构成 + 合成序判别 + charge 零兑付 + 池共享读值即时性——F2、Rule 6、EC8-B2 半、EC17;表根 = 默认根)** GIVEN `spawn(L_a, D_a, M_h)` 完成、m_amb = StatusEffectTable.ambush.magnitude 表读值。腿 1(attack 拍):`query_attack(u, L=2, m_amb)` → **{baseline = a_e, attach = 2×m_amb, total = a_e + 2×m_amb}**(分量二元组——"攻击 13 = 基线 4 + 伏击 9"P2 归因行的数据源,F2 供给建议)。腿 2(**合成序判别**;**判别非平凡前提:m_e ≥ 2**——默认表值满足;m_e = 1〔合法 knob,heavy ≡ attack〕时负断言两边恒等、本腿显式 SKIP 标记输出——B3 AC-14 腿 3 先例,2026-09-09 full 评审 blocking ②):L=4 → **baseline = a_e×m_e、attach = 4×m_amb、total = a_e×m_e + 4×m_amb**,且**判别负断言:total ≠ (a_e + 4×m_amb)×m_e**(伏击附加是后置加法、不进倍乘——默认表值 (4, 2, 3) 下 20 ≠ 32,非平凡性由表读值不等式保证;实现若把伏击分量塞进倍乘即在此暴露;L=4 为游戏态可达值〔cap=4 上界〕——探针不取域外值)。腿 3(charge 零兑付——不读池,EC8 的 B2 半):beat 推进至 charge 拍后 `query_attack(u, L=c_r, m_amb)`(游戏态上界注入)→ **{0, 0, 0}**——**L>0 下恒零 = "不读伏击池"的可判定形式**(蓄力轮授予的伏击层当轮蒸发 = 读怪奖励;池蒸发本身归 B3 decay,out-of-scope 跨引)。腿 4(共享不消耗 + 即时读值,EC17):同 L 连续两次 query 结果逐字相同;两存活单位同 L 各自 query 读值一致(共享、非均分、非先到先得;**本腿在 `enemy_multi_unit` 根承载**——默认根 u_c=1 不可构造,2026-09-09 full 评审);**每次 query 前后 `query_alive`/`query_beat` 投影零变化**(纯函数性——B2 无池写面、无内部缓存、无时间维度;"先转化后兑付"次序与每雷恰一次归 B1×①②,out-of-scope)。 - -**伏击授予与溢出** - -- **AC-8(F3 授予分解守恒 + 灾难轮 + cap=0 免疫——F3、EC6、EC7;表根 = 默认根,c_r = cap 表读值)** 全腿为纯函数断言(编排期预截流调用与每雷恰一次授予归 B1×②,out-of-scope)。腿 1(守恒主式):`ambush_grant_plan(mines_r = c_r + 2, c_r)` → **{granted = c_r, overflow = 2}**,恒等 granted + overflow = mines_r(**零静默蒸发**——P2 会计面;"溢出未生效"明细行呈现归 B1×⑥/B5)。腿 2(预截流位,参数化):对 mines_r ∈ {0, 1, c_r, c_r+1} 各腿 granted = **min(mines_r, c_r)**、overflow = mines_r − granted 恒成立(cap 判定在授予前)。腿 3(灾难轮,EC7):mines_r ∈ [5, 8](默认 c_r=4 → granted = 4、overflow = mines_r − 4——**cap 反灾难护栏绑定域**)。腿 4(cap=0 免疫,EC6):`ambush_grant_plan(m, 0)` → **granted = 0、overflow = m**(全溢出——免疫行全部可见、全部无效的会计半;cap=0 为域内合法行值的校验半归 AC-12)。 -- **AC-9(F4 k 可算性与结构上界——F4、EC8 汇总;表根 = `enemy_multi_unit`,u_c_f = 3)** 腿 1(k 确定性可算):以 advance 序构造混合拍(k 个单位处 attack/heavy 拍、其余 charge)→ 每结算敌方伏击暴露 = **k × L × m_amb**,其中 k 经只读观测量导出(`query_alive(enemy) ∩ query_beat ∈ {attack, heavy}` 计数——**确定性可算、无隐藏状态**,B2 对 B1 条款 3 的供给面);全体 charge 轮 → k = 0、暴露 = 0(**charge 轮零兑付**——EC8 汇总)。腿 2(结构上界记号):单结算 side 级结构上界 = **u_c_f × min(AP_r, c_r) × m_amb**(AP_r = ActionEconomyTable.ap_per_round 表读值;全参表读值/夹具登记值的**记号恒等式断言**——满配语境 3×min(8,4)×3=36 的记号化,默认行值 unit_count=1 下 = 12,非定值断言;min 项 = 2026-09-09 full 评审收紧——cap > AP 界时 cap 腿松弛);跨结算累计 = 轨迹量非表值——B2 投影字段无任何累计观测量(负空间,AC-1 观测量封闭枚举承载);不等式闭合对账(输入 = A1 actuals p10)归 B1×④,out-of-scope。 - -**目标选择** - -- **AC-10(固定顺位供给面——Rule 7、EC3、EC15)** 腿 1(u_c=1 合法退化,默认根):`spawn` 后 `default_target()` = 该唯一存活单位(**顺延与 AOE 分流无消费者、AOE ≡ 单体——合法退化非错误**,Rule 7 空转)。腿 2(行主序最前,`enemy_multi_unit` 根):`default_target()` = `query_alive(enemy)[0]`(**生成序最前——顺位快照 = 生成序**)。腿 3(死亡顺延):杀 [0] → `default_target()` = 原 [1](顺延);连续杀至空 → **null**(EC3 全灭腿在目标面的汇合)。B1 消费侧单体/AOE 分流归 B1×⑤、顺位可读呈现归 D1×③,均 out-of-scope。 - -**表校验与快照** - -- **AC-11(行值快照抗表重载——Rule 10、EC12;表根 = 默认根 → `enemy_reloaded`)** GIVEN 默认根 `spawn(L_a, D_a, M_h)` 完成(快照字段 = 默认表值;坐标登记协议锚点,2026-09-09 full 评审补)、存活与 Dead 单位并存。WHEN 经测试通道换根加载 `enemy_reloaded`(`load_tables(root, collect_only=true)` 直调——非 D2 `reload()` 路径,门语义归 D2 AC-16/B1),THEN 存活与 Dead 单位的**快照五字段 + beat + hp 逐字不变**、hero 投影不变(**授予时快照——实例不受任何表重载影响**,B3 EC9 / A4 EC8 同款);WHEN `despawn_all()` 后以同坐标重新 `spawn`,THEN 新单位快照 = **漂移后表值**(换根只影响后续实例化——"快照非活引用"的判别性后半)。腿 3(拷贝判别,2026-09-09 full 评审增补):对返回的 pattern 投影数组原地改写 → 容器内单位 pattern 投影不变(**快照拷贝非活引用**——别名引用在换根加载下同样"逐字不变",本腿补足判别力)。 -- **AC-12(EnemyTable schema 域校验全谱——程序构造,Rule 3/4)** GIVEN EnemyTable schema 类(行级 + 表级校验)class_name 直引实例(不经 load()/preload())。WHEN `validate()` 分别作用于越域代表值:unit_count ∈ {0, 4}、hp ∈ {0, 1000}、atk ∈ {−1, 1000}、heavy_multiplier ∈ {0, 17}、pattern 环长 ∈ {0, 9}、pattern 元素 = **"guard"(预留值拒绝——MVP 校验域 fail-fast,A1 solver_rules 冻结先例)**、pattern 元素 = "nonsense"(未知枚举)、cap ∈ {−1, 17},THEN 各含对应域错误类别(零静默);WHEN 表级构造同 (level_index, node_depth) 两行相异 enemy_id,THEN 含**每行集恰一敌种**错误类别;WHEN 作用于域内代表值:unit_count ∈ {1, 3}、hp = 1、**atk = 0(纯伏击伤敌种合法——F2 Variables)**、atk = 999、heavy_multiplier ∈ {1, 16}、pattern ∈ {["attack"], ["attack","charge","heavy"]}(环长两界)、**cap = 0(免疫极端合法——EC6)与 16**,THEN 零诊断(防过度约束锁死内容——atk=0 与 cap=0 两个合法极端是本断言承重点)。 -- **AC-13(HeroTable schema 域校验——程序构造,Rule 9)** GIVEN HeroTable schema 类直引实例。WHEN `validate()` 作用于 max_hp ∈ {0, 1000}、atk ∈ {−1, 0, 1000},THEN 各含对应域错误类别(**atk=0 拒绝 = 2026-09-11 用户裁决的 schema 承重腿——零基线死锁杜绝**);WHEN 域内代表值 max_hp ∈ {1, 999}、atk ∈ {1, 999},THEN 零诊断;WHEN 表级构造两行(域内合法),THEN **单行全局约束**错误类别(单行全局——Rule 4 豁免同 ActionEconomyTable 先例;若实现期 ADR/D2 裁决单行校验落 loader 缝,则本腿迁移至可选根 `hero_extra_row` 的 manifest 腿——前言⑤,两处恰一承载)。 -- **AC-14(MVP 内容行定值与结构断言——Rule 3/9;表根 = 默认根)** GIVEN ConfigDB 默认根加载完成。WHEN 读 EnemyTable,THEN 恰含双敌种行、**enemy_id 集合 = {grub, ambusher}(定值——Rule 3 MVP 收窄)**;每 (level_index, node_depth) 行集恰一敌种(默认根数据通过其自身表级校验的行为断言);全部行 pattern 元素 ⊆ **{attack, charge, heavy}(MVP 枚举封闭——结构定值)**;grub 行 pattern 不含 "heavy"(**heavy_multiplier 无 heavy 拍不消费**的表数据前提——非校验项、B3 max_stack 先例);display_name 双值非空(精确值不作定值断言,本地化归 D6);**遭遇分布(何 (L,D) 归何敌种)为 C3 域 knob——不作定值断言**(provisional 示例非承诺)。WHEN 读 HeroTable,THEN 恰 1 行、**atk ∈ [1,999] 域断言(MVP 值 6 = 原型锚 provisional,不作定值断言;0 = 加载拒绝——2026-09-11 用户裁决)**、max_hp ∈ [1, 999] 域断言(provisional knob 不写死)。 - -**确定性** - -- **AC-15(零随机双遍回放——Rule 4/11;表根 = 默认根)** GIVEN **全新 B2 实例 ×2**(同 ConfigDB 默认根;每遍全新实例、无跨实例状态)。WHEN 同一定长序列驱动两遍(spawn → `apply_damage`(含一次"轮到前击杀"腿——冻结路径入回放)→ 交替 `advance` 全体存活敌单位 → query 投影(含生成序与逐单位 beat)→ `apply_damage` → `advance` → `default_target` → query 投影),THEN 两遍的 `query_alive` 投影序列(**含生成序**)、逐单位 beat 轨迹、`default_target` 返回序列**逐项相同**——零随机的行为级硬证据(rng_service 流封闭;D2 AC-15 的 B2 层前身,与 AC-3 腿 4"状态 = 驱动序列的确定函数"互证)。 - -**registry 一致性** - -- **AC-16(registry 一致——Rule 6 回写义务;B3 AC-18 同型,无条件断言)** GIVEN ConfigDB 默认根加载完成。WHEN 脚本解析 `design/registry/entities.yaml` 的 `enemy` 与 `hero` 条目(**逐字段 YAML 键**——机器对账前提,action_economy/status_effect 同构),THEN:① `enemy.fields` 八键(enemy_id / display_name / unit_count / hp / atk / heavy_multiplier / pattern / advantage_per_round_cap)与 ConfigDB EnemyTable schema 字段名逐一相等、各键类型/域/枚举描述与 Schema 定稿相等(**缺任一键即失败**);② `hero.fields` 两键(max_hp / atk)同上;③ enemy 条目 MVP 内容注记物种 id 集合 = {grub, ambusher},与表行 id 集合相等(非 knob 结构定值);④ `status_effect.ambush` 条目含 **B2 量纲定稿注记**(Rule 6 兑现 B3 registry OQ2 的接口漂移回写落点——注记存在性 + 键断言;量纲活值 m_amb **不作定值对账**——knob 纪律,A4 AC-8 同款豁免);⑤ hero 条目"单行全局 Rule 4 豁免"注记与 enemy 条目"每行集恰一敌种校验"注记存在性断言。**生效前提**:本条目为本文定稿 Phase 5b/5d 回填的产物,AC 生效前提 = 回填完成(不写"若存在"软口径——条件化使一致性检查落空,B3 AC-18 同款)。 - -**静态扫描** - -- **AC-17(静态扫描——D2 AC-9/AC-10 模式引用;Rule 11)** B2 文件集(单位容器 / 两表 schema / 冒烟脚本 / 夹具规格)纳入 D2 AC-9 模式项目级扫描域:`randomize()` / `RandomNumberGenerator` / ConfigDB 外 data 表加载 / `extends Control` / `.tscn` preload——零命中(**schema 与容器的 class_name 直引实例化豁免**——AC-12/13 前提,A4 AC-7 同款);另扫 B2 特有两项:**事件订阅 API 零命中**(Rule 11 零主动事件订阅——A2 事件面 referenced_by 不含 B2 的代码侧对应)与 **B3 API 符号零引用**(相邻零运行时依赖——import/call 面为零);D2 AC-14 人工三要素字面量扫描(引用不另设硬 THEN——F2 算式 a×m + 3L 类字面量随实现形态误报率高,D2 已定性 warning 级 + 人工复核;其"零玩法数值字面量"的行为级硬证据 = AC-1/AC-7 全表读值推导 + AC-16 registry 对账)。零随机的行为级硬证据 = AC-15。 - -**覆盖矩阵(qa-lead 交付,验收评审用)** - -- Rule 1→AC-1/AC-6/AC-2(clamp·溢杀·死亡时机→OOS B1×③)· Rule 2→AC-1/AC-5/AC-9(side-wide 兼容与 target_ref 扩展位→B3 接口漂移义务随批 B1/D1,非冒烟域)· Rule 3→AC-12/AC-14/AC-13 · Rule 4→AC-3/AC-4/AC-5/AC-15(预留值拒绝→AC-12+manifest `pattern_reserved`)· Rule 5→AC-8(每雷恰一次→OOS B1×②;溢出明细行→OOS B1×⑥+B5)· Rule 6→AC-7/AC-16④(量纲锚验收→B4/B1,排除声明)· Rule 7→AC-10(消费分流→OOS B1×⑤;顺位可读→D1×③)· Rule 8→前言映射键契约(enemy_id)+AC-3/AC-15(行为环可学性承载)+OOS D1×①②、"不显示数值"负空间=API 封闭 · Rule 9→AC-1/AC-2/AC-13/AC-14 · Rule 10→AC-1/AC-11(D2 R1 解析致命→OOS D2 通道;难度修饰→C3 provisional)· Rule 11→AC-15/AC-17(调用权集中→OOS B1×①) -- F1→AC-3/AC-4/AC-5 · F2→AC-7 · F3→AC-8 · F4→AC-9(闭合对账→OOS B1×④) -- EC1→AC-4 腿1/腿2 · EC2→AC-5 腿2 · EC3→AC-6 腿1+AC-10 腿3 · EC4→AC-6 腿2 · EC5→前言 API 封闭(负空间——无 summon API 不可 G-W-T,B3 Rule 8 先例)+AC-5 腿3+AC-17 · EC6→AC-8 腿4+AC-12(cap=0 合法腿) · EC7→AC-8 腿3 · EC8→AC-7 腿3+AC-9 腿1(池蒸发腿→B3 AC 既有覆盖,OOS 跨引) · EC9→AC-4 腿1 · EC10→AC-3 腿3 · EC11→AC-3 腿4(跨图结构裁决)+AC-2/AC-6(相位重复守卫,B3 EC11 同款) · EC12→AC-11 · EC13→OOS(D2 R1 通道,D2 AC-2 同类别夹具,manifest 豁免声明) · EC14→OOS(D2 EC14 通道,同前) · EC15→AC-10 腿1 · EC16→AC-2 · EC17→AC-7 腿4(读值即时性/纯函数半)+OOS B1×①②(次序半) -- **无洞**:17 条 EC 中 EC5/EC13/EC14 三处非 G-W-T 形态,分别以 API 封闭负空间声明与 D2 通道豁免承载(B3 Rule 8 负空间 + 致命收窄豁免先例同款);其余全部映射到 AC 或显式 OOS(deferral 生效条件 = B1×6/D1×4 已登记缺项即 blocking)。 - -## Open Questions - -1. **`query_attack` / `ambush_grant_plan` 两 face 归属**(owner:实现期 ADR 定名时同步裁决;deadline:Technical Setup/实现期):B2 供给面 vs B1 编排消费——F2"供给建议"与 F3"预截流归 B1"边界注记的张力落点;裁决归 B1 则 AC-7/8/9 对应腿迁移至 B1 冒烟(断言口径不变),回写 AC 前言(qa-lead 缺口 🔴-1)。 -2. **多敌语义默认零消费者复验**(owner:C1 遭遇分布定稿;deadline:C1 GDD):默认 unit_count=1 下多敌路径仅测试根可达(死码风险)——C1 落地 unit_count>1 真实遭遇后复验 AC-5/9/10 夹具根是否升级为默认根内容(qa-lead 缺口 🔴-2);**C1 须真实消费 unit_count>1**(Boss/精英战最廉价的构成表达),且 Boss 表达不能只靠 unit_count——同种同拍 ×3 = 伤害乘法、非 Boss 幻想(2026-09-09 full 评审注记)。 -3. **条款 3 左臂载体(2026-09-09 full 评审扩项;2026-09-11 随基础攻击裁决收窄)**(owner:B1;deadline:B1 GDD 强制检查点):原"hero atk=0、B4 缺位 → 左臂(安全格 buff 当量)无伤害兑换载体 + 当前内容态结构性不可通关"事实已退役(基础攻击恒存在、attack_up 复活、B4 已设计并切片落地);残余 = 左臂**当量换算口径**(锚参照回迁 attack_up 当量——B4 F4 / registry anchor_warning)随 B1 对照表对账,B1 检查点核对。 -4. **原型参考值溯源**(owner:本 GDD 回填定稿时;deadline:EnemyTable/HeroTable 定值回填):敌 18HP/4ATK、伏击 +3、hero max_hp 均为 provisional 且**出处待查**(D2 Tuning Knobs 既有登记义务)——回填定值前补原型 REPORT 溯源,查无出处则按 C3 调参所有权重定。 -5. **HeroTable 单行校验落点**(owner:实现期 ADR/D2;deadline:Technical Setup):schema validate() vs loader 缝两处恰一承载(AC-13 腿3 / 可选根 `hero_extra_row` manifest 行)——实现期 ADR 定。 -6. **标错惩罚候选与伏击清单联动(2026-09-09 full 评审 blocking ④ 更正事件源类)**(owner:A2 OQ1 实测会话;deadline:A2 /design-review 核对在位):候选"敌方伏击+1"若实测采纳——其事件源为 **flag_judged{hit=false}(旗落非雷格),不在 Rule 5 cell_revealed{kind=mine} 转化路径内**;B3 需新增行且 source_class 需新枚举值(如 flag_miss)——**source_class 枚举属 B3 结构冻结项,须走 B3 GDD 修订(接口漂移),非"加行"**;B2 侧伏击清单联动修订 + F3 重验触发(非 mine_hit 源)强制重跑。若错标为 mine_hit:P2 归因明细行来源失实(标错被记成踩雷)。〔原文"B3 加 mine_hit 新行"为事件源类错误,废弃〕 -7. **精英/Boss 遭遇编码位预登记(2026-09-09 full 评审 blocking ⑤;owner:C1/C3;deadline:C1 GDD 定稿强制核对)**:难度 = f(关卡序号, 节点深度, 精英/Boss 修饰) 是 game-concept 定稿、A1 BoardGenTable 已预留 elite_/boss_ 命名空间与改键退路;本表键冻结 (level_index, node_depth, enemy_id) 且"每行集恰一敌种"入结构冻结——若 C1 定稿分支地图使**同深度并存普通与精英节点**,精英编码无键位(同深度第二敌种行触发行集校验致命)。届时改键(如追加 encounter_class 维度)走 D2 Rule 4 接口漂移修订,schema/AC-12/夹具/registry 连锁回写——预登记于此(A1 OQ6 镜像)。 -8. **grub 单拍环体验证伪(2026-09-09 full 评审登记;owner:C3/playtest;deadline:垂直切片 playtest)**:grub 环长 1、无前摇无空窗——玩家可能将其感受为"自动平砍的血条"(恰为 Player Fantasy 反向对照);MVP 实际读怪内容仅剩 ambusher 一环。预注册证伪项:playtest 采集"grub 是否被读"信号;证伪则两拍环备用案(如 [attack, charge])由 C3 内容所有权处置,本 GDD 结构不变(CD 终裁:登记风险、不改结构)。 -9. **零伤害死局组合与跨表量级护栏(2026-09-09 full 评审登记;2026-09-11 收窄;owner:实现期 ADR/D2;deadline:Technical Setup)**:hero 侧恒零伤害分支已被 HeroTable.atk 域下界([1,999],0 加载拒绝)结构杜绝;残余 = 行 atk=0 ∧ cap=0 → 无威胁敌(内容调参禁区、非死局);atk×mult 上界与 max_hp 域无跨表量级护栏——遭遇行配置期跨字段校验落点裁决(ActionEconomyTable 跨字段校验先例),详见 Tuning Knobs Knob 交互注记。 diff --git a/design/gdd/legacy-2026-09-13/b3-status-effect.md b/design/gdd/legacy-2026-09-13/b3-status-effect.md deleted file mode 100644 index d2de673c..00000000 --- a/design/gdd/legacy-2026-09-13/b3-status-effect.md +++ /dev/null @@ -1,320 +0,0 @@ -# B3 增益/状态系统(Status Effect System) - -> **Status**: Designed(2026-09-08 一次会话定稿;lean 门禁:systems-designer 起草 Formulas · qa-lead 起草/验证 AC;CD-GDD-ALIGN 按 lean 跳过,生产前人工复核 Player Fantasy)。**2026-09-09 full 评审 NEEDS REVISION,7 blocking 同日核销**:enemy 侧单敌假设入文〔用户拍板〕· B1 义务 5→8 · D1/B5/D5 呈现义务登记 systems-index · AC-15 机制更正 + reloaded 根全清单规格 · 致命夹具补根〔dup_key〕· AC-18 随 registry 逐字段键重构 · weaken 红警补修复空间不对称 + OQ1 归一口径前置 · stack-不重置 R 登记 OQ7 playtest 证伪项。**weaken 行条款 2 锚红色预警随文登记,B1 对照验收优先裁决** -> **Author**: user + agents(systems-designer〔Formulas〕· qa-lead〔AC〕;三结构决策〔单一计数/按行叠层/四行定稿权收编〕为用户拍板) -> **Last Updated**: 2026-09-08 -> **Implements Pillar**: P2(主——可归因兑现的机制落点)· P3(敌方增益/debuff 的兑付面)· P1(时限透明的规划素材)· P4(间接) -> **Layer**: 1 Foundation · **Milestone**: MVP · **设计顺序**: 第 4 位 - -## Overview - -B3 是战斗域的**统一状态容器**:凡是"不在当场一次性、而要在若干次轮次结算里持续起作用"的战斗效果——安全格给主角的增益、踩雷给敌人的增益、标中旗给怪物的削弱——都作为**状态实例**存放在这里,由同一套机制定义它们能活多久(己方限时增益**跨轮次延续**、时限按**剩余结算次数**计,每轮结算衰减一次;**不跨战斗**——game-concept 定稿)、同种效果如何叠加或刷新、何时到期消失。它同时是玩家最直接的兑现载体:扫雷阶段挣到的每一份效果都不当场生效,而是在轮次结束的战斗结算中逐条兑付、逐条可见(P2"扫雷的因,战斗的果"的机制落点)——玩家不操作 B3,但每一轮都能在结算明细里看到它的工作成果。 - -机制与内容分离是 B3 的结构原则:B3 只拥有**机制**——时限/叠层/衰减语义、状态实例生命周期(战斗域)、供 B1 结算消费的兑付接口与来源标注字段(P2 归因);效果**内容**的经济归属归各锚 owner(安全格 buff 与标中旗 debuff 档位锚验收归 B4、敌方增益上限归 B2),而**四行 MVP 初值的定稿权经 Rule 10 收编归本 GDD**(用户拍板;锚验收权仍留 B4/B2/B1),数值落在 D2 的 StatusEffectTable(本 GDD 为回填 owner),呈现归 D1/B5。没有 B3,三向效果映射的每一条都会各自手搓时限与叠加规则,A3 F1 要求的"四源统一当量、单一线性换算"失去对照载体,B1 结算要对接多套各异的效果语义,可回放步骤流(结算禁 await 的确定性要求)也无从保证——统一容器让"效果"成为一门单一语言。 - -## Player Fantasy - -**直接承载**(Section A 定稿:玩家不操作 B3,但直接感受其工作成果)。B3 的情绪目标一句话:**"我攒下的东西正在替我打架"**——结算画面逐行生效的那一刻,玩家看到的不只是伤害数字,而是自己前几轮规划的逐条回放:第三轮挖到的增伤还在(还剩 1 次结算)、标中的旗削弱了怪物(这一行是我标对了)、开错的那颗雷喂了敌人伏击(这是我赌输的代价)。B3 是 P2"规划的延迟兑现"从口号变成可见事实的机制落点。 - -体验锚点(按支柱): - -- **P2 可归因的兑现感**:每个状态实例携带来源标注(安全格/标中旗/清图/雷),结算明细逐行生效——P2 裁剪判据的准话测试"这个结果是我哪步扫雷带来的?"在 B3 的字段里就有答案。 -- **P3 同源的显影**:雷的两面都要看得见——踩雷的敌方增益行与标中旗的削弱行在结算明细里使用同一呈现语言,玩家由此学会"雷是赌桌不是陷阱";旗标对的即时回报部分补偿 chord 缺席的兑现节拍缺失(CD 创意风险 #3 的关联缓解,正式高光设计归 B1/B4)。 -- **P1 的规划素材**:增益有明确的剩余结算次数与到期时机,玩家才能把"还有 2 次结算的增伤"纳入挖哪格的推理——时限语义的透明度是规划感的前提。 - -参考感受:杀戮尖塔的增益图标(时机与层数一目了然,是决策素材而非装饰);Peglin 神器在关键时刻叠加生效的"攒出来的强大"。**反向护栏**:状态效果绝不能是无感的暗账——若玩家说不出一行结算"从哪来",来源标注即失职(违反 P2);任何让 buff 时限/剩余次数不可读的设计默认砍掉。 - -> 注:`creative-director` 未经咨询——Lean 模式(仅 D/H 两节委托专家),生产前请人工复核本节情绪定位。 - -## Detailed Design - -### Core Rules - -1. **统一状态容器(机制唯一)**:全部三向效果——安全格→主角 buff、踩雷→敌方增益、标中旗→怪物 debuff——都是同构的**状态实例**,存于同一容器、同一套时限/叠层/衰减机制。容器生命周期 = 战斗域:战斗开始时为空,`battle_over` 全清(不跨战斗,game-concept 定稿);**跨轮次、跨扫雷图延续**(换图/刷新不清空状态——旗标记随图消亡归 A2,状态实例不随图)。**零随机**:容器无任何 RNG 消费(rng_service 流封闭,P1)——授予、合并、衰减、枚举顺序全确定。**单敌假设(2026-09-09 评审定稿,用户拍板)**:MVP 战斗 = 单个敌人——target_side=enemy 在该前提下无歧义(enemy 侧 side-wide 即该敌全体)。B2 GDD 定敌人数模型时须回验本假设:定多敌即触发 target_ref 接口漂移补列(B1 归集语义/B2 敌人数模型/D1 呈现裁决随批验收,义务登记 systems-index)。 -2. **单一时限量纲(用户定稿)**:全部状态用 `remaining_settlements`(剩余结算次数)计数——持续型 = N(MVP 行默认 2),一次性(标中旗 debuff、伏击类)= 1。衰减时机 = **每轮结算兑付后统一 -1**(先兑付后衰减:duration=1 的状态恰好在授予它的那轮结算生效一次后移除);归 0 即移除。己方限时增益跨轮次延续由此自然成立(停手轮/弃图轮也是结算,照常衰减——不存在"不结算就不掉次数"的免费延时)。 -3. **授予集中在结算编排、来源全程携带**:挖掘期不直接写容器——A2 上报事实(开格/标中/开雷),**B1 在结算编排期统一调用 `apply_effect()`**(B3 唯一授予入口;A2/B4 与 B3 零直接接口)。每个实例携带 P2 归因字段:`source_class ∈ {safe_cell, flag_hit, mine_hit, clear_reward}` + `origin_cell` + `round_index`——结算明细逐行标注的数据源。授予即入容器(无 pending 态):首个结算就是它的第一次兑付。 -4. **叠层按行配置(用户定稿)**:同 `effect_id` 重复授予时按表行 `stack_policy` 处理——**stack**(层数 +1,封顶 `max_stack`)/ **refresh**(剩余次数重置为行默认、层数不变)/ **independent**(并存独立实例)。合并发生在授予时(容器内),结算作用顺序归 B1 SettlementTable——**两序分离**。stack 的作用数学 = **加算**(有效值 = 层数 × magnitude),即 F1 条款 1 单一线性换算的载体。MVP 四行全用 stack;refresh/independent 语义已定义、实现承载,内容行按需启用。 -5. **满层授予 = 拒绝 + 溢出可见**:stack 行已达 `max_stack` 时的授予返回 false,B1 结算明细标注“溢出未生效”行(含来源)——奖励不静默蒸发(P2 诚实),玩家由此获得“满层时别再拿同款”的规划素材(P1)。溢出判定与授予路径无关——直接事实、B1 转化、连锁展开自动开出的奖励格均经 `apply_effect` 同一入口,满层时同样产生溢出行(含来源)。 -6. **兑付接口(B1 消费契约,provisional 登记)**:`notify_battle_start()` / `apply_effect(effect_id, source) -> bool` / `query_active(side) -> Array`(插入序稳定枚举;返回元素 = 六归因字段 + `display_name` + **授予时数值快照 (magnitude, unit)** 的只读投影——qa-lead 载荷口径)/ `decay_round() -> int`(返回移除数)/ `notify_battle_end() -> bool`。B1 结算顺序(哪个效果先乘)归其 SettlementTable;B3 只保证枚举确定性。最后一轮(敌人全灭)是否 decay 归 B1 判定次序域(A3 EC8 同款)。**全部 API 布尔/计数返回、无 await、无表现面**——可回放步骤流的状态侧前提。 -7. **效果语义映射归 B1**:B3 只承载通用数值字段(magnitude/unit);"增伤到底加什么"的效果语义到结算公式的映射归 B1 SettlementTable(effect_id 为键)——B3 不知道增伤怎么算,只知道它还剩几次结算。 -8. **MVP 无驱散/无延时/无转移**:玩家不能移除、延长、转移任何状态(无对应 API)——"不能做"与"能做"同样明确;未来扩展走接口漂移。 -9. **数值承载于 D2**:StatusEffectTable(本 GDD 回填 owner,schema 见下节);B3 代码零玩法数值字面量(D2 Rule 1)、读取经 ConfigDB。 -10. **MVP 内容行四行定稿(用户拍板,B3 收编定稿权)**:四行初值由本 GDD 定稿(见下表);**B4/B2/B1 持验收与修订权**——F1 条款 2(debuff 档位严格 > 最低档 buff 当量)与条款 3(B2 惩罚上限)作为行值的**验收锚**登记,修订走接口漂移规则回写 registry。此为对 A3 OQ5"档位归 B4 表设计"的显式收编:**初值定稿权归 B3,锚验收权仍归 B4/B1**——登记为对 A3 OQ5 的修订注记(Phase 5 回写)。 - -### StatusEffectTable Schema 定稿(D2 回写义务) - -| 字段 | 类型/范围 | 说明 | -|---|---|---| -| effect_id | String(主键唯一) | 状态标识;B1 SettlementTable 语义映射的键 | -| display_name | String | 图例/HUD/明细用名(本地化归 D6) | -| target_side | enum {hero, enemy} | 作用侧(MVP 单敌假设:enemy 侧 side-wide = 该敌,见 Core Rule 1) | -| magnitude | int | 域随 unit:percent ∈ [-100, 100] 且 ≠0 / flat ≥ 1(跨字段校验) | -| unit | enum {percent, flat} | percent = 百分比修正;flat = 固定值(伏击类) | -| duration_settlements | int [1, 99] | 授予时初始剩余结算次数(一次性 = 1) | -| stack_policy | enum {stack, refresh, independent} | 同 id 重复授予的合并策略(Rule 4) | -| max_stack | int [1, 16] | 层数上限;仅 stack 消费——refresh/independent 行约定恒 1(内容约定,非校验项) | - -**MVP 内容行(四行,值全部 provisional——验收锚见 Rule 10)**: - -| effect_id | 名称 | side | magnitude | duration | stack/max | 来源 | provisional 依据 | -|---|---|---|---|---|---|---|---| -| attack_up | 增伤 | hero | +50 percent | **1**(2026-09-11 两级奖励批——当次结算语义:授予结算兑付于主角先手攻击后即衰减,原 D=2 作废) | stack / 2 | safe_cell | 原型临时值 1.5× 换算(D2 knobs 占位) | -| defense_up | 减伤 | hero | −50 percent | **1**(2026-09-11 两级奖励批——当次受伤减免,原 D=2 作废) | stack / 2 | safe_cell | 原型临时值 0.5× 换算 | -| ambush | 伏击(敌方增益) | enemy | +3 flat | 1 | stack / 16 | mine_hit | 原型临时值 +3(量纲归 B2 定稿验收,F1 条款 3 锚) | -| weaken | 削弱(标中旗 debuff) | enemy | −25 percent | 1 | stack / 16 | flag_hit | 无原型定值(+5 已作废);须过 F1 条款 2 锚(严格 > 最低档 buff 当量,B1 对照验收) | - -**校验**:effect_id 唯一(重复键致命);枚举域校验(target_side/unit/stack_policy 出域致命);duration/max_stack 域校验;跨字段 percent ≠ 0 / flat ≥ 1。表非空(D2 Rule 6,四行即满足)。键结构 = effect_id 定义表——**D2 Rule 4 豁免**(定义表非进度成长表,无 (level_index, node_depth) 维度;未来随关卡成长的效果走接口漂移加列,A4 先例)。 - -### States and Transitions - -容器无运行时大状态机——实例生命周期四态(战斗域)。容器为**纯逻辑类**(非 autoload、无场景依附),每场战斗实例化一次(B1 编排前提;冒烟经 class_name 直引构造): - -| 状态 | 进入条件 | 行为/出口 | -|---|---|---| -| BattleClosed(域闭) | 构造后未开域 / notify_battle_end() 后 | apply_effect 全拒绝(false);唯一出口 notify_battle_start() | -| Active(存续) | apply_effect 受理(新实例/叠层/刷新) | 每轮结算被 B1 兑付消费;decay_round() 后 remaining −1 | -| Expired(移除) | remaining_settlements = 0 | 实例销毁(明细流水已由 B1 记录,B3 不留历史) | -| Cleared(清空) | notify_battle_end() | 全实例销毁、容器回空 → BattleClosed(不跨战斗) | - -**实例不变式(debug 断言口径)**:remaining ∈ [0, duration_settlements];stack 行 layers ∈ [1, max_stack];stack/refresh 策略下同 id 至多一个实例——违反即 debug 断言中止;API 违规(域闭授予、未知 effect_id、满层授予)= 拒绝(false)+ debug 诊断,不进程致命(承 A3 拒绝口径;进程致命保留给 D2 数据通道)。 - -### Interactions with Other Systems - -| 系统 | 方向 | 接口契约 | -|---|---|---| -| D2 | 双向 | StatusEffectTable schema + 四行 MVP 内容回填(本 GDD 义务);读取经 ConfigDB;新字段走接口漂移规则 | -| B1 | 双向(hard,**provisional**——B1 未设计) | 结算编排期调用:notify_battle_start / apply_effect(三源授予:B1 从 A2/A3 事件收集 round facts 后转化)/ query_active(side) 兑付消费 / decay_round() 轮末衰减 / notify_battle_end() 清空;结算明细来源标注数据源 = 实例字段(P2);效果语义到结算公式映射归 B1 SettlementTable(effect_id 键);F1 条款 1 对照表的“实物”供给方;最后一轮 decay 与否归 B1 判定次序域;**义务清单 8 项见 Dependencies 行(2026-09-09 评审 5→8)** | -| B4 | soft(**provisional**) | 安全格 buff 行值与 weaken 档位的**锚验收权**(F1 条款 2 + A4 三条定价硬约束引用"最低档安全格 buff 当量"——参照对象即 attack_up 行的当量);清图奖励若含 buff 经 apply_effect(source=clear_reward,B4 期定) | -| B2 | soft(**provisional**) | ambush 行量纲/上限的**验收锚**(F1 条款 3:B2 惩罚上限表 vs B3 行值,对账归 B1 闭合);未来敌人词条引用状态(免疫/抗性)为预留注记,不预写;**单敌假设对面义务(2026-09-09)**:B2 定敌人数模型时回验 Rule 1 单敌假设——定多敌即触发 target_ref 接口漂移(B1 归集语义/D1 呈现裁决随批) | -| A3 | 契约相邻(零运行时接口) | A3 不调用 B3;F1 条款 1 四源当量对照以 B3 实例为对照实物;标中旗兑付资格(雷格实例键)判定在 A3/A2 域,B3 只接收 B1 转化的授予——**资格判定不过 B3**(B3 无从重复兑付同雷:每次 flag_hit 授予由 B1 保证资格合法) | -| A2 | 间接(零直接接口) | 开格/标中/开雷事实经事件 → B1 收集 → apply_effect;A2 不感知状态容器 | -| D1 | soft | HUD 状态栏数据源:query_active(hero) 的 display_name/层数/剩余结算次数常显(可见性 = Player Fantasy 反向护栏);层数/到期变化反馈归 D1;**义务清单 D1×4 已登记 systems-index(2026-09-09:HUD 常显+EC12 空态规格 / icon 映射键契约 / 极性呈现映射 / 全清状态栏去留)** | -| B5/D1 结算画面 | soft | 结算明细行的数据源(display_name/magnitude/来源字段);呈现归 B1/D1/B5;**溢出行与 origin_cell 玩家可读形态的呈现义务已登记(B5×2,2026-09-09)** | -| D5 | soft | 教学口径:时限按结算次数计("还剩 2 次结算")、**战斗结束全清**(防"我的 buff 哪去了"误读——A3 RAP 清零教学同款)、满层溢出浪费提示 | - -## Formulas - -> systems-designer 代理起草(lean 门禁,2026-09-08):只含机制公式,平衡归属见显式排除声明。 - -### F1 同 id 叠层合并(same_id_merge,授予时执行) - -``` -merge(effect_id) —— 前置拒绝(域闭 / 未知 effect_id)沿用 States 节 API 口径,不入分支。 -行 = StatusEffectTable[effect_id],按 行.stack_policy 三分支: - - independent → 恒新建实例 {L=1, R=D},append 入列(同 id 并存多实例) - - stack → 无存活实例 :新建 {L=1, R=D} - 有存活实例 ∧ L < M :L ← L+1(R 不动,见注) - 有存活实例 ∧ L = M :返回 false(满层拒绝;容器零写入,溢出行归 B1 结算明细) - - refresh → 无存活实例 :新建 {L=1, R=D} - 有存活实例 :R ← D(L 不变;含 R 已 = D 的空刷新,恒返回 true—— - refresh 无满层/溢出语义,不消费 max_stack) -``` - -**注(spec 决议)**:stack 授予**不触碰 R**。依据:duration_settlements = **授予时**初始剩余结算次数——只有初始授予定钟;且若 stack 也重置 R,则 stack ≡ refresh + 加层,三分支失去区分性(refresh 的区分性特征正是"重置次数")。refresh 的重置目标 D 取**实例持有的授予时快照**(与 EC9 快照语义一致——实例不受表重载影响;qa-lead 缺口 #1 补全)。 - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| effect_id | e | String | 表主键 | StatusEffectTable 行键;未知 = 拒绝 | -| stack_policy | P | enum {stack, refresh, independent} | 表列 | 合并分支选择器(Rule 4) | -| max_stack | M | int [1, 16] | 表列 | 仅 stack 分支消费;refresh/independent 不读(未来 refresh 行配 M>1 时行为 = 忽略) | -| duration_settlements | D | int [1, 99] | 表列 | 新建实例初始 R;refresh 的重置目标即此值 | -| layers | L | int | stack 行 [1, M];其余恒 1 | 实例层数(越界 = debug 断言,States 节不变式) | -| remaining | R | int | 存活态 [1, D] | 剩余结算次数;归 0 移除(F3) | - -**Output Range:** 正常域——stack/refresh 行同 id 存活实例数 ≤ 1(不变式);independent 行实例数 = 受理授予数(有界确定);返回值 bool。极端行为——满层授予恒 false 且容器逐字不变(拒绝原子性:无半写、无溢出落层);**同轮批量授予的先到先得次序由调用方保证**(B1 编排须按确定次序调用 apply_effect——B3 只保证插入序枚举稳定,登记 B1 验收项)。 - -**Example:** attack_up(stack, D=2, M=2):轮 3 两个安全格事实 → apply_effect×2 → L=2、R=2;兑付 +100%(F2)、decay 后 R=1。轮 4 第三个授予 → L=2=M → **false**(明细"溢出未生效"行);本实例仍兑付 +100%、R=0 移除。weaken(stack, D=1, M=16):轮 3 三旗命中三雷(雷格实例键,三次授予均合法)→ L=3、R=1;兑付 −75%、decay 移除。轮 4 一旗命中新雷 → 旧实例已销毁,**新建** {L=1, R=1}——dur=1 行的层只在单轮授予批次内累积,跨轮必为新实例。 - -### F2 有效值合成(effective_value_composition,兑付时只读) - -``` -effective_value(实例) = L × m (unit 随行声明,量纲标签原样随值输出、不进乘法) - stack 行:L ∈ [1, M];refresh / independent 行:L ≡ 1(每实例恒一倍) - 加算语义:percent 行的 L×m 是百分点线性叠加(+50 × 2 层 = +100 个百分点); - 乘算读法(1.5^L)在 B3 语义域外。 - 表注:四行 provisional 依据列的"原型 1.5× / 0.5×"是行值出处(provenance),非合成语义。 -``` - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| layers | L | int | 同 F1 | 叠层数 | -| magnitude | m | int | percent ∈ [-100,100] ∧ ≠0;flat ≥ 1(单行字段域,D2 校验) | 行值;**合成值不继承此域**(见 Output Range) | -| unit | u | enum {percent, flat} | 表列 | 量纲标签;percent = 百分比修正、flat = 固定值;**消费语义(乘除侧、地板、单位定义)不在 B3**(见排除声明) | - -**Output Range:** 正常域——percent 行 |effective| ∈ [1, 100×M],**可越出 [-100, 100],B3 不 clamp**(合成值地板/clamp 归 B1 SettlementTable,登记 B1 验收项);flat 行 effective ≥ 1。极端行为——weaken 合成下界两档并列:**AP 界 −200%**(默认经济下 flag_hit 单轮 ≤ ap_per_round=8 次授予、dur=1 层只在单轮累积 → L=8)与**表界 −400%**(L=16,仅非 AP 源如 clear_reward 授予、或 ap_per_round 调参后可达)——两档均越域,均不在本系统内收口。跨 effect_id 聚合、percent 与 flat 混算 = B1 SettlementTable 域(Rule 7)。 - -**Example:** attack_up L=2 → +100 percent(兑换成 2.0× 与否的读法归 B1);defense_up L=2 → −100 percent(压地板线,“归零”读法须 B1 定义);weaken L=8 → −200 percent;ambush L=3 → **+9 flat**(3×m_amb——B3 不解释单位;2026-09-09 评审修正原"+3"算术笔误)。 - -### F3 结算衰减(settlement_decay,轮末执行) - -``` -decay_round() -> k: - k ← 0 - for 实例 ∈ 容器(插入序枚举,零随机): - R ← R − 1 - if R = 0:销毁实例;k ← k + 1 - return k -``` - -时序契约:**先兑付后衰减**——B1 经 query_active(side) 完成本轮兑付后才调用;duration=1 实例的落点由此完整确定 = 授予当轮编排期入容器 → 同轮兑付恰一次 → 轮末 R=0 移除("一次性"语义的全部机制内容)。停手轮/弃图轮同为结算、照常衰减(Rule 2,无免费延时);最后一轮(敌人全灭)是否 decay 归 B1 判定次序域(Rule 6,A3 EC8 同款——battle_end 全清兜底,两种次序产生同终态)。 - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 容器 | — | 实例多重集 | 存活实例全体 | 枚举序 = 插入序(Rule 1 确定性) | -| remaining | R | int | 存活态 [1, D];decay 后 ∈ [0, D−1] | 单调递减;refresh 的 R←D 发生在授予时(F1),不在本式内——两序分离 | -| 返回值 | k | int | [0, \|容器\|] | 本轮移除数 | - -**Output Range:** 正常域——每实例每轮恰 −1,无参数、无豁免实例;k ≤ 调用前容器规模。极端行为——空容器 → k=0;全 dur=1 轮 → k=|容器|(全清);R 恒不因 decay 变负(归 0 即销毁,不留 0 值实例——与不变式 remaining ∈ [0, D] 相容)。 - -**Example:** 轮 3:编排期授予 attack_up×2(L=2、R=2)→ 兑付 +100% → decay_round()=0、R=1。轮 4:query_active(hero) 含同实例 → 兑付 +100% → decay_round()=1(移除)。轮 5:query_active(hero) 已不含 attack_up。 - -### 显式排除声明(R4 式) - -本 GDD **无平衡公式**——F1–F3 只承载机制数学(合并/合成/衰减),不含任何"值该多大"的判断;四行 MVP 值全部 provisional(Rule 10)。平衡与语义归属逐一列明: - -| 对象 | 归属 | 依据 | -|---|---|---| -| 效果档位当量对照表(四源统一当量、单一线性换算) | **B1**(出表方兼闭合对账单一签字人) | A3 F1 条款 1 | -| weaken 档位锚(debuff 当量严格 > 最低档安全格 buff 当量;基准 = 连锁放大边际挖掘收益,provisional 1:1) | **B4 表设计 + B1 对照验收** | A3 F1 条款 2 | -| 挖掘风险不等式(P(安全)×buff 当量下界 > P(雷)×敌方增益当量上界;B2 惩罚上限表值) | **B2 供给上限表值,B1 单一闭合对账** | A3 F1 条款 3 | -| 奖励定价(清图奖励及 B4 三硬约束:雾内档位下界 / 锚随雾成本上浮 / 净当量优势带上界) | **B4** | A4 pricing_constraints;A3 F1 条款 4/5 | -| percent 的消费侧换算与地板(乘除侧读法、合成值越域 clamp);flat 的量纲("+3"的 3 是什么单位) | percent → **B1 SettlementTable**(Rule 7);flat 量纲 → **B2**(ambush 行量纲定稿验收锚) | Rule 7 + F2 Output Range;Schema 说明列 + 表行 provisional 依据 | -| MVP 四行初值定稿权 | **B3**(Rule 10);B4/B2/B1 持锚验收权,修订走接口漂移回写 registry | Rule 10 | - -B3 只对"L×m 线性合成 + R 计数"负责:合成值多大算强、多弱算废、floor 在哪、+3 打谁——均不在本 GDD 语义域。 - -**🔴 条款 2 锚预警(systems-designer 预检登记,随定稿同步 B1/B4)**:weaken 行 vs 条款 2 锚在两个独立线性代理下同向预检不过(百分点·结算暴露:attack_up 100 vs weaken 25;原型战斗量级:≈4 vs ≈1 当量)——“单一线性换算”(条款 1)堵死分源改率翻案,“总吞吐无单档上限可依恃”(条款 2)堵死 max_stack 豁免。B1 对照验收须优先裁决;坐实违反则修订方向 = 上调 weaken magnitude 或 B4 重定最低档参照,**修订值由锚 owner(B4/B1)定**,走接口漂移回写 registry,本 GDD 不预设。**修复空间不对称(2026-09-09 评审增补,裁决前置约束)**:按“每结算瞬时当量”归一——m_w ≥ 51 即过锚(percent 域内可行,但 F2 越域界随之上移:AP 界 −408% / 表界 −816%,7 层即触 B1 地板——上调的连带成本须入裁决);按“每 AP 总暴露”归一——需 m_w > 100,被 percent ∈ [-100,100] schema 域**禁止,该分支不可行**。故 OQ1 增前置步骤:**B1 先钉死归一口径(瞬时 vs 总暴露),口径落定前禁止任何数值修订**;口径落总暴露读法,则现实解 = B4 重定最低档参照(非上调)。另两行注记:defense_up 顶点恰 −100% 压地板线(消费读法归 B1);ambush 当量预检挂起待 B2 量纲(B2 定单位后 B1 才能做条款 3 上限检验)。 - -## Edge Cases - -- **EC1 If 域闭状态授予**(BattleClosed 下 apply_effect):拒绝(false)、容器不变 + debug 诊断——B1 过早/过晚调用 = 编排错误显式暴露,不静默吞。 -- **EC2 If 未知 effect_id**:拒绝(false)+ debug 诊断。表行删除/改名后旧引用的暴露点;悬空引用校验政策承 A4 counter_item_ids 同款——**MVP 不校验**(本表暂无引用方),B4 RewardTable 首个 effect_id 引用回填时补校验 + 条件性夹具(D2"首个引用字段 owner 补"条款的 B3 侧兑现点)。 -- **EC3 If 满层授予**:恒 false 且容器逐字不变(拒绝原子性——无半写、无溢出落层,F1);溢出行归 B1 结算明细(Rule 5)。同轮多授予谁被拒取决于 B1 授予次序——**授予次序确定性是 B1 编排义务**(登记 B1 验收项,F1 Output Range)。 -- **EC4 If 空刷新**(refresh 行 R 已 = D 再授予):返回 true、无任何变化——合法空操作(refresh 无满层/溢出语义,F1 决议)。**MVP 无 refresh 内容行 = 该语义零消费者**;首个 refresh 行上线时须补冒烟 AC(登记,防三分支之二无测试承载)。**原则注记(2026-09-09 评审)**:空刷新静默返 true 与 Rule 5“不静默蒸发”存在原则张力(stack 有溢出行、refresh 无对应物)——MVP 零消费者故休眠;首个 refresh 内容行上线时,其授予可见性语义须由 B4/B1 随 OQ3 一并裁决(已登记 systems-index)。 -- **EC5 If 同轮 dur=1 行多次授予**:层在单轮授予批次内累积(L=N)→ 同轮兑付一次(合成 L×m)→ 轮末全移除;跨轮必为新实例(F1 Example weaken 例)——"N 旗 = N debuff 总吞吐"在 B3 侧的呈现 = 单轮层和,对账归 B1(A3 条款 2)。 -- **EC6 If 同一事实被重复授予**(同 effect_id+origin_cell+round_index 两次 apply):B3 **不去重**——容器是 dumb 账本,无从辨别事实合法性,两次授予 = 两层/两实例;**事实→授予的恰一次转化归 B1 编排义务**(登记 B1 验收项——round_end 双发射源同族问题,A3 先例)。 -- **EC7 If 合成值越域**(|L×m| 越 [-100, 100] 或穿越地板):B3 不 clamp、值 + unit 标签原样输出——收口归 B1 SettlementTable(F2 Output Range;登记 B1 验收项:percent→乘数换算方向与地板规则须成文——weaken AP 界 −200% / 表界 −400%、defense_up 顶点 −100% 三例已在 F2 登记)。 -- **EC8 If 清图换图/弃图刷新**:容器**不清空**——状态跨图延续(Rule 1,战斗域非图域);旗标记随图消亡(A2 域)不影响已授予实例;已消费兑付资格的雷格随图消亡(A3 域),新图新雷自然新资格——B3 无从感知也无须感知。 -- **EC9 If 战斗中热重载 StatusEffectTable**:走 D2 既有门(战斗中 reload 拒绝);**已授予实例不受任何表重载影响**——实例在授予时从表行**拷贝数值快照**(m/D/unit),热重载只影响后续授予(A4 EC8"快照非活引用"同款)。 -- **EC10 If refresh/independent 行配置 max_stack > 1**:行为 = 忽略(F1 分支不读 M)——内容约定非校验项,validate() 不拒绝(防过度约束锁死未来内容)。 -- **EC11 If notify_battle_start / notify_battle_end 重复或错序**:Active 下再 start → false + 诊断;BattleClosed 下再 end → false + 诊断(bool 口径统一,承 A3 输入×相位矩阵同款)。 -- **EC12 If query_active 空 side 或空容器**:返回空 Array——合法状态非错误;D1 HUD 据此渲染"无状态"。 -- **EC13 If decay_round 在域闭时被调用**:返回 0——域闭时容器恒空(battle_end 已清),0 是自然结果、无独立分支、不诊断(幂等安全的兜底读法)。 -- **EC14 If independent 行被高频授予**:实例数上界 = 受理授予数(有界、确定,无满层语义)——MVP 无此内容行;未来 DOT 类高频授予的容量语义归扩展(接口漂移),本 GDD 不预写。 - -## Dependencies - -**Upstream**:D2(hard——StatusEffectTable schema 承载与 ConfigDB 读取;本 GDD 为该表回填 owner,schema + 四行已定稿)。无其他玩法上游(Foundation 层)。 - -**Downstream**: - -| 依赖方 | 性质 | 接口 | -|---|---|---| -| B1 | hard(**provisional**——B1 未设计) | 五 API(notify_battle_start / apply_effect / query_active / decay_round / notify_battle_end);**B1 侧义务清单(登记 B1 GDD 验收项,缺项即 blocking——A4 对 A1/A2 登记先例)**:① 同轮多授予按确定次序调用(EC3)② 事实→授予恰一次转化(EC6)③ percent→乘数换算方向与合成值地板成文(EC7/F2)④ 最后一轮 decay 判定(F3)⑤ F1 条款 1 效果档位对照表以 B3 实例为对照实物 ⑥ **每结算编排恰一次 `decay_round()`**(decay 基数 = 1 是 dur=1 一次性语义与全部衰减语义的先决条件;Active 相位 double-decay 在 B3 侧无守卫——信任 B1 编排,误编排经本义务验收与可回放步骤流暴露;2026-09-09 评审增补)⑦ **结算明细按授予流水逐条标注来源**(F1 合并坍缩归因的兑付面补偿——合并实例只持首授 origin_cell/round_index,per-layer 来源还原的数据源 = B1 授予流水;2026-09-09 评审增补)⑧ **“溢出未生效”行进结算明细协议**(Rule 5 后半的 B1 侧承载;呈现归 B5/D1;2026-09-09 评审增补) | -| B4 | soft(**provisional**) | weaken 档位与安全格 buff 的**锚验收权**(F1 条款 2 + A4 三定价硬约束的参照对象);未来 RewardTable 引用 effect_id → 悬空校验 + 条件性夹具补全义务(EC2);clear_reward 源授予(条款 4 差异化插槽若含 buff) | -| B2 | soft(**provisional**) | ambush 行量纲/上限**验收锚**(F1 条款 3:B2 惩罚上限表 vs B3 行值,对账归 B1 闭合) | -| D1 | soft | query_active(hero) 为 HUD 状态栏数据源(display_name/层数/剩余结算次数常显;EC12 空态渲染);层数/到期变化反馈;**义务清单 D1×4 已登记 systems-index(2026-09-09)**:① HUD 常显 + EC12 空态规格定稿(隐藏栏 vs 空槽由 D1 裁决但须成文)② effect_id→icon 映射键契约(art-bible 形状+色相双通道)③ 有利/有害极性呈现映射(数据源 = B1 SettlementTable 效果语义,非 magnitude 符号——负值增益存在)④ 战斗结束全清的状态栏去留 | -| B5 | soft | 结算明细/战斗动画的实例字段数据源(经 B1 结算流水;MVP 明细行即呈现,动画归垂直切片);**义务 B5×2 已登记 systems-index(2026-09-09)**:① 溢出行呈现(数据源 = B1 义务⑧明细协议)② origin_cell→玩家可读形态(缩略图/格子高亮映射——坐标值本身不直接呈现) | -| D5 | soft | 教学口径:按结算次数计时、战斗结束全清、满层溢出浪费提示;**增补(2026-09-09)**:“同轮拿满优于跨轮叠”教学项(stack 时序补偿,OQ7 证伪项配套——证伪成立前以中性提示形态) | - -**双向一致性核对**(systems-index 依赖分层表):B4 ← A2, B3, D2 ✅ · B1 ← A3, B2, B3, B4, D2 ✅ · B3 ∈ Foundation、无上游 ✅。**注记三条**:① B2 ← D2(索引无 B2←B3 边)与 Interactions B2 行不矛盾——敌方状态的**承载**在 B3,但授予路径经 B1,B2 与 B3 之间是验收锚关系非运行时依赖,故不列边;② **对外修订义务**:Rule 10 对 A3 OQ5“档位归 B4 表设计”的收编(初值定稿权归 B3、锚验收权留 B4/B1)须回写 systems-index 门禁记录(本文定稿时执行);③ **措辞注记(2026-09-09 评审)**:Upstream D2 标"hard"指数据通道事实依赖(ConfigDB 读表——registry config_db referenced_by=[all-systems] 同口径);systems-index 分层表按其惯例不列纯数据读取边(“其余系统的数据读取为事实依赖,不逐条列边”注)——两处相容非矛盾。 - -## Tuning Knobs - -| Knob(表行值,D2 承载) | 默认 | 调过高 | 调过低 | -|---|---|---|---| -| attack_up.magnitude | +50 | 叠满 +100%,敌方 HP 池相对贬值(战斗时长曲线压向 B1 对账) | 安全格奖励空心化——A3 条款 3 左臂(P(安全)×buff)塌方 | -| defense_up.magnitude | −50 | 顶点 −100% 免伤(B1 地板规则压力) | 减伤无感,防御型奖励萎缩 | -| weaken.magnitude | −25 | 单轮 −200% 内敌方输出蒸发(B1 地板) | **🔴 已预检不过条款 2 锚(差约 4×)——上调方向,B1/B4 裁决** | -| ambush.magnitude | +3 flat | 待 B2 量纲定稿后才有意义(B3 不解释单位) | 踩雷无痛感——P3"风险与收益同源"失衡 | -| duration_settlements(四行 2/2/1/1) | 2/2/1/1 | 持续型窗口拉长(规划变简单,衰减感消失) | 持续型名存实亡("跨轮延续"定稿语义失效) | -| max_stack(四行 2/2/16/16) | 2/2/16/16 | 合成越域幅度增大(B1 地板压力↑) | 叠层机制边缘化(重复奖励变溢出浪费) | - -- **非 knob(结构冻结)**:stack_policy 三分支语义、unit 语义、source_class 枚举、时限量纲 = 剩余结算次数(game-concept 定稿)、先兑付后衰减时序、拒绝原子性、零随机——修订走本 GDD 流程非调参。 -- **Knob 交互**:attack_up 与 weaken 是条款 2/3 对账的**两端**——禁止独立调参,联动评估归 B1 闭合对账;A3 的 `ap_per_round` 是 weaken 单轮层和的经济上限(F2 AP 界 −200% 的来源);效果档位当量对照表(B1)落定前,四行 magnitude 的任何调整都须**重跑条款 2/3 锚预检**并同步 registry(接口漂移义务)。defense_up 顶点 −100%×2 次结算 = 连续两轮免伤读法(2026-09-09 评审注记)——免伤窗口是否过强与 attack_up 同入 B1 对账联动评估(B1 地板规则 × 战斗时长曲线),禁止独立调参;若 B1 裁决过强,候选修正 = 行值降档或 schema 加 L×|m|<100 约束(走修订流程非调参)。 - -## Visual/Audio Requirements - -B3 无自有渲染面——视觉义务是**数据供给规格**,呈现归 D1/B5: - -1. **HUD 状态栏数据源**:query_active(hero) 投影的三要素——图标(effect_id→icon 映射归 D1/art-bible)、层数(L)、剩余结算次数(R)必须可读(Player Fantasy 反向护栏:时限/剩余次数不可读 = 违反 P1 的规划素材与 P2 的兑现可见性)。 -2. **结算明细行数据源**:display_name + 有效值(L×m)+ unit 标签 + 来源标注(source_class→文案映射归 B1/D1,P2 归因)——“增伤 +100%(第 3 轮 · 安全格)”式逐行读法;origin_cell 的玩家可读形态(缩略图/格子高亮)呈现义务登记 systems-index(B5×2,2026-09-09)——坐标值本身不直接呈现。 -3. **视觉身份锚适用**(game-concept):数值可读性优先于氛围(锚 1)——状态数值在暗色底上须高对比;增益/削弱图标不得只靠色相区分(锚 2 形状+颜色双通道)。有利/有害极性**不得由 magnitude 符号推导**(负值增益存在)——极性呈现映射的数据源 = B1 SettlementTable 效果语义,义务登记 systems-index(D1×4 之三,2026-09-09)。 -4. **零信号外发**:B3 是纯被动容器,不发任何事件——呈现刷新点 = B1 结算编排完成后的界面刷新(D1/B5 域);到期/层数变化反馈经 decay 前后查询差分或 B1 流水(D1 裁决)。 - -无音频需求(到期/叠加音效归 D4 Alpha 期)。 - -> 注:`art-director` 未经咨询——Lean 模式,生产前请人工复核本节与 art-bible 的一致性。 - -## UI Requirements - -B3 不拥有 UI,但有三个呈现义务(数据均已在 AC 前言投影口径中定义):① HUD 状态栏常显(hero 侧,含空态渲染——EC12);② 结算明细逐行来源标注(经 B1 流水,P2 归因硬要求);③ 满层溢出提示("溢出未生效"行,含来源——Rule 5 诚实语义)。教学口径三条归 D5(按结算次数计时 / 战斗结束全清 / 满层浪费)。 - -## Acceptance Criteria - -> **测试载体与注入口径**:B3 是纯行为容器——无场景、无表现面、无加载期自有校验类别。冒烟载体 = `godot --headless --script`(承 D2 冒烟框架;脚本 extends SceneTree 以获得 quit(code)、ConfigDB autoload 由脚本显式实例化)。容器经 **class_name 直引实例化**(每用例全新实例、无跨用例状态——A4 AC-5 直引先例同款;AC-19 扫描对该实例化路径豁免)。B1 未实现(第 9 位),冒烟**直接驱动 B3 最小 API 面**(承 A3"直接驱动最小 API 面"先例);B1 就绪后改走真实调用方(结算编排),断言口径不变。 -> **API 面**:`notify_battle_start()` · `apply_effect(effect_id, source) -> bool` · `query_active(side) -> Array` · `decay_round() -> int` · `notify_battle_end() -> bool`。**全部布尔/计数返回 = 受理/拒绝**(A3 全 API 布尔口径同款)——"拒绝"直接断言返回值,附 debug 诊断、非进程致命(承 A3 拒绝口径;进程致命保留给 D2 数据通道);`decay_round` 返回值 = 本轮移除数断言。**`apply_effect` 是唯一授予入口**(Rule 3),冒烟直接构造合法 `source = {source_class, origin_cell, round_index}`(B1 转化产物的冒烟等价——信任方向同 A3 对 `chain_size`/`clears_map` 的处理)。`query_active` 为只读、任意相位合法。 -> **只读观测量**:实例六字段 `effect_id` · `layers` · `remaining_settlements` · `source_class` · `origin_cell` · `round_index`;`query_active(side)` 元素 = 结算面向载荷投影:上述六字段 + `display_name` + **授予时数值快照 (magnitude, unit)**(EC9 快照语义 + Interactions B5/D1 行的数据源)——有效值 = `layers × 快照 magnitude`、unit 标签原样随值输出(F2)。枚举序 = 插入序(Rule 6)。**相位无字段观测量**:BattleClosed/Active 由 API 返回值推断;Expired/Cleared 为销毁态不可观测(瞬态纪律同 A3 RoundEnd)。 -> **时序口径**:B3 无 round_start/settlement API——"轮边界"在冒烟中 = 相邻两次 `decay_round()` 调用之间的授予/查询窗口(B1 编排在 B3 侧的可见面恰为这五个 API)。多步 GIVEN 均给出构造序列。 -> **期望值推导纪律**:`magnitude` / `duration_settlements` / `max_stack` 均为 knob(Tuning Knobs 节)——各 AC 的 THEN 具体数值按**当前 ConfigDB 表值推导、不写死**(正文以 `D_a`/`M_a`/`m_w` 等表读值记号书写);结构字段(effect_id 集合、target_side、unit、stack_policy)非 knob、定值断言合法。行表"来源"列为内容档案(provenance),**非 schema 字段、非运行时约束**——B3 不校验 source_class 与行的对应(EC6 dumb 账本同族)。 -> **夹具策略**:① 默认根(干净检出四行 MVP 内容)承载全部分支行为 AC;② **程序构造**(schema 类 class_name 直引实例)承载 AC-13 域校验——不经 `load()`/`preload()`;③ 行为夹具根经 `--data-root` 注入(仅 debug、不入 `data/tables/`——D2 夹具纪律),承载 MVP 无行的语义(refresh/independent)。**显式声明:夹具测试行非 MVP 内容**(Rule 10 四行全 stack;测试行仅供冒烟)。选夹具根而非程序构造注入表的理由:容器经 ConfigDB 单点读表(Rule 2/9),无表注入 API——`--data-root` 是 debug/test 构建的既定注入通道。**夹具规格登记(登记值即相关 AC 的推导基准)**: -> - 根 `status_effect_policy_rows`:`refresh_probe`(display_name="刷新探针" · hero · percent · magnitude=+10 · duration=3 · stack_policy=refresh · **max_stack=4**——故意违反"refresh 行恒 1"内容约定,作 EC10 载体,validate() 须零诊断)+ `independent_probe`(display_name="独立探针" · enemy · flat · magnitude=+2 · duration=3 · stack_policy=independent · max_stack=1)——全字段域内合法数据。 -> - 根 `status_effect_policy_rows_reloaded`:仅 `fresh_probe` 一行(hero · percent · magnitude=+20 · duration=9 · stack · max_stack=1)——服务 AC-15 重载腿。**根规格 = D2 全表清单拷贝 + 仅置换 StatusEffectTable 为本单行**(2026-09-09 评审增补——缺任一表文件即触发 D2 EC1 文件缺失致命、GIVEN 不可构造;“仅一行”指该表内容非根内容)。 -> - 根 `status_effect_dup_key`:D2 全表清单拷贝 + StatusEffectTable 置换为默认四行 + 追加一行与 attack_up 同 effect_id 的重复键行(其余字段域内合法)——**B3 唯一致命夹具**(2026-09-09 评审增补,A4 `variation_dup_key` 同型):loader 集成缝(loader 是否对本表调用校验)的进程级落点。 -> **致命类收窄豁免与 runner manifest(2026-09-09 评审改定)**:B3 冒烟设**恰一根致命夹具**(`status_effect_dup_key`——重复键类别):runner manifest 退出码行 `dup→≠0`(独立 headless 进程、游戏通道,D2 AC-2b 协议同型)——“游戏内真的会死”在本表上的落点由此腿实证;其余致命类别(枚举域/域校验/跨字段)由 D2 AC-2 同类别 loader 级夹具承载(表无关,豁免声明收窄保留);schema 侧以程序构造断言域类别(AC-13)。每用例先 `reset_diagnostics()`(D2 冒烟协议,全局声明);各 AC 声明其表根(默认根/上列三根),用例间无顺序依赖。 -> **覆盖声明(out-of-scope)**——下列各项不在本冒烟域,deferral 以 **Dependencies 节 B1 五项义务清单**为生效条件:① 同轮多授予的先到先得次序(EC3 后半——冒烟单调用方次序即构造序,B1 编排次序 = 义务①);② 事实→授予恰一次转化(EC6 后半——义务②);③ percent→乘数换算方向与合成值地板(EC7 收口半——义务③);④ 最后一轮 decay 判定次序(F3 时序契约的 B1 半——义务④;battle_end 全清兜底使两序同终态,冒烟不构造);⑤ 效果档位对照表以 B3 实例为对照实物(义务⑤,对账归 B1)。另有:结算明细“溢出未生效”行与来源标注呈现(Rule 5 后半——冒烟无明细观测量;**对侧承载已登记:B1 义务⑧ + B5×2 呈现义务,2026-09-09,deferral 生效条件成立**);D1 HUD 状态栏与 EC12 空态渲染(**D1×4 已登记 systems-index,2026-09-09**);效果语义到结算公式映射(Rule 7——B1 SettlementTable 域);**Rule 8 负空间**(无驱散/延时/转移 API——"无对应 API"不可 GIVEN-WHEN-THEN,其验收形态 = 本前言 API 面封闭枚举 + 接口漂移修订门);D2 schema 校验致命端到端(双通道协议承载);悬空引用校验(EC2 政策半句——B4 RewardTable 首个 effect_id 引用回填时补,D2 双通道条件性夹具);EC9 reload 门腿(D2 AC-16 既有覆盖 + B1 是置位/复位唯一调用方——B3 无断言义务);EC8 端到端换图腿(B1 编排合规,AC-10 裁决)。 - -**域与生命周期** - -- **AC-1** GIVEN 全新容器(BattleClosed、空;表根 = 默认根),WHEN 依次 `apply_effect(attack_up, 合法source)`、`query_active(hero)`、`query_active(enemy)`、`decay_round()`,THEN apply 返回 **false**(EC1 域闭拒绝)、双侧 query 均 = **空 Array**(EC12)、decay 返回 **0** 且诊断收集器**零新增**(EC13——空容器域闭的兜底读法,非独立分支不诊断);WHEN `notify_battle_start()`,THEN true 且 query 仍双侧空(战斗开始时为空,Rule 1);WHEN 再次 `notify_battle_start()`,THEN **false**、相位与容器不变(EC11 前半——Active 再 start)。 -- **AC-2** GIVEN Active 且已建账(构造:`apply_effect(attack_up)` ×1 + `apply_effect(weaken)` ×1,query 断言含两实例),WHEN `notify_battle_end()`,THEN true、query 双侧空(Cleared 全清、不跨战斗——Rule 1);WHEN 再次 `notify_battle_end()`,THEN **false**(EC11 后半——Closed 再 end);WHEN `decay_round()`,THEN **0** 且诊断零新增(EC13 域闭腿);WHEN `apply_effect(attack_up, …)`,THEN **false**(EC1 全场战后腿);WHEN `notify_battle_start()`,THEN true 且容器空(唯一出口——下一场战斗重启,States 表)。 - -**授予与合并三分支** - -- **AC-3** GIVEN Active,WHEN `apply_effect("attack_up", {safe_cell, (3,4), round_index=2})`,THEN true 且 `query_active(hero)` 恰 1 实例,其 **effect_id="attack_up"、layers=1、remaining=D_a(attack_up.duration_settlements 表读值)、source_class="safe_cell"、origin_cell=(3,4)、round_index=2** 六字段逐一相等(P2 归因字段授予即携带——Rule 3,结算明细逐行标注的数据源)。 -- **AC-4(stack 分支前两腿 + “R 不动” spec 决议)** GIVEN Active,D_a/M_a 为表读值。腿 1 GIVEN 无存活实例,WHEN `apply_effect(attack_up, …)`,THEN true、新实例 **L=1、R=D_a**。腿 2(前提 **D_a ≥ 2 ∧ M_a ≥ 2**——默认表值 2/2 满足;前提不满足时本腿退化跳过不假失败,**跳过须输出显式 SKIP 标记防 CI 静默**——2026-09-09 评审增补,夹具一致性声明)GIVEN 腿 1 实例经 `decay_round()` 一次(R=D_a−1),WHEN 再 `apply_effect(attack_up, …)`,THEN true 且 **L=2、R 仍=D_a−1**——**stack 授予不触碰 R**(F1 注 spec 决议:只有初始授予定钟;实现若重置 R 即三分支失去区分性,本腿即其暴露点)。 -- **AC-5(refresh 分支 + EC4 + EC10;表根 = `status_effect_policy_rows`,测试行非 MVP 内容)** GIVEN Active,D_f=3、m_f=+10(夹具规格登记值)。WHEN 依次:① `apply_effect(refresh_probe, …)` → true、新实例 L=1、R=D_f、载荷 = 1×m_f(refresh 行 L≡1——F2);② `decay_round()`(返回 0,R=D_f−1)后 `apply_effect(refresh_probe, …)` → **true、R 重置=D_f、L 不变**(F1 refresh 正常腿);③ R 已=D_f 时 `apply_effect(refresh_probe, …)` → **true 且实例六字段 + 载荷逐字不变**(**EC4 空刷新 = 合法空操作**——refresh 无满层/溢出语义);④ 再 `apply_effect` ×2 → 均 true(max_stack=4 从不被消费——**EC10 行为 = 忽略**);⑤ 该根经测试通道加载诊断为零(内容约定非校验项——EC10 非校验半句)。 -- **AC-6(independent 分支 + EC14;同夹具根,测试行非 MVP 内容)** GIVEN Active,D_i=3(夹具规格登记值),WHEN 同轮授予批次内以**互异 origin_cell**((1,1)/(2,2)/(3,3)——插入序可观测的前提,2026-09-09 评审增补)`apply_effect(independent_probe, …)` ×3,THEN 全部 true 且 `query_active(enemy)` 恰 **3 个并存独立实例**(各 L=1、R=D_i、**投影序列 = 授予序**((1,1)→(2,2)→(3,3))——互异 origin_cell 使插入序成为可判定断言,Rule 6 枚举确定性);WHEN `decay_round()`,THEN 返回 0(D_i≥2 无移除)且三实例各自 R=D_i−1(F3 逐实例、无豁免);实例数上界 = 受理授予数(**EC14 有界确定**——无满层语义)。 -- **AC-7(EC6 不去重)** GIVEN Active 且已有 attack_up 存活实例(L=1,构造同 AC-3),WHEN 以**完全相同**的 (effect_id, source)(同 origin_cell、同 round_index——同一事实重复转化的模拟)再次 `apply_effect`,THEN true 且同实例 **L=2**——B3 **不去重**(dumb 账本,无从辨别事实合法性,EC6);**out-of-scope**:事实→授予恰一次转化归 B1 编排(义务②,deferral 生效条件 = Dependencies 清单)。 - -**衰减与时序** - -- **AC-8(F3 主式)** GIVEN Active(构造:`apply_effect(weaken)` ×2 → 单实例 L=2、R=1;`apply_effect(attack_up)` ×1 → R=D_a;**前提 D_a ≥ 2**——第二 WHEN 腿依赖,默认表值 2 满足,D_a=1 时该腿退化跳过 + SKIP 标记,同 AC-4 口径——2026-09-09 评审增补),WHEN `decay_round()`,THEN 返回 **1**(= 构造中 dur=1 实例数,由表读值推导;weaken 实例移除)、attack_up R=D_a−1 仍在、容器插入序不变;WHEN 再 `decay_round()`,THEN 返回 1(attack_up 移除——**R 归 0 即销毁,容器无 0 值实例**,与不变式 remaining ∈ [0, D] 相容);WHEN 对空容器 `decay_round()`,THEN 0(F3 极端域)。R 轨迹与 k 全部由表值推导。 -- **AC-9(EC5 dur=1 单轮叠层 + 一次性全落点)** GIVEN Active(新轮),WHEN 同轮授予批次内 `apply_effect(weaken, …)` ×3(N=3 为构造选择,≤M_w 表读值),THEN 全部 true、单实例 **L=3、R=1(=D_w 表读值)**、载荷 = 3×m_w(同轮兑付一次的合成输入;N 旗 = N debuff 总吞吐的对账归 B1 条款 2——义务⑤邻接,out-of-scope);WHEN `decay_round()`,THEN 返回 1、实例移除;WHEN 下一轮边界再授予 weaken ×1,THEN **新建**实例 L=1——**跨轮必为新实例**(旧实例已销毁,F1 Example weaken 腿)。 -- **AC-10(EC8 跨轮/跨图延续——结构性裁决)** GIVEN Active,attack_up 授予 ×1(R=D_a)。WHEN 连续多轮边界**仅 decay、无新授予**(停手轮/弃图轮的 B3 视角——B3 无图概念、换图/刷新零专用信号),THEN 实例 R 逐轮 −1 **不停摆**(无豁免实例、无参数——**无"不结算就不掉次数"的免费延时**,Rule 2),且每步 query 断言容器非空直至 R 自然归 0——**除 `notify_battle_end` 外无任何 API 入口使容器清空**(先轮授予的实例按 R 存续至自然到期)。**裁决**:EC8 的"换图不清空"对 B3 的可测内容 = 本条两句(跨轮延续 + 唯一清空入口);"换图"事件对 B3 不可观测(零接口)——端到端"真实换图下容器仍存续"归 B1 集成(编排契约:仅 battle_over 调 end——B1 API 合规半句,B1 GDD 域,非新增义务)。 - -**满层与拒绝** - -- **AC-11(EC3 满层拒绝与原子性)** GIVEN Active,M_a 为 attack_up.max_stack 表读值,构造叠满(M_a 次授予——次数由表值推导、不写死),THEN 前 M_a 次均 true、单实例 L=M_a;WHEN 第 M_a+1 次 `apply_effect(attack_up, …)`,THEN **false** 且容器逐字不变——query_active(hero) 恰 1 实例,其六字段 + 载荷 + display_name 与授予前快照**逐项相等**(拒绝原子性:无半写、无溢出落层,F1 Output Range);"溢出未生效"明细行归 B1(out-of-scope,义务①邻接)。 -- **AC-12(EC2 未知 effect_id)** GIVEN Active,WHEN `apply_effect("no_such_effect", 合法source)`,THEN **false**、容器不变;表行改名后的旧 id 同理。**政策声明**:悬空引用 MVP 不校验(本表暂无引用方,EC2 政策半句)——B4 RewardTable 首个 effect_id 引用回填时补校验 + 条件性夹具(out-of-scope,D2 双通道)。 -- **AC-13(加载期域校验全谱——程序构造,class_name 直引,A4 AC-5 同型)** GIVEN StatusEffectTable schema 类直引实例(不经 load()/preload()),WHEN `validate()` 分别作用于:percent=0(跨字段 percent≠0)/ percent=101 / percent=−101、flat=0(flat ≥ 1)、duration ∈ {0, 100}、max_stack ∈ {0, 17}、stack_policy/target_side/unit 各一出域枚举值、两行同 effect_id(重复键),THEN 各含对应域错误类别;WHEN 作用于域内代表值 percent ∈ {100, −100, 1, −1}、flat=1、duration ∈ {1, 99}、max_stack ∈ {1, 16} 及 **stack_policy=refresh 且 max_stack=4 的行**(EC10——内容约定非校验项,防过度约束锁死未来内容),THEN 零诊断。 - -**表值与一致性** - -- **AC-14(F2 合成 + EC7 不 clamp)** GIVEN Active,m 各值为表读值。腿 1(percent·stack):`apply_effect(attack_up)` ×2 → 载荷 = **2×m_a** 且 unit="percent" 标签随值输出(量纲标签不进乘法——F2;**前提 M_a ≥ 2**,默认满足,M_a=1 时退化为单层恒等断言 + SKIP 标记——2026-09-09 评审增补)。腿 2(flat):`apply_effect(ambush)` ×3 → 载荷 = 3×m_amb、unit="flat"(B3 不解释单位——排除声明)。腿 3(越域,EC7):同轮 `apply_effect(weaken)` ×M_w(M_w 表读值、≤16 同轮批授予合法)→ 载荷 = **M_w×m_w 原样输出、无 clamp**(“不 clamp”的可判定形式 = 载荷与表值推导值恒相等,任何地板都会使其不等);**承载声明**:本腿非平凡性依赖默认基线(M_w=16、m_w=−25 → −400,越出 percent 域)——knob 调参使 |M_w×m_w| ≤ 100 时退化为恒等断言、不假失败,**退化时用例输出显式退化标记(SKIP 日志),CI 可见、防静默失真**(2026-09-09 评审增补);地板/clamp 与换算方向归 B1 SettlementTable(out-of-scope,义务③)。腿 4:refresh/independent 行载荷 L≡1 已由 AC-5①/AC-6 承载(引用不重复)。 -- **AC-15(EC9 快照 vs 表重载——机制口径更正,2026-09-09 评审)** GIVEN 表根 = `status_effect_policy_rows`、Active、已授予 `refresh_probe` ×1 并 decay 一次(R=D_f−1、载荷 1×m_f)。WHEN 冒烟脚本经测试通道**换根加载** `status_effect_policy_rows_reloaded`(`load_tables(root, collect_only=true)` 直调——**非 D2 `reload()` 路径**:不过 set_reload_gate、不发 `config_reloaded`、无 EC16 语义,门语义归 D2 AC-16/B1〔OQ5〕;reloaded 根规格 = **D2 全表清单拷贝 + 仅置换 StatusEffectTable**,见前言夹具规格),THEN **已授予实例六字段与载荷逐字不变**(授予时拷贝 m/D/unit 数值快照——EC9“快照非活引用”,A4 EC8 同款语义;实例为 B3 自持,故 B3 冒烟自测,无需 deferral);WHEN `apply_effect(fresh_probe, …)`(新 id、无存活实例——refresh 重置目标取实例快照 D 的口径见 F1 注,本腿不涉存活实例重置),THEN true 且新实例 **R=9、载荷 1×(+20)**(夹具登记值)——**换根只影响后续授予**。 -- **AC-16(MVP 内容四行)** GIVEN ConfigDB 默认根加载完成,WHEN 读 StatusEffectTable,THEN **恰含 4 行**、effect_id 集合 = {attack_up, defense_up, ambush, weaken}(定值);target_side:attack_up/defense_up=hero、ambush/weaken=enemy,unit:percent/percent/flat/percent,stack_policy=stack ×4(均非 knob 结构、定值断言合法——Rule 10"四行全 stack");display_name 四值非空(精确值对账归 AC-18);**magnitude/duration_settlements/max_stack 仅作类型域断言、期望 = 表读值**(knob 纪律——A4 AC-1 同款,防调参打假;行表"来源"列为 provenance 非表字段、不作断言)。 -- **AC-17(确定性——A3 AC-17 同型;2026-09-09 评审增补可观测序腿)** GIVEN **全新容器实例 ×2**(同 ConfigDB 默认根;每遍新实例、无跨实例状态),WHEN 同一定长序列驱动两遍(start → **defense_up×1 → attack_up×1**(同侧双实例、授予序 = 字典序**逆序**——区分“插入序实现”与“字母排序实现”的判别性前提)→ query 投影(hero 恰 2 实例,**投影序列 = [defense_up, attack_up] 定值断言**——插入序的行为级观测点)→ weaken×1 → decay → query 投影 → attack_up×1(并入 L=2)→ decay → end → query),THEN 两遍的 query_active 投影序列(**含插入序**)与 decay_round 返回值序列**逐项相同**,且 hero 侧投影序恒 = 授予序(非字典序——零随机 + 插入序枚举的双重行为级证据——Rule 1;D2 AC-15 的 B3 层前身)。 -- **AC-18(registry 一致——A3 AC-10a 同型,无条件断言;2026-09-09 评审随 registry 逐字段键重构同步改写)** GIVEN ConfigDB 默认根加载完成,WHEN 脚本解析 `design/registry/entities.yaml` 的 `status_effect` 条目(**逐字段 YAML 键**——机器对账前提,action_economy 同构),THEN:① `fields` 八键与 ConfigDB schema 字段名逐一相等、各键的类型/域/枚举描述与 schema 定稿相等(**缺任一键即失败**);② `mvp_content` 四键 id 集合与表行 id 集合相等,**非 knob 结构字段**(target_side/unit/stack_policy)逐一相等;③ `rule4_exemption` / `dangling_ref_policy` 注记存在性断言。knob 活值(magnitude/duration_settlements/max_stack)**不作定值对账**(A4 AC-8 同款——对账口径 = registry 随调参同步〔接口漂移义务〕,本 AC 豁免其值)。**生效前提**:本条目为本文定稿 Phase 5b 回填 + 2026-09-09 评审逐字段键重构的产物,AC 生效前提 = 重构回填完成(不写“若存在”软口径——条件化使一致性检查落空,A3/A4 均无条件)。 -- **AC-19(静态扫描——D2 AC-9/AC-10 模式引用,A3 AC-10b 同型)** B3 文件集(容器/schema/冒烟脚本/夹具规格)纳入 D2 AC-9 模式项目级扫描域(`randomize()`/`RandomNumberGenerator`/ConfigDB 外 data 表加载/`extends Control`/`.tscn` preload——零命中;**schema 与容器的 class_name 直引实例化豁免**——AC-13 前提,A4 AC-7 同款)+ D2 AC-14 人工三要素字面量扫描(引用不另设硬 THEN——字面量判定误报率高,D2 已定性 warning 级 + 人工复核)。零随机的行为级硬证据 = AC-17。 - -**覆盖矩阵(qa-lead 交付,验收评审用)**:Core Rule 1→AC-1/2/10/17/19 · Rule 2→AC-8/9/10 · Rule 3→AC-3+前言 API 封闭 · Rule 4→AC-4/5/6 · Rule 5→AC-11(明细行→B1 义务⑧+B5×2 已登记,2026-09-09)· Rule 6→AC-1/2(decay 次序 OOS)· Rule 7→OOS(载荷只读面 AC-14)· Rule 8→前言 API 封闭+OOS · Rule 9→AC-13/16/19 · Rule 10→AC-16/18 · F1→AC-4/11(stack)/AC-5(refresh)/AC-6(independent)· F2→AC-14+AC-5①/AC-6 · F3→AC-8/9/10 · EC1→AC-1/2 · EC2→AC-12 · EC3→AC-11 · EC4→AC-5③ · EC5→AC-9 · EC6→AC-7 · EC7→AC-14 腿3 · EC8→AC-10 · EC9→AC-15 · EC10→AC-5④+AC-13 · EC11→AC-1/2 · EC12→AC-1 · EC13→AC-1/2 · EC14→AC-6——无洞。 - -## Open Questions - -1. **weaken 条款 2 锚正式裁决**(owner:B4/B1;deadline:B1 GDD 强制检查点):Formulas 红色预警的裁决落点——坐实违反则上调 magnitude 或重定最低档参照(锚 owner 定值),走接口漂移回写 registry;裁决时复查 AC-14 腿 3 非平凡性。**前置步骤(2026-09-09 评审增补):B1 先钉死归一口径(每结算瞬时当量 vs 每 AP 总暴露),口径落定前禁止任何数值修订**——两读法下修复空间不对称(瞬时读法 m_w≥51 可行〔越域界随移〕、总暴露读法被 schema 域禁止,见 Formulas 红警增补);口径落总暴露则现实解 = B4 重定参照。 -2. **ambush 量纲定稿**(owner:B2,设计顺序第 7 位;联动 F1 条款 3):flat 的"+3"的单位(候选"每颗已开雷的伤害加成");B2 定稿后 B1 才能做条款 3 上限检验。 -3. **首个 refresh/independent 内容行的 AC 补全**(owner:B4,第 8 位):EC4 登记义务——奖励池引入非 stack 行时补真实内容行冒烟 AC,夹具探针行退役。 -4. **clear_reward 源授予**(owner:B4,第 8 位):清图奖励若含 buff 的授予路径确认(apply_effect source=clear_reward;A3 F1 条款 4 差异化插槽)。 -5. **EC9 reload gate 的 B1 侧落点**(owner:B1 GDD 门禁评审;本文定稿时随 systems-index 门禁记录登记):防"战斗中真的被置位"零落点(qa-lead 缺口 #4)。 -6. **效果当量对照表的预检重跑**(owner:B1,第 9 位):条款 1 对照表落定时按 Formulas 预警重跑 weaken/ambush 方向性预检(正式对账载体)。 -7. **stack-不重置 R 的 playtest 证伪项**(2026-09-09 评审登记;owner:垂直切片前置 playtest 批次):F1 注决议(用户拍板、结构冻结)的体验面反例检验——“早拿必亏”(分轮拿满总暴露 150pp vs 同轮拿满 200pp)叠加奖励身份不可预读(创意风险 #1)是否伤害“把 buff 纳入挖掘推理”的规划感〔P1〕。补偿载体先行:B4 奖励身份预读(义务已登记 systems-index)+ D5“同轮拿满”教学;**证伪成立则走结构冻结修订流程回炉**(合并/重定义 stack 分支)——非调参。 diff --git a/design/gdd/legacy-2026-09-13/b4-reward-item-economy.md b/design/gdd/legacy-2026-09-13/b4-reward-item-economy.md deleted file mode 100644 index 39a55b63..00000000 --- a/design/gdd/legacy-2026-09-13/b4-reward-item-economy.md +++ /dev/null @@ -1,395 +0,0 @@ -# B4 奖励与道具经济(Reward & Item Economy) - -> **Status**: In Review → Revised(2026-09-09 full /design-review:五专员〔game/systems/economy/qa/ux-designer〕+ creative-director 终审,NEEDS REVISION——14 条 blocking 同日修订核销,待 delta 复核放行;lean 定稿批的"CD-GDD-ALIGN skipped"已随本次终审补位) -> **Author**: user + agents -> **Last Updated**: 2026-09-12(旧口径摘要同步:L89/L90/L238/L267/L296/L324 对齐 L94 关卡域权威版) -> **Implements Pillar**: P2(主——奖励是"扫雷的因"的兑现物)· P3(安全格价值侧)· P1(奖励身份可预读 = 规划素材) - -## Overview - -B4 是战斗域的**奖励层**:定义"扫雷决策的兑现物是什么、值多少、怎么随机、怎么入库"。数据侧,它持有 D2 `RewardTable` 的回填权——奖励条目(buff 行引用 / 伤害道具 / 治疗包等,类型封闭枚举见 Core Rules)、权重、档位、清图奖励插槽行;随机侧,它消费 `reward_roll` 封闭流(registry 已登记 salt,"每次 board install(格奖励批 + 清图奖励批)"语义归 B4——2026-09-09 定稿批改写 registry;零自建 RNG,可回放前提)。行为侧,它承载三件事:**① 安全格奖励内容**——A2 `cell_revealed{reward_eligible=true}` 事实的兑现物:buff 类经 B3 `apply_effect` 入状态容器(B4 只定"给哪行、几层"),非 buff 类(伤害道具/治疗包)入道具库存;**② 清图奖励**——`round_end{path_tag=cleared}` 触发,A3 条款④ 钉死"清图奖励 > 0"且预留 biome/tag 差异化插槽结构位(图类型战斗域恒定、不逐图重掷);**③ 伤害道具体系**——**主角基础攻击之外的规划面伤害**(2026-09-11 用户裁决:HeroTable.atk 基础攻击恒存在、域 [1,999]、0 加载拒绝——原"唯一伤害来源 / atk=0 机制开关激活侧"口径退役;伤害道具默认经固定顺位作用于敌单位,囤刀/抢杀/爆发时点 = 其规划价值所在)。 - -没有 B4,三件事失去落点:P2"规划的延迟兑现"没有兑现物——扫雷的"因"找不到战斗的"果"(规划退化为空转);胜利路径断裂——B2 已声明当前内容态敌人不可被击杀,胜负判定素材永远悬空;A4 三条定价硬约束(雾内档位下界 / 清图锚上浮 / 净当量带上界)没有承载对象——安全格价值体系无从校准。B4 的边界:它管"奖励**是什么、值多少、怎么 roll、怎么入库**";"何时兑付、结算顺序、明细行协议"归 B1 SettlementTable;棋盘面资格事实归 A2(B4 与 A2 零直接接口——事实经 B1 结算编排转化,B2 同款);buff 的时限/叠层/衰减机制归 B3;棋盘侧功能道具(探测、安全旗)归 A5(垂直切片);关卡大奖励、代币、天赋归 C2/C4。机制与内容分离(B3 先例):机制归本 GDD,内容行(道具池成员与权重数值)MVP 收窄,名录扩展归垂直切片/Alpha。 - -玩家的每一轮都在**预读**它:已开格与库存的奖励身份**恒定可读**("这格是增伤"——Rule 8),叠加两条全板先验——**每个安全格必有货**(F1 结构保证)与**雾格档位更高**(F2)——共同构成 MVP 的规划素材:玩家据此做"往雾区推进、囤刀待机、叠层满载后收手"的路线与节奏决策。**如实口径(2026-09-09 评审改写)**:面向特定道具的寻路("绕开两颗雷去拿那把刀")须以未开格身份可读为前提,MVP 未兑现——结构前提已备(身份 install 期已定、预读查询面就绪、A5 探测零成本桥接),呈现深度 = OQ2(垂直切片);创意风险 #1 维持 OPEN(结构前提落地 ≠ 风险闭合)。可预读 → 入库可规划(何时用)→ 规划兑现可归因(P2 闭环)——这是 P1"推理的掌控感"在奖励侧的 MVP 形态,寻路形态随 OQ2 兑现(B3 presentation_obligations 的 B4 条目同步收窄)。 - -*(实现口径注:奖励容器/道具库存的类结构与事件载体不在本 GDD——实现期 ADR 域。)* - -## Player Fantasy - -**直接承载**(Section A 定框答案:玩家每一轮都在开格、都在捡东西、都在结算里看到自己捡的货)。B4 的情绪目标一句话:**"我在地牢里淘东西,不是在领系统发放的补偿"**——开格的瞬间,奖励身份就在场、可读、是我的探索所得;它先是一份捡到的战利品,其次才是一行结算数据。 - -体验锚点(按支柱): - -- **P4 地牢住户的遗物**:奖励给"下探"一个收集动机——**雾区/高危区的格子货更好**(F2 档位下界;原"越深的格子越可能有好货"的深度轴 MVP 零载体,2026-09-09 评审如实收窄为"越险货越好"的 P3 面;深度/图类型差异化 = clear_\/池变体结构位,垂直切片登记),"边探边捡"是地牢氛围的经济侧骨架(Microsoft Minesweeper Adventure 的开格出宝同源);开格瞬间的"这格有货"是本系统的高频情绪节拍。 -- **P2 拾取的糖、结算的实**:捡到的东西不当场生效——只入库,轮次结束在结算明细里逐行兑付("治疗包 ×1 入库(第 2 轮 · 安全格)",生效在其后的窗口选用/道具段——原示例"治疗包 +3"易误读为即时回血,2026-09-09 评审更正);拾取瞬间的糖与延迟兑现的实各管一半,后者是 P2 归因的奖励侧落点。 -- **P1 身份可读 = 拾取感的地基**:开格后这格是什么**恒定可读**(本格奖励身份不重掷、不明雾化)——玩家看得见才留得住:"囤刀待机、看准重击拍再用"的库存规划是拾取感的长线 MVP 形态(奖励身份预读义务——已开格 + 库存恒读;面向未开格的寻路 = OQ2/A5 兑现后的二期形态,Overview 如实分档)。 -- **P3 越险货越好**:雾区/高危区的奖励档位下界更高(A4 三条定价硬约束的体验面)——"危险的地方货更好"是风险收益同源在拾取侧的直觉。 - -参考感受:Microsoft Minesweeper Adventure 的开格拾取(身份即在场的战利品,不是无名金币)+ 杀戮尖塔奖励节点(有名字、有用途、进构筑的战利品)。**反向对照**:无身份的纯数值掉落("你获得了 +5"式系统补偿)与开包式随机惊喜(拿到了也不知道是啥)——正是本作要避开的两种感受。 - -**反向护栏**:奖励的随机只发生在**桌下**(roll 决定这格**是什么**),身份永远在**桌上**(开格后恒定可读)——任何"开格后仍不可读""结算时才揭示身份"的呈现设计默认砍掉(违反 P2 归因 + 掐死拾取感本身);拾取的糖不得改成即时生效(绕过 B1 结算即违反 P2 统一兑付,game-concept 定稿)。 - -> 注:`creative-director` 已于 2026-09-09 full /design-review 终审本节情绪定位(五专员对抗 + CD 合成);按 CD 裁决,本节预读/寻路声称已如实降级至 MVP 呈现面,创意风险 #1 保持 OPEN。 - -## Detailed Design - -> **决策记录(2026-09-09 用户拍板)**:奖励身份 = **install 期预分配**(板级结构事实)· 伤害道具/治疗包 = **结算中玩家选用**(道具使用窗口——概念文档"主动道具后续版本加入"的遗留问题在 MVP 激活,接口漂移登记 Dependencies)· 结算段序 = **增益/减益段 > 道具段 > 战斗段**(核心序)· 库存 = **全部战斗域**(battle_over 全清——与 Peglin 参照"道具跨循环累积"不同,概念层口径交 consistency-check 对齐)· 连锁溢出 = **直接算零、无折算补偿**。 -> **决策记录增补(2026-09-09 full 评审用户拍板)**:**窗口锚点由"结算解析前"移至"授予段之后、增益/减益段之前"**——当轮拾取的道具当轮即可用(消除"当轮拾取下轮才可用"的未陈述规则与末图清图奖励必然作废两个伪影;核心段序 buff/debuff > 道具 > 战斗不变,Rule 5)。 -> **决策记录增补(2026-09-11 用户拍板:两级奖励 + 关内延续 + 治疗稀缺化 + 窗口单件)**:① 奖励按**交付轴分两类**——即时类(buff/instant_aoe/instant_heal,授予段当场兑付、不进库存、零决策,默认根 75%)/ 可选类(damage_item/heal_pack,入库库存、窗口选用、效果更强,默认根 25%);② **库存生命周期 = 关卡域**(跨战斗延续、关卡末清空/折算——原"战斗域 battle_over 全清"拍板作废,OQ4 主体闭合);③ **治疗两级**——instant_heal(小额即时)+ heal_pack(稀缺强治疗,权重 25%→6%、power 4→12),治疗整体供给下调;④ **道具使用窗口至多选用一件**(原"任意多件"作废——先验证单件制,体验反馈后再议);⑤ buff 时长改当次结算(attack_up/defense_up D=1——即时类"当次"语义)。 - -### Core Rules - -1. **奖励类型封闭枚举(2026-09-11 用户裁决:两类奖励扩容)**:`{buff, damage_item, heal_pack, instant_aoe, instant_heal}`——MVP 恰五值,按**交付轴分两类**:**即时类** = `{buff, instant_aoe, instant_heal}`(授予段当场兑付、不进库存、零决策——多数,默认根 75% 权重)· **可选类** = `{damage_item, heal_pack}`(入库存、窗口选用——少数更强,默认根 25% 权重)。预留值(`resource` / `aux_item`〔A5 桥接〕等)校验拒绝(fail-fast,B2 pattern 预留先例);启用走本 GDD 修订。每条奖励 = RewardTable 一行;buff 类携带 B3 `effect_id` 精确引用——首个引用行回填时激活 B3 悬空校验 + 条件性夹具(dangling_ref_policy 兑现)。即时类 power ≥ 1 同道具类(加载校验)。 -2. **板级身份预分配(install 期 roll,用户拍板)**:board install 后、挖掘开始前,B1 编排调用 B4 `roll_board(资格格清单)` **恰一次**——B4 消费 `reward_roll` 封闭流,按规范序(行主序)对全部有资格格 roll 奖励身份,并同批 roll **清图奖励身份**(默认槽)→ 写入**板级映射容器**(格子→reward_id;清图→reward_id)。同图跨轮身份恒定(棋盘状态跨轮延续同款);换图/retire 即映射消亡。**零随机出此一线**:授予期与使用期零 roll,道具威力 = 恒定表值。*语义注记:registry `rng_service.scope_event_binding` 的 reward_roll 批次语义由"每次奖励结算"改写为"每次 board install(格奖励批 + 清图奖励批)"——接口漂移回写义务**已兑现**(2026-09-09 定稿批,registry/D2 同步;consistency-check 2026-09-09 修正条目名——原误引 board_gen)。* -3. **分流与入库(编排期转化,B2 同款;2026-09-11 增即时类当场兑付分支)**:B1 结算编排期对每格受理事实调 B4 `grant(cell)` → 返回预分配身份;**buff 类**由 B1 调 B3 `apply_effect(effect_id, source={safe_cell|clear_reward, origin_cell, round_index})`;**即时类**(instant_aoe / instant_heal)由 B1 授予段**当场兑付**——不调 stock、不进库存、不出窗口(`instant_aoe` = 对全体存活敌各 power 点,恒定表值;`instant_heal` = 主角 +power、clamp,满血 → "奖励未生效"行——零兑付诚实);**道具类**(damage_item / heal_pack)由 B1 调 B4 `stock(item)` 入关卡域库存。B4 与 B3/A2 零直接接口。**受理恰一次归 B1×②**(2026-09-09 评审补——对齐 B2 义务②/B3 EC6 先例);同格重复 grant = 幂等受理(同一快照 + debug 诊断,E18)。**buff 类满层拒绝(apply_effect 返回 false)→ 零兑付**(用户拍板:直接算零、无折算补偿)+"奖励未生效"明细行(B1 义务②〔本 GDD 清单〕/ B3 义务⑧ 同款协议——P2 诚实,不静默蒸发)。 -4. **道具库存(关卡域——2026-09-11 用户裁决"关内延续",原战斗域拍板作废)**:库存容器生命周期 = **关卡域**——跨轮次、跨扫雷图、**跨战斗延续**;**关卡结束**(victory/defeat 皆然——关卡结构归 C1/C2,落位前由上层显式编排调用)由 B1 编排调 `clear_inventory`(义务⑤ 改写——battle_over 只退役板级映射,不清库存)。条目 = 逐件实例(`item_id` + 来源 `{cell, round}` 保 P2 归因);数量无上限(旗无上限同款,稀缺性由 roll 权重承载)。**设计意图**:可选类道具是关内资产——"囤刀待机"的规划视野从一场战斗扩展到整个关卡(P2 长线形态的兑现);战斗末"不花就没了"的强制消费消除。 -5. **道具使用窗口与结算段序(窗口锚点 2026-09-09 评审修订;单件制 2026-09-11 用户拍板)**:轮次结束触发后,结算按**段序骨架**解析:**授予段(编排期转化,含 grant_clear 兑付与即时类当场兑付)→ 道具使用窗口 → 增益/减益段 → 道具段 → 战斗段 → 衰减段 → 判定段**(核心序拍板不变:buff/debuff > 道具 > 战斗)。**窗口**:D1 呈现,玩家**至多选用一件**库存道具(或跳过——2026-09-11 用户拍板"先不需要多选",避免结算复杂度;体验反馈后再议恢复多件,属本规则修订非调参);选择序语义随之退化为单件。**道具段**:至多一件生效——伤害道具按**固定顺位**作用于敌单位(B2 Rule 7 默认目标)、治疗包回血主角;一次性消耗(Used 不可逆)。**段序的战术面**:道具段先于战斗段 → **当轮拾取的刀**(伤害道具的项目行话,全文同义)即可削血触发 B2"死亡即不动手"(抢杀窗口——"重击拍前用刀"是读怪的执行手段)。 -6. **清图奖励(A3 条款④ 兑现)**:cleared 轮结算编排期,B1 调 B4 `grant_clear()` → 预分配身份兑付(分流同 Rule 3)——**恒非空**(结构保证:清图槽 roll 表禁止空结果行);biome/tag 差异化 = 插槽结构位(MVP 单默认槽;`clear_` 行命名空间预留、校验拒绝——A1 elite_/boss_ 同款);图类型战斗域恒定、不逐图重掷(install 批次承载)。 -7. **治疗两级语义(2026-09-11 用户裁决:治疗两类化 + 稀缺化)**:治疗拆两级——**instant_heal(即时类)**:授予段当场回复 `power` 点(clamp,满血 → "奖励未生效"行零兑付),小额常见、零决策零库存;**heal_pack(可选类)**:窗口选用、库存消耗,**稀缺且更强**(默认根权重 6%、power 12——原 25%/4 作废;治疗整体供给与决策价值双降,"治疗是稀缺奖励")。heal_pack 满 HP 使用 → **拒绝**(不烧包;守卫归 B1 编排读 B2 hero hp 判定——B4 零跨系统读;**可用性预判 usable_now 由 B1 编排组装进窗口数据**〔义务④〕供 D1 禁选/提示)。 -8. **奖励身份预读(P1/P2 承重)**:已开格 + 库存的奖励身份**恒定可读**(预分配的结构保证——身份自 install 即定,非授予期随机;**MVP 规划面的如实口径见 Overview——未开格不呈现,寻路待 OQ2**);未开格身份 MVP 不呈现(结构上已定且可查——A5 探测道具零成本桥接,OQ 登记);**映射 Ready 后只读**(负空间:无重掷 API——任何重掷 = 接口漂移)。 -9. **RewardTable schema(D2 新表,本 GDD 回填 owner,走 D2 接口漂移规则回写)**: - -| 字段 | 类型/范围 | 说明 | -|---|---|---| -| reward_id | String(表内主键) | 实体键精确匹配(D2 Rule 4) | -| category | enum {buff, damage_item, heal_pack, instant_aoe, instant_heal} | MVP 校验域(2026-09-11 两类奖励五值);预留值拒绝(Rule 1) | -| effect_id | String(可空) | buff 类必填——B3 StatusEffectTable 精确引用;非 buff 类恒空 | -| display_name | String(非空) | 玩家可读名(D1 义务①/窗口呈现数据源;本地化归 D6——B2 EnemyTable/B3 StatusEffectTable 同库惯例,2026-09-09 评审增补) | -| power | int [0, 999] | 伤害道具伤害值 / 治疗包回复值 / 即时类(aoe 全体各点·heal 回复值)(knob);buff 类不消费——非校验项(B2 heavy_multiplier 先例) | -| weight | int [0, 999] | 所在池内 roll 权重(knob);0 = 该池不出此行(合法极端) | -| pool_tag | enum {safe_cell, clear_default}(+ clear_\ 预留) | roll 池分组——格奖励池 / 清图默认槽;雾区档位过滤谓词见 Formulas | -| tier | int [1, 8] | 强度档位(A4 雾内档位下界约束的载体;knob) | -| use_timing | enum {pre_settlement} | 使用时机(MVP 唯一值;game-concept 预留字段的兑现——扩枚举走修订) | - -**表身份声明**:RewardTable 为**定义表**(非进度成长表),Rule 4 豁免、键 = reward_id(schema 注释承载——B2/B3 同款声明纪律,2026-09-09 评审补)。**B4 配置值载体(2026-09-09 评审增补)**:T_fog_min / K_dmg / N_draft / P_min 承载于**单行全局 RewardConfigTable**(D2 新表,本 GDD 回填 owner,HeroTable 单行全局接口漂移先例;字段域见 Tuning Knobs)——原"B4 配置值"无表落点、R3 override 无 key 空间的缺口由此关闭。 - -10. **编排被动性**:B4 零主动事件订阅(A2 事件面事实经 B1 转化)、零 UI 依赖(Core 层 headless 债)、零随机出 `roll_board` 一线(rng_service reward_roll 流封闭);B4 暴露映射/库存查询与授予/扣减接口,调用权集中归 B1 结算编排(B3"授予集中在编排"同款)。 - -### States and Transitions - -| 容器/条目 | 状态 | 进入 | 出口 | -|---|---|---|---| -| 板级奖励映射 | Unrolled → Ready → Retired | install 后 roll_board 恰一次 → Ready;Ready 期间**只读** | retire_board/换图 → Retired(消亡,不跨图) | -| 库存条目 | InStock → Used → Cleared | stock 授予 → InStock;窗口选用消耗 → Used(不可逆) | **关卡结束** → Cleared(clear_inventory——库存跨战斗延续后于关卡末清空,2026-09-11;battle_over 只退役映射不清库存) | - -实例不变式(debug 断言口径):Ready 后映射零写入;Used 不可逆;库存条目仅存在于关卡域(跨战斗延续——2026-09-11)。违规 = debug 断言中止(进程致命保留给 D2 数据通道,B2/B3 同款)。 - -### Interactions with Other Systems - -| 系统 | 方向 | 接口契约 | -|---|---|---| -| D2 | 双向(hard) | **RewardTable 新表 schema + 内容行回填**(本 GDD owner,接口漂移回写 D2 Core Rules 表清单 + registry)+ **RewardConfigTable 单行全局新增**(2026-09-09 评审——T_fog_min/K_dmg/N_draft/P_min 载体);读取经 ConfigDB 单点 | -| A2 | 间接(零直接接口) | 资格事实(reward_eligible/channel)经 B1 转化;A2 只报资格、内容与折算不经 A2(A2 Interactions B4 行对侧确认) | -| B1 | 下游 hard(**provisional**——B1 未设计) | 结算编排期调用:roll_board(install 后恰一次)/ grant / grant_clear / stock / use / query_inventory / clear_inventory;**B1 义务清单 6 项(缺项即 blocking,见 Dependencies)**——窗口锚点 = 授予段后、窗口选择序 = 回放输入、每格受理恰一次(2026-09-09 评审同步) | -| B3 | 相邻(零运行时依赖) | buff 类经 B1 调 apply_effect(source_class=safe_cell/clear_reward 已在 B3 枚举内);**锚验收权归 B4/B1**(weaken 档位 vs 最低档安全格 buff 当量——A3 条款 2);满层拒绝协议对侧;首个 effect_id 引用回填激活悬空校验 | -| B2 | 相邻(零运行时依赖) | 伤害道具默认目标 = 固定顺位(Rule 7 消费);atk 激活裁决参与方;**道具段先于战斗段 → 抢杀窗口的道具形态**(段序战术面);伏击清单扩展联动对侧 | -| C3 | 下游 soft(provisional) | 权重/档位/威力曲线数值调参所有权(默认根行集已登记、provisional);T_fog_min/K_dmg/N_draft/P_min 参数(RewardConfigTable);**调参期批量仿真义务**(刀供给分布 × A1 板分布的 F5 可行率——2026-09-09 评审登记,缺口预检);雾区档位过滤谓词的参数归 C3 | -| C1/C2 | 下游 soft(provisional) | biome/tag 图类型供给(插槽差异化输入);关卡大奖励归 C2(B4 无关);**关卡结构 = 库存关卡域的容器**(2026-09-11 关内延续——"关卡结束"事件归 C1/C2 定义,落位前 B1 暴露 level_clear 入口由上层显式调用);**关卡末剩余道具折算结构位归 C2**(OQ4 残余——转金币/继承候选) | -| D1 | soft | **呈现义务 5 项(缺项即 blocking;2026-09-09 评审 3→5 扩容)**:① 已开格+库存身份恒定可读(库存常读条 = 挖掘期规划面)② 道具使用窗口(授予段后弹出;选用/跳过/序/usable_now 呈现)③ 结算明细**四类行**呈现 ④ H2 清图奖励行强调呈现 ⑤ 关卡末(level_clear)库存清空可见反馈〔2026-09-11 关卡域改写对齐——权威版见下方 D1 侧义务清单⑤〕 | -| B5/D5 | soft | 结算明细道具行(数据源 = B1 流水,**含击杀结果字段**——H3 击杀标记数据源);道具使用窗口教学(拾取→囤刀→窗口选用的闭环)+ "关卡末库存清空"教学(RAP 清零同款先例;2026-09-11 关卡域改写对齐——原"战斗结束库存清空"作废) | - -**B1 侧义务清单(缺项即 blocking——B2/B3 对 B1 登记先例;2026-09-09 评审同步窗口/E10 拍板;2026-09-11 两级奖励批改写①②④⑤)**:① **结算段序骨架成文**:授予段(编排期转化,含 grant_clear 兑付与**即时类当场兑付**)→ **道具使用窗口**(授予段后、增益段前)→ 增益/减益段 → 道具段 → 战斗段 → 衰减段 → 判定段(用户拍板核心序 buff/debuff > 道具 > 战斗不变;B1 拥有段内细则,B2 义务①②③的转化与推进落点随段序定位;**窗口选择序列登记为结算回放输入事件**)② 奖励受理与分流编排(grant → **buff 类 apply_effect / 即时类当场兑付〔instant_aoe = 全体存活敌各 power、instant_heal = 主角回复 clamp〕/ 道具类 stock**;**每格受理恰一次、stock 与 grant 返回一一对应**〔2026-09-09 评审补——对齐 B2 义务②/B3 EC6 先例〕;**满层拒绝/即时类零兑付 = "奖励未生效"明细行、无折算**——用户拍板;未生效类行携带可聚合计数/批次字段——合并呈现归 B1/B5 裁决,数据须可聚合)③ **clear_reward 授予路径**(B3 OQ4 关闭条件:清图奖励 roll 身份 install 期已定、cleared 结算编排期兑付——**兑付后同结算窗口即可选用**;清图槽即时类同分支当场兑付)④ **窗口与道具段编排**(窗口时机 = 授予段后、增益段前;**窗口数据组装 = B4 query_inventory 投影 + B1 侧守卫预判 usable_now**〔满血治疗包禁选/提示——呈现归 D1;B4 零跨系统读不变〕;**窗口至多选用一件**〔2026-09-11 用户拍板——单件施加、目标/数值/明细行来源标注;原"任意多件 + 同窗顺序多包逐件动态守卫"作废,满血守卫拒绝不烧包保留〕;**零效果判定读 B2 存活集 + "已消耗未生效"明细行**〔E10 承接〕;**击杀结果进流水**〔H3 击杀标记数据源——B5/D1 呈现消费〕;治疗 clamp)⑤ 生命周期编排(**关卡结束调 clear_inventory 恰一次**——2026-09-11 关卡域拍板改写,原 battle_over 时点作废;**清空前后快照计数供"随关卡结束清空"反馈行**〔D1 义务⑤〕;battle_over 调映射退役〔映射 = 板级,随战斗消亡——下一场战斗新板新批〕)⑥ roll_board 调用时机(install 后、挖掘前**恰一次**——B4 侧相位守卫见 E5/AC-1 分支 3;B1 编排纪律承载调用时点半〔B4 不可观测〕)。 - -**D1 侧义务清单(缺项即 blocking;2026-09-09 评审 3→5 项扩容——H2/H3/清空反馈升义务,"清单外登记会丢失"先例;⑤ 随 2026-09-11 关卡域改写)**:① 已开格 + 库存奖励身份恒定可读(**库存常读条 = 挖掘期规划面**而非仅轮末窗口——Rule 8/Overview;**关内延续后常读条跨战斗可见** = 关卡资产感的数据面)② 道具使用窗口呈现(授予段后弹出;选用/跳过/**单件选用**〔2026-09-11 拍板〕、**usable_now 可用性投影呈现**〔满血治疗包禁选或选中提示〕、窗口时机指示、空库存可不弹窗〔E8〕、窗口触发政策注记〔MVP 有库存恒弹;候选"仅可用品触发/常驻库存条非模态"归垂直切片〕)③ 结算明细**四类行**呈现(道具行〔含入库/生效语境注记〕/ "奖励未生效"行〔**按聚合计数呈现**,数据源含可聚合字段〕/ "已消耗未生效"行 / "使用被拒"行——数据源 = B1 流水,P2 归因)④ H2 清图奖励行强调呈现(轮末仪式峰值)⑤ **关卡末库存清空可见反馈**("剩余道具 ×N 随关卡结束清空"汇总——2026-09-11 关卡域拍板改写,原 battle_over 时点作废;层间过渡"库存 ×N · HP 带入下一层"可见反馈 = 垂直切片候选)。 - -## Formulas - -> systems-designer 代理起草(lean 门禁,2026-09-09);两处口径经用户拍板:**道具伤害恒定表值不吃修正** · **保底 = 草稿重 roll**。除 F1/F3/F5 消费 `reward_roll` 封闭流外全部公式零随机;数值默认全部 provisional 归 C3。术语:**资格格** = 开出时 reward_eligible=true 的格(A2 事件面:chain/dig 通道的安全格)。 - -### F1 身份 roll(weighted_pick,install 期执行) - -``` -资格格集 = S ∖ R₀(安全格减初始展开域——initial/mine 通道恒不 eligible,install 期可精确枚举) -行主序逐格取 reward_roll 一号 r ∈ [0, W):身份 = 累积权重区间 [Σw_{0} ∩(雾格 ? {tier ≥ T_fog_min} : 全体);weight=0 行取号前剔除 -批尾取一号 roll 清图身份(F3;批尾 = 同一批取号中最后消费的一个号——registry terminology 已登记)→ 双映射提交 Ready -``` - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 取号 | r | int | [0, W) | reward_roll 流单号(F1/F3/F5 消费) | -| 权重 | w | int | [0, 999] | RewardTable.weight;0 = 不入池(取号前剔除) | -| 雾档门限 | T_fog_min | int | [1, 8] | F2;RewardTable 配置值 | -| 资格格集 | S ∖ R₀ | 格集合 | 板级 | B1 供清单(义务⑥) | - -**裁定:池空(过滤后零行)= 结构性不可达**——D2 加载期校验致命(每 pool_tag × 雾/非雾两态各 ≥1 行 weight>0)。理由:身份 install 期预分配、授予期零随机零回退,运行时身份缺口无合法语义。单行池退化为恒等选取(合法极端)。 -**Output Range:** 每资格格恰一身份、清图槽恰一身份;Ready 后映射只读。 -**Example:** 三行 w=2/1/1,W=4,r=3 → 第三行(区间 [3,4))。 -**边界注记**:流 scope = 每次 board install 恰一批(registry 绑定改写义务,Rule 2);消费序与恰一次归 B1;Ready 后只读(无重掷 API——F5 草稿重 roll 发生在提交前,不变式零触碰)。 - -### F2 雾区档位过滤(fog_tier_gate) - -``` -雾格池 = {tier ≥ T_fog_min};非雾格池 = 全 tier(谓词恒真、零分支) -``` - -**T_fog_min = RewardConfigTable 表值(默认 2 provisional)**——推导式(=最低档 buff 当量所在档)依赖 B1 对照表(A3 条款①,未设计)、加载期循环依赖不可行;A4 硬约束①(雾内档位下界 ≥ 最低档安全格 buff 当量)登记为**验收锚**非运行时校验——对照表落定/调参时核对"雾池最低档行当量 ≥ 最低档安全格 buff 当量"。**AC-19 序数检查的已知失效面(2026-09-09 评审增补,防后人"顺手"升格致命)**:tier 与当量零耦合(跨类别 tier 序不保证当量序——雾池 tier2 治疗包的当量可能高于 tier3 buff 行),故 AC-19 只作**档位序检查**(原"档位序代理",registry terminology 已登记)非当量保证,升格运行时致命会锁死内容;单行雾池下检查恒平凡真(判别力零)——默认根已布置两行雾池规避(见 Formulas 末节)。 -**Output Range:** T_fog_min=1 → 雾池=全池(过滤退化合法,约束①仅剩锚侧兜底);=8 → 仅最高档(非空由 F1 校验保证)。 -**Example:** T_fog_min=3 时雾格恒不出 tier≤2 行。 -**边界注记**:链开雾格同雾格待遇(A2 EC4);参数归 C3。 - -### F3 清图奖励 roll(clear_reward_roll) - -``` -槽谓词 = clear_(板 biome 匹配 ∧ 池非空)否则 clear_default;MVP:clear_ 行校验拒绝 → 恒退化 clear_default(结构位保留) -恒非空 = 加载期校验:clear_default 池 ≥1 行 weight>0 ∧(buff 行 effect_id 非空 ∨ 道具行 power ≥ 1) -roll = install 批尾一号,选行算子同 F1 -``` - -**Output Range:** 恒非空的可判定形式 = **恒有正当量行**(power=0 道具行被拒——A3 条款④"清图奖励>0"的表侧兑现);空池致命(同 F1 裁定)。 -**Example:** 命中 heal_pack(power=3) → cleared 轮 grant_clear 入库存。 -**边界注记**:roll 在 install 批、兑付在 cleared 结算编排期(零随机出 roll_board 一线);图类型战斗域恒定、不逐图重掷。 - -### F4 道具段与即时类效果式(item_and_instant_effects)——用户拍板:恒定表值 - -``` -伤害道具(可选类,道具段):D = power(恒定表值——不吃任何 percent 修正,2026-09-09 用户拍板) - 目标 = 固定顺位最前存活敌(B2 Rule 7),一次性消耗 -治疗包(可选类,道具段):可用 ⟺ hp < max_hp(满 → 拒绝、不消耗);hp' = min(hp + power, max_hp) -即时群伤 instant_aoe(即时类,授予段当场):对全体存活敌各 D = power(逐个 apply_damage、受击即死); - 零存活敌 → 零兑付"奖励未生效"行(结构性难达——授予段先于道具/战斗段,敌集空仅剩防御分支) -即时回血 instant_heal(即时类,授予段当场):可用 ⟺ hp < max_hp(满 → 零兑付"奖励未生效"行,不进库存无消耗语义); - hp' = min(hp + power, max_hp) -buff 类(即时类,授予段当场):B3 apply_effect;时长 = 当次结算(attack_up/defense_up D=1——2026-09-09 的 D=2 作废, - 两级奖励裁决下 buff 兑付窗口 = 授予段至本结算衰减段) -``` - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 道具威力 | power | int | [1, 999] | RewardTable.power(category ∈ {damage_item, heal_pack} ⇒ power ≥ 1 加载校验);恒定表值非 roll 值 | -| 主角血量 | hp / max_hp | int | [0, 999] | B2 查询(B1 编排读值做守卫——B4 零跨系统读) | - -**口径后果(2026-09-11 用户裁决改写——attack_up 复活)**:HeroTable.atk 基础攻击恒存在(域 [1,999]、0 加载拒绝——B2 Rule 9),**attack_up(+50%)复活**:唯一消费面 = 主角战斗段先手攻击(伤害算式归 B1 战斗段;"道具不吃修正"的拍板不变——attack_up 只乘基础攻击、不乘刀)。原"0 × 50% = 0 死行、MVP 池不含 attack_up"口径作废;**attack_up 是否入默认根池**随奖励改造批裁决(C3 内容所有权)——复活批不擅自入池。**A3 条款 2 锚的参照对象回迁 attack_up 当量**(B3 Interactions 原文即 attack_up——2026-09-09 迁 defense_up 的注记退役;换算归 B1 条款①对照表——B4 只供行值清单;B3 锚预警裁决前置不变)。weaken/defense_up 不入本式(敌输出侧/主角承伤侧,B2/B1 域);读值时点 = 道具段、施加归 B1(B4 零跨系统读)。 -**Output Range:** D = power(恒定);hp' ∈ [hp, max_hp](clamp 式上界——满血分支被拒绝守卫拦在消耗前)。 -**Example:** power=6 伤害道具 → 顺位最前敌 −6;重击拍前用刀击杀 → 该敌重击永不兑现(B2 死亡即不动手的道具形态)。满血(hp=max_hp)用治疗包 → 拒绝、库存不减。 -**边界注记:** 取整无涉(全整数);使用守卫(满血)归 B1 编排(义务④);hp=0 在窗口时点**结构不可达**(败判定在判定段、先于本窗口不存在;上一次结算的判定段保证到本窗口时 hero 存活)——不定义复活语义(2026-09-09 评审补)。 - -### F5 伤害道具保底(damage_item_floor,**每板可选伤害保底**——仅计 damage_item 行;拾取与使用不在保证域)——用户拍板:草稿重 roll - -``` -断言 |{c ∈ 资格格 | 身份(c).category = damage_item}| ≥ K_dmg(RewardConfigTable [0,999],默认 1 provisional) -执行 = roll_board 内"草稿-校验-提交":不过 → 草稿作废、同 scope 续消费流重 roll(全序确定、可回放) -超 N_draft 次(RewardConfigTable,默认 32 provisional)→ 致命(权重配置错误,fail-fast) -``` - -**语义注记(2026-09-11 两级奖励改写)**:保底对象 = **可选类伤害**(damage_item——玩家可控时点的伤害资源),即时类(instant_aoe)不计——即时类自动兑付无规划面,保底的意义在"每板至少有一把可囤可择时的刀"。**基础攻击在场后本保底为内容健康护栏非胜利路径闸**(B2 Rule 9——战斗恒可胜)。 - -**加载期护栏(2026-09-09 评审增补,两条新致命——关闭"保底全绿、游戏不可胜"的威力空洞与零伤害世界后门)**: -- (i) `K_dmg ≥ 1 ⇒ safe_cell 池存在 power ≥ P_min 的活 damage_item 行`(P_min = RewardConfigTable 配置,默认 8 = 默认根最低刀 power——2026-09-11 批)——manifest 行 `floor_supply_missing`(根 `b4_floor_supply`); -- (ii) `K_dmg = 0(断言关闭)⇒ safe_cell ∪ clear_default 仍须含 ≥1 活 damage_item 行`(无条件后闸——**内容健康护栏、非胜利路径闸**:2026-09-11 用户裁决后基础攻击保证战斗可胜,本闸防"零伤害道具世界"经纯内容调参静默复活导致战斗拖长、奖励系统空转;**与 B2 OQ9 并案登记同一 owner**)——manifest 行 `no_damage_row`(根 `b4_nodamage`)。 -- **概率性致命带注记**:合法权重下 N_draft 耗尽概率随 K/池构成可达非平凡值(同配置不同种子一个能玩一个崩——种子轮盘);调参期批量仿真(刀供给分布 × A1 板分布的可行率)登记为 C3 调参流程义务(缺口预检),把配置错误暴露在调参台而非玩家局内。 - -**Ready 后只读不冲突**:重 roll 全部发生在提交前(Unrolled 态);确定性 = 同 scope 消费轨迹的确定函数。**否决案存档**:清图槽保底(弃图流覆盖不到——RAP 刷图非必经清图;economy-designer 复核:清图免费换板且多清图槽,吞吐严格支配 RAP 刷新,无刷刀农场漏洞);safe_cell 伤害权重下界(概率缓解非结构保证,留作 C3 伴生调参)。 -**Output Range:** K_dmg=0 = 断言关闭(合法极端,胜利路径无保证——登记 C3 禁区默认值);|资格格| < K_dmg 恒不过 → 重 roll 耗尽致命,暴露配置错误。 -**Example:** 12 格板首稿 0 件刀 → 作废重 roll,次稿 1 件 → 提交 Ready。 -**边界注记**:断言仅计格奖励身份(清图槽不计);归 B4 自身,B1 仅编排恰一次调用。 - -### F6 当量换算供给(equivalence_supply,A3 条款①② 的 B4 侧输入) - -``` -供给 = RewardTable 全活行投影(safe_cell ∪ clear_default 逐行 category/display_name/power/tier/effect_id/weight)+ tier_min_buff = min{tier | safe_cell ∧ category=buff ∧ weight>0}(行集空 = F1 校验对偶致命) -量纲建议 = 主角 HP 点(与 m_amb 同量纲);伤害道具当量 = power(恒定表值直接可算) -``` -**供给面扩注(2026-09-09 评审)**:原"活 buff 行清单"收窄不足以承载 A4 约束②③与 A3 条款⑤对账——扩为全活行投影,道具/清图行值在内(B1 直读 ConfigDB 本也可绕过,接口名实相符)。 - -**衔接注记(B2 OQ3)**:伤害道具作为主角**规划面**伤害令"安全格拾取 → 伤害当量"可落地(2026-09-11 后基础攻击为恒定基底、道具为可规划增量——**部分缓解非闭合**——窗口使用次数是战斗轨迹量,归 B1);单一线性换算与条款 1/2/3/5 的闭合归 B1 单一 owner,本式只供原材料与量纲建议。默认根 buff 活行 = defense_up(attack_up 已复活,默认根入池随奖励改造批——F4 复活口径)。 -**Output Range:** tier_min_buff ∈ [1, 8];量纲仅为建议(B3 锚预警"瞬时 vs 总暴露"归一口径裁决前置,B1 可另选)。 -**边界注记**:行值 provisional 归 C3;锚验收权 B4/B1(B3 Rule 10 同款)。 - -### 默认根内容行(2026-09-11 两级奖励批重登记,值 provisional 归 C3;溯源 = 原型 v3 锚 HERO_MAX_HP=50 + 概念原型 HERO_BASE_ATK=6;原 2026-09-09 五行集作废——two-tier 重构见下) - -| reward_id | category(交付类) | power | weight | tier | pool_tag | 说明 | -|---|---|---|---|---|---|---| -| defense_up_basic | buff(即时) | —(不消费) | 24 | 2 | safe_cell | 当次受伤减免(B3 defense_up D=1) | -| attack_up_basic | buff(即时) | —(不消费) | 20 | 2 | safe_cell | 当次主角攻击增伤(B3 attack_up D=1——复活后首批入池) | -| spark_aoe | instant_aoe(即时) | 4 | 16 | 1 | safe_cell | 群体攻击:全体存活敌各 4 点 | -| heal_minor | instant_heal(即时) | 4 | 15 | 1 | safe_cell | 即时小额回血(满血零兑付行) | -| knife_t1 | damage_item(可选) | 8 | 15 | 1 | safe_cell | 可囤可择时的基础刀 | -| knife_adv | damage_item(可选) | 16 | 4 | 2 | safe_cell | 雾档升级刀 | -| heal_pack | heal_pack(可选) | 12 | 6 | 2 | safe_cell | **稀缺强治疗**(可选治疗唯一形态) | -| clear_knife | damage_item(可选) | 16 | 1 | 2 | clear_default | 清图奖励刀 | - -归一占比:**即时类 75% / 可选类 25%**(2026-09-11 用户裁决配比——原刀 40/治疗 25/石肤 35 作废);治疗合计 21%(即时 15 + 可选 6)——可选治疗自 25% 降至 6%,"治疗是稀缺奖励";tier_min_buff = 2;T_fog_min = 2 → 雾池 = {defense_up_basic, attack_up_basic, knife_adv, heal_pack}(四行,非单一化 ✓);**AC-19 对账对更新 = (knife_adv, attack_up_basic)**(雾池最低活档行 ≠ tier_min_buff 行——非平凡判别保持)。 - -**方向预检(B2 clause3_supply 先例,登记对账记录;2026-09-11 两级奖励批重算——刀供给期望 ≈ |资格格| × 19% × 9.7(加权刀力 = (15×8+4×16)/19 ≈ 9.7)≈ 1.8|资格格|/板,另加即时群伤与基础攻击分量;击杀需求 = 敌 hp 18(单敌档)/ 54(3 敌档)——**速杀退化预警⑥在"基础攻击 6/结算 + 即时类自动兑付"下压力进一步上升,敌 hp 曲线与奖励供给禁止独立调参(C3 联动重算义务)**;输入缺口:|资格格| 分布待 A1 actuals p10/p50 → 落地后重跑;max_hp = 50(原型锚)为治疗供给对照基准)**: - -### 失衡预警清单(playtest 预注册,economy-designer;2026-09-09 评审重校准——①拆短缺/浪费、④按吸收上限重推、⑤补雾板分层,新增⑥⑦⑧) - -① **刀供给短缺/浪费双指标**:短缺 = "获得刀伤供给 ÷ 击杀需求" <1.0 即警(供给面信号,按 unit_count {1, 2–3} 两档分设阈值——原单一">2.0 上尾"口径横跨两档必然一头常鸣,作废);浪费 = "未用刀伤 ÷ 获得刀伤供给" >0.5 即警(效率面,与短缺分开读——供需贴近下界时高效用刀本就趋零,原口径在紧张局常态误报)。② **治疗双尾**:溢出 = HP 满拒绝率 >40%(**2026-09-11 两级治疗注记**:instant_heal 满血零兑付并入本仪表——小额浪费可容忍、阈值放宽;heal_pack 满血拒绝维持 >40%);短缺 = "败北且库存有未用治疗包"占比 >20%(**可选治疗稀缺化至 6% 后本仪表为主仪表**——强治疗名存实亡的探针)。③ **雾区档位空窗 + 单一化**:雾区拾取平均 tier ≤ 平原即警;增雾池单一化监测——雾区拾取 distinct reward_id 数 = 1 持续即警(雾池收窄 → "越险货越同",T_fog_min × tier 分布联动调参)。④ **buff 零兑付双表**:稳态(单格授予批)零兑付率 >25% 即警;**连锁批量授予零兑付率**单列(结构性偏高——登记推导:buff 供给 λ = 8 挖/轮 × 44% ≈ 3.5 层/轮 vs 吸收上限 1 层/结算 × max_stack 2,批式授予下零兑付率远高于单格批;阈值 >50% 即警);**结构性缓解(2026-09-11 两级奖励批)**:buff 时长改当次结算(D=1)——浪费不再跨结算累积、保质期一次结算天然有界,但同结算内批量授予的零兑付仍存在,仪表保留;清图槽 buff 零兑付单独计数维持。⑤ **清图支配反转**:弃图率 >30%(A3 OQ3 联动)——**雾板/无雾板分层观测**(A4 明文要求补登;聚合指标会被雾板污染或反向掩盖)。⑥ **速杀退化**:战斗结束时未开资格格占比 >70% 即警(供给过剩 → 战斗提早结束 → E2 未挖身份零发放,奖励系统饿死自己的高光与雾内容——2026-09-09 评审新增)。⑦ **窗口摩擦**:窗口跳过率、单结算平均明细行数(playtest 预注册,阈值归 C3);**结构性缓解(2026-09-11 两级奖励批)**:库存只收可选类(25% 权重)+ 窗口单件制——窗口频率与每次决策量双降,本预警预期大幅缓解、保留观测。⑧ **H2 曝光率**:含清图奖励兑付的结算数 ÷ 战斗数(OQ4 折算裁决的数据输入)。 - -## Edge Cases - -> 三项边界裁决〔2026-09-09 用户拍板;第三项随 full 评审拍板〕:**道具段照常消耗**(超额选刀烧刀 = 选定即承诺的成本)· **清图槽允许 buff 行**(A3 条款④按行级正当量兑现,运行时满层为合法例外)· **窗口锚点 = 授予段之后**(当轮拾取当轮可用——Rule 5)。 - -- **If 资格格集为空(S ∖ R₀ = ∅)**:三层防线——① A1 生产面 `R₀ ≠ S` 合法性闸(修订义务已登记、未落地);② A2 install 不变式④ **现行已生效**(R₀=S 板装板即拒,B4 在其后序恒见非空集);③ B4 roll_board 致命(fail-fast 兜底,对偶于 F1 池空裁定)。B4 零静默回退。 -- **If 战斗结束时仍有未开资格格**:其预分配身份随映射 Retired 消亡——**零授予、零明细行**(未拾取 ≠ 溢出:从未发生的事不进结算,非静默蒸发)。 -- **If 同一结算多格授予同类 buff 超过 max_stack(连锁批量 13 格链 × max_stack=2 ⇒ 大量同文"奖励未生效"明细行)**:按规范序逐格受理,满层起 apply_effect 返回 false → 各产一行"奖励未生效"明细(零兑付、无折算——用户拍板;A2 登记义务"连锁批量授予溢出吸收"的 B4 侧裁决落点:**显式接受**);道具类无满层概念(库存无上限)。**玩家侧缓解(2026-09-09 评审如实改写——原"下轮绕开满层格改道"不成立:层数长在 B3 容器上不长在格子上,且未开格身份不呈现,无格可绕)**= 叠层感知挖掘(HUD 满层后少开安全格/优先挖刀——弱自救);结构位 = 未开格身份呈现深度(OQ2/A5,垂直切片)。**明细行数据面**:未生效类行携带**可聚合的计数/批次字段**(同类聚合计数、来源批次——是否合并呈现归 B1/B5 裁决,数据必须可聚合,防事后补字段 = 接口漂移);呈现归 D1 义务③,行协议 owner = B3 义务⑧。 -- **If roll_board 后映射 Ready、B1 未调而挖掘已开始**:grant 在 Unrolled 前/Retired 后调用 → **false + 诊断**(受理/拒绝口径,非进程致命——编排违约显式暴露,B2 同款)。 -- **If roll_board 被二次调用**:Ready 相位再调 → **false + 诊断**(相位守卫,B2 AC-1 同款)。 -- **If 换图(retire + install)发生在战斗中**:旧映射 Retired(未拾取身份消亡)、新图 install 后 roll 新批(新图新身份 = reward_roll 流**新 scope 批**,与 board_gen"每次生成新图"同构——scope 语义改写义务见 Rule 2/Dependencies);**库存不受影响**(战斗域跨图延续,Rule 4)。 -- **If 关卡结束(clear_inventory)后仍调 grant/stock/use**:Cleared 相位 → **false + 诊断**;clear_inventory 由 B1 编排于**关卡末**恰一次(2026-09-11 关卡域拍板——原 battle_over 时点作废;重复调用 false + 诊断,幂等守卫)。 -- **If 道具使用窗口打开时库存为空**:零使用恒合法(跳过恒合法);呈现归 D1(可整体不弹窗——P4 节奏,B4 建议登记;窗口触发政策见 D1 义务②——MVP 有库存恒弹,候选"仅可用品触发/常驻库存条"归垂直切片)。 -- **If 同一件道具被选用两次**:`use` 对已 Used 实例 → **false + 诊断**(Used 不可逆);单帧选择收集口径归 D1(义务②)。 -- **If 道具段中伤害道具施加时已无存活敌(前序刀已全灭)**:**照常消耗——标记 Used、零效果**,逐件进结算明细"已消耗未生效"行(B3 义务⑧"溢出未生效"行协议同款数据面)。〔2026-09-09 用户拍板:选定即承诺;同日评审更正理由〕~~原理由"敌 HP 精确值玩家不可见(B2 视觉推测型)"~~ **作废**——B2 呈现规格供给 hp/max_hp 血条数字(视觉推测型只封锁下一拍意图数值,不封锁当前血量),敌我血量在选择时点**均**可读。**现行理由两条**:① **守卫所有权不对称**(非信息不对称)——满血守卫是 B1 读 hero hp 的表局部判定(F4 已定),而零效果判定须读 B2 存活集,B4 零跨系统读纪律不为它开口子;选定即承诺把战斗轨迹判断留给编排层;② **反抖动**——选定即承诺防窗口内反复重选拖垮结算节奏。窗口内可用性预判(usable_now,B1 组装)承载"误触防护"半句。段序不截断:选定件全序执行 → 战斗段照常推进(死敌"死亡即不动手"空转)→ 衰减段 → 判定段判胜 → 关卡末 clear_inventory 全清(含未选件——D1 义务⑤ 清空反馈行;2026-09-11 关卡域改写对齐,原 battle_over 时点作废)。"零效果"事实判定归 B1 编排读 B2 存活集(读值做判定,非拒绝)。监控锚 = 失衡预警①(浪费半)。 -- **If 清图槽身份为 buff 行且授予时已满层**:零兑付 + "奖励未生效"明细行(Rule 3 同款协议)。〔2026-09-09 用户拍板:允许 buff 行入 clear_default 池〕A3 条款④"清图奖励>0"的兑现口径 = **行级恒有正当量**(F3 加载期校验:power≥1 ∨ effect_id 非空),运行时满层拒绝为合法例外、P2 诚实由明细行承载;常态化监控锚 = 失衡预警④(清图槽 buff 零兑付单独计数)。 -- **If 治疗包 power 超过当前缺血**:`hp' = min(hp + power, max_hp)`——部分回复合法(clamp 归 B1),**不拒绝**(与满血拒绝相区分:满血 = 零收益守卫、超量 = 部分收益)。 -- **If RewardTable buff 行的 effect_id 悬空(B3 无此行)**:首个 effect_id 引用行回填后,B3 悬空校验激活 → 加载期致命(D2 通道);此前不校验(dangling_ref_policy 既有口径)。 -- **If 战斗中热重载 RewardTable**:D2 战斗中 reload 拒绝门(D2 EC8,B1 经 set_reload_gate 置位);**已授予实例携带行值快照**(power/effect_id 授予时冻结——B2 行值快照同款),映射中未授予身份仅是 reward_id 引用、grant 时快照。 -- **If cleared 与 battle_over 同结算(末图清图即胜利)**:授予段先兑付清图奖励 → **同结算道具使用窗口即可选用(含当轮清图奖励件——2026-09-09 评审窗口后移的收益面,原"先授予后销毁、任何情况下不可用"的必然作废已消解)** → 未选用件**随库存关卡域延续**(2026-09-11 关内延续——原"随 battle_over 全清消亡"作废;末图 = 关卡末图时未选用件至关卡末清空 + 反馈行归 D1 义务⑤)。折算/继承结构位归 OQ4(Alpha,C2/D5——折算点 = 关卡末)。 -- **If 池含 attack_up 行(2026-09-11 复活后为合法内容,原"死行"条目改写)**:授予走 B3 apply_effect 正常受理、消费于主角战斗段先手攻击——原"授予零消费、纯拾取感损伤、C3 禁区注记"作废;机制层不做校验(内容决策归 C3)。 -- **If 玩家囤刀跨战斗/跨图累积(数量无上限)**:合法策略且为**设计意图**(2026-09-11 关卡域拍板——可选类道具是关内资产,"囤刀待机"的规划视野 = 整个关卡,P2 长线规划形态兑现;原"幻想 scope = 单场战斗——战斗域拍板"注记作废);无运行时上限(伤害恒定表值 ⇒ 无乘法爆炸);失衡监控 = 预警①(浪费半)与⑥(速杀退化),修正入口 = C3 权重调参(items_per_settlement_cap 结构位默认关——Tuning Knobs)。 -- **If 同格重复 grant / 同一 cleared 结算重复 grant_clear(Ready 相位,2026-09-09 评审裁死语义〔E18〕)**:grant 同格重受理 → **返回同一预分配快照 + debug 诊断**;grant_clear 重调 → **返回同一预分配身份 + debug 诊断**(幂等受理族;受理/兑付恰一次归 B1×②③,重复调用的诊断面留开发期暴露;对比:roll_board 二调 = 拒绝〔结构性相位违规,E5〕,重受理 = 编排瑕疵〔幂等兜底〕)。 -- **If grant/query_identity 传入清单外坐标**(非末次 roll_board 资格清单——R₀ 格/雷格/板外,E19):query_identity → **null + 诊断**、grant → **false + 诊断**(未分配非错误态;A5 探测查询任意格时,清单内未开格恒可查〔AC-2 分支 3〕、清单外 = 未分配)。 -- **If stock() 入参越域(E20)**:未知 item_id / buff 类条目 → **false + 诊断**(仅受理道具类条目,category ∈ {damage_item, heal_pack});来源 {cell, round} 由调用方供给、**B4 不校验真值**(真值归 B1×②)。 -- **If query_inventory 的枚举序(E21)**:= stock 受理序(插入序,B3 Rule 6 先例)——D1 窗口呈现序契约。 - -## Dependencies - -**Upstream(hard)**:D2 数据配置——**RewardTable 新表 schema + 内容行回填**(本 GDD 为回填 owner,走 D2 接口漂移规则回写其 Core Rules 表清单 + registry)+ **RewardConfigTable 单行全局新增**(2026-09-09 评审)+ ConfigDB 单点读取。无其他玩法上游**运行时**依赖:A2 的资格事实经 B1 结算编排转化(零直接接口);A3 条款④⑤ 与 A4 三条定价硬约束 = **对账/验收锚关系,非依赖边**(B3"相邻"口径同款)。 - -**A4 定价硬约束的 MVP 承载状态(2026-09-09 评审显式宣告)**:**约束②(清图奖励锚随雾成本负担上浮)在 MVP 结构性不可闭合**——clear_default MVP 单默认槽 = 板无关常量池,清图奖励当量无法随雾负担变化(非 deferral 而是**本期不可闭合**;B1 强制检查点只能对该常量判 pass/fail,改 power 会同步抬高无雾板、破坏无雾侧定价);激活载体 = clear_\ 插槽(垂直切片,待 C1 biome 词表落定)。**约束③(雾板净当量优势带上界)在②缺位 + 雾格仅 tier 下界加成的 MVP 结构下近乎必然平凡通过(静默绿灯风险)**。两约束的休眠状态与接受风险(重雾板清图欠偿 → 弃图偏斜——A4 警告的 level 2 结构性高发位)在此显式登记;对冲 = 预警⑤雾板分层观测 + 预警⑥速杀退化监测。 - -**Downstream**: - -| 依赖方 | 性质 | 接口 | -|---|---|---| -| B1 | **hard(provisional——B1 未设计)** | 结算编排期调用:roll_board / grant / grant_clear / stock / use / query_inventory / clear_inventory + **B1 义务清单 6 项**(Detailed Design 节:① 段序骨架〔含窗口锚点 = 授予段后 + 回放输入登记〕② 受理分流与零兑付协议〔**每格恰一次** + 聚合计数字段〕③ clear_reward 授予路径〔B3 OQ4 关闭条件〕④ 窗口与道具段编排〔usable_now 组装 / 满血守卫 + 逐件动态守卫 / 零效果判定 + 已消耗未生效行 / 击杀结果进流水 / clamp〕⑤ 生命周期编排〔含清空反馈计数〕⑥ roll_board 恰一次) | -| C3 | soft(**provisional**) | 权重/档位/威力/池内容曲线数值调参所有权(默认根行集已登记);T_fog_min/K_dmg/N_draft/P_min 参数(RewardConfigTable);**调参期批量仿真义务**(F5 可行率 + 登记常数重制联动);失衡预警指标①–⑧ playtest 归口;attack_up 入池裁决(2026-09-11 复活后随奖励改造批,原死行禁区注记退役) | -| C1 | soft(**provisional**) | biome/tag 图类型供给(clear_\ 插槽差异化输入——插槽激活的前置) | -| C2 | soft(**provisional**) | **关卡末剩余道具折算结构位归属**(OQ4 残余——2026-09-11 关卡域拍板后折算点 = 关卡末,转金币/继承候选,Alpha);冒险域奖励(关卡大奖励)归 C2,与 B4 库存无交集 | -| B3 | 相邻(**零运行时依赖**——调用经 B1) | buff 类 effect_id 精确引用(首个引用行回填激活悬空校验 + 条件性夹具);**锚验收权归 B4/B1**(A3 条款 2 + A4 硬约束①,MVP 参照对象 = defense_up 当量——F4/F6 口径后果);满层拒绝协议对侧;source_class 枚举已含 clear_reward/safe_cell(零变更) | -| B2 | 相邻(**零运行时依赖**) | 伤害道具默认目标 = 固定顺位(Rule 7 消费);~~HeroTable.atk 激活裁决~~(2026-09-11 用户裁决已决——基础攻击恒存在、attack_up 复活);道具段先于战斗段的段序战术面(死亡即不动手的道具形态;战斗段新增主角先手攻击——B1 域);伏击清单扩展联动对侧 | -| D1 | soft | **呈现义务 5 项(缺项即 blocking;3→5 评审扩容)**:① 已开格+库存身份恒定可读〔库存常读条 = 挖掘期规划面〕② 道具使用窗口〔usable_now 呈现〕③ 结算明细**四类行**呈现〔含聚合计数与语境注记〕④ H2 清图奖励行强调呈现 ⑤ 关卡末(level_clear)库存清空可见反馈〔2026-09-11 关卡域改写对齐〕 | -| B5/D5 | soft | 结算明细道具行(数据源 = B1 流水,含击杀结果字段);道具使用窗口教学 + "关卡末库存清空"教学(RAP 清零同款先例;2026-09-11 关卡域改写对齐——原"战斗结束库存清空"作废) | -| A5 | 相邻(预留桥接位) | aux_item 预留枚举(校验拒绝——启用走修订);未开格奖励身份探测 = A5 探测道具零成本桥接(身份已 install 期预分配,OQ 登记,垂直切片) | - -**双向一致性核对**(systems-index 依赖分层表):索引分层"B4 ← A2,B3,D2"——本 GDD 定稿后**硬上游仅 D2**;A2 = 事实经 B1 转化零直接接口、B3 = 验收锚关系非运行时边(B2"其余为事实读取不列边"注记口径同款)——索引分层行 B4 ← D2 已更新(2026-09-09 定稿批)。**接口漂移登记(2026-09-09 评审批全面兑现——含正文补同步)**:① game-concept 待定问题"主动道具后续版本加入"于 MVP 激活(道具使用窗口——用户拍板),use_timing 字段从预留转承重——game-concept 第 144 行注记已同步;② registry `rng_service.scope_event_binding` 的 reward_roll 批次语义改写为"每次 board install(格奖励批 + 清图奖励批)"——**registry 与 D2 正文均已同步**(原定稿批只改了 registry 与 D2 Dependencies 行;D2 Core Rule 5 与 D2 Interactions B4 行两处旧语义漏网——2026-09-09 评审批补齐;consistency-check 修正原误引 `board_gen.scope_event_binding`);③ **锚参照迁移传播**(2026-09-09 评审批):systems-index A3 OQ5 注记、registry `status_effect.anchor_warning`、registry `clause3_supply.direction_precheck` 三处补 defense_up 迁移注记——原 attack_up 字样为历史口径,迁移后条款 2 预检未重跑的事实同批登记(见 F4/F6);④ game-concept 创意风险 #1 与可证伪信号的 MVP 口径注记已同步;⑤ 窗口锚点修订(授予段后)随本批同步 systems-index 门禁块。 - -## Tuning Knobs - -| Knob(RewardTable 行值 / RewardConfigTable 配置值,均 D2 承载) | 默认 | 调过高 | 调过低 | -|---|---|---|---| -| RewardTable.weight(逐行) | **默认根行集已登记**(Formulas 节 2026-09-11 两级奖励批八行:即时类 75% / 可选类 25%——可选治疗 6% 稀缺化;clear_knife 单行槽;provisional 归 C3) | 即时类过剩 → 结算明细淹没("奖励未生效"行刷屏)、可选类相对贬值 | 可选类过低 → 窗口长时空转(单件制下规划面稀薄)、F5 重 roll 频发乃至致命 | -| RewardTable.tier | 默认根:knife_t1/spark_aoe/heal_minor t1、attack/defense/heal_pack/knife_adv/clear_knife t2 | 雾区档位上移 → 平原奖励贬值(预警③联动) | T_fog_min 过滤失效 → A4 硬约束①锚失守(对账兜底) | -| RewardTable.power | 默认根:刀 8/16、治疗包 12、即时类 4/4(2026-09-11 两级奖励批——可选类更强、治疗稀缺化配套) | 道具段秒杀 / 治疗溢出(HP 满拒绝率↑——预警②) | 刀供给名义达标实际不足(击杀需求多轮化) | -| T_fog_min(RewardConfigTable) | 2(provisional) | 雾池收窄 → 雾格奖励稀化、单一化(预警③)、池空致命风险↑ | =1 过滤退化——雾区档位下界仅剩锚兜底 | -| K_dmg(保底刀数) | 1(provisional;仅计 damage_item——可选伤害保底) | 重 roll 频发 → 流消费膨胀;> 资格格数恒致命 | **=0 = 断言关闭(C3 禁区默认值——no_damage_row 加载后闸托底)** | -| N_draft(重 roll 上限) | 32(provisional) | 坏权重多次过审(掩盖配置错误) | 合法低供给池被误杀致命(概率性致命带——C3 批量仿真义务) | -| P_min(K≥1 供给闸刀力下界) | 8(= 默认根最低刀 power,2026-09-11 批) | 闸收紧 → 低威力刀行被加载拒绝(内容收窄) | =1 → 闸空转(power ≥1 恒真) | -| items_per_settlement_cap(**结构位**) | **关(无上限)** | 启用即限制——过高不构成保护 | 过低锁死胜局(击杀需求 ÷ 轮数——economy-designer 警告);启用裁决归 C3 playtest | - -- **非 knob(结构冻结)**:奖励类型五值封闭枚举(两类交付轴)、install 期预分配 + Ready 只读(无重掷 API)、**道具伤害恒定表值不吃修正**(用户拍板)、满层零兑付无折算、**库存关卡域(跨战斗延续、关卡末清空——2026-09-11 修订原战斗域)**、**窗口单件制(2026-09-11 拍板——体验反馈后修订走 GDD 流程)**、清图恒非空、结算段序骨架(buff/debuff > 道具 > 战斗)、零随机出 roll_board 一线、逐件实例归因——修订走本 GDD 流程非调参。 -- **Knob 交互**:K_dmg × safe_cell 伤害权重 × T_fog_min(雾池收窄挤压刀供给 → 重 roll 频发——三者禁止独立调参);**T_fog_min × tier 分布 × 雾池行数**(雾池单一化联动——预警③第二仪表,禁独立调参);power × B2 EnemyTable hp 曲线(击杀需求侧联动,C3 所有权);weight × B3 max_stack(buff 零兑付率联动——预警④)。 -- **调参所有权注记**:内容/曲线全部 provisional 归 C3;A3 条款③⑤ 与 A4 硬约束①②③ 的对账闭合归 B1(锚验收权 B4/B1——B3 Rule 10 同款)。 - -## Visual/Audio Requirements - -> B4 = Core 层数据/逻辑系统,**零自有视觉/音频资产**(headless 债,Rule 10);本节定义**数据面供给责任**,呈现实现归 D1/B5/D4/D5(义务清单见 Interactions)。 - -- **高光兑现节点(B4 侧条目化;2026-09-09 评审诚实化改写)**:**H1 开格拾取瞬间**(身份在场——"这格有货"是 P4 高频情绪节拍;触发数据 = `cell_revealed` + 身份查询;`query_identity` 投影含 tier——拾取瞬间可读"好货"档位)· **H2 清图奖励兑付**(轮末仪式峰值——clear_reward 明细行强调呈现,**D1 义务④**)· **H3 道具抢杀窗口**("重击拍前用刀"——"我算对了"的执行侧兑现,段序战术面 Rule 5;**感知数据前置:B1 流水含击杀结果字段**〔B1 义务④〕——无它则"敌灭、重击未落地"不可呈现,兑现点缺席)。**如实口径**:H1/H2 为奖励侧常规节拍登记;**创意风险 #2 的"完美排雷爆发结算"(零误标/全标中加倍)机制本体归 B1 强制检查点**(game-concept 原文归属——B4 交付插槽与明细行数据面,机制设计未在本 GDD 兑现);风险 #3 的标中旗即时节拍补偿同归 B1(A2 登记义务"清单外登记会丢失"先例——本条目化即义务,D1 义务④⑤ 为其 blocking 承载)。 -- **icon 映射键契约**:`reward_id`(全局恒定、跨 run 不重掷——B2 D1×4② 同款口径);category 三类第一层区分(buff/伤害道具/治疗包)+ 行级第二层;形状+色相双通道(art-bible 约束——art-bible 未建前键契约先冻结);名称数据源 = `display_name` 字段(Rule 9)。**绘制优先级插入点(2026-09-09 评审意向冻结)**:奖励徽章位于**旗子之下、变异纹理之上**,不得进入数字区域(game-concept 绘制优先级栈 数字 > 小人 > 旗 > [徽章] > 纹理 > 底色——art-bible 定稿确认,纳入格子样张测试验收项)。 -- **结算明细四类行协议**(数据源 = B1 流水,呈现归 B5/D1 义务③):道具行(含入库/生效语境注记)/ "奖励未生效"行(**携带可聚合计数/批次字段**——E3)/ "已消耗未生效"行(E10)/ "使用被拒"行(满血守卫拒绝的兜底呈现——usable_now 预判外的残余路径);未选用件"随关卡结束清空"语境注记(2026-09-11 关卡域改写对齐——原"随战斗结束消亡"作废;D1 义务⑤)。 -- **音频挂钩点**(D4,Alpha):开格拾取音(按 category 分色)/ 道具使用音 / 清图奖励音 / **负反馈聚合音**("未生效/被拒"类行数 >0 时单次结算至多一次——防逐行惩罚轰炸或静默惩罚,2026-09-09 评审补)——挂点事件归 B1/D1,B4 零音频依赖。 - -## UI Requirements - -> B4 **零自有 UI**(headless 可跑全奖励流,D2 Rule 7 同款);界面贡献全部经 **D1 义务清单①–⑤** 承载(缺项即 blocking,Interactions 表)。 - -- **道具使用窗口数据契约**:窗口载荷 = **B1 编排组装**——`query_inventory` 逐件实例(`item_id` + 来源 `{cell, round}` + 行值快照投影 + 状态;**枚举序 = stock 受理序**〔E21〕)+ **B1 侧守卫预判 usable_now**(满血治疗包禁选/提示——B4 零跨系统读,字段由 B1 供给〔义务④〕);呈现(逐件列表/选用序收集/跳过/窗口时机指示/usable_now 禁选态/触发政策注记)归 D1;窗口期选择收集与棋盘输入不竞争(A2 单意图帧先例);**窗口选择序列 = 结算回放的输入事件**(B1 义务④,B3 可回放契约的窗口侧兑现)。 -- **UX 规格归 D1 GDD**(设计顺序第 10 位)前置 `/ux-design`——窗口是 D1 域屏,B4 只供数据契约;B4 无 D1 外新增 UI 义务。 - -## Acceptance Criteria - -> **qa-lead 代理起草(lean 门禁,2026-09-09;full 评审同日修订)**:覆盖 10/10 Core Rules、F1–F6 全公式、E 节 21 条(E8/E15 两处非 G-W-T 形态以负空间/B1 deferral 承载——覆盖口径见覆盖矩阵末行)、上游承接验收项全集(A4 定价硬约束①〔②③ MVP 休眠显式宣告〕、A3 条款④、B3 悬空首引、身份预读、~~attack_up 死行内容断言~~〔2026-09-11 复活后改承载 attack_up 行合法性——AC-18 分支 2〕)。三项最终拍板语义已按 E 节定稿承载:**道具段照常消耗**(AC-14 分支 3——不采信任何"拒绝不消耗"旧读法)与**清图槽允许 buff 行**(AC-11)、**窗口锚点 = 授予段后**(Rule 5——B4 冒烟不断言编排时点,构造序扮演)。 -> -> **测试载体与注入口径**:B4 是 Core 层数据/逻辑系统——非 UI、无场景依附。冒烟载体 = `godot --headless --script`(承 D2 冒烟框架;脚本 extends SceneTree 以获得 quit(code),ConfigDB/RngService autoload 由脚本显式实例化)。映射容器/库存容器/RewardTable schema 经 **class_name 直引实例化**(每用例全新实例、无跨用例状态——B3/A4/B2 直引先例;AC-21 扫描对该路径豁免)。B1 未设计(设计顺序第 9 位),冒烟**直接驱动 B4 最小 API 面**并扮演编排方(B2/B3 先例);**B4 冒烟零 B2/B3 实例化**(相邻零运行时依赖的代码侧对应——施加面/存活集/血量全部归 B1 OOS,StatusEffectTable/HeroTable 仅经 ConfigDB 读值)。资格格清单程序构造(真实来源 = B1 义务⑥——冒烟构造等价,零 A1/A2 接线)。 -> -> **API 面(provisional,封闭枚举——实现期 ADR 定名;2026-09-09 评审补输入域语义)**:`roll_board(eligible: Array[{cell, fog}]) -> bool`(install 期恰一次;消费 reward_roll 封闭流恰一 scope 批〔格批 + 清图批尾一号 × F5 草稿数——**每稿 = 格批 + 清图批尾一号,草稿作废连清图一号一并作废**〕;Ready 相位再调 → false + 诊断〔E5〕;空清单 → debug 断言中止〔E1 兜底〕;**清单含重复格 → 去重 + debug 诊断**)· `query_identity(cell) -> Dictionary|null`(Ready 只读预读面——返回 {reward_id, category, tier} **引用级投影**,非行值快照〔快照时点 = grant,E10〕;Retired/Cleared → null + 诊断;**清单外坐标 → null + 诊断**〔E19——A5 探测桥接的结构面〕)· `grant(cell) -> Dictionary|false`(受理面——返回 {reward_id, category, effect_id?, power?} 行值快照;Unrolled/Retired/Cleared → false + 诊断〔E4/E7〕;清单外 → false + 诊断〔E19〕;**同格重复受理 → 同一快照 + 诊断〔幂等,E18〕**)· `grant_clear() -> Dictionary|false`(cleared 轮兑付——身份 = install 批尾预分配;**同批次重调 → 同一身份 + 诊断〔幂等,E18〕**)· `stock(item) -> Dictionary|false`(道具类入库——**仅受理 category ∈ {damage_item, heal_pack},未知 item_id/buff 类 → false + 诊断〔E20〕**;逐件实例 {item_id, source{cell, round}〔调用方供给、B4 不校验真值——真值归 B1×②〕, 快照};Cleared → false + 诊断)· `use(handle) -> Dictionary|false`(窗口选用消耗——true ⇔ InStock→Used + 返回消耗回执〔**授予时快照**投影 + 来源归因〕;Used 句柄 → false + 诊断〔E9〕;**零游戏态前置守卫**——存活集/血量对 B4 不可见,E10 照常消耗与 F4 满血守卫归 B1 的结构前提)· `query_inventory() -> Array`(逐件实例枚举含状态 InStock/Used,**枚举序 = stock 受理序**〔E21〕——Used 保留只读可查〔"已消耗未生效"行数据面,B2 Dead 句柄同款〕;呈现过滤归 D1)· `clear_inventory() -> bool`(**关卡末**全清——2026-09-11 关卡域,原 battle_over 时点作废;重复 → false + 诊断〔E7 幂等〕)· `retire_mapping() -> bool`(board retire——B1 义务⑤)· `equivalence_supply() -> Dictionary`(F6 供给面 {全活行投影, tier_min_buff}——只读)· `weighted_pick(rows, r) -> String|null`(F1 选行算子纯函数供给面——B2 ambush_grant_plan 先例)。**全部布尔/字典返回 = 受理/拒绝**(附 debug 诊断、非进程致命——进程致命保留给 D2 数据通道与 fail-fast 兜底点)。**封闭枚举即负空间验收形态**:无重掷 API(Rule 8 Ready 只读)、无库存上限 API(Rule 4/E17)、无伤害/治疗/buff 施加 API(施加归 B1——F4/Rule 3)、无自主清空时点(clear_inventory 调用权归 B1)、无事件订阅、无 RNG 直连(唯一入口 = roll_board 内 open_stream("reward_roll"))。新增任何入口 = 接口漂移(GDD 修订非调参)。 -> -> **时序口径**:"一次 board install" = roll_board 恰一次的构造窗口;"cleared 轮" = grant_clear 构造调用;"battle_over" = clear_inventory(+retire_mapping)构造调用。结算段序骨架(授予段→道具使用窗口→增益/减益段→道具段→战斗段→衰减段→判定段——窗口锚点 2026-09-09 评审拍板移至授予段后)与使用窗口编排 = B1 域——冒烟以构造序扮演、不断言编排正确性(B2 时序口径同款)。**σ 到达机制(2026-09-09 评审补)**:D2 全新 RngService 首个 open_stream 恒为 scope 0——到达 scope=σ 须先 `open_stream("reward_roll")` ×σ 丢弃预推进(AC-7 分支 1 按此执行)。**纸面契约子集声明(A2 OQ2 先例)**:凡依赖 Ψ(σ)/Φ(σ)/σ\*/重 roll 轨迹**登记值**的 THEN,在取号约定实现期 ADR 落地前**不视为可执行**(受影响:AC-1 分支 1 非雾格值、AC-7 分支 2/3、AC-10 分支 1、AC-12 登记序列);雾格单行退化分支例外(r 无关,现即可执行)。 -> -> **只读观测量**:映射投影(reward_id/category——引用级)· 库存实例投影(item_id/来源/快照/状态)· 流 scope 计数器(D2 AC-4 公开只读——install 恰一 scope 的观测面)。相位无字段观测量:Unrolled/Ready/Retired 由受理返回值推断;Cleared = 逻辑失效态(失效句柄查询返回空 + 诊断、作用接口拒绝——AC-3 域闭;B2 Despawned 逻辑失效口径同款)。实例不变式(Ready 后映射零写入 / Used 不可逆 / 库存条目仅存战斗域)= debug 断言自守——**违规路径不可由封闭 API 构造**(负空间:无重掷 API 即"Ready 后零写入"的结构前提),不经冒烟断言;行为级证据 = AC-1/AC-2/AC-9/AC-14。 -> -> **期望值推导纪律**:weight/power/tier/T_fog_min/K_dmg/N_draft 全 provisional(Tuning Knobs)——各 AC 的 THEN 具体数值按**当前表读值/夹具登记值推导、不写死**(记号:w_i/t_i/p_i/T_f/K/N)。**结构定值断言合法**:category 三值封闭、pool_tag MVP 二值封闭、use_timing 单值、清图恒正当量校验存在性。原"safe_cell 活行 category 收窄 {damage_item, heal_pack, defense_up}(attack_up 死行不入池)"定值断言随 2026-09-11 用户裁决退役——attack_up 为合法行(AC-18 分支 2 改承载其合法性)。资格格清单与期望映射为登记常数(下述协议)。 -> -> **夹具与种子策略**:① **默认根**(B4 回填的 RewardTable MVP 行集——Formulas 节 2026-09-11 两级奖励批八行为登记值 defense_up_basic/attack_up_basic/spark_aoe/heal_minor/knife_t1/knife_adv/heal_pack/clear_knife + RewardConfigTable T_fog_min=2/K_dmg=1/N_draft=32/P_min=8)——结构断言、F6 供给与方向预检。② 根 `b4_golden`:D2 全表清单拷贝 + 权重/tier **冻结登记值**(登记:刀 w=2 t=1 / 治疗包 w=1 t=1 / defense_up w=1 t=3 / clear_default 单刀行 w=1)——黄金载体与默认根内容调参**解耦**(C3 重调默认权重不触动本根;雾池 = {defense_up t3} 单行退化——雾格分支 r 无关现即可执行)。③ 根 `b4_reroll`(**2026-09-09 评审补全登记;2026-09-11 补 p_min=4 覆盖**——刀 p=4 须过 F5 加载护栏 (i),随全局 P_min=8 生效):T_fog_min=1 / K_dmg=1 / N_draft=32 / p_min=4;safe_cell = 刀 w=1 t=1 / 治疗包 w=3 t=1 / defense_up w=3 t=2;clear_default 单刀行 w=1 p=4——满足全部加载校验(活 buff 行 ✓ / 雾池非空 ✓ / 清图正当量 ✓);重 roll 可达(首稿零刀 P ≈ (6/7)³ ≈ 0.63)而耗尽经验稀有(≈4×10⁻⁷/σ)——取号约定 ADR 落地后按缺口预检 8 复核可达性拆分、失效即重制。④ 根 `b4_fog_gate`:tier 布置使雾池唯一活行 = 高档行 H、非雾池含低档行 L(登记);**`b4_fog_gate_hot`(同批新增)**:同表 + T_fog_min=8 **表值烤入**——雾态池空加载致命(AC-6 分支 4 致命分支载体——R3 override 不触发加载校验,D2 边界⑤,通道错置已更正)。⑤ 根 `b4_clear_buff`:clear_default 唯一活行 = defense_up。⑥ 根 `b4_reloaded`:power/tier 各 +1(effect_id 不动——登记)。⑦ 根 `b4_nofloor`:safe_cell 无刀行 + K_dmg=0。⑧ 根 `b4_attackup_row`(原 `b4_attackup_leak` 改名——2026-09-11 复活后为正向夹具):safe_cell 追加 attack_up 引用行。⑨ **致命根 ×8**(manifest,见下;新增 `b4_floor_supply` / `b4_nodamage`)。⑩ **程序构造**:RewardTable + RewardConfigTable schema 直引(AC-16);资格格清单 `b4_list_A`(3 格含 1 雾)/`b4_list_B`(4 格)/`b4_list_single`(1 格)坐标入版本库。行为夹具根经 `--data-root=` 注入(仅 debug、不入 `data/tables/`——D2 夹具纪律);标量 knob 单变分支(T_fog_min=1、K_dmg=2)经 **R3 debug override**(域内值、运行时态——D2 AC-7 先例;**加载致命分支一律烤入根承载,不经 override**——2026-09-09 评审更正),两通道每夹具恰一登记。**登记常数协议**(B2 行集协议同源):期望格身份映射 **Ψ(σ)**、清图身份 **Φ(σ)**、重 roll 草稿数轨迹、A4① 对账对——入版本库;失效处置 = 先复核登记、登记无误即实现缺陷;**登记后安排第二人独立推导复核(A2 OQ3 同型义务——2026-09-09 评审补)**。**测试种子取号协议**:master=42;**σ 取号 = 每 roll_board 调用恰一 scope**(install 批含格批 + 清图批尾;retire 后新 install = 新 scope——E6/registry 改写语义);期望轨迹经 `derive_at("reward_roll", σ)` **纯函数测试通道**推导(不推计数器——D2 R2 预览语义的测试侧合法用途,A1 同款先例;黄金向量 m=42 scope0=7422916049646135537 见 D2 R2 向量表,本节复用不重制——推导起点锚)。 -> -> **致命类收窄豁免与 runner manifest**:B4 冒烟设**恰十行致命清单**(独立 headless 进程;2026-09-09 评审增补两行加载护栏):加载期 ×8(游戏通道 load)——`pool_empty_safe→≠0` · `pool_empty_fog→≠0` · `clear_empty→≠0` · `clear_no_value→≠0` · `no_live_buff_row→≠0` · `dangling_effect→≠0` · **`floor_supply_missing→≠0`**(K_dmg ≥ 1 ∧ safe_cell 池无 power ≥ P_min 活刀行——根 `b4_floor_supply`)· **`no_damage_row→≠0`**(K_dmg = 0 ∧ safe_cell ∪ clear_default 全池零活刀行——零伤害世界后闸,根 `b4_nodamage`,B2 OQ9 并案);运行期 ×2(调用后退出码)——`floor_exhaust→≠0`(roll_board 保底耗尽)· `empty_eligible→≠0`(roll_board(∅) debug 断言中止;release 构建语义 = push_error 致命路径——D2 EC7"零静默回退"同款,实现期 ADR 登记)。其余致命类别(通用枚举域/域校验/R1 类)由 D2 AC-2 同类别 loader 夹具承载(表无关,豁免声明收窄——B2 同款)。每用例先 `reset_diagnostics()`(D2 冒烟协议,全局声明)。 -> -> **覆盖声明(out-of-scope)**——deferral 生效条件 = **B1 义务清单 6 项 + D1 义务清单 5 项**登记(均"缺项即 blocking";D1 3→5 扩容 2026-09-09 评审):**B1×①** 段序骨架与结算内调用序(含窗口锚点 + 窗口选择序回放输入);**B1×②** 受理分流调用(grant→apply_effect/stock;**每格恰一次**)与满层"奖励未生效"明细行协议 + 聚合计数字段(E3/E11 大量同文行半);**B1×③** clear_reward 授予路径;**B1×④** 窗口与道具段编排——usable_now 组装、满血守卫(拒绝不烧包)+ 逐件动态守卫(同窗顺序多包)、零效果判定(读 B2 存活集)、逐件"已消耗未生效"明细行、**击杀结果进流水**、治疗 clamp(E12)、伤害施加与"恒定表值不吃修正"纪律;**B1×⑤** 生命周期编排恰一次(**关卡末** clear_inventory 时点〔2026-09-11 关卡域改写——battle_over 只退役映射〕+ 清空反馈计数——E2"零明细行"= 编排不调即无行,B2"B1 API 合规半句"同款);**B1×⑥** roll_board 恰一次编排。**D1×①…⑤** 预读呈现(含库存常读条)/使用窗口(选用·跳过·序收集·usable_now·触发政策)/四类明细行呈现(聚合 + 语境注记)/H2 强调呈现/关卡末清空反馈(不可 G-W-T)〔2026-09-11 关卡域改写对齐〕。另有:B3 满层拒绝原子(B3 AC 既有——跨引不重复);A4 约束②③(MVP 休眠——Dependencies 显式宣告)与 A3 条款⑤ 对账闭合(B1 强制检查点);attack_up 复活联动(OQ1);C3 数值与失衡预警①–⑧(playtest 域);未开格身份呈现深度(OQ2/A5+D1)。 - -**映射生命周期与预读(Rule 2/8)** - -- **AC-1(install 主式与登记映射基线——Rule 2/8、E5;根 = b4_golden,清单 = b4_list_A)** GIVEN b4_golden 根加载、全新 B4 容器(Unrolled)、RngService master=42 已播种(scope 计数器 = 0)。WHEN `roll_board(b4_list_A)`,THEN true(Unrolled→Ready);`query_identity` 逐格 = **登记映射 Ψ(0)**(含雾格分支——雾格身份 ∈ 雾池行,登记值);reward_roll 流 scope 计数器 = **1**(install 恰一 scope——registry 改写语义的行为面)。分支 2(行主序规范化):GIVEN 两套全新 RngService+B4(同 master=42、同 scope 起点),WHEN 分别以规范序/乱序传入同一集合,THEN 两映射逐格相同(**行主序消费序 B4 侧规范化**——F1"行主序逐格";排序责任不外推给 B1)。分支 3(Ready 相位守卫,E5):WHEN Ready 后再 `roll_board(任意清单)`,THEN **false + 诊断**、映射与流计数器不变(相位守卫——B2 AC-1 同款;double-roll 无守卫的编排半归 B1×⑥)。 -- **AC-2(预读恒定与结构可查——Rule 8;根 = b4_golden)** GIVEN roll_board 完成(Ready)。分支 1(恒定可读):对每格重复 `query_identity` ×3 → 逐字相同(结构保证非授予期随机)。分支 2(授予不改身份):`grant(c)` 后 `query_identity(c)` = 授予前值(身份恒定跨授予——同图跨轮恒定的观测半)。分支 3(未开格结构可查):对未受理格 `query_identity` 恒返回身份(**映射无"已开才可查"谓词**——A5 探测道具零成本桥接的结构前提;MVP 不呈现归 D1/OQ2)。分支 4(纯读):query 前后映射/库存投影零变化。WHEN `retire_mapping()` 后 `query_identity(c)`,THEN null + 诊断(映射消亡的观测形式——E6 旧映射半)。 -- **AC-3(相位守卫全集——E4/E7;根 = b4_golden)** 分支 1(Unrolled):全新容器上 `grant(c)`/`grant_clear()` → **false + 诊断**(E4 roll 前受理)。分支 2(Retired):roll_board → retire_mapping 后 `grant`/`grant_clear` → **false + 诊断**(E4/E2——未拾取身份消亡零兑付)。分支 3(Cleared):roll_board → grant → stock → `clear_inventory()` 后 `grant`/`stock`/`use` → 均 **false + 诊断**(E7);`query_inventory` = 空(InStock 与 Used 均清——关卡域拍板,2026-09-11);`query_identity(c)` → **null + 诊断**(Cleared 逻辑失效态的观测分支——2026-09-09 评审补)。分支 4(幂等):重复 `clear_inventory()` → **false + 诊断**(E7 幂等守卫);重复 `retire_mapping()` → false + 诊断(同型守卫——B3 EC11 先例,provisional API 完整性分支)。 -- **AC-4(空资格集兜底致命——E1;根 = b4_golden,manifest 行 `empty_eligible`)** GIVEN 全新容器、master 已播种。WHEN `roll_board([])`(S∖R₀=∅ 构造——真实流中 A2 install 不变式④前置,本 AC 直击 B4 兜底半),THEN debug 断言中止(fail-fast 兜底、零静默回退——F1 池空裁定的运行期对偶);测试通道诊断清单含类别;独立进程非 0 退出。 - -**身份 roll 算术(F1/F2/F5)** - -- **AC-5(F1 选行算子纯函数——累积区间/0 权剔除/单行退化)** GIVEN `weighted_pick` 纯函数面(行数组 + 取号 r 注入)。分支 1(累积区间,F1 Example):三行 w=2/1/1 → r=0/1 → 行 1(区间 [0,2))、r=2 → 行 2([2,3))、r=3 → 行 3([3,4)——W=4 边界号)。分支 2(0 权剔除):行集 {w=0, w=2} → W=2,r ∈ {0,1} → 唯一非零行(**0 权行取号前剔除、W 不含 0 权**)。分支 3(单行退化):单行 w=5 → r ∈ [0,5) 恒该行(合法极端——F1 裁定)。分支 4(取号域守卫):r ≥ W → debug 断言(纯函数域;游戏通道内 r 恒 < W 由流构造保证)。 -- **AC-6(F2 雾档过滤——雾池谓词/退化/链开同待遇;根 = b4_fog_gate + b4_fog_gate_hot + R3 override 分支)** GIVEN b4_fog_gate 根(登记:雾池唯一活行 = 高档行 H〔tier ≥ T_fog_min〕、非雾池含低档行 L)。分支 1(雾格过滤):`roll_board`(清单含雾格)→ 雾格身份 = **H**(单行退化判别——r 无关;雾格恒不出 tier < T_fog_min 行)。分支 2(非雾全池,**32 σ 双重量化——2026-09-09 评审改写**):对 σ = 0…31 逐一(scope 预推进)roll_board,THEN ① 每稿雾格身份恒 = H(过滤谓词零泄漏——任何泄漏以 ≈w_H/W 概率现形);② 非雾格至少一次命中 tier < T_fog_min 行 L(证明非雾侧零过滤);**登记值"非雾格 = L"降为诊断信息不作硬断言**(加载规则强制 H 活 ⇒ 非雾池 ⊇ {H, L} 至少两行,单稿"= L"是概率断言,忠实实现也会假失败)。分支 3(链开雾格同待遇):fog 布尔是唯一输入、无 chain/dig 通道分支(A2 EC4 同待遇半——构造性)。分支 4(T_fog_min 边界):T_fog_min=1 经 R3 override(运行时态、域内值)→ 雾池 = 全池,雾格身份 ∈ 全体活行集(登记 σ 下 = 登记值——过滤退化合法,A4 约束①仅剩 AC-19 锚侧兜底);T_fog_min=8 且表无 tier8 行 → **经烤入根 `b4_fog_gate_hot` 加载致命**(雾态池空——AC-17 `pool_empty_fog` 同类别;override 通道不触发加载校验,原"override→加载致命"通道错置已更正)。 -- **AC-7(F5 保底与草稿重 roll——结构保证/重 roll 证据/清图槽不计/断言关闭;根 = b4_reroll + b4_nofloor)** GIVEN b4_reroll 根(登记权重刀 w=1 / 其余 w=3;K=K_dmg、N=N_draft 表读值)与登记 σ 参考轨迹表。分支 1(保底结构保证):对 σ = 0…31 逐一(每 σ 全新服务+容器,**先 `open_stream("reward_roll")` ×σ 丢弃预推进至 scope=σ**——时序口径 σ 到达机制)`roll_board` → **每提交板 |刀身份格| ≥ K**(每板伤害供给下界保证的行为面)。分支 2(重 roll 发生证据):登记 σ\*(参考算术判定首稿 0 刀)→ 提交映射 ≠ 首稿参考映射(**草稿作废、同 scope 续流重 roll**);scope 计数器每 install 恒 +1(重 roll 不开新 scope——scope 语义 = install 批非草稿批)。分支 3(清图槽不计):登记 σ\*\*(首稿清图身份 = 刀 ∧ 格刀数 = 0)→ 仍重 roll(断言仅计格奖励身份——参考轨迹判别)。分支 4(断言关闭合法极端,b4_nofloor 根):无刀行 ∧ K=0 → roll_board true、提交板 0 刀(K_dmg=0 = 关闭——C3 禁区默认值的行为面)。 -- **AC-8(F5 重 roll 耗尽致命;根 = `b4_floor_exhaust`〔manifest〕)** GIVEN b4_floor_exhaust 根(safe_cell 池无刀行 ∧ K=1——每稿恒 0 刀)。WHEN `roll_board(b4_list_A)`,THEN N 次草稿后**致命**(权重配置错误 fail-fast);诊断含耗尽类别与草稿计数(N 表读值不写死);独立进程非 0 退出。变体分支:`b4_list_single`(1 格)∧ K=2(R3 override 域内值)→ |资格格| < K 恒不过 → 同致命(F5 Output Range)。 - -**确定性与清图(Rule 2/10、F3)** - -- **AC-9(零随机封闭与确定性回放——含 F5 重 roll 分支;根 = b4_reroll)** GIVEN 两套全新 RngService+B4(同 master=42、同根)。WHEN 同一定长序列驱动两遍(roll_board → query_identity 全格 → grant×2 → stock → use×1 → retire_mapping → roll_board〔新清单,scope+1〕→ grant_clear → clear_inventory → 全 query 面),THEN 两遍的映射投影、库存实例投影(含来源 {cell, round})、use 回执、流 scope 计数器轨迹**逐项相同**——**同 σ 同流消费轨迹 ⇒ 同身份映射(含 F5 重 roll 分支)**的确定函数性(D2 AC-15 的 B4 层前身)。分支 2(换图新 scope):σ 与 σ+1 的映射 = 登记相异对(新图新身份——E6 roll 半;库存延续半 = AC-13 分支 2)。 -- **AC-10(清图身份 install 批尾 roll 与兑付恒正当量——F3、Rule 6、A3 条款④;根 = b4_golden)** GIVEN roll_board 完成。WHEN `grant_clear()`,THEN 返回 = **登记清图身份 Φ(σ)**(install 批尾一号——登记值含批尾位次假设:实现改批首取号即失配暴露);返回身份满足**正当量**(道具类 power ≥ 1 表读值 ∨ buff 类 effect_id 非空——条款④"清图奖励>0"的行级兑现面)。分支 2(兑付期零随机):两套同 σ 容器、grant_clear 前置调用序列互异 → 返回恒 Φ(σ)(**身份 install 期已定、兑付期零 roll**;图类型战斗域恒定不逐图重掷的判别形式——兑付期重掷将随前置序列漂移)。分支 3(重复兑付幂等,E18——2026-09-09 评审补):同批次再 `grant_clear()` → **同一身份 + 诊断**(兑付恰一次归 B1×③)。 -- **AC-11(清图槽允许 buff 行——E13 拍板 + F3 校验不拒;根 = b4_clear_buff)** GIVEN b4_clear_buff 根(clear_default 唯一活行 = defense_up,effect_id 非空——正当量成立)加载**通过**(加载校验不拒 buff 行——2026-09-09 用户拍板)。WHEN roll_board → `grant_clear()`,THEN 返回 {category=buff, effect_id=defense_up}(分流数据面——B1 调 B3 apply_effect 与运行时满层拒绝〔零兑付 + "奖励未生效"明细行,合法例外口径〕归 B1×②/B3,OOS;失衡预警④清图 buff 零兑付单独计数 = playtest 域 OOS)。 - -**授予分流与库存(Rule 3/4/5/7)** - -- **AC-12(授予受理序与分流数据面——Rule 3/7、E3 前半;根 = b4_golden,清单 = b4_list_B〔4 格〕)** GIVEN roll_board(b4_list_B) 完成。WHEN 按规范序逐格 `grant`(连锁批量受理的冒烟构造序——B1 义务①同侧等价),THEN 逐格返回 = 登记身份序列(受理序 = 规范序);buff 类格返回 {category=buff, effect_id}(**B4 只定"给哪行"**——层数语义归 B3 合并产生,施加经 B1 调 B3,Rule 3;2026-09-09 评审措辞收敛);道具类格(damage_item/heal_pack)返回 {category, power}(**治疗包 = 道具类路由、非自动兑付**——Rule 7 负面:grant 不触发任何使用语义);**即时类格(instant_aoe/instant_heal)同样返回 {category, power} 快照**——grant 零路由差别,当场兑付的编排归 B1×②(B4 半 = 返回快照非库存语义)。分支 2(快照时点):grant 返回的 power/effect_id = grant 时表读值(E10 快照时点 = grant——差分判别在 AC-15)。分支 3(重复受理幂等,E18——2026-09-09 评审补):同格再 `grant` → **同一快照 + 诊断**(受理恰一次归 B1×②)。满层起逐格"奖励未生效"行协议 = OOS B1×②(E3 后半)。 -- **AC-13(库存生命周期/归因/无上限/跨图延续——Rule 4/5、E6/E17;根 = b4_golden)** GIVEN roll_board + grant(道具格) 完成、冒烟(扮演 B1)`stock` ×N(N = 登记大数 64)。分支 1(逐件实例与归因):`query_inventory` 恰 N 件、每件 {item_id, source{cell, round}, 快照投影}(**来源归因保 P2——D1 窗口数据契约**);N 件全部 InStock、零拒绝(**数量无上限**——Rule 4/E17,稀缺性由权重承载;无 cap API 负空间)。分支 2(跨图/跨战斗延续,E6 + 2026-09-11 关卡域):`retire_mapping()` → `roll_board(新清单)` → `query_inventory` **逐字不变**(含来源——库存关卡域跨图且**跨战斗**延续,与映射生命周期正交;跨战斗构造 = 共享容器重 roll,切片连续关卡模式同型);battle_over(映射退役)后 query_inventory 逐字不变(**库存不再随战斗清空**——义务⑤ 改写的行为面)。分支 3(关卡末全清):`clear_inventory()` → true、query 空(不跨关卡);此后 stock → false + 诊断(AC-3 分支 3 已载——注记)。 -- **AC-14(use 消耗/不可逆/照常消耗拍板——Rule 5、E9、E10 拍板;根 = b4_golden)** GIVEN 库存含刀(damage_item)与治疗包各 ≥2 件。分支 1(消耗回执与恒定表值):`use(刀)` → true + 回执 {category, power=**该实例授予时快照值**〔E14——原"表读值"措辞作废,防"使用期读活表"实现全绿〕, source{…}};同 reward_id 多件实例回执 power **逐字相同**(恒定表值非 roll 值——F4);实例状态 → Used。分支 2(不可逆,E9):同句柄再 `use` → **false + 诊断**;Used 实例 `query_inventory` 保留只读可查("已消耗未生效"行的数据面——B2 Dead 句柄同款)。分支 3(**照常消耗——2026-09-09 最终语义;本分支豁免域收窄**):`use(刀)` 于任意**游戏态**前置(含"道具段无存活敌"等价构造——B4 无敌态输入面,实现若存在存活/血量守卫则本分支失败)→ **恒 true + 标记 Used、零效果由 B1 判定**(选定即承诺:已选刀照常消耗、逐件"已消耗未生效"明细行归 B1 编排读 B2 存活集〔义务④〕+流水,OOS);**相位守卫不在本分支豁免域**——Unrolled/Cleared/Retired 相位的 use 照旧 false + 诊断(AC-3 分支 1/3、E4/E7——同输入同答案,2026-09-09 评审消解 AC-AC 矛盾);**与治疗包满血拒绝的不对称**:`use(治疗包)` 同样无条件受理(满血守卫归 B1 编排读 B2 hero hp——F4/义务④;"拒绝不烧包"半 = B1 不调 use 的编排纪律 + usable_now 预判呈现,OOS)。分支 4(选择序 = 使用序):任意序 use 多件 → 每件独立受理、Used 序 = 调用序(窗口选用序的 B4 半——选择收集归 D1×②、段内细则归 B1×①;同窗顺序多包的逐件动态守卫归 B1×④)。 -- **AC-15(行值快照抗表重载——Rule 9、E14;根 = b4_golden → b4_reloaded)** GIVEN b4_golden 根 roll_board + grant(道具格) + stock 完成(已授予实例)、另设未授予格(映射中 reward_id 引用)。WHEN 经测试通道换根加载 b4_reloaded(`load_tables(root, collect_only=true)` 直调——非 D2 `reload()` 路径,门语义归 D2 AC-16/B1,B2 AC-11 同款),THEN 已授予实例快照投影**逐字不变**(授予时冻结);未授予格 `query_identity` 的 reward_id 不变(映射仅持引用——热重载拒绝门 D2 EC8 的 B4 侧纵深);WHEN 对未授予格 `grant`,THEN 返回**漂移后表值**(快照时点 = grant——引用非活值的判别后半)。分支 3(拷贝判别):对返回快照投影原地改写 → 容器内实例投影不变(快照拷贝非活引用——B2 AC-11 分支 3 同款)。分支 4(**使用期快照纪律——2026-09-09 评审补**):换根后 `use(已授予实例)` → 回执 = **授予时快照值**非漂移值(AC-14 分支 1"快照值"措辞的行为级判别)。 - -**表校验与内容(Rule 1/9)** - -- **AC-16(RewardTable schema 域校验全谱——程序构造,Rule 1/9)** GIVEN RewardTable schema 类(行级 + 跨字段)class_name 直引实例(不经 load()/preload())。WHEN `validate()` 作用于越域代表值:category ∈ {resource, aux_item}(**预留值拒绝——Rule 1 fail-fast,B2 pattern 先例**)、pool_tag = "clear_fog"(**clear_\ 命名空间预留拒绝——Rule 6,A1 elite_ 同款**)、pool_tag = "nonsense"(未知枚举)、use_timing ∉ {pre_settlement}、weight ∈ {−1, 1000}、tier ∈ {0, 9}、power ∈ {−1, 1000}、跨字段 buff 行 effect_id 空(buff⇒必填)、跨字段非 buff 行 effect_id 非空(非 buff⇒恒空)、**跨字段 item 类 power=0(damage_item/heal_pack ⇒ power ≥ 1——F4 加载校验)**,THEN 各含对应域错误类别(零静默)。WHEN 域内代表值:**weight=0(该池不出此行——合法极端)**、buff 行 power 任意(**不消费非校验——B2 heavy_multiplier 先例**)、tier ∈ {1,8}、item 类 power ∈ {1,999},THEN 零诊断(防过度约束锁死内容——weight=0 与 buff 行 power 不校验是承重点)。 -- **AC-17(表级加载校验致命夹具——F1 裁定/F3/F5 护栏/F6 对偶/effect_id 悬空;manifest ×8)** GIVEN 致命根 ×8(独立进程、游戏通道——D2 AC-2b 协议):`b4_pool_empty_safe`(safe_cell 全 0 权)、`b4_pool_empty_fog`(全行 tier < T_fog_min——雾态空)、`b4_clear_empty`(clear_default 池空/全 0 权)、`b4_clear_no_value`(clear_default 唯一活行 = power 0 道具行——**恒非空的可判定形式 = 恒有正当量行,A3 条款④表侧兑现**)、`b4_no_live_buff_row`(safe_cell 有活行但零活 buff 行——tier_min_buff 无定义,F1 对偶致命)、`b4_dangling_effect`(buff 行 effect_id = "ghost_buff"——B3 StatusEffectTable 无此行;**条件性夹具:默认根已含 effect_id 引用行 ⇒ 悬空校验已激活**——dangling_ref_policy 首引兑现点)、`b4_floor_supply`(**K_dmg ≥ 1 ∧ safe_cell 池无 power ≥ P_min 活刀行——F5 加载护栏 (i),floor_supply_missing**)、`b4_nodamage`(**K_dmg = 0 ∧ 全池零活刀行——F5 加载护栏 (ii) 零伤害世界后闸,no_damage_row,B2 OQ9 并案**)。WHEN 各根经 `--data-root` 注入加载(collect_only=false),THEN 各进程非 0 退出且错误清单含对应类别;WHEN 默认根加载,THEN 干净通过(引用全解析——defense_up 存在)。 -- **AC-18(MVP 内容行定值与结构断言——Rule 1 收窄/F4 复活口径/E16;根 = 默认根 + b4_attackup_row)** GIVEN ConfigDB 默认根加载。WHEN 读 RewardTable,THEN:category 值域 ⊆ {buff, damage_item, heal_pack}(三值封闭定值);pool_tag 值域 ⊆ {safe_cell, clear_default}(MVP 二值封闭定值);clear_default 池 ≥1 正当量活行(默认根通过自身表级校验的行为断言——AC-17 对偶);权重比例与数值**不作定值断言**(provisional 归 C3);~~全部行无 effect_id = attack_up 引用~~(退役——2026-09-11 用户裁决 attack_up 复活,默认根当前不含 attack_up 行为**内容态事实**、非结构禁止,随奖励改造批重审)。分支 2(attack_up 行合法性,b4_attackup_row 根):safe_cell 含 attack_up 引用行 → 加载**通过**、roll_board/grant 正常受理(授予 buff 行 = {category=buff, effect_id=attack_up} 快照——消费于主角战斗段先手攻击,B1 域 OOS;B2 AC-14 的 atk 域断言跨引)。 -- **AC-19(F6 当量供给面与 A4 硬约束① 验收锚对账——夹具对账型)** GIVEN 默认根加载(或调参后根——对账随内容态重跑)。WHEN `equivalence_supply()`,THEN 返回全活行投影(F6 扩面)与 tier_min_buff = min{活 buff 行 tier}(默认根 = defense_up_basic 行 t=2——登记对账常数;行集空 → 加载致命,AC-17 `no_live_buff_row` 已载)。分支 2(**A4① 锚对账——档位序检查**):fog 池最低档活行 tier(min{tier : weight>0 ∧ tier ≥ T_fog_min},均表读值推导)→ **≥ tier_min_buff**(约束①"雾内奖励档位下界 ≥ 最低档安全格 buff 当量"的 B4 侧可判定形式 = 档位序检查——**真当量换算归 B1 条款①对照表〔未设计〕,落定后本分支升级为当量对账〔缺口预检 2〕**;当前内容态不等式成立为登记对账记录,C3 调参后须重跑——登记对账对 **(knife_adv, defense_up_basic)** 漂移检测;**锚参照对象回迁 attack_up 当量(2026-09-11 用户裁决 attack_up 复活——2026-09-09 迁 defense_up 的注记退役;attack_up 入池时 tier_min_buff 重算、对账对随批重制)**,**两行互异 = 非平凡判别**〔默认根布置,2026-09-09 评审补——原"档位序代理"在金夹具下自指恒真、判别力零〕;tier 与当量零耦合的假阳性边界见 F2 注记)。A4 约束②③ = MVP 结构性不可闭合/静默绿灯风险——Dependencies 显式宣告 + B1 检查点——OOS。 - -**registry 一致性与静态扫描(Rule 10)** - -- **AC-20(registry 一致——接口漂移回写义务的验收;B2 AC-16 同型无条件断言)** GIVEN ConfigDB 默认根加载完成。WHEN 脚本解析 `design/registry/entities.yaml`,THEN:① `rng_service.scope_event_binding` 的 reward_roll 语义 = **"每次 board install(格奖励批 + 清图奖励批)"**(Rule 2 语义注记的回写落点——AC-1 scope 观测面的登记侧);② `stream_seed_derivation.golden_vectors` 含 reward_roll m=42 scope0 向量(derive_at 测试通道的登记前提);③ `variation_table.pricing_constraints` 注记存在(A4 三约束为 B4 验收项的登记);④ `status_effect.dangling_ref_policy` 注记含 "B4 RewardTable 首个 effect_id 引用" 条款(AC-17 条件性夹具激活条件的登记侧)+ `status_effect.anchor_warning` / `clause3_supply.direction_precheck` 含 **attack_up 参照回迁注记**(2026-09-11 用户裁决 attack_up 复活——原 defense_up 迁移注记退役为历史记录,registry 同批回写);⑤ `reward_table` 条目 fields **九键**(reward_id/category/effect_id/**display_name**/power/weight/pool_tag/tier/use_timing)与 ConfigDB RewardTable schema 字段名逐一相等、MVP 内容注记与默认根行集一致(与 AC-18 对账);⑥ **`reward_config` 条目存在**,fields 四键(t_fog_min/k_dmg/n_draft/p_min)与 ConfigDB RewardConfigTable schema 字段名逐一相等(2026-09-09 评审——三个标量 knob 的 Rule 1 载体)。**生效前提** = 回填完成(不写"若存在"软口径——条件化使一致性检查落空,B2 AC-16 同款)。**边界注记**:本 AC 断言 registry 登记面;**D2 GDD 正文(Core Rule 5 / Interactions B4 行)与 registry 的对齐 = delta 复核对账项**(缺口预检 4——GDD 散文不进自动化断言面,2026-09-09 评审批已补齐 D2 正文两处)。 -- **AC-21(静态扫描——Rule 10;D2 AC-9/AC-10 模式引用)** B4 文件集(映射容器/库存容器/RewardTable schema/roll 与保底逻辑/冒烟脚本/夹具规格)**纳入 D2 AC-9 模式项目级扫描域成员清单**(owner Technical Setup——B3 先例;本条分支 1 承载登记义务,清单更新 = Technical Setup 门禁项,缺口预检 7):`randomize()` / `RandomNumberGenerator` / 自建 RNG 零命中(**零随机出 roll_board 一线**——唯一 RNG 入口 = open_stream("reward_roll"));ConfigDB 外 data 表加载零命中(schema 直引实例化豁免——AC-16 前提);`extends Control` / `.tscn` preload 零命中(Core 层零 UI 债——headless 实跑 AC-1 合成判定);**A2 事件订阅 API 零命中**(Rule 10 零主动订阅);**B2/B3 API 符号零引用**(相邻零运行时依赖——含冒烟脚本;StatusEffectTable/HeroTable 经 ConfigDB 表读合法、API 引用非法);重掷类命名扫描(reroll/resign/rebind 等——Rule 8 负空间,warning 级 + 人工复核,D2 AC-14 纪律同款)。零随机的行为级硬证据 = AC-9。 - -**覆盖矩阵(qa-lead 交付,验收评审用)** - -- Rule 1→AC-16/AC-18 · Rule 2→AC-1/AC-9/AC-10(恰一次编排→OOS B1×⑥)· Rule 3→AC-12(施加与满层零兑付协议→OOS B1×②+B3 跨引)· Rule 4→AC-13 · Rule 5→AC-14(段序/窗口时机/满血守卫/零效果判定→OOS B1×①④;窗口呈现→D1×②)· Rule 6→AC-10/AC-11/AC-16(clear_\ 拒绝)/AC-17 · Rule 7→AC-12 分支 1(道具类路由)/AC-14 分支 3(满血守卫→OOS B1×④;clamp→E12 OOS)· Rule 8→AC-2/AC-15(未开格呈现→OQ2/A5+D1)· Rule 9→AC-16/AC-17/AC-18(接口漂移回写→AC-20①⑤)· Rule 10→AC-9/AC-21(调用权集中→OOS B1×①–⑥) -- F1→AC-1/AC-5(+AC-9 轨迹)· F2→AC-6(+AC-19 锚侧)· F3→AC-10/AC-11/AC-17 · F4→AC-14(恒定表值供给面)+AC-18(attack_up 行合法性 = 复活口径,2026-09-11)——施加/clamp/守卫/不吃修正纪律→OOS B1×④ · F5→AC-7/AC-8/**AC-17(加载护栏 ×2)** · F6→AC-19(闭合归 B1——OOS) -- E1→AC-4 · E2→AC-3 分支 2+OOS B1×⑤(零明细行半)· E3→AC-12(受理序半)+OOS B1×②(行协议 + 聚合计数半)+B3 AC 跨引(apply false 原子)· E4→AC-3 分支 1/2 · E5→AC-1 分支 3 · E6→AC-9 分支 2(roll 半)+AC-13 分支 2(库存半)· E7→AC-3 分支 3/4 · E8→前言 API 负空间(无强制使用入口——不可 G-W-T,B3 Rule 8 先例)+OOS D1×② · E9→AC-14 分支 2 · **E10〔照常消耗拍板〕→AC-14 分支 3(B4 半)+OOS B1×④(零效果判定+"已消耗未生效"行+击杀结果流水)**· E11〔清图 buff 拍板〕→AC-11(B4 半)+OOS B1×② · E12→OOS B1×④(clamp)+AC-14 分支 1(power 供给)· E13→AC-17 分支 6(条件性夹具)· E14→AC-15 · E15→OOS B1×①(授予先于判定的段序半)+AC-10 分支 2/AC-13 分支 3(可构造序弱承载注记)+OOS D1×③⑤(消亡语境注记)· E16→AC-18 分支 2(attack_up 行合法——2026-09-11 复活口径) · E17→AC-13 分支 1/2 · **E18〔评审新增〕→AC-12 分支 3/AC-10 分支 3** · **E19〔评审新增〕→前言 API 面(清单外 null/false + 诊断)** · **E20〔评审新增〕→前言 API 面(stock 受理域封闭)** · **E21〔评审新增〕→前言 API 面(枚举序 = stock 受理序——D1 呈现序契约)** -- 上游承接:A4①→AC-19 分支 2(夹具对账型,升级缺口预检 2)· A4②③→MVP 休眠显式宣告(Dependencies)+ OOS B1 强制检查点 · A3 条款④恒非空→AC-10 分支 1(兑付面)+AC-17 分支 4(表侧)· B3 dangling_ref 首引激活→AC-17 分支 6+AC-20④ · 奖励身份预读→AC-2/AC-15(呈现→OOS D1×①)· ~~attack_up 死行不入参考池~~(退役——attack_up 复活,AC-18 分支 2 改承载其合法性)· A3 条款⑤支配性→OOS B1 强制检查点(预警⑤⑧观测) -- **覆盖口径(2026-09-09 评审重述——原"无洞"声明撤回)**:21 条 EC 中 E8/E15 两处非 G-W-T 形态,分别以 API 负空间与 B1×① 段序 deferral 承载(B2 EC5/EC13/EC14 豁免先例同款);其余全部映射 AC 或显式 OOS(deferral 生效条件 = B1×6/D1×5 义务清单登记)。**"负空间"学说的边界如实登记**:封闭枚举防住"没有的入口",不自动防住"有入口、语义未裁"——E18–E21(重复受理族/清单外坐标/stock 域/枚举序)为评审批补裁的输入域语义;今后新增 API 入口须随附全输入域语义表(实现期 ADR 检查项)。 - -**缺口预检(qa-lead;lean 定稿 9 项 + full 评审 2 项 = 11 项——每项标 owner 与时机)** - -1. **【阻塞级】B1 编排半整体 deferral**:段序骨架(授予>窗口>增益/减益>道具>战斗>衰减>判定——窗口锚点 = 授予段后)、窗口选择序回放输入、满血守卫(拒绝不烧包)+ 同窗顺序多包逐件动态守卫、零效果判定与"已消耗未生效"行、击杀结果进流水、"奖励未生效"行 + 聚合计数、治疗 clamp、clear_inventory/retire/roll_board 恰一次编排——B4 冒烟全部以构造序扮演、编排正确性零断言;E10 拍板的 B1 侧承接(读 B2 存活集做零效果判定)尤须逐字核对。owner:B1 GDD(义务清单 6 项,缺项即 blocking);时机:B1 门禁评审。 -2. **【阻塞级】A4① 当量升级与②③状态**:AC-19 分支 2 为档位序检查——真当量换算依赖 B1 条款①对照表(未设计);**②在 MVP 结构性不可闭合(Dependencies 显式宣告——非常量池无法随雾负担上浮)、③静默绿灯风险**;激活载体 = clear_\ 插槽(垂直切片)。owner:B1;时机:B1 GDD 强制检查点 + 对照表落定/每次调参时核对(F2 验收锚口径)+ clear_\ 激活时重启②。 -3. **T_fog_min 推导式悬置(OQ5)**:表值默认 2 provisional——B1 对照表落定后改推导式或维持表值;若改动,AC-6 夹具(b4_fog_gate tier 布置与 override 分支)及登记轨迹重制。owner:B1;时机:OQ5 关闭。 -4. **registry/D2/索引/game-concept 回写**(2026-09-09 评审批已兑现):reward_roll scope 语义改写(registry + **D2 正文两处补同步**——AC-20① 生效前提)、锚参照迁移三处传播(systems-index 注记 / registry anchor_warning / clause3_supply.direction_precheck)、game-concept 三处 MVP 口径注记、systems-index 分层行 B4←D2 + 门禁块同步;**delta 复核时逐处对账**。owner:本 GDD 评审批;时机:已办,delta 复核确认。 -5. **attack_up 复活连锁(OQ1)——已兑现(2026-09-11 用户裁决批)**:基础攻击恒存在(HeroTable.atk 域 [1,999]、0 加载拒绝)→ attack_up 复活,消费者 = 主角战斗段先手攻击(B1 GDD 同批修订);AC-18 改承载 attack_up 行合法性、AC-19 锚参照回迁 attack_up 当量、registry anchor_warning/direction_precheck 同批回写;残余 = attack_up 是否入默认根池(随奖励改造批,C3)。 -6. **登记常数随调参重制流程**:b4_golden 冻结权重与默认根解耦,但 T_fog_min/K_dmg/N_draft/P_min/默认根行值调参 → AC-19 对账(对账对 (knife_adv, defense_up_basic) 漂移检测)、AC-6 分支 4、AC-18 结构断言须重跑;C3 调参流程若无"登记常数与对账重制"步骤则相关 AC 假失败。owner:C3(调参)+ qa(重制);时机:每次调参。 -7. **B4 扫描域成员清单登记**:AC-21 分支 1 的生效载体 = D2 AC-9 项目级 CI 扫描域成员清单更新(B3 先例)。owner:Technical Setup;时机:B4 GDScript 产物落地即登记。 -8. **参考算术工具锚定**:期望映射 Ψ(σ)/Φ(σ)/重 roll 轨迹的手工推导需"播种生成器取号序列"参考算术——D2 仅登记 scope 种子向量(未登记逐号序列黄金向量);参考算术以冒烟脚本内置、版本库登记,正确性以 D2 AC-3 种子向量 + AC-5 区间算术手工核验锚定;生成器取号约定(如 `randi % W` vs `randi_range`)为实现期 ADR 事实,定名时同步登记;**登记后第二人独立推导复核(A2 OQ3 同型)+ b4_reroll 可达性拆分复核(首稿零刀可达/耗尽稀有——失效即重制夹具,2026-09-09 评审补)**。owner:qa/Technical Setup;时机:冒烟框架搭建 + 实现期 ADR。 -9. **D1 呈现义务 deferral**:预读呈现(含库存常读条)/使用窗口(含 usable_now 呈现与触发政策)/四类明细行呈现/H2 强调/清空反馈不可 G-W-T——deferral 生效条件 = D1 义务①–⑤登记(缺项即 blocking)。owner:D1;时机:D1 GDD。 -10. **【新增】C3 调参期批量仿真**:F5 概率性致命带(合法权重下 N_draft 耗尽概率随 K/池构成可达非平凡值——种子轮盘)→ 调参流程须含批量仿真(刀供给分布 × A1 板分布的可行率),把配置错误暴露在调参台;与预警①–⑧预注册合并执行候选。owner:C3;时机:每次调参 + playtest。 -11. **【新增】方向预检输入缺口**:刀供给方向预检的 |资格格| 分布待 A1 actuals p10/p50 → 落地后重跑(Formulas 节登记对账记录);max_hp=50 原型锚出处建议随 B2/D2 回写补登。owner:C3/B2;时机:A1 actuals 交付。 - -## Open Questions - -1. **attack_up 入池裁决(原"死行复活条件"——2026-09-11 已复活闭合,残余入池问题)**(owner:C3):基础攻击恒存在(2026-09-11 用户裁决,B2 Rule 9)→ attack_up 复活、消费面 = 主角战斗段先手攻击;attack_up 行是否进入默认根 RewardTable 池随奖励改造批裁决(复活批不擅自入池);A3 条款 2 锚参照对象已回迁 attack_up 当量(F4 口径后果)。 -2. **未开格身份呈现深度**(owner:A5+D1,垂直切片)——MVP 不呈现(Rule 8);A5 探测道具零成本桥接(身份 install 期已定可查);呈现深度(类别/档位/身份)待 A5 定稿。 -3. **items_per_settlement_cap 启用裁决**(owner:C3 playtest)——Tuning Knobs 结构位默认关;启用即限制(过低锁死 3 单位 54 击杀需求胜局——economy-designer 警告)。 -4. **关卡末剩余道具折算(2026-09-11 关内延续裁决后重述)**(owner:C2/D5,Alpha)——"战斗结束库存清空"的体验负债**主体闭合**(库存关卡域:跨战斗延续、未选用件不再随战斗消亡;层间延续可见反馈已入切片);残余 = **关卡末**剩余道具折算/继承结构位(转金币/继承——Alpha,C2;清空前快照计数已作为折算数据面预留)。 -5. **T_fog_min 推导式**(owner:B1)——依赖条款①对照表(未设计,加载期循环依赖不可行);落定后改推导式或维持表值(F2,默认 2 provisional)。 -6. **weaken 锚裁决联动**(owner:B1)——B3 OQ1 归一口径裁决前置(瞬时 vs 总暴露);若落"总暴露"读法则 B4 重定最低档参照(registry anchor_warning;F6 供给已备行值清单与量纲建议)。 -7. **失衡预警预注册归口**(owner:C3/playtest 会话)——预警①–⑧ 阈值与样本量 provisional;与 A3 OQ3、原型 v3 终验 playtest 合并执行候选。 diff --git a/design/gdd/legacy-2026-09-13/c3-difficulty-curve.md b/design/gdd/legacy-2026-09-13/c3-difficulty-curve.md deleted file mode 100644 index 3be18511..00000000 --- a/design/gdd/legacy-2026-09-13/c3-difficulty-curve.md +++ /dev/null @@ -1,284 +0,0 @@ -# C3 难度曲线与精英/Boss(Difficulty Curve & Elite/Boss) - -> **Status**: In Design -> **Author**: DK + design-system(solo 模式——专员/总监代理跳过,出稿后人工复核) -> **Last Updated**: 2026-09-12 -> **Implements Pillar**: P4 地牢下探的探险氛围(主);P1 推理的掌控感 / P3 风险与收益同源(难度即压力源) - -## Overview - -C3 难度曲线与精英/Boss 是全部进度维度数值的唯一所有者:它定义"难度 = f(关卡序号, 节点深度, 精英/Boss 修饰)"中每一项随进度如何变化——**敌人强度曲线**(EnemyTable 的 hp/atk/unit_count/行为环投放节奏)、**雷图压力曲线**(BoardGenTable 的尺寸/密度/可推理率目标/雾参数)、**奖励供给曲线**(RewardTable 权重与威力、RewardConfigTable 参数、可选类供给控制器参数),以及**精英/Boss 图的修饰语义**(Boss = 各关最大深度 Dmax 行——A1 登记约定;精英/Boss 全局变异走 A4 `scope=global` 枚举位;`elite_`/`boss_` 命名空间预留)。 - -C3 是**数值 owner 而非机制 owner**:表结构归 D2、生成算法归 A1、结算规则归 B1、敌种机制归 B2——C3 通过行值与参数驱动这些已定稿的机制,形成"越下越险"的进度体感(P4)。玩家不直接感知本系统(Indirect):他们感受到的是第二层的伏击兽比第一层的蛆虫更凶、关底 Boss 的压迫性血量、"这一层开始有雾了"的解锁节奏——本系统是这些体感背后的统一坐标系。 - -除曲线数值外,C3 的核心交付物包括:**难度期望表**(按 (L,D) 的期望胜轮带 / 期望承伤占 max_hp 比 / 通关率目标带——调参的"正确行为"基准,本项目缺失数值目标的正式落点);**调参期批量仿真流程**(消费切片已建的工具原型 `level_monte_carlo.gd` / `reward_expectation.gd`——B4 登记的调参期仿真义务载体);以及 **B1 对账约束清单的承接与消解**(条款③满配破线两轴、条款⑤清图支配性、快杀退化预警⑥——这些是"禁止独立调参"纪律的量化边界,C3 调参必须在其内工作或显式扩界)。 - -## Player Fantasy - -**Indirect 体验——玩家不操作本系统,但每一分钟都在感受它。** - -`creative-director` not consulted — Solo mode. Review manually before production. - -本系统服务两个情绪层: - -1. **越下越险的压迫节奏(P4 主承载)**:地牢下探的每一层都是一个可感知的难度台阶——新敌种登场("这长腿的东西是什么")、新变异解锁("这一层开始有雾了")、关底 Boss 的血量压迫。参照 Peglin 的地图难度爬升与杀戮尖塔的 Act 结构(普通→精英→Boss 的三段节奏)。台阶必须**可感知但可解释**:玩家应能把难度跃升归因于可见的变化(新敌人/新变异/更大的板),而非纯粹的数字膨胀——后者产生"被坑"感而非"变险"感。 - -2. **攻克关卡的征服感(P1 的兑现侧)**:难度台阶的意义在于被跨越。首关基线应"明显吃紧但多数玩家能过"(通关率目标带见 Formulas F5),后续关卡陡升使天赋提升(C4 元进度)产生可测量的通关期望改善——**"我变强了"必须有"世界也变难了"作对照物才成立**,本系统就是那个对照物。 - -**锚点时刻**:① 第二层第一次遭遇伏击兽——三拍行为环 vs 蛆虫的单拍攻击,难度跃升有具体面孔;② Boss 房开门前——恢复点/囤刀决策压力的顶点(供给稀缺性在此处兑现价值);③ 击杀 Boss——"这层我算下来了"的完成感。 - -## Detailed Design - -### Core Rules - -Specialist agents not consulted — Solo mode. Review manually before production. - -1. **难度承载结构 = 直填行值主体 + DifficultyTable 修饰结构位(MVP 空表)**:全部 (level_index, node_depth) 维度的最终数值**直填**于各基表行(EnemyTable/BoardGenTable/RewardTable——切片已验证的工作方式,R1 floor 解析直读、零新机制);**DifficultyTable 仅承载"按坐标施加的全局修饰"结构位**(键 (L,D)、乘数域,施加点 = B2.spawn 实例化时套乘于行值快照之前)——MVP 不产生任何修饰行(空表结构位,首个使用场景 = 精英节点;Boss 走 Dmax 直填行,不走修饰表)。B2 Rule 10"C3 DifficultyTable 接口未定"的兑现 = 本条(走 D2 接口漂移规则建表)。 - -2. **难度 = f(L, D) 双轴语义**:**L 维(关间)= 大台阶**——每关至少一项新内容投放(新敌种 或 新行为环段 或 新变异解锁,B2 OQ8 投放节奏规则)+ 基准数值跳升;**D 维(关内)= 小坡度**——同敌种数值平缓上移(坡度域见 Formulas F1),板参数温和加压(尺寸/密度小步上调,推理率 target 不低于 0.85 绝对锚)。**Boss = 各关 Dmax 行**(A1 登记约定兑现):数值大台阶 + 专属行为环 + 专属板形,见 Core Rule 5。 - -3. **敌种投放节奏(B2 OQ8 兑现)**:每关至少一个新敌种或既有敌种的新环段投放;MVP 投放表:L1 = grub(D0–D1 单拍环)→ 伏击兽(D2–D3 三拍环)→ 遗迹守卫 boss_guardian(D4,专属四拍环 [attack,attack,charge,heavy]);L2 = ambusher 主力 + 雾解锁(A4 unlock_level=2 锁定)。多敌种同深度选择规则(B2 OQ7 共裁项):MVP 每行集恰一敌种(B2 锁定),C1 分支地图定稿时若需同深度多敌种选择,走 B2 OQ6/7 预登记的改键通道——本 GDD 预留不定义。 - -4. **切片行集转正为 MVP 默认曲线**:垂直切片调参登记(SLICE-TUNED)的行集有实测依据(期望扫描 N=15–30 × 多种子 + 8 种子密度实验),转正为 MVP 默认值并移除 provisional 标记的责任随本 GDD——**EnemyTable L1 深度轴**(grub 24hp/4atk ×1→群 24×2、伏击兽 36hp/6atk ×1→群 26×2、遗迹守卫 130hp/7atk)**BoardGenTable L1 深度轴**(D0/D1 10×10、D2–D4 12×12,d0.25/t0.88,attempts 24)**供给参数**(active_p0=0.4/active_decay=0.5)**HeroTable**(atk=6/max_hp=50 原型锚转正)。后续 L2+ 曲线数值随关卡内容扩展填充(结构本节已定,数值行 OQ1)。 - -5. **Boss 遭遇语义**:① Boss = 关卡末节点 = Dmax 行(LevelTable 末节点必须 Boss——LevelTable schema 校验);② Boss 数值台阶 = hp 取本关普通战斗 hp 总和的 0.35–0.55 倍(Formulas F3)+ atk 高于本关均值一档 + 专属行为环(含 charge 拍——玩家可规划的安全挖掘拍);③ Boss 板 = 本关最大板形 + 密度上探(受可推理率 target 绝对锚约束);④ Boss 战胜利 = 关卡通关(C1/C2 域编排)。 - -6. **精英节点(MVP 不实现,语义预留)**:`elite_`/`boss_` 前缀字段命名空间(A1 B7 修订预留)保留;精英修饰的完整语义(独立节点类型/词缀系统/出现规则)**归 C1 关卡节点地图定稿后的联动设计**——分支地图中"同深度并存精英与普通节点"触发 A1 OQ6 强制重审(改键走 D2 Rule 4)。本 GDD 承诺:DifficultyTable 结构位 + 命名空间预留足以承载,不预写语义。 - -7. **A4 全局变异语义(scope=global 兑现)**:`scope=global` 行 = 该变异**施加于整板全部合格格**(区别于 region 的区域布置);语义归本 GDD 定稿:**全局变异仅 Boss/精英图可产生**(普通图禁用——加载期校验:global 变异的布置行须伴随 elite/boss 标记,MVP 无标记字段前 = MVP 不产生 global 行,A4 既有 warning 承载);MVP 不定义任何具体全局变异行(岩浆/冰冻无 MVP 容器——A4 锁定),本条只锁定语义框架与禁用面。 - -8. **遭遇随机化(2026-09-12 用户拍板——Roguelike 局感引入批;Peglin 对比报告结论 2 的本切片落地项)**:EnemyTable 行的 `unit_count` 升级为**区间语义** `[unit_count, unit_count_max]`(新字段 `unit_count_max` 可省略——缺省 = 定值,旧行零迁移;域 [unit_count, 3],B2 unit_count 上界锁定不变)。**掷骰规则**:B1.begin_battle 实例化期(扫雷开始前)按区间均匀骰决定本战实际数量——**同敌种,不触碰 B2"每行集恰一敌种"锁定**;随机经 RngService **新增 `encounter` 封闭流**(scope_event_binding = 每次战斗实例化恰一 scope;发生在挖掘决策域之外,P1 合规)——B1 掷骰、B2.spawn 以 override 参数接收实际数量(**B2 零随机纪律保持**——收到的即确定值)。同种子全程可回放(流取号确定性不变)。**区间设计原则**:数量是比单体质变更优先的深度表达(F1 Example 延伸);期望总量对齐 F6 平衡带检算;"新敌种首遇节点固定数量"(教学位不加骰——D2 熊地精单挑)。 - -9. **调参约束内工作纪律(B1 对账输出的承接)**:C3 的每次行值修订必须通过 Formulas F7 调参流程,且不得触碰以下已锁约束边界——① **条款③满配破线**:unit_count>1 的行须满足"降密度或降 m_amb"补偿(registry clause3_supply 已登记,切片群战行 hp/atk 下调为合规先例);② **条款⑤清图支配性**:C 量级暂不上调(46.1/91.8 需求 vs clear_blast 40 现值——登记为非支配设计态 + OQ3 playtest 观测弃图率,见 Edge Cases);③ **可推理率绝对锚**:target ∈ [0.85, 1] 不可下探(P1 生成端保证);④ **期望表对照**:调参后 F5 期望表必须复算并在 README 调参日志登记偏离。 - -### States and Transitions - -C3 无运行时状态机(数值系统)。设计期状态: - -| 状态 | 含义 | 转移 | -|---|---|---| -| 未调参行 | 新增 (L,D) 行仅有结构占位 | 经 F7 流程 → 已调参 | -| 已调参行 | 行值经批量仿真 + 期望表对照 + 对账复算 | 任何修订 → 重走 F7 | -| SLICE-TUNED 转正 | 切片临时值经本 GDD 背书 | → 已调参(Core Rule 4 一次性完成) | -| 期望表偏离 | 调参后期望值越出目标带 | → 回滚或 OQ 登记(禁止静默出带) | - -### Interactions with Other Systems - -| 系统 | 方向 | 接口 | -|---|---|---| -| D2 | 上游(硬) | 全部基表 schema 与 R1 解析归 D2;C3 产出 = 表行值(经 ConfigDB 单点读取);DifficultyTable 新表走 D2 接口漂移规则;**RngService 增 `encounter` 流**(2026-09-12 用户拍板——registry rng_service 条目接口漂移登记,流集合封闭更新) | -| B2 | 上游(硬) | EnemyTable/HeroTable 行值由 C3 填(B2 拥有字段语义与校验域);修饰施加点 = B2.spawn(DifficultyTable 消费面);投放节奏共担(OQ8) | -| B1 | 上游(soft,事实依赖) | 条款③⑤对账输出 = 调参约束输入(B1 F4/F5 = 约束生成器);P_perfect 乘数调参权归 C3;对账复算义务随每次修订 | -| B4 | 上游(soft) | RewardTable/RewardConfigTable 数值归 C3;刀供给方向预检 = 联动重算义务(敌 hp 曲线与奖励供给禁止独立调参——registry 已登记) | -| A1 | 上游(类型依赖) | BoardGenTable 行值归 C3;**禁反向调用生成**(仅经 D2/编排器传值);F4 批量红线(严格零降级)为调参闸;d0.28 回退先例 = 密度×target 联动调参的实证 | -| A4 | 上游(soft) | scope=global 语义由本 GDD 定稿(Core Rule 7);unlock_level 门控序列(普通→雾→岩浆/冰冻)的投放计划归 C3(随关卡扩展) | -| A3 | 上游(soft) | ActionEconomyTable 联动 knob(ap_per_round 兼 RAP 转存规模);跨字段校验约束内调参 | -| C1/C2 | 下游 | 消费难度模型(节点深度语义/关卡序列的难度排布);精英节点形态联动(Core Rule 6);未设计——本 GDD 的 Boss=Dmax 约定即为其预留的接口 | -| C4 | 下游(远) | 元进度天赋数值的"世界侧对照物"——通关率目标带是 C4 天赋强度的标定基准 | - - -## Formulas - -`systems-designer` not consulted — Solo mode. Review manually before production. - -**定位声明**:C3 是数据系统——**运行时零新增公式**(数值直填基表行,运行时仅经既有 B1 F2 乘区/B2 接口运作)。本节全部公式为**设计期工具式**:曲线拟合基准、期望估算、对账复算——它们的执行载体 = 调参期批量工具(level_monte_carlo.gd / reward_expectation.gd 扩展,见 F7),不进入游戏运行时。全部数值 provisional 起步,随 playtest 修正。 - -### F1 关内深度坡度(D 轴小坡度) - -The depth_scaling formula is defined as: - -`hp_D = round(hp_0 × (1 + s_hp × D))` - -**Variables:** -| Variable | Symbol | Type | Range | Description | -|----------|--------|------|-------|-------------| -| 深度基准值 | hp_0 | int | [1,999] | 该敌种 D0 行 hp | -| 坡度系数 | s_hp | float | [0.05, 0.20] | 每深度档增幅(MVP 直填行近似此式,不运行时计算) | -| 节点深度 | D | int | [0, Dmax] | 节点深度(Boss = Dmax) | - -**Output Range:** 每档 +5%–20%,Dmax 处 1.25–1.8 × D0(同敌种内);敌种切换(新敌种登场)不受本式约束——台阶值直接定。 -**Example:** grub 24hp:D1 理论 24×1.1 ≈ 26——切片实际以"群×2"(24×2=48 总量)表达深度压力,即**数量是比单体质变更优先的深度表达**(保持单拍环的低威胁读数、总量翻倍)。 - -### F2 关间台阶(L 轴大台阶) - -`base(L+1) ≈ base(L).Dmax × k_L`,`k_L ∈ [1.3, 1.6]` - -**Variables:** -| Variable | Symbol | Type | Range | Description | -|----------|--------|------|-------|-------------| -| 关间系数 | k_L | float | [1.3, 1.6] | 下一关 D0 基准 = 本关 Dmax × k_L(数值跳升 + 新敌种/新变异共同构成台阶感) | - -**Output Range:** 相邻关数值倍率 1.3–1.6;叠加新敌种环复杂度,实际体感台阶更大。 -**Example:** L1 Dmax 遗迹守卫 130hp → L2 D0 ambusher 基准 ≈ 130×1.4 ≈ 182?——**否**:k_L 作用于**同敌种基准**;新敌种登场时基准按其环复杂度重定(三拍环单位 hp 低于单拍环同关值——切片先例:伏击兽 36 < 群 48 总量但威胁更高)。k_L 适用于**敌种延续**场景(如 L2 ambusher 延续至 L3)。 - -### F3 Boss 血量锚 - -`boss_hp ≈ round(Σ普通战斗hp × r_boss)`,`r_boss ∈ [0.5, 1.1]`(**2026-09-12 试玩批次 1 修订**——原 [0.35,0.55];用户试玩裁决"Boss 血量 OK 或可上调"+ 主角必须会掉血的成就感诉求,偏重承诺保留;L1 首关偏上沿,后续关随玩家成长回落) - -**Variables:** -| Variable | Symbol | Type | Range | Description | -|----------|--------|------|-------|-------------| -| 本关普通战斗 hp 总和 | Σ普通战斗hp | int | [1,999]×N | 本关全部非 Boss 节点的敌方 hp 合计(含群战总量) | -| Boss 占比 | r_boss | float | [0.35, 0.55] | Boss 相对全关消耗的血量锚 | - -**Output Range:** Boss hp = 全关消耗的 35%–55%——"Boss 是本关最大的单场消耗"。 -**Example:** L1 v3:Σ = 24 + 26 + 40 + 52 = 142 → Boss 150/142 ≈ 1.06(上沿内 ✓——v3 数值批对齐修订后带)。历史:v2 130/160 ≈ 0.81 曾越旧带上界(OQ2 试玩裁决"OK 或可上调"后 F3 带修订,越带争议消解)。 - -### F4 期望承伤估算(设计期) - -`E[承伤/场] ≈ Σ_rounds Σ_enemies E[beat_dmg] × (1 − E[减伤])` - -**Variables:** -| Variable | Symbol | Type | Range | Description | -|----------|--------|------|-------|-------------| -| 每拍期望伤害 | E[beat_dmg] | float | [0,999] | 敌 atk × 拍别乘数 × 出现频率(行为环确定性轮转——纯算术) | -| 减伤期望 | E[减伤] | float | [0,1] | defense_up 授予率 × 当次减伤(切片实测供给 ~0.44/格 × 50%) | - -**Output Range:** 期望表"承伤占 max_hp 比"列的估算基础;对照目标带 ≤20%/普通场、≤50%/Boss 场。 -**Example:** grub(环 [attack],atk4)每结算恒 4 × (1−0.22 平均减伤) ≈ 3.1/轮 → 2 轮战斗 ≈ 6.2 = max_hp 的 12%——带内 ✓(切片实测 2.1–2.7/轮与此一致)。 - -### F5 通关率目标带(期望表核心) - -**Variables:** -| 目标带 | 基线(无天赋) | 中天赋(+100% atk) | 高天赋(+200%) | -|---|---|---|---| -| L1(首关) | **40–60%** | ≥95% | 100% | -| L2 | **20–40%** | 60–80% | ≥90% | -| L3+ | 10–25% | 40–60% | 60–80% | - -**Output Range:** 通关率 = level_monte_carlo 扫描输出(理性策略近似);**真人修正系数待 playtest 标定**(模拟者无避雷推理、无情绪化决策——真人基线通关率预期显著低于模拟值,OQ3 首要标定项)。 -**Example:** 切片实测基线 55–80%(N=15–30)——L1 带内偏上沿;供给控制器批后的 buff 频率副作用(44%→59%)是带内上移的已登记原因。 - -### F6 供给需求平衡式(B4 方向预检正式化) - -`Σ刀伤供给 + Σ即时伤害 + atk × E[轮数] ≥ Σ敌hp × (1 + 缓冲)` - -**Variables:** -| Variable | Symbol | Type | Range | Description | -|----------|--------|------|-------|-------------| -| 供给合计 | — | float | — | 每关可获取伤害总量(供给控制器 E[获取] × 刀力加权 + 清图 clear_blast + 基础攻击×轮数) | -| 缓冲 | 缓冲 | float | [1.1, 1.4] | 非完美执行余量(漏挖/错用/踩雷税) | - -**Output Range:** 比值 < 1.1 = 供给短缺(打不死);> 2.0 = 供给过剩(速杀退化预警⑥)。带内 [1.1, 2.0]。 -**Example:** L1 v3+遭遇区间(2026-09-12):Σ敌hp 期望 ≈ 36(D0 [1,2]×24)+ 32.5(D1 [2,3]×13)+ 40(D2)+ 45(D3 [2,3]×18)+ 150(Boss)≈ 304 × 1.1 = 334 vs 供给 ≈ 180——比值 ≈ 0.54,**短缺态**(基础攻击扛大梁:6×E[轮数 17.5] ≈ 105 是最大单一分量——这正是"基础攻击恒存在"的设计兑现:奖励是规划面增量,基础攻击是底盘)。 - -### F7 调参流程(每次修订强制走完) - -`改表值 → smoke_all 全绿 → level_monte_carlo 扫描(F5 对照)→ reward_expectation 供给对照(F6)→ 对账复算(条款③⑤/预警⑥)→ README 调参日志登记` - -**Variables:** -| Variable | Symbol | Type | Range | Description | -|----------|--------|------|-------|-------------| -| 批量样本量 | N | int | ≥256(正式)/ 15–30(切片临时) | A1 F4 排期倒挂的解除载体:正式批量工具 = level_monte_carlo 扩展(逐行聚合 + N 参数化 + inferability/降级统计并入 experiment_density 能力)——C3 期交付物,A1 F4 报告 C 的 actuals 消费方 | - -**Output Range:** 任一步 FAIL → 回滚或登记 OQ,禁止带病前进。 -**Example:** 切片 d0.28 回退先例:d0.28/t0.87 → best≈0.81 降级告警 → 回退 0.25/0.88——F7 第 2 步(A1 生成质量闸)拦截的成功案例。 - -## Edge Cases - -`systems-designer` not consulted — Solo mode. Review manually before production. - -- **If unit_count>1 行与高密度板组合**:条款③满配语境破线(B1 F4 双轴约束)——该组合**禁止入表**(调参约束内工作纪律 Core Rule 8①;切片先例 = 群战行 hp/atk 下调补偿)。对账复算在 F7 第 5 步强制执行。 - -- **If 关卡深度轴缺行(如 D3 缺失、D4 存在)**:R1 floor 解析静默兜底至低档(难度降而非崩)+ ConfigDB warning 四元组——但**加载期校验拦截本场景**:LevelTable 节点引用的 (L,D) 须在两表有精确行(切片跨表护栏⑧先例转正);缺行的根因是调参事故而非运行时事件。 - -- **If 请求越界关卡(level 999)**:R1 floor 解析至表尾行(难度封顶 = 尾行值)+ warning——冒险结构(C2)应在其内容覆盖范围内生成关卡序列;越界 = 内容生产缺口,非玩家可达态。 - -- **If 玩家天赋拉满(atk+300%)打最低难度行**:速杀退化(预警⑥——战斗 1–2 轮终局、奖励系统饿死自己的高光)。处置 = 预警⑥仪表监控(战斗结束未开资格格占比 >70% 警)+ 接受(低难度行被高天赋速杀是 Roguelike 成长兑现的合法形态,无需修复——目标带按"基线"定义,高天赋本就该碾压低关)。 - -- **If 密度上探压垮推理率(d0.28 案例)**:best inferability ≈0.81 < target 0.87 → 降级告警"接受最优出图"。处置 = **回退**(切片先例:0.28/0.87 → 0.25/0.88)——密度与 target 是联动对(A1 求解器能力的天花板内联动调参),禁止为难度牺牲 P1 度量达标;F7 第 2 步闸拦截。 - -- **If 条款⑤清图支配性反转(弃图率 >30%)**:玩家普遍发现"挖一半就弃图刷 RAP"优于"推到底清图"→ 清图奖励与清图体验被支配。处置 = OQ3 playtest 观测(自动模拟者不弃图,测不到真人策略);届时杠杆 = C 量级上调(B1 约束包①)或弃图成本重定价(A3 域)——**MVP 接受当前非支配设计态**(clear_blast 40 + 供给控制器首件保证已改善原判式,实测后再裁)。 - -- **If 投放节奏断档(某关无新敌种且无新环段)**:OQ8 违例——敌信息总量见底,学习曲线枯竭。处置 = F7 流程的投放检查项(每关至少一项新内容——Core Rule 3);违规 = 内容生产缺口,C3 调参无法修补(数值不是内容)。 - -- **If 全部行值调至域上限(hp 999 等)**:数值可行但可玩性崩塌。处置 = F5 目标带对照拦截(期望表全面越带 = 配置事故)+ 域校验既有护栏;本场景属调参事故而非玩家可达态。 - -- **If DifficultyTable 修饰行与直填行值叠加后越域**(首个精英节点上线时):B2.spawn 套乘后 hp >999 → **clamp 至域界 + warning**(fail-fast 不适用——修饰乘数是合法配置,越界是组合事故;域界 = 玩法硬顶)。MVP 空表无此场景,规则预登记。 - -## Dependencies - -| 系统 | 方向/硬度 | 接口与义务 | -|---|---|---| -| D2 | 上游(**硬**) | 基表 schema/R1 解析/ConfigDB 单点全归 D2;C3 产出 = 行值;DifficultyTable 新表走接口漂移(Core Rule 1);**禁绕过 ConfigDB 自建 load**(Rule 2) | -| B2 | 上游(**硬**) | EnemyTable/HeroTable 字段语义与校验域归 B2(值归 C3);修饰施加点 = B2.spawn(实例化时套乘、行值快照前);投放节奏 OQ8 共担;多敌种同深度选择规则共裁(OQ7——C1 联动) | -| B1 | 上游(soft,事实依赖) | 条款③⑤对账输出 = 调参约束输入(**C3 消费 B1 对账输出的事实依赖成立**——B1 GDD 2026-09-10 登记);P_perfect 乘数调参权归 C3;期望口径双读数纪律(锚行读数不得用于 unit_count=2 放行) | -| B4 | 上游(soft) | RewardTable/RewardConfigTable/供给控制器参数值归 C3;**敌 hp 曲线与奖励供给禁止独立调参**(registry 联动重算义务——F6 平衡式为联合检算工具);调参期批量仿真义务载体 | -| A1 | 上游(类型依赖) | BoardGenTable 行值归 C3(含 max_gen_attempts 策略);**禁反向调用生成**;F4 批量红线严格零降级 = 调参闸;黄金向量/solver_rules 冻结不经 C3 | -| A4 | 上游(soft) | scope=global 语义定稿(Core Rule 7);unlock_level 投放计划归 C3;变异机制框架归 A4(C3 只投内容行) | -| A3 | 上游(soft) | ActionEconomyTable 联动 knob(ap_per_round 双重身份——节奏兼 RAP 转存规模);跨字段校验(动作成本 ≤ ap_per_round)内调参 | -| B3 | 上游(soft) | StatusEffectTable 四行强度(attack_up +50 等)provisional 归 C3 联动评估(B1 免伤轮合法性注记——强度评估归 C3 对账联动) | -| C1 | 下游 | 节点深度语义/精英节点形态联动(Core Rule 6/OQ6 强制重审);未设计——Boss=Dmax 约定即预留接口 | -| C2 | 下游 | 关卡序列的难度排布消费本 GDD 期望表;未设计 | -| C4 | 下游(远) | 天赋强度的标定基准 = 通关率目标带(F5);未设计 | -| 呈现层(B5/D1) | 下游(soft) | Boss 登场仪式感/难度台阶可感知性(新敌种图像线索归 B2 意图推测型)——视觉义务归 B2/B5,C3 仅提供"何时变难"的数据 | - -**双向一致性**:systems-index 依赖表 C3 ← D2,B2 ✅(2026-09-10 B1 块增补"C3 消费 B1 对账输出的事实依赖成立"——本表扩展为正式登记)· B2"敌种 hp/atk/pattern 曲线数值、难度修饰 → C3" ✅ · B1"C3 = 条款③⑤约束输入方" ✅ · B4"权重/档位/威力曲线 + RewardConfigTable 参数归 C3" ✅ · A1"每行难度数值与曲线 → C3" ✅。 - -## Tuning Knobs - -C3 是全项目 knob 保有量最大的系统(数值 owner)。**全部值 provisional 起步;域与校验归各表 schema(D2);本表只登记所有权、联动与危险方向。** - -### C3 直辖 knob - -| Knob | 表 | 域 | 联动 | 过高 | 过低 | -|---|---|---|---|---|---| -| EnemyTable.hp/atk(逐行) | enemy.tres | [1,999]/[0,999] | **与 B4 供给禁独立调参**(F6 联合检算);cap×atk 禁独立(B2) | 速杀反面——打不死、战斗冗长 | 快杀退化预警⑥ | -| EnemyTable.unit_count / unit_count_max(逐行) | enemy.tres | [1,3] / [unit_count,3] | **>1 行须降密度或降 m_amb**(条款③);区间骰经 encounter 流(Core Rule 8) | 条款③破线 | 压力不足/遭遇零随机 | -| EnemyTable.pattern(逐行) | enemy.tres | MVP 三值组合 | OQ8 投放节奏(每关新环段) | 信息过载 | 学习曲线枯竭 | -| HeroTable.atk/max_hp | hero.tres | [1,999] | 全部供给式的分母锚(F6) | 奖励价值稀释 | 挫败感 | -| BoardGenTable 尺寸/密度/attempts(逐行) | board_gen.tres | 域见 schema | **密度×target 联动**(d0.28 回退先例);unit_count>1 行联动 | 推理率不达标降级 | 板退化(低密度先布后删) | -| BoardGenTable.inferability_target(逐行) | board_gen.tres | **[0.85,1] 绝对锚** | 与密度成反耦 | 生成耗时/降级 | P1 空心化 | -| BoardGenTable 雾参数 | board_gen.tres | f≤8d/≤0.25 | unlock_level=2 锁定 | P1 度量空心(绝对上限) | 雾内容缺位 | -| RewardTable.weight/power/tier(逐行) | reward.tres | 域见 schema | F6 供给式;攻击面稀释 | 即时类淹没明细/可选类贬值 | 窗口空转/F5 重 roll 频发 | -| RewardConfigTable.{t_fog_min,k_dmg,n_draft,p_min} | reward_config.tres | 域见 schema | 概率性致命带(批量仿真义务) | 保底永不触发 | 种子轮盘致命 | -| 供给控制器 active_p0/active_decay | reward_config.tres | [0,1]/(0,1] | E[获取]≈1 目标;**与敌 hp 联动** | 速杀+囤积回归 | 可选类绝育 | -| ActionEconomyTable.{ap_per_round,rap_refresh_cost,refresh_max_per_round} | action_economy.tres | 域见 schema | ap 兼 RAP 转存规模;跨字段校验闸 | 轮次冗长 | 决策密度坍缩 | -| SettlementTable.P_perfect(乘数) | settlement.tres | {100,200} | 完美排雷×清图支配性互 feed | 钓鱼线(护栏 B) | 高光缺位 | -| DifficultyTable 修饰乘数(MVP 空表) | difficulty.tres(待建) | [0.1,10](预登记) | 精英节点上线时启用 | 越域 clamp+warning | 无修饰 | - -### 联动网络(禁止独立调参清单) - -1. **敌 hp ↔ 奖励供给**(registry 已锁):单边移动必走 F6 联合检算。 -2. **unit_count ↔ 密度/m_amb**(条款③):群战行上线前的强制复算。 -3. **密度 ↔ target ↔ attempts**(A1):d0.28 回退先例的三元组。 -4. **ap_per_round ↔ RAP 体系 ↔ refresh 上限**(A3 + 轮内刷新批):跨字段校验闸承载。 -5. **m_w(weaken −65) ↔ 锚对照表**(B1 F0):终值共裁 B4/B1,调参走 C3。 - -## Visual/Audio Requirements - -C3 无自有视觉/音频资产(数值系统)。**义务转注**:① Boss 登场呈现(仪式感锚点——Player Fantasy ③)归 **B5 战斗表现/D1**(其设计输入 = Boss=Dmax 行的数据面本 GDD 提供);② 难度台阶可感知性归 **B2 意图推测型**(敌种图像线索稳定可学——新敌种 = 新图像线索 = 台阶的可视面孔);③ 变异解锁的"这一层有雾了"归 **A4/D1 图例与首遇提示**(已登记义务)。本节无新增资产需求。 - -## UI Requirements - -无自有 UI。**义务转注**:① 期望表/批量仿真输出 = 调参期开发工具(非游戏内 UI——headless 工具);② 敌人强度可读性("这只比上层的硬")归 B2 意图推测型 D1×4 义务(图像线索档位编码);③ 恢复点/奖励点呈现归 C1-lite 切片已实现的节点覆盖层(正式形态归 D1/C1)。无 D1 新增义务登记。 - -## Acceptance Criteria - -`qa-lead` not consulted — Solo mode. Review manually before production. - -- **AC-1** GIVEN LevelTable 任一 battle/boss 节点 (L,D),WHEN ConfigDB 加载全部表,THEN board_gen 与 enemy 两表存在该 (L,D) 精确行(跨表护栏⑧转正——floor 兜底静默降难度属调参事故)。 -- **AC-2** GIVEN MVP 全部 (L,D) 行,WHEN 逐行扫描 inferability,THEN 全部行 inferability ≥ target ≥ 0.85(P1 绝对锚)且 A1 断言族(退化板/R₀≠S)零违例——批量 N=256/行(F4 排期倒挂解除后的正式红线)。 -- **AC-3** GIVEN EnemyTable 全部 unit_count>1 行,WHEN 条款③复算(密度 × m_amb 组合),THEN 无破线组合存在(Core Rule 8①)。 -- **AC-4** GIVEN 供给控制器与敌 hp 曲线现值,WHEN F6 平衡式检算每关,THEN 比值 ∈ [1.1, 2.0](短缺/过剩双双报警)。 -- **AC-5** GIVEN 期望表目标带(F5),WHEN level_monte_carlo 全带扫描(基线/+100%/+200% × hp+100%),THEN 各 (L,天赋档) 通关率在带内或 OQ 登记偏离——**禁止静默出带**。 -- **AC-6** GIVEN L1 全部行集,WHEN 枚举敌种与环段,THEN 每关至少一项新投放(新敌种或新环段——OQ8;L1 = grub→ambusher→boss_guardian 三段 ✓)。 -- **AC-7** GIVEN Boss 行(Dmax),WHEN F3 检算,THEN r_boss 记录在案(越带须 OQ 登记——切片 0.81 越上界已登记 OQ2)。 -- **AC-8** GIVEN 每轮刷新,WHEN 计数达 refresh_max_per_round,THEN 第 N+1 次拒绝(表值驱动——2 为当前值非硬编码)。 -- **AC-9** GIVEN 任何 C3 直辖 knob 修订,WHEN 检查其联动网络(G 节五组),THEN 对应联合检算记录存在于调参日志(禁止独立调参纪律的流程面)。 -- **AC-10** GIVEN DifficultyTable MVP 空表,WHEN B2.spawn 任一 (L,D),THEN 无修饰行被消费(结构位不产生行为)且未来首行上线时套乘点 = 行值快照前。 -- **AC-11** GIVEN scope=global 变异行,WHEN 出现于非 Boss/精英图布置候选,THEN 加载/生成期拒绝(Core Rule 7 禁用面——A4 warning 通道升级为闸)。 -- **AC-12** GIVEN 每次调参批,WHEN 检查 README 调参日志,THEN F7 六步的执行记录齐备(流程纪律的可审计面)。 - -## Open Questions - -- **OQ1(L2+ 曲线数值)**:本 GDD 定结构/流程/目标带;L2+ 具体数值行随关卡内容扩展填充(内容与数值同批——C2 关卡序列定稿后)。Owner: C3 随批 · Target: L2 内容扩展时。 -- **OQ2(Boss 血量占比越带)**:**初步裁决(2026-09-12 试玩批次 1)**——用户反馈"Boss 血量目前 OK 或可以上调"→ F3 带修订为 [0.5,1.1]、v3 Boss 150HP 落带 ✓;败北分布向 Boss 集中(4/6)符合压迫预期。**维持开放**:v3 真人实测 Boss 战时长后再终裁(是否继续上调)。Owner: C3 · Target: playtest 批次 2。 -- **OQ3(真人修正系数)**:**方向确认(2026-09-12 试玩批次 1)**——v2 数值下模拟基线 80% vs 真人 100% 满血通关(清图/标雷/不用道具三策略均通):真人显著强于模拟者(推理避雷 + 标中旗 weaken + buff 组合利用)。v3 加难后模拟基线 60%;真人系数待 v3 试玩采集定量。Owner: C3 + playtest · Target: playtest 批次 2。 -- **OQ4(条款⑤支配性真人观测)**:**初步裁决(试玩批次 1)**——真人零弃图倾向("完全没有")→ 条款⑤非支配设计态成立、C 量级不上调 ✓(B1 约束包②采信)。维持登记:单一样本,后续批次持续观测。Owner: C3+B4 · Target: 持续。 -- **OQ5(精英节点形态)**:精英修饰的完整语义(独立节点/词缀/出现规则)= C1 分支地图定稿后的联动设计(OQ6 强制重审随之触发)。Owner: C3+C1 · Target: C1 GDD 定稿。 -- **OQ6(轮内刷新对难度模型的冲击)**:**初步读数(试玩批次 1)——刷新零使用**,根因不是免结算太顺滑而是**盲猜墙不足**(inferability 0.88 = 仅 ~12% 格不可推理,清图流几乎无赌点)。杠杆预登记:密度联动上探(d0.28/t0.85——A1 回退先例风险,attempts 24 下待实测);保持开放。Owner: C3 · Target: playtest 批次 2。 - -### 试玩批次记录 - -**批次 1(2026-09-12,v2 数值,用户本人)**:全部满血通关(清图为主/优先标雷/不用道具三策略均通)——基线难度不足定量坐实;Boss 血量 OK 或可上调;刷新零使用;零弃图倾向;治疗包零使用(不掉血伴生);伤害道具无特色(暂保留)。**裁决产出**:v3 数值批(atk 4/4/6/4/7 → 7/5/9/6/9;D0 24 保持防秒杀、Boss 130→150)+ DND 命名批(goblin/bugbear/ogre_chief)+ F3 带修订 + OQ2/3/4/6 读数。v3 扫描:基线 60%(带内上沿 ✓)、败北向 Boss 集中 4/6、+200% 100%——F5 带对照通过。下一批:v3 真人试玩(OQ3 定量 + OQ2 终裁)。 \ No newline at end of file diff --git a/design/gdd/legacy-2026-09-13/d1-hud-framework.md b/design/gdd/legacy-2026-09-13/d1-hud-framework.md deleted file mode 100644 index 068a4364..00000000 --- a/design/gdd/legacy-2026-09-13/d1-hud-framework.md +++ /dev/null @@ -1,375 +0,0 @@ -# D1 HUD 与界面框架(HUD & UI Framework) - -> **Status**: Designed(2026-09-13 /design-system 一次会话定稿;**solo 模式——专员/总监代理全部跳过,出稿待人工复核**;未经 /design-review,独立评审须新会话 `/design-review design/gdd/d1-hud-framework.md`) -> **Author**: user + agents(呈现义务承载依据 = `design/ux/battle.md`(APPROVED 2026-09-12,§13 台账 27 项经 ux-review 实存验证)+ `design/art/art-bible.md` §1–4(定稿 2026-09-13)) -> **Last Updated**: 2026-09-13 -> **Implements Pillar**: P1(主——数字可读与拒绝诚实的感知面:"我算对了"看得见)· P2(主——逐行归因的呈现半边)· P4(地牢氛围容器:五区布局与能量档承载) -> **Layer**: 4 Presentation · **Milestone**: MVP · **设计顺序**: 第 10 位(MVP 最后一块) -> **上游全部 Approved**(A1–B4/B1/C3 + D2 + battle.md + art-bible §1–4)——D1 是项目首个**零玩法上游假设**的表现层系统 - -## Overview - -D1 是 Dungeon Sweeper 的**呈现层框架**:把 A1–B4 的全部玩法事实变成玩家看得见、点得动、归因得了的界面。它的承载物是**战斗屏**(MVP 唯一玩法屏,五区常驻双舞台布局——关卡进度条 / 战斗画面 / 角色信息 / 扫雷图 / 道具栏,规格见 `design/ux/battle.md`),外加一族共享呈现设施:toast 提示体系、模态覆盖层家族(图例 / 明细回看 / 胜负终局)、输入翻译(鼠标意图 → A2 意图对象)、模态层级管理、面向呈现的信号载荷契约与 ux 遥测。D1 不拥有任何玩法状态:全部读经核心只读面与封装呈现面,全部写经组合根(架构七原则"依赖单向组合根";ADR-0001/0003)。 - -D1 的存在理由有三层。第一,**义务承载**:systems-index 门禁体系向 D1 登记了 27 项呈现义务(A2×6 / B2×4 / B3×4 / B4×5 / B1×3 / A4×3 / A3 + A1 EC5——逐项落位表见 Dependencies,缺项即 blocking),battle.md 已逐项裁决呈现形态,本 GDD 将其升格为系统级验收。第二,**切片教训兜底**:垂直切片两起呈现层崩溃(窗口载荷缺字段、battle_finished 后读已销毁对象)暴露"已定稿 AC 全覆盖 core、呈现层零测试承载"的系统性盲区——本 GDD 落实三条硬性要求(信号载荷 schema 成文 / 场景级 headless 测试进 AC / 信号时点状态可见性规则,见 Core Rules 14–16 与 AC 硬性块)。第三,**美术解耦**:art-bible §4.6 图标键契约已冻结(键与通道分配定稿、终稿美术归样张批),样张未制作**不阻塞** D1——呈现层以**程序化占位**(白话:用代码按冻结色板与形状规则直接画出的临时图形,终稿美术到位后原位替换)先行,验收引用 art-bible §1.4 格子样张标准。 - -没有 D1,游戏没有可玩的表面:A2 的三事件流没有读者、B1 的流水协议没有呈现面、27 项上游义务没有兑付点——"自动战斗沦为无聊过场"(game-concept 已识别风险 #1)的防线就设在 D1 的逐行明细与高光反馈上。 - -## Player Fantasy - -**直接承载**(Section A 定框:玩家每一次点击、每一行结算、每一面旗都直接与 D1 互动)。D1 的情绪目标一句话:**"我看见的每一步都是真的"**——界面不说谎:数字是真实雷数(雾格只是不显示,数据层恒真)、拒绝有原因、作废有提示、结算逐行可归因。玩家对 D1 的正确感觉是"一块干净的玻璃":看穿它直接看到棋局与战果,玻璃本身不添乱。 - -体验锚点(按支柱): - -- **P1 推理掌控感的感知面**:四种格态一瞥可辨(左键双义的消歧前提——误挖不可逆)、悬停预承诺三态光标、可挖域常驻呼吸微光、每次拒绝可感知——规则层的诚实(A2 数字恒真、三源拒绝)必须由呈现层原样送达,任何呈现失真(雾格显影、拒绝吞掉、格态混淆)都是 P1 的死亡体验。 -- **P2 规划延迟兑现的呈现半边**:结算明细带逐行兑现、每行带来源标注(B1 流水行协议)、四类未生效行不静默、零值行不被吞——P2 裁剪判据"玩家能说出这个结果是我哪步扫雷带来的"的最后半米由 D1 走完。 -- **P4 地牢氛围容器**:挖掘期画面无杂音(能量 2/10,唯一在动的是悬停呼吸微光——art-bible §2.1)、结算期金橙光带逐行横扫(7/10)、清图金粒喷泉短促丰收(8/10)、失败暮蓝最静一拍(1/10)——art-bible §2 能量档与明度恒定硬规则由 D1 的转场与反馈系统承载。 - -参考感受:Into the Breach 的格内信息分层(预告上格——威胁画在格子上)+ 杀戮尖塔的逐卡结算反馈。**反向护栏**:界面绝不替玩家思考(不预判合法点击以外的东西)、绝不静默改判(voided 不提示 = 读感欺骗)、绝不用装饰伪装逻辑差异(art-bible 原则三)。 - -> 注:`creative-director` 未经咨询——Solo 模式,生产前请人工复核本节情绪定位(与 battle.md Purpose & Player Need 同源,本节为系统级转写)。 - -## Detailed Design - -> **归属声明**:屏级布局、组件形态、交互细节、动画时长的**裁决权威** = `design/ux/battle.md`(APPROVED)——本 GDD 引用其裁决不重复论证,只做三件事:① 升格为系统级 Core Rules 与 AC;② 补齐 spec 之外的系统级契约(信号载荷 schema / 订阅纪律 / 程序化占位 / 命名统一 / 遥测);③ 逐项落位 27 项门禁义务。冲突时以 battle.md + art-bible 为呈现形态权威、以本 GDD 为系统契约权威,机制语义以各玩法 GDD 为准。 - -### Core Rules - -**一、系统形态与架构边界(承重)** - -1. **零玩法状态、双层边界**:D1 代码零玩法数值字面量(期望值全部经核心只读面读表值推导——D2 Rule 1 对呈现消费面的适用口径)、零规则逻辑(不判合法性、不裁语义——一切判交上游,呈现只翻译结果)、零核心写调用(`settle_batch` / `submit_window_selection` / `request_refresh`〔经 B1 `refresh_board`〕 / runner 推进唯一发生在组合根——ADR-0003 Key Interfaces)。视图单元 = 信号外发 + setter 只读注入(切片九单元形态转正:BoardView / HUDView / HudPresenter / BattleLogView / ItemWindowOverlay / NodeOverlay / LevelStripView / TunePanel / UiKit)。 -2. **订阅纪律(ADR-0001 固化)**:呈现层**永不直接订阅 A2/A3**——只订 B1 步骤流 / 结算快照信号与 runner 信号;接线全部发生在组合根(core 信号 → 组合根 → 视图 setter)。**棋盘等"零事件外发"面的刷新 = 命令式回执驱动**(白话:动作调用返回后,组合根立刻重查一次只读面来刷新界面,而不是等一个通知信号——因为部分动作本来就不发信号)。battle.md §Events Fired 的"呈现订阅 A2 三事件"表述按本条收窄为"经组合根转发或命令式回执"(措辞差登记冲突清单⑥,battle.md 正文不改动)。 -3. **呈现面读图(封装收口批 entry 39/40 的 GDD 转正)**:D1 全部读经成文呈现面,禁私有字段直读——A2:`current_board()`(格态/旗/小人/变异只读投影)/ `reveal_record()` / `compute_move_path(cell)`(不可达返回空——预览与执行同源);A3:`phase / ap / rap / last_round_end`(getter-only);B1:`presentation_snapshot() / is_battle_live() / stock_count() / query_reward_identity()`(B1 成文呈现面)+ 步骤流信号;B2:`hero_unit() / all_enemies()` 投影;B3/B4:零直读(B1 协作对象私有化——经 B1 呈现面与流水投影);runner:节点链 / 当前节点 / HP 携带(A 区)。 -4. **写路径总表(全部经组合根)**:挖掘/旗/移动/停手 → A2 `settle_batch(intents)`(stop 亦经此——A2 D1×6①:不直调 A3);窗口选择 → B1 `submit_window_selection(窗口条目位置序)`(**传窗口条目位置、非库存句柄**——切片缺陷④契约);弃图刷新 → 组合根提交刷新意图 → B1 `refresh_board` 编排(A3 扣费 → A2 retire → A1 generate → A2 install → B4 roll_board);节点推进 → runner。**每帧至多一批提交(单意图帧)**,见 Rule 7。 - -**二、五区布局与常驻组件(继承 battle.md 布局决策 D1——常驻双舞台分屏)** - -5. **五区常驻布局(1280×800 基座,ADR-0002 canvas_items/expand)**:A 关卡进度条(全宽 28px,LevelStripView——节点链步进、当前高亮、已过暗金,数据源 runner)/ B 战斗画面(全宽 252px:英雄卡 + 敌人卡 ×1–3 + 轮次·阶段指示 + 结算明细带 24px 摘要 / 84px 实时流)/ C 角色信息(左下 240×520:HP / 攻击值含修正显示 / RAP 数据框直角细线素面 + 状态效果槽固定 4 槽 + 小人立绘占位)/ D 扫雷图(中下 ~760×520:AP 点阵条 44px〔停手按钮居左、图例与弃图刷新按钮居右——刷新按钮置雷图右上角〕+ BoardView 棋盘 + toast 槽上缘内侧)/ E 道具栏(右下 280×520:库存常读列表 + 窗口态原位激活)。战斗画面与扫雷图**同屏常驻**:挖掘期敌人待机可见、结算期不切场景(对 B5"双舞台陷阱"的裁决输入 = 第三形态)。 -6. **敌人卡(B 区,B2×4 承载)**:逐卡 = 敌像(§4.6.4 线索键姿态)+ 血条(hp/max_hp 数字可读)+ 顺位徽标(固定顺位目标可读——D1×4③)+ 意图徽标(**下一拍预告**:呈现即将执行的一拍的视觉状态,挖掘期全程可见,结算期不另设意图播片——B2 Rule 8⑤)+ 行为环点(环点数 = 环长编码,当前位置高亮)+ 状态槽。**敌方 side 池呈现口径(D1×4④)**:伏击层数为全体敌人共享单值、各卡**同值**呈现(数据源 = B1 流水经 B3 投影)。敌人死亡呈现:血条直角递减归零 → 卡体灰化 + 碎裂退场(**禁瞬消**——B2 资产下限);战斗段短路被掐灭的重击不产行动明细行、由行序可推断(B1)。敌人卡刷新 = **就地更新**禁逐行重建(切片教训:全量重建吞掉死亡灰化态——entry 36)。 -7. **输入翻译与单意图帧(A2×6①⑥ 承载)**:鼠标驱动(全部操作纯鼠标可完成——Gamepad Partial 非 MVP):左键已开格 = 移动 / 左键未开相邻格 = 挖 / 右键 = 插拔旗 / 停手按钮 = `settle_batch([stop])`。**单意图帧收集**:一帧内 collected 意图整批提交,stop 点击终结当帧收集;F4 语义序仲裁退为防御性兜底(生产面不可构造——联合清图让位条款不可达)。**悬停预承诺(A2×6③)**:光标三语义(移动箭头 / 挖镐 / 旗形)+ 目标格边框高亮;**可挖域常驻指示**:小人 8 向相邻未开格呼吸微光(挖掘期唯一在动元素);不可挖域悬停 = 禁止光标 + 首 run 一次 toast「需先走近(点击已开格移动,免费)」。**复合意图(点击远格 = 自动 move+dig)MVP 不做**(A2 评估项留痕:免费移动高频,两击摩擦符合 P4 ≤2 观测假设)。 -8. **移动路径预览 = 合法性指示(A2×6⑤ 悬案的 D1 定稿,继承 battle.md 布局决策 D3)**:悬停已开格 → `compute_move_path` BFS 路径以小人蓝细线点迹高亮(**合法性指示**——告诉玩家"点这里小人会怎么走",不是穿行动画);移动执行 = ≤150ms 短滑。备选"穿行动画轨道"登记不采纳:移动免费高频,动画时间税违反 P4 点击摩擦护栏(每轮输入动作数∶AP 消耗 ≤2 观测假设);playtest 反馈"移动太瞬"再议(留痕)。 -9. **四种格态一眼可辨(A2×6②)**:已开 0 格(裸土地板)/ 已开雾格(地板无字 + 底色层淡雾 tint 残留——OQ8 裁决采纳)/ 未开格(掩尘完整砖)/ 未开雾格(掩尘砖 + 雾纹带)——灰度截图下可逐格分类(左键"已开=移动 / 未开=挖"消歧的感知前提,后果不对称:误挖 = 1 AP + 可能触雷且不可逆)。**已引爆雷格"可通行可读"(A2×6④)**:已开底 + 巢穴纹(危险红族)+ 可作移动目标的视觉线索——"走过的雷、能走"。数字显示判定数据源 = `variant_ids`(digit 恒真透传、雾格隐藏呈现——A2 Core Rule 2,呈现层禁读真实数字自行判定)。绘制优先级栈(art-bible §1.2):数字 > 小人 > 旗 > 徽章 > 变异纹理 > 底色——任何元素不遮挡数字,小人与旗不得覆盖文本。 -10. **格面奖励徽章与奖励身份恒定可读(B4×5①)**:已开格显示家族类型徽章(§4.6.3 五键 attack/defense/heal/blast/weaken——**键集冻结**;拾取瞬间 tier 档位可读 = H1 节拍);库存徽章按行(reward_id 键,§4.6.2 八键——knife_t1/knife_adv 同族互辨是硬需求)。**MVP 格面徽章只在已开格呈现**(B4 Rule 8"未开格身份不呈现"为现行锁定规则——art-bible §4.6.3"未开格预读徽章"的呈现前提属极性提案实施批,随批登记;五键槽位在程序化占位映射表中预留、未启用键不呈现,见冲突清单⑤)。徽章栈位 = 旗之下、变异纹理之上、不进数字区、不构成格内第二焦点(§3.4)。**库存常读条(E 区,挖掘期规划面)**:逐件 icon + 名称(display_name)+ 属性简述(行值快照投影派生一句话:伤害/回复/增益)+ 状态;枚举序 = stock 受理序(B4 E21);悬停 tooltip = 完整描述 + 触发注记,**不含来源**(来源归因职责由结算明细行承载——battle.md 用户拍板 2026-09-12);Used 件过滤出常读条(query_inventory 保留只读、呈现过滤归 D1)。奖励身份键全局恒定、跨 run 禁重掷(reward_id / enemy_id / effect_id 三键同纪律)。 -11. **状态效果呈现(B3×4 承载)**:C 区状态槽固定 4 槽 = icon(§4.6.1 效果键——形状纹样身份、色相不承载身份)+ 层数角标(L)+ 剩余结算次数点(R)+ 悬停 tooltip(来源 + 语义 + 剩余——source_class 文案经 B1 `source_label_map`)。**极性呈现映射(B3×4③)**:有利 = 金族满框 / 有害 = 红族缺框(art-bible §4.6 通道分配);判别 = **键级极性表**(§4.6.1 冻结列:attack_up/defense_up/weaken 有利、ambush 有害——提案扩展键 enrage/off_guard/sapped 随提案实施批),语义归属经 SettlementTable `effect_pool_map` 成文(作用面),**禁止以 magnitude 符号判极性**(负值增益存在;pool 亦不足以判极性——enemy_output 池两向并存)。**空态规格(B3×4① D1 裁决定稿)**:query_active 返回空 → 状态槽**整体隐藏,HP/攻击/RAP 上移补位**(角色信息区纵向空间紧张,空槽占位浪费)——图例面板载空态说明("战斗中拾取的增益在此显示,随战斗结束消散")。数据源 = B3 投影(六归因字段 + display_name + 授予时数值快照,经 B1 编排面);B3 零信号外发 → 状态栏刷新绑 B1 结算编排完成时点(命令式)。 -12. **结算明细与高光(B4×5③④ / B1×3①② 承载)**:明细带数据源 = B1 Core Rule 14 流水行协议(13 类行封闭枚举,字段分层见 Core Rule 17);逐行来源标注格式「{行为} {值} → {目标}(来源)」(模板插值,行宽预留 40% 膨胀 + 固定槽高 + clip_contents——切片缺陷①回归);**效果行 value = 单次贡献值、pool_value = 池合成值,两列分示禁相加**(防"−130%×2 行 = −260%"误读);零值伤害行可见不被吞;**未生效四类行 + 标旗未中行按聚合计数呈现**(防逐行惩罚轰炸)且携带形状冗余(icon / 划线——非色相独载,色弱清单 #9);未选用件语境注记 =「未选用件随关卡结束清空」(关卡域口径)。**四类行呈现(B4×5③)**:道具行(入库/生效语境注记)/「奖励未生效」行(聚合计数)/「已消耗未生效」行 /「使用被拒」行。**高光行强调(B1×3①)**:标中旗 highlight 标记行 = 旗化暴击弹道加重 + 明细行金框(chord 缺席的即时兑现补偿);H2 清图奖励行 = 金框高亮行(轮末仪式峰值);**事件型高光用独立高光行、属性型强调用行字段标记**(B1 高光使用规则)。**完美排雷呈现形态(B1×3②)**:全屏喝彩级反馈(art-bible §2.2 最高档)——金光带加倍扫射 + 「完美排雷 ×2」横幅(P2 爆发兑现节点,创意风险 #2 落点);高光行 value 显示实际有效兑付当量(降级规则:首份即零兑付不发高光——庆祝不打在空兑现上)。 -13. **道具使用窗口(B4×5②,继承 battle.md 布局决策 D2——E 区原位激活)**:窗口触发(B1 授予段后、增益/减益段前——窗口锚点)时 E 区面板点亮金描边、标题切换「轮末道具窗口 · 至多选用 1 件」,D 区去饱和 + 金橙色相偏移锁输入(**明度不变**——art-bible §2 硬规则合规化);时机指示呈现窗口锚点位置;**usable_now 可用性投影**(B1 组装载荷):满血治疗包灰置 + 禁选原因 tooltip「HP 已满 · 禁选」;选用即承诺(选中 → 窗口关闭回结算流,提交 = 窗口条目位置);跳过按钮恒在;**政策注记常驻**「未选用件随关卡结束清空」;**空库存不弹窗**(窗口标记 skip 照常登记——回放输入完整性由 B1 承载,呈现零停顿)。窗口期棋盘输入不竞争(结算期棋盘本就锁输入——单意图帧先例)。窗口触发政策:MVP 有库存恒弹;候选"仅可用品触发 / 常驻库存条非模态"归垂直切片(B4 D1 义务②注记)。窗口态刷新纪律:窗口激活期间**跳过常读条全量重建**(切片教训:presenter 全量刷新 stomped 窗口态——entry 36)。 -14. **提示·图例·教学 toast 体系(A2×6③ / A4×3①② 承载)**:toast = D 区上缘内侧非模态浮出提示,自动消退 2.5s,**不劫持输入、不打断挖掘流**。提示族:① **雾首遇提示(A4×3②)**——触发 = 首个实际含雾格的板进入可操作状态(挖掘阶段开始;生成期一次查询即判定,免疫降级板误触发),**每 run 一次**,必含三要点(无雷盲区不赌命 / 雾格不传播连锁〔连锁止于雾界属正常〕/ 雾内插旗纯损);② **chord 肌肉记忆首遇提示(A2×6③)**——经典扫雷玩家首日尝试双击快开时每 run 一次:「本作无双击快开——插旗后轮末自动判定标中;点数字格可移动小人」;③ no_adjacent 提示(Rule 7);④ 拒绝与作废提示族(见 Edge Cases);⑤ **零合法板告知(B1×3③)**(见 Edge Cases)。**图例面板(A4×3①)**:模态 overlay,格态 / 变异 / 雾语义三组条目;「迷雾 = 无雷盲区」条目**恒在、不设解锁门、可随时回看**;载状态空态说明(Rule 11)。一次性提示去重作用域 = 每 run(hint_id 封闭枚举:`fog_first / chord / no_adjacent`——登记为遥测值域与去重键)。文案定稿权归实现期文案 pass(本 GDD 只锁必含要点与形态约束)。 -15. **雾图变体呈现(A4×3③,OQ8 已于 battle.md 裁决采纳 2026-09-12)**:未开雾格 = 掩尘砖 + 雾纹带(形状通道,色相不承载身份——色弱清单 #2);已开雾格 = 地板无字 + **底色层淡雾 tint 残留**(tint 处视觉锚 3 最低层、不遮挡数字——与已开 0 格灰度可判定区分:0 格携带"八邻无雷"推理信息,混淆即污染推理);**雾区全开一次性完成信号**:以**视觉合并域为信号单元**(连续雾区整域一次呈现,禁实例级双响——EC11:双雾区规则上独立实例、呈现合并);tint 与完成信号随雾重设计批可复核(art-bible 雾格资产占位——内容封禁期)。 -16. **终局与清空反馈(B3×4④ / A3 / B4×5⑤ 承载)**:**胜利终局**(verdict=win)——金蜡封落于扫雷图区中央 + 全屏暖白金 overlay + 判定行(终局判定行 = 胜负画面数据锚)+「下一节点」+ 明细回看入口;**失败终局**(verdict=lose)——明度不变的暮蓝 `#5A6C8C` 氛围 overlay(全作唯一暮蓝档)+ 小人坐砖掸灰 + 插过的旗逐面化光点收回 + 判定行 + 返回。**状态槽全清反馈(B3×4④)**:battle_over 时状态逐槽化光收回 + 微文案「状态随战斗结束消散」(防"我的 buff 哪去了"误读——胜负两终局同款)。**RAP 清零反馈(A3)**:battle_over 时 RAP 数字滚动归零 + 微文案(防"攒的钱凭空没了")。**库存清空反馈(B4×5⑤——关卡域口径)**:level_clear 时道包逐件化光点飞出 +「剩余道具 ×N 随关卡结束清空」(N = clear_inventory 返回的清空前快照计数——B1 编排义务⑤数据面)。**Boss 遭遇变体**:战斗开始一次性紫赤影子爬过棋盘(§2.6——纯视觉预告)+ 敌人卡体量最大 + 阶段指示附 Boss 名。**弃图刷新确认**(A3 契约的呈现半边):按钮置 AP 条右端,文案实时「RAP−8 · 本轮剩 N 次」(剩余次数 = `refresh_cap_per_round` − 本轮已用;**轮内已用次数读数 = A3 只读观测量缺口,接口漂移登记见 OQ2**);入口可用性 = 组合根按只读观测量预判(rap ≥ rap_refresh_cost ∧ 剩余次数 > 0)+ `request_refresh` 返回值兜底(**A3 无 `can_request_refresh` API——不引入**);确认微交互显式提示代价与旧板旗作废;**确认交互与常规确认不同位**(位置通道——破坏性确认异位,色弱清单 #7);RAP<8 / cap 超限拒绝可见(见 Edge Cases);换图后 AP 不重置、剩余次数扣减可见。**禁止"RAP 满自动刷"**(A3 Rule 11——刷新决策主体恒为玩家)。 -17. **面向呈现的信号载荷 schema 成文(切片教训硬性要求①,entry 17①——缺项即 blocking)**:D1 消费的全部跨系统载荷按下表成文,字段清单为消费侧断言与实现契约(对齐 A2 三事件先例;消费侧断言承载校验——ADR-0001"信号参数无运行时类型检查"的缓解): - -| # | 载荷 | 来源 | 字段 schema | 状态 | -|---|---|---|---|---| -| 1 | `cell_revealed` | A2 | `{cell, kind ∈ {safe,mine}, digit(仅 safe 携带,恒真透传), variant_ids, channel ∈ {initial,chain,dig}, reward_eligible}` | A2 Core Rule 2 已 schema——引用 | -| 2 | `flag_judged` | A2 | `{cell, hit}`(轮末判定批、行主序) | 同上 | -| 3 | `round_end_board` / `round_end_stopped` | A2 / A3 | `{path_tag ∈ {ap_exhausted,cleared}, continuation_hint ∈ {same_board,new_board}}`(双发射源 payload 同构;信号实名 per ADR-0001) | 同上 + ADR-0001 | -| 4 | 流水行 ×13 类 | B1 | 公共 7 字段 `type / source_class / origin_cell(板级行可空)/ round_index / display_name / value / highlight?({flag_hit, clear_reward_h2, perfect_broken})` + 特有:伤害行/道具行(生效)→ `target`;效果行 → `effect_id` + `pool_value`;未生效四类 + 标旗未中行 → 聚合计数/批次字段;source_class 值域 ⊆ `source_label_map` 键集(B3 source_class ∪ {道具/判定扩展, enemy_action, flag_miss, hero_attack}) | B1 Core Rule 14 已 schema——引用+重述 | -| 5 | 结算快照 | B1 | `presentation_snapshot()` 返回(终局呈现数据面——despawn 前全量状态);**独立 `settlement_snapshot` 信号系切片实现、B1 GDD 未登记契约**——D1 现行消费 = 步骤流判定行 + `presentation_snapshot()`;若需独立信号回 B1 修订批补登记(OQ3) | 切片实现 / 契约待登记 | -| 6 | 意图回执 | A2 | `ActionOutcome{accepted, outcome ∈ {executed, voided, rejected}, reject_reason ∈ {board_face, resource_face, phase, board_invalid}, sub_reason(仅 board_face:not_adjacent / target_revealed / target_concealed / flag_present / flag_absent / no_path / out_of_catalog)}` | A2 已 schema——拒绝呈现数据源 | -| 7 | 资源面拒绝 | A3 | **无载荷**(`try_spend` / `request_refresh` 仅 bool + debug 诊断)——呈现文案按动作上下文映射(诚实登记:资源面原因客户端推断,双源可辨由"动作种类 + 拒绝源"组合承载) | A3 AC 前言口径——引用 | -| 8 | 窗口载荷 | B1 组装 | `query_inventory` 逐件 `{item_id, source{cell,round}(不呈现于库存列表与 tooltip), 行值快照投影, 状态 InStock/Used}`(枚举序 = stock 受理序)+ `usable_now`(B1 守卫预判——满血治疗包 false) | B4/B1 已 schema——引用 | -| 9 | 奖励身份投影 | B1 呈现面 | `query_reward_identity(cell) → {reward_id, category, tier} \| null`(引用级投影;未开格可查但 MVP 不呈现) | B4 AC-2 已 schema——引用 | -| 10 | 状态投影 | B3 经 B1 | `query_active(side)` 元素 = 六归因字段 + `display_name` + 授予时快照 `(magnitude, unit)`;有效值 = L×快照 magnitude | B3 已 schema——引用 | -| 11 | 单位投影 | B2 | 敌单位七字段 `enemy_id/hp/max_hp/atk/heavy_multiplier/pattern/cap` + `beat` + 存活态;hero 投影 `hp/max_hp/atk`(经 `hero_unit()/all_enemies()`) | B2 已 schema——引用 | -| 12 | **零事件外发动作刷新面(命令式回执清单)** | A2/A3/B3/B4 | 旗插/拔与移动成功(A2 零事件外发)→ `settle_batch` 回执后重查 `current_board()`;AP/RAP(A3 无推送)→ 每次写路径回执后重读 getter;状态效果(B3 零信号)→ B1 结算编排完成时点刷新;库存(B4 查询面)→ 写路径回执后重查 `query_inventory` / `stock_count()` | battle.md 更新触发注记——本行成文为契约 | -| 13 | D1 自有遥测 | D1 | `ux_round_input_ratio{ratio}` · `ux_round_exit{path_tag}` · `ux_refresh_attempt{result ∈ {accepted,rejected_rap,rejected_cap}, round_refresh_index ∈ [1,2]}` · `ux_window_choice{selected_item_id, usable_now, skip}` · `ux_reject{source ∈ {board,resource,phase}, sub_reason}` · `ux_hint_shown{hint_id}`——写 playtest JSONL `ux` 行族(playtest_logger 扩展) | **本 GDD 成文**(新) | - -18. **信号时点状态可见性规则(切片教训硬性要求③,entry 17③——缺项即 blocking)**:呈现层只使用(a)信号载荷自带的数据、(b)销毁前已取到的快照、(c)封装只读投影——**禁止呈现层回读核心生命周期状态**。三条细则:① **销毁前捕获**——终局/死亡呈现的数据(敌人血条归零、卡体灰化、判定行)在核心对象 despawn 前已进入流水行与快照(B1 判定段先于 battle_over 清理序列;快照含 despawn 前终局——切片缺陷②教训:battle_finished 后读已销毁的 b2.hero 崩溃);② **载荷自包含**——B1 流水行每行自带来源/值/目标(`target` / `effect_id` / `pool_value` / `origin_cell`),呈现层不按行序反推目标状态机、不反查容器补数据;③ **生命周期态禁读**——`is_battle_live()` 与 phase 投影是呈现层唯一的生命周期观测口(经组合根),禁止读核心对象内部状态位判"还能不能刷"。敌卡死亡灰化等"尸位"呈现 = 就地更新保留的最后已知投影(Rule 6),不回读 Dead 句柄以外的任何东西。 -19. **程序化占位策略(art-bible §1.4 引用依据——样张未制作不阻塞)**:全部终稿美术依赖面(砖面/雾纹/敌像/图标/徽章/立绘/蜡封)以**程序化占位**先行:色值直接取 art-bible §4.1 冻结色板、形状按 §3 形状语言参数域程序化绘制(圆角砖/直角数据框/纹带形);icon/徽章/线索按 §4.6 键契约挂**键位映射表**(数据键 → 占位纹样 ID,一键一槽位)——终稿美术替换时零数据层改动、零运行时换图(键集扩容走 §4.6 修订)。**占位同样受 art-bible §1.4 第一验收项约束**:数字可读性硬指标(1–8 全档对格底 ≥4.5:1、0.5× 缩放可辨、纹带不侵数字字形区)对程序化占位可测且必须通过(色板参数域结构保证:底 L≥0.30 ∧ 饱和 ≤0.40 ∧ 墨 L≤0.027)。样张定稿 = 砖面形态与色板冻结闸,终稿资产开工前置(asset-spec 批);样张批不阻塞 D1 全部其余 AC。 -20. **切片 provisional 命名统一(session-state entry 35——正式 D1 批统一命名)**: - -| 切片 provisional 名 | GDD 正式名 | 载体 | -|---|---|---| -| `request_refresh_active()` | `request_refresh` | A3 API(Active 相位受理——A3 Rule 11,2026-09-12 D4 修订) | -| `can_request_refresh()` | **不引入**(A3 无此 API) | 入口可用性 = 组合根按只读观测量预判 + `request_refresh` 返回值兜底(Rule 16) | -| `refresh_max_per_round` | `refresh_cap_per_round` | ActionEconomyTable 结构位(默认 2)——D2/registry 字段回写随实现批(A3 Schema 定稿节已预留) | -| `during_round`(A2 装板参数) | (无独立参数——受理域语义) | A2 `install_board` 受理域增 Active·仅弃图刷新路径(B1 `refresh_board` 编排内)——A2 Core Rule 3 | -| `round_end`(信号名) | 实名 `round_end_board`(A2 面)/ `round_end_stopped`(A3 面) | ADR-0001 信号实名映射 | - -21. **模态层级管理(切片缺陷⑤纪律转正)**:全部模态覆盖层(图例面板 / 明细回看 / 胜利 overlay / 失败 overlay)经**统一登记序管理**入栈出栈;打开时**遮挡物隐藏或输入锁定**必须成立(TunePanel 家族教训:功能存在但被遮不可达 = 呈现层隐形缺陷高发区);窗口态为**原位激活非模态**(不入模态栈,但锁 D 区输入——Rule 13);TunePanel 显式初始化 `visible=false`(历史 quirk 转正)。**调试退役时点标注(battle.md OQ10 承接)**:TunePanel 为切片调试入口,正式侧归 C4 天赋树——C4 落位时退役,Playtest 诊断按钮(卡死转储)保留为调试设施。 -22. **本地化与可访问性基线**:CJK 字体随包 + 设为 theme 默认字体(ADR-0003 硬性前置——运行时默认字体无 CJK 字形,豆腐块 = AC 硬断言);按钮文案 4 汉字上限(「停手」「弃图刷新」「跳过」「选用」——译英 ≤1.6× 不破版,德语长词允许两行或图标+缩写);明细行模板预留 40% 膨胀。可访问性内建基线(`design/accessibility-requirements.md` 未建——battle.md OQ2 登记缺口,本 GDD 内建):数字对格底 ≥4.5:1(WCAG AA)、无信息仅靠色相承载(§4.5 清单九对逐项成立)、灰度可辨、字号下限(棋盘数字 ≥18px / 明细正文 ≥14px / tooltip ≥13px @1280×800)、无闪烁 >3 次/秒、**减动效选项**(全部动画时长减半或跳终态开关;结算逐行兑现为信息载体不可整体跳过、可加速)、纯鼠标可完成全部操作。 - -### States and Transitions - -战斗屏状态机(触发全部来自核心信号/回执——呈现层不自持玩法状态;"阶段"投影枚举 = {挖掘中, 结算中, 道具窗口}): - -| 屏状态 | 进入触发 | 变化 / 出口 | -|---|---|---| -| **挖掘阶段(默认态)** | 轮次开始 / 结算完毕回 Active | D 区可交互(AP 条点亮、可挖域呼吸微光);B 区敌人待机(意图徽标全程可见);明细带收起为上轮摘要 1 行;能量 2/10 | -| **结算阶段** | `round_end`(A2 棋盘路径 / A3 stopped 直发) | D 区锁输入(棋盘去饱和 + 金橙色相偏移,明度不变,数字保持全对比);明细带展开 84px 逐行滚动;阶段指示→"结算中";能量 7/10;B1 步骤流驱动逐行兑现 | -| **道具窗口态** | B1 授予段完成(窗口锚点信号) | E 区原位激活(Rule 13);空库存直接 skip 不弹窗;选用/跳过 → 回结算流(结算阶段续) | -| **清图瞬间** | cleared 判定(round_end) | 金粒喷泉 + 彩纸 3–5s 即收(§2.3);H2 清图奖励行金框强调;随后换新图 install | -| **完美排雷高光** | B1 高光行(perfect_sweep) | 全屏喝彩级:金光带加倍扫射 + 「完美排雷 ×2」横幅(叠加于清图瞬间之上) | -| **标中旗高光** | 流水行 highlight=flag_hit | 该旗化暴击弹道加重 + 明细行金框(当轮即兑付) | -| **敌人死亡呈现** | 流水行击杀标记(target 字段) | 该敌卡血条归零 → 灰化 + 碎裂退场(禁瞬消、就地更新) | -| **胜利终局** | 判定行 verdict=win | 金蜡封落于扫雷图区中央 + 暖白金 overlay + 判定行 + 状态槽全清反馈 + RAP 清零反馈;出口 = 下一节点(runner) | -| **失败终局** | 判定行 verdict=lose | 暮蓝氛围 overlay(明度不变)+ 旗化光点收回 + 判定行 + 明细回看 + 状态槽全清反馈 + RAP 清零反馈;出口 = 返回 | -| **Boss 遭遇变体** | encounter=boss | 战斗开始一次性紫赤影子爬棋盘 + 敌卡体量最大 + 阶段指示附 Boss 名 | -| **雾图变体** | 板含雾格 | 雾纹带 + 首遇提示(每 run 一次)+ 已开雾格 tint 残留 + 雾区全开合并域完成信号 | -| **空态:无状态效果** | query_active 双侧空 | 状态槽隐藏、数据框上移补位(裁决见 Rule 11) | -| **空态:零库存** | 关卡初 / 清空后 | E 区「道包空空——安全格里藏着补给」(指引性空态,非报错) | -| **调试变体** | 测试模式 | TunePanel 入口(正式侧归 C4 退役)+ Playtest 诊断按钮 | - -模态子栈(Rule 21 统一登记序):图例面板 / 明细回看 / 胜利 overlay / 失败 overlay——任一打开时遮挡物隐藏或输入锁定;非模态层:toast(自动消退)、窗口态(锁 D 区)。 - -### Interactions with Other Systems - -| 系统 | 方向 | 接口契约 | -|---|---|---| -| A2 | 上游 hard | 读:`current_board()` / `reveal_record()` / `compute_move_path(cell)`(呈现面,entry 39 E2 收口);订阅:零直订(ADR-0001——B1 facts 与组合根转发);写:`settle_batch(intents)` 经组合根(D1×6①)。消费其三事件 schema(Core Rule 17#1–3)与 ActionOutcome(#6)。**D1×6 六项义务全落位**(见 Dependencies 台账表) | -| A3 | 上游 hard | 读:`phase / ap / rap / last_round_end`(getter-only——entry 39 E5);刷新意图经组合根 → B1 `refresh_board` 编排内 A3 `request_refresh`(D4 2026-09-12——挖掘期 Active 受理、每轮上限 `refresh_cap_per_round`=2);**接口漂移登记:轮内已用刷新次数读数缺口(OQ2)**。AP/RAP 常显、RAP 清零反馈、双源拒绝呈现(A3 契约) | -| B1 | 上游 hard(数据供给主通道) | 读:步骤流信号(13 类行协议——Core Rule 17#4)、`presentation_snapshot()` / `is_battle_live()` / `stock_count()` / `query_reward_identity()`(B1 成文呈现面——entry 39 E1);写:`submit_window_selection(窗口位置序)` / 刷新提交面;level_clear 反馈行数据面(清空前快照计数)。**B1×3 + B4×5 + B3×4 呈现义务的统一数据源契约 = B1 Core Rule 14** | -| B2 | 上游投影 | `hero_unit() / all_enemies()` 只读投影(entry 39 E3);血条/顺位/姿态/存活数据面;despawn 前捕获纪律(Rule 18)。**B2×4 四项义务落位**(敌人卡 Rule 6) | -| B3 | 上游投影(经 B1) | 零直读(B1 协作对象私有化)——状态投影经 B1 编排面(Core Rule 17#10);EC12 空态、极性映射、全清反馈(Rule 11/16) | -| B4 | 上游投影(经 B1) | 零直读——`query_reward_identity()` / 库存载荷经 B1(Core Rule 17#8–9);奖励徽章键 §4.6.2、窗口呈现、四类行、H2、关卡末清空反馈(Rule 10/12/13/16) | -| A4 | 上游 soft(呈现规格) | 雾纹理双通道、图例条目、首遇提示三要点、tint + 完成信号(A4×3——Rule 9/14/15);A4 UI Requirements 为本 GDD 引用源 | -| A1 | 间接 | 零直接接口——EC5 零合法板数据面经 B1 上抛(非法产物标记 → toast 告知);biome 标签 = 换皮色板数据锚(程序化占位消费);产物字段保真是呈现诚实的数据前提 | -| D2 | 数据读取 | display_name 等本地化名经核心读表面;D1 自有常量不入 D2 玩法表(Tuning Knobs 载体声明) | -| C1-lite(level_runner) | 上游 hard | A 区节点链 / 当前节点 / HP 携带(关卡域);胜利 overlay「下一节点」→ runner 推进(写经组合根);level_clear 编排反馈 | -| C2 | 预留 | 关卡结算屏(关卡末清空反馈的完整屏形态)归后续 spec `design/ux/level-clear.md`(battle.md OQ9)——MVP 以 overlay 反馈承载 | -| B5 | 下游 hard | **D1→B5 交付物**:五区布局与双舞台裁决(第三形态)、B 区演出区结构、明细带呈现位、流水行协议呈现语义、敌人卡呈现语义(死亡灰化/禁瞬消)、art-bible §4.6 键位映射表——B5 只叠加动画密度与演出(受击反馈/弹道/退场动画),呈现语义已在本 GDD 定稿;"战斗表现美术测试"以本布局出样 | -| D4 | 下游 soft | 音频挂点事件源 = 明细行类型流 + toast 提示触发(B1/B4 音频挂钩点清单引用);MVP 无音频(Alpha) | -| D5 | 下游 soft | 教学承载位 = toast 体系 + 图例面板(雾三要点 / chord 提示 / 蓄力拍提示候选 / RAP 清零 / 库存清空教学条目)——D5 GDD 定稿口径 | -| A5 | 预留 | 探测类道具显影面(未开格身份呈现深度 OQ2)——接口归 A5 GDD,本 GDD 不预写 | -| D6 | 下游 | 本地化契约消费方(CJK/按钮宽/术语表——Rule 22) | - -## Formulas - -> D1 **零玩法公式**(显式排除声明见末尾)——本节仅承载呈现几何与可读性判据。全部取色禁新增色值,一切经 art-bible §4.1/§4.4 冻结色板。 - -### F1 棋盘格尺寸(cell_size) - -``` -cell = floor(min(D_w − pad_h, D_h − ap_bar_h − pad_v) / N) -N ∈ {10, 12}(A1 BoardGenTable 尺寸档);D 区基准 1280×800 下 D_w=760、D_h=520−44(AP 条)−pad -1280×800 实测:12×12 → 36px;10×10 → 45px -数字字号 = max(18, ceil(cell × 0.5)),像素字体整数倍缩放(canvas_items stretch 保证清晰) -``` - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| D 区宽/高 | D_w / D_h | int px | 布局常量 | 五区布局基准(battle.md Layout) | -| AP 条高 | ap_bar_h | int px | 44 | D 区顶条 | -| 棋盘维数 | N | int | {10, 12} | A1 行值(MVP 两档) | - -**Output Range:** cell ∈ [30, 45] px @1280×800。**Example:** 12×12 → floor(min(760−16, 476−16)/12) = 36px → 数字字号 ≥18px。 - -### F2 数字对比恒等式(引用 art-bible §4.1——D1 不新增参数) - -**数字可读性硬指标(§1.4 第一验收项,对程序化占位同样适用)**:1–8 全档数字对所在格底 WCAG 对比 ≥4.5:1——由色板参数域结构保证:格底相对亮度 L≥0.30 ∧ HSV 饱和 ≤0.40 ∧ 数字墨 L≤0.027 ⇒ 任意底墨组合 ≥4.5:1 恒成立(实测锚:#33261B/#C9AF83 = 6.9:1;#4A1E14/#B39A78 = 5.3:1)。D1 侧判据 = 灰度截图分类 + 对比抽测进 AC;换 biome 色板须重跑 §1.4(换皮只换四槽、永不变信)。 - -### 显式排除声明(R4 式) - -D1 无任何玩法数值所有权:伤害/经济/概率/生成公式全部归 A1–B4/B1/C3;AP/RAP/价目显示值 = A3 表读值投影;伤害数字 = B1 流水行 value 投影;D1 拥有的全部 = F1 几何换算、F2 可读性判据的引用执行、Tuning Knobs 节呈现常量。零随机(呈现层无任何 RNG 消费——S1/S2 扫描域适用)。 - -## Edge Cases - -- **If 每次拒绝(A2×6⑥——映射源 = reject_reason + sub_reason,每次拒绝玩家可感知)**:棋盘面拒绝(sub_reason 七值)→ 目标格旗朱 #C63D22 边框闪 + toast 文案(映射表:not_adjacent→「需先走近」/ target_revealed→「该格已翻开」/ target_concealed→「该格未探明」/ flag_present→「须先拔旗」/ flag_absent→「该格没有旗」/ no_path→「路径不通」/ out_of_catalog→debug 级、不与玩家语义混桶);资源面拒绝(AP 不足 / RAP 不足——无上游载荷,按动作上下文映射)→ AP/RAP 数字脉冲 + toast「AP 不足 · 剩 0 点」;相位拒绝 → toast「结算进行中」。图标+文案冗余(非色相独载)。 -- **If 作废(voided——至少 stop 被作废须可感知)**:toast「本轮已清图,停手未执行 · 剩余 AP 已作废」——防 [dig清, stop] 静默改判清图、剩余 AP 清零不入 RAP 的读感欺骗(F4 联合清图让位在生产面不可构造,本条为诚实兜底)。 -- **If 零合法板(A1 EC5 → B1×3③——三形态选型定稿)**:B1 上抛非法产物标记 → **toast 诚实提示**(非模态、不打断);**补偿与回退不提供**(选型留痕 2026-09-12:补偿逻辑归 B1 域外、确定性回退已知好种子归实现期 ADR 候选〔A1 OQ2 关联〕——MVP 面向玩家的形态 = 仅提示)。玩家永不卡死由 A1 验收三分支保证,提示是体验债的诚实兜底(原"玩家不可见遥测域"口径由本条承接闭合)。 -- **If 弃图刷新被拒**:RAP 不足 → 按钮 + RAP 读数脉冲 + toast(EC13);本轮 cap(2 次)超限 → toast「本轮刷新次数已用完」(EC15);确认微交互缺一步 → 不提交(防误触——破坏性确认异位)。 -- **If 两个雾区相邻(A4 EC11)**:规则上独立布置实例、呈现合并为一片——**雾区全开完成信号以视觉合并域为单元、禁实例级双响**(信号只响一次);样张最坏用例含"宽度 1 雾带两侧毗邻数字格"(A4 AC-9)。 -- **If 雾首遇触发边界**:触发谓词 = 首个**实际含雾格**的板进入可操作状态——免疫 EC2 降级板(无变异)误触发、免疫贴脸雾 t=0 歧义(A4 UI Requirements 修正口径);一次性作用域 = 每 run。 -- **If 敌人死亡与终局同帧(despawn 时序)**:死亡呈现数据 = 流水行击杀标记 + 目标字段(despawn 前已产出——Rule 18①);battle_over 清理序列后呈现层零核心回读;`is_battle_live()` false 后视图进入终局态只消费快照。 -- **If 窗口打开时库存为空**:不弹窗、直接 skip(结算零停顿);窗口标记照常登记(B1 回放输入完整性)。 -- **If 满血时窗口含治疗包**:usable_now=false 灰置 + 禁选原因 tooltip;强制提交(不可经 UI 达成——禁选态拦截)→「使用被拒」行兜底(B1 守卫)。 -- **If battle_over 与 level_clear 反馈叠加(关卡末战)**:RAP 清零 + 状态槽全清反馈先行(battle_over),库存清空反馈随后(level_clear 编排)——两反馈不合并(防"N 道具消失"误读为战斗结算内容)。 -- **If 模态覆盖层叠开**(图例上开明细回看):统一登记序栈——后开者置顶、关闭逐层恢复;任一层打开时其遮挡物隐藏/输入锁定断言成立(缺陷⑤回归)。 -- **If 悬停文案换行**:全部动态区固定槽高 + clip_contents——换行裁剪不推挤布局(缺陷①回归;明细行 40% 膨胀 + tooltip 独立浮层)。 -- **If CJK 字形缺失**:豆腐块 = AC 硬断言失败(字体随包 + theme 默认——ADR-0003;首次导出 checklist 项)。 -- **If 敌卡刷新与死亡灰化竞争**:就地更新(字段级 setter)禁全量重建——死亡灰化态不被后续刷新吞掉(entry 36 教训);窗口激活期同理跳过常读重建(entry 36)。 -- **If 减动效开启**:全部转场/高光/演出时长减半或跳终态;结算逐行兑现降速不跳过(信息载体);无闪烁 >3 次/秒恒成立。 -- **If 移动目标 = 当前格**:幂等零移动——无动画、无 toast(A2 EC14 合法受理的呈现静默)。 -- **If compute_move_path 返回空**(不可达):路径预览不显示 + 禁止光标(预览与执行同源——AC-14② 对侧)。 -- **If 键集扩容**(新 effect_id / reward_id / enemy_id 上线):键槽映射表缺键 = 呈现层 fail-fast(debug 断言 + 占位"?"纹样 + 诊断,禁静默空图标)——扩容走 art-bible §4.6 修订(禁运行时换图)。 - -## Dependencies - -**Upstream**:A2(hard——棋盘呈现面与意图提交)· A3(hard——资源读数与刷新意图路径)· B1(hard——流水协议与编排呈现面,数据供给主通道)· B2(投影)/ B3(投影,经 B1)/ B4(投影,经 B1)· A4(soft——雾呈现规格)· A1(间接——EC5 数据面经 B1、biome 标签)· D2(读表)· C1-lite runner(hard——A 区与推进)。A5/D6 见 Interactions。 - -**Downstream**: - -| 依赖方 | 性质 | 接口 | -|---|---|---| -| B5 | hard(垂直切片) | 布局裁决(双舞台第三形态)+ 演出区结构 + 行协议呈现语义 + 键位映射表(Interactions 表"交付物"清单)——B5 叠加动画密度,呈现语义不得二次裁决 | -| D4 | soft(Alpha) | 音频挂点事件源(明细行类型流 + toast 触发) | -| D5 | soft(Alpha) | 教学承载位(toast 体系 + 图例面板——各上游教学条目落点候选) | -| A5 | 预留(垂直切片) | 未开格身份显影呈现深度(OQ2) | -| D6 | 下游 | 本地化契约(CJK/按钮宽/术语表锚定——Rule 22) | -| C4 | 下游(Alpha) | TunePanel 退役接收方(Rule 21 时点标注) | - -**索引分层注记**:systems-index 依赖分层 "D1 ← A2,A3,B1"——本 GDD 实际投影消费扩至 B2/B3/B4/A4/runner,全部经 **B1 编排呈现面 + 封装收口批成文呈现面**(entry 39/40),**零新增运行时直调边**(B2/B3/B4 相互与对 D1 的"零直接接口"纪律保持;呈现面接口清单 = API Boundaries 登记载体)。D1 无游戏状态、无 knob 联动、无 RNG——层 4 Presentation 定位不变。 - -### 呈现义务台账逐项落位表(门禁核对用——27 项,缺项即 blocking) - -| 义务源 | 条目 | 本 GDD 承载落点 | -|---|---|---| -| A2×6 | ① stop 意图经 `settle_batch` 提交、不直调 A3 | Core Rule 7 + 写路径总表(Rule 4)+ AC-13 | -| A2×6 | ② 四种格态一眼可辨 | Core Rule 9 + AC-4 | -| A2×6 | ③ 悬停预承诺 + 可挖域常驻指示 + chord 首遇提示 | Core Rule 7 / 14② + AC-5 / AC-14 | -| A2×6 | ④ 已引爆雷格"可通行可读" | Core Rule 9 + AC-4 | -| A2×6 | ⑤ `compute_move_path` 呈现语义 = 合法性指示(裁决继承 battle.md D3) | Core Rule 8 + AC-6 | -| A2×6 | ⑥ 单意图帧收集 + voided 呈现 + 每次拒绝可感知 | Core Rule 7 + Edge Cases 1–2 + AC-7 / AC-8 | -| B2×4 | ① enemy_id→图像线索映射清单成文(预告时序 = 下一拍、挖掘期全程可见;含强度档位/环长直觉编码;双通道) | Core Rule 6 + 意图线索映射目录(下表)+ AC-10 | -| B2×4 | ② 线索映射全局恒定(enemy_id 键,跨 run 禁重掷) | Core Rule 6 / 10 + AC-10 | -| B2×4 | ③ 单位顺位与存活可读 | Core Rule 6(顺位徽标)+ AC-10 | -| B2×4 | ④ 敌方 side 池呈现口径(共享单值、各卡同值) | Core Rule 6 + AC-10 | -| B3×4 | ① HUD 常显 + EC12 空态规格定稿(裁决:槽隐藏) | Core Rule 11 + AC-12 | -| B3×4 | ② effect_id→icon 映射键契约 | Core Rule 11(引用 art-bible §4.6.1 七键冻结)+ AC-15 | -| B3×4 | ③ 有利/有害极性呈现映射(非 magnitude 符号) | Core Rule 11(键级极性表 + pool 语义归属)+ AC-12 | -| B3×4 | ④ 战斗结束全清的状态栏去留 | Core Rule 16 + States 胜负终局 + AC-16 | -| B4×5 | ① 已开格 + 库存奖励身份恒定可读(常读条 = 挖掘期规划面) | Core Rule 10 + AC-9 | -| B4×5 | ② 道具使用窗口呈现(原位激活/单件/usable_now/政策注记/空库存) | Core Rule 13 + AC-17 / AC-18 | -| B4×5 | ③ 结算明细四类行呈现(聚合计数 + 语境注记) | Core Rule 12 + AC-11 | -| B4×5 | ④ H2 清图奖励行强调呈现 | Core Rule 12 + States 清图瞬间 + AC-11 | -| B4×5 | ⑤ 关卡末(level_clear)库存清空可见反馈 | Core Rule 16 + Edge Cases + AC-16 | -| B1×3 | ① 高光行强调呈现(标中旗金框 / H2 金框) | Core Rule 12 + AC-11 | -| B1×3 | ② 完美排雷呈现形态 | Core Rule 12 + States + AC-11 | -| B1×3 | ③ EC5 零合法板提示/补偿/回退形态(裁决:仅提示) | Edge Cases 3 + AC-19 | -| A4×3 | ① 图例「迷雾 = 无雷盲区」条目(恒在/可回看) | Core Rule 14① + AC-14 | -| A4×3 | ② 雾首遇提示(每 run 一次、三要点、非模态) | Core Rule 14② + AC-14 | -| A4×3 | ③ 已开雾格 tint 残留 + 雾区全开合并域完成信号(OQ8 采纳) | Core Rule 9 / 15 + AC-4 | -| A3 | AP/RAP 常显 + 刷新入口(玩家发起)+ RAP 清零反馈 + 双源拒绝 | Core Rule 16 + Edge Cases 1/4 + AC-8 / AC-16 | -| A1 | EC5 零合法板诚实呈现(数据面经 B1×3③ 上抛) | 同 B1×3③ | - -**附:意图线索映射目录(B2×4① 成文载体——继承 battle.md 目录 + art-bible §4.6.4 键契约;资产定稿归 B5,本表为 D1 侧成文占位)** - -| enemy_id(§4.6.4 冻结键集) | 视觉状态(下一拍预告) | 强度档位编码 | 环长编码 | -|---|---|---|---| -| grub(蛆虫) | 攻击 ×1 态 | 小体量墩形 = 轻击(§3.1 普通怪) | 环点 1(单拍环——无蓄力态 = 每拍都动手) | -| ambusher(伏击兽) | 攻击 / 蓄力 / 重击 ×3 态 | 垂直延伸体量 = 重击(heavy_multiplier 直觉) | 环点 = 拍数;蓄力态在场 = 环里空一拍("可以贪") | - -- 预告时序 = 下一拍预告、挖掘期全程可见、结算期不另设意图播片(B2 Rule 8⑤);精确数值只在结算明细兑现(Rule 8④——图像不报数)。 -- 映射键 = enemy_id,跨 run 恒定、禁重掷(Rule 8③);形状 + 色相双通道;蓄力姿态必须含可辨识蓄力记号(§4.6.4——读怪核心课)。 -- 资产需求下限三类(受击反馈 / 死亡表现 / 顺位标记)在程序化占位中先行(占位纹样挂键);终稿归 B5/样张批。 -- 键集注记:切片 DND 更名(goblin/bugbear/ogre_chief)与 GDD 键集 {grub, ambusher} 差异登记冲突清单②——键位映射表以 GDD 键集为锚,切片更名随 B2/C3 修订批对齐。 - -**切片教训三条硬性要求落位表(entry 17——门禁评审核对项,缺项即 blocking)**: - -| # | 硬性要求 | 落位 | -|---|---|---| -| ① | 面向呈现的信号载荷成文 schema | Core Rule 17(13 项载荷表——A2 三事件/B1 行协议引用 + D1 自有遥测成文 + 零事件外发命令式刷新面成文) | -| ② | 场景级 headless 测试进 AC | AC「场景级 headless 测试」硬性块(真实实例化战斗屏场景 + 驱动完整对局 + 断言零脚本错误;载体 = 场景探针,ADR-0004 双载体、gdUnit4 deferred) | -| ③ | 信号时点状态可见性规则 | Core Rule 18(销毁前捕获 / 载荷自包含 / 禁回读核心生命周期态)+ AC 硬性块断言 | - -**发现冲突清单(不改已定稿 GDD 正文与提案——列示待裁决,2026-09-13 D1 会话登记)**: - -| # | 冲突 / 待对齐项 | D1 侧处置 | -|---|---|---| -| ① | game-concept 视觉锚原则 1"暗色地牢底色" vs art-bible 明亮底色反转 | 在案(entry 41)——概念侧注记待概念层修订批;D1 全部取色按 art-bible | -| ② | B2 GDD 敌种键 {grub, ambusher} vs 切片 DND 更名 {goblin, bugbear, ogre_chief} | 键位映射表以 GDD 键集为锚(§4.6.4 冻结);切片更名随 B2/C3 修订批对齐 | -| ③ | B4 GDD 默认根 clear_knife vs 切片供给控制器批 clear_blast + active_inject 池 | 徽章键按 reward_id 冻结、池归属不影响键(§4.6.2 注记);clear_blast 键并列预留、启用随 B4 修订批 | -| ④ | 极性提案 §3.5 跨文档回写清单全部待实施批(B3 四行→七行、B4 schema 扩列、A2 OQ1 关闭、**D1 义务条目正式登记**〔未开格类型图标/极性视觉语言/负向文案族〕) | 本 GDD 已按 §4.6 冻结键预留槽位;义务条目登记随提案实施批入 systems-index D1 台账 | -| ⑤ | art-bible §4.6.3"全部未开格呈现类型徽章"(提案 R3)vs B4 Rule 8"未开格身份 MVP 不呈现" | **D1 裁决:MVP 格面徽章只在已开格呈现**(B4 Rule 8 为现行锁定规则);未开格预读随极性提案实施批(其机制前提 = cell_type/pool_tag 扩列)随批修订 | -| ⑥ | battle.md §Events Fired"呈现订阅 A2 三事件"表述 vs ADR-0001 订阅纪律(呈现层只订 B1/runner) | 本 GDD 按 ADR-0001 收窄(Core Rule 2);battle.md 复检批对齐措辞(正文不改动) | -| ⑦ | A3 只读观测量(ap/rap/phase/last_round_end)缺**轮内已用刷新次数**——刷新按钮"本轮剩 N 次"读数无上游供给 | 接口漂移登记义务(OQ2):A3 随批补只读观测量;落地前按钮显示退化为"RAP−8 · 每轮至多 2 次"静态文案 | -| ⑧ | 切片已实现 `settlement_snapshot` 信号 vs B1 GDD 未登记该契约(battle.md 2026-09-12 评审修正口径) | OQ3:D1 现行消费 = 步骤流判定行 + `presentation_snapshot()`;若终局呈现需独立信号,回 B1 修订批补契约 | - -## Tuning Knobs - -> D1 knob = **呈现节奏与可读性常量**(非玩法数值——D2 Rule 1"全部玩法数值入表"纪律不适用;单一来源登记防散落,载体 = presentation 主题资源/常量单点,实现期裁决载体形态;修订走本 GDD 流程非调参)。全部标注尺度。 - -| Knob | 默认 | 尺度 | 调过高 | 调过低 | -|---|---|---|---|---| -| toast_display_ms | 2500 | 每条提示 | 信息滞留、遮挡节奏 | 读不完即消(拒绝原因漏读) | -| move_slide_ms | ≤150 | 每次移动 | 移动拖沓(违反 P4 摩擦护栏) | "太瞬"无方向感(battle.md OQ5 playtest 观测调) | -| board_install_fade_ms | 200 | 每次装板 | 换图迟滞 | 闪切无地牢感 | -| clear_celebration_ms | 3000–5000 | 每次清图 | 拖节奏(§2.3"三五秒即收"上限约束) | 丰收感不足 | -| font_min_board / detail / tooltip | 18 / 14 / 13 px | @1280×800 基座 | 挤占格内空间 | 可读性下限击穿(可访问性基线) | -| hint_once_scope | per_run | 每提示项 | —— | ——(存档级"一生一次"归 D3/C4 后重议) | -| reduce_motion_scale | 0.5(或跳终态) | 每动画 | 减动效失效 | 等效关闭动效 | -| detail_band_height | 24 / 84 px | 摘要 / 实时流 | 挤压 B 区演出区 | 行数不足(逐行归因截断) | - -- **非 knob(结构冻结,修订走 GDD 流程)**:五区布局与分区尺寸(battle.md 拍板)、双舞台常驻、窗口原位激活形态、单意图帧纪律、模态层级纪律、键位映射契约(§4.6)、程序化占位策略、订阅纪律(ADR-0001)。 -- **性能预算(引用非 knob)**:同屏 draw calls < 200、进入战斗屏 ≤500ms 可交互、headless 全套 < 30s(technical-preferences / ADR-0004)。 -- **Knob 交互**:font_min_board × cell 尺寸(F1 字号下限随格尺寸联动——12×12 板 36px 格是 18px 下限的绑定域);toast_display_ms × 一次性提示去重(提示频率观感)。 -- **调参流程**:改先测量后复测(切片 mock 数据先行——code-conventions 数值纪律);playtest 观测项 = 移动手感(OQ5)/ 明细带常驻(OQ6)/ 窗口存在感(OQ7)。 - -## Visual/Audio Requirements - -D1 是本 GDD 体系中唯一的**自有渲染面系统**——视觉义务从"数据供给规格"反转为"执行 art-bible"。逐条锚定: - -1. **§1.2 绘制优先级栈(执行)**:数字 > 小人 > 旗 > 徽章 > 变异纹理 > 底色——BoardView 分层绘制/控件叠序按此栈实现,任何元素不遮挡数字(小人与旗不得覆盖文本;小人所在格边框高亮)。 -2. **§1.4 格子样张(引用依据)**:样张 = 砖面形态定稿闸;D1 引用其验收标准(第一验收项 = 数字可读性硬指标)作为程序化占位与正式资产的共同判据;样张未制作不阻塞 D1(Core Rule 19);样张通过后冻结为制作标准,终稿资产替换走 asset-spec 批。 -3. **§3.3 UI 形状语法(执行)**:半拟物——面板 = 石板圆角矩形(与地砖同圆角率)、按钮 = 凸圆角"可按的砖"、仪式性确认(胜利蜡封)= 圆形;数据框/准线/进度条一律直角细线无纹理("圆角 = 可触摸的物件,直角 = 须精确的信息")。 -4. **§4.1/§4.4 UI 色板(执行)**:数据素面墨族(#33261B 系)——棋盘与面板读同一种墨;战斗容器中性石色(防暖色渗入分走数字对比预算);语义色规则(红只说危险 / 金只说收益 / 蓝只说己方 / 紫赤只说 Boss / 绿零逻辑语义 / 禁入色相带 300°–345°)逐条适用;明度恒定硬规则(状态区分只经色相/饱和/运动/元素——去饱和 + 金橙偏移即其合规化实例)。 -5. **§4.5 色弱安全清单(逐对执行)**:九对语义对的冗余通道(形/图标/位置/运动)在对应组件落实——四格态靠完整/碎裂形、奖励金 vs 危险红靠剪影+运动、UI 红/金强调对加图标+文案冗余、破坏性确认异位(位置通道)、图标键族一键一纹样色相不承载身份。 -6. **§4.6 图标键契约(键位挂接)**:效果图标 §4.6.1(七键——sapped 键冻结未入表前禁引用)、奖励徽章 §4.6.2(八键 + clear_blast 并列预留)、格面类型 §4.6.3(五键——MVP 只挂已开格)、敌种线索 §4.6.4(行为拍姿态键)——键位映射表(Core Rule 19)为唯一挂接点,键集扩容走 §4.6 修订、禁运行时换图。 -7. **能量档承载(§2 执行)**:五区布局的动效与色彩转场按 §2.1–2.6 能量档实现(挖掘 2/10 唯一微光在动 → 结算 7/10 金橙光带 → 清图 8/10 金粒喷泉 → 胜利 6/10 克制 → 失败 1/10 暮蓝最静一拍 → Boss 5/10 紫赤)——"状态间区分度自检"三条(挖掘 vs 结算靠谁在动+饱和;胜负以色相即判;Boss 以紫赤登场标记)为转场验收锚。 -8. **音频(D4,Alpha 占位)**:MVP 无音频;挂点清单引用 B1/B4 音频挂钩点(明细行类型流 / 负反馈聚合单次 / 开格拾取按 category 分色 / 清图奖励音)+ toast 提示触发(本 GDD 新增挂点候选);临时 SFX 随垂直切片(AD 项先例)。 - -> 注:`art-director` 未经咨询——Solo 模式,生产前请人工复核本节与 art-bible 的一致性。 - -> 📌 **Asset Spec**:Visual/Audio 义务已定义。art-bible 已定稿(§1–4),样张批后运行 `/asset-spec system:d1-hud-framework` 产出逐资产视觉描述/尺寸/生成提示词(样张先行——§1.4 为定稿闸)。 - -## UI Requirements - -- **权威屏级 spec = `design/ux/battle.md`**(APPROVED 2026-09-12,B1 UX Flag 的 /ux-design 产物——覆盖子屏:挖掘主界面 / 结算明细 / 道具窗口 / 终局 / 明细回看):本 GDD 为其系统级承接(布局/组件/交互裁决全部继承,见 Core Rules 二—七组;本节不重复 spec 内容,stories 引用 `design/ux/battle.md` 而非本 GDD 直引组件细节)。 -- **UX Flag 处置**:B1 UX Flag(结算明细屏 + 道具窗口 → Phase 4 前置 /ux-design)已由 battle.md 兑现闭合;D1 自身无新增屏(战斗屏 = 唯一 MVP 玩法屏)。相邻域屏 NodeOverlay / 关卡结算 = 后续 spec `design/ux/node-reward.md` / `design/ux/level-clear.md`(battle.md OQ9——本 GDD 只锁出口锚点)。 -- **pattern 库**:`design/ux/interaction-patterns.md` 已建(核心 8 条:双源拒绝反馈 / 原位窗口激活 / 逐行兑现明细带 / 悬停预承诺光标 / 点阵资源显示 / 模态 overlay 层级纪律 / 破坏性确认异位 / 禁用态即理由全文)——本 GDD 组件全部对号入座;12 目录占位(实现期回写义务)。 -- **accessibility**:`design/accessibility-requirements.md` 未建(gate-check Pre-Production 缺口在案)——本 GDD 内建基线承诺(Rule 22),正式分层(文本缩放/色盲模式/按键重映射)待该文档定稿。 -- **场景探针标配(code-conventions)**:每个可交互 UI 区域配套场景级探针——切片三探针(ui_probe / ui_click_probe / ui_tune_probe)扩展 + 战斗屏场景级探针(AC 硬性块);探针即呈现层契约的活文档。 - -## Acceptance Criteria - -> **测试载体(ADR-0004 双载体定稿;gdUnit4 deferred——D2 OQ1 关闭形态)**:逻辑断言类 = `godot --headless --script` 冒烟扩展;**场景级类 = 场景探针**(`godot --headless --path . res://smoke/.tscn` 走正常项目引导——autoload 在位、真实 SceneTree;切片三探针为先例)。期望值推导纪律:呈现断言引用表读值(AP=ap_per_round 表读值、RAP 门槛=rap_refresh_cost 表读值等)与 art-bible 冻结参数,不写死玩法数值;呈现常量(toast 时长等)为本 GDD Tuning Knobs 登记值可直断。每用例先 `reset_diagnostics()`。**覆盖声明(out-of-scope)**:玩法行为正确性(上游 GDD AC 域——D1 只断言呈现投影与上游契约一致);美术终稿质量(样张/asset-spec 批);动画密度(B5);音频(D4);gamepad 焦点序(OQ5)。 - -**布局与可读** - -- **AC-1(五区布局与基座)** GIVEN 1280×800 与 16:9 全屏(canvas_items/expand),WHEN 进入战斗屏(12×12 板),THEN 五区无遮挡/无重叠/无内容裁切(棋盘全部格子+数字完整可见)、分区尺寸 = battle.md 布局表值、同屏 draw calls < 200、进入后 ≤500ms 内首格可点。 -- **AC-2(F1 格尺寸与字号)** GIVEN 12×12 / 10×10 两档板,WHEN 装板渲染,THEN cell = F1 公式值(36 / 45px @1280×800)、数字字号 ≥ max(18, cell/2)、像素字体整数倍缩放无模糊。 -- **AC-3(对比度与明度恒定)** GIVEN 全部格底×数字组合,WHEN 灰度截图 + 对比抽测,THEN 1–8 全档对比 ≥4.5:1(F2)、0.5× 缩放数字仍可辨、纹带不侵数字字形区;全部状态转场(去饱和+金橙偏移 / 暮蓝 / Boss 紫赤)明度恒定(无变亮/变暗表达)。 -- **AC-4(四格态 + 雷格可读 + tint——A2×6②④ / A4×3③)** GIVEN 含雾板逐格渲染,THEN 四种格态灰度截图下一眼可辨;已引爆雷格呈"可通行可读"(已开底+巢穴纹+可作移动目标);已开雾格 = 地板无字 + 底色层 tint 残留且与已开 0 格灰度可判定区分;数字显示判定消费 variant_ids(呈现层无独立雾判定——代码走查)。 -- **AC-5(可挖域与绘制栈)** GIVEN 小人在场,THEN 8 向相邻未开格常驻呼吸微光(挖掘期唯一在动元素——其余静止截图断言);绘制优先级栈成立(徽章在旗之下纹理之上、不进数字区、无第二焦点)。 - -**输入与交互** - -- **AC-6(移动路径预览——A2×6⑤ 定稿)** GIVEN 悬停已开格,THEN `compute_move_path` BFS 路径以小人蓝细线点迹高亮(合法性指示);移动执行 ≤150ms 短滑;不可达格返回空且禁止光标(预览执行同源——A2 AC-14② 对侧);点击远格**无**自动 move+dig 复合意图(负空间)。 -- **AC-7(单意图帧 + 悬停预承诺——A2×6⑥③)** GIVEN 一帧内多意图(含 stop),WHEN 提交,THEN 整批经 `settle_batch` 单批到达(stop 终结当帧收集——探针断言单批);光标三语义(移动/挖/旗)随悬停目标正确切换 + 目标格边框高亮。 -- **AC-8(stop 路径与刷新——A2×6① / A3)** WHEN 点击停手,THEN 意图经 `settle_batch([stop])` 提交(代码走查 + 探针:零直调 A3 符号);按钮下压 + AP→RAP 飞行数字(RAP 增量 = 剩余 AP 读数投影);WHEN 弃图刷新成功,THEN RAP 扣 rap_refresh_cost、AP 不重置、剩余次数扣减可见、旧板旗作废提示可见;WHEN RAP<8 或 cap 超限提交,THEN 资源面拒绝可见(脉冲 + toast——EC13/EC15)。 -- **AC-9(奖励身份恒定可读——B4×5①)** GIVEN 已开格 + 库存,THEN 已开格家族徽章(§4.6.3 键)+ tier 档位拾取瞬间可读;库存常读条逐件 icon+名称+属性简述、枚举序 = stock 受理序、**不含来源信息**(列表与 tooltip 均无);Used 件不在常读条;同族刀(knife_t1/knife_adv)并排互辨。 - -**信息与归因** - -- **AC-10(敌人卡——B2×4①②③④)** GIVEN 双敌种遭遇,THEN 意图徽标 = 下一拍预告且挖掘期全程可见、映射按 enemy_id 全局恒定(跨 run 重放同姿态)、含强度档位与环长编码(环点数 = 拍数)、蓄力态含蓄力记号;顺位徽标可读(固定顺位最前者可辨);血条 hp/max_hp 数字可读;多敌伏击层数各卡同值呈现;敌死亡 = 血条归零→灰化+碎裂退场(禁瞬消)、就地更新不丢灰化态(entry 36 回归)。 -- **AC-11(结算明细与高光——B4×5③④ / B1×3①②)** GIVEN 完整结算,THEN 逐行明细实时可见且每行带来源标注(source_label_map 文案)、四类未生效行按聚合计数呈现且带形状冗余、零值行可见、效果行 value/pool_value 分示禁相加;标中旗行金框+弹道加重;H2 清图奖励行金框;完美排雷 = 金光带加倍+「完美排雷 ×2」横幅、value = 实际有效兑付当量、首份零兑付时高光降级不发;战斗后可经明细回看 overlay 复看完整流水。 -- **AC-12(状态槽——B3×4①③④)** GIVEN 状态在场/清空,THEN 槽显示 icon(§4.6.1 键)+层数+剩余结算次数点+tooltip(来源+语义);极性按键级表呈现(金满框/红缺框——**非 magnitude 符号**:负 magnitude 有利行测试例);空态 = 槽隐藏 + 数据框上移 + 图例载空态说明;battle_over 逐槽化光收回 + 微文案。 -- **AC-13(窗口——B4×5②)** GIVEN 窗口触发,THEN E 区原位激活(非中央弹窗)+ 至多选 1 件 + usable_now=false 灰置带禁选原因 + 政策注记「未选用件随关卡结束清空」常驻 + 空库存不弹窗 + 选中提交 = 窗口条目位置(选中件库存态必变 Used——缺陷④回归探针)+ 窗口期不被常读刷新 stomped(entry 36 回归)+ D 区去饱和锁输入(明度不变)。 -- **AC-14(提示与图例——A2×6③ / A4×3①②)** THEN 图例面板「迷雾 = 无雷盲区」条目恒在可随时回看、载状态空态说明;雾首遇提示每 run 一次、非模态不劫持输入、必含三要点;chord 提示每 run 一次含「点数字格 = 移动小人」锚点;no_adjacent 首次提示;hint_id 去重生效(同 run 二次触发零 toast)。 -- **AC-15(键契约执行)** THEN 全部 icon/徽章/线索经键位映射表挂接(数据键→纹样 ID);§4.6.1 七键/§4.6.2 八键/§4.6.3 五键/§4.6.4 姿态键逐一在位;未知键 = fail-fast 断言 + "?"占位 + 诊断(禁静默空图标);sapped 键未入 StatusEffectTable 前零引用。 - -**状态·资源·终局反馈** - -- **AC-16(清空反馈三件套——A3 / B3×4④ / B4×5⑤)** THEN battle_over:RAP 数字滚动归零+微文案、状态槽逐槽化光+微文案;level_clear:库存逐件化光飞出+「剩余道具 ×N 随关卡结束清空」(N = 清空前快照计数);两反馈不合并、时序不倒挂。 -- **AC-17(终局与变体)** THEN 胜利 = 金蜡封落于扫雷图区中央+暖白金 overlay+判定行+明细回看入口;失败 = 暮蓝 overlay(明度不变)+旗化光点收回+判定行;判定行内容 = B1 终局判定行投影(数据锚);Boss 战 = 紫赤影子爬棋盘一次性演出 + 阶段指示附 Boss 名。 -- **AC-18(遥测)** THEN 六类 ux 行按 Core Rule 17#13 schema 写入 playtest JSONL(字段名与值域逐项对表);ux_round_exit.path_tag 值域 = 上游封闭枚举。 - -**场景级 headless 测试(切片教训硬性要求②③——缺项即 blocking)** - -- **AC-19(战斗屏场景级探针)** GIVEN 真实实例化战斗屏场景(探针场景加载、autoload 在位),WHEN 驱动完整对局(两场遭遇 × 含雾板 × 窗口选用/跳过 × 刷新 × 胜负两终局),THEN 全程**零脚本错误**(stderr 归零)+ 五区断言 + 首格可点计时 ≤500ms(切片 ui_probe/click_probe 模式扩展)。 -- **AC-20(信号时点状态可见性——缺陷②回归)** THEN 敌人 despawn 与 battle_over 之后:呈现层对核心生命周期状态的读数 = 零(静态扫描:views/ 文件集禁 `is_battle_live()` 以外的核心状态位读取、禁核心内部字段访问——只许成文呈现面);终局呈现数据全部来自流水行/快照(断言终局后重放渲染与实时渲染逐像素一致——快照自包含判据)。 -- **AC-21(模态层级——缺陷⑤回归)** GIVEN 逐一打开全部模态覆盖层(含叠开),THEN 每层打开时遮挡物隐藏/输入锁定断言成立、关闭逐层恢复;TunePanel 默认不可见(显式初始化)。 -- **AC-22(布局稳定——缺陷①回归)** THEN 全部动态区固定槽高 + clip_contents:悬停 tooltip 最长文案 / 明细行 40% 膨胀宽度下布局零推挤(截图差分断言)。 -- **AC-23(CJK 字体)** THEN 全部中文文案渲染非豆腐块(字形覆盖抽测——ADR-0003 硬性前置)。 -- **AC-24(payload schema 消费断言——硬性要求①兑现)** THEN 探针对 Core Rule 17 表 #1–#9 载荷逐字段断言(消费侧校验——缺字段/多字段 = 失败,切片"窗口载荷缺 round_index"崩溃回归);#12 命令式刷新面 = 代码走查(旗插拔/移动/AP/RAP/状态/库存六面各一个回执后重查断言)。 -- **AC-25(静态扫描与命名)** THEN 呈现层文件集:零 `randomize()`/`randi()`/`randf*`(S1/S2)、零玩法数值字面量(期望值经只读面推导——人工三要素口径 warning 级 + AC-1/2/8 表读值推导合成判定)、核心写调用仅组合根(S7 呈现侧)、切片 provisional 名(`request_refresh_active` / `can_request_refresh` / `refresh_max_per_round` / `during_round`)**零残留**(grep 断言——entry 35 命名统一核销);每视图单元头注含「实现 GDD:design/gdd/d1-hud-framework.md(系统 ID D1)」溯源行。 - -**覆盖矩阵(门禁评审用)**:Core Rules 1–4→AC-19/24/25 · 5→AC-1 · 6→AC-10 · 7→AC-6/7 · 8→AC-6 · 9→AC-4/5 · 10→AC-9 · 11→AC-12/15 · 12→AC-11 · 13→AC-13 · 14→AC-14 · 15→AC-4/11 · 16→AC-8/16/17 · 17→AC-24 · 18→AC-20 · 19→AC-15(键位)/样张引用 · 20→AC-25 · 21→AC-21 · 22→AC-23 · F1→AC-2 · F2→AC-3 · Edge Cases 全表→AC-4/6/8/10/11/13/14/16/17/21/22/23/15(拒绝与 voided→AC-8 及探针负例;零合法板→AC-19 注入腿;双雾区→AC-4/11 腿)· 台账 27 项→上文落位表逐行 · 切片教训 3 项→AC-19/20/24 + Core Rules 17/18。 - -## Open Questions - -1. **_draw 迁移复议(ADR-0003 Decision 3 的 D1 裁决登记)**:**MVP 维持 GridContainer + 逐格控件**(裁决依据:呈现层程序化占位、样张未定稿、雾纹理/终稿表现力需求未冻结、三探针与现形态耦合〔改造 = 隐藏成本〕)——样张定稿后按表现力需求(biome 色板/雾纹理/动效复杂度)复议二选一;若迁移,`Viewport.push_input` 端到端探针从加分项变必需项(ADR-0004)。owner:D1 复议批;deadline:样张定稿后。 -2. **A3 轮内刷新次数读数(接口漂移登记)**:刷新按钮"本轮剩 N 次"需要 A3 暴露轮内已用刷新计数(现只读观测量 ap/rap/phase/last_round_end 未含)——A3 修订批补只读观测量 + AC 前言扩列;落地前按钮退化为静态文案"RAP−8 · 每轮至多 2 次"。owner:A3;deadline:正式实现接线批。 -3. **B1 `settlement_snapshot` 契约登记**:切片已实现该信号(每结算末全量快照、despawn 前终局),B1 GDD 未登记为契约——D1 现行消费 = 步骤流判定行 + `presentation_snapshot()`(零阻塞);若 D1/B5 终局呈现需独立信号契约,回 B1 修订批补登记(接口漂移)。owner:B1;deadline:B5 GDD 前。 -4. **battle.md 订阅表述对齐(冲突清单⑥)**:ADR-0001 订阅纪律(呈现层只订 B1/runner)与 battle.md §Events Fired"A2 三事件呈现订阅"的措辞差——本 GDD 按 ADR-0001 收窄;battle.md 复检批对齐。owner:battle.md 复检;deadline:下次 /ux-review。 -5. **Gamepad 焦点序**(battle.md OQ8 继承):Partial 支持非 MVP——焦点环顺序待 gamepad 批次。 -6. **相邻域屏 spec**(battle.md OQ9 继承):`design/ux/node-reward.md` / `design/ux/level-clear.md`——本 GDD 只锁出口锚点(节点奖励覆盖层 / 关卡结算屏的完整形态归后续 spec)。 -7. **accessibility-requirements.md**(battle.md OQ2 继承):正式分层待该文档定稿——gate-check Pre-Production 缺口在案。 -8. **键集扩容流程锚定**:新 effect_id / reward_id / enemy_id / cell_type 上线 → art-bible §4.6 修订 + SettlementTable effect_pool_map 随批登记(接口漂移双登记——本 GDD AC-15 fail-fast 强制暴露漏登记)。 -9. **极性提案实施批的 D1 义务条目**(冲突清单④):未开格类型图标 / 极性视觉语言 / 负向文案族按提案 §3.5 正式登记入 systems-index D1 台账(本 GDD 已预留键槽位与裁决⑤)。 -10. **明细带挖掘期常驻摘要**(battle.md OQ6 继承):常驻(现方案)vs 结算后收起——playtest 观测回看频率后裁决。 -11. **D5 教学挂靠**(battle.md OQ13 继承):挖到雷=敌方优势 / 旗挡链 / 首次蓄力提示 / 囤刀闭环——toast 体系为落点候选,D5 GDD 批定。 -12. **TunePanel 退役时点**(battle.md OQ10 继承):C4 天赋树落位批退役(Rule 21 已标注);Playtest 诊断按钮保留。 - diff --git a/design/gdd/legacy-2026-09-13/d2-data-config.md b/design/gdd/legacy-2026-09-13/d2-data-config.md deleted file mode 100644 index 9927d430..00000000 --- a/design/gdd/legacy-2026-09-13/d2-data-config.md +++ /dev/null @@ -1,274 +0,0 @@ -# D2 数据配置与数值表(Data Config & Balance Tables) - -> **Status**: Approved(2026-09-07 两轮评审 + delta 复核 5/5 PASS 后收口;同日 A3 回填 ActionEconomyTable 定稿 AP 8/旗 4/×2/×1,Tuning Knobs 对应条目已删;同日 A3 评审修订二次回填——schema 字段清单交付、成本三字段入表 + 冻结字段;**同日三次回填(A3 RAP 结构修订 delta)**——`flags_per_round`/`flag_unit_cost`/`stop_multiplier`/`clear_multiplier` 删除、`rap_refresh_cost` 新增,AC-7 示例值域内修正,Core Rules 表行与 registry 已同步;**同日 A3 三轮评审 delta(schema 级,D2 自身规则零改动)**——ActionEconomyTable 增跨字段 validate 规则(任一动作成本 ≤ ap_per_round,schema 类承载、违规致命、条件性夹具登记),Core Rules 表行与 registry 已同步;**同日 A4 回填 VariationTable 定稿(2026-09-08)**——8 字段 + fog 行 + Rule 4 豁免注明,Core Rules 表行与 registry(variation_table / variant_pool_gate 新条目)已同步;**同日 A4 re-review delta(2026-09-08)**——VariationTable 增跨字段校验 `hide_numbers⇒safe_nonzero`(加载期致命,A4 夹具 variation_mask_constraint 承载)+ counter_item_ids knob 误标修正(✗),Core Rules 表行与 registry 已同步。**同日 B3 回填 StatusEffectTable 定稿(2026-09-08)**——schema 8 字段 + 四行 MVP 内容(Rule 4 豁免注明,键=effect_id),Core Rules 表行与 registry(status_effect 新条目)已同步;**同日 A1 回填 BoardGenTable 定稿(2026-09-09)**——九字段 schema + F2/F2b 跨字段谓词 + solver_rules 冻结 + MVP 参考行(provisional,C3 调参所有权),首个进度键表,Core Rules 表行与 registry(board_gen_table 新条目)已同步;**同日 A1 full 评审 delta(2026-09-09,owner=a1-board-generation.md,8 blocking 同日修订)**——BoardGenTable inferability_target 域收窄 [0.85,1](P1 绝对锚)+ fog_target_ratio 绝对上限 min(8d, 0.25) + 布雷数下限 round(d×(W×H−9)) ≥ 1 + F2c 成本谓词(attempts×W×H ≤ 16384 provisional,运行期禁墙钟逃生)+ elite_/boss_ 命名空间预留(第三轴登记约定,Boss=Dmax 行 + A1 OQ6 重审门),Core Rules 表行与 registry 已同步。**同日 B2 回填定稿(2026-09-09)**——EnemyTable 八字段 + 双敌种行(provisional)+ 每行集恰一敌种校验、HeroTable 新增(单行全局两字段,接口漂移),Core Rules 表行与 Dependencies 行已同步,registry(enemy / hero / clause3_supply 新条目)已登记。**同日 B4 回填定稿(2026-09-09)**——RewardTable 八字段 + 跨字段校验族 + MVP 内容行(attack_up 死行不入池)、use_timing 占位转承重、首个 effect_id 引用回填激活 StatusEffectTable 悬空校验、reward_roll scope 语义改写(每次 board install 批)、Tuning Knobs"奖励池 5 类"占位参考值删除、Dependencies B4 行与双向一致性 B4←D2 修订,Core Rules 表行与 registry(reward_table 新条目 + 三处漂移改写)已同步。**同日 B4 full 评审 delta(2026-09-09,owner=b4-reward-item-economy.md,14 blocking 同日修订)**——RewardTable 增 display_name(九字段)+ 默认根行集登记(五行为,provisional 归 C3)+ **RewardConfigTable 新增**(单行全局四字段 t_fog_min/k_dmg/n_draft/p_min,接口漂移——B4 标量 knob 的 Rule 1 载体)+ **Core Rule 5 reward_roll 语义正文补同步**(原定稿批仅 registry/Dependencies 行改写,正文两处漏网——实现者按旧正文接线会使 B4 σ 轨迹 AC 报废),Core Rules 表行与 Interactions/Dependencies 行与 registry(reward_config 新条目)已同步。D2 自身规则零改动,schema 类修订经接口漂移规则) -> **Author**: user + agents(lean 门禁:systems-designer、qa-lead;full 评审 + 同日 re-review 2026-09-07:game-designer、systems-designer、qa-lead、creative-director,修订均由评审结论直接推导) -> **Last Updated**: 2026-09-07(re-review 修订版 · 评审日志:`design/gdd/reviews/d2-data-config-review-log.md`) -> **Implements Pillar**: P1、P2(基础设施层,间接支撑全部四支柱) -> **Layer**: 1 Foundation · **Milestone**: MVP · **设计顺序**: 第 1 位 -> **Creative Director Review (CD-GDD-ALIGN)**: re-review 终裁 NEEDS REVISION(末轮小修)→ 修订落实 → 独立 delta 核对 5/5 PASS → Approved(2026-09-07) - -## Overview - -D2 是游戏的数据底座:把所有影响玩法手感与平衡的数字——行动点、旗子数、奖励数值、敌人属性、成长曲线、变异参数——从代码中搬出,变成可配置、可校验的数值表与配置资源;同时提供两样基础设施:统一的"数值从哪读"注册表(各系统只向 D2 要数据,不再各自硬编码),以及随机数种子服务(RNG 由 D2 统一发放,是战斗可复现、可回放的前提)。 - -玩家不会直接"使用"D2,但每一局都在感受它:难度能否做到"越下越难",靠它第一天就内置的关卡序号 / 节点深度两个维度;每次平衡调整无需改代码即可生效,让"测试数据驱动平衡"成为本作的开发方式——这是个人开发在资产与人力受限下仍能保证手感稳定的底牌。 - -D2 遵循既定的"**schema 先行、数值回填**"策略:本 GDD 只定数据结构、注册表与校验模式,具体数值留空位,由后续系统 GDD(A3 行动经济、B4 奖励经济、C3 难度曲线等)按设计顺序回填。没有 D2,参数将散落各处硬编码:调一次难度要改五处代码,战斗无法用固定种子复现,headless 自动化测试无从谈起。 - -## Player Fantasy - -D2 没有专属的玩家幻想——它是玩家永远不该注意到的地基。正面的情绪目标由其余系统承载:P1"我算对了"的掌控感来自 A1/A2 的可推理设计,P2 的延迟兑现感来自 B1 的可见结算。D2 对体验的贡献是三种**消极保障**——它不制造情绪,但它的失职会直接摧毁这些情绪: - -- **手感稳定**:所有影响手感的数字(AP、旗子、折算比例、奖励值)集中一处可调。任何"这轮玩起来不对劲"都能不改代码地快速修正、反复验证——玩家感受到的是"每次迭代都更顺",而不是改动引发的新毛刺。 -- **公平可信**:RNG 统一种子化,相同的决策序列必然得到相同的战斗结果。可复现是开发侧的信任底线(回放/审计/自动化测试),**不等于玩家侧可推理**——因此 Foundation 层不为任何玩法随机预置基础设施:玩法系统要引入随机,须走增流通道并通过 P1 评审(见 R4)。 -- **难度可信**:数值表天生带关卡序号/节点深度维度,"越下越险"(P4)由结构化数据保证,而非散落各处的魔法数字——难度曲线因此可审计、可回溯。 - -## Detailed Design - -### Core Rules - -1. **单一事实源**:所有设计师可调的玩法数值只存在于 `data/tables/` 下的 `.tres` 资源;代码中禁止出现玩法数值字面量(引擎/工程常量除外)。违反视为评审阻塞项。 -2. **单点访问**:各系统经 autoload **`ConfigDB`** 的类型化属性读取(例:`ConfigDB.action_economy.ap_per_round`);禁止绕过 ConfigDB 自行 `load()` 表文件或长期缓存副本(保证校验单点与热重载一致性)。唯一例外:debug/测试构建的**注入根**(见校验双通道)。 -3. **Schema 先行、数值回填**:每个数值表 = 一个自定义 Resource 类(`data/schemas/`,字段带类型/范围/默认值/注释)+ 数据文件(`data/tables/`)。本 GDD 交付全部 schema 与占位表(含键结构);数值由 owner 系统 GDD 回填: - -| 表资源 | Schema 占位内容 | 键结构 | Owner(回填 GDD,设计顺序位) | -|---|---|---|---| -| ActionEconomyTable | **已回填定稿**(2026-09-07 A3 三次回填(RAP 结构修订),字段全集/类型域见 A3 GDD "ActionEconomyTable Schema 定稿"节):ap_per_round / dig_ap_cost / flag_place_ap_cost / flag_pull_ap_cost / rap_refresh_cost(knob)+ move_ap_cost / chain_ap_cost(冻结)。~~flags_per_round / flag_unit_cost / stop_multiplier / clear_multiplier~~ 已随 A3 停手→RAP 修订删除(旗无上限、折算乘数作废);**跨字段校验(同日 A3 三轮 delta)**:任一动作成本 ≤ ap_per_round,schema validate() 跨字段类别承载、违规致命,条件性夹具登记校验双通道 | 单行全局 | A3(第 2 位)✓ | -| VariationTable | **已回填定稿**(2026-09-08 A4)——schema 8 字段:variant_id(主键)/ display_name / unlock_level(int [1,999],knob)/ scope(region/global,global 预留 C3)/ info_mask(none/hide_numbers)/ cell_constraint(any/safe_nonzero)/ biome_tag(∅=通配)/ counter_item_ids(A5 预留,非 knob);字段全集见 A4 GDD "VariationTable Schema 定稿"节。MVP 恰含 fog 行(unlock_level=2 · hide_numbers · safe_nonzero);岩浆/冰冻无 MVP 行(垂直切片建行)。**承重规则**:生成期布置约束——雾区仅非 0 安全格(区内无雷无 0 格,A1 生成期强制)+ 零特判原则。**Rule 4 豁免**:定义表非进度成长表,键=variant_id,进度语义承载于 unlock_level 列(schema 注释承载)。悬空引用政策:counter_item_ids MVP 不校验,A5 首个道具 id 回填时补校验 + 条件性夹具 | 按 variant_id(含 unlock_level 列)+ 跨字段 `info_mask=hide_numbers ⇒ cell_constraint=safe_nonzero`(加载期致命,2026-09-08 A4 re-review 增,夹具 `variation_mask_constraint` 承载)✓ | A4(第 3 位)✓ | -| StatusEffectTable | **已回填定稿**(2026-09-08 B3)——schema 8 字段:effect_id(String 主键唯一)/ display_name / target_side(hero/enemy)/ magnitude(percent ∈ [-100,100] ∧ ≠0 / flat ≥ 1,跨字段校验)/ unit(percent/flat)/ duration_settlements([1,99])/ stack_policy(stack/refresh/independent)/ max_stack([1,16],仅 stack 消费)。MVP 四行(attack_up/defense_up/ambush/weaken,全 stack,值 provisional——锚验收归 B4/B2/B1,weaken 有条款 2 锚红色预警登记 registry)。**Rule 4 豁免**:定义表非进度成长表,键=effect_id(schema 注释承载)。悬空引用政策:effect_id 校验**已激活**(2026-09-09 B4 RewardTable 首个引用行〔defense_up〕回填——条件性夹具 B4 b4_dangling_effect) | 按 effect_id | B3(第 4 位)✓ | -| BoardGenTable | **已回填定稿**(2026-09-09 A1;同日 full 评审 B1/B3/B4/B7/B8 delta 回写)——schema 九字段:board_width/height([8,64])/ mine_density((0,0.5],密度浮点;布雷数下限 round(d×(W×H−9)) ≥ 1)/ inferability_target(**[0.85,1]**,P1 门槛+绝对锚——B1 修订收窄)/ solver_rules(single\|single_subset,**冻结 single_subset**)/ min_safe_count([1,999])/ max_gen_attempts([1,32])/ fog_region_count([0,32])/ fog_target_ratio([0,1),**≤ min(8d, 0.25) 绝对上限——B1 修订**)/ board_biome(StringSet 非空)+ elite_/boss_ 前缀字段命名空间预留(第三轴登记约定 B7——语义归 C1/C3,本 GDD 不定义)。**跨字段谓词**:fog_domain_ok(F2)+ min_safe_feasible(F2b)+ **cost_feasible(F2c,attempts×W×H ≤ 16384 provisional——B8,运行期禁墙钟逃生)**加载期致命。MVP 参考行 L1/L2 provisional(C3 调参所有权)| (level_index, node_depth)——**首个进度键表**(depth-0 锚行,D2 Rule 4/6 内建;第三轴落点 = Boss:Dmax 行约定 + elite 命名空间预留 + A1 OQ6 重审,改键退路 = Rule 4 接口漂移通道)| A1(第 5 位)✓ | -| EnemyTable | **已回填定稿**(2026-09-09 B2)——schema 八字段:enemy_id(行集内主键)/ display_name / unit_count(int [1,3] knob)/ hp / atk / heavy_multiplier([1,16] knob)/ pattern(StringList,MVP 校验域 {attack, charge, heavy}——guard/boost/hinder/summon 预留值校验拒绝,环长 [1,8])/ advantage_per_round_cap(int [0,16] knob,**默认 4 定稿**);字段全集见 B2 GDD Schema 节。MVP 双敌种行 grub/ambusher(值 provisional,溯源义务见 D2 knobs)。**表结构校验:每行集恰一敌种**(行集内 enemy_id 唯一,违规加载期致命);本表为进度成长表(A1 BoardGenTable 同型,无 Rule 4 豁免) | (level_index, node_depth, enemy_id)——每行集恰一敌种 | B2(第 7 位)✓ | -| HeroTable | **新增回填定稿**(2026-09-09 B2,接口漂移;2026-09-11 基础攻击裁决改写)——schema 两字段:max_hp(int [1,999] knob,MVP 值 provisional 出处待查)/ atk(int **[1,999]**,**0 = 加载拒绝**——基础攻击恒存在、"0 基线 × 百分比增益恒零"死锁自 schema 层杜绝,MVP = 6 原型锚 provisional;消费面 = 主角战斗段先手攻击——B1 GDD 2026-09-11 增补)。**单行全局**(Rule 4 豁免,ActionEconomyTable 先例) | 单行全局 | B2(第 7 位)✓ | -| RewardTable | **已回填定稿**(2026-09-09 B4;同日 full 评审增补 display_name → 九字段;2026-09-11 两级奖励批 category 扩容)——schema 九字段:reward_id(主键)/ category(enum buff/damage_item/heal_pack/instant_aoe/instant_heal——两类交付轴:即时类 {buff, instant_aoe, instant_heal} 当场兑付不进库存 / 可选类 {damage_item, heal_pack} 入关卡域库存,预留值校验拒绝)/ effect_id(buff 类必填,StatusEffectTable 精确引用;非 buff 恒空)/ **display_name(String 非空——D1 呈现数据源,本地化归 D6;B2/B3 同库惯例)** / power(int [0,999] knob;item 类 ≥1 加载校验,buff 类不消费非校验)/ weight(int [0,999] knob;0 = 不入池)/ pool_tag(safe_cell/clear_default,clear_\ 命名空间预留拒绝)/ tier(int [1,8] knob,A4 雾档约束载体)/ use_timing(MVP 单值 pre_settlement,**承重**——道具使用窗口 MVP 激活,扩枚举走修订);字段全集见 B4 GDD Rule 9。MVP 内容:**默认根行集已登记**(knife_t1/knife_adv/heal_t1/defense_up_basic/clear_knife——B4 GDD Formulas 节,值 provisional 归 C3;attack_up/defense_up/spark_aoe/heal_minor/knife_t1/knife_adv/heal_pack 八行默认根 = 2026-09-11 两级奖励批登记——即时 75% / 可选 25%)。**跨字段校验族(加载期致命)**:池空(pool_tag × 雾/非雾两态各 ≥1 活行)· clear_default 恒正当量 · buff⇒effect_id 必填 · safe_cell 活 buff 行集非空。**Rule 4 豁免**:定义表非进度成长表,键=reward_id(schema 注释承载)。**首个 effect_id 引用已回填(defense_up)→ StatusEffectTable 悬空校验激活** | 按 reward_id(多行;pool_tag 分池不参与键) | B4(第 8 位)✓ | -| RewardConfigTable | **新增回填**(2026-09-09 B4 full 评审,接口漂移)——schema 四字段:t_fog_min(int [1,8],默认 2)/ k_dmg(int [0,999],默认 1;0 = F5 断言关闭,C3 禁区默认值)/ n_draft(int [1,999],默认 32)/ p_min(int [1,999],默认 8 = 默认根最低刀 power——2026-09-11 批)。**单行全局**(Rule 4 豁免,HeroTable/ActionEconomyTable 先例)——B4 三个标量 knob 的 Rule 1 单一事实源载体(R3 override key 空间随之存在) | 单行全局 | B4(第 8 位)✓ | -| SettlementTable | **已回填定稿**(2026-09-10 B1)——schema 七字段:equivalence_ref_damage(int [1,999] knob 默认 12——当量参考敞口 D_ref;变更触发 B1 全对照表 + 条款③⑤对账重跑)/ p_perfect(int [100,999] knob 默认 200——完美排雷乘数)/ segment_order(StringList 结构冻结——恒等拍板段序校验**违例致命**)/ source_label_map(Dictionary source_class→文案键,结构冻结)/ effect_pool_map(Dictionary effect_id→pool,结构冻结;**键 ⊆ StatusEffectTable 活行集、悬空加载期致命**)/ pool_clamp_lo_hi(−100/+100 结构冻结)/ round_direction(floor 结构冻结);字段全集见 B1 GDD Tuning Knobs 节。**Rule 4 豁免**:单行全局常量/结构表(HeroTable/ActionEconomyTable 先例)。三行致命 manifest:segorder_violation / poolmap_dangling / pperfect_oob | 单行全局 | B1(第 9 位)✓ | -| DifficultyTable | 成长参数 + **精英/Boss 修饰预留命名空间** | (level_index, node_depth) | C3(第 12 位) | -| HelperItemTable | 探测/安全旗参数 | 单行全局 | A5(第 11 位) | -| MetaTable | 代币/天赋字段名 | 单行全局(元进度轴豁免,C4 可改键) | C4(第 16 位) | - -4. **进度维度内建**:凡随**冒险内**进程成长的基础数值表,行键必须是 `(level_index, node_depth)`;实体类表在其后复合实体主键列(如 EnemyTable 的 enemy_id)——进度键 × 实体键的合成规则写入 schema 注释。**解析语义(同名规则写入 schema 注释)**:进度键按 R1 floor 解析;实体键在解析行内**精确匹配**、不参与 floor——解析行不存在该实体键 → Rule 6 悬空引用致命(floor 近似只适用于进度轴,身份轴近似会静默改变遭遇构成、损害 P2 归因)。**其他成长轴不在此体系内**:元进度(存档/天赋/代币)归 MetaTable(键归 C4 定);胜场成长、轮次成长等战斗内轴由 owner 公式承载或作为表列,归属须在 schema 注释中登记(C3 定稿时声明)。难度公式的第三维"**精英/Boss 修饰**"(game-concept 定稿:难度 = f(关卡序号, 节点深度, 精英/Boss 修饰))在 DifficultyTable 预留 `elite_` / `boss_` 前缀扩展字段命名空间,语义由 C3 GDD 定稿——本 GDD 不定义任何修饰数值、不预写修饰枚举。若 C1/C3 定稿的节点形态使精英性无法由 (level_index, node_depth) 唯一确定(如分支地图同深度并存精英与普通节点),允许改键,按接口漂移修订规则回写本表(与 MetaTable 同等豁免待遇)。无成长语义的全局常量表允许单行。 -5. **RNG 单点**:autoload **`RngService`**(D2 范围)持有封闭命名流:`board_gen`(A1 布雷)、`reward_roll`(B4 掉落)。**流集合当前封闭且只含具名消费者**;玩法系统要新增随机流(含 B1 若需结算随机)须改代码走增流通道,并通过 P1 支柱评审(随机须有界、可见或可推理)。玩法代码禁止 `randomize()` 或自建 RandomNumberGenerator。master seed 在冒险开始时由 C2 调用设定;取数走**有状态流门面** `open_stream(stream) -> RandomNumberGenerator`(每次调用 = 一次 scope 取号:计数器 +1 → 派生 → 返回已播种实例,一个 scope 事件内所有取数共用该实例);scope 取号事件唯一绑定:board_gen = 每次生成新扫雷图(A1 换图时)、**reward_roll = 每次 board install(格奖励批 + 清图奖励批)**(B4 Rule 2 接口漂移改写,2026-09-09 定稿——原"每次奖励结算 roll 批次"作废;B4 AC-1 为契约源;R2 黄金向量为 (stream, master, scope) 纯函数、不受取号时机变更影响,注记防误解)。测试/预览用**纯函数** `derive_at(stream, scope)`(不推计数器,杜绝预览类取数的平衡 Heisenbug)。 -6. **失败即响(fail fast)**:错误分两类,一律致命中止;MVP 有意不做软回退——错误数值上线比崩溃更伤(P1/P2 的信任底线)。 - - **加载期校验错误**(字段越界/类型错/NaN/表为空或某 level 无行/**缺 depth-0 锚行**/重复键/悬空引用/权重和 ≤0):经校验双通道处理,启动路径在 editor、CI、headless、release 一律致命;**唯一例外**:debug 热重载校验失败保留旧表停留 Ready(States 表 / EC16)。 - - **运行期致命**(**请求越域**=R1 前置守卫、**未播种流取数**=EC7):不分构建一律致命——游戏内走致命错误路径,headless 冒烟进程 quit 非 0。 -7. **零 UI 依赖**:D2 及其测试不 import 任何 Control/场景类;"Core 层 `--headless` 跑完整战斗"工程债在数据侧的落实。 -8. **版本化**:`SCHEMA_VERSION` 常量归 D2;表文件与存档(D3)携带版本号,高版本拒读。 - -**校验双通道(Rule 6 的执行规格)**:ConfigDB 暴露 `load_tables(root: String, collect_only: bool)`。 -- **游戏通道**(`collect_only=false`,默认):校验错误 → push_error 错误清单 → 走致命错误路径(游戏内中止构建;headless 下独立进程非 0 退出——`--script` 协议,设计顺序 #1 时无主场景可依赖)。release 构建的致命表现(引擎默认错误路径的实际行为验证)显式 deferred→首次 release 导出 checklist(与 AC-15 同待遇)。 -- **测试通道**(`collect_only=true`,仅 debug/测试构建):收集错误不升级,供冒烟脚本逐夹具断言错误类别后一次性退出。 -- **夹具注入**:debug/test 构建允许经命令行 `--data-root=<路径>` 让 ConfigDB 从注入根加载(夹具放 `tests/fixtures/`);**禁止**把夹具拷进 `data/tables/`(污染 AC-1 的干净检出前提)。 -- **诊断收集器(warning 可观测缝,re-review 增补)**:resolve / 校验 / override 的 warning 与错误共用同一类目体系,统一经 ConfigDB 内部**诊断收集器**投递,同时镜像 `push_warning` 供开发期控制台(Godot 无进程内拦截 `push_warning` 的 API,冒烟断言必须走收集器)。测试通道暴露只读诊断清单与 `reset_diagnostics()`;跨调用去重状态(R1 四元组注册表)随 `load_tables()` 或 `reset_diagnostics()` 清空。游戏通道 warning 仅镜像控制台,不承诺收集。 - -### States and Transitions - -| 状态 | 进入条件 | 行为/出口 | -|---|---|---| -| Unloaded | 进程启动前 | 磁盘 `.tres` 未加载 | -| Loading | `ConfigDB._ready()` 或 `load_tables()` | 按表清单逐一 `load()`;文件缺失即入 Failed | -| Validating | 单个资源加载成功 | 调 schema 的 `validate()`,错误入收集器 | -| Ready | 全部通过 | 类型化属性可读 | -| Failed(启动路径) | 启动加载任一致命错误 | 全构建致命中止并输出错误清单(Rule 6) | -| Failed(reload 路径) | 热重载校验失败 | **保留旧表**停留 Ready + debug 错误清单(不杀运行中的调试会话) | -| Reloading(仅 debug) | 编辑器热重载/调试键 | 战斗中拒绝(返回 false,战斗结束后**手动**再触发);否则重走 Loading → Ready | - -**RNG 与 ConfigDB 状态线相互独立**:Reloading/Failed(任一路径)不触碰 RngService——计数器与 master_seed 不变(派生只依赖盐/master_seed/scope,与表数据无关;若按状态机对称性在 reload 时重置 RNG 将击穿 AC-4)。 - -RNG 生命周期:进程启动 → 流待命(**未播种时取数即致命**)→ 冒险开始设定 master_seed → 每次具名 scope 事件派生种子 → 冒险结束保留供复盘;**续玩/复盘快照 = master_seed + 各流 scope 计数器**(仅记录计数器、缺 master_seed 不足以恢复序列——进程重启会从种子序列起点重放;见 D3 接口)。**快照切出须发生在无在飞 `open_stream` 实例时**(scope 事件边界之外):门面实例作用域限定于单次 scope 事件、消费者不得跨事件持有——在飞实例的内部取数进度不入快照,违反则续玩/复盘与实况分叉(AC-15 失效),该前提由 D3 消费侧遵守。 - -### Interactions with Other Systems - -| 系统 | 方向 | 接口契约 | -|---|---|---| -| 全部其他 19 系统 | 它们 → D2 | ConfigDB 类型化读取;禁止其他取数路径(A2 经 A3 表间接承载参数) | -| A1 | 消费 | VariationTable schema(biome/tag 字段)+ `board_gen` 流(换图时取号) | -| A3 / A4 / B2 / B3 / A5 / D1 | 消费 | 各自表 schema 占位(见 Core Rules 表) | -| B4 | 消费 | RewardTable schema(九字段,use_timing 承重 MVP 单值)+ **RewardConfigTable**(单行全局,2026-09-09 B4 评审新增:t_fog_min/k_dmg/n_draft/p_min)+ `reward_roll` 流(scope = 每次 board install 批——格奖励批 + 清图奖励批,B4 Rule 2 改写) | -| B1 | 消费 | SettlementTable schema(可回放步骤流的数据前提);另有 debug 热重载门标志 `set_reload_gate()`(战斗开始置位/结束复位,仅 debug 构建) | -| C2 / C3 | 消费 | `RngService.set_master_seed()` + DifficultyTable 行解析 | -| D3 | 消费 | `SCHEMA_VERSION` + 存档内 **master_seed + 各流 scope 计数器** 快照(续玩/复盘;含只读计数器接口,快照须在无在飞实例时切出) | -| D2 外发 | → | 不订阅任何玩法事件;仅 debug 构建发 `config_reloaded`(D1 调试用) | - -双向一致性:systems-index 依赖表中显式以 D2 为依赖方的系统(A1、B2、C3)与本节一致;其余系统的数据读取为**事实依赖**(索引层表的"无"指玩法依赖)。已知口径待修 → **已修(2026-09-07 同日索引同步)**:C2←D2(master_seed 唯一接线方)、B1←D2(set_reload_gate 调用)、B4←D2(reward_roll 流)、C4←D2(MetaTable 消费)四条边已补入索引依赖分层表;数据读取类事实依赖不逐条列边(完整清单以本 Dependencies 表为准)。D2 不依赖任何玩法系统(依赖层 1:无)。 - -## Formulas - -> systems-designer 代理已复核(lean 门禁 + 2026-09-07 full 评审 + 同日 re-review);scope 重置撞种子、hash() 稳定性、溢出论证、INT64_MIN 别名等问题已修正并入;re-review 增补:missing_type 分类规则、负 scope / 重播种守卫、掩码别名机理。 - -### R1 难度行解析(difficulty_row_resolution) - -`row = resolve(table, level_index, node_depth)`(resolve 为 ConfigDB 公开解析方法,table 经类型化属性取得) - -- **前置守卫**:`level_index < 1` 或 `node_depth < 0` → Rule 6 致命(请求越域,不进解析)。 -- `L* = max{ lv ∈ LevelKeys(table) | lv ≤ level_index }`;空集(请求低于表最小键,向上解析)→ `L* = min LevelKeys(table)` -- `D* = max{ dp ∈ DepthKeys(L*) | dp ≤ node_depth }`;空集 → `D* = min DepthKeys(L*)` -- 非精确命中记 warning,**missing_type ∈ { level_floor, depth_floor, both, base_ceil }**。**分类规则**:level 分量为向上解析(请求低于表最小键)时恒记 `base_ceil`(depth 分量缺失与否只写入 warning 内容,不改类型);`both` 专指 level_floor 与 depth_floor 同时发生;`level_floor` / `depth_floor` 为单维向下解析;depth 分量只有精确命中或向下 floor 两种情形(EC15 锚行保证每个 level 含 depth-0,永不 ceil)。AC-5 各用例的 missing_type 均由本规则**推导**得出。**去重键 = (table_id, missing_type, L*, D*) 四元组**,内容含请求 (level_index, node_depth)、解析结果 (L*, D*)、缺失类型;**去重注册表随每次 `load_tables()` 或 `reset_diagnostics()` 清空**(用例间无顺序依赖)。 -- warning 定位为**开发期异常信号**(防刷屏去重是刻意的)——它不是难度审计工具;难度曲线的离线审计由 **曲线导出工具**(headless 脚本导出 resolve(level 1..N × depth 0..M) 矩阵供 diff)承担,登记为 C3 期交付物。 -- **不存在 default 行兜底、不存在 clamp 外推**:表非空、每个 level 至少 1 行、每个 level 含 depth-0 锚行是 Rule 6 校验前置;超表成长外推是 C3 owner 公式的职责,D2 只解析到最近已有行。 - -**Variables:** - -| 变量 | 类型 | 范围 | 说明 | -|---|---|---|---| -| level_index | int | ≥1 | 当前关卡序号(1 起);越域 → 致命 | -| node_depth | int | ≥0 | 节点深度(0=关卡入口);越域 → 致命 | -| L* / D* | int | 表内键 | 命中行键 | - -**Output Range:** 行资源必有值(前置条件由校验保证);极端输入(超表大关卡号)命中最大已有行。 -**Example:** 表含行 (1,0) (1,4) (2,0) (2,6);`resolve(t, 3, 3)` → L*=2、D*=0 → 返回 (2,0) 行,warning 一条(missing_type=both);`resolve(t, 1, 4)` → 精确命中,零 warning;`resolve(t, 99, 99)` → 命中 (2,6),missing_type=both(与前者去重键不同,各自一条)。 - -### R2 流种子派生(stream_seed_derivation) - -**纯派生函数**(可测试、可复现、供预览): - -``` -derive_at(stream, scope) = ( SALT_s XOR wrap64(master_seed + scope × GOLDEN_RATIO) ) AND 0x7FFFFFFFFFFFFFFF -``` - -**实现级规约(必须逐条遵守,否则黄金向量失配):** -- `wrap64` = GDScript int(64 位二补数)的**自然回绕**,即 MOD 2^64。**禁止 float 中间量**(53 位尾数必丢精度)、**禁止对中间量使用 `%`**(带符号取余语义易误用)、**禁止"主动修复溢出"**(中间积本就越界——乘数 GOLDEN_RATIO = 0x9E3779B97F4A7C15 > 2^63,scope=1 即回绕,这是设计依赖的语义,不是缺陷)。 -- 三个常量(盐 ×2 + 乘数)均 ≥2^63,GDScript 十六进制字面量按二补数解析为负——**统一用分段表达式书写**(例:`(0x9E3779B9 << 32) | 0x7F4A7C15`,显式括号、不依赖优先级记忆),禁止直接书写 ≥2^63 的完整字面量。注意 GDScript 的 `^` 是按位 XOR。 -- 输出经 AND 掩码保证非负(∈ [0, 2^63))后再赋 `RandomNumberGenerator.seed`。 -- 复现保证的准确表述:**同一冒险内(master_seed 固定)同流各 scope 种子互不碰撞**;同输入恒同输出;跨 Godot 版本恒定(因此不用运行时 `hash()`——其跨版本稳定性无承诺)。跨 master_seed 的全局单射不做声明(数学上由鸽笼原理排除)。 - -**Variables:** - -| 变量 | 类型 | 范围 | 说明 | -|---|---|---|---| -| SALT_s | int64 | 编译期常量 | board_gen=0xA0761D6478BD642F · reward_roll=0xE7037ED1A0B428DB(互异奇常数,均 ≠ 乘数) | -| master_seed | int64 | [0, 2^63) | 冒险主种子;`set_master_seed()` 对负输入 abs() 归一化并 warning;**恰为 INT64_MIN → 致命**(abs 在 int64 对 INT64_MIN 恒等回绕,实测与 0 在全流种子逐一相等——别名机理是输出掩码抹掉 bit 63,掩码本身是规约的一部分);**仅许两流计数器全零时调用**(冒险中途重播种会静默清零计数器,击穿同冒险无碰撞前提与 D3 快照语义 → debug 断言) | -| scope | int64 | ≥0 | 派生入参;有状态门面的取号值(每流独立计数器:set_master_seed() 时归零,每次 `open_stream` +1,永不重置、不随关卡/图序重置——否则不同关卡的同序号图会得到相同种子);**负 scope → debug 断言中止**(`derive_at` 是预览工具入口,静默负值会与 scope+2^63 经输出掩码别名) | - -**黄金向量(AC-3 的常量依据,经独立复算验证):** - -| 流 | master_seed | scope | stream_seed | -|---|---|---|---| -| board_gen | 42 | 0 | 2339089373825164293 | -| board_gen | 42 | 1 | 4485977604321908752 | -| board_gen | 42 | 2 | 2024629813010603131 | -| board_gen | 42 | 3 | 8849696722413293638 | -| reward_roll | 42 | 0 | 7422916049646135537 | - -**Output Range:** [0, 2^63)。 -**Example:** 同流同 scope 重复调用 `derive_at` 恒等(纯函数);同帧对同一流连续 `open_stream` 两次 → 计数器各 +1,得两个互异且顺序确定的种子。 - -### R3 调试覆盖链(debug_override,仅 debug 构建) - -`effective = override[key] if _has_override(key) else table_value` - -边界五条:① 覆盖判定与存储内聚于 ConfigDB(Rule 2 单点),gameplay 不可见 override 来源;② **key = schema 字段点路径**(与 Rule 2 属性路径同构,例 `action_economy.ap_per_round`),未知 key → debug warning + 忽略该条;**v1 仅支持单行全局表字段**——进度键表的行寻址语法(如 `difficulty.(2,0).hp`)登记为后续扩展,当前 override 对进度表无 key 空间;③ override 值**类型与范围**必须与 schema 字段一致,不一致 → debug warning + 忽略该条(复用 schema 校验逻辑,防止 debug 会话注入越界值污染平衡基线);④ release 构建不加载、不注册任何 override 源(恒等是结构保证而非"碰巧不生效");debug 谓词实现为可注入形式(`OS.is_debug_build()` 之外引入 feature 标签闸,例 `sim_release`),AC-8 的模拟以此为基础;⑤ override 仅为运行时状态,永不回写 `.tres`。 - -### R4 显式排除 - -玩法平衡公式(伤害、掉落权重、成长曲线)**不在 D2**——归 owner 系统 GDD(B1/B4/C3 等)。本 GDD 不含任何平衡数值公式,只负责取数与解析。**玩法随机同理**:任何系统若需玩法随机(如结算浮动),自带方案走 Rule 5 增流通道并通过 P1 评审,D2 不预置。 - -## Edge Cases - -- **EC1 If 表文件缺失或 load() 失败**:致命中止,错误清单含路径;无软回退(Rule 6)。 -- **EC2 If 字段越界 / NaN / 类型不符**:`validate()` 收集后致命。 -- **EC3 If 表为空或某 level 行集为空**:校验阶段致命(R1 前置条件),不会进入运行期。 -- **EC4 If 请求 (level_index, node_depth) 无精确行**:按 R1 floor 解析 + warning(按四元组去重)——预期行为,不是错误。 -- **EC5 If level_index 超过表最大 level**:命中最大 level 行(floor 规则的自然结果,无独立 clamp 分支)。 -- **EC6 If master_seed 为负**:abs() 归一化 + warning,保证 ∈ [0, 2^63);**恰为 INT64_MIN → 致命**(abs 恒等回绕,与 0 静默别名——机理是输出掩码抹掉 bit 63)。 -- **EC7 If 未设 master_seed 就取随机数**:`push_error` 后**显式中止**(GDScript 的 push_error 本身不终止进程——游戏内走致命错误路径,冒烟脚本 `quit(1)`),取到的值不可用——这是 C2 未接线的显式暴露,禁止 seed=0 软回退。 -- **EC8 If 战斗进行中请求热重载**:拒绝并返回 false;战斗结束后**手动**再触发(不自动重放)。 -- **EC9 If 存档携带的 SCHEMA_VERSION 高于当前**:拒绝读取(比较逻辑归 D3,常量归 D2)。 -- **EC10 If 奖励权重表权重和 ≤ 0**:validate 致命(B4 回填后必须 > 0)。 -- **EC11 If debug override 类型或范围与 schema 字段不符**:warning + 忽略该条(仅 debug;release 无 override 源)。 -- **EC12 If 同一流名被重复注册或请求未知名流**:debug 断言中止(流名封闭)。 -- **EC13 If 两个系统同帧请求同一流**:允许——`open_stream` 各自取号(计数器各 +1)按调用顺序串行生效,单线程假设成立(Godot 主线程玩法逻辑),不引入锁。 -- **EC14 If 请求越域(level_index < 1 或 node_depth < 0)**:Rule 6 致命(R1 前置守卫)。 -- **EC15 If 某 level 行集缺 depth-0 锚行**:validate 致命(防"入口天灾":入口请求静默 floor 到深行造成难度突刺)。**写死开、无运行期开关**;C3 如需重议,走对本 GDD 的显式修订流程(非 knob)。 -- **EC16 If 热重载校验失败**:保留旧表停留 Ready + debug 错误清单(见 States 表 reload 路径)。 - -## Dependencies - -**Upstream(hard)**:无。Foundation 层,D2 不依赖任何系统。 - -**Downstream**: - -| 依赖方 | 性质 | 接口 | -|---|---|---| -| 全部其他 19 系统 | hard(Rule 1 单一事实源;A2 经 A3 表间接) | ConfigDB 类型化读取 | -| A1 | hard | **BoardGenTable 回填(首个进度键表,2026-09-09 A1 定稿)** + VariationTable schema(biome/tag 字段)+ `board_gen` 流 | -| A3 | hard | ActionEconomyTable schema 回填 | -| A4 | hard | VariationTable 回填 | -| B2 | hard | EnemyTable 回填(**2026-09-09 定稿**:八字段 + 双敌种行 + 每行集恰一敌种校验)+ HeroTable 新增(接口漂移回写) | -| B3 | hard | StatusEffectTable 回填 | -| B4 | hard | **RewardTable 回填(2026-09-09 定稿:九字段〔评审增补 display_name〕+ 跨字段校验族 + 默认根行集)+ RewardConfigTable 新增(2026-09-09 评审,单行全局)** + `reward_roll` 流(scope 语义 = 每次 board install 批——B4 Rule 2 接口漂移,registry/D2 正文同步) | -| B1 | hard | SettlementTable 回填 + debug `set_reload_gate()` | -| C2 | hard | `set_master_seed()` 调用方(冒险开始) | -| C3 | hard | DifficultyTable 回填 + R1 行解析 + 曲线导出工具交付物 | -| A5 / C4 / D3 | hard(垂直切片 / Alpha) | HelperItemTable / MetaTable 回填;D3 另消费 SCHEMA_VERSION + master_seed/计数器快照 | -| D1 / D4 / D5 / D6 | soft | 如需参数表再增 schema(现无占位) | - -- A2 无直接依赖(只外发事件;其参数经 A3 表承载),与 systems-index 的 A2 回边规则一致。 -- **接口漂移修订规则**:owner GDD 定稿时可以修改占位 schema 类(schema 与表同仓),但必须回写本 GDD 的 Core Rules 表清单与 `design/registry/entities.yaml`,并在本文件 Status 行登记修订。**占位参考值定稿时必须删除本 GDD Tuning Knobs 清单中的对应条目**(值的事实登记归 owner GDD 与 registry)。 -- 双向一致性:与 systems-index 依赖分层表核对一致(A1←A4,D2 · B2←D2 · B4←D2〔2026-09-09 B4 定稿修订:原"A2,B3,D2"收窄——A2 事实经 B1 转化零直接接口、B3 为验收锚关系非运行时边,B4 GDD Dependencies 修订注记〕 · B1←A3,B2,B3,B4,D2 · C2←C3,D2 · C4←D3,C2,D2 · C3←D2,B2 · Foundation 含 D2);C2/B1/B4/C4 ← D2 四条边已于 2026-09-07 补齐(详见 Interactions 节)。已知待定:C3 是否消费 B1 输出(见索引门禁增补记录,C3 GDD 定稿,不影响 D2)。 - -## Tuning Knobs - -**D2 自身 knobs(元参数):** - -| Knob | 默认 | 调过高 | 调过低 | -|---|---|---|---| -| floor 解析策略 | floor + warning(无外推) | —— | 引入外推/静默会掩盖 C3 难度断档 | -| rng_stream_names | 当前封闭 2 流 | 增流需改代码 + P1 评审(有意设卡) | 流复用破坏可复现隔离 | -| debug_override_enabled | false(仅 debug 构建) | 污染测试基线 | —— | -| 表路径清单 | `data/tables/` 固定(debug 注入根除外) | —— | 散装路径破坏单点访问 | -| depth-0 锚行校验 | **写死开(非 knob,Rule 6)** | —— | ——(重议须走本 GDD 显式修订,EC15) | - -- **Knob 交互**:floor 策略与 C3 的难度语义共享,改动需 C3 GDD 知情;校验严格度不设 knob(fatal 写死——放行带病数值会使 CI 冒烟失去意义)。 -- **占位表中的原型参考值**(provisional——owner GDD 定稿前不视为平衡事实;**定稿后删除对应条目**,事实登记归 owner): - - 出处=概念定稿/原型结论:标中 +5/面旗——**量纲与语义已由 A3 OQ5 重锚**(2026-09-07 两改:先"一次性兑付、当轮结算";同日三向效果定稿——**标中旗 = 怪物 debuff**,档位锚 = 严格 > 最低档安全格 buff 当量(A3 F1 条款 2);+5 为原型临时值作废),B4 定稿时登记;清图 +10 仍为临时锚(**用途已改**:A3 折算与 F2 不等式已随停手→RAP 修订作废,+10 降级为 B4 清图奖励插槽的 provisional 参考——A3 清图奖励为差异化插槽,按图类型分支归 B4) - - **出处待查(原型 REPORT,回填前须补溯源)**:伏击 +3(量纲待 B2 定:候选"每颗已开雷")· 清图 +10 · 敌 18HP / 4ATK - - **机制与数值均 provisional**:~~增伤 1.5× / 减伤 0.5× / 持续 2 次结算(B3)~~ **已随 B3 定稿删除(2026-09-08,同 A3 删除先例)**——StatusEffectTable 四行(attack_up/defense_up/ambush/weaken)事实登记归 registry `status_effect`(值仍 provisional,锚验收归 B4/B2/B1);胜场成长 +25% HP / +1 ATK(**机制去留本身待定**——反雪球问题,C3 须先决定)· ~~奖励池 5 类(伤害/增伤/减伤/AOE/治疗)~~ **已随 B4 定稿删除(2026-09-09)**——RewardTable 事实登记归 registry `reward_table`(category 三值封闭:buff/damage_item/heal_pack;AOE 类不入 MVP)。 - - owner:A3 / A4 / B3 ✓ / B4 / B1 / C3 按设计顺序回填。 - -## Visual/Audio Requirements - -无直接表现面(纯数据层)。仅两项开发侧"可视化":Godot 编辑器 Resource inspector(自带)与校验错误控制台输出(错误清单格式见 AC-1)。无音频需求。 - -## UI Requirements - -MVP 无面向玩家的 UI。debug override 与夹具注入均经 Godot 编辑器 / 命令行参数设置(`--data-root=`,仅 debug),不做自定义面板;校验失败在 editor/CI 输出控制台,release 构建走引擎默认错误路径(实际表现验证 deferred→首次导出 checklist)。 - -## Acceptance Criteria - -> qa-lead 代理复核(lean 门禁 + 2026-09-07 full 评审 + 同日 re-review):覆盖 8/8 Core Rules;Rule 6 **加载期**校验错误类别全部有夹具(悬空引用为条件性夹具),**运行期**致命(请求越域 EC14、未播种 EC7)由 AC-5b / AC-17 行为级覆盖;R1/R2 全部边界。除标注"人工/deferred"外全部可纳入 `--headless --script` 冒烟框架(脚本 extends SceneTree 以获得 quit(code);该模式下 autoload 须由脚本显式实例化——AC-1 前提声明)。**致命类断言协议统一**:致命用例(AC-2b、AC-5b 游戏通道半、AC-6 后半、AC-11、AC-17)各为**独立进程**调用,由冒烟 runner 清单逐条登记"调用 → 期望退出码";单进程内只做测试通道收集断言。warning 计数断言一律经诊断收集器(见校验双通道),每用例先 `reset_diagnostics()`。 - -**加载与校验(Rule 3/6)** -- **AC-1** GIVEN 干净检出,WHEN `godot --headless --script tests/smoke_data.gd`,THEN Core Rules-3 表清单的全部表(以清单为准,不写死数量)加载且 `data/tables/` 无清单外 .tres;脚本成功 `quit(0)`,任一失败 `quit(1)` 并输出错误清单(表路径 + 字段 + 错误类别)。 -- **AC-2** GIVEN `tests/fixtures/` 夹具集(越界字段/文件缺失/空表/某 level 无行/**缺 depth-0 锚行**/重复键/权重和 ≤0 各一,悬空引用为**条件性夹具**——首个含引用字段的 owner GDD 回填时补),WHEN 冒烟脚本经 `--data-root` 注入逐夹具运行 `load_tables(root, collect_only=true)`(测试通道,单进程逐个断言),THEN 每个夹具的错误清单含对应类别(EC1/EC2/EC3/EC15/EC10 及重复键类别)。 -- **AC-2b** GIVEN 任一致命夹具经注入根加载,WHEN 冒烟 runner 以**独立 headless 进程**执行游戏通道 `load_tables(root, collect_only=false)`(`--script` 协议,脚本显式实例化 autoload;设计顺序 #1 时无主场景,本 AC 不依赖主场景),THEN 进程非 0 退出且错误清单完整——验证"游戏内真的会死"而非仅"校验器能发现"。 - -**公式(R1/R2/R3)** -- **AC-3** GIVEN R2 黄金向量表(5 常量),WHEN 经纯函数 `derive_at` 复算(board_gen master=42 scope 0–3、reward_roll master=42 scope=0),THEN 逐个等于向量表常量;同流同 scope 重复调用 `derive_at` 恒等(纯函数无副作用)。 -- **AC-4** GIVEN master_seed=42,WHEN `open_stream("board_gen")` 连续取号 ≥100 次(跨模拟"关卡切换"),THEN 公开只读计数器单调不重置(各关同序号图种子互异);WHEN 同期调用任意 `reload()`,THEN 计数器不变(状态线独立)。 -- **AC-5**(每用例先 `reset_diagnostics()`)GIVEN **真实 DifficultyTable schema 构造**的表含行 (1,0)(1,4)(2,0)(2,6),WHEN `resolve(3,3)`,THEN 返回 (2,0) 行且诊断收集器 warning 恰一条(missing_type=both,含请求/结果/类型);WHEN `resolve(3,4)`,THEN warning 不新增(四元组去重键相同);WHEN `resolve(1,4)`,THEN 精确命中且零 warning;WHEN `resolve(99,99)`,THEN 命中 (2,6) 且新增恰一条(去重键含 D*,与首条不同);WHEN 单行表 {(2,0)} 上 `resolve(1,5)`,THEN 命中 (2,0) 且 missing_type=base_ceil(由 R1 分类规则推导:level 分量向上解析恒记 base_ceil)。 -- **AC-5b** GIVEN 真实 DifficultyTable schema 构造的合法表,WHEN `resolve(0, 3)`(level_index < 1)与 `resolve(2, -1)`(node_depth < 0),THEN 测试通道诊断清单各含"请求越域"致命类别一条且不进入解析(EC14 / R1 前置守卫);同用例经游戏通道独立进程复跑,THEN 进程非 0 退出。 -- **AC-6** GIVEN master_seed=-7,WHEN `set_master_seed()`,THEN 归一化为 7 + 诊断收集器 warning 一条,后续种子 ∈ [0, 2^63)(EC6);GIVEN master_seed=INT64_MIN(-2^63),THEN 致命(非 warning;独立进程断言退出码非 0);GIVEN `derive_at` 传入负 scope,THEN debug 断言中止(负值经输出掩码与 scope+2^63 别名)。 -- **AC-7** GIVEN debug 构建 override{"action_economy.ap_per_round"=12}(**域内值**——A3 schema 域 [1,32];原 99 示例出域,2026-09-07 A3 RAP 修订同批修正:R3 ③ 越域 override 会被忽略,99 会使本 AC 假失败),WHEN 经 ConfigDB 读取,THEN effective=12;GIVEN override key 为未知路径、类型或范围与 schema 不符,THEN 诊断收集器 warning + 忽略该条;GIVEN `reload()` 后,THEN .tres 文件内容不变(R3 边界①③⑤)。 -- **AC-8** GIVEN 非 debug 谓词模拟(feature 标签),WHEN `_has_override(key)`,THEN 恒 false——**本条仅证明门存在性**;"release 不加载 override 源"的结构保证验证 deferred→首次 release 导出 checklist。 - -**静态与架构(Rule 1/2/5/7/8)** -- **AC-9** GIVEN D2 文件集(data/schemas、ConfigDB、RngService、tests),WHEN 静态扫描(模式覆盖 `load(`、`preload(`、`ResourceLoader.load`、`"res://data/" +` 动态拼接;`res://tests/fixtures/` 前缀豁免——不在 `res://data/` 扫描域),THEN 无 `randomize()` 调用、无 ConfigDB 之外的 data 表加载(Rule 2/5)。**Rule 5 对全项目玩法代码的扫描登记为项目级 CI 项(Technical Setup 归口)**。 -- **AC-10** 同扫描无 `extends Control/Node2D`、无 `.tscn` preload,**且** AC-1 headless 实跑通过——两项合成判定 Rule 7(扫描是启发式,硬证据是 headless 实跑)。 -- **AC-11** WHEN 请求未知名流或重复注册流名,THEN debug 断言中止(EC12;独立进程退出码非 0)。 -- **AC-12** GIVEN 同帧对同一流连续两次 `open_stream`,THEN 两个互异且顺序确定的种子(EC13)。 -- **AC-13** WHEN 冒烟脚本运行,THEN 反射断言 `SCHEMA_VERSION` 常量存在且 ConfigDB 可读、全部 schema 携带版本字段、进度类表(BoardGen/Enemy/Difficulty)暴露 (level_index, node_depth[, enemy_id]) 键字段、DifficultyTable schema 暴露 `elite_`/`boss_` 前缀预留字段(Rule 8 + Rule 4 键契约 + 第三维命名空间;"高版本拒读"路径 deferred→D3)。 - -**人工与延迟项** -- **AC-14(人工)** Rule 1 数值字面量禁令:启发式扫描(warning 级,误报难免)+ **人工复核三要素**——验收人=owner GDD 回填定稿评审 + 里程碑 gate-check;时机=每次回填定稿;证据=评审记录/gate-check 登记。 -- **AC-15(deferred→B1)** 战斗级可回放:同 master_seed 同动作序列 → 结算步骤流逐行相同(B1 集成测试;D2 阶段无战斗载体)。 -- **AC-16** GIVEN debug 构建且 B1 侧经 `set_reload_gate(true)` 置位(模拟战斗中),WHEN `reload()`,THEN 返回 false、ConfigDB 值不变、不发 `config_reloaded`;GIVEN 门未置位,WHEN `reload()`,THEN 返回 true 且新值经类型化属性可读且 `config_reloaded` 发出恰一次(仅 debug 构建);GIVEN reload 后新表校验失败,THEN 旧表保留、状态停留 Ready(EC16)。 -- **AC-17** GIVEN 未设 master_seed,WHEN `open_stream` 或 `derive_at`,THEN push_error + 冒烟通道断言中止路径(quit 非 0)(EC7)。 -- **AC-18(deferred→首次 release 导出)** release 模板构建下:致命校验错误的表现符合"引擎默认错误路径"预期、override 结构性不存在(R3 边界④、校验双通道 release 侧)。 - -## Open Questions - -1. **headless 测试载体终稿**:MVP 用 `--headless --script` 冒烟(本 GDD 决策);gdUnit4 是否在 Technical Setup 引入并迁移冒烟用例——owner:Technical Setup 阶段(systems-index 门禁增补记录项)。 -2. 编辑器内表文件热重载自动化(当前仅 debug 键触发;低优先)。 -3. 数值表显示名的本地化——D6 归口。 -4. C4 MetaTable 并入 ConfigDB 还是独立 autoload——C4 GDD 定(倾向并入)。 -5. **难度曲线导出工具**(R1 审计的离线载体):headless 导出 resolve 矩阵脚本,C3 期交付——归 C3 GDD 登记排期;**注意排期倒挂**(re-review 登记):BoardGenTable 可推理率曲线自 A1(第 5 位)起回填,A1 定稿前须有临时抽查载体(入 systems-index 门禁记录)。 diff --git a/design/gdd/legacy-2026-09-13/game-concept.md b/design/gdd/legacy-2026-09-13/game-concept.md deleted file mode 100644 index 4a2bbfc2..00000000 --- a/design/gdd/legacy-2026-09-13/game-concept.md +++ /dev/null @@ -1,153 +0,0 @@ -# 游戏概念:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike) - -> 参考《弹珠哥布林》(Peglin):两段式回合循环(小游戏 → 战斗结算)+ 道具跨循环累积(**B4 定稿口径 2026-09-09:战斗域内跨轮次跨图累积、battle_over 全清不跨战斗**——与 Peglin 跨战斗持有不同)+ Roguelike 闯关结构。(**2026-09-11 关内延续裁决改写**:库存改为关卡域——跨战斗延续、关卡末清空/折算;本注记前半作废) -> 我们的区别:小游戏层是"扫雷类推理玩法"(非物理弹珠),玩家 agency 全部前移到战斗前的排雷规划(2026-09-09 注:B4 激活轮末道具使用窗口后,agency 扩展至轮末资源决策——规划前移的主体定位不变)。 - -## 世界观与命名(定稿 2026-09-09;2026-09-12 概念层增补:隐喻换轴 + 惩罚格类型化) - -> **版本注记(2026-09-12 概念层增补,用户拍板;依据记录 `design/research/lore-nest-metaphor-2026-09-12.md` ⑤节六问)**:叙事属名换轴——雷格 = **惩罚格**(对外叙事称呼;机制名"雷/雷格"不变),惩罚格有不同类型,首发地牢类型 = **怪物巢穴**;插旗的玩家可见动词 = **控制**(类型无关;对内文档与机制协议仍为"旗/插旗");连锁展开 = **坍塌显形**;标错惩罚叙事 = **控制失败的失控反噬**(随机读作失控,重复性措辞随 A2 OQ1);宝箱呈现仅绑定可使用道具类奖励;世界观厚度 = 碎片点缀(不含前人日志)。原 2026-09-09 映射(雷 = 地牢陷阱、旗 = 探险者标记的已知陷阱)作废;"陷阱"降级为惩罚格类型词表的一员。本修订为表现层/命名层,不改变任何已锁机制语义、数值与接口(A1–B4、B1、C3 已定稿内容不受影响);惩罚格类型化的机制分化(陷阱→直接扣血、标中陷阱→怪物受伤害、岩浆/冰冻化身等)为**已登记的未来机制侧方向**(与现行"开雷→敌方优势非直接伤害"锁定规则的取舍归 A1/A2 修订裁决),不在本表承诺。 - -**产品名:Dungeon Sweeper**——命名取 minesweeper → dungeon sweeper 的双关:玩家不只是"扫雷者",更是"清扫地牢的人"(清巢者——逐层肃清巢穴侵染、夺回地牢)。"扫雷 × 自动战斗 闯关 Roguelike"保留为品类描述,用作各文档副标题。 - -**背景一句话**:玩家操纵一名地牢探险者,逐层下探一座被怪物巢穴侵染的古代地牢;每一层地牢就是一张"雷图"——惩罚格密布的古老地砖阵,探险者凭数字提示感知惩罚格方位,控制巢穴、搜刮前人遗落物,才能安全下探更深的层。 - -机制 ↔ 地牢隐喻映射(表现层包装,不改变任何已锁机制语义,A1–B3 已定稿数值/接口不受影响): - -| 玩法元素 | 地牢隐喻 | -|---|---| -| 扫雷图 | 地牢的一层(一间被巢穴侵染的厅室;清图 = 肃清本间厅室) | -| 雷 | 惩罚格(叙事属名;含不同类型,首发类型 = 怪物巢穴——惊动即怪物倾巢而出占得先机:伏击/增益,P3 风险同源;巢已空、残址可通行。陷阱/岩浆/冰冻等类型及其机制分化 = 未来方向归机制侧) | -| 旗 | 对惩罚格的**控制**(玩家可见动词,类型无关;对内仍为"旗/插旗")——标中 → 巢穴废置、巢主失庇护(怪物 debuff);标错 → 控制失败、反噬流向不可控(措辞细则随 A2 OQ1);"封印/镇/反制"为类型风味词;视觉形态换皮归 art-bible | -| 小人 | 地牢探险者 | -| 清图 | 本层探明、搜刮前人遗落物完毕(清图奖励),下探更深 | -| 关卡推进 | 不断下探更险的层(P4 支柱) | - -- 首发 biome = 地牢(与 A1 BoardGenTable 参考行占位值 `{"dungeon"}` 一致;biome 词表定稿权仍在 B4/C1+AD,此处仅为方向背书) - -## 目标受众(定稿 2026-09-06) - -- **核心受众**:策略推理玩家 × Roguelike 构建玩家的交集——喜欢杀戮尖塔/小丑牌的构筑决策,喜欢扫雷/数独的纯逻辑掌控感 -- **次级受众**:Peglin 玩家中觉得"弹珠太看脸"的群体;怀旧扫雷玩家中寻找进化的群体 -- **平台**:PC(Steam)先行;回合逻辑玩法,对配置无要求 -- **单局预期**:一场冒险 20–40 分钟,单关卡 5–10 分钟——碎片时间可完成一场战斗 - -## 视觉身份锚(Visual Identity Anchor,定稿 2026-09-06) - -**一句话视觉规则:地形是氛围,数字是主角——一切视觉服务"信息可读"而非"场景华丽"。** - -支撑原则: -1. **数字可读性硬指标优先于氛围**:暗色地牢底色上的数字必须达到高对比(具体色值在 art-bible 定),任何纹理不得干扰数字辨识 -2. **变异格形状+颜色双通道**:迷雾/岩浆/冰冻等变异不能只靠色相区分(色弱可用性),必须绑定图标或形状冗余 -3. **绘制优先级固定**:数字 > 小人标记 > 旗子 > 变异纹理 > 底色——小人与旗不得遮挡数字(小人所在格用边框高亮而非覆盖文本) -4. **调色板交换优先于新增资产**:关卡/biome 换皮优先做色板变体,控制个人开发资产成本;A1 棋盘生成须预留 biome/tag 数据字段 -5. **格子 = 地牢地砖(2026-09-09 用户定稿)**:扫雷格子的美术基底做成地牢一格一格的石砖/地砖样式(候选表现:未开 = 覆尘完整地砖、已开 = 碎裂/裸露地面、雷 = 被惊动的巢穴/崩塌的巢址【2026-09-12 隐喻换轴增补:原"触发的陷阱机关"为旧称;候选词与已定的"坍塌显形"连锁叙事对齐】);具体形态由"格子样张测试"定稿,样张仍以数字可读性为第一验收项(早期风险第 1 条不变);与原则 4 衔接——不同 biome = 同款地砖的不同色板 - -早期风险登记(详见 art-bible 任务): -- 扫雷数字可读性 × 地牢暗色氛围的冲突 → 需一次格子样张测试定风格 -- 格子信息密度:小人/旗/数字/变异同格叠加 → 按上述优先级规则处理;小人移动路径预览的表现归属在 D1 GDD 解决 -- **双舞台资产管线陷阱**:战斗发生在棋盘上还是独立场景,是 B5 最大的成本变量 → 必须在 B5 GDD 前的"战斗表现美术测试"(一屏样张)中锁定 - -## 术语层级(定稿 2026-09-06) - -| 术语 | 定义 | -|---|---| -| **存档** | 元进度。所有"冒险"都在某个存档内进行。存档内可用代币解锁天赋等永久提升 | -| **冒险** | 开启进入的一次完整游戏(run)。包含多个"关卡"。死亡则冒险结束(Roguelike) | -| **关卡** | 冒险内的一个大节点。有一个关底 Boss。完成关卡 → 获得"冒险"内大奖励 + 解锁天赋用的"代币" | -| **战斗** | 关卡内移动时碰到非奖励点触发。一次完整的战斗遭遇,包含若干个"轮次"和若干张"扫雷图" | -| **轮次** | 战斗内的原子回合单位。玩家用本轮 AP 在扫雷图上挖掘 → 轮次结束 → 自动战斗结算。敌人未全灭且主角存活 → 下一轮次 | -| **扫雷图** | 跨轮次延续的棋盘状态。AP 用完但未开完 → 下一轮次继续同一张图(AP 重置,棋盘状态保留)。全部安全格开完 → 清图奖励 → 结算后换新图 | - -### 对应关系(定稿) - -``` -存档 ⊃ 冒险 ⊃ 关卡 ⊃ 战斗 ⊃ { 轮次 ×N , 扫雷图 ×M } -``` - -- 战斗 : 轮次 = 1 : N —— 敌人未全灭且主角存活则继续 -- 扫雷图 : 轮次 = 1 : N —— 一张图跨越多个轮次,直到开完 -- 战斗 : 扫雷图 = 1 : M —— 每次清图后换新图,战斗内可经历多张图 - -## 轮次流程(定稿) - -1. **挖掘阶段**:用本轮 AP 开格/标旗(棋盘为延续的旧图或刚换的新图) -2. **轮次结束**(三种方式任一触发): - - AP 用完(图未开完 → 下轮继续这张图) - - 主动停手(剩余 AP 1:1 转存 RAP 池——攒满可刷新雷图的风险退出资源,**不作战斗资源**【2026-09-07 A3 RAP 修订,原"折算战斗资源"作废】;图未开完 → 下轮继续这张图) - - 图开完 → 清图奖励(剩余 AP 作废不折算【同日修订】;下轮换新图) -3. **自动战斗结算**:每轮结束时都结算一次;开过的雷在此时兑现敌方优势 -4. **判定**:敌人全灭 → 战斗胜利;主角死亡 → 战斗失败;否则 → 下一轮次 - -## 核心循环 - -``` -存档(天赋/代币) - └─ 冒险(run,死亡即终) - └─ 关卡(节点地图移动,Boss 收尾) - └─ 战斗(碰到非奖励点触发) - └─ 轮次 ×N(敌未灭/己未亡则继续) - └─ 扫雷图(有限 AP 挖掘) - ├─ 安全格 → 增益/道具(多为限时或一次性) - ├─ 雷 → 敌方获得优势(伏击/增益) - └─ 全部安全格点开 → 图完成 → 自动战斗结算 -``` - -## 扫雷层规则(当前共识) - -- **开格消耗 AP,连锁展开(flood fill)免费**;每轮 AP 固定(原型 v2 起 8 点,v1 的 12 点被测评为太多) -- **行动经济统一(v3,2026-09-07 A3 RAP 修订)**:插旗消耗 1 AP(**旗子上限取消**——旗为棋盘标记、数量不限,稀缺性由 AP 机会成本承载【原"每轮 4 面、每轮重置"作废】),仅限小人相邻格;拔旗移除标记、不返还 AP -- **标雷判定(v3,2026-09-07 三向效果定稿)**:轮次结算时统一判定——**标中雷 = 怪物获得 debuff(削弱)**(与"安全格→主角 buff、踩雷→怪物 buff"构成三向效果映射);一次性兑付、兑付资格以**雷格实例为键**(每雷本次战斗至多兑付一次,资格随首次兑付消费)、拔旗重插同一雷格不恢复资格、禁止逐轮重复兑付(A3 OQ5/F1 条款 2:debuff 档位锚 = 严格 > 最低档安全格 buff 当量,且以连锁放大的边际挖掘收益为对照基准——2026-09-07 三轮评审改定);标错暂无惩罚(候选惩罚:敌方伏击+1 等,待验证后决定;该惩罚兼具旗滥用定价职责,见 A3 OQ2) -- **小人控制(v2,参考 Microsoft Minesweeper Adventure 模式)**:棋盘上有小人,点击已开格=移动(免费,BFS 限已探明区);挖/插旗仅限小人 8 向相邻格。边缘探索的地牢氛围已被用户认可 -- **初始安全区**:每张图开局 3×3 无雷自动展开,小人出生于此(初始展开无奖励) -- **可随时停手**:剩余 AP 1:1 转存 RAP 池,攒满(默认 8)可刷新雷图(不给清图奖励)——"是否承担盲猜风险"是策略点【2026-09-07 A3 RAP 修订,原"转化为战斗资源"作废】 -- **奖励统一结算**:扫雷阶段奖励只入库(含治疗包),轮次结束进入独立战斗结算画面逐行生效(正式版将替换为战斗动画) -- **安全格 = 增益/道具**:减伤、增伤、范围伤害等;**有回合限制甚至一次性**(稀缺性来源) -- **雷 = 敌方优势**:开到雷不是死亡,而是敌人获得增益/伏击——风险与收益同源 -- 扫雷图非基础版:**地形变异**(迷雾区无数字、岩浆格等)+ **辅助道具**(探测、安全旗等) - -## 难度与惩罚机制(按层级) - -**难度不随战斗数增长,而是随关卡进程增长**:难度 = f(关卡序号, 节点深度, 精英/Boss 修饰) - -| 层级 | 惩罚/压力机制 | 说明 | -|---|---|---| -| 轮次内 | 开雷 → 敌方结算时获得优势 | 扫雷失误的代价,当场兑现 | -| 战斗内 | 轮次越多,敌方结算出手越多 | 长战斗的自然代价(己方 HP 消耗);单张图拖太久 = 敌人多结算但旧图剩余收益仍在,形成"续挖 vs 清图换新"决策 | -| 关卡内 | 节点越深越难;精英节点相对更难 | 越接近 Boss 越危险,精英给更高收益对冲 | -| 关卡间 | 下一关基础数值+新地形变异 | 变异种类随关卡解锁(普通数字 → 迷雾 → 岩浆/冰冻) | -| 冒险间 | 死亡重开,天赋追赶 | 元进度:代币解锁永久提升 | - -## 与 Peglin 的对比要点 - -- 玩家技巧:物理瞄准+概率赌博 → **信息推理+风险承诺** -- Agency 位置:战斗内 → **全部前移到排雷规划** -- 不确定性来源:弹射混沌 → **隐藏信息推理缺口** -- 核心情绪:老虎机开闸爽感 → **"我算对了"的掌控感 + 规划兑现的延迟满足** - -### 已识别的风险(原型验证目标) - -1. 自动战斗沦为无聊过场 → 兑现层必须可见、有反馈 -2. 扫雷后期纯猜格子 → 用地形变异和道具缓解"死局感" -3. 一格一格点节奏慢 → AP/连锁/停手机制压缩决策带宽 - -### 创意风险登记(2026-09-07,CD 门禁) - -1. **安全格奖励的可预期性**(P2 规划的前提):若道具掉落纯随机且不可见,玩家无法提前形成"我要去拿 X"的规划,"规划的延迟兑现"退化为探索惊喜 → B4/A4 GDD 落实奖励类型可见性或探测机制。**【2026-09-09 B4 评审口径注记】结构前提已落地**(奖励身份 install 期预分配 + 已开格/库存恒读 + 每格必有货 + 雾档先验——B4 Rule 2/8/F1/F2);**MVP 呈现面 = 已开格 + 库存,面向特定道具的寻路未兑现**——待 A5 探测道具/呈现深度(B4 OQ2,垂直切片);本风险维持 OPEN(结构前提落地 ≠ 风险闭合) -2. **"我算对了"缺高光兑现节点**:现有设计只有避损(雷→敌方优势)与常规奖励,缺"完美排雷"的爆发结算(候选:全图标中/零误标清图加倍结算)→ B1/B4 GDD 设计该兑现节点 -3. **chord 缺席的兑付节拍缺失**(2026-09-07 A3 评审登记):本作有意不做经典扫雷的 chord(双击快开),正确标雷后的即时大片兑现节拍随之缺席(标中旗兑付只剩当轮 debuff)→ 候选高光补偿与 #2 合并归 B1/B4 设计 - -## 可证伪假设(概念原型要回答的) - -> 如果玩家通过扫雷决策为自动战斗获取道具,他们会感受到"每一步排雷都在影响战斗结果"的策略联动感。 -> 验证信号:玩家在扫雷阶段主动规划目标(连续 3 轮中至少 2 次主动改变扫雷策略去拿特定道具),并主动想进入下一轮。 -> 【2026-09-09 MVP 口径注记(B4 评审)】未开格身份不可见(B4 Rule 8),"拿特定道具"的寻路决策待 B4 OQ2/A5 兑现后方可作为有效信号——MVP 期以"往雾区推进/囤刀待机/叠层满载后收手"类规划行为代观测,防止把缺失功能误判为设计失败。 - -## 待定问题 - -- [x] 扫雷后奖励的主动道具(影响战斗结算):**MVP 激活**(2026-09-09 B4 定稿,用户拍板——轮末结算前"道具使用窗口"玩家选用;use_timing 字段从预留转承重,MVP 单值 pre_settlement,扩枚举走 B4 修订;原"后续版本加入"作废) -- [x] 己方限时增益:**跨轮次延续(按剩余结算次数),不跨战斗**(定稿 2026-09-06) -- [x] 旗子:**无上限**,旗为棋盘标记不占轮次资源,稀缺性由 AP 价目承载(2026-09-07 A3 RAP 修订定稿;原"每轮重置 4 面"作废) -- [x] 停手/清图时剩余 AP 的去向:停手 1:1 转存 RAP(刷图风险资源)、清图作废——**折算乘数(×2/×1)整体作废**(2026-09-07 A3 RAP 结构修订;效果侧健康由 A3 F1 契约约束,OQ3 留 playtest 复核) -- [ ] **标错惩罚**(v3 遗留:现无惩罚;候选:敌方伏击+1~~ / 旗子数量减半~~——后者随 2026-09-07 旗上限取消作废)——在 A2 GDD 前用原型小补丁实测后关闭(CD-SYSTEMS 门禁补登记;兼具旗滥用定价职责,见 A3 OQ2) -- [ ] 关卡内节点地图的形态(线性/分支)——C1 GDD 解决;候选已登记(2026-09-09 用户提出):**四方格步进式前进**——关卡内地图为格网,每步从相邻四格中选一格推进(与地牢隐喻同构);C1 设计顺序第 14 位,此项可后置 -- [ ] 反雪球机制——MVP 不做,Alpha 用测试数据决定(C3 GDD 需先决定"每胜一场敌方成长"这一正雪球源的去留) diff --git a/design/gdd/legacy-2026-09-13/game-pillars.md b/design/gdd/legacy-2026-09-13/game-pillars.md deleted file mode 100644 index 494bb944..00000000 --- a/design/gdd/legacy-2026-09-13/game-pillars.md +++ /dev/null @@ -1,29 +0,0 @@ -# 游戏支柱(Game Pillars) - -> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike)· 定稿:2026-09-06 -> 来源:`game-concept.md` 概念定稿 + 概念原型 v1→v3 验证结论 + CD-SYSTEMS 门禁意见 -> 用途:所有 GDD 的评审尺度——每条设计决策必须至少服务一条支柱;与支柱冲突的设计默认砍掉 - -## P1 推理的掌控感 —— "我算对了" - -每一格挖掘都应该基于可推导的逻辑,而不是运气。生成端必须保证可推理率(A1 GDD 定最低门槛),后期"纯猜"局面用变异与道具缓解。这是本作与 Peglin(概率赌博)的根本区别。 - -**裁剪判据**:一个设计若让玩家频繁进入"无法推理只能赌"的状态,即违反本支柱。 - -## P2 规划的延迟兑现 —— 扫雷的因,战斗的果 - -扫雷阶段的每个决策(挖哪里、标哪面旗、何时停手)都在战斗结算中可见地兑现。兑现必须**可归因**:结算明细标注来源(伤害道具 / 安全格增益 / 标中旗削弱 / 清图奖励 / 雷→伏击;【2026-09-07 A3 RAP 修订】原"停手折算"来源作废——停手改产 RAP 风险资源,不再进战斗结算),MVP 就要做到,不等战斗动画。 - -**裁剪判据**:若玩家无法说出"这个结果是我哪步扫雷带来的",即违反本支柱。 - -## P3 风险与收益同源 —— 雷既是敌人的武器,也是你的赌注 - -开雷喂给敌人伏击(代价),标中雷削弱敌人(收益)【2026-09-07 三向效果定稿:标中旗 = 怪物 debuff】,危险区域的安全格价值更高。所有风险机制都从这个同源原则派生,不引入第二套随机惩罚。 - -**裁剪判据**:一个风险若与"雷/未知格"无关,需强理由才可保留。 - -## P4 地牢下探的探险氛围 —— 边缘探索,越深越险 - -小人从初始安全区向雷图边缘探索(Microsoft Minesweeper Adventure 式的地牢感),关卡推进 = 不断下探更险的层。视觉、音频、地图结构都服务这个隐喻。产品命名本身承载本支柱:**Dungeon Sweeper**(2026-09-09 定稿,minesweeper → dungeon sweeper 双关;世界观与机制隐喻映射见 game-concept"世界观与命名"节)。 - -**裁剪判据**:任何让棋盘体验退化为"平面对话框"的表现层简化,需评估对氛围的伤害。 diff --git a/design/gdd/legacy-2026-09-13/systems-index.md b/design/gdd/legacy-2026-09-13/systems-index.md deleted file mode 100644 index 82aaa246..00000000 --- a/design/gdd/legacy-2026-09-13/systems-index.md +++ /dev/null @@ -1,284 +0,0 @@ -# 系统索引(Systems Index) - -> 项目:Dungeon Sweeper(扫雷 × 自动战斗 闯关 Roguelike) -> 生成:2026-09-06 · 分解来源:`design/gdd/game-concept.md`(概念定稿)+ `docs/prototype-report-minesweeper-battle-concept.md`(原型 v3 验证结论;demo 代码已于 2026-09-12 删除) -> Review mode:lean(TD-SYSTEM-BOUNDARY / PR-SCOPE / CD-SYSTEMS 门禁按 lean 跳过) - -## 系统枚举(20 个) - -### A. 核心玩法层(扫雷侧) - -| ID | 系统 | 来源 | 说明 | 里程碑 | -|---|---|---|---|---| -| A1 | 扫雷棋盘生成 | 隐含 | 布雷、初始安全区、变异布置、按难度参数生成 | MVP | -| A2 | 排雷玩法规则 | 显式 | 小人控制、挖/旗/移、连锁展开、数字提示 | MVP | -| A3 | 行动经济 | 显式 | AP(每轮重置)、RAP 池、旗子(无上限)、停手/清图/耗尽三出口 | MVP | -| A4 | 地形变异 | 显式 | 迷雾/岩浆/冰冻等变异清单与交互规则 | MVP | -| A5 | 扫雷辅助道具 | 显式 | 探测、安全旗等;获取与使用规则 | 垂直切片 | - -### B. 战斗层 - -| ID | 系统 | 来源 | 说明 | 里程碑 | -|---|---|---|---|---| -| B1 | 战斗结算规则 | 显式 | 伤害公式、结算顺序、胜负判定 | MVP | -| B2 | 敌人系统 | 隐含 | 敌人类型/词条、目标选择规则 | MVP | -| B3 | 增益/状态系统 | 显式 | buff 时限、叠层、衰减时机 | MVP | -| B4 | 奖励与道具经济 | 显式 | 奖励表、道具池、权重数值、拆弹奖励 | MVP | -| B5 | 战斗表现 | 隐含 | 结算画面 → 战斗动画、伤害数字 | 垂直切片 | - -### C. 结构与成长层 - -| ID | 系统 | 来源 | 说明 | 里程碑 | -|---|---|---|---|---| -| C1 | 关卡节点地图 | 显式(形态待定) | 关卡内移动、遭遇点/奖励点分布;形态候选已登记(2026-09-09):四方格步进式前进——格网地图、每步从相邻四格选一格推进,可后置 | 垂直切片 | -| C2 | 冒险结构 | 显式 | 关卡序列、关卡大奖励、失败重开 | 垂直切片 | -| C3 | 难度曲线与精英/Boss | 显式 | 数值成长、精英图/Boss 图全局变异 | 垂直切片 | -| C4 | 元进度(存档/天赋/代币) | 显式 | 存档结构、天赋树、代币经济 | Alpha | - -### D. 表现与支撑层 - -| ID | 系统 | 来源 | 说明 | 里程碑 | -|---|---|---|---|---| -| D1 | HUD 与界面框架 | 隐含 | 棋盘/队伍/日志/结算的 UI 容器(简版) | MVP | -| D2 | 数据配置与数值表 | 隐含 | 硬编码参数迁移为可调配置 | MVP | -| D3 | 存档序列化 | 隐含 | 元进度持久化框架 | Alpha | -| D4 | 音频 | 隐含 | 挖掘/踩雷/结算/胜利反馈 | Alpha | -| D5 | 教学引导 | 隐含 | 小人三动作 + 两层循环教学 | Alpha | -| D6 | 设置/本地化 | 隐含 | 常规打磨项 | 完整愿景 | - -## 依赖分层 - -| 层 | 系统 | 依赖 | -|---|---|---| -| 1 Foundation | A3, A4, B3, D2, D3, D6 | 无 | -| 2 Core | A1 ← A4,D2 · A2 ← A1,A3,A4 · B2 ← D2 · B4 ← D2(2026-09-09 B4 定稿收窄:原"A2,B3,D2"——A2 事实经 B1 转化零直接接口、B3 为验收锚关系非运行时边,见 B4 Dependencies 修订注记) | Foundation | -| 2.5 | **A5 ← A2,A4,B4**(辅助道具:依赖排雷规则与变异定义;奖励获取侧挂 B4) | Core | -| 3 Feature | B1 ← A3,B2,B3,B4,D2 · C2 ← C3,D2 · C3 ← D2,B2 · C4 ← D3,C2,D2 · C1 ← C2,C3,B2,B4 | Core | -| 4 Presentation | D1 ← A2,A3,B1 · B5 ← B1,D1 | Feature | -| 5 Polish | D4 ← A2,B1 · D5 ← A2,A3,B1 | Presentation | - -- **循环依赖:无**。全项目唯一允许的回边:A2 只外发事件(`cell_revealed` / `round_end` / `flag_judged`),B4/B1 订阅后回调——A2 不依赖任何人(TD-SYSTEM-BOUNDARY 定) -- **D2 接口依赖边补全(2026-09-07 re-review)**:B4(reward_roll 流)、B1(set_reload_gate 调用)、C2(master_seed 接线)、C4(MetaTable 消费)四条对 D2 的边已补入上表——此四者为 API/接线级依赖,非纯数据读取;其余系统的数据读取为事实依赖,不逐条列边(完整清单见 `design/gdd/d2-data-config.md` Dependencies 表) -- **C3←A1 方向说明**:C3 仅依赖 A1 的**配置 schema**(类型依赖);难度参数经编排器/D2 传递给 A1,禁止 C3 反向调用棋盘生成 -- **瓶颈系统(设计需一次定稳)**:A2 排雷玩法规则(B4/D1/D5 挂其事件)、B1 战斗结算(B5/D4/D5/C3 消费其输出)、D2 数据配置(全员依赖) -- **叶子系统(可晚设计)**:C1、C4、D4、D5、D6 - -## 门禁修正记录(2026-09-06,CD/TD/PR/AD 四总监 CONCERNS 汇总落实) - -- **B2 扩为"战斗单位系统"**:主角与敌人共用受伤/死亡接口;含**雷触发的敌方优势词条(伏击清单)**与**敌方意图可见性规格**(身份承重项,CD 门禁) -- **B1 GDD 须含"轮次生命周期编排"独立章节**(round_end 事件 → 结算 → 判定 → 重置/换图的 owner);输出契约为**可回放步骤流**(结算逻辑内禁止 await/动画);MVP 验收含结算明细来源标注(伤害道具/安全格增益/标中旗削弱/清图奖励/雷→伏击;~~停手折算~~ 已随 A3 RAP 修订作废——停手改产 RAP、退出战斗结算) -- **A1 GDD 须含**:可推理率生成参数(P1 支柱的生成端保障)+ biome/tag 数据字段(AD 门禁换皮约束) -- **A4 MVP 范围收窄**:变异框架 + 迷雾(岩浆/冰冻等无 MVP 容器,随关卡解锁归垂直切片后) -- **B2 MVP 范围收窄**:1–2 种敌人 + 少量词条(名录扩展归垂直切片/Alpha) -- **D2 GDD 策略**:只定 Resource schema + autoload 注册表 + 校验模式,数值表留空位随各系统 GDD 回填;**数值表结构第一天就带关卡序号/节点深度维度** -- **工程债登记**:Core 层必须可 `--headless` 跑完整战斗(不引用 Control/UI);RNG 种子服务归 D2(Foundation);已引爆雷格可通行、治疗不溢出等细节规则写入对应 GDD -- **AD 项**:B5 GDD 前插入"战斗表现美术测试"(一屏样张锁定角色剪影/动画方案/战斗空间);临时 SFX 从 D4 拆出挂垂直切片里程碑 -- **流程债已清**:game-pillars.md 已建(4 支柱);概念文档已增补 Visual Identity Anchor + 目标受众;原型 REPORT.md 已归档(PROCEED) - -## 门禁增补记录(2026-09-07,Concept → Systems Design 重审 CONCERNS 落实) - -> 完整报告:`production/gate-checks/gate-check-systems-design-2026-09-07.md` · 判定 CONCERNS(无阻塞),stage.txt 已写入 - -- **A2 前置**:标错惩罚(v3 现无惩罚)用原型小补丁实测后关闭;可与原型 v3 终验合并为一次会话(CD/PR 门禁) -- **art-bible 排期**:最晚在 D1 GDD(设计顺序第 10 位)前创建(至少 §1–4),"格子样张测试"(数字可读性定风格,game-concept 早期风险登记第 1 条)并入执行;垂直切片门禁硬性要求 art-bible(AD 门禁) -- **B4 GDD 须预留**道具 schema 的"使用时机"字段(主动战斗道具后续版本加入) -- **D1 GDD 须解决**"小人移动路径预览"的表现归属(来源:game-concept 视觉锚风险登记) -- **D2 GDD"校验模式"章节须定** headless 测试载体(`--script` 冒烟 vs gdUnit/GUT);**B1 GDD"轮次生命周期编排"章节须定**事件总线载体(autoload 单例 vs 直连)(TD 门禁) -- **C3 GDD 需定稿**"C3 是否消费 B1 输出"(依赖表 C3 ← D2,B2 与瓶颈注记口径不一)并回写本索引(TD 门禁,可延后) -- **创意风险登记**(CD 门禁,详情见 game-concept"创意风险登记"节):安全格奖励可预期性(P2 前提)→ B4/A4 落实;"我算对了"高光兑现节点 → B1/B4 设计 -- **垂直切片前置**:按预注册验证信号做一次正式 playtest(与标错惩罚实测合并)(CD 门禁) -- **A3 下游经济契约**(2026-09-07 A3 二轮评审登记,同日 RAP 结构修订改写,三轮评审增补条款⑤并钉死闭合 owner):B1 GDD 须承接并验收——① **效果档位对照表**:安全格 buff / 标中旗 debuff / 清图奖励 / 敌方增益统一当量、单一线性换算(分源改率须回 A3 重议);② 标中旗 debuff 档位锚:**严格 >** 最低档安全格 buff 当量,且以**连锁放大的边际挖掘收益**为对照基准(provisional 1:1)、每战标中旗总吞吐由 B1 对账;③ **挖掘风险不等式**:P(安全)×buff 当量下界 > P(雷)×敌方增益当量上界(锚 A1 可推理率参数 × B2 惩罚上限表值,**B1 单一闭合 owner**,B1 GDD 强制检查点);④ 清图奖励 > 0 且预留**按图类型(biome/tag)差异化分支**的结构位(B4 表设计,A3 只上报 cleared;图类型战斗域恒定、不逐图重掷,A1/B4 共同验收);⑤ **清图 vs 弃图刷新支配性**:清图奖励下界使"推到底清图"期望当量 ≥ "确定格挖完即弃图刷新"期望当量(B1 闭合对账,强制检查点——该环与 A1 可推理率反向耦合,是 P1 失败模式的经济对冲)。**request_refresh 契约**:玩家经 D1 发起、B1 结算编排期代理调用(B1 接口须含玩家意图路径,禁止 RAP 满自动刷);刷新成功后回发 `new_board` 为契约义务,未刷新的 stopped/ap_exhausted 轮回发 `new_board` = B1 违约 fail-fast。**【2026-09-12 D4 修订作废】refresh 前移挖掘期(Active 相位受理、B1 `refresh_board` 编排、无结算段无 round_end、每轮上限 2);new_board 回发义务仅限 cleared 轮,stopped/ap_exhausted 恒 same_board——现行契约见 A3 Rule 11 / B1 AC-29/AC-30 / registry `rap_rules` 与下方 2026-09-12 修订登记块】**round_end 双发射源**已登记:A2 外发棋盘路径、A3 直发停手路径(payload 同构);EC4"先停后挖"批次仲裁 deferral 至 A2 集成测试,**义务清单**:{cleared×stopped、stopped×ap_exhausted} × 两到达序共四组合 + RAP 记账随胜出 path_tag(批次 cleared 胜出 → 剩余 AP 作废不入 RAP)。B4 GDD 侧:标中旗一次性兑付、**资格以雷格实例为键**(A3 OQ5,三轮改定——拔旗重插不恢复已消费资格)+ 清图奖励插槽。D1 GDD 侧(三轮增补):RAP 战斗末清零可见反馈。原"stop_multiplier 不等式①②"随停手折算作废而删除。 - -## 门禁增补记录(2026-09-08,B3 定稿登记) - -> B3 GDD:`design/gdd/b3-status-effect.md`(Designed,待 /design-review)· registry 已登记 `status_effect` 条目 · D2 StatusEffectTable 已回填(接口漂移规则) - -- **B1×5 义务清单(B1 GDD 门禁评审逐项核对落位,缺项即 blocking——A4 对 A1/A2 登记先例)**:① 同轮多授予按确定次序调用 apply_effect(EC3 溢出归因依赖)② 事实→授予恰一次转化(EC6——B3 是 dumb 账本不去重)③ percent→乘数换算方向与合成值地板成文(EC7/F2——weaken AP 界 −200%/表界 −400%、defense_up 顶点 −100% 三例)④ 最后一轮 decay 判定(F3/A3 EC8 同款;battle_end 全清兜底)⑤ F1 条款 1 效果档位对照表以 B3 实例为对照实物 -- **🔴 weaken 锚预警(B1 强制检查点输入,registry status_effect.anchor_warning 已登记)**:weaken(−25%×d1)vs A3 F1 条款 2 锚(debuff 当量严格 > 最低档安全格 buff 当量)两独立线性代理同向预检不过(25 vs 100;≈1 vs ≈4)——B1 对照验收优先裁决;坐实违反则上调 magnitude 或 B4 重定参照,接口漂移回写 registry -- **A3 OQ5 收编注记(用户 2026-09-08 拍板)**:"标中旗 debuff 档位归 B4 表设计"修订为——四行 MVP 初值**定稿权归 B3**(已定稿),**锚验收权仍归 B4/B1**(条款 2 + A4 三定价硬约束引用的"最低档安全格 buff 当量"以 attack_up 行为参照对象);A3 GDD(Approved)不改,以本条 + registry ownership_note 为准。**【2026-09-09 B4 评审迁移注记 → 2026-09-11 回迁】**:参照对象曾迁 defense_up 当量(attack_up 时为死行)——2026-09-11 用户裁决"基础攻击恒存在"(HeroTable.atk 域 [1,999]、0 加载拒绝、MVP=6)后 **attack_up 复活,参照对象回迁 attack_up 当量**(消费面 = 主角战斗段先手攻击——B1 GDD 同批增补);本条"attack_up 行为参照对象"字样恢复现行,迁移期结束(历史见 registry status_effect.anchor_warning 回迁注记;C3 首次调参时按 attack_up 口径复算条款 2 预检) -- **EC8 reload gate B1 侧落点(qa-lead 缺口登记,2026-09-09 B4 定稿时错号修正:原记"EC9"——D2 实际编号为 EC8)**:set_reload_gate 置位/复位的真实调用方唯一落点 = B1——B1 GDD 须承载"战斗中真的被置位"的验收(D2 AC-16 只测门机制);防 gate 半句永久零落点 -- **ambush 量纲**:flat "+3" 的单位归 B2 定稿(候选"每颗已开雷伤害加成";联动 F1 条款 3 上限表值,B2 GDD 验收项) -- **B4 三项**:① 首个 refresh/independent 内容行上线时补真实内容行冒烟 AC + 夹具探针退役(B3 EC4/OQ3)② clear_reward 源授予路径确认(source=clear_reward,条款 4 插槽)③ weaken/attack_up 锚验收(条款 2) -- **StatusEffectTable 回填完成**:schema 8 字段 + Rule 4 豁免(定义表键=effect_id)+ 四行 MVP;悬空引用政策 = B4 首引时补校验(B3 EC2);D2 Core Rules 表行与 Status 行已同步回写 - -## 门禁增补记录(2026-09-09,A1 定稿登记) - -> A1 GDD:`design/gdd/a1-board-generation.md`(Designed,待 /design-review)· registry 已登记 `board_gen_table` 条目 + action_economy.referenced_by 增 A1 · D2 BoardGenTable 已回填(接口漂移规则) - -- **A2 双包含回验(A2 GDD 门禁评审缺项即 blocking)**:① A2 实际展开域 ⊆ A1 排除域(既有)② **A1 求解器初始态 ⊆ A2 实际初始展开域**(F1 注记④度量保真对偶——新增;若 A2 定稿展开更小,A1 回退出生 3×3 最小态口径) -- **B1 强制检查点输入口径(登记 B1 GDD)**:条款 3/5 对账消费 **actuals 分布(F4 报告 C 的 p10)而非 inferability_target 参数**——"拿参数当事实"对账空心化防御;fog_burden_ratio(付费格分母)= 条款 5 精确口径;attempt 边界非 scope 事件(B1 编排注记);inferability vs P(安全) 措辞登记 registry(非同义词——生成端结构性上界代理之占比形式) -- **F4 全量批量工具排期(qa-lead G7)**:调参期红线工具(N=256/行)owner = A1 交付物 / C3 消费——**与 D2 OQ5 曲线导出工具同批登记**(排期倒挂:A1 定稿→首行数值回填→即需抽查;临时载体 = 冒烟缩样 AC-6/10,统计意义有限) -- **参考行 provisional 声明**:BoardGenTable MVP 参考行(L1/L2)仅 schema 自洽性证明——曲线数值归 C3 调参所有权,禁止作为平衡事实引用;参考行 biome 占位值 {"dungeon"} 待词表 owner(B4/C1+AD)定稿替换(A1 OQ4) -- **黄金图回归向量协议**:五类手工核验小板 + 整数对比对 + 逐格信息源推导记录入版本库;换 solver_rules/信息源/metric_version = GDD 修订 + 向量重制(推理域冻结的行为侧兑现);**A1 /design-review 时安排手工推导第二人复核**(OQ5) -- **度量独立入口分解面(qa-lead G1,A1 实现契约条款)**:推理器/F3 度量/合法性谓词三入口暴露为独立纯函数(与内嵌调用同一实现)——实现期 ADR 确认;若不暴露,AC-7/8/9/12 单元腿降级重议 -- **A2 前置偏离登记(2026-09-09 用户拍板)**:门禁原要求"标错惩罚用原型小补丁实测后再写 A2 GDD"(2026-09-07 CD/PR 门禁;候选 = 敌方伏击+1;兼任 A3 OQ2 旗滥用定价职责)——现改为**标错惩罚以 OQ 形式登记进 A2 GDD**(候选方案与实测义务随 OQ 保留,不阻塞设计),偏离理由:实测依赖 playtest 会话、先推进设计主链;A2 /design-review 时须核对该 OQ 在位 -- **A1 full 评审终态(2026-09-09,用户拍板放行)**:8 blocking 同日核销(P1 两项达标判据 + target 域 [0.85,1] 绝对锚 / 雾占比上限 0.25 / F2c 成本闸 + 禁墙钟 / 雷数取整与布雷钉死 / F2≡Schema 合流 / AC-6(a) 芯环改写 / AC-11 前提腿 / 断言 B 收紧达成区占比)+ 第三轴登记约定(Boss=Dmax 行、elite_/boss_ 命名空间预留、OQ6 重审门)。**新登记下游承接项**:① EC5 零合法板玩家侧诚实呈现(提示/补偿/回退)→ B1/D1 域;② EC5 运行期熔断(同 (L,D) 连续降级/非法 → 确定性回退已知好种子)→ 实现期 ADR(OQ2 关联)。D2/registry 接口漂移已同步;recommended 9 项留档 A1 日志 - -## 门禁增补记录(2026-09-09,B3 full 评审登记) - -> B3 GDD full 评审:NEEDS REVISION(7 blocking),同日核销——日志 `design/gdd/reviews/b3-status-effect-review-log.md`。修订摘要:enemy 侧**单敌假设入文**〔用户拍板〕· B1 义务 5→8 · D1/B5/D5 呈现义务清单登记 · AC-15 机制更正 + reloaded 根全清单规格 · 致命夹具补根〔dup_key〕· AC-18 随 registry 逐字段键重构 · weaken 红警补修复空间不对称 + OQ1 归一口径前置 · stack-不重置 R 登记 OQ7 playtest 证伪项。 - -- **B1 义务清单 5→8(B1 GDD 门禁评审逐项核对落位,缺项即 blocking;①–⑤ 为 2026-09-08 原清单)**:⑥ **每结算编排恰一次 decay_round**(decay 基数=1 是 dur=1 一次性语义与全部衰减语义的先决条件;Active 相位 double-decay 在 B3 侧无守卫,信任 B1 编排)⑦ **结算明细按授予流水逐条标注来源**(F1 合并坍缩归因的兑付面补偿——合并实例只持首授 origin_cell/round_index)⑧ **“溢出未生效”行进结算明细协议**(Rule 5 后半承载;呈现归 B5/D1) -- **D1×4**:① HUD 常显 + EC12 空态规格定稿(隐藏栏 vs 空槽由 D1 裁决但须成文)② effect_id→icon 映射键契约(art-bible 形状+色相双通道)③ 有利/有害极性呈现映射(数据源 = B1 SettlementTable 效果语义,非 magnitude 符号——负值增益存在)④ 战斗结束全清的状态栏去留。**B5×2**:① 溢出行呈现(数据源 = B1 义务⑧)② origin_cell→玩家可读形态(缩略图/格子高亮;坐标不直接呈现)。**D5 增补**:“同轮拿满优于跨轮叠”教学(OQ7 配套)。**B4 增补**:奖励身份预读(stack 时序规划的推理原料,创意风险 #1 切面)——均缺项即 blocking,随各 GDD 门禁评审核对 -- **单敌假设(用户 2026-09-09 拍板,B3 Rule 1 入文)**:MVP 战斗 = 单个敌人,target_side 无歧义(enemy 侧 side-wide = 该敌);**B2 定敌人数模型时回验**——定多敌即触发 target_ref 接口漂移补列(B1 归集语义/B2 模型/D1 呈现裁决随批验收) -- **weaken 锚裁决前置(OQ1 增补,B1 强制检查点输入)**:B1 先钉死归一口径(每结算瞬时当量 vs 每 AP 总暴露)——瞬时读法 m_w≥51 可行(F2 越域界随移 AP 界 −408%/表界 −816%,7 层触 B1 地板);总暴露读法 m_w>100 被 percent 域**禁止(该分支不可行)**;口径落定前禁止数值修订,落总暴露则现实解 = B4 重定参照 -- **AC-19 扫描域登记(B3 文件集)**:B3 全部 GDScript 产物(状态容器类 + StatusEffectTable schema 类 + 冒烟脚本,文件名实现期定)纳入 D2 AC-9 模式项目级 CI 扫描域——owner:Technical Setup 归口随 B3 实现建立成员清单(qa-lead 评审缺口:此前三份 GDD 引用同一无载体域) -- **registry status_effect 条目逐字段键重构**(B3 owner 修订,2026-09-09):fields/mvp_content 由散文改逐字段 YAML 键(action_economy 同构)——AC-18 机器对账前提;knob 活值不作定值对账(A4 AC-8 同款);anchor_warning 增修复空间不对称;b1_obligations 同步 5→8 - -## 门禁增补记录(2026-09-09,A2 定稿登记) - -> A2 GDD:`design/gdd/a2-minesweeper-rules.md`(Designed,待 /design-review)· registry 已登记 `a2_event_surface` / `a2_initial_expansion` 两条件目 - -- **四件已登记事项逐项落位核销(用户 2026-09-09 开工简报)**:① **A2×4 清单**(A4 登记)+ **A1 双包含回验两臂**——落位 A2 GDD Dependencies 门禁义务表 + AC(A2×4①→EC4 腿 · ②→AC-12 · ③→EC4 腿/AC-18/20 · ④→AC-18;双包含①②→AC-3;**门禁评审缺项即 blocking**);② **A3 委派**——初始展开定义落点(免费/计入清图/无奖励 = Core Rule 4/AC-1)+ round_end 棋盘路径外发 payload 同构(Core Rule 2/10,AC-7/8/9);③ **标错惩罚以 OQ1 登记在位**(候选 = 敌方伏击+1,实测义务随 OQ 保留;**A2 /design-review 核对在位,缺位即 blocking**);④ **已引爆雷格可通行**(Core Rule 11/AC-15——工程债核销)。A3 EC4 批次四组合 deferral 已在 A2 冒烟兑现(AC-10 语义序仲裁 F4,含类内稳定序腿 e) -- **🔴 A1 修订义务(systems-designer 反例 B,主会话独立复算证实——阻断级,A1 定稿后首条)**:A1 布雷数下限 round(d×(W×H−9)) ≥ 1 拦不住"初始展开即 cleared"退化板——8×8 八雷先布后删幸存 1 颗距离-2 雷 → 最终板全 0 格连通 → R₀=S 开局免费清图;N=1 参数行 100% 退化、F4 断言 A(inferability=1.0)零拦截、min_safe_count 无效(|S| 被动满足)。**义务(A1 GDD 修订走接口漂移)**:F5 legality 增 `R₀ ≠ S`(违例 = 尝试作废重试,clearable 同款)+ F4 断言 A′ 族严格零覆盖 + Rule 4 排除域/可达域基准措辞钉死"以最终产物板计";A2 侧 install 不变式④纵深防御(b_degenerate 板拒绝,AC-1b)——双包含两臂不受影响 -- **B1×3 强制项(B1 GDD 门禁评审逐项核对落位,缺项即 blocking)**:① 结算触发 = Waiting 相位编排点、不依赖事件到达序(stopped 轮 A3 直发 round_end 与 A2 flag_judged 批的到达序不承载语义——事件序契约 flag_judged < round_end 全路径统一)② reward_eligible=false(initial 通道)格不得进入奖励入库(A3 EC5 委派闭环)③ 标中旗兑付去重(资格以雷格实例为键——A2 诚实重复上报的对侧) -- **D1×6 强制项(2026-09-09 A2 full 评审由 D1×1 扩容,缺项即 blocking)**:① stop 意图经 A2 `settle_batch` 提交、**不直调 A3**(单一结算序保证——A3 Rule 9"输入层直调"的调用方细化为 A2 批次入口,A3 GDD 不改、以本条 + registry a2_event_surface.api_surface 为准)② 四种格态一眼可辨(已开 0 格地板/已开雾格无字/未开格/未开雾格——左键移动 vs 挖消歧前提,误挖不可逆)③ 悬停预承诺(光标区分移动/挖/旗)+ 可挖域常驻指示 + chord 肌肉记忆首遇提示(非模态每 run 一次)④ 已引爆雷格"可通行可读"呈现 ⑤ `compute_move_path` 呈现语义定稿(合法性指示 vs 穿行动画——P4 载体)⑥ 单意图帧输入收集 + voided 呈现义务(至少 stop 被作废须可感知)+ 每次拒绝玩家可感知(映射源 = reject_reason + sub_reason);移动路径预览数据源 `compute_move_path` 已备(表现归属归 D1 GDD,2026-09-07 门禁项不变) -- **B1/B4 增补两条(2026-09-09 A2 full 评审登记,B1/B4 GDD 门禁评审核对落位,缺项即 blocking)**:① **高光兑现节点条目化**(创意风险 #2/#3 合并——"我算对了"爆发结算 + chord 缺席的标中旗即时兑现补偿候选;原散文登记升义务清单——B3 先例:清单外登记会丢失)② **连锁批量授予溢出吸收设计**(13 格链 × B3 max_stack=2 ⇒ 大量"溢出未生效"行进结算明细,P2 画面反向伤害连锁幻想——溢出转一次性资源/治疗或显式接受,裁决归 B1/B4) -- **A2 full 评审修订完成(2026-09-09,四专员 + CD 终审 NEEDS REVISION 六 blocking 同日核销)**:GD-1 连锁不越旗(传播集 ∖ G,经典 flood 惯例——旗 = 1 AP 链阻断器)· F4 到达序无关性声明收窄((path_tag, hint, AP/RAP) 全批域不变;划分序无关仅异类四组合;AC-10 增耗尽型救援/联合清图用例)· ActionOutcome 增 sub_reason 封闭枚举(UX-1——批前免费窗口,registry 已同步)· D1×6 义务包 · AC 修复包("EC4 腿"编号化 AC-6、b_chain/b_fog spawn=(3,2)、board_invalid 诊断枚举、AC-7 ap=1 同帧竞争、OQ2 范围收窄)· 用语纪律清扫(双闸/腿/袋区/合成判定 + registry terminology 条目);随批:Rule 11 雷格通行有价捷径注记(GD-2 降级 residual——A1 clearable 闸按安全格 8 邻连通计,强制过路费板生成期被拦截)· OQ1 增惩罚重复性裁决项(hit=true 有去重 / hit=false 惩罚无去重的不对称,实测会话前钉死) -- **A2 侧接口事实(provisional 登记)**:批次语义序仲裁(cleared-dig → stop → 其余,F4 四组合真值表 + RAP 记账随胜者);A2 零表读取零 ConfigDB 引用(D2"A2 无直接依赖"事实证实,AC-22③——若实现期 ADR 裁决需读表,走接口漂移) - -## 门禁增补记录(2026-09-09,B2 定稿登记) - -> B2 GDD:`design/gdd/b2-enemy-system.md`(**Approved**——2026-09-09 full 评审 8 blocking 同日核销收口,见下方增补块)· registry 已登记 enemy / hero / clause3_supply 三条目 + status_effect 两注记(single_enemy_assumption 回验改写 / ambush_unit_definition 量纲定稿)+ terminology 增 B2 六词条 · D2 EnemyTable 行回填 + HeroTable 行新增(接口漂移) - -- **B1×6 义务清单(B2 GDD 门禁评审逐项核对落位,缺项即 blocking——B3 对 B1 登记先例)**:① 单位接口调用集中在结算编排、行为环推进每结算恰一次(double-advance 无守卫)② 雷→伏击事实转化恰一次(每雷格实例至多一次)③ 伤害 clamp/负值/溢杀语义与死亡判定时机成文 ④ F1 条款 3 闭合对账(B2 cap 表值 + 量纲 + **A1 actuals p10 非 target 参数**)⑤ 默认目标规则消费与单体/AOE 分流(固定顺位)⑥ 伏击 cap 溢出"溢出未生效"明细行协议 -- **D1×4 义务清单(视觉推测型呈现,缺项即 blocking;2026-09-09 full 评审增补口径)**:① enemy_id→图像线索映射清单成文(**预告时序 = 下一拍预告、挖掘期全程可见**〔B2 Rule 8⑤〕;**含强度档位/环长直觉编码说明**;形状+色相双通道,art-bible 约束)② 线索映射**全局恒定**(enemy_id 键——跨 run 禁重掷)③ 单位顺位与存活可读(固定顺位推测前提;顺位标记资产入 B2 Visual Req 2 下限)④ 敌方 side 池呈现口径(B3 敌侧延伸) -- **B3 单敌假设回验结果**:不成立——定多敌(用户拍板;B3 预授权接口漂移条款兑现)——registry single_enemy_assumption 已改写(side-wide 兼容 + target_ref 扩展位);B3 GDD 正文不改,以 registry 为准 -- **ambush 量纲定稿(2026-09-08 B3 块"ambush 量纲"项兑现)**:+3 flat = 每次攻击类行为附加 3 点主角 HP(charge 拍零兑付)——registry OQ2 关闭条件;值仍 provisional,条款 3 锚验收归 B4/B1(B2 供给 clause3_supply 口径:单结算自然边界〔用户定稿〕+ cap 表值默认 4) -- **cap=4 定稿注记**:反灾难护栏定位(绑定阈 = 单轮 5–8 雷灾难轮);旧默认 8 使溢出协议死码(min(雷数≤8, 8) 恒等式)已废弃;量级注记——atk=4 时 L≥2 伏击分量过半(常态支配修正入口 = C3 atk 曲线 / B4·B1 m_amb 锚,登记方向非 B2 义务) -- **qa-lead 缺口预检 7 项**:🔴-1 query_attack/ambush_grant_plan face 归属(owner:实现期 ADR,B2 OQ1)· 🔴-2 多敌语义默认零消费者复验(owner:C1,B2 OQ2)· 🔴-3/4 已随批修正(F4 满配语境 / EC17 读写切分)· 5–7 承载于 AC 前言(信任编排 / HeroTable 单行落点 / 坐标登记协议) -- **视觉推测型注记**:意图可见性规格 = 不直接显示行为/数值,敌种图像承载稳定可学线索(用户拍板)——P1 护栏 = 线索映射每 run 恒定(D1×4②);结算明细数字兑现(P2 不变);双舞台资产管线陷阱不受影响(B5 前美术测试照旧,B2 只锁视觉状态清单数据面:grub 1 态 + ambusher 3 态) - -### 2026-09-09 B2 full 评审增补(六专员 + CD 终裁,8 blocking 同日核销 → Approved) - -- **胜利路径声明(CD 排序 #1;原文 2026-09-09,2026-09-11 用户裁决退役)**:原"hero atk=0 → 当前内容态结构性不可通关、B4 先行 = 任何可通关验证的先决"作废——**基础攻击恒存在**(HeroTable.atk 域 [1,999]、0 加载拒绝、MVP = 6 原型锚 provisional;主角每结算战斗段先手攻击顺位最前敌),胜利路径 = 基础攻击 + 奖励侧增量共同承载(B2 Overview 2026-09-11 改写;B1 战斗段同批增补主角先手攻击步 + hero_attack 来源值) -- **B1×6 之① 增补**:结算内调用序成文 **query_attack→apply_damage→advance**(倒序读到下一拍;B1 冒烟须回放结算步流);推进口径 = 每存活**敌**单位(主角无环,环接口对 hero 拒绝) -- **资产下限增补**:受击反馈/死亡表现/顺位标记三类入 B2 Visual Req 2 资产需求下限(顺位标记归 D1×4③、同等 blocking) -- **新增 OQ7/8/9**:精英/Boss 编码位(**C1 定稿强制核对**——键冻结下同深度第二敌种触发行集致命,改键走 D2 Rule 4 接口漂移)· grub 单拍环体验证伪(playtest 预注册,两拍环备用案归 C3)· 零伤害死局组合跨字段护栏(实现期 ADR/D2) -- **OQ6 更正**:标错惩罚事件源 = flag_judged{hit=false}(**非 mine_hit**)——B3 source_class 结构冻结,须 B3 GDD 修订非加行;B2 F3 重验触发补"新增非 mine_hit 授予源"支 -- **F4 供给口径修正**(registry clause3_supply 已同步):结构上界改 **min(AP 上界, cap)** 形(cap 腿松弛收紧)· direction_precheck 裕度 4.7×→**2.3×**(按条款 2 最低档锚 +50pp 实算) - -## 门禁增补记录(2026-09-09,B4 定稿登记) - -> B4 GDD:`design/gdd/b4-reward-item-economy.md`(**Approved**——2026-09-09 full 评审 14 blocking 同日修订核销后用户拍板放行;见下方 full 评审增补块)· registry 已登记 `reward_table` 条目 + 三处接口漂移改写(rng_service reward_roll scope 语义 = 每次 board install 批 / status_effect 悬空校验首引兑现 / clause3_supply 左臂载体 = B4 F6)+ action_economy.referenced_by 增 B4 · D2 六处回写(RewardTable 定稿行 / StatusEffectTable 注记 / Dependencies B4 行 / 双向一致性 B4←D2 / Tuning Knobs 占位删除 / Status 登记) - -- **B1×6 义务清单(B4 GDD Dependencies 全文,B1 GDD 门禁评审逐项核对落位,缺项即 blocking——B2/B3 对 B1 登记先例;2026-09-09 full 评审同步**:①段序含窗口锚点与回放输入 ②增"每格受理恰一次" ④增 usable_now 组装/逐件动态守卫/击杀结果进流水**)**:① **结算段序骨架成文**:授予段→**道具使用窗口(授予段后、增益/减益段前——full 评审用户拍板:当轮拾取当轮可用)**→增益/减益段→道具段→战斗段→衰减段→判定段(用户拍板核心序 buff/debuff > 道具 > 战斗不变;**窗口选择序列登记为结算回放输入事件**;B2 义务①②③的转化与推进落点随段序定位)② 奖励受理与分流编排(grant → buff 类 apply_effect / 道具类 stock;**每格受理恰一次、stock 与 grant 返回一一对应**;满层拒绝 = 零兑付 + "奖励未生效"明细行、无折算,**行携带可聚合计数/批次字段**)③ clear_reward 授予路径(**B3 OQ4 关闭条件**:install 期 roll、cleared 编排期兑付——兑付后同结算窗口即可选用)④ 道具段编排(窗口数据组装 = B4 query_inventory + **B1 侧守卫预判 usable_now**、选定序逐件施加、**满血守卫拒绝不烧包 + 同窗顺序多包逐件动态守卫**、**零效果判定读 B2 存活集 + "已消耗未生效"明细行〔E10 照常消耗拍板的 B1 侧承接——缺口预检 1 逐字核对〕**、**击杀结果进流水〔H3 感知数据前置〕**、治疗 clamp)⑤ 生命周期编排(battle_over 调 clear_inventory〔**清空前后快照计数供清空反馈行**〕;board retire 调映射消亡)⑥ roll_board 调用恰一次(B4 侧相位守卫见 E5/AC-1;B1 编排纪律承载调用时点半) -- **D1×5 义务清单(缺项即 blocking;2026-09-09 full 评审 3→5 扩容)**:① 已开格 + 库存奖励身份恒定可读(reward_id 键全局恒定、icon 形状+色相双通道——art-bible 约束;**库存常读条 = 挖掘期规划面**而非仅轮末窗口)② 道具使用窗口呈现(授予段后弹出;选用/跳过/选择序、窗口时机指示、**usable_now 可用性投影**〔满血治疗包禁选/提示〕、空库存建议不弹窗、窗口触发政策注记)③ 结算明细**四类行**呈现(道具行〔语境注记〕/ "奖励未生效"行〔**按聚合计数呈现**〕/ "已消耗未生效"行 / "使用被拒"行——数据源 B1 流水;未选用件"随战斗结束消亡"语境注记)④ **H2 清图奖励行强调呈现**(轮末仪式峰值)⑤ **battle_over 库存清空可见反馈**("剩余道具 ×N 随战斗结束清空"——RAP 清零可见反馈同款先例) -- **两项 E 节拍板(2026-09-09 用户裁决,其中第一项覆盖并行会话草稿)**:**道具段照常消耗**(选定即承诺——无存活敌的已选刀照常 Used + 零效果 + "已消耗未生效"行;不对称理由 2026-09-09 full 评审更正:原"敌 HP 不可见"与 B2 血条数字可读矛盾作废,现行理由 = 守卫所有权不对称〔满血守卫是表局部判定、零效果判定须读 B2 存活集〕+ 反抖动;误触防护由窗口 usable_now 预判承载)· **清图槽允许 buff 行**(A3 条款④兑现口径 = 行级恒有正当量〔F3 加载期校验〕,运行时满层零兑付为合法例外 + 明细行;预警④单独计数监控) -- **attack_up 复活 + 锚参照回迁(2026-09-11 用户裁决批——原"死行 + 锚参照迁移"条目〔2026-09-09,F4 口径后果〕退役为历史)**:基础攻击恒存在(HeroTable.atk 域 [1,999]、0 加载拒绝)→ attack_up 复活、唯一消费面 = 主角战斗段先手攻击(B1 同批增补);"道具伤害恒定表值不吃 percent 修正"拍板不变(attack_up 只乘基础攻击、不乘刀);A3 条款 2 锚参照对象**回迁 attack_up 当量**(换算归 B1 条款①对照表;B3 红警裁决前置不变);**attack_up 已随同日两级奖励批入默认根池**(attack_up_basic w20 t2——本条"入池随奖励改造批"残余已兑现) -- **两级奖励 + 关内延续批(2026-09-11 用户裁决,同批改写 B4/B1/B3/D2/registry + 切片落地)**:① 奖励按**交付轴两类**——即时类 {buff, instant_aoe, instant_heal}(授予段当场兑付、不进库存、零决策,默认根 75%)/ 可选类 {damage_item, heal_pack}(入库存、窗口选用、更强,25%)——category 五值枚举;② **库存生命周期 = 关卡域**(跨战斗延续、关卡末 clear_inventory——原战斗域拍板作废,"关卡结束"事件归 C1/C2、落位前上层显式调用 B1 level_clear);③ **窗口单件制**(至多选用一件——原任意多件作废);④ **治疗两级**:instant_heal 即时小额 + heal_pack 稀缺强治疗(w 25%→6%、p 4→12);⑤ buff 时长当次化(attack_up/defense_up D=1);⑥ **B1 义务⑤/D1 义务⑤改写**(battle_over 清库 → 关卡末 level_clear + 清空反馈);⑦ 同批登记:预警②④⑦结构性缓解注记、方向预检重算(刀供给 ≈1.8|资格格|/板 + 即时类与基础攻击分量)、F5 保底重锚(仅计 damage_item = 可选伤害保底)、P_min=8、AC-19 对账对更新 (knife_adv, attack_up_basic)。敌 hp / 奖励供给联动重算义务(预警⑥)归 C3 随批执行 -- **缺口预检 2 项阻塞级 deferral 至 B1**(qa-lead,共 11 项全文见 B4 GDD——lean 9 + full 评审 2):① B1 编排半整体 deferral(段序/窗口/守卫/四类明细行协议——冒烟以构造序扮演零断言)② A4① 当量升级与②③状态(AC-19 现为档位序检查——B1 对照表落定后升当量对账;**② MVP 结构性不可闭合〔clear_default 常量池,激活载体 = clear_\ 插槽〕、③静默绿灯风险——Dependencies 显式宣告**) -- **概念层口径交 consistency-check**(两处):主动道具 MVP 激活(game-concept"后续版本加入"→ use_timing 单值兑现)· 库存战斗域 vs Peglin"道具跨循环累积"参照差异 -- **索引错号修正顺带**:B3 块"EC9 reload gate"→"EC8"(D2 实际编号,上文已改) - -### 2026-09-09 B4 full 评审增补(五专员〔game/systems/economy/qa/ux-designer〕+ CD 终裁——NEEDS REVISION,14 blocking 同日修订核销,待 delta 复核放行) - -> 承重机制经对抗评审零动摇:install 期预分配确定性脊柱、封闭 RNG、F1–F6 边界实算、编排被动性、AC/夹具架构——CD 终裁"机械核心是管线迄今最扎实的,结构上没有需要推倒的东西";全部 blocking 为文本级/附表级(B2 先例)。日志 `design/gdd/reviews/b4-reward-item-economy-review-log.md`。 - -- **用户评审拍板:窗口锚点 = 授予段之后、增益/减益段之前(当轮拾取当轮可用)**——消除"当轮拾取下轮才可用"未陈述规则与末图清图奖励必然作废两伪影;核心段序(buff/debuff > 道具 > 战斗)不变。Rule 5/E10/E15/D1×②/B1×①④ 五处随批改写;E15/OQ4 主体消解(残余 = 未选用件消亡注记〔D1 义务③⑤〕+ 折算/继承归 Alpha C2) -- **跨文档真相分裂修复(三处)**:D2 Core Rule 5 与 D2 Interactions B4 行的 reward_roll 旧语义("每次奖励结算/每轮结算取号")补同步为 install 批语义(原定稿批只改了 registry 与 D2 Dependencies 行——B4"registry/D2 已同步"声明对 D2 正文失实,实现者按旧正文接线会使 B4 全部 σ 轨迹 AC 报废);systems-index A3 OQ5 注记、registry status_effect.anchor_warning、clause3_supply.direction_precheck 三处补 defense_up 锚参照迁移注记(迁移后预检未重跑事实同批登记);game-concept 创意风险 #1 / 可证伪信号 / agency 定位句三处 MVP 口径注记 -- **预读声称如实降级(四方独立确认的 overclaim)**:"奖励身份预读 = 我要去拿 X 路线规划/创意风险 #1 正面解"在 MVP 结构性不成立(reveal = 同轮授予、未开格不呈现)——四处承重位(Overview/Player Fantasy/E3/预警④)改写为真话:已开格+库存恒读 + 每格必有货 + 雾档先验 + 叠层感知挖掘;寻路 = OQ2/A5 二期形态;创意风险 #1 维持 OPEN;playtest 证伪信号按 MVP 口径读取(防"缺失功能被误判为设计失败") -- **结构新增**:**RewardConfigTable**(单行全局接口漂移——T_fog_min/K_dmg/N_draft/P_min 的 Rule 1 载体,registry `reward_config` 条目 + D2 表清单回填);**RewardTable 第九字段 display_name**;F5 加载护栏两条致命(floor_supply_missing / no_damage_row——后者关闭"K=0 零伤害世界静默复活不可通关"后门,B2 OQ9 并案);默认根内容行集登记(knife_t1/knife_adv/heal_t1/defense_up_basic/clear_knife + 刀供给方向预检——溯源原型锚);API 输入域语义补裁(E18 重复受理幂等/E19 清单外坐标/E20 stock 受理域/E21 枚举序)+ B1×②"每格恰一次" -- **AC 修复**:AC-14 分支 3 与 AC-3 分支 3 同输入矛盾消解(相位守卫不在豁免域);AC-6 分支 2 改 32σ 双重量化 + 分支 4 致命腿改烤入根(override 不触发加载校验);σ 协议补预推进机制 + 纸面契约子集声明(A2 OQ2 先例)+ b4_reroll 夹具补全登记 + 第二人复核义务;AC-15 增使用期快照分支;AC-19 默认根改非平凡对账对 (knife_adv, defense_up_basic);"无洞"声明撤回重述(覆盖口径 = EC 21/21 映射 + 输入域补裁,负空间学说边界如实登记) -- **E10 理由更正(拍板本体不变)**:原"敌 HP 精确值玩家不可见"与 B2 呈现规格(hp/max_hp 血条数字可读)矛盾——现行理由 = 守卫所有权不对称(零效果判定须读 B2 存活集,B4 零跨系统读不开口子)+ 反抖动;窗口 usable_now 预判承载误触防护 -- **经济侧登记**:失衡预警重校准扩容 ①–⑧(①拆短缺/浪费、④按吸收上限重推并拆稳态/连锁双表、⑤雾板分层〔A4 明文要求〕、新增⑥速杀退化/⑦窗口摩擦/⑧H2 曝光率);A4 硬约束②③ MVP 休眠显式宣告(②结构性不可闭合、③静默绿灯);C3 调参期批量仿真义务(F5 概率性致命带);H2/H3 升 D1 义务④⑤ + 创意风险 #2 爆发结算机制本体显式登记归 B1 强制检查点 -- **用语纪律清扫**:腿→分支(全文)、档位序代理→档位序检查、贴地/行洪水/自救面/换签/红警机械替换或加注,registry terminology 增 B4 六词条(刀/烧刀烧包/批尾/死行/档位序检查/预推进) - -## 门禁增补记录(2026-09-10,B1 定稿登记) - -> B1 GDD:`design/gdd/b1-settlement.md`(Designed,待 /design-review)· registry 新增 `settlement_table` / `clause5_dominance` 两条件目 + 四处接口漂移回写(weaken −25→−65 / anchor_warning F0 回执 / clause3_supply 闭合回执 / board_gen 消费回执)+ 三处 b1_obligations 履行回执(B3×8/B2×6/B4×6)+ terminology 五词条;D2 SettlementTable 已回填(接口漂移) - -- **F0 归一口径裁决(B3 红警关闭,B1 强制检查点兑现)**:条款②锚验收归一口径 = **每结算瞬时当量**(总暴露分支被 percent schema 域禁止 + 与 B2"单结算自然边界"冲突,排除);**m_w −25 → 值域 [60,85]/默认 −65**(终值 = B4/B1 共裁,B1 OQ2);地板 = 乘数零点 −100pp、交叉层数 ⌈100/m_w⌉ = 2(原"7 层触地板"预读更正);defense_up 参照保持 -- **条款①③⑤闭合首版验算完成(B1 单一闭合 owner)**:条款①对照表以 B3/B4 默认根活行为对照实物(D_ref=12 载体 = SettlementTable.equivalence_ref_damage;defense_up = 最低档安全格 buff 锚 6.0 HP/结算);条款③默认通过(L1 ≈2.0× / L2 ≈2.6× 边际配对)——**满配语境 unit_count=3 最坏盲点破线 → C3 调参约束**;条款⑤两态通过 + **保守地板缺口如实登记**(C 单独兜底不足,非阻塞)——**actuals p10 / fog_burden_ratio 交付后全部强制重跑(B1 AC-39/40)** -- **高光兑现节点双落(创意风险 #2/#3 机制本体,用户 2026-09-10 拍板——A2 登记义务条目化兑现)**:#2 **完美排雷**(板级零误标 ∧ ≥1 标中 → 清图奖励当量 ×P_perfect 默认 ×2;与踩雷正交、计数随 install 重置、RAP 刷新图无兑付点、上界受护栏 B 防钓鱼线 C_eff ≤ 24 约束);#3 **标中旗 highlight 标记**(数据面——当轮兑付 + 明细强调组合补偿 chord 缺席);呈现归 D1 -- **D1×3 义务清单(B1 出具,缺项即 blocking,并入 D1 既有台账 A2×6/B2×4/B3×4/B4×5)**:① 高光行强调呈现(perfect_sweep 高光行 / 标中旗 highlight / H2 清图奖励强调——数据源 = B1 Core Rule 14 流水行协议)② 完美排雷呈现形态 ③ EC5 零合法板提示/补偿/回退形态(数据面 = 非法产物标记上抛,A1 EC5 玩家侧体验债的 B1→D1 承接) -- **C3 消费 B1 对账输出的事实依赖成立**(2026-09-07 TD 门禁悬案回执)——对账输出 = 调参约束清单(满配破线 / 保守地板缺口 / 护栏 A/B 突破条件),非运行时接口;C3 GDD 定稿时回写本索引 -- **实现期 ADR 裁决项 ×2(B1 出具)**:事件总线载体(TD 门禁 2026-09-07 项的 B1 侧——与 A2 OQ2 同一裁决;AC-6/33 相关 THEN 为纸面契约直至落地)· B2 OQ1 两 face 归属(query_attack/ambush_grant_plan) -- **UX Flag**:B1 有 UI 贡献(结算明细屏 + 道具使用窗口)——Phase 4 前置 `/ux-design`,stories 引用 `design/ux/[screen].md` 非 GDD -- **B1 冒烟口径(项目首个全部玩法上游 Approved 的系统)**:真 A3/A2/B2/B3/B4 全集成 + A1 程序构造桩(取号契约同构,真 A1 全链路登记端到端 deferral)+ C1/C2 encounter 直供(provisional);可回放 AC-33 = D2 AC-15 deferred→B1 兑现;编排唯一性单向静态扫描(B2/B3/B4 API 符号命中文件 ⊆ B1 文件集) - -## 门禁增补记录(2026-09-12,战斗屏 UX 修订登记) - -> `design/ux/battle.md` /ux-review 完成:NEEDS REVISION 7 blocking 同日修订落稿(复检待跑)——B1 UX Flag 承载面即本 spec。同批用户拍板 **D4 弃图刷新前移挖掘期**,四处 GDD + registry 同步修订(接口漂移走各 GDD 修订流程,本块为索引登记): - -- **A3**:`request_refresh` Active 相位受理(原仅 Waiting)+ **每轮上限 2 次**(`refresh_cap_per_round` 结构位默认 2——D1 提案采纳,原"无结构性上限"作废;RoundStart 重置)+ Waiting 代理退役;**旧板旗随旧板作废**(零兑付、旗 AP 不返还——A2 EC11 全量重置承载);**经济预警**:挖掘期当场刷新无结算发生,原"敌方时间税"自惩半句失效——OQ3 弃图率/刷新率预警阈值联动复核(登记) -- **A2**:install_board 受理域增 **Active·仅弃图刷新路径**(B1 `refresh_board` 编排内、A3 扣费成功为前提;非刷新路径"防轮内换板"不变) -- **B1**:stopped/ap_exhausted 轮**恒 same_board**(原 Waiting 期刷新代理 + AC-29 退役/改写);新增**挖掘期刷新编排 `refresh_board`**(A3 扣费 → A2 retire → A1 generate → A2 install → B4 roll_board 恰一次;无结算段、无 round_end——编排唯一性原则保持);AC-30 改恒 same_board 口径 -- **systems-index 本体更正**:A4→D1 义务 ×2→×3(第③项 = 已开雾格 tint + 雾区全开完成信号——原索引漏记;OQ8 已于 battle.md 裁决采纳) -- **B4**:五处旧"battle_over 库存清空/随战斗结束消亡"摘要同步为关卡末 level_clear 口径(权威 = D1 侧义务清单⑤/L94) -- **D1 呈现义务台账状态**:battle.md 对 A2×6/A3/A4×3/B1×3/B2×4/B3×4/B4×5 的承接经本轮评审逐项核对(实质承接全齐;B1×3 映射错位、`settlement_snapshot`/`can_request_refresh` 自造接口引用已修正);entry 17①②③ 战斗屏落点齐备(场景级 AC 已入) - -## 门禁增补记录(2026-09-13,art-bible §1–4 定稿登记) - -> `design/art/art-bible.md` 已建成——2026-09-10 初稿(§1–4 核心方向)于本日增补批**定稿 §1–4**;2026-09-07 门禁排期项("最晚在 D1 GDD 前创建,至少 §1–4,'格子样张测试'并入执行")就此闭合。AD-ART-BIBLE solo 跳过(review-mode.txt = solo,出稿待人工复核)。 - -- **范围声明**:定稿范围 = §1–4(视觉身份宣言/氛围与情绪/形状语言/色彩系统);§5–9(角色/环境/UI/资产标准/参考方向)未建,**不阻塞 D1 GDD**——D1 消费面 = §1.2 绘制优先级栈 + §1.4 格子样张验收标准 + §3 形状语言 + §4 色彩系统 + §4.6 图标键契约。 -- **本批增补内容**:① 绘制优先级栈增补**徽章位**(数字 > 小人 > 旗 > 徽章 > 纹理 > 底色——极性提案 §0 栈位声明落位);② 雷格隐喻换轴同步(雷 = 被惊动的巢穴,"机关"旧称退役——game-concept 2026-09-12 换轴;兑现档红更名危险红,色值不变);③ **§1.4 格子样张测试验收标准成文**(第一验收项 = 数字可读性硬指标,game-concept 早期风险第 1 条;雾格不在样张范围);④ **§4.6 图标键契约冻结**(效果图标 B3 数据六行 + 提案新增 sapped;奖励徽章 B4 默认根八行 + clear_blast 并列预留;格面类型图标五类——极性提案 R1;敌种线索键 B2 Rule 8——键与通道分配冻结、终稿美术归样张/asset-spec 批);⑤ 雾格资产规格一行占位(内容封禁期暂缓,雾重设计批再启)。 -- **D1 GDD 引用义务**:D1 既有台账(A2×6/B2×4/B3×4/B4×5/B1×3)凡涉 icon/线索/徽章的呈现义务,一律以 art-bible §4.6 键契约为视觉侧依据;键集扩容(新效果/新奖励/新敌种/新类型)走 art-bible §4.6 修订,禁运行时换图。 -- **待随批事项**:极性提案实施批须按其 §3.5 正式登记 D1 义务条目入本索引 D1 台账(未开格类型图标/极性视觉语言/负向文案族);registry terminology 增 图标键/徽章/极性 三词条(本批已登记)。 - -## 门禁增补记录(2026-09-13,D1 定稿登记) - -> `design/gdd/d1-hud-framework.md` /design-system 完成:12 节 + 台账表/冲突清单零占位(solo 模式,出稿待人工复核;/design-review 须新会话)。registry 已登记 `d1_presentation_surface` 条目 + terminology 两词条(命令式回执驱动/程序化占位)。 - -- **义务台账核销(缺项即 blocking 项闭环)**:D1 既有台账(A2×6 / B2×4 / B3×4 / B4×5 / B1×3 / A4×3 / A3 + A1 EC5——battle.md §13 27 项)逐项落位表见 D1 GDD Dependencies(门禁评审核对用);已裁决项直接继承 battle.md(双舞台五区布局 / 路径预览=合法性指示 / 悬停预承诺 / 四格态 / 雾图例与首遇 / 四类明细行 / 窗口单件原位激活 / 高光行强调 / 库存关卡域清空反馈 / B3 空态=槽隐藏 / EC5 零合法板=仅提示)。 -- **切片教训三条硬性要求兑现(entry 17,D1 GDD 门禁评审核对项)**:① 信号载荷 schema 13 项成文表(Core Rule 17——A2 三事件/B1 行协议/B4 窗口载荷引用既有 schema + ux 遥测六行与命令式刷新面新成文)② 场景级 headless 测试进 AC(AC-19 战斗屏探针 + ADR-0004 双载体)③ 信号时点状态可见性规则(Core Rule 18:销毁前捕获/载荷自包含/禁回读核心生命周期态 + AC-20 静态扫描与像素重放断言)。 -- **D1→上游接口漂移登记 ×3**:① A3 只读观测量扩列轮内已用刷新次数(刷新按钮"本轮剩 N 次"读数缺口——OQ2)② B1 `settlement_snapshot` 契约登记(切片已实现、GDD 未登记——OQ3,D1 现行消费 = 步骤流判定行 + presentation_snapshot() 零阻塞)③ 极性提案实施批 D1 义务条目(冲突④)。 -- **D1 侧裁决两条**:① MVP 格面徽章只在已开格呈现(B4 Rule 8"未开格身份不呈现"为现行锁定规则——art-bible §4.6.3 未开格预读的机制前提随极性提案实施批,冲突⑤)② 订阅纪律按 ADR-0001 收窄(呈现层只订 B1/runner;battle.md §Events Fired 措辞差列冲突⑥待复检批对齐)。 -- **下游交付物(B5/D4/D5/A5/D6 输入)**:五区布局与双舞台裁决(第三形态)+ 键位映射表(§4.6 全键族)+ 呈现语义(敌人卡死亡禁瞬消/明细带/高光行)——B5 只叠加动画密度;D4 挂点 = 明细行类型流 + toast 触发;D5 承载位 = toast 体系 + 图例面板;C4 = TunePanel 退役接收方。 -- **命名统一核销(session-state entry 35)**:request_refresh / refresh_cap_per_round / install_board 受理域语义 / round_end_board·round_end_stopped 实名——D1 GDD Rule 20 对照表 + AC-25 grep 断言;切片四 provisional 名退役。 - -## GDD 设计顺序 - -1. D2 数据配置与数值表 -2. A3 行动经济 -3. A4 地形变异 -4. B3 增益/状态系统 -5. A1 扫雷棋盘生成 -6. A2 排雷玩法规则 -7. B2 敌人系统 -8. B4 奖励与道具经济 -9. B1 战斗结算规则 -10. D1 HUD 与界面框架 -11. A5 扫雷辅助道具 -12. C3 难度曲线与精英/Boss -13. C2 冒险结构 -14. C1 关卡节点地图 -15. B5 战斗表现 -16. C4 元进度 -17. D3 存档序列化 -18. D4 音频 -19. D5 教学引导 -20. D6 设置/本地化 - -## 进度追踪 - -| ID | 系统 | 状态 | GDD 路径 | -|---|---|---|---| -| D2 | 数据配置与数值表 | Approved(2026-09-07 两轮评审 + delta 复核收口) | `design/gdd/d2-data-config.md` | -| A3 | 行动经济 | Approved(2026-09-07 三轮 re-review 8 条文本级 blocking 同日核销;用户拍板免独立 delta 核销直接放行。F1 五条款契约与 refresh 玩家意图路径为 B1/B4/D1 GDD 的强制输入;日志 `design/gdd/reviews/a3-action-economy-review-log.md`) | `design/gdd/a3-action-economy.md` | -| A4 | 地形变异 | Approved(2026-09-08 两轮独立评审:full 8 阻塞 + 同日 re-review【六专员 + CD 终裁】6 阻塞均同日核销;CD 终裁 delta 核销免第三轮,用户拍板放行【A3 先例】;承重数学(厚度≤2【≡任意 3×3 窗口非全雾】/f≤8d/两态 AP/F1 谓词)经两轮对抗零动摇;日志含两轮阻塞→修复对照表:`design/gdd/reviews/a4-terrain-variation-review-log.md`)。**门禁登记(2026-09-08 re-review 补全——下游 GDD 门禁评审逐项核对落位,缺项即 blocking)**——**A1×15**:① 候选池门控(F1)② cell_constraint 生成期强制 ③ 出生区及生成期可达域永不含雾(可达域 A1 确定性计算)④ 可推理率按雾边双向净效应建模(寂静减项 × 推理锚增项,禁单向补偿)⑤ 清图预算增量构成核算(雾致预算增量 = 链不可达雾格数 × dig_ap_cost,设计期聚合校验、违例 = 调参修正)+ 链不可达雾格占比生成期计算输出(B1 对账输入生产者义务)⑥ 空池静默 ⑦ 降级静默 + 产物合法 + 部分达成按 shortfall 分级上报(EC2)⑧ 多变异选取消费 board_gen 流(回放确定性)⑨ EC3 邻接出生区合法(谓词 = 出生 3×3 及可达域内无变异格)⑩ EC10 雾占比参数域(< 全覆盖 × 可推理率联动,可判定谓词)⑪ EC11 双雾区实例独立(布置身份与 board_gen 取号独立)⑫ 厚度≤2【≡任意 3×3 窗口非全雾】/ f≤8d 参数域 ⑬ EC2 判据含连通分量尺寸 ⑭ 降级率按 (level_index, node_depth) 埋点 + 最低雾出现率义务【批量统计断言形式,阈值与样本量归 A1 GDD 定】+ 禁放宽 Rule 3 达成 ⑮ board_biome 非空域校验(fail-fast)。**A2×4**:EC4 连锁开雾格(无数字 + 级联停止 + 计入清图 + 奖励入库)· EC5 雾内旗恒不中(含标错惩罚上线后一致性推论)· 开格上报携带变体标记(数字显示判定数据源)· EC8 棋盘持有生成期变异快照、抗表重载。**D1×3**(2026-09-12 更正:原记 ×2 系索引漏记第③项——A4 GDD UI Requirements 明写"三个呈现义务"):① 图例"迷雾 = 无雷盲区"条目(恒在、不设解锁门、可回看)② 首遇提示(触发 = 首个实际含雾板进入可操作状态、每 run 一次;必含要点 = 无雷盲区 / 雾格不传播连锁 / 雾内旗纯损;非模态不劫持输入)③ 已开雾格 = 地板无字 + 底色层 tint 残留与雾区全开一次性完成信号(验收候选转正——OQ8 已于 design/ux/battle.md 裁决 2026-09-12:采纳 tint + 视觉合并域信号单元;详见 A4 UI Requirements③)。**B4×3 定价硬约束**:雾内奖励档位下界 ≥ 最低档安全格 buff 当量 · 清图奖励锚随雾成本负担(链不可达同分母)上浮 · 雾板净当量优势带上界(防福利)。**B1 条款 5 输入**:三腿入账两态验算 + 雾板净当量优势带 + 防钓鱼方向(对账 A3 OQ6)+ 链不可达占比(A1⑤ 生产者)。承重规则不变:生成期布置约束(雾区仅非 0 安全格【区内无雷无 0 格】)+ 零特判原则;"雾区无雷"为玩家可见知识;A3 F1 条款 5 对账注记三腿入账(非"消解");registry variation_table / variant_pool_gate / fog_ap_note 已同步改写 | `design/gdd/a4-terrain-variation.md` | -| B3 | 增益/状态系统 | Approved(2026-09-09 full 评审 NEEDS REVISION 7 blocking 同日核销:单敌假设入文〔用户拍板〕· B1 义务 5→8 · D1×4/B5×2/D5/B4 呈现义务登记 systems-index · AC-15/18 重写 + dup_key 致命夹具 · weaken 红警补修复空间不对称 + OQ1 归一口径前置;承重机制〔F1–F3 复算/AC 覆盖/先兑付后衰减〕经对抗评审零动摇,用户拍板免独立 re-review 直接放行【A3 先例】;**weaken 行条款 2 锚红色预警维持登记——B1 强制检查点优先裁决**;日志 `design/gdd/reviews/b3-status-effect-review-log.md`) | `design/gdd/b3-status-effect.md` | -| A1 | 扫雷棋盘生成 | Approved(2026-09-09 full 评审 MAJOR REVISION NEEDED——8 blocking 同日修订核销 + cheap-now 6 项顺路核销,用户拍板免独立 re-review 直接放行【A3/A4 先例】。承重修订:**P1 可推理率两项达标判据**(inferability_core = 剔除雾格后的可推理率,防止"雾区无雷"知识单独撑线)+ **target 域 [0.85,1] 绝对锚**(断言 A″)+ **雾占比绝对上限 0.25** + **F2c 成本闸**(attempts×W×H ≤ 16384 provisional,运行期禁墙钟逃生)+ 雷数取整/布雷钉死(round 先定数、先布后删)+ F2≡Schema 合流(count=0⇒f=0 腿)+ AC-6(a) 芯/环改写 + AC-11 前提腿 + **断言 B 收紧达成区占比**(A4⑭ 两件套落位)+ **第三轴登记约定**(Boss=Dmax 行 + elite_/boss_ 命名空间预留 + OQ6 C1 定稿强制重审);σ 打包防碰撞修复;D2/registry 接口漂移已同步。recommended 9 项未核销留档(AC-10(d) 条件化、⑬ 差分夹具、板ⅲ′ 对照板、O4 登记等——见日志);日志 `design/gdd/reviews/a1-board-generation-review-log.md`) | `design/gdd/a1-board-generation.md` | -| A2 | 排雷玩法规则 | **Approved**(2026-09-09 full 评审:四专员〔game-designer/systems-designer/qa-lead/ux-designer〕+ CD 终审 NEEDS REVISION 六 blocking 同日修订核销,用户拍板放行【A3/A4/A1/B3 先例】。承重修订:**连锁不越旗**(GD-1——传播集 ∖ G,旗 = 1 AP 链阻断器)· **F4 到达序声明收窄**(划分序无关仅异类四组合)+ AC-10 耗尽型救援/联合清图用例 · **ActionOutcome.sub_reason 封闭枚举**(拒绝可辨数据契约)· **D1×6 义务包**(格态可辨/悬停/雷格可读/路径语义/单意图帧/voided 呈现)· AC 修复包(AC-6 编号/b_chain·b_fog spawn=(3,2)/诊断五类枚举/ap=1 同帧竞争)· 用语纪律清扫 + registry terminology 条目;随批 Rule 11 有价捷径注记 / OQ1 惩罚重复性裁决项 / B1·B4 高光与溢出两条登记。承重结构〔确定性引擎/三事件面/F1–F4/零特判〕经对抗评审零动摇;日志 `design/gdd/reviews/a2-minesweeper-rules-review-log.md`。**下游义务见门禁增补记录 2026-09-09 A2 块:A1 修订义务(🔴 反例 B)、B1×3 + 高光/溢出两条、D1×6,缺项即 blocking**) | `design/gdd/a2-minesweeper-rules.md` | -| B2 | 敌人系统(战斗单位系统——CD 门禁扩容身份) | **Approved**(2026-09-09 一次会话定稿 + 同日 full 评审〔六专员 + CD 终裁〕NEEDS REVISION 8 blocking 同日核销、用户拍板免独立 re-review 直接放行【A3/A4/A1/B3 先例】。lean 定稿:lean 门禁 systems-designer〔Formulas〕/qa-lead〔AC 17 条 + 覆盖矩阵 + 缺口预检 7 项〕已咨询,CD 视角随 full 评审补位。定稿要点:**多敌模型**(1–3 同敌种单位——B3 单敌假设回验不成立,side-wide 零接口变更兼容 + target_ref 扩展位;registry single_enemy_assumption 已改写)· **HeroTable 新增**(接口漂移回写 D2,单行全局,atk=0 机制开关)· **意图视觉推测型**(不预告数值/行为,敌种图像线索稳定可学、全局恒定——CD 承重项定稿 + full 评审补预告时序⑤)· **Peglin 行为类型学转译**(行为环确定性轮转:attack/charge/heavy MVP,guard/boost/hinder/summon 预留校验拒绝;双敌种 grub/ambusher 双环;死亡即不动手 + 同步轮转定理)· **伏击量纲定稿**(每攻击类行为 +3 HP 附加、charge 零兑付——registry OQ2 关闭条件)· **cap 默认 4**(反灾难护栏;旧 8 溢出协议死码废弃)· 条款 3 供给 = 单结算自然边界(用户定稿)· EnemyTable 八字段回填 + 每行集恰一敌种校验。**下游义务 B1×6 + D1×4 缺项即 blocking**(① 增调用序成文;D1×4① 增预告时序/档位、② 全局恒定)。full 评审承重修订:**当前内容态无胜利路径声明**(B4 先行 = 可通关先决)· 资产下限补受击/死亡/顺位 · 多敌夹具根改 ambusher 行(三处死测试修复)· AC-7 恒假判别加 m_e≥2+SKIP · OQ6 事件源更正(flag_judged 非 mine_hit)· OQ7 精英/Boss 编码位预登记(C1 强制核对)· 主角推进域排除 · F4 裕度 2.3× + min(AP,cap) 收紧(registry 同步);**新增 OQ7/8/9**。承重机制〔F1–F4 实算/同步定理/side-wide 池〕经对抗评审零动摇;日志 `design/gdd/reviews/b2-enemy-system-review-log.md`) | `design/gdd/b2-enemy-system.md` | -| B4 | 奖励与道具经济 | **Approved**(2026-09-09 full 评审〔五专员 + CD 终裁〕NEEDS REVISION——14 blocking 同日修订核销,用户拍板免独立 re-review 直接放行【A3/A4/A1/B2/B3 先例】;核销质量依据 = 全部 blocking 为文本级/附表级、承重机制〔预分配确定性脊柱/封闭 RNG/F1–F6 边界实算/编排被动性/AC 架构〕经五方对抗零动摇。承重修订:**窗口锚点移授予段后**〔用户评审拍板:当轮拾取当轮可用〕· **跨文档真相分裂修复**(D2 正文两处旧 reward_roll 语义补同步 / 锚参照迁移三处传播 / game-concept 三处注记)· **预读声称如实降级**(创意风险 #1 维持 OPEN,寻路归 OQ2/A5)· **RewardConfigTable 新增**(Rule 1 载体)+ RewardTable 第九字段 display_name + F5 加载护栏两条致命(no_damage_row 关闭零伤害世界后门,B2 OQ9 并案)· 默认根行集登记 + 刀供给方向预检 · API 输入域补裁(E18–E21)+ AC-14/AC-3 矛盾消解 + σ 预推进/纸面契约声明 · E10 理由更正(拍板不变)· 失衡预警①–⑧ 重校准 · A4②③ MVP 休眠显式宣告 · 用语纪律清扫 + terminology 六词条。lean 定稿要点(2026-09-09):install 期身份预分配 / 库存战斗域 / 恒定表值(attack_up 死行)/ F5 草稿重 roll / 道具段照常消耗 + 清图槽允许 buff 行两拍板。registry `reward_table` + `reward_config` 两条目;**下游义务 B1×6 + D1×5 缺项即 blocking**(见门禁增补记录 B4 块 + full 评审增补块);缺口预检 2 项阻塞级 deferral 至 B1;日志 `design/gdd/reviews/b4-reward-item-economy-review-log.md`) | `design/gdd/b4-reward-item-economy.md` | -| B1 | 战斗结算规则 | **Approved**(2026-09-10 /design-review NEEDS REVISION 8 blocking → 同日修订批核销〔①完美排雷 ×2 真实双份交付载体 + p_perfect 载体域 {100,200} + 高光有效兑付/降级规则 ②F5 挖穿残余池模型重推——条款⑤ verdict 翻转为未闭合、登记 C3/B4 约束包(C 量级上调 or 接受非支配设计态,二选一归 C3)③F5/AC-40 增多敌腿 ④行协议字段分层(target/effect_id/pool_value + enemy_action/flag_miss)⑤hit=false"标旗未中"零值行 ⑥P_perfect ÷100 成文 ⑦AC-18 腿 2 改写 ⑧F4 双口径 + 域守卫 + 护栏 B 输入登记 + clamp 八字段统一〕,用户拍板免 re-review 直接放行【A3 先例】;**recommended 19 项留后续批次**(回放输入通道穷尽/AC-6 机制承重句/呈现宣称条件句/效价维度/正侧批次键/D1 义务扩容/调参治理完整依赖表等——owner/时机见原 recommended 清单);registry 三条目同批回写(settlement_table 八字段/clause5_dominance 重登/clause3_supply 双口径);下游义务 D1×3 维持缺项即 blocking;日志 `design/gdd/reviews/b1-settlement-review-log.md`。定稿要点存档:lean 门禁 systems-designer〔Formulas F0–F5〕/qa-lead〔AC 43 条 + 覆盖矩阵 + 缺口预检 12 项〕已咨询;CD-GDD-ALIGN/art-director 按 lean 跳过留人工复核注记。**编排唯一性**(B2/B3/B4 战斗域 API 唯一调用方 + 可回放步骤流〔结算禁 await,D2 AC-15 兑现落点〕+ 零随机)· **结算触发 = Waiting 相位编排点**(不依赖事件到达序)· **段序骨架**(授予→窗口〔授予段后〕→增益/减益→道具→战斗→衰减→判定)· **23 条上游义务全落位**(B3×8/B2×6/A2×3/B4×6——AC 覆盖矩阵 23/23)· **F0 归一口径裁决**(瞬时当量;m_w −25→值域 [60,85]/默认 −65——B3 红警关闭,接口漂移回写 registry)· **条款①③⑤闭合首版验算**(对照表以 B3/B4 实例为实物;条款③默认通过〔双口径:锚行 2.0–2.6×/期望 1.2–1.5×〕、满配 unit_count=3 破线→C3 约束;条款⑤未闭合〔挖穿池模型〕→C3/B4 约束包;actuals p10 交付后强制重跑)· **高光双落**(#2 完美排雷真实双份交付 / #3 标中旗 highlight 标记——护栏 B 防钓鱼双读数约束)· **战斗段短路**(hero hp=0 即中止剩余敌作用——用户拍板)· SettlementTable 八字段回填(三行致命 manifest)· 流水行协议 13 类 + 字段分层(target/effect_id/pool_value)。registry 新增 settlement_table/clause5_dominance + 四处接口漂移回写 + 三处履行回执 + terminology 五词条;缺口预检 3 项阻塞级(A2 事件载体 ADR / σ 登记轨迹 / D1 台账)) | `design/gdd/b1-settlement.md` | -| D1 | HUD 与界面框架 | **Designed**(2026-09-13 /design-system solo 模式一次会话定稿——**专员/总监代理全部跳过,出稿待人工复核**;未经 /design-review,独立评审须新会话。定稿要点:**呈现义务台账 27 项逐项落位**(A2×6/B2×4/B3×4/B4×5/B1×3/A4×3/A3+A1 EC5——GDD Dependencies 落位表,battle.md §13 承接升格系统级验收)· **切片教训三条硬性要求兑现**(entry 17:信号载荷 schema 13 项成文表 Core Rule 17 / 场景级 headless 探针 AC-19 / 信号时点状态可见性规则 Core Rule 18 + AC-20)· 订阅纪律按 ADR-0001 收窄(呈现层只订 B1/runner + 命令式回执驱动五面成文——registry `d1_presentation_surface` 登记)· **命名统一核销**(entry 35:request_refresh / refresh_cap_per_round 正式名,AC-25 grep 断言零残留)· 程序化占位策略(art-bible §1.4 引用、样张不阻塞、占位同受数字可读性硬指标)· _draw 维持 GridContainer 裁决(ADR-0003 Decision 3——复议留样张后,OQ1)· 冲突清单 ⑧ 项(含⑤ D1 裁决:MVP 格面徽章只在已开格呈现——B4 Rule 8 承接,未开格预读随极性提案实施批)· 接口漂移登记 ×3(A3 轮内刷新计数读数缺口 / B1 settlement_snapshot 契约 / 极性提案批 D1 条目) | `design/gdd/d1-hud-framework.md` | -| A5 | 扫雷辅助道具 | 未开始 | — | -| C3 | 难度曲线与精英/Boss | Designed(2026-09-12 /design-system solo 模式一次会话定稿——**专员/总监代理全部跳过,出稿待人工复核**。定稿要点:**直填行值主体 + DifficultyTable 修饰结构位(MVP 空表)**——B2 Rule 10 兑现走接口漂移 · 投放节奏 OQ8 兑现(L1 三段:grub→伏击兽→boss_guardian)· 切片 SLICE-TUNED 行集转正 MVP 默认曲线 · **难度期望表**(通关率目标带 L1 基线 40-60% / 供给平衡带 [1.1,2.0])· F1–F7 设计期工具式(运行时零新增公式)· 调参流程 F7 六步强制 · B1 条款③⑤/预警⑥约束承接(条款⑤ MVP 接受非支配设计态 + OQ4 playtest 观测)· A4 scope=global 语义定稿(仅 Boss/精英图)· 6 个 OQ。**注意:本 GDD 未经 /design-review——solo 模式出稿,独立评审待新会话**) | `design/gdd/c3-difficulty-curve.md` | -| C2 | 冒险结构 | 未开始 | — | -| C1 | 关卡节点地图 | 未开始 | — | -| B5 | 战斗表现 | 未开始 | — | -| C4 | 元进度 | 未开始 | — | -| D3 | 存档序列化 | 未开始 | — | -| D4 | 音频 | 未开始 | — | -| D5 | 教学引导 | 未开始 | — | -| D6 | 设置/本地化 | 未开始 | — | - -## 备注 - -- 原型结论已作为 GDD 素材:小人控制、AP 8、标雷判定、奖励统一结算、增益跨轮次不跨战斗等定稿见 `design/gdd/game-concept.md` -- 概念文档待定问题(主动战斗道具、标错惩罚、节点地图形态、反雪球)将在对应系统 GDD 中解决;~~停手折算比例~~ 已随 2026-09-07 A3 RAP 结构修订作废(停手 1:1 转存 RAP、清图作废) -- **概念层增补(2026-09-09,用户定稿)**:产品名 **Dungeon Sweeper** + 世界观背景(地牢下探叙事 + 机制隐喻映射)+ 美术方向"格子 = 地牢地砖"已写入 game-concept.md;P4 支柱增命名承载。均为表现层/命名层,不触碰任何已锁机制数值与接口(A1–B3 已定稿 GDD 不受影响);art-bible 任务照旧排期(最晚 D1 GDD 前),"格子样张测试"验收项不变 -- **概念层增补(2026-09-12,用户拍板)**:叙事属名换轴——雷格 = **惩罚格**(类型化属名:首发地牢类型 = 怪物巢穴;陷阱/岩浆/冰冻化身及各自机制分化登记为未来机制侧方向归 A1/A2——"陷阱→直接扣血 / 标中陷阱→怪物受伤害"与现行"开雷→敌方优势"锁定规则的取舍归机制侧,概念层不承诺)+ 插旗玩家可见动词 = **控制**(类型无关;对内文档与机制协议仍为"旗/插旗";"封印/镇/反制"降级为类型风味词)+ 连锁展开 = **坍塌显形**(B5 连锁动画 / D4 音效方向登记)+ 标错惩罚叙事 = **控制失败的失控反噬**(随机读作失控;重复性措辞随 A2 OQ1)+ 宝箱呈现仅绑定可使用道具类奖励(非道具奖励不摆箱;"搜刮/遗落物"为可选氛围框架登记不锁)+ 世界观厚度 = **碎片点缀**(不含前人日志)——已写入 game-concept.md 世界观与命名节(映射表 + 背景句,带版本注记)与视觉锚原则 5 表现措辞;均为表现层/命名层,不触碰任何已锁机制数值与接口(A1–B4/B1/C3 已定稿 GDD 不受影响);依据记录:`design/research/lore-nest-metaphor-2026-09-12.md`(⑤节 6 问同日拍板回写);D1"控制"动词手感、art-bible 旗形态/巢感样张、D5 教学措辞、D6 结算风味词输入只在记录③登记,各归各的时机 diff --git a/design/gdd/legacy-2026-09-14-v1/a1-board-generation.md b/design/gdd/legacy-2026-09-14-v1/a1-board-generation.md deleted file mode 100644 index bc58da63..00000000 --- a/design/gdd/legacy-2026-09-14-v1/a1-board-generation.md +++ /dev/null @@ -1,681 +0,0 @@ -# A1 扫雷棋盘生成(Board Generation) - -> **状态**:In Revision · lean 格式——2026-09-09 full /design-review 判 MAJOR REVISION NEEDED,8 条 blocking 与 cheap-now 包同日修订完成,待 delta 复核放行 -> **版本**:v1.1-lean · 2026-09-13 · 作者:user + agents(systems-designer 起草 Formulas〔F1–F5 + 三轴分离口径〕· qa-lead 起草/验证 AC〔19 条 + A4×15 逐项映射〕) -> **承载支柱**:P1 主——可推理率生成端保障("出题人义务")· P4(越下越险的难度物质)· P3(雾成本空间面,间接) -> **层级**:Layer 2 Core · Milestone MVP · 设计顺序第 5 位 -> **一句话**:每当战斗编排需要一张新扫雷图,A1 从 (level_index, node_depth) 难度参数出发一次性生成完整棋盘——尺寸、雷布、初始 3×3 安全区及展开可达域、变异布置;同种子同参数必产同图,并在生成时刻承诺可推理率门槛——玩家永不看见生成器,但每一轮都踩在它铺的"我算对了"地基上。 -> **复核注记**:lean 门禁下 systems-designer / qa-lead 已委托起草;creative-director 的体验锚点情绪定位与 art-director 的呈现一致性未经咨询——生产前人工复核(体验锚点节 + 呈现与 UI 契约节 vs art-bible);评审日志 design/gdd/reviews/a1-board-generation-review-log.md - -## 速览 - -| 关键问题 | 答案 | -|---|---| -| 定位 | 确定性棋盘生成器:生成管线为无状态函数(每次调用独立、可重放),从 BoardGenTable 行参数一次性产出完整棋盘 | -| 拥有 | 五阶段生成算法 · BoardGenTable schema 与数值回填(D2 Rule 3,首个进度键表)· 可推理率度量口径(F1)· 雾参数域/可行性/成本谓词(F2/F2b/F2c)· 清图预算增量构成(F3)· 批量统计断言口径(F4)· 验收算子(F5)· A4 变异约束的生成期强制执行(A4×15 清单唯一执行落点) | -| 不拥有 | 挖掘执行(A2)· 换图编排(B1)· 难度曲线数值与调参(C3——仅类型依赖 schema,禁反向调用生成)· 变异约束声明(A4)· dig_ap_cost 价目(A3——只读引用)· "够不够"的判(清图预算判归 A1/A3 契约与 C3)· 推理器/布置算法实现选型(ADR 期)· 呈现(D1/A2/B5) | -| 上游输入 | BoardGenTable 行(D2 R1 floor 解析)· VariationTable / variant_pool_gate 谓词(A4)· dig_ap_cost(A3 只读)· board_gen 流取号(D2 RngService) | -| 下游输出 | 棋盘产物(格状态 + 变异标记 + 出生区)+ 八项生成期指标集(A2 消费、B1 对账输入)· 曲线导出工具数据面(C3)· board_biome 图类型上下文(B4 差异化插槽输入) | -| 硬约束 | 全部随机取数只经 board_gen 流(一次 open_stream = 一张图全部取数;流外零随机、randomize() 禁用)——同种子同参数必产同图 · 零字面量(读取经 ConfigDB)· 零特判产物 · 加载期校验 fail-fast | - -- 缺位后果:游戏没有难度轴(关卡×深度)、没有 P1 的源头保证、A4 的变异无布置载体、C3 的曲线无落点——A1 是 Core 层的地基,也是全项目验收债务最集中的系统(A4×15 清单 + 最小安全格数下限 + 链不可达占比生产者义务都在此落位)。 - -## 体验锚点 - -| 支柱 | 关键词 | 机制承诺 | -|---|---|---| -| P1 每一步都算数(生成端) | "这局能算"的底气 | 可推理率生成参数 = 出题人义务:每张图在生成时刻承诺"从初始安全区出发,逻辑可推导的挖掘占比不低于门槛"——D2"公平可信"的玩法侧对偶(D2 保同种子同结果的可复现,A1 保同参数同品质的可推理);玩家输给的是自己选的赌(雾区/终局盲猜),不是不可解的局 | -| P4 越下越险 | "下探的体感" | 雷密、尺寸、雾占比随 (level_index, node_depth) 爬升——难度物质由 BoardGenTable 行参数直接雕刻,非文案 | -| P3 风险与收益同源(空间面) | "雾里面有价值" | 生成期布置约束兑现:雾区无雷、雾贴雷簇(A4 Rule 3 结构推论)——洞口前的权衡是真实的信息权衡而非装饰 | - -- 情绪目标:"这局能算"的底气——A1 不制造情绪,它制造情绪的前提条件(玩家永不看见生成器,但每轮都在体验它的产物)。 -- 参考感受:扫雷原版"每局必有解"的玩家信念(原版实际不保证——本作把这份信念变成生成端契约)· Into the Breach 每张谜题可解的设计诚实。 -- 反向护栏(裁剪判据):"纯猜局"是 P1 的死亡体验——生成端若让玩家频繁坠入不可推理局面,结算端再华丽也救不回掌控感;红线 = 生成参数使可推理率跌破门槛即为阻塞缺陷(验收红线,非调参建议)。 - -## 全局流程 - -### 生成管线(五阶段,顺序冻结) - -``` -generate(level_index, node_depth, rng) -> Board + 生成期指标集 - │ ① 参数解析 ── BoardGenTable 行(D2 R1 floor 解析;域/跨字段谓词加载期已校验) - ▼ - ② 布雷 ──────── N = round(mine_density × (W×H − 9)) (先定数,9 = 出生 3×3 恒排除) - │ 在"全格 − 出生 3×3"域经 board_gen 流均匀布雷 - │ → 计算 0 格 flood 闭包及外扩 1 环 → 落在环内的雷移除 - │ 【先布后删:只减不增、不重投、无迭代、确定性终止】 - │ 实际雷数 |M| ≤ N(漂移 = 环内移除量,入指标集观测) - │ 初始 3×3 及可达域内恒无雷;N ≥ 1 由加载期谓词保证(零雷板拒绝) - ▼ - ③ 变异布置 ──── 先布雷后布雾(雾的 cell_constraint = safe_nonzero 要求雷先就位) - │ 候选池门控(消费 variant_pool_gate)→ cell_constraint 生成期强制 - │ → 出生区及可达域排除 → 雾形硬边界(厚度≤2【任意 3×3 窗口非全雾】 - │ / f≤8×mine_density)→ 区域参数来自行参数(region_count / target_ratio) - │ 多变异选取消费 board_gen 流、双实例布置身份与取号独立 - ▼ - ④ 生成-验证循环 ─ 布雾完成后测可推理率(A4 要求的雾边双向净效应因此内生于测量) - │ 实测 < target → 重试(同图种子实例内继续取数,不重开 scope) - │ 上限 max_gen_attempts 次 → 三分支出口(见出口分发表) - ▼ - ⑤ 产出与上报 ── 棋盘 + 八项生成期指标集(每阶段失败语义见状态表) -``` - -### 出口分发(验证循环三分支,F5 验收算子) - -| 出口 | 触发 | 行为 | 埋点 | -|---|---|---|---| -| 达标即出 | 存在合法尝试满足两项判据(inferability ≥ target ∧ inferability_core ≥ target) | 出最早达标尝试 k*(非全局 argmax) | attempts_used 记录 | -| 接受最优 | attempts 用尽、无达标但有合法尝试 | 出合法集内 inferability 最高者(tie 取最早、零额外取数)+ 降级标记 | 强告警埋点——运行期不死锁、开发期暴露参数问题 | -| 接受最不坏 | attempts 用尽且零合法尝试 | 确定性劣度字典序(不可达安全格数, min_safe 缺口, 序号)最小者出图 + 非法产物标记 | 最高级告警——玩家永不卡死,红线由 F4 断言 A′ 批量守 | - -## 核心规则 - -> 每条规则两段:**人话**(作用于哪个系统、什么情况下、谁触发、触发后发生什么;效果与情况用枚举表)→ **举证**(计算方法/公式;纯流程规则明写"无计算")。 - -#### 规则 1:每张新图都按固定的五步流水线生成 -**人话**:这条管生成器本体:每当换图需要一张新扫雷图(生成函数被调用一次),生成器就按固定五步跑完——读难度参数、布雷、布雾布变异、自检重试、交货。五步的先后顺序冻结:不许调换、不许跳步。 - -| 阶段 | 做什么 | -|---|---| -| ① 参数解析 | 读难度参数表里这一关这一深度的行(尺寸、雷密度、及格线、雾参数) | -| ② 布雷 | 先按密度定死雷数、再落位;0 格展开环内的雷落完再删——只减不增、不重投 | -| ③ 变异布置 | 先布雷、后布雾(雾里不许有雷,雷必须先就位) | -| ④ 生成-验证循环 | 布完雾才测可推理率,不达标就在图内重试 | -| ⑤ 产出与上报 | 交出棋盘和八项生成期指标 | - -**举证**:无计算(纯流程规则)。五步字符画见「全局流程·生成管线」;每步失败语义见「状态」节状态表。 - -#### 规则 2:每张图生成就承诺:不靠赌能挖开的格子占比达标 -**人话**:这条管图的品质评分。生成器给每张图算一个"免赌占比":评分模拟从开局展开后玩家能看见的盘面出发,与玩家信息严格同步——没开的格看不见、雷位不许偷看;能靠确定性推理挖开的安全格数除以总安全格数,就是占比。每张图要同时过两条及格线:整图占比达标,剔除雾格后的占比也达标——防"雾区无雷"这条常识单独把分数撑上去。两个占比都随图输出,供审计与批量断言。 - -| 术语 | 人话含义 | -|---|---| -| 免赌占比 inferability | 确定性推理能挖开的安全格数 ÷ 总安全格数 | -| 雾外占比 inferability_core | 同上,但分子分母都剔除雾格——两条及格线的第二腿 | -| 及格线 inferability_target | 难度参数逐行设定,取值域 [0.85, 1];域下限 0.85 = "纯猜局红线"的绝对锚 | -| 推理器 | 单点规则 + 子集消减;MVP 冻结此域——改域 = 改可推理率定义,走 GDD 修订非调参 | - -**举证**:计算方法见 F1——分子分母口径、雾格入分子的通道、次序无关性、metric_version 都在其口径注记中钉死;两条及格线同时达标的判定见 F5;推理域封闭枚举见「枚举·solver_rules」表。 - -#### 规则 3:图不达标就在图内重试,重试到顶出最好的那张并报警 -**人话**:这条管生成器的自检与兜底。布完雾测出的免赌占比没到及格线时,生成器就在这一张图的随机数配额内继续重试——重试不开新图、不重新取号,回放时仍是同一种子的确定结果。重试有上限(难度表逐行的 max_gen_attempts);到顶仍不达标,就出已试图中得分最高的那张,并发强告警——玩家永不卡死,参数问题靠告警暴露。降级率按关卡×深度埋点;调参期批量统计断言守红线:低于及格线的图占比必须严格为零。 - -**举证**:重试语义的精确形式——达标即出/接受最优/接受最不坏三分支见 F5;批量红线的阈值与样本量见 F4 与 Tuning Knobs;降级率埋点与批量断言对应 A4 ⑭ 义务;"接受最优出图 + 强告警"为用户定稿。 - -#### 规则 4:出生区保底无雷,走得到的地方不藏变异 -**人话**:这条管玩家的落点安全。开局站立的 3×3 出生区保证无雷;从出生区顺着 0 格连锁能走到的地方再外扩一圈,构成生成期的"可达域"——生成器按固定定义确定性地算出它,不依赖挖掘系统运行时的行为。可达域内永远不放变异;挖掘系统实际能展开的范围只会比它小、不会比它大(包含关系由 A2 侧回验)。 - -**举证**:无计算(几何定义)。可达域的精确构造(R₀ = 出生 3×3 ∪ 0 格 flood 闭包,外扩 1 环为保守上界)见 F1 推导;环内可有雷、只禁变异的验收口径见 AC-6(a);可达域永无变异对应 A4 Rule 7 的执行;双包含回验(A2 实际展开域 ⊆ A1 排除域)登记 A2 GDD,见依赖节下游表。 - -#### 规则 5:雾和变异按固定顺序摆放,摆不下就安静地少摆 -**人话**:这条管雾和变异怎么落到图上。生成器按固定顺序布置:先查这个关卡的变异池有没有候选,再把雾格放到允许的位置,最后守住雾形硬边界。任何一步摆不下去就静默降级——跳过变异、照常交出一张合法的无变异图,实际摆成了几个如实上报。 - -| 布置步骤 | 玩家可感的效果 | -|---|---| -| 候选池门控 | 关卡未解锁雾或主题不匹配 → 这张图本来就该无雾,空池合法非错误 | -| 雾格位置 | 雾格只落"8 邻含雷的非 0 安全格";出生区与可达域排除在外 | -| 雾形硬边界 | 任何 3×3 窗口不许全雾(雾皮厚度 ≤2);雾总量 ≤ 雷数 × 8 | -| 区域参数 | 摆几个雾区、每区目标多大,读难度参数行(region_count / target_ratio) | -| 多雾区独立 | 两个雾区相邻也各是独立实例,布置身份与随机取号互不牵连 | -| 无解降级 | 布置无解 → 跳过变异、产物合法、实际达成数按 shortfall 分级上报 | - -**举证**:无总公式。雾占比参数域谓词见 F2、产物侧结构不变式见 F5 合法性闸;静默降级契约对应 A4 EC2(连通性判据见边界情况 EC2 行);双实例取号独立对应 A4 EC11,多变异选取取数在 board_gen 流内(规则 6);候选池谓词消费 A4 的 variant_pool_gate。 - -#### 规则 6:一张图的随机数全部取自同一条流水线 -**人话**:这条管随机数纪律。生成一张图期间的每一次随机取数——布雷、雾形、选变异、重试——都从同一条名为 board_gen 的随机流里按顺序取,一张图只开一次流、用到底;流之外零随机,全局洗牌函数(randomize())直接禁用。这是"同种子同参数必产同图"的根基:回放、测试、复盘都能精确复现。 - -**举证**:无计算(纪律规则)。流机制定义见 D2 Rule 5;行为级验收 = 同种子重放逐格相同(AC-4)、一次流贯通重试(AC-5)、多变异取号独立(AC-14);randomize() 禁用走静态扫描(AC-18)。 - -#### 规则 7:雾把清图变贵了多少,生成时就算好账 -**人话**:这条管"雾的成本"记账。有些雾格没法顺着 0 格连锁免费走到,进这些雾只能一格一格花行动力硬挖——生成器数出这些"链不可达雾格",格数乘以每格挖价(挖价是挖掘系统的牌价、此处只读),得出"雾致清图预算增量",连同占比一起输出,结算侧对账用的就是这两个数。本条只在生成时算账、调参期批量核对;运行时不强制,账对不上改的是难度参数行。 - -**举证**:算式 Δbudget_fog = 链不可达雾格数 × dig_ap_cost、占比 = 该格数 ÷ 付费格数(分母下限 1)——精确口径见 F3;对账消费与聚合义务对应 B1 条款 5、A4 ⑤(跨系统对账登记 B1-CP);dig_ap_cost 牌价归 A3、只读引用。 - -#### 规则 8:安全格太少的参数组合,加载时直接判死 -**人话**:这条管退化图的门槛。每行难度参数带一个"最少安全格数"下限(min_safe_count):按参数推算全图安全格总数低于下限的组合——典型如小图配高雷密——在加载数据时直接致命拒绝、进不了游戏,对冲"图上没几格安全、随便挖挖就清图领奖励"的刷奖励漏洞。生成完成后另有一道产物断言:实际图的安全格数不得低于下限。 - -**举证**:加载期判定式 W×H − round(mine_density × (W×H−9)) ≥ min_safe_count 见 F2b(sound 保守论证同节);产物侧不变式断言见 F5 合法性闸与 AC-6(f);对冲动机对应 A3 EC5(退化图刷清图奖励)。 - -#### 规则 9:每张图带地形主题标签,主题跟关卡走、不逐图重掷 -**人话**:这条管图的"主题"数据。难度参数表每行携带一个非空的 biome 标签集合(如"地牢"),生成时随参数行一起读入;同一关卡同一深度的所有图,主题静态恒定——不存在逐图重掷主题的接口,玩家不会在同一段路里忽而地牢忽而冰窟,这是防钓鱼的结构保证。标签集合为空属致命校验错误,加载数据时直接报错。 - -**举证**:无计算(数据字段规则)。非空校验 = 加载期致命,对应 A4 ⑮ 义务;主题恒定的防钓鱼裁决对应 A3 OQ6;词表 owner 未定稿前只校验非空、不校验值域(边界情况 EC13)。 - -#### 规则 10:交出的图不需要任何系统开后门,数值全部读配置表 -**人话**:这条管产物成色与数据纪律,两件事。其一,生成器交出的图不需要任何既有系统为它写特判:每个非雷格的数字恒等于 8 邻雷数、清图判定把雾格照常计入,挖掘、结算、呈现拿到的都是自洽的普通棋盘。其二,A1 自身零硬编码:全部难度数值读配置库,代码里不写死玩法数字。 - -| 数值承载 | 说明 | -|---|---| -| BoardGenTable | 全项目第一张按进度键回填的配置表 | -| 键结构 | (level_index, node_depth),每关 depth-0 锚行前置 | -| 零字面量 | A1 代码零硬编码,一切读取经 ConfigDB | - -**举证**:无计算(架构纪律)。数字计数恒真、清图判定含雾格对应 A4 Rule 4 的产物侧兑现(AC-6(g));进度键结构与锚行对应 D2 Rule 4/6;零字面量与表加载纪律走静态扫描(AC-18/19)。 - -## 枚举 - -### 生成期指标集(八项,封闭枚举) - -| 值 | 字段 | 产出点 | 语义 | -|---|---|---|---| -| 1 | 实际 inferability(含 metric_version,当前 1) | ⑤ 产出与上报 | 实际可推理率(F1 度量);metric_version 防推理器实现漂移静默改定义(联动 F4 基线) | -| 2 | inferability_core | ⑤ 产出与上报 | 剔除雾格后的可推理率 = \|R∞∖F\| ÷ max(1, \|S∖F\|)——防雾元知识单独撑满门槛;两项判据第二腿 | -| 3 | 实际雾占比 | ⑤ 产出与上报 | 定式 = \|F\| ÷ (W×H)——与 mine_density 同分母族、f≤8d 口径自洽 | -| 4 | 实际雷数与实际 \|S\| | ⑤ 产出与上报 | 先布后删漂移观测量(\|M\| ≤ N 断言载体) | -| 5 | fog_burden_ratio | ⑤ 产出与上报 | 链不可达雾格付费格分母占比(B1 条款 5 对账精确口径) | -| 6 | Δbudget_fog | ⑤ 产出与上报 | 雾致清图预算增量(\|U\| × dig_ap_cost) | -| 7 | attempts_used | ④⑤ | 生成-验证循环实际尝试次数 | -| 8 | 降级标记 | ④⑤ | 含非法产物标记与 shortfall(实际达成区数) | - -### solver_rules(推理规则域,封闭枚举) - -| 值 | 语义 | 状态 | -|---|---|---| -| single | 仅单点规则 | MVP 未启用 | -| single_subset | 单点规则 + 子集消减 | MVP 冻结值——定义域非调参(AC-1 唯一值断言) | - -- 新增信息源 / 改规则域 = 改可推理率定义 = GDD 修订,非调参。 - -## 数值结论与推导 - -> **口径总纲**:F1 度量风险轴(免赌开据占比 + 剔除雾格的第二判据)· F3 度量成本轴(AP 负担)· F2/F2b/F2c 守参数域(加载期可判定——F2c 成本上限为确定性死线,禁墙钟逃生)· F5 定验收算子(循环三分支 + 两项判据达标)· F4 守批量红线(调参期)——三轴分离,禁互相折算:雾板可推理率高而预算负担仍在,恰为两轴必须分开的理由。推理器与布置算法的实现选型不在本节(ADR 期事务),本节只定行为契约。 - -### F1 可推理率度量(inferability_measure) - -**结论**:inferability = 免赌确定揭示格数 ÷ 总安全格数——初始展开 ∪ 连锁揭示 ∪ 推导开据三通道全部计入分子,初始展开格同时计入分母;两算子对 R 单调 ⇒ 最小不动点唯一、与开据次序无关(度量不变式);inferability_core 剔除雾格防雾元知识单独撑线;两值域均 [0,1](无雾板恒等),每图输出携带 metric_version(当前 1)。 - -#### 推导 - -``` -inferability(B) = |R∞(B)| ÷ |S(B)| -inferability_core(B) = |R∞(B) ∖ F(B)| ÷ max(1, |S(B) ∖ F(B)|) ——剔除雾格后的可推理率(防雾元知识单独撑满门槛) - -R₀ = 出生 3×3 ∪ (出生 3×3 经 0 格的 flood 闭包) ——生成期确定计算,剔除"外扩 1 格"环 -R∞ = R₀ 在下列两条闭包算子下的最小不动点: - ① 连锁:x ∈ R 且 x 为 0 格 ⇒ x 的 8 邻安全格全部入 R - (真实级联——雾格可被链开但不传播,A4 Rule 4) - ② 推导开据:c ∈ S∖R 且 c 与 R 8 邻接,且求解器在可见信息态上 - 能以合法信息源唯一判定 c 非雷 ⇒ c 入 R -合法信息源(穷尽枚举;新增信息源 = 改可推理率定义 = GDD 修订,非调参): - (a)数字约束——可见数字格上以冻结规则域 solver_rules(single_subset)推理 - (b)雾元知识——c 属于可见雾区 ⇒ c 非雷("雾区无雷"为玩家可见知识, - A4 Rule 3 / D5 教学义务——建模知情玩家,非作弊读取雷位) -``` - -| # | 口径钉死注记(Core Rule 2 的精确化) | -|---|---| -| ① | "确定性推导格数"钉死为免赌确定揭示格数——字面窄读(仅数字推导)会使任意好图远低于常规门槛,非立法本意 | -| ② | 初始展开格计入分子与分母(S 含初始格、R₀ ⊆ R∞)——与 P1 承诺语句"从初始安全区出发,逻辑可推导的挖掘占比不低于门槛"对齐 | -| ③ | 雾格入分子的两通道:链可达雾格经算子①入分子;与 R∞ 邻接的链不可达雾格经信息源(b)入分子;恒无 R 邻格的雾格计入终局残余——与挖掘相邻性(A3 限 8 向相邻)口径对齐,公式本身不变。雾格挖掘是零雷险行为(玩家可见知识)故计入"免赌"口径;其 AP 全价代价不在此度量、由 F3 单独承载(两轴分离);"免赌 ≠ 可推理"的度量空心风险由第二达标判据(inferability_core)与 F2 雾占比绝对上限 0.25 合围 | -| ④ | 求解器初始可见态取 0 格 flood 闭包内芯而非保守可达域全体("外扩 1 格"环非自动展开的必然产物,计入会高估玩家信息);须与 A2 立对偶回验:既有"A2 实际展开域 ⊆ A1 排除域"之外,新增"A1 求解器初始态 ⊆ A2 实际初始展开域"(度量保真回验,登记 A2 GDD;若 A2 定稿展开更小,回退口径 = 出生 3×3 最小态) | -| ⑤ | 次序无关性(度量不变式):两算子对 R 单调 ⇒ 最小不动点唯一、与开据次序无关——实现可任意定序而度量不变(行为契约,兼防一类实现方差 bug;最小不动点可经单调 worklist 传播实现,不强制全板重扫描) | -| ⑥ | 每图指标输出携带 metric_version(当前 1)——防推理器实现漂移静默改定义(联动 F4 基线);未来改 R∞/信息源域则 version=2 + 向量重制,仅增判据与指标集不动 R∞ 定义时 version 不跳变 | - -**附带合法性不变式(clearable)**: - -``` -clearable(B) :⇔ ∀c ∈ S:c 与出生 3×3 在"安全格 8 邻接图"上连通 -``` - -- 理由:inferability 门槛不蕴含可清图——终局对赌残余(拉低可推理率)与矿壳包围的不可达安全格(使 cleared 永不可达)是正交缺陷(1 个不可达格在 126 安全格的板上仅拉低 0.008、0.95 门槛照过,而该板功能性残废);故清图可达性是合法性谓词(违规 = 该次尝试判废重试,非"接受最优"候选),与质量度量分属两闸(验收算子见 F5)。 - -**Variables:** - -| 变量 | 类型 | 范围 | 说明 | -|---|---|---|---| -| B | 棋盘实例 | —— | 一次尝试的产物(含雷布、雾布、出生区) | -| S(B) | 格集 | ⊆ 全格 | 安全格全集(分母;含雾格、含初始格、含不可达格) | -| F(B) | 格集 | ⊆ S | 雾格集(雾区无雷,由布置约束保证) | -| R₀ / R∞ | 格集 | R₀ ⊆ R∞ ⊆ S | 求解器初始可见态 / 免赌揭示闭包 | -| solver_rules | enum | {single_subset} 冻结 | 推理规则域(定义域非调参;信息源(a)的边界) | - -**验算与边界:** - -| 项 | 内容 | -|---|---| -| Example | 12×12 图(144 格),mine_density=0.15 → N = round(0.15×135) = 20(设环内移除 0,\|M\|=20)、S=124;雾 2 区共 9 格。R₀=21,全图 0 级联闭包 58(含 5 个链可达雾格);数字推导开据 51 + 雾元知识开据 4(链不可达雾格)+ 推导触发级联 8 = 63 → R∞=121;残余 3 格 = 一处终局非确定对 + 1 孤立残余格。inferability = 121/124 ≈ 0.976 ≥ target 0.95;inferability_core = (121−9)/(124−9) = 112/115 ≈ 0.974 ≥ 0.95 → 两项判据达标,attempts_used=1 | -| Output Range | inferability ∈ [0, 1]、inferability_core ∈ [0, 1](无雾板两值恒等);合法产物下下界 ≥ 9/\|S\| | -| 边界 | target = 1 要求全图零非确定残余(小图高密下结构性难达——合法参数,由 F4 红线暴露、不加载期拒绝);target < 0.85 加载期拒绝;不可达安全格若存在则先触发 clearable 违例(合法性闸),不会以"拉低质量分"方式静默出图 | - -### F2 雾占比参数域谓词(fog_domain_ok)+ F2b min_safe 可行性谓词 + F2c 成本可行性谓词 - -**结论**:三谓词加载期可判定、违规即致命——雾占比域 (count=0 ⇒ f=0) ∨ (count≥1 ∧ 0 < f ≤ min(8d, 0.25) ∧ f<1);min_safe 可行性 W×H − round(d×(W×H−9)) ≥ min_safe_count;布雷数下限 round(d×(W×H−9)) ≥ 1;成本可行性 attempts×W×H ≤ 16384。 - -#### 推导 - -``` -fog_domain_ok(r) :⇔ (r.fog_region_count = 0 ∧ r.fog_target_ratio = 0) - ∨ (r.fog_region_count ≥ 1 ∧ 0 < r.fog_target_ratio ≤ min(8 × r.mine_density, 0.25) - ∧ r.fog_target_ratio < 1) (0.25 = 雾占比绝对上限) - -min_safe_feasible(r) :⇔ r.board_width × r.board_height - − round(r.mine_density × (r.board_width × r.board_height − 9)) - ≥ r.min_safe_count (9 = 出生 3×3 恒排除的下界;sound 保守) - -布雷数下限:round(r.mine_density × (r.board_width × r.board_height − 9)) ≥ 1 - (零雷板拒绝——初始展开即 cleared 的 A3 EC5 钓鱼活体、标中旗经济恒空、F4 全断言隐形穿越) - -cost_feasible(r) :⇔ r.max_gen_attempts × r.board_width × r.board_height ≤ 16384 - (F2c——C = 16384 为 provisional 量级护栏,正式值归 OQ2 ADR; - 运行期无墙钟时间逃生【文本级契约:耗时依赖输出即破同种子同图】, - 确定性死线必须加载期可判定) -``` - -- **与 Schema 校验的关系**:F2 是 Tuning Knobs 节跨字段谓词的规范化合取形,等价——Schema 校验行采本规范形消除分歧,(count=0, f>0) 角点已入 AC-2 违例集。 -- **必要上界推导(边计数)**:每雾格 ≥1 条到非雾雷的邻接边 ⇒ 邻接边数 ≥ \|F\|;每雷 ≤ 8 邻 ⇒ \|F\| ≤ 8\|M\| ⇒ f ≤ 8d。必要 ≠ 充分:连通性缺口(雷膨胀皮肤碎裂,A4 EC2)不由本式判定,由静默降级 + F4 兜底。 -- **F2b sound 性论证**:N = round(d×(W×H−9)) 先定数、先布后删只减不增 ⇒ \|M\| ≤ N ⇒ \|S\| = W×H − \|M\| ≥ W×H − round(d×(W×H−9))——round 取整钉死后恒成立(其他取整为非法实现);计数可行 ≠ 连通可行——clearable 生成期闸不可互替。 -- **F2b 为 Schema 校验行 delta**:min_safe_count 原仅产物侧不变式(Rule 8),参数侧联合不可行域(小图×高密×高下限)现于加载期拦截。 - -**与 inferability_target 的联合可行域——裁决:不加第三条跨字段校验。** - -| # | 裁决要点 | -|---|---| -| 1 | 无可判定静态界——inferability 由 0 格拓扑、雾形、出生位置主导,聚合参数不决定它,任何 sound 加载期联合谓词要么空洞要么误杀 | -| 2 | 架构既定——暴露机制就是"运行期接受最优不死锁 + 强告警埋点 + 调参期批量断言",第三闸重复且更弱 | -| 3 | 补偿保证(与 F4 绑定生效)——F4 红线 + 降级率埋点使联合不可行域在首次批量生成时必然现形 | -| 4 | 裁决边界——拒绝的是 inferability 可行性静态联合谓词(无可判定静态界);雾占比绝对上限 0.25(度量语义护栏)与 F2c 成本谓词(确定性成本死线)均有可判定形式且不声称预测 inferability,不在该裁决覆盖内 | -| 5 | 回写义务(advisory 非校验)——target、fog_target_ratio、mine_density 同向调高时降级率结构性上行,属参数域边界而非实现缺陷 | - -**验算与边界:** - -| 输入 | 判定 | 依据 | -|---|---|---| -| (d=0.15, f*=0.12, count=2) | ✓ 放行 | 域内 | -| (d=0.06, f*=0.50) | ✗ 致命 | 0.50 > 8d = 0.48 | -| (count=3, f*=0) | ✗ 致命 | 一致性腿(count ≥ 1 ⇒ f > 0) | -| (count=0, f*=0) | ✓ | level 1 无雾行标准形 | -| (count=0, f*=0.05) | ✗ 致命 | count=0 ⇒ f=0 腿(角点) | -| (d=0.15, f*=0.85, count=32) | ✗ 致命 | 0.85 > 0.25 雾占比绝对上限——极雾行加载期判死 | -| F2b:10×10、d=0.10、min_safe=50 | ✓ | 100 − round(0.10×91) = 91 ≥ 50 | -| F2c:10×10×16 = 1600;12×12×16 = 2304 | ✓ | ≤ 16384 | -| F2c:64×64×32 = 131072 | ✗ 致命 | 该组合换图相位同步卡顿秒级至百秒级 | -| Output Range | bool,加载期判定;0.25 = 雾占比绝对上限(MVP 量级护栏非推导界,堵"极雾行以雾元知识撑满可推理率"的度量空心);F2b sound 保守、计数可行 ≠ 连通可行;F2c 禁墙钟时间逃生(耗时依赖输出即破同种子同图),正式值归 OQ2 ADR | —— | -| 极端行为 | d=0.5 时 8d=4,f<1 成为绑定约束;d→0 时几乎任何正 f 均被拒(小雾量在稀雷图结构性不可布,属正确拒绝);f > 0.25 恒拒(与 d 无关);attempts×W×H > 16384 恒拒 | —— | - -### F3 清图预算增量构成(fog_budget_increment) - -**结论**:U = F ∖ Chain₀(链不可达雾格全价段);Δbudget_fog = \|U\| × dig_ap_cost;fog_burden_ratio = \|U\| ÷ max(1, \|S ∖ Chain₀\|)(付费格分母——B1 条款 5 对账精确口径);无运行期强制——A1 只拥有量的计算与输出,不拥有"够不够"的判(归 A1/A3 契约与 C3)。 - -#### 推导 - -``` -U(B) = F(B) ∖ Chain₀(B) Chain₀(B) = R₀ 经算子①(0 格级联)单独闭包的可达集 -Δbudget_fog(B) = |U(B)| × dig_ap_cost (量纲闭合:格 × AP/格) -fog_burden_ratio(B) = |U(B)| ÷ max(1, |S(B) ∖ Chain₀(B)|) -``` - -| # | 口径钉死注记 | -|---|---| -| ① | A4 排除声明与 A1 Rule 7 所称"链不可达雾格占比"的 B1 条款 5 对账精确口径 = fog_burden_ratio(付费格分母——雾在最小清图 AP 负担中的权重);雾内部分母版本 \|U\|/\|F\| 不单列输出——可由指标集(实际雾占比 + Chain₀/U 重算)按需还原,不作对账输入 | -| ② | 分母 = \|S ∖ Chain₀\| = 最小清图付费挖掘格数(初始展开与连锁免费、其余每格 dig_ap_cost——A3 价目只读引用),分母下限 1 防全连锁退化板除零 | -| ③ | 链可达性取决于未开 0 格隐藏拓扑,玩家决策时点不可求值——本式是生成期事后度量(A4"玩家侧按全价做预算"的保守启发式不与本式冲突,两口径服务不同主体) | -| ④ | 聚合义务(A4 ⑤ 公式化):逐板计算入指标集;调参期按行批量聚合出核算报告供 C3 修正行参数;无运行期强制 | - -**Variables:** - -| 变量 | 类型 | 范围 | 说明 | -|---|---|---|---| -| U(B) | 格集 | ⊆ F | 链不可达雾格集(全价段) | -| Chain₀(B) | 格集 | R₀ ⊆ Chain₀ ⊆ S | 纯 0 级联可达集(免费段,含初始展开) | -| dig_ap_cost | int [1,8] | 当前 1 | A3 价目,只读引用(knob 归 A3) | - -**验算与边界:** - -| 项 | 内容 | -|---|---| -| Example | F1 例板:F=9、链可达雾 5 → U=4;dig_ap_cost=1 → Δbudget_fog = 4 AP;付费格 = 124 − 58 = 66 → fog_burden_ratio ≈ 0.061 | -| Output Range | Δbudget_fog ∈ [0, \|F\|×dig_ap_cost]、fog_burden_ratio ∈ [0,1](量纲闭合:格 × AP/格) | -| 边界 | fog_region_count=0 → 两值恒 0;U=F(雾区全部链不可达)→ 雾板退化为纯 AP 税——A4 反向护栏与 B4 定价约束的观测对象;U=∅(雾全链免开)→ 雾零成本——B4"糖果区"病理在此指标上直接现形 | - -### F4 批量统计断言(batch_statistical_assertions,调参期离线) - -**结论**:批量域 = BoardGenTable 全部行键,每行 N=256 样本(σ 基址打包使行区间两两不交);断言 A 两项判据严格零、A″ target 绝对下限 0.85、A′ 非法产物零容忍、B 达成区占比 ≥ 0.95(仅 count≥1 行)、B′ 无雾行零含雾板、E 难度方向 advisory——严格零阈值与 0.85/0.25/16384 同属结构冻结(调整走 GDD 修订非调参)。 - -#### 推导 - -``` -批量域 = BoardGenTable 全部行键 (L, D)(R1 floor 解析保证任意请求点归行) -批(L,D) = { generate(L, D, derive_at("board_gen", σ(L,D) + i)) : i ∈ [0, N) } - (derive_at 纯函数、不推运行期计数器;σ 基址清单入版本库,批量跨迭代可复现) - -断言 A(可推理率红线,用户定稿):∀行:|{ b : inferability(b) < target行 ∨ inferability_core(b) < target行 }| = 0 - ——严格零(两项判据批量对照) -断言 A″(target 绝对下限):∀行:target行 ≥ 0.85(provisional 锚——加载期域 [0.85,1] 之外的调参期兜底) -断言 A′(非法产物零容忍,F5 配套):∀行:|{ b : 非法产物标记 }| = 0 -断言 B(雾出现下限 + 降级率上限,仅 count ≥ 1 行):实际达成区数 = fog_region_count 的板占比 ≥ 0.95 - (一并承载 A4⑭"出现率下限/降级率上限"两件套) -断言 E(难度方向 advisory):对 schema 标记 monotone_in_depth 的字段,同 level 沿 depth 弱递增 - ——违例 warning 级开火(不拦合法呼吸位设计,调参期人工复核) -断言 B′(反向断言,仅 count = 0 行):含雾板数 = 0(门控泄漏 = bug 信号,转 bug 流程非调参) -报告 C:按行 p10/p50/p90(实际 inferability)、p50/p90(Δbudget_fog 与 fog_burden_ratio) - ——p10 供 B1 条款 3 对账(消费 actuals 分布而非 target 参数) -诊断 D(非断言):重试率(attempts_used ≥ 2 占比)、attempts_used 均值、EC2 shortfall 分级分布 - -MVP 默认:N = 256/行;σ(L,D) = 10^9 + 2^20·L + 2^12·D -(位打包使行区间 [σ, σ+255] 两两不交、远离运行期取号域不变——朴素 1000·L+D 打包在 D≥1000 时 - 精确碰撞〔(1,1001) ≡ (2,1)〕且同 L 相邻深度行批量区间 255/256 种子重叠; - 登记种子按失效协议全部重搜——夹具 σ 为登记时值) -``` - -| # | 阈值裁定理由 | -|---|---| -| ① | 红线严格零(用户定稿):A1 反向护栏已定"跌破门槛 = 阻塞缺陷"——任何一例失败即触发参数修正会话,迫使决策显式化;运行期"接受最优/最不坏"是安全网,批量红线是调参期纪律 | -| ② | N=256:95% 下限的稳定通过要求真实出现率 ≥ 0.98(3σ 余量 ≈ 99.97%) | -| ③ | 雾出现下限 0.95 而非 1.0:EC2 连通性降级是合法运气事件,5% 容差容纳自然方差(收紧为达成区占比后,同时容纳完全降级与部分达成两类合法运气事件);系统性病理(level 2 小图低密关雾成片失败)呈现 ~0% 出现率,与 0.95 相距悬殊,检出无歧义 | -| ④ | 断言 B′ 零成本反向杠杆:门控 bug(如 level 1 出雾)一例即现形 | -| ⑤ | 成本:行数 × 256 板 × ≤32 attempts 的生成+求解模拟,离线分钟级(成立域 = worklist 级求解实现 ∧ 大面积行稀少;naive 全板扫描实现 + 数行 48×64 板即小时级——分片续跑义务见 OQ2) | - -**Variables:** - -| 变量 | 类型 | 范围 | 说明 | -|---|---|---|---| -| N | int | 256(MVP 默认) | 每行批量样本量 | -| σ(L,D) | int | ≥0 | 批量种子基址(版本库清单) | -| target行 | float [0,1] | 行读值 | 该行 inferability_target(期望由表值推导,不写死) | - -**验算与边界:** - -| 行 | 断言结果 | -|---|---| -| 行 (2,0)(fog unlock 关)N=256 | 两项判据达标 256/256 → A 通过;达成区数 = count 的板 251/256 = 0.980 ≥ 0.95 → B 通过;重试率 3.1% → 诊断记录 | -| 行 (3,2) | 达成区数 = count 的板 220/256 = 0.859 < 0.95 → B 失败 → 修正行参数(区域数/尺寸/密度侧保证,禁放宽 A4 Rule 3) | -| 极端行为 | target 1.0 的行在断言 A 下大概率开火(合法、预期信号);断言 B′ 失败即实现缺陷而非参数问题 | - -### F5 生成-验证验收算子(attempt_acceptance) - -**结论**:合法性闸前置——legality = clearable ∧ \|S\| ≥ min_safe_count ∧ 结构不变式全过,不可清图产物不进"接受最优"候选(质量分不得掩盖功能残废);达标即出(k*,两项判据同时满足,非全局 argmax)→ 无达标有合法则接受最优(k**,tie 取最早)+ 强告警埋点 → 零合法则接受最不坏(k***,确定性劣度字典序)+ 最高级告警 + 非法产物标记——玩家永不卡死,批量红线由 F4 断言 A′ 守。 - -#### 推导 - -``` -合法尝试集 Lm = { B_k : legality(B_k), 1 ≤ k ≤ max_gen_attempts } -legality(B) :⇔ clearable(B) ∧ ( |S(B)| ≥ min_safe_count ) - ∧ 结构不变式全过(雾约束 cell_constraint / 出生区及可达域排除 / - 厚度≤2【任意 3×3 窗口非全雾】/ f≤8d / 数字计数恒真 / 初始展开不触雾) - -B_out = B_{k*},k* = min{ k : B_k ∈ Lm ∧ inferability(B_k) ≥ target ∧ inferability_core(B_k) ≥ target } - (达标须两项判据同时满足——剔除雾格判据防止"雾区无雷"知识单独撑线; - 达标即出、非全局 argmax——重试语义的自然形式化) -若 k* 不存在且 Lm ≠ ∅:B_out = B_{k**},k** = min{ k : inferability(B_k) = max_{j∈Lm} inferability(B_j) } - + 强告警埋点 + 降级标记(tie 取最早,零额外取数) -若 Lm = ∅(attempts 耗尽零合法):接受最不坏尝试出图(用户定稿)——确定性劣度字典序 - k*** = min{ k : (不可达安全格数, max(0, min_safe_count − |S(B_k)|), k) 字典序最小 } - + 最高级告警 + 非法产物标记(玩家永不卡死;批量红线由 F4 断言 A′ 守) -``` - -| # | 注记 | -|---|---| -| ① | 全部尝试共用同一 board_gen 流实例(Rule 3/6),k*、k**、k*** 与 B_out 同为流取数的确定函数——回放语义闭合;scope 事件边界操作定义 = 生成函数完整返回(重试不产生新取号)——D3 快照切点天然落在边界外(D2"消费侧遵守"条款的 A1 具体化);生成期表值单次读取(行参数在生成开始时快照,生成期内不重读——防热重载撕裂 attempt 语义,A4 EC8 同族) | -| ② | 合法性闸(clearable/min_safe)在质量评分之前:不可清图产物不进入"接受最优"候选——否则质量分会掩盖功能残废 | -| ③ | "接受最不坏"分支的确定性劣度 = (不可达安全格数, min_safe 缺口, 序号) 字典序——零额外取数、可重放 | -| ④ | B1 编排不得把 attempt 边界当 scope 事件(登记 B1 接线注记) | - -### 显式排除声明(归属表) - -| 排除对象 | 归属 | A1 边界 | -|---|---|---| -| 每行难度数值与曲线(尺寸/密度/门槛/雾参数取值及其随 (level_index, node_depth) 的曲线,含 max_gen_attempts 取值策略) | C3 调参(经 D2 R1 解析/编排器传递,禁反向调用生成) | MVP 参考行仅为 schema 自洽性证明,非平衡事实、非回填默认值 | -| 挖掘风险不等式(A3 F1 条款 3) | B1 单一闭合对账 owner | A1 义务止于供给锚值 = actuals 分布(F4 报告 C 的 p10)而非 target 参数 | -| 弃图支配性(条款 5) | B1 闭合 | A1 供给锚值 = 实际 inferability 分布 + fog_burden_ratio(生产者义务);两态验算与两条方向性护栏归 B1/B4 | -| 清图总预算可用量与全量校验判据 | A1/A3 契约(A4 排除声明既定) | A1 只算量(F3),不拥有"够不够"的判 | -| 推理器实现(single_subset 具体规则集、数据结构、传播算法)与布置算法 | ADR 期事务 | GDD 只冻结行为契约(合法信息源穷举、禁作弊读取、次序无关性、规则域枚举冻结、metric_version) | -| 战斗侧 / 奖励定价 / biome 词表 | B1/B2/B3/B4/C1/D1 域 | A1 的 board_biome 仅是非空 StringSet 数据字段 | - -**措辞登记(registry 级,防口径漂移)**:inferability 是盘面级免赌占比(生成侧);P(安全) 是单格认知概率(决策侧、经济口径)——免赌集内 P(安全) 恒 = 1(含雾格),风险讨论收缩到残余集(其安全格占比 ≤ 1 − inferability)。inferability 是 P(安全) 的生成端结构性上界代理之占比形式,不是 P(安全) 本身。 - -### MVP 参考行(provisional——仅 schema 自洽性证明,C3 持调参所有权) - -| 字段 | L1·D0 参考行 | L2·D0 形状校验行 | -|---|---|---| -| board_width / board_height | 10 / 10 | 12 / 12 | -| mine_density | 0.10 | 0.12 | -| inferability_target | 0.95 | 0.92 | -| solver_rules | single_subset(冻结) | 同左 | -| min_safe_count | 50 | 60 | -| max_gen_attempts | 16 | 16 | -| fog_region_count / fog_target_ratio | 0 / 0(level 1 候选池空标准形——A4 F1) | 1 / 0.10(≤8×0.12 ✓——F4 断言 B 首个真实考验行) | -| board_biome | {"dungeon"}(词表 owner 未定稿,仅占位) | 同左 | - -- 自洽性验证:F2/F2b/F2c 全过(10×10×16 = 1600、12×12×16 = 2304 ≤ 16384);期望 \|S\| ≈ 91、R₀ ≈ 12–20 → inferability 期望 ≥ 0.95(L1 无雾 ⇒ core ≡ inferability;L2 雾 ~14/144 格、core 判据轻度收窄仍期望 ≥ 0.92——两项判据同时达标;attempts_used ≈ 1,F4 全绿理论位形)。 - -## 状态 - -生成管线为无状态函数(每次调用独立、可重放)——五阶段失败语义: - -| 阶段 | 失败条件 | 语义 | -|---|---|---| -| 参数解析 | 行缺失(R1 保证有行)/ 参数域违例 | 加载期校验已拦(D2);运行期不失败 | -| 布雷 | N = 0(round(d×(W×H−9)) = 0——零雷板加载期拒绝:A3 EC5 钓鱼活体 + F4 全断言隐形穿越) | 运行期不失败(域内 N ≥ 1 恒可布;先布后删见 Core Rule 1②) | -| 变异布置 | cell_constraint 无解(连通分量不足——A4 EC2) | 静默降级:跳过变异、产物合法、shortfall 上报(⑦⑬) | -| 验证循环 | 三分支(F5 验收算子) | 达标尝试存在 → 达标即出(k*,两项判据);attempts 用尽无达标但有合法 → 接受最优 + 强告警埋点;attempts 用尽且零合法 → 接受最不坏(确定性劣度字典序)+ 最高级告警 + 非法产物标记——玩家永不卡死,红线由 F4 断言 A′ 批量守 | -| 产出 | —— | 棋盘 + 八项指标集(见枚举节) | - -不变式:管线无状态、五阶段顺序冻结、生成期表值单次读取、attempt 边界 = scope 事件边界(重试不产生新取号)。 - -## 边界情况 - -| 条件 | 行为 | 依据 | -|---|---|---| -| EC1 候选池为空(雾未解锁如 level 1,或 biome_tag 全不匹配) | 静默布置无变异图——空池合法非错误(参考行 L1 即此形态) | A4 EC1/F1 的 A1 执行语义 | -| EC2 cell_constraint 无解(非 0 安全格面积或连通分量尺寸不足) | 本次布置尝试失败 → 跳过变异、产物为合法无变异图;BoardGenTable 要求 N 区而实际达成 k A1 无自有渲染面与 UI——视觉义务是数据供给规格,呈现归 D1/A2/B5;无音频需求。 - -| # | 数据面义务 | 归属 | -|---|---|---| -| 1 | biome/tag = 换皮数据锚:BoardGenTable.board_biome 与产物携带的 biome 标签是新 biome 色板变体的唯一数据源——新 biome 不新增资产只换色板,前提是 A1 产物正确携带标签 | D1/art-bible | -| 2 | 变异格标记保真:产物的雾格标记是 D1"边界可见"呈现(A4 D1 行规格)与"已开雾格 = 地板无字"的数据前提——标记错误即呈现欺骗(P1 诚实边界的生成侧根基) | D1 | -| 3 | 雾区连通域信息:EC6 双雾区呈现合并归 D1 渲染域,A1 只保证实例身份与取号独立(AC-14),不保证视觉分离——D1 侧规格不受 A1 约束 | D1 | -| 4 | 数字可读性的生成侧前提:数字 = 8 邻雷数恒真(AC-6(g) 断言)——数字可信是"数字可读性"样张测试(game-concept 风险 #1)的逻辑前提 | D1 | -| 5 | 无 HUD 常显字段、无结算面——玩家对 A1 的全部感知都经"棋盘本体";生成期指标不面向玩家(遥测/审计域) | A2/D1 | - -## Tuning Knobs - -### BoardGenTable schema(D2 承载,本 GDD 回填 owner——首个进度键表) - -| 字段 | 类型/范围 | knob | 说明 | -|---|---|---|---| -| board_width / board_height | int [8, 64] | ✓ | 图尺寸(MVP 量级护栏,非推导界) | -| mine_density | float (0, 0.5] | ✓ | 雷密度(尺寸解耦;f≤8d 分母对齐;上界为 MVP 护栏) | -| inferability_target | float [0.85, 1] | ✓ | P1 门槛——可推理率下限(承重 knob;域下限 = "纯猜局红线"绝对锚) | -| solver_rules | enum {single, single_subset} | ✗ 冻结 | 推理规则域(MVP 恒 single_subset——定义域非调参) | -| min_safe_count | int [1, 999] | ✓ | 最小安全格数下限(A3 EC5 对冲) | -| max_gen_attempts | int [1, 32] | ✓ | 生成-验证循环重试上限 | -| fog_region_count | int [0, 32] | ✓ | 雾区域数参数(0 = 本行无雾) | -| fog_target_ratio | float [0, 1) | ✓ | 雾面积占比参数(跨字段校验见下表) | -| board_biome | StringSet 非空 | ✓ | 图类型标签(F1 输入前提;域校验致命) | - -**加载期校验(违规均加载期致命,D2 Rule 6 通道)**: - -| 校验 | 判定式/内容 | 出处 | -|---|---|---| -| R1 键结构 | (level_index, node_depth) + depth-0 锚行 | D2 既有 | -| 字段域校验 | 九字段类型域全谱;inferability_target ∈ [0.85,1](P1 绝对锚) | 本表 | -| 跨字段雾参数谓词 | `(fog_region_count = 0 ⇒ fog_target_ratio = 0)` ∧ `fog_region_count ≥ 1 ⇒ (0 < fog_target_ratio ≤ 8 × mine_density ∧ fog_target_ratio < 1 ∧ fog_target_ratio ≤ 0.25)`——F2 规范合取形(Schema 校验行采本规范形);0.25 = 雾占比绝对上限,MVP 量级护栏非推导界,堵"极雾行以雾元知识撑满可推理率"的度量空心 | F2 | -| 布雷数下限 | `round(mine_density × (W×H − 9)) ≥ 1`(零雷板拒绝) | F2 | -| min_safe 可行性谓词 | `W×H − round(mine_density × (W×H − 9)) ≥ min_safe_count`(sound 保守、论证见 F2;计数可行 ≠ 连通可行——clearable 生成期闸不可互替) | F2b | -| 成本可行性谓词 | `max_gen_attempts × W × H ≤ 16384`(provisional 量级护栏,正式值归 OQ2 ADR;运行期禁墙钟时间逃生——耗时依赖输出即破同种子同图) | F2c | -| monotone_in_depth 字段标记(可选,非 knob) | 难度方向声明(size/density/target 类标记;fog_region_count 允许教学性非单调、不标)——F4 断言 E 载体,只校验方向不校验数值,数值所有权仍归 C3 | F4 断言 E | - -**第三轴落点登记**——game-concept 定稿难度 = f(关卡序号, 节点深度, 精英/Boss 修饰);下表为本表冻结键 (level_index, node_depth) 的约定: - -| # | 约定 | -|---|---| -| ① | Boss 图 = 各 level 最大深度(Dmax)行:关底 Boss 恒为该关最后节点,Dmax 行即 Boss 行(线性关零成本表达) | -| ② | 精英节点:schema 预留 elite_ / boss_ 前缀字段命名空间(与 D2 DifficultyTable Rule 4 对称;本 GDD 不定义任何修饰数值、不预写修饰枚举) | -| ③ | C1/C3 定稿强制重审(OQ6):若节点形态使精英性无法由 (level_index, node_depth) 唯一确定(分支地图同深度并存精英与普通节点),走 D2 Rule 4 既有改键通道(接口漂移迁移)——迁移退路已在冻结当下登记,非无后门的死冻结 | - -### Knob 表 - -| Knob(表行值,D2 承载) | 参考(L1/L2) | 调过高 | 调过低 | -|---|---|---|---| -| board_width/height [8,64] | 10×10 / 12×12 | 决策带宽膨胀、清图时长拉长 | 逼近 min_safe 联合域(F2b 拦截线) | -| mine_density (0,0.5] | 0.10 / 0.12 | 推理窗收窄、可推理率难达标(F4 断言 A 开火);f≤8d 分母水涨船高 | 图面空旷、奖励密度稀 | -| inferability_target [0.85,1] | 0.95 / 0.92 | 重试率升、深行联合不可行(F2 裁决:无静态闸,F4 必然现形) | 域下限 0.85 = P1 绝对锚(加载期拒绝 + F4 断言 A″ 兜底)——"纯猜局混入"红线自此有可判定载体;0.85 本身的调整走 GDD 修订非调参 | -| min_safe_count | 50 / 60 | 小图联合无解(F2b 加载期拦截) | 退化板钓鱼复现(A3 EC5 对冲失效) | -| max_gen_attempts [1,32] | 16 | 生成耗时随 attempts×面积×传播深度超线性涨(对边长最高三次方量级;F2c 成本闸拦病理组合,OQ2) | 降级率上行、质量下行 | -| fog_region_count | 0 / 1 | 信息剥夺过重(P1 落差);F4 断言 B 压力 | 低于雾出现率下限 → A4"解锁新变异"推进感哑火(A4⑭ 义务) | -| fog_target_ratio [0,1) | 0 / 0.10 | 逼近 8d 上界 → 布置降级率升(连通性,EC12 两闸注记);> 0.25 加载期拒绝(F2 雾占比绝对上限腿) | 雾存在感弱、P4 推进感哑火 | -| board_biome | {"dungeon"} | ——(词表 owner 未定稿,暂只校验非空) | —— | - -- **非 knob(结构冻结)**:solver_rules(定义域)、键结构与 depth-0 锚(第三轴登记约定见上表)、五阶段顺序、合法信息源穷举枚举、F4 断言 A/A′ 严格零阈值(改阈值走 GDD 修订)、先布雷后布雾顺序、attempt 边界 = scope 事件边界、target 域下限 0.85 / 雾占比上限 0.25 / F2c 常数 16384(provisional 量级护栏——调整走 GDD 修订非调参)。 -- **工具参数(登记默认非玩法 knob)**:N=256/行、σ 基址公式(版本库清单)。 -- **Knob 交互**:density × fog_target_ratio 同向调高 → 降级率结构性上行(F2 advisory);target × density 联合可行域无静态闸(F2 裁决,F4 兜底);尺寸 × min_safe 联合(F2b)。**跨 GDD 引用**:ap_per_round / dig_ap_cost 归 A3、unlock_level / cell_constraint 归 A4——禁止两表间复制参数(D2 Rule 1)。 - -## 验收标准 - -### 测试口径 - -| 口径 | 要点 | -|---|---| -| 测试载体 | A1 是生成函数系统——冒烟载体 = `godot --headless --script`(承 D2 冒烟框架;脚本 extends SceneTree、autoload 显式实例化) | -| 被测函数面 | `generate(level_index, node_depth, rng) -> Board`(+ 生成期指标集) | -| 度量独立入口 | qa-lead 裁决、分解面声明:推理器(R∞/inferability/metric_version)、F3 度量(Chain₀/U/Δbudget_fog/fog_burden_ratio)、合法性谓词(legality/clearable)以独立纯函数入口暴露——生成函数内嵌调用与独立入口同一实现,独立入口不引入新逻辑、仅暴露 F1/F3/F5 已定义的函数;独立入口的行为断言即内嵌调用的行为(次序无关性、防作弊等白盒性质测试以此为载体);若实现期 ADR 裁决推理器不可独立调用,AC-7/8/9/12 的单元腿须降级重议——登记缺口 G1,门禁评审列为 A1 实现契约条款 | -| 只读观测量 | 产物格状态(雷布/数字/0 格/雾区标记/出生区)+ 八项指标(实际 inferability【含 metric_version】/ inferability_core / 实际雾占比【= \|F\| ÷ (W×H)】/ 实际雷数与实际 \|S\| / fog_burden_ratio / Δbudget_fog / attempts_used / 降级标记【含非法产物标记与 shortfall】) | -| 测试种子取号 | 经 `derive_at("board_gen", σ)` 纯函数(D2 R2 预览语义的测试侧合法用途,不推运行期计数器);测试脚本以该种子构造流实例属测试通道合法动作(AC-18 扫描豁免域);运行期 replay 语义(open_stream 全真路径)另测(AC-5) | -| 夹具策略 | 默认根 = MVP 参考行 L1·D0 / L2·D0(干净检出)——参考行是 GDD 定稿的 schema 自洽性证明行,期望全部由表读值推导、对 C3 调参免疫;行为变体经 `--data-root` 夹具根注入(禁拷入 data/tables/);黄金图板与病态板经 Board class_name 直引程序构造(不经生成器、不经 load()/preload()——A4 AC-5 先例);夹具规格见下表;登记种子(σ 值)依赖管线确定性:一经验证恒成立,实现或定义变更致失效 → 按失效协议重搜并登记(与黄金向量失效协议同源) | -| 黄金图回归向量协议 | 五类手工核验小板,每板 = 显式坐标规格(尺寸/雷集/雾区格集/出生 3×3,程序构造不经生成器)+ 登记常数((\|R∞\|,\|S\|) 整数对、含雾板另登记 (\|R∞∖F\|, \|S∖F\|) core 整数对——由既有坐标规格派生、向量不重制、关键格 R∞ 成员表、clearable、Chain₀/U 格集、Δbudget_fog、fog_burden_ratio 比对形 = 整数对 (\|U\|, max(1,\|S∖Chain₀\|))、metric_version=1——整数对比对,禁浮点容差)+ 逐格手工推导记录(每格声明信息源 ∈ {数字约束(a)、雾元知识(b)、0 格级联①},入版本库随向量文件——手工常数的登记依据);比对内容 = 度量独立入口 + 合法性谓词输出与登记常数逐位相等;失效处置协议 = 失配先按冻结定义复核手工推导,推导无误即实现缺陷(修实现);solver_rules/合法信息源域/metric_version 变更 = 换 solver_rules 即失效,走 GDD 修订 + 向量重制(推理域冻结的非调参性质的行为侧兑现) | -| 黄金板设计要求 | ⅰ 纯数字推理板(无雾;须含仅 single_subset 规则可开的推导格)· ⅱ 链密集板(0 格级联闭包主导)· ⅲ 含雾板(须同时含:链可达雾、链不可达雾、邻接出生 3×3 的雾区、寂静减项证据格、雾锚增项证据格【雾元知识开据格】)· ⅳ 终局对赌残余板(inferability 严格 ∈ (0,1) 的非确定残余)· ⅴ 不可达安全格板(clearable 违例形态) | -| 期望值推导纪律 | 行为类 AC 期望 = ConfigDB/表读值推导(inferability_target/min_safe_count/max_gen_attempts/fog_region_count/unlock_level/dig_ap_cost/σ 公式全读值),不写死玩法数值;唯一例外 = 黄金图向量手工常数(依据 = 手工推导记录);参考行 GDD 自注期望(\|S\|≈91 等)为说明非断言,任何 AC 不采用 | -| 致命类独立进程协议 | 承 D2 AC-2b / A4 AC-4b——runner manifest 逐条登记"夹具根 → 期望退出码"(AC-3 三行,均 ≠0);单进程内只做测试通道收集断言;每用例先 `reset_diagnostics()`(承 D2 冒烟协议;warning/error 断言一律经诊断收集器) | -| out-of-scope 覆盖声明 | deferral 以对侧登记为生效条件——见 out-of-scope deferral 表 | - -### 夹具规格 - -| 夹具根 | 内容(F2/F2b 均过,除违例根外) | 用途 | -|---|---|---| -| `a1_fog_domain` | f>8d 违例行 | AC-2/3(致命) | -| `a1_min_safe` | 10×10/d=0.10/min_safe=92(F2b 违例:100−round(0.10×91)=91<92) | AC-2/3(致命) | -| `a1_biome_empty` | board_biome=∅ 行(A4⑮) | AC-2/3(致命) | -| `a1_pool_empty` | VariationTable 测试行(biome_tag=[ice]、unlock_level=1,承 A4 variation_biome_tag 同型)+ BoardGenTable 两行:(1,0) board_biome={dungeon}(pool=∅)/ (1,1) board_biome={dungeon,ice}(pool 非空) | AC-13 | -| `a1_high_target@k` | 12×12/d=0.12/target=1.0/fog=1 区 0.05/min_safe=60/attempts=k∈{1,2} | AC-5/11 | -| `a1_ec5@k` | 10×10/d=0.45/min_safe=1/target=0.85(域内合法档)/fog=0/attempts=k∈{1,2,8,16};σ* 登记(@1 零合法验证种子) | AC-12 | -| `a1_two_regions` | 10×10/d=0.15/count=2/f=0.12/target=0.85/attempts=16;σ 登记 | AC-14 | -| `a1_ec2_press` | f := 8×d 计算值恰界行(程序内动态赋值);σ*′ 登记(shortfall>0 搜索种子) | AC-15 | - -### out-of-scope deferral(以对侧登记为生效条件) - -| 编号 | deferral 内容 | 对侧 / 生效条件 | -|---|---|---| -| O1 | B1 接线——attempt 边界非 scope 事件的编排侧断言、指标对账消费(actuals p10 非 target)归 B1 GDD AC(A1 侧生成半边已由 AC-5 计数器断言覆盖) | B1 GDD 登记 | -| O2 | F4 全量——N=256/行 × 全行的断言 A 严格零/B 0.95/报告 C/诊断 D = 调参期离线批量工具域(工具本体为 A1 交付物,登记 OQ;σ 基址清单入版本库),冒烟仅载缩样(AC-10) | 批量工具交付登记 | -| O3 | A2 集成——双包含回验(A2 实际展开域 ⊆ A1 排除域;A1 求解器初始态 ⊆ A2 实际初始展开域)登记 A2 GDD(A1 半边由 AC-6(a) 测试 BFS 对照承载) | A2 GDD 登记 | -| O4 | fault-injection 缺载体——EC7 生成中热重载(同步单调用无重入点,构造性成立且注入不可)、EC10 内部异常 fatal、EC4 tie-取最早(需精确同分尝试)deferral 至实现期注入设施或可选种子搜索会话 | 实现期登记 | -| O5 | 性能预算——生成耗时/换图相位无定稿预算值(Tuning Knobs OQ),perf-profile 期承载 | perf-profile 期 | -| O6 | 呈现域——EC6 雾区视觉合并归 D1、biome 色板换皮归 D1/art-bible | D1/art-bible 登记 | -| O7 | C3 全行审计——曲线导出工具全行矩阵 diff 为 C3 期交付物(D2 OQ5 既有排期) | C3 期 | - -### AC 清单(Given-When-Then,编号不变,19 条) - -| AC | Given | When | Then | -|---|---|---|---| -| AC-1 | 干净检出(默认根 = MVP 参考行) | 冒烟加载 Core Rules-3 表清单 | ConfigDB Ready:BoardGenTable 含 (1,0)/(2,0) 锚行(R1 结构义务;不断言行总数——C3 加行免疫);九字段类型域断言(域 = Schema 表范围);solver_rules 定值 = single_subset(非 knob 冻结——唯一值断言);其余八 knob 字段仅域断言(参考行值 provisional,期望由表读值推导);诊断收集器零 error 零 warning(域内零诊断) | -| AC-2 | BoardGenTable schema class_name 直引程序构造行实例(每腿先 reset_diagnostics()) | validate() 作用于违例集:f>8d · fog_region_count≥1 ∧ f=0(一致性腿)· f≥1(禁全覆盖腿)· fog_region_count=0 ∧ f=计算正值(count=0 ⇒ f=0 腿)· f=0.30 ∧ d=0.15(> 0.25 绝对上限腿,8d=1.2 未绑定)· mine_density := 0.4/(W×H−9) 计算值(round = 0 → 布雷数下限腿)· attempts×W×H > 16384(F2c 成本上限)· F2b 违例(10×10/d=0.10/min_safe=92——边界值由 F2b 公式对构造参数求值导出)· board_biome=∅;再作用于合法集:count=0∧f=0(L1 标准形)· f := 8×d 计算值恰界(防浮点字面量歧义)· min_safe := W×H−round(d×(W×H−9)) 计算值恰界 · board_biome={未定稿占位词}(EC13——只校验非空、值域不校验) | 违例集各含对应致命类别;合法集零诊断 | -| AC-3 | 夹具根 a1_fog_domain / a1_min_safe / a1_biome_empty | 各以独立 headless 进程跑游戏通道 load_tables(root, collect_only=false) | 三进程均非 0 退出且错误清单完整;runner manifest 登记:fog_domain→≠0 · min_safe→≠0 · biome_empty→≠0 | -| AC-4 | 默认根 L2 行与登记种子 σ₀ | generate(2, 0, rng) 以 derive_at("board_gen", σ₀) 播种之流实例执行两遍;再以 σ₁≠σ₀ 同行生成 | 两遍产物格状态逐格相同 + 八项指标集全等(含 attempts_used);σ₁ 产物与 σ₀ 产物不全同(种子接入退化护栏) | -| AC-5 | set_master_seed(42) 后的 RngService(全真路径);夹具根 a1_high_target@2(target=1.0 必触发重试) | 以第 1、2 次 open_stream("board_gen") 实例分别驱动 generate;generate 前后读 RngService 只读计数器;同帧连续两次 generate(EC14) | 产物与 derive_at("board_gen", 0/1) 播种产物逐格相同(生成侧无流外取数);计数器差恰 1(attempts>1 共用一次 open_stream——attempt 边界非 scope 事件、重试不重开取号);同帧计数器差 2、各产物与各自 σ 播种产物一致(串行生效、无锁语义) | -| AC-6 | 缩样产物集(默认根 L1·D0/L2·D0 各 N=8;σᵢ = 10⁹+2²⁰·L+2¹²·D+i〔F4 公式缩样版〕i∈[0,8)) | 对每板断言 | 全板全腿通过:(a) 出生 3×3 内零雷零变异;R₀ 芯(0 格 flood 闭包——测试侧朴素 BFS 重算,仅依赖"0 格 8 邻传播"公开定义)内零雷零变异;闭包外扩 1 格环内零变异、环内可有雷(芯内数字格的邻雷恒在环内——所引义务原文只禁变异不禁雷,禁断言环内零雷)(b) R₀ 芯(去外扩环)内零变异(初始展开不触雾)(c) 雾格 ⊆ cell_constraint 合法集——非雷、非 0、8 邻含雷(A4②)(d) 任意 3×3 窗口非全雾(厚度≤2 窗口谓词,A4⑫)(e) 雾格数 ≤ 8×雷数(f≤8d 产物侧)(f) \|S\| ≥ min_safe_count(表读值,Rule 8)(g) 非雷格数字值 ≡ 8 邻雷数(数字计数恒真,Rule 10)(h) 全板零非法产物标记 | -| AC-7 | Board class_name 直引程序构造板(与黄金向量同批构造设施) | 合法性谓词作用于:雷墙包围孤立安全格板;\|S\|0 搜索,协议同 AC-12;搜索无解的后备语义见缺口 G4) | (a) 检查指标集;(b) generate | (a) 指标集含实际达成区数(shortfall)字段且 ≤ fog_region_count 表读值;(b) 降级标记=雾布置降级、shortfall < count 表读值、产物仍过 AC-6 全腿(合法少变异/无变异图)、error 级诊断零新增(静默降级——warning/埋点级不算违静默) | -| AC-16 | 任意冒烟产物(AC-6/10/14/15 批次复用) | 指标完备性检查 + F1/F3 重算 | 八项指标字段完备(实际 inferability【含 metric_version=1】/ inferability_core / 实际雾占比【= \|F\| ÷ (W×H)】/ 实际雷数与实际 \|S\|【并断言 \|M\| ≤ round(d×(W×H−9)) 表读值】/ fog_burden_ratio / Δbudget_fog / attempts_used / 降级标记【含非法产物标记+shortfall】);F1/F5 两项判据重算一致:inferability_core = \|R∞∖F\| ÷ max(1, \|S∖F\|);F3 重算一致:从产物重算 Chain₀/U → Δbudget_fog = \|U\|×dig_ap_cost(A3 表读值)、fog_burden_ratio 以整数对 (\|U\|, max(1, \|S∖Chain₀\|)) 比对(付费格分母口径——B1 条款 5 对账精确形);fog_region_count=0 行(L1)雾相关四值恒 0 且 core = inferability | -| AC-17 | ConfigDB 加载完成(生效前提注明:registry board_gen_table 条目与本 AC Phase 5b 同批回填——无条件断言,条目缺位即失败,非条件豁免) | 脚本解析 design/registry/entities.yaml 的 board_gen_table 条目 | 与 BoardGenTable 九字段定义(字段名/类型/域/knob 标记)逐一相等;值对账仅限非 knob 字段(solver_rules=single_subset);八 knob 字段值不对账(参考行 provisional——C3 调参豁免) | -| AC-18 | A1 文件集(生成器/度量入口/谓词/schema/冒烟脚本) | 按 D2 AC-9 模式静态扫描 | 玩法代码文件集零 randomize()、零自建 RandomNumberGenerator 构造(tests/ 路径豁免——derive_at 取号需以种子构造流实例,D2 预览语义的测试侧落地;玩法文件集不豁免);零 ConfigDB 外 data 表加载(schema class_name 直引豁免——A4 AC-5 先例);零 Control/场景类 import;AC-1 headless 实跑通过合成判定(Rule 7) | -| AC-19 | A1 文件集 | 纳入 D2 AC-14 项目级人工三要素字面量扫描 | 人工三要素口径,引用不另设(A4 AC-10 同型)——无未登记字面量 | - -### 覆盖矩阵(qa-lead 交付,验收评审用) - -| 类别 | 映射 | -|---|---| -| Core Rules | 1→AC-4/5/6(c)/16(布雷语义)· 2→AC-8/9/10(a)/16(两项判据)· 3→AC-10/11/12 · 4→AC-6(a)(b)/7(芯/环口径)· 5→AC-6(c)(d)(e)/13/14/15 · 6→AC-4/5/14/18 · 7→AC-16 · 8→AC-2/3/6(f) · 9→AC-1/2/3/13 · 10→AC-6(g)/17/18/19 | -| Formulas | F1→AC-8/9/7/16 · F2/F2b/F2c→AC-2/3(角点/上限/布雷数下限/成本上限)· F3→AC-16 · F4→AC-10(全量 O2;断言 A″/E 属 O2)· F5→AC-10(e)/11/12/7 | -| EC | EC1→13 · EC2→15 · EC3→7/8 · EC4→11(tie O4)· EC5→12(玩家侧语义登记 B1/D1 域)· EC6→14(合并 O6)· EC7→O4 · EC8→10(c) · EC9→2/11 · EC10→O4 · EC11(F2b)→2/3 · EC12→2/15 · EC13→2 · EC14→5 | -| A4 义务 | ①→13 · ②→6(c) · ③→6(a)(b) · ④→8/16(core 常数补强)· ⑤→16 · ⑥→13 · ⑦→15 · ⑧→4/14 · ⑨→7/8 · ⑩→2/3 · ⑪→14(间接承载——共置+确定性,无取号耦合差分)· ⑫→6(d)(e)/2 · ⑬→15(部分覆盖:面积判据实现同样通过 a1_ec2_press——取号耦合差分夹具登记待核销)· ⑭→10/O2(断言 B 收紧达成区占比)· ⑮→2/3 | -| 规模 | 19 条 AC + A4×15 全落位 + 黄金五板;⑪ 差分承载与 ⑬ 差分夹具登记待核销(间接承载已注明),5 处标注问题的修正明细见评审日志 | - -## 开放悬案 - -| # | 悬案 | owner | 时机 | -|---|---|---|---| -| 1 | F4 全量批量工具的 owner 排期:调参期红线工具(断言 A/A′/B/B′ + 报告 C + 诊断 D,N=256/行)——与 D2 OQ5 曲线导出工具同批登记排期(排期倒挂:A1 定稿→首行数值回填→即需抽查;临时载体 = 冒烟缩样 AC-6/10,统计意义有限,如实登记) | A1 交付物 / C3 消费 | C3 调参期前 | -| 2 | 生成性能预算与异步化选项:① 预算数值定稿——F2c 谓词形式已冻结(max_gen_attempts × W×H ≤ C),C = 16384 为 provisional 占位,ADR 裁定正式 C 与 headless debug 基准(如"64×64 单次求解 ≤ X ms");② 解空间圈定——死路二:attempts 并行化(毁 board_gen 流序即毁回放)、分帧/协程化(跨帧在飞 open_stream 实例与 D2 快照切点契约冲突,需 D3 扩容修订);活路四:同步 + 加载幕(B1 换图相位)、主线程分帧 + D3 快照扩容修订、WorkerThread + D2 EC13 单线程假设接口漂移修订(join 先于任何快照切出)、B1 预测性预生成(线性图结构的死时间生成——scope 计数器推进时点须入回放语义);③ 实现姿态约束——最小不动点可经单调 worklist 传播实现(次序无关性不强制全板重扫描——F1 注记⑤),禁全对全子集比较(ADR 验收底线);④ F4 全量工具须支持分片续跑("分钟级"成立域 = worklist 实现 ∧ 大面积行稀少,见 F4 阈值⑤) | 实现期 ADR / perf-profile | Technical Setup | -| 3 | 度量独立入口分解面确认:推理器/F3 度量/合法性谓词三入口暴露(AC-7/8/9/12 单元腿前提——缺口 G1);若 ADR 裁决不暴露,四条 AC 单元腿降级重议 | 实现期 ADR | 实现期 | -| 4 | biome 词表 owner 定稿:board_biome 值域现只校验非空(EC13);词表定稿后补域校验 + 参考行占位值替换(接口漂移) | B4/C1 域 + AD 门禁 | 垂直切片前 | -| 5 | 黄金向量手工推导第二人复核:五板逐格推导记录入版本库后安排复核(qa-lead 缺口登记——推导错误即假失配) | A1 定稿评审 | A1 /design-review | -| 6 | 精英/Boss 第三轴落点重审:节点形态定稿后强制重审——① Dmax 行约定是否覆盖全部 Boss 场景 ② 精英节点是否需第三键维 / elite_、boss_ 字段激活(分支地图同深度并存精英与普通节点时);激活即走 D2 Rule 4 改键通道 + 本表 schema 修订(接口漂移迁移,退路已登记 Tuning Knobs 节) | C1/C3 GDD | C1 定稿时 | - -## 版本历史 - -| 版本 | 日期 | 改动 | -|---|---|---| -| v1.1-lean | 2026-09-13 | 格式迁移:legacy 原稿按 lean 样例(docs/lean-gdd-sample-b1.md)重排——正文修订注记剥离收敛至本表;速览/体验锚点/枚举/边界情况/义务台账/覆盖矩阵/AC 转表格;生成管线转字符画 + 出口分发表;F1–F5 公式本体、Variables 与验算数据全保留;语义与 2026-09-09 修订批对齐,零规则变更 | -| 2026-09-09 修订批 | 2026-09-09 | full /design-review 判 MAJOR REVISION NEEDED,8 条 blocking 同日修订:两项达标判据 + inferability_target 收窄 [0.85,1] 绝对锚;AC-6(a) 改写(环内可有雷);雷数取整钉死 + 布雷语义(先布后删)+ N≥1 零雷护栏;F2 ≡ Schema 跨字段校验合流(count=0 ⇒ f=0 腿);AC-11 前提腿(Lm(1)≠∅);断言 B 收紧为达成区占比;第三轴登记约定 + elite_/boss_ 后门;F2c 成本闸 16384 + 禁墙钟。cheap-now 包:σ 打包修复(10^9 + 2^20·L + 2^12·D)、F1 注记③改口(雾格入分子两通道)、\|U\|÷\|F\| 删承诺、monotone_in_depth + 断言 E、EC5 玩家侧语义登记。覆盖矩阵"无洞"自称修正为 5 处标注问题(已修 4 处,差分两项登记待核销)。日志:design/gdd/reviews/a1-board-generation-review-log.md | -| v1 定稿 | 2026-09-08/09 | 一次会话定稿:五阶段管线 + F1–F5 + 三轴分离口径 + 19 条 AC + A4×15 逐项映射;四结构决策(生成-验证循环 / 接受最优 + 零合法接受最不坏 / 推理域 single_subset 冻结 / 密度浮点)与 F4 严格零红线为用户拍板;lean 门禁 CD-GDD-ALIGN 跳过,生产前人工复核体验锚点情绪定位 | diff --git a/design/gdd/legacy-2026-09-14-v1/a2-minesweeper-rules.md b/design/gdd/legacy-2026-09-14-v1/a2-minesweeper-rules.md deleted file mode 100644 index 747154d6..00000000 --- a/design/gdd/legacy-2026-09-14-v1/a2-minesweeper-rules.md +++ /dev/null @@ -1,704 +0,0 @@ -# A2 排雷玩法规则(Minesweeper Rules) - -> **状态**:Approved · lean 格式 -> **版本**:v1.0-lean · 2026-09-13 · 作者:user + agents(systems-designer 起草 Formulas · qa-lead 起草/验证 AC) -> **承载支柱**:P1 主("每一步都算数"的执行面:连锁放大推理兑现、数字恒真、拒绝可辨)· P4(小人边缘探索的氛围本体)· P3(旗承诺与雷险的规则执行面)· P2(三事件流 = 结算归因的数据源) -> **层级**:Layer 2 Core · Milestone MVP · 设计顺序第 6 位(上游 A1/A3/A4/D2 均 Approved) -> **一句话**:A2 持有 A1 产出的棋盘、执行全部棋盘面规则,把发生的事实以恰好三种事件外发——全项目的事件源头系统。 -> **复核注记**:lean 门禁下 systems-designer 起草 Formulas(F1–F4 + 反例 B 阻断缺口)、qa-lead 起草/验证 AC(23 条 + 覆盖矩阵 + 夹具坐标规格);creative-director 的体验锚点情绪定位与 art-director 的呈现一致性未经咨询——生产前人工复核(art-bible §1–4 须在 D1 GDD 前创建)。 - -## 速览 - -| 关键问题 | 答案 | -|---|---| -| 定位 | 扫雷层玩法规则引擎 · 全项目事件源头系统(A2 不依赖任何下游——systems-index TD-SYSTEM-BOUNDARY 唯一回边,B4/D1/D5 挂其事件、瓶颈系统规则一次定稳)· 初始展开定义落点(A3 EC5 委派)与标错惩罚悬案(OQ1)承载方 | -| 拥有 | 全部棋盘面规则:小人控制 · 8 向相邻判定 · 连锁展开 flood fill · 数字提示 · 旗子棋盘状态 · 清图判定;三事件发射面(cell_revealed / flag_judged / round_end 棋盘路径);install 四不变式;F1–F4 四条行为契约 | -| 不拥有 | 资源账本(A3——判棋盘面后调 try_spend,禁自行扣减)· 轮次编排(B1)· 奖励内容(B4)· 棋盘生成(A1)· 变异规则(A4——只透传生成期快照标记)· 呈现(D1)· 数值字面量 / 表读取 / RNG | -| 上游输入 | A1 棋盘产物(格状态 + 变异标记 + 出生区)· 玩家动作意图序列(经 D1 提交)· A3 相位观测量 + try_spend 结果 + last_round_end | -| 下游输出 | 三事件流(B4/B1/D1/D4/D5 消费)· request_dig(chain_size, clears_map) 上报(A3)· compute_move_path 路径预览数据(D1) | -| 硬约束 | 零随机 · 零数值字面量 · 零表读取 · 零 UI/输入设备依赖——给定棋盘与意图序列 ⇒ 事件流逐位确定;`--headless --script` 完整可驱动(规则层与输入/呈现解耦:输入是意图对象、输出是事件流,D1 与输入设备皆可替换) | - -A2 是扫雷层的玩法规则引擎与事件源头:接收玩家动作意图(挖 / 插旗 / 拔旗 / 移动 / 停手),执行全部棋盘面规则,把发生的事实以恰好三种事件外发;没有 A2,A1 的板、A3 的预算、B1 的结算都失去发生地。 - -### 术语表(白话首定义集中于此;已登记 registry 术语条目) - -| 术语 | 白话定义 | -|---|---| -| 双包含回验 | A1 与 A2 互检两条包含关系——臂① A2 实际初始展开域 ⊆ A1 生成期排除域(保证开局不触雷不触变异);臂② A1 求解器初始可见态 ⊆ A2 实际初始展开域(保证 A1 的度量不吃亏)。恰等 = 两集合逐格相等(不多开不少开) | -| 零特判 | A2 代码不为变异写任何 if 分支——变异只是随格携带的只读标记透传,行为差异全部由生成端约束保证 | -| 规范序 | 事件发射的固定顺序(触发格 BFS、8 邻行主序)——同输入必得同顺序,禁实现自选遍历序 | -| 语义序仲裁 | 批次内不按玩家提交顺序、而按"清图挖 > 停手 > 其余"的固定类别顺序结算 | -| 双发射源 | round_end 有两个合法发射者——棋盘路径(ap_exhausted/cleared)由 A2 发、停手路径(stopped)由 A3 直发,payload 同构 | -| 三源拒绝 | 拒绝原因来自三个互异来源——棋盘面(board_face)/ 资源面(resource_face,AP 不足)/ 相位(phase,非 Active) | -| 单意图批 / 便捷形 | settle_batch 只装一个意图时 ≡ 直接调 try_dig 等便捷 API,行为逐项相同 | -| voided | 轮次结束后未获执行的批次意图——零棋盘效果、零扣费、零事件,区别于非法拒绝 | - -## 体验锚点 - -| 支柱 | 关键词 | 机制承诺 | -|---|---|---| -| P1 每一步都算数(执行面) | "我算对了" | 数字恒真透传(雾格只是不显示,数据层永不说谎);连锁传播与生成端度量同构(F2 ≡ A1 F1 算子①);每个拒绝携带可辨原因(board_face/resource_face/phase 三源)——系统回应的每一格都与玩家推演的一致 | -| P4 地牢下探氛围本体 | "走过的伤疤" | 小人从出生安全区向雷图边缘探索:点击已探明区瞬移穿行、在未开边界挖掘;已引爆雷格可通行——雷不是探索的终点,而是走过的伤疤 | -| P3 风险与收益同源(规则面) | "赌与算都可见" | 挖开雷格不是死亡而是事实上报(kind=mine,敌方优势在轮末结算兑现);旗子是零信息收益的纯粹承诺(雾内旗恒不中也被诚实判定)——A2 不裁决得失,只保证事实流真实 | -| P2 规划延迟兑现(数据源) | "结算可归因" | 结算明细每一行归因(安全格增益/标中旗削弱/雷→伏击/清图奖励)都溯源到 A2 事件流——reward_eligible / channel / hit 字段是"可归因"的字段落点 | - -反向护栏:任何"规则层说谎"的形态——数字失真、连锁静默变异分支、拒绝原因含混——都是 P1 的死亡体验,默认砍掉;呈现层的隐藏(雾格无字)必须以数据层恒真为前提。 - -- 参考感受:经典扫雷连锁展开的"哗啦一片"(本作保留其免费与瞬时,剥夺 chord 双击——每个决策都值得花一 AP,快开是对预算意义的稀释;CD 创意风险 #3 的兑付节拍补偿归 B1/B4)· Into the Breach 的信息诚实(拒绝你的规则从不含糊其辞)。 - -## 全局流程 - -### 装板与挖掘期(事件发射主链) - -``` -install_board(board) 受理域 = Idle/Waiting + Active·仅弃图刷新路径 - │ ① 持有产物快照(生成期变异快照,非活引用——抗表重载) - │ ② 校验结构不变式 ①–④ ── 违例 → 拒绝 + board_invalid + error 诊断(fail-fast) - │ ③ 初始展开 O₀ = R₀(免费 · 计入清图 · 无奖励 · 永不触雷触雾——Core Rule 4) - │ → cell_revealed ×|R₀|,channel=initial,规范序 = 触发格 BFS、8 邻行主序 - │ ④ 小人落位 B3 中心格 - ▼ -Installed·Active ── 挖掘期:玩家意图经 D1 → settle_batch(intents)(A2 唯一结算入口) - │ dig 棋盘面判定 → A3 try_spend → 开格 + 连锁(F2) - │ → cell_revealed ×(1+chain_size),channel=dig/chain,reward_eligible 见枚举 - │ flag try_spend → 棋盘旗标记(插/拔零事件外发,反馈经调用返回值命令式驱动) - │ move 免费瞬移(不经账本,零事件;compute_move_path 供 D1 路径预览) - │ stop 先发 flag_judged ×N → 委托 A3.request_stop() - ▼ -轮次结束事务(A3 仲裁:cleared > stopped > ap_exhausted——首次为真处定胜者,余意图 voided) - │ flag_judged ×N(判定基线 = 事务开始旗位,行主序;先于 round_end——事件序契约) - │ 棋盘路径:A2 读 last_round_end 恰一次 → round_end{ap_exhausted/cleared} 外发 - │ stopped 路径:A3 直发 round_end{stopped}(双发射源——A2 禁双发) - ▼ -Installed·Frozen ── Waiting:全态冻结;编排边界受理 install_board(换新图)/ retire_board -``` - -### 批次结算(settle_batch 语义序) - -``` -settle_batch(intents) ── 单一结算事务(到达序 ⟨I₁,…,Iₙ⟩,n ≥ 1) - │ ① 分类 class(I)(批次初态求值):C_dig(执行后 clears_map=true 的 dig) - │ · C_stop(stop)· C_other(非清 dig / flag×2 / move)——真模拟 F2,禁计数器捷径 - │ ② 语义序 ≺:C_dig ≺ C_stop ≺ C_other;同类内按到达序(稳定序) - │ ③ 逐意图执行;轮次结束首次为真处定胜者 ω - │ 其后意图全部 voided(作废)——零棋盘效果 · 零 AP 扣减 · 零事件(区别于非法拒绝) - ▼ -胜者 ω → 出口分发(见下表) -``` - -### 出口分发 - -| 出口 | 触发 | 动作 | RAP | -|---|---|---|---| -| cleared | dig 胜 ∧ 结算时点 clears_map=true | A2 外发 `(cleared, new_board)` 恰一条(棋盘路径) | +0(剩余 AP 清零不入 RAP——A3 Rule 5) | -| stopped | C_stop 胜 | 先发 flag_judged ×N → 委托 A3.request_stop() → round_end`(stopped, same_board)` 由 A3 直发 | += remaining_ap(1:1) | -| ap_exhausted | 耗尽 AP 的 C_other | A2 外发 `(ap_exhausted, same_board)` 恰一条 | +0(不变式 remaining=0) | -| 继续 | 不结束轮次 | 无 round_end,继续下一意图 | — | - -## 核心规则 - -> 每条规则两段:**人话**(作用于哪个系统、什么情况下、谁触发、触发后发生什么;效果与情况用枚举表)→ **举证**(计算方法/公式;纯流程规则明写"无计算")。 - -| 符号 | 含义 | -|---|---| -| U / M / S | 全格集 / 雷集 M ⊆ U / 安全格全集 S = U ∖ M | -| F / G / O | 雾格集 F ⊆ S / 旗集 G / 已开集 O ⊆ U | -| B3 | 出生 3×3 | -| num(x) | x 的真实数字(8 邻雷数,A1 AC-6(g) 数字恒真)∈ {0..8} | -| N₈(x) | x 的 8 邻 | - -#### 规则 1:A2 只按棋盘和指令算结果,不掷骰子、不写死数值、不碰界面 -**人话**:这条管 A2 规则引擎整体的姿态:它吃两样输入——A1 产出的棋盘、玩家提交的动作意图序列;吐一样输出——由三种事件组成的事实流。任何时候,同样的棋盘加同样的意图序列,必得逐位相同的事件流。为守住这一点,A2 有四条"零"禁令: - -| 禁什么 | 意思是什么 | -|---|---| -| 零随机 | 不掷骰子、不自建随机源——全程可回放 | -| 零数值字面量 | 价格读资源账本、板面读生成产物、变异随格快照携带 | -| 零表读取 | 不直接加载任何配置表,参数全经上游 | -| 零界面/输入设备依赖 | 进入 A2 的唯一通道是意图对象——界面与输入设备皆可整体替换 | - -**举证**:无计算(姿态约束非数值)。确定性、零字面量与 headless 可驱动的依据见 D2 Rule 5/1/7;A2 玩法文件集禁现 `ConfigDB.*` 引用——静态扫描验收 AC-22,同输入同输出的行为级回放断言 AC-19/AC-20。 - -#### 规则 2:A2 对外只报三种事实——开格、旗判定、轮次结束 -**人话**:这条管 A2 的对外发言面:A2 是全项目的事件源头,下游的结算、编排、呈现都只听这三种事件——挖开一格报一次"开格",轮次结束时对每面在场的旗报一条"判中/判空",轮次结束报一次"结束"。多一个事件、少一个事件都是接口漂移,必须走 GDD 修订。事件顺序有一条铁律:同一次轮次结束里,先把旗判定全部报完,再报轮次结束——所有收轮路径统一(停手路径也一样:A2 先报旗判定、再委托收轮;停手不改旗位)。 - -| 事件 | 什么时候发 | -|---|---| -| cell_revealed(开格) | 每挖开一格——初始展开、单格挖、连锁都算 | -| flag_judged(旗判定) | 轮次结束事务开始时,每面在场旗一条 | -| round_end(轮次结束) | 轮次结束时;停手路径由 A3 直发,A2 禁双发 | - -**举证**:三种事件的字段、发射点与语义要点见下方「规则 2 的实现参照——三事件回边」;下游结算触发不依赖事件到达序(B1 强制项①);payload 验收 AC-4/6/7/8/9,事件序契约验收 AC-9/AC-10。 - -### 规则 2 的实现参照——三事件回边(发射面封闭——增删事件 = 接口漂移修订) - -| 事件 | 字段 | 发射点 | 语义要点 | -|---|---|---|---| -| cell_revealed | cell · kind ∈ {safe, mine} · digit · variant_ids · channel ∈ {initial, chain, dig} · reward_eligible | 开格事实 | digit 恒真透传(仅 kind=safe 携带;雾格携带真实数字、呈现隐藏归 D1、判定数据源 = variant_ids);reward_eligible:initial 恒 false / chain·dig ∧ safe 恒 true(含链开雾格)/ kind=mine 恒 false;发射序 = 规范序(初始/连锁 = 触发格 BFS、8 邻行主序固定序) | -| flag_judged | cell · hit | 轮末统一判定批 | 每轮次结束事务开始时对判定基线旗位逐旗一条(基线 = 轮次结束事务开始时的旗位;枚举序 = 行主序扫描,确定性) | -| round_end | path_tag ∈ {ap_exhausted, cleared, stopped} · continuation_hint ∈ {same_board, new_board} | 棋盘路径由 A2 外发 | 核心字段逐字段取自 A3 `last_round_end`(读取权为接口契约),与 A3 stopped 路径 payload 同构;stopped 路径由 A3 直发、A2 禁双发 | - -#### 规则 3:装板先验货,验不过当场拒绝 -**人话**:这条管装板命令(install_board)什么时候被受理、受理后做什么。受理域:空闲/等待相位随时可以;挖掘进行中只有"弃图刷新"这一条编排路径例外(且以账本扣费成功为前提)——其余在局内装板一律拒绝。受理后 A2 持有生成期的变异快照(不是对数据表的活引用,热重载改表不影响行为),随后当场验四条结构不变式,任何一条不过就拒绝装板并给出错误级诊断,绝不带病运行;验过才执行初始展开、把小人放到出生 3×3 中心格。 - -| 验什么 | 过不了怎么办 | -|---|---| -| 出生 3×3 内无雷 | 拒绝装板 + 装板违例诊断 | -| 出生区与初始展开域内无变异格 | 同上 | -| 每格数字恒等于 8 邻雷数 | 同上 | -| 初始展开域不是全部安全格(防开局即清图) | 同上 | - -**举证**:无计算(结构校验非数值计算)。四条不变式与诊断类别封闭枚举见「状态」节不变式表;受理域矩阵见「状态」节输入×相位×板态矩阵;装板违例验收 AC-1b/AC-2、相位组合验收 AC-16、跨段隔离验收 AC-17;产物只能经程序构造或 A1 产生,运行期不存在该输入源。 - -#### 规则 4:开局先免费翻开一片安全区,这片区域有四条铁律 -**人话**:这条管开局时刻的棋盘:装板成功的那一次事务里,A2 免费翻开出生 3×3 加上与之连通的空地闭包(每次装板执行一次,跨轮不重放)。这片初始展开域与 A1 生成器求解时的初始视野逐格相等——不多开不少开,也不外加一圈"安全边距"。翻开时守四条铁律: - -| 铁律 | 意思 | -|---|---| -| 免费 | 不扣任何行动点,账本零写入 | -| 计入清图进度 | 剩余安全格从这片开完之后起算 | -| 无奖励 | 这些格不发奖励,下游不得入库 | -| 永不触雷触雾 | 出生区无雷 + 闭包只走安全格,在板上即可独立证明 | - -**举证**:展开域的精确定义、恰等证明与双包含回验两臂见 F3(A1 侧登记,门禁缺项即 blocking);"无奖励格不得入库"的下游义务见 B1 强制项②;初始展开的定义落点承接 A3 EC5 委派;验收 AC-1/AC-3。 - -#### 规则 5:挖/插/拔先过棋盘面检查,再扣行动点,任一步拒绝就整体不执行 -**人话**:这条管玩家三个付费动作——挖、插旗、拔旗——的执行顺序:A2 先查棋盘面(目标相不相邻、开没开过、旗位对不对),查过再请资源账本扣行动点;两边任何一边说不行,整个动作就被拒绝——棋盘不变、不扣费、不发事件。每次拒绝都带可辨认的原因,玩家一定看得到自己为什么被拒(文案归呈现层,数据源是原因码)。A2 自己绝不直接扣资源;挖成之后,连锁规模与清图事实由 A2 上报给账本。 - -| 拒绝原因来自 | 什么时候发生 | -|---|---| -| 棋盘面 | 目标不相邻、已开、有旗等棋盘上的原因 | -| 资源面 | 行动点不够,账本扣费被拒 | -| 相位 | 现在不可操作(收轮中或无板) | - -**举证**:棋盘面拒绝的完整目录与原因码封闭枚举见「枚举」节三源拒绝与 sub_reason 表;动作结果结构见「枚举」节对外 API 面 ActionOutcome 行;"禁自行扣减"见 A3 Rule 9;上报参数(chain_size, clears_map)的计算见 F2;验收 AC-4/AC-11/AC-21。 - -#### 规则 6:挖到空地,周围的空地连锁全开,不另花钱 -**人话**:这条管挖掘里的连锁:挖开一个数字为 0 的格时,它周围 8 向相邻的未插旗安全格免费连锁全开,一路递推到没有新的 0 格为止。连锁格只花首格的挖掘价、照常计入清图进度、奖励资格照常。连锁不越过旗子:旗格不入链、也不当传播源——旗由此成为玩家可用的"链阻断器",花 1 AP 插旗就能保护一格不被误链。雾格可以被链开但永不传播(生成端保证雾格数字恒非 0),代码里没有任何为变异写的分支。 - -**举证**:连锁闭包算子与两个上报参数的计算见 F2——与 A1 F1 算子①在同域逐字同构;chain_size = 附加格数(不含首格);clears_map 与清图判定是同一实现(禁第二套);连锁遇旗的逐格行为见 EC17;验收 AC-5/AC-6。 - -#### 规则 7:点击已探明的格子,小人瞬移过去,不花钱 -**人话**:这条管小人移动:点击任何已开格,小人经已开区一次瞬移到位——逐格走的动画是呈现层的事,规则层一次事务完成落位。合法条件两条:目标格已开,且能只经过已开格 8 向连通走过去("已探明区"包含已引爆的雷格——走过的雷可以穿行站立)。移动免费、不经账本、不发事件。配套的只读查询 compute_move_path 返回这条寻路路径,既是合法性判定的载体,也是呈现层画路径预览的数据源。 - -**举证**:无计算(纯流程规则;路径序为固定 8 邻行主序,确定性)。路径预览的表现归属归 D1 GDD(systems-index 门禁登记项);移动边界与幂等受理见 EC14;验收 AC-14。 - -#### 规则 8:旗插在棋盘上就跟着棋盘走,轮末统一判中没判中 -**人话**:这条管旗子:旗是棋盘状态的一部分,插上的旗跨轮保留、随图存续,换图/刷新/战斗结束随之消失;没有"口袋旗"库存,数量无上限,只能插在未开格上。轮次结束时,A2 对当时还在场上的每面旗报一条判定——旗下是雷判中、不是雷判空;雾里的旗恒判空(雾区无雷,判定零特判)。旗留在雷上就每轮诚实重复报判中,去重是结算侧的事,A2 只报事实。插拔旗本身不发事件,界面反馈走调用返回值。 - -| 旗动作 | 花费 | 发生什么 | -|---|---|---| -| 插旗 | 1 AP | 未开格上立一面旗 | -| 拔旗 | 1 AP | 旗从棋盘移除 | -| 挪旗 | 2 AP(拔 + 插) | 旗换个位置 | -| 挖有旗的格 | 拒绝 | 须先拔旗(1 AP)再挖 | - -**举证**:判定事件字段与行主序枚举见「规则 2 的实现参照——三事件回边」;判定基线 = 轮次结束事务开始时的旗位(被拔的旗不判);兑付去重与"每雷实例至多兑一次"归结算侧(A3 Rule 8/OQ5);挪旗价目见 A3 EC3/EC7、挖旗格拒绝见 A3 EC11;验收 AC-11/AC-12/AC-13。 - -#### 规则 9:一批指令按固定优先级结算,先达成结束条件的赢,其余 voided -**人话**:这条管一帧多个指令怎么结算:所有动作意图经批次入口提交——A2 唯一结算入口,单意图批等价于逐个调便捷接口。批次是一个整体事务:先按固定类别顺序重排——能清图的挖最优先,停手次之,其余殿后(同类内按提交顺序);再逐个执行,轮次结束条件第一次成立处定出胜者,其后意图全部 voided——零棋盘效果、零扣费、零事件;voided 不等于被拒绝——拒绝是"本来就不合法",voided 是"来不及了"。停手指令经批次入口转交资源系统,停手轮的结束事件仍由资源系统直发。 - -**举证**:类别定义、语义序与四组合真值表见 F4 与下方「规则 9 的实现参照——批次类别与语义序」;出口与 RAP 记账见「全局流程」节出口分发表;优先级口径与 A3 Rule 3 逐项一致;承接 A3 EC4 deferral;stop 经 settle_batch 提交、不直调 A3 的接线义务见 D1 强制项①;验收 AC-9/AC-10,边界情况 EC6/EC13/EC15。 - -### 规则 9 的实现参照——批次类别与语义序(F4) - -| 类别 | 成员 | 结算次序 | -|---|---|---| -| C_dig | dig 且执行后 clears_map = true(真模拟 F2——禁"rem=1 则任意 dig 必清"计数器捷径,反例 = 挖雷不入 S) | 最先 | -| C_stop | stop | 次之 | -| C_other | 非清 dig / flag ×2 / move | 其余(同类内按到达序——稳定序,多 cleared-dig 时最先者执行胜出) | - -- 结算循环:按语义序逐意图执行;轮次结束首次为真处定胜者 ω,其后意图全部 voided(零棋盘效果、零 AP 扣减、零事件——区别于非法拒绝);胜者 → 出口映射见全局流程出口分发表(RAP 记账随胜者,键 = 胜者意图类型 × 结算时点 clears_map 真值)。 -- 四组合 {cleared×stopped、stopped×ap_exhausted} × 两到达序与 A3 Rule 3 优先级逐项一致(真值表与到达序无关性精确口径见 F4);批次 cleared 胜出 → 剩余 AP 清零不入 RAP。 - -#### 规则 10:挖到耗尽或清图时,A2 报一次轮次结束——先报旗,再报结束 -**人话**:这条管挖掘期的两种收轮:一次挖掘结算让资源系统仲裁出轮次结束(行动点耗尽或清图胜出)时,A2 读取资源系统的轮次结束记录、组装恰一条轮次结束事件外发;外发之前先把本轮的旗判定全部报完(先旗后结束的铁律)。行动点归零的瞬间轮次即结束,不存在"0 行动点还能操作"的窗口。 - -**举证**:无计算——组包即字段转抄,核心字段逐字段取自 A3 `last_round_end`(读取权为接口契约),字段口径见「规则 2 的实现参照——三事件回边」round_end 行;验收 AC-7/AC-8;清图轮剩余行动点清零不入 RAP 见 A3 Rule 5。 - -#### 规则 11:挖到雷不是死——雷格变成可以走的路 -**人话**:这条管雷格挖开后的棋盘:挖开雷格报一条"这里是雷"的开格事件,轮次不结束、格子算已开——从此它可以通行:小人能站上去、能穿过它继续挖。雷格不计清图进度(不是安全格)、不能再挖、不能再插旗;同一轮可以连续挖开多颗雷,每颗都是独立事实。雷格通行是有价捷径:挖已知雷 = 花 1 AP + 给敌方送优势,经风险收益管线计价——是玩家主动抄近路的权衡,也是降级板上的兜底通路,不是免费通道。 - -**举证**:无计算(事件字段固定:kind=mine、无 digit 字段、reward_eligible=false)。"被迫挖雷过路"的构图被生成期拦截——A1 clearable 闸按"安全格 8 邻接图"连通计(挖雷通路不计入);工程债登记见 systems-index 门禁修正记录;验收 AC-15,边界情况 EC10。 - -#### 规则 12:没有双击快开——点已开的数字格就是移动 -**人话**:这条管一个刻意留白的操作:经典扫雷的"双击快开/数字和弦"在本作不存在,点击已开数字格的唯一含义就是移动小人——每个决策都值得花一次行动点,快开是对预算意义的稀释。这个"没有"是可验收的:对外接口是封闭枚举,里面根本没有快开入口;将来谁想加,就是接口漂移修订,必须走 GDD 修订流程。 - -**举证**:无计算。负空间验收形态 = 对外 API 面封闭枚举"无对应入口"(见「验收标准」节测试口径 API 面行与「枚举」节对外 API 面);chord 肌肉记忆首遇提示登记于 D1 强制项③;点击已开格 = 移动的行为验收 AC-4。 - -## 枚举 - -### 字段值封闭枚举 - -| 字段 | 值域 | 语义 | -|---|---|---| -| kind | safe · mine | 开格种类;kind=mine 事件无 digit 字段 | -| channel | initial · chain · dig | initial=初始展开(恒无奖励)· chain=连锁 · dig=单格 | -| reward_eligible | bool | initial 恒 false;chain/dig ∧ kind=safe 恒 true(含链开雾格);kind=mine 恒 false | -| path_tag | ap_exhausted · cleared · stopped | 棋盘路径仅前两者由 A2 外发;stopped 由 A3 直发(双发射源) | -| continuation_hint | same_board · new_board | cleared → new_board;其余 same_board | -| hit | bool | [cell ∈ M];被拔的旗不判;雾内旗恒 false(零特判) | -| intent | dig · flag_place · flag_pull · move · stop | stop 执行 = 批事务内委托 A3.request_stop | -| reject_reason | board_face · resource_face · phase · board_invalid | 三源拒绝 + 装板违例 | - -### 三源拒绝与 board_face 拒绝目录 - -| 源 | 判定 | 承载 | -|---|---|---| -| board_face | 挖:目标非 8 向相邻 / 目标已开 / 目标有旗(须先拔旗)· 插旗:非相邻 / 已开 / 已有旗 · 拔旗:非相邻 / 无旗 · 移动:目标未开 / 无 BFS 路径;目录外输入(越界坐标等)= out_of_catalog | sub_reason 封闭枚举(见下表) | -| resource_face | A3 try_spend 返回 false(AP 不足) | reject_reason=resource_face | -| phase | A3 非 Active 或无板态 | reject_reason=phase | - -### sub_reason(仅 board_face 携带,封闭枚举——"须先拔旗"与"非相邻"玩家语义截然不同的情形必须数据可分;批后修改 = 接口漂移) - -| 值 | 语义 | 适用动作 | -|---|---|---| -| not_adjacent | 目标非 8 向相邻 | 挖 / 插旗 / 拔旗 | -| target_revealed | 目标已开 | 挖 / 插旗 | -| target_concealed | 目标未开 | 移动 | -| flag_present | 目标已有旗(挖 = 须先拔旗;插 = 已有旗) | 挖 / 插旗 | -| flag_absent | 目标无旗 | 拔旗 | -| no_path | 经已开区无 BFS 路径 | 移动 | -| out_of_catalog | 目录外输入(越界坐标等)——debug 级诊断,不与玩家语义混桶、禁静默吞 | 全部 | - -### 装板违例诊断类别(board_invalid 携带,封闭枚举) - -| 值 | 对应不变式 | -|---|---| -| inv1_mine_in_spawn | ① B3 内无雷 | -| inv2a_variant_in_spawn | ② B3 内无变异格 | -| inv2b_variant_in_r0 | ② R₀ 内无变异格("R₀ 触雾"归此——②的 R₀ 子情形) | -| inv3_digit_invariant | ③ 数字恒真 | -| inv4_r0_equals_s | ④ R₀ ≠ S | - -### 对外 API 面(provisional,封闭枚举——新增入口 = 接口漂移) - -| API | 签名 | 语义 | -|---|---|---| -| install_board | `install_board(board)` | 装板 + 校验四不变式 + 初始展开(见状态节) | -| settle_batch | `settle_batch(intents)` | A2 唯一结算入口(D1 唯一提交入口;单意图批 = 平凡形) | -| try_dig / try_flag_place / try_flag_pull / try_move | `try_*(cell)` | 便捷形 ≡ 对应单意图批,行为逐项相同 | -| compute_move_path | `compute_move_path(cell)` | 只读——BFS 路径(8 邻行主序);不可达格返回空 | -| retire_board | `retire_board()` | 板实例与变异快照消亡(NoBoard 下幂等受理) | -| ActionOutcome | `{accepted, outcome, reject_reason, sub_reason}` | outcome ∈ {executed, voided, rejected};sub_reason 仅 board_face 携带 | - -## 数值结论与推导 - -> **口径总纲**:F1 定终局判定谓词(状态轴)、F2 定连锁展开算子(执行轴)、F3 定初始展开域(对偶轴——A1 度量与 A2 行为的接缝)、F4 定批次仲裁(事务轴)——四条均为行为契约,禁互相折算。本节零平衡公式(见显式排除声明)、零随机、零字面量、零 UI 依赖。 - -### F1 清图判定谓词(clear_predicate) - -**结论**:cleared ⇔ 已开集覆盖全部安全格(等价形:剩余安全格计数 rem = 0 ⟺ cleared);求值点穷举两处——install 初始展开事务尾(不变式④保证恒 false)与每次 dig 执行完成点;插旗/拔旗/移动不改已开集 → 结构上不可能触发 cleared;A3 `clears_map` ≡ 本谓词在该动作事务尾求值——单一谓词两个名字,禁第二套实现。 - -#### 推导 - -``` -cleared(σ) :⇔ O(σ) ∩ S(B) = S(B) 等价形:|S(B) ∖ O(σ)| = 0 -rem(σ) = |S(B) ∖ O(σ)| ——剩余安全格计数;rem = 0 ⟺ cleared -``` - -| # | 求值点 | 注 | -|---|---|---| -| 1 | install 初始展开事务尾 | 不变式④保证此处恒 false | -| 2 | 每次 dig 执行完成点(连锁完成后) | 批次内即逐 dig 求值——"批次 = 单一结算事务"指批次作为原子性单位,不改本条逐 dig 粒度,与 A3 `request_dig` 按次调用上报的契约一致 | - -| 项 | 判定处理 | -|---|---| -| 雷格 | 恒 ∉ S(已引爆雷格入 O 作 BFS 通道但不入判定) | -| 旗 | 不入 O 不入 S(带旗未开格照常计入 rem——"全图标旗不挖"永不 cleared) | -| 雾格 | 照常计入(A4 Rule 4) | - -**Variables:** - -| 变量 | 类型 | 范围 | 说明 | -|---|---|---|---| -| σ | 棋盘状态 | —— | (B, O, G) 三元组;B 由 A1 产物给定 | -| O(σ) | 格集 | R₀ ⊆ O ⊆ U | 已开集(含初始格、连锁格、已引爆雷格) | -| S(B) | 格集 | U ∖ M | 安全格全集(含雾格、含 R₀ 格、含不可达格) | -| rem(σ) | int | [0, \|S\|] | rem₀ = \|S ∖ R₀\|;rem=0 即 cleared 路径 | - -- Output Range:cleared ∈ bool。Example:10×10 板、|S|=88、R₀=20 → rem₀=68;挖开末 1 安全格(chain_size=3 连锁)→ O ∩ S = S → cleared,A2 经 `last_round_end` 外发 (cleared, new_board)。 - -### F2 连锁展开闭包(chain_closure)+ chain_size / clears_map 上报参数 - -**结论**:连锁闭包 = 单调最小不动点,与 A1 F1 算子①在 G=∅ 域逐字同构;chain_size = 附加格数(不含首格);clears_map ≡ F1 本事务尾求值(禁第二套实现);连锁不越旗(旗格不入链、不作传播源——集合减法非分支);含链开雾格、雾格永不传播(零特判定理非分支);Cl 单调幂等 ⇒ 逐动作增量求值 ≡ 一次全量闭包。 - -#### 推导 - -``` -Chain(O, c) = μX.[ O ∪ {c} ⊆ X ∧ ∀x ∈ X:( x ∈ S ∧ num(x) = 0 ⇒ N₈(x) ∩ S ∖ G ⊆ X ) ] -dig(c) 的棋盘效果:O′ = Chain(O, c);事件:cell_revealed × |O′ ∖ O|(BFS 规范序) -chain_size(dig(c)) = |O′ ∖ (O ∪ {c})| ——附加格数,不含首格(A3 AC-2/AC-6b 期望依赖) -clears_map(dig(c)) = [ S ⊆ O′ ] ——≡ F1 本事务尾求值 -``` - -- 与 A1 F1 算子①逐字同构(G = ∅ 域——A1 生成期与 A2 install/初始展开时旗集恒空,`S ∖ G = S`):R↔X 换名后触发谓词同(成员资格 ∧ 真实数字=0——禁读显示值,雾格显示空 ≠ 0 格)、传播目标同(8 邻安全格——雷永不入链)、封闭域同(S)、单调最小不动点语义同(次序无关性两侧成立——worklist 任意定序、结果唯一);同构主张范围 = 算子①本身(A2 无算子②推导项,不主张 O = R∞);增量合法性引理:Cl 单调幂等 ⇒ 逐动作增量求值 ≡ 一次全量闭包(与 A1 生成期同值)。 -- 零特判合规:雾格恒非 0(VariationTable 跨字段校验承重)⇒ 可被链开、永不传播——两个方向都是定理不是分支;旗格不入链是集合减法(`∖ G`)不是分支(旗是 A2 一等规则对象、非变异属性);A2 运行期旗非空时传播集排除旗格(连锁不越旗);双包含回验不受影响——回验只在 install 时点发生,彼时 G = ∅。 - -**Variables:** - -| 变量 | 类型 | 范围 | 说明 | -|---|---|---|---| -| c | 格 | U ∖ O | 挖掘目标(棋盘面合法性先行,Core Rule 5) | -| O / O′ | 格集 | 见 F1 | 挖前/挖后已开集 | -| num(x) | int {0..8} | x ∈ S | 真实数字(非显示值——漂移风险见实现期红线①) | -| chain_size | int | [0, \|S\|−1] | A3 request_dig 第一参数 | -| clears_map | bool | —— | 第二参数;≡ F1 cleared | - -- Output Range:chain_size=0 ⟺ c 非 0 格或其安全邻已全开。Example:b_chain 板挖 (3,6)(0 格)→ 级联 13 格一次开尽墙下封闭区(雷墙与板底之间的口袋形安全区,下称"封闭区"),chain_size=13、clears_map 视余量而定;全程 ap 只扣首格 1。 - -### F3 初始展开域(initial_expansion_domain)+双包含回验 - -**结论**:O₀ = R₀ = B3 ∪ flood 闭包,与 A1 F1 求解器初始态恰等(同算子同板 ⇒ 同值),显式不含外扩 1 环;恒不开雷 R₀ ∩ M = ∅ 为 A2 侧独立可证定理;双包含两臂构造性成立 ⇒ A1 回退口径(出生 3×3 最小态)不触发、度量保真零降级;退化守卫 R₀ ≠ S——install 拒绝清图退化板(不变式④纵深防御,非 A1 clearable 闸复验)。 - -#### 推导 - -``` -O₀ = R₀(B) = μX.[ B3 ⊆ X ∧ ∀x ∈ X:( x ∈ S ∧ num(x) = 0 ⇒ N₈(x) ∩ S ⊆ X ) ] - ≡ A1 F1 "出生 3×3 ∪ flood 闭包" 逐字(同算子同板 ⇒ 同值);显式不含外扩 1 环。 - -性质 1(恒不开雷,定理):R₀ ∩ M = ∅(B3 无雷 + 闭包只收安全格)——初始展开零雷险由 A2 独立可证。 -双包含回验(registry board_gen_table.a2_dual_containment 的 A2 落点): - 臂① R₀ ⊆ 排除域(以最终产物板计:出生 3×3 ∪ 闭包 ∪ 外扩 1 环)——构造性成立; - 臂② A1 求解器初始态 = R₀ ⊆ O₀ = R₀ ——恰等; - ⇒ A1 回退口径(出生 3×3 最小态)不触发,度量保真零降级。 - 注:臂①给"不触变异"保证(经排除域);"不触雷"由性质 1 独立给出(环内可有雷,两义务来源分开陈述)。 -退化守卫(不变式④):R₀ ≠ S——install 拒绝清图退化板(EC1;非 A1 clearable 闸复验)。 -``` - -**Variables:** - -| 变量 | 类型 | 范围 | 说明 | -|---|---|---|---| -| B3 | 格集 \|B3\|=9 | ⊆ U | 出生 3×3(产物携带);小人出生 = B3 中心格 | -| R₀ = O₀ | 格集 | B3 ⊆ R₀ ⊆ S | 初始展开域;下界 9(无 0 格传播时) | - -- Output Range:|R₀| ∈ [9, |S|−1](上端点被不变式④排除)。域非空前提:非空 ⟺ |S| ≥ 10——|S| = 9 的板必有 S = B3 ⇒ R₀ = S,由不变式④在 install 拒绝(EC1 同族),不产生运行态 R₀;现行 A1 参数域(W,H ≥ 8)下 |S| ≤ 9 仅程序构造板可达。 -- Example:b_spawn 板(7×7、竖墙雷 6 枚):R₀ = x≥2 全安全格 35 格,臂① R₀ ⊆ 排除域(35 + 域外安全 8 + 环内雷)✓、臂② 测试侧朴素 BFS 重算逐格恰等 ✓。 - -### F4 批次仲裁(settle_batch) - -**结论**:语义序 C_dig ≺ C_stop ≺ C_other(同类内按到达序稳定);轮次结束首次为真处定胜者、其后意图全部 voided;(path_tag, continuation_hint, AP/RAP 终值) 对任意到达序不变(全批域)——执行/voided 划分的无关性仅对异类竞争成立;同类多成员批内划分由类内稳定序决定(不同到达序 = 不同输入,均为合法确定行为非缺陷);RAP 记账随胜者。 - -#### 推导 - -``` -类别函数(排序用,批次初始态求值): - class(I) = C_dig 若 I = dig(c) 且执行后 clears_map = true(真模拟 F2——禁计数器捷径: - "rem=1 则任意 dig 必清"为假,反例 = 挖雷不入 S) - = C_stop 若 I = stop - = C_other 其余(非清 dig / flag ×2 / move) -语义序 ≺:C_dig ≺ C_stop ≺ C_other;同类内按到达序(稳定序——多 cleared-dig 时最先者执行胜出, - 其余作废;未钉死类内序会使事件流与奖励格归属漂移——规范性义务)。 -结算循环:按 ≺ 逐意图执行;轮次结束首次为真处定胜者 ω,其后意图全部【作废】 - (false + voided:零棋盘效果、零 AP 扣减、零事件——区别于非法拒绝)。 -胜者 → 出口映射(RAP 记账随胜者;键 = 胜者意图类型 × **结算时点** clears_map 真值): - dig 胜 ∧ 结算时点 clears_map=true → (cleared, new_board);RAP += 0(剩余作废,A3 Rule 5) - ——C_dig 胜者恒满足;非清 C_other dig 可因前序 C_other dig 执行变清图,按结算时点真值入此行 - C_stop 胜 → 先发 flag_judged ×N(基线 = 事务开始旗位,停手不改旗)→ 委托 - A3.request_stop() → (stopped, same_board);RAP += remaining_ap(1:1) - 耗尽 AP 的 C_other → (ap_exhausted, same_board);RAP += 0(不变式 remaining=0) - 不结束轮次 → 无 round_end,继续下一意图 -棋盘路径 round_end 由 A2 恰一次外发;stopped 由 A3 直发(双发射源纪律,A2 禁双发)。 -``` - -**四组合真值表(≡ A3 Rule 3 优先级 cleared > stopped > ap_exhausted)**: - -| # | 批次(到达序) | 结果 | RAP | -|---|---|---|---| -| 1 | [dig清, stop] | (cleared, new_board),stop voided | +0(voided) | -| 2 | [stop, dig清] | 语义序重排 → 同 #1 | +0 | -| 3 | [stop, dig耗] | (stopped, same_board),dig voided | += remaining | -| 4 | [dig耗, stop] | 语义序重排 → 同 #3 | += remaining | - -- 到达序无关性(精确口径):**(path_tag, continuation_hint, AP/RAP 终值) 对任意到达序不变(全批域)**;执行/voided 划分的到达序无关性**仅对异类竞争成立**({C_dig, C_stop} 与耗尽的组合——四组合真值表);**同类多成员批(C_dig 或 C_other)内,执行成员、棋盘终态(旗位/小人位)与划分由类内稳定序(到达序)决定——不同到达序 = 不同输入**,均为合法确定行为非缺陷(例:ap=1 下 [move, dig耗] 两意图均执行、[dig耗, move] 的 move voided 且小人位不同;[flag_place, dig耗] 旗入板、[dig耗, flag_place] 旗 voided);cell_revealed/旗事件流同理以到达序为规范序。 -- 反例检验(语义序的存在性证明):朴素到达序下 #4 产出 (ap_exhausted, RAP+0)——违反 stopped > ap_exhausted;#2 吞掉清图高光——违反 cleared > stopped(EC10 同族缺陷)。分类时点:排序用批次初态、胜者路径用结算时点真值;C_dig 成员最先执行 ⇒ 其二态恒重合;C_other dig 的二态可因**前序 C_other dig** 执行而分歧(其批内前缀不可能含 C_dig/stop——二者任一执行即收轮、C_other 全体 voided),分歧时按结算时点真值定胜者;该前缀无 stop ⇒ 与 A3 Rule 3(cleared > stopped)不可能冲突。 - -**Variables:** - -| 变量 | 类型 | 范围 | 说明 | -|---|---|---|---| -| ⟨I₁,…,Iₙ⟩ | 意图序列 | n ≥ 1 | 到达序;∈ {dig, flag_place, flag_pull, move, stop} | -| class(I) | enum 三类 | —— | 排序类别(批次初态求值) | -| ω | 意图 ∪ {∅} | —— | 胜者;∅ = 轮次继续 | - -- Output Range:(path_tag ∪ {无}, continuation_hint ∪ {无}, RAP 增量, 每意图 ∈ {执行, voided, 拒绝})。Example:ap=3、rem=1、批次 [stop, dig(末格)]:C_dig 先结算 → try_spend true、ap 3→2、事务内 cleared 胜出 → 外发 (cleared, new_board)、RAP+0;stop voided。到达序翻转结果逐项相同(#1/#2)。 - -### 显式排除声明(归属表) - -| 对象 | 归属 | -|---|---| -| 平衡公式 | 本 GDD 无——全部数值归位如下 | -| 价目、ap_per_round、RAP 规则 | A3(F4 只消费 try_spend/request_stop/last_round_end 行为契约,零数值所有权) | -| 雷布/尺寸/密度/可推理率/R₀ 与排除域定义版权 | A1(F3 是其运行期镜像;A1 侧定义修订 = 接口漂移 + metric_version 联动,A2 禁独立改动) | -| 变异约束 | A4(F2 只消费"雾格恒非 0"生成保证) | -| 奖励档位/标中旗判定/结算编排 | B 系(A2 只输出事件流) | -| 曲线 | C3 | -| A2 拥有 | 四条行为契约(F1–F4) | -| 概率/期望公式 | 零(零随机——确定性由 AC-19 行为断言承载:同板同意图序列 ⇒ 事件流逐位相同) | - -### 实现期红线(与 A1 度量的漂移风险清单) - -| # | 红线 | -|---|---| -| 1 | 0 格判定必须读真实数字 num(x),禁读显示值 | -| 2 | 初始展开禁加外扩环(破臂①)、禁只开 3×3(破臂②) | -| 3 | clears_map 与 cleared 同一实现 | -| 4 | chain_size 不含首格、链不开雷、含链开雾格 | -| 5 | A1 R₀/算子修订 = metric_version 跳变 + 本 GDD 同步修订 | -| 6 | 双包含臂①排除域以**最终产物板**计(先布后删无迭代,placed 基准可小于最终 R₀——A1 Rule 4 措辞修订义务,EC1) | - -## 状态 - -A2 的板级生命周期(轮次节拍权威在 A3/B1——A2 以 A3 相位观测量为闸,不自持轮次状态): - -| 板态 | 进入条件 | 行为/出口 | -|---|---|---| -| NoBoard | 冷启动 / `retire_board()` 后 | 全部动作 API 拒绝(phase 源);`install_board` 受理(Idle/Waiting);retire_board 幂等受理 | -| Installed·Active | 装板完成 ∧ A3 phase=Active | 接受全部动作意图;dig/旗经 `try_spend`,移动免费直达;弃图刷新 = retire + install(B1 `refresh_board` 编排,装板后回本板态);轮次结束事务 → Installed·Frozen | -| Installed·Frozen | A3 phase=Waiting(三路径任一收轮) | 全部动作意图拒绝(phase 源);棋盘/旗/小人全态冻结;`install_board`(换新图)/`retire_board` 受理(编排边界) | -| Retired | `retire_board()` 或战斗终结后编排调用 | 旗/小人/事件分段终结(事件捕获以 install 为段界)——板实例与变异快照一同消亡 | - -**输入 × 相位 × 板态矩阵**——动作意图 ∈ {dig, flag_place, flag_pull, move, stop};编排调用 ∈ {install_board, retire_board}: - -| 输入 | NoBoard | Installed·Active | Installed·Frozen | -|---|---|---|---| -| 动作意图(含 stop) | 拒绝(phase) | 受理(经批次结算器) | 拒绝(phase;A3 侧按同一致相位矩阵同判——两侧判定一致) | -| install_board | 受理(Idle/Waiting) | 受理(仅弃图刷新路径——B1 `refresh_board` 编排;非刷新路径仍拒绝——防轮内换板) | 受理(换新图 = 全态重置 + 初始展开重放) | -| retire_board | 幂等受理 | 拒绝(板态) | 受理 | - -**install 四不变式**(violation = 拒绝 + `board_invalid` + error 级诊断,fail-fast 不静默;AC-1b/AC-2 按枚举名断言): - -- 产物只能经程序构造或 A1 产生,运行期不存在该输入源。 - -| # | 不变式 | 违例诊断(封闭枚举) | -|---|---|---| -| ① | B3 内无雷 | inv1_mine_in_spawn | -| ② | B3 ∪ R₀ 内无变异格(A4 Rule 7 消费侧兜底;"R₀ 触雾"归 R₀ 子情形) | inv2a_variant_in_spawn / inv2b_variant_in_r0 | -| ③ | 数字恒真——num(x) ≡ 8 邻雷数(A2 全部规则的地基) | inv3_digit_invariant | -| ④ | R₀ ≠ S——清图退化板拒绝(防"初始展开即整图"使轮次棋盘路径出口结构性不可达;生产面由 A1 legality 闸保证,本条为纵深防御、非 A1 clearable 闸的复验——不可达安全格板 A2 照常运行) | inv4_r0_equals_s | - -不变式:板态仅上述四态、变体属性是格级只读快照(无独立运行期状态机分支于变异/雾——零特判);A2 以 A3 相位观测量为闸、不自持轮次状态。 - -## 边界情况 - -| 条件 | 行为 | 依据 | -|---|---|---| -| EC1 初始展开即整图(R₀ = S,清图退化板) | install 拒绝——不变式④ fail-fast(`board_invalid` + error 诊断),非合同内行为;生产面由 A1 legality 闸拦截。跨 GDD 阻断缺口(反例 B):A1 现行布雷数下限 N ≥ 1 必要不充分——8×8 板 8 雷 placed、先布后删幸存 1 颗距离-2 雷 → 最终板全 0 格连通 → R₀ = S,且 F4 断言 A(inferability=1.0)零拦截、N=1 参数行 100% 退化;义务 = A1 F5 legality 增 R₀ ≠ S(违例 = 该次尝试废弃重试,clearable 同款)+ F4 批量断言严格零 + Rule 4 排除域基准措辞(最终板计);A2 侧不变式④为纵深防御,双包含两臂不受影响 | 不变式④ / systems-index 门禁块登记(A1 修订义务)/ AC-1b | -| EC2 install 产物违例(B3 内雷 / B3∪R₀ 内变异 / 数字不恒真 / R₀=S) | 拒绝 + 状态不变 + error 恰一类别(不变式①–④)——信任边界 fail-fast;违例板只能由程序构造错误产生(A1 产物经生成期合法性闸),运行期不存在该输入源 | Core Rule 3 / AC-2 | -| EC3 挖已插旗格 | 拒绝(board_face,sub_reason=flag_present)——须先拔旗(1 AP)再挖;旗是"别挖这里"的承诺标记 | A3 EC11 棋盘面判定落点 / AC-11 | -| EC4 连锁传播开到雾格 | 雾格被免费开出(channel=chain)、digit 恒真透传 + variant_ids 非空(呈现隐藏归 D1)、级联自然停止(雾格非 0 不传播)、计入清图、reward_eligible=true 奖励照常入库——零特判的自然结果,代码零变异分支 | A2×4① / A4 EC4 / AC-6 | -| EC5 玩家在雾格插旗 | 合法、耗 1 AP、旗立在未开雾格上;轮末判定恒 hit=false(雾区无雷——判定逻辑零特判自然覆盖);标错惩罚上线后的一致性推论:雾内旗按"非雷格上的旗"恒受罚——无 A4/A2 特判;D5 教学须警示"雾内插旗纯损" | A2×4② / OQ1 前瞻登记 / AC-12 | -| EC6 同批次多结束路径竞争 | F4 语义序仲裁,四组合与 A3 Rule 3 逐项一致(真值表)、RAP 记账随胜者、voided 意图零副作用(零棋盘写/零扣减/零事件——被 voided 的旗动作不进轮末判定,无幽灵旗);胜出后余意图 voided,棋盘只读查询逐格不变。联合清图让位条款:批内个体非清的 dig 联合可清图时,stop 仍先执行并胜出(C_stop ≺ C_other)——联合清图高光被停手让位,为语义序的显式设计后果(单意图帧提交下生产面不可构造——D1 强制项⑥;F4 语义保留为防御性兜底,AC-10 义务不豁免) | F4 / AC-10 | -| EC7 最后 1 AP 挖开最后安全格 | cleared 与 ap_exhausted 同时成立 → A3 事务内 cleared 胜出 → A2 外发 (cleared, new_board) 恰一条、剩余 AP 清零不入 RAP——防"耗尽优先"实现把清图高光结算为最差结局 | A3 EC10 / AC-7 用例 1 | -| EC8 战斗中热重载修改 VariationTable | 板持生成期变异快照(非活引用)——行为零变化;A2 零表读取使抗重载为构造性;行为级代理 = 换根重放事件流逐位相同(AC-18) | A2×4④ / A4 EC8 / AC-18 | -| EC9 拒绝目录外溢 | 目录外输入(越界坐标等)按 board_face 拒绝 + `sub_reason=out_of_catalog`(debug 级诊断,不与玩家语义混桶)+ debug 诊断禁静默吞;三源(board_face/resource_face/phase)互异可判定——玩家面文案归 D1(映射源 = sub_reason 枚举) | Core Rule 5 / AC-21 目录外用例 | -| EC10 挖开雷格 | `kind=mine` 事件(无 digit)、轮次不结束、reward_eligible=false、格子可通行(工程债)可经其 BFS 续挖;同轮连续挖多雷 = 每雷独立事实事件;rem 不变(雷 ∉ S) | 工程债(systems-index 门禁修正记录)/ AC-15 | -| EC11 换图/刷新/战斗结束 | `install_board`(新板)= 旗/小人/已开集全量重置 + 初始展开重放;`retire_board` = 板实例与变异快照消亡——旗随图存续语义(A3 Rule 8)的 A2 侧终点 | A3 Rule 8 / AC-13/17 | -| EC12 非 Active 相位动作请求 | 拒绝(phase 源)、零事件、全态不变——A2 与 A3 两侧按同一相位矩阵各自判定、结论一致;不存在 0-AP 窗口(A3 Rule 3 的对侧消费) | States 矩阵 / AC-16 | -| EC13 批次内旗动作与终局意图竞争 | 旗动作 ∈ C_other → 被 cleared-dig/stop 压成 voided;判定基线 = 轮次结束事务开始时旗位(voided 旗动作不留痕)——语义序使基线与到达序无关 | F4 / AC-10c/d | -| EC14 移动边界 | 目标未开 / 无 BFS 路径 / 目标即当前格 → board_face 拒绝或幂等受理(目标格 = 当前格定义为零移动,合法受理);`compute_move_path` 对不可达格返回空——预览与执行同源 | Core Rule 7 / AC-14 | -| EC15 同批次多个 cleared-dig | 类内稳定序——到达序最先者执行并胜出,其余 voided;(path_tag, RAP) 天然唯一,稳定序规范的是事件流与奖励格归属 | F4 注 T1 / AC-10e | -| EC16 install 与 A3 相位组合非法(如非刷新路径的 Active 装板〔刷新路径已受理〕/ NoBoard 动作) | 编排面拒绝(板态/相位源)——B1 编排错误 fail-fast 暴露,禁静默(A3"拒绝 + debug 诊断"口径同族,进程致命保留给数据通道) | States 矩阵 / AC-16 | -| EC17 连锁前沿遇旗(连锁不越旗) | 旗格不入链、不作传播源——被旗挡的格保持未开 + 带旗,仅经该格可达的后续格本轮不被链开(经其他路径可达者照常开出);chain_size 只计实开格;旗格轮末判定照常(hit 按其是否为雷——误标安全格留待玩家自拔,自己的承诺自己付 1 AP 撤回,与 OQ1 惩罚逻辑自洽);零特判合规:传播集 `∖ G` 是集合减法非分支(F2 注) | Core Rule 6 / F2 注 / AC-5 分支 2 | - -## 依赖 - -**上游**: - -| 系统 | 性质 | 接口要点 | -|---|---|---| -| A1 | hard(产物消费) | 棋盘产物 = 格状态 + 变异标记 + 出生区(Board class_name 数据契约);双包含回验两臂落点在本 GDD(F3:臂① 展开域 ⊆ 排除域、臂② 求解器初始态 ⊆ 展开域【恰等,A1 回退口径不触发】——门禁缺项即 blocking);install 结构不变式①②③④为消费侧信任边界(fail-fast);A1 修订义务登记 ×2 见义务表(F5 legality 增 R₀≠S + F4 批量断言严格零——"初始展开即 cleared"反例 B 与 N=1 行整行退化;Rule 4 排除域基准措辞按最终产物板计) | -| A3 | hard(账本) | `try_spend(action_kind)` 唯一扣减入口(A2 禁自行扣减);`request_dig(chain_size, clears_map)` 参数上报(A2 计算);stop 意图委托 `request_stop()`(A3 直发 stopped round_end);轮末读 `last_round_end` 组包棋盘路径 round_end(读取权 = 接口契约);相位观测量(Idle/Active/Waiting)= A2 动作闸的对侧来源;A3 API 面零改动(settle_batch 是 A2 侧入口) | -| A4 | soft(快照透传) | 变异属性经 A1 产物快照只读携带、随 `cell_revealed.variant_ids` 透传——A2 执行逻辑零变异分支(零特判原则,义务是"不加分支");A2×4 清单落位见义务表(缺项即 blocking) | -| D2 | 无直接依赖(登记事实) | A2 零表读取、零 ConfigDB 引用——参数经 A3 账本、板面经 A1 产物;D2 Interactions 表"A2 无直接依赖"由本 GDD 证实 | - -**下游**: - -| 依赖方 | 性质 | 接口 | -|---|---|---| -| B1 | hard(编排,未设计——provisional 登记) | 消费 round_end(棋盘路径)与全事件流结算;换图编排 = `install_board`/`retire_board` 的调用方(接线归 B1 GDD);B1 强制项 ×3 见下表(缺项即 blocking) | -| B4 | soft(订阅,未设计) | 清图奖励触发(cleared 路径)与安全格奖励内容归 B4——A2 只上报棋盘面资格事实(`reward_eligible`/`channel`),内容与折算不经 A2;连锁批量授予的溢出吸收设计待 B1/B4 条目化(13 格链 × B3 max_stack=2 ⇒ 大量"溢出未生效"行进结算明细,P2 画面反向伤害连锁幻想——溢出转一次性资源/治疗或显式接受,裁决归 B1/B4) | -| D1 | hard(呈现,未设计) | 棋盘/小人/旗/数字渲染;数字显示判定消费 `variant_ids`(雾格无字——digit 恒真透传是前提);三源拒绝呈现(映射源 = reject_reason + sub_reason);格态可辨/悬停预承诺/路径预览/单意图帧收集/voided 呈现——D1 强制项 ×6 见下表(缺项即 blocking),数据面义务详见呈现与 UI 契约节 | -| D5 | soft(Alpha) | 教学口径来源:小人三动作 + 连锁/旗/收轮以本 GDD 规则为准;教学条目:雾内旗纯损、雷格可通行、旗挡链(连锁止于旗属正常)、挖到雷 = 敌方优势而非死亡(经典扫雷玩家最大预期违背)、已开雾格无字属正常——挂 OQ1/EC5/EC17 | -| D4 | soft(Alpha) | 挖掘/连锁/雷格/收轮音效挂三事件流;旗/移动反馈经调用返回值命令式驱动(两动作零事件外发——发射面封闭的已声明代价;systems-index 依赖分层 D4 ← A2,B1) | -| A5 | soft(垂直切片预留) | 探测类道具的显影面可能挂 A2 查询接口(未开格数字显影)——接口归 A5 GDD 定稿,本 GDD 不预写(OQ4) | - -### B1 强制项(缺项即 blocking,systems-index 门禁块登记) - -| # | 义务 | -|---|---| -| 1 | 结算触发 = Waiting 相位编排点、不依赖事件到达序(stopped 轮 A3 直发 round_end 与 A2 旗判定批的到达序不承载语义) | -| 2 | `reward_eligible=false`(initial 通道)的格不得进入奖励入库(A3 EC5 委派闭环) | -| 3 | 诚实重复上报的去重义务(资格以雷格实例为键) | - -### D1 强制项(缺项即 blocking,systems-index 门禁块登记) - -| # | 义务 | -|---|---| -| 1 | stop 意图经 `settle_batch` 提交、不直调 A3(单一结算序保证) | -| 2 | 四种格态一眼可辨(已开 0 格地板 / 已开雾格无字 / 未开格 / 未开雾格——左键"已开=移动/未开=挖"消歧的感知前提;后果不对称:误挖 = 1 AP + 可能触雷且不可逆) | -| 3 | 悬停预承诺(光标区分移动/挖/旗目标语义)+ 可挖域(8 向相邻)常驻指示 + 怀旧扫雷玩家 chord 肌肉记忆首遇提示("点击数字格 = 移动小人"——非模态、每 run 一次,A4 先例) | -| 4 | 已引爆雷格"可通行可读"呈现 | -| 5 | `compute_move_path` 呈现语义定稿(合法性指示 vs 穿行动画轨道——P4 氛围载体;BFS 行主序路径可能视觉绕路,形态归 D1 裁决) | -| 6 | 单意图帧输入收集(stop 点击终结当帧收集;F4 语义序退为防御性兜底)+ 批次 voided 呈现义务(至少 stop 被 voided 须可感知——防 [dig清, stop] 静默改判清图、剩余 AP 清零不入 RAP)+ 每次拒绝玩家可感知(文案归 D1,映射源 = reject_reason + sub_reason) | - -### 门禁义务落位表(本 GDD 门禁评审逐项核对,缺项即 blocking) - -| 编号 | 义务 | 来源 | 承载位置 | -|---|---|---|---| -| 1 | A2×4 ① EC4 连锁开雾格(无数字+级联停止+计入清图+奖励入库) | A4 | Core Rule 6 + EC4 → AC-6 | -| 2 | A2×4 ② EC5 雾内旗恒不中(含标错惩罚一致性推论) | A4 | Core Rule 8 + EC5 → AC-12 | -| 3 | A2×4 ③ 开格上报携带变体标记 | A4 | Core Rule 2 + F2 注 → AC-6/18/20 | -| 4 | A2×4 ④ EC8 生成期变异快照抗表重载 | A4 | Core Rule 3 + EC8 → AC-18 | -| 5 | 双包含臂① A2 展开域 ⊆ A1 排除域 | A1 | Core Rule 4 + F3 → AC-3 | -| 6 | 双包含臂② A1 求解器初始态 ⊆ A2 展开域(恰等,回退口径不触发) | A1 | Core Rule 4 + F3 → AC-3 | -| 7 | 初始展开定义落点(免费/计入清图/无奖励) | A3 EC5 委派 | Core Rule 4 → AC-1 | -| 8 | round_end 棋盘路径外发 + payload 同构 | A3 Rule 9 | Core Rule 2/10 → AC-7/8/9 | -| 9 | EC4 批次四组合仲裁 + RAP 随胜者 | A3 EC4 deferral | Core Rule 9 + F4 + EC6 → AC-10 | -| 10 | 已引爆雷格可通行(工程债) | systems-index 门禁修正记录 | Core Rule 11 + EC10 → AC-15 | -| 11 | 标错惩罚以 OQ 登记(实测义务保留,不阻塞设计) | systems-index 偏离登记 | OQ1(/design-review 核对在位) | - -### 跨 GDD 新登记义务汇总(本 GDD 出具,随 systems-index 门禁块登记) - -| 编号 | 内容 | 对侧 | 状态 | -|---|---|---|---| -| A1-1 | F5 legality 增 R₀ ≠ S(违例 = 该次尝试废弃重试,clearable 同款)——"初始展开即 cleared"反例 B 与 N=1 行整行退化阻断缺口 | A1 | 待回写 | -| A1-2 | F4 批量断言严格零 + Rule 4 排除域基准措辞(最终产物板计) | A1 | 待回写 | -| B1×3 | 结算触发相位编排点 · initial 格不入奖励库 · 兑付去重(明细见 B1 强制项表) | B1 | 已登记(缺项即 blocking) | -| D1×6 | stop 经 settle_batch · 格态可辨 · 悬停预承诺+可挖域+chord 首遇提示 · 雷格可通行可读 · 路径呈现语义定稿 · 单意图帧收集+voided 呈现+拒绝可感知(明细见 D1 强制项表) | D1 | 已登记(缺项即 blocking) | -| B1/B4-1 | 高光兑现节点条目化(含 chord 缺席的标中旗即时兑现补偿候选——清单外散文登记会丢失,B3 先例) | B1/B4 | 待条目化 | -| B1/B4-2 | 连锁批量授予溢出吸收设计(见依赖 B4 行) | B1/B4 | 待条目化 | - -双向一致性核对:A2 ← A1, A3, A4 ✅(索引依赖分层)· B4 ← A2,B3,D2 ✅ · D1 ← A2,A3,B1 ✅ · D4 ← A2,B1 ✅ · D5 ← A2,A3,B1 ✅ · A5 ← A2,A4,B4 ✅ · D2 表"A2 无直接依赖" ✅——无单向遗漏。 - -## 呈现与 UI 契约(A2 无自有渲染面与 UI——数据供给规格 + D1 呈现义务登记) - -| # | 数据面义务 | 归属 | -|---|---|---| -| 1 | 数字可读性的数据前提:digit 恒真透传(含雾格)是"数字是主角"(视觉锚 1)的逻辑地基——呈现层任何隐藏/遮罩都不改数据层真值;已开雾格 = 地板无字(负空间,防误读为 bug) | D1 | -| 2 | 绘制优先级固定(视觉锚 3):数字 > 小人 > 旗 > 变异纹理 > 底色——小人所在格用边框高亮而非覆盖文本;A2 的事件流是 D1 分层绘制的输入 | D1 | -| 3 | 三 channel 驱动动效语义(D1/B5 消费):initial(开局整片亮起——"地牢初醒")· chain(连锁撕开——P1 高光时刻的动效载体;连锁止于旗的呈现已登记 D1/教学)· dig(单格回应) | D1/B5 | -| 4 | kind=mine 事件 = 已引爆雷格视觉态:已开底 + 雷图标 + 可通行可读——玩家必须看得出"这是走过的雷、能走"(D1 强制项④) | D1 | -| 5 | 变异标记保真:variant_ids 透传错误即呈现欺骗(雾格显影/隐藏全链路的数据源) | D1 | -| 6 | 无 MVP 音频:挖掘/连锁/旗/雷格/收轮音效挂 D4(Alpha,依赖分层 D4 ← A2,B1);事件流已含全部触发点 | D4 | -| 7 | 输入模型:鼠标驱动(PC 主输入)——左键已开格 = 移动 / 未开相邻格 = 挖、右键 = 插/拔旗、停手按钮 = `settle_batch([stop])`;全部意图经 `settle_batch` 提交(D1 强制项①)——单帧多意图时 A2 语义序仲裁兜底(F4);触屏/Gamepad 非 MVP 门禁(意图对象架构使后续接入零数据层障碍) | D1 | -| 8 | 单意图帧输入收集(D1 强制项⑥):stop 点击终结当帧收集——F4 语义序退为防御性兜底 | D1 | -| 9 | 输入消歧感知前提(D1 强制项②③):四种格态(已开 0 格地板/已开雾格无字/未开格/未开雾格)一眼可辨、悬停光标区分移动/挖/旗目标语义、可挖域(8 向相邻)常驻指示——硬前提(后果不对称:误挖 = 1 AP + 可能触雷且不可逆) | D1 | -| 10 | 三源拒绝呈现:board_face(sub_reason 封闭枚举)/ resource_face(AP 不足)/ phase(收轮中)——每次拒绝玩家可感知(AC-21 为数据源验收) | D1 | -| 11 | voided 呈现义务(D1 强制项⑥):被 voided 的意图(至少 stop)须玩家可感知——防 [dig清, stop] 静默改判清图、剩余 AP 清零不入 RAP 的读感欺骗 | D1 | -| 12 | 移动路径预览:`compute_move_path` 返回 BFS 路径,呈现语义(合法性指示 vs 穿行动画轨道)归 D1 GDD 裁决定稿(D1 强制项⑤——systems-index 门禁登记项,悬案的数据面已备) | D1 | -| 13 | 输入摩擦护栏观测:每轮原始输入动作数(含被拒/voided)∶ 当轮 AP 消耗 ≤ 2(A3 P4 载体;"点击"以设备中立"输入动作数"计)——归 D1 遥测(A2 只收意图对象、不收原始输入),≤2 为 playtest 待验证假设(挂 A3 OQ3);远距目标两击摩擦的复合意图(点击远格 = 自动 move+dig)登记为 D1 评估项(MVP 可裁决不做、留痕) | D1 遥测 | -| 14 | 结算明细无 A2 附加项:效果归因全部经事件流字段由 B1 呈现(P2) | B1 | - -## Tuning Knobs - -| 项 | 归属 | 说明 | -|---|---|---| -| 结构冻结(非 knob,修订走本 GDD 修订流程非调参) | A2 | 三事件面封闭 · 初始展开 = R₀ 恰等 · 连锁免费 · 移动/初始展开不经账本 · 无 chord · 批次语义序 · 四条 install 不变式 · 瞬移移动语义——A2 零专属 knob(显式排除声明),禁止在 A2 侧复制任何参数(D2 Rule 1 单一事实源) | -| 节奏与价目 | A3 | `ap_per_round` / `dig_ap_cost` / `flag_place_ap_cost` / `flag_pull_ap_cost` / `rap_refresh_cost` | -| 板面与推理保障 | A1 | BoardGenTable 九字段 | -| 变异资格 | A4 | unlock_level | -| `flag_pull_ap_cost` 联动观测(引用不拥有) | A3 | 挪旗成本与 OQ1 标错惩罚的双重定价位(A3 OQ2 复核落点——若实测推翻拔旗 1 AP,A2 行为零改动、仅价目表值变化) | -| `ap_per_round` 联动观测(引用不拥有) | A3 | 决定每轮可兑现的确定动作供给(A3 OQ3 供给指标) | -| A2 侧可观测指标(非 knob,遥测域) | A2 | 每消耗 1 AP 输入动作数(≤ 2 护栏,P4 点击摩擦——D1 观测)· 连锁规模分布 · 批次数/轮 | - -## 验收标准 - -### 测试口径 - -| 口径 | 要点 | -|---|---| -| 测试载体 | `godot --headless --script`(承 D2 冒烟框架;脚本 extends SceneTree、autoload 显式实例化);A2 冒烟 = Core-Core 集成:被测面 = A2 规则引擎 + 真 A3 实例(资源全经真账本 `try_spend` 驱动——A2 不可自行扣减);冒烟另以 B1 编排角色最小形驱动 `notify_round_start()`/`notify_settlement_done()`(仅开轮/收轮;B1 就绪后改走真实调用方,断言口径不变) | -| 棋盘输入 | Board class_name 直引程序构造(不经生成器、不经 load()/preload()——A4 AC-5/A1 夹具先例;板规格即 A1 产物 schema 的坐标级实例化,A1 未实现不阻塞本冒烟) | -| API 面 | provisional 封闭枚举,见枚举节(install_board · settle_batch——D1 唯一提交入口,单意图批 = 平凡形 · try_* 便捷形 · compute_move_path 只读 · retire_board);无 chord 负空间:封闭枚举即"无对应 API"的验收形态,新增快开入口 = 接口漂移 | -| 事件捕获断言面 | B1/D1 未设计 → 以事件捕获列表断言,分订两发射面:A2 面(cell_revealed / round_end 棋盘路径 / flag_judged)+ A3 直发面(stopped round_end);payload 口径钉死:① digit 恒真透传(仅 kind=safe 携带;雾格携带真值——呈现隐藏归 D1,判定源 = variant_ids);② reward_eligible:initial 恒 false、chain/dig ∧ safe 恒 true(含链开雾格)、kind=mine 恒 false;③ round_end 核心字段 ≡ A3.last_round_end 逐字段(同构) | -| 只读观测量 | A2 侧 = 已开集/旗集/小人位/事件捕获;A3 侧 = ap/rap/phase/last_round_end;多步 GIVEN 均给出构造序列 | -| 夹具策略 | 程序构造小板、每用例先 `reset_diagnostics()`;行为夹具根 = 零(A2 无数据表、无加载期校验类别——`--data-root` 通道在本域无消费者;资源面非默认价目分支经 D2 R3 debug override 构造,A3 AC-7 同款);登记常数协议(A1 黄金向量同源):每板登记 (R₀ 成员集, \|R₀\|, \|S\|, 关键格 digit, 级联集) + 逐格手工推导记录入版本库;失效处置 = 先复核推导、推导无误即实现缺陷 | -| 期望值推导纪律 | 行为类 THEN 数值 = ConfigDB A3 表读值推导(ap_per_round/各价目经测试通道读取)⊕ 板登记常数;不写死玩法数值,唯一例外 = 登记常数;默认价目全 1 AP 下"AP 不足"分支不可构造(A3 EC2 同款)——资源面分支显式承载于 debug override 非默认表值(AC-21) | -| 致命类协议 | 零行 manifest(显式声明)——D2 AC-2b 协议适用前提 = 加载期数据通道致命;A2 无加载期校验,install 违例 = `board_invalid` 拒绝 + error 诊断(进程致命保留给数据通道;实现期 ADR 若裁决升格,回本节补 manifest 行) | -| out-of-scope | deferral 以对侧登记为生效条件——见 out-of-scope deferral 表 | - -### 夹具板清单(程序构造小板) - -spawn = 出生 3×3 中心格坐标,逐板显式登记:b_spawn / b_flag / b_batch / b_mine_walk / b_degenerate = (3,3),b_chain / b_fog = (3,2)——按默认"板中心"读法该两板 B3 = {2..4}² 会含 y=4 雷墙雷、违反不变式①、板不可安装(已修正并纳入 OQ3 复核范围)。 - -| 板 | 规格(坐标级要点) | 服务 | -|---|---|---| -| `b_spawn` | M = {(1,y): y∈[0,6]∖{3}} 竖墙 6 雷留缺口;R₀=35、\|S\|=43、未开 8 格;(1,3) digit=2 | 安装五属性/双包含/挖掘/移动/相位 | -| `b_chain` | spawn=(3,2);M = y=4 横墙 6 雷留 (3,4) 缺口;R₀=28(y∈[0,3] 全安全格);墙下封闭区 14 格;(3,6) 为 0 格、级联集 \|C\|=13 | 连锁/双包含/链不越旗 | -| `b_fog` | spawn=(3,2);b_chain 几何 + M += {(5,0),(6,1)};雾 F = {(0,5),(1,5)}(链可达)∪ {(6,0)}(链不可达);雾格 digit 2/3/2、厚度≤2 ✓;R₀ 常数随 M 变化按板重算((6,2)/(6,3) 退出 R₀) | 雾链两态/雾旗/快照/零特判/回放 | -| `b_fog_bare` | b_fog 同 M 同几何、variant 标记剥离 | AC-20 同构对板 | -| `b_flag` | b_spawn 同几何复用;(1,2)/(1,4) 雷 = hit 旗靶、(0,3) 安全 = miss 旗靶 | 旗生命周期/轮末判定/三源拒绝 | -| `b_batch` | b_spawn 同几何复用(未开恰 8 格支持构造) | 批次四组合/两收轮路径 | -| `b_mine_walk` | M = {(3,5)} 单雷;(3,4) digit=1 ∈ R₀ | 雷格挖开/已引爆可通行 | -| `b_degenerate` | 8×8、M = {(7,7)} 单雷角——R₀ = S(全 0 格连通,构造性退化) | 不变式④ install 拒绝 | -| `b_invalid_*` | ① mine_spawn:b_spawn+M+=(3,3) ② fog_spawn:b_fog+F+=(3,2) ③ fog_flood:b_fog+F+=(5,1)(R₀ 成员)④ digit:b_spawn+数字篡改 | 不变式①②③④ 各一(AC-2) | - -### out-of-scope deferral(以对侧登记为生效条件) - -| 对侧 | deferral 内容 | 对侧登记 | -|---|---|---| -| B1 | 轮次编排接线(Waiting 出口/next_round_mode/request_refresh 代理)· 结算兑付与 P2 来源标注 · 兑付去重(诚实重复上报的对侧,A3 Rule 8/OQ5)· EC8 末轮判定次序 · 双发射源消费序 | systems-index B1×8 义务清单 + 本 GDD B1×3,生效条件成立 | -| B4 | 奖励内容与差异化插槽 · debuff 档位 | A4 三条定价硬约束 | -| D1 | 数字显示消费 variant_ids · 三源呈现 · 路径预览表现 · 点击摩擦观测 | A4 D1×2 + 本 GDD D1 强制项 ×6 | -| A5 | 显影接口 | OQ4 | -| A1×A2 | 双包含端到端集成用例——"A1 真生成器产物 → A2 install"全链路回验,两系统实现后集成冒烟承载(本 GDD 冒烟用程序构造板) | 登记 deferral | -| 标错惩罚 | OQ1 登记,本节仅承一致性推论预告(惩罚前 AC-12 只断言 hit=false) | OQ1 | - -### AC 清单(Given-When-Then,编号不变,23 条) - -| AC | Given | When | Then | 覆盖 | -|---|---|---|---|---| -| AC-1 | 真 A3 实例(phase=Idle)与 `b_spawn` | `install_board(b_spawn)`,随后 `notify_round_start()` → Active | accepted=true 且事件捕获**仅**含 cell_revealed 批,逐事件断言:① 免费——A3 ap 仍=表读值(零 try_spend)且诊断零新增;② 计入清图——构造序列挖尽未开 8 格(登记常数)时恰在第 8 次触发 `round_end{cleared, new_board}`(无超前/滞后);③ 无奖励——全部 reward_eligible=false(channel=initial);④ 永不触雷触雾——全部 kind=safe;⑤ 恰等 R₀(有序断言)——事件**有序列表** ≡ 测试侧朴素 BFS 重算 R₀ 的行主序枚举,逐格逐序相等(规范序钉死——DFS/列主序等"错误但确定"的实现不可通过;登记常数 \|R₀\|=35 为独立锚) | Core Rule 4 / A3 EC5 委派 | -| AC-1b | `b_degenerate`(R₀=S 构造板) | `install_board`;随后 `install_board(b_spawn)` | accepted=false、reject_reason=board_invalid、error 诊断恰一条类别=**inv4_r0_equals_s**(枚举见状态节);随后重装 accepted=true(拒绝原子性) | EC1 / 不变式④ | -| AC-2 | `b_invalid_mine_spawn` / `b_invalid_fog_spawn` / `b_invalid_fog_flood` / `b_invalid_digit` 各板(每用例先 reset_diagnostics) | 各 `install_board` | 均 accepted=false、board_invalid、error 恰一对应类别(**inv1_mine_in_spawn / inv2a_variant_in_spawn / inv2b_variant_in_r0**〔"R₀ 触雾"归此——②的 R₀ 子情形〕**/ inv3_digit_invariant**,封闭枚举见状态节) | Core Rule 3 / EC2 | -| AC-3 | `b_chain` 与 `b_fog` 各 install 后捕获的初始域格集 E(B);测试侧按 A1 F1/Rule 4 公开定义朴素重算 R₀(B) 与排除域 X(B)=R₀∪外扩 1 环(X(B) 以最终产物板计——先布后删后基准,A1 Rule 4 措辞修订义务 EC1) | 逐板比对 | **臂①** E(B) ⊆ X(B);**臂②** E(B) ≡ R₀(B) **逐格恰等**(不欠展开也不过度展开——A1 回退口径不触发的行为面);两板全用例通过 | Core Rule 4 / F3 / registry a2_dual_containment(门禁缺项即 blocking) | -| AC-4 | `b_spawn` Active、小人于 R₀ 内 | `try_dig(c)`(相邻未开)→ `try_dig`(非相邻 / 已开格 / 有旗格)→ 等价护栏:同构造态分别驱动 `try_dig(c)` 与 `settle_batch([dig c])`(各新轮) | 第一次 executed、A3 ap −dig_ap_cost(表读值,真 try_spend)、事件恰一条 `{cell=c, kind=safe, channel=dig, reward_eligible=true, digit ≡ 测试侧重算 8 邻雷数}`;拒绝分支 rejected+board_face(sub_reason 分别 = not_adjacent / target_revealed / flag_present)、零事件、ap 不变;等价护栏:事件流/ap/棋盘只读观测量/诊断逐项相同(单意图批 ≡ 便捷形) | Core Rule 5/9 / A3 Rule 2 | -| AC-5 | `b_chain`;构造序列挖 (3,4)→移→挖 (3,5)→移→`try_dig((3,6))`(0 格);分支 2:构造至小人立于 (3,5) 后 `try_flag_place((2,5))`(未开相邻,1 AP)→ 再 `try_dig((3,6))` | 第三次挖掘(分支 1);插旗后再挖(分支 2) | 分支 1:executed 且 ap 总耗 = 3×dig_ap_cost(级联免费——非 3+13 格);事件 channel=chain 批恰 \|C\|=13 条(登记常数)且序 ≡ 测试侧 BFS 行主序枚举、全 reward_eligible=true、digit 恒真透传、事件数 = chain_size + 1(一致性恒等式);级联止于非 0 格(链只经 0 格扩);链格计入清图(挖尽封闭区后余格清图即 cleared)。分支 2:(2,5) 保持未开+带旗(零 cell_revealed)、chain_size=12(级联集减 1——(1,5)/(1,6) 经 (2,6) 照常开出,仅旗格本身被挡)、旗格轮末判定照常 | Core Rule 6 / F2 / EC17 | -| AC-6 | `b_fog`;同 AC-5 构造至 (3,6) 级联;另一用例:小人移至 (5,1) 后 `try_dig((6,0))` | 级联(链可达雾);全价挖链不可达雾 | 四项逐验:① 链可达雾 (0,5),(1,5) 免费开出(channel=chain、ap 无雾附加扣减);② variant_ids 含 "fog" 且 digit=2/3 恒真透传(呈现判定数据源——A2×4③ 同板证);③ 级联停止(级联集与 b_chain 同构板逐格同形——雾格只作叶);④ reward_eligible=true 且计入 cleared 判定。另一用例(链不可达全价):executed、channel=dig、耗 1 AP 全价、variant_ids 非空、digit=2 透传 | A2×4①③ / A4 EC4 / fog_ap_note 两态执行侧 | -| AC-7 | 用例 1(同帧竞争):`b_batch` 构造至"未开恰 1、ap=1"(cleared 与 ap_exhausted 同事务成立——"耗尽优先"缺陷仅在此构造可检出);用例 2:同构造 ap=k≥2 | `try_dig(末格)` | 用例 1:executed、A2 面 `round_end{cleared, new_board}` 恰一条(ap_exhausted 不触发)、其字段 ≡ A3 `last_round_end` 同帧读值(组包数据源行为面)、与 stopped 路径 payload 同构(字段集/类型一致)、rap 不变(剩余 AP 清零);用例 2(剩余清零非平凡分支):cleared 恰一条、rap 不变(k−1 > 0 清零非平凡) | Core Rule 10 / EC7 / A3 Rule 5/6/9/EC10 | -| AC-8 | `b_batch` 未开 ≥2、ap=1 | `try_dig(非末格)`;紧接任意 `try_*` | executed、`round_end{ap_exhausted, same_board}` 恰一条、A3 remaining_ap=0 不变式;紧接动作全部 rejected+phase、零事件 | Core Rule 10 / A3 Rule 3/EC1/EC14 | -| AC-9 | `b_batch` Active 未开完、ap=k≥1 | `settle_batch([stop])` | **A3 直发面**捕获 `round_end{stopped, same_board}` 恰一条(A2 面零 round_end——双发射源行为面)、rap = 前值 + k(1:1,表读值推导)、事件序 = flag_judged ×N 先于 round_end(事件序契约) | Core Rule 9 / A3 Rule 4/9 | -| AC-10 | `b_batch`(每用例新轮新构造)六场景:a〔dig清→stop〕· b〔stop→dig清〕· c〔dig→stop,ap=1 耗尽型构造:新轮 7 次非清挖〕· d〔stop→dig,同 ap=1 构造〕· e〔dig清₁→dig清₂ 同批〕· f〔非清 dig₁→非清 dig₂ 联合清图;多步 GIVEN:前轮挖雷 (1,2) 开道(雷格可通行的构造性利用)→ 挖尽 x=0 列余格 → 停手收轮;新轮未开恰 {(0,3),(1,3)}、ap=8〕 | 提交各批次 | a:cleared 胜出、rap 不变(stop 清零不入 RAP);b:与 a 同结果(同 path_tag/同 rap 终态/同事件数——异类序无关性);c:**语义序救援用例**——stopped 胜出(朴素到达序将产出 (ap_exhausted, RAP+0)——语义序校正为 (stopped, RAP+1))、rap += 1(表读值推导)、被弃 dig 格仍未开(续轮同图可证);d:与 c 同结果;e:类内稳定序——到达序最先者执行胜出、恰一条 cleared、第二 dig voided 零副作用;f:dig₁ 执行不清图(rem 2→1)、dig₂ 结算时点 clears_map=true 胜出 → cleared、两意图均执行、rap 不变(出口映射按结算时点真值键控——F4)。全用例断言:voided 意图零棋盘写/零扣减/零事件(棋盘只读查询逐格不变)、round_end 恰一条;c/d 断言 `flag_judged ×N` 先于 `round_end`(事件序契约) | Core Rule 9 / F4 / EC6/EC13/EC15 / A3 EC4 deferral 兑现(A3 冒烟不可构造用例在本节兑现,deferral 生效) | -| AC-11 | `b_flag`、小人于 (2,3) | 依次插 (1,4)、插 (1,2) 后拔 (1,2)(挪旗)→ `try_dig((1,4))`(有旗)→ 插非相邻/插已开/插已有旗/拔无旗/拔非相邻 | 全 executed、ap 合计 −(place+pull)×2(表读值)、旗集随动、零事件外发;挖旗格 rejected+board_face(EC11 落点);各拒绝分支 rejected+board_face | Core Rule 5/8 / A3 EC3/EC7/EC11 | -| AC-12 | 分支 1:`b_flag` 插 (1,4)(雷)与 (0,3)(安全,经挖 (1,3) 后站立可达),前置断言验"被拔的不判"(插 (1,2) 后拔,轮末无该条目);分支 2(雾旗):`b_fog` 小人相邻未开雾格插旗;分支 3(重复上报):分支 1 收轮后 `notify_settlement_done(same_board)`+`notify_round_start` 续轮旗仍在 | `settle_batch([stop])`(分支 1/3);轮末(分支 2);再停手(分支 3) | 分支 1:flag_judged 恰 2 条**集合断言**:{(1,4),true}、{(0,3),false}(行主序枚举);分支 2:`{cell,hit=false}` 恒(雾区无雷零特判;标错惩罚上线后"恒受罚"推论 = OQ1,惩罚前不可判定);分支 3:再次 {(1,4),true}——A2 逐轮诚实重复上报,**去重归 B1/B4(out-of-scope)** | A2×4② / A4 EC5 / A3 Rule 8/OQ5 上报半 | -| AC-13 | `b_flag` 已插 2 旗 stopped 收轮 | 续轮(same_board);随后 `retire_board()` + `install_board(b_fog)` | 旗集不变且**事件捕获零新增 cell_revealed**(初始展开板级一次、跨轮不重放——每轮重放的违例实现在此用例现形);重装后旗集 = 空、初始展开照常(按新板) | Core Rule 8 / EC11 / A3 Rule 8/EC9 | -| AC-14 | `b_spawn` 小人于 (3,3) | `compute_move_path((2,3))` 两次 → `try_move((2,3))` → 拒绝/幂等四对:① move 未开格 ② move 已开但 BFS 不可达格 ③ move 目标 = 当前格 ④ 正常移动分支 | 路径两次逐格相同(确定性)且全格 ∈ 已开集、相邻步 8 向合法;try_move executed、位置更新、**ap 不变**(不经账本)、零事件;① rejected+board_face(sub_reason=target_concealed);② rejected+board_face(sub_reason=no_path)**且** `compute_move_path` 对同格返回空(预览与执行同源,一用例双断言);③ executed 幂等(零移动:位置不变、零事件、ap 不变——EC14);④ 保持 | Core Rule 7 / EC14 / A3 Rule 2 移动行/P4 | -| AC-15 | `b_mine_walk`、小人于 (3,4) | `try_dig((3,5))` → `try_move((3,5))` → 经雷格续挖 (3,6) | executed、ap −1、事件恰一条 `{kind=mine, channel=dig, 无 digit 字段, reward_eligible=false}`、**轮次不结束**(两面零 round_end);try_move executed(**可通行**——工程债验收落点)、位置=(3,5);续挖正常受理 | Core Rule 11 / EC10 / 工程债登记 | -| AC-16 | NoBoard 或 Installed·Frozen(Idle/Waiting 两分支);另 GIVEN Active | 依次 dig/flag×2/move/`settle_batch([stop])`;Active 下 `install_board`/`retire_board` | 全部 rejected+phase、棋盘只读查询与事件面逐字不变;Active 下装板/退板拒绝(板态——EC16) | States 矩阵 / EC12/EC16 / A3 输入×相位矩阵对侧 | -| AC-17 | `b_spawn` 已装且部分挖掘 | `retire_board()`;随后 `install_board(b_flag)` | 全动作拒绝(phase;无板态)、事件分段边界确立(跨段断言禁止——防前图泄漏);重装后初始展开按新板重算、无前板残留(旗/小人位/已开集) | Core Rule 3 / EC11 | -| AC-18 | `b_fog` 基线事件流 E₀ 已捕获 | 测试通道换根加载变异表(B3 AC-15 换根模式)后重放同一意图序列(新 A3 实例+新 install) | 事件流与 E₀ **逐位相同**(含 variant_ids)——生成期快照非活引用;A2 零表读取(AC-22③)使抗重载为构造性,本用例为行为级代理 | A2×4④ / A4 EC8 | -| AC-19 | 同坐标规格独立构造的 `b_fog` ×2(各配全新 A3 实例) | 同一定长意图序列驱动两遍(含挖/链/雾链/插拔旗/移动/多意图批/停手收轮——覆盖三 channel、flag_judged 与批次仲裁) | 两遍事件捕获列表**逐位相同**(数、序、全字段) | Core Rule 1 / D2 Rule 5 的 A2 层 | -| AC-20 | (`b_fog`, `b_fog_bare`) 同构对(同雷布同 digit、仅 variant 标记差异) | 同一意图序列各驱动一遍 | 两事件流**除 variant_ids 外逐位相同**(差分容许域 = 该字段且仅该字段)——连锁/清图/旗判定/价目/收轮全不感知变异 | A4 Rule 4 零特判 / Core Rule 1 / A2×4③ 反向证成 | -| AC-21 | `b_flag` + debug override `action_economy.flag_place_ap_cost=2`(D2 R3 域内值;承载声明:默认价目下资源面分支不可构造,同 A3 AC-7)构造 ap=1 | `try_flag_place`(棋盘面合法)→ `try_dig`(非相邻)→ `try_dig((1,4))`(有旗格)→ Waiting 相位任意动作 → `try_dig((-1,-1))`(越界,目录外用例) | rejected+**resource_face**、全态不变;**board_face + sub_reason=not_adjacent**;**board_face + sub_reason=flag_present**("须先拔旗"与"非相邻"数据可分);**phase**——三源互异可判定;目录外:rejected+board_face + **sub_reason=out_of_catalog** + 诊断收集器恰一条 debug(非静默吞) | Core Rule 5 / EC9 / A3 EC2 对侧 | -| AC-22 | A2 文件集(规则引擎/事件载荷/冒烟脚本/夹具规格) | 静态扫描 | ① 零 `randomize()`、零自建 RNG 构造(**tests/ 豁免不启用**——A2 确定性回放不需种子,严于 A1 先例);② 零 ConfigDB 外 data 表加载(Board class_name 直引豁免);③ **零 `ConfigDB.*` 属性读取**(A2 全部输入经 A3 账本与 A1 产物——设计决策;实现期 ADR 若裁决需读表,走接口漂移修订本条);④ 零 `extends Control/Node2D`、零 `.tscn` preload;⑤ AC-1 在 `godot --headless --script` 实跑通过(退出码 0 + 断言收集器零失败)作为本项判定(Rule 7);⑥ 纳入 D2 AC-14 项目级人工三要素字面量扫描(warning 级 + 人工复核,成员清单随实现建立并入——B3 AC-19 同款) | Core Rule 1 / D2 Rule 1/2/5/7 | - -### 覆盖矩阵(验收评审用) - -| 类别 | 映射 | -|---|---| -| Core Rules | 1→AC-19/20/22 · 2→AC-4/6/7/8/9(payload 前言钉死)· 3→AC-1b/2/17/18 · 4→AC-1/3(A3 EC5 委派 + 双包含)· 5→AC-4/11/21 · 6→AC-5/AC-6 · 7→AC-14 · 8→AC-11/12/13 · 9→AC-4 等价护栏/AC-9/10 · 10→AC-7/8 · 11→AC-15 · 12(无 chord 负空间)→API 封闭枚举 | -| Formulas | F1→AC-1②/5/7 · F2→AC-5/AC-6 · F3→AC-1⑤/3 · F4→AC-10 | -| EC | EC1→AC-1b · EC2→AC-2 · EC3→AC-11 · EC4→AC-6 · EC5→AC-12 · EC6→AC-10 · EC7→AC-7 用例 1 · EC8→AC-18 · EC9→AC-21 目录外用例 · EC10→AC-15 · EC11→AC-13/17 · EC12→AC-16 · EC13→AC-10c/d · EC14→AC-14 四对 · EC15→AC-10e · EC16→AC-16 · EC17→AC-5 分支 2 | -| 义务 | A2×4①→AC-6 · ②→AC-12 · ③→AC-6/AC-18/AC-20 · ④→AC-18 · 双包含①→AC-3 · ②→AC-3 · A3 EC4 deferral→AC-10 · 工程债→AC-15 · OQ1 在位→OQ 节 | -| 规模 | 23 条 = AC-1…AC-22 + AC-1b(原"EC4 腿"编号为 AC-6,EC17 由 AC-5 分支 2 承载) | - -## 开放悬案 - -| # | 悬案 | owner | 时机 | -|---|---|---|---| -| 1 | 标错惩罚(偏离登记——实测义务保留,不阻塞设计):候选 = 敌方伏击 +1(标错旗在轮末判定 hit=false 时为敌方追加 1 层伏击;量纲随 B2 ambush 定稿联动);兼任双重职责(A3 OQ2):误标税 + 停手轮/死 RAP 态下旗滥用的唯一价格;一致性推论(上线时生效,无特判):雾内旗恒受罚(A4 EC5)、判定载体 = 本 GDD `flag_judged.hit=false` 事实流(B1/B4 消费,A2 零改动);惩罚重复性裁决项(实测会话前钉死):hit=true 兑付有去重(每雷实例一次,B1 强制项③),hit=false 惩罚**无去重声明**——按现行轮末判定载体,忘拔的错旗默认每轮 +1 伏击(5 轮 = +5),与一次性收益严重不对称;候选 = 随旗实例去重 / 显式接受每轮累计("流血"设计),须在原型实测会话前落定,防实测数据混淆"一次性过重"与"累积过重";落地动作:原型 v3 补丁实测(可与 v3 终验合并会话)→ 实测支持则修订本 GDD(判定批扩展)+ registry,否决则关闭 OQ 并在 A3 OQ2 另定价旗滥用;A2 /design-review 须核对本 OQ 在位,缺位即 blocking | 用户 + 原型小补丁会话 | 垂直切片前置 playtest 合并会话前 | -| 2 | 事件外发载体与捕获 API(实现期 ADR 确认项):signal vs 回调注册、事件捕获断言面的落地形态——依赖事件捕获列表的 THEN(AC-1/3/4/5/6/7–10/12/13/15–20 的事件序列断言)为纸面契约,ADR 未确认前该子集不视为可执行(A1 缺口 G1"度量独立入口"同型);返回值/诊断/静态扫描类断言(AC-1b/2/11/14/16/21/22 及各 AC 的 reject 分支)不在此限、现在即可执行 | 实现期 ADR | Technical Setup | -| 3 | 夹具登记常数第二人复核:各板(spawn 坐标、R₀ 成员集/级联集/digit)手工推导记录入版本库后安排复核——推导错误即假失配/假通过(A1 OQ5 同型);spawn 坐标为新增登记项(b_chain/b_fog=(3,2)——默认中心读法产出不变式①违例板) | A2 /design-review | A2 评审 | -| 4 | A5 探测道具接口预留:显影(未开雾格数字显影)对 A2 查询面的需求形态——接口归 A5 GDD 定稿,本 GDD 不预写(见依赖 A5 行) | A5 | 第 11 位 | -| 5 | D1 输入接线确认:stop 意图经 `settle_batch` 提交的接线义务(D1 强制项①)与单帧多意图的真实构造性——单意图帧输入收集已升格为 D1 强制项⑥登记约束(stop 点击终结当帧收集或等效;若 D1 保证单意图帧,四组合仲裁退化为结构不可构造——义务仍由 AC-10 冒烟承载、不豁免) | D1 | 第 10 位 | -| 6 | 拔旗价目与旗滥用观测联动:`flag_pull_ap_cost` 复核与"停手轮旗动作占比"指标的 A2 侧观测量(旗动作批占比)——A2 零改动,遥测口径随 A3 复核会话对齐 | A3 OQ2/OQ3 | 低优先 | - -## 版本历史 - -| 版本 | 日期 | 改动 | -|---|---|---| -| v1.0-lean | 2026-09-13 | 格式迁移:legacy 原稿按 lean 样例(docs/lean-gdd-sample-b1.md)重排——正文修订注记剥离收敛至本表;速览/体验锚点/枚举/边界情况/AC/义务台账/覆盖矩阵/开放悬案转表格,流程转字符画;F1–F4 公式本体、Variables 与验算数据全保留;术语统一以 voided 行文;语义与 2026-09-09 定稿及 2026-09-12 D4 修订对齐,零规则变更 | -| D4 修订 | 2026-09-12 | install_board 受理域扩 Active·仅弃图刷新路径:B1 `refresh_board` 编排内、A3 扣费成功为前提;其余 Active 装板仍拒绝(防轮内换板原则对非刷新路径不变),EC16 随之收窄 | -| v1 | 2026-09-09 | full /design-review 定稿 Approved:game-designer/systems-designer/qa-lead/ux-designer 四专员 + CD 终审六 blocking 同日修订核销、用户拍板放行(A3/A4/A1/B3 先例);systems-designer 起草 F1–F4 + 反例 B 阻断缺口(登记 A1 修订义务)、qa-lead 起草 23 条 AC(AC-1…22 + AC-1b + 覆盖矩阵 + 夹具坐标规格);本次定稿含:初始展开 R₀ 恰等 / 批次语义序仲裁 / 移动瞬移语义 / install 四不变式 / sub_reason 封闭枚举(UX-1)/ 连锁不越旗(GD-1)/ 雷格通行有价捷径(GD-2)/ 到达序无关性收窄 / 联合清图让位条款 / D1 强制项 ×1→×6 / B1 强制项 ×3 / spawn 坐标修正(b_chain、b_fog=(3,2))/ 已引爆雷格可通行(工程债);评审日志 design/gdd/reviews/a2-minesweeper-rules-review-log.md | diff --git a/design/gdd/legacy-2026-09-14-v1/a3-action-economy.md b/design/gdd/legacy-2026-09-14-v1/a3-action-economy.md deleted file mode 100644 index 564ba159..00000000 --- a/design/gdd/legacy-2026-09-14-v1/a3-action-economy.md +++ /dev/null @@ -1,455 +0,0 @@ -# A3 行动经济(Action Economy) - -> **状态**:Approved · lean 格式 -> **版本**:v1.0-lean · 2026-09-13 · 作者:user + agents(数值继承原型 v2/v3 实测结论与 game-concept 定稿) -> **承载支柱**:P1 主(每轮取舍的节拍器)· P2 次(规划的延迟兑现)· P3(旗稀缺性→AP 机会成本)· P4(移动免费的氛围归属) -> **层级**:Layer 1 Foundation · Milestone MVP · 设计顺序第 2 位(上游 D2 已 Approved) -> **一句话**:A3 是玩家每轮的行动预算账本——每轮固定 AP、统一价目、停手 1:1 转存 RAP / 清图奖励两条出口,全部收益以战斗效果直兑进轮次结算,自身不产生、不折算任何抽象资源点。 - -## 速览 - -| 关键问题 | 答案 | -|---|---| -| 定位 | 玩家每轮行动预算与支出规则的账本——扫雷侧每个决策都花 AP,所有收益以战斗效果(安全格→主角 buff、标中旗→怪物 debuff、踩雷→敌方增益)直兑进轮次结算;纯资源账本,零随机、零表现面 | -| 拥有 | AP 资源账本独占(`try_spend` 唯一扣减入口)· 统一价目 · 三结束路径仲裁(cleared > stopped > ap_exhausted)· RAP 池生命周期 · `last_round_end` 记录 · F1 五条款下游契约 · ActionEconomyTable 回填 owner | -| 不拥有 | 棋盘面规则与执行(A2)· 轮次编排与结算(B1)· 奖励内容与档位(B4)· 数值表本体(D2 承载,A3 回填)· 呈现(D1)· 教学(D5) | -| 上游输入 | D2 ActionEconomyTable(ConfigDB 读取)· A2 的 try_spend 调用与动作参数上报(chain_size / clears_map)· B1 信号(notify_round_start / next_round_mode / battle_over)· 玩家停手与刷新输入(经 D1 / B1 编排) | -| 下游输出 | round_end `(path_tag, continuation_hint)`(棋盘路径经 A2 外发、stopped 由 A3 直发)· `last_round_end` 只读记录 · F1 五条款(B1 验收)· AP/RAP HUD 数值(D1)· 教学口径(D5) | -| 硬约束 | 零随机 · 零玩法数值字面量(D2 Rule 1)· 8 API 全 bool(受理/拒绝,拒绝附 debug 诊断、非进程致命)· 单一事务原子仲裁、禁双重折算 · Core 层零 UI 依赖(`--headless --script` 冒烟可完整驱动) | - -A3 是玩家 agency 的计量器:AP 不减少总点击量,而是把点击摊销进多个轮次并插入结算节拍;真正的决策压缩器是连锁展开(1 次点击兑现一片区域)与停手(放弃剩余格子换风险退出权)。没有 A3,挖/旗/停手就没有统一成本语言;执行归 A2、兑付归 B1、显示归 D1。 - -## 体验锚点 - -| 支柱 | 关键词 | 机制承诺 | -|---|---|---| -| P1 "我算对了"的节拍器 | "推理免费,兑现花 AP" | AP 把推理的兑现切进轮次节拍——取舍落点在构成选择(确定动作供给 >8 时先兑现哪些)与轮末尾巴(赌不确定格 vs 停手攒 RAP);供给 ≤8 时确定动作可近乎无代价延后(棋盘跨轮存续);连锁免费是推理放大器——一次正确推断被免费兑现成一整片区域;终局碎片区的零风险收尾可能跨轮完成,是节奏阀的有意代价;决策密度由 A1 供给兜底、监测归 OQ3 | -| P2 "规划的延迟兑现" | "收手换退出权" | 每个安全格的 buff 当场入库、结算明细可见(B1 归因标注);停手改产风险退出权——面对纯盲猜,攒 RAP 换一张新图是"我不赌"的体面出口 | -| P3 "风险与收益同源" | "承诺有重量" | 三向效果映射使同源原则具象——标中旗削弱敌人、踩雷强化敌人、挖安全格强化自己;旗无数量上限,稀缺性由 AP 机会成本承载(8 向相邻限制约束的是当轮几何而非总量——跨轮小人可走遍全图;连锁富集区插旗成本放大、死 RAP 态碎片区趋零,条件性对冲见 OQ2);挖已插旗格须先拔旗(EC11) | -| P4 "地牢氛围" | "边缘探索免费" | 小人移动免费、挖/旗限 8 向相邻——服务"边缘探索"的地牢感而非经济杠杆,移动成本不是调参对象;点击摩擦护栏归 A2/D1 观测(每消耗 1 AP ≤ 2 次点击) | - -参考感受:预算把节奏从"点完为止"改为"每轮取舍";价目均匀分布是有意的 MVP 简化,异质性钩子(地形成本修饰)已为 A4 预留(Rule 2);无 chord(双击快开)是有意偏离经典扫雷——保护"每格兑现都花 AP"的预算意义,正确标雷缺一键兑现节拍已登记 CD 创意风险 #3(与 #2 高光缺失合并归 B1/B4)。 - -## 全局流程 - -### 轮次生命周期(AP 支出与轮次状态流转) - -``` -notify_round_start() [B1 编排;战斗首轮要求当前 Idle] - │ RoundStart(瞬态):AP←8 硬重置 · RAP 不动(跨轮保留) - ▼ -Active(挖掘期) - │ request_dig / request_flag_place / request_flag_pull ──┐ - │ request_stop ──────────────────────────────────────────┤ 各自进入 try_spend(action_kind) - │ request_refresh ───────────────────────────────────────┘ 单一原子事务:余量检查·扣减·结束仲裁 - │ │ - │ ├─ request_refresh 且 rap ≥ rap_refresh_cost 且未达每轮上限 - │ │ → 扣费 · 当场换新图继续挖(AP 不重置 · 无清图奖励 · 轮次不终结) - │ ▼ - │ 结束路径胜出(同帧/同批次仲裁:cleared > stopped > ap_exhausted) - ▼ -RoundEnd(瞬态) - │ stopped → RAP += remaining_ap(1:1) - │ ap_exhausted → 断言 remaining_ap = 0(违反即致命) - │ cleared → 剩余 AP 清零(不入 RAP)· 清图奖励(内容归 B4) - │ 写 last_round_end(单槽只读记录) - ▼ -Waiting - │ next_round_mode = same_board → RoundStart(同图续轮) - │ next_round_mode = new_board → RoundStart(新图;仅 cleared 轮;RAP 保留) - │ battle_over → Idle(RAP 清零 · ap=0;下一场战斗由 B1 发 round_start 重启) -``` - -### 出口分发 - -| 出口 | path_tag | continuation_hint | 剩余 AP / RAP | 换图 | -|---|---|---|---|---| -| 清图 | cleared | new_board | 剩余 AP 清零(不入 RAP)+ 清图奖励归 B4 | 下轮新图 | -| 停手 | stopped | same_board | RAP += remaining_ap(1:1,无乘数) | 同图续轮 | -| 耗尽 | ap_exhausted | same_board | 恒 0(不变式断言) | 同图续轮 | -| 挖掘期刷新 | 无 round_end——轮次不终结 | — | −rap_refresh_cost(每轮 ≤ refresh_cap_per_round) | 当场换图(无清图奖励;旧板旗失效) | -| 战斗结束 | — | battle_over 信号 | RAP 清零 | → Idle | - -## 核心规则 - -> 每条规则两段:**人话**(作用于哪个系统、什么情况下、谁触发、触发后发生什么;效果与情况用枚举表)→ **举证**(计算方法/公式;纯流程规则明写"无计算")。 - -#### 规则 1:新一轮开始行动点重置发满,上轮剩余清零、不结转 -**人话**:这条管每轮的资源发牌,由结算编排方开轮触发。轮次开始的一瞬,A3 把行动点写满 8(表值 `ap_per_round`)——上一轮用剩多少都清零,不累积、不结转,随后进入挖掘期。唯一跨轮带走的资源是 RAP 池——战斗域里停手攒下的换图资金,开轮时原样保留、不做任何加减。 - -**举证**:无计算(AP 数值读配置表)。字段 `ap_per_round` 见「Tuning Knobs」节 ActionEconomyTable schema;RAP 跨轮保留细则见下方「规则 11 的实现参照——RAP 池规则」;开轮受理与重置断言见 AC-1a/AC-1b。 - -#### 规则 2:挖、插旗、拔旗都按同一张价目表扣行动点 -**人话**:这条管"每个动作花多少":A3 定价、A2 执行,是全项目唯一的消耗口径。玩家在挖掘期的三件付费动作——挖开格、插旗、拔旗——各花 1 行动点,且只能作用于小人 8 向相邻的格子;移动小人与连锁展开免费(逐动作价目见下方实现参照表)。经典扫雷的"双击快开"(chord)被有意去掉——每格兑现都必须花行动点,保护预算的决策意义,由 A2 承载。 - -**举证**:无计算(价目数值全部来自配置表)。逐动作价目见下方「规则 2 的实现参照——统一价目表」;成本字段与默认值见「Tuning Knobs」节;挪旗合计 2 行动点的边界见 EC3/EC7;无 chord 的取舍依据见「体验锚点」节末参考感受行。 - -### 规则 2 的实现参照——统一价目表 - -| 动作 | 消耗 | 要点 | -|---|---|---| -| 挖开格 | `dig_ap_cost` = 1 AP | 仅限小人 8 向相邻格;若触发连锁展开(flood fill),连锁部分免费(原型 v2 定稿:推理的放大器),连锁开的格计入清图进度 | -| 插旗 | `flag_place_ap_cost` = 1 AP | 仅限相邻格(原型 v3 统一行动经济);无旗子实物资源——旗为棋盘标记,数量无上限 | -| 拔旗 | `flag_pull_ap_cost` = 1 AP | 仅限相邻格(与挖/插对称);移除棋盘标记、无返还物(无口袋旗可返);OQ2 挂原型补丁复核 | -| 移动小人 | 0(冻结) | 点击已开格移动,BFS 限已探明区(A2 承载);免费服务 P4 探索氛围,非经济杠杆、调参豁免 | -| 连锁展开 | 0(冻结) | 免费;连锁开的格计入清图进度 | - -#### 规则 3:行动点用到 0 的瞬间轮次就结束,几种结束同时发生时清图优先 -**人话**:这条管"轮次什么时候算完、几种结束方式打架时听谁的"。行动点扣到 0 的那一瞬间,轮次立即以"耗尽"结束——不存在 0 行动点还能操作的窗口。每个动作都在账本事务内结算并判定一次结束;多种结束方式同时成立时(比如最后 1 行动点挖开最后一块安全格),按固定优先级只裁出一个赢家——与哪种情况先到达无关,也禁止把同一份剩余行动点按两条路径重复折算。 - -| 同时成立时 | 优先级 | 胜出后发生什么 | -|---|---|---| -| 清图(cleared) | 最高 | 剩余行动点清零 + 清图奖励,下轮换新图 | -| 停手(stopped) | 居中 | 剩余行动点 1:1 存入 RAP 池,下轮同图 | -| 行动点耗尽(ap_exhausted) | 最低 | 剩余行动点恒为 0(实现层断言,违反即致命),下轮同图 | - -**举证**:无计算(优先级为固定常量序 `cleared > stopped > ap_exhausted`,单事务一次判定)。同帧/同批次多路径竞争的仲裁语义见 EC4("先停后挖"腿 deferral 至 A2 集成测试);最后 1 行动点同时清图与耗尽时清图胜出见 EC10;验收 AC-4/AC-4b/AC-8。 - -#### 规则 4:玩家随时可以主动停手,剩余行动点原值存进 RAP 池 -**人话**:这条管玩家的提前收工:挖掘期任意时刻,玩家可以直接停手——输入层直调 A3,不经棋盘。停手立即结束本轮(结束方式标记 `stopped`),剩余行动点按 1:1 原值转存 RAP 池,没有乘数加成;停手不是战斗收入流,是纯风险管理工具——"这轮我不想赌"的体面出口。停手时图没开完也没关系,下一轮继续在同一张图上挖。 - -**举证**:无计算(1:1 转存,无乘数、无公式)。停手与挖掘期刷新的逐维差异见下方「规则 4 与规则 11 的实现参照——停手与挖掘期刷新对照」;满 AP 停手恰可达一次刷新的基线节拍及其退化环分析见 EC6;验收 AC-5/AC-15。 - -#### 规则 5:安全格全部开完即清图——剩余行动点清零,另发清图奖励 -**人话**:这条管"把图开穿"的时刻:全部安全格开完(含连锁展开开的格),轮次以"清图"结束——剩余行动点直接清零,不折算、不进 RAP 池;同时发放清图奖励。奖励发什么、发多少归 B4 定,且是差异化插槽——B4 的奖励表须预留按图类型(A1 的 biome/tag 上下文)分支的结构位;A3 只上报"清图了"这一事实,不拥有奖励内容、不感知图类型。清图后下一轮换一张新图。 - -**举证**:无本地计算——奖励当量归 B4 定档,量级锚与下界见「数值结论与推导」节 F1 条款 4;奖励差异化插槽的上下文约束见 OQ6;连锁开完全图同样触发清图见 EC5;验收 AC-6/AC-6b。 - -#### 规则 6:轮次怎么结束只向外报一条消息,结算里不夹带任何折算数值 -**人话**:这条管轮次结束时对外的"发言":三种结束路径都只向结算编排方(B1)输出一条两字段消息——"怎么结束的 + 下轮用不用换图的提示"。这只是编排提示;权威的换图指令是 B1 之后回发的 `next_round_mode`。除此之外,消息不夹带任何折算数值——进结算明细的收益全部是具体战斗效果(主角 buff / 怪物 debuff / 清图奖励),来源归因标注由 B1 承担。 - -| 结束方式 | 发出的换图提示 | B1 权威回发(next_round_mode) | -|---|---|---| -| 清图 | new_board(建议换新图) | new_board——仅清图轮可换新图 | -| 停手 | same_board(建议同图续轮) | 恒 same_board(回发违约即 fail-fast) | -| 行动点耗尽 | same_board(建议同图续轮) | 恒 same_board(回发违约即 fail-fast) | - -**举证**:无计算。字段取值与产出点见「枚举」节 path_tag / continuation_hint 行;权威回发信号的消费位置见规则 9 与「状态」节 Waiting 行;结算明细归因标注义务见「呈现与 UI 契约」节第 5 条;验收 AC-4b/AC-5/AC-6。 - -#### 规则 7:全部数值存在配置表里,代码不写死一个数、不掷一次骰子 -**人话**:这条管数字的存放纪律:每轮发多少行动点、每个动作花多少、刷新门槛多高、每轮能刷几次——所有玩法数值都存在 D2 的 `ActionEconomyTable` 配置表里,经 ConfigDB 类型化读取。A3 的代码零玩法数值字面量:改数值=改表回填,不动代码;表不变,行为逐位相同。本系统也不涉及任何随机数——没有 RNG 流。 - -**举证**:无计算(本条是存放纪律,非数值规则)。字段清单、类型域与默认值见「Tuning Knobs」节 ActionEconomyTable schema;零字面量纪律依据 D2 Rule 1;零随机的行为级验收(同输入序列重放逐位相同)见 AC-17;表值与 registry 一致性见 AC-10a。 - -#### 规则 8:旗是棋盘上的标记不是背包道具,每颗雷的旗收益只能兑一次 -**人话**:这条管旗子的形态与兑付资格:旗没有"口袋/背包"这类实物资源——插上去就是棋盘上的一面标记,归棋盘系统(A2)所有;跨轮保留、随图存续,清图或刷新换图时随之消失。数量无上限,稀缺性全由"插旗要花行动点"承载:插旗=1 行动点+棋盘多一面标记,拔旗反向(标记移除)。标中旗的收益兑付有五条硬约束: - -| 兑付硬约束 | 意思 | -|---|---| -| 兑付一次性 | 每颗雷在本次战斗内至多兑付一次,资格随首次兑付消费 | -| 当轮结算 | 旗的放置实例只是当轮结算的兑付载体,不囤积到以后 | -| 资格以雷格实例为键 | 认雷不认旗——拔旗重插同一雷格,不恢复已消费的资格(堵死每轮 2 行动点的重插农场) | -| 禁止逐轮重复兑付 | 同一颗雷的收益不会逐轮反复发 | -| 换图资格重置 | 换图后新图的雷是新实例,资格自然重置 | - -**举证**:无计算。兑付硬约束的定稿依据见 OQ5(开放悬案节第 5 条);挖已插旗格须先拔旗见 EC11;同轮插了又拔、挪旗的消耗见 EC3/EC7;旧板旗随挖掘期刷新失效(零兑付)见下方「规则 11 的实现参照——RAP 池规则」"旧板旗"行;验收 AC-3a/AC-3b/AC-16。 - -#### 规则 9:扣行动点只认账本一个入口,"轮次结束"消息有两个合法发送者 -**人话**:这条管"谁有权扣行动点、谁有权宣布轮次结束"。全项目唯一的扣减入口是 A3 的账本接口——余量检查、扣减、结束仲裁在同一次事务内原子完成。棋盘系统(A2)只判棋盘面合法性(相邻、目标格状态、无双击快开)并执行棋盘效果:它是挖/插/拔的调用方,必须经账本扣费,自己无权扣资源。"轮次结束"消息有两个合法发射源,逐项见下表。 - -| 事项 | 责任方 | 运作方式 | -|---|---|---| -| 棋盘路径外发(耗尽 / 清图) | A2 | 账本扣费成功且本次事务内轮次结束时,A2 读取 `last_round_end` 组包外发——该读取权是接口契约的一部分,非仅测试设施 | -| 停手路径直发(stopped) | A3 | 停手是非棋盘输入,由输入层直调 A3,A3 仲裁后自行外发,payload 与 A2 路径同构——纯停手轮不存在"无发射者"漏洞 | -| `last_round_end` 只读记录 | A3 | 单槽只读记录;测试/审计断言落点,同时是 A2 组包 round_end payload 的合法数据源 | -| Waiting 出口 | A3 | 消费 B1 回发的 `next_round_mode ∈ {same_board, new_board}` 与 `battle_over` 信号 | - -**举证**:无计算。唯一扣减入口签名 `try_spend(action_kind) -> bool` 与事务边界见「全局流程」节轮次生命周期字符画与「状态」节状态机;账本资源面拒绝(AP 不足)见 EC2;Waiting 相位非法拒绝见 AC-9;停手 payload 同构与"恰一条输出"验收见 AC-5/AC-8;同值双发射不可区分的测试口径见「验收标准」节测试口径表 last_round_end 单槽行。 - -#### 规则 10:扫雷收益全部直接兑成战斗效果,没有中间货币 -**人话**:这条管"扫雷赚的东西以什么形式到手":全部收益——挖到安全格给主角上 buff、标中旗给怪物上 debuff、踩雷给敌方上增益、清图发奖励——都以战斗效果直兑,直接进轮次结算明细;不存在抽象点数、不存在折算乘数,折算公式根本不存在。这套对账契约共五条款,约束效果侧(结算系统),登记为 B1 GDD 验收项。 - -**举证**:五条款全文(单一当量对照 / 标中旗锚 / 挖掘风险不等式 / 清图奖励 / 弃图支配性)、推导与公式见「数值结论与推导」节 F1;playtest 复核归 OQ3、当量归一归 OQ1;systems-index 门禁 ①–⑤ 登记。 - -#### 规则 11:RAP 池只从停手进账、只为换新图花钱,战斗结束就清零 -**人话**:这条管"停手攒下来的钱":RAP 池的唯一进账是停手时剩余行动点的 1:1 转存;它属于整场战斗——战斗内跨轮次、跨扫雷图一直保留,战斗结束(进入 Idle)立刻清零。唯一花法是挖掘期换一张新图继续挖:玩家自己决定、经刷新入口发起、账本受理,每轮最多刷 2 次,禁止"攒满就自动刷"。RAP 不折算、不兑付任何战斗收益——纯风险退出资源。 - -**举证**:无独立公式(进账 1:1、扣费门槛与每轮上限均为配置表值/常量)。逐维细则、默认值与边界见下方「规则 11 的实现参照——RAP 池规则」;停手与刷新的逐维对照见下方「规则 4 与规则 11 的实现参照——停手与挖掘期刷新对照」;RAP 不足拒绝见 EC13、超限拒绝见 EC15、战斗末清零可见反馈见「呈现与 UI 契约」节第 3 条;验收 AC-5b/AC-11/AC-15。 - -### 规则 11 的实现参照——RAP 池规则 - -| 维度 | 细则 | -|---|---| -| 来源 | 唯一来源 = 停手转存(1:1,无乘数);清图与 ap_exhausted 的剩余 AP 均不入 RAP | -| 生命周期 | 战斗域:战斗内跨轮次、跨扫雷图累积;`battle_over` 进入 Idle 时清零(每场战斗清零;清零的可见反馈与教学落点见呈现与 UI 契约——防"攒的钱凭空没了"读感);MVP 无 RAP 上限;跨战斗携带为未来选项,若开放须修订本条并登记 D3/C2 持久化归属(OQ7) | -| 支出 | 唯一支出 = 刷新雷图;决策主体 = 玩家——经 D1 刷新入口在挖掘期(Active 相位)发起,B1 `refresh_board` 挖掘期刷新编排内调用 `request_refresh() -> bool`;禁止"RAP 满即自动刷" | -| 受理与换图 | `rap ≥ rap_refresh_cost`(默认 8)时扣减并当场换新图继续挖——AP 不重置、本轮剩余 AP 保留(A2 装板受理域已同步:Active·仅刷新路径);刷新获得的新图不产生清图奖励(它不是清图);不足则拒绝、状态不变(EC13) | -| 每轮上限 | `refresh_cap_per_round`(默认 2)——轮内计数、RoundStart 重置,超限拒绝(EC15);无冷却;每次独立检查 `rap ≥ rap_refresh_cost` 并扣减 | -| 旧板旗 | 随旧板失效——零兑付、旗 AP 不返还(与拔旗不返还同族;A2 换图全量重置承载) | -| 经济注记 | 刷新价格实际 = rap_refresh_cost + 每轮 2 次上限;挖掘期当场刷新无结算发生——敌方每轮照常结算的时间税不构成刷新本身的隐性成本;OQ3 弃图率/刷新率预警阈值联动复核 | -| 收益 | 无战斗收益——RAP 不折算、不兑付任何战斗效果,纯风险退出资源 | - -### 规则 4 与规则 11 的实现参照——停手与挖掘期刷新对照 - -| 维度 | 停手(规则 4) | 挖掘期刷新(规则 11) | -|---|---|---| -| 时点 | Active 任意时刻 | Active(挖掘期) | -| 发起 | 玩家输入层直调 A3 | 玩家经 D1 发起,B1 `refresh_board` 编排内调用 | -| 轮次 | 结束(path_tag=stopped),本图未开完 → 下轮同图 | 不终结——当场换新图继续挖 | -| 资源 | RAP += remaining_ap(1:1) | RAP −= rap_refresh_cost(每轮 ≤ 2 次) | -| 收益 | 风险退出权(无战斗收益) | 新图(无清图奖励;旧板旗失效零兑付) | - -## 枚举 - -### 值域封闭枚举(path_tag / 信号 / 动作类型 / 相位) - -| 值 | 字段 | 产出点 | 语义 | -|---|---|---|---| -| ap_exhausted | path_tag | AP 归 0 瞬间(try_spend 事务内,A2 外发) | 轮次耗尽;continuation_hint 恒 same_board;不变式 remaining_ap=0 | -| cleared | path_tag | 全部安全格开完(含连锁格;A2 外发) | 清图;恒 new_board;剩余 AP 清零 + 清图奖励(B4) | -| stopped | path_tag | 玩家主动停手(A3 直发) | 提前结束;恒 same_board;RAP += remaining_ap(1:1) | -| same_board | continuation_hint / next_round_mode | stopped/ap_exhausted 轮输出;B1 回发 | 下轮继续同图(stopped/ap_exhausted 轮恒 same_board——B1 回发违约 fail-fast) | -| new_board | continuation_hint / next_round_mode | cleared 轮输出;B1 回发 | 下轮换新图(A1 经 B1 编排生成) | -| battle_over | B1 → A3 信号 | 战斗终结 | → Idle,RAP 清零、ap=0 | -| dig / flag_place / flag_pull | action_kind(try_spend 参数) | A2 棋盘面判定通过后 | 账本扣减的三种动作;move/chain 0 成本不经账本(A2 承载) | -| Idle / Active / Waiting | phase(只读观测量) | 资源状态机 | 可观测相位域全集;RoundStart/RoundEnd 为事务内瞬态、不可观测 | - -### 对外 API 面(封闭枚举,8 入口全 bool——新增入口 = 接口漂移) - -| API | 签名 | 语义 | -|---|---|---| -| notify_round_start | `notify_round_start() -> bool` | 开轮(B1 编排) | -| request_dig | `request_dig(chain_size: int, clears_map: bool) -> bool` | 挖掘;chain_size = 连锁附加格数(不含首格,≥0;首格恒耗 1 AP);clears_map = 本次动作后全图安全格开完 | -| request_flag_place | `request_flag_place() -> bool` | 插旗 | -| request_flag_pull | `request_flag_pull() -> bool` | 拔旗 | -| request_stop | `request_stop() -> bool` | 停手(A3 直发 stopped round_end) | -| request_refresh | `request_refresh() -> bool` | 挖掘期刷新(Rule 11) | -| notify_settlement_done | `notify_settlement_done(next_round_mode) -> bool` | 记录编排意图(phase 停留 Waiting) | -| notify_combat_end | `notify_combat_end() -> bool` | 战斗终结 → Idle、RAP 清零 | - -## 数值结论与推导 - -### F1 下游经济契约(downstream_effect_contract) - -**结论**:全部扫雷收益以战斗效果直兑(安全格→主角 buff、标中旗→怪物 debuff、踩雷→敌方增益),无抽象点数、无折算乘数——折算公式不存在;契约为对效果侧的五条款,登记为 B1 GDD 验收项(systems-index 门禁 ①–⑤);playtest 复核归 OQ3,当量归一归 OQ1。 - -#### 推导 - -| # | 条款 | 内容 | 闭合 owner | -|---|---|---|---| -| 1 | 单一当量对照条款 | B1 须出效果档位对照表(1 最低档安全格 buff = ? 当量;debuff/清图奖励/敌方增益均对照归一),对全部收益来源单一换算——分源改率 = 契约失效,须回本 GDD 重议;归 OQ1(注意与 OQ6 清图奖励插槽区分) | B1 | -| 2 | 标中旗锚条款 | 标中旗的怪物 debuff 档位当量必须严格大于最低档安全格 buff 当量——否则插旗在最优情形下也只是打平,P3 旗循环经济空心;且对照基准须为连锁放大的边际挖掘收益(单 AP 平均挖掘当量,含连锁期望放大)——只对最低档比较会使旗理性萎缩到碎片区;每战标中旗总吞吐(N 旗 = N debuff)无单档上限可依恃,由 B1 按条款 1 对照表对账;插旗挤占清图进度的边际轮成本由 B4 定档时核算,或在其 GDD 声明 MVP 忽略并给理由 | B4 表设计 + B1 对照验收 | -| 3 | 挖掘风险条款 | 挖掘决策 EV 健康不等式(见公式):两端分别锚定 A1 可推理率生成参数(P1 下限,决定 P(安全) 的玩家可达上界)与 B2 惩罚上限表值(上限值登记为 B2 GDD 验收项);B1 为单一闭合对账 owner(A1/B2 供给锚值,B1 签字验收),登记为 B1 GDD 强制检查点;P1 支柱要求 A1 可推理率使玩家能推高 P(安全)——本条款是"可推理率"的经济侧验收形态(可判定谓词) | B1 | -| 4 | 清图奖励条款 | 清图奖励 > 0,量级与差异化分支归 B4(输入含 A1 图类型上下文) | B4 | -| 5 | 清图 vs 弃图刷新支配性条款 | 清图奖励当量下界须使"推到底清图"的期望当量 ≥ "确定格挖完即弃图刷新"的期望当量(见公式)——否则每图最优解退化为"捞完确定格就弃",清图高光节拍、B4 差异化插槽、game-concept"图完成"循环全部空心;该环强度与 A1 可推理率反向耦合——可推理率越低(迷雾/终局 50/50 越多),弃图越优,玩家对 P1 失败的理性回应会反过来饿死清图内容,故本条款是 P1 失败模式的经济对冲,与条款 3 共同登记 B1 强制检查点 | B1 | - -``` -条款 3(挖掘决策 EV 健康不等式): - P(安全) × V_safe_lb > P(雷) × V_mine_ub - P(安全) / P(雷) —— 挖掘目标格为安全格 / 为雷的概率 - V_safe_lb —— 最低档安全格 buff 当量下界 - V_mine_ub —— 敌方增益当量上界 - -条款 5(清图 vs 弃图刷新支配性): - C ≥ 弃图所节省的期望雷险当量 + Δ轮数 × 敌方结算强度当量 - C —— 清图奖励当量(B4,条款 4) - inputs —— B4 的 C、B2 惩罚上限、A1 雷密度/可推理率、B1 结算强度(B1 闭合对账) -``` - -**Variables:** - -| 变量 | 含义 | 锚定来源 | -|---|---|---| -| P(安全) / P(雷) | 挖掘目标格为安全格 / 为雷的概率 | A1 可推理率生成参数(P1 下限——决定 P(安全) 的玩家可达上界) | -| V_safe_lb | 最低档安全格 buff 当量下界 | B1 条款 1 效果档位对照表 | -| V_mine_ub | 敌方增益当量上界 | B2 惩罚上限表值(登记为 B2 GDD 验收项) | -| C | 清图奖励当量 | B4(条款 4 差异化插槽) | -| Δ轮数 | "推到底清图"与"确定格挖完即弃图刷新"的轮数差 | A1 雷密度/可推理率 × B1 结算强度 | - -| 验算项 | provisional 值 | 刷新时点 | -|---|---|---| -| 条款 2 对照基准 | 下限 1:1(单 AP 平均挖掘当量,含连锁期望放大) | B4/B1 定稿校准 | -| 条款 3 目标带 | 原型临时值(伏击 +3 / 敌 18HP/4ATK)代默认表给出首版示例 | 随 B2 表回填刷新 | -| 条款 4 清图奖励 | +10 临时锚(B4 插槽的 provisional 参考) | 量级归 B4 | -| 条款 5 支配性 | +10 锚对默认 8 AP 图形况粗验通过 | 正式锚随 B4/B2/B1 表值定稿 | - -## 状态 - -轮次内资源状态机(A3 资源侧视图;A3 只暴露资源余量、`last_round_end` 并消费 B1 信号): - -| 状态 | 进入条件 | 行为/出口 | -|---|---|---| -| RoundStart(瞬态) | `notify_round_start()`(B1 编排;战斗首轮要求当前 Idle) | AP←8(硬重置);RAP 不动(跨轮保留)→ Active | -| Active | 预算就绪 | 接受耗 AP 动作并经 `try_spend` 原子扣减;每个动作结算事务内按优先级仲裁(cleared > stopped > ap_exhausted)→ RoundEnd(胜出 path_tag);挖掘期刷新在此相位受理(Rule 11) | -| RoundEnd(瞬态) | 任一结束路径胜出 | 停手:RAP += remaining_ap(1:1);ap_exhausted:不变式断言 remaining_ap=0,违反即致命;清图:剩余 AP 清零。写 `last_round_end` → Waiting | -| Waiting | 结算完成前不接受 round_start(AC-14) | 消费 B1 信号:`next_round_mode=same_board` → 下轮 RoundStart(同图——stopped/ap_exhausted 轮恒 same_board);`next_round_mode=new_board` → 下轮 RoundStart(新图,A1 经 B1 编排生成——仅 cleared 轮;RAP 保留);`battle_over` → Idle(RAP 清零)。request_refresh 不在此相位受理(刷新决策在挖掘期,Rule 11) | -| Idle | 战斗终结 | 不响应任何动作请求;RAP=0、ap=0;下一场战斗由 B1 发 round_start 重启(唯一出口) | - -- **不变式**:可观测相位域 = {Idle, Active, Waiting}——RoundStart 与 RoundEnd 均为单事务内瞬态,不可观测、不作为任何测试 GIVEN;ap_exhausted 轮恒 remaining_ap=0;RAP 只经停手增加、只经刷新扣减与 battle_over 清零;编排权威序列以 B1 轮次生命周期编排章节为准。 - -### 输入 × 相位矩阵 - -全部 8 个 API 返回 bool;非法输入 = 拒绝(false)+ 状态不变 + debug 诊断——fail-fast 不静默吞编排错误,但不采用进程致命(进程致命保留给 D2 数据通道)。 - -| 输入 | Idle | Active | Waiting | -|---|---|---|---| -| `notify_round_start` | 受理(RoundStart) | 拒绝 | 拒绝(settlement 消费后受理——AC-14 门) | -| `request_dig` / `request_flag_place` / `request_flag_pull` / `request_stop` | 拒绝 | 受理(经 `try_spend`) | 拒绝 | -| `request_refresh` | 拒绝 | 受理(Rule 11——挖掘期当场换图) | 拒绝 | -| `notify_settlement_done` | 拒绝 | 拒绝 | 受理(重复调用拒绝) | -| `notify_combat_end` | 拒绝 | 拒绝 | 受理(→ Idle,RAP 清零) | - -## 边界情况 - -| 条件 | 行为 | 依据 | -|---|---|---| -| EC1 AP=0 后仍有动作请求 | 全部拒绝(返回 false)——轮次已在归 0 瞬间结束,不存在 0-AP 窗口 | Rule 3 | -| EC2 AP 不足以支付动作(含插旗/拔旗——旗无实物资源,拒绝只看 AP) | 拒绝、状态不变;`last_round_end` 不变 | Rule 9 / AC-7 | -| EC3 玩家拔旗再插他格(挪旗) | 合法——插+拔合计耗 2 AP(插 1 + 拔 1,默认值下);相对"直接改插他格"多耗的 1 AP(拔旗)即"防免费重排"的有意代价;旗标记的移除/重建为 A2 棋盘操作,A3 只见 AP −2 | Rule 2 / AC-16 | -| EC4 同帧/同批次多结束路径竞争 | 按 Rule 3 总仲裁 cleared > stopped > ap_exhausted,与到达顺序无关、单次判定;"先停后挖"腿的批次语义在 A3 冒烟 API 上不可构造(同步单调用无事务批次概念)——该腿显式 deferral 至 A2 集成测试承载(systems-index 门禁登记,非静默豁免);A3 冒烟承载"先挖后停"腿(AC-8) | Rule 3 / AC-8 | -| EC5 连锁展开开完全图 | 连锁免费;清图判定以"安全格全部开完"为准(含连锁开的格)→ 正常触发 cleared;RoundStart 的初始 3×3 自动展开同理(退化小图属既有行为,不设独立分支);退化图刷清图奖励的钓鱼风险登记为 A1/B1 下游约束——最小安全格数下限归 A1 生成参数验收;初始展开的定义落点(免费、计入清图进度、无奖励)归 A2 GDD 承载,本 GDD 仅经 `chain_size`/`clears_map` 参数引用其结果 | Rule 2 / AC-6b | -| EC6 满 AP 停手 | 合法——RAP +8(= rap_refresh_cost,恰好可达一刷,Rule 11 基线节拍,有意;该节拍与 OQ3"纯停手轮占比"预警同源,调参时联动评估)。诚实声明(形态限定版):① 纯停手零挖掘环(停→刷→停)零战斗进账,唯一代价是敌方每轮照常结算(时间税自惩)——该退化形态结构自惩成立;② 但理性玩家的真实风险环是"挖完全部确定格 → 不确定即停 → 攒满刷新":该环有真实战斗进账、零踩雷风险,刹车只有三个——清图奖励弃失(下界由 F1 条款 5 守住)、8 RAP 成本、时间税;本条不声称该环"病灶不存在",其健康性由 F1 条款 5(支配性不等式)+ OQ3 弃图率/完成度指标守门 | Rule 4 / F1 条款 5 / OQ3 | -| EC7 同轮内插旗后又拔旗 | AP 合计消耗 2(插 1 + 拔 1,默认值下);旗标记由 A2 移除,A3 无旗状态可返 | Rule 2 | -| EC8 战斗最后一轮的收益兑现 | 敌人已全灭时 B1 结算先判胜,当轮 buff/debuff/清图奖励是否兑现 = B1 判定次序域,A3 无断言义务(out-of-scope);A3 义务仅为每轮无条件输出一条 `(path_tag, continuation_hint)` | B1 域 | -| EC9 跨轮/跨图资源携带 | RAP 是唯一跨轮携带量(战斗域,跨图也保留);停手不是战斗资源机制——无复利问题;AP 腿每轮硬重置;旗标记随图存续(A2 域);RAP 战斗结束清零(AC-11) | Rule 1 / Rule 11 / AC-11 | -| EC10 最后 1 AP 挖开最后安全格 | cleared 与 ap_exhausted 同时成立 → 清图胜出:输出 `(cleared, new_board)`、剩余 AP 清零 + 清图奖励 + 换图,ap_exhausted 不触发——防"耗尽优先"实现把清图高光结算为最差结局、训练玩家永远留最后一格停手 | Rule 3 / AC-4b | -| EC11 挖已插旗的格 | 拒绝——须先拔旗(1 AP,默认值下)再挖;旗是"别挖这里"的承诺标记,挖旗格合法化会催生零风险滥用;误标改主意的代价 = 拔旗 1 AP(P3 承诺重量);棋盘面判定归 A2 | A2 域 / AC 前言 out-of-scope | -| EC12 RAP 生命周期边界 | MVP 无上限;战斗结束(Idle)强制清零;跨战斗携带若未来开放,须修订本条与 Rule 11 并登记 D3 持久化归属 + C2 冒险域语义(OQ7)——禁止静默超域 | Rule 11 / OQ7 | -| EC13 RAP 不足时请求刷新 | `request_refresh()` 返回 false、RAP 不变、相位不变(Active 相位内的资源不足拒绝;与 AC-14 的相位非法拒绝区分——后者附 debug 诊断,两者均为 bool 口径) | Rule 11 / AC-5b | -| EC14 清图/耗尽轮次产生剩余 AP | 清图剩余 AP 清零(不入 RAP,Rule 5);ap_exhausted 恒 remaining_ap=0(不变式断言);两路径 RAP 增量恒为 0(AC-4/AC-6 断言);不变式断言的实现载体为 debug 断言(冒烟无 fault-injection 载体;行为级代理 = AC-4 的 rap 不变断言) | Rule 5 / AC-4 / AC-6 | -| EC15 同一轮内多次请求刷新 | 受理至每轮上限 `refresh_cap_per_round`(默认 2)为止,超限拒绝(resource_face;轮内计数、RoundStart 重置);每次独立检查 `rap ≥ rap_refresh_cost` 并扣减;无冷却;每次刷新都当场换新图且不产生清图奖励(Rule 11);挖掘期当场刷新无结算发生——OQ3 联动复核 | Rule 11 / AC-5b | - -## 依赖 - -**上游**: - -| 系统 | 性质 | 接口要点 | -|---|---|---| -| D2 | hard | ActionEconomyTable schema 与 ConfigDB 类型化读取;本 GDD 为该表回填 owner(回写台账见对账义务登记表) | -| A1 | 间接事实依赖 | 新图生成经 B1 编排调用——A3 不直接消费 A1 接口,仅 Waiting 出口消费其结果信号 | - -无其他玩法上游(Foundation 层)。 - -**下游**: - -| 依赖方 | 性质 | 接口 | -|---|---|---| -| A2 | hard | 账本调用(`try_spend`)+ 价目表执行 + round_end 棋盘路径外发(Rule 9,payload 组包读取 `last_round_end`);A2 校验棋盘面合法性,资源合法性归 A3;旗标记棋盘状态归 A2;EC4"先停后挖"批次仲裁 deferral 至 A2 集成测试(对账义务登记表) | -| B1 | hard | RoundEnd 输出 `(path_tag, continuation_hint)`;挖掘期刷新编排(`refresh_board`)内调用 `request_refresh()`(Rule 11);回发 `next_round_mode`/`battle_over`;F1 契约验收项(效果档位对照表单一线性换算) | -| B4 | soft | 清图奖励差异化插槽(按图类型分支);标中旗 debuff 档位(OQ5/F1 条款 2 锚约束) | -| D1 | soft | AP/RAP HUD 常显;刷新入口与 RAP 清零反馈;非法原因双源呈现 | -| D5 | soft | 教学口径来源(含 RAP/刷新/RAP 战斗末清零) | - -### 对账义务登记表 - -| 编号 | 内容 | 对侧 | 状态 | -|---|---|---|---| -| 1 | ActionEconomyTable 首轮回填——值侧四项 + registry 登记 | D2 | 已完成 | -| 2 | schema 全字段交付(十字段,含 move/chain 冻结字段) | D2 | 已完成 | -| 3 | RAP 结构 delta——四字段删除(flags_per_round / flag_unit_cost / stop_multiplier / clear_multiplier)+ `rap_refresh_cost` 新增;D2 Core Rules 表行/Status 行、AC-7 示例值、registry 同步回写 | D2 | 已完成 | -| 4 | config 结构位 `refresh_cap_per_round` 预留;D2/registry 字段回写随实现批次(届时 AC-10a 七字段清单同步扩为八字段) | D2 | 待实现批次 | -| 5 | F1 五条款验收——效果档位对照表/标中旗锚/挖掘风险不等式/清图奖励/弃图支配性(条款 3/5 为 B1 强制检查点;systems-index 门禁 ①–⑤) | B1(供给锚值:A1/B2/B4) | 已登记 | -| 6 | EC4"先停后挖"批次仲裁腿 deferral 至 A2 集成测试(A3 冒烟 API 不可构造;A3 冒烟承载"先挖后停"腿 AC-8) | A2 | 已登记(systems-index 门禁) | -| 7 | 退化图刷清图奖励的钓鱼风险——最小安全格数下限归 A1 生成参数验收;初始展开定义落点(免费、计入清图进度、无奖励)归 A2 GDD 承载 | A1/A2/B1 | 已登记(EC5) | -| 8 | 图类型上下文在战斗域内恒定(biome 挂关卡层、不逐图重掷——防 `request_refresh` 退化为 biome 重掷钓鱼口) | A1/B4 共同验收 | 已登记(OQ6) | -| 9 | 刷新入口(玩家发起)与 battle_over 时 RAP 清零的可见反馈 | D1 | 已登记(D1 GDD 验收项) | - -## 呈现与 UI 契约 - -A3 不拥有 UI,对外暴露的状态与反馈义务: - -| # | 义务 | 归属 | -|---|---|---| -| 1 | 当前 AP 与当前 RAP 为 HUD 常显字段 | D1 | -| 2 | 刷新入口为玩家发起(Rule 11),入口可用性由 B1/D1 呈现 | B1/D1 | -| 3 | `battle_over` 时 RAP 清零须有可见反馈——防"攒的钱凭空没了"读感(对账义务登记表 #9) | D1 | -| 4 | 动作非法原因需可区分且双源——棋盘面非法(非相邻格/挖旗格等,A2 判定)/ 资源面非法(AP 不足 / RAP 不足,A3 判定),D1 呈现(原因读数的测试承载声明见验收标准前言 out-of-scope) | D1/A2 | -| 5 | 结算明细的效果项带来源标注(P2 归因) | B1 | -| 6 | 交互成本指标(每消耗 1 AP ≤ 2 次点击)归 A2/D1 观测(P4 免费移动的点击摩擦护栏) | A2/D1 | -| 7 | 无专属表现面、无音频需求;AP/RAP 余量变化与"资源不足"反馈的呈现归 D1/A2 | D1/A2 | -| 8 | AP/旗(价目)/停手/RAP 的教学口径以本 GDD 价目表为准,须含"RAP 战斗结束清零"条目(防"存的钱凭空没了"误读) | D5 | - -## Tuning Knobs - -### ActionEconomyTable schema(单行全局,int 类型,A3 回填 owner) - -| 字段 | 类型/范围 | 默认 | knob | 说明 | -|---|---|---|---|---| -| ap_per_round | int [1, 32] | 8 | ✓ | 每轮行动点(原型 v2 实测定稿;双重身份:节奏 knob 兼停手 RAP 转存规模 knob) | -| dig_ap_cost | int [1, 8] | 1 | ✓ | 挖单格成本(域下限 1:0 = 无预算系统失效,越域校验拒绝) | -| flag_place_ap_cost | int [0, 8] | 1 | ✓ | 插旗 AP 成本(旗无实物资源,仅此一项消耗) | -| flag_pull_ap_cost | int [0, 8] | 1 | ✓ | 拔旗 AP 成本(OQ2 复核落点) | -| rap_refresh_cost | int [1, 64] | 8 | ✓ | RAP 刷新门槛;默认 8 = ap_per_round,使"满 AP 一轮停手 = 恰好一刷"成为基线节拍;单字段域内任意值均可运作(仅节奏差异),跨字段约束见下 | -| move_ap_cost | int | 0 | ✗ 冻结 | 移动免费(P4 承载,调参豁免) | -| chain_ap_cost | int | 0 | ✗ 冻结 | 连锁展开免费(原型 v2 定稿) | -| refresh_cap_per_round | 结构位(int) | 2 | 结构位预留 | 每轮刷新上限(Rule 11/EC15;RoundStart 重置计数);D2/registry 字段回写随实现批次(届时 AC-10a 七字段清单同步扩为八字段) | - -- knob 列 = 是否开放调参;非 knob 字段仍入表——代码零字面量,修订须走本 GDD 修订流程。 -- **跨字段校验(D2 validate() 级)**:任一动作成本字段(`dig_ap_cost` / `flag_place_ap_cost` / `flag_pull_ap_cost`)≤ `ap_per_round`——违反即加载期致命(D2 Rule 6 fail-fast)。依据:dig=8 × ap=1 双双域内会使挖掘永久不可用、cleared/ap_exhausted 双不可达(软锁循环),属结构失效而非节奏差异,与本表"域下限 1 = 零预算系统失效"同族;归 ActionEconomyTable schema 类 `validate()` 跨字段类别(D2 既有"schema validate() 收集后致命"机制承载,无需新增 D2 校验通道);违规夹具登记为 D2 校验双通道条件性夹具(同悬空引用待遇)。 -- **域上界注记**:dig/flag 上限 8、refresh 上限 64 为 MVP 量级护栏(非推导界),随调参需要修订。 - -| Knob | 默认 | 调过高 | 调过低 | -|---|---|---|---| -| ap_per_round | 8 | 决策带宽膨胀、节奏拖长(原型 v1 的 12 已实测否决);双重身份:满停 RAP 转存随之增大(8→12 使满停一刷后的富余 +4) | "想清楚的事做不完",违反 P1 | -| dig_ap_cost | 1 | ——(>1 使"连锁免费"的相对收益畸变,未实测) | 0 = 无预算系统失效(schema 域 [1,8] 拒绝) | -| flag_place_ap_cost | 1 | 插旗迟疑,P3 标雷策略萎缩 | 插旗无成本,旗标记泛滥(棋盘噪音) | -| flag_pull_ap_cost | 1 | 挪旗昂贵,误标惩罚过重 | 挪旗近免费,承诺无重量(OQ2 复核落点) | -| rap_refresh_cost | 8 | 刷新太贵,风险退出权萎缩、盲猜局被迫赌(违反 P1 兜底) | 刷新近免费,图来回刷节奏拖沓;敌方时间税仍自惩但体验烦躁 | - -- **Knob 交互**:`rap_refresh_cost : ap_per_round` 比值 = "停几轮换一刷"(默认 1:1 = 满停即一刷;该节拍与 OQ3 纯停手预警同源,联动评估);`ap_per_round × 插旗占比` 与 A1 布雷密度共同决定标雷全周期可行性(A1 定稿后强制复核);效果侧健康(F1 五条款)无单一系统 knob 可控——对照表/闭合对账归 B1、惩罚上限归 B2、奖励分支归 B4(对账归 OQ1);刷新率应急阈值(OQ3)的评估须与 B2 结算强度联动,勿独立调参。 -- **已冻结项**:AP 8 来自原型 v2 实测(12 点被否);移动/连锁 0 成本为结构冻结;RAP 1:1 转存与战斗域生命周期为结构(非 knob,修订走 GDD 流程;跨战斗携带 = OQ7 预留开关);旗数量无上限为结构。 - -## 验收标准 - -### 测试口径 - -| 口径 | 要点 | -|---|---| -| 测试载体 | A3 是被动账本,挖/插/拔的棋盘面执行归 A2(设计顺序第 6 位)、轮次节拍归 B1(第 9 位)——均未实现;冒烟脚本(`--headless --script`,承 D2 冒烟框架)直接驱动 A3 最小 API 面;A2/B1 就绪后改走真实调用方,断言口径不变 | -| API 面 | 8 个 API 布尔返回 = 受理/拒绝——"拒绝"直接断言返回值(notify_* 与 request_* 同为 bool);相位非法拒绝附 debug 诊断、非进程致命;受理矩阵见状态节输入×相位表 | -| 参数语义 | `chain_size` = 连锁附加格数(不含首格,≥0;首格恒耗 1 AP);`clears_map` = 本次动作后全图安全格开完 | -| 只读观测量 | `ap` · `rap` · `phase` · `last_round_end`(记录 path_tag / continuation_hint,可空);相位观测域 = {Idle, Active, Waiting};RoundEnd 为事务内瞬态、不可观测,不作为 GIVEN | -| 口径声明 | `notify_settlement_done` 仅记录编排意图,phase 停留 Waiting(AC-11 断言);轮次开启仍由 `notify_round_start` 触发(AC-14 的门不被绕过);各 AC 的 THEN 具体数值按当前 ConfigDB 表值推导(默认 8/1/1/1/8 下的具体数见各 AC;测试读取表值计算期望,不写死) | -| 夹具一致性 | 冒烟经 `chain_size`/`clears_map` 参数注入棋盘事实(信任方向见依赖 A2 行)——各 AC 使用独立夹具图,`clears_map=false` 腿的安全格余量在夹具中显式登记(防"传 false 却实际清图"的夹具失配假失败);多步 GIVEN 均给出构造序列 | -| 覆盖声明(out-of-scope) | EC11 与挖/插/拔相邻性、旗标记棋盘状态与跨轮留旗(A2 棋盘面域,A2 GDD 承载 AC,systems-index 门禁登记);EC8 末轮判定次序(B1 域);移动/连锁 0 成本不经账本(A2 侧承载);刷新的换图生成与奖励内容(B1/A1/B4 域);资源面拒绝原因的读数区分(UI 要求"可区分",但冒烟 API 无原因观测量——bool + 构造上下文可推断,呈现归 D1/A2 集成测试);跨字段校验违规(`validate()` 级,归 D2 校验双通道条件性夹具) | -| last_round_end 单槽 | 同值双发射不可区分(跨值覆盖由 AC-8/AC-9 值断言承担,同值双发防御归 A2 集成) | - -### AC 清单(Given-When-Then,编号不变) - -| AC | Given | When | Then | -|---|---|---|---| -| AC-1a | phase=Idle(冷启动,rap=0) | `notify_round_start()` | 返回后 ap=8、rap=0、phase=Active | -| AC-1b | 上轮以 (stopped) 结束且 rap=3、`notify_settlement_done(same_board)` 已消费 | `notify_round_start()` | ap=8(硬重置)、rap=3 不变(RAP 跨轮保留)、phase=Active | -| AC-2 | Active ap=8 | `request_dig(chain_size, false)` 以 chain_size ∈ {0, 1, 5} 各在新轮次执行一次 | 每次返回 true 且扣减恒为 1(连锁免费:chain_size=5 时 ap 8→7 而非 8→2) | -| AC-3a | ap=8 | `request_flag_place()` | true、ap=7(旗标记为 A2 域,A3 无旗观测量) | -| AC-3b | ap≥1(AC-3a 产物 ap=7) | `request_flag_pull()` | true、ap=6 | -| AC-16 | AC-3a 产物(已插 1 旗、ap=7,旗构造经 `request_flag_place()`——A3 冒烟无棋盘观测量) | `request_flag_pull()` 后 `request_flag_place()` | 两调用均 true、AP 合计 −2(挪旗成本,EC3)、轮次不结束 | -| AC-4 | ap=1(构造:新轮 7 次 `request_dig(0,false)`)且 clears_map=false(前置:该格非最后安全格) | `request_dig(0, false)` | true、轮次立即结束、`last_round_end=(ap_exhausted, same_board)`、rap 不变(+0,EC14) | -| AC-4b | ap=1 且仅剩 1 个安全格(构造同上,digs 作用于预设夹具图) | `request_dig(0, true)` | true、`last_round_end` 值等于 `(cleared, new_board)`(清图胜出,EC10)、rap 不变;不存在第二条输出 | -| AC-5 | Active ap=3 且图未开完(构造:5 次非清图挖,8−5=3) | `request_stop()`;随后 `notify_settlement_done(same_board)` + `notify_round_start()` | true、`last_round_end=(stopped, same_board)`、rap=3(1:1 转存,恰一条输出);新轮 ap=8、rap=3 | -| AC-5b | 分支 1:Active 且 rap ≥ rap_refresh_cost(构造:满 AP 停手 → rap=8 → `notify_round_start()` 回 Active——RAP 跨轮保留);分支 2:Active 且 rap=3(构造:前轮挖 5 后 `request_stop()` → rap=3 → `notify_round_start()`) | `request_refresh()`(两分支各一次) | 分支 1:true、rap=0、phase 不变(Active——挖掘期当场换图,A2 装板受理联动);分支 2:false、rap=3、phase 不变(EC13) | -| AC-6 | ap=5(构造:3 次非清图挖) | `request_dig(0, true)`;随后 `notify_settlement_done(new_board)` + `notify_round_start()` | true、`last_round_end=(cleared, new_board)`、rap 不变(剩余 AP 清零,Rule 5/EC14);新轮 ap=8、rap 仍= 前值(RAP 跨图保留,EC9 的 cleared 腿) | -| AC-6b | 冷启动 ap=8、夹具图恰余 4 个安全格 | `request_dig(3, true)`(附加 3 格连锁开完全部余量;chain_size 不含首格) | true、ap=7、`last_round_end` 值等于 `(cleared, new_board)`、rap 不变——连锁免费且连锁格计入清图判定(EC5),单次判定 | -| AC-8 | Active、剩余安全格恰 1、ap≥1(先挖后停腿——A3 冒烟可测子集) | `request_dig(0, true)` 后 `request_stop()` | 第二调用返回 false、`last_round_end=(cleared, new_board)` 恰一条、phase=Waiting(EC4;stop-first 腿 deferral 至 A2 集成,门禁登记) | -| AC-15 | Active ap=8 且图未开完 | `request_stop()` | true、`last_round_end=(stopped, same_board)`、rap=8(满停 = 刷新门槛恰可达,Rule 11 基线节拍,EC6) | -| AC-7 | ap=1(构造:7 次非清图挖)且 debug override `flag_place_ap_cost=2`、`flag_pull_ap_cost=2`(域 [0,8] 内,经 D2 R3 注入);承载声明:默认价目下全动作 1 AP,"AP 不足"腿(EC2)在默认表值下不可构造(ap≥1 恒可支付、ap=0 即收轮),故本 AC 显式承载于非默认表值夹具 | 依次 `request_flag_place()`、`request_flag_pull()`、`request_dig(0,false)` | 前两者 false(AP 不足,EC2)、最后者 true(ap 1→0,触发 ap_exhausted);`last_round_end` 断言只含末次记录 | -| AC-9 | phase=Waiting(经 ap_exhausted 路径构造;RoundEnd 瞬态不可观测) | 依次 `request_dig(0,false)`、`request_flag_place()`、`request_flag_pull()`、`request_stop()` | 全部 false、ap/rap 不变、`last_round_end` 不变(无第二条输出) | -| AC-11 | phase=Waiting 且 rap>0(构造:停手轮后) | `notify_settlement_done(same_board)`;随后 `notify_combat_end()` | settlement_done 返回 true 且 phase 仍= Waiting(仅记录编排意图,AC-14 门不被绕过);combat_end 返回 true、phase=Idle、rap=0(战斗域清零,EC12)、ap=0 | -| AC-12 | phase=Idle | 任何动作/停手/刷新请求 | 全部 false、`last_round_end` 保持 null、phase 不变 | -| AC-13 | phase=Idle | `notify_round_start()`(新战斗首轮) | 返回 true、phase=Active、ap=8(Idle 唯一出口;RoundStart 瞬态不作断言落点) | -| AC-14 | phase=Waiting 且结算未完成(未消费 next_round_mode) | `notify_round_start()` | 返回 false、phase 停留 Waiting、`last_round_end` 不变(fail-fast = 拒绝 + debug 诊断,不静默吞编排错误;统一 bool 口径,非进程致命) | -| AC-18 | phase=Active(冷启动后、未挖任何格) | 依次 `notify_round_start()`、`notify_settlement_done(same_board)`、`notify_combat_end()` | 全部返回 false、ap/rap/phase/`last_round_end` 均不变(输入×相位矩阵 Active 列全覆盖;防 B1 双启动静默 AP←8 重置);`request_refresh` 于 Active 受理(见 AC-5b) | -| AC-17 | 全新 A3 实例(同一 ConfigDB 表;每遍以新实例构造,无跨实例状态) | 同一动作序列驱动两遍 | 两遍 `last_round_end` 序列与 rap 轨迹逐项相同(零随机的行为级证据,D2 AC-15 的 A3 层前身) | -| AC-10a | ConfigDB 加载完成 | 脚本解析 `design/registry/entities.yaml` 的 `action_economy` 条目 | 与 `ConfigDB.action_economy` 七字段(ap_per_round / dig_ap_cost / flag_place_ap_cost / flag_pull_ap_cost / rap_refresh_cost / move_ap_cost / chain_ap_cost)逐一相等;registry 缺任一字段即失败 | -| AC-10b | A3 文件集 | 纳入 D2 AC-14 项目级扫描域 | 引用其人工三要素口径,不另设自动化字面量硬 THEN——字面量判定误报率高,D2 已定性为 warning 级 + 人工复核 | - -## 开放悬案 - -| # | 悬案 | owner | 要点 | -|---|---|---|---| -| 1 | 效果档位对照表与闭合对账 | B1(第 9 位) | 安全格 buff / 标中旗 debuff / 清图奖励 / 敌方增益的统一当量对照与换算由 B1 GDD 定稿,须满足 F1 五条款;B1 兼任条款 3(挖掘风险不等式)与条款 5(弃图支配性)的单一闭合对账 owner(A1/B2/B4 供给锚值,B1 签字验收),两项均登记 B1 GDD 强制检查点;每战标中旗总吞吐对账归本条;注意与 OQ6 清图奖励插槽区分 | -| 2 | 拔旗耗 AP 复核 + 标错惩罚双重职责 | A2 前原型小补丁(与标错惩罚实测合并会话) | 本 GDD 按"拔旗 1 AP、移除标记"定稿;复核改动现已有 knob 落点(`flag_pull_ap_cost`),若实测推翻则调 knob 并回写 registry。标错惩罚现承担双重职责:误标税 + 停手轮/死 RAP 态下旗滥用的唯一价格——RAP 无上限 + 满溢态使碎片区插旗机会成本趋零,"可疑格全插旗、永不拔"的滑向由本惩罚定价;OQ3"停手轮旗动作占比"指标联动观测 | -| 3 | playtest 预注册指标 | 垂直切片前置 playtest | 指标:弃图率 = refresh/(clear+refresh)(>30% 观察、>50% 干预——provisional 预注册);刷新时已开格完成度直方图(完成度 <60% 的刷新占比 >50% 即信号);停手轮旗动作占比(>50% 即信号——投机旗/死 RAP 态检测,联动 OQ2);确定动作供给 >8 的轮占比(P1 决策密度兜底监测,与 A1 密度联合验收);刷新率/战斗(>3 次即观察信号,阈值评估与 B2 结算强度联动,勿独立调参);纯停手轮占比(>20–30% 即观察信号);停手时机分布、每轮犹豫时长、终局碎片区(清图完成度 >80%)轮次数。失明声明:刷新率/纯停手占比/碎片区轮次三项对"挖完全部确定格→停→刷"环结构性失明——该环停手轮先挖后停(非纯停手)、温和变体刷新率低、开到 >80% 即弃使碎片区读数反而变低(病态呈现为健康);故增弃图率/完成度直方图/停手轮旗占比前三项直测该环。应急方案(触发后启动):`rap_refresh_cost` 调参 / 刷新冷却(连续刷新须间隔 N 轮)/ 刷新新图保留已开格结构(重议级) | -| 4 | AP 耗尽的软提示 | D5(低优先) | 本 GDD 定"AP=0 即收轮";教学若发现新手困惑,加提示不改规则;可扩展覆盖"RAP 达标刷新引导"与"RAP 战斗末清零提示"(D1 清零反馈的对应教学条目) | -| 5 | 标中旗兑付语义细化 | B4/B1(A3 硬约束已定稿) | 标中旗 = 怪物 debuff(三向效果定稿);硬约束:兑付一次性、当轮结算、兑付资格以雷格实例为键(每雷本次战斗至多兑付一次,资格随首次兑付消费;放置实例仅为当轮结算载体)、拔旗重插同一雷格不恢复已消费资格(堵重插农场)、禁止逐轮重复兑付;换图后新雷为新实例;档位锚见 F1 条款 2(严格 > 最低档 + 连锁放大边际基准 + 总吞吐对账);标错惩罚归 game-concept 待定问题(OQ2 合并会话,双重职责见 OQ2) | -| 6 | 清图奖励差异化插槽 | B4(结构位预留 + A1 上下文) | 清图奖励未来按图类型(biome/tag)分支——B4 奖励表 schema 须预留图类型维度的结构位;A3 只上报 `cleared`,图上下文经 B1 传递、不经 A3;约束:图类型上下文在战斗域内恒定(biome 挂关卡层、不逐图重掷)——否则 `request_refresh` 退化为 biome 重掷钓鱼口;该约束登记 A1/B4 共同验收 | -| 7 | RAP 跨战斗生命周期开关 | 垂直切片 knob 复核 | MVP 每场战斗清零;若实测支持跨战斗存蓄(Boss 图连刷策略),须修订 Rule 11/EC12 + 登记 D3 持久化归属与 C2 冒险域语义 | - -## 版本历史 - -| 版本 | 日期 | 改动 | -|---|---|---| -| v1.0-lean | 2026-09-13 | 格式迁移:legacy 原稿按 lean 样例(docs/lean-gdd-sample-b1.md)重排——正文修订注记剥离收敛至本表;速览/体验锚点/枚举/边界情况/AC/义务台账/OQ 转表格,流程转字符画;F1 五条款、公式与验算数据全保留;语义与 2026-09-07 三轮评审修订版及 2026-09-12 D4 修订对齐,零规则变更 | -| D4 修订 | 2026-09-12 | 刷新决策前移挖掘期:`request_refresh` 由 B1 `refresh_board` 挖掘期刷新编排内调用(原结算编排期 Waiting 相位代理调用退役);新增每轮刷新上限 `refresh_cap_per_round` 默认 2(RoundStart 重置、超限拒绝,EC15);旧板旗随旧板作废(零兑付、旗 AP 不返还,A2 换图全量重置承载);stopped/ap_exhausted 轮恒 same_board 钉入 Waiting 出口契约 | -| 三轮评审修订版 | 2026-09-07 | 三轮 full review(game-designer · systems-designer · qa-lead · economy-designer · creative-director)8 条文本级 blocking 同日全部核销,用户拍板接受修订并标记 Approved、免独立 delta 核销(不设第四轮全量评审):RAP 池新增(停手剩余 AP 1:1 转存,原 ×2 折算与 stop_multiplier 删除;战斗域生命周期、battle_over 清零);清图剩余 AP 作废(原 ×1 折算与 clear_multiplier 删除);F1 结构性改写为五条款并钉死 B1 闭合 owner(原 F1 折算公式与 F2 挖/停/清激励不等式整体作废——F2 被二轮评审击穿两条数学缺陷:博弈树错误、缺风险项,不再修复而是移除病灶);旗子单态(口袋旗双态删除,数量无上限,稀缺性由 AP 机会成本承载);round_end 双发射源(stopped 由 A3 直发);兑付资格以雷格实例为键(堵重插农场);ActionEconomyTable 四字段删除 + rap_refresh_cost 新增(同日三次回填);跨字段校验(动作成本 ≤ ap_per_round);输入×相位矩阵增补;评审日志 design/gdd/reviews/a3-action-economy-review-log.md | -| v1(初稿定稿) | 2026-09-07 前 | 数值继承原型 v2/v3 实测结论与 game-concept 定稿:AP=8 定稿(12 点否决);连锁免费(原型 v2 定稿);统一行动经济(原型 v3:挖/插/拔均限相邻、拔旗 1 AP 条文读法确认);三向效果与清图奖励结构落位 | diff --git a/design/gdd/legacy-2026-09-14-v1/a4-terrain-variation.md b/design/gdd/legacy-2026-09-14-v1/a4-terrain-variation.md deleted file mode 100644 index f60ba421..00000000 --- a/design/gdd/legacy-2026-09-14-v1/a4-terrain-variation.md +++ /dev/null @@ -1,517 +0,0 @@ -# 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 口径总纲:本 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 小人 > 旗 > 变异纹理 > 底色——雾纹理不得干扰雾外数字辨识;已开雾格 = 地板无字(不留雾残留遮蔽) | 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 | diff --git a/design/gdd/legacy-2026-09-14-v1/a5-minesweeper-aux-items.md b/design/gdd/legacy-2026-09-14-v1/a5-minesweeper-aux-items.md deleted file mode 100644 index a1dd49ae..00000000 --- a/design/gdd/legacy-2026-09-14-v1/a5-minesweeper-aux-items.md +++ /dev/null @@ -1,534 +0,0 @@ -# A5 扫雷辅助道具(Minesweeper Auxiliary Items) - -> **状态**:Approved · lean 格式——solo 快速审核 3 blocking 同日核销,用户拍板免独立 re-review 直接放行(B2/B1/D1 先例) -> **版本**:v1.1-lean · 2026-09-14 · 作者:user + main session(solo 定稿 + solo 快速审核修订;专员/总监代理按 review-mode.txt = solo 全部跳过) -> **承载支柱**:P1 主(信息道具 = 推理原料的恢复、替代推理窄域化)· P2(道具是扫雷决策的兑现物 + 来源归因)· P3(情报购买的信息与行动力定价切面)· P4(地牢探险者工具隐喻) -> **层级**:Layer 2.5 Core · Milestone 垂直切片(里程碑首位)· 设计顺序第 11 位(上游 D2/A3/A4/B3/A1/A2/B2/B4/B1/D1 全部 Approved) -> **一句话**:A5 定义挖掘期可用的辅助道具——获取挂 B4 奖励池、使用经 B1 挖掘期编排,效果 = 板级信息叠加层(零回写棋盘)与 AP 增量;五维度覆盖断言 + 稀有道具多维组合。 - -## 速览 - -| 关键问题 | 答案 | -|---|---| -| 定位 | 挖掘期辅助道具的定义与使用规则 owner——道具内容(AuxItemTable)、获取路由(B4 aux_item 激活)、使用编排契约(B1 use_aux 规范序)、板级信息叠加层与 AP 增量的规则面;玩家在挖掘中以消耗品购买情报与行动力 | -| 拥有 | AuxItemTable schema(D2 回填 owner)· 五维度框架与覆盖断言 · MVP 六行内容(值 provisional 归 C3)· 板级叠加层容器(显影/真视/预读三集)· 使用目标校验规则 · 消耗与库存规则(关卡域)· 获取与使用全流程规则 | -| 不拥有 | 奖励池与权重所有权(B4——aux 行值 provisional 归 C3)· 棋盘状态与数字(A2——恒真透传)· AP 账本(A3——grant_ap 为接口漂移预授权)· 变异定义(A4——counter_item_ids 为 A4 字段、A5 消费回填)· 结算段序(B1——使用编排调用权归 B1)· 呈现(D1)· 教学文案(D5) | -| 上游输入 | A2 只读面(板面/已开状态——目标校验与数字数据源)· B4 Ready 映射身份(预读数据源——既有查询面零新增)· A3 相位与 AP 账本 · D2 AuxItemTable · VariationTable.counter_item_ids(A4 框架) | -| 下游输出 | 叠加层只读投影(D1 呈现数据源)· 使用意图编排契约(B1 义务清单)· counter_item_ids 首引兑现(A4 悬空校验激活)· 创意风险 #1 的道具侧兑现(plan 维度预读)· B4 OQ2 的 A5 侧裁决 | -| 硬约束 | 零随机(零 RNG 流消费)· 零特判延伸(A2 代码零 A5 分支——叠加层为派生信息层、零回写 A2/B4 状态)· 真视窄域护栏(雷位真视 ≤3×3、全图级仅限显影/预读类)· 无效/零信息目标不可用不消耗(可用性门:板级图标灰、点击级拒绝)· 库存关卡域 · Used 不可逆 | - -A5 是挖掘期的信息与行动力市场:道具从 B4 奖励池获取(安全格奖励的一部分),在挖掘阶段由玩家主动消耗——雾区数字显影恢复推理原料、巢位真视与奖励预读把未知变成规划素材、AP 增量扩大当轮行动预算。效果即时可见(叠加层直接改变棋盘呈现),不进结算明细。 - -没有 A5,三样东西缺席:A4 承诺的"买情报"出口(雾区应对只剩停手/弃图两轴)、创意风险 #1 的最后一块结构(未开格奖励身份的道具侧预读)、P1 支柱"纯猜局面用道具缓解"的兑现通道。A5 同时是 B4 OQ2(未开格身份呈现深度)与 A4 OQ2(探测显影时效与定价)的收口 owner。 - -## 体验锚点 - -| 支柱 | 关键词 | 机制承诺 | -|---|---|---| -| P1 我算对了 | "推不出的地方,我能买回线索" | 显影恢复雾格数字 = 推理原料回归(数字恒真透传,非新信息源);真视窄域护栏(≤3×3)把"代答"锁在救急档——恢复推理可全图、替代推理必窄域;道具零随机、不引入新赌点 | -| P2 扫雷的因战斗的果 | "这瓶显影尘是我上一轮捡到的" | 获取 = B4 奖励池 aux 行(来源 {cell, round} 逐件归因);使用 = 挖掘期自主时点、效果即时可见;经由真视插旗兑付的 weaken 走既有 flag_hit 结算行——归因链不断 | -| P3 风险收益同源(信息切面) | "买情报的代价是放弃一件战利品" | aux 行挤占战斗奖励池权重(渗透率 ≈17%,F1);叠加层随图消亡——弃图刷新时已花显影沉没(A3 旧板旗随旧板消亡同款先例);真视≠自动兑付(插旗仍花 1 AP) | -| P4 地牢探险氛围 | "地牢里前人留下的工具" | 主题命名(显影尘/探巢摆钟/地穴全图卷);icon 键入 art-bible §4.6 扩容(数据键 = item_id,形状+色相双通道);程序化占位先行(D1 既有裁决) | - -| 反向护栏 | 处置 | -|---|---| -| 全图级真视常态化 = P1 塌方(扫雷退化为路径优化) | 真视窄域承重护栏入 Core Rule 3——board_wide 目标域仅对 fog_reveal/reward_preview 开放(恢复推理原料类);mine_reveal 上限 area_3x3,schema 校验强制 | -| 道具使用变成"烧包"挫败源(无效目标白耗) | 可用性门(Core Rule 8):板级零信息 → 图标灰、入口禁用(B4 usable_now 先例);点击级零信息/越板 → 拒绝零消耗——与 B4 E10 照常消耗拍板区分:挖掘期非结算管线、守卫在 A5 本地可判、无反抖动压力 | -| 道具依赖症(每轮必用、扫雷决策外包给道具) | 预警①道具依赖度(playtest 预注册);真视/显影为消耗品 + 渗透率有界(F1),供给面天然限流 | - -- 参考感受:杀戮尖塔的消耗品(留着的牌永远是一份规划素材)+ Into the Breach 的信息工具(买的是确定性而非输出);反向对照 = 无目标校验的"点了就没了"(烧包挫败)与全图透视挂件(推理玩法自废)。 - -## 全局流程 - -### 获取与使用主流程 - -``` -获取(install 期身份预分配——B4 域) - B4 roll_board → 格奖励身份含 aux 行(category=aux_item 激活后) - ▼ -挖掘期开出资格格 → 结算授予段 B1 grant(cell) - │ 返回 category=aux_item → B1 路由 A5.add_item(不入 B4 库存——两库存正交) - ▼ -A5 关卡域库存(跨轮/跨图/跨战斗延续;D1 常读条) - ▼ -使用(挖掘阶段·Active 相位,D1 使用意图 → 组合根 → B1 编排——唯一调用权) - │ ① 相位 gate(非 Active → 拒绝) - │ ② A5.validate_use(handle, target) —— 目标校验读 A2 只读面 - │ 失败 ⇒ 全链拒绝、零消耗(无效/零信息目标反馈 D1) - │ ③ 逐 kind 效果应用(顺序钉死:空间 kind 先、ap_grant 后): - │ 空间 kind → A5.apply_overlay(板级叠加层写入) - │ ap_grant → A3.grant_ap(当轮 remaining_ap += magnitude) - │ ④ A5.consume(handle) —— Used 不可逆、回执 = 快照投影 + 来源 - ▼ -D1 命令式回执(重查 query_inventory / query_overlays 刷新呈现) - ▼ -消亡:board retire(cleared 换图 / RAP 刷新 / 战斗结束) - → B1 编排 A5.retire_overlays(叠加层随图消亡——与 B4 retire_mapping 同点) - 关卡结束 → B1 编排 A5.clear_inventory(与 B4 clear_inventory 同点 + 清空反馈计数) -``` - -| 出口 | 触发 | 动作序列 | 约束 | -|---|---|---|---| -| 正常使用 | Active 相位 + 有效目标 | validate → apply_overlay / grant_ap → consume → 回执 | 序即原子(apply/grant 无失败域 → consume 恒达) | -| 目标拒绝 | validate_use 失败(无雾可显/坐标越板/预读窗口零未开资格格等) | 全链拒绝 | 零消耗、库存不变、D1 反馈可辨 | -| 相位拒绝 | 非 Active(Waiting/结算中) | 相位 gate 拒绝 | 零消耗;与 B4 道具窗口两输入面互不竞争 | -| 随图消亡 | cleared 换图 / RAP 弃图刷新 / 战斗结束 | retire_overlays | 已花道具不返还(信息投资沉没——设计意图) | -| 关卡清空 | 关卡结束(victory/defeat 皆然) | clear_inventory | 恰一次幂等;清空前快照计数供反馈行 | - -## 核心规则 - -> 每条规则两段:**人话**(作用于哪个系统、什么情况下、谁触发、触发后发生什么;效果与情况用枚举表)→ **举证**(计算方法/公式;纯流程规则明写"无计算")。 - -#### 规则 1:每件道具标清它帮的是什么忙 -**人话**:道具定义表里的每一件道具,必须标出它属于哪类帮助——情报、雷险、行动、规划、反制,至少标一类。这是内容规划的自查清单:保证五种帮助每种至少有一件道具,玩家不管遇到什么困境都有得买。游戏运行时完全不读这个标签。 -**举证**:无计算。覆盖检查就是数表——五类各至少一行,游戏加载数据后自动检查(对应验收 AC-12)。 - -#### 规则 2:使用道具时会发生什么 -**人话**:玩家在挖掘阶段选中一件道具使用。道具做四件事之一,稀有道具同时做两件: - -| 效果 | 玩家看到什么 | 持续多久 | -|---|---|---| -| 显影 | 雾格里的数字现形 | 到这张图被换掉为止 | -| 真视 | 圈定范围里雷的位置现形 | 到这张图被换掉为止 | -| 预读 | 没挖开的格子预告里面的奖励 | 到这张图被换掉为止 | -| 加行动力 | 当轮行动点变多 | 只对当前这一轮 | - -**举证**:加行动力的计算:行动点 = 行动点 + 道具表里的数值(工兵令 +2、爆破包 +4)。其余三种效果没有计算——只是把格子记进"要额外显示"的名单;数字永远读棋盘真值,奖励身份永远读奖励表。 - -#### 规则 3:直接看雷的效果,一次最多 3×3 -**人话**:凡是"告诉你雷在哪"的效果,一次最多照亮 3×3 格,任何道具都不能全图看雷;看数字(显影)和看奖励(预读)允许全图。道理:扫雷的乐趣是自己推出雷在哪,花钱全图看雷等于把游戏换成走格子——所以"代替推理"的效果必须小而贵,"恢复推理原料"的效果可以大。 - -| 效果 | 允许的范围 | -|---|---| -| 显影(看数字) | 一个雾区,或全图 | -| 预读(看奖励) | 3×3,或全图 | -| 真视(看雷) | 只许 3×3,全图禁止 | - -**举证**:无计算。限制写进数据校验——表里任何看雷道具的范围字段超过 3×3,游戏加载数据时直接报错拒绝。 - -#### 规则 4:捡到的辅助道具进"关卡背包",不进战斗背包 -**人话**:玩家挖到带道具的格子时,战斗结算系统(B1)把道具放进辅助道具的关卡背包。它和战斗道具背包(B4 管)是两个独立的包,互不混装,但寿命一样——都活到关卡结束。 -**举证**:无计算。 - -#### 规则 5:背包里的道具,关卡结束才清空 -**人话**:背包里的辅助道具跨轮次、跨地图、跨战斗都在,直到整个关卡打完(无论输赢)由 B1 一次性清空。每件都记录从哪个格子的哪一轮捡到,结算能归因来源。用一件少一件、不能反悔;背包不设上限,稀缺靠掉落权重控制。 -**举证**:掉落概率的计算见「数值结论与推导·渗透供给」——期望每张图约 1.7 件辅助道具,稀有件约每 6 张图 1 件。 - -#### 规则 6:只能在挖掘阶段使用 -**人话**:玩家只能在挖掘阶段(轮次进行中)使用辅助道具,任意时点可以,用一件消耗一件。结算阶段用不了——那个窗口属于战斗道具。两个"用道具"的入口在时间上错开,不会冲突。 -**举证**:无计算。 - -#### 规则 7:使用后按固定四步执行 -**人话**:玩家发起使用后,B1 按固定顺序执行四步。顺序本身就是安全保障:所有会失败的情况都在第二步被拦下,后两步在合法输入下不会失败,所以"产生效果"和"消耗道具"永远成对发生。带两个效果的稀有道具,施加顺序也钉死:先空间效果(显影/真视/预读)、后加行动力——定义表里效果的书写顺序不承载运行时语义。 - -| 步骤 | 做什么 | 这一步会失败吗 | -|---|---|---| -| ① 阶段检查 | 现在是挖掘阶段吗 | 会——不在挖掘期:拒绝,不扣道具 | -| ② 目标校验 | 目标格合法吗(有东西可看、坐标在板内、道具没用过) | 会——不合法:拒绝,不扣道具 | -| ③ 产生效果 | 把格子写进显示名单,或加行动力 | 不会(会失败的都在前两步拦完了) | -| ④ 消耗 | 道具标记为已用 | 不会 | - -**举证**:无计算(纯流程规则)。 - -#### 规则 8:点错了不扣道具,没东西可看时用不了 -**人话**:目标不合法时(比如这张图没有雾,却用显影尘;或对已经全开过的区域用探宝罗盘),道具不会白白消耗。分两级:整张图都没东西可看时(板级零信息),背包里这件道具直接置灰、根本选不了;单个点击位置上没东西可看时(点击级零信息,比如 3×3 窗口里全是已开格),那一次点击被拒绝、给可辨认的提示。两种情况道具都留在背包。这和战斗道具"照常消耗"是故意的不同:挖掘期玩家可能手滑点错,不该为此受罚。 -**举证**:无计算。逐条判定规则见下方「使用目标校验谓词」表。 - -#### 规则 9:使用道具不花行动点 -**人话**:用道具不扣 AP。成本已经付过了——捡到它,那个格子就没出战斗奖励。挖格、插旗的价格不受任何影响。 -**举证**:无计算。 - -#### 规则 10:辅助系统自己不主动做任何事 -**人话**:A5 不监听事件、不画界面、不用随机数、不改任何其他系统的数据。它的全部信息来自三个已经存在的事实来源:棋盘数字真值、奖励身份、行动点账本。其他系统的代码里不会有任何一行"为了 A5"而写的判断。 -**举证**:无计算。这一条有机器验收:A5 的代码文件里搜不到随机调用、界面基类和任何其他系统的写入接口。 - -### 效果明细(规则 2 的实现参照——字段名与数据源) - -| kind | 效果 | 目标域支持 | 时效 | 零信息判据(不可用条件) | 呈现数据源 | -|---|---|---|---|---|---| -| fog_reveal | 未开雾格数字显影(恢复推理原料——A4 EC6 语义定稿) | fog_region / board_wide | 本图持续(叠加层) | 全板无未开雾格(板级 → 图标灰) | A2 板面恒真数字 + digit_reveal 格集 | -| mine_reveal | 雷格真视(惩罚格现形——真视≠自动兑付,插旗仍花 1 AP) | area_3x3(护栏上限) | 本图持续 | 恒有信息(零雷 = "这 9 格没雷"——恒可用) | mine_reveal 格集(标记呈现,art-bible 键契约) | -| reward_preview | 未开资格格奖励身份预读(寻路素材——创意风险 #1 兑现) | area_3x3 / board_wide | 本图持续 | board_wide:全板无未开资格格(板级 → 灰);area_3x3:窗口内零未开资格格(点击级 → 拒绝) | B1 query_reward_identity 既有读面 + reward_preview 格集 | -| ap_grant | 当轮 AP 增量(remaining_ap += magnitude;溢出停手转存 RAP 走 A3 既有规则零特判) | none(非空间) | 当轮一次性 | 恒可用 | A3 AP 读数(既有命令式刷新面) | - -### 使用编排分支(规则 7 的实现参照) - -| 分支 | 条件 | 动作 | 拒绝语义 | -|---|---|---|---| -| validate 失败 | 无效目标/Used 句柄/Cleared 库存 | 全链终止 | 零消耗 + 诊断(D1 反馈可辨) | -| 空间 kind | resolved_target 域内 | apply_overlay 逐 kind 写入 | 域内输入恒受理(validate 前置保证) | -| ap_grant | magnitude ∈ [1,999] | A3.grant_ap(magnitude) → remaining_ap 增 | 域内恒受理(AP 无上限域——A3 漂移条款) | -| consume | validate 已过 | Used 标记 + 回执 | Used 不可逆(重复 → false + 诊断) | - -### 使用目标校验谓词(规则 8 的实现参照) - -| 谓词 | 条件 | 裁定 | -|---|---|---| -| 中心格越板 | area_3x3 目标中心格 ∉ 板 | 拒绝、零消耗 + 诊断 | -| 边缘窗口 | area_3x3 中心格贴边/角(窗口探出板外) | 照常受理——resolved_target = 窗口 ∩ 板内格(角 4 格 / 边 6 格);真视窄域护栏不破(≤3×3 只缩不扩) | -| 板级零信息——显影类 | 全板无未开雾格(含无雾板降级产物) | 不可用:库存投影 usable=false、D1 图标灰、使用入口禁用;强行调用 validate_use → false + 诊断零消耗(EC2 同判据) | -| 板级零信息——预读类 | 全板无未开资格格(board_wide) | 同上 | -| 点击级零信息——预读类 | 所选窗口 ∩ 板内格中零未开资格格(area_3x3) | 该次拒绝、零消耗、D1 反馈可辨(拾取预览高亮将受影响格,辅助避空) | -| 真视恒可用 | 零雷窗口 = "这 9 格没雷"(信息非空) | 无零信息拒绝——仅中心格越板拒绝 | -| 组合行可用性 | 各 kind 判据取 OR(任一 kind 有信息即可用) | 爆破包因 ap_grant 恒可用;全图卷 = 有未开雾格 ∨ 有未开资格格 | - -- 可用性预判数据源 = A2 只读面(板面/已开状态/雾区身份 + reward_eligible 资格标记——读接口白名单同批扩列,缺口预检 1);A5 零事件订阅 → 板级判据随挖掘进展变化,usable 按 query 时点现算(派生信息层零缓存义务)。 - -## 枚举 - -### dimension_tags(五值封闭枚举) - -| 值 | 语义 | MVP 覆盖行 | -|---|---|---| -| info | 情报维度——推理原料的恢复(雾格数字) | probe_dust / catacomb_scroll | -| risk | 雷险维度——惩罚格真视(直接雷位信息) | nest_pendulum / blast_kit | -| action | 行动维度——当轮 AP 增量 | sapper_order / blast_kit | -| plan | 规划维度——奖励身份预读(寻路素材) | loot_compass / catacomb_scroll | -| counter | 变异对抗维度——counter_item_ids 消费(A4 框架) | probe_dust(fog 行回填) | - -### AuxItemTable schema(D2 新表,A5 回填 owner;定义表非进度成长表——Rule 4 豁免,键 = item_id) - -| 字段 | 类型/域 | 默认 | knob | 说明 | -|---|---|---|---|---| -| item_id | String(主键唯一) | — | ✗ | 道具标识;B4 RewardTable.effect_id(aux 行)与 VariationTable.counter_item_ids 的引用键 | -| display_name | String 非空 | — | ✗ | 玩家可读名(D1 呈现数据源;本地化归 D6——B2/B3/B4 同库惯例) | -| dimension_tags | StringList ⊆ 五值枚举 非空 | — | ✗ | 维度覆盖断言载体(F2);组合维度 = 稀有多维行的声明面 | -| effect_kinds | StringList ⊆ 四值枚举 非空、无重复 | — | ✗ | 效果组合(MVP ≤2——多维度结合的 schema 承载) | -| target | enum {none, fog_region, area_3x3, board_wide} | — | ✗ | 目标形态;校验 = target ∈ 各空间 kind 支持域交集(全非空间 ⇒ 恒 none);area_3x3 运行时解析 = 窗口 ∩ 板内格(边缘裁剪——加载校验域仍为整窗) | -| magnitude | int [0,999] | — | ✓ | 仅 ap_grant 行消费(= AP 点数,加载校验 ≥1——B4 item 行先例);空间行不消费非校验项 | -| use_phase | enum {active_dig} | active_dig | ✗ | 使用时机(MVP 单值;扩枚举走本 GDD 修订——B4 use_timing 扩值同批对齐) | - -### MVP 内容行集(六行——目标值,回填生效以 B4 修订批为前提;值 provisional 归 C3) - -| item_id | display_name | dimension_tags | effect_kinds | target | magnitude | RewardTable 权重/tier | -|---|---|---|---|---|---|---| -| probe_dust | 显影尘 | [info, counter] | [fog_reveal] | fog_region | — | w5 / t2 | -| sapper_order | 工兵令 | [action] | [ap_grant] | none | 2 | w5 / t2 | -| loot_compass | 探宝罗盘 | [plan] | [reward_preview] | area_3x3 | — | w4 / t2 | -| nest_pendulum | 探巢摆钟 | [risk] | [mine_reveal] | area_3x3 | — | w4 / t2 | -| catacomb_scroll | 地穴全图卷 | [info, plan] | [fog_reveal, reward_preview] | board_wide | — | w1 / t3 | -| blast_kit | 爆破工兵包 | [action, risk] | [ap_grant, mine_reveal] | area_3x3 | 4 | w1 / t3 | - -- 常规四行 = 单维中数值(tier 2 与现行池主力同档);稀有两行 = 双维组合 + 高数值(tier 3 超现行池最高档、magnitude 4 = 半轮预算)——稀有道具设计指令的直接兑现。 -- 维度覆盖:五维度各 ≥1 行(counter 由 probe_dust 承载并回填 VariationTable.fog.counter_item_ids——义务 A4×①)。 -- 全图卷组合校验:fog_reveal ∩ reward_preview 支持域交集 = {board_wide} ✓;爆破包空间 kind 仅 mine_reveal → target=area_3x3 ✓。 -- 六行均 pool_tag=safe_cell(aux 行为格奖励;tier 2/3 ≥ T_fog_min=2 → 雾池档位过滤自然兼容;clear_default 池不入 aux 行)。 - -### schema 校验类别(诊断封闭枚举) - -| 类别 | 级别 | 触发条件 | 语义 | -|---|---|---|---| -| 重复键 | 致命 | item_id 重复 | D2 Rule 6 既有类别 | -| 维度域外 | 致命 | dimension_tags 空 / 含枚举外值 | F2 覆盖断言的前提 | -| 效果域外 | 致命 | effect_kinds 空 / 含枚举外值 / 含重复 | Core Rule 2 | -| 目标交集违例 | 致命 | target ∉ 各空间 kind 支持域交集(全非空间行 target ≠ none 同类) | Core Rule 3 真视窄域护栏的强制面 | -| magnitude 域外 | 致命 | magnitude ∉ [0,999];ap_grant 行 < 1 | B4 item 行 power ≥ 1 先例 | -| use_phase 域外 | 致命 | use_phase ∉ {active_dig} | Core Rule 6 | -| counter 悬空 | 致命 | VariationTable.counter_item_ids 含 AuxItemTable 无此行 id | A4 悬空引用校验激活(义务 A4×②——A5-1 兑现) | -| aux 引用悬空 | 致命 | RewardTable aux 行 effect_id 在 AuxItemTable 无此行 | B4 悬空校验双表扩展(义务 B4×②) | - -## 数值结论与推导 - -> 口径总纲:A5 零平衡公式——池权重/tier/magnitude 全部 provisional 归 C3;本节三条 = 供给渗透(F1)、覆盖断言谓词(F2)、信息价值方向预检(F3,方向性非定量)。 - -### F1 aux 渗透供给(aux_supply_rate) - -**结论**:默认根下 aux 道具期望 ≈1.7 件/板(|资格格|=10 口径)、稀有件 ≈0.17 件/板——渗透率有界是 P1 护栏的供给面(道具不主导挖掘决策)。 - -#### 推导 - -``` -E[N_aux/板] = |U| × (Σw_aux / W_total) -E[N_rare/板] = |U| × (w_scroll + w_blast) / W_total -默认根:Σw_aux = 5+5+4+4+1+1 = 20;W_total = 100(B4 原池)+ 20 = 120 -|U| = 10(B4 direction_precheck 保守板口径) -``` - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 资格格数 | \|U\| | int | 板级 | install 期资格格集基数(B4 义务⑥供清单;分布缺口待 A1 actuals——B4 预检 11 同款) | -| aux 行权重和 | Σw_aux | int | — | 六行 w 之和(provisional 归 C3) | -| 池总权 | W_total | int | — | safe_cell 池全部活行权重和(aux 行入池后重算——B4 F1 联动重算义务) | - -| 情形 | 读数 | 验算 | -|---|---|---| -| 默认根 | E[N_aux] ≈ 10 × 20/120 ≈ 1.7 件/板 | 渗透率 ≈16.7%(战斗类 83.3%) | -| 稀有件 | E[N_rare] ≈ 10 × 2/120 ≈ 0.17 件/板 | ≈每 6 板一件稀有——"稀有"定位可感 | -| 输入缺口 | \|U\| 分布待 A1 actuals p10/p50 | 落地后重跑(B4 预检 11 同批) | - -### F2 维度覆盖谓词(dimension_coverage) - -**结论**:coverage(d) :⇔ ∃活行 aux(d ∈ dimension_tags ∧ RewardTable 行 weight>0)——五维度 coverage 恒真为加载后内容审计断言(AC-12);维度是内容标尺非运行时逻辑(代码零维度分支)。 - -#### 推导 - -``` -coverage(d) :⇔ ∃r ∈ AuxItemTable : d ∈ r.dimension_tags ∧ reward_row(r.item_id).weight > 0 -断言 ∀d ∈ {info, risk, action, plan, counter} : coverage(d) -``` - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 维度 | d | enum | 五值 | dimension_tags 值域 | -| 活行 | r | 表行 | — | AuxItemTable 行 ∧ 对应 RewardTable 行 weight>0 | - -| 情形 | 谓词判定 | 验算 | -|---|---|---| -| 默认根 | 五维度全真 | 见 MVP 行集维度覆盖行 | -| 某维度零活行 | 断言失败 | 内容收窄信号(AC-12 拦截——"每维度都有对应道具"的机器可查形态) | - -### F3 信息价值方向预检(info_value_direction——方向性非定量) - -**结论**:显影的价值 = 残余盲猜端收缩——可推理格增加 → 玩家盲赌次数(暴露)下降 → 期望踩雷下降(P1 正向)。注意方向:引用式 P(雷) = |M| ÷ (|M| + (1−ι)×|S|) 对 ι **递增**——显影挖走残余池中的安全格后池内雷浓度升高,单次盲赌命中率上行;收益在"少赌",不在"单赌更安全"。真视把 k 格从决策域移除(必避/必旗候选)。两者均为正向信息增量、定量当量换算归 B1 条款①对照表扩列(义务 B1×④注记,MVP 不入对照表)。 - -#### 推导 - -``` -显影:fog_reveal k 格 → 板级 ι(免赌开据占比)上移 - → 残余盲猜安全格 n_s = (1−ι)×|S| 收缩 → 盲赌次数下降 → 期望踩雷 ↓ - 单次盲赌条件概率 P(雷) = |M| ÷ (|M| + n_s) 随 n_s 收缩而上行 - (池内雷浓度升高——安全格被挖走;与 B1 F4 同式, - B1 F4 另设 n_s < 1 适用域守卫 → 残余集空时主式不评估、信息端平凡腿接管) -真视:mine_reveal k 格 → 该 k 格移出"盲挖候选域" - 期望收益 = P(雷|盲) × (伏击暴露期望 − 标中 weaken 收益期望) 的差值锁定 - 精确当量归 B1 对照表(MVP 不闭合——间接效应如实登记) -``` - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 可推理率 | ι | float | [0,1] | A1 板级实际值(actuals p10 为对账口径——registry 既有) | -| 雷数/安全格数 | \|M\|/\|S\| | int | 板级 | A2 板面事实 | -| 真视格数 | k | int | ≤9 | area_3x3 护栏上界 | -| 残余盲猜安全格 | n_s | float | [0, \|S\|] | (1−ι)×\|S\|——B1 F4 同名变量(n_s < 1 适用域守卫同款) | - -| 情形 | 方向 | 说明 | -|---|---|---| -| 显影尘(一雾区) | n_s ↓ / 盲赌暴露 ↓ | 恢复推理原料——P1 正向;单赌 P(雷) 上行属正常(池雷浓度升高) | -| 全图卷(全雾显影) | n_s ↓↓ | 全图数字可读——推理面最大化而非代答(雾区无雷知识叠加) | -| 探巢摆钟(3×3 真视) | 决策域 −k 格 | 替代推理窄域化——稀有供给(F1)限流 | - -## 状态 - -| 容器/条目 | 状态 | 进入 | 出口 | -|---|---|---|---| -| 库存条目 | InStock → Used → Cleared | add_item 授予 → InStock;consume → Used(不可逆) | 关卡结束 → Cleared(clear_inventory;跨战斗/跨图延续同 B4 库存) | -| 板级叠加层 | Empty → Active → Retired | 首次 apply_overlay → Active(三集条目累积) | retire_overlays → Retired(cleared 换图/RAP 刷新/战斗结束——随图消亡,不跨图) | - -不变式:Used 不可逆;库存条目仅存关卡域;叠加层随图消亡且零回写 A2/B4 状态(派生信息层);A5 全 API 零随机。 - -## 边界情况 - -| 条件 | 行为 | 依据 | -|---|---|---| -| EC1 无效目标(fog_region target 时板内无未开雾区;area target 中心格越板;area 预读窗口内零未开资格格) | validate_use → false + 诊断,全链拒绝——零消耗、库存不变;板级判据另经库存投影 usable=false 前置呈现(图标灰) | Core Rule 8 · 谓词表 | -| EC2 无雾板(L1 或降级产物)上用显影尘/全图卷 | 同 EC1 拒绝不消耗——道具留存关卡域库存,后续雾板可用(雾 unlock_level=2 的跨关持有合法) | Core Rule 8 / A4 F1 | -| EC3 显影/真视后 RAP 弃图刷新 | 叠加层随旧板消亡(retire_overlays)、已花道具不返还——信息投资沉没(A3 旧板旗随旧板消亡同款先例);玩家侧含义 = 别在待弃板上花情报 | 状态表 / A3 rap_rules | -| EC4 显影格被开出 | 叠加层条目留存无害——已开格数字恒显示(A2 恒真),呈现自然合并、A5 零清理维护(零事件订阅的结构福利) | Core Rule 10 | -| EC5 真视雷格被踩(挖开) | 事实照旧——真视 = 信息非保护,雷→伏击照常;玩家侧价值 = 预先规避或插旗兑付 weaken | Core Rule 2(mine_reveal 语义) | -| EC6 真视格插旗 | 正常 1 AP 插旗、轮末判定标中——weaken 走既有 flag_hit 路径(P2 归因链完整) | A3 flag_rules | -| EC7 预读格的映射 Retired(换图/战斗结束) | 叠加层同批消亡(retire_overlays 与 B4 retire_mapping 同点编排)——预读徽章不会指向已消亡映射 | 状态表 / B4 E6 | -| EC8 Waiting 相位(结算中)使用意图 | 相位 gate 拒绝零消耗——A5 仅 Active;与 B4 结算窗口使用两输入面互不竞争 | Core Rule 6 | -| EC9 clear_inventory 后 use/validate | false + 诊断(Cleared 逻辑失效态——B4 E7 同款幂等守卫) | 状态表 | -| EC10 同一件道具重复选中 | validate_use 对 Used 句柄 → false + 诊断(Used 不可逆——B4 E9 同款) | 状态表 | -| EC11 组合行(爆破包/全图卷)部分效果失败 | 结构上不可达——validate 前置拦下全部可失败输入,apply_overlay/grant_ap 域内无失败路径;规范序(Core Rule 7)即原子性证明 | Core Rule 7 | -| EC12 ap_grant 后停手 | 溢出 AP 按停手路径 1:1 转存 RAP(A3 既有规则零特判——道具增量与基础 AP 同待遇);cleared 轮剩余 AP 不折算同款(A3 既有清图规则零特判) | A3 rap_rules | -| EC13 VariationTable.counter_item_ids 悬空引用 | D2 加载期致命(校验随 AuxItemTable 建表激活——A5-1 兑现;条件性夹具 a5_dangling_counter) | 枚举·校验类别表 | -| EC14 RewardTable aux 行 effect_id 悬空 | D2 加载期致命(dangling_aux_item 新类别——B4 悬空校验双表扩展) | 枚举·校验类别表 | -| EC15 战斗中热重载 AuxItemTable/RewardTable | D2 既有门(战斗中 reload 拒绝);库存实例持行值快照(B4 E14 同款);叠加层为运行时态不涉表重载 | D2 / B4 E14 | -| EC16 aux 行在无雾板被 roll 中 | 正常入库——获取与可用性解耦(池不按雾有无分列,雾档过滤仅作用于雾格身份——B4 F2 域);EC2 承载使用侧 | B4 F2 / EC2 | -| EC17 area_3x3 中心格贴边/角(窗口探出板外) | 照常受理——resolved_target = 窗口 ∩ 板内格(角 4 格 / 边 6 格),道具照常消耗;真视窄域护栏不破(只缩不扩) | Core Rule 8 · 谓词表 | -| EC18 零信息可用性门(板级判据随挖掘进展翻转) | 板级判据(无未开雾格 / 无未开资格格)→ 库存投影 usable=false、D1 图标灰、使用入口禁用;点击级判据(area 预读窗口空)→ 拒绝零消耗;组合行判据取 OR——爆破包 ap_grant 恒可用、全图卷 = 有雾格 ∨ 有资格格;A5 零事件订阅,usable 按 query 时点现算 | Core Rule 8 · 谓词表 | - -## 依赖 - -**上游**: - -| 系统 | 性质 | 接口要点 | -|---|---|---| -| D2 | hard | AuxItemTable 新表 schema 承载与 ConfigDB 读取(本 GDD 回填 owner——走 D2 接口漂移规则回写 D2 表清单);校验类别族见枚举节 | -| A2 | hard | 只读面消费(板面/已开状态/雾区身份——目标校验与显影数据源);A2 侧零改动零义务(零特判延伸——A2 代码零 A5 分支) | -| B4 | hard(修订批) | aux_item category 激活(预留枚举兑现)+ effect_id 双表校验 + use_timing 扩值 + 默认根六行 + 池总权重算——义务清单 B4×①…⑤ 缺项即 blocking | -| A3 | soft(接口漂移预授权) | grant_ap(n) 新入口(第 9 API):Active 相位受理、remaining_ap += n(无上限域)、其他相位拒绝、零随机——A3 GDD 修订批登记(义务 A3×①) | -| A4 | 内容契约 | counter_item_ids 消费与回填(fog 行 = [probe_dust]);未来变异建行时各配 ≥1 反制道具(框架级"每变异 ≥1 反制");A4 OQ2 由本 GDD 收口(时效 = 本图持续、定价 = 池权重) | -| B1 | hard(编排) | use_aux 编排 + 生命周期编排 + 授予路由——义务清单 B1×①②③ 缺项即 blocking(B4 义务清单先例:B1 是全部战斗域状态变更的唯一编排方) | - -**下游**: - -| 依赖方 | 性质 | 接口 | -|---|---|---| -| D1 | soft | 呈现义务 4 项(缺项即 blocking,见义务清单)——aux 库存条/使用交互/叠加层三集呈现/清空反馈;叠加层数据源 = query_overlays 只读投影 | -| D5 | soft | 教学候选:"买情报"闭环(捡到道具→需要时用→情报换安全)+ 真视≠保护的措辞口径 | -| art-bible | soft | §4.6 图标键扩容:item_id 六键 + 叠加层标记三族(显影/真视/预读徽章——预读徽章与 B4 已开格徽章同族) | -| B5/D4 | soft | 道具使用反馈(后置里程碑);D4 音频挂点(Alpha——使用音/无效反馈音) | -| registry | 确认 | a5_aux_items 条目登记(本 GDD 定稿回填)+ variation_table.mvp_content counter_item_ids 注记更新 | - -### 跨 GDD 义务清单(对侧 GDD 修订批逐项核对落位,缺项即 blocking——B4 对 B1/D1 登记先例) - -> 义务编号以本 GDD 为源;跨 GDD 台账登记时采用「A5→对侧×①」前缀形式(B4→B1×①…⑥、B1 义务账本 B4×①…⑥ 为既有同形编号——前缀防混淆)。 - -| 编号 | 内容 | 对侧 | 状态 | -|---|---|---|---| -| B1×① | use_aux 编排入口(唯一调用权):Active 相位 gate(A3 phase getter)→ 规范序 validate→逐 kind 应用→consume;拒绝路径零消耗反馈 | B1 修订批 | 已登记 | -| B1×② | 生命周期编排:board retire(cleared 换图/RAP 刷新/战斗结束)→ A5.retire_overlays 与 B4 retire_mapping 同点;关卡末 → A5.clear_inventory 与 B4 clear_inventory 同点 + 清空反馈计数 | B1 修订批 | 已登记 | -| B1×③ | 授予路由:grant 返回 category=aux_item → A5.add_item(与 B4 stock 分流对偶——每格受理恰一次承接延伸) | B1 修订批 | 已登记 | -| B1×④ | 注记级:aux 信息价值不入条款①对照表(间接效应)——对照表扩列义务登记调参期(F3) | B1 修订批 | 已登记(注记) | -| B4×① | category 枚举扩值 aux_item(五值→六值——Rule 1 修订);交付轴归类 = A5 可选类(不入 B4 库存、经 B1 路由) | B4 修订批 | 已登记 | -| B4×② | effect_id 消费扩展:aux_item 行必填(AuxItemTable 精确引用)+ 悬空校验双表 + 条件性夹具 dangling_aux_item | B4 修订批 | 已登记 | -| B4×③ | use_timing 枚举扩值 {pre_settlement, during_dig}——aux 行 = during_dig(game-concept"使用时机"字段语义延伸) | B4 修订批 | 已登记 | -| B4×④ | 默认根行集 +6 aux 行(本 GDD MVP 行集表值回填;F1 池总权重算 + direction_precheck 联动重算;并按 B4 缺口预检 6 流程重制登记常数与受影响 AC——σ 黄金轨迹 Ψ/Φ、AC-18 category 值域内容断言等随批重推导,防静默假失败) | B4 修订批 | 已登记 | -| B4×⑤ | OQ2 收口注记:未开格身份呈现深度 = 道具驱动预读(A5 plan 维度)——未预读格仍不呈现、自动寻路不做(A5 侧裁决,D1 共担呈现) | B4 OQ2 | 已登记 | -| A3×① | grant_ap 接口漂移(第 9 API):`grant_ap(n) -> bool`——Active 相位受理、remaining_ap += n、无上限域、其他相位拒绝;8 API→9 API 封闭枚举扩容 | A3 修订批 | 已登记 | -| A4×① | VariationTable.fog.counter_item_ids = [probe_dust] 回填(D2 表值 + registry mvp_content 同批——A4 GDD 正文不改,A4 EC6/OQ2 收口) | D2/A4 修订批 | 已登记 | -| A4×② | counter_item_ids 悬空引用校验激活 + 条件性夹具 a5_dangling_counter(A4 测试口径"首个道具 id 回填时补校验"条款兑现——A5-1 义务闭环) | D2/A4 修订批 | 已登记 | -| A4×③ | 框架内容契约:未来变异建行时 counter_item_ids 各配 ≥1 反制道具("每变异 ≥1 反制"——岩浆/冰冻行随垂直切片批) | A4 后续批 | 已登记 | -| D1×① | aux 库存常读条(挖掘期规划面——与 B4 库存条并置或分区呈现归 D1 裁决;枚举序 = add_item 受理序) | D1 修订批 | 已登记 | -| D1×② | 使用交互:选中道具 + 目标拾取(雾格/中心格)或无目标确认;可用性门呈现(板级零信息 → 图标灰、入口禁用——usable 投影数据源,B4 usable_now 先例)+ 拾取预览(area_3x3 悬停高亮将受影响格);无效/零信息目标可辨反馈(零消耗语境);相位 gate 呈现 | D1 修订批 | 已登记 | -| D1×③ | 叠加层三集呈现:显影格数字(数据源 = A2 板面 + digit_reveal 集)/ 真视标记(形状+色相双通道)/ 预读徽章(数据源 = B1 query_reward_identity 既有读面——与已开格徽章同族) | D1 修订批 | 已登记 | -| D1×④ | 关卡末清空反馈:"剩余辅助道具 ×N 随关卡结束清空"(B4 义务⑤同款先例) | D1 修订批 | 已登记 | -| D2×① | AuxItemTable 新表登记(表清单 + schema 校验族——D2 GDD 接口漂移修订批) | D2 修订批 | 已登记 | -| D2×② | VariationTable/RewardTable 表值回填(counter_item_ids / 六行 aux)+ 两处悬空校验激活 | D2 修订批 | 已登记 | -| D5×① | 教学候选登记:"买情报"闭环 + 真视≠保护口径(非 blocking——D5 里程碑 Alpha) | D5 | 已登记(候选) | -| art-bible×① | §4.6 图标键扩容:item_id 六键 + 叠加层标记三族(键冻结流程同既有——终稿美术归样张批) | art-bible 后续批 | 已登记 | - -- 双向一致性核对(systems-index 依赖分层表):索引分层 A5 ← A2, A4, B4 ✓(A2/A4/B4 三硬上游全落上表;B1 编排 = 层 4 Presentation 消费侧的既有编排唯一性原则——B4 先例:编排调用权不构成依赖分层边);D2 为全员 Foundation 数据边。A4/A5 关系 = counter_item_ids 消费(A4 声明字段、A5 回填 owner)——与索引"A5 ← A4"方向一致。 - -## 呈现与 UI 契约 - -> A5 为玩家直接使用的道具系统——呈现归 D1(义务清单 D1×①…④),本节定义数据面供给与负空间。 - -| # | 数据面义务 | 归属 | -|---|---|---| -| 1 | 叠加层三集只读投影 query_overlays(digit_reveal/mine_reveal/reward_preview 三格集)——D1 呈现唯一数据源;数字/徽章本体读既有面(A2 板面、B1 query_reward_identity),A5 零数据复制 | D1 消费 | -| 2 | 库存投影 query_inventory(逐件 {item_id, source{cell, round}, 快照, 状态, usable};枚举序 = 受理序)——来源归因呈现保 P2;usable = 板级零信息判据预判(可用性门数据面) | D1 消费 | -| 3 | 使用回执 consume 返回快照投影——使用瞬间确认反馈数据源;无效目标拒绝附诊断类别(可辨反馈) | D1 消费 | -| 4 | 负空间:A5 效果零结算明细行(挖掘期即时可见性承载归因——与 B4 道具行协议区分);无 HUD 常显字段(库存条外);真视不自动标旗、显影不自动挖(玩家动作仍走既有输入面) | B1/D1 | -| 5 | icon 键契约:item_id 直作图标键(一键一专属纹样、全局恒定禁运行时换图——art-bible §4.6 惯例);叠加层标记三族视觉语言归 art-bible 样张批 | art-bible / D1 | -| 6 | 音频挂钩(D4,Alpha):使用确认音/无效反馈音/显影扩散音(可选);挂点事件 = consume 回执,A5 零音频依赖 | D4 | - -> 📌 **UX Flag — A5 扫雷辅助道具**:本系统有 UI 贡献(库存条/使用交互/叠加层呈现)。Phase 4 前置 `/ux-design` 产出使用交互 spec(design/ux/aux-items.md),stories 引用 ux spec 而非本 GDD。 -> 📌 **Asset Spec**:视觉需求已定义(icon 六键 + 标记三族)。art-bible 样张批后运行 `/asset-spec system:a5-minesweeper-aux-items` 产出逐资产规格与生成提示词。 - -## Tuning Knobs - -| Knob | 默认 | 调过高 | 调过低 | -|---|---|---|---| -| RewardTable.weight(六行,B4 侧 knob) | 5/5/4/4/1/1(provisional 归 C3) | 渗透率↑ → 道具依赖症(预警①)、战斗奖励稀释 | 窗口长空转、五维度覆盖可能破缺(F2 断言拦截) | -| RewardTable.tier(六行) | 常规 t2 / 稀有 t3 | 稀有件入雾池门槛失真(T_fog_min 联动) | 稀有件与常规档不可辨 | -| AuxItemTable.magnitude(ap_grant 行) | 工兵令 2 / 爆破包 4 | +AP 过量 → 停手转存 RAP 泄漏(EC12)、清图节奏失真 | 行动维度名存实亡 | -| target(结构冻结非 knob) | 见 MVP 行集 | ——修改 = 改规则(真视窄域护栏),走本 GDD 修订流程 | —— | -| use_phase(结构冻结) | active_dig 单值 | ——扩枚举 = 修订(非调参) | —— | - -- knob 交互:aux 权重 × B4 战斗池权重(W_total 重算联动——B4×④;禁止两侧独立调参不看渗透率);magnitude × A3 ap_per_round(+4 = 半轮预算的锚定关系——ap_per_round 调参时联动复核);稀有 tier × T_fog_min(雾池准入联动)。 -- 非 knob(结构冻结):四值效果枚举与时效派生 · 真视窄域护栏(target 交集校验)· 无效目标不消耗 · 零 AP 使用成本 · 库存关卡域 · Used 不可逆 · 零随机。 -- 调参所有权:全部内容值 provisional 归 C3;锚验收权 = B4/B1(当量对账调参期扩列——B1×④)。 - -### 失衡预警(playtest 预注册,归 C3) - -| 编号 | 指标 | 阈值/读法 | -|---|---|---| -| ① | 道具依赖度:每轮使用率(用了道具的轮次 ÷ 总轮次) | >50% 即警——P1 观测面(扫雷决策外包给道具) | -| ② | plan 预读覆盖率:预读格 ÷ 开格前决策数 | 过低 = 道具浪费;过高 = 预读替代推理(与①联读) | -| ③ | AP 道具节奏:+AP 与停手率/RAP 转存量联动(A3 OQ3 阈值联读) | 转存率异常上行即警——+AP 沦为 RAP 农场 | -| ④ | 稀有感知:全图卷/爆破包单关出现件数分布 | 恒 0 = 稀有定位失效;恒 ≥2 = 渗透过高(F1 联动重跑) | - -## 验收标准 - -### 测试口径 - -| 口径 | 要点 | -|---|---| -| 测试载体 | `godot --headless --script`(承 D2 冒烟框架;脚本 extends SceneTree、autoload 显式实例化)——A5 是 Core 层状态容器 + 定义表,零场景依附;容器/schema 经 class_name 直引实例化(B3/B4 先例,AC 扫描豁免同款) | -| 被测面 | B1 编排未接线(垂直切片实现期)——冒烟以构造序扮演编排方(B4 先例);A2 只读面以桩投影构造(真集成 deferral 登记缺口预检 1);A3.grant_ap 桩断言调用序(真 A3 deferral 同批) | -| 零随机口径 | A5 全 API 零 RNG——行为级硬证据 = 同输入序列重放逐位相同(AC-9) | -| 期望值推导纪律 | 六行 weight/magnitude/tier 全 provisional(Tuning Knobs)——THEN 按表读值推导不写死;结构定值断言合法:维度五值封闭、效果四值封闭、target 四值封闭、use_phase 单值、护栏谓词(mine_reveal 支持域) | -| 跨表断言生效前提 | AC-12(六行回填)与 AC-13(悬空校验激活)以义务 B4×①…⑤/D2×①② 兑现为前提——生效前登记 deferral(对侧义务登记即生效条件,A4 测试口径先例) | -| 诊断卫生 | 每用例先 reset_diagnostics()(D2 冒烟协议) | - -### API 面(provisional,封闭枚举——实现期 ADR 定名) - -| 接口 | 签名 | 语义与守卫 | -|---|---|---| -| add_item | `add_item(item_id, source) -> bool` | B1 授予路由调用;Cleared/未知 item_id → false + 诊断;逐件实例入关卡域库存 | -| query_inventory | `query_inventory() -> Array` | 逐件实例枚举(item_id/source/快照/状态/usable),枚举序 = 受理序;Used 保留只读;usable = 板级零信息判据现算投影 | -| validate_use | `validate_use(handle, target_cell?) -> Dictionary\|false` | 效果投影 {effect_kinds, magnitude, resolved_target};目标校验按使用目标校验谓词表(越板/点击级零信息 → false + 诊断零消耗;边缘窗口 → resolved_target = 窗口 ∩ 板内格);Used/Cleared/板级零信息 → false + 诊断;只读不消耗 | -| apply_overlay | `apply_overlay(kind, resolved_target, magnitude) -> bool` | 叠加层写入(单 kind 单次,B1 逐 kind 调用);域内输入恒受理 | -| consume | `consume(handle) -> Dictionary\|false` | Used 不可逆;回执 = {item_id, source, 快照投影};Used/Cleared → false + 诊断 | -| query_overlays | `query_overlays() -> Dictionary` | D1 只读投影 {digit_reveal, mine_reveal, reward_preview} 三格集;纯读零副作用 | -| retire_overlays | `retire_overlays() -> bool` | 板级叠加层清空(B1 编排——与 B4 retire_mapping 同点) | -| clear_inventory | `clear_inventory() -> bool` | 关卡末全清;重复 → false + 诊断(幂等守卫) | - -- 封闭枚举即负空间验收形态:无自动使用入口(真视不自动标旗、显影不自动挖)· 无重掷/升级 API · 无事件订阅 · 无 RNG 直连 · 无 A2/B4 状态写入口(apply_overlay 只写 A5 自持叠加层);新增任何入口 = 接口漂移(本 GDD 修订非调参)。 - -### 夹具与致命 manifest - -| 夹具根 | 内容 | 服务 | -|---|---|---| -| 默认根 | AuxItemTable 六行 + D2 全表(B4 修订批落地后)——结构断言与 F1/F2 验算 | AC-1/AC-11/AC-12 | -| a5_dup_key | 重复 item_id | 致命 | -| a5_dim_oob | dimension_tags 含 "luck"(枚举外) | 致命 | -| a5_target_violation | mine_reveal 行 target=board_wide(真视窄域护栏违例——承重校验的测试落点) | 致命 | -| a5_phase_oob | use_phase="settlement"(枚举外) | 致命 | -| a5_dangling_counter | VariationTable.fog.counter_item_ids=["ghost_item"](AuxItemTable 无此行) | 致命(A4×② 兑现载体) | -| b4_dangling_aux | RewardTable aux 行 effect_id="ghost_item" | 致命(B4×② 兑现载体) | - -| manifest 行 | 触发条件 | 断言 | -|---|---|---| -| a5_dup / a5_dim / a5_target / a5_phase / a5_dcounter / b4_daux | 各致命根独立进程游戏通道加载 | 非 0 退出且错误清单含对应类别 | - -### AC 清单(Given-When-Then,编号不变) - -| AC | Given | When | Then | 覆盖 | -|---|---|---|---|---| -| AC-1 | 干净检出(默认根) | 冒烟加载 AuxItemTable | 加载成功、恰含六行(probe_dust/sapper_order/loot_compass/nest_pendulum/catacomb_scroll/blast_kit——内容事实断言);非 knob 字段(dimension_tags/effect_kinds/target/use_phase)与 MVP 行集逐一相符 | Core Rule 1/2 · 枚举节 | -| AC-2 | schema 类直引实例 | validate() 作用于越域代表值:dimension_tags 含枚举外值、effect_kinds 含重复、mine_reveal 行 target=board_wide、ap_grant 行 magnitude=0、use_phase 越域;域内代表值全组 | 越域各含对应域错误类别(零静默);域内零诊断——特别地 blast_kit(ap_grant+mine_reveal→area_3x3)与 catacomb_scroll(fog_reveal+reward_preview→board_wide)组合行合法通过 | 枚举·校验类别表 · Core Rule 3 | -| AC-3 | 全新容器 | add_item ×N(N=64)→ query_inventory | 恰 64 件、每件 {item_id, source{cell, round}, 快照}、全 InStock 零拒绝(数量无上限);枚举序 = 受理序 | Core Rule 5 | -| AC-4 | 库存含 probe_dust、桩面含雾区 R(2 未开雾格) | validate_use(handle, R 内雾格) | true + 投影 {effect_kinds=[fog_reveal], resolved_target=R}(只读——库存/叠加层零变化) | Core Rule 7② | -| AC-5 | 同 AC-4、库存计数 c | validate_use(handle, 已开非雾格) | false + 诊断(EC1);随后库存计数仍 = c(零消耗——照常消耗拍板不适用于 A5 的行为面) | Core Rule 8 · EC1 | -| AC-6 | 同 AC-4 | 编排序扮演:validate → apply_overlay(fog_reveal, R) → consume | apply 后 query_overlays.digit_reveal ⊇ R 两格;consume true + 回执含 source;实例 → Used | Core Rule 7 · EC4 | -| AC-7 | Used 句柄 | 再次 validate_use / consume | 均 false + 诊断(Used 不可逆) | EC10 | -| AC-8 | 库存含 sapper_order(magnitude=2)、A3 桩接线 | 编排序扮演 ap_grant 分支:validate → grant_ap 桩 → consume | 桩收 grant_ap(2) 恰一次且在 consume 前(序断言);consume true | Core Rule 7③ · B1×① | -| AC-9 | 固定输入序列(add_item ×3 → validate ×2 → 编排使用 ×2 → query 全读面) | 同序列重放两遍(全新容器) | 两遍的库存投影/叠加层投影/回执逐位相同(零随机的行为级硬证据——A5 全 API 无 RNG) | Core Rule 10 | -| AC-10 | 叠加层 Active(含条目) | retire_overlays → query_overlays | 返回三集全空;再次 retire → false + 诊断(幂等;重注入后可复用——板级生命周期) | 状态表 · EC3/EC7 | -| AC-11 | clear_inventory 后 | validate_use / consume / add_item / query_inventory | 均 false 或空 + 诊断(Cleared 逻辑失效态——B4 E7 同款) | EC9 | -| AC-12 | 默认根(生效前提 = B4×④/D2×② 兑现) | 读 RewardTable 六 aux 行 + F2 覆盖推导 | 六行存在且 weight>0、effect_id 精确指向 AuxItemTable 行;F1 渗透率 ≈1.7 件/板按表读值复算成立;五维度 coverage 全真(维度覆盖断言——"每维度都有对应道具"的机器可查形态) | F1/F2 · B4×④ | -| AC-13 | a5_dangling_counter / b4_daux 夹具根 | 独立进程游戏通道加载 | 各非 0 退出且错误清单含对应类别(悬空校验激活——A5-1/B4×② 兑现载体);对照腿:默认根干净通过 | EC13/EC14 · A4×② | -| AC-14 | A5 文件集(schema/容器/冒烟脚本) | 按 D2 AC-9 模式静态扫描 | randomize()/RandomNumberGenerator 零命中(零随机);extends Control / .tscn preload 零命中(Core 层零 UI 债);A2/A3/B4 写入类 API 符号零引用(只读面除外——A2 current_board/reveal_record 读接口白名单登记;B1 编排反向亦然) | Core Rule 10 | -| AC-15 | 库存含 nest_pendulum、桩面 3×3 窗(含 1 雷格)+ 板角中心格腿 + 零雷窗口腿 | 编排序扮演:validate → apply_overlay(mine_reveal, resolved_target) → consume | 常规腿:query_overlays.mine_reveal ⊇ 9 格(含雷格)、consume true;边缘腿:中心格 = 板角 → resolved_target = 4 格(窗口 ∩ 板内格)恒受理;零雷腿:恒受理(零雷 = 信息) | Core Rule 2/8 · EC17 · 谓词表 | -| AC-16 | 库存含 loot_compass(area_3x3)与 catacomb_scroll(board_wide)、桩面含未开资格格窗 R 与全开窗 E | 编排序两腿:validate → apply_overlay(reward_preview, resolved_target) → consume;零信息腿:validate_use(loot_compass, E 内格);板级腿:桩面全开 → query_inventory usable 投影 | 预读腿:query_overlays.reward_preview ⊇ R 中未开资格格、consume true;全图卷腿:digit_reveal ⊇ 全板未开雾格 ∧ reward_preview ⊇ 全板未开资格格;零信息腿:false + 诊断、库存计数不变(点击级零消耗);板级腿:usable=false(图标灰数据面)+ validate_use false | Core Rule 8 · EC1/EC18 · 谓词表 | - -### 覆盖矩阵 - -| 类别 | 映射 | -|---|---| -| Core Rules | 1→AC-1/AC-12(F2)· 2→AC-1/AC-2/AC-15/AC-16 · 3→AC-2(a5_target_violation 腿)· 4→AC-12(B4×①…⑤ 生效前提)· 5→AC-3/AC-11 · 6→AC-4(相位 deferral B1×①)· 7→AC-4/AC-6/AC-8/AC-15/AC-16 · 8→AC-5/AC-15/AC-16(可用性门谓词表)· 9→AC-8(零 try_spend = API 负空间)· 10→AC-9/AC-14 | -| Formulas | F1→AC-12 · F2→AC-12 · F3→方向预检(非 AC——定量归 B1×④调参期) | -| Edge Cases | EC1→AC-5 · EC2→AC-5(无雾桩面同构)· EC3/EC7→AC-10 · EC4→AC-6 注记 · EC5/EC6→规则语义(A2/A3 域 OOS——真集成 deferral)· EC9→AC-11 · EC10→AC-7 · EC11→Core Rule 7 序证明(构造不可达——负空间)· EC12→OOS A3 既有 AC(grant_ap 后 request_stop 转存——A3 修订批补腿)· EC13/EC14→AC-13 · EC15→D2 既有门(OOS)· EC16→B4 F2 域(OOS)· EC17→AC-15(边缘腿)· EC18→AC-16(板级/点击级腿) | -| 上游承接 | A4 EC6(显影语义)→Core Rule 2 fog_reveal 行 · A4 OQ2(时效/定价)→收口声明(依赖节)· B4 OQ2(呈现深度)→B4×⑤ · A5-1(counter 回填+悬空校验)→A4×①② / AC-13 · 创意风险 #1(预读)→Core Rule 2 reward_preview / B4×⑤ | - -### 缺口预检 - -| 编号 | 缺口与处置 | owner | 时机 | -|---|---|---|---| -| 1 | A2 真集成 deferral:目标校验/显影数据源以桩投影构造——真 A2 接线后 AC-4/AC-6/AC-15/AC-16 换真面重跑;雾区身份解析(fog_region target → 所属雾区)与零信息判据(已开态 + reward_eligible 资格标记——可用性门数据源)依赖 A2 板面变异快照读取(A4 生成期快照既有;A2 读接口白名单同批扩列) | A2 集成批 | 垂直切片实现期 | -| 2 | B1 编排 deferral:相位 gate/规范序/生命周期编排以构造序扮演——B1×①②③ 登记为生效条件(缺项即 blocking) | B1 修订批 | B1 GDD 修订 | -| 3 | B4/D2 修订批 deferral:六行回填 + 双悬空校验激活——AC-12/AC-13 生效前提 | B4/D2 修订批 | 义务清单兑现时 | -| 4 | A3 grant_ap 修订批:AC-8 桩换真面 + EC12 转存补腿(A3 侧 AC 扩一条) | A3 修订批 | A3 GDD 修订 | -| 5 | 扫描域成员清单:A5 GDScript 产物入 D2 AC-9 项目级 CI 扫描域(B3/B4 先例) | Technical Setup | 实现期 | - -## 开放问题(OQ) - -| 编号 | 问题 | owner | 时机 | -|---|---|---|---| -| 1 | 命名与 icon 终稿:六行 display_name 为机制名候选——地牢隐喻风味词复核 + art-bible §4.6 样张批定 icon(D1 程序化占位不阻塞) | art-bible/D1 | 样张批 | -| 2 | 预读呈现深度细则:徽章呈现信息量(仅身份 vs 身份+tier——query_identity 投影含 tier)与板面视觉密度(预读徽章 × 未开格 × 变异纹理叠加)——D1 裁决,与 B4 Rule 8 已开格呈现同族复用 | D1 | D1 修订批 | -| 3 | 真视与标错惩罚交互:A2 OQ1 惩罚上线后,真视价值重估(真视→必标中→零惩罚风险——价值上行)与护旗类道具(防惩罚)是否入池 | C3 | A2 OQ1 关闭后 | -| 4 | 未来变异反制扩展:岩浆/冰冻行建行时反制道具语义(A4×③ 框架契约——每个新变异建行批随批出反制行) | 垂直切片批 | 随变异建行 | -| 5 | 全图卷稀有度验证:F1 稀有读数 ≈0.17 件/板在 playtest 的"稀有可感"验证——过疏(恒不见)过密(常态全图)均触发权重复核 | C3 | 垂直切片 playtest | -| 6 | 自动寻路终态声明:预读道具为 MVP 终态(寻路始终玩家心智)还是中间态——B4×⑤ 已声明"自动寻路不做",升格为永久设计态与否随 playtest | C3/CD | playtest 后 | - -## 版本历史 - -| 版本 | 日期 | 改动 | -|---|---|---| -| v1.0-lean | 2026-09-14 | 初稿定稿(solo 模式一次会话——专员/总监代理全部跳过,出稿待人工复核):五维度框架 + 真视窄域护栏 + MVP 六行(四常规单维 + 两稀有多维)+ AuxItemTable schema(D2 回填 owner)+ 获取路由(B4 aux_item 激活)+ 使用编排契约(B1 义务 ×4)+ 板级叠加层(零特判延伸)+ A3 grant_ap 接口漂移预授权 + 跨 GDD 义务清单 21 项 + F1–F3 + 14 AC;A4 EC6/OQ2 与 B4 OQ2 收口 | -| v1.1-lean | 2026-09-14 | 首轮 /design-review(solo 快速审核)3 blocking + 5 recommended 同日核销——用户拍板两项边缘规则:① area_3x3 边缘窗口照常受理、resolved_target = 窗口 ∩ 板内格;② 零信息目标不可用不消耗(板级判据图标灰/入口禁用、点击级拒绝,组合行判据取 OR,真视零雷恒有效)。F3 方向自相矛盾改写(P(雷) 对 ι 递增——收益在盲赌暴露下降非单赌命中率)· 使用目标校验谓词表新增(Core Rule 8 展开)· EC17/EC18 新增 · AC-15/AC-16 补齐(真视/预读运行时路径)· B4×④ 扩登记常数重制 · 义务编号源前缀注记 · aux 行 pool_tag 注记 · 应用顺序钉死(空间先、ap_grant 后)· query_inventory 投影增 usable 字段 · D1×② 可用性门呈现扩列;正文 Core Rules 表同批口语化重写(语义零变更);同日用户拍板免独立 re-review 直接放行【B2/B1/D1 先例】 | diff --git a/design/gdd/legacy-2026-09-14-v1/b1-settlement.md b/design/gdd/legacy-2026-09-14-v1/b1-settlement.md deleted file mode 100644 index bc6db45f..00000000 --- a/design/gdd/legacy-2026-09-14-v1/b1-settlement.md +++ /dev/null @@ -1,945 +0,0 @@ -# B1 战斗结算规则(Combat Settlement Rules) - -> **状态**:Designed · lean 格式 -> **版本**:v1.1-lean · 2026-09-13 · 作者:user + agents -> **承载支柱**:P2 主("扫雷的因、战斗的果"的兑现面)· P3(雷的双面兑付)· P1(条款③掌控感的经济侧验收) -> **一句话**:B1 把每轮扫雷的结果逐行兑现为战斗结果,并判定胜负。 -> **复核注记**:lean 门禁下 systems-designer / qa-lead 已委托起草(F0–F5 + 对账义务清单 / 43 条 AC + 覆盖矩阵);creative-director 与 art-director 未经咨询——生产前人工复核 Player Fantasy 情绪定位与 Visual/Audio 和 art-bible 一致性(§1–4 须在 D1 GDD 前创建)。 - -## 速览 - -| 关键问题 | 答案 | -|---|---| -| 定位 | 战斗域编排与结算中枢;轮次生命周期唯一 owner | -| 拥有 | 段序、判定时机、伤害消费侧语义、明细流水协议、上游义务账本(B3×8 / B2×6 / A2×3 / B4×6) | -| 不拥有 | 单位状态(B2)· 状态实例(B3)· 奖励内容(B4)· 行动价目(A3)· 棋盘规则(A1/A2)· 呈现(D1/B5) | -| 上游输入 | A2 三事件流 · A3 相位观测量 · 各表值快照 | -| 下游输出 | 结算步骤流(D1/B5/D4 消费)· 条款③⑤对账结论(C3 约束输入) | -| 硬约束 | 零随机 · 零 UI 依赖 · 结算禁 await——同种子同输入 ⇒ 步骤流逐行相同 | - -## 体验锚点 - -| 支柱 | 关键词 | 机制承诺 | -|---|---|---| -| P2 因果归因 | "都是我算出来的" | 每行明细携带来源标注(伤害道具 / 安全格增益 / 标中旗削弱 / 清图奖励 / 雷→伏击);无来源行 = 断言失败(AC-42)——P2 呈现半边的最终兜底在 B1 流水协议 | -| P1 掌控感 | "挖下去值得" | 挖掘决策 EV 健康不等式(A3 条款③)由本系统闭合签字;条款⑤守"推到底"不在数学上吃亏 | -| P3 雷的两面 | "赌桌不是陷阱" | 敌方伏击行与标中旗削弱行同框、同呈现语言 | -| 高光节拍 | "完美被加倍兑现" | 完美排雷双份兑付 + 标中旗行高光(创意风险 #2/#3 机制本体) | - -反向护栏:明细绝不能有无来源的行(P2);判定绝不能不可归因(P1);敌我增减益同构呈现(P3)。任何"合并到看不出来源"的呈现优化,须先确认归因链在数据层仍可还原。 - -## 全局流程 - -### 战斗开始 - -``` -begin_battle(encounter) - │ ① set_reload_gate(true) [D2] 调试门置位 - │ ② notify_battle_start() [B3] 容器开域 - │ ③ encounter 骰 [RngService] unit_count 区间均匀骰定本战实际数量(封闭流,恰一 scope——C3 遭遇随机化) - │ ④ spawn(L, D, hero_hp, n) [B2] 行值快照实例化(n = 实际数量 override;定值行 n = unit_count) - │ ⑤ install_board + roll_board [A2/B4] 恰一次;资格格清单 = S ∖ R₀ - │ ⑥ notify_round_start() [A3] → Active - ▼ -RoundActive(挖掘期,B1 只缓冲事件流) -``` - -### 每轮结算(七段骨架,全序执行、段序结构冻结) - -``` -轮末触发:Waiting 相位编排点(只读 A3 相位观测量,不依赖事件到达序) - │ - ▼ -①授予段 ──── cell_revealed 批 → flag_judged 批 → 清图奖励(仅 cleared 轮) - │ (转化规则见下方两表) - ▼ -②道具使用窗口 ─ 玩家至多选一件或跳过(全流程唯一玩家输入点) - │ 满血禁选治疗包;空库存可整体不弹窗 - ▼ -③增益/减益段 ─ query_active 双侧读值 → SettlementTable 语义映射 → 效果明细行 - │ - ▼ -④道具段 ───── 伤害道具:恒定表值打 default_target;治疗包:clamp 回复 - │ 施加时无存活敌 → 照常消耗 + "已消耗未生效"行 - ▼ -⑤战斗段 ───── 主角先手攻击(D_hero = 基础分量 atk×(1+attack_up) + 伤害A/B 充能分量——F6) - │ → 逐存活敌(行主序):query_attack → apply_damage → advance - │ ※ hero hp=0 → 立即短路,剩余敌不作用,直入 ⑦ - ▼ -⑥衰减段 ───── decay_round() 恰一次(含末轮;先兑付后衰减的时序契约) - │ - ▼ -⑦判定段 ───── hero hp=0 → 失败 │ 存活敌=∅ → 胜利 │ 否则 → 下一轮 -``` - -### 出口分发 - -| 结局 | 触发 | 动作序列 | 约束 | -|---|---|---|---| -| 继续 | 判定=下一轮 | `notify_settlement_done(same_board)` → `notify_round_start()` | 同图续轮 | -| 换图 | cleared 轮 | `retire_board` → `retire_mapping` → A1 `generate` → `install_board` → `roll_board` 恰一次 → `notify_settlement_done(new_board)` → `notify_round_start()` | stopped/ap_exhausted 恒 same_board,违约 fail-fast | -| 挖掘期刷新 | 玩家经 D1 发起 | A3 `request_refresh` 扣费 → 换图全序(无结算段、无 round_end、轮次不终结) | RAP 不足→拒绝上抛;**每轮 cap 2(RoundStart 重置)**——与 A3 `refresh_cap_per_round` / registry `rap_rules` / D1 同口径,非"每图";刷新图无清图奖励 | -| 战斗结束 | 判定=胜/负 | `retire_mapping` → `despawn_all` → `notify_battle_end` → `notify_combat_end` → `set_reload_gate(false)` | 库存不清(关内延续) | -| 关卡结束 | 上层显式调用 | `clear_inventory()` 恰一次,清空前快照计数返回 | victory/defeat 皆然 | - -## 核心规则 - -> 每条规则两段:**人话**(作用于哪个系统、什么情况下、谁触发、触发后发生什么;效果与情况用枚举表)→ **举证**(计算方法/公式;纯流程规则明写"无计算")。 - -#### 规则 1:跨系统调用只由结算编排器一家发起 -**人话**:这条管 B1(战斗结算编排器)对外协作的姿态:战斗域所有跨系统调用都由 B1 一家发起,敌人、状态、库存三个系统(B2/B3/B4)相互之间零直调——任何一方绕过 B1 直接调别人都是架构违约。结算本体另有三条自守约束: - -| 约束 | 含义 | -|---|---| -| 零随机 | 结算路径不掷任何骰子 | -| 零 UI 依赖 | 结算逻辑不读不写界面 | -| 禁 await | 结算逻辑同步执行、不异步等待 | - -随机数只有一个例外,且在结算之外:战斗开始时本战敌人数量经 encounter 流掷骰决定,但那一下发生在结算步骤流之外(见「全局流程」节),结算的可回放性不受影响。将来若结算本身需要随机数,必须走数据层新增的增流通道并过评审。 - -**举证**:无计算。唯一发起方的静态扫描与零随机行为级断言见 AC-43/33;encounter 增流通道定义见 D2 Rule 5〔增流通道〕与 D2 流枚举〔encounter〕。 - -#### 规则 2:每轮轮末自动触发一次结算 -**人话**:每轮挖掘结束、回合状态机进入轮末等待相位时,B1 自动发起一次整轮结算。触发判定只读两样东西:回合经济系统 A3 暴露的相位读数、和"上一轮已结束"的标记(last_round_end),不依赖事件谁先到达——到达顺序被打乱,结算结果也一致。用事件订阅还是相位轮询来实现触发,留给实现期 ADR 定。 - -**举证**:无计算。触发不依赖到达序的行为级验收见 AC-6。 - -#### 规则 3:挖掘期只记账,轮末统一兑现 -**人话**:挖掘阶段玩家挖格、插旗产生的上报事件(挖开了什么、旗判中没判中)不立即兑奖,而是按轮先进缓冲区;轮末结算时按事件规范序——即棋盘系统 A2 发出事件的顺序——统一转化成奖励与效果。每条事实从记录到授予恰好处理一次:状态效果层不做去重、库存层只留幂等兜底,正常路径上不会重复发奖、也不会漏发。 - -**举证**:无计算。处理序与恰一次语义验收见 AC-9。 - -#### 规则 4:每轮结算按固定七段顺序执行 -**人话**:每轮结算严格按七个段依序跑完:①授予 → ②道具使用窗口 → ③增益/减益 → ④道具 → ⑤战斗 → ⑥衰减 → ⑦判定,全程图见「全局流程」节。核心相对次序:增益/减益先于道具、道具先于战斗。这个段序是结构冻结的——要改必须走 GDD 修订流程,不属于调参范围;玩家在窗口里的每一次选择也是回放输入的一部分。 - -**举证**:无计算(纯流程规则)。段序常量存于 SettlementTable `segment_order`,加载期恒等断言见 AC-2;段界行序验收见 AC-7。 - -#### 规则 5:结算第一段——把挖掘期的事实兑换成奖励 -**人话**:结算第一段是授予段,把挖掘期缓冲下来的事实分三批兑换成奖励与效果;每一格受理、每一雷转化、每一旗判定都恰好一次。三批概览: - -| 批次 | 处理什么 | 触发后发生什么 | -|---|---|---| -| 第一批(挖格上报) | 本轮挖开的格子 | 踩雷格逐颗转化为敌方伏击强化;带奖励资格的安全格按类别分流兑付 | -| 第二批(旗判定上报) | 本轮判定的旗 | 判中 → 敌方削弱当轮生效(每颗雷资格只兑一次);判空 → 零兑付、只记"标旗未中"归因行 | -| 第三批(清图) | 本轮把未开格挖尽 | 清图奖励恰好发一次;全板零误标且有标中 → 追加第二份同身份兑付 | - -**举证**:精确的输入/转化/产出与拒绝语义见下方两张实现参照表;兑付数值读 D2 表值、无新公式。三批的恰一次与守恒验收见 AC-9/10/11/12/13——AC 覆盖矩阵的引用记号 5.1/5.2/5.3 即此三批。 - -### 规则 5 的实现参照——三批转化 - -| 批 | 输入 | 转化 | 产出 | -|---|---|---|---| -| cell_revealed | `kind=mine` | 调 `ambush_grant_plan(mines_r, cap)`,事件规范序逐颗 `apply_effect(ambush, source={mine_hit, origin_cell, round_index})` | 伏击池 L;溢出颗产"溢出未生效"行(含来源) | -| cell_revealed | `kind=safe ∧ reward_eligible` | 按 category 分流(见下方「奖励分流」表) | 每格受理恰一次(B4 幂等仅兜底) | -| flag_judged | `hit=true` 且该雷实例资格未消费 | `apply_effect(weaken, source={flag_hit, origin_cell, round_index})` + 资格消费入集合 | 标中旗兑付行(highlight=`flag_hit`) | -| flag_judged | `hit=true` 且资格已消费 | 去重跳过(资格以雷格实例为键、跨轮累积;换图后新实例自然重置) | 零新增行(+debug 诊断可选) | -| flag_judged | `hit=false` | 零兑付;每雷实例一次去重(A2 逐轮重报零新增行,防惩罚轰炸) | "标旗未中"零值行(source=`flag_miss`、highlight=`perfect_broken`) | -| cleared 轮 | — | `grant_clear()` 恰一次;完美板(零误标 ∧ ≥1 标中)追加第二份同身份兑付(走既有授予通道) | 清图奖励行;完美高光行 | - -### 规则 5 的实现参照——奖励分流 - -| category | 兑付方式 | 拒绝语义 | -|---|---|---| -| buff | `apply_effect`(入池,结算段生效) | 满层 → "奖励未生效"行(可聚合计数),无折算 | -| instant_aoe | 全体存活敌各 `power` 点(逐个 apply_damage、受击即死) | 当场兑付,不进库存不出窗口 | -| instant_heal | 主角回复 `power`(clamp) | 满血 → "奖励未生效"行零兑付 | -| damage_item / heal_pack | `stock()` 入关卡域库存 | 窗口选用时兑付 | - -- `reward_eligible=false`(initial 通道)格不入奖励库——B1 判定只读 reward_eligible、`channel` 字段零特判;连锁批量授予溢出 = 显式接受(无转换补偿)。 -- 标错惩罚未上线——标旗未中行是归因痕迹非惩罚;预留语义走接口漂移补(A2 实测后)。 - -#### 规则 6:踩雷给敌人叠加伏击强化,有上限、只管一轮 -**人话**:挖开雷格时,B1 向敌人系统请求一次伏击授予计划,参数是本轮踩雷数和每轮上限。上限之内的雷按事件规范序逐颗叠加给敌方;超出的雷不生效,只记"溢出未生效"行留痕(含来源)。伏击聚成一个池:同一结算里多个敌人攻击读的是同一个池值——共享、不均分也不消耗;伏击只活一轮,轮末随衰减清零。 - -**举证**:恰一次调用 `ambush_grant_plan(mines_r, cap)`,granted = min(mines_r, cap)、差值计溢出(守恒算例见 AC-14);伏击池进入伤害合成的读法见 F3。 - -#### 规则 7:轮末窗口里你至多选一件道具,或者跳过 -**人话**:结算第二段是全流程唯一的玩家输入点:道具使用窗口。窗口清单 = 库存系统 B4 的库存投影,再由 B1 逐件做可用性守卫预判;玩家至多选一件使用、也可以跳过,库存为空时可以整体不弹窗。本轮的完整选择序列(含跳过)记入回放;若上游一次提交多件,只受理第一件、其余退回并记编排违例诊断。 - -| 窗口里看到 | 能否选用 | -|---|---| -| 伤害类道具 | 恒可选 | -| 治疗包 | 满血禁选;未满血可选 | -| 空库存 | 可整体不弹窗,按跳过记 | - -**举证**:无计算(纯流程规则)。"伤害道具恒可选"的结构前提 = 窗口只在仍有存活敌的轮打开(AC-15/20);多件提交违例诊断见 AC-16。 - -#### 规则 8:动刀之前,先把两侧的增益减益合成完毕 -**人话**:结算第三段把当前挂在主角和敌人身上的增益/减益一次性合成:从状态系统读出两侧活跃效果,按数据表的语义映射换算成各自的修正池,再做池内加算,供后面的道具段与战斗段使用。每条效果按授予流水逐条记明细行、标注它来自哪一次授予;敌方侧的减益作用于全体存活敌人(side-wide),不是只挂单个敌人。 - -**举证**:池加算、clamp 域与地板的计算见 F2(B3 义务③⑦ 的 B1 侧落点);效果行字段协议见「枚举」节;验收锚 AC-17。 - -#### 规则 9:道具伤害是表里的死数,不吃任何加成 -**人话**:结算第四段执行窗口选中的那件道具。伤害道具按表里的恒定值打向默认目标(顺位最前的存活敌人),不吃任何池修正;治疗包按表值回复、超出上限部分截断(clamp 归 B1 执行)。两个守卫在本段兜底:满血时使用治疗包 → 拒绝、不消耗;轮到施加时已无存活目标 → 道具照常消耗、记"已消耗未生效"行(存活判定读敌人系统的存活集)。 - -**举证**:无计算——数值恒读 D2 表值;默认目标与 clamp 口径见 F3;验收 AC-18/19/20。 - -#### 规则 10:主角先出手,再逐个存活敌人还手 -**人话**:结算第五段是战斗段。主角先攻击一次,伤害 = 基础攻击乘攻击增益 + 本轮攒下的伤害A/伤害B 充能分量——充能分量先按目标甲型查护甲克制表、逐分量取整后相加。然后按行序逐个存活敌人行动:每个敌人依次走"读攻击 → 结算伤害 → 推进状态"三步调用、恰好推进一次,主角不在推进范围内。战斗中有人死亡立即出局:已死敌人不再行动;主角若中途倒下,剩余敌人全部停手、直接跳到判定段。伏击池是共享读值,多敌攻击互不消耗。 - -**举证**:D_hero 三分量合成、clamp/溢杀与死亡判定公式见 F3;充能分量与甲效查表见 F6;调用序、短路、池共享验收 AC-21/22/24/25。 - -#### 规则 11:轮末必跑一次效果衰减,最后一轮也不省 -**人话**:结算第六段调用一次状态系统的衰减步,把到期的临时效果移除并记衰减行。这一步恒定执行、每轮恰好一次——哪怕本轮就是战斗的最后一轮也照跑:"先兑付清图奖励、后衰减"的时序契约由段序保证,胜利结算里的效果同样要走完这一轮的生命周期。 - -**举证**:无计算。恰一次与时序契约验收 AC-26;容器已空时衰减返回零属合法结果(零明细行,见边界情况节)。 - -#### 规则 12:最后一段定胜负:主角先判,再看敌人是否清空 -**人话**:结算第七段做胜负判定,顺序是防御性的:先判主角是否倒下(倒下即失败),再判存活敌人是否清空(清空即胜利),两者都不满足就回发"继续"、进入下一轮。判定结果写成终局判定行——它同时是胜负画面的数据锚。 - -**举证**:无计算。hero 先判的防御性优先级与双死不可达论证见 F3 ④;验收 AC-27。 - -#### 规则 13:完美排雷翻倍兑付,标中旗当场强调 -**人话**:授予段里埋着两个强制检查点(高光时刻),条件满足就必须兑现: - -| 高光 | 什么时候触发 | 触发后发生什么 | -|---|---|---| -| #2 完美排雷 | 清图时全板自布板起一次都没标错旗、且至少标中过一面 | 清图奖励追加第二份同身份兑付,玩家实得翻倍 | -| #3 标中旗 | 旗判中、且这颗雷的兑付资格还没消费过 | 敌方削弱当轮生效,兑付行打上高光标记 | - -呈现分工:事件型高光(完美排雷)发独立高光行;属性型强调(标中旗、清图奖励)用行字段标记。完整判定谓词与兑付/降级细节见下方实现参照表与「枚举」节。 - -**举证**:完美板当量 = power × P_perfect ÷ 100,载体域 {100, 200}(P_perfect 换算语义见 F1、参数归 Tuning Knobs 表);完美谓词与降级兑付验收 AC-35/36。 - -### 规则 13 的实现参照——高光兑现节点(强制检查点) - -| 节点 | 判定 | 兑付 | 呈现 | -|---|---|---|---| -| #2 完美排雷(perfect_sweep) | 板级谓词:本板自 install 起全部 flag_judged 中 hit=false 计数 = 0 ∧ hit=true ≥ 1(雾内插旗计入误标、零特判;计数随 install 重置) | 清图奖励身份第二份兑付:道具类 → `stock(同源身份快照)` 第二次;buff 类 → `apply_effect(同身份)` 第二次(满层拒绝照旧);`grant_clear` 本身仍恰一次;当量 = power × P_perfect ÷ 100(载体域 {100, 200}) | 独立高光行,value = 实际有效兑付(首份 + 第二份被接受部分)、禁记名义值;首份即零兑付 → 高光行不发(完美谓词仍成立) | -| #3 标中旗高光 | hit=true 且资格未消费(授予段判定) | weaken 当轮即兑付(dur=1 本就当轮生效)——chord 缺席的节拍缺失以"当轮兑付 + 明细强调"组合补偿 | 兑付行 highlight=`flag_hit` 字段标记;深度形态(即时 HUD 动画)归 D1/垂直切片 | - -高光使用规则:事件型高光(完美排雷)用独立高光行;属性型强调(标中旗 / 清图奖励)用行字段标记。 - -#### 规则 14:结算每一步都记一行流水,行型只有 13 种 -**人话**:结算过程中发生的每一件事都写一行明细流水。行型封闭为 13 类、不允许私自增加;每行都带公共字段(来源类别、格子、轮次、显示名、数值、高光标记等),各行型再补自己的特有字段。这份流水是界面呈现、回放对账、数据导出共读的唯一数据源契约。任何一行若找不到来源,直接断言失败——宁炸勿混。 - -**举证**:13 类行与公共/特有字段分层见「枚举」节「明细行类型」表;无来源行断言与逐行字段校验验收 AC-42。 - -#### 规则 15:同种子同输入,结算逐行复现 -**人话**:结算完全可回放:同样的随机种子加同样的输入(事件序列 + 玩家在道具窗口的选择序列),跑出的结算步骤流逐行相同——录像回放、断言复测、切点续玩都建立在它之上。成立前提正是前面几条规则:零随机、确定性输入、数值全部来自表值快照、重试换图(attempt 重试)不额外取随机流号。 - -**举证**:无计算。逐行相等断言见 AC-33、回放切点见 AC-34;随机流 scope 口径见 D2 流枚举。 - -#### 规则 16:所有数值都在数据表里,代码零写死 -**人话**:结算用到的每一个数值——当量、clamp 界、乘数、段序常量——全部放在数据层的结算表(D2 SettlementTable)里,B1 代码零数值字面量:调数值只改表、不动代码。配套一个调试门:战斗开始时 B1 把热重载闸门落下、战斗结束时抬起(B1 是唯一调用方);战斗中途的热重载请求会被闸门拒绝,防止数值换到一半把结算打断。 - -**举证**:无计算。表结构见「Tuning Knobs」节 SettlementTable schema;零字面量与闸门验收 AC-1/2/3/4/32/41。 - -## 枚举 - -### 明细行类型(封闭枚举,13 类) - -| 行类型 | 特有字段 | 产出点 | 说明 | -|---|---|---|---| -| 效果行 | `effect_id` `pool_value` | 增益/减益段 | value=该次授予贡献值;pool_value=池合成值(防 −130%×2 行误读为 −260%) | -| 伤害行 | `target` | 道具段 / 战斗段 | 分量二元组 + 减伤终值 + 击杀标记 | -| 治疗行 | — | 道具段 | clamp 后真实回复量 | -| 道具行 | `target` | 授予段 / 道具段 | 入库 / 生效 / 语境注记 | -| 奖励未生效行 | 聚合计数 | 授予段 | 满层拒绝、满血、雾板等合法例外 | -| 已消耗未生效行 | — | 道具段 | 施加时已无存活敌(Used 不可逆) | -| 使用被拒行 | — | 道具段 | 满血治疗包守卫 | -| 溢出未生效行 | — | 授予段 | 伏击/奖励族同名协议 | -| 标旗未中行 | highlight=`perfect_broken` | 授予段 | 零值归因行;每雷实例一次去重 | -| 蓄力行 | — | 战斗段 | charge 拍零作用 | -| 衰减行 | — | 衰减段 | 移除数 k(呈现聚合归 D1) | -| 判定行 | — | 判定段 | 胜负 / 继续 | -| 高光行 | — | 授予段(清图) | 完美排雷;value=实际有效兑付,禁记名义值 | - -**公共字段**(13 类全必有):`type` `source_class` `origin_cell`(板级行可空)`round_index` `display_name` `value` `highlight?` -**断言**:无来源行 = 失败(AC-42)。新增行类型/新字段均为输入的确定函数——回放逐行相等断言语义不受损。 - -### source_class(封闭枚举) - -| 值 | 来源 | -|---|---| -| safe_cell / flag_hit / mine_hit / clear_default | B3 既有四源 | -| 道具/判定扩展 | B4 交付语义 | -| enemy_action | 敌方行动行(伤害/蓄力) | -| flag_miss | 标旗未中零值行 | -| hero_attack | 主角先手攻击伤害行 | - -新增值 = 接口漂移,须同步 `source_label_map` 键集。 - -### highlight(可空枚举) - -| 值 | 含义 | -|---|---| -| `flag_hit` | 标中旗削弱兑付行强调 | -| `clear_reward_h2` | 清图奖励行强调 | -| `perfect_broken` | 本板完美谓词已破的归因锚 | - -新增值 = 接口漂移。 - -## 数值结论与推导 - -> 全部公式零随机(同输入恒同输出);期望值均为设计期统计量(对账输入 = A1 F4 报告 C 的 actuals,非 target 参数);数值默认 provisional(调参所有权归 C3)。 - -### 术语表 - -| 术语 | 白话定义 | -|---|---| -| 乘区 | 伤害公式里相乘的各段修正(本作两段:主角减伤池 × 敌方削弱池) | -| 池 | 同一侧百分比修正的加总桶 | -| 地板 | 数值不许越过的下界——本节地板 = 池最低 −100 百分点,即乘数最低 0 | -| 免伤轮 | 主角该结算受到的伤害为 0 的结算 | -| 充能池 | 伤害A/B 的单轮加法分量来源——开格/首次标中雷按表值累积、战斗段主角先手攻击一次性消费、轮末清零(F6 首次定义) | -| 溢杀 | 一刀超出目标剩余 HP 的部分——直接丢弃,不转移到下一个敌人 | -| 当量 | 统一价值单位,1 当量 = 1 点主角 HP 的期望净变化 | -| 瞬时口径 | 只数一个结算里兑现的价值(本节裁决口径) | -| 全寿命口径 | 乘上它存活的结算次数(仅作派生量,不作锚) | -| 残余盲猜端 | 图上推理不出、只能赌的那一小块 | -| 完美排雷(P_perfect) | 一张板上没插错一面旗、且至少标中一面时,清图奖励翻倍的乘数 | -| 挖穿计价 | 把残余盲猜区全部安全格挖完时平均会踩到多少雷——按雷与安全格在池中均匀随机交错计算,不是每挖一格按初始比例独立重赌 | - -### F0 当量归一口径(weaken 锚裁决) - -**结论**:采用"每结算瞬时当量"口径(每 AP 总暴露分支排除);m_w 值域 [60, 85]、默认 −65;地板交叉层数 = ⌈100/m_w⌉ = 2;B4 参照零漂移,B3 仅行值域修订(registry 回写)。 - -#### 推导 - -| 分支 | schema 可行性 | 后果 | 裁决 | -|---|---|---|---| -| 每结算瞬时当量 | 可行(m_w ∈ [51, 100] 域内) | F2 越域界随移(AP 界 8×m_w / 表界 16×m_w);地板交叉层数 = ⌈100/m_w⌉ = 2;B4 参照零漂移 | **采纳** | -| 每 AP 总暴露 | 不可行——需 m_w > 100,被 percent ∈ [−100, 100] schema 域禁止 | 现实解 = B4 重定最低档参照:safe_cell 活行集中无更弱 buff 行可指,需新增低档行或锚移道具档位——接口漂移 + A4 硬约束①连锁 + 条款①对照表全表重排 | 排除 | - -- **同分母性**:瞬时口径下 weaken 与 defense_up 作用于同一伤害流,"严格大于"在百分点读法与 HP 点读法下等价,锚判定无量纲歧义;总暴露口径引入时长权重(2:1 不对称),把 duration knob 泄漏进锚判定。 -- **机制同构**:B3 本就按结算逐次兑付,瞬时口径是容器原生口径;总暴露需跨结算累计账本,与已锁的"单结算自然边界"(dur=1 每结算清零无存量)冲突。 -- **schema 禁止**:总暴露锚算术需 m_w > 100 越 percent 域,改域 = B3/B4/B1 三侧换算连锁,成本不成比例。 -- **值域依据(@D_ref=12;按现行三输入复核)**:腿一 m_w ≥ 51——65 > 50 严格大于 attack_up 当量 6.0(参照对象 registry 回迁口径,裕度 +30%;池内字面最低档 defense_up −30 当量 3.6 读法下裕度更宽 2.17×——两参照读法均通过,锚判据不受减伤墙批漂移影响);腿二 m_w/100 × D_ref ≥ E_dig → m_w ≥ 38(E_dig = 4.5 面值口径——C3 v3 曲线格子池加权重推;区间读法 4.3–5.1 → 36–43);可行交集下界 = 51(E_dig 口径修正后腿二放宽、腿一回绑);上界 85 = 超出仅在连锁贫瘠板增加裕度,而地板交叉层数恒为 2、边际层早已贬值;schema 顶 100 保留为绝对上界(对应腿二校准上界 ≈1.96:1);下界 60 维持(高于现行可行下界 51——F0 裁决值保守余量,值域修订走 B4/B1 共裁流程非重算批)。 -- **地板规则(B1 clamp 承载,F2 成文)**:每侧 percent 池 clamp ∈ [−100, +100] pp → 乘数域 [0, 2];交叉层数 = ⌈100/m_w⌉ = 2(值域全域恒 2)——第 3 层起边际瞬时当量 = 0;单结算 weaken 池 HP 当量上界 = min(L×m_w, 100)/100 × D_inst(该结算实际裸伤害敞口)。 -- **B3 红警"7 层即触地板"预读更正**:该预读按 −400% 合成带估读;本节地板钉在乘数零点(−100 pp)→ 精确层数 = ⌈100/m_w⌉ = 2——回执同步 B3 OQ1 与 registry `status_effect.anchor_warning`(对账清单 #1/#2);预读实质结论(上调 m_w 的连带成本 = 地板提前到达、边际层贬值)被本裁决吸收。 -- **修订效果量(锚两腿在默认 65 下的读数,provisional @ D_ref=12)**:腿一 7.8 vs 6.0 HP/结算(attack_up 当量——+30%,严格大于 ✓);腿二 7.8 vs E_dig 4.5 HP(+73% ✓);池内字面最低档读法(defense_up 3.6)裕度 2.17×——三读法均通过;历史 −25 值红警复算结论不变(25 vs 50 pp 不过锚 → 修订成立)。 -- **重算复核(B1 重算批)**:锚两腿按现行三输入(duration=1、m_d=−30、C3 v3 曲线 E_dig=4.5)复核通过——腿一 7.8 > 6.0(attack_up 当量,参照对象 registry 回迁口径;裕度 +30%)、腿二 7.8 ≥ 4.5(裕度 +73%);可行交集下界 = 51(腿一回绑),值域 [60,85]/默认 −65 维持(F0 裁决值,共裁修订流程非重算批回收)。 - -| 连带后果项 | 内容 | -|---|---| -| B3 行值 | `StatusEffectTable.weaken.magnitude` −25 → 值域 [60, 85]/默认 −65(registry 回写);B3 AC-14 腿 3 非平凡性复查:16×65 = 1040 越出 percent 域——腿保持非平凡 ✓ | -| F2 越域界随移 | AP 界 = 8×65 = −520%;表界 = 16×65 = −1040%(合成值 B3 原样输出、B1 池 clamp 收口) | -| B4 侧 | 零漂移:defense_up 参照保持 | -| 时长不对称 | 显式接受:defense_up : weaken 全寿命 ≈2:1 不入锚判定——吸收通道 = m_w 上探值域段 + 高光 #3 即时节拍 + duration 为 knob(与 B3 OQ7 playtest 证伪项联动观测) | - -### F1 效果档位当量对照表(A3 条款①——B3 义务⑤ 对照实物落点) - -**结论**:单一线性换算全四源共用(分源改率 = 条款①契约违约);E(·) 单位 = 主角 HP 点;Output Range E ∈ [0, +∞)、全表零负值(floor 语义见 F2——percent 池饱和后边际 E = 0);weaken 修订后每旗 7.8 HP > defense_up 6.0(条款②腿一通过)。 - -#### 推导 - -``` -统一当量定义:E(·) ∈ 主角 HP 点(1 当量 = 1 点主角 HP 的期望净变化;与 B2 ambush 量纲、B4 F6 量纲建议同源) - -单一线性换算式(全部四源共用——分源改率 = A3 F1 条款①契约作废): - flat / 道具类(刀、治疗包、ambush): E = 值本身(HP 点恒等映射;ambush 按 k 个攻击拍线性展开) - percent 类(每结算、每层): E_inst = |L × m| ÷ 100 × D_exp - D_exp = 兑付结算的实际裸伤害敞口;对照表取参考敞口 D_ref - 完美乘数(显式 ÷100,运行时真实双份载体): E_clear(perfect) = power × P_perfect ÷ 100 - (P_perfect ∈ {100, 200}——载体 = 第二份兑付开关,Core Rule 13#2; - 200 ÷ 100 = ×2 = 两件实得,非账面乘数) - 时长(显式乘子,非分源改率): E_life = Σ结算 E_inst = E_inst × 兑付结算数 - -D_ref = SettlementTable.equivalence_ref_damage(单行全局 knob,provisional 默认 12 - = 单结算伏击结构上界 cap×m_amb〔B2 F4 已登记值〕,兼 attack 拍带 [4,16] 与 heavy 带 [8,20] 的中位代表) -``` - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 参考敞口 | D_ref | int | [1, 999] | SettlementTable 配置值(D2 回写义务,本 GDD owner);provisional 12;变更触发全对照表 + 条款③⑤重跑(联动义务) | -| 层数 | L | int | [1, max_stack] | B3 实例字段(授予快照) | -| 行值 | m | int | percent ∈ [−100,100]∧≠0 / flat ≥ 1 | StatusEffectTable 行值快照 | -| 兑付结算数 | — | int | [1, duration_settlements] | 剩余结算次数轨迹;对照表按满寿命取 | -| 道具威力 | power | int | [1, 999] | RewardTable 行值快照(恒定表值——已锁) | -| 攻击拍数 | k | int | [0, unit_count] | 该结算存活敌中 attack/heavy 拍单位数(B2 F4 供给,确定性可算) | -| 完美乘数 | P_perfect | percent | **{100, 200}**(载体域——非整数倍数无运行时载体,域外加载致命) | SettlementTable 配置值;provisional 200(×2 = 双份交付,Core Rule 13#2;换算入账恒 ÷100) | - -**默认根全部活行对照表(值全部 provisional,归 C3;按现行行集重登——两级奖励批八行 + 注入池 + 减伤墙批 m_d=−30):** - -| 行 | 源(source_class) | 类别 | 换算式 | E_inst(每结算/层) | 全寿命 E | 注 | -|---|---|---|---|---|---|---| -| defense_up_basic | safe_cell | buff → defense_up | E_inst = 0.30 × D_ref;E_life = ×duration 1 | **3.6** | **3.6** | 池内字面最低档 buff 当量(减伤墙批 −30 现行值) | -| attack_up_basic | safe_cell | buff → hero_offense | E_inst = 0.50 × D_ref | **6.0** | 6.0 | **锚对照实物(条款②参照对象——registry 回迁口径)**;消费面 = 主角战斗段先手攻击基础分量(F3⓪——attack_up 只乘基础分量、不乘刀与充能分量) | -| spark_aoe | safe_cell | instant_aoe | E = power | —(当场兑付) | 4 | 全体存活敌各 4 点 | -| heal_minor | safe_cell | instant_heal | E = min(power, max_hp − hp) | — | ≤ 4 | clamp 后真实当量;面值 4 = 上界读法(HP 满拒绝率——B4 预警②观测修正) | -| knife_t1 | 注入池(active_inject) | damage_item | E = power | —(库存轨迹量) | 8 | 供给控制器注入——非单格期望摊入(W1 来源语义裁决对侧登记) | -| knife_adv | 注入池(active_inject) | damage_item | E = power | — | 16 | 雾档升级刀 | -| heal_pack | 注入池(active_inject) | heal_pack | E = min(power, max_hp − hp) | — | ≤ 12 | 注入池稀缺强治疗 | -| clear_blast | clear_default | instant_aoe | E = power ×(perfect 板 ? P_perfect ÷ 100 : 1) | —(当场兑付) | 40(完美板 80——**真实双份**:两件实得,非账面乘数) | 条款④⑤载体(F5 消费) | -| weaken | flag_hit | debuff → enemy_output | E_inst = m_w/100 × D_ref | 修订后 65 → **7.8** | 7.8(dur=1) | 修订值域/默认见 F0 | -| ambush | mine_hit | 敌方增益(flat) | E = m_amb × k | k=1 → 3;满配 k=3 → 9 | 同左(dur=1 单结算自然边界) | 量纲已定稿(registry `ambush_unit_definition`) | -| 伤害A 充能 | safe_cell(开格——SettlementTable knob,非 RewardTable 行) | flat 附加分量 | E = min(开格数 × damage_a_per_cell, damage_a_cap) × 甲效/100 | 每轮 ≤ 8 × 甲效/100(对甲A 12 / 无甲 8 / 对甲B 4) | 同左(单轮充能单轮消费) | 充能规格见 F6(W3 补全);逐分量查表后 floor | -| 伤害B 充能 | flag_hit(首次标中——与 weaken 同判定批) | flat 附加分量 | E = 首次标中雷数 × damage_b_per_flag × 甲效/100 | 每雷 2 × 甲效/100(对甲B 3 / 无甲 2 / 对甲A 1) | 同左 | 同 F6;"标中旗双收益线"(weaken + 伤害B 充能)归 W12③ 对账清单 | - -- **锚对照实物(条款②,B3 义务⑤)**:参照对象 = attack_up_basic 行(registry 回迁口径——B3 Rule 10 同款;RewardTable tier=2,effect_id=attack_up)→ 每结算瞬时当量 6.0 HP @ D_ref=12;weaken 修订后每旗 7.8 > 6.0(严格大于 ✓,裕度 +30%);腿二(连锁放大边际基准,provisional 1:1 零链下界):7.8 ≥ E_dig 4.5 ✓(面值口径,C3 v3 曲线重推)。池内字面最低 buff 当量 = defense_up_basic 3.6(−30 现行值)——"最低档"字面读法裕度更宽(2.17×),锚在两读法下均通过;2026-09-11 参照回迁后的预检重跑义务由本批兑现(registry anchor_warning 迁移注记关闭)。 -- **结构性边界注记**:腿二校准上探的可满足上界 = m_w=100 ↔ 相对每结算百分点档 ≈1.96:1——连锁期望放大超过此比值的板形上腿二结构性不可满足(percent 瞬时档被 schema 域封顶);处置 = C3 板形参数(密度/连锁富集)与 m_w 联动约束,非数值修订可解(对账清单 #3/#8——连锁规模分布无既定供给方)。 -- **Example**:一轮挖到 2 个 defense_up(L=2 同实例)→ E_inst = 2 × (0.30 × 12) = 7.2 HP/结算 × 1 结算 = 7.2 全寿命(dur=1——名义值,饱和折减见 F4 敏感性);同轮标中 1 旗 → weaken L=1 → 7.8 HP/结算;踩 1 雷(unit_count=1、attack 拍)→ 该结算敌方附加 +3 HP。 -- **边界注记**:归 B1——本表与单一线性换算的维护、D_ref 与 P_perfect 的 SettlementTable 承载;归 B4——行值/权重/tier/C 供给(F6);归 C3——全部 provisional 数值;归 B3——L×m 合成原样输出(本表输入侧)。 - -### F2 percent→乘数换算与合成地板(B3 义务③收口) - -**结论**:池内加算 → 每池独立 clamp [−100, +100] → 池间乘算 → floor 单一取整(结构性非 knob);免伤轮(D'=0)是合法设计态——不调 apply_damage、产零值伤害行;Output Range D' ∈ [0, ∞) 整数、零负值分支,MVP 实际域 [0, 20](B2 参考带)。 - -#### 推导 - -``` -结算语义映射(SettlementTable 效果语义映射,effect_id 为键——B3 Rule 7 的 B1 侧成文): - attack_up → pool = hero_offense(消费点 = 主角战斗段先手攻击基础分量——F3⓪;attack_up 只乘基础分量) - defense_up → pool = hero_defense - weaken → pool = enemy_output - ambush → flat 附加(B2 F2 后置加法——不入乘区) - -敌→主单伤害实例(每结算、逐攻击行为): - P_pool = Σ(同池实例 L×m) (池内加算——B3 F2 加算语义的对侧承接) - P_pool ← clamp(P_pool, −100, +100) (合成地板:每池独立收口) - M_pool = 1 + P_pool ÷ 100 (换算方向:pp → 乘性因子;域 [0, 2]) - D' = floor( D_raw × M_hero_defense × M_enemy_output ) - (池间乘算;整数域 D' = D_raw × (100+P_h) × (100+P_e) ÷ 10000 向下取整——单一取整规则,结构性非 knob) - D_raw = query_attack(u, L, m_amb).total (B2 F2 分量合成 total;charge 拍 = 0; - 乘区作用于含伏击分量的全裸伤害——weaken 饱和轮伏击分量一并归零) -``` - -**三例逐一读法(B3 EC7 登记例的收口):** - -| 例 | 合成值 | 池 clamp 后 | 乘数 | 读法 | -|---|---|---|---|---| -| weaken AP 界(L=8 × m_w,修订后 65) | −520% | −100 | **0** | 该结算全体存活敌输出归零;第 3–8 层边际瞬时当量 = 0(地板吸收)——明细行如实显示合成值与终值两端(P2) | -| weaken 表界(L=16 × m_w) | −1040% | −100 | **0** | 同上——地板规则不区分越域来源,越域深度仅入合成值显示与诊断计数 | -| defense_up 叠满(L=2 × m_d,现行 −30) | −60% | −60(域内,未触地板) | **0.4** | 该结算 hero 承伤按 0.4× 结算——免伤轮(D'=0)不再由 defense_up 单侧可达(现行可达路径 = weaken 饱和;地板恰边界读法 = 判据函数对 −100 输入的断言腿,非现行行值产物) | - -- **免伤合法性**:enemy 侧 weaken 饱和(单结算零输出)是乘数域 [0, 2] 自然边界内的设计内结果;hero 侧免伤在现行 −30×2 帽(−60%)下不再由 defense_up 单侧可达——免伤轮(D'=0)的现行可达路径 = weaken 饱和或两侧池叠加触底;强度评估(减伤窗口/免伤频率)归 C3 对账联动(B3 Knob 交互同口径),不属地板规则异常。 -- **Example**:D_raw=20、weaken L=2 → P=−130 → clamp −100 → M=0 → D'=0(零值伤害行,不调 apply_damage);weaken L=1 → 20 × 0.35 = 7;再叠 defense_up L=1 → 20 × 0.7 × 0.35 = 4.9 → floor 4。 -- **边界注记**:归 B3——L×m 原样输出不 clamp(B3 义务⑧/EC7 对侧);归 B1——池归属映射、clamp、乘区次序、取整方向;归 C3——池值强度评估。 - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 裸伤害 | D_raw | int | [0, ∞) | B2 F2 total 分量(charge 拍恒 0) | -| 池合成值 | P_pool | int(pp) | 越域可达 ±1040(修订后);clamp 后 [−100, +100] | B3 原样输出 → B1 clamp 收口 | -| 池乘数 | M_pool | 有理数 | [0, 2] | 1 + P_pool/100 | -| 终值 | D' | int | [0, D_raw × 4](两池同 +100 的结构上界;MVP 不可达) | floor 取整 | - -### F3 伤害合成、clamp/溢杀与死亡判定(B2 义务③成文) - -**结论**:三分支全序(主角先手 → 逐敌循环 → 道具段)+ 负值分支禁令(零负伤害/负治疗/负当量)+ 死亡判定:Dead ⇔ hp=0(无负 hp 中间态)、受击即死、hero 死亡战斗段短路、判定段 hero 先判;Output Range 双向伤害 D ∈ [0, ∞)、hp ∈ [0, max_hp]、零转移零存续。 - -#### 推导 - -``` -⓪ 主→敌(战斗段段首,主角先手攻击——基础攻击恒存在〔HeroTable.atk 域 [1,999]、0 加载拒绝〕): - 目标 = B2 default_target()(固定顺位最前存活敌——与道具段②同源) - D_hero_raw = HeroTable.atk ×(1 + attack_up 载荷) + F6 充能分量 - (attack_up = 唯一吃 percent 修正的攻击增益、且只乘基础分量——percent 池加算 F2 语义; - 伤害A/B 为 flat 后置加法、不吃 percent、逐分量甲效查表 floor——F6; - 刀不吃修正的拍板不变——B4 F4) - D_hero = 三分量逐项 floor 后相加(基础分量经 hero_offense 池 clamp 地板——F2);D_hero = 0 → 零值伤害行(同①零值口径) - D_hero > 0 → apply_damage(target, D_hero);hp 归 0 → Dead(受击即死——死亡即不动手) - 明细行 source_class = hero_attack(新增来源值——接口漂移随批,target 字段照常) - 存活敌清空 → 敌方循环空转(零行动行),径入衰减段 -① 敌→主(战斗段,逐存活敌,行主序生成序;结算内调用序钉死 query_attack → apply_damage → advance——B2 义务①): - D_raw = query_attack(u, L, m_amb).total (L = 本结算伏击池读值——授予段后的当轮值;charge 拍 = 0) - D' = F2 换算(语义映射 → 池加算 → clamp 地板 → 乘区 → floor) - D' = 0 → 不调 apply_damage,产零值伤害行(分量二元组 + 终值 0) - D' > 0 → apply_damage(hero, D');hp' = max(hp − D', 0)(递减与 floor 0 由 B2 承载) - 溢杀部分(D' − 受击前 hp)丢弃——无存续、无转移、无负 hp 态 - hero hp' = 0 → 战斗段立即短路(剩余敌本结算不作用、不产行动明细行——Core Rule 10) -② 主→敌(道具段,窗口选定件——至多一件,单件制): - D = power(恒定表值,不吃任何 percent 修正——已锁;零乘区) - 目标 = B2 default_target()(固定顺位最前存活敌;死亡后顺延) - apply_damage(u, power);hp 归 0 → Dead(受击即死——道具段与战斗段同款;指针冻结 = 抢杀窗口) - 溢杀丢弃、不转移下一敌(下一件道具才打下一个目标) - 施加时已无存活敌 → 照常消耗(Used 不可逆)+ "已消耗未生效"明细行(B4 E10 承接,守卫不对称——Core Rule 9) -③ 负值分支禁令:任何公式分支不得产生负伤害/负治疗/负当量——percent 池地板 [−100, +100](F2)、 - flat 值 ≥ 0、hp ∈ [0, max_hp]、治疗 clamp 上界 max_hp(B4 F4 对侧:hp' = min(hp + power, max_hp))、 - apply_damage 入参 n ≤ 0 = B2 API 拒绝 + 诊断——D'=0 腿由此改走零值行(①) -④ 死亡判定数值边界:Dead ⇔ hp = 0(无负 hp 中间态);时机 = 受击即时(敌)/ 战斗段短路(hero); - 判定段 = 防御性优先级 hero 先判(双死结构不可达的纵深防御——Core Rule 12:我方伤敌在道具段与 - 战斗段主角先手攻击、均先于敌方行动兑付;敌方伤我在主角攻击之后——敌行动时点若已敌全灭则先判胜) -``` - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 裸伤害 | D_raw | int | [0, ∞) | B2 F2 total;分量二元组 {baseline, attach} 进伤害行(P2 归因) | -| 乘区终值 | D' | int | [0, ∞) | F2 输出;floor 取整 | -| 目标 hp | hp | int | [0, max_hp] | B2 单位状态;递减与 floor 由 B2 承载 | -| 道具威力 | power | int | [1, 999] | RewardTable 授予时快照(恒定) | -| 溢杀量 | — | int | [0, D') | 丢弃(会计面:明细行 value = D'、击杀标记布尔——不记溢出量) | - -- **Example**:goblin(atk=4)L=2 → D_raw=10;weaken L=1 → floor(10 × 0.35) = 3;defense_up L=1 同结算 → floor(10 × 0.5 × 0.35) = 1;knife_adv(power=8)打 hp=6 的敌 → hp 归 0 → Dead、溢杀 2 丢弃、击杀标记进流水、下一件刀打顺位后继。 -- **边界注记**:归 B2——递减/floor 0/Dead 翻转/指针冻结;归 B1——本式全序、调用序、零值行、溢杀丢弃语义、死亡判定时机(B2 义务③的对侧兑现)。 - -### F4 条款③挖掘风险不等式闭合(B1 单一闭合 owner;B2 义务④兑现) - -**结论**:**现行值链(duration=1 × m_d=−30 × C3 v3 曲线 d0.25/t0.88)下两参考板形破线**(锚行口径 L1 ≈0.48× / L2 ≈0.47×;期望口径 0.60×/0.58× 同向);满配 unit_count=3 深度破线;旧"通过"回执退役为历史记录(见结论①);破线升格 C3 默认曲线级约束;actuals p10 交付后强制重跑。 - -#### 推导 - -``` -配对口径(B1 闭合定义——B2 F4"等量换算与不等式闭合归 B1"的兑现): - 决策单位 = 单格挖掘;评估点 = 残余盲猜端最坏点(信息端平凡通过,一并登记) - 主式:P(安全) × V_safe > P(雷) × V_mine - - 适用域守卫:(1 − ι) × |S| < 1(残余盲猜集为空)⇒ 主式不评估、 - 由信息端平凡腿接管——零赌博板形不产生破线误判(P(雷) 式在空池退化,禁代入) - - P(雷) = |M| ÷ (|M| + (1 − ι) × |S|) (残余盲猜端上界:全部雷对 (1−ι)|S| 个残余安全格的池) - P(安全) = 1 − P(雷) - V_safe = E_life(最低档安全格 buff) = (|m_d|/100) × D_ref × duration_d - (现行值链:0.30 × 12 × 1 = 3.6。原"= D_ref 恒等式"(0.5 × D_ref × 2)随 duration=1 - 〔两级奖励批〕与 m_d=−30〔减伤墙批〕消解;V_safe = 锚行(最低档 buff = defense_up_basic) - 满寿命当量,低于跨行期望口径的差距同步收窄——E_dig 现值 4.5,见验算表注) - V_mine = k_max × m_amb = unit_count × m_amb (单雷边际敌方增益当量上界:1 雷 = 1 层伏击; - 默认行值 1×3 = 3;cap 溢出使第 cap+1 颗雷边际当量 = 0 → 灾难轮不等式自收紧) - - 信息端检查(平凡腿):P(安全) = 1(免赌集内)→ V_safe > 0 恒成立——"推理有回报"的登记面 -``` - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 实际雷数 | \|M\| | int | [1, W×H−9] | A1 产物指标/行参数推导 | -| 安全格数 | \|S\| | int | ≥ min_safe_count | 同上 | -| 可推理率 | ι | float | [0.85, 1] | **actuals p10(A1 F4 报告 C)**——未交付前以行 target 代 = 判式面的保守代理(target ≥ 实际 p10 → P(雷) 偏高 → 主式更难过;低 ι 的真实代价不经本式入账——报告 C 交付按总暴露核对消费);重跑义务(对账清单 #6) | -| 防御行值/时长 | m_d / duration_d | int / int | −30 / 1(provisional——减伤墙批/两级奖励批现行值) | StatusEffectTable defense_up 行 | -| 参考敞口 | D_ref | int | [1, 999] | provisional 12 → V_safe = 3.6 | -| 伏击量纲/单位数 | m_amb / unit_count | int | 3(provisional)/ [1,3] | B2 行值 | - -**重算验算(C3 v3 行值总表代理:10×10 与 12×12 均 d0.25/t0.88;全部 provisional,actuals p10 交付后强制重跑):** - -| 板形 | ι(target 代 p10) | P(雷) | 左臂 = P(安全)×3.6 | 右臂 = P(雷)×3 | 裕度 | 判定 | -|---|---|---|---|---|---|---| -| L1(v3:10×10 d0.25,\|M\|=23,\|S\|=77) | 0.88 | 23/32.24 ≈ 0.713 | 1.03 | 2.14 | **≈0.48×** | **✗ 破线** | -| L2 腿(v3:12×12 d0.25,\|M\|=34,\|S\|=110——换锚注记见下) | 0.88 | 34/47.2 ≈ 0.720 | 1.01 | 2.16 | **≈0.47×** | **✗ 破线** | -| 满配语境(unit_count=3,V_mine=9,L1 板) | 0.88 | 0.713 | 1.03 | 6.42 | **≈0.16×** | **✗ 破线(深度)** | - -- **换锚注记**:旧验算的"L1 10×10 d0.10 / L2 12×12 d0.12"系 A1 schema 自洽参考行(registry mvp_reference_rows,非曲线行);本批两腿统一换锚 C3 MVP 行值总表 v3(L1 D0/D1 板 10×10、D2–D4 板 12×12,全轴 d0.25/t0.88)——L2 腿即 v3 曲线内最大常规板形;C3 L2 关卡行值填充批(OQ1)交付后随 actuals 重跑复核。 -- **双口径读数(防虚高裕度误用)**:上表左臂按锚行当量 V_safe=3.6(A3 条款③"最低档 buff 当量下界"的合同读法);按跨行期望口径(左臂 = P(安全)×E_dig,E_dig=4.5 面值口径)复算:L1 ≈0.60×、L2 ≈0.58×——二元结论不变(两板形、两口径全破)。 -- **结论①(重算回执)**:现行值链下两参考板形破线——登记"通过"回执失效(旧读数 ≈2.0×/2.6× 的三个旧输入:duration=2 / m_d=−50 / v1 曲线参考行);信息端平凡腿不变(零赌博板形不产生破线误判——P(安全)=1 → V_safe > 0 恒成立)。 -- **结论②(满配语境)**:unit_count=3 深度破线(≈0.16×)——原 C3 调参约束维持并升格(见④)。 -- **结论③(敏感性)**:B4 预警④ buff 饱和的结构性零兑付使 V_safe 名义值高估——按 0.6 折减(provisional)复算 L1:左 0.62 vs 右 2.14 → 裕度 ≈0.29×(更薄);折减系数与饱和率随 playtest 重校。 -- **结论④(破线升格——曲线级约束)**:基线板形已入破线区,约束从"unit_count>1 行放行判据"升格为**默认曲线的 V_safe 侧杠杆重议**——候选杠杆 = m_d 回调 / duration 恢复跨轮 / D_ref 联动上调 / 板形侧密度×ι 联动对(d0.28 回退先例)/ m_amb 下调;全部处"禁独立调参"联动网络(m_w↔D_ref↔m_d↔duration_d——🔴-1③ 同网),修正方向须 C3 提案 + B1 闭合对账共裁,本重算批如实登记读数、不代裁修正。 -- **与 clause3_supply 2.3× 预检的对齐**:该预检系"pp 代理左臂 × cap 右臂"的巧合近似——量纲混用且右臂取结算聚合上界与单格决策单位错配(多计 cap 倍);本闭合改统一 HP 当量 + 边际配对 → registry `clause3_supply.direction_precheck` 退役为历史记录、回执登记重算值(对账清单 #3)。 - -### F5 条款⑤清图 vs 弃图支配性闭合(B1 单一闭合 owner) - -**结论**:条款⑤未闭合——挖穿残余池计价下主判式两态为负(L1 仅完美双份翻正 +2.7,非完美态被支配),实现率折减与多敌语境更差;"推到底"的支配性只在残余集小时自然成立;判据函数角色 = C3/B4 调参约束生成器,AC-40 断言输出与登记约束包一致。 - -#### 推导 - -- **计价口径**:清图必须挖穿残余盲猜区——随安全格被挖走,池内雷占比持续上升,挖穿全部残余安全格的期望踩雷 ≈ |M|×n_s/(n_s+1)(均匀交错模型);逐格按初始比例独立重赌的口径漏计全池挖掘量(模型漏项,actuals 校准无法吸收)。 - -``` -主判式(决策点 = "确定格挖完";策略对 = 推到底清图 vs 停手攒 RAP 刷新): - Δ_clear = [R_res + C_eff] − [X_res + Δr × s_ref] ≥ 0 - - n_s = (1 − ι) × |S| (残余盲猜安全格数——评估点同 F4; - 适用域守卫:n_s < 1(残余集为空)⇒ 主判式不评估、信息端平凡腿接管) - E[踩雷] = |M| × n_s ÷ (n_s + 1) (挖穿残余池期望踩雷——均匀交错模型; - n_s 增大时趋近 |M|:高盲板清图必然踩到几乎全部残余雷) - R_res = n_s × E_dig (残余安全格奖励期望当量) - C_eff = C × (perfect ? P_perfect ÷ 100 : 1) (C = 清图奖励当量 = power 恒等〔clear_blast = 40〕; - perfect 谓词 = 板级零误标 ∧ ≥1 标中——Core Rule 13;×2 = 真实双份交付〔Core Rule 13#2〕) - X_res = E[踩雷] × V_mine (挖穿全池雷险期望当量——V_mine 同 F4) - Δr = ⌈(n_s + E[踩雷]) ÷ AP_r⌉ (轮数差 = 残余区期望总挖掘次数上取整——安全格 + 踩雷格 - 均耗 AP;雾态增量叠算见注) - s_ref = D_ref (结算强度参考 = 当量参考敞口——同一 D_ref,单一换算) - E_dig = 格子池加权(2026-09-14 重算批口径——刀/强治疗已移出格子池入注入池, - 不摊入单格期望;E[战斗获取] ≈ 1 由注入机制另计) - = (20×E[attack_up] + 16×E[defense_up] + 16×E[spark_aoe] + 15×E[heal_minor]) ÷ 67 - = (20×6.0 + 16×3.6 + 16×4 + 15×4) ÷ 67 ≈ 4.5 HP - (治疗按面值 = 上界读法——实现率折减入敏感性腿,同 F4③) - -显式假设登记:停手侧的 RAP 机会收益按 零 计价(RAP 边际效用不入判式—— -图源充裕时 RAP 边际低,零价假设对"推到底"偏利一分;本假设下 verdict 已为负, -若 C3 为 RAP 计价则结论只会更负——模型边界成文,非遗漏)。 - -保守地板式(A3 F1 条款⑤原文形式的可判定化——残余奖励不计入的下界要求): - C_eff ≥ X_res + Δr × s_ref -``` - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 残余盲猜安全格 | n_s | float | [0, \|S\|] | (1−ι)×\|S\|;**域守卫:n_s < 1(残余集为空)⇒ 主判式不评估、信息端平凡腿接管**(零赌博板形不误判) | -| 挖穿期望踩雷 | E[踩雷] | float | [0, \|M\|] | 均匀交错模型 \|M\|×n_s/(n_s+1) | -| 清图奖励当量 | C | int | ≥ 1(A3 条款④) | B4 供给(clear_blast power=40,provisional) | -| 完美乘数 | P_perfect | percent | **{100, 200}** | SettlementTable 配置值;provisional 200(真实双份交付——Core Rule 13#2;换算入账恒 ÷100) | -| 单格奖励期望 | E_dig | float | (0, ∞) | 格子池加权推导(现行 4.5——v3 曲线/现行行集;评审口径带 ≈4.3–5.1,实现率/敞口敏感性浮动);实现率折减敏感性同 F4③ | -| 轮行动点 | AP_r | int | [1, 32] | A3 ActionEconomyTable(默认 8) | -| 雾负担比 | fog_burden_ratio | float | [0, 1] | A1 产物指标(付费格分母口径)——雾态 Δr 修正输入 | - -**四态验算(v3 曲线 + E_dig=4.5 面值口径 + C=clear_blast 40/完美 80;全部 provisional):** - -| 板形 | n_s | E[踩雷] | X_res | Δr(代价) | R_res | Δ_clear(C=40 / 完美 80) | 判定 | -|---|---|---|---|---|---|---|---| -| L1 无雾态(v3:10×10 d0.25,ι=0.88,\|M\|=23,\|S\|=77) | 9.24 | 20.8 | 62.3 | 4(48) | 41.6 | **−28.7 / +11.3** | ✗ / ✓ | -| L2 腿(v3:12×12 d0.25,ι=0.88,\|M\|=34,\|S\|=110——换锚同 F4) | 13.2 | 31.6 | 94.8 | 6(72) | 59.4 | **−67.4 / −27.4** | ✗ / ✗ | -| L1 × 满配语境(unit_count=3,V_mine=9) | 9.24 | 20.8 | 186.8 | 4(48) | 41.6 | **−153.2 / −113.2** | ✗ / ✗ | -| L2 腿 × 满配语境 | 13.2 | 31.6 | 284.5 | 6(72) | 59.4 | **−257.1 / −217.1** | ✗ / ✗ | - -- **实现率折减口径**(E_dig′ = 2.70 provisional——B4 预警②④联动):L1 = −45.3 / −5.3;L2 = −91.2 / −51.2——同向更差(完美翻正腿亦被折减吞没)。 -- **雾态增量(fog_burden_ratio 口径)**:雾格 = 雾元知识可推理安全格(P(安全)=1)→ 属确定格、两策略同挖、不进残余集;雾的条款⑤效应 = 链不可达雾格的全价 AP 抬高轮数——Δr 增量 = \|U\| × dig_ap_cost ÷ AP_r(A1 例板 U=4 → 0.5 轮;v3 曲线复算:(29.99 + 4) ÷ 8 = 4.25 → 上取整 5——较无雾基线 Δr=4 **+1 轮,增量不再被同轮吸收**,登记读数变化);雾池档位加成对冲入 R_res 侧(E_fog 读数见护栏 A——本批读数失效待重推);actuals fog_burden_ratio p50/p90 交付后重跑(对账清单 #6)。 -- **结构性解读**:残余盲猜区越大(n_s ↑),清图的全池雷险越逼近"踩到全部残余雷"——"是否承担盲猜风险是策略点"(game-concept 设计本意)被本判式定量证实;v3 曲线(d0.25/t0.88)使残余集系统性变大、非完美态被支配加深——与 F4 破线同源(曲线加难侧未同步补偿结算侧奖励/防御杠杆);完美高光与清图支配性互 feed 的设计意图保留(L1 完美双份翻正 +11.3),但非完美态仍负 = 被支配。 - -**C3/B4 约束包:** - -| 项 | 约束 | 裁决方 | -|---|---|---| -| ① C 量级上调整向 | 保守地板需求 L1 ≥ 110.3 / L2 ≥ 166.8(v3 曲线重推;现值 C=40 / 完美 80——缺口 **70.3 / 126.8**;原 46.1/91.8 需求系 v1 曲线旧值链产物,退役为历史记录);任何上调与护栏 B 口径联动复核 | B4/C3 | -| ② 或裁"清图非严格支配"为设计态 | 与 A4 定价硬约束②(清图锚随雾负担上浮——MVP 结构性不可闭合)同向;如裁设计态,A3 条款⑤注记的 P1 对冲弱化须同步声明,弃图率雾板分层观测加权监控 | C3(①②二选一) | -| ③ 多敌联动 | 满配语境深度为负与 F4 破线同向——unit_count > 1 行的放行判据 = 条款③⑤在全部登记行组合下同时成立(现行基线已破,判据自动收紧至曲线级重议——与 F4 结论④并案) | C3(双条款并案) | -| **C3 裁决回执(C3 修订批)** | **② 采信(非支配设计态)+ 计价基元换位重推**:clear_default 槽 clear_knife→clear_blast(instant_aoe 当场兑付全体存活敌,C = power = 40)——缺口重推 = 46.1−40 = **6.1**(L1)/ 91.8−40 = **51.8**(L2,v1 曲线口径);C 量级不上调 ✓;P1 对冲弱化同步声明已落 C3 OQ4、弃图率加权监控持续;actuals 交付后按 clear_blast 语义强制重跑(AC-40 同批口径,registry clause5_dominance.c3_ruling) | C3(已裁——①②二选一落定) | -| **B1 重算批重推回执(2026-09-14)** | v3 曲线 × E_dig=4.5 重推:主判式 L1 −28.7/+11.3(完美翻正)、L2 −67.4/−27.4、满配 −153.2/−113.2 与 −257.1/−217.1;保守地板需求 110.3/166.8(缺口 70.3/126.8);**裁决② 维持**(qualitative 结构不变:非完美态负、完美态 L1 翻正、L2 全负——真人零弃图初裁 OQ4 不受读数漂移影响);护栏 A/B 读数挂旧值链(见下表注)——W2 复核随 C3 收口批三选一落档 | B1(重算回执登记) | - -**两条方向性护栏(挖穿残余池口径下复核;读数挂旧值链——W2 复核待重推,见注):** - -| 护栏 | 判据 | 读数 | 突破条件 | -|---|---|---|---| -| A 雾板净当量优势带(B4 pricing_constraints③ 的 B1 判据;与残余池模型无关) | 每链不可达雾格净优势 = (E_fog − E_dig) − s_ref ÷ AP_r | 登记读数 (11.1 − 7.2) − 1.5 = **+2.4 ∈ (0, 3]**(v1 曲线/旧格子池口径);**2026-09-14 重算批方向性复核**:E_dig 修正 4.5 + 雾池构成变更(刀移出格子池——现行雾池加权当量 ≈4.9 面值口径)→ 读数 ≈ **−1.1 < 0,越下界**(雾纯税化风险——链不可达雾格全价 AP 成本超过当量增量);E_fog 现行池构成下的正式重推随 W2 批(C3 收口批三选一落档),本批登记方向性读数、不代裁 | E_fog > 11.7 → C3 雾池联动禁区,禁独立调参(判据式不变——阈值随重推复核) | -| B 防钓鱼——退化板刷清图奖励(输入登记:① \|S\|_min = min_safe_count 是 A1 行级 knob,调参时按当期行集重算、禁写死 50;② \|R₀\|_max = 20 系参考带经验值、无登记供给方 → 登记 A1 产出义务 R₀ 规模分布上界(F4 报告 C 扩列,缺口预检 9);③ DPS 期望严格读数的敌 DPS 参照系 v1 曲线 atk 值(4/4/6)——v3 atk(7/5/9/6/9)+50% 后 DPS 界随之上探,正式重推随 W2 批) | 上界判据 = ⌈(\|S\|_min − \|R₀\|_max) ÷ AP_r⌉ × s_ref ÷ 2 ≈ ⌈(50−20)/8⌉ × 12 ÷ 2 = **24**(D_ref 口径——与敌 DPS 无关,读数不受 v3 换锚影响) | 登记双读数(v1 曲线口径):D_ref 口径上界 24 → C_eff = 16 ≤ 24 ✓ / DPS 严格读数上界 ≈8 → C_eff = 16 越(clear_knife C=8/完美 16 口径);**W2 复核事项(跨评审已登记)**:C3 修订批将 C 提至 clear_blast 40/完美 80 后对两上界越线 1.7–10×——复核被跳过、三选一裁决(上界改判/接受+强化监控/回调 C)随 C3 收口批落档;本批不代裁 | 结构承载 = A1 min_safe_count + 布雷数下限 + A2 R₀≠S 三闸(B1 侧判据为对账复核,非运行期校验) | - -**P_perfect 默认值建议与相容性:** - -| 条 | 内容 | -|---|---| -| 建议 | ×2(SettlementTable.p_perfect = 200,provisional,调参所有权 C3;运行时载体域 {100, 200}) | -| ① | 单一线性换算不破坏——乘子作用于 C 当量换算之后、换算 ÷100 已成文(F1 对照表行内显式列),非新增分源换算率(条款①合规) | -| ② | 与条款⑤同向且是现参数下唯一使 L1 翻正的杠杆(+8.0)——完美高光与清图支配性互 feed;非完美态仍负 → C 量级上调约束不因 P_perfect 消解 | -| ③ | 触发谓词 = 板级 flag 记录(零误标 ∧ ≥1 标中),与踩雷正交(盲挖踩雷不破坏 perfect,标错旗才破坏——以"标旗未中"零值行留痕,Core Rule 5.2) | -| ④ | RAP 刷新路径零清图奖励 → 无 perfect farming 环(双份兑付不改此性质——刷新图无兑付点) | -| ⑤ | 与 F0 weaken 修订同向(标中旗价值 ↑ → perfect 可达性 ↑——高光 #2/#3 互 feed) | -| ⑥ | 上界受护栏 B 约束(登记读数 16 ≤ 24 系 v1 曲线 D_ref 口径;C=40/完美 80 越线裁决随 W2——完美加成不得触碰钓鱼线) | - -### F6 伤害A/B 充能与护甲克制结算(charge_and_armor——W3 规格补全;机制与结算归 B1,四字段数值投值归 C3) - -**结论**:伤害A/B 为挖掘期充能、战斗段主角先手攻击一次性消费的 flat 附加分量——池内加算、**不吃任何 percent 修正**(attack_up 只乘基础分量——B4 F4 同族拍板)、逐分量查 `armor_effectiveness` 甲效表后 floor 相加;充能池单轮生命周期(挖掘期累积 → 本轮战斗段消费 → 轮末归零,跨轮零存量);Output Range D_hero ∈ [0, ∞) 整数、零负值分支。 - -#### 推导 - -``` -累积(B1 facts 缓冲承载——零新事件、零特判): - A 池 = min(本轮 cell_revealed{kind=safe} 事件数 × damage_a_per_cell, damage_a_cap) - (累积时点 = 每轮挖掘期逐格充能——initial/chain/dig 全通道同待遇;cap 封顶 = 连锁轮失控 - 对冲,cap=0 = 不封顶结构位;damage_a_per_cell=0 = 机制关闭合法极端) - B 池 = 本轮 flag_judged{hit=true ∧ 资格未消费} 事件数 × damage_b_per_flag - (累积时点 = 授予段旗判定批——与 weaken 兑付同源判定、每雷实例一次去重〔资格键同 - A3 OQ5 口径〕;无 cap 字段——标中旗吞吐由 AP 预算天然限界) - -消费(战斗段主角先手攻击——F3⓪,单结算一次性清池): - base = floor( atk × (1 + clamp(P_hero_offense, −100, +100)/100) ) (percent 只作用于基础分量) - dmg_a = floor( A 池 × 甲效[dmg_a][target.armor_type] ÷ 100 ) - dmg_b = floor( B 池 × 甲效[dmg_b][target.armor_type] ÷ 100 ) - D_hero = base + dmg_a + dmg_b (逐分量查表 floor 后相加) - 甲效表 = SettlementTable.armor_effectiveness(键集 {base, dmg_a, dmg_b} × {none, a, b} 结构冻结; - 默认 base 恒 ×100 / dmg_a:a=150 b=50 / dmg_b:b=150 a=50——特化 ×150/无甲 ×100/对位 ×50; - 数值 knob 归 C3;armor_type 映射归 EnemyTable) - 轮末:A/B 池清零(与 decay 段同拍——跨轮零存量) -``` - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| A 池 / B 池 | — | int | [0, damage_a_cap] / [0, ∞) | 本轮充能池读值(B1 自持,公开可读——P2 还原面) | -| 伤害A 三参数 | damage_a_per_cell / damage_a_cap | int ≥ 0 | 默认 1 / 8(provisional 归 C3) | SettlementTable knob;cap=0 = 不封顶 | -| 伤害B 参数 | damage_b_per_flag | int ≥ 0 | 默认 2(provisional 归 C3) | SettlementTable knob | -| 甲效值 | e | int percent | {50, 100, 150}(现行默认矩阵取值域) | armor_effectiveness 查表;base 行恒 100 | - -- **验算(表读值记号,默认矩阵)**:对甲A 敌(bugbear)10 格挖掘轮——A 池 = min(10×1, 8) = 8 → dmg_a = floor(8×1.5) = 12;2 首标 B 池 = 4 → dmg_b = floor(4×0.5) = 2;base = 6(零 attack_up)→ D_hero = 20。对甲B 敌(ogre_chief):dmg_a = floor(8×0.5) = 4、dmg_b = floor(4×1.5) = 6 → D_hero = 16——甲B 对策 = 伤害B 充能(C3 联动网络 #6)。无甲敌(goblin):8 + 4 → D_hero = 18。 -- **cap 截断腿**:15 格连锁轮 A 池 = min(15, 8) = 8——溢出 7 格零充能、无"溢出未生效"行(充能非奖励、无兑付语义),截断仅入诊断计数。 -- **边界注记**:与乘区关系——A/B 分量在 percent 池乘区之外(敌→主乘区 F2 不作用于 hero→敌方向;hero_offense 池只乘基础分量);与 B4 刀同族——加法增量分量一律不吃 percent;P2 归因——A 池来源 = 开格(逐格可归)、B 池来源 = 首次标中旗(与 weaken 同判定批——"标中旗双收益线"归 W12③ 对账清单);明细行 = hero 伤害行分量二元组 {baseline = 基础分量, attach = dmg_a + dmg_b 合计}(A/B 拆分经充能池公开读值可还原,P2 不丢失);归属——机制与结算归 B1(本节 + F3⓪),四字段数值投值归 C3,甲型映射归 B2 EnemyTable。 - -### 边界参数总表 - -| 参数 | 边界 | 默认 | 出处 | -|---|---|---|---| -| percent 池 clamp | [−100, +100] pp,每池独立收口 | — | F2 | -| 池乘数域 | [0, 2](= 1 + pp/100) | — | F2 | -| m_w(weaken 行值) | [60, 85] | −65 | F0 裁决(瞬时当量口径) | -| 地板交叉层数 | ⌈100/m_w⌉ = 2(值域内恒 2) | — | F0 | -| P_perfect 载体域 | **{100, 200}**,域外加载致命 | 200(×2 双份交付) | Core Rule 13 | -| D_ref(当量参考敞口) | [1, 999] | 12 | SettlementTable | -| HeroTable.atk | [1, 999],0 加载拒绝 | 6 | 2026-09-11 拍板 | -| 伤害 D' | 整数 [0, ∞),零负值分支 | — | F3 | -| D' = 0 | **不调** apply_damage,产零值伤害行 | — | 负值分支禁令 | -| 取整 | floor,单一规则(结构性,非 knob) | — | F2 | -| 溢杀 | 丢弃,不转移、无负 hp 态 | — | F3 | -| 治疗 | hp' = min(hp + power, max_hp) | — | F3 | -| 伤害A 充能 | 单轮池 ≤ damage_a_cap(0 = 不封顶);轮末清零 | 1/格 · cap 8 | F6 / SettlementTable | -| 伤害B 充能 | 首次标中雷每雷一次去重;无 cap(AP 预算天然限界);轮末清零 | 2/雷 | F6 / SettlementTable | -| 甲效矩阵 | 键集 {base, dmg_a, dmg_b} × {none, a, b} 结构冻结;逐分量查表 floor 后相加 | 特化 ×150 / 无甲 ×100 / 对位 ×50 | F6 / SettlementTable | - -### 显式排除声明(归属表) - -| 对象 | 归属 | 依据 | -|---|---|---| -| P_perfect 乘数值(×2 provisional——真实双份交付载体,运行时域 {100,200})与其调参 | **C3** | Core Rule 13(机制本体归 B1,数值归 C3) | -| D_ref、E_dig、裕度目标带等全部本节 provisional 数值 | **C3**(调参)+ B1(对账重跑义务的执行方) | 各式 Variables | -| m_w 修订终值 | **B4/B1 锚 owner 共裁**(值域与默认建议由 F0 给出),调参所有权 C3 | B3 Rule 10 / A3 条款② | -| 敌我表值曲线(atk/hp/cap/unit_count/pattern) | **C3**(B2 行值供给) | B2 Tuning Knobs | -| 奖励行值/权重/tier/C 量级与差异化分支 | **B4/C3** | B4 F6 / A3 条款④ | -| 雷密度/可推理率/雾负担 actuals 分布 | **A1**(F4 报告 C 生产者) | A1 登记口径 | -| 清图总预算"够不够"的判、战斗长度/轮数曲线、遭遇构成 | **A1/A3 契约、C1/C3** | A1 F3 排除声明 | -| RAP 经济(刷新价、转存) | **A3** | A3 Rule 11 | -| 结算明细的呈现(高光行/零值行/聚合计数的可见形态) | **D1/B5** | Core Rule 14 | -| B1 只拥有:统一当量换算规则(F1)、乘区/地板/取整语义(F2)、clamp/溢杀/死亡判定数值边界(F3)、条款③⑤不等式的闭合判据与配对口径(F4/F5)、明细行协议的数值字段 | **B1** | A3 F1 五条款 + B2 义务③④ + B3 义务③⑤ | - -### 对账登记义务清单(本节落定后的回写义务) - -| 编号 | 登记内容 | 对侧 | 状态 | -|---|---|---|---| -| 1 | registry `status_effect.anchor_warning` 裁决回执:归一口径 = 每结算瞬时当量(总暴露分支关闭——schema 域禁止 + 重定参照路径不采纳);m_w 修订值域 [60, 85]/默认 65;"7 层触地板"预读更正(地板 = 乘数零点 −100 pp,交叉层数 = ⌈100/m_w⌉ = 2);参照对象 = attack_up 当量(registry 回迁口径) | registry / B3 | 已回写(2026-09-10 回执;重算复核更新腿读数) | -| 2 | registry `status_effect.mvp_content.weaken` + B3 GDD 行表/Tuning Knobs:magnitude −25 → 值域 [60, 85]/默认 −65(接口漂移回写);B3 AC-14 腿 3 非平凡性复查回执(16×65 = 1040 越域 ✓);B3 OQ1/OQ6 关闭回执 | registry / B3 | 已回写(2026-09-10) | -| 3 | registry `clause3_supply.direction_precheck` 闭合回执:统一当量重算值双口径登记(边际配对),pp 代理退役为历史记录;破线 → C3 调参约束登记 | registry / C3 | 已回写(2026-09-10)+ 2026-09-14 重算回执(现行值链破线读数) | -| 4 | registry 新条目 `clause5_dominance`:F5 主判式(挖穿残余池计价)+ 未闭合登记与 C3/B4 约束包(C3 已裁②非支配设计态)+ 两护栏结论 + actuals 重跑义务 | registry / C3、B4 | 已回写(2026-09-10)+ 2026-09-14 重算回执(v3 曲线读数) | -| 5 | registry `reward_table`/`reward_config` 注记:C_eff 口径(P_perfect 入账规则——÷100 成文 + 真实双份交付、载体域 {100,200};当量 = power 恒等);attack_up 死行注记已随基础攻击恒存在批退役(对照表现行 = attack_up 活行) | registry / B4 | 已回写(2026-09-10 回执;死行注记随基础攻击复活退役) | -| 6 | registry `board_gen_table.inferability_vs_p_safe` 消费回执:P(安全) 代理公式(残余盲猜端上界式)+ actuals p10 输入接线路径(A1 F4 报告 C) | registry / A1 | 待回写 | -| 7 | D2 SettlementTable schema(B1 回填 owner)+ registry `settlement_table` 条目(十二字段 = 原八字段 + damage_a_per_cell / damage_a_cap / damage_b_per_flag / armor_effectiveness——护甲克制批) | D2 / registry | 已回写(2026-09-10 回填;2026-09-14 随 W3 字段更新) | -| 8 | systems-index 门禁记录:B1 强制检查点三项(条款①②③⑤)裁决落定登记;A3 OQ1(对照表)、B4 OQ5(T_fog_min 推导式——对照表已落定,改推导式与否由 B4 裁)/OQ6(weaken 联动)状态回写。附注(新缺口):第二腿校准所需的连锁规模分布(c̄)无既定供给方——登记 A1 报告 C 扩列或 A2 telemetry 的归属 OQ | systems-index / B3、B4 | 待回写 | - -## 状态 - -| 状态 | 进入条件 | 行为/出口 | -|---|---|---| -| Uninit | 冷启动 / 清理完成 | 唯一出口 `begin_battle` | -| BattleSetup | `begin_battle` 受理 | 战斗开始序列;任一步拒绝 = fail-fast 上抛 | -| RoundActive | `notify_round_start` | 不干预挖掘,只缓冲事件流 | -| RoundWaiting | 轮次结束事务达成 | 执行七段结算;窗口段为唯一玩家输入点 | -| BattleOver | 判定段产胜负 | 战斗结束序列 → Uninit | - -**编排不变式**:同一时刻至多一个结算事务在飞(窗口为事务内暂停点非并发入口);段序恒全序执行(战斗段短路是段内规则非跳段);全部跨系统调用集中在 B1——任一下游被 B1 以外语调用 = 架构违约(AC-43 静态扫描域)。 - -## 边界情况 - -| 条件 | 行为 | 依据 | -|---|---|---| -| 末图清图即胜利(cleared 与 battle_over 同结算) | 授予段先兑付清图奖励(含完美判定)→ 窗口当轮可选用 → 道具段照常 → 战斗段空转(无行动行)→ 衰减照常执行 → 判胜 → battle_over 清理;未选用件随 clear_inventory 消亡 + 反馈行 | B4 E15 | -| 战斗段 hero hp=0 | 立即短路——剩余敌不作用、不产行动明细行,径入判定段判负;短路后衰减段照常执行(结算完整性优先) | Core Rule 10 | -| 判定时 hero 与最后敌同时 hp=0 | 结构不可达(我方伤敌均先于敌方行动兑付);防御规则 = hero 先判 → 判负(纵深防御) | Core Rule 12 | -| 减伤/削弱合成后 D'=0 | 不调 `apply_damage`(B2 对 n≤0 拒绝——负值分支禁令实现面),改产零值伤害行(分量二元组 + 终值 0)——免伤与零输出必须可见 | 负值分支禁令 | -| 伤害超过目标剩余 hp(溢杀) | 溢出丢弃——无存续、无转移、无负 hp 态;行 value=D'、击杀标记为布尔(不记溢出量) | F3 | -| 敌为 charge 拍而本轮踩雷 | 伏击授予照常执行(授予段先于战斗段);query_attack 返回零作用 → 本结算伏击池全部蒸发(dur=1 轮末清零);战斗段零伤害;明细 = 授予行 + 蓄力行("这轮踩的雷白喂了"可对照) | B2 EC8 | -| 全体存活敌同拍 charge | N 行蓄力行、零 apply_damage、hero 承伤 0——合法状态非错误 | B2 EC | -| 伏击池 L=0 时敌攻击 | D_raw = 纯基线 atk(分量二元组 {atk, 0})——零伏击是 L=0 的自然读值非缺失分支 | B2 F2 | -| 同窗提交多件 | 仅首件受理生效,余件零调用 + 编排违例诊断;满血使用守卫保留为纵深防御(跨结算场景仍可达) | Core Rule 7 / AC-16 | -| 治疗包 power 超过当前缺血 | hp' = min(hp + power, max_hp) 部分回复、不拒绝(满血 = 零收益拒、超量 = 部分收益——两分支语义互斥) | F3 | -| 选定刀施加时已无存活敌 | 照常消耗(Used 不可逆)+ 逐件"已消耗未生效"明细行(零效果判定读 B2 存活集);单件制下不可达、逻辑保留为防御分支;战斗段照常空转推进 | B4 E10 / AC-20 | -| 窗口打开时库存为空 | 跳过恒合法;呈现面 D1 可整体不弹窗;结算段序零停顿继续 | B4 E8 | -| 挖掘期刷新 RAP 不足 | `request_refresh` 返回 false、状态不变 → `refresh_board` 原样上抛拒绝(刷新拒绝不是编排错误,是玩家决策的合法结果) | A3 EC13 | -| 同轮多次刷新成功(cap 内) | 每次成功独立走 `refresh_board` 全序(retire → generate → install → roll_board 恰一次/图)——挖掘期当场连刷合法;每次 generate/roll_board 消费新 scope;第三次提交 → cap 拒绝 | A3 EC15 | -| stopped/ap_exhausted 轮 | 出口分发恒 same_board(本编排无刷新提交面);回发 new_board = B1 违约(绕过 RAP"支出唯一")→ fail-fast 上抛 | A3 Rule 11 | -| 换图生成产物带非法产物标记 | 编排不拒绝产物(玩家永不卡死),上抛玩家侧呈现请求(数据面 = 非法标记;提示/补偿/回退形态归 D1);A2 `install_board` 若拒绝(不变式违例)= 程序级错误 → fail-fast(非玩家域) | A1 EC5 | -| battle_over 清理序列中某调用被拒 | debug 诊断 + 编排纪律修复;幂等守卫(各侧 false + 诊断)兜底,不中断清理序列剩余步骤(防半清理态跨战斗泄漏) | 编排纪律 | -| 战斗中表热重载请求 | `set_reload_gate(true)` 已置位 → D2 门拒绝返回 false | D2 EC8 | -| 衰减段调用时容器已空 | `decay_round()` 返回 0——合法结果、零明细行或聚合零计数 | B3 EC13 | -| 清图槽身份为 buff 且授予时已满层 | 零兑付 + "奖励未生效"行(合法例外);完美板高光行降级不发(完美谓词仍成立,当量入账 = 实际兑付 0);若仅第二份被拒(首份已落地)→ 高光行照发、value = 首份当量 + "奖励未生效"行一条 | B4 E11 / Core Rule 13#2 | -| 完美排雷谓词在 RAP 刷新图上 | 刷新图不产生清图奖励(无兑付点)→ P_perfect 不触发;板级 flag 计数随每次 board install 重置(跨图不累积) | Core Rule 13 | -| 板内既有标中又有误标 | 完美谓词不成立 → 正常兑付(无高光行)+ 本轮首个误标判定产"标旗未中"零值行(highlight=`perfect_broken`;重复上报去重)——零误标是全有或全无谓词、无部分完美档 | Core Rule 5.2 | -| 多敌(unit_count=3)同结算攻击 | 行主序逐敌执行循环、共享同一 L(池共享不消耗);任一敌作用后 hero 死亡 → 短路中止剩余敌(顺位即威胁序的可观测面) | Core Rule 10 | -| 道具段击杀造成死亡即不动手 | 该敌 Dead 后战斗段 `query_alive` 已不含它——不出现行动行(缺席即指针冻结的明细面);抢杀兑付 = 击杀标记进流水(感知数据前置) | Core Rule 9 | -| 零威胁组合(行 atk=0 ∧ cap=0) | 战斗可胜但零风险 = 内容态配置错误(hero atk=0 已被 HeroTable 域下界结构杜绝,战斗恒可定局);护栏 owner = 实现期 ADR/D2 跨字段校验;B1 观测锚 = 战斗轮数异常遥测(进 C3/OQ 清单) | B2 OQ9 并案 | -| 结算开始时 hero hp=0 | 结构不可达(hp=0 只产生于战斗段 → 短路直入判定段);防御断言:窗口打开前置检查 hero 存活,违反 = debug 断言(编排违例显式暴露) | 编排自守 | - -## 依赖 - -**上游**(除 C1/C2 外全部 Approved——B1 是项目首个全部玩法上游均已 Approved 的系统,无 provisional 上游假设): - -| 系统 | 性质 | 接口要点 | 状态 | -|---|---|---|---| -| D2 | hard | SettlementTable schema 承载(B1 回填 owner)+ ConfigDB 读取 + `set_reload_gate()` 唯一调用方;零结算随机流(流封闭不变) | Approved | -| A3 | hard | F1 五条款下游契约(B1 = 条款①②③⑤闭合 owner)+ `refresh_board` 挖掘期刷新编排 + `notify_settlement_done`/`notify_combat_end` 回发 + `last_round_end` 读取 | Approved | -| A2 | hard(订阅) | 三事件流订阅(facts 缓冲;A2 唯一回边的订阅端)+ `install_board`/`retire_board` 调用方 + Waiting 相位观测量 = 结算触发条件;事件到达序不承载语义 | Approved | -| B2 | hard | 单位接口全调用面(spawn/query_*/apply_damage/advance/default_target/ambush_grant_plan/despawn_all)+ B2 义务①–⑥ | Approved | -| B3 | hard | 状态容器五 API 全调用面 + B3 义务①–⑧;weaken 锚红警裁决 owner(F0 检查点) | Approved | -| B4 | hard | 奖励/库存十 API 全调用面 + B4 义务①–⑥(roll_board 恰一次 / 关卡末清库快照计数 / usable_now 组装) | Approved | -| A1 | 间接 hard 接线 | `generate(L, D)` 换图编排调用方 + actuals 分布 p10 对账输入(F4 报告 C)+ attempt 边界非 scope 事件 + EC5 零合法板 B1 半边上抛 | Approved | -| A4 | 对账锚(零运行时接口) | 条款⑤三腿入账(雷险消解/信息双向/AP 腿)+ 两方向性护栏 + 雾格零特判(B1 无变异分支) | Approved | -| C1/C2 | provisional | encounter 上下文 (L, D, hero_hp) 供给(begin_battle 入参);跨战斗 HP 持久性;战斗触发 | 未设计——MVP 冒烟直供(入参封装隔离) | - -**下游**: - -| 依赖方 | 性质 | 接口 | -|---|---|---| -| D1 | hard(数据供给,未设计——第 10 位) | 结算明细流水 = 统一数据源契约(Core Rule 14 行协议);承接呈现义务台账:A2×6 / B2×4 / B3×4 / B4×5 / B1 新增 ×3(高光行强调、完美排雷呈现、EC5 零合法板提示)——缺项即 blocking,随 D1 GDD 门禁评审核对 | -| B5 | soft(垂直切片) | 结算步骤流 = 战斗动画回放脚本源;溢出行/origin_cell 玩家可读形态(B3×B5×2 数据源) | -| D4 | soft(Alpha) | 音频挂点 = 明细行类型流(B4 音频挂钩点事件源) | -| D5 | soft(Alpha) | 教学口径数据源(来源标注/RAP 清零/库存清空/满层溢出/蓄力拍贪雷——经 B1 流水兑现) | -| C3 | soft(provisional) | 条款③⑤对账结果 = 调参约束输入(unit_count>1 破线约束 / 保守地板缺口 / 护栏 A/B 突破条件);P_perfect/D_ref 调参所有权 | - -- 双向一致性核对(systems-index 依赖分层表):B1 ← A3,B2,B3,B4,D2(第 3 Feature 层)· D1 ← A2,A3,B1 · B5 ← B1,D1 · D4 ← A2,B1 · D5 ← A2,A3,B1 · A2 事件面 referenced_by 含 B1(订阅边)。 -- C3 消费 B1 对账结论的事实依赖成立——C3 GDD 定稿时须回写索引(对账输出 = 调参约束清单,非运行时接口)。 - -## 呈现与 UI 契约(数据面义务——B1 无自有渲染面,呈现归 D1/B5) - -| 编号 | 数据面义务 | 归属/呈现 | -|---|---|---| -| 1 | 结算明细屏 = MVP 战斗本体:数据源 = Core Rule 14 流水行协议;每行 `value` 数值在暗色底上须高对比(明细屏是 MVP 数字密度最高的屏) | 屏级布局/节奏/滚动形态归 D1/B5 | -| 2 | 行类型区分 = 形状+色相双通道:未生效四类行(奖励未生效/已消耗未生效/使用被拒/溢出未生效)必须携带形状冗余(icon/划线等),防色弱玩家把"没生效"误读为普通行 | D1/B5 | -| 3 | 高光行数据面:perfect_sweep 高光行、标中旗 `highlight` 标记、清图奖励行 H2 强调标记——B1 只锁行字段;未生效类行按聚合计数呈现(数据可聚合字段已入协议) | 强调形态(放大/描边/音画同步)归 D1;`target`/`effect_id` 是多敌归因呈现与 icon/极性映射的直接数据源 | -| 4 | 零值伤害行可见性:免伤轮/零输出轮的零值行不得被"零值不显示"优化吞掉(归因链断点) | D1/B5 | -| 5 | 音频挂钩点(D4,Alpha)= 明细行类型流:道具(入库)/效果/伤害/判定/高光行 + 负反馈聚合(未生效类行数 >0 时单次结算至多一次——防逐行惩罚轰炸) | 挂点事件源归 B1 流水 | -| 6 | 道具使用窗口载荷 = B4 `query_inventory` 投影 + B1 组装的 `usable_now` 预判字段(满血治疗包禁选);选择序收集/跳过/窗口时机指示/触发政策归 D1;窗口选择序列 = 回放输入事件;窗口期输入与棋盘不竞争(单意图帧先例) | D1 | -| 7 | 结算明细屏数据锚 = 终局判定行(胜负画面的数据锚) | D1 | -| 8 | UX Flag:本系统有 UI 贡献(结算明细屏 + 道具使用窗口)——Phase 4 运行 /ux-design 为其创建 UX 规格先于编写 epics,引用 design/ux/[screen].md 而非本 GDD | systems-index 备忘(Phase 5d) | - -## Tuning Knobs - -### SettlementTable schema(单行全局,B1 回填 owner——Rule 4 豁免:单行全局常量/结构表,HeroTable/ActionEconomyTable 先例) - -| 字段 | 类型/域 | 默认 | knob | 说明 | -|---|---|---|---|---| -| equivalence_ref_damage(D_ref) | int [1, 999] | 12 | ✓ | 当量参考敞口(F1);变更触发全对照表 + 条款③⑤对账重跑(联动义务,禁独立调参) | -| p_perfect | percent **{100, 200}** | 200 | ✓ | 完美排雷清图奖励第二份兑付触发(100 = 仅高光无第二份、200 = 真实双份交付);非整数倍数乘数无运行时载体,域外加载致命;上界受护栏 B 约束(双读数 24 / ≈8——裁决归 C3) | -| segment_order | StringList | [grant, item_window, buff_debuff, item, combat, decay, verdict] | ✗ 结构冻结 | 段序骨架的零字面量载体(拍板序);加载期校验恒等于拍板段序,违例致命(防实现乱序静默漂移) | -| source_label_map | Dictionary(source_class → 文案键) | 封闭枚举全覆盖 | ✗ 结构冻结 | source_class → D1 呈现文案映射键(P2 归因呈现侧数据源);键集 = B3 source_class ∪ {道具/判定扩展, enemy_action, flag_miss, hero_attack};新增键 = 接口漂移 | -| effect_pool_map | Dictionary(effect_id → pool) | attack_up→hero_offense · defense_up→hero_defense · weaken→enemy_output · ambush→flat_attach | ✗ 结构冻结 | 效果语义映射(F2);新 effect_id 上线须随批登记映射,悬空 effect_id = 加载期致命(引用型字段 dangling_ref_policy) | -| pool_clamp_lo / pool_clamp_hi | int(pp) | −100 / +100 | ✗ 结构冻结 | percent 池地板域(F2);乘数域随之 [0, 2](全表共八字段) | -| round_direction | enum {floor} | floor | ✗ 结构冻结 | 乘区取整方向(F2——单一取整规则,结构性非 knob) | -| damage_a_per_cell | int ≥ 0 | 1 | ✓ | 伤害A 开格充能/格(护甲克制批——充能与结算归 B1 战斗段,C3 投值) | -| damage_a_cap | int ≥ 0 | 8 | ✓ | 伤害A 单轮充能封顶(0 = 不封顶——防连锁轮失控) | -| damage_b_per_flag | int ≥ 0 | 2 | ✓ | 伤害B 标雷充能/首次标中雷(每雷实例一次去重) | -| armor_effectiveness | Dictionary {base, dmg_a, dmg_b} × {none, a, b} | 特化 ×150 / 无甲 ×100 / 对位 ×50 | 键集 ✗ 结构冻结 / 数值 ✓ | 伤害类型 × 护甲克制矩阵——主角攻击三分量(基础/伤害A/伤害B)各自查表后 floor 相加;敌种甲型映射归 EnemyTable.armor_type | - -- **加载校验**:effect_id 主键唯一(ConfigDB 既有);effect_pool_map 键 ⊆ StatusEffectTable 活行集(跨表悬空致命——B4→B3 首引激活先例同款);segment_order 违例致命;p_perfect ∈ {100, 200}(载体域,域外加载致命;100 = 完美必须 ≥ 不加倍的机制语义下界)。 - -### Knob 表 - -| Knob | 默认 | 调过高 | 调过低 | -|---|---|---|---| -| equivalence_ref_damage | 12 | 全当量表膨胀 → 条款③左臂虚高、锚裕度失真(重跑强制) | 当量坍缩 → weaken 锚第二腿破线(m_w ≥ 60 下界的前提失效) | -| p_perfect | 200 | 载体域封顶 200(C 量级上调走 B4 clear 池 knob,须与护栏 B 口径联动复核:防钓鱼线 D_ref 读数 24 / DPS 严格读数 ≈8) | =100 → 第二份兑付不触发(完美仅剩高光行、无实质增量——情绪奖励感最弱档,机制空转) | - -- **非 knob(结构冻结,修订走 GDD 流程非调参)**:段序骨架、乘区结构(两池乘算)、floor 取整、池 clamp 域、明细行协议、零随机、结算触发 = Waiting 相位、调用序(query_attack→apply_damage→advance)、衰减恒执行。 -- **Knob 交互**:D_ref × m_w × m_d × duration_d(锚两腿与条款③ V_safe 共用 D_ref——🔴-1③:defense_up.magnitude/duration 已纳入"禁独立调参"联动网络;B4/B1 共裁 m_w、C3 投 m_d 时须同步核对 D_ref 并重跑条款②③⑤);p_perfect × C(clear 池当量)——护栏 B 联动;D_ref × 条款⑤ s_ref(同值引用——改 D_ref 即改结算强度参考,两条款重跑);damage_a/b × armor_effectiveness × EnemyTable.armor_type——C3 联动网络 #6(敌种甲型变更须复算 Boss/普通战 K 区间)。 -- **调参所有权**:全部 knob provisional 归 C3;每次调参须重跑 F1 对照表 + 条款②③⑤预检并同步 registry(接口漂移义务——B2/B4 同款条款);actuals p10 交付后的强制重跑义务见对账清单 #6。 - -## 验收标准 - -### 测试口径 - -| 口径 | 要点 | -|---|---| -| 测试载体 | Core-Battle 全集成冒烟:`godot --headless --script`(脚本 extends SceneTree 以获得 quit(code);ConfigDB/RngService autoload 由脚本显式实例化) | -| 真假声明 | 真 A3(相位机全 API)+ 真 B2/B3/B4(class_name 直引实例化;多敌腿复用 `enemy_multi_unit` 夹具根)+ 真 A2 规则引擎(板走既有登记规格 b_spawn/b_flag/b_batch/b_chain/b_fog/b_mine_walk;挖掘/插拔/停手经 `settle_batch` 真驱动——冒烟扮演 D1 提交意图) | -| A1 桩 | 程序构造产物桩:换图 generate 调用点按登记序列返回 schema 坐标级程序构造板;每次调用经 `open_stream("board_gen")` 取号恰一次(与真 A1 取号契约同构,scope 轨迹断言真实);attempt 重试不重开 scope 的语义归真 A1(deferral);真 A1×A2×B1 端到端集成冒烟与 A1×A2 双包含端到端同槽(生效条件 = A1 实现落地) | -| C1/C2 | provisional:`begin_battle(encounter)` 入参冒烟直供(encounter 坐标复用 B2 行集登记 (L_g,D_g)/(L_a,D_a);hero_hp 按腿直供 max_hp/低值/缺血压值) | -| D1/B5 断言面 | 未设计 → 步骤流捕获列表(主断言面)+ 回发捕获(notify_settlement_done/notify_combat_end)+ set_reload_gate 调用捕获;窗口选择与刷新意图 = 冒烟扮演 D1 经 B1 提交面注入 | -| A2 事件载体 | 事件外发载体(signal vs 回调)归实现期 ADR——依赖真 A2 事件流驱动的 THEN 子集在 ADR 落地前为纸面契约;备选 = A2 半真(事件注入面直喂 facts 缓冲 + A3 真,断言口径不变);本节优先真 A2 全集成,半真仅为 ADR 前过渡载体 | -| 被测面 | `begin_battle(encounter)` · 窗口选择提交面 · 刷新意图提交面(refresh_board 挖掘期刷新编排)· 结算事务(内部触发,经 A2/A3 驱动到达);段序断言 = 步骤流行序(授予类行 < 窗口标记 < 效果行 < 道具行 < 伤害/蓄力行 < 衰减行 < 判定行——全序断言) | -| 只读观测量 | A3 ap/rap/phase/last_round_end · B2 query_alive/query_beat/query_attack/default_target · B3 query_active(六归因字段+快照载荷)· B4 query_identity/query_inventory · RngService 公开 scope 计数器(board_gen/reward_roll 双流——roll_board/generate 恰一次的观测面)· 诊断收集器 | -| 期望值纪律 | 全部 knob 按当前 ConfigDB 表读值推导、不写死;记号:D_ref(equivalence_ref_damage)/ P_pf(p_perfect)/ m_w(weaken.magnitude)/ m_d/D_a/M_a(defense_up)/ m_amb(ambush.magnitude)/ c_r(所在行 cap)/ a_g/h_g(goblin)/ a_e/h_e/m_e/u_c_f(bugbear)/ M_h(HeroTable.max_hp)/ A_h(HeroTable.atk)/ p_i(RewardTable.power)/ AP_r | -| 结构定值断言 | 合法集:segment_order = 拍板序、pool_clamp_lo/hi = −100/+100、round_direction = floor、effect_pool_map 四键、armor_effectiveness 键集 {base, dmg_a, dmg_b} × {none, a, b}、行类型封闭枚举 13 类、公共字段 + 行类型特有字段分层、source_label_map 键集封闭(含 enemy_action/flag_miss/hero_attack) | -| SKIP 与生效前提 | 依赖修订后基线的腿(如 m_w ≤ −51 使 2 层即越域;m_d=−30 使 defense_up 叠满脱离地板边界读法)前提不满足时输出显式 SKIP 防 CI 静默、不假失败;registry 对账 AC(AC-41)在回执落地前失败 = 裁决未兑现的正确信号(不写软口径)——现行回执在案(F0 裁决批 + 重算批),AC-36/41 按现行值链断言 | -| 登记常数 | A2 板登记常数与 B2 行集登记坐标直接复用不重制;B1 新增 σ 登记轨迹(身份依赖腿——如"双治疗包""刀全灭敌""清图槽身份",master=42、经 derive_at 测试通道推导、预推进按 B4 时序口径)+ 登记构造序列(板 × 意图序 × 期望行数);登记后第二人独立推导复核,失效处置 = 先复核登记、无误即实现缺陷;每用例先 `reset_diagnostics()` | -| 夹具策略 | 默认根 b1_default = D2 全表清单 + SettlementTable 默认行(D_ref=12 / P_pf=200 / 拍板段序 / source_label_map 封闭全覆盖 / effect_pool_map 四键 / clamp −100/+100 / floor / 充能三参数 1·8·2 / 甲效矩阵默认值);致命根 ×3 独立进程:b1_segorder_bad(段序置换)/ b1_poolmap_dangling(ghost_effect 键)/ b1_pperfect_oob(p_perfect=99);SettlementTable schema 程序构造承载域校验全谱;板 = A2 既有板规格复用;行为夹具根经 `--data-root=` 注入(仅 debug、不入 data/tables/);各 AC 声明其板/根、用例间无顺序依赖 | -| 致命类收窄 | 恰三行致命 manifest(独立 headless 进程、游戏通道):segorder_violation → ≠0 · poolmap_dangling → ≠0 · pperfect_oob → ≠0;负空间声明(编排自守 fail-fast 断言——new_board 违约守卫、窗口打开前置 hero 存活断言、一事件双转化守卫、单一结算事务在飞——违规路径不可由公开 API 构造)不经冒烟断言、不入 manifest,行为级证据 = 正腿断言 + AC-43 静态扫描;其余致命类别由 D2 AC-2 同类别 loader 级夹具承载 | -| out-of-scope | D1 呈现全域(生效条件 = D1 义务台账 A2×6/B2×4/B3×4/B4×5/B1×3 登记,缺项即 blocking)· B5 消费与可读形态 · D4/D5 音频教学(数据源 = 本节流水行)· C3 全部 provisional 数值(每次调参重跑 AC-35/36/37/39/40/44 对账族——D_ref × m_w × m_d × duration_d 禁独立调参)· A1 actuals p10 重跑 · 条款⑤护栏 playtest 观测面(弃图率雾板分层/速杀退化/零伤害死局遥测——B1 仅供遥测锚)· m_w 修订终值 · flag_miss 惩罚源路径 · C1/C2 真实供给 · 深度高光形态 · 事件外发载体 ADR · attempt 重试细节 | - -### AC 清单(Given-When-Then,编号不变) - -| AC | Given | When | Then | 覆盖 | -|---|---|---|---|---| -| AC-1 | `b1_default` 经 `--data-root` 注入干净加载 | 冒烟脚本读 SettlementTable | 八字段在位:segment_order ≡ 拍板序 `[grant, item_window, buff_debuff, item, combat, decay, verdict]`(结构定值恒等断言);effect_pool_map 四键逐一 = 定稿映射;clamp −100/+100、round_direction=floor;D_ref 仅域断言 [1,999]、P_pf 域断言 {100,200};source_label_map 键集 ⊇ B3 source_class ∪ {道具/判定扩展, enemy_action, flag_miss, hero_attack};同根跑 B4/B3/B2 默认根加载零跨表冲突诊断 | Core Rule 16 / schema 定稿 | -| AC-2 | segment_order 置换根 `b1_segorder_bad`(如 item_window 与 combat 互换) | 独立 headless 进程游戏通道加载(collect_only=false) | 进程非 0 退出且错误清单含 segment_order 类别(防实现乱序静默漂移的进程级落点) | Core Rule 16/4 | -| AC-3 | 映射含 `ghost_effect` 键根 `b1_poolmap_dangling` | 独立进程游戏通道加载 | 非 0 退出、错误含跨表悬空类别(引用型字段 dangling_ref_policy) | Core Rule 16 | -| AC-4 | SettlementTable schema 类直引实例 | `validate()` 作用于 p_perfect ∈ {99, 150, 1000} | 各含域错误类别(载体域 {100,200}——非整数倍数无运行时载体);p_perfect = 100 与 200 零诊断;腿 2:`b1_pperfect_oob` 独立进程加载 → 非 0 退出(manifest `pperfect_oob`) | Core Rule 16/13 | -| AC-5 | 全新 B1(Uninit)+ 真 A3(Idle)+ 真 B2/B3/B4 全新实例 + A1 桩登记首板 b_spawn + master=42 | `begin_battle(encounter)` | 步骤流/调用捕获全序恰一次:set_reload_gate(true) → B3 notify_battle_start → **encounter 骰(unit_count 区间定本战实际数量——遭遇随机化增补)** → B2 spawn(override 数量)→ A2 install_board + B4 roll_board → A3 notify_round_start(phase=Active);**encounter scope = +1**、reward_roll scope = +1、board_gen scope = +1(各恰一 scope);query_alive(enemy) = 本战实际数量个行值快照单位(默认根 unit_count=1 定值行骰退化为 u_c);A2 事件捕获含初始展开批;B3 query_active 双侧空 | 编排专章战斗开始序列 / Core Rule 16① / B4 义务⑥ / C3 修订批 X-6 | -| AC-6 | 构造至 A3 Waiting 且 last_round_end 可用(stopped 轮——经真 A2 `settle_batch([stop])` 到达) | 腿 1:结算事务受理;腿 2:装载层置换 {flag_judged 批, round_end} 两组到达先后分别驱动(捕获-重放,不增设 B1 注入 API) | 腿 1:触发判定只读 A3 相位与 last_round_end(事件捕获序 = A2 管线序,结果正常);腿 2:两遍结算步骤流逐行相同(到达先后不承载语义) | Core Rule 2 / A2 义务① | -| AC-7 | b_flag 满构造结算(挖掘 ≥1 奖励格 + 插 (1,4) hit 旗 + 停手收轮;σ 登记使奖励格含道具类身份) | 结算事务解析 | 步骤流行序全序断言:授予段行 < 窗口标记(open——段界锚)< close/skip < 效果行 < 道具行 < 伤害/蓄力行 < 衰减行 < 判定行;任一段缺行以段界锚与行类型域断言序(空段合法);窗口标记恒存在(零选择 = skip 恒登记);segment_order 表值经 AC-2 恒等拍板序——实现读表驱动非硬编码 | Core Rule 4 / B4 义务① / Core Rule 14 | -| AC-8 | b_batch 部分挖掘后 stopped 收轮、结算完成(判定行 = 继续) | 出口分发 | 回发捕获恰一条 notify_settlement_done(same_board) → A3 notify_round_start(Active、ap=AP_r 硬重置、rap 保留);A2 板状态延续(旗集/已开集不变);board_gen/reward_roll scope 计数器零变化 | 编排专章继续腿 / A3 Rule 5 | -| AC-9 | b_flag 登记构造轮(挖掘 n 格含 m₀ 雷格 + 插 f 旗含 h₀ hit) | 轮末结算;同轮事件批重复投递(装载层故障注入) | 每格受理恰一次:B4 grant 恰 n_safe 次、B2 ambush_grant_plan 恰 1 次、apply_effect(weaken) 恰 h₀ 次、apply_effect(ambush) 恰 granted 次;处理序 ≡ A2 cell_revealed/flag_judged 行主序(B3 义务①落地);重复投递 → 步骤流与容器终态 = 单次投递结果(缓冲去重);B3 不去重、B4 幂等仅兜底(诊断零"重复受理") | Core Rule 3/5 / B3 义务①② / B2 义务② / B4 义务② | -| AC-10 | σ 登记挖掘格身份含 buff 类与道具类各 ≥1(腿 1);b_spawn install 后首轮(初始展开 35 格已发生——channel=initial、reward_eligible=false)(腿 2) | 授予段解析 | 腿 1:buff 格 → apply_effect(effect_id, source={safe_cell, origin_cell, round_index})(六归因字段逐一 = 调用实参);道具格 → stock(item)(库存逐件来源 {cell, round} 可归);即时类当场兑付:instant_aoe = 逐存活敌 apply_damage(u, power) + 单条伤害行(target=all_enemies + count 字段)、instant_heal = clamp 回复 + 治疗行(满血 → "奖励未生效"行零兑付)——零 stock 零窗口;B4 只定"给哪行"、层数语义归 B3 合并(同轮双 buff 格 → 单实例 L=2);腿 2:grant/stock/apply_effect 捕获全零(R₀ 不入奖励库);channel 字段零特判(同板 chain/dig 格正常入库成对照) | Core Rule 5.1 / A2 义务② | -| AC-11 | σ 登记使同轮/邻轮 defense_up 达 M_a 层满 | 第 M_a+1 层授予受理(B3 apply 返回 false) | 产"奖励未生效"行:零折算、携带可聚合计数/批次字段、source 归因完整;B3 容器逐字不变(拒绝原子);连锁批量授予溢出 = 显式接受(b_chain 13 格批量腿:溢出件逐件入行、零转换补偿) | Core Rule 5.1 / B4 义务② / B3 义务⑧邻接 | -| AC-12 | b_flag 插 (1,4) hit 收轮(腿 1);续轮再停手(A2 重报 {(1,4), true})(腿 2);拔 (1,4) 重插再收轮(腿 3);AC-28 换图后新板同坐标旗靶(腿 4);插 (0,3) miss 旗收轮(腿 5) | 结算 | 腿 1:apply_effect(weaken, source={flag_hit, (1,4), round_index}) 恰一次 + 效果行携带 highlight 标记 + 资格消费入集合;腿 2:零 weaken 兑付、零明细行(重复兑付从未发生)+ debug 诊断可选、资格集合不变;腿 3:仍零兑付(资格以雷格实例为键);腿 4:兑付恢复(新实例资格重置);腿 5:"标旗未中"零值行恰 1 条(source=flag_miss、value=0、highlight=perfect_broken、聚合计数)+ 续轮重报零新增行(每雷实例一次去重)+ 换图新板重新产行 | Core Rule 5.2 / A2 义务③ / Core Rule 13 | -| AC-13 | b_spawn 挖尽未开 8 格触发 cleared + σ 登记清图身份(腿 1);σ 登记清图身份 = defense_up 且已满层(腿 2);AC-28 场景 refresh 图(腿 3) | 结算授予段 | 腿 1:grant_clear() 恰一次(同批次重调幂等兜底——诊断零新增)、兑付分流同 AC-10(source=clear_reward)、当轮窗口即可选用;腿 2:零兑付 + "奖励未生效"行 + 完美板高光行捕获零次(首份即零兑付不发高光;完美谓词仍成立,对账入账 = 实际兑付 0);对照腿:仅第二份被拒(首份落地)→ 高光行在案且 value = 首份实际当量 + "奖励未生效"行一条;腿 3:refresh 图 grant_clear 捕获零次(roll 照常、兑付不调) | Core Rule 5.3 / B4 义务③ / B3 OQ4 | -| AC-14 | b_flag 登记构造轮:单轮挖掘雷格 mines_r = 6(登记走位序列;cap = c_r = 4 表读值) | 结算授予段 | ambush_grant_plan(6, c_r) 恰 1 次 → {granted=4, overflow=2}(守恒);前 4 颗(事件规范序)逐颗 apply_effect(ambush, source={mine_hit, origin_cell, round_index})(B3 伏击池 L=4);overflow 2 颗逐颗产"溢出未生效"行(含来源 + 聚合计数);战斗段各敌伤害行 attach 分量 = 4×m_amb(池读值即时性);轮末衰减行 k 含伏击实例(dur=1 蒸发);重复投递判别同 AC-9 | Core Rule 6 / B2 义务②⑥ / B3 义务⑧ | -| AC-15 | 战斗中 hero 满血 + σ 登记库存含治疗包(腿 1);扮演 D1 强制提交满血治疗包(腿 2);提交多件 [刀₂, 刀₁] / 单件 / 零选择(腿 3);无库存轮(腿 4) | 结算到达窗口段 | 腿 1:窗口清单 = query_inventory 投影 + B1 组装 usable_now(治疗包 false——B1 读 B2 hero hp 判定,B4 诊断零"血量查询"新增);伤害道具恒 true(窗口打开时存活敌 ≥1);腿 2:"使用被拒"行 + 包 InStock 不变(use 未调);腿 3:多件 → 仅首件受理(违例诊断、刀₂生效刀₁不消耗);单件 → 生效;skip → 窗口标记 close/skip、段序零停顿、库存不变;腿 4:窗口标记照常 skip(呈现政策归 D1——数据面 = 窗口清单空) | Core Rule 7 / B4 义务④前半 / D1 义务②对侧 | -| AC-16 | begin_battle hero_hp = M_h − 2 + σ 登记库存含治疗包 ×2(power = p_i) | 窗口提交 [包₁, 包₂] | 仅包₁受理生效(治疗行 hp' = min(M_h−2+p_i, M_h)——部分回复钳满)、包₂零调用(InStock 不变)+ 编排违例诊断("窗口至多选用一件");满血守卫保留为纵深防御(跨结算场景仍可达:本结算被拒后下一结算窗口再判) | Core Rule 7/EC / B4 义务④ | -| AC-17 | 同轮两次 weaken 授予(互异 origin_cell)(腿 1);defense_up 行与 weaken 行同轮(腿 2);`enemy_multi_unit` 根同轮 weaken L=1(腿 3) | 增益/减益段解析 | 腿 1:效果行恰 2 条(按 apply_effect 调用流水展开、非按容器单实例),每行 origin_cell 逐一 = 授予值、effect_id=weaken、value = 该次授予贡献值(L×m_w 投影)、pool_value = 池合成值(两行各 −65 贡献、pool_value = −130——合成值不入 value 字段);腿 2:效果行 pool 字段经 effect_pool_map 自 effect_id 派生 = hero_defense / enemy_output;腿 3:全体存活敌伤害行均含减伤合成且 target 逐一可归(side-wide 多敌兼容读法) | Core Rule 8 / B3 义务③⑤⑦ | -| AC-18 | 同结算 weaken L=1 存活 + σ 登记库存含刀(腿 1);`enemy_multi_unit` 根 + σ 登记刀 ×3(每结算至多一件、跨结算序列)(腿 2);hp=2 残敌 + p_i=4 刀(腿 3) | 道具段 | 腿 1:伤害行 value = p_i 恒定、零乘区(分量字段无池修正项——"不吃任何 percent 修正"的行级判别);腿 2:每条伤害行 target = default_target() 返回(顺位最前存活敌)、击杀标记出现于目标 hp ≤ p_i 的件、[0] 死后下一结算顺延 [1]→[2]、击杀标记共 3 个;query_beat 冻结(指针冻结进流水);后续结算战斗段 query_alive 不含它、零行动行;腿 3:死、行 value = p_i、击杀标记布尔、无溢出量字段、零转移(下一件打 default_target 后继) | Core Rule 9 / B2 义务⑤ / B4 义务④ | -| AC-19 | hero 满血 + 库存治疗包(腿 1);AC-20 场景敌已全灭 + 满血 + 提交治疗包(对照腿) | 提交选择 | "使用被拒"行、零 use 调用(不烧包);满血守卫 = 表局部判定(max_hp 对比)、敌全灭构造下仍拦截(守卫不读存活集的不对称可判定形式);clamp 部分回复见 AC-16 | Core Rule 9 / B4 义务④ / EC | -| AC-20 | 单件制 + 窗口结构推论(窗口打开时存活敌 ≥1 ∧ 单件恒打顺位最前存活敌) | 负空间声明(违约路径不可由公开 API 构造) | 窗口提交的刀恒有目标——"已消耗未生效"行在单件制下不可达;零效果判定逻辑保留为防御分支(读 B2 存活集),恢复多件制时本 AC 随批复活;击杀标记断言由 AC-18 腿 2 承载 | Core Rule 9 / B4 义务④ / EC | -| AC-21 | encounter=(L_g,D_g) 单 goblin(腿 1);(L_a,D_a) 连续结算(腿 2);全结算 advance 捕获(腿 3);`enemy_multi_unit` 根(腿 4) | 战斗段解析 | 腿 1:调用捕获序 = query_attack → apply_damage → advance(每存活敌恰一次 advance)+ 衰减行前完成;腿 2:beat 轨迹 = p_e 序、每结算 advance 恰 1;腿 3:advance 捕获实参 ∈ 敌句柄集、零 hero 句柄(B2 对 hero 句柄拒绝为兜底);腿 4:行动/伤害行序 = 生成序且每行 target 字段可归至对应单位 | Core Rule 10 / B2 义务① | -| AC-22 | b_mine_walk 单雷轮(L=1)+ goblin attack(腿 1);登记构造轮 L_amb=2 + weaken L=1 同轮(腿 2);b_flag 双 hit 旗同轮(weaken L=2;非平凡前提 m_w ≤ −51——F0 修订回写后恒满足,不满足时 SKIP 标记)(腿 3);defense_up 叠满同结算 P_pool = 2×m_d(腿 4) | 战斗段攻击拍 | 腿 1:伤害行携带 {baseline=a_g, attach=m_amb, 终值}、source_class=enemy_action、target = 受击单位句柄;L=0 轮 attach=0(自然读值);腿 2:D' = floor(D_raw × (100+P_e)/100 × …) 按表读值推导;腿 3:效果行显合成值 2×m_w 与终值两端、伤害行 value=0、apply_damage 捕获零次、B2 hero hp 不变、诊断零新增;weaken dur=1 轮末蒸发(下轮恢复常态伤害);腿 4:现行 −30 下 P_pool = −60 域内、乘数 0.4 无 clamp 腿——D' = floor(D_raw × 0.4 × …) 按表读值推导(免伤轮现行可达路径 = 腿 3 weaken 饱和;地板恰边界读法 P_pool = −100 由 F2 判据函数输入断言承载——AC-37) | Core Rule 10 / F2 / F3 / B3 义务③ / EC | -| AC-23 | (L_a,D_a) 结算 1 attack 后结算 2 构造挖雷 ×1(L_amb=1)(腿 1);`enemy_multi_unit` 根同步轮转至 charge 拍(腿 2) | 战斗段(charge 拍) | 腿 1:蓄力行(数字兑现面)+ query_attack 读值零作用 + 零伤害行、hero hp 不变;授予段伏击授予行在案(先授予后蒸发对照);轮末衰减清池(下轮 attach=0);腿 2:恰 u_c_f 条蓄力行、零 apply_damage、hero 承伤 0(合法状态非错误) | Core Rule 10/EC / B2 EC8 对侧 | -| AC-24 | `enemy_multi_unit` 根 + begin_battle hero_hp = 4 直供 | 首结算战斗段(敌[0] attack 分量 ≥ 4) | 敌[0] 伤害行后 hero hp=0 → 短路:敌[1]/[2] 零行动行、零 advance 捕获、径入衰减段(照常)→ 判定行 = 战斗失败(hero 先判防御腿——双死结构不可达不构造,判定行次序字段可读);battle_over 序列触发 | Core Rule 10/12 / EC / B2 义务③ | -| AC-25 | `enemy_multi_unit` 根 + 登记轮 L_amb = 2(双雷) | 战斗段逐敌解析 | 敌[0]/敌[1]/敌[2] 伤害行 attach 分量均为 2×m_amb(共享、非均分/消耗——每敌 query_attack 读同一 L);中途无池写捕获 | Core Rule 10 / B2 F2 | -| AC-26 | 任一 AC 场景(腿 1);末图清图胜利结算(AC-13 腿 1 场景 + 敌已全灭构造)(腿 2);全 dur=1 上轮清空后的结算(腿 3) | 结算 | 腿 1:衰减行恰 1 条/结算(k 记入行值)、decay_round 调用捕获恰 1 次;腿 2:判定行 = 胜利之前衰减行在案(先兑付后衰减时序契约;battle_end 全清兜底使两序同终态、次序钉死为段序);腿 3:衰减行 k=0(合法零行/聚合零计数) | Core Rule 11 / B3 义务④⑥ | -| AC-27 | 敌全灭结算(腿 1);失败(腿 2);继续(腿 3) | 判定段 | 腿 1:判定行 = 战斗胜利 → battle_over 序列(AC-31);腿 2/3:见 AC-24/AC-8;判定行公共字段 + 终局行在案(胜负画面数据锚) | Core Rule 12 | -| AC-28 | b_spawn cleared 判定 + A1 桩登记板序列 [板₂](程序构造、坐标级登记)(腿 1);桩登记返回带非法产物标记板(腿 2) | 出口分发 / install | 腿 1:调用捕获全序恰一次:A2 retire_board → B4 retire_mapping → A1 generate(board_gen scope +1——attempt 重试零额外取号)→ A2 install_board → B4 roll_board(reward_roll scope +1——每图恰一次)→ notify_settlement_done(new_board) → notify_round_start;新板资格格 roll 照常、grant_clear 零调用;完美计数随 install 重置;腿 2:install accepted(编排不拒产物)→ B1 上抛玩家侧呈现请求(回发捕获含呈现请求事件 + 数据面 = 非法标记,形态归 D1);A2 install 拒绝(不变式违例)= fail-fast 上抛(程序级非玩家域) | 编排专章换图腿 / B4 义务⑥ / EC | -| AC-29 | Active 且 rap ≥ rap_refresh_cost(腿 1);同轮第二次提交(腿 2);第三次提交(腿 3);rap < cost(腿 4) | 扮演 D1 经 `refresh_board` 提交刷新 | 腿 1:A3 request_refresh → true、rap=0、phase 不变(无结算段、无 round_end)→ 换图全序恰一次(A2 retire → A1 generate → A2 install → B4 roll_board;board_gen/reward_roll scope 各 +1);同轮续挖可证新图;腿 2:第二次完整编排;腿 3:拒绝(resource_face——refresh_cap_per_round=2);腿 4:false、状态不变(非编排错误) | 编排专章 / A3 Rule 11/EC13/EC15 | -| AC-30 | stopped 轮与 ap_exhausted 轮(各构造)(腿 1);cleared 轮(腿 2) | 出口分发 | 腿 1:notify_settlement_done(same_board) 恰一条、new_board 回发零次、retire/generate/roll 捕获全零(本编排无刷新提交面);fail-fast 守卫半 = 自守 debug 断言(内部违约路径不可由公开 API 构造——负空间,契约源 = registry action_economy.rap_rules,存在性由 AC-43 扫描域 + 代码评审承载);腿 2:cleared ⇒ new_board 恰一(AC-28 全序——两腿合成契约全貌) | 编排专章 / A3 rap_rules / 强制检查点③ | -| AC-31 | 判定行 = 胜/负任一(腿 1);末层 victory 或 defeat(腿 2);清理序列注入重复调用(诊断注入构造)(腿 3) | battle_over 序列 / `level_clear()` / 清理中 | 腿 1:捕获全序恰一次:B4 retire_mapping → B2 despawn_all(query 双侧空)→ B3 notify_battle_end(query 双侧空)→ A3 notify_combat_end(phase=Idle、rap=0)→ set_reload_gate(false);clear_inventory 不在 battle_over 序列中(缺席本身为断言腿:battle_over 后 query_inventory 逐字不变);腿 2:clear_inventory 恰一次 + 返回清空前快照计数("剩余道具 ×N 随关卡结束清空"反馈行数据面;折算结构位归 C2);此后 stock/use → false + 诊断;腿 3:debug 诊断 + 序列剩余步骤照常完成(幂等守卫兜底 false);后续 begin_battle 正常受理(防半清理态泄漏尾腿) | 编排专章 battle_over/level_clear 腿 / B4 义务⑤ / EC | -| AC-32 | AC-5 战斗开始序列完成后(gate 捕获 = true 在案)(腿 1);AC-31 battle_over 完成后(腿 2) | 经 ConfigDB `reload()`(debug 构建) | 腿 1:返回 false、ConfigDB 值不变、config_reloaded 不发("战斗中真的被置位"由编排真调用承载);战斗中经测试通道换根直调 load_tables(collect_only=true) 读值不受门约束(通道区分);腿 2:reload() → true 且 config_reloaded 恰一次 | Core Rule 16 / D2 EC8 / 强制检查点① | -| AC-33 | 两套全新全栈实例(同 master=42、同根、同板登记序列、同 encounter);判别腿:仅窗口选择序列不同(同意图) | 同一意图序列 + 窗口选择序列驱动两遍(定长场景:含挖掘/连锁/插旗/停手/窗口选用/刷新换图至少各一) | 两遍步骤流逐行相同(行数/行序/全字段含 value 与归因——target/effect_id/pool_value 均为输入的确定函数,逐行相等断言域含之);判别腿:仅窗口选择序列不同 → 步骤流在窗口标记处分歧、其前逐行相同(窗口选择序列确为回放输入);确定性来源行为面:B1 全程零 RNG 调用(AC-43)+ 表值快照 + attempt 非 scope 事件 | Core Rule 15 / 强制检查点② / D2 AC-15 | -| AC-34 | AC-29 腿 2 连环刷图场景 | 任一结算回放切点取快照(master_seed + 双流 scope 计数器 + 意图序列 + 窗口选择序列) | 无在飞流实例跨界(切点时刻双流计数器 = 已完成 install 数);续玩快照恢复驱动 = 端到端集成冒烟 deferral(生效条件 = D3 实现) | 编排专章回放切点 / Core Rule 15 | -| AC-35 | b_flag 构造零误标 ∧ ≥1 标中(仅插 (1,4) hit 旗)→ 挖尽 cleared(腿 1);同构造 + 插 (0,3) miss 旗(腿 2);全板零旗 cleared(腿 3);AC-28 换图后新板零 flag_judged(腿 4);b_fog 雾内插旗(腿 5) | 清图兑付 / 结算 | 腿 1:高光行在案(value = 实际有效兑付当量)+ 清图奖励身份第二份兑付捕获恰一次(道具类身份 → stock 恰 2 次 / buff 类身份 → apply_effect 恰 2 次——玩家实得两件;grant_clear 本身仍恰 1 次;等价入账 = power × P_pf ÷ 100 记号推导);腿 2:无高光行、正常兑付 + "标旗未中"零值行在案(highlight=perfect_broken)(全有或全无谓词、无部分完美档);腿 3:无高光行(hit=true = 0 不满足谓词);腿 4:完美谓词域 = 本板自 install 起(跨图不累积——构造前板含误标 + 换图后新板零误标有标中 → 新板 cleared 触发高光,重置判别正腿);刷新图本身零 grant_clear 无兑付点;腿 5:雾内插旗计入误标(hit=false)→ 破完美(无变异分支) | Core Rule 13 / EC×2 | -| AC-36 | 默认根 + 登记构造(每活行一 B3 实例:defense_up L=1 / weaken L=1 / ambush L=1×k=1;clear_blast 经 grant_clear 快照) | 结算兑付读值(query_active 快照载荷 / grant_clear power)经统一换算式 E(·)(SettlementTable D_ref 读值) | E_inst 结论与登记对照表一致(F1 重算回执版):E_defense = \|m_d\|/100 × D_ref、E_attack = 0.50 × D_ref、E_weaken = \|m_w\|/100 × D_ref、E_ambush(k=1) = m_amb、E_clear = power ×(perfect ? P_pf ÷ 100 : 1)(真实双份——完美板两件实得、总当量 = 2×power;单一线性换算——各行共用同一 D_ref 读值);锚两腿断言:E_weaken > E_attack ∧ E_weaken ≥ E_dig 推导值(登记常数——重算批回执值);attack_up 活行:hero_offense 池映射在位 ∧ 主角先手攻击伤害行 hero_offense 消费点在案(F3⓪ 基础分量——Core Rule 10 / F3 对账;attack_up 活行口径) | F1 / Core Rule 13 / B3 义务⑤ | -| AC-37 | F2 闭合判据函数(语义映射 → 池加算 → clamp → 乘区 → floor)+ 登记构造 | 以登记构造跑 F2 三例读法(weaken AP 界 8×m_w / 表界 16×m_w / defense_up 叠满 2×m_d——全表读值记号) | 判据结论逐一与 F2 表一致:两越域例 clamp 后 M=0;叠满例 M = 1 + 2×m_d/100 域内(现行 −60 → 0.4,无 clamp 腿);地板恰边界读法(M=0 未越域)以判据函数对 −100 输入断言承载;地板交叉层数 = ⌈100/\|m_w\|⌉ = 2(表读值推导);取整方向 = floor 单一规则(半值例断言);行为级交叉锚 = AC-22 腿 3 | F2 / B3 义务③ | -| AC-38 | F3 判据函数(三分支全序 + 负值禁令 + 死亡边界)+ 登记例(goblin L=2 → weaken → floor 3 记号 / knife_adv p_i vs hp=6 残敌 / D'=0 分支) | 以登记例跑判据 | 结论与 F3 一致:零负值(任意输入组合判据函数输出域 ≥ 0——参数化扫描)、Dead ⇔ hp=0 零负 hp 中间态、hero 先判优先级;行为级交叉锚 = AC-18/20/22/24 | F3 / B2 义务③ | -| AC-39 | F4 闭合判据函数 + 登记常数(C3 v3 行值总表:10×10 d0.25 → \|M\|=23/\|S\|=77、12×12 d0.25 → \|M\|=34/\|S\|=110;ι = 行 target 代 p10 乐观代理;m_d/D_a、m_amb、D_ref 全表读值/登记推导) | 对 L1/L2 两板形与满配语境(unit_count=3)跑配对主式 | 结论与登记一致(双口径断言——重算批回执):L1 裕度 ≈0.48× ✗ / L2 ≈0.47× ✗(锚行口径;期望口径 E_dig=4.5 → ≈0.60×/0.58× 同向破线——双口径登记)/ 满配语境 ≈0.16× 深度破线 ✗ → C3 曲线级约束输出(V_safe 侧杠杆重议——联动网络,F4 结论④);适用域守卫腿:登记构造 n_s < 1(残余集为空)→ 主式不评估、信息端平凡腿接管;信息端平凡腿 P(安全)=1 → V_safe > 0 恒真;registry clause3_supply 重算回执存在性断言;A1 actuals p10 交付后强制重跑 | F4 / B2 义务④ / 强制检查点条款③ | -| AC-40 | F5 闭合判据函数(修后模型:n_s = (1−ι)×\|S\|、E[踩雷] = \|M\|×n_s/(n_s+1)、X_res = E[踩雷]×V_mine、Δr = ⌈(n_s+E[踩雷])÷AP_r⌉、C_eff = C×(perfect ? P_pf ÷ 100 : 1))+ 登记常数(v3 曲线板形同 AC-39 / ι / E_dig 格子池加权推导 / C=clear_blast power / P_pf / AP_r / fog_burden_ratio 登记代表值) | 主判式对 L1 无雾态/L2 两板形 × {unit_count=1, unit_count=3} 四态组合 × {完美/非完美} 分支跑 | 结论与登记约束包一致(重算批回执):L1 −28.7/+11.3、L2 −67.4/−27.4、L1 满配 −153.2/−113.2、L2 满配 −257.1/−217.1——条款⑤未闭合(verdict = 未证明的约束生成器;L1 完美翻正腿在案);实现率折减腿(E_dig×0.6)读数在案(L1 −45.3/−5.3、L2 −91.2/−51.2);保守地板需求输出(L1 ≥ 110.3 / L2 ≥ 166.8);停手侧 RAP 零价假设登记存在性(判据函数输入分解可读);护栏 A/B 行断言 = 登记存在性 + 旧值链待重推注记(护栏 A 方向性复核 −1.1 越下界 / 护栏 B C=40 越线——W2 三选一裁决随 C3 收口批,本 AC 不断言其数值);A4 三腿入账核对(雷险消解/信息双向/AP 腿)逐腿在输入分解中可读;全条为对账断言——非 playtest | F5 / 强制检查点条款⑤ | -| AC-41 | 默认根加载 | 脚本解析 `design/registry/entities.yaml` | ① status_effect.anchor_warning 含 F0 裁决回执注记(瞬时口径 / 值域 [60,85] 默认 65 / 交叉层数 2 / attack_up 参照回迁口径重跑兑现——重算批注记);② weaken 值域修订注记 + clause3_supply.direction_precheck 闭合回执注记(含 2026-09-14 重算回执——现行值链破线读数);③ clause5_dominance 注记存在(含 C3 裁决 + 重算回执);④ settlement_table 条目存在且十二字段名与 SettlementTable schema 逐一相等(pool_clamp_lo/hi 两字段 + 充能三参数与 armor_effectiveness——W3 字段);⑤ knob 活值(D_ref/P_pf/m_w/m_d)不作定值对账 | F0(registry 对账形态)/ Core Rule 16 / 对账清单 | -| AC-42 | 全部 AC 场景步骤流捕获全集(冒烟汇总断言) | 逐行校验 | type ∈ 封闭枚举 13 类(封闭枚举即负空间:新增行类型 = 接口漂移);每行公共字段 type/source_class/origin_cell/round_index/display_name/value/highlight? 全在(origin_cell 板级行可空;highlight 可空枚举 {flag_hit, clear_reward_h2, perfect_broken});行类型特有字段:伤害行/道具行(生效)携 target、效果行携 effect_id + pool_value 且 value = 单次授予贡献值语义;source_class 值域 ⊆ source_label_map 键集 ∪ 判定/道具扩展 ∪ {enemy_action, flag_miss}(新增 = 接口漂移的表侧闸);无来源行 = 断言失败(P2 兜底的机器可判定形式);未生效四类 + 标旗未中行各携带聚合计数/批次字段(非空) | Core Rule 14 | -| AC-43 | B1 文件集(编排器/判据函数/步骤流/冒烟脚本/夹具规格)与全项目非 tests/ 文件集 | 静态扫描 | ① 零 randomize()/RandomNumberGenerator/自建 RNG;② 零 extends Control/Node2D、零 .tscn preload + AC-5 headless 实跑通过(合成判定);③ 结算路径 await 零命中(逐字面 warning 级 + 人工复核);④ 编排唯一性单向扫描:全项目非 tests/ 文件集中 B2/B3/B4 API 符号命中文件 ⊆ B1 文件集;⑤ D2 AC-14 人工三要素字面量扫描(行为级硬证据 = AC-22/36/39/40 全表读值推导 + AC-41 registry 对账);⑥ A2/B3/B4 相互直调零命中 | Core Rule 1 / 编排不变式③ | -| AC-44 | b1_default + 登记构造轮(挖掘 ≥10 安全格〔含连锁——cap 腿 >8〕+ 首次标中旗 2 枚 + 目标甲型三腿:goblin none / bugbear a / ogre_chief b;attack_up 授予 ×1 腿与非授予腿对照) | 结算战斗段主角先手攻击(表读值记号:da/ca/dbf/甲效矩阵) | 三分量读法逐腿与 F6 一致:A 池 = min(开格数×da, ca)、B 池 = 首标数×dbf;base = floor(atk×(1+P_offense/100))、dmg_a/b = floor(池×甲效/100)、D_hero = 三分量相加(表读值推导不写死);甲效三腿读数 = 特化 ×1.5 / 无甲 ×1.0 / 对位 ×0.5(甲B 对策 = dmg_b 腿——C3 联动网络 #6);attack_up 零泄漏腿:P_offense 变更只移动 base、A/B 分量逐字不变;敌方侧 percent 池零作用(hero→敌方向);cap 截断腿:15 格轮 A 池 = ca(截断入诊断计数、零明细行);轮末清零腿:下一结算 A/B 池 = 0;明细行 {baseline, attach} 分量可还原(充能池公开读值) | F6 / W3 / C3 联动网络 #6 | - -### 覆盖矩阵 - -| 类别 | 映射 | -|---|---| -| Core Rules(16/16) | 1→AC-43(单向扫描)+ AC-33(零随机行为级)· 2→AC-6 · 3→AC-9 · 4→AC-7+AC-2 · 5→AC-9/10/11/12(腿 5 = 标旗未中行)/13 · 6→AC-14 · 7→AC-15/16 · 8→AC-17 · 9→AC-18/19/20 · 10→AC-21/22/23/24/25 · 11→AC-26 · 12→AC-24/27 · 13→AC-35(#2 真实双份)+ AC-12(#3+腿 5)+ AC-36(P_pf 入账)· 14→AC-42(13 类+字段分层)· 15→AC-33/34 · 16→AC-1/2/3/4/32/41 | -| Formulas | F0→AC-41(registry 对账形态)· F1→AC-36 · F2→AC-37+AC-22 腿 3 · F3→AC-38+AC-18/20/22/24 · F4→AC-39 · F5→AC-40 · F6→AC-44 | -| 上游义务 23 条 | B3①→AC-9 · ②→AC-9 · ③→AC-37/22 · ④→AC-26 腿 2 · ⑤→AC-36 · ⑥→AC-26 腿 1 · ⑦→AC-17 腿 1 · ⑧→AC-14 ∥ B2①→AC-21 · ②→AC-9/14 · ③→AC-24/38 · ④→AC-39 · ⑤→AC-18 · ⑥→AC-14 ∥ A2①→AC-6 · ②→AC-10 腿 2 · ③→AC-12 腿 2/3 ∥ B4①→AC-7 · ②→AC-9/10/11 · ③→AC-13 · ④→AC-15/16/18/19/20 · ⑤→AC-31 · ⑥→AC-5/28——23/23 全落位 | -| 强制检查点 5 项 | reload gate→AC-32 · 可回放→AC-33 · new_board 违约→AC-30 · roll_board 恰一次→AC-5/28(scope 计数器观测)· 衰减恰一次→AC-26 | -| SettlementTable 校验 | segment_order→AC-2 · 悬空 effect_id→AC-3 · p_perfect 域→AC-4 · schema 定稿→AC-1/41 | -| EC(26 条) | 末图清图→AC-13/26 腿 2/27/31 · hero 短路→AC-24 · 双死 hero 先判→AC-24 注(结构不可达不构造)· D'=0→AC-22 腿 3 · 溢杀→AC-18 腿 3 · charge 蒸发→AC-23 · 全体 charge→AC-23 腿 2 · L=0→AC-22 腿 1 · 同窗多包→AC-16 · 部分回复→AC-16/19 腿 2 · 刀全灭→AC-20 · 空库存→AC-15 腿 4 · RAP 不足→AC-29 腿 3 · 连环刷图→AC-29 腿 2 · 未刷新→AC-30 · 非法产物→AC-28 腿 2 · 清理被拒→AC-31 腿 2 · 战斗中 reload→AC-32 · 衰减空→AC-26 腿 3 · 清图 buff 满层→AC-13 腿 2(高光降级)· 完美刷新图→AC-35 腿 4 · 标中+误标→AC-35 腿 2+AC-12 腿 5 · 多敌共享 L→AC-25 · 死亡即不动手→AC-18 腿 2 · 零伤害死局→负空间+遥测锚 OOS(C3/playtest)· 结算开始 hp=0→负空间 debug 断言——呈现半边全部 OOS 至 D1/B5(生效条件 = D1 义务台账登记) | -| 无洞声明 | Core Rules 16/16、F1–F6、义务 23/23、检查点 5/5、SettlementTable 校验 3/3 全部映射 AC;EC 除 2 条负空间自守(不可由公开 API 构造)与呈现/playtest OOS 外全部 Given-When-Then 或对账断言承载 | - -### 缺口预检 - -| 编号 | 缺口与处置 | 对侧 | 时机 | -|---|---|---|---| -| 1 | 【阻塞级】A2 事件载体 ADR 依赖:经真 A2 事件流驱动 B1 的 THEN 子集为纸面契约直至落地;A2 半真备选(注入面 + A3 真)已登记为过渡载体、断言口径不变 | 实现期 ADR(与 A2 OQ2 同一裁决) | Technical Setup | -| 2 | 【阻塞级】σ 登记轨迹与取号约定:身份依赖腿(双包/刀全灭/清图槽身份/完美板布置)依赖 σ 登记与取号约定(B4 缺口 8 同源);登记后须第二人独立推导复核 | qa / 实现期 ADR | 冒烟框架搭建 + ADR 定名 | -| 3 | m_w 修订回写——已闭合:registry 回执 #1/#2 于 2026-09-10 F0 批落地、2026-09-14 重算批更新腿读数(attack_up 参照回迁口径重跑兑现);B3 AC-14 腿 3 非平凡性复查通过(16×65 = 1040 越域) | B4/B1 共裁 + C3 | 已闭合 | -| 4 | A1 actuals p10 未交付:F4/F5 以行 target 代 p10 乐观代理——交付后强制重跑 AC-39/40 并同步 registry(对账清单 #6);连带 \|M\|/\|S\| 分布与 fog_burden_ratio p50/p90 | A1(交付)→ B1(重跑) | A1 F4 报告 C 交付 | -| 5 | C1/C2 encounter 供给:begin_battle 入参直供为 provisional——C1 定稿后接入真实遭遇上下文与跨战斗 HP 持久性,AC-5/24 的直供构造改为真实供给链 | C1/C2 | C1/C2 GDD | -| 6 | 【阻塞级】D1 呈现义务台账:A2×6/B2×4/B3×4/B4×5/B1×3(高光行强调/完美排雷呈现/EC5 零合法板提示)缺项即 blocking——本节 AC 全部以数据面断言、呈现零覆盖 | D1 | D1 GDD 门禁评审 | -| 7 | SettlementTable registry 条目回填——已闭合:settlement_table 条目 2026-09-10 回填、2026-09-14 重算批随 W3 充能规格更新为十二字段口径;AC-41④ 按现行条目断言 | 本 GDD 定稿批 | 已闭合 | -| 8 | B1 扫描域成员清单登记:AC-43 单向扫描的 B2/B3/B4 API 符号清单与 B1 文件集须登记入 D2 AC-9 项目级 CI 扫描配置(B3/B4 先例) | Technical Setup | B1 GDScript 产物落地即登记 | -| 9 | C3 调参对账重跑流程:D_ref/P_pf/m_w 任一调参 → AC-36/39/40 + AC-2–4 夹具登记值连锁重跑;扩表:A1 行参数(mine_density/min_safe_count/ι target)与 B4 奖励权重/power 调参 → 同批重跑 AC-39/40;A1 新增产出义务 = R₀ 规模分布上界(F4 报告 C 扩列——护栏 B 的登记供给方) | C3(调参)+ qa(重制)+ A1(R₀ 产出) | 每次调参 / 报告 C 扩列交付 | -| 10 | A1 桩 → 真 A1 全链路:换图编排 generate 真实集成(含 attempt 重试不重开 scope 语义、非法产物真分布)登记端到端集成冒烟(与 A1×A2 双包含端到端同槽) | qa/A1 | A1 实现落地 | -| 11 | 零伤害死局遥测锚:EC 死局组合 B1 不设自愈分支——战斗轮数异常遥测的口径登记(进 C3/OQ 清单) | C3/playtest | 垂直切片 playtest | -| 12 | flag_miss 源路径预留:标错惩罚上线时补 `flag_judged{hit=false}` → 敌方伏击 +1 源路径 AC(source_class 新枚举走 B3 修订——A2 预告接口漂移) | B1/A2/A3 联合 | 惩罚实测采纳后修订批 | - -## 开放悬案 - -| 编号 | 悬案 | owner | 时机 | -|---|---|---|---| -| 1 | 事件总线载体:signal vs 回调注册 vs 直连调用;B1 触发机制(事件订阅 vs 相位轮询)与 A2 事件捕获断言面同批落地——AC-6/AC-33 相关 THEN 为纸面契约直至落地(缺口预检 1) | 实现期 ADR(与 A2 OQ2 同一裁决) | Technical Setup | -| 2 | m_w 修订终值共裁:F0 已裁值域 [60, 85]/默认 −65 与归一口径;终值确认 + B3 StatusEffectTable 行表/Tuning Knobs/registry 三处回写执行(缺口预检 3);B3 AC-14 腿 3 非平凡性随批复查 | B4/B1 锚 owner 共裁 + C3 调参 | B1 评审后的接口漂移回写批 | -| 3 | A1 actuals p10 交付后条款③⑤强制重跑:ι 以行 target 代 p10 为乐观代理——重跑 AC-39/40 + 同步 registry 重算值(对账清单 #6);连带 fog_burden_ratio p50/p90 | A1 交付 → B1 重跑 | A1 F4 报告 C 交付 | -| 4 | 连锁规模分布供给方悬空:条款②第二腿(连锁放大边际基准)校准需 c̄(每安全格连锁期望放大)——现无既定供给方;候选 = A1 F4 报告 C 扩列 or A2 遥测(对账清单 #8 附注);供给落定前第二腿以 1:1 零链下界运转 | A1/A2 + B1 共裁 | A1 报告 C 扩列或 A2 telemetry 定稿 | -| 5 | EC5 零合法板玩家侧呈现形态:提示/补偿/回退三形态选型——B1 数据面(非法产物标记上抛)已就绪;B1 域内不做补偿逻辑(候选"确定性回退已知好种子"归实现期 ADR——A1 EC5 登记对侧) | D1 裁决 | D1 GDD | -| 6 | C1/C2 encounter 供给接线:begin_battle 入参直供改真实遭遇上下文 + 跨战斗 HP 持久性(B2 hp_persistence 对侧承接);战斗触发(节点移动碰非奖励点)归 C1(缺口预检 5) | C1/C2 | C1/C2 GDD | -| 7 | 深度高光形态:#3 标中旗高光的二期形态(即时 HUD 反馈动画/音画同步)——MVP 已落数据面标记 + 当轮兑付;旗落格高亮/姿态反馈等表现形态随 art-bible 与战斗表现美术测试定 | D1/B5 | 垂直切片 | -| 8 | 标错惩罚 flag_miss 源路径:候选"敌方伏击 +1"上线时——flag_judged{hit=false} 转化路径 + B3 source_class 新枚举(结构冻结项走 GDD 修订)+ 惩罚重复性裁决(hit=false 无去重的不对称)联动关闭(缺口预检 12) | B1/A2/A3 联合 | A2 OQ1 实测采纳后修订批 | -| 9 | hero atk 激活——已闭合(2026-09-11 起"基础攻击恒存在":HeroTable.atk 域 [1,999]、0 加载拒绝、MVP=6;attack_up 复活、消费面 = 主角战斗段先手攻击);对照表回迁 + AC-36 死行断言改写随重算批兑现 | B4/B1 | 已闭合 | -| 10 | B2 OQ1 两 face 归属:query_attack/ambush_grant_plan 归 B2 供给面 vs B1 编排面——裁决归 B1 则 AC-14/22 相关腿迁移至 B1 冒烟(断言口径不变) | 实现期 ADR | Technical Setup | -| 11 | 零伤害死局遥测锚口径:战斗轮数异常遥测的阈值与埋点(EC 死局组合 B1 无自愈分支——护栏 owner = 实现期 ADR/D2 跨字段校验,B2 OQ9 并案)(缺口预检 11) | C3/playtest | 垂直切片 playtest | - -## 版本历史 - -| 版本 | 日期 | 改动 | -|---|---|---| -| 跨评审 B1 重算批 | 2026-09-14 | /review-all-gdds 🔴-1 后半(registry 同批重登回执):**F0/F1/F4/F5 按现行三输入重推**(duration=1〔两级奖励批〕、m_d=−30〔减伤墙批〕、C3 v3 曲线 d0.25/t0.88 换锚——原 A1 参考行退役)——**条款③两参考板形翻为破线**(锚行 ≈0.48×/0.47×、期望口径 E_dig=4.5 → 0.60×/0.58×;满配 ≈0.16×),旧"通过"回执(≈2.0×/2.6×)退役为历史记录、破线升格 C3 曲线级约束(V_safe 侧杠杆重议——禁独立调参联动网络);E_dig 重推 7.2→4.5(格子池加权,注入池不摊入)· 条款⑤四态重推(L1 −28.7/+11.3 等;保守地板需求 110.3/166.8,C3 裁决②维持)· **F1 对照表按现行行集重登**(两级行值 8/16/40 + 注入池 + clear_blast;attack_up 死行注记清除——与 Core Rule 10 先手攻击对账;锚对照实物改 attack_up 行〔registry 回迁口径重跑兑现〕)· **F6 充能与护甲克制结算规格**(W3——累积时点/单轮 cap/不吃 percent/逐分量甲效查表 floor + AC-44 + F1 对照两行)· W6 挖掘期刷新改**每轮 cap 2**(RoundStart 重置——A3/registry/D1 同口径)· defense_up.magnitude/duration 纳入禁独立调参联动网络 · AC-22/36/37/39/40/41 改写 · 护栏 A/B 读数挂旧值链注记(W2 复核随 C3 收口批)· 悬案 9/缺口预检 3·7 闭合 · 核心规则表增依据列(lint R8 引用列迁移) | -| C3 修订批回写 | 2026-09-14 | /design-review C3 修订批(X-6 回执,registry 同批):战斗开始序列增 **encounter 掷骰步**(RngService 封闭流恰一 scope——unit_count 区间骰定本战实际数量,spawn 增 override 参数 n)· Core Rule 1 零随机扩界注记(实例化骰在结算步流之外,可回放性不受影响)· AC-5 增 encounter scope 腿 · SettlementTable +4 字段(damage_a_per_cell / damage_a_cap / damage_b_per_flag / armor_effectiveness——护甲克制批转正,机制与结算归 B1、C3 投值)· 条款⑤ C3 裁决回执行(约束包② 采信 + clear_blast C=40 缺口重推 6.1/51.8)· 敌种键更名 goblin/bugbear(DND 批对齐) | -| v1.1-lean | 2026-09-13 | 格式迁移:legacy 原稿按 lean 样例重排——修订注记出正文收敛至本表;散文/枚举/边界情况/AC 转表格;流程转字符画;公式、Variables 与验算数据全保留;语义与 Rev 1 及后续拍板批对齐,零规则变更 | -| D4 修订 | 2026-09-12 | 刷新决策前移挖掘期:新增"挖掘期刷新"出口(refresh_board 编排——request_refresh 扣费 → 换图全序,无结算段、轮次不终结),原 Waiting 期刷新代理调用弃用 | -| 2026-09-11 拍板批 | 2026-09-11 | 主角先手攻击(hero_attack 来源 + F3⓪)、两级奖励裁决(instant_aoe/instant_heal 当场兑付)、道具窗口单件制(>1 件 = 编排违例取首件)、库存关内延续(battle_over 不清库、新增关卡末 level_clear 清库编排) | -| Rev 1 | 2026-09-10 | design-review 8 项 blocking 核销:完美排雷落真实双份交付载体 + 高光行有效兑付语义/零兑付降级;条款⑤计价模型重推为挖穿残余池口径、verdict 翻转 → C3/B4 约束包 + 多敌验算腿 + ι→1 域守卫 + 护栏 B 输入登记与双读数;流水协议 target/effect_id/pool_value 字段分层 + enemy_action/flag_miss 来源枚举;hit=false"标旗未中"零值行(每雷实例一次去重);P_perfect ÷100 换算成文 + 载体域收窄 {100,200};AC-18 腿 2 改写;F4 V_safe 标签更正 + 期望口径敏感性读数;clamp 统一八字段——明细见 reviews/b1-settlement-review-log.md | -| v1 | 2026-09-10 | 一次会话定稿:F0–F5 + 43 条 AC + 23 条上游义务落位;F0 归一口径裁决(每结算瞬时当量,m_w 值域 [60,85]/默认 −65)与高光双落(完美排雷 / 标中旗标记)即定 | diff --git a/design/gdd/legacy-2026-09-14-v1/b2-enemy-system.md b/design/gdd/legacy-2026-09-14-v1/b2-enemy-system.md deleted file mode 100644 index 588265d1..00000000 --- a/design/gdd/legacy-2026-09-14-v1/b2-enemy-system.md +++ /dev/null @@ -1,605 +0,0 @@ -# B2 敌人系统(Enemy System / 战斗单位系统) - -> **状态**:Approved · lean 格式 -> **版本**:v1.0-lean · 2026-09-13 · 作者:user + agents -> **承载支柱**:P3 主(雷→敌方优势的收件人与同源兑付面)· P2(敌方增益行可归因)· P1(视觉推测型读怪 = 规划素材)· P4 间接(地牢住户) -> **一句话**:B2 定义战斗双方是谁、多强、带什么词条、如何受伤与死亡——雷的代价的收件人。 -> **复核注记**:lean 门禁下 systems-designer(Formulas)/ qa-lead(AC + 缺口预检 7 项)已委托起草;creative-director 与 art-director 未经咨询——生产前人工复核体验锚点情绪定位与 Visual/Audio、art-bible 一致性(art-bible §1–4 须在 D1 GDD 前创建,本节线索清单是其输入之一)。 - -## 速览 - -| 关键问题 | 答案 | -|---|---| -| 定位 | 战斗域单位层(Layer 2 Core · MVP · 设计顺序第 7 位):定义"战斗双方是谁、各自多强、带什么词条、怎么受伤与死亡";持有 D2 EnemyTable 回填权,承载主角与敌人共用的战斗单位接口。缺本系统则踩雷优势无受益者(P3 断)、胜负判定无主体、难度曲线无施加对象 | -| 拥有 | 单位状态(hp/max_hp/存活/行为环指针)与查询/受击/推进接口 · EnemyTable/HeroTable schema 与双敌种行回填(行键 (level_index, node_depth, enemy_id))· 行为环语义 · 目标选择规则(固定顺位)· 伏击量纲定稿与 advantage_per_round_cap 表值 | -| 不拥有 | 结算编排与伤害消费语义(B1 SettlementTable)· 状态实例容器(B3)· 奖励内容与掉落(B4)· 棋盘规则(A1/A2)· 单位成长曲线与难度修饰(C3)· 遭遇构成(C1)· 呈现(D1/B5/D5)· 单位/词条类结构与事件载体实现(实现期 ADR 域) | -| 上游输入 | D2 EnemyTable/HeroTable 行值(ConfigDB 单点读取、R1 行解析)· hero hp 入参(编排方供给)——A2/A3/A1 事实均经 B1 结算编排转化,零直接接口 | -| 下游输出 | 单位状态查询/受击/推进接口(B1 消费)· 意图视觉映射键 enemy_id 与视觉状态清单(D1/B5 消费)· 伏击量纲 + cap 表值 + k 可算性(B1 条款 3 对账输入)· 行为环教学口径(D5) | -| 硬约束 | 零随机(rng_service 流封闭)· 零 UI 依赖 · 零主动事件订阅 · 悬空引用致命、零软回退 · 行为环敌单位专属 · 单位接口调用权集中归 B1 · 胜利路径 = 基础攻击(恒在)+ B4 奖励侧规划面伤害共同承载——"敌人全灭 → 战斗胜利"可判定 | - -## 体验锚点 - -> 情绪目标一句话:**"对面是个看得懂的对手,不是一个血条"**——威胁可推测、可归因、可拆解;玩家不操作敌人,但每一轮都直接感受它。 - -| 支柱 | 关键词 | 机制承诺 | -|---|---|---| -| P3 同源的对面对象 | "赌桌对面的那个存在" | 结算明细"敌方获得伏击 +3(第 4 轮 · 雷)"的行可指认——敌人强度是扫雷决策的镜像,威胁有源可溯 | -| P1 可推测的威胁 | "它弓起背了,下一拍是重击" | 读怪推理进入挖掘决策(形态↔行为映射稳定可学,MVP 双环最长 3 拍);不预告精确数值——数字在结算明细兑现,结算前的世界靠观察而非读表 | -| P2/P3 的拆台兑现 | "它强是我喂的,它弱是我拆的" | 标中旗 weaken 与伏击行同框、同一呈现语言,落在同一个它身上 | -| P4 地牢住户 | "越下越险的刻度" | 深层敌人更凶(C3 施加),给下探氛围一个可见刻度 | - -- 反向护栏:威胁绝不能是无源暗账——玩家说不出"它为什么变强 / 这一拳为什么这么重"即归因链失职(P2/P3)。 -- 视觉推测型对偶护栏:线索必须稳定可学(形态↔行为映射每 run 恒定,D1 义务②);任何让线索重掷或不可学的呈现设计默认砍掉(P1)。 -- 血条/攻击力数字可读性适用视觉锚 1(暗色底上高对比)。 -- 参考感受合成:Peglin 固定招式轮替(威胁因可预测而可规划——确定性环是可学习性来源)× 怪物猎人读招(前摇姿态承载威胁信息、无数值面板——视觉推测的同构)→ 本作 = 确定性环 × 视觉推测;反向对照(要避开的感受)= 半随机、不可归因、重掷线索的"猜怪"呈现。 - -## 全局流程 - -B2 编排被动——调用权集中归 B1;下图从 B2 视角画单位级行为环与生命周期出口。 - -### 敌人行为环 - -``` -战斗开始(B1 编排调用,B2 侧语义) - │ ① 解析遭遇行 (level_index, node_depth) —— D2 R1 进度键 floor + enemy_id 精确匹配(悬空致命) - │ ② 行值快照 → 实例化本战实际数量 n 个敌单位(行主序生成序——B1 encounter 骰 override;定值行 n = unit_count)+ 主角(hp 入参) - │ ③ 全部指针指向环首:beat = pattern[0]、steps = 0 - ▼ -每次结算(B1 编排驱动——B2 零主动;推进域 = 每存活敌单位恰一次 advance,主角无行为环不在推进域) - │ ⓪ 主角先手攻击 → apply_damage(顺位最前存活敌, 伤害) [战斗段固定动作,非行为环] - │ ① 兑付读值:query_attack(u, L, m_amb) → {baseline, attach, total} - │ ② 受击上报:apply_damage(hero, 减伤后终值) —— 调用序钉死:倒序会读到下一拍(B1 义务①) - │ ③ 推进:advance(u) —— 存活才推进(先作用后推进) - ▼ -当前拍作用(每存活敌单位) - ├─ attack:本结算对主角造成 atk 点伤害 - ├─ charge:本结算不作用(威胁空拍、规划窗口;不兑付伏击、不读池) - └─ heavy :atk × heavy_multiplier 对主角 - ▼ -拍作用完成 → steps + 1 → beat = pattern[steps mod 环长](环尾回环首;跨轮次、跨扫雷图延续) -轮到前被杀 → 本拍不打、指针冻结(死亡即不动手;MVP 无复活 → 永久冻结) - ▼ -battle_over(B1 调 despawn_all)→ 全部单位 Despawned(状态消亡,不跨战斗) -``` - -### 出口分发 - -| 出口 | 触发 | 动作/去向 | 约束 | -|---|---|---|---| -| 单位死亡 | hp = 0(判定时机归 B1) | 移出顺位、不再作用、不计入"未灭";轮到前死 → 指针冻结、行动后死 → 已推进 | 不可逆(MVP 无复活);Dead 句柄保留只读可查(query_beat 冻结值) | -| 敌全灭 | 存活敌集 = ∅ | "敌人全灭"成立 → B1 胜利判定素材;单体/AOE 无有效目标;敌侧伏击池随轮末衰减自然清空 | 判定逻辑归 B1 | -| 主角死亡 | hero hp = 0 | 战斗失败判定素材(判定时机归 B1) | battle_over → 全部单位 Despawned——不存在"主角死后敌继续攻击"的中间态 | -| battle_over | B1 编排 despawn_all | 全部单位状态消亡、不跨战斗;Despawned 后唯一出口 = 重新 spawn(新战斗) | 重复 despawn_all → false + 诊断;Despawned 为逻辑失效态(失效句柄查询空 + 诊断) | - -## 核心规则 - -> 每条规则两段:**人话**(作用于哪个系统、什么情况下、谁触发、触发后发生什么;效果与情况用枚举表)→ **举证**(计算方法/公式;纯流程规则明写"无计算")。 - -#### 规则 1:主角和敌人共用同一套受伤与死亡规则 -**人话**:这条管的是战斗里所有"单位"的通用身体规则。战斗场上恰有两类单位:主角一个、敌人若干,共用同一套身体语义——每个单位有当前血量与血量上限,挨打就是血量往下减,血量到 0 即死亡。超上限、负数、一刀砍超的部分怎么处理,以及"这一下究竟何时算死",都归战斗结算系统(B1)的结算公式域裁决。 - -B2 只提供受伤上报与状态查询接口、如实记账,"谁在何时对谁造成多少"的流水账本也在 B1。主角血量归零 = 战斗失败的判定素材,敌人全部归零 = 战斗胜利的判定素材——判定本身同样归 B1。 -**举证**:无计算。clamp/负值/溢杀语义与死亡判定时机的成文义务登记为 B1-③(B2 侧 out-of-scope);单位接口、胜负素材与越界拒绝验收见 AC-1/AC-2/AC-6。 - -#### 规则 2:一场战斗 1–3 个同种敌人,敌方效果对全体生效 -**人话**:这条定的是"一场战斗有几个敌人、效果怎么作用"。MVP 每场战斗 1–3 个敌人,全部是同一种敌、属性完全相同——由敌人表同一行实例化,按行序排出先后;数量是敌人表里的调节旋钮。战斗中敌人只减不增(没有召唤/增援/分裂)。 - -敌方吃到的增益/减益是"对全体生效":作用于所有存活敌人,层数进一个共享池——这是与状态系统现接口零改动兼容的 MVP 路径。"只作用于某一个敌人"的单体寻址暂不开放,登记为状态系统的扩展位,等第一个单体效果上线时补列。 -**举证**:无计算。构成/同质性/作用域/单调性细则见下方实现参照表;target_ref 扩展位义务登记为 B3(首个单体效果上线时补列,随批 B1 归集语义/D1 呈现裁决);战斗内不增员见 EC5;验收 AC-1/AC-5/AC-9。 - -### 规则 2 的实现参照——多敌模型 - -| 项 | 内容 | -|---|---| -| 构成 | 1–3 个同敌种单位(unit_count int [1,3] 表字段 knob);战斗开始实例化、行主序生成序 | -| 同质性 | 战斗内敌单位同种同属性——同一 EnemyTable 行实例化 | -| 效果作用域 | side-wide:enemy 侧效果作用全体存活敌单位——层数为 side 共享池(F2 池共享不消耗);B3 现接口零变更兼容 | -| target_ref | 单体寻址登记为 B3 扩展位义务(首个单体效果上线时补列;随批:B1 归集语义/D1 呈现裁决) | -| 单调性 | 战斗内敌单位数 = unit_count 不增(MVP 无 summon/增援/分裂——EC5) | - -#### 规则 3:MVP 就两种敌人,每个关卡坐标只出一种 -**人话**:这条定的是敌人名录。MVP 恰两种敌人:地精(goblin)与熊地精(bugbear),数值全部 provisional(临时占位),MVP 名录定稿走索引门禁。敌人在敌人表里按"关卡序号 × 节点深度"坐标存放:每个坐标的行集里只许出现一种敌人——这是表结构校验,配出两种就加载报错;由此既没有"同一点随机挑一种"的选择规则,也没有引用悬空的风险。 - -行集逐坐标判定,同一关内随深度换敌种合法。MVP 分布只是最平直的合法示例:第 1 关全深度地精、第 2 关全深度熊地精——占位示范、非范本,难度调参勿照抄(防多样性无护栏),遭遇分布调参所有权归难度域(C3)。名录扩容排垂直切片/Alpha;"同深度多敌种怎么选"归遭遇构成(C1)/难度域,目前只是预留结构位。 - -**举证**:无计算。"每行集恰一敌种"(加载期致命)与字段域校验验收见 AC-12/AC-14;敌种 id 集合定值断言 {goblin, bugbear, ogre_chief} 见 AC-14(C3 修订批扩容三敌种);registry 物种注记对账见 AC-16③。 - -#### 规则 4:敌人按排好的剧本轮流出招,走到哪一拍零随机 -**人话**:每种敌人有一条排定的行动剧本(行为环):战斗开始指向剧本第一步,之后每结算一次走一格——轮到谁,谁先把当前这一拍的招打出去、再走格;走到剧本末尾回到开头;跨轮次、跨扫雷图延续,战斗结束随单位一起消亡。轮到它之前被打死:这一拍不出手、指针就地冻结("死亡即不动手")。全程零随机——走到哪一拍由结算次数唯一决定,同种敌人因此永远同拍。行为环是敌人专属:主角没有行为环,对主角调环接口一律拒绝。MVP 只启用攻击/蓄力/重击三种拍,后四类是预留位、配进表会被校验拒绝。 - -**举证**:无计算(推进是确定性函数)。指针/回绕/冻结/同步性质公式见 F1;"每结算恰一次推进"与结算内调用序登记为 B1-①;推进细则与预留值拒绝(fail-fast)见下方实现参照表;验收 AC-3/AC-4/AC-5/AC-15(预留值致命 manifest pattern_reserved)。 - -### 规则 4 的实现参照——行为环推进细则 - -| 项 | 细则 | -|---|---| -| 指针初始化 | 战斗开始指向环首:beat = pattern[0] | -| 推进时机 | 每次结算推进一格——先作用后推进(B3"先兑付后衰减"同款时序哲学);轮到该单位行动时仍存活才行动并推进 | -| 死亡口径 | 轮到前被杀 → 本拍不打、指针冻结("死亡即不动手",F1 承载;MVP 无复活 → 永久冻结、随 battle_over 消亡);行动完成后才死 → 已行动已推进 | -| 回绕与域 | 环尾回环首;指针 ∈ [0, 环长);环长 1(goblin)退化为恒等 | -| 延续 | 跨轮次、跨扫雷图延续(战斗域);battle_over 随单位消亡;除 despawn_all 外无任何重置入口 | -| 确定性 | 零随机——环推进是结算次数的确定函数(rng_service 流封闭,P1) | -| 专属域 | 行为环为敌单位专属:主角无行为环——advance/query_beat 等环接口对主角句柄一律拒绝(false / 空 + 诊断) | -| 实现域 | MVP 恰前三类 {attack, charge, heavy};guard/boost/hinder/summon 为预留语义位(垂直切片/Alpha),EnemyTable.pattern 校验拒绝预留值(fail-fast,A1 solver_rules 冻结先例)——启用走本 GDD 修订(枚举封闭性)非调参 | - -#### 规则 5:每踩一颗雷敌方叠一层伏击——一轮封顶、超出可见不生效 -**人话**:这条定的是踩雷对敌方的反噬。挖开雷格时,敌方全体获得一层"伏击"强化——MVP 伏击清单只有伏击这一条(状态系统表里 mine_hit 雷击来源的唯一效果行);将来加新词条要状态系统加行并连锁更新锚点,不属于 MVP。转化路径:棋盘上报"挖到雷"→ 结算编排把它转成一次伏击施加(作用全体敌人、共享层数池),每颗雷恰转化一次。单轮授予有上限(敌人表行值,默认 4):上限之内逐颗叠加;达到上限后,多踩的雷不生效,但逐颗记一行"溢出未生效"结算明细——惩罚不静默蒸发。 - -| 单轮伏击上限(cap 行值) | 行为 | -|---|---| -| 默认 4 | 前 4 颗雷各叠一层;第 5 颗起每颗记一行"溢出未生效"明细 | -| 调到 8 及以上 | 单轮雷数至多 8 颗、达不到上限——溢出协议自然不可达 | -| 0 | 该行敌种免疫伏击——每颗雷都记"溢出未生效",全部可见、全部无效 | - -**举证**:计算见 F3:granted = min(当轮新开雷数, cap)、overflow = 差值(守恒、零静默蒸发)、L = granted(dur=1 轮末全清)。每雷恰一次转化登记为 B1-②、溢出行协议登记为 B1-⑥;cap 默认 4 定稿与反灾难护栏绑定域(单轮 5–8 雷灾难轮)见 F3;cap 表值同时是 A3 F1 条款 3 挖掘风险不等式的 B2 供给表值(单结算自然边界口径见 F4)。验收 AC-8。 - -#### 规则 6:一层伏击 = 敌人每次攻击多打 3 点固定伤害 -**人话**:这条定的是伏击到底多疼:一层伏击 = 敌人每次攻击类行为(普攻或重击)额外多打 3 点固定伤害,按主角血量点数计。结算读法:某个敌人出手时,附加伤害 = 敌方池当前层数 × 3。两个要点:附加是后置加法、不进重击倍乘(倍率只乘基础伤害);蓄力拍不出手、不附加。伏击只活一轮——每轮结算清零、没有跨轮存量,所以跨轮累计没有表值上界;单次结算有自然上界(见举证)。 - -**举证**:上界算式:单结算单单位附加 ≤ cap × 3 = 12(默认);敌方全体结构上界 = unit_count × min(单轮开雷上界 8, cap) × 3(满配 3×4×3 = 36;默认单敌 = 12);跨结算累计 = 轨迹量、非表值、不设上界(dur=1 每结算清零)。伤害构成与合成序见 F2;等量换算与不等式闭合归 B1(F4);量纲定稿注记按接口漂移回写 registry status_effect.ambush(AC-16④)。 - -#### 规则 7:敌方打主角不用挑,玩家侧永远先打排最前的敌人 -**人话**:这条定的是"打谁"。敌方一侧没有选择可言:所有存活敌人各自按自己行为环的当前拍作用于主角——主角是己方唯一单位,天然是唯一目标。玩家/道具一侧打敌人用固定顺位:单体效果默认打生成序最前的存活敌人,它死了顺延到下一个;范围效果(AOE)打全体存活敌人,同样无需选择。这套规则供结算编排消费;道具自带"指定目标"语义的扩展归道具系统(B4)/结算域。顺位必须对玩家可读——"下一个被打的是谁"要能推测出来,这是呈现层义务。 - -**举证**:无计算(纯规则)。固定顺位供给面、死亡顺延与 u_c=1 退化(AOE ≡ 单体、合法非错误)验收见 AC-10;顺位快照 = 生成序、单体/AOE 分流消费登记为 B1-⑤;顺位可读呈现义务登记为 D1-③(呈现契约表 #3)。 - -#### 规则 8:敌人要出什么招靠看图推测,不直接报数字 -**人话**:这条定的是玩家怎么"读"敌人。界面上不直接显示敌人下一拍的行为与数值——威胁靠看图推测:它弓起背,下一拍就是重击。两条承重规格:"预告时序"(即将执行的一拍在挖掘阶段全程亮出)与"映射每局恒定"(禁止重掷,否则读怪退化成猜怪)——否则"抢在重击前击杀"窗口、"蓄力轮放心贪雷"教学、读怪幻想三者同时落空。精确数字只在结算明细兑现。线索清单与图像规格归呈现层(D1/B5),映射键 = enemy_id;MVP 读怪对象 = 两条环(最长 3 拍),学习成本低。 - -**举证**:无计算(规格非算式)。五条规格全文见下方实现参照表;线索清单/图像规格/映射全局恒定呈现义务登记为 D1-①②(登记 systems-index;映射键 = enemy_id,B3 effect_id→icon 同款契约);"不直接显示数值"的负空间 = 冒烟 API 封闭枚举(无意图数值 API);行为环可学性行为级证据 AC-3/AC-15。 - -### 规则 8 的实现参照——意图可见性五条规格(承重项) - -| # | 规格 | 内容 | -|---|---|---| -| ① | 图像↔行为映射稳定可学 | 同一敌种同一行为恒同一视觉状态(如 bugbear 蓄力拍 = 蓄力姿态) | -| ② | 形态暗示强度 | 敌种形态承载强度档位与环长的直觉编码("大个子多半有重击"式) | -| ③ | 映射每 run 恒定 | 禁止重掷——否则"读怪"退化"猜怪"(违反 P1 裁剪判据);映射键 = enemy_id | -| ④ | 精确数值在结算明细兑现 | P2 归因不变——预告面是图像、数字面是明细 | -| ⑤ | 预告时序锁定 | 视觉状态呈现即将执行的一拍(当前拍预告)——挖掘阶段全程可见;结算时不另设独立意图播片(结算明细是数字兑现面、非意图预告面) | - -#### 规则 9:主角数值在英雄表里——血量上限加恒在的基础攻击 -**人话**:这条定的是主角这边怎么打。主角战斗数值单独放一张全局单行的"英雄表"(本 GDD 是回填 owner,走 D2 接口漂移规则回写),两个字段: - -| 字段 | 域(knob) | MVP 值 | -|---|---|---| -| max_hp 血量上限 | int 1–999 | provisional,出处待查 | -| atk 基础攻击 | int 1–999;0 加载期校验拒绝 | 6(原型锚 HERO_BASE_ATK provisional,归 C3) | - -基础攻击恒存在、不许为 0:零基线乘任何百分比增益恒为零,这个死锁从数据层就进不来、开发期任何内容态都不可能出现。战斗节奏:每次结算的战斗段,主角先手攻击顺位最前的存活敌人——先于敌方行动;攻击是固定动作、不是行为环一拍(主角无环),伤害算式/乘区/明细行协议归结算系统战斗段。攻击增益(attack_up,+50 percent)的唯一消费面就是这次先手攻击;道具伤害是恒定表值、不吃修正。 - -战斗开始时主角血量由编排方入参供给,跨战斗是否保留血量归关卡结构域、本文不定义(MVP 冒烟以血量上限入参);后续解锁成长归 C4、曲线调参归 C3。胜利路径 = 基础攻击 + 奖励侧规划面伤害(囤刀、抢杀、爆发时点的决策素材)共同兑付"敌人全灭 → 战斗胜利",每一分伤害逐行标注来源(hero_attack / 道具逐件实例)。 - -**举证**:无新计算——数值皆表值。schema 域/单行校验验收 AC-13/AC-14;hero hp 入参越界拒绝见 EC16(AC-2);attack_up 消费面口径(B4);跨战斗 HP 持久性归 C1/C2;atk 禁独立调参联动见 Tuning Knobs;HeroTable 新增的接口漂移回写义务 R-4 见依赖节。 - -#### 规则 10:开战按坐标读表生成敌人,数值是生成那一刻的快照 -**人话**:这条定的是敌人从哪来、数值从哪来。战斗开始时,编排方给出遭遇坐标(关卡序号 + 节点深度),敌人系统据此从敌人表精确匹配一行,实例化"本战实际数量 n"个敌单位——n 由编排方开战掷的遭遇骰从表里的数量区间 [unit_count, unit_count_max] 定出(定值行取表值);主角同时以血量入参生成。 - -实例化拿到的是当时表值的快照:之后热重载改表,已生成的单位一概不受影响。难度成长走双通道:表值本身随坐标加深而变 + 难度系统(C3)的整体修饰——修饰施加点已定为"行值快照之前套乘",MVP 难度表为空、零修饰;B2 一律按实例化后的数值运作。 - -**举证**:无计算(数值皆快照表值)。行解析 = D2 R1 进度键 floor + enemy_id 精确匹配、悬空致命(EC13/EC14 → D2 通道);坐标越界前置守卫见 EC14;快照语义同 B3 EC9 先例、热重载与投影拷贝判别验收 AC-11(EC12);难度修饰接口已定——registry `difficulty_table` 条目(算式归 C3)。 - -#### 规则 11:敌人系统自己不主动做事,一切等结算编排来调 -**人话**:这条管的是敌人系统的姿态:B2 不产生随机数、不碰界面、不订阅任何事件——挖雷、插旗等棋盘事实不直接通知 B2,而是经结算编排转化后由它来调用。B2 只摆出两组能力:查状态(血量、当前拍、顺位、存活),受动作(受击、推进、消亡);什么时候调、按什么顺序调,全部由结算编排(B1)说了算——与状态系统"授予集中在编排"是同一条原则。 - -**举证**:无计算。零随机行为级硬证据 = 同序列重放两遍逐位相同(AC-15);零 UI 依赖/零事件订阅/零 B3 符号引用静态扫描见 AC-17(A2 事件面 referenced_by 不含 B2 的代码侧对应);调用权集中与推进恰一次登记为 B1-①。 - -## 枚举 - -### 行为拍类型(封闭枚举,七类) - -| 值 | MVP 状态 | 语义 | -|---|---|---| -| attack | 实现 | 本结算对主角造成 atk 点伤害 | -| charge | 实现 | 本结算不作用——威胁空拍、规划窗口;不兑付伏击(不读池) | -| heavy | 实现 | atk × heavy_multiplier | -| guard | 预留(校验拒绝) | 自防 | -| boost | 预留(校验拒绝) | 自体强化 | -| hinder | 预留(校验拒绝) | 妨害雷图——敌方向棋盘施加变异类妨害(Peglin"干扰弹板"的本作转译) | -| summon | 预留(校验拒绝) | 召唤增援 | - -- pattern 环长 [1, 8];MVP 校验域 = {attack, charge, heavy};预留值校验拒绝(fail-fast);启用预留值走本 GDD 修订(枚举封闭性)非调参。 - -### MVP 双敌种内容行(值全部 provisional) - -| 敌种 | 行为环 | 基线(provisional,出处待查) | -|---|---|---| -| goblin(地精) | [attack](平凡环,环长 1) | hp/atk 暂按原型参考 18/4 占位 | -| bugbear(熊地精) | [attack, charge, heavy](三拍环) | heavy_multiplier = 2 | - -### EnemyTable schema(D2 回写义务——键 (level_index, node_depth, enemy_id)) - -- 进度键 floor(D2 R1)+ 实体键精确匹配;每行集恰一敌种(行集内 enemy_id 唯一 = 表结构校验,违规加载期致命);本表是进度成长表(A1 BoardGenTable 同型,无 Rule 4 豁免);表非空(D2 Rule 6);精英/Boss 编码位预登记 OQ7——难度三维的精英/Boss 修饰在本键结构下无编码位,C1 定稿时强制核对。 - -| 字段 | 类型/范围 | 语义 | -|---|---|---| -| enemy_id | String(行集内主键) | 实体键精确匹配(D2 Rule 4);意图视觉映射键(Rule 8③) | -| display_name | String | 图例/HUD/明细用名(本地化归 D6) | -| unit_count | int [1, 3] | **遭遇区间下界**(knob;同敌种——C3 遭遇随机化:区间 [unit_count, unit_count_max] 经 B1 encounter 骰定本战实际数量) | -| unit_count_max | int [unit_count, 3],可省略 | 遭遇区间上界(缺省 = 定值,旧行零迁移——C3 修订批新增字段) | -| armor_type | enum {none, a, b},缺省 none | 护甲类型(克制矩阵 = SettlementTable.armor_effectiveness——伤害A/B 充能的克制消费面;MVP 映射 goblin=none / bugbear=a / ogre_chief=b) | -| hp | int [1, 999] | 单位最大生命基线(knob;难度修饰前) | -| atk | int [0, 999] | 攻击基线(knob;attack 行为伤害基值;0 合法 = 纯伏击伤敌种) | -| heavy_multiplier | int [1, 16] | heavy 倍率(knob;无 heavy 拍的敌种不消费——非校验项,B3 max_stack 先例) | -| pattern | StringList(环长 [1, 8]) | 行为环(元素 ∈ {attack, charge, heavy} 为 MVP 校验域;guard/boost/hinder/summon 预留、校验拒绝) | -| advantage_per_round_cap | int [0, 16] | 单轮伏击授予上限(knob,默认 4 定稿;F1 条款 3 表值;0 = 该行敌种免疫伏击授予的合法极端) | - -### HeroTable schema(单行全局,D2 新增 schema 行——接口漂移回写义务见依赖节) - -- 主角不随关卡自动成长,成长 = 天赋 C4 / 奖励侧;Rule 4 豁免同 ActionEconomyTable 先例。 - -| 字段 | 类型/范围 | 语义 | -|---|---|---| -| max_hp | int [1, 999] | 主角最大生命(knob,MVP 值 provisional 出处待查) | -| atk | int [1, 999] | 基础攻击(knob,MVP = 6 原型锚 provisional 归 C3;0 = 加载期校验拒绝——零基线死锁自 schema 层杜绝) | - -## 数值结论与推导 - -> 全部公式零随机、同输入恒同输出(可回放前提);本节只含机制公式——平衡归属见文末显式排除声明。术语:拍 = 行为环里的一格行动(bugbear 环 [攻击, 蓄力, 重击] 有三拍);伏击池 = 敌方侧共享的伏击层数(本轮踩几颗雷就几层,轮末清零);溢出 = 单轮踩雷超过上限的部分,转化为明细行可见、不生效。 - -### F1 行为环推进(ring_advance) - -**结论**:beat(u) = pattern[steps_u mod 环长]、行动完成后 steps_u + 1;指针恒 ∈ [0, 环长)、环长 1(goblin)退化为恒等;死亡即不动手——轮到前被杀本拍不打、步数冻结(永久,随 battle_over 消亡);同种单位同指环首且每结算各恰推进一次 ⇒ 存活者永远同拍(同步性质定理——任何死亡时序都不会让幸存者乱拍)。 - -#### 推导 - -``` -beat(u) = pattern[steps_u mod 环长] 行动前读拍;战斗开始 steps_u = 0(指向环首) -steps_u' = steps_u + 1 行动完成后推进(先作用后推进) -轮到前被杀 → steps_u 冻结(死亡即不动手);行动完成后才死 → 已行动已推进 -``` - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 行为环 | pattern | StringList | 环长 [1,8];MVP 元素 ∈ {attack, charge, heavy} | EnemyTable 行值快照(Rule 10) | -| 已行动次数 | steps_u | int | [0, ∞) | 结算次数的确定函数(零随机) | -| 当前拍 | beat | enum | pattern 元素 | 本结算该单位的行动内容 | - -- 同步性质(定理):同种单位同指环首、每结算各恰推进一次(B1 义务①)→ 存活者永远同拍——任何死亡时序都不会让幸存者乱拍。 -- Output Range:指针恒 ∈ [0, 环长);环长 1(goblin)退化为恒等。极端:heavy 拍前被杀 → 重击永不兑现(冻结于该拍)——玩家"抢在重击前击杀"的读怪收益由此产生(P1)。 -- Example:bugbear——结算 1 攻击(p→1)→ 结算 2 蓄力空拍(p→2)→ 结算 3 前被主角击杀 → 重击不兑现、指针冻结于 2;若结算 3 行动后才死 → 重击已兑现、p 回绕 0。 -- 边界注记:归 B2——指针所有权、存活校验、冻结不变式、环首初始化、跨轮跨图延续;归 B1——死亡判定时机、结算内先后次序、每结算恰一次推进(义务①)。 - -### F2 攻击行为裸伤害构成(raw_attack_damage) - -**结论**:attack 拍 D = atk + m_amb × L、heavy 拍 D = atk × heavy_multiplier + m_amb × L、charge 拍 D = 0(不读伏击池);伏击附加是后置加法、不进倍乘(合成序钉死);池共享不消耗(同结算多敌读同一 L);B2 向 B1 供 (基线, 伏击) 分量二元组。 - -#### 推导 - -``` -attack 拍:D = atk + m_amb × L 基线 + 伏击附加(m_amb = StatusEffectTable.ambush.magnitude,provisional 3) -heavy 拍:D = atk × heavy_multiplier + m_amb × L -charge 拍:D = 0 不读伏击池——空拍零兑付 -合成序:伏击附加 = 后置加法,不进倍乘 -``` - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 攻击基线 | atk | int [0,999](快照) | EnemyTable 行值 | 0 合法(纯伏击伤敌种) | -| 重击倍率 | heavy_multiplier | int [1,16](快照) | 仅 heavy 拍消费 | 无 heavy 拍不读(非校验项) | -| 伏击层数 | L | int [0, min(雷数, cap)] | 兑付时读值(B1 经 query_active) | dur=1 → L = 本轮受理授予数,无跨轮存量 | -| 伏击量纲 | m_amb | int flat ≥ 1;provisional 3 | B3 行值 | 量纲 = 主角 HP 点数(本 GDD 定稿);锚验收归 B4/B1 | - -验算表: - -| 验算 | 读数 | 说明 | -|---|---|---| -| bugbear(atk=4, mult=2)heavy 拍 L=4 | 4×2 + 12 = **20** | 合成序判别非平凡:塞进倍乘得 (4+12)×2 = 32 ≠ 20;L=4 = cap=4 默认下游戏态上界(域内判别值);query_attack 的 L 为调用方注入的判别探针、B2 不校验其游戏态域(游戏态域由 F3 预截流承载——探针取值与游戏态域分离,实现期若给 query_attack 加 L 域守卫须回改 AC-7) | -| goblin(atk=4)本轮开雷 3 颗 | D = 4 + 9 = **13** | attack 拍基础例 | -| 满编 3 goblin、L=4 | 各 4+12 = 16、合计 48(伏击分量 36) | 多敌共享读值例 | - -- Output Range(默认表值,cap/atk/m_amb/mult 调参后随之重算):goblin attack ∈ [4, 16];bugbear attack ∈ [4, 16]、heavy ∈ [8, 20]、charge ≡ 0(cap=4 封顶 L=4)。 -- 池共享不消耗:同一结算多个敌人的攻击各自读同一个 L(共享、非均分、非先到先得);层数扣减唯一入口 = B3 轮末衰减(dur=1 轮末全清)。 -- 分量供给建议:B2 向 B1 供 (基线, 伏击) 二元组而非合后标量——结算明细"伏击 +N"的 P2 归因行需要分量边界。 -- 极端:charge 拍零兑付 → 蓄力轮授予的伏击层当轮全部蒸发(合法推论;反向 = 读怪奖励"蓄力拍前放心贪雷"——D5 教学条目);无负值分支(clamp/地板归 B1)。 -- 量级注记:"L≥2 伏击分量过半"仅 attack 拍成立(6/10);heavy 拍因基线 ×mult 过半点后移(6/14 < 半)——支配边界 L* = ⌈atk×mult/3⌉ 与"过半"口径按拍别分别读取。 -- 边界注记:归 B1——L 读值、clamp/负值/溢杀、hero 侧减伤合成次序、死亡判定与"这一下是否兑现"。 - -### F3 伏击授予与溢出(ambush_grant_overflow) - -**结论**:granted_r = min(当轮新开雷数, cap)(cap 判定在授予前——B1 预截流);overflow_r = 当轮雷数 − granted_r(每颗溢出雷一行"溢出未生效"明细、含来源);L_r = granted_r(debuff 只活一结算:当轮兑付一次、轮末全清、无跨轮存量);守恒 granted + overflow = 当轮雷数、零静默蒸发;max_stack = 16 结构不可达(双重不可达——死护栏非死字段)。 - -#### 推导 - -``` -granted_r = min(当轮新开雷数, cap) cap 判定在授予前(B1 预截流) -overflow_r = 当轮新开雷数 − granted_r 每颗溢出雷一行"溢出未生效"明细(含来源) -L_r = granted_r debuff 只活一结算:当轮兑付一次、轮末全清、无跨轮存量 -``` - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 当轮新开雷数 | mines_r | int | [0, 8](结构界 = AP) | round facts 经 B1 收集;复开不可能(A2 棋盘面语义) | -| 单轮伏击授予上限 | cap | int(行值 knob) | [0,16],默认 4 | 0 = 该行敌种免疫伏击(全溢出可见);F1 条款 3 供给值的来源字段 | -| 当轮授予数 | granted_r | int | [0, 4] | B1 编排期逐雷 apply_effect;每雷恰一次转化(义务②) | -| 溢出量 | overflow_r | int | [0, 8] | 明细行数;呈现归 B5/D1(义务⑥) | - -验算表: - -| 场景 | granted | overflow | 说明 | -|---|---|---|---| -| cap=4、开雷 6 | 4 层 | 2 行 | 本结算每个攻击行为附加 +12 | -| cap=4、开雷 5–8(灾难轮) | 4 | 1–4 | cap 反灾难护栏绑定域 | -| cap=0、开雷 m | 0 | m | 免疫极端——全溢出、伏击全无效但全部可见(P2 诚实) | - -- cap 默认 4:反灾难护栏——绑定阈 = 单轮 5–8 雷灾难轮,溢出协议获真实消费域。 -- 结构不可达验证:单轮 L ≤ min(8, cap=4) = 4 < 16,且 dur=1 无跨轮存量 → B3 满层拒绝对 ambush 行双重不可达(不可达性由 dur=1 ∧ AP ≤ 8 承载、与 cap 无关——M=16 是死护栏非死字段)。 -- 重验触发:ambush.duration ≥ 2 ∨ AP 经济改动 ∨ ambush 新增非 mine_hit 授予源(旗源授予不计入 mines_r、cap 预截流漏账 → L 可达 16 触发 B3 满层拒绝、与 F3/B3 双溢出协议冲突——OQ6 标错惩罚采纳时强制重验)。 -- 边界注记:归 B1——预截流编排、授予次序(行主序雷格序为建议序)、每雷恰一次、溢出行协议。 - -### F4 条款 3 供给口径(clause3_supply) - -**结论**:每结算敌方伏击暴露 = k × L × m_amb(k = 本结算存活敌中攻击/重击拍的单位数,确定性可算);每结算结构上界 = unit_count × min(AP 上界, cap) × m_amb(cap > AP 界时 cap 腿松弛);跨结算累计 = 轨迹量、非表值、不设上界(dur=1 每结算清零);B1 对账取"每结算"口径即可闭合、无需战斗长度假设。 - -#### 推导 - -``` -每结算敌方伏击暴露(精确式)= k × L × m_amb k = 本结算存活敌中攻击/重击拍的单位数(确定性可算) -每结算结构上界 = unit_count × min(AP 上界, cap) × m_amb - cap > AP 界时 cap 腿松弛——默认 3×min(8,4)×3 = 36;cap≥8 时真可达上界 72 而非 144 -跨结算累计 = 轨迹量,非表值、不设上界 dur=1 每结算清零、无存量累积;战斗再长不叠加同一层 -``` - -- 上界读数:默认满配 3×min(8,4)×3 = 36、cap ≥ 8 时真可达上界 72 而非 144;默认行值 unit_count=1 下 = 12。 - -- 口径依据(用户定稿原话转写):"不设(每战)上界——踩雷的 debuff 只存在一回合:在一次结算中有效,之后就没有 debuff 了。"——debuff 单结算寿命 = 自然边界。 -- B3 红警闭环:ambush 量纲已由 F2 供给(registry OQ2 关闭条件);条款 3 左臂(安全格 buff 当量)载体 = 主角基础攻击(恒在,attack_up 复活)与 B4 奖励行值;闭合回执见 registry clause3_supply(B1 F4)。 - -方向性预检验算表(provisional——真实对账 = A1 actuals p10 + B1 归一表): - -| 项 | 读数 | 说明 | -|---|---|---| -| 盲猜端单格 P(雷) | ≈ 0.5–0.7 量级 | 有信息挖掘端趋 0(A1 参考:密度 0.10 / target 0.95)——不等式真实战场在残余盲猜集 | -| 右臂(cap=4) | 0.64 × 12 ≈ 7.7 | 条款 3 右臂代理读数 | -| 左臂(条款 2 最低档锚 +50pp) | 0.36 × 50 = 18 | 条款 3 左臂代理读数 | -| 方向稳健裕度 | ≈ 2.3× | registry clause3_supply.direction_precheck 同步回写 | - -- 量级注记(支配边界):atk=4 时 L ≥ 2 伏击分量即过半——常态支配的修正入口 = 敌种 atk 曲线(C3 所有权)或 m_amb 锚(B4/B1 验收),本 GDD 权限外、仅登记方向;cap=4 只治尾部灾难(5–8 雷轮)。 - -### 显式排除声明 - -| 对象 | 归属 | -|---|---| -| 伤害 clamp/地板/溢杀、乘区合成、减伤读法、死亡判定时机 | B1 SettlementTable | -| F1 条款 3 不等式闭合对账(输入 = A1 actuals p10,非 target 参数) | B1 单一 owner | -| m_amb(+3)行值锚验收、weaken 档位 | B4/B1(A3 条款 2/3) | -| 敌种 hp/atk/pattern 曲线数值、难度修饰 | C3 | -| 伤害道具/奖励池(hero 侧伤害来源) | B4 | - -B2 只对"套路怎么转、一下打多少的两块拼图、一轮吃几层、交给 B1 对账的口径"负责。 - -## 状态 - -| 状态 | 进入条件 | 行为/出口 | -|---|---|---| -| Unspawned | 构造后未实例化 | 无接口副作用;唯一出口 = B1 编排实例化 | -| Alive | 实例化(行值快照 / hp 入参) | 可被指定目标(顺位)、按行为环作用、计入全灭判定;受击 hp 递减 | -| Dead | hp = 0(判定时机归 B1) | 移出顺位、不再作用、不计入"未灭";不可逆(MVP 无复活);句柄保留只读可查(query_beat 冻结值) | -| Despawned | battle_over(B1 编排 despawn_all) | 全部单位状态消亡、不跨战斗;逻辑失效态——失效句柄查询返回空 + 诊断、作用接口拒绝;唯一出口 = 重新 spawn(新战斗) | - -不变式(debug 断言口径):hp ∈ [0, max_hp];敌单位数 = unit_count(战斗内不增——summon 未实现);行为环指针 ∈ [0, 环长)(Alive 期间按结算推进;charge 空过是环位置语义、非独立状态);违规 = debug 断言中止(进程致命保留给 D2 数据通道)。行为级证据 = AC-1(数)、AC-3(指针)、AC-4/AC-6(hp floor)。 - -## 边界情况 - -| 条件 | 行为 | 依据 | -|---|---|---| -| EC1 敌人在轮到它行动前被击杀 | 本拍不打、指针冻结("死亡即不动手");行动完成后才死 → 已行动已推进(heavy 已兑现) | F1 / Rule 4 | -| EC2 同种单位部分死亡 | 存活者永远同拍(同步性质定理)——幸存者轮转不受任何死亡时序干扰 | F1 | -| EC3 全体敌单位死亡 | 存活敌集 = ∅、"敌人全灭"成立、胜负判定归 B1;单体/AOE 无有效目标;敌侧伏击池随轮末衰减自然清空(无兑付者) | Rule 1 | -| EC4 主角 hp = 0 | 战斗失败判定素材(判定时机归 B1);battle_over → 全部单位 Despawned——不存在"主角死后敌继续攻击"的中间态 | Rule 1 | -| EC5 战斗中敌单位数 ≠ 本战实际数量 n | 结构不可能(MVP 无 summon/增援/分裂;n = B1 encounter 骰定值——区间语义下实例化后仍不增)——出现即 debug 断言中止(进程致命保留给 D2 数据通道) | 实例不变式 | -| EC6 敌种行 cap = 0(免疫伏击的合法极端) | granted ≡ 0、每颗雷各一行"溢出未生效"明细(全部可见、全部无效——P2 诚实);该遭遇条款 3 右臂仅剩基线伤 | Rule 5 / F3 | -| EC7 单轮踩雷 5–8 颗(灾难轮) | granted = 4、溢出 1–4 行;本结算每个攻击行为附加恒 +12 | F3(cap 反灾难护栏绑定域) | -| EC8 全部存活敌同拍蓄力(charge 轮) | 零兑付(k=0);该轮新踩的雷照常授予、轮末照常全部蒸发(合法推论 + 读怪奖励——D5 教学条目已登记) | F2/F3 | -| EC9 敌单位在 heavy 拍前被杀 | 重击永不兑现、指针冻结于 heavy 拍——"抢杀窗口"读怪收益(P1) | F1 | -| EC10 敌种 pattern 环长 = 1(goblin) | mod 1 恒等 → 每拍 attack、无自然空窗(兑付率 ρ=1——该敌种伏击威胁无衰减节拍) | F1 | -| EC11 战斗跨多张扫雷图 | 单位状态(hp/指针)与敌侧伏击池跨图延续(换图/刷新不清空——B3 EC8 同款);雷格兑付资格随图消亡、新图新雷新资格(A3/A2 域,B2 无从感知也无须感知) | Rule 4 | -| EC12 战斗中热重载 EnemyTable/HeroTable | D2 战斗中 reload 拒绝门(D2 EC8);已实例化单位不受任何表重载影响(行值快照) | Rule 10 | -| EC13 行集缺行 / 请求敌种悬空 | D2 R1 实体键精确匹配 → 悬空引用致命(D2 Rule 6 通道);B2 无软回退(错误配置上线比崩溃更伤——P1/P2 信任底线) | D2 R1/Rule 6 | -| EC14 遭遇坐标越界(level_index < 1 / node_depth < 0) | D2 R1 前置守卫致命(D2 EC14)——B2 不自行 clamp | D2 EC14 | -| EC15 unit_count = 1 | 固定顺位顺延与 AOE 分流无消费者(Rule 7 空转)、AOE ≡ 单体——合法退化,非错误 | Rule 7 | -| EC16 主角 hp 入参越界(> max_hp 或 ≤ 0) | 拒绝实例化(false + debug 诊断,承 A3 拒绝口径;进程致命保留给 D2 数据通道)——编排方供给异常显式暴露、不静默吸收 | Rule 9 | -| EC17 同结算内"踩雷授予"与"敌攻击兑付"的先后 | 授予在编排期先于兑付 → 本轮踩的雷当轮即兑付(若该轮有攻击拍);读值语义半句归 B2(无内部缓存、无时间维度——AC-7 腿4)、次序半句归 B1(义务①②编排域) | F2/F3 | - -## 依赖 - -**上游**:D2(hard)——EnemyTable schema + 双敌种行回填(本 GDD 为回填 owner)+ HeroTable 新增(走 D2 接口漂移规则回写其 Core Rules 表清单)+ ConfigDB 单点读取(R1 行解析)。无其他玩法上游;A2/A3/A1 的事实均经 B1 结算编排转化(零直接接口)。 - -**下游与邻接**: - -| 依赖方 | 性质 | 接口 | -|---|---|---| -| B1 | hard(provisional——B1 未设计) | 单位状态查询/受击/推进接口(冒烟 API 面全表)+ B1 侧义务清单 6 项(缺项即 blocking,见义务台账):① 推进每结算恰一次 ② 雷→伏击恰一次 ③ clamp/死亡时机成文 ④ 条款 3 对账(cap 表值 + 量纲 + A1 actuals p10)⑤ 默认目标/AOE 分流 ⑥ 溢出行协议 | -| B3 | 相邻(零运行时依赖——验收锚关系非依赖边,B3 先例同款) | ambush/weaken 的量纲与作用域验收锚归 B2(Rule 6 兑现 registry OQ2);side-wide MVP 兼容(B3 接口零变更);target_ref 扩展位义务(首个单体效果上线时补列,随批:B1 归集/D1 呈现裁决) | -| B4 | soft(provisional) | 伤害道具默认目标消费(Rule 7 固定顺位);伏击清单扩展联动(新增 mine_hit 行时本 GDD 同步修订);B4 道具/增益 = 主角基础攻击之外的规划面伤害(非唯一伤害来源);attack_up 消费面 = 主角战斗段先手攻击(Rule 9 / B1 战斗段) | -| A2/A3 | 间接(零直接接口) | 雷/旗事实经 B1 转化;AP 界(单轮开雷 ≤ 8)= cap 默认值结构来源;weaken 档位锚归 B4/B1(A3 条款 2),B2 无表值 | -| A1 | 间接 | 雷数分布影响伏击吞吐——条款 3 对账消费 A1 actuals p10(B1 义务,非 B2 域) | -| C3 | 下游(soft,provisional) | 难度修饰施加点/算式归 C3 定稿(Rule 10);EnemyTable/HeroTable 曲线数值调参所有权归 C3(A1 参考行先例——MVP 默认值全部 provisional);多敌种同深度选择规则共裁;新敌种投放节奏 = 关卡命脉(MVP 敌信息总量 = 2 环 3 行为、L2 见底——每关须有新敌种或新环段投放;goblin 单拍环 playtest 证伪项 OQ8) | -| C1 | 下游(soft,provisional) | 遭遇构成(战斗触发、(L,D) 供给、unit_count 覆盖语义)归 C1;跨战斗 HP 持久性归 C1/C2 | -| D1 | soft | 视觉推测型呈现义务 4 项(缺项即 blocking,见义务台账);敌单位 HUD(血条/顺位/姿态)呈现;顺位标记资产需求(呈现契约表 #3) | -| B5 | soft | 行为环视觉状态表现(蓄力姿态等——预告时序 Rule 8⑤);结算明细敌方行呈现(数据源 = B1 流水;首个 heavy 兑付明细行分量高亮建议——首遇校准课,ux 注记非硬义务) | -| D5 | soft | 读怪教学(敌种环模式可学、顺位规则)+ "蓄力拍前放心贪雷"教学(charge 轮伏击池蒸发 = 读怪奖励的涌现素材——F2 极端行为)+ 首次蓄力姿态一次性提示候选("它在蓄力,这轮踩雷不挨打"——L1 goblin 无 charge 拍、首课在 L2;MVP 可先上一次性提示、不等垂直切片完整教学)——垂直切片期 | - -- 双向一致性核对(systems-index 依赖分层表):B2 ← D2 ✅(索引仅此一条硬边,其余为事实读取不列边——D2 注记口径);B1 ← …B2 ✅ · C3 ← D2,B2 ✅ · C1 ← C2,C3,B2,B4 ✅。 - -### 义务台账(本 GDD 登记,缺项即 blocking——B3 对 B1 登记先例) - -对外引用口径:B1 清单在 B1/registry 侧引用名为「B2 义务①–⑥」(b1-settlement 上游表同口径);D1 清单引用名为「D1 呈现义务①–④」。 - -| 编号 | 内容 | 对侧 | 状态 | -|---|---|---|---| -| B1-① | 单位接口调用集中在结算编排、行为环推进每结算恰一次(double-advance 无守卫——信任编排,B3 义务⑥同款);结算内调用序成文:兑付读值 query_attack → 受击上报 apply_damage → 推进 advance——倒序会读到下一拍(F2 依赖当前拍;比 double-advance 更常见的实现错误),B1 冒烟须回放结算步流 | B1 | 已登记 · 缺项即 blocking | -| B1-② | 雷→伏击事实转化恰一次(每颗雷格实例至多一次;B3 EC6 对侧同款) | B1 | 已登记 · 缺项即 blocking | -| B1-③ | 伤害 clamp/负值/溢杀语义与死亡判定时机成文(Rule 1 B1 域) | B1 | 已登记 · 缺项即 blocking | -| B1-④ | F1 条款 3 闭合对账:消费 B2 advantage_per_round_cap 表值 + 伏击量纲(Rule 6 换算)+ A1 actuals p10(非 target 参数——A1 登记口径) | B1 | 已登记 · 缺项即 blocking | -| B1-⑤ | 默认目标规则消费与单体/AOE 分流(Rule 7;顺位快照 = 生成序) | B1 | 已登记 · 缺项即 blocking | -| B1-⑥ | 伏击 cap 溢出的"溢出未生效"明细行协议(Rule 5 后半;呈现归 B5/D1) | B1 | 已登记 · 缺项即 blocking | -| D1-① | enemy_id→图像线索映射清单成文(形态/姿态↔行为状态;预告时序 = 下一拍预告、挖掘期全程可见〔Rule 8⑤〕;含强度档位与环长直觉编码说明〔Rule 8②〕;形状+色相双通道,art-bible 约束) | D1 | 已登记 · 缺项即 blocking | -| D1-② | 线索映射全局恒定(映射键 = enemy_id——跨 run 恒定、禁止重掷;Rule 8③ 的呈现侧承载) | D1 | 已登记 · 缺项即 blocking | -| D1-③ | 单位顺位与存活可读(固定顺位规则的推测前提——Rule 7;顺位标记资产需求见呈现契约表 #3) | D1 | 已登记 · 缺项即 blocking | -| D1-④ | 敌方 side 池状态呈现口径(伏击层数经 B1 流水——B3 敌侧延伸) | D1 | 已登记 · 缺项即 blocking | - -### registry / 接口漂移回写义务 - -| 编号 | 内容 | 对侧 | 状态 | -|---|---|---|---| -| R-1 | B3 单敌假设回验结果 = 不成立(定多敌)→ 触发 B3 预登记的接口漂移条款("定多敌即触发 target_ref 接口漂移补列"):registry status_effect.single_enemy_assumption 注记更新 + systems-index 门禁记录登记(B3 GDD 正文不改,以其"以 registry 为准"先例承载) | B3 / registry | 待回写(Phase 5b/5d) | -| R-2 | 索引 B2 行描述为窄口径("敌人类型/词条、目标选择规则")→ Phase 5d 更新进度行时补战斗单位系统身份(CD 门禁扩容口径) | systems-index | 待回写(Phase 5d) | -| R-3 | registry status_effect.ambush 量纲定稿注记回写(F2 定稿——B3 registry OQ2 关闭条件) | B3 / registry | 待回写(Phase 5b) | -| R-4 | HeroTable 新增 → D2 Core Rules 表清单 + registry 接口漂移回写 | D2 / registry | 待回写 | - -## 呈现与 UI 契约(数据面义务——B2 无自有渲染面,呈现归 D1/B5) - -| # | 数据面义务 | 归属/呈现 | -|---|---|---| -| 1 | 敌种视觉身份(形状双通道):双敌种剪影必须一眼可辨(视觉锚 2 形状+颜色双通道、色弱可用性);敌种形态承载强度档位直觉编码("大个子多半有重击"式——Rule 8② 的呈现侧) | D1/B5,art-bible 约束 | -| 2 | 行为环视觉状态(承重规格):每个敌种的每类行为(attack/charge/heavy)对应恒定且互异的视觉状态——bugbear 蓄力拍 = 可辨识的蓄力姿态;映射每 run 恒定、禁止重掷(Rule 8③ 护栏;线索清单成文义务 = D1×4①)。MVP 敌种视觉状态清单:goblin 1 态(攻击)、bugbear 3 态(攻击/蓄力/重击) | D1/B5 | -| 3 | 资产需求下限(存活意图态之外三类):受击反馈(多敌同屏归因"谁挨了打"的 P2 前提——两敌种可共用通用受击反馈一组、须显式登记)、死亡表现("重击被掐灭""抢杀窗口"兑付可见性是 P1 兑付点——死亡瞬间须可辨识、不得直接消失)、顺位标记呈现元素(数据面 = B2 顺位查询;资产与呈现归 D1×4③、同等 blocking)——合称资产需求下限,D1/B5 照单生产、不得隐式缺席 | D1/B5 | -| 4 | 单位呈现数据供给:hp/max_hp(血条数字)、顺位(固定顺位目标的可读前提)、存活态、当前拍视觉状态——数据源 = B2 单位状态查询(经 B1 编排流水) | D1 | -| 5 | 敌方增益呈现:伏击池层数的 HUD 呈现口径(D1×4④——数据源 = B1 流水经 B3 投影);结算明细敌方行使用分量二元组("攻击 13 = 基线 4 + 伏击 9"——F2 供给建议)——P2 归因的敌侧兑付面 | D1/B5 | -| 6 | 视觉锚适用与双舞台陷阱:血条/伤害数字暗色底高对比(锚 1);B2 无棋盘渲染面——敌单位出现在棋盘上还是独立战斗场景 = B5 前的"战斗表现美术测试"锁定(game-concept 双舞台资产管线陷阱),B2 只锁数据面与状态清单、不预设舞台;敌人层绘制优先级:锚 3 优先级表(数字>小人>旗>变异纹理>底色)不含敌单位——art-bible 创建前须裁决敌人层插入位置(姿态精灵与数字/旗/小人的遮挡关系),随"战斗表现美术测试"一并锁定,否则"哪些数字可信"的心智模型分裂 | D1/B5 / art-bible | -| 7 | UI 三项义务(均为已登记义务的数据面):① 敌单位 HUD(血条/顺位/姿态——D1×4③)② 结算明细敌方行(分量二元组 + 伏击溢出行——B1 义务⑥协议、B5 呈现)③ 教学口径(读怪 + 蓄力贪雷——D5);MVP 无敌图鉴/敌人列表 UI(敌种名录 2 个、学习成本内),名录扩展时再议(垂直切片) | D1/B5/D5 | -| 8 | 音频:MVP 无需求(攻击/死亡/蓄力音效归 D4 Alpha;临时 SFX 随垂直切片——AD 项先例);蓄力拍的音频前摇是"读招"的潜在第二通道——登记为垂直切片可选项(非 MVP 义务) | D4 | - -## Tuning Knobs - -| Knob(表行值,D2 承载) | 默认 | 调过高 | 调过低 | -|---|---|---|---| -| EnemyTable.unit_count | 1(provisional) | 同步轮转下齐射爆发(全攻轮 side 伤 ×N,非平滑) | =1 时 AOE 分流/顺位顺延零消费者(Rule 7 空转) | -| EnemyTable.hp | 18(provisional,出处待查) | 战斗拉长 → 伏击跨轮累计放大 | 秒杀级 → 惩罚无兑现窗口、伏击机制名存实亡 | -| EnemyTable.atk | 4(provisional,出处待查) | 伏击稀释 → 踩雷无感(P3"风险与收益同源"断) | 支配边界 L*→1,惩罚接管战斗、敌种属性被 C3 曲线稀释 | -| EnemyTable.heavy_multiplier | 2(provisional) | heavy+伏击同拍成秒杀拍(读怪规避价值升、容错归零) | =1 时 heavy ≡ attack、三拍环退化两拍(读怪素材坍缩) | -| EnemyTable.advantage_per_round_cap | 4(本 GDD 定稿) | →8 时溢出协议死码回归、支配区扩大、条款 3 右臂膨胀 | ≤2 时 cap 常态绑定 → 边际惩罚归零("再多踩也不痛")、溢出行噪音、P3 归因梯度塌陷 | -| HeroTable.max_hp | provisional(出处待查) | 容错升、治疗道具贬值 | 灾难轮秒杀感(与 cap 交互) | -| HeroTable.atk | 6(原型锚 provisional 归 C3;域 [1,999]、0 加载拒绝) | 击杀预算贬值 → 道具供给/敌 hp 曲线联动重算(C3,禁止独立调参) | 战斗拖长、基础攻击存在感稀薄(道具侧支配) | - -- 非 knob(结构冻结):行为枚举七类封闭(扩展 = GDD 修订非调参)、死亡即不动手、先作用后推进、伏击池共享读法、合成序后置加法、伏击量纲 = HP 点、固定顺位规则、每行集恰一敌种、零随机——修订走本 GDD 流程。 -- Knob 交互:cap × atk(支配边界 L* = ⌈atk×mult/3⌉ 联动)禁止独立调参——联动评估归 B1 条款 3 闭合对账;unit_count × cap(单结算上界双线性);heavy_multiplier × atk(heavy 拍支配)。pattern 内容(环长/charge 占比 → 兑付率 ρ)属内容行调参,所有权归 C3。 -- 零伤害死局组合护栏(OQ9):hero atk=0 已被 HeroTable schema 域下界杜绝([1,999]、0 加载拒绝)——"全场恒零伤害、战斗永不定局"结构不可能;残余退化 = 行 atk=0 且 cap=0 → 无威胁敌(战斗可胜但零风险——内容调参禁区注记,非死局);跨表量级护栏(atk×mult 上界 vs max_hp 域)owner = 实现期 ADR/D2;混编遭遇(多敌种同战斗)下 side 池 cap 取哪行值未定义——当前结构(每行集恰一敌种)恒单行值,混编引入时随 OQ7 改键一并裁决。 -- 调参所有权:MVP 全部默认值 provisional、曲线数值归 C3(A1 参考行先例);B1 条款 3 对账落定前,cap 与伏击量纲相关联调须重跑方向性预检并同步 registry(接口漂移义务)。 - -## 验收标准 - -### 测试口径 - -| 口径 | 要点 | -|---|---| -| 测试载体 | B2 是单位层纯逻辑类——非 autoload、无场景依附、无自有渲染面。冒烟载体 = `godot --headless --script`(承 D2 冒烟框架;脚本 extends SceneTree 以获得 quit(code)、ConfigDB autoload 由脚本显式实例化);单位容器与两表 schema 经 class_name 直引实例化(每用例全新实例、无跨用例状态——AC-17 扫描对该实例化路径豁免);每用例先 `reset_diagnostics()`(D2 冒烟协议,全局声明) | -| 被测面与调用方 | B1 未实现(设计顺序第 9 位)——冒烟直接驱动 B2 最小 API 面(冒烟脚本扮演编排方,按"实例化 → 查询 → 受击 → 推进 → 消亡"结算编排序列驱动);B1 就绪后改走真实调用方(结算编排)、断言口径不变 | -| 时序口径 | B2 无结算 API——"一次结算"在冒烟中 = 调用方对每个存活敌单位恰一次 advance(含兑付读值与受击注入)的构造窗口(主角无行为环、不在推进域内——Rule 4);"每结算恰一次推进"是 B1 义务①——冒烟以构造序保证前提、不断言编排正确性;"轮到该单位之前被杀" = 同一构造窗口内 advance(u) 之前的 apply_damage(u, …);多步 GIVEN 均给出构造序列 | -| 只读观测量 | 敌单位投影七字段 enemy_id · hp · max_hp · atk · heavy_multiplier · pattern(快照)· advantage_per_round_cap(快照)+ beat(当前拍)+ 存活态;hero 投影 hp · max_hp · atk | -| 相位与投影 | Alive/Dead 由 query_alive 成员差分推断(Dead 句柄经 query_beat 冻结值可读);Despawned = 逻辑失效态(状态位实现——容器为 RefCounted 纯逻辑类、对象不提前释放;失效句柄上查询返回空 + 诊断、作用接口拒绝;瞬态纪律同 A3 RoundEnd);Unspawned 无观测量;投影一律为快照(pattern 等引用字段返回拷贝——原地改写返回值不影响容器,AC-11 腿 3);容器公开可写属性为零(hp 等仅经 apply_damage 变更——AC-17 扫描域);实例不变式(hp ∈ [0, max_hp]、敌单位数 = unit_count、指针 ∈ [0, 环长))为 debug 断言自守——违规路径不可由封闭 API 构造(负空间)、不经冒烟断言(进程致命保留给 D2 数据通道);行为级证据 = AC-1(数)、AC-3(指针)、AC-4/AC-6(hp floor) | -| 期望值纪律 | hp(18)/atk(4)/heavy_multiplier(2)/unit_count/max_hp 均为 provisional knob(Tuning Knobs 节)——各 AC 的 THEN 具体数值按当前 ConfigDB 表值推导、不写死;记号:h_g/a_g(goblin 行)、h_e/a_e/m_e(bugbear 行)、u_c、M_h、c_r(所在行 cap)、p_g/p_e(pattern 表读值)、m_amb = StatusEffectTable.ambush.magnitude 表读值(仅作 AC-7 注入值来源);pattern 环内容属内容行调参(C3 所有权)——轨迹断言一律按 p 表读值推导;L/mines_r/n 等入参为构造选择(显式登记)、期望值由表读值推导 | -| 结构定值断言 | 合法集:敌种 id 集 {goblin, bugbear, ogre_chief}(Rule 3 MVP 收窄——C3 修订批扩容三敌种)、pattern 元素域 {attack, charge, heavy}(枚举封闭)、每行集恰一敌种、HeroTable 单行、HeroTable.atk 域 [1,999](0 加载拒绝;MVP 值 6 provisional 不作定值断言) | -| 致命类收窄与 manifest | B2 冒烟设恰两根致命夹具(均为 B2 表特有校验类别):runner manifest 退出码行 rowset_dup→≠0 · pattern_reserved→≠0(独立 headless 进程、游戏通道,D2 AC-2b 协议同型);其余致命类别(D2 R1 悬空敌种/行集缺行〔EC13〕、遭遇坐标越界〔EC14〕、通用枚举域/域校验)由 D2 AC-2 同类别 loader 级夹具承载(表无关,豁免声明收窄保留——B2 冒烟仅以合法坐标驱动 spawn);HeroTable 单行类别条件性(可选根);schema 侧以程序构造断言域类别(AC-12/13) | - -### 冒烟 API 面(provisional,封闭枚举——实现期 ADR 定名) - -| API | 签名 | 语义与返回口径 | -|---|---|---| -| spawn | `spawn(level_index, node_depth, hero_hp, n) -> bool`(n = 本战实际数量 override——B1 encounter 骰;定值行/省略 n = unit_count 表值) | 解析遭遇行 → 行值快照 → 实例化 n 个敌单位(行主序生成序)+ 主角(hp 入参,MVP 冒烟以 max_hp 入参——Rule 9);Alive 相位重复 spawn → false + 诊断(相位守卫) | -| query_alive | `query_alive(side) -> Array` | side ∈ {hero, enemy};生成序稳定枚举;只读 | -| query_beat | `query_beat(u) -> String` | 当前拍 ∈ pattern 元素;Dead 句柄保留只读可查(冻结不变式的观测量);hero 句柄 → 空 + 诊断(主角无行为环——Rule 4);只读 | -| query_attack | `query_attack(u, L, m_amb) -> {baseline, attach, total}` | F2 分量供给面;L/m_amb 由调用方供值(B1 兑付读值的冒烟等价——B2 对 B3 零运行时依赖的边界由此保持);L 为判别探针入参、B2 不校验其游戏态域(游戏态域由 F3 预截流承载);Dead 句柄 → {0, 0, 0} + 诊断;只读 | -| apply_damage | `apply_damage(u, n) -> bool` | 受击上报;hp 递减、floor 0 → Dead;n ≤ 0 → false + 诊断(无伤害作用非法);Dead 句柄 → false + 诊断(MVP 无复活) | -| advance | `advance(u) -> bool` | 存活才推进("先作用后推进"的推进半);false 分两级:存活校验失败 = 轮到前被杀的预期冻结、无诊断(EC1 常态路径——抢杀窗口是设计卖点,诊断刷屏会淹没信号);相位/句柄失效 = false + 诊断;hero 句柄 → false + 诊断 | -| default_target | `default_target() -> u\|null` | 固定顺位供给面;只读 | -| ambush_grant_plan | `ambush_grant_plan(mines_r, cap) -> {granted, overflow}` | F3 机制算术纯函数——B1 预截流编排的消费面;只读 | -| despawn_all | `despawn_all() -> bool` | battle_over 消亡;重复调用 → false + 诊断(重复调用守卫) | - -- 返回口径:全部布尔/计数返回 = 受理/拒绝(A3 全 API 布尔口径同款)——"拒绝"直接断言返回值,附 debug 诊断、非进程致命(进程致命保留给 D2 数据通道);五个 query 面(query_alive / query_beat / query_attack / default_target / ambush_grant_plan)只读、无副作用。 -- 封闭枚举即负空间验收形态:无 summon/增援 API(EC5 负空间——战斗内不增员)、无复活 API(Dead 不可逆)、无重置/换图 API(EC11 跨图延续的结构前提)、无伏击池写 API(B2 无池——L 恒由调用方注入,EC17 读值语义);新增上述任何入口 = 接口漂移(GDD 修订非调参)。 -- ADR 前置裁决项:query_attack / ambush_grant_plan 两 face 若实现期裁决归 B1(F2"供给建议"与 F3"预截流归 B1"边界注记存在张力),对应 AC 腿迁移至 B1 冒烟、断言口径不变(OQ①)。 - -### 夹具策略 - -| 根 | 构成 | 服务 | -|---|---|---| -| 默认根 | 干净检出:EnemyTable 双敌种行 + HeroTable 单行 | 全部分支行为 AC | -| enemy_multi_unit | D2 全表清单拷贝 + EnemyTable 仅将 (L_a, D_a) 行(bugbear——三拍环)unit_count 置 3(其余字段域内合法;登记值 u_c_f = 3) | 多敌 AC(AC-5 / AC-7 腿4 / AC-9 / AC-10 腿2) | -| enemy_reloaded | D2 全表清单拷贝 + EnemyTable 数值漂移(登记:hp/atk/advantage_per_round_cap 各 +1、pattern 不动——快照差分判定用) | AC-11 | -| enemy_rowset_dup_species(致命) | D2 全表清单拷贝 + EnemyTable 默认行 + 追加一行与 (L_g, D_g) 行同 (level_index, node_depth) 而 enemy_id 相异("goblin_twin",其余字段域内合法)→ 每行集恰一敌种违规 | B2 表结构致命校验的进程级落点——manifest rowset_dup→≠0(B3 status_effect_dup_key 同型) | -| enemy_pattern_reserved(致命) | D2 全表清单拷贝 + EnemyTable (L_g, D_g) 行 pattern 追加预留值 "guard"(其余合法)→ pattern MVP 校验域拒绝预留值 | Rule 4 fail-fast 的 loader 集成缝落点——manifest pattern_reserved→≠0(A1 solver_rules 冻结先例) | -| hero_extra_row(可选根) | HeroTable 置两行(域内合法——单行全局违规) | 单行校验落点若实现期 ADR/D2 裁定在 loader 缝则启用(manifest 行 hero_rows>1→≠0),否则程序构造承载(AC-13)——可选、两处恰一承载 | - -- 行集登记常数协议(A1 黄金向量 / A2 板登记同源):(L_g, D_g) = goblin 行坐标、(L_a, D_a) = bugbear 行坐标,逐坐标手工推导记录入版本库;失效处置 = 先复核登记、登记无误即实现缺陷。 -- 多敌根选 bugbear 行(三拍环)保证判别力:goblin 行环长 1 恒 attack → 混合拍 GIVEN 不可构造、同步断言零判别力、双单位读值不可构造;改 bugbear 行后混合拍经对单单位重复 advance 构造(冒烟构造序可越出"每结算恰一次"契约——B2 无守卫、构造自由度成立)。 -- 显式声明:夹具值非 MVP 内容调参结论(Tuning Knobs 默认 unit_count = 1——多敌语义在默认根上零消费者,多敌根是 Rule 2 的测试承载、仅供冒烟)。 -- 换根加载经 `load_tables(root, collect_only=true)` 直调(非 D2 `reload()` 路径:不过 set_reload_gate、不发 config_reloaded——门语义归 D2 AC-16/B1,B3 AC-15 同款);程序构造(AC-12/AC-13):两 schema 类 class_name 直引实例、不经 load()/preload();行为夹具根经 `--data-root=` 注入(仅 debug、不入 data/tables/——D2 夹具纪律);各 AC 声明其表根、用例间无顺序依赖。 - -### 覆盖声明(out-of-scope——deferral 生效条件 = B1×6 + D1×4 义务清单,均缺项即 blocking) - -| deferral 项 | 生效条件 / 承载 | -|---|---| -| B1×① 行为环推进每结算恰一次与结算内先后次序(double-advance 无守卫——冒烟单调用方次序即构造序,B3 义务⑥同款) | B1 义务① | -| B1×② 雷→伏击事实转化恰一次 + 编排期授予/预截流调用次序(F3 编排半、EC17"先转化后兑付"次序半句) | B1 义务② | -| B1×③ 伤害 clamp/负值/溢杀语义与死亡判定时机(冒烟只断言 hp 递减、floor 0 与 Dead 翻转——"这一下是否兑现"归 B1) | B1 义务③ | -| B1×④ F4 条款 3 闭合对账(cap 表值 + 量纲 + A1 actuals p10——冒烟只供分量面与 k 可算性) | B1 义务④ | -| B1×⑤ 默认目标消费与单体/AOE 分流(冒烟只断言 default_target 供给面) | B1 义务⑤ | -| B1×⑥ 溢出"溢出未生效"明细行协议(呈现归 B5/D1——冒烟只断言 overflow 计数会计) | B1 义务⑥ | -| D1×①② 图像线索清单成文与映射每 run 恒定(Rule 8 视觉面——视觉映射不可 GIVEN-WHEN-THEN;验收形态 = 映射键契约〔enemy_id〕+ B2 侧行为级承载:行为环零随机可学〔AC-3/AC-15〕) | D1 义务①② | -| D1×③ 顺位与存活可读呈现 | D1 义务③ | -| D1×④ 敌方 side 池呈现口径(B3 敌侧延伸) | D1 义务④ | -| EC8 池蒸发腿(dur=1 轮末清池——B3 AC-8/AC-9 既有覆盖,跨引不重复;B2 侧零兑付半 = AC-7 腿3 / AC-9 腿1) | B3 AC 既有 | -| EC13/EC14 端到端致命(D2 R1/EC14 既有通道) | D2 AC-2(manifest 豁免) | -| Rule 10 后半难度修饰施加点(B2 以实例化后数值运作——修饰算式无表值可断) | C3 provisional | -| 跨战斗 HP 持久性 | C1/C2 | -| 曲线数值与遭遇分布定值(AC-14 显式不作分布定值断言) | C3 | -| atk 激活裁决——已退役:基础攻击恒存在,域断言由 AC-13/AC-14 承载 | 无遗留义务 | -| Rule 8"不直接显示数值"负空间(无意图数值 API——冒烟 API 封闭枚举承载) | API 封闭 | -| qa-lead 缺口预检 7 项处置:预检 1/2 入 OQ①②;预检 3/4 随批修正 F4 满配语境与 EC17 切分;预检 5–7 承载于 ADR 裁决项 / HeroTable 可选根 / 坐标登记协议 | 已处置 | - -### AC 清单(Given-When-Then,编号不变) - -| AC | Given | When | Then | 覆盖 | -|---|---|---|---|---| -| AC-1 | ConfigDB 默认根加载完成、全新 B2 容器(Unspawned) | `spawn(L_g, D_g, M_h)`(hero_hp = max_hp 表读值——MVP 冒烟口径);Alive 相位再 `spawn(同坐标, M_h)` | 首次 true;`query_alive(enemy)` 恰 u_c 个单位(u_c = unit_count 表读值)、全部同 enemy_id、每单位投影 hp = h_g、max_hp = h_g、atk = a_g、pattern = p_g、cap = c_r(行值快照五字段逐一 = 表读值——Rule 10 授予时快照基线);`query_alive(hero)` 恰 1、hp = 入参值;敌投影序 = 行主序生成序(默认根 u_c=1 平凡——多敌序断言由 AC-5 夹具根承载);再 spawn → false + 诊断、容器不变(相位守卫——B3 EC11 输入×相位矩阵同款) | Rule 2/9/10 | -| AC-2 | 默认根、全新实例 | `spawn(L_g, D_g, hero_hp)` 分别取 hero_hp ∈ {M_h+1, 0, −1}(越界三腿:> max_hp / ≤ 0——EC16 口径);随后 `spawn(L_g, D_g, 1)`(域内下界合法值) | 越界三腿均 false + 诊断且 `query_alive` 双侧恒空(拒绝原子性:无半实例化——失败腿不留任何单位);域内下界 → true——越界拒绝精确以域为界、不扩大拒绝域(编排方供给异常显式暴露、不静默吸收) | EC16 / Rule 9 | -| AC-3 | `spawn` 完成(bugbear 坐标 (L_a, D_a)) | 腿 1 读初拍;腿 2 连续 advance;腿 3(goblin 坐标)连续 3 次(构造选择)advance;腿 4 任意长 advance/受击序列 | 腿 1(环首初始化):`query_beat(u)` = p_e[0];腿 2(推进与回绕):均 true 且 beat 轨迹 = p_e[k mod \|p_e\|] 逐拍断言、\|p_e\| 次后回 p_e[0](环尾回环首——指针恒 ∈ [0, 环长) 的行为级证据);腿 3(环长 1 恒等):beat 恒 = p_g[0](mod 1 恒等——每拍 attack、无自然空窗、兑付率 ρ=1 的行为级形式;前提 \|p_g\| = 1 按表读值核对——pattern 内容属 C3 内容行调参,前提不满足时本腿显式 SKIP、不假失败);腿 4(跨轮跨图延续 + 无重置入口,EC11):hp 与 beat 投影 = 驱动序列的确定函数——除 despawn_all 外无任何 API 入口使单位状态重置(结构性裁决;"换图"事件对 B2 不可观测(零接口),端到端"真实换图下单位状态延续"归 B1 集成——编排契约仅 battle_over 调 despawn、非新增义务,B3 AC-10 裁决同款) | Rule 4 / EC10 / EC11 / F1 | -| AC-4 | 默认根;前提按 p_e 表读值核对:\|p_e\| ≥ 3 且 p_e[1] = charge 且 p_e[2] = heavy(默认表值满足;pattern 内容属内容行调参,前提不满足时本 AC 显式 SKIP、不假失败) | 腿 1 构造推进至 charge 拍后 `apply_damage(u, h_e + 5)` 再 `advance(u)`;腿 2 新实例构造至 heavy 拍 `advance(u)` 后 `apply_damage(u, h_e)`;腿 3 对 Dead 句柄 `apply_damage` | 腿 1(heavy 拍前被杀):apply_damage → true、hp 投影 = 0(溢杀 floor:hp ∈ [0, max_hp] 不变式自守——clamp/溢杀语义归 B1×③ 的声明不变);advance → false(预期冻结级——无诊断,API 面两级 false 口径)、`query_beat(u)` 仍 = p_e[1]——冻结于 heavy 前一拍、重击永不兑现("死亡即不动手"+"抢在重击前击杀"读怪收益的行为级证据);腿 2(行动后才死):advance → true、随后 Dead、`query_beat(u)` = p_e[0](已行动已推进——heavy 拍已消费、指针回绕);腿 3(不可逆):false + 诊断(MVP 无复活——States 不可逆) | EC1 / EC9 / F1 | -| AC-5 | 夹具根 enemy_multi_unit(u_c_f = 3 登记值,bugbear 行)`spawn(L_a, D_a, M_h)` 完成 | 腿 1 读三单位初拍;腿 2 定义结算步 = 按生成序对各存活敌单位 advance 恰一次(B1 义务①的冒烟构造等价——hero 无环不在推进域),在某步 advance(u2) 之前 `apply_damage(u2, h_e)` 杀之(h_e = bugbear 行 hp 表读值);腿 3 全程观测规模 | 腿 1(同拍基线):spawn 后三单位 `query_beat` 恒等(同种同指环首、同属性);腿 2(死亡时序不乱拍):u2 本步不打(advance false、指针冻结);步末 `query_beat(u1)` = `query_beat(u3)`、连续多步后幸存者 beat 恒相同(同步性质定理——任何死亡时序都不会让幸存者乱拍);腿 3(单位数单调递减):`query_alive(enemy)` 规模 ∈ {3, 2, 1} 严格递减、无增员(EC5 负空间的行为面——无 summon API) | Rule 2 / EC2 / F1 | -| AC-6 | 默认根 + AC-5 根 | 腿 1(默认根)u_c 个单位逐一 `apply_damage` 致死;腿 2(AC-5 根)`apply_damage(hero, M_h)` 后、`query_alive(enemy)` 仍含存活单位时 `despawn_all()`;随后重复 `despawn_all()`;随后重新 `spawn` | 腿 1(全灭,EC3):`query_alive(enemy)` = 空 Array(存活敌集 = ∅——"敌人全灭"成立,胜负判定归 B1);敌侧伏击池"无兑付者轮末清空"半 = B3 dur=1 decay(跨引 B3 AC,out-of-scope);腿 2(主角死亡与消亡,EC4):hero hp = 0(失败判定素材——判定时机归 B1);despawn_all → true、`query_alive` 双侧空(全部单位 Despawned——不存在"主角死后敌继续攻击"的中间态);Despawned 句柄上 query_beat 返回空 + 诊断、advance/apply_damage → false(域闭);重复 despawn_all → false + 诊断(重复调用守卫——B3 EC11 同款);重新 spawn → true 且为新战斗(Despawned 后唯一出口——下一场重启、不跨战斗) | Rule 1 / EC3 / EC4 | -| AC-7 | 默认根 `spawn(L_a, D_a, M_h)` 完成、m_amb = StatusEffectTable.ambush.magnitude 表读值 | 腿 1 attack 拍 `query_attack(u, L=2, m_amb)`;腿 2 `query_attack(u, L=4, m_amb)` 合成序判别(判别非平凡前提 m_e ≥ 2——默认表值满足;m_e = 1〔合法 knob、heavy ≡ attack〕时负断言两边恒等、本腿显式 SKIP 标记输出——B3 AC-14 腿 3 先例);腿 3 beat 推进至 charge 拍后 `query_attack(u, L=c_r, m_amb)`(游戏态上界注入);腿 4(enemy_multi_unit 根承载——默认根 u_c=1 不可构造)同 L 连续两次 query + 两存活单位各自 query | 腿 1(attack 拍):{baseline = a_e, attach = 2×m_amb, total = a_e + 2×m_amb}(分量二元组——"攻击 13 = 基线 4 + 伏击 9"P2 归因行的数据源);腿 2(合成序判别):baseline = a_e×m_e、attach = 4×m_amb、total = a_e×m_e + 4×m_amb,且判别负断言 total ≠ (a_e + 4×m_amb)×m_e(伏击附加后置加法不进倍乘——默认表值 (4, 2, 3) 下 20 ≠ 32、非平凡性由表读值不等式保证;实现若把伏击分量塞进倍乘即在此暴露;L=4 为游戏态可达值〔cap=4 上界〕——探针不取域外值);腿 3(charge 零兑付——不读池,EC8 的 B2 半):{0, 0, 0}——L>0 下恒零 = "不读伏击池"的可判定形式(蓄力轮授予的伏击层当轮蒸发 = 读怪奖励;池蒸发本身归 B3 decay、out-of-scope 跨引);腿 4(共享不消耗 + 即时读值,EC17):同 L 连续两次 query 结果逐字相同、两存活单位同 L 各自 query 读值一致(共享、非均分、非先到先得);每次 query 前后 query_alive/query_beat 投影零变化(纯函数性——B2 无池写面、无内部缓存、无时间维度;"先转化后兑付"次序与每雷恰一次归 B1×①②、out-of-scope) | F2 / Rule 6 / EC8 / EC17 | -| AC-8 | 默认根、c_r = cap 表读值(全腿纯函数断言——编排期预截流调用与每雷恰一次授予归 B1×②,out-of-scope) | 腿 1 `ambush_grant_plan(mines_r = c_r + 2, c_r)`;腿 2 参数化对 mines_r ∈ {0, 1, c_r, c_r+1};腿 3 mines_r ∈ [5, 8];腿 4 `ambush_grant_plan(m, 0)` | 腿 1(守恒主式):{granted = c_r, overflow = 2}、恒等 granted + overflow = mines_r(零静默蒸发——P2 会计面;"溢出未生效"明细行呈现归 B1×⑥/B5);腿 2(预截流位):各腿 granted = min(mines_r, c_r)、overflow = mines_r − granted 恒成立(cap 判定在授予前);腿 3(灾难轮,EC7):默认 c_r=4 → granted = 4、overflow = mines_r − 4(cap 反灾难护栏绑定域);腿 4(cap=0 免疫,EC6):granted = 0、overflow = m(全溢出——免疫行全部可见、全部无效的会计半;cap=0 为域内合法行值的校验半归 AC-12) | F3 / EC6 / EC7 | -| AC-9 | 夹具根 enemy_multi_unit(u_c_f = 3) | 腿 1 以 advance 序构造混合拍(k 个单位处 attack/heavy 拍、其余 charge)并读暴露;腿 2 记号恒等式断言(AP_r = ActionEconomyTable.ap_per_round 表读值) | 腿 1(k 确定性可算):每结算敌方伏击暴露 = k × L × m_amb,k 经只读观测量导出(query_alive(enemy) ∩ query_beat ∈ {attack, heavy} 计数——确定性可算、无隐藏状态,B2 对 B1 条款 3 的供给面);全体 charge 轮 → k = 0、暴露 = 0(charge 轮零兑付——EC8 汇总);腿 2(结构上界记号):单结算 side 级结构上界 = u_c_f × min(AP_r, c_r) × m_amb(全参表读值/夹具登记值的记号恒等式断言——满配语境 3×min(8,4)×3=36 的记号化、默认行值 unit_count=1 下 = 12、非定值断言;min 项 = cap > AP 界时 cap 腿松弛);跨结算累计 = 轨迹量非表值——B2 投影字段无任何累计观测量(负空间,AC-1 观测量封闭枚举承载);不等式闭合对账(输入 = A1 actuals p10)归 B1×④、out-of-scope | F4 / EC8 | -| AC-10 | 腿 1 默认根(u_c=1)spawn 完成;腿 2 enemy_multi_unit 根;腿 3 承接腿 2 | 腿 1 `default_target()`;腿 2 `default_target()` 对照 `query_alive(enemy)[0]`;腿 3 杀 [0] 后再查、连续杀至空 | 腿 1(u_c=1 合法退化):default_target() = 该唯一存活单位(顺延与 AOE 分流无消费者、AOE ≡ 单体——合法退化非错误,Rule 7 空转);腿 2(行主序最前):default_target() = query_alive(enemy)[0](生成序最前——顺位快照 = 生成序);腿 3(死亡顺延):default_target() = 原 [1](顺延)、连续杀至空 → null(EC3 全灭腿在目标面的汇合);B1 消费侧单体/AOE 分流归 B1×⑤、顺位可读呈现归 D1×③、均 out-of-scope | Rule 7 / EC3 / EC15 | -| AC-11 | 默认根 `spawn(L_a, D_a, M_h)` 完成(快照字段 = 默认表值;坐标登记协议锚点)、存活与 Dead 单位并存 | 经测试通道换根加载 enemy_reloaded(load_tables(root, collect_only=true) 直调——非 D2 reload() 路径,门语义归 D2 AC-16/B1);随后 `despawn_all()` 后以同坐标重新 spawn;腿 3 对返回的 pattern 投影数组原地改写 | 存活与 Dead 单位的快照五字段 + beat + hp 逐字不变、hero 投影不变(授予时快照——实例不受任何表重载影响,B3 EC9 / A4 EC8 同款);新单位快照 = 漂移后表值(换根只影响后续实例化——"快照非活引用"的判别性后半);腿 3(拷贝判别):容器内单位 pattern 投影不变(快照拷贝非活引用——别名引用在换根加载下同样"逐字不变",本腿补足判别力) | Rule 10 / EC12 | -| AC-12 | EnemyTable schema 类(行级 + 表级校验)class_name 直引实例(不经 load()/preload()) | validate() 作用于越域代表值:unit_count ∈ {0, 4}、hp ∈ {0, 1000}、atk ∈ {−1, 1000}、heavy_multiplier ∈ {0, 17}、pattern 环长 ∈ {0, 9}、pattern 元素 = "guard"(预留值拒绝——MVP 校验域 fail-fast)、pattern 元素 = "nonsense"(未知枚举)、cap ∈ {−1, 17};表级构造同 (level_index, node_depth) 两行相异 enemy_id;域内代表值:unit_count ∈ {1, 3}、hp = 1、atk = 0(纯伏击伤敌种合法——F2 Variables)、atk = 999、heavy_multiplier ∈ {1, 16}、pattern ∈ {["attack"], ["attack","charge","heavy"]}(环长两界)、cap = 0(免疫极端合法——EC6)与 16 | 越域各含对应域错误类别(零静默);表级含每行集恰一敌种错误类别;域内零诊断(防过度约束锁死内容——atk=0 与 cap=0 两个合法极端是本断言承重点) | Rule 3/4 / EC6 | -| AC-13 | HeroTable schema 类直引实例 | validate() 作用于 max_hp ∈ {0, 1000}、atk ∈ {−1, 0, 1000};域内代表值 max_hp ∈ {1, 999}、atk ∈ {1, 999};表级构造两行(域内合法) | 越域各含对应域错误类别(atk=0 拒绝 = 基础攻击恒存在的 schema 承重腿——零基线死锁杜绝);域内零诊断;表级两行 → 单行全局约束错误类别(单行全局——Rule 4 豁免同 ActionEconomyTable 先例;若实现期 ADR/D2 裁决单行校验落 loader 缝,则本腿迁移至可选根 hero_extra_row 的 manifest 腿——两处恰一承载) | Rule 9 | -| AC-14 | ConfigDB 默认根加载完成 | 读 EnemyTable;读 HeroTable | EnemyTable 恰含三敌种行、enemy_id 集合 = {goblin, bugbear, ogre_chief}(定值——Rule 3 MVP 收窄,C3 修订批扩容);每 (level_index, node_depth) 行集恰一敌种(默认根数据通过其自身表级校验的行为断言);全部行 pattern 元素 ⊆ {attack, charge, heavy}(MVP 枚举封闭——结构定值);goblin 行 pattern 不含 "heavy"(heavy_multiplier 无 heavy 拍不消费的表数据前提——非校验项、B3 max_stack 先例);unit_count_max 仅在区间行出现(缺省 = 定值——C3 遭遇随机化字段语义);display_name 多值非空(精确值不作定值断言、本地化归 D6);遭遇分布(何 (L,D) 归何敌种)为 C3 域 knob——不作定值断言(provisional 示例非承诺);HeroTable 恰 1 行、atk ∈ [1,999] 域断言(MVP 值 6 = 原型锚 provisional 不作定值断言;0 = 加载拒绝)、max_hp ∈ [1, 999] 域断言(provisional knob 不写死) | Rule 3/9 | -| AC-15 | 全新 B2 实例 ×2(同 ConfigDB 默认根;每遍全新实例、无跨实例状态) | 同一定长序列驱动两遍(spawn → apply_damage(含一次"轮到前击杀"腿——冻结路径入回放)→ 交替 advance 全体存活敌单位 → query 投影(含生成序与逐单位 beat)→ apply_damage → advance → default_target → query 投影) | 两遍的 query_alive 投影序列(含生成序)、逐单位 beat 轨迹、default_target 返回序列逐项相同——零随机的行为级硬证据(rng_service 流封闭;D2 AC-15 的 B2 层前身,与 AC-3 腿 4"状态 = 驱动序列的确定函数"互证) | Rule 4/11 / F1 | -| AC-16 | ConfigDB 默认根加载完成 | 脚本解析 design/registry/entities.yaml 的 enemy 与 hero 条目(逐字段 YAML 键——机器对账前提,action_economy/status_effect 同构) | ① enemy.fields **十键**(enemy_id / display_name / unit_count / **unit_count_max / armor_type** / hp / atk / heavy_multiplier / pattern / advantage_per_round_cap——C3 修订批 +2)与 ConfigDB EnemyTable schema 字段名逐一相等、各键类型/域/枚举描述与 Schema 定稿相等(缺任一键即失败);② hero.fields 两键(max_hp / atk)同上;③ enemy 条目 MVP 内容注记物种 id 集合 = {goblin, bugbear, ogre_chief}、与表行 id 集合相等(非 knob 结构定值——C3 修订批扩容);④ status_effect.ambush 条目含 B2 量纲定稿注记(Rule 6 兑现 B3 registry OQ2 的接口漂移回写落点——注记存在性 + 键断言;量纲活值 m_amb 不作定值对账——knob 纪律,A4 AC-8 同款豁免);⑤ hero 条目"单行全局 Rule 4 豁免"注记与 enemy 条目"每行集恰一敌种校验"注记存在性断言;生效前提 = 本文定稿 Phase 5b/5d 回填完成(不写"若存在"软口径——条件化使一致性检查落空,B3 AC-18 同款) | Rule 6 / registry | -| AC-17 | B2 文件集(单位容器 / 两表 schema / 冒烟脚本 / 夹具规格)纳入 D2 AC-9 模式项目级扫描域 | 静态扫描 | randomize() / RandomNumberGenerator / ConfigDB 外 data 表加载 / extends Control / .tscn preload——零命中(schema 与容器的 class_name 直引实例化豁免——AC-12/13 前提,A4 AC-7 同款);另扫 B2 特有两项:事件订阅 API 零命中(Rule 11 零主动事件订阅——A2 事件面 referenced_by 不含 B2 的代码侧对应)与 B3 API 符号零引用(相邻零运行时依赖——import/call 面为零);D2 AC-14 人工三要素字面量扫描(引用不另设硬 THEN——F2 算式 a×m + 3L 类字面量随实现形态误报率高,D2 已定性 warning 级 + 人工复核;其"零玩法数值字面量"的行为级硬证据 = AC-1/AC-7 全表读值推导 + AC-16 registry 对账);零随机的行为级硬证据 = AC-15 | Rule 11 / D2 AC-9/10/14 | - -### 覆盖矩阵(qa-lead 交付,验收评审用) - -| 类别 | 映射 | -|---|---| -| Core Rules(11/11) | 1→AC-1/AC-6/AC-2(clamp·溢杀·死亡时机→OOS B1×③)· 2→AC-1/AC-5/AC-9(side-wide 兼容与 target_ref 扩展位→B3 接口漂移义务随批 B1/D1、非冒烟域)· 3→AC-12/AC-14/AC-13 · 4→AC-3/AC-4/AC-5/AC-15(预留值拒绝→AC-12+manifest pattern_reserved)· 5→AC-8(每雷恰一次→OOS B1×②;溢出明细行→OOS B1×⑥+B5)· 6→AC-7/AC-16④(量纲锚验收→B4/B1,排除声明)· 7→AC-10(消费分流→OOS B1×⑤;顺位可读→D1×③)· 8→映射键契约(enemy_id)+AC-3/AC-15(行为环可学性承载)+OOS D1×①②、"不显示数值"负空间=API 封闭 · 9→AC-1/AC-2/AC-13/AC-14 · 10→AC-1/AC-11(D2 R1 解析致命→OOS D2 通道;难度修饰→C3 provisional)· 11→AC-15/AC-17(调用权集中→OOS B1×①) | -| Formulas | F1→AC-3/AC-4/AC-5 · F2→AC-7 · F3→AC-8 · F4→AC-9(闭合对账→OOS B1×④) | -| EC(17 条) | EC1→AC-4 腿1/腿2 · EC2→AC-5 腿2 · EC3→AC-6 腿1+AC-10 腿3 · EC4→AC-6 腿2 · EC5→冒烟 API 封闭(负空间——无 summon API 不可 G-W-T,B3 Rule 8 先例)+AC-5 腿3+AC-17 · EC6→AC-8 腿4+AC-12(cap=0 合法腿)· EC7→AC-8 腿3 · EC8→AC-7 腿3+AC-9 腿1(池蒸发腿→B3 AC 既有覆盖,OOS 跨引)· EC9→AC-4 腿1 · EC10→AC-3 腿3 · EC11→AC-3 腿4(跨图结构裁决)+AC-2/AC-6(相位重复守卫,B3 EC11 同款)· EC12→AC-11 · EC13→OOS(D2 R1 通道,D2 AC-2 同类别夹具,manifest 豁免声明)· EC14→OOS(D2 EC14 通道,同前)· EC15→AC-10 腿1 · EC16→AC-2 · EC17→AC-7 腿4(读值即时性/纯函数半)+OOS B1×①②(次序半) | -| 无洞声明 | 17 条 EC 中 EC5/EC13/EC14 三处非 G-W-T 形态,分别以 API 封闭负空间声明与 D2 通道豁免承载(B3 Rule 8 负空间 + 致命收窄豁免先例同款);其余全部映射到 AC 或显式 OOS(deferral 生效条件 = B1×6/D1×4 已登记缺项即 blocking) | - -## 开放问题 - -| # | 悬案 | owner | 时机 | -|---|---|---|---| -| 1 | query_attack / ambush_grant_plan 两 face 归属——B2 供给面 vs B1 编排消费(F2"供给建议"与 F3"预截流归 B1"边界注记的张力落点);裁决归 B1 则 AC-7/8/9 对应腿迁移至 B1 冒烟(断言口径不变)、回写 AC 前言 | 实现期 ADR 定名时同步裁决 | Technical Setup / 实现期 | -| 2 | 多敌语义默认零消费者复验——默认 unit_count=1 下多敌路径仅测试根可达(死码风险);C1 落地 unit_count>1 真实遭遇后复验 AC-5/9/10 夹具根是否升级为默认根内容;C1 须真实消费 unit_count>1(Boss/精英战最廉价的构成表达),且 Boss 表达不能只靠 unit_count——同种同拍 ×3 = 伤害乘法、非 Boss 幻想 | C1 遭遇分布定稿 | C1 GDD | -| 3 | 条款 3 左臂载体——基础攻击恒存在后"载体悬空、内容态不可通关"事实已闭环;残余 = 左臂当量换算口径(锚参照回迁 attack_up 当量——B4 F4 / registry anchor_warning)随 B1 对照表对账 | B1 | B1 GDD 强制检查点 | -| 4 | 原型参考值溯源——敌 18HP/4ATK、伏击 +3、hero max_hp 均 provisional 且出处待查(D2 Tuning Knobs 既有登记义务);回填定值前补原型 REPORT 溯源,查无出处则按 C3 调参所有权重定 | 本 GDD 回填定稿时 | EnemyTable/HeroTable 定值回填 | -| 5 | HeroTable 单行校验落点——schema validate() vs loader 缝两处恰一承载(AC-13 腿3 / 可选根 hero_extra_row manifest 行) | 实现期 ADR/D2 | Technical Setup | -| 6 | 标错惩罚候选与伏击清单联动——候选"敌方伏击+1"若实测采纳:事件源 = flag_judged{hit=false}(旗落非雷格)、不在 Rule 5 cell_revealed{kind=mine} 转化路径内;B3 需新增行且 source_class 需新枚举值(如 flag_miss)——source_class 枚举属 B3 结构冻结项、须走 B3 GDD 修订(接口漂移)非"加行";B2 侧伏击清单联动修订 + F3 重验触发(非 mine_hit 源)强制重跑;若错标为 mine_hit:P2 归因明细行来源失实(标错被记成踩雷) | A2 OQ1 实测会话 | A2 /design-review 核对在位 | -| 7 | 精英/Boss 遭遇编码位预登记——难度 = f(关卡序号, 节点深度, 精英/Boss 修饰);A1 BoardGenTable 已预留 elite_/boss_ 命名空间与改键退路;本表键冻结 (level_index, node_depth, enemy_id) 且"每行集恰一敌种"入结构冻结——若 C1 定稿分支地图使同深度并存普通与精英节点,精英编码无键位(同深度第二敌种行触发行集校验致命);届时改键(如追加 encounter_class 维度)走 D2 Rule 4 接口漂移修订,schema/AC-12/夹具/registry 连锁回写(A1 OQ6 镜像) | C1/C3 | C1 GDD 定稿强制核对 | -| 8 | goblin 单拍环体验证伪——goblin 环长 1、无前摇无空窗,玩家可能将其感受为"自动平砍的血条"(恰为体验锚点反向对照);MVP 实际读怪内容仅剩 bugbear 一环;预注册证伪项:playtest 采集"goblin 是否被读"信号;证伪则两拍环备用案(如 [attack, charge])由 C3 内容所有权处置、本 GDD 结构不变 | C3/playtest | 垂直切片 playtest | -| 9 | 零伤害死局组合与跨表量级护栏——hero 侧恒零伤害分支已被 HeroTable.atk 域下界([1,999]、0 加载拒绝)结构杜绝;残余 = 行 atk=0 ∧ cap=0 → 无威胁敌(内容调参禁区、非死局);atk×mult 上界与 max_hp 域无跨表量级护栏——遭遇行配置期跨字段校验落点裁决(ActionEconomyTable 跨字段校验先例),详见 Tuning Knobs Knob 交互注记 | 实现期 ADR/D2 | Technical Setup | - -## 版本历史 - -| 版本 | 日期 | 改动 | -|---|---|---| -| v1.0-lean | 2026-09-13 | 格式迁移:legacy 原稿按 lean 样例重排——修订注记出正文收敛至本表;规则/枚举/边界情况/义务清单/覆盖矩阵/AC 转表格;行为环转字符画;公式、Variables 与验算数据全保留;语义与 2026-09-09 定稿及 2026-09-11 基础攻击裁决对齐,零规则变更 | -| 基础攻击裁决批 | 2026-09-11 | HeroTable.atk = 基础攻击恒存在:域 [1,999]、0 加载期校验拒绝(零基线死锁自 schema 层杜绝)、MVP = 6(原型锚 provisional 归 C3);主角每结算战斗段先手攻击;B4 道具/增益转为规划面伤害(非唯一伤害来源);原"atk MVP=0 机制开关、胜利路径依赖 B4 先行"条款与 OQ3 左臂悬空投影退役;OQ9 恒零死局分支随之收窄 | -| C3 修订批回写 | 2026-09-14 | /design-review C3 修订批(X-7 回执,registry 同批):**spawn 增 override 参数 n**(B1 encounter 骰定本战实际数量——区间语义 [unit_count, unit_count_max] 实例化后不增,EC5 记号调和)· **Rule 10 DifficultyTable 接口已定**(registry `difficulty_table`——施加点 = 行值快照前套乘,MVP 空表零修饰)· **EnemyTable schema +2 字段**(unit_count_max / armor_type——护甲克制批,克制矩阵归 SettlementTable)· **物种集扩容三敌种 {goblin, bugbear, ogre_chief}**(AC-14/AC-16① 十键/AC-16③/结构定值断言随批;DND 更名批对齐)· 默认根遭遇分布 = C3 行值总表 v3(provisional) | -| Rev 1(full 评审批) | 2026-09-09 | lean 定稿同日 full 评审(六专员 + CD 终裁)8 项 blocking 同日核销后用户拍板收口(A3/A4/A1/B3 同日核销先例、免独立 re-review):① 胜利路径声明 ② AC-7 恒假判别前提 + SKIP ③ 多敌夹具根改 bugbear 行 ④ OQ6 事件源类更正 + F3 重验触发补支 ⑤ 精英/Boss 编码位预登记 OQ7 ⑥ Rule 8 预告时序 ⑦ 资产下限补受击/死亡/顺位 ⑧ 主角推进域排除;同批定稿四项口径:cap 默认 4(旧默认 8 使溢出协议不可达)、死亡即不动手、条款 3 单结算自然边界、C 节三处回写;F2 判别改域内值、F4 结构上界 min 收紧、方向性预检裕度改 2.3×——明细见 design/gdd/reviews/b2-enemy-system-review-log.md | -| v1(lean 定稿) | 2026-09-09 | 一次会话定稿:十一核心规则 + F1–F4 + 17 AC + 义务台账(B1×6 / D1×4);九项结构决策用户拍板(多敌 / HeroTable / 视觉推测型 / Peglin 行为环 / 每行集恰一敌种 / side-wide / 固定顺位 / unit_count 字段 / cap=4);lean 门禁:systems-designer 起草 Formulas、qa-lead 起草/验证 AC | diff --git a/design/gdd/legacy-2026-09-14-v1/b3-status-effect.md b/design/gdd/legacy-2026-09-14-v1/b3-status-effect.md deleted file mode 100644 index 25539911..00000000 --- a/design/gdd/legacy-2026-09-14-v1/b3-status-effect.md +++ /dev/null @@ -1,533 +0,0 @@ -# B3 增益/状态系统(Status Effect System) - -> **状态**:Approved · lean 格式 -> **版本**:v1.1-lean · 2026-09-13 · 作者:user + agents(systems-designer〔Formulas〕· qa-lead〔AC〕;三结构决策〔单一计数/按行叠层/四行定稿权收编〕为用户拍板) -> **承载支柱**:P2 主(可归因兑现的机制落点)· P3(敌方增益/debuff 的兑付面)· P1(时限透明的规划素材)· P4(间接) -> **Layer**: 1 Foundation · **Milestone**: MVP · **设计顺序**: 第 4 位 -> **一句话**:B3 是战斗域统一状态容器——三向效果同构实例的时限/叠层/衰减机制唯一 owner,兑付接口供 B1 结算逐行消费。 -> **复核注记**:lean 门禁下 systems-designer / qa-lead 已委托起草(Formulas / AC);creative-director 与 art-director 未经咨询——生产前人工复核体验锚点情绪定位与视觉数据面规格同 art-bible 的一致性。 - -## 速览 - -| 关键问题 | 答案 | -|---|---| -| 定位 | 战斗域统一状态容器:不在当场一次性、而要在若干次结算里持续起作用的战斗效果(安全格增益 / 踩雷敌方增益 / 标中旗削弱 / 清图奖励 buff)作为同构状态实例的唯一存放与生命周期 owner——统一容器让"效果"成为一门单一语言:四源统一当量的对照载体(A3 条款 1)、B1 结算的单一对接面、可回放步骤流的状态侧前提 | -| 拥有 | 机制:时限/叠层/衰减语义、状态实例生命周期(战斗域)· 兑付接口五 API 与 P2 归因字段 · StatusEffectTable 回填 owner · MVP 四行初值定稿权(Rule 10 收编——锚验收权留 B4/B2/B1);机制与内容分离是结构原则——B3 只拥有机制,效果内容的经济归属归各锚 owner | -| 不拥有 | 效果内容经济归属(安全格 buff 与标中旗 debuff 档位锚验收归 B4、敌方增益上限归 B2)· 效果语义到结算公式的映射与兑付作用顺序(B1 SettlementTable)· 呈现(D1/B5)· 教学(D5)· 渲染面与事件外发(零) | -| 上游输入 | D2 StatusEffectTable(hard——数据通道,本 GDD 回填 owner);无其他玩法上游(Foundation 层) | -| 下游输出 | 五 API(B1 结算编排消费)· query_active 投影(D1 HUD 数据源)· 实例六字段 + display_name + 授予时快照(B1 结算明细 / B5 呈现数据源) | -| 硬约束 | 零随机(无 RNG 流消费)· 零 UI 依赖 · 零信号外发(纯被动容器)· 全 API 布尔/计数返回、无 await——可回放步骤流的状态侧前提 | - -## 体验锚点 - -| 支柱 | 关键词 | 机制承诺 | -|---|---|---| -| P2 可归因的兑现感 | "我攒下的东西正在替我打架" | 每个状态实例携带来源标注(安全格/标中旗/清图/雷),结算明细逐行生效——P2 准话测试"这个结果是我哪步扫雷带来的?"在 B3 字段里就有答案;"规划的延迟兑现"从口号变成可见事实的机制落点 | -| P3 雷的两面 | "雷是赌桌不是陷阱" | 踩雷的敌方增益行与标中旗的削弱行在结算明细里使用同一呈现语言,玩家由此学会雷的两面;旗标对的即时回报部分补偿 chord 缺席的兑现节拍缺失(CD 创意风险 #3 的关联缓解,正式高光设计归 B1/B4) | -| P1 规划素材 | "还剩几次结算、何时到期" | 增益携带明确的剩余结算次数与到期时机,玩家才能把它纳入挖哪格的推理——时限语义的透明度是规划感的前提;满层溢出行可见("满层时别再拿同款") | - -反向护栏:状态效果绝不能是无感的暗账——玩家说不出一行结算"从哪来",来源标注即失职(违反 P2);任何让 buff 时限/剩余次数不可读的设计默认砍掉。参考感受:杀戮尖塔的增益图标(时机与层数一目了然,是决策素材而非装饰)、Peglin 神器在关键时刻叠加生效的"攒出来的强大"。 - -## 全局流程 - -### 效果生命周期(授予 → 存续 → 兑付/衰减 → 出口) - -``` -B1 结算编排(唯一授予入口 apply_effect——A2/B4 与 B3 零直接接口) - │ 事实来源:A2 开格/标中/开雷事件 → B1 收集 round facts → 转化授予(挖掘期不直接写容器) - ▼ -授予(编排期入容器,无 pending 态——首个结算就是它的第一次兑付) - │ merge(effect_id) 三分支:independent 新建实例 / stack L+1(L=M 拒绝) / refresh R←D - │ 实例载荷 = 六归因字段 + display_name + 授予时数值快照 (magnitude, unit) - ▼ -Active(存续——跨轮次、跨扫雷图延续;换图/刷新不清空,旗标记随图消亡不影响实例) - │ 每轮结算:B1 query_active(side) 只读兑付(作用顺序归 B1 SettlementTable) - │ → decay_round() 恰一次:全实例 R−1,R=0 销毁(先兑付后衰减) - ▼ -出口 ─┬ R=0 → Expired:实例销毁(明细流水已由 B1 记录,B3 不留历史) - ├ notify_battle_end → Cleared:全实例销毁、容器回空 → BattleClosed(不跨战斗) - └ 拒绝路径:域闭 / 未知 effect_id / 满层 → false + 容器零写(溢出行归 B1 结算明细) -``` - -### 出口分发 - -| 出口 | 触发 | 动作/去向 | 约束 | -|---|---|---|---| -| 受理入容器 | apply_effect 受理(新实例/叠层/刷新) | 即入 Active——无 pending 态,首个结算是第一次兑付 | 域闭 / 未知 id / 满层 → false 拒绝(见边界情况) | -| 到期移除 | decay_round 后 R=0 | 实例销毁 → Expired | 明细流水已由 B1 记录,B3 不留历史 | -| 战斗清空 | notify_battle_end() | 全实例销毁、容器回空 → BattleClosed | 不跨战斗;除本 API 外无任何清空入口 | -| 满层拒绝 | stack 行 L=M 再授予 | 返回 false、容器逐字不变;"溢出未生效"行归 B1 结算明细(含来源) | 拒绝原子性——无半写、无溢出落层 | - -## 核心规则 - -> 每条规则两段:**人话**(作用于哪个系统、什么情况下、谁触发、触发后发生什么;效果与情况用枚举表)→ **举证**(计算方法/公式;纯流程规则明写"无计算")。 - -#### 规则 1:所有持续效果共用一个容器、一套机制 - -**人话**:战斗里不在当场一次性生效、要管上几回结算的效果——主角的增益、敌人的增益、敌人受到的削弱、清图奖励——全都作为同一种"状态实例"存进同一个容器,用同一套计时、叠层、衰减的规矩管理,没有哪类效果走特殊通道。容器自身有四条硬规矩: - -| 规矩 | 含义 | -|---|---| -| 寿命 = 一场战斗 | 战斗开始时容器为空,战斗结束全部清空——不跨到下一场战斗 | -| 跨轮、跨图延续 | 同一场战斗里跨轮次、跨扫雷图都在;换图/刷新不清空(旗标记随旧图消亡归棋盘系统 A2 管,状态实例不随图走) | -| 全程零随机 | 容器不掷任何骰子:授予、合并、衰减、列举顺序全部确定 | -| 敌方侧共享 | MVP 敌人为 1–3 个同种敌单位(敌情系统 B2 定):对敌状态一律对全体存活敌人生效,层数全体共享一份 | - -**举证**:无计算。"不跨战斗"为 game-concept 定稿口径;多敌共享读法按 registry single_enemy_assumption 登记,现接口零变更兼容。 - -#### 规则 2:状态的寿命按"还剩几次结算"倒数 - -**人话**:每个状态实例都自带一个倒数计数——剩余结算次数。它不承诺"活几轮",而是数"经历过几次结算":每轮结算先让状态起作用,随后计数减 1,减到 0 状态即被移除。因此一次性的状态(标中旗削弱、踩雷伏击这类,初始计数 = 1)恰好在授予它的那轮结算里生效一次、轮末消失,MVP 四行内容全部是一次性;将来若有跨轮持续的增益,寿命由表行的初始值表达——给几就活几次结算。停手不挖的轮、弃图刷新的轮也照常算一次结算、计数照减——不存在"不结算就不掉次数"的免费延时。 - -**举证**:计数量纲 = remaining_settlements(剩余结算次数),初始值 = 表行 duration_settlements(一次性 = 1);衰减的精确机制(每轮恰 −1、归 0 即销毁)与"先兑付后衰减"时序契约见「数值结论与推导」F3;时限语义逐要点见下方实现参照表。 - -### 规则 2 的实现参照——单一结算次数量纲(时限语义) - -| 要点 | 内容 | -|---|---| -| 计数量纲 | remaining_settlements(剩余结算次数)——全部状态唯一时限单位 | -| 初始值 | duration_settlements = 授予时初始剩余结算次数(实例持有快照、不受表重载影响——EC9) | -| 衰减 | 每轮结算兑付后统一 −1(先兑付后衰减——B1 兑付完才调 decay_round);归 0 即移除 | -| 一次性 | duration=1 → 授予当轮编排期入容器 → 同轮兑付恰一次 → 轮末移除(MVP 四行全部 D=1——当次结算语义) | - -#### 规则 3:状态只在结算时发放,每笔都记着从哪来 - -**人话**:挖掘期的挖格、插旗、踩雷不会直接改状态容器:棋盘(A2)只上报"发生了什么"的事实,战斗结算编排(B1)在每轮结算时统一把事实兑换成状态、发给容器。这是容器唯一的进货口,棋盘与奖励背包(B4)都没有直通容器的通道。每笔状态随身携带归因信息:哪类来源(安全格奖励/标中旗/踩雷/清图奖励四选一)、从哪个格子来、发生在第几轮——结算明细能逐行回答"这效果是我哪步扫雷带来的"。状态一经发入立即生效(没有"待生效"中间态):同一场结算就是它的第一次兑付。 - -**举证**:无计算。授予动作 = apply_effect(规则 6 五接口之一);四类来源的授予路径与目标侧逐源对照见下方实现参照表;来源取值封闭枚举见「枚举」节 source_class 表。 - -### 规则 3 的实现参照——三向效果映射(授予路径) - -| 事实来源 | source_class | 授予路径 | 目标侧 | MVP 行 | -|---|---|---|---|---| -| 安全格奖励 | safe_cell | A2 开格事实 → B1 转化 apply_effect | hero | attack_up / defense_up | -| 踩雷 | mine_hit | A2 开雷事实 → B1 转化 apply_effect | enemy(side-wide) | ambush | -| 标中旗 | flag_hit | A2 标中判定 → B1 转化 apply_effect;兑付资格(雷格实例键)判定在 A3/A2 域——资格判定不过 B3,B3 无从重复兑付同雷(每次 flag_hit 授予由 B1 保证资格合法) | enemy(side-wide) | weaken | -| 清图奖励 | clear_reward | B4/B1 清图槽含 buff 时授予(B4 期定稿) | 随行 | B4 差异化插槽(OQ4) | - -#### 规则 4:同名状态重复拿到,怎么合并由数据表说了算 - -**人话**:同一种状态还没消失时又拿到一份怎么办?答案不在代码里,而在数据表每行的"叠层策略"字段,共三种:叠加(层数 +1,寿命不动——只有第一次授予定时钟)、刷新(寿命重新计满、层数不变)、并存(各算各的一份、互不影响)。合并在授予那一刻由容器内部完成;多个状态在结算里按什么先后起作用,是结算编排的职责——两件事互不干扰。叠加的作用是纯加法:几层就是几倍的行值(单一线性换算)。MVP 四行内容全部用叠加;刷新与并存的语义已定义、实现已承载,未来内容行按需启用。 - -**举证**:三分支的逐分支语义(含满层/溢出行为与 MVP 消费)见下方实现参照表;合并执行的伪代码见「数值结论与推导」F1;"有效值 = 层数 × 行值"的加算合成见 F2。 - -### 规则 4 的实现参照——按行叠层三分支(stack_policy——授予时合并) - -| stack_policy | 重复授予行为 | 满层/溢出 | MVP 消费 | -|---|---|---|---| -| stack | 层数 +1(R 不动——只有初始授予定钟) | L=M → 拒绝 false + 容器零写,"溢出未生效"行归 B1 | 四行全用(attack_up/defense_up M=2、ambush/weaken M=16) | -| refresh | 剩余次数重置为实例授予时快照 D、层数不变(含 R 已 = D 的空刷新——恒返回 true,无满层/溢出语义、不消费 max_stack) | 无 | 语义已定义、实现承载——MVP 无内容行(零消费者) | -| independent | 并存独立实例(append 入列) | 无满层语义——实例数上界 = 受理授予数(有界确定) | 同上 | - -#### 规则 5:叠满了再给同款不生效,但会明说"这层浪费了" - -**人话**:一种叠加型状态已叠到上限(层数 = 上限值)时,再授予同类不生效:容器拒绝、内容一个字不变。但这份奖励不会被无声吞掉——结算明细会多一行"溢出未生效",连来源一起写明;玩家看得到"这层白拿了",下次就懂得满层时别再拿同款——奖励的浪费是诚实的、可规划的。无论这份重复来自玩家直接踩出的格子、结算转化、还是连锁展开自动开出的奖励格,都走同一个授予入口,满层时同样产生溢出行、同样留痕。 - -**举证**:无计算(判定 = 一次"层数 == 上限"比较)。拒绝原子性(false + 容器逐字不变、无半写无溢出落层)见 F1 推导极端行为段;"溢出未生效"行进结算明细协议由 B1 义务⑧承载、呈现归 B5/D1。 - -#### 规则 6:结算系统只用五个固定接口读写容器 - -**人话**:状态容器是纯被动的仓库,自己不主动做任何事;战斗结算编排(B1)要用它,只有五个固定接口: - -| 接口 | 干什么 | 返回 | -|---|---|---| -| 告知战斗开始 | 打开容器、进入可用状态 | 是/否 | -| 发一笔状态 | 唯一进货口:受理即新建实例/叠层/刷新 | 是/否 | -| 查询生效状态 | 某一方当前生效清单,按发放先后排列且顺序永远稳定 | 只读清单 | -| 轮末衰减 | 全部实例寿命 −1、归 0 即销毁 | 本轮移除数 | -| 告知战斗结束 | 全实例清空、容器回空 | 是/否 | - -**举证**:五接口 = notify_battle_start() / apply_effect(effect_id, source) → bool / query_active(side) → Array / decay_round() → int / notify_battle_end() → bool(签名见「验收标准」测试口径)。 - -- 查询返回 = 六归因字段 + display_name + 授予时数值快照 (magnitude, unit) 的只读投影(qa-lead 载荷口径)。 -- 结算作用顺序(哪个效果先乘)归 B1 SettlementTable,B3 只保证枚举确定性;最后一轮(敌人全灭)是否 decay 归 B1 判定次序域——A3 EC8 同款〔末轮 decay 判定次序域〕。 -- 全部 API 布尔/计数返回、无 await、无表现面——可回放步骤流的状态侧前提。 - -#### 规则 7:容器只管"有多少量、还剩几次",不管这量怎么用 - -**人话**:容器记录每个状态的量(幅度数值 + 量纲标签:百分比还是固定值)和它还剩几次结算,仅此而已。"增伤到底加在哪个算式上、先乘后乘、地板怎么收"这类"效果如何兑现"的问题,一律由结算编排的顺序映射表按状态 id 作答。一句话:容器知道"现在还有 +50、还剩 1 次结算",但不知道这 +50 会变成主角攻击里的什么。 - -**举证**:无计算。语义映射的承载面 = B1 SettlementTable(effect_id 为键);B3 只承载 magnitude/unit 两个通用数值字段。 - -#### 规则 8:已生效的状态玩家动不了——不能驱、不能延、不能转 - -**人话**:状态一旦生效,玩家没有任何手段把它摘掉、往后延、或挪给别人——容器没有提供这类接口。"不能做"和"能做"同样是明确的设计决定:省掉一整类界面与规则复杂度。将来若要加驱散/延时/转移,属于新增接口的修订,不是调参数。 - -**举证**:无计算。负空间规则——验收形态 = API 面封闭枚举 + 接口漂移修订门(见「验收标准」节测试口径 out-of-scope 行)。 - -#### 规则 9:所有数值写在数据表里,代码零写死 - -**人话**:容器本身不认识任何具体数值:哪个状态加多少、活几次、最多叠几层,全部写在状态表里(表结构由本文档定义、数据层 D2 承载),程序运行时统一从配置库 ConfigDB 读表。代码里不出现任何玩法数值字面量——调平衡只改表、不改代码。 - -**举证**:无计算。表 = StatusEffectTable(本 GDD 为回填 owner,schema 逐字段见「Tuning Knobs」节);依据 = D2 Rule 1〔数值字面量禁令〕。 - -#### 规则 10:四个 MVP 状态的初值由本文档定稿,验收权留在对口系统 - -**人话**:MVP 上线的四行内容(增伤、减伤、伏击、削弱)的初始数值由本文档定稿,值域快照见「枚举」节内容行表。但"值合不合适"的验收权留在对口系统(奖励经济 B4、敌情 B2、结算 B1):削弱档位按"必须严过最低档增益"的当量锚验收、伏击按敌方惩罚上限验收、对账由结算闭合。要改初值,走接口漂移规则回写登记库(registry),不是随手调参——初值定稿权归本文档、锚验收权仍归上述三方,这是对"档位归奖励表设计"的显式收编。 - -**举证**:无计算(定稿权条款非公式)。依据 = A3 F1 条款 2〔debuff 严格 > 最低档 buff 当量,参照对象 = attack_up 行当量〕· 条款 3〔B2 惩罚上限〕· A3 OQ5 收编〔registry ownership_note〕;A3 GDD 正文不改,以本条 + registry ownership_note 为准。 - -## 枚举 - -### source_class(封闭枚举——P2 归因字段) - -| 值 | 产出点 | 语义 | -|---|---|---| -| safe_cell | 安全格奖励授予 | 主角增益来源 | -| flag_hit | 标中旗授予 | 怪物削弱来源 | -| mine_hit | 踩雷授予 | 敌方增益来源 | -| clear_reward | 清图奖励授予 | 清图槽 buff 来源(B4 期定稿) | - -新增值 = 接口漂移。B3 不校验 source_class 与行的对应(dumb 账本——EC6 同族);内容行表"来源"列为内容档案(provenance),非 schema 字段、非运行时约束。 - -### target_side / unit / stack_policy(schema 枚举域) - -| 字段 | 值域 | 语义 | -|---|---|---| -| target_side | hero / enemy | 作用侧;enemy 侧 side-wide = 全体存活敌单位(层数 = side 共享池) | -| unit | percent / flat | percent = 百分比修正(百分点线性叠加);flat = 固定值(伏击类——量纲已定稿:每层伏击为每次攻击类行为附加 m_amb 点主角 HP 伤害、后置加法不进倍乘、charge 拍零兑付,B2 GDD 定稿) | -| stack_policy | stack / refresh / independent | 同 id 重复授予的合并策略(见核心规则子表) | - -### StatusEffectTable MVP 内容行(四行值域快照——值全部 provisional,验收锚见 Rule 10) - -| effect_id | 名称 | side | magnitude(现行值) | duration | stack/max | 来源 | provisional 依据 | -|---|---|---|---|---|---|---|---| -| attack_up | 增伤 | hero | +50 percent | 1(当次结算) | stack / 2 | safe_cell | 原型临时值 1.5× 换算(D2 knobs 占位);消费面 = 主角战斗段先手攻击(HeroTable.atk 基础攻击恒存在) | -| defense_up | 减伤 | hero | −30 percent | 1(当次结算) | stack / 2 | safe_cell | 减伤墙批 C3 投值(−50→−30,叠满两层 −60 帽——defense_scan 墙轮 39%/真人 12 轮零承伤定量坐实后回调) | -| ambush | 伏击(敌方增益) | enemy | +3 flat | 1 | stack / 16 | mine_hit | 原型临时值 +3;量纲已定稿(B2 GDD——registry ambush_unit_definition);条款 3 锚验收归 B2/B1 | -| weaken | 削弱(标中旗 debuff) | enemy | −65 percent(值域 [60, 85]) | 1 | stack / 16 | flag_hit | F0 裁决值——回执以 B1 GDD F0 为准(registry anchor_warning);须过条款 2 锚(严格 > 最低档 buff 当量,B1 对照验收) | - -## 数值结论与推导 - -> 章节纪律:结论先行(加粗一行),下接「推导」小标题给公式代码块、Variables 表与验算/示例。systems-designer 代理起草(lean 门禁):只含机制公式,平衡归属见显式排除声明。 - -### F0 weaken 锚裁决回执(m_w 值域与归一口径) - -**结论**:m_w 值域 [60, 85]、默认 −65;归一口径 = 每结算瞬时当量(每 AP 总暴露分支被 percent schema 域禁止,排除);地板交叉层数 = ⌈100/m_w⌉ = 2(值域内恒 2);B3 接口零修订、值变更走 registry 回写——**回执以 B1 GDD F0 为准**(registry status_effect.anchor_warning F0 裁决回执)。 - -#### 推导 - -| 分支 | schema 可行性 | 后果 | 裁决 | -|---|---|---|---| -| 每结算瞬时当量 | 可行(m_w ≥ 51 即过锚——percent 域内) | F2 越域界随移(AP 界 8×m_w / 表界 16×m_w);地板交叉层数 = ⌈100/m_w⌉ = 2;上调的连带成本(地板提前到达、边际层贬值)入裁决 | 采纳 | -| 每 AP 总暴露 | 不可行——需 m_w > 100,被 percent ∈ [−100, 100] schema 域禁止 | 现实解 = B4 重定最低档参照(非上调)——未采纳 | 排除 | - -- 同分母性:瞬时口径下 weaken 与 hero 侧 buff 作用于同一伤害流,"严格大于"在百分点读法与 HP 读法下等价,锚判定无量纲歧义;总暴露口径引入时长权重,把 duration knob 泄漏进锚判定。 -- 机制同构:B3 本就按结算逐次兑付,瞬时口径是容器原生口径;总暴露需跨结算累计账本,与已锁的"单结算自然边界"(dur=1 每结算清零无存量)冲突。 -- 值域依据(@D_ref=12):下界 60 = 条款 2 两腿可行交集(腿一 m_w ≥ 51——65 > 50 严格大于 attack_up 当量〔参照对象,registry 回迁口径〕;腿二随 E_dig 口径修正放宽——m_w ≥ 38,以 B1 GDD F0 重算回执为准);上界 85 = 超出仅在连锁贫瘠板增加裕度、地板交叉层数恒 2;schema 顶 100 保留为绝对上界。 -- 红警关闭:原 −25 值在两个独立线性代理下同向预检不过(条款 2 锚差约 4×,且"单一线性换算"堵死分源改率、"无单档上限"堵死 max_stack 豁免)——F0 修订后锚两腿通过(瞬时当量 7.8 > 6.0 严格大于 ✓ / 7.8 ≥ E_dig 4.5 ✓——E_dig 读数随重算批口径更新);终值共裁与 registry 终值确认联动 B1 OQ2(见开放问题 #1)。 - -### F1 同 id 叠层合并(same_id_merge,授予时执行) - -**结论**:授予时按行 stack_policy 三分支合并——stack 加层不触碰 R(只有初始授予定钟)、refresh 重置 R 取实例授予时快照 D、independent 并存新实例;满层拒绝原子(false + 容器逐字不变)。 - -#### 推导 - -``` -merge(effect_id) —— 前置拒绝(域闭 / 未知 effect_id)沿用 States 节 API 口径,不入分支。 -行 = StatusEffectTable[effect_id],按 行.stack_policy 三分支: - - independent → 恒新建实例 {L=1, R=D},append 入列(同 id 并存多实例) - - stack → 无存活实例 :新建 {L=1, R=D} - 有存活实例 ∧ L < M :L ← L+1(R 不动,见注) - 有存活实例 ∧ L = M :返回 false(满层拒绝;容器零写入,溢出行归 B1 结算明细) - - refresh → 无存活实例 :新建 {L=1, R=D} - 有存活实例 :R ← D(L 不变;含 R 已 = D 的空刷新,恒返回 true—— - refresh 无满层/溢出语义,不消费 max_stack) -``` - -注(spec 决议):stack 授予不触碰 R——duration_settlements 只有初始授予定钟;若 stack 也重置 R,则 stack ≡ refresh + 加层,三分支失去区分性。refresh 的重置目标 D 取实例持有的授予时快照(与 EC9 快照语义一致——实例不受表重载影响)。 - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| effect_id | e | String | 表主键 | StatusEffectTable 行键;未知 = 拒绝 | -| stack_policy | P | enum {stack, refresh, independent} | 表列 | 合并分支选择器(Rule 4) | -| max_stack | M | int [1, 16] | 表列 | 仅 stack 分支消费;refresh/independent 不读(未来 refresh 行配 M>1 时行为 = 忽略) | -| duration_settlements | D | int [1, 99] | 表列 | 新建实例初始 R;refresh 的重置目标即此值 | -| layers | L | int | stack 行 [1, M];其余恒 1 | 实例层数(越界 = debug 断言,States 节不变式) | -| remaining | R | int | 存活态 [1, D] | 剩余结算次数;归 0 移除(F3) | - -- **Output Range:** 正常域——stack/refresh 行同 id 存活实例数 ≤ 1(不变式);independent 行实例数 = 受理授予数(有界确定);返回值 bool。极端行为——满层授予恒 false 且容器逐字不变(拒绝原子性:无半写、无溢出落层);同轮批量授予的先到先得次序由调用方保证(B1 编排须按确定次序调用 apply_effect——B3 只保证插入序枚举稳定,B1 验收项义务①)。 -- **Example:** attack_up(stack,D_a=1、M=2):轮 3 同轮授予批次两个安全格事实 → apply_effect×2 → L=2、R=1;同轮第 3 个授予 → L=2=M → **false**(明细"溢出未生效"行);兑付 +100%(F2)→ 轮末 decay R=0 移除。weaken(stack,D_w=1、M=16):轮 3 三旗命中三雷(雷格实例键,三次授予均合法)→ L=3、R=1;兑付 3×m_w(默认 65 → −195%)→ decay 移除;轮 4 一旗命中新雷 → 旧实例已销毁,**新建** {L=1, R=1}——dur=1 行的层只在单轮授予批次内累积,跨轮必为新实例。dur ≥ 2 行(策略探针 D_f=3):跨轮 R 逐轮 −1,refresh 腿见 AC-5。 - -### F2 有效值合成(effective_value_composition,兑付时只读) - -**结论**:有效值 = L × m 加算(unit 量纲标签原样随值输出、不进乘法);合成值不 clamp、可越出 percent 域——地板/clamp 归 B1 SettlementTable。 - -#### 推导 - -``` -effective_value(实例) = L × m (unit 随行声明,量纲标签原样随值输出、不进乘法) - stack 行:L ∈ [1, M];refresh / independent 行:L ≡ 1(每实例恒一倍) - 加算语义:percent 行的 L×m 是百分点线性叠加(+50 × 2 层 = +100 个百分点); - 乘算读法(1.5^L)在 B3 语义域外。 - 表注:行值出处(provenance,如"原型 1.5×")是数值来历标注,非合成语义。 -``` - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| layers | L | int | 同 F1 | 叠层数 | -| magnitude | m | int | percent ∈ [-100,100] ∧ ≠0;flat ≥ 1(单行字段域,D2 校验) | 行值;合成值不继承此域(见 Output Range) | -| unit | u | enum {percent, flat} | 表列 | 量纲标签;percent = 百分比修正、flat = 固定值;消费语义(乘除侧、地板、单位定义)不在 B3(见排除声明) | - -- **Output Range:** 正常域——percent 行有效值 ∈ [1, 100×M],**可越出 [-100, 100],B3 不 clamp**(合成值地板/clamp 归 B1 SettlementTable——B1 验收项义务③);flat 行 effective ≥ 1。极端行为——weaken 合成下界两档并列:**AP 界 = 8×m_w**(默认 65 → −520%;默认经济下 flag_hit 单轮 ≤ ap_per_round=8 次授予、dur=1 层只在单轮累积 → L=8)与**表界 = 16×m_w**(默认 65 → −1040%;仅非 AP 源如 clear_reward 授予、或 ap_per_round 调参后可达 L=16)——两档均越域,均不在本系统内收口;m_w 值域见 F0。跨 effect_id 聚合、percent 与 flat 混算 = B1 SettlementTable 域(Rule 7)。 -- **Example:** attack_up L=2 → +100 percent(兑换成 2.0× 与否的读法归 B1);defense_up L=2 → −60 percent(B1 换算 0.4×——现行值链下不触地板,"归零"读法须 B1 定义);weaken L=8 → 8×m_w(默认 −520 percent);ambush L=3 → **+9 flat**(3×m_amb——B3 不解释单位)。 - -### F3 结算衰减(settlement_decay,轮末执行) - -**结论**:先兑付后衰减——每实例每轮恰 −1、归 0 即销毁(不留 0 值实例)、返回本轮移除数 k;无参数、无豁免实例。 - -#### 推导 - -``` -decay_round() -> k: - k ← 0 - for 实例 ∈ 容器(插入序枚举,零随机): - R ← R − 1 - if R = 0:销毁实例;k ← k + 1 - return k -``` - -时序契约:**先兑付后衰减**——B1 经 query_active(side) 完成本轮兑付后才调用;duration=1 实例的落点由此完整确定 = 授予当轮编排期入容器 → 同轮兑付恰一次 → 轮末 R=0 移除("一次性"语义的全部机制内容)。停手轮/弃图轮同为结算、照常衰减(Rule 2,无免费延时);最后一轮(敌人全灭)是否 decay 归 B1 判定次序域(Rule 6,A3 EC8 同款——battle_end 全清兜底,两种次序产生同终态)。 - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 容器 | — | 实例多重集 | 存活实例全体 | 枚举序 = 插入序(Rule 1 确定性) | -| remaining | R | int | 存活态 [1, D];decay 后 ∈ [0, D−1] | 单调递减;refresh 的 R←D 发生在授予时(F1),不在本式内——两序分离 | -| 返回值 | k | int | [0, 容器规模] | 本轮移除数 | - -- **Output Range:** 正常域——每实例每轮恰 −1,无参数、无豁免实例;k ≤ 调用前容器规模。极端行为——空容器 → k=0;全 dur=1 轮 → k=容器规模(全清);R 恒不因 decay 变负(归 0 即销毁,不留 0 值实例——与不变式 remaining ∈ [0, D] 相容)。 -- **Example:** 轮 3:编排期授予 attack_up(L=1、R=D_a=1)→ 兑付 +50% → decay_round()=1(移除);轮 4 query_active(hero) 已不含 attack_up。dur ≥ 2 行(策略探针 D_f=3):授予后逐轮兑付、R 逐轮 −1、第 3 轮末移除——R 轨迹与 k 全由表读值推导。 - -### 显式排除声明(R4 式) - -本 GDD **无平衡公式**——F1–F3 只承载机制数学(合并/合成/衰减),不含任何"值该多大"的判断;四行 MVP 值全部 provisional(Rule 10)。平衡与语义归属逐一列明: - -| 对象 | 归属 | 依据 | -|---|---|---| -| 效果档位当量对照表(四源统一当量、单一线性换算) | **B1**(出表方兼闭合对账单一签字人) | A3 F1 条款 1 | -| weaken 档位锚(debuff 当量严格 > 最低档安全格 buff 当量,参照对象 = attack_up 行当量;基准 = 连锁放大边际挖掘收益,provisional 1:1) | **B4 表设计 + B1 对照验收** | A3 F1 条款 2 | -| 挖掘风险不等式(P(安全)×buff 当量下界 > P(雷)×敌方增益当量上界;B2 惩罚上限表值) | **B2 供给上限表值,B1 单一闭合对账** | A3 F1 条款 3 | -| 奖励定价(清图奖励及 B4 三硬约束:雾内档位下界 / 锚随雾成本上浮 / 净当量优势带上界) | **B4** | A4 pricing_constraints;A3 F1 条款 4/5 | -| percent 的消费侧换算与地板(乘除侧读法、合成值越域 clamp);flat 的量纲定义 | percent → **B1 SettlementTable**(Rule 7);flat 量纲 → **B2**(已定稿——registry ambush_unit_definition:每层伏击为每次攻击类行为附加 3 点主角 HP 伤害、后置加法) | Rule 7 + F2 Output Range;Schema 说明列 | -| MVP 四行初值定稿权 | **B3**(Rule 10);B4/B2/B1 持锚验收权,修订走接口漂移回写 registry | Rule 10 | - -B3 只对"L×m 线性合成 + R 计数"负责:合成值多大算强、多弱算废、floor 在哪、+3 打谁——均不在本 GDD 语义域。 - -## 状态 - -容器为**纯逻辑类**(非 autoload、无场景依附),每场战斗实例化一次(B1 编排前提;冒烟经 class_name 直引构造)。容器无运行时大状态机——实例生命周期四态(战斗域): - -| 状态 | 进入条件 | 行为/出口 | -|---|---|---| -| BattleClosed(域闭) | 构造后未开域 / notify_battle_end() 后 | apply_effect 全拒绝(false);唯一出口 notify_battle_start() | -| Active(存续) | apply_effect 受理(新实例/叠层/刷新) | 每轮结算被 B1 兑付消费;decay_round() 后 remaining −1 | -| Expired(移除) | remaining_settlements = 0 | 实例销毁(明细流水已由 B1 记录,B3 不留历史) | -| Cleared(清空) | notify_battle_end() | 全实例销毁、容器回空 → BattleClosed(不跨战斗) | - -不变式(debug 断言口径):remaining ∈ [0, duration_settlements];stack 行 layers ∈ [1, max_stack];stack/refresh 策略下同 id 至多一个实例——违反即 debug 断言中止;API 违规(域闭授予、未知 effect_id、满层授予)= 拒绝(false)+ debug 诊断,不进程致命(承 A3 拒绝口径;进程致命保留给 D2 数据通道)。 - -## 边界情况 - -| 条件 | 行为 | 依据 | -|---|---|---| -| EC1 域闭状态授予(BattleClosed 下 apply_effect) | 拒绝(false)、容器不变 + debug 诊断——B1 过早/过晚调用 = 编排错误显式暴露,不静默吞 | States 节 API 口径 | -| EC2 未知 effect_id | 拒绝(false)+ debug 诊断;表行删除/改名后旧引用的暴露点——悬空引用加载校验 = 首引激活条款:B4 RewardTable 首个 effect_id 引用已回填、校验已激活(registry dangling_ref_policy;条件性夹具 = B4 b4_dangling_effect) | A4 counter_item_ids 同款 · D2 首引兑现 | -| EC3 满层授予 | 恒 false 且容器逐字不变(拒绝原子性——无半写、无溢出落层);"溢出未生效"行归 B1 结算明细;同轮多授予谁被拒取决于 B1 授予次序——授予次序确定性是 B1 编排义务 | F1 Output Range · Rule 5 · 义务① | -| EC4 空刷新(refresh 行 R 已 = D 再授予) | 返回 true、无任何变化——合法空操作(refresh 无满层/溢出语义);MVP 无 refresh 内容行 = 该语义零消费者,首个 refresh 行上线时须补冒烟 AC;空刷新静默返 true 与 Rule 5"不静默蒸发"存在原则张力(stack 有溢出行、refresh 无对应物)——MVP 零消费者故休眠,首个 refresh 内容行上线时其授予可见性语义由 B4/B1 随 OQ3 一并裁决 | F1 决议 · systems-index 登记 | -| EC5 同轮 dur=1 行多次授予 | 层在单轮授予批次内累积(L=N)→ 同轮兑付一次(合成 L×m)→ 轮末全移除;跨轮必为新实例——"N 旗 = N debuff 总吞吐"在 B3 侧的呈现 = 单轮层和,对账归 B1 | F1 Example · A3 条款 2 | -| EC6 同一事实被重复授予(同 effect_id + origin_cell + round_index 两次 apply) | B3 不去重——容器是 dumb 账本,无从辨别事实合法性,两次授予 = 两层/两实例;事实→授予的恰一次转化归 B1 编排义务(round_end 双发射源同族问题,A3 先例) | 义务② | -| EC7 合成值越域(L×m 越出 [-100, 100] 或穿越地板) | B3 不 clamp、值 + unit 标签原样输出——收口归 B1 SettlementTable(B1 验收项:percent→乘数换算方向与地板规则须成文——weaken AP 界/表界、defense_up 叠满三例已在 F2 登记) | F2 Output Range · 义务③ | -| EC8 清图换图/弃图刷新 | 容器不清空——状态跨图延续(战斗域非图域);旗标记随图消亡(A2 域)不影响已授予实例;已消费兑付资格的雷格随图消亡(A3 域),新图新雷自然新资格——B3 无从感知也无须感知 | Rule 1 · AC-10 | -| EC9 战斗中热重载 StatusEffectTable | 走 D2 既有门(战斗中 reload 拒绝);已授予实例不受任何表重载影响——实例在授予时从表行拷贝数值快照(m/D/unit),热重载只影响后续授予 | A4 EC8"快照非活引用"同款 | -| EC10 refresh/independent 行配置 max_stack > 1 | 行为 = 忽略(F1 分支不读 M)——内容约定非校验项,validate() 不拒绝(防过度约束锁死未来内容) | F1 · AC-13 | -| EC11 notify_battle_start / notify_battle_end 重复或错序 | Active 下再 start → false + 诊断;BattleClosed 下再 end → false + 诊断(bool 口径统一,承 A3 输入×相位矩阵同款) | A3 同款 | -| EC12 query_active 空 side 或空容器 | 返回空 Array——合法状态非错误;D1 HUD 据此渲染"无状态" | D1 空态义务 | -| EC13 decay_round 在域闭时被调用 | 返回 0——域闭时容器恒空(battle_end 已清),0 是自然结果、无独立分支、不诊断(幂等安全的兜底读法) | F3 极端域 | -| EC14 independent 行被高频授予 | 实例数上界 = 受理授予数(有界、确定,无满层语义)——MVP 无此内容行;未来 DOT 类高频授予的容量语义归扩展(接口漂移),本 GDD 不预写 | F1 Output Range | - -## 依赖 - -**上游**(Foundation 层,无其他玩法上游): - -| 系统 | 性质 | 接口要点 | -|---|---|---| -| D2 | hard(数据通道) | StatusEffectTable schema 承载 + ConfigDB 读取;本 GDD 为该表回填 owner(schema + 四行已定稿);新字段走接口漂移规则。systems-index 分层表按其惯例不列纯数据读取边(事实依赖同口径)——两处相容非矛盾 | - -**下游**: - -| 依赖方 | 性质 | 接口要点 | -|---|---|---| -| B1 | hard | 结算编排期调用五 API:notify_battle_start / apply_effect(三源授予——B1 从 A2/A3 事件收集 round facts 后转化)/ query_active(side) 兑付消费 / decay_round() 轮末衰减 / notify_battle_end() 清空;结算明细来源标注数据源 = 实例字段(P2);效果语义映射与结算作用顺序归 B1 SettlementTable(effect_id 键);F1 条款 1 对照表的"实物"供给方;最后一轮 decay 与否归 B1 判定次序域;义务清单 8 项见下表 | -| B4 | soft | 安全格 buff 行值与 weaken 档位的锚验收权(条款 2 + A4 三定价硬约束引用"最低档安全格 buff 当量"——参照对象 = attack_up 行当量);清图奖励若含 buff 经 apply_effect(source=clear_reward,B4 期定);RewardTable 引用 effect_id 的悬空校验已随首引激活(EC2) | -| B2 | soft | ambush 行量纲/上限验收锚(条款 3:B2 惩罚上限表 vs B3 行值,对账归 B1 闭合;量纲已定稿——registry ambush_unit_definition);未来敌人词条引用状态(免疫/抗性)为预留注记,不预写 | -| A3 | 契约相邻(零运行时接口) | A3 不调用 B3;条款 1 四源当量对照以 B3 实例为对照实物;标中旗兑付资格(雷格实例键)判定在 A3/A2 域,B3 只接收 B1 转化的授予——资格判定不过 B3 | -| A2 | 间接(零直接接口) | 开格/标中/开雷事实经事件 → B1 收集 → apply_effect;A2 不感知状态容器 | -| D1 | soft | query_active(hero) 为 HUD 状态栏数据源(display_name/层数/剩余结算次数常显;EC12 空态渲染);层数/到期变化反馈——义务清单 ×4 见下表 | -| B5 | soft | 结算明细/战斗动画的实例字段数据源(经 B1 结算流水;MVP 明细行即呈现,动画归垂直切片)——义务 ×2 见下表 | -| D5 | soft | 教学口径:按结算次数计时("还剩 N 次结算"式读法随行值)、战斗结束全清(防"我的 buff 哪去了"误读——A3 RAP 清零教学同款)、满层溢出浪费提示、"同轮拿满优于跨轮叠"教学项(stack 时序补偿——OQ7 证伪项配套,证伪成立前以中性提示形态) | - -### B1 侧义务清单(登记 B1 GDD 验收项,缺项即 blocking——A4 对 A1/A2 登记先例) - -| 编号 | 内容 | 对侧 | 状态 | -|---|---|---|---| -| ① | 同轮多授予按确定次序调用(EC3) | B1 | 已落位 B1 GDD(履行回执) | -| ② | 事实→授予恰一次转化(EC6) | B1 | 已落位 B1 GDD(履行回执) | -| ③ | percent→乘数换算方向与合成值地板成文(EC7/F2——AP/表界数值随 F0 修订更新为 −520%/−1040%) | B1 | 已落位 B1 GDD(履行回执) | -| ④ | 最后一轮 decay 判定(F3) | B1 | 已落位 B1 GDD(履行回执) | -| ⑤ | F1 条款 1 效果档位对照表以 B3 实例为对照实物 | B1 | 已落位 B1 GDD(履行回执) | -| ⑥ | 每结算编排恰一次 decay_round()——decay 基数 = 1 是 dur=1 一次性语义与全部衰减语义的先决条件;Active 相位 double-decay 在 B3 侧无守卫(信任 B1 编排,误编排经本义务验收与可回放步骤流暴露) | B1 | 已落位 B1 GDD(履行回执) | -| ⑦ | 结算明细按授予流水逐条标注来源(F1 合并坍缩归因的兑付面补偿——合并实例只持首授 origin_cell/round_index,per-layer 来源还原的数据源 = B1 授予流水) | B1 | 已落位 B1 GDD(履行回执) | -| ⑧ | "溢出未生效"行进结算明细协议(Rule 5 后半的 B1 侧承载;呈现归 B5/D1) | B1 | 已落位 B1 GDD(履行回执) | - -### 呈现与教学义务清单(已登记 systems-index,缺项即 blocking,随各 GDD 门禁评审核对) - -| 编号 | 内容 | 对侧 | 状态 | -|---|---|---|---| -| D1-① | HUD 常显 + EC12 空态规格定稿(隐藏栏 vs 空槽由 D1 裁决但须成文) | D1 | 已登记 | -| D1-② | effect_id→icon 映射键契约(art-bible 形状+色相双通道) | D1 | 已登记 | -| D1-③ | 有利/有害极性呈现映射(数据源 = B1 SettlementTable 效果语义,非 magnitude 符号——负值增益存在) | D1 | 已登记 | -| D1-④ | 战斗结束全清的状态栏去留 | D1 | 已登记 | -| B5-① | 溢出行呈现(数据源 = B1 义务⑧明细协议) | B5 | 已登记 | -| B5-② | origin_cell→玩家可读形态(缩略图/格子高亮映射——坐标值本身不直接呈现) | B5 | 已登记 | -| D5 | "同轮拿满优于跨轮叠"教学项(OQ7 证伪项配套) | D5 | 已登记 | -| B4 | 奖励身份预读(stack 时序规划的推理原料——创意风险 #1 切面,OQ7 配套补偿载体) | B4 | 已登记 | - -### 一致性核对与注记 - -| 项 | 内容 | -|---|---| -| 双向一致性 | B4 ← A2, B3, D2 ✓ · B1 ← A3, B2, B3, B4, D2 ✓ · B3 ∈ Foundation、无上游 ✓(systems-index 依赖分层表) | -| B2 无边说明 | 索引无 B2←B3 边与上表 B2 行不矛盾——敌方状态的承载在 B3,但授予路径经 B1,B2 与 B3 之间是验收锚关系非运行时依赖,故不列边 | -| D2 hard 措辞 | "hard"指 ConfigDB 读表的数据通道事实依赖(registry config_db referenced_by=[all-systems] 同口径);索引分层表不列纯数据读取边——相容非矛盾 | -| Rule 10 回写 | 对 A3 OQ5"档位归 B4 表设计"的收编(初值定稿权归 B3、锚验收权留 B4/B1)已回写 systems-index 门禁记录与 registry ownership_note | - -### 呈现与 UI 契约(数据面义务——B3 无自有渲染面,呈现归 D1/B5) - -| # | 数据面义务 | 归属 | -|---|---|---| -| 1 | HUD 状态栏数据源三要素:图标(effect_id→icon 映射归 D1/art-bible)、层数(L)、剩余结算次数(R)必须可读——时限/剩余次数不可读 = 违反 P1 规划素材与 P2 兑现可见性 | D1 | -| 2 | 结算明细行数据源:display_name + 有效值(L×m)+ unit 标签 + 来源标注(source_class→文案映射归 B1/D1,P2 归因)——"增伤 +100%(第 3 轮 · 安全格)"式逐行读法;origin_cell 玩家可读形态(缩略图/格子高亮)归 B5(坐标值本身不直接呈现);满层溢出提示 = "溢出未生效"行含来源(Rule 5 诚实语义) | B1/D1/B5 | -| 3 | 视觉身份锚适用(game-concept):数值可读性优先于氛围(锚 1)——状态数值在暗色底上须高对比;增益/削弱图标不得只靠色相区分(锚 2 形状+颜色双通道);有利/有害极性不得由 magnitude 符号推导(负值增益存在——数据源 = B1 SettlementTable 效果语义) | D1 | -| 4 | 零信号外发:纯被动容器不发任何事件——呈现刷新点 = B1 结算编排完成后的界面刷新(D1/B5 域);到期/层数变化反馈经 decay 前后查询差分或 B1 流水(D1 裁决);无音频需求(到期/叠加音效归 D4 Alpha 期) | D1/B5/D4 | - -## Tuning Knobs - -### StatusEffectTable schema(D2 承载,B3 回填 owner——Rule 4 豁免:定义表非进度成长表,无 (level_index, node_depth) 维度;未来随关卡成长的效果走接口漂移加列,A4 先例) - -| 字段 | 类型/范围 | 说明 | -|---|---|---| -| effect_id | String(主键唯一) | 状态标识;B1 SettlementTable 语义映射的键 | -| display_name | String | 图例/HUD/明细用名(本地化归 D6) | -| target_side | enum {hero, enemy} | 作用侧(enemy 侧 side-wide = 全体存活敌单位) | -| magnitude | int | 域随 unit:percent ∈ [-100, 100] 且 ≠0 / flat ≥ 1(跨字段校验) | -| unit | enum {percent, flat} | percent = 百分比修正;flat = 固定值(伏击类) | -| duration_settlements | int [1, 99] | 授予时初始剩余结算次数(一次性 = 1) | -| stack_policy | enum {stack, refresh, independent} | 同 id 重复授予的合并策略(Rule 4) | -| max_stack | int [1, 16] | 层数上限;仅 stack 消费——refresh/independent 行约定恒 1(内容约定,非校验项) | - -加载校验(表非空——D2 Rule 6,四行即满足):effect_id 唯一(重复键致命——本表唯一致命夹具 dup_key);枚举域校验(target_side/unit/stack_policy 出域致命);duration/max_stack 域校验;跨字段 percent ≠ 0 / flat ≥ 1。 - -**F0 裁决回执注记(m_w)**:weaken.magnitude 现行值域 [60, 85]、默认 −65——**回执以 B1 GDD F0 为准**(registry status_effect.anchor_warning);F2 越域界随移 AP 界 −520% / 表界 −1040%;AC-14 腿 3 非平凡性复查通过(16×65 = 1040 越出 percent 域)。原 −25 值的裁决关系与修订轨迹见版本历史。 - -### Knob 表 - -| Knob(表行值,D2 承载) | 默认 | 调过高 | 调过低 | -|---|---|---|---| -| attack_up.magnitude | +50 | 叠满 +100%,敌方 HP 池相对贬值(战斗时长曲线压向 B1 对账) | 安全格奖励空心化——A3 条款 3 左臂(P(安全)×buff)塌方 | -| defense_up.magnitude | −30 | 叠满 −60%(免伤轮不再由 defense_up 单侧可达——B1 地板规则压力同步解除) | 减伤无感,防御型奖励萎缩(回调下界 = 减伤墙复发——观测锚 = C3 承伤带复验与 B1 条款③重跑) | -| weaken.magnitude | −65(值域 [60, 85]) | 越域界加深(表界 16×m_w)、地板交叉层数 ⌈100/m_w⌉ 恒 2、边际层贬值 | 值域下界 60 = 条款 2 锚两腿可行交集——越界即破锚(修订方向 B4/B1 裁决) | -| ambush.magnitude | +3 flat | 量纲已定稿(每攻击类行为 +3 HP)——踩雷痛感随值放大,条款 3 上限对账归 B1 | 踩雷无痛感——P3"风险与收益同源"失衡 | -| duration_settlements(四行) | 1/1/1/1(当次结算) | 窗口拉长恢复跨轮延续(规划变简单、衰减感消失) | 已在下界 1(一次性语义——再低无定义) | -| max_stack(四行) | 2/2/16/16 | 合成越域幅度增大(B1 地板压力↑) | 叠层机制边缘化(重复奖励变溢出浪费) | - -- **非 knob(结构冻结)**:stack_policy 三分支语义、unit 语义、source_class 枚举、时限量纲 = 剩余结算次数(game-concept 定稿)、先兑付后衰减时序、拒绝原子性、零随机——修订走本 GDD 流程非调参。 -- **Knob 交互**:attack_up 与 weaken 是条款 2/3 对账的**两端**——禁止独立调参,联动评估归 B1 闭合对账;A3 的 ap_per_round 是 weaken 单轮层和的经济上限(F2 AP 界 8×m_w 的来源);效果档位当量对照表(B1)落定前,四行 magnitude 的任何调整都须**重跑条款 2/3 锚预检**并同步 registry(接口漂移义务)。defense_up 叠满 −60% = 当次结算 0.4× 承伤(消费读法归 B1);减伤窗口强度与 attack_up 同入 B1 对账联动评估(B1 地板规则 × 战斗时长曲线 × 条款③ V_safe),禁止独立调参——defense_up.magnitude/duration 已纳入"禁独立调参"联动网络(m_w↔D_ref↔m_d↔duration_d,与 B1 Knob 交互同口径);减伤墙批(−50→−30)即该联动的实证回调(免伤轮现行可达路径 = weaken 饱和,见 F2)。 - -## 验收标准 - -### 测试口径 - -| 口径 | 要点 | -|---|---| -| 测试载体 | B3 是纯行为容器——无场景、无表现面、无加载期自有校验类别。冒烟载体 = `godot --headless --script`(承 D2 冒烟框架;脚本 extends SceneTree 以获得 quit(code)、ConfigDB autoload 由脚本显式实例化);容器经 class_name 直引实例化(每用例全新实例、无跨用例状态——A4 AC-5 直引先例同款;AC-19 扫描对该实例化路径豁免) | -| 被测面 | B1 就绪前冒烟直接驱动 B3 最小 API 面(承 A3"直接驱动最小 API 面"先例);B1 就绪后改走真实调用方(结算编排),断言口径不变。API 面:notify_battle_start() · apply_effect(effect_id, source) → bool · query_active(side) → Array · decay_round() → int · notify_battle_end() → bool | -| 返回口径 | 全部布尔/计数返回 = 受理/拒绝(A3 全 API 布尔口径同款)——"拒绝"直接断言返回值,附 debug 诊断、非进程致命(承 A3 拒绝口径;进程致命保留给 D2 数据通道);decay_round 返回值 = 本轮移除数断言;apply_effect 是唯一授予入口(Rule 3),冒烟直接构造合法 source = {source_class, origin_cell, round_index}(B1 转化产物的冒烟等价——信任方向同 A3 对 chain_size/clears_map 的处理);query_active 为只读、任意相位合法 | -| 只读观测量 | 实例六字段 effect_id · layers · remaining_settlements · source_class · origin_cell · round_index;query_active(side) 元素 = 结算面向载荷投影:六字段 + display_name + 授予时数值快照 (magnitude, unit)(EC9 快照语义 + B5/D1 数据源)——有效值 = layers × 快照 magnitude、unit 标签原样随值输出(F2);枚举序 = 插入序(Rule 6)。相位无字段观测量:BattleClosed/Active 由 API 返回值推断;Expired/Cleared 为销毁态不可观测(瞬态纪律同 A3 RoundEnd) | -| 时序口径 | B3 无 round_start/settlement API——"轮边界"在冒烟中 = 相邻两次 decay_round() 调用之间的授予/查询窗口(B1 编排在 B3 侧的可见面恰为这五个 API);多步 GIVEN 均给出构造序列 | -| 期望值纪律 | magnitude / duration_settlements / max_stack 均为 knob(Tuning Knobs 节)——各 AC 的 THEN 具体数值按当前 ConfigDB 表值推导、不写死(正文以 D_a / M_a / m_w 等表读值记号书写);结构字段(effect_id 集合、target_side、unit、stack_policy)非 knob、定值断言合法;行表"来源"列为内容档案(provenance)非 schema 字段、非运行时约束——B3 不校验 source_class 与行的对应(EC6 dumb 账本同族) | -| 夹具策略 | ① 默认根(干净检出四行 MVP 内容)承载全部分支行为 AC;② 程序构造(schema 类 class_name 直引实例)承载 AC-13 域校验——不经 load()/preload();③ 行为夹具根经 --data-root 注入(仅 debug、不入 data/tables/——D2 夹具纪律),承载 MVP 无行的语义(refresh/independent)。显式声明:夹具测试行非 MVP 内容(Rule 10 四行全 stack;测试行仅供冒烟)。选夹具根而非程序构造注入表的理由:容器经 ConfigDB 单点读表(Rule 2/9)、无表注入 API——--data-root 是 debug/test 构建的既定注入通道;各 AC 声明其表根(默认根/下列三根),用例间无顺序依赖、每用例先 reset_diagnostics()(D2 冒烟协议,全局声明) | -| 致命类收窄 | 恰一根致命夹具 status_effect_dup_key(重复键类别):runner manifest 退出码行 dup→≠0(独立 headless 进程、游戏通道,D2 AC-2b 协议同型)——"游戏内真的会死"在本表上的落点由此腿实证;其余致命类别(枚举域/域校验/跨字段)由 D2 AC-2 同类别 loader 级夹具承载(表无关,豁免声明收窄保留);schema 侧以程序构造断言域类别(AC-13) | -| out-of-scope | deferral 生效条件 = B1 义务清单(依赖节,均已落位):① 同轮多授予先到先得次序(EC3 后半——冒烟单调用方次序即构造序,B1 编排次序 = 义务①)② 事实→授予恰一次转化(EC6 后半——义务②)③ percent→乘数换算方向与合成值地板(EC7 收口半——义务③)④ 最后一轮 decay 判定次序(F3 时序契约的 B1 半——battle_end 全清兜底使两序同终态,冒烟不构造)⑤ 效果档位对照表以 B3 实例为对照实物(义务⑤,对账归 B1)。另有:结算明细"溢出未生效"行与来源标注呈现(冒烟无明细观测量——对侧承载已登记:B1 义务⑧ + B5×2,deferral 生效条件成立);D1 HUD 状态栏与 EC12 空态渲染(D1×4 已登记);效果语义到结算公式映射(Rule 7——B1 SettlementTable 域);Rule 8 负空间(无驱散/延时/转移 API——"无对应 API"不可 GIVEN-WHEN-THEN,验收形态 = 前言 API 面封闭枚举 + 接口漂移修订门);D2 schema 校验致命端到端(双通道协议承载);悬空引用校验(EC2——D2 双通道条件性夹具);EC9 reload 门腿(D2 AC-16 既有覆盖 + B1 是置位/复位唯一调用方——B3 无断言义务);EC8 端到端换图腿(B1 编排合规,AC-10 裁决) | - -夹具规格(登记值即相关 AC 的推导基准): - -| 根 | 内容 | 用途 | -|---|---|---| -| status_effect_policy_rows | refresh_probe(display_name="刷新探针" · hero · percent · magnitude=+10 · duration=3 · stack_policy=refresh · max_stack=4——故意违反"refresh 行恒 1"内容约定)+ independent_probe(display_name="独立探针" · enemy · flat · magnitude=+2 · duration=3 · stack_policy=independent · max_stack=1)——全字段域内合法数据 | AC-5 / AC-6(EC4 / EC10 / EC14 载体) | -| status_effect_policy_rows_reloaded | 仅 fresh_probe 一行(hero · percent · magnitude=+20 · duration=9 · stack · max_stack=1);根规格 = D2 全表清单拷贝 + 仅置换 StatusEffectTable 为本单行(缺任一表文件即触发 D2 EC1 文件缺失致命、GIVEN 不可构造——"仅一行"指该表内容非根内容) | AC-15 重载腿 | -| status_effect_dup_key | D2 全表清单拷贝 + StatusEffectTable 置换为默认四行 + 追加一行与 attack_up 同 effect_id 的重复键行(其余字段域内合法)——唯一致命夹具(A4 variation_dup_key 同型):loader 集成缝(loader 是否对本表调用校验)的进程级落点 | runner manifest dup→≠0 | - -### AC 清单(Given-When-Then,编号不变) - -| AC | Given | When | Then | -|---|---|---|---| -| AC-1 | 全新容器(BattleClosed、空;表根 = 默认根) | ① 依次 apply_effect(attack_up, 合法 source)、query_active(hero)、query_active(enemy)、decay_round();② notify_battle_start();③ 再次 notify_battle_start() | ① apply 返回 **false**(EC1 域闭拒绝)、双侧 query 均 = **空 Array**(EC12)、decay 返回 **0** 且诊断收集器零新增(EC13——空容器域闭的兜底读法,非独立分支不诊断);② **true** 且 query 仍双侧空(战斗开始时为空——Rule 1);③ **false**、相位与容器不变(EC11 前半——Active 再 start) | -| AC-2 | Active 且已建账(构造:apply_effect(attack_up) ×1 + apply_effect(weaken) ×1,query 断言含两实例) | ① notify_battle_end();② 再次 notify_battle_end();③ decay_round();④ apply_effect(attack_up, …);⑤ notify_battle_start() | ① **true**、query 双侧空(Cleared 全清、不跨战斗——Rule 1);② **false**(EC11 后半——Closed 再 end);③ **0** 且诊断零新增(EC13 域闭腿);④ **false**(EC1 全场战后腿);⑤ **true** 且容器空(唯一出口——下一场战斗重启,States 表) | -| AC-3 | Active | apply_effect("attack_up", {safe_cell, (3,4), round_index=2}) | true 且 query_active(hero) 恰 1 实例,其六字段逐一相等:effect_id="attack_up"、layers=1、remaining=D_a(attack_up.duration_settlements 表读值)、source_class="safe_cell"、origin_cell=(3,4)、round_index=2(P2 归因字段授予即携带——Rule 3,结算明细逐行标注的数据源) | -| AC-4(stack 分支前两腿 + "R 不动" spec 决议) | Active;D_a / M_a 为表读值 | 腿 1:无存活实例时 apply_effect(attack_up, …);腿 2(前提 D_a ≥ 2 ∧ M_a ≥ 2——默认表值 D_a=1 不满足,本腿默认退化跳过 + 显式 SKIP 标记防 CI 静默、不假失败,前提满足时执行;构造 = 腿 1 实例经 decay_round() 一次至 R=D_a−1)再 apply_effect(attack_up, …) | 腿 1:true、新实例 **L=1、R=D_a**;腿 2:true 且 **L=2、R 仍 = D_a−1**——**stack 授予不触碰 R**(F1 注 spec 决议:只有初始授予定钟;实现若重置 R 即三分支失去区分性,本腿即其暴露点) | -| AC-5(refresh 分支 + EC4 + EC10;表根 = status_effect_policy_rows,测试行非 MVP 内容) | Active;D_f=3、m_f=+10(夹具规格登记值) | ① apply_effect(refresh_probe, …);② decay_round() 后 apply_effect(refresh_probe, …);③ R 已 = D_f 时再 apply_effect(refresh_probe, …);④ 再 apply_effect ×2;⑤ 该根经测试通道加载 | ① true、新实例 L=1、R=D_f、载荷 = 1×m_f(refresh 行 L≡1——F2);② 返回 0(R=D_f−1)后 **true、R 重置 = D_f、L 不变**(F1 refresh 正常腿);③ **true 且实例六字段 + 载荷逐字不变**(EC4 空刷新 = 合法空操作——refresh 无满层/溢出语义);④ 均 true(max_stack=4 从不被消费——**EC10 行为 = 忽略**);⑤ 诊断为零(内容约定非校验项——EC10 非校验半句) | -| AC-6(independent 分支 + EC14;同夹具根,测试行非 MVP 内容) | Active;D_i=3(夹具规格登记值) | 同轮授予批次内以互异 origin_cell((1,1)/(2,2)/(3,3)——插入序可观测的前提)apply_effect(independent_probe, …) ×3;再 decay_round() | 全部 true 且 query_active(enemy) 恰 **3 个并存独立实例**(各 L=1、R=D_i、**投影序列 = 授予序** (1,1)→(2,2)→(3,3)——互异 origin_cell 使插入序成为可判定断言,Rule 6 枚举确定性);decay 返回 0(D_i≥2 无移除)且三实例各自 R=D_i−1(F3 逐实例、无豁免);实例数上界 = 受理授予数(**EC14 有界确定**——无满层语义) | -| AC-7(EC6 不去重) | Active 且已有 attack_up 存活实例(L=1,构造同 AC-3) | 以完全相同的 (effect_id, source)(同 origin_cell、同 round_index——同一事实重复转化的模拟)再次 apply_effect | true 且同实例 **L=2**——B3 **不去重**(dumb 账本,无从辨别事实合法性,EC6);out-of-scope:事实→授予恰一次转化归 B1 编排(义务②,deferral 生效条件 = 依赖节清单) | -| AC-8(F3 主式) | Active(构造:apply_effect(weaken) ×2 → 单实例 L=2、R=1;apply_effect(attack_up) ×1 → R=D_a;前提 D_a ≥ 2——第二 WHEN 腿依赖,默认表值 D_a=1 不满足 → 本条退化跳过 + 显式 SKIP 标记(同 AC-4 口径、防 CI 静默),前提满足时执行) | ① decay_round();② 再 decay_round();③ 对空容器 decay_round() | ① 返回 **1**(= 构造中 dur=1 实例数,由表读值推导;weaken 实例移除)、attack_up R=D_a−1 仍在、容器插入序不变;② 返回 1(attack_up 移除——**R 归 0 即销毁,容器无 0 值实例**,与不变式 remaining ∈ [0, D] 相容);③ 0(F3 极端域)。R 轨迹与 k 全部由表值推导 | -| AC-9(EC5 dur=1 单轮叠层 + 一次性全落点) | Active(新轮) | 同轮授予批次内 apply_effect(weaken, …) ×3(N=3 为构造选择,≤M_w 表读值);decay_round();下一轮边界再授予 weaken ×1 | 全部 true、单实例 **L=3、R=1(=D_w 表读值)**、载荷 = 3×m_w(同轮兑付一次的合成输入;N 旗 = N debuff 总吞吐的对账归 B1 条款 2——义务⑤邻接,out-of-scope);decay 返回 1、实例移除;再授予 → **新建**实例 L=1——**跨轮必为新实例**(旧实例已销毁,F1 Example weaken 腿) | -| AC-10(EC8 跨轮/跨图延续——结构性裁决) | Active,attack_up 授予 ×1(R=D_a) | 连续多轮边界仅 decay、无新授予(停手轮/弃图轮的 B3 视角——B3 无图概念、换图/刷新零专用信号);逐步 query | 实例 R 逐轮 −1 **不停摆**(无豁免实例、无参数——**无"不结算就不掉次数"的免费延时**,Rule 2),且每步 query 断言容器非空直至 R 自然归 0——**除 notify_battle_end 外无任何 API 入口使容器清空**(先轮授予的实例按 R 存续至自然到期)。裁决:EC8 的"换图不清空"对 B3 的可测内容 = 本条两句(跨轮延续 + 唯一清空入口);"换图"事件对 B3 不可观测(零接口)——端到端"真实换图下容器仍存续"归 B1 集成(编排契约:仅 battle_over 调 end——B1 API 合规半句,B1 GDD 域,非新增义务) | -| AC-11(EC3 满层拒绝与原子性) | Active;M_a 为 attack_up.max_stack 表读值;构造叠满(M_a 次授予——次数由表值推导、不写死),前 M_a 次均 true、单实例 L=M_a | 第 M_a+1 次 apply_effect(attack_up, …) | **false** 且容器逐字不变——query_active(hero) 恰 1 实例,其六字段 + 载荷 + display_name 与授予前快照**逐项相等**(拒绝原子性:无半写、无溢出落层,F1 Output Range);"溢出未生效"明细行归 B1(out-of-scope,义务①邻接) | -| AC-12(EC2 未知 effect_id) | Active | apply_effect("no_such_effect", 合法 source);表行改名后的旧 id 同理 | **false**、容器不变。政策声明:悬空引用加载校验 = 首引激活条款——B4 RewardTable 首个 effect_id 引用已回填、校验已激活(registry dangling_ref_policy;条件性夹具 = B4 b4_dangling_effect;out-of-scope,D2 双通道) | -| AC-13(加载期域校验全谱——程序构造,class_name 直引,A4 AC-5 同型) | StatusEffectTable schema 类直引实例(不经 load()/preload()) | validate() 分别作用于非法组:percent=0(跨字段 percent≠0)/ percent=101 / percent=−101、flat=0(flat ≥ 1)、duration ∈ {0, 100}、max_stack ∈ {0, 17}、stack_policy/target_side/unit 各一出域枚举值、两行同 effect_id(重复键);再作用于域内代表值 percent ∈ {100, −100, 1, −1}、flat=1、duration ∈ {1, 99}、max_stack ∈ {1, 16} 及 stack_policy=refresh 且 max_stack=4 的行(EC10) | 非法组:各含对应域错误类别;合法组:零诊断(EC10——内容约定非校验项,防过度约束锁死未来内容) | -| AC-14(F2 合成 + EC7 不 clamp) | Active;m 各值为表读值 | 腿 1(percent·stack):apply_effect(attack_up) ×2(前提 M_a ≥ 2——默认满足,M_a=1 时退化为单层恒等断言 + SKIP 标记);腿 2(flat):apply_effect(ambush) ×3;腿 3(越域,EC7):同轮 apply_effect(weaken) ×M_w(M_w 表读值、≤16 同轮批授予合法);腿 4:refresh/independent 行载荷 L≡1 | 腿 1:载荷 = **2×m_a** 且 unit="percent" 标签随值输出(量纲标签不进乘法——F2);腿 2:载荷 = 3×m_amb、unit="flat"(B3 不解释单位——排除声明);腿 3:载荷 = **M_w×m_w 原样输出、无 clamp**("不 clamp"的可判定形式 = 载荷与表值推导值恒相等,任何地板都会使其不等;承载声明:本腿非平凡性依赖默认基线——M_w=16、m_w=−65 → −1040 越出 percent 域;knob 调参使 M_w×m_w 绝对值 ≤ 100 时退化为恒等断言、不假失败,退化时用例输出显式退化标记 SKIP 日志、CI 可见防静默失真;地板/clamp 与换算方向归 B1 SettlementTable——out-of-scope,义务③);腿 4:已由 AC-5①/AC-6 承载(引用不重复) | -| AC-15(EC9 快照 vs 表重载——机制口径) | 表根 = status_effect_policy_rows、Active、已授予 refresh_probe ×1 并 decay 一次(R=D_f−1、载荷 1×m_f) | 冒烟脚本经测试通道换根加载 status_effect_policy_rows_reloaded(load_tables(root, collect_only=true) 直调——非 D2 reload() 路径:不过 set_reload_gate、不发 config_reloaded、无 EC16 语义,门语义归 D2 AC-16/B1〔OQ5〕;reloaded 根规格 = D2 全表清单拷贝 + 仅置换 StatusEffectTable,见前言夹具规格);再 apply_effect(fresh_probe, …)(新 id、无存活实例——refresh 重置目标取实例快照 D 的口径见 F1 注,本腿不涉存活实例重置) | **已授予实例六字段与载荷逐字不变**(授予时拷贝 m/D/unit 数值快照——EC9"快照非活引用",A4 EC8 同款语义;实例为 B3 自持,故 B3 冒烟自测、无需 deferral);fresh_probe → true 且新实例 **R=9、载荷 1×(+20)**(夹具登记值)——**换根只影响后续授予** | -| AC-16(MVP 内容四行) | ConfigDB 默认根加载完成 | 读 StatusEffectTable | **恰含 4 行**、effect_id 集合 = {attack_up, defense_up, ambush, weaken}(定值);target_side:attack_up/defense_up=hero、ambush/weaken=enemy,unit:percent/percent/flat/percent,stack_policy=stack ×4(均非 knob 结构、定值断言合法——Rule 10"四行全 stack");display_name 四值非空(精确值对账归 AC-18);magnitude/duration_settlements/max_stack 仅作类型域断言、期望 = 表读值(knob 纪律——A4 AC-1 同款,防调参打假;行表"来源"列为 provenance 非表字段、不作断言) | -| AC-17(确定性——A3 AC-17 同型;可观测序腿) | 全新容器实例 ×2(同 ConfigDB 默认根;每遍新实例、无跨实例状态) | 同一定长序列驱动两遍:start → defense_up×1 → attack_up×1(同侧双实例、授予序 = 字典序**逆序**——区分"插入序实现"与"字母排序实现"的判别性前提)→ query 投影(hero 恰 2 实例,**投影序列 = [defense_up, attack_up] 定值断言**——插入序的行为级观测点)→ weaken×1 → decay → query 投影 → attack_up×1(并入腿——前提 D_a ≥ 2 成立时并入 L=2;默认表值 D_a=1 时旧实例已销毁,退化为新建 L=1 断言 + SKIP 标记,同 AC-4 口径)→ decay → end → query | 两遍的 query_active 投影序列(**含插入序**)与 decay_round 返回值序列**逐项相同**,且 hero 侧投影序恒 = 授予序(非字典序——零随机 + 插入序枚举的双重行为级证据——Rule 1;D2 AC-15 的 B3 层前身) | -| AC-18(registry 一致——A3 AC-10a 同型,无条件断言;registry 逐字段键) | ConfigDB 默认根加载完成 | 脚本解析 design/registry/entities.yaml 的 status_effect 条目(**逐字段 YAML 键**——机器对账前提,action_economy 同构) | ① fields 八键与 ConfigDB schema 字段名逐一相等、各键的类型/域/枚举描述与 schema 定稿相等(**缺任一键即失败**);② mvp_content 四键 id 集合与表行 id 集合相等,**非 knob 结构字段**(target_side/unit/stack_policy)逐一相等;③ rule4_exemption / dangling_ref_policy 注记存在性断言。knob 活值(magnitude/duration_settlements/max_stack)**不作定值对账**(A4 AC-8 同款——对账口径 = registry 随调参同步〔接口漂移义务〕,本 AC 豁免其值)。生效前提:本条目为定稿回填 + registry 逐字段键重构的产物,AC 生效前提 = 重构回填完成(不写"若存在"软口径——条件化使一致性检查落空,A3/A4 均无条件) | -| AC-19(静态扫描——D2 AC-9/AC-10 模式引用,A3 AC-10b 同型) | B3 文件集(容器/schema/冒烟脚本/夹具规格)纳入 D2 AC-9 模式项目级扫描域 | 静态扫描:randomize() / RandomNumberGenerator / ConfigDB 外 data 表加载 / extends Control / .tscn preload;+ D2 AC-14 人工三要素字面量扫描 | 全部**零命中**(schema 与容器的 class_name 直引实例化豁免——AC-13 前提,A4 AC-7 同款);字面量扫描引用不另设硬 THEN(字面量判定误报率高——D2 已定性 warning 级 + 人工复核);零随机的行为级硬证据 = AC-17 | - -### 覆盖矩阵(qa-lead 交付,验收评审用) - -| 类别 | 映射 | -|---|---| -| Core Rules | Rule 1→AC-1/2/10/17/19 · Rule 2→AC-8/9/10 · Rule 3→AC-3+前言 API 封闭 · Rule 4→AC-4/5/6 · Rule 5→AC-11(明细行→B1 义务⑧+B5×2 已登记)· Rule 6→AC-1/2(decay 次序 OOS)· Rule 7→OOS(载荷只读面 AC-14)· Rule 8→前言 API 封闭+OOS · Rule 9→AC-13/16/19 · Rule 10→AC-16/18 | -| Formulas | F1→AC-4/11(stack)/AC-5(refresh)/AC-6(independent)· F2→AC-14+AC-5①/AC-6 · F3→AC-8/9/10 | -| 边界情况 | EC1→AC-1/2 · EC2→AC-12 · EC3→AC-11 · EC4→AC-5③ · EC5→AC-9 · EC6→AC-7 · EC7→AC-14 腿 3 · EC8→AC-10 · EC9→AC-15 · EC10→AC-5④+AC-13 · EC11→AC-1/2 · EC12→AC-1 · EC13→AC-1/2 · EC14→AC-6——无洞 | - -## 开放问题 - -| # | 问题 | owner | 状态/时机 | -|---|---|---|---| -| 1 | weaken 条款 2 锚裁决——归一口径已由 F0 裁决关闭(每结算瞬时当量;总暴露分支被 schema 域禁止排除),m_w 值域 [60, 85]/默认 −65 已入文。余项:终值共裁确认 + registry 终值回写,裁决时复查 AC-14 腿 3 非平凡性 | B4/B1(deadline:B1 GDD 强制检查点) | 余项随 B1 OQ2 联动 | -| 2 | ambush 量纲——已定稿(B2 GDD:每层伏击为每次攻击类行为附加 m_amb 点主角 HP 伤害、后置加法、charge 拍零兑付——registry ambush_unit_definition)。余项:B1 条款 3 上限检验 | B2 → B1 | 随 B1 对账闭合 | -| 3 | 首个 refresh/independent 内容行的 AC 补全——EC4 登记义务:奖励池引入非 stack 行时补真实内容行冒烟 AC,夹具探针行退役;其授予可见性语义(空刷新 vs Rule 5)随批由 B4/B1 裁决 | B4 | 奖励池引入非 stack 行时 | -| 4 | clear_reward 源授予——清图奖励若含 buff 的授予路径确认(apply_effect source=clear_reward;A3 条款 4 差异化插槽) | B4 | B4 期 | -| 5 | EC9 reload gate 的 B1 侧落点——防"战斗中真的被置位"零落点(qa-lead 缺口 #4) | B1 GDD 门禁评审 | 随 systems-index 门禁记录登记 | -| 6 | 效果当量对照表的预检重跑——条款 1 对照表落定时按预检重跑 weaken/ambush 方向性预检(正式对账载体);C3 首次调参即须按现行参照(attack_up 当量)复算条款 2 预检 | B1 | B1 对照表落定 / C3 首调 | -| 7 | stack-不重置 R 的 playtest 证伪项——F1 注决议(用户拍板、结构冻结)的体验面反例检验:"早拿必亏"(分轮拿满总暴露 150pp vs 同轮拿满 200pp——算例基线 = dur=2 行值;现行四行 D=1 下两读法总暴露相等、不对称休眠,dur ≥ 2 内容行上线时激活)叠加奖励身份不可预读(创意风险 #1)是否伤害"把 buff 纳入挖掘推理"的规划感(P1)。补偿载体先行:B4 奖励身份预读 + D5"同轮拿满"教学;证伪成立则走结构冻结修订流程回炉(合并/重定义 stack 分支)——非调参 | 垂直切片前置 playtest 批次 | playtest | - -## 版本历史 - -| 版本 | 日期 | 改动 | -|---|---|---| -| 跨评审 B3 接口漂移批 | 2026-09-14 | /review-all-gdds 🔴-1 前半(减伤墙批回写缺口,registry 同批):defense_up.magnitude −50→**−30**(减伤墙批 C3 投值——叠满两层 −60 帽,defense_scan 墙轮 39%/真人 12 轮零承伤定量坐实)——MVP 内容行/Tuning Knobs/F2 Example 同步;免伤轮叙述同步(defense_up 单侧不可达 D'=0,现行可达路径 = weaken 饱和;F2 三例第三例改 defense_up 叠满读法——对侧 B1 F2 同批);Knob 交互:defense_up.magnitude/duration 纳入"禁独立调参"联动网络(m_w↔D_ref↔m_d↔duration_d);核心规则表增依据列(lint R8 引用列迁移) | -| v1.1-lean | 2026-09-13 | 格式迁移:legacy 原稿按 lean 样例重排——修订注记出正文收敛至本表;散文/枚举/边界/AC 转表格;流程转字符画;公式本体、Variables 表与验算数据全保留;语义与 registry 现行值对齐(weaken −65 = F0 值域 [60,85] · 四行 duration 1/1/1/1 = 当次结算 · enemy 侧 side-wide 多敌读法),零规则变更 | -| 两级奖励批 | 2026-09-11 | attack_up/defense_up duration 2→1(当次结算语义:授予结算兑付后即衰减);attack_up 复活(HeroTable.atk 域 [1,999]、0 加载拒绝——基础攻击恒存在,消费面 = 主角战斗段先手攻击);条款 2 锚参照对象回迁 attack_up 当量;正文原 D=2 行注记与 Knob 表 2/2/1/1 旧行按本批现行值改写 | -| F0 裁决回执批 | 2026-09-10 | weaken −25 → 值域 [60, 85]/默认 −65(B1 GDD F0:归一口径 = 每结算瞬时当量,总暴露分支被 percent schema 域禁止排除——条款 2 锚红警关闭,锚两腿 7.8 > 6.0 / 7.8 ≥ E_dig 7.2 通过);B1 义务①–⑧履行回执落位;B3 正文回执以 B1 GDD F0 为准(registry status_effect.anchor_warning) | -| 单敌假设回验批 | 2026-09-09 | B2 定多敌模型(1–3 个同敌种敌单位)——Core Rule 1 单敌假设回验不成立,效果 side-wide 语义改"全体存活敌单位"(层数 = side 共享池,B3 现接口零变更兼容);target_ref 单体寻址 = 扩展位义务(首个单体效果上线时 B3 补列,随批 B1 归集语义/D1 呈现裁决)——registry single_enemy_assumption | -| Rev 1 | 2026-09-09 | design-review 7 项 blocking 同日核销:enemy 侧单敌假设入文(后经上批回验改写)· B1 义务 5→8 · D1/B5/D5 呈现义务登记 systems-index · AC-15 机制更正 + reloaded 根全清单规格 · 致命夹具补根 dup_key · AC-18 随 registry 逐字段键重构 · weaken 红警补修复空间不对称 + OQ1 归一口径前置 · stack-不重置 R 登记 OQ7 playtest 证伪项——明细见 reviews/b3-status-effect-review-log.md | -| v1 | 2026-09-08 | 一次会话定稿:三结构决策(单一计数/按行叠层/四行定稿权收编)用户拍板;lean 门禁 systems-designer 起草 Formulas · qa-lead 起草/验证 AC;CD-GDD-ALIGN 按 lean 跳过 | diff --git a/design/gdd/legacy-2026-09-14-v1/b4-reward-item-economy.md b/design/gdd/legacy-2026-09-14-v1/b4-reward-item-economy.md deleted file mode 100644 index df058946..00000000 --- a/design/gdd/legacy-2026-09-14-v1/b4-reward-item-economy.md +++ /dev/null @@ -1,735 +0,0 @@ -# B4 奖励与道具经济(Reward & Item Economy) - -> **状态**:In Review → Revised · lean 格式——full design-review(五专员 + creative-director 终审)14 条 blocking 已同日核销,待 delta 复核放行;lean 定稿批的 CD-GDD-ALIGN 缺项已随终审补位 -> **版本**:v1-lean · 2026-09-13 · 作者:user + agents -> **承载支柱**:P2 主(奖励是"扫雷的因"的兑现物)· P3(安全格价值侧)· P1(奖励身份可预读 = 规划素材) -> **一句话**:B4 定义"扫雷决策的兑现物是什么、值多少、怎么随机、怎么入库"——安全格/清图奖励在 install 期预分配身份,经 B1 结算编排按 category 分流兑付,可选类入关卡域库存经道具使用窗口兑付。 - -## 速览 - -| 关键问题 | 答案 | -|---|---| -| 定位 | 战斗域奖励层——"奖励是什么、值多少、怎么 roll、怎么入库"的唯一 owner;D2 RewardTable 回填权持有方 | -| 拥有 | 奖励类型封闭枚举与两级交付轴 · RewardTable/RewardConfigTable schema(D2 回填 owner)· **供给控制器机制(RewardSupplyController——install 期战斗首件保证 + 指数递减注入,C3 修订批承接登记)** · install 期身份预分配(reward_roll 封闭流)· 分流/入库/库存查询接口 · 关卡域库存容器 · F1–F6 数值供给 · 失衡预警①–⑧ | -| 不拥有 | 何时兑付/结算顺序/明细行协议(B1)· 棋盘资格事实(A2——零直接接口,经 B1 转化)· buff 时限/叠层/衰减(B3)· 棋盘侧功能道具(A5,垂直切片)· 关卡大奖励/代币/天赋(C2/C4)· 伤害与治疗施加、守卫判定(B1 编排)· 呈现(D1/B5/D4) | -| 上游输入 | D2 表值(RewardTable/RewardConfigTable;StatusEffectTable/HeroTable 仅经 ConfigDB 读值)· B1 资格格清单(roll_board 入参)· A2 资格事实经 B1 转化 | -| 下游输出 | 预分配身份映射(B1 grant/grant_clear 兑付数据面)· 库存投影(B1 窗口数据契约)· F6 当量供给(B1 条款①②③⑤对账输入)· 明细行数据字段(B1 流水,B5/D1 呈现消费) | -| 硬约束 | 零随机出 roll_board 一线 · Ready 后映射只读(无重掷 API)· 零主动事件订阅 · 零 UI 依赖 · 零跨系统读 · 机制与内容分离(内容行 MVP 收窄,名录扩展归垂直切片/Alpha) | - -- 缺位后果:P2"规划的延迟兑现"无兑现物(规划退化为空转);B2 已声明当前内容态敌人不可被击杀——胜利路径判定素材悬空;A4 三条定价硬约束(雾内档位下界 / 清图锚上浮 / 净当量带上界)无承载对象,安全格价值体系无从校准。 -- 玩家的每一轮都在预读它:已开格与库存的奖励身份恒定可读,叠加"每个安全格必有货"(F1 结构保证)与"雾格档位更高"(F2)两条全板先验——构成"往雾区推进、囤刀待机、叠层满载后收手"的路线与节奏决策素材。面向特定道具的寻路("绕开两颗雷去拿那把刀")须以未开格身份可读为前提,MVP 未兑现——结构前提已备(身份 install 期已定、预读查询面就绪、A5 探测零成本桥接),呈现深度 = OQ2(垂直切片);创意风险 #1 维持 OPEN(结构前提落地 ≠ 风险闭合)。 - -## 体验锚点 - -| 支柱 | 关键词 | 机制承诺 | -|---|---|---| -| P4 地牢住户的遗物 | "我在地牢里淘东西,不是在领系统发放的补偿" | 每个安全格必有货(F1 结构保证);雾区/高危区档位下界更高(F2)——"越险货越好"是风险收益同源在拾取侧的直觉;开格瞬间"这格有货"是本系统的高频情绪节拍 | -| P2 拾取的糖、结算的实 | "先是一份捡到的战利品,其次才是一行结算数据" | 拾取不当场生效——入库后轮次结束在结算明细逐行兑付("治疗包 ×1 入库(第 2 轮 · 安全格)");拾取瞬间的糖与延迟兑现的实各管一半,后者是 P2 归因的奖励侧落点 | -| P1 身份可读 | "这格是增伤——看得见才留得住" | 已开格 + 库存奖励身份恒定可读(install 期预分配、不重掷、不明雾化);"囤刀待机、看准重击拍再用"的库存规划 = 拾取感的长线 MVP 形态 | -| P3 越险货越好 | "危险的地方货更好" | 雾格池 tier ≥ T_fog_min 过滤(A4 三条定价硬约束的体验面)——深度轴 MVP 零载体,深度/图类型差异化 = clear_/池变体结构位(垂直切片登记) | - -| 反向护栏 | 处置 | -|---|---| -| 奖励的随机只发生在桌下(roll 决定这格是什么),身份永远在桌上(开格后恒定可读) | 任何"开格后仍不可读""结算时才揭示身份"的呈现设计默认砍掉——违反 P2 归因 + 掐死拾取感本身 | -| 拾取的糖不得改成即时生效 | 绕过 B1 结算统一兑付即违反 P2 归因(game-concept 定稿口径) | - -- 参考感受:Microsoft Minesweeper Adventure 的开格拾取(身份即在场的战利品,不是无名金币)+ 杀戮尖塔奖励节点(有名字、有用途、进构筑的战利品);反向对照 = 无身份的纯数值掉落("你获得了 +5"式系统补偿)与开包式随机惊喜(拿到了也不知道是啥)——本作要避开的两种感受。 - -## 全局流程 - -### 奖励授予(install 期预分配 → 结算编排兑付) - -``` -board install(B1 编排) - │ ① roll_board(资格格清单 = S ∖ R₀) [B4] 恰一次;消费 reward_roll 封闭流恰一 scope 批 - │ ├ 行主序逐格取号 → 格奖励身份(雾格过 F2 档位过滤) - │ ├ 批尾一号 → 清图身份(F3) - │ └ F5 保底校验不过 → 草稿整批弃用、同 scope 续流重 roll(≤ N_draft 次,超出致命) - │ ② 板级双映射(格→reward_id;清图→reward_id)→ Ready(只读) - ▼ -挖掘期(身份恒定可读;A2 资格事实经 B1 转化——B4 零直接接口) - │ - ▼ -轮次结束 → 结算编排(B1 段序骨架) - │ ③ 授予段:逐格 grant(cell) → 预分配身份快照,按 category 分流 - │ ├ buff 类 → B1 调 B3 apply_effect(满层拒绝 → "奖励未生效"行,零折算) - │ ├ instant_aoe → 当场兑付:全体存活敌各 power 点(不进库存不出窗口) - │ ├ instant_heal → 当场兑付:主角 +power(clamp;满血 → "奖励未生效"行零兑付) - │ └ damage_item / heal_pack → stock() 入关卡域库存 - │ ④ cleared 轮:grant_clear() → 预分配清图身份兑付(分流同上;恒非空) - ▼ -⑤ 道具使用窗口(授予段后、增益/减益段前——玩家至多选用一件或跳过) - ▼ -⑥ 道具段 → ⑦ 战斗段 → ⑧ 衰减段 → ⑨ 判定段 - ▼ -battle_over:retire_mapping(板级映射消亡,不跨图;库存不清——跨战斗延续) -``` - -### 库存生命周期(关卡域) - -``` -stock(item)(B1 编排,道具类 grant 后调用) - │ 逐件实例入库存:{item_id, source{cell, round}, 行值快照} → InStock - ▼ -跨轮次 · 跨扫雷图 · 跨战斗延续(数量无上限;稀缺性由 roll 权重承载) - │ - ▼ -道具使用窗口(每轮结算,授予段后)── 玩家至多选一件:use(handle) - │ InStock → Used(不可逆;零游戏态前置守卫) - ▼ -关卡结束(victory/defeat 皆然;"关卡结束"事件归 C1/C2 定义,上层显式编排) - │ clear_inventory() 恰一次(B1 调用;清空前快照计数 → "随关卡结束清空"反馈行) - ▼ -Cleared(库存失效;此后 grant/stock/use → false + 诊断) -``` - -### 出口分发(结算编排各出口的 B4 接口触点) - -| 时点 | 触发 | B4 接口 | 约束 | -|---|---|---|---| -| board install 后、挖掘前 | B1 编排恰一次 | `roll_board(资格格清单)` | 消费 reward_roll 恰一 scope 批(格批 + 清图批尾);Ready 后再调 → false + 诊断;空清单 → debug 断言中止 | -| 结算授予段 | 每格受理事实 | `grant(cell)` | 返回预分配快照;同格重复受理幂等(同快照 + 诊断);清单外 → false + 诊断 | -| cleared 轮授予段 | cleared 结算 | `grant_clear()` | 恒非空兑付;同批重复调用幂等(同身份 + 诊断) | -| 授予段(道具类) | grant 返回道具类后 | `stock(item)` | 仅受理 damage_item/heal_pack;来源真值归 B1、B4 不校验 | -| 道具使用窗口 | 玩家选用 | `use(handle)` | InStock→Used 不可逆;零游戏态前置守卫;Used 句柄 → false + 诊断 | -| battle_over | 战斗结束 | `retire_mapping()` | 板级映射消亡(下一场战斗新板新批);库存不清 | -| 关卡结束 | 上层显式编排 | `clear_inventory()` | 恰一次;重复 → false + 诊断(幂等守卫) | - -## 核心规则 - -> 每条规则两段:**人话**(作用于哪个系统、什么情况下、谁触发、触发后发生什么;效果与情况用枚举表)→ **举证**(计算方法/公式;纯流程规则明写"无计算")。 - -#### 规则 1:奖励只有五种,三种当场生效、两种进背包 - -**人话**:奖励系统发出去的一切东西只从五种类型里出,数据表里出现别的类型直接拒绝加载。三种"即时类"在发奖那一刻当场兑现——不进背包、不用玩家选;两种"可选类"先放进关卡背包,由玩家在结算窗口里自己挑时机用,数量少但更强。想加第六种类型属于改规则,走本文档修订流程,不是调参数。 - -| 类型 | 玩家拿到什么 | 怎么交付 | -|---|---|---| -| buff | 一层临时增益(增伤/减伤) | 当场挂进状态系统,当次结算内生效 | -| instant_aoe | 群体攻击 | 当场对全体存活敌人各打 power 点 | -| instant_heal | 小额即时回血 | 当场给主角回血(不超血量上限) | -| damage_item | 伤害道具(刀) | 进背包,窗口选用、道具段按固定顺位打敌 | -| heal_pack | 强效治疗包 | 进背包,窗口选用回血 | - -**举证**:每条奖励 = RewardTable 一行(九字段见「枚举」节);buff 类必填 B3 effect_id 精确引用——首个引用行回填时激活 B3 悬空校验 + 条件性夹具(dangling_ref_policy 兑现);加载校验即时类 power ≥ 1 同道具类;预留值(resource / aux_item 等)校验拒绝(fail-fast),启用走修订;默认根权重即时类 75% / 可选类 25%(注入批后由注入机制承载——见「枚举」节注记)。 - -#### 规则 2:每张图装好那一刻,每格的奖励就全部定死 - -**人话**:战斗系统把一张新扫雷图装好后、玩家挖第一下之前,结算编排(B1)调用奖励系统办一次"摇号":按固定顺序给这张图上所有够格出奖励的格子(开局已翻开的安全格除外)逐一摇出各自的奖励,同一次还摇出清图奖励,结果写进这张图的映射表。此后这张图活多久,这些身份就定多久——同图跨轮不变;换图或战斗结束,映射随之消亡。随机只发生在这一次摇号里:之后发奖、用道具都不再掷任何骰子,道具威力就是表里写死的数值。 - -**举证**:零随机出 roll_board 一线——唯一随机入口 = roll_board 内消费 reward_roll 封闭流恰一 scope 批;registry `rng_service.scope_event_binding` 语义 = 每次 board install(格奖励批 + 清图奖励批),registry/D2 已同步;选行算子、雾格档位过滤、清图批尾、保底重摇见 F1/F2/F3/F5;执行细节见「规则 2 的实现参照——install 期预分配」。 - -#### 规则 3:发奖时按类型走三条路,各有各的去处 - -**人话**:轮次结束结算时,结算编排(B1)对每个捡到奖励的格子来领一次奖,奖励系统交出早已定好的身份,再按类型分路:增益类由 B1 拿去找状态系统挂上;两种即时类当场兑现——群伤当场结算、回血当场加上,不进背包、不弹选择窗口;道具类放进关卡背包。增益挂满层挂不进去时,这份奖励不予兑付、不给任何折算补偿,只在结算明细里明写一行"奖励未生效"——不静默蒸发。 - -**举证**:分流全表见「规则 1/3 的实现参照——两级奖励分流」;即时类与道具类的效果算式见 F4;受理恰一次归 B1(对齐 B2 义务②/B3 EC6 先例),同格重复 grant = 幂等受理(同一快照 + debug 诊断,E18);满层拒绝协议同 B3 义务⑧;B4 与 B3/A2 零直接接口。 - -#### 规则 4:背包活整个关卡,战斗结束不清空 - -**人话**:道具背包属于整个关卡,不属于某一场战斗:换了地图、打完一场战斗,包里的东西都还在,直到整个关卡打完(无论输赢)才由结算编排一次性清空。每一件都记着从哪个格子的哪一轮捡到,结算能追溯来源。数量没有上限——稀缺感靠掉落权重控制,不靠背包容量。设计意图:可选类道具是"关内资产",囤着一把刀等整个关卡里最好的时机,而不是"这场不花就没了"。 - -**举证**:无计算。库存生命周期流程见「全局流程·库存生命周期」;关卡末清空恰一次 + 幂等守卫见 E7;战斗结束只退役板级映射、不清库存见 E2/E6 与 B1 义务⑤。 - -#### 规则 5:每轮结算,战斗开始前玩家能用一件背包道具 - -**人话**:每轮挖完,结算按固定顺序走:先发放这轮捡到的全部奖励,然后弹出道具使用窗口——玩家至多选一件背包道具用掉,或者跳过;之后才轮到增益减益、道具生效、战斗、衰减、判胜负。窗口一次只能用一件(想一次用多件属于改规则,不是调参数)。顺序本身藏着战术:道具段排在战斗段之前,这轮刚捡的刀(伤害道具的项目行话,全文同义)可以先削血、把敌人打进"死亡即不动手"——"重击拍前用刀"由此成立。 - -| 结算顺序 | 这一步发生什么 | -|---|---| -| ① 授予段 | 逐一发放本轮奖励:清图奖励兑付、即时类当场兑现、道具类入背包 | -| ② 道具使用窗口 | 玩家至多选一件背包道具,或跳过 | -| ③ 增益/减益段 | buff/debuff 结算(核心序:增益减益 > 道具 > 战斗) | -| ④ 道具段 | 窗口选用的那一件生效:伤害道具按固定顺位打敌、治疗包给主角回血;一次性消耗、用过不可逆 | -| ⑤ 战斗段 | 敌我交战 | -| ⑥ 衰减段 | 增益衰减 | -| ⑦ 判定段 | 判定胜负 | - -**举证**:段序骨架与窗口调用序归 B1(B1 义务①——窗口选择序列登记为结算回放输入事件);窗口呈现归 D1;载荷与守卫细则见「规则 5/7 的实现参照——道具使用窗口」;伤害道具固定顺位 = B2 Rule 7 默认目标。无计算。 - -#### 规则 6:清完一张图,必有一份清图奖励 - -**人话**:玩家把一张图的雷全部清完时,结算会给一份清图奖励。这份奖励的身份早在图装上桌时就与格子奖励同批摇好,此时按类型走同样的三条路兑付。它永远不会落空——数据加载时就强制保证清图奖池里至少有一行有实际价值的内容,"清图奖励 > 0"是定价约束钉死的。按地形/图类型换不同奖励池是预留插槽,MVP 只有一个默认槽;同一张图类型不变,清图奖励不重摇。 - -**举证**:roll 算式与恒非空的加载校验见 F3;兑付分流同规则 3(见「规则 1/3 的实现参照——两级奖励分流」);clear_ 行命名空间预留、校验拒绝(A1 elite_/boss_ 同款);A3 条款④ = 定价对账锚(清图奖励 > 0);图类型战斗域恒定、不逐图重掷(install 批次承载)。 - -#### 规则 7:治疗分两档——小额当场回,大包留着挑时机 - -**人话**:治疗有两种形态。即时回血随开格当场给主角加血:量小、常见、不用玩家做任何选择;血满时这份奖励等于白捡,结算明细里明写"奖励未生效"。治疗包则进背包、在窗口里挑时机用:稀有且一次回得多——治疗整体供给变少、决策价值变高,"治疗是稀缺奖励"。血满时用治疗包会被拒绝且不消耗(守卫由结算编排读主角血量判定,奖励系统自己不读别家数据);满血禁选的预判由 B1 组装进窗口数据,供界面禁用/提示。 - -| 治疗形态 | 怎么给 | 特点 | -|---|---|---| -| 即时回血 instant_heal | 开格当场给主角回 power 点(不超上限) | 小额常见、零决策、不进背包;满血 → "奖励未生效"行零兑付 | -| 治疗包 heal_pack | 进背包,窗口选用时回复 | 稀缺且更强;满血使用 → 拒绝、不烧包 | - -**举证**:回血算式 hp' = min(hp + power, max_hp)(clamp)见 F4;heal_pack 默认根权重 6%、power 12(provisional 归 C3);usable_now 可用性预判由 B1 编排组装进窗口数据(义务④)供 D1 禁选/提示;守卫归 B1 编排读 B2 hero hp 判定——B4 零跨系统读。 - -#### 规则 8:开过的格子和背包里的奖励身份永远可查、不变卦 - -**人话**:玩家任何时候都能查到两样东西:已经挖开的格子出的是什么、背包里每件道具是什么。这不是查询时现算的——身份在图装上桌时就已定死,同一张图里永远读到同一个答案。没挖开的格子当前版本不显示里面是什么(虽然结构上已定、也查得到,留给探测类道具桥接与后续呈现决策)。映射就绪后就是只读的:不存在任何"重摇"接口,谁加一个重摇入口谁就是在改接口。 - -**举证**:预读查询面 = query_identity(引用级投影,Ready 后只读);未开格身份 MVP 不呈现、呈现深度 = OQ2(A5 探测道具零成本桥接,OQ 登记);任何重掷入口 = 接口漂移(走 GDD 修订非调参)。 - -#### 规则 9:奖励的内容和参数全部写在两张数据表里 - -**人话**:每条奖励是什么、值多少、多强,全部来自一张奖励内容表——改奖励就是改表行,不用动代码;表有九个字段。另有一张单行全局参数表,装本系统的四个调节旋钮:雾区档位下界、保底刀数、重摇上限、供给闸刀力下界。两张表都由 D2 建表、本 GDD 负责把内容回填进去;奖励内容表是"定义表"而非"进度成长表",主键是 reward_id。 - -**举证**:九字段 schema 见「枚举·RewardTable schema」;表身份声明 = 定义表(非进度成长表),Rule 4 豁免、键 = reward_id(B2/B3 同款声明纪律);回填走 D2 接口漂移规则回写;RewardConfigTable = 单行全局(HeroTable 单行全局先例),承载 T_fog_min / K_dmg / N_draft / P_min 四配置值。 - -#### 规则 10:奖励系统自己不主动做任何事 - -**人话**:奖励系统不订阅任何事件、不画任何界面、除了开局那次摇号不用任何随机数。它像一个仓库加账本:把"每个格子是什么奖励、背包里有什么"的查询口,和"发奖、入库、消耗"的操作口摆在那里;什么时候调、按什么顺序调,全部由结算编排(B1)说了算。棋盘那边发生了什么,奖励系统从不直接看——事实都经 B1 转化后递过来。 - -**举证**:无计算。机器验收 = 静态扫描零随机调用/零 UI 基类/零事件订阅/零跨系统 API 引用(AC-21);调用权集中归 B1 结算编排(B3"授予集中在编排"同款);A2 事件面事实经 B1 转化;reward_roll 流封闭——零随机出 roll_board 一线(rng_service reward_roll 流)。 - -- 实现口径注:奖励容器/道具库存的类结构与事件载体不在本 GDD——实现期 ADR 域。 - -### 规则 2 的实现参照——install 期预分配 - -| 阶段 | 行为 | 守卫 | -|---|---|---| -| 输入 | B1 供资格格清单(S ∖ R₀——initial/mine 通道恒不 eligible,install 期可精确枚举) | 空清单 → debug 断言中止(E1 兜底);清单含重复格 → 去重 + debug 诊断 | -| roll | 行主序逐格取 reward_roll 一号 → 身份;雾格过 F2 档位过滤;批尾一号 → 清图身份(F3) | 流 scope = 每次 board install 恰一批;消费序与恰一次归 B1 | -| 保底 | F5 断言 \|{damage_item 格}\| ≥ K_dmg | 不过 → 草稿整批弃用、同 scope 续流重 roll(草稿弃用连清图一号一并弃用);超 N_draft → 致命 | -| 提交 | 双映射(格→reward_id、清图→reward_id)→ Ready | Ready 后只读(无重掷 API);Ready 相位再调 → false + 诊断(E5) | - -### 规则 1/3 的实现参照——两级奖励分流 - -| category | 交付类 | 兑付方式 | 拒绝语义 | -|---|---|---|---| -| buff | 即时 | B1 调 B3 `apply_effect`(入状态容器,结算段生效;时长 = 当次结算) | 满层 → "奖励未生效"行(可聚合计数),无折算 | -| instant_aoe | 即时 | 授予段当场:全体存活敌各 power 点(逐个 apply_damage、受击即死;恒定表值) | 零存活敌 → "奖励未生效"行零兑付 | -| instant_heal | 即时 | 授予段当场:主角 +power(clamp) | 满血 → "奖励未生效"行零兑付(不进库存无消耗语义) | -| damage_item | 可选 | `stock()` 入关卡域库存 → 窗口选用时兑付(道具段固定顺位打敌) | — | -| heal_pack | 可选 | `stock()` 入关卡域库存 → 窗口选用时兑付 | 满 HP → B1 守卫拒绝(不烧包;usable_now 禁选/提示) | - -### 规则 5/7 的实现参照——道具使用窗口 - -| 面 | 语义 | -|---|---| -| 时机 | 授予段之后、增益/减益段之前——当轮拾取的道具当轮即可用(末图清图奖励同结算窗口可选用) | -| 载荷 | B1 编排组装:`query_inventory` 逐件实例(item_id + 来源 {cell, round} + 行值快照投影 + 状态;枚举序 = stock 受理序)+ B1 侧守卫预判 usable_now(满血治疗包禁选/提示——B4 零跨系统读不变) | -| 选择 | 至多选用一件或跳过;选择序列 = 结算回放输入事件(B3 可回放契约的窗口侧兑现);窗口期选择收集与棋盘输入不竞争(A2 单意图帧先例) | -| 消耗 | 一次性 Used 不可逆;零效果判定(施加时无存活敌)归 B1 读 B2 存活集 → "已消耗未生效"行;B4 `use` 零游戏态前置守卫(存活集/血量对 B4 不可见) | -| 空库存 | 零使用恒合法(跳过恒合法);呈现归 D1(可整体不弹窗——P4 节奏;窗口触发政策:MVP 有库存恒弹,候选"仅可用品触发/常驻库存条非模态"归垂直切片) | - -## 枚举 - -### 奖励 category(封闭枚举,五值) - -| 值 | 交付类 | 字段消费 | 产出点 | 语义 | -|---|---|---|---|---| -| buff | 即时 | effect_id(必填);power 不消费——非校验项 | 授予段 | B3 状态容器行授予(B4 只定"给哪行",层数语义归 B3);时长 = 当次结算(attack_up/defense_up D=1) | -| damage_item | 可选 | power ≥ 1 | 授予段入库 → 道具段 | 可囤可择时的规划面伤害("刀")——基础攻击之外的增量;固定顺位打敌 | -| heal_pack | 可选 | power ≥ 1 | 授予段入库 → 道具段 | 稀缺强治疗(可选治疗唯一形态);满 HP 拒绝 | -| instant_aoe | 即时 | power ≥ 1 | 授予段当场 | 群体攻击:全体存活敌各 power 点 | -| instant_heal | 即时 | power ≥ 1 | 授予段当场 | 主角小额即时回血(clamp) | - -- 预留值:`resource` / `aux_item`(A5 桥接)等 → 校验拒绝;启用走本 GDD 修订(fail-fast,B2 pattern 预留先例)。 - -### RewardTable schema(D2 新表,B4 回填 owner) - -| 字段 | 类型/范围 | 说明 | -|---|---|---| -| reward_id | String(表内主键) | 实体键精确匹配(D2 Rule 4) | -| category | enum {buff, damage_item, heal_pack, instant_aoe, instant_heal} | MVP 校验域(上表五值);预留值拒绝(Rule 1) | -| effect_id | String(可空) | buff 类必填——B3 StatusEffectTable 精确引用;非 buff 类恒空 | -| display_name | String(非空) | 玩家可读名(D1 义务①/窗口呈现数据源;本地化归 D6——B2 EnemyTable/B3 StatusEffectTable 同库惯例) | -| power | int [0, 999] | 伤害道具伤害值 / 治疗包回复值 / 即时类数值(knob);buff 类不消费——非校验项(B2 heavy_multiplier 先例) | -| weight | int [0, 999] | 所在池内 roll 权重(knob);0 = 该池不出此行(合法极端) | -| pool_tag | enum {safe_cell, clear_default}(+ clear_ 预留) | roll 池分组——格奖励池 / 清图默认槽;雾区档位过滤谓词见 F2 | -| tier | int [1, 8] | 强度档位(A4 雾内档位下界约束的载体;knob) | -| use_timing | enum {pre_settlement} | 使用时机(MVP 唯一值;game-concept 预留字段的兑现——扩枚举走修订) | - -### 默认根内容行(值 provisional 归 C3;溯源 = 原型 v3 锚 HERO_MAX_HP=50 + 概念原型 HERO_BASE_ATK=6) - -| reward_id | category | power | weight | tier | pool_tag | 说明 | -|---|---|---|---|---|---|---| -| defense_up_basic | buff | —(不消费) | 16 | 2 | safe_cell | 当次受伤减免(B3 defense_up D=1)——减伤墙批 24→16(attack_up 升池内最高行) | -| attack_up_basic | buff | —(不消费) | 20 | 2 | safe_cell | 当次主角攻击增伤(B3 attack_up D=1——复活后首批入池) | -| spark_aoe | instant_aoe | 4 | 16 | 1 | safe_cell | 群体攻击:全体存活敌各 4 点 | -| heal_minor | instant_heal | 4 | 15 | 1 | safe_cell | 即时小额回血(满血零兑付行) | -| knife_t1 | damage_item | 8 | 60 | 1 | active_inject | 可囤可择时的基础刀(供给控制器注入池) | -| knife_adv | damage_item | 16 | 30 | 2 | active_inject | 雾档升级刀(注入池) | -| heal_pack | heal_pack | 12 | 10 | 2 | active_inject | 稀缺强治疗(注入池——可选治疗唯一形态) | -| clear_blast | instant_aoe | 40 | 1 | 2 | clear_default | 清障炸药:清图槽当场兑付全体存活敌,不入库不占可选类供给(完美板 ×2 = 80——原 clear_knife 入库刀由本行换位替代) | - -- 归一占比(结构变更随 C3 修订批转正):格子池四行即时类合计 67;可选类三行移出格子权重池 → **active_inject 注入池**(供给控制器 install 期注入:战斗首件保证 + 指数递减 0.4→0.2→0.1→…,E[战斗获取] ≈ 1 标定目标)——原"格子权重 75/25 两类占比"由注入机制替代承载;治疗 = heal_minor(格子池)+ heal_pack(注入 10%)。 -- tier_min_buff = 2;T_fog_min = 2 → 雾池 = {defense_up_basic, attack_up_basic, knife_adv, heal_pack}(四行,非单一化 ✓)。 -- AC-19 对账对 = (knife_adv, attack_up_basic)(雾池最低活档行 ≠ tier_min_buff 行——非平凡判别保持)。 - -## 数值结论与推导 - -> 章节纪律:结论先行——先一行加粗结论,下接「推导」给公式代码块、Variables 表与验算/边界表。除 F1/F3/F5 消费 reward_roll 封闭流外全部公式零随机;数值默认全部 provisional 归 C3。术语:资格格 = 开出时 reward_eligible=true 的格(A2 事件面:chain/dig 通道的安全格)。 - -### F1 身份 roll(weighted_pick,install 期执行) - -**结论**:每资格格恰一身份、清图槽恰一身份——weighted_pick 累积区间选行、0 权行取号前剔除、单行池退化合法;Ready 后映射只读。 - -#### 推导 - -``` -资格格集 = S ∖ R₀(安全格减初始展开域——initial/mine 通道恒不 eligible,install 期可精确枚举) -行主序逐格取 reward_roll 一号 r ∈ [0, W):身份 = 累积权重区间 [Σw_{0} ∩(雾格 ? {tier ≥ T_fog_min} : 全体);weight=0 行取号前剔除 -批尾取一号 roll 清图身份(F3;批尾 = 同一批取号中最后消费的一个号——registry terminology 已登记) -→ 双映射提交 Ready -``` - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 取号 | r | int | [0, W) | reward_roll 流单号(F1/F3/F5 消费) | -| 权重 | w | int | [0, 999] | RewardTable.weight;0 = 不入池(取号前剔除) | -| 雾档门限 | T_fog_min | int | [1, 8] | F2;RewardConfigTable 配置值 | -| 资格格集 | S ∖ R₀ | 格集合 | 板级 | B1 供清单(义务⑥) | - -**验算与边界:** - -| 项 | 内容 | -|---|---| -| Example | 三行 w=2/1/1,W=4,r=3 → 第三行(区间 [3,4)) | -| 池空裁定 | 过滤后零行 = 结构性不可达——D2 加载期校验致命(每 pool_tag × 雾/非雾两态各 ≥1 行 weight>0);身份 install 期预分配、授予期零随机零回退,运行时身份缺口无合法语义;单行池退化为恒等选取(合法极端) | -| Output Range | 每资格格恰一身份、清图槽恰一身份;Ready 后映射只读 | -| 边界 | 流 scope = 每次 board install 恰一批(registry 绑定改写义务已兑现,Rule 2);消费序与恰一次归 B1;Ready 后只读(无重掷 API——F5 草稿重 roll 发生在提交前,不变式零触碰) | - -### F2 雾区档位过滤(fog_tier_gate) - -**结论**:雾格池 = {tier ≥ T_fog_min}、非雾格池 = 全 tier(谓词恒真、零分支);T_fog_min = RewardConfigTable 表值(默认 2 provisional);T_fog_min=1 → 雾池=全池(过滤退化合法,A4 约束①仅剩锚侧兜底);=8 → 仅最高档(非空由 F1 校验保证)。 - -#### 推导 - -``` -雾格池 = {tier ≥ T_fog_min};非雾格池 = 全 tier(谓词恒真、零分支) -``` - -**验算与边界:** - -| 项 | 内容 | -|---|---| -| 验收锚性质 | 推导式(= 最低档 buff 当量所在档)依赖 B1 对照表(A3 条款①,未设计)、加载期循环依赖不可行——T_fog_min 取表值;A4 硬约束①(雾内档位下界 ≥ 最低档安全格 buff 当量)登记为验收锚非运行时校验——对照表落定/调参时核对"雾池最低档行当量 ≥ 最低档安全格 buff 当量" | -| AC-19 序数检查的已知失效面 | tier 与当量零耦合(跨类别 tier 序不保证当量序——雾池 tier2 治疗包的当量可能高于 tier3 buff 行),故 AC-19 只作档位序检查非当量保证,升格运行时致命会锁死内容;单行雾池下检查恒平凡真(判别力零)——默认根已布置四行雾池规避 | -| Example | T_fog_min=3 时雾格恒不出 tier≤2 行 | -| 边界 | 链开雾格同雾格待遇(A2 EC4);参数归 C3 | - -### F3 清图奖励 roll(clear_reward_roll) - -**结论**:槽谓词 = clear_(板 biome 匹配 ∧ 池非空)否则 clear_default(MVP:clear_ 行校验拒绝 → 恒退化 clear_default,结构位保留);恒非空的可判定形式 = 恒有正当量行(power=0 道具行被拒——A3 条款④"清图奖励>0"的表侧兑现);空池致命(同 F1 裁定)。 - -#### 推导 - -``` -槽谓词 = clear_(板 biome 匹配 ∧ 池非空)否则 clear_default -MVP:clear_ 行校验拒绝 → 恒退化 clear_default(结构位保留) -恒非空 = 加载期校验:clear_default 池 ≥1 行 weight>0 ∧(buff 行 effect_id 非空 ∨ 道具行 power ≥ 1) -roll = install 批尾一号,选行算子同 F1 -``` - -**验算与边界:** - -| 项 | 内容 | -|---|---| -| Example | 命中 heal_pack(power=3) → cleared 轮 grant_clear 入库存 | -| 边界 | roll 在 install 批、兑付在 cleared 结算编排期(零随机出 roll_board 一线);图类型战斗域恒定、不逐图重掷 | - -### F4 道具段与即时类效果式(item_and_instant_effects) - -**结论**:道具伤害恒定表值不吃任何 percent 修正;治疗 clamp hp' = min(hp + power, max_hp);满血拒绝/零兑付拦在消耗前;attack_up 复活——唯一消费面 = 主角战斗段先手攻击(只乘基础攻击、不乘刀)。 - -#### 推导 - -``` -伤害道具(可选类,道具段):D = power(恒定表值——不吃任何 percent 修正) - 目标 = 固定顺位最前存活敌(B2 Rule 7),一次性消耗 -治疗包(可选类,道具段):可用 ⟺ hp < max_hp(满 → 拒绝、不消耗);hp' = min(hp + power, max_hp) -即时群伤 instant_aoe(即时类,授予段当场):对全体存活敌各 D = power(逐个 apply_damage、受击即死); - 零存活敌 → 零兑付"奖励未生效"行(结构性难达——授予段先于道具/战斗段,敌集空仅剩防御分支) -即时回血 instant_heal(即时类,授予段当场):可用 ⟺ hp < max_hp(满 → 零兑付"奖励未生效"行,不进库存无消耗语义); - hp' = min(hp + power, max_hp) -buff 类(即时类,授予段当场):B3 apply_effect;时长 = 当次结算(attack_up/defense_up D=1—— - buff 兑付窗口 = 授予段至本结算衰减段) -``` - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 道具威力 | power | int | [1, 999] | RewardTable.power(category ∈ {damage_item, heal_pack} ⇒ power ≥ 1 加载校验);恒定表值非 roll 值 | -| 主角血量 | hp / max_hp | int | [0, 999] | B2 查询(B1 编排读值做守卫——B4 零跨系统读) | - -**验算与边界:** - -| 项 | 内容 | -|---|---| -| attack_up 口径 | HeroTable.atk 基础攻击恒存在(域 [1,999]、0 加载拒绝——B2 Rule 9)→ attack_up(+50%)复活:唯一消费面 = 主角战斗段先手攻击(伤害算式归 B1 战斗段);"道具不吃修正"拍板不变——attack_up 只乘基础攻击、不乘刀;是否入默认根池随奖励改造批裁决(C3 内容所有权,复活批不擅自入池——OQ1);A3 条款 2 锚参照对象 = attack_up 当量(B3 Interactions 原文即 attack_up;换算归 B1 条款①对照表——B4 只供行值清单;B3 锚预警裁决前置不变) | -| 弱化面排除 | weaken/defense_up 不入本式(敌输出侧/主角承伤侧,B2/B1 域);读值时点 = 道具段、施加归 B1(B4 零跨系统读) | -| Output Range | D = power(恒定);hp' ∈ [hp, max_hp](clamp 式上界——满血分支被拒绝守卫拦在消耗前) | -| Example | power=6 伤害道具 → 顺位最前敌 −6;重击拍前用刀击杀 → 该敌重击永不兑现(B2 死亡即不动手的道具形态);满血(hp=max_hp)用治疗包 → 拒绝、库存不减 | -| 边界 | 取整无涉(全整数);使用守卫(满血)归 B1 编排(义务④);hp=0 在窗口时点结构不可达(败判定在判定段、先于本窗口不存在;上一次结算的判定段保证到本窗口时 hero 存活)——不定义复活语义 | - -### F5 伤害道具保底(damage_item_floor) - -**结论**:每板可选伤害保底 \|{c ∈ 资格格 | 身份(c).category = damage_item}\| ≥ K_dmg——执行 = roll_board 内"草稿-校验-提交",不过则同 scope 续流重 roll、超 N_draft 致命;K_dmg=0 = 断言关闭(**现行默认**——刀保底语义由供给控制器战斗首件保证取代,no_damage_row 后闸托底零活刀行世界);基础攻击在场后本保底为内容健康护栏非胜利路径闸。 - -#### 推导 - -``` -断言 |{c ∈ 资格格 | 身份(c).category = damage_item}| ≥ K_dmg - (RewardConfigTable [0,999],默认 1 provisional) -执行 = roll_board 内"草稿-校验-提交":不过 → 草稿整批弃用、同 scope 续消费流重 roll(全序确定、可回放) -超 N_draft 次(RewardConfigTable,默认 32 provisional)→ 致命(权重配置错误,fail-fast) -``` - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 保底下界 | K_dmg | int | [0, 999] | RewardConfigTable 配置;**默认 0**(保底断言关闭——语义由供给控制器战斗首件保证取代,原默认 1 与禁区条款随 C3 修订批解除);仅计 damage_item(保底对象 = 可选类伤害——玩家可控时点的伤害资源;即时类 instant_aoe 不计,其自动兑付无规划面——保底的意义在"每板至少有一把可囤可择时的刀") | -| 重 roll 上限 | N_draft | int | [0, 999] | RewardConfigTable 配置;默认 32 | -| 供给闸刀力下界 | P_min | int | [1, 999] | RewardConfigTable 配置;默认 8 = 默认根最低刀 power | - -**加载期护栏(两条新致命——关闭"保底全绿、游戏不可胜"的威力空洞与零伤害世界后门):** - -| 护栏 | 断言 | manifest 行(根) | -|---|---|---| -| (i) 供给闸 | K_dmg ≥ 1 ⇒ safe_cell 池存在 power ≥ P_min 的活 damage_item 行 | `floor_supply_missing`(根 `b4_floor_supply`) | -| (ii) 零伤害后闸 | K_dmg = 0(断言关闭)⇒ safe_cell ∪ clear_default 仍须含 ≥1 活 damage_item 行(无条件后闸——内容健康护栏、非胜利路径闸:基础攻击保证战斗可胜,本闸防"零伤害道具世界"经纯内容调参静默复活导致战斗拖长、奖励系统空转;与 B2 OQ9 并案登记同一 owner) | `no_damage_row`(根 `b4_nodamage`) | - -**验算与边界:** - -| 项 | 内容 | -|---|---| -| Example | 12 格板首稿 0 件刀 → 弃稿重 roll,次稿 1 件 → 提交 Ready | -| Output Range | K_dmg=0 = 断言关闭(**现行默认**——胜利路径无刀保底,由供给控制器首件保证与基础攻击承载;no_damage_row 后闸托底);\|资格格\| < K_dmg 恒不过 → 重 roll 耗尽致命,暴露配置错误 | -| 概率性致命带注记 | 合法权重下 N_draft 耗尽概率随 K/池构成可达非平凡值(同配置不同种子一个能玩一个崩——种子轮盘);调参期批量仿真(刀供给分布 × A1 板分布的可行率)登记为 C3 调参流程义务(缺口预检),把配置错误暴露在调参台而非玩家局内 | -| 与 Ready 只读不冲突 | 重 roll 全部发生在提交前(Unrolled 态);确定性 = 同 scope 消费轨迹的确定函数 | -| 否决案存档 | 清图槽保底(弃图流覆盖不到——RAP 刷图非必经清图;economy-designer 复核:清图免费换板且多清图槽,吞吐严格支配 RAP 刷新,无刷刀农场漏洞);safe_cell 伤害权重下界(概率缓解非结构保证,留作 C3 伴生调参) | -| 边界 | 断言仅计格奖励身份(清图槽不计);归 B4 自身,B1 仅编排恰一次调用 | - -### F6 当量换算供给(equivalence_supply,A3 条款①② 的 B4 侧输入) - -**结论**:供给 = RewardTable 全活行投影 + tier_min_buff(行集空 = F1 校验对偶致命);量纲建议 = 主角 HP 点;伤害道具当量 = power(恒定表值直接可算);单一线性换算与条款 1/2/3/5 的闭合归 B1 单一 owner,本式只供原材料与量纲建议。 - -#### 推导 - -``` -供给 = RewardTable 全活行投影 - (safe_cell ∪ clear_default 逐行 category/display_name/power/tier/effect_id/weight) -tier_min_buff = min{tier | safe_cell ∧ category=buff ∧ weight>0}(行集空 = F1 校验对偶致命) -量纲建议 = 主角 HP 点(与 m_amb 同量纲);伤害道具当量 = power(恒定表值直接可算) -``` - -**验算与边界:** - -| 项 | 内容 | -|---|---| -| 供给面口径 | 全活行投影(非仅活 buff 行清单)——承载 A4 约束②③与 A3 条款⑤对账,道具/清图行值在内(B1 直读 ConfigDB 本也可绕过,接口名实相符) | -| 衔接注记(B2 OQ3) | 伤害道具作为主角规划面伤害令"安全格拾取 → 伤害当量"可落地(基础攻击为恒定基底、道具为可规划增量——部分缓解非闭合,窗口使用次数是战斗轨迹量归 B1) | -| 默认根 buff 活行 | defense_up_basic / attack_up_basic(attack_up 复活后首批入池——F4 复活口径;是否维持入池随奖励改造批,OQ1) | -| Output Range | tier_min_buff ∈ [1, 8];量纲仅为建议(B3 锚预警"瞬时 vs 总暴露"归一口径裁决前置,B1 可另选) | -| 边界 | 行值 provisional 归 C3;锚验收权 B4/B1(B3 Rule 10 同款) | - -### 方向预检(B2 clause3_supply 先例,登记对账记录) - -| 项 | 读数 | -|---|---| -| 刀供给期望 | ≈ \|资格格\| × 19% × 9.7(加权刀力 = (15×8+4×16)/19 ≈ 9.7)≈ 1.8\|资格格\|/板,另加即时群伤与基础攻击分量 | -| 击杀需求 | 敌 hp 18(单敌档)/ 54(3 敌档) | -| 预警联动 | 速杀退化预警⑥在"基础攻击 6/结算 + 即时类自动兑付"下压力进一步上升——敌 hp 曲线与奖励供给禁止独立调参(C3 联动重算义务) | -| 输入缺口 | \|资格格\| 分布待 A1 actuals p10/p50 → 落地后重跑;max_hp = 50(原型锚)为治疗供给对照基准 | - -## 状态 - -| 容器/条目 | 状态 | 进入 | 出口 | -|---|---|---|---| -| 板级奖励映射 | Unrolled → Ready → Retired | install 后 roll_board 恰一次 → Ready;Ready 期间只读 | retire_board/换图 → Retired(消亡,不跨图) | -| 库存条目 | InStock → Used → Cleared | stock 授予 → InStock;窗口选用消耗 → Used(不可逆) | 关卡结束 → Cleared(clear_inventory——库存跨战斗延续后于关卡末清空;battle_over 只退役映射不清库存) | - -不变式:Ready 后映射零写入;Used 不可逆;库存条目仅存在于关卡域(跨战斗延续)。违规 = debug 断言中止(进程致命保留给 D2 数据通道,B2/B3 同款)。 - -## 边界情况 - -| 条件 | 行为 | 依据 | -|---|---|---| -| 资格格集为空(S ∖ R₀ = ∅) | 三层防线——① A1 生产面 R₀ ≠ S 合法性闸(修订义务已登记、未落地);② A2 install 不变式④现行已生效(R₀=S 板装板即拒,B4 在其后序恒见非空集);③ B4 roll_board 致命(fail-fast 兜底,对偶于 F1 池空裁定)。B4 零静默回退 | E1 | -| 战斗结束时仍有未开资格格 | 其预分配身份随映射 Retired 消亡——零授予、零明细行(未拾取 ≠ 溢出:从未发生的事不进结算,非静默蒸发) | E2 | -| 同一结算多格授予同类 buff 超过 max_stack(连锁批量 13 格链 × max_stack=2 ⇒ 大量同文"奖励未生效"明细行) | 按规范序逐格受理,满层起 apply_effect 返回 false → 各产一行"奖励未生效"明细(零兑付、无折算——显式接受;A2 登记义务"连锁批量授予溢出吸收"的 B4 侧裁决落点);道具类无满层概念(库存无上限);玩家侧缓解 = 叠层感知挖掘(HUD 满层后少开安全格/优先挖刀——弱自救;层数长在 B3 容器上不长在格子上,未开格身份不呈现、无格可绕);结构位 = 未开格身份呈现深度(OQ2/A5,垂直切片);明细行数据面:未生效类行携带可聚合的计数/批次字段(同类聚合计数、来源批次——是否合并呈现归 B1/B5 裁决,数据必须可聚合,防事后补字段 = 接口漂移);呈现归 D1 义务③,行协议 owner = B3 义务⑧ | E3 | -| roll_board 后映射 Ready、B1 未调而挖掘已开始 | grant 在 Unrolled 前/Retired 后调用 → false + 诊断(受理/拒绝口径,非进程致命——编排违约显式暴露,B2 同款) | E4 | -| roll_board 被二次调用 | Ready 相位再调 → false + 诊断(相位守卫,B2 AC-1 同款) | E5 | -| 换图(retire + install)发生在战斗中 | 旧映射 Retired(未拾取身份消亡)、新图 install 后 roll 新批(新图新身份 = reward_roll 流新 scope 批,与 board_gen"每次生成新图"同构);库存不受影响(关卡域跨图延续,Rule 4) | E6 | -| 关卡结束(clear_inventory)后仍调 grant/stock/use | Cleared 相位 → false + 诊断;clear_inventory 由 B1 编排于关卡末恰一次(重复调用 false + 诊断,幂等守卫) | E7 | -| 道具使用窗口打开时库存为空 | 零使用恒合法(跳过恒合法);呈现归 D1(可整体不弹窗——P4 节奏,B4 建议登记;窗口触发政策见 D1 义务②——MVP 有库存恒弹,候选"仅可用品触发/常驻库存条"归垂直切片) | E8 | -| 同一件道具被选用两次 | `use` 对已 Used 实例 → false + 诊断(Used 不可逆);单帧选择收集口径归 D1(义务②) | E9 | -| 道具段中伤害道具施加时已无存活敌(前序刀已全灭) | 照常消耗——标记 Used、零效果,逐件进结算明细"已消耗未生效"行(B3 义务⑧"溢出未生效"行协议同款数据面)。现行理由两条:① 守卫所有权不对称(非信息不对称)——满血守卫是 B1 读 hero hp 的表局部判定(F4 已定),而零效果判定须读 B2 存活集,B4 零跨系统读纪律不为它开口子,选定即承诺把战斗轨迹判断留给编排层;② 反抖动——选定即承诺防窗口内反复重选拖垮结算节奏(B2 呈现规格供给 hp/max_hp 血条数字,敌我血量在选择时点均可读;窗口内可用性预判 usable_now〔B1 组装〕承载"误触防护"半句)。段序不截断:选定件全序执行 → 战斗段照常推进(死敌"死亡即不动手"空转)→ 衰减段 → 判定段判胜 → 关卡末 clear_inventory 全清(含未选件——D1 义务⑤清空反馈行);"零效果"事实判定归 B1 编排读 B2 存活集(读值做判定,非拒绝);监控锚 = 预警①(浪费半) | E10 | -| 清图槽身份为 buff 行且授予时已满层 | 零兑付 + "奖励未生效"明细行(Rule 3 同款协议;清图槽允许 buff 行入 clear_default 池);A3 条款④"清图奖励>0"的兑现口径 = 行级恒有正当量(F3 加载期校验:power≥1 ∨ effect_id 非空),运行时满层拒绝为合法例外、P2 诚实由明细行承载;常态化监控锚 = 预警④(清图槽 buff 零兑付单独计数) | E11 | -| 治疗包 power 超过当前缺血 | hp' = min(hp + power, max_hp)——部分回复合法(clamp 归 B1),不拒绝(与满血拒绝相区分:满血 = 零收益守卫、超量 = 部分收益) | E12 | -| RewardTable buff 行的 effect_id 悬空(B3 无此行) | 首个 effect_id 引用行回填后,B3 悬空校验激活 → 加载期致命(D2 通道);此前不校验(dangling_ref_policy 既有口径) | E13 | -| 战斗中热重载 RewardTable | D2 战斗中 reload 拒绝门(D2 EC8,B1 经 set_reload_gate 置位);已授予实例携带行值快照(power/effect_id 授予时冻结——B2 行值快照同款),映射中未授予身份仅是 reward_id 引用、grant 时快照 | E14 | -| cleared 与 battle_over 同结算(末图清图即胜利) | 授予段先兑付清图奖励 → 同结算道具使用窗口即可选用(含当轮清图奖励件)→ 未选用件随库存关卡域延续(末图 = 关卡末图时未选用件至关卡末清空 + 反馈行归 D1 义务⑤);折算/继承结构位归 OQ4(Alpha,C2/D5——折算点 = 关卡末) | E15 | -| 池含 attack_up 行 | 授予走 B3 apply_effect 正常受理、消费于主角战斗段先手攻击;机制层不做校验(内容决策归 C3) | E16 | -| 玩家囤刀跨战斗/跨图累积(数量无上限) | 合法策略且为设计意图(可选类道具是关内资产——"囤刀待机"的规划视野 = 整个关卡,P2 长线规划形态兑现);无运行时上限(伤害恒定表值 ⇒ 无乘法爆炸);失衡监控 = 预警①(浪费半)与⑥(速杀退化),修正入口 = C3 权重调参(items_per_settlement_cap 结构位默认关——Tuning Knobs) | E17 | -| 同格重复 grant / 同一 cleared 结算重复 grant_clear(Ready 相位) | grant 同格重受理 → 返回同一预分配快照 + debug 诊断;grant_clear 重调 → 返回同一预分配身份 + debug 诊断(幂等受理族;受理/兑付恰一次归 B1×②③,重复调用的诊断面留开发期暴露;对比:roll_board 二调 = 拒绝〔结构性相位违规,E5〕,重受理 = 编排瑕疵〔幂等兜底〕) | E18 | -| grant/query_identity 传入清单外坐标(非末次 roll_board 资格清单——R₀ 格/雷格/板外) | query_identity → null + 诊断、grant → false + 诊断(未分配非错误态;A5 探测查询任意格时,清单内未开格恒可查〔AC-2 分支 3〕、清单外 = 未分配) | E19 | -| stock() 入参越域 | 未知 item_id / buff 类条目 → false + 诊断(仅受理道具类条目,category ∈ {damage_item, heal_pack});来源 {cell, round} 由调用方供给、B4 不校验真值(真值归 B1×②) | E20 | -| query_inventory 的枚举序 | = stock 受理序(插入序,B3 Rule 6 先例)——D1 窗口呈现序契约 | E21 | - -## 依赖 - -**上游(hard)**: - -| 系统 | 性质 | 接口要点 | -|---|---|---| -| D2 | hard | RewardTable 新表 schema + 内容行回填(本 GDD owner,接口漂移回写 D2 Core Rules 表清单 + registry)+ RewardConfigTable 单行全局新增(T_fog_min/K_dmg/N_draft/P_min **+ active_p0/active_decay——供给控制器参数,C3 修订批接口漂移增补**)+ pool_tag 枚举增 **active_inject**(注入池);读取经 ConfigDB 单点 | -| A2 | 间接(零直接接口) | 资格事实(reward_eligible/channel)经 B1 转化;A2 只报资格、内容与折算不经 A2(A2 Interactions B4 行对侧确认) | -| A3/A4 | 对账/验收锚(非依赖边) | A3 条款④⑤与 A4 三条定价硬约束 = 对账/验收锚关系;锚验收权归 B4/B1(B3"相邻"口径同款) | - -**下游**: - -| 依赖方 | 性质 | 接口 | -|---|---|---| -| B1 | hard(provisional——B1 未设计) | 结算编排期调用:roll_board(install 后恰一次)/ grant / grant_clear / stock / use / query_inventory / clear_inventory;B1 义务清单 6 项(缺项即 blocking,见下表);窗口锚点 = 授予段后、窗口选择序 = 回放输入、每格受理恰一次 | -| B3 | 相邻(零运行时依赖——调用经 B1) | buff 类经 B1 调 apply_effect(source_class=safe_cell/clear_reward 已在 B3 枚举内);锚验收权归 B4/B1(weaken 档位 vs 最低档安全格 buff 当量——A3 条款 2);满层拒绝协议对侧;首个 effect_id 引用回填激活悬空校验 | -| B2 | 相邻(零运行时依赖) | 伤害道具默认目标 = 固定顺位(Rule 5 消费);HeroTable.atk 域 [1,999](基础攻击恒存在——attack_up 复活的供给前提);道具段先于战斗段 → 抢杀窗口的道具形态(段序战术面);伏击清单扩展联动对侧 | -| C3 | 下游 soft(provisional) | 权重/档位/威力/池内容曲线数值调参所有权(默认根行集已登记);T_fog_min/K_dmg/N_draft/P_min **+ active_p0/active_decay(供给控制器)** 参数(RewardConfigTable);调参期批量仿真义务(F5 可行率 + 登记常数重制联动);雾区档位过滤谓词的参数归 C3;失衡预警①–⑧ playtest 归口;**clear_blast 换位 + K_dmg=0 + 注入池结构转正裁决(用户拍板,明细见版本历史)**;attack_up 入池裁决(随奖励改造批) | -| C1 | 下游 soft(provisional) | biome/tag 图类型供给(clear_ 插槽差异化输入——插槽激活的前置) | -| C2 | 下游 soft(provisional) | 关卡大奖励归 C2(B4 无关);关卡结构 = 库存关卡域的容器("关卡结束"事件归 C1/C2 定义,落位前 B1 暴露 level_clear 入口由上层显式调用);关卡末剩余道具折算结构位归 C2(OQ4 残余——转金币/继承候选,Alpha) | -| D1 | soft | 呈现义务 5 项(缺项即 blocking,见下表) | -| B5/D5 | soft | 结算明细道具行(数据源 = B1 流水,含击杀结果字段——H3 击杀标记数据源);道具使用窗口教学(拾取→囤刀→窗口选用的闭环)+ "关卡末库存清空"教学(RAP 清零同款先例) | -| A5 | 相邻(预留桥接位) | aux_item 预留枚举(校验拒绝——启用走修订);未开格奖励身份探测 = A5 探测道具零成本桥接(身份 install 期已定可查,OQ 登记,垂直切片) | - -- 双向一致性核对(systems-index 依赖分层表):索引分层 B4 ← D2(硬上游仅 D2;A2 = 事实经 B1 转化零直接接口、B3 = 验收锚关系非运行时边——B2"其余为事实读取不列边"注记口径同款)。 - -### B1 侧义务清单(缺项即 blocking——B2/B3 对 B1 登记先例) - -| 编号 | 内容 | 对侧 | 状态 | -|---|---|---|---| -| B1×① | 结算段序骨架成文:授予段(编排期转化,含 grant_clear 兑付与即时类当场兑付)→ 道具使用窗口(授予段后、增益段前)→ 增益/减益段 → 道具段 → 战斗段 → 衰减段 → 判定段;核心序 buff/debuff > 道具 > 战斗不变;窗口选择序列登记为结算回放输入事件 | B1 GDD | 已登记,待 B1 落地 | -| B1×② | 奖励受理与分流编排:grant → buff 类 apply_effect / 即时类当场兑付(instant_aoe = 全体存活敌各 power、instant_heal = 主角回复 clamp)/ 道具类 stock;每格受理恰一次、stock 与 grant 返回一一对应;满层拒绝/即时类零兑付 = "奖励未生效"明细行、无折算——未生效类行携带可聚合计数/批次字段(合并呈现归 B1/B5 裁决,数据须可聚合) | B1 GDD | 已登记,待 B1 落地 | -| B1×③ | clear_reward 授予路径:清图奖励 roll 身份 install 期已定、cleared 结算编排期兑付——兑付后同结算窗口即可选用;清图槽即时类同分支当场兑付(B3 OQ4 关闭条件) | B1 GDD | 已登记,待 B1 落地 | -| B1×④ | 窗口与道具段编排:窗口时机 = 授予段后、增益段前;窗口数据组装 = B4 query_inventory 投影 + B1 侧守卫预判 usable_now(满血治疗包禁选/提示——呈现归 D1;B4 零跨系统读不变);窗口至多选用一件(单件施加、目标/数值/明细行来源标注);零效果判定读 B2 存活集 + "已消耗未生效"明细行(E10 承接);击杀结果进流水(H3 击杀标记数据源——B5/D1 呈现消费);治疗 clamp | B1 GDD | 已登记,待 B1 落地 | -| B1×⑤ | 生命周期编排:关卡结束调 clear_inventory 恰一次;清空前后快照计数供"随关卡结束清空"反馈行(D1 义务⑤);battle_over 调映射退役(映射 = 板级,随战斗消亡——下一场战斗新板新批) | B1 GDD | 已登记,待 B1 落地 | -| B1×⑥ | roll_board 调用时机:install 后、挖掘前恰一次(B4 侧相位守卫见 E5/AC-1 分支 3;B1 编排纪律承载调用时点——B4 不可观测) | B1 GDD | 已登记,待 B1 落地 | - -### D1 侧义务清单(缺项即 blocking——"清单外登记会丢失"先例) - -| 编号 | 内容 | 对侧 | 状态 | -|---|---|---|---| -| D1×① | 已开格 + 库存奖励身份恒定可读:库存常读条 = 挖掘期规划面而非仅轮末窗口(Rule 8);关内延续后常读条跨战斗可见 = 关卡资产感的数据面 | D1 GDD | 已登记,待 D1 落地 | -| D1×② | 道具使用窗口呈现:授予段后弹出;选用/跳过/单件选用、usable_now 可用性投影呈现(满血治疗包禁选或选中提示)、窗口时机指示、空库存可不弹窗(E8)、窗口触发政策注记(MVP 有库存恒弹;候选"仅可用品触发/常驻库存条非模态"归垂直切片) | D1 GDD | 已登记,待 D1 落地 | -| D1×③ | 结算明细四类行呈现:道具行(含入库/生效语境注记)/ "奖励未生效"行(按聚合计数呈现,数据源含可聚合字段)/ "已消耗未生效"行 / "使用被拒"行——数据源 = B1 流水,P2 归因 | D1 GDD | 已登记,待 D1 落地 | -| D1×④ | H2 清图奖励行强调呈现(轮末仪式峰值) | D1 GDD | 已登记,待 D1 落地 | -| D1×⑤ | 关卡末库存清空可见反馈:"剩余道具 ×N 随关卡结束清空"汇总;层间过渡"库存 ×N · HP 带入下一层"可见反馈 = 垂直切片候选 | D1 GDD | 已登记,待 D1 落地 | - -### A4 定价硬约束的 MVP 承载状态(显式宣告) - -| 约束 | 状态 | 说明 | -|---|---|---| -| ① 雾内档位下界 ≥ 最低档安全格 buff 当量 | 锚侧承载 | AC-19 档位序检查(非运行时校验);真当量换算依赖 B1 条款①对照表(未设计) | -| ② 清图奖励锚随雾成本负担上浮 | MVP 结构性不可闭合 | clear_default MVP 单默认槽 = 板无关常量池,清图奖励当量无法随雾负担变化(非 deferral 而是本期不可闭合;B1 强制检查点只能对该常量判 pass/fail,改 power 会同步抬高无雾板、破坏无雾侧定价);激活载体 = clear_ 插槽(垂直切片,待 C1 biome 词表落定) | -| ③ 雾板净当量优势带上界 | 静默绿灯风险 | ②缺位 + 雾格仅 tier 下界加成的 MVP 结构下近乎必然平凡通过;休眠状态与接受风险(重雾板清图欠偿 → 弃图偏斜——A4 警告的 level 2 结构性高发位)在此显式登记;对冲 = 预警⑤雾板分层观测 + 预警⑥速杀退化监测 | - -### 接口漂移登记(回写已兑现——delta 复核逐处对账) - -| 编号 | 内容 | 对侧 | 状态 | -|---|---|---|---| -| 1 | game-concept 待定问题"主动道具后续版本加入"于 MVP 激活(道具使用窗口)——use_timing 字段从预留转承重 | game-concept(第 144 行注记) | 已同步 | -| 2 | registry `rng_service.scope_event_binding` 的 reward_roll 批次语义改写为"每次 board install(格奖励批 + 清图奖励批)" | registry + D2 正文(Core Rule 5 / Interactions B4 行) | 已同步 | -| 3 | 锚参照迁移传播(attack_up 当量参照回迁) | systems-index A3 OQ5 注记 · registry `status_effect.anchor_warning` · registry `clause3_supply.direction_precheck` | 已同步(三处) | -| 4 | game-concept 创意风险 #1 与可证伪信号的 MVP 口径注记 | game-concept | 已同步 | -| 5 | 窗口锚点修订(授予段后) | systems-index 门禁块 | 已同步 | -| 6 | systems-index 分层行 B4 ← D2 更新 | systems-index | 已同步 | - -## 呈现与 UI 契约 - -> B4 = Core 层数据/逻辑系统,零自有视觉/音频/UI 资产(headless 可跑全奖励流);本节定义数据面供给责任,呈现实现归 D1/B5/D4/D5(义务清单见依赖节)。 - -| 编号 | 数据面义务 | 归属 | -|---|---|---| -| 1 | 高光节点 H1 开格拾取瞬间:身份在场——"这格有货"是 P4 高频情绪节拍;触发数据 = cell_revealed + 身份查询;query_identity 投影含 tier——拾取瞬间可读"好货"档位 | D1 呈现 | -| 2 | 高光节点 H2 清图奖励兑付:轮末仪式峰值——clear_reward 明细行强调呈现(D1 义务④) | D1 | -| 3 | 高光节点 H3 道具抢杀窗口:"重击拍前用刀"——"我算对了"的执行侧兑现(段序战术面,Rule 5);感知数据前置:B1 流水含击杀结果字段(B1 义务④)——无它则"敌灭、重击未落地"不可呈现,兑现点缺席 | B1 供给 / D1 呈现 | -| 4 | 创意风险登记:#2"完美排雷爆发结算"(零误标/全标中加倍)机制本体归 B1 强制检查点(game-concept 原文归属——B4 交付插槽与明细行数据面);#3 标中旗即时节拍补偿同归 B1(A2"清单外登记会丢失"先例——本条目化即义务,D1 义务④⑤为其 blocking 承载) | B1 / D1 | -| 5 | icon 映射键契约:reward_id(全局恒定、跨 run 不重掷——B2 D1×4② 同款口径);category 三类第一层区分(buff/伤害道具/治疗包)+ 行级第二层;形状+色相双通道(art-bible 约束——art-bible 未建前键契约先冻结);名称数据源 = display_name 字段 | D1 / art-bible | -| 6 | 绘制优先级插入点:奖励徽章位于旗子之下、变异纹理之上,不得进入数字区域(game-concept 绘制优先级栈:数字 > 小人 > 旗 > [徽章] > 纹理 > 底色)——纳入格子样张测试验收项 | art-bible | -| 7 | 结算明细四类行协议(数据源 = B1 流水,呈现归 B5/D1 义务③):道具行(含入库/生效语境注记)/ "奖励未生效"行(携带可聚合计数/批次字段——E3)/ "已消耗未生效"行(E10)/ "使用被拒"行(满血守卫拒绝的兜底呈现——usable_now 预判外的残余路径);未选用件"随关卡结束清空"语境注记(D1 义务⑤) | B5/D1 | -| 8 | 音频挂钩点(D4,Alpha):开格拾取音(按 category 分色)/ 道具使用音 / 清图奖励音 / 负反馈聚合音("未生效/被拒"类行数 >0 时单次结算至多一次——防逐行惩罚轰炸或静默惩罚);挂点事件归 B1/D1,B4 零音频依赖 | D4 | -| 9 | 道具使用窗口数据契约:载荷 = B1 编排组装——query_inventory 逐件实例(item_id + 来源 {cell, round} + 行值快照投影 + 状态;枚举序 = stock 受理序〔E21〕)+ usable_now 预判;呈现(逐件列表/选用序收集/跳过/窗口时机指示/usable_now 禁选态/触发政策注记)归 D1;窗口期选择收集与棋盘输入不竞争(A2 单意图帧先例);窗口选择序列 = 结算回放的输入事件 | D1 | -| 10 | UX 规格归 D1 GDD(设计顺序第 10 位)前置 /ux-design——窗口是 D1 域屏,B4 只供数据契约;B4 无 D1 外新增 UI 义务 | D1 | - -## Tuning Knobs - -| Knob(RewardTable 行值 / RewardConfigTable 配置值,均 D2 承载) | 默认 | 调过高 | 调过低 | -|---|---|---|---| -| RewardTable.weight(逐行) | 格子池四行即时类(合计 67)+ 注入池三行可选类(knife 60 / adv 30 / heal_pack 10)+ clear_blast 单行槽——注入池结构与换位随 C3 修订批转正;provisional 归 C3 | 即时类过剩 → 结算明细淹没("奖励未生效"行刷屏)、可选类相对贬值 | 可选类过低 → 窗口长时空转(单件制下规划面稀薄)、重 roll 频发乃至致命 | -| RewardTable.tier | 默认根:knife_t1/spark_aoe/heal_minor t1、attack/defense/heal_pack/knife_adv/clear_knife t2 | 雾区档位上移 → 平原奖励贬值(预警③联动) | T_fog_min 过滤失效 → A4 硬约束①锚失守(对账兜底) | -| RewardTable.power | 默认根:刀 8/16、治疗包 12、即时类 4/4(可选类更强、治疗稀缺化配套) | 道具段秒杀 / 治疗溢出(HP 满拒绝率↑——预警②) | 刀供给名义达标实际不足(击杀需求多轮化) | -| T_fog_min(RewardConfigTable) | 2(provisional) | 雾池收窄 → 雾格奖励稀化、单一化(预警③)、池空致命风险↑ | =1 过滤退化——雾区档位下界仅剩锚兜底 | -| K_dmg(保底刀数) | 0(provisional——保底断言关闭,语义由供给控制器首件保证取代;原 1 与"禁区默认值"条款随 C3 修订批解除) | 重 roll 频发 → 流消费膨胀;> 资格格数恒致命 | =0 = 断言关闭(**现行默认**——no_damage_row 加载后闸托底零活刀行世界) | -| N_draft(重 roll 上限) | 32(provisional) | 坏权重多次过审(掩盖配置错误) | 合法低供给池被误杀致命(概率性致命带——C3 批量仿真义务) | -| 供给控制器 active_p0 / active_decay | 0.4 / 0.5(provisional) | 速杀+囤积回归(获取过量) | 可选类绝育(注入趋零)——E[战斗获取] ≈ 1 标定目标;**机制本体 = RewardSupplyController(install 期战斗首件保证 + 指数递减注入,归本 GDD——C3 修订批承接登记);加难杠杆候选 decay 0.6 随 C3 OQ7 扫描** | -| P_min(K≥1 供给闸刀力下界) | 8(= 默认根最低刀 power) | 闸收紧 → 低威力刀行被加载拒绝(内容收窄) | =1 → 闸空转(power ≥1 恒真) | -| items_per_settlement_cap(结构位) | 关(无上限) | 启用即限制——过高不构成保护 | 过低锁死胜局(击杀需求 ÷ 轮数——economy-designer 警告);启用裁决归 C3 playtest | - -- 非 knob(结构冻结,修订走本 GDD 流程非调参):奖励类型五值封闭枚举(两类交付轴)· install 期预分配 + Ready 只读(无重掷 API)· 道具伤害恒定表值不吃修正(用户拍板)· 满层零兑付无折算 · 库存关卡域(跨战斗延续、关卡末清空)· 窗口单件制(体验反馈后修订走 GDD 流程)· 清图恒非空 · 结算段序骨架(buff/debuff > 道具 > 战斗)· 零随机出 roll_board 一线 · 逐件实例归因。 -- Knob 交互:K_dmg × safe_cell 伤害权重 × T_fog_min(雾池收窄挤压刀供给 → 重 roll 频发——三者禁止独立调参);T_fog_min × tier 分布 × 雾池行数(雾池单一化联动——预警③第二仪表,禁独立调参);power × B2 EnemyTable hp 曲线(击杀需求侧联动,C3 所有权);weight × B3 max_stack(buff 零兑付率联动——预警④)。 -- 调参所有权:内容/曲线全部 provisional 归 C3;A3 条款③⑤与 A4 硬约束①②③的对账闭合归 B1(锚验收权 B4/B1——B3 Rule 10 同款)。 - -## 失衡预警清单(playtest 预注册) - -| 编号 | 指标 | 阈值/读法 | -|---|---|---| -| ① | 刀供给短缺/浪费双指标 | 短缺 = "获得刀伤供给 ÷ 击杀需求" <1.0 即警(供给面信号,按 unit_count {1, 2–3} 两档分设阈值);浪费 = "未用刀伤 ÷ 获得刀伤供给" >0.5 即警(效率面,与短缺分开读——供需贴近下界时高效用刀本就趋零) | -| ② | 治疗双尾 | 溢出 = HP 满拒绝率 >40%(instant_heal 满血零兑付并入本仪表——小额浪费可容忍、阈值放宽;heal_pack 满血拒绝维持 >40%);短缺 = "败北且库存有未用治疗包"占比 >20%(可选治疗稀缺化至 6% 后本仪表为主仪表——强治疗名存实亡的探针) | -| ③ | 雾区档位空窗 + 单一化 | 雾区拾取平均 tier ≤ 平原即警;增雾池单一化监测——雾区拾取 distinct reward_id 数 = 1 持续即警(雾池收窄 → "越险货越同",T_fog_min × tier 分布联动调参) | -| ④ | buff 零兑付双表 | 稳态(单格授予批)零兑付率 >25% 即警;连锁批量授予零兑付率单列(结构性偏高——登记推导:buff 供给 λ = 8 挖/轮 × 44% ≈ 3.5 层/轮 vs 吸收上限 1 层/结算 × max_stack 2,批式授予下零兑付率远高于单格批;阈值 >50% 即警);结构性缓解:buff 时长改当次结算(D=1)——浪费不再跨结算累积、保质期一次结算天然有界,但同结算内批量授予的零兑付仍存在,仪表保留;清图槽 buff 零兑付单独计数维持 | -| ⑤ | 清图支配反转 | 弃图率 >30%(A3 OQ3 联动)——雾板/无雾板分层观测(A4 明文要求补登;聚合指标会被雾板污染或反向掩盖) | -| ⑥ | 速杀退化 | 战斗结束时未开资格格占比 >70% 即警(供给过剩 → 战斗提早结束 → 未挖身份零发放,奖励系统饿死自己的高光与雾内容) | -| ⑦ | 窗口摩擦 | 窗口跳过率、单结算平均明细行数(playtest 预注册,阈值归 C3);结构性缓解:库存只收可选类(25% 权重)+ 窗口单件制——窗口频率与每次决策量双降,本预警预期大幅缓解、保留观测 | -| ⑧ | H2 曝光率 | 含清图奖励兑付的结算数 ÷ 战斗数(OQ4 折算裁决的数据输入) | - -## 验收标准 - -### 测试口径 - -| 口径 | 要点 | -|---|---| -| 测试载体 | B4 是 Core 层数据/逻辑系统——非 UI、无场景依附;冒烟载体 = `godot --headless --script`(承 D2 冒烟框架;脚本 extends SceneTree 以获得 quit(code),ConfigDB/RngService autoload 由脚本显式实例化);映射容器/库存容器/RewardTable schema 经 class_name 直引实例化(每用例全新实例、无跨用例状态——B3/A4/B2 直引先例;AC-21 扫描对该路径豁免) | -| 被测面 | B1 未设计(设计顺序第 9 位)——冒烟直接驱动 B4 最小 API 面并扮演编排方(B2/B3 先例);B4 冒烟零 B2/B3 实例化(相邻零运行时依赖的代码侧对应——施加面/存活集/血量全部归 B1 OOS,StatusEffectTable/HeroTable 仅经 ConfigDB 读值);资格格清单程序构造(真实来源 = B1 义务⑥——冒烟构造等价,零 A1/A2 接线) | -| 时序口径 | "一次 board install" = roll_board 恰一次的构造窗口;"cleared 轮" = grant_clear 构造调用;"battle_over" = clear_inventory(+retire_mapping)构造调用;结算段序骨架(授予段→道具使用窗口→增益/减益段→道具段→战斗段→衰减段→判定段)与使用窗口编排 = B1 域——冒烟以构造序扮演、不断言编排正确性(B2 时序口径同款);σ 到达机制:D2 全新 RngService 首个 open_stream 恒为 scope 0——到达 scope=σ 须先 `open_stream("reward_roll")` ×σ 丢弃预推进(AC-7 分支 1 按此执行) | -| 纸面契约子集 | 凡依赖 Ψ(σ)/Φ(σ)/σ*/重 roll 轨迹登记值的 THEN,在取号约定实现期 ADR 落地前不视为可执行(受影响:AC-1 分支 1 非雾格值、AC-7 分支 2/3、AC-10 分支 1、AC-12 登记序列);雾格单行退化分支例外(r 无关,现即可执行) | -| 只读观测量 | 映射投影(reward_id/category——引用级)· 库存实例投影(item_id/来源/快照/状态)· 流 scope 计数器(D2 AC-4 公开只读——install 恰一 scope 的观测面);相位无字段观测量:Unrolled/Ready/Retired 由受理返回值推断;Cleared = 逻辑失效态(失效句柄查询返回空 + 诊断、作用接口拒绝——AC-3 域闭;B2 Despawned 逻辑失效口径同款);实例不变式(Ready 后映射零写入 / Used 不可逆 / 库存条目仅存关卡域)= debug 断言自守——违规路径不可由封闭 API 构造(负空间:无重掷 API 即"Ready 后零写入"的结构前提),不经冒烟断言;行为级证据 = AC-1/AC-2/AC-9/AC-14 | -| 期望值推导纪律 | weight/power/tier/T_fog_min/K_dmg/N_draft 全 provisional(Tuning Knobs)——各 AC 的 THEN 具体数值按当前表读值/夹具登记值推导、不写死(记号:w_i/t_i/p_i/T_f/K/N);结构定值断言合法:category 五值封闭、pool_tag MVP 二值封闭、use_timing 单值、清图恒正当量校验存在性;权重比例与数值不作定值断言(provisional 归 C3) | -| 拍板语义承载 | 道具段照常消耗(AC-14 分支 3——不采信任何"拒绝不消耗"旧读法)· 清图槽允许 buff 行(AC-11)· 窗口锚点 = 授予段后(Rule 5——B4 冒烟不断言编排时点,构造序扮演) | -| 登记常数协议 | 期望格身份映射 Ψ(σ)、清图身份 Φ(σ)、重 roll 草稿数轨迹、A4① 对账对——入版本库(B2 行集协议同源);失效处置 = 先复核登记、登记无误即实现缺陷;登记后安排第二人独立推导复核(A2 OQ3 同型义务) | -| 测试种子取号协议 | master=42;σ 取号 = 每 roll_board 调用恰一 scope(install 批含格批 + 清图批尾;retire 后新 install = 新 scope——E6/registry 语义);期望轨迹经 `derive_at("reward_roll", σ)` 纯函数测试通道推导(不推计数器——D2 R2 预览语义的测试侧合法用途,A1 同款先例;黄金向量 m=42 scope0=7422916049646135537 见 D2 R2 向量表,本节复用不重制——推导起点锚) | -| out-of-scope(覆盖声明) | deferral 生效条件 = B1 义务清单 6 项 + D1 义务清单 5 项登记(均缺项即 blocking):B1×① 段序骨架与结算内调用序(含窗口锚点 + 窗口选择序回放输入)· B1×② 受理分流调用(grant→apply_effect/stock;每格恰一次)与满层"奖励未生效"明细行协议 + 聚合计数字段(E3/E11 大量同文行半)· B1×③ clear_reward 授予路径 · B1×④ 窗口与道具段编排——usable_now 组装、满血守卫(拒绝不烧包)+ 逐件动态守卫(同窗顺序多包)、零效果判定(读 B2 存活集)、逐件"已消耗未生效"明细行、击杀结果进流水、治疗 clamp(E12)、伤害施加与"恒定表值不吃修正"纪律 · B1×⑤ 生命周期编排恰一次(关卡末 clear_inventory 时点 + 清空反馈计数——E2"零明细行"= 编排不调即无行)· B1×⑥ roll_board 恰一次编排 ∥ D1×①…⑤ 预读呈现(含库存常读条)/使用窗口(选用·跳过·序收集·usable_now·触发政策)/四类明细行呈现(聚合 + 语境注记)/H2 强调呈现/关卡末清空反馈(不可 G-W-T)∥ 另有:B3 满层拒绝原子(B3 AC 既有——跨引不重复);A4 约束②③(MVP 休眠——依赖节显式宣告)与 A3 条款⑤对账闭合(B1 强制检查点);attack_up 复活联动(OQ1);C3 数值与失衡预警①–⑧(playtest 域);未开格身份呈现深度(OQ2/A5+D1) | - -### API 面(provisional,封闭枚举——实现期 ADR 定名) - -| 接口 | 签名 | 语义与守卫 | -|---|---|---| -| roll_board | `roll_board(eligible: Array[{cell, fog}]) -> bool` | install 期恰一次;消费 reward_roll 封闭流恰一 scope 批(格批 + 清图批尾一号 × F5 草稿数——每稿 = 格批 + 清图批尾一号,草稿弃用连清图一号一并弃用);Ready 相位再调 → false + 诊断(E5);空清单 → debug 断言中止(E1 兜底);清单含重复格 → 去重 + debug 诊断 | -| query_identity | `query_identity(cell) -> Dictionary\|null` | Ready 只读预读面——返回 {reward_id, category, tier} 引用级投影,非行值快照(快照时点 = grant,E10);Retired/Cleared → null + 诊断;清单外坐标 → null + 诊断(E19——A5 探测桥接的结构面) | -| grant | `grant(cell) -> Dictionary\|false` | 受理面——返回 {reward_id, category, effect_id?, power?} 行值快照;Unrolled/Retired/Cleared → false + 诊断(E4/E7);清单外 → false + 诊断(E19);同格重复受理 → 同一快照 + 诊断(幂等,E18) | -| grant_clear | `grant_clear() -> Dictionary\|false` | cleared 轮兑付——身份 = install 批尾预分配;同批次重调 → 同一身份 + 诊断(幂等,E18) | -| stock | `stock(item) -> Dictionary\|false` | 道具类入库——仅受理 category ∈ {damage_item, heal_pack},未知 item_id/buff 类 → false + 诊断(E20);逐件实例 {item_id, source{cell, round}〔调用方供给、B4 不校验真值——真值归 B1×②〕, 快照};Cleared → false + 诊断 | -| use | `use(handle) -> Dictionary\|false` | 窗口选用消耗——true ⇔ InStock→Used + 返回消耗回执(授予时快照投影 + 来源归因);Used 句柄 → false + 诊断(E9);零游戏态前置守卫——存活集/血量对 B4 不可见,E10 照常消耗与 F4 满血守卫归 B1 的结构前提 | -| query_inventory | `query_inventory() -> Array` | 逐件实例枚举含状态 InStock/Used,枚举序 = stock 受理序(E21)——Used 保留只读可查("已消耗未生效"行数据面,B2 Dead 句柄同款);呈现过滤归 D1 | -| clear_inventory | `clear_inventory() -> bool` | 关卡末全清;重复 → false + 诊断(E7 幂等) | -| retire_mapping | `retire_mapping() -> bool` | board retire——B1 义务⑤ | -| equivalence_supply | `equivalence_supply() -> Dictionary` | F6 供给面 {全活行投影, tier_min_buff}——只读 | -| weighted_pick | `weighted_pick(rows, r) -> String\|null` | F1 选行算子纯函数供给面(B2 ambush_grant_plan 先例) | - -- 全部布尔/字典返回 = 受理/拒绝(附 debug 诊断、非进程致命——进程致命保留给 D2 数据通道与 fail-fast 兜底点)。 -- 封闭枚举即负空间验收形态:无重掷 API(Rule 8 Ready 只读)· 无库存上限 API(Rule 4/E17)· 无伤害/治疗/buff 施加 API(施加归 B1——F4/Rule 3)· 无自主清空时点(clear_inventory 调用权归 B1)· 无事件订阅 · 无 RNG 直连(唯一入口 = roll_board 内 open_stream("reward_roll"));新增任何入口 = 接口漂移(GDD 修订非调参)。 - -### 夹具与种子策略 - -| 夹具根 | 登记内容 | -|---|---| -| 默认根 | B4 回填的 RewardTable MVP 行集(枚举节八行:defense_up_basic/attack_up_basic/spark_aoe/heal_minor/knife_t1/knife_adv/heal_pack/clear_knife)+ RewardConfigTable T_fog_min=2 / K_dmg=1 / N_draft=32 / P_min=8——结构断言、F6 供给与方向预检 | -| b4_golden | D2 全表清单拷贝 + 权重/tier 冻结登记值(刀 w=2 t=1 / 治疗包 w=1 t=1 / defense_up w=1 t=3 / clear_default 单刀行 w=1)——黄金载体与默认根内容调参解耦(C3 重调默认权重不触动本根;雾池 = {defense_up t3} 单行退化——雾格分支 r 无关现即可执行) | -| b4_reroll | T_fog_min=1 / K_dmg=1 / N_draft=32 / p_min=4(刀 p=4 须过 F5 加载护栏 (i),随全局 P_min=8 生效);safe_cell = 刀 w=1 t=1 / 治疗包 w=3 t=1 / defense_up w=3 t=2;clear_default 单刀行 w=1 p=4——满足全部加载校验(活 buff 行 ✓ / 雾池非空 ✓ / 清图正当量 ✓);重 roll 可达(首稿零刀 P ≈ (6/7)³ ≈ 0.63)而耗尽经验稀有(≈4×10⁻⁷/σ)——取号约定 ADR 落地后按缺口预检 8 复核可达性拆分、失效即重制 | -| b4_fog_gate | tier 布置使雾池唯一活行 = 高档行 H、非雾池含低档行 L(登记) | -| b4_fog_gate_hot | 同表 + T_fog_min=8 表值烤入——雾态池空加载致命(AC-6 分支 4 致命分支载体——R3 override 不触发加载校验,D2 边界⑤) | -| b4_clear_buff | clear_default 唯一活行 = defense_up | -| b4_reloaded | power/tier 各 +1(effect_id 不动——登记) | -| b4_nofloor | safe_cell 无刀行 + K_dmg=0 | -| b4_attackup_row | safe_cell 追加 attack_up 引用行(attack_up 复活后的正向夹具) | -| 致命根 ×8 | manifest(见下表;含 b4_floor_supply / b4_nodamage) | -| 程序构造 | RewardTable + RewardConfigTable schema 直引(AC-16);资格格清单 b4_list_A(3 格含 1 雾)/ b4_list_B(4 格)/ b4_list_single(1 格)坐标入版本库 | - -- 注入通道:行为夹具根经 `--data-root=` 注入(仅 debug、不入 `data/tables/`——D2 夹具纪律);标量 knob 单变分支(T_fog_min=1、K_dmg=2)经 R3 debug override(域内值、运行时态——D2 AC-7 先例);加载致命分支一律烤入根承载、不经 override;两通道每夹具恰一登记。 - -### 致命类收窄豁免与 runner manifest - -| 类别 | manifest 行 | 触发条件 | 断言 | -|---|---|---|---| -| 加载期 ×8 | pool_empty_safe | safe_cell 全 0 权 | 独立 headless 进程非 0 退出 | -| 加载期 | pool_empty_fog | 全行 tier < T_fog_min(雾态空) | 非 0 退出 | -| 加载期 | clear_empty | clear_default 池空/全 0 权 | 非 0 退出 | -| 加载期 | clear_no_value | clear_default 唯一活行 = power 0 道具行(恒非空的可判定形式——A3 条款④表侧兑现) | 非 0 退出 | -| 加载期 | no_live_buff_row | safe_cell 有活行但零活 buff 行(tier_min_buff 无定义——F1 对偶致命) | 非 0 退出 | -| 加载期 | dangling_effect | buff 行 effect_id = "ghost_buff"(B3 StatusEffectTable 无此行;条件性夹具:默认根已含 effect_id 引用行 ⇒ 悬空校验已激活——dangling_ref_policy 首引兑现点) | 非 0 退出 | -| 加载期 | floor_supply_missing | K_dmg ≥ 1 ∧ safe_cell 池无 power ≥ P_min 活刀行(F5 加载护栏 (i)——根 b4_floor_supply) | 非 0 退出 | -| 加载期 | no_damage_row | K_dmg = 0 ∧ safe_cell ∪ clear_default 全池零活刀行(F5 加载护栏 (ii) 零伤害世界后闸——根 b4_nodamage,B2 OQ9 并案) | 非 0 退出 | -| 运行期 ×2 | floor_exhaust | roll_board 保底耗尽 | 调用后退出码非 0 | -| 运行期 | empty_eligible | roll_board(∅) debug 断言中止(release 构建语义 = push_error 致命路径——D2 EC7"零静默回退"同款,实现期 ADR 登记) | 非 0 退出 | - -- 其余致命类别(通用枚举域/域校验/R1 类)由 D2 AC-2 同类别 loader 夹具承载(表无关,豁免声明收窄——B2 同款);每用例先 `reset_diagnostics()`(D2 冒烟协议,全局声明)。 - -### AC 清单(Given-When-Then,编号不变) - -| AC | Given | When | Then | 覆盖 | -|---|---|---|---|---| -| AC-1 | b4_golden 根加载、全新 B4 容器(Unrolled)、RngService master=42 已播种(scope 计数器 = 0)、清单 = b4_list_A | `roll_board(b4_list_A)`;分支 2:两套全新 RngService+B4(同 master=42、同 scope 起点)分别以规范序/乱序传入同一集合;分支 3:Ready 后再 `roll_board(任意清单)` | true(Unrolled→Ready);query_identity 逐格 = 登记映射 Ψ(0)(含雾格分支——雾格身份 ∈ 雾池行,登记值);reward_roll 流 scope 计数器 = 1(install 恰一 scope——registry 语义的行为面);分支 2:两映射逐格相同(行主序消费序 B4 侧规范化——F1"行主序逐格",排序责任不外推给 B1);分支 3:false + 诊断、映射与流计数器不变(相位守卫——B2 AC-1 同款;double-roll 无守卫的编排半归 B1×⑥) | Rule 2/8 · E5 | -| AC-2 | b4_golden 根、roll_board 完成(Ready) | 腿 1:对每格重复 query_identity ×3;腿 2:grant(c) 后 query_identity(c);腿 3:对未受理格 query_identity;腿 4:query 前后对照;腿 5:retire_mapping() 后 query_identity(c) | 腿 1:逐字相同(结构保证非授予期随机);腿 2:= 授予前值(身份恒定跨授予——同图跨轮恒定的观测半);腿 3:恒返回身份(映射无"已开才可查"谓词——A5 探测道具零成本桥接的结构前提;MVP 不呈现归 D1/OQ2);腿 4:映射/库存投影零变化(纯读);腿 5:null + 诊断(映射消亡的观测形式——E6 旧映射半) | Rule 8 | -| AC-3 | b4_golden 根 | 分支 1:全新容器(Unrolled)上 grant(c)/grant_clear();分支 2:roll_board → retire_mapping 后 grant/grant_clear;分支 3:roll_board → grant → stock → clear_inventory() 后 grant/stock/use、query_inventory、query_identity(c);分支 4:重复 clear_inventory() / 重复 retire_mapping() | 分支 1:false + 诊断(E4 roll 前受理);分支 2:false + 诊断(E4/E2——未拾取身份消亡零兑付);分支 3:均 false + 诊断(E7);query_inventory = 空(InStock 与 Used 均清——关卡域);query_identity(c) → null + 诊断(Cleared 逻辑失效态的观测分支);分支 4:false + 诊断(E7 幂等守卫;同型守卫——B3 EC11 先例,provisional API 完整性分支) | E4/E7 | -| AC-4 | 全新容器、master 已播种(b4_golden;manifest 行 empty_eligible) | `roll_board([])`(S∖R₀=∅ 构造——真实流中 A2 install 不变式④前置,本 AC 直击 B4 兜底半) | debug 断言中止(fail-fast 兜底、零静默回退——F1 池空裁定的运行期对偶);测试通道诊断清单含类别;独立进程非 0 退出 | E1 | -| AC-5 | weighted_pick 纯函数面(行数组 + 取号 r 注入) | 分支 1:三行 w=2/1/1 逐一取 r=0/1/2/3;分支 2:行集 {w=0, w=2} 取 r ∈ {0,1};分支 3:单行 w=5 取 r ∈ [0,5);分支 4:r ≥ W | 分支 1:r=0/1 → 行 1(区间 [0,2))、r=2 → 行 2([2,3))、r=3 → 行 3([3,4)——W=4 边界号);分支 2:W=2、恒唯一非零行(0 权行取号前剔除、W 不含 0 权);分支 3:恒该行(合法极端——F1 裁定);分支 4:debug 断言(纯函数域;游戏通道内 r 恒 < W 由流构造保证) | F1 | -| AC-6 | b4_fog_gate 根(登记:雾池唯一活行 = 高档行 H〔tier ≥ T_fog_min〕、非雾池含低档行 L)+ b4_fog_gate_hot + R3 override | 分支 1:roll_board(清单含雾格);分支 2:对 σ = 0…31 逐一(scope 预推进)roll_board;分支 3:fog 布尔唯一输入构造(链开雾格);分支 4:T_fog_min=1 经 R3 override(运行时态、域内值)/ T_fog_min=8 且表无 tier8 行经烤入根 b4_fog_gate_hot | 分支 1:雾格身份 = H(单行退化判别——r 无关;雾格恒不出 tier < T_fog_min 行);分支 2:① 每稿雾格身份恒 = H(过滤谓词零泄漏——任何泄漏以 ≈w_H/W 概率现形);② 非雾格至少一次命中 tier < T_fog_min 行 L(证明非雾侧零过滤);登记值"非雾格 = L"降为诊断信息不作硬断言(加载规则强制 H 活 ⇒ 非雾池 ⊇ {H, L} 至少两行,单稿"= L"是概率断言,忠实实现也会假失败);分支 3:无 chain/dig 通道分支(A2 EC4 同待遇半——构造性);分支 4:T_fog_min=1 → 雾池 = 全池,雾格身份 ∈ 全体活行集(登记 σ 下 = 登记值——过滤退化合法,A4 约束①仅剩 AC-19 锚侧兜底);T_fog_min=8 → 加载致命(雾态池空——AC-17 pool_empty_fog 同类别;override 通道不触发加载校验) | F2 · A2 EC4 | -| AC-7 | b4_reroll 根(登记权重刀 w=1 / 其余 w=3;K=K_dmg、N=N_draft 表读值)+ b4_nofloor 根 + 登记 σ 参考轨迹表 | 分支 1:对 σ = 0…31 逐一(每 σ 全新服务+容器,先 `open_stream("reward_roll")` ×σ 丢弃预推进至 scope=σ——σ 到达机制)roll_board;分支 2:登记 σ*(参考算术判定首稿 0 刀)roll_board;分支 3:登记 σ**(首稿清图身份 = 刀 ∧ 格刀数 = 0)roll_board;分支 4:b4_nofloor 根(无刀行 ∧ K=0)roll_board | 分支 1:每提交板 \|刀身份格\| ≥ K(每板伤害供给下界保证的行为面);分支 2:提交映射 ≠ 首稿参考映射(草稿弃用、同 scope 续流重 roll);scope 计数器每 install 恒 +1(重 roll 不开新 scope——scope 语义 = install 批非草稿批);分支 3:仍重 roll(断言仅计格奖励身份——参考轨迹判别);分支 4:roll_board true、提交板 0 刀(K_dmg=0 = 关闭——C3 禁区默认值的行为面) | F5 | -| AC-8 | b4_floor_exhaust 根(manifest;safe_cell 池无刀行 ∧ K=1——每稿恒 0 刀) | `roll_board(b4_list_A)`;变体分支:b4_list_single(1 格)∧ K=2(R3 override 域内值) | N 次草稿后致命(权重配置错误 fail-fast);诊断含耗尽类别与草稿计数(N 表读值不写死);独立进程非 0 退出;变体:\|资格格\| < K 恒不过 → 同致命(F5 Output Range) | F5 | -| AC-9 | 两套全新 RngService+B4(同 master=42、同根 b4_reroll) | 同一定长序列驱动两遍(roll_board → query_identity 全格 → grant×2 → stock → use×1 → retire_mapping → roll_board〔新清单,scope+1〕→ grant_clear → clear_inventory → 全 query 面);分支 2:σ 与 σ+1 两板映射对照 | 两遍的映射投影、库存实例投影(含来源 {cell, round})、use 回执、流 scope 计数器轨迹逐项相同——同 σ 同流消费轨迹 ⇒ 同身份映射(含 F5 重 roll 分支)的确定函数性(D2 AC-15 的 B4 层前身);分支 2:σ 与 σ+1 的映射 = 登记相异对(新图新身份——E6 roll 半;库存延续半 = AC-13 分支 2) | Rule 2/10 · E6 | -| AC-10 | b4_golden 根、roll_board 完成 | 腿 1:`grant_clear()`;腿 2:两套同 σ 容器、grant_clear 前置调用序列互异再 grant_clear;腿 3:同批次再 grant_clear() | 腿 1:返回 = 登记清图身份 Φ(σ)(install 批尾一号——登记值含批尾位次假设:实现改批首取号即失配暴露);返回身份满足正当量(道具类 power ≥ 1 表读值 ∨ buff 类 effect_id 非空——条款④"清图奖励>0"的行级兑现面);腿 2:返回恒 Φ(σ)(身份 install 期已定、兑付期零 roll;图类型战斗域恒定不逐图重掷的判别形式——兑付期重掷将随前置序列漂移);腿 3:同一身份 + 诊断(兑付恰一次归 B1×③——E18) | F3 · Rule 6 · A3 条款④ | -| AC-11 | b4_clear_buff 根(clear_default 唯一活行 = defense_up,effect_id 非空——正当量成立)加载通过(加载校验不拒 buff 行) | roll_board → `grant_clear()` | 返回 {category=buff, effect_id=defense_up}(分流数据面);B1 调 B3 apply_effect 与运行时满层拒绝(零兑付 + "奖励未生效"明细行,合法例外口径)归 B1×②/B3,OOS;失衡预警④清图 buff 零兑付单独计数 = playtest 域 OOS | E13 · F3 | -| AC-12 | b4_golden 根、roll_board(b4_list_B〔4 格〕) 完成 | 腿 1:按规范序逐格 grant(连锁批量受理的冒烟构造序——B1 义务①同侧等价);腿 2:grant 返回快照与 grant 时表值对照;腿 3:同格再 grant | 腿 1:逐格返回 = 登记身份序列(受理序 = 规范序);buff 类格返回 {category=buff, effect_id}(B4 只定"给哪行"——层数语义归 B3 合并产生,施加经 B1 调 B3,Rule 3);道具类格(damage_item/heal_pack)返回 {category, power}(治疗包 = 道具类路由、非自动兑付——grant 不触发任何使用语义);即时类格(instant_aoe/instant_heal)同样返回 {category, power} 快照——grant 零路由差别,当场兑付的编排归 B1×②(B4 半 = 返回快照非库存语义);腿 2:返回的 power/effect_id = grant 时表读值(E10 快照时点 = grant——差分判别在 AC-15);腿 3:同一快照 + 诊断(受理恰一次归 B1×②——E18);满层起逐格"奖励未生效"行协议 = OOS B1×②(E3 后半) | Rule 3/7 · E3 前半 | -| AC-13 | b4_golden 根、roll_board + grant(道具格) 完成、冒烟(扮演 B1)stock ×N(N = 登记大数 64) | 腿 1:query_inventory;腿 2:retire_mapping() → roll_board(新清单) → query_inventory;battle_over(映射退役)后 query_inventory;腿 3:clear_inventory() → query → stock | 腿 1:恰 N 件、每件 {item_id, source{cell, round}, 快照投影}(来源归因保 P2——D1 窗口数据契约);N 件全部 InStock、零拒绝(数量无上限——Rule 4/E17,稀缺性由权重承载;无 cap API 负空间);腿 2:query_inventory 逐字不变(含来源——库存关卡域跨图且跨战斗延续,与映射生命周期正交;跨战斗构造 = 共享容器重 roll,切片连续关卡模式同型);映射退役后逐字不变(库存不再随战斗清空——义务⑤ 改写的行为面);腿 3:true、query 空(不跨关卡);此后 stock → false + 诊断(AC-3 分支 3 已载——注记) | Rule 4/5 · E6/E17 | -| AC-14 | b4_golden 根、库存含刀(damage_item)与治疗包各 ≥2 件 | 腿 1:`use(刀)`;腿 2:同句柄再 use;腿 3:use(刀) 于任意游戏态前置(含"道具段无存活敌"等价构造——B4 无敌态输入面,实现若存在存活/血量守卫则本分支失败);对照腿:use(治疗包) 同前置;腿 4:任意序 use 多件 | 腿 1:true + 回执 {category, power=该实例授予时快照值〔E14〕, source{…}};同 reward_id 多件实例回执 power 逐字相同(恒定表值非 roll 值——F4);实例状态 → Used;腿 2:false + 诊断(Used 不可逆);Used 实例 query_inventory 保留只读可查("已消耗未生效"行的数据面——B2 Dead 句柄同款);腿 3:恒 true + 标记 Used、零效果由 B1 判定(选定即承诺:已选刀照常消耗、逐件"已消耗未生效"明细行归 B1 编排读 B2 存活集〔义务④〕+流水,OOS);相位守卫不在本分支豁免域——Unrolled/Cleared/Retired 相位的 use 照旧 false + 诊断(同输入同答案);use(治疗包) 同样无条件受理(满血守卫归 B1 编排读 B2 hero hp——F4/义务④;"拒绝不烧包"半 = B1 不调 use 的编排纪律 + usable_now 预判呈现,OOS);腿 4:每件独立受理、Used 序 = 调用序(窗口选用序的 B4 半——选择收集归 D1×②、段内细则归 B1×①;同窗顺序多包的逐件动态守卫归 B1×④) | Rule 5 · E9/E10 | -| AC-15 | b4_golden 根 roll_board + grant(道具格) + stock 完成(已授予实例)、另设未授予格(映射中 reward_id 引用) | 经测试通道换根加载 b4_reloaded(`load_tables(root, collect_only=true)` 直调——非 D2 `reload()` 路径,门语义归 D2 AC-16/B1,B2 AC-11 同款);再对未授予格 grant;分支 3:对返回快照投影原地改写;分支 4:换根后 use(已授予实例) | 已授予实例快照投影逐字不变(授予时冻结);未授予格 query_identity 的 reward_id 不变(映射仅持引用——热重载拒绝门 D2 EC8 的 B4 侧纵深);对未授予格 grant → 返回漂移后表值(快照时点 = grant——引用非活值的判别后半);分支 3:容器内实例投影不变(快照拷贝非活引用——B2 AC-11 分支 3 同款);分支 4:回执 = 授予时快照值非漂移值(AC-14 腿 1"快照值"措辞的行为级判别) | Rule 9 · E14 | -| AC-16 | RewardTable schema 类(行级 + 跨字段)class_name 直引实例(不经 load()/preload()) | `validate()` 作用于越域代表值:category ∈ {resource, aux_item}(预留值拒绝——B2 pattern 先例)、pool_tag = "clear_fog"(clear_ 命名空间预留拒绝——Rule 6,A1 elite_ 同款)、pool_tag = "nonsense"(未知枚举)、use_timing ∉ {pre_settlement}、weight ∈ {−1, 1000}、tier ∈ {0, 9}、power ∈ {−1, 1000}、跨字段 buff 行 effect_id 空(buff⇒必填)、跨字段非 buff 行 effect_id 非空(非 buff⇒恒空)、跨字段 item 类 power=0(damage_item/heal_pack ⇒ power ≥ 1——F4 加载校验);再作用于域内代表值:weight=0、buff 行 power 任意、tier ∈ {1,8}、item 类 power ∈ {1,999} | 越域各含对应域错误类别(零静默);域内零诊断(防过度约束锁死内容——weight=0 与 buff 行 power 不校验是承重点) | Rule 1/9 | -| AC-17 | 致命根 ×8(独立进程、游戏通道——D2 AC-2b 协议):b4_pool_empty_safe(safe_cell 全 0 权)/ b4_pool_empty_fog(全行 tier < T_fog_min——雾态空)/ b4_clear_empty(clear_default 池空/全 0 权)/ b4_clear_no_value(clear_default 唯一活行 = power 0 道具行——恒非空的可判定形式,A3 条款④表侧兑现)/ b4_no_live_buff_row(safe_cell 有活行但零活 buff 行——tier_min_buff 无定义,F1 对偶致命)/ b4_dangling_effect(buff 行 effect_id = "ghost_buff"——B3 StatusEffectTable 无此行;条件性夹具:默认根已含 effect_id 引用行 ⇒ 悬空校验已激活——dangling_ref_policy 首引兑现点)/ b4_floor_supply(K_dmg ≥ 1 ∧ safe_cell 池无 power ≥ P_min 活刀行——F5 加载护栏 (i))/ b4_nodamage(K_dmg = 0 ∧ 全池零活刀行——F5 加载护栏 (ii) 零伤害世界后闸,B2 OQ9 并案) | 各根经 `--data-root` 注入加载(collect_only=false);对照腿:默认根加载 | 各进程非 0 退出且错误清单含对应类别;默认根干净通过(引用全解析——defense_up 存在) | F1/F3/F5/F6 · E13 | -| AC-18 | ConfigDB 默认根加载;分支 2:b4_attackup_row 根(safe_cell 追加 attack_up 引用行) | 读 RewardTable;分支 2:该根加载 → roll_board → grant(attack_up 格) | category 值域 ⊆ {buff, damage_item, heal_pack}(三值封闭定值);pool_tag 值域 ⊆ {safe_cell, clear_default}(MVP 二值封闭定值);clear_default 池 ≥1 正当量活行(默认根通过自身表级校验的行为断言——AC-17 对偶);权重比例与数值不作定值断言(provisional 归 C3);默认根当前不含 attack_up 行 = 内容态事实、非结构禁止(随奖励改造批重审);分支 2:加载通过、roll_board/grant 正常受理(授予 buff 行 = {category=buff, effect_id=attack_up} 快照——消费于主角战斗段先手攻击,B1 域 OOS;B2 AC-14 的 atk 域断言跨引) | Rule 1 · E16 · F4 | -| AC-19 | 默认根加载(或调参后根——对账随内容态重跑) | `equivalence_supply()`;分支 2:fog 池最低档活行 tier 推导对账 | 返回全活行投影(F6 扩面)与 tier_min_buff = min{活 buff 行 tier}(默认根 = defense_up_basic 行 t=2——登记对账常数;行集空 → 加载致命,AC-17 no_live_buff_row 已载);分支 2(A4① 锚对账——档位序检查):fog 池最低档活行 tier(min{tier : weight>0 ∧ tier ≥ T_fog_min},均表读值推导)≥ tier_min_buff(约束①"雾内奖励档位下界 ≥ 最低档安全格 buff 当量"的 B4 侧可判定形式 = 档位序检查——真当量换算归 B1 条款①对照表〔未设计〕,落定后本分支升级为当量对账〔缺口预检 2〕;当前内容态不等式成立为登记对账记录,C3 调参后须重跑——登记对账对 (knife_adv, attack_up_basic) 漂移检测;锚参照对象 = attack_up 当量,attack_up 入池时 tier_min_buff 重算、对账对随批重制;两行互异 = 非平凡判别——判据名"档位序检查"已入 registry terminology;tier 与当量零耦合的假阳性边界见 F2 注记);A4 约束②③ = MVP 结构性不可闭合/静默绿灯风险——依赖节显式宣告 + B1 检查点——OOS | F6 · A4① | -| AC-20 | ConfigDB 默认根加载完成 | 脚本解析 `design/registry/entities.yaml` | ① rng_service.scope_event_binding 的 reward_roll 语义 = "每次 board install(格奖励批 + 清图奖励批)"(Rule 2 的回写落点——AC-1 scope 观测面的登记侧);② stream_seed_derivation.golden_vectors 含 reward_roll m=42 scope0 向量(derive_at 测试通道的登记前提);③ variation_table.pricing_constraints 注记存在(A4 三约束为 B4 验收项的登记);④ status_effect.dangling_ref_policy 注记含 "B4 RewardTable 首个 effect_id 引用" 条款(AC-17 条件性夹具激活条件的登记侧)+ status_effect.anchor_warning / clause3_supply.direction_precheck 含 attack_up 参照回迁注记(registry 同批回写);⑤ reward_table 条目 fields 九键(reward_id/category/effect_id/display_name/power/weight/pool_tag/tier/use_timing)与 ConfigDB RewardTable schema 字段名逐一相等、MVP 内容注记与默认根行集一致(与 AC-18 对账);⑥ reward_config 条目存在,fields 四键(t_fog_min/k_dmg/n_draft/p_min)与 ConfigDB RewardConfigTable schema 字段名逐一相等;生效前提 = 回填完成(不写"若存在"软口径——条件化使一致性检查落空,B2 AC-16 同款);边界:本 AC 断言 registry 登记面——D2 GDD 正文(Core Rule 5 / Interactions B4 行)与 registry 的对齐 = delta 复核对账项(缺口预检 4——GDD 散文不进自动化断言面) | Rule 9 · 接口漂移登记 | -| AC-21 | B4 文件集(映射容器/库存容器/RewardTable schema/roll 与保底逻辑/冒烟脚本/夹具规格)纳入 D2 AC-9 模式项目级扫描域成员清单(owner Technical Setup——B3 先例;本条分支 1 承载登记义务,清单更新 = Technical Setup 门禁项,缺口预检 7) | 静态扫描 | randomize() / RandomNumberGenerator / 自建 RNG 零命中(零随机出 roll_board 一线——唯一 RNG 入口 = open_stream("reward_roll"));ConfigDB 外 data 表加载零命中(schema 直引实例化豁免——AC-16 前提);extends Control / .tscn preload 零命中(Core 层零 UI 债——headless 实跑 AC-1 合成判定);A2 事件订阅 API 零命中(Rule 10 零主动订阅);B2/B3 API 符号零引用(相邻零运行时依赖——含冒烟脚本;StatusEffectTable/HeroTable 经 ConfigDB 表读合法、API 引用非法);重掷类命名扫描(reroll/resign/rebind 等——Rule 8 负空间,warning 级 + 人工复核,D2 AC-14 纪律同款);零随机的行为级硬证据 = AC-9 | Rule 10 | - -### 覆盖矩阵 - -| 类别 | 映射 | -|---|---| -| Core Rules | 1→AC-16/AC-18 · 2→AC-1/AC-9/AC-10(恰一次编排→OOS B1×⑥)· 3→AC-12(施加与满层零兑付协议→OOS B1×②+B3 跨引)· 4→AC-13 · 5→AC-14(段序/窗口时机/满血守卫/零效果判定→OOS B1×①④;窗口呈现→D1×②)· 6→AC-10/AC-11/AC-16(clear_ 拒绝)/AC-17 · 7→AC-12 分支 1(道具类路由)/AC-14 分支 3(满血守卫→OOS B1×④;clamp→E12 OOS)· 8→AC-2/AC-15(未开格呈现→OQ2/A5+D1)· 9→AC-16/AC-17/AC-18(接口漂移回写→AC-20①⑤)· 10→AC-9/AC-21(调用权集中→OOS B1×①–⑥) | -| Formulas | F1→AC-1/AC-5(+AC-9 轨迹)· F2→AC-6(+AC-19 锚侧)· F3→AC-10/AC-11/AC-17 · F4→AC-14(恒定表值供给面)+AC-18(attack_up 行合法性 = 复活口径)——施加/clamp/守卫/不吃修正纪律→OOS B1×④ · F5→AC-7/AC-8/AC-17(加载护栏 ×2)· F6→AC-19(闭合归 B1——OOS) | -| Edge Cases | E1→AC-4 · E2→AC-3 分支 2+OOS B1×⑤(零明细行半)· E3→AC-12(受理序半)+OOS B1×②(行协议 + 聚合计数半)+B3 AC 跨引(apply false 原子)· E4→AC-3 分支 1/2 · E5→AC-1 分支 3 · E6→AC-9 分支 2(roll 半)+AC-13 分支 2(库存半)· E7→AC-3 分支 3/4 · E8→API 负空间(无强制使用入口——不可 G-W-T,B3 Rule 8 先例)+OOS D1×② · E9→AC-14 分支 2 · E10〔照常消耗〕→AC-14 分支 3(B4 半)+OOS B1×④(零效果判定+"已消耗未生效"行+击杀结果流水)· E11〔清图 buff〕→AC-11(B4 半)+OOS B1×② · E12→OOS B1×④(clamp)+AC-14 分支 1(power 供给)· E13→AC-17(b4_dangling_effect 条件性夹具)· E14→AC-15 · E15→OOS B1×①(授予先于判定的段序半)+AC-10 分支 2/AC-13 分支 3(可构造序弱承载注记)+OOS D1×③⑤(消亡语境注记)· E16→AC-18 分支 2(attack_up 行合法——复活口径)· E17→AC-13 分支 1/2 · E18→AC-12 分支 3/AC-10 分支 3 · E19→API 面(清单外 null/false + 诊断)· E20→API 面(stock 受理域封闭)· E21→API 面(枚举序 = stock 受理序——D1 呈现序契约) | -| 上游承接 | A4①→AC-19 分支 2(夹具对账型,升级缺口预检 2)· A4②③→MVP 休眠显式宣告(依赖节)+ OOS B1 强制检查点 · A3 条款④恒非空→AC-10 分支 1(兑付面)+AC-17 分支 4(表侧)· B3 dangling_ref 首引激活→AC-17 分支 6+AC-20④ · 奖励身份预读→AC-2/AC-15(呈现→OOS D1×①)· attack_up 行合法性→AC-18 分支 2(复活口径)· A3 条款⑤支配性→OOS B1 强制检查点(预警⑤⑧观测) | -| 覆盖口径 | 21 条 EC 中 E8/E15 两处非 G-W-T 形态,分别以 API 负空间与 B1×① 段序 deferral 承载(B2 EC5/EC13/EC14 豁免先例同款);其余全部映射 AC 或显式 OOS(deferral 生效条件 = B1×6/D1×5 义务清单登记);"负空间"学说的边界如实登记:封闭枚举防住"没有的入口",不自动防住"有入口、语义未裁"——E18–E21(重复受理族/清单外坐标/stock 域/枚举序)为评审批补裁的输入域语义;今后新增 API 入口须随附全输入域语义表(实现期 ADR 检查项) | - -### 缺口预检(11 项——每项标 owner 与时机) - -| 编号 | 缺口与处置 | owner | 时机 | -|---|---|---|---| -| 1 | 【阻塞级】B1 编排半整体 deferral:段序骨架(授予>窗口>增益/减益>道具>战斗>衰减>判定——窗口锚点 = 授予段后)、窗口选择序回放输入、满血守卫(拒绝不烧包)+ 同窗顺序多包逐件动态守卫、零效果判定与"已消耗未生效"行、击杀结果进流水、"奖励未生效"行 + 聚合计数、治疗 clamp、clear_inventory/retire/roll_board 恰一次编排——B4 冒烟全部以构造序扮演、编排正确性零断言;E10 的 B1 侧承接(读 B2 存活集做零效果判定)尤须逐字核对 | B1 GDD(义务清单 6 项,缺项即 blocking) | B1 门禁评审 | -| 2 | 【阻塞级】A4① 当量升级与②③状态:AC-19 分支 2 为档位序检查——真当量换算依赖 B1 条款①对照表(未设计);②在 MVP 结构性不可闭合(依赖节显式宣告——非常量池无法随雾负担上浮)、③静默绿灯风险;激活载体 = clear_ 插槽(垂直切片) | B1 | B1 GDD 强制检查点 + 对照表落定/每次调参时核对(F2 验收锚口径)+ clear_ 激活时重启② | -| 3 | T_fog_min 推导式悬置(OQ5):表值默认 2 provisional——B1 对照表落定后改推导式或维持表值;若改动,AC-6 夹具(b4_fog_gate tier 布置与 override 分支)及登记轨迹重制 | B1 | OQ5 关闭 | -| 4 | registry/D2/索引/game-concept 回写(评审批已兑现):reward_roll scope 语义改写(registry + D2 正文两处补同步——AC-20① 生效前提)、锚参照迁移三处传播(systems-index 注记 / registry anchor_warning / clause3_supply.direction_precheck)、game-concept 三处 MVP 口径注记、systems-index 分层行 B4←D2 + 门禁块同步——delta 复核时逐处对账 | 本 GDD 评审批 | 已办,delta 复核确认 | -| 5 | attack_up 复活连锁(OQ1)——已兑现:基础攻击恒存在(HeroTable.atk 域 [1,999]、0 加载拒绝)→ attack_up 复活,消费者 = 主角战斗段先手攻击(B1 GDD 同批修订);AC-18 改承载 attack_up 行合法性、AC-19 锚参照回迁 attack_up 当量、registry anchor_warning/direction_precheck 同批回写;残余 = attack_up 是否入默认根池(随奖励改造批,C3) | C3(残余入池裁决) | 已兑现;残余随奖励改造批 | -| 6 | 登记常数随调参重制流程:b4_golden 冻结权重与默认根解耦,但 T_fog_min/K_dmg/N_draft/P_min/默认根行值调参 → AC-19 对账(对账对 (knife_adv, attack_up_basic) 漂移检测)、AC-6 分支 4、AC-18 结构断言须重跑;C3 调参流程若无"登记常数与对账重制"步骤则相关 AC 假失败 | C3(调参)+ qa(重制) | 每次调参 | -| 7 | B4 扫描域成员清单登记:AC-21 分支 1 的生效载体 = D2 AC-9 项目级 CI 扫描域成员清单更新(B3 先例) | Technical Setup | B4 GDScript 产物落地即登记 | -| 8 | 参考算术工具锚定:期望映射 Ψ(σ)/Φ(σ)/重 roll 轨迹的手工推导需"播种生成器取号序列"参考算术——D2 仅登记 scope 种子向量(未登记逐号序列黄金向量);参考算术以冒烟脚本内置、版本库登记,正确性以 D2 AC-3 种子向量 + AC-5 区间算术手工核验锚定;生成器取号约定(如 `randi % W` vs `randi_range`)为实现期 ADR 事实,定名时同步登记;登记后第二人独立推导复核(A2 OQ3 同型)+ b4_reroll 可达性拆分复核(首稿零刀可达/耗尽稀有——失效即重制夹具) | qa/Technical Setup | 冒烟框架搭建 + 实现期 ADR | -| 9 | D1 呈现义务 deferral:预读呈现(含库存常读条)/使用窗口(含 usable_now 呈现与触发政策)/四类明细行呈现/H2 强调/清空反馈不可 G-W-T——deferral 生效条件 = D1 义务①–⑤登记(缺项即 blocking) | D1 | D1 GDD | -| 10 | C3 调参期批量仿真:F5 概率性致命带(合法权重下 N_draft 耗尽概率随 K/池构成可达非平凡值——种子轮盘)→ 调参流程须含批量仿真(刀供给分布 × A1 板分布的可行率),把配置错误暴露在调参台;与预警①–⑧预注册合并执行候选 | C3 | 每次调参 + playtest | -| 11 | 方向预检输入缺口:刀供给方向预检的 \|资格格\| 分布待 A1 actuals p10/p50 → 落地后重跑(方向预检表登记对账记录);max_hp=50 原型锚出处建议随 B2/D2 回写补登 | C3/B2 | A1 actuals 交付 | - -## 开放问题(OQ) - -| 编号 | 问题 | owner | -|---|---|---| -| OQ1 | attack_up 入池裁决(复活已闭合,残余入池问题):基础攻击恒存在(B2 Rule 9)→ attack_up 复活、消费面 = 主角战斗段先手攻击;attack_up 行是否进入默认根 RewardTable 池随奖励改造批裁决(复活批不擅自入池);A3 条款 2 锚参照对象已回迁 attack_up 当量(F4 口径后果) | C3 | -| OQ2 | 未开格身份呈现深度:MVP 不呈现(Rule 8);A5 探测道具零成本桥接(身份 install 期已定可查);呈现深度(类别/档位/身份)待 A5 定稿 | A5+D1(垂直切片) | -| OQ3 | items_per_settlement_cap 启用裁决:Tuning Knobs 结构位默认关;启用即限制(过低锁死 3 单位 54 击杀需求胜局——economy-designer 警告) | C3 playtest | -| OQ4 | 关卡末剩余道具折算(关内延续裁决后重述):"战斗结束库存清空"的体验负债主体闭合(库存关卡域:跨战斗延续、未选用件不再随战斗消亡;层间延续可见反馈已入切片);残余 = 关卡末剩余道具折算/继承结构位(转金币/继承——Alpha,C2;清空前快照计数已作为折算数据面预留) | C2/D5(Alpha) | -| OQ5 | T_fog_min 推导式:依赖条款①对照表(未设计,加载期循环依赖不可行);落定后改推导式或维持表值(F2,默认 2 provisional) | B1 | -| OQ6 | weaken 锚裁决联动:B3 OQ1 归一口径裁决前置(瞬时 vs 总暴露);若落"总暴露"读法则 B4 重定最低档参照(registry anchor_warning;F6 供给已备行值清单与量纲建议) | B1 | -| OQ7 | 失衡预警预注册归口:预警①–⑧ 阈值与样本量 provisional;与 A3 OQ3、原型 v3 终验 playtest 合并执行候选 | C3/playtest 会话 | - -## 版本历史 - -| 版本 | 日期 | 改动 | -|---|---|---| -| C3 修订批回写 | 2026-09-14 | /design-review C3 修订批(X-9 回执,registry 同批回写):**clear_blast 清图槽换位**(原 clear_knife 入库刀→instant_aoe p40 当场兑付全体存活敌、不入库不占可选类供给、完美 ×2)· **K_dmg 默认 1→0 + "C3 禁区默认值"条款解除**(刀保底语义由供给控制器战斗首件保证取代,no_damage_row 后闸保留)· **RewardConfigTable +2 参数**(active_p0=0.4 / active_decay=0.5)+ pool_tag 枚举增 active_inject · **供给控制器机制本体承接登记**(RewardSupplyController——install 期注入,E[战斗获取]≈1 标定目标)· 默认根行集重登记(减伤墙批 defense 24→16 + 注入池权重 60/30/10);B1 条款⑤计价基元随换位重推(C = power = 40——clause5_dominance.c3_ruling) | -| v1-lean | 2026-09-13 | lean 格式迁移:legacy 原稿按 B1 lean 样例重排——修订注记出正文收敛至本表;散文/枚举/边界情况/义务清单/失衡预警/覆盖矩阵/缺口预检/AC 全部转表格;流程转字符画;F1–F6 公式、Variables、验算数据与 21 条 AC 全保留;语义与 2026-09-12 对齐状态一致,零规则变更 | -| 摘要同步 | 2026-09-12 | 六处旧口径摘要对齐关卡域权威版(Interactions D1/B5 行、边界情况、依赖、Tuning Knobs、Visual/UI、覆盖声明)——零语义变更 | -| 两级奖励批 | 2026-09-11 | 用户裁决:奖励按交付轴两类(即时 75% / 可选 25%,枚举扩至五值);库存生命周期改关卡域(跨战斗延续、关卡末清空——原战斗域口径退役);治疗两级稀缺化(heal_pack 权重 6%、power 12);道具使用窗口单件制;buff 时长改当次结算(attack_up/defense_up D=1);attack_up 复活(HeroTable.atk 基础攻击恒存在、域 [1,999]、0 加载拒绝)——默认根八行重登记、F5 供给闸 P_min=8、AC-18/AC-19 改写、锚参照回迁 attack_up 当量 | -| full design-review 修订 | 2026-09-09 | 五专员对抗 + creative-director 终审 NEEDS REVISION——14 条 blocking 同日修订核销:道具使用窗口锚点移至授予段后(当轮拾取当轮可用)、B4 配置值落 RewardConfigTable、D1 义务 3→5 扩容、E18–E21 输入域语义补裁、reward_roll scope 语义改写回写(registry/D2 同步)、失衡预警重校准(①拆短缺/浪费双指标、④按吸收上限重推、⑤补雾板分层、新增⑥⑦⑧)、缺口预检 11 项;CD 情绪定位终审与预读/寻路 MVP 呈现面如实降级同批落位;待 delta 复核放行 | -| v1 | 2026-09-09 | lean 门禁一次会话定稿(systems-designer / qa-lead 代理起草):F1–F6 + 21 条 AC + B1/D1 义务清单 + 失衡预警预注册落位;核心拍板——奖励身份 install 期预分配、结算段序(增益/减益 > 道具 > 战斗)、奖励分流与幂等受理、RewardTable/RewardConfigTable schema | diff --git a/design/gdd/legacy-2026-09-14-v1/c2-adventure-structure.md b/design/gdd/legacy-2026-09-14-v1/c2-adventure-structure.md deleted file mode 100644 index b7fbd148..00000000 --- a/design/gdd/legacy-2026-09-14-v1/c2-adventure-structure.md +++ /dev/null @@ -1,316 +0,0 @@ -# C2 冒险结构(Adventure Structure) - -> **状态**:Approved · lean 格式 -> **版本**:v1 · 2026-09-14 · 作者:DK + design-system -> **承载支柱**:P4 地牢下探的探险氛围(主——序列推进 = 不断下探更险的层)· P3(恢复点/囤积决策的冒险级容器)· P1("这局我到第几层"的冒险级对照物) -> **一句话**:C2 管一次冒险的骨架——关卡序列怎么排、通关给什么、死了怎么重来;位于 C1 关内行进之上、B1 战斗结算之下。 -> **复核注记**:v1 solo 出稿 → 经 /design-review(--solo 快速审批)APPROVED(0 blocking / 3 recommended——recommended 随下次修订批执行);专员/总监代理未咨询——生产前人工复核保留。评审日志:`design/gdd/reviews/c2-adventure-structure-review-log.md`。 - -## 速览 - -| 关键问题 | 答案 | -|---|---| -| 定位 | 冒险/序列层编排:冒险生命周期、关卡序列、跨战斗 HP 账本、关卡大奖励、失败重开——C1 关内行进的上层结构,B1 战斗结算的入参供给方 | -| 拥有 | 冒险状态机与结果语义 · 关卡序列定义(LevelTable 行集内容 owner + 推进规则)· HP 账本(跨战斗持久性的 C2 半边兑现)· 关卡大奖励 · 失败重开语义 · master_seed 接线(冒险 = 种子域单位)· 冒险摘要 | -| 不拥有 | 关内节点行进与节点兑付触发(C1)· 战斗结算与关卡清库调用(B1)· 奖励内容与库存语义(B4/C3)· 数值曲线(C3)· 代币持久化与天赋(C4/D3)· 呈现(D1) | -| 上游输入 | C3 期望表与带锚(逐关通关率带 = 序列难度排布)· C3 L2 深度轴行值(序列行集扩展随批填充)· D2 LevelTable schema / ConfigDB / RngService · B1 出口分发语义(level_clear 上层调用面) | -| 下游输出 | 给 C1 的接口契约四件套 · begin_battle 入参供给(关卡序号 / hero_hp / 上限覆盖值)· 冒险摘要(C4 代币入账与 D3 快照的消费位) | -| 硬约束 | 零随机(零流消费、单一种子注入点)· 序列覆盖(冒险关数 ⊆ 表内容覆盖——越界关卡 = 内容生产缺口)· 死亡即冒险终(Roguelike 语义已锁)· 不碰库存域(关卡末清库由 C1 收束点触发 B1 level_clear) | - -## 体验锚点 - -| 支柱 | 关键词 | 机制承诺 | -|---|---|---| -| P4 下探节奏 | "又清完一层,再往下" | 序列推进 + 关卡大奖励 = 下探途中的喘息台阶;每关一个可命名的新层(display_name),难度台阶可感知(雾解锁 / 数值跳升 / 通关率带下移) | -| P3 恢复点囤积 | "Boss 前把血囤满" | HP 账本跨战斗延续 + 恢复点节点按比例回血——血是冒险内唯一带得走的资源,恢复点位置就是决策压力点 | -| P1 冒险级掌控 | "这局我到第二层" | 冒险摘要(到达层 / 通关数 / 代币记账)给每次死亡一个可对照的坐标;重开 = 新种子新局面,不是同一关的复读 | -| 锚点时刻 | "这层清完了" | Boss 倒下 → 大奖励兑付 → 下一层开门的节拍;死亡 → 摘要结算 → 一键再来 | - -## 全局流程 - -### 冒险生命周期 - -``` -新冒险(Idle) - │ ① reseed(master_seed)——RngService 种子注入,冒险域单位恰一次 - │ ② HP 账本置满 · 序列位置 = 1 - ▼ -start_level(1) ──► 关内行进(C1 域:节点链逐节点推进) - ▲ │ - │ ├─ battle/boss 节点 ─► C1 组装 begin_battle(L, D, hero_hp, override) → B1 - │ ├─ reward 节点 ─► B4 节点奖励入库(关内域库存) - │ └─ rest 节点 ─► C2 账本恢复(比例 = rest_heal_pct) - │ │ - │ 关卡收束点 = Boss 战胜利 ∨ 英雄死亡 - │ │ C1:调 B1 level_clear(库存关卡域清空 + 快照计数) - │ ▼ - │ level_end{result: cleared | defeated}(C1 → C2) - ├────────────────────────────────────────────┐ - │ cleared 且当前关 < N │ defeated ∨ abandoned - │ ▼ │ ▼ - │ 关卡大奖励(上限提升 · 血回满 · 代币记账) │ 冒险失败结算 - │ ▼ │ - └─ start_level(L+1) │ - │ │ - └─ cleared 且当前关 = N ──► 冒险完成结算 │ - │ │ - ▼ ▼ - 冒险摘要 → Idle(重开 = 全新一轮) -``` - -| 出口 | 触发 | 动作序列 | 约束 | -|---|---|---|---| -| 下一关 | level_end(cleared) 且当前关 < N | 大奖励兑付 → start_level(L+1) | 大奖励在清库之后(C1 收束点已先调 B1 level_clear) | -| 冒险完成 | level_end(cleared) 且当前关 = N | 冒险结算(不再发上限提升——没有下一战可受益) | 摘要标记 run_completed | -| 冒险失败 | level_end(defeated) | 冒险结算 | 库存已由收束点清空;血条归零即终 | -| 冒险放弃 | 玩家发起、非战斗期受理 | 冒险结算(结果 = abandoned) | 已获大奖励不追回;与失败同型 | - -## 核心规则 - -| # | 规则 | 要点 | 依据 | -|---|---|---|---| -| 1 | 冒险从第一关开始,倒下即终、清完末关即成 | 冒险 = 从序列第 1 关起步的完整一轮;关卡通关(Boss 战胜利)→ 自动进下一关;末关通关 = 冒险完成;任意战斗死亡 = 冒险结束。MVP 线性序列——无跳关、无回头路 | game-concept 冒险语义;C3 Boss 通关编排归属(C1/C2 域) | -| 2 | 每关是一条预置节点链,冒险关数不得超出表内容覆盖 | C2 为 LevelTable 行集内容 owner——链 = 战斗/奖励/恢复/Boss 节点依序排列、Boss 恒为末节点;战斗节点深度 = 前序战斗节点计数(Boss = Dmax);冒险关数 = 行集关数,加关 = 内容批(链行 + 敌我数值 + 变异解锁同批落,禁止只加序列不加内容);序列难度排布消费 C3 通关率带(L1→L2 带下移 + 雾解锁台阶) | D2 跨表校验;C3 期望表与 OQ1;A4 unlock_level=2 | -| 3 | 主角一条血走完整个冒险,关卡只换地图不换血条 | 账本收支四口——冒险开始置满 / 每战开始交出 / 战后收回 / 恢复点与大奖励入账;关卡切换零结算(血条跨关延续);血 = 冒险内唯一跨战斗资源(buff 战斗域清、库存关卡域清、RAP 战斗域清) | B2 hp_persistence 归 C1/C2;B1 begin_battle 入参;B4 关内延续同构 | -| 4 | 清完一关,下探前发一次大奖励:上限提升加回满 | 兑付时点 = 关卡收束清库之后、下一关开始之前;构成三件——HP 上限提升(+level_clear_hp_bonus)、血回满、代币记账加一份;不进背包不占库存域;末关通关不兑付 | B4 库存关卡域裁决;C3 区间平移换算率;C4 记账位 | -| 5 | 主角死亡冒险即终,重开是全新冒险不是关卡重试 | 失败 = 冒险终(无关卡重试、无检查点——Roguelike 语义已锁);重开 = 全新一轮(新种子 / 第 1 关 / 满血 / 空手);中途放弃与失败同型结算(已到手的保留);保留面 = 冒险摘要,清零面 = 账本 / 库存 / 种子域 | game-concept"死亡则冒险结束";A3 RAP 战斗域生命周期 | -| 6 | 一次冒险一粒种子 | 种子注入时点 = 冒险开始恰一次;冒险内雷图生成 / 奖励抽取 / 遭遇掷骰全部派生自该种子;冒险内不重置(切片逐关播种为其无冒险层的历史简化,本条转正为冒险域单种子);冒险可复现域 = master_seed + 三流计数器 | registry rng_service 快照契约;D3 消费方 | -| 7 | 关卡收束在关内宣布,冒险层只接结果 | C1 拥有关内一切行进(节点移动 / 兑付触发 / 战斗发起——参数组装:深度取链位、关卡序号与血条取 C2 下放);收束点(Boss 胜或死亡)C1 先调 B1 level_clear、再向 C2 宣布结果;C2 零战斗域直调、零库存域直调 | B1 出口分发"关卡结束 = 上层显式调用";切片 level_runner 先例转正 | - -#### 规则 2 细则:深度标号与覆盖 - -| 项 | 语义 | -|---|---| -| 节点类型 | battle / boss / reward / rest——reward、rest 不占深度、不查战斗表;battle、boss 占深度 | -| 深度标号 | 战斗节点深度 = 该节点之前(含同链)已排 battle/boss 节点数,从 0 起计;Boss 恒为链末节点且深度 = Dmax | -| 链模板(MVP) | battle(D0) → battle(D1) → reward → battle(D2) → battle(D3) → rest → boss(D4)——每关 7 节点 5 战斗深度;L1/L2 同构复用,模板修订随内容批 | -| 覆盖义务 | 冒烟断言:行集内每个 battle/boss 节点 (L, D) 在 enemy / board_gen 两表存在精确行(D2 跨表校验复用 + 序列关数断言)——序列关数 ⊆ 内容覆盖,越界 = 内容生产缺口 | -| 生效前提 | N=2 行集扩展前提 = C3 L2 深度轴行值填充批落地;未填充期冒险以单关行集运行(N=1 合法态——切片现状) | - -#### 规则 4 细则:大奖励构成 - -| 件 | 内容 | 载体 | 数值 | -|---|---|---|---| -| 上限提升 | max_hp_eff += level_clear_hp_bonus(冒险内生效——经 begin_battle 覆盖值传入后续每战) | C2 账本 + AdventureTable | +10 provisional(C3 区间平移换算率锚:+10hp ≈ +1 轮) | -| 血回满 | HP 账本 = 提升后 max_hp_eff | C2 账本 | 结构定式(非 knob——与 C3 满血开局校准口径闭合) | -| 代币记账 | tokens += token_per_level | 冒险摘要 | 10/关 provisional(消费方 C4) | - -#### 规则 7 细则:C1/C2 编排边界(给 C1 的接口契约——C1 GDD 强制输入) - -| 接口 | 方向 | 载荷 | 时点 | -|---|---|---|---| -| start_level(level_index, ctx) | C2 → C1 | ctx = {level_index, hero_hp, hero_max_hp_eff} | 冒险开始 / 每次关卡推进 | -| report_battle_end(hp) | C1 → C2 | 战后英雄 HP 终值(胜负皆报) | 每场战斗结束后 | -| heal_clamped(pct) | C1 → C2 | rest 节点恢复请求(比例取关卡行 rest_heal_pct) | 恢复点节点兑付 | -| level_end{result, hp, node_index} | C1 → C2 | result ∈ {cleared, defeated}(C1 已先调 B1 level_clear) | 关卡收束点 | -| 冒险放弃(abandoned) | D1 → C2 | 无载荷 | 非战斗期受理(MVP 无 UI 入口——语义预留) | -| 战斗发起组装 | C1 编排 | begin_battle(L, D, hero_hp, hero_atk, hero_max_hp):L / hero_hp / hero_max_hp 取 C2 下放,D 取链位,hero_atk 传表值通道(MVP 冒险内不提升攻击) | battle/boss 节点行进至 | - -## 枚举 - -### 冒险结果(封闭枚举) - -| 值 | 触发 | 摘要标记 | -|---|---|---| -| completed | 末关 level_end(cleared) | run_completed = true | -| failed | level_end(defeated) | run_completed = false | -| abandoned | 玩家放弃(非战斗期) | run_completed = false | - -### 关卡收束结果(封闭枚举) - -| 值 | 触发 | 后续 | -|---|---|---| -| cleared | Boss 节点战斗胜利 | 末关判定 → 大奖励 + 推进 / 冒险完成 | -| defeated | 任意战斗英雄死亡 | 冒险失败结算 | - -### 冒险摘要(结算产出,消费方 C4 / D3 / playtest 日志) - -| 字段 | 类型 | 语义 | -|---|---|---| -| run_completed | bool | 冒险是否打穿序列 | -| levels_cleared | int | 已通关数(代币记账乘子) | -| level_reached | int | 止步关卡序号(失败 / 放弃时 = 当前关) | -| tokens_recorded | int | levels_cleared × token_per_level | -| master_seed | int64 | 本冒险种子(复盘 / 快照域标识) | - -## 数值结论与推导 - -> C2 是结构系统——运行时零新增公式,以下为账本结算式与设计期合成式;全部数值 provisional,调参所有权见 Tuning Knobs。 - -### F1 冒险通关率合成(设计期工具式) - -**结论**:P(冒险通关) = Π P(L_i 通关);MVP N=2 合成带 = [6%, 20%](L1 [30,50]% × L2 [20,40]%)——冒险长度即难度总闸。 - -#### 推导 - -``` -P_run = Π_{i=1..N} P(L_i) (逐关独立满血开局口径) -``` - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 各关通关率 | P(L_i) | float | (0,1) | C3 期望表逐关目标带(L1 [30,50]% / L2 [20,40]% / L3+ [10,25]% 预留) | -| 冒险关数 | N | int | [1, 行集关数] | LevelTable 行集关数——MVP 2 | - -| 验算 | 读数 | 判定 | -|---|---|---| -| N=2 合成 | [0.30×0.20, 0.50×0.40] = [6%, 20%] | 单次通关率带合理(Roguelike 体感:多数局止步中途) | -| 口径闭合 | C3 带按每关满血开局校准;大奖励血回满使该口径跨关成立 | ✓(若未来大奖励改部分恢复,本式失效须改口径) | - -### F2 HP 账本结算式 - -**结论**:账本三写口全部 clamp 于 [0, max_hp_eff];大奖励回满使每关开局恒满血——血条跨关只降不自动回,恢复只来自恢复点与大奖励两个显式口。 - -#### 推导 - -``` -战后回写: hp := report_battle_end(hp) (victory 腿 hp ∈ [1, max_hp_eff];defeat 腿 = 0 → 冒险终) -恢复点: hp := min(hp + floor(max_hp_eff × rest_heal_pct ÷ 100), max_hp_eff) -大奖励: max_hp_eff := max_hp_eff + level_clear_hp_bonus; hp := max_hp_eff -战斗输入: begin_battle(hero_hp = hp, hero_max_hp = max_hp_eff, hero_atk = 表值通道) -``` - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 账本血量 | hp | int | [0, max_hp_eff] | C2 冒险域持有;战斗内由 B2 承载 | -| 生效上限 | max_hp_eff | int | [表值, 表值+加成×已通关数] | HeroTable.max_hp + Σ大奖励提升 | -| 恢复比例 | rest_heal_pct | int | [0,100] | LevelTable 逐关行字段(切片 30 转正 provisional——数值复验归 C3) | -| 上限提升 | level_clear_hp_bonus | int | [0,999] | AdventureTable 单行全局(默认 10) | - -| 验算(示例轨迹,表值上限 50) | 账本读数 | -|---|---| -| 冒险开始 | 50/50 | -| D0–D3 逐战后(示例) | 43 → 31 → 24 → 17 | -| 恢复点(30% × 50 = 15) | min(17+15, 50) = 32 | -| Boss 胜后(假设余 8)→ 大奖励 | max_hp_eff = 60、HP = 60 | -| L2 开局 | 60/60 满血(C3 带口径闭合) | - -### F3 冒险代币记账式 - -**结论**:tokens = levels_cleared × token_per_level——通关与中途死亡同式,差异只在 run_completed 标记;通关加成位预留(MVP 不启用,裁决归 C4)。 - -#### 推导 - -``` -tokens_recorded = levels_cleared × token_per_level (token_per_level 默认 10,消费方 C4) -``` - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| 通关数 | levels_cleared | int | [0, N] | 摘要字段 | -| 每关代币 | token_per_level | int | [0,999] | AdventureTable 单行全局——值归 C4 | - -| 验算 | levels_cleared | tokens | -|---|---|---| -| 死在 L1 | 0 | 0 | -| 清 L1 死在 L2 | 1 | 10 | -| 打穿 N=2 | 2 | 20 + run_completed 标记 | - -## 状态 - -| 状态 | 进入条件 | 行为/出口 | -|---|---|---| -| Idle | 冷启动 / 冒险结算完成 | 唯一出口 = 开始新冒险(reseed → 置账本 → start_level(1)) | -| RunActive | start_level(L) 受理 | 关内行进委托 C1;C2 只守账本写口与收束监听;放弃请求非战斗期受理 | -| Settling | level_end 或 abandoned 受理 | cleared 非末关 → 大奖励 → start_level(L+1) 回 RunActive;末关 cleared / defeated / abandoned → 摘要产出 → Idle | - -不变式:RunActive 期恰一关卡在飞;master_seed 冒险内恒定;HP 账本 ∈ [0, max_hp_eff];Settling 恰一次(重复宣布拒绝 + 诊断);冒险内零流消费(RngService open_stream 零命中)。 - -## 边界情况 - -| 条件 | 行为 | 依据 | -|---|---|---| -| 末关 Boss 战胜利 | 冒险完成结算——不发上限提升(无下一战可受益)、无 start_level(N+1);代币照记 | 规则 1/4 | -| start_level 请求超出行集关数 | 防御 fail-fast(序列配置违约);运行时战斗表 floor 兜底属 D2 既有语义——C2 不产生越界请求,玩家不可达越界关 | 规则 2 / C3 边界情况表 | -| 行集战斗节点无对应 enemy/board_gen 行(内容缺口) | 冒烟断言拦截(覆盖义务);未填充期以单关行集运行(N=1 合法态) | 规则 2 细则 | -| level_end 重复宣布 | 幂等:已 Settling 的冒险拒绝重复兑付 + 诊断,账本与摘要零变化 | 状态不变式 | -| 恢复点满血触发 | 回复 0、合法(账本静默——无明细行协议,与战斗域"奖励未生效"族不同层) | F2 | -| 大奖励时上限已有加成 | 累加(每关一份;N=2 冒险至多一次) | 规则 4 | -| 放弃请求在战斗中 | 拒绝(战斗域单事务在飞;入口呈现仅非战斗期可达——MVP 无 UI 入口) | 规则 5 / 规则 7 细则 | -| 英雄死亡但战斗判定为胜利 | 结构不可达(B1 判定 hero 先判);防御断言:cleared 收束要求账本入账 hp > 0 | 规则 3 / B1 判定段 | -| 重开种子与上局相同 | 合法态(熵源小域);约束 = 种子生成禁走玩法随机通道、冒险内计数器随 reseed 归零——种子值生成源裁决归实现期 ADR | 规则 6 / 开放问题 | -| 冒险内跨关遗留物查询 | 无遗留——buff 战斗域清(B1)、库存关卡域清(C1 收束点)、RAP 战斗域清(A3);冒险层账本与摘要是唯一跨关状态 | 规则 3/7 | -| 关卡行缺失(LevelTable 无该 level_index 行) | fail-fast——序列配置事故非玩家可达态;与战斗表 floor 兜底分属两层 | 规则 2 | - -## 依赖 - -**上游**: - -| 系统 | 性质 | 接口要点 | -|---|---|---| -| C3 | hard | 期望表逐关通关率带 = 序列难度排布输入;L2 深度轴行值(enemy / board_gen 的 (2, D1–D4))随批填充 = N=2 生效前提;大奖励 / 恢复点数值联动复验(区间平移换算率锚) | -| D2 | hard | LevelTable schema(切片建表——C2 为行集内容 owner)· AdventureTable 新表走 D2 接口漂移规则(单行全局,C2 回填 owner)· ConfigDB 单点读取 · RngService 种子注入入口(新面——义务登记)· 跨表校验复用 | -| B1 | hard(下游消费面) | begin_battle 入参 (L, D, hero_hp, hero_atk, hero_max_hp) 供给方转正 = C1 组装 / C2 供值;level_clear 调用方 = C1 收束点(C2 零直调);战后 HP 读回 = B1 呈现面英雄投影(载荷自包含) | -| B2 | 间接 | hero hp_persistence 归 C1/C2——本 GDD 兑现 C2 半边(账本);B2 单位接口零变更 | -| B4 | 间接 | 库存关卡域清空触发源 = C1 收束点;节点奖励兑付归 C1;大奖励不进库存域(零接触) | -| A4 | 间接 | 雾 unlock_level=2 = L2 台阶的内容面(序列难度排布消费) | - -**下游**: - -| 依赖方 | 性质 | 接口 | -|---|---|---| -| C1 | hard | 接口契约四件套 + 收束点语义 + 战斗发起组装权(规则 7 细则表全文)——C1 GDD 强制输入,门禁评审核对项;切片 level_runner 为其实现先例(冒险域职责切出后归 C2 侧新 owner) | -| B1 | 下游(消费 C2 供值) | begin_battle 入参面;B1 依赖表 C1/C2 provisional 行由本 GDD 收编转正 | -| C4 | 远 | 冒险摘要 = 代币入账位;冒险开始参数面 = 天赋注入预留位(MVP 空参数——开始新冒险时注入,结构同 begin_battle 覆盖值通道) | -| D3 | 远 | 快照契约域单位 = 冒险(master_seed + 三流计数器);摘要字段含 master_seed 供复盘 | -| 呈现层(D1) | soft | 冒险摘要结算画面 / 关卡推进指示 / 放弃入口(非战斗期)——数据源 = 本 GDD 摘要与状态投影 | - -**跨 GDD 义务清单(对侧修订批逐项核对,缺项即阻塞级按各自门禁)**: - -| 对侧 | 内容 | 状态 | -|---|---|---| -| C3 | L2 深度轴行值填充(enemy 四行 + board_gen 四行,(2, D1–D4))——OQ1"内容与数值同批"机制的兑现批 | N=2 生效前提 | -| D2 | RngService 种子注入入口登记(reseed——provisional 名,实现载体随 ADR) | 义务登记 | -| D2 | AdventureTable 建表(单行全局两字段——Rule 4 豁免,HeroTable/SettlementTable 先例;C2 回填 owner) | 接口漂移 | -| B1 | begin_battle 入参供给方转正(依赖表 C1/C2 行收编——本 GDD 为 C2 半边定义源) | 转正登记 | -| registry | level_table / adventure_table / hero_override_parameter_passing 三条目登记(本定稿批执行) | 本批 | -| C1 | 接口契约四件套 + 收束点语义全款承接(C1 GDD 门禁评审核对——C2 在 C1 之前设计,本表即其接口基线) | 待 C1 定稿核对 | -| C4 | token_per_level 记账消费 + 天赋注入位消费 | 远(C4 期) | - -## Tuning Knobs - -| 字段 | 类型/域 | 默认 | knob | 说明 | -|---|---|---|---|---| -| LevelTable 行集(N 与链模板) | level.tres 逐关行 | L1 现行 + L2 随批 | ✓(结构) | 加关 = 内容批(链行 + C3 数值 + 变异解锁同批);过长 = 内容缺口,过短 = 冒险时长不足(愿景 20–40 分钟 vs MVP 两关,真人数据后定扩展节奏) | -| LevelTable.rest_heal_pct | int [0,100] 逐关行 | 30 | ✓ | 恢复点比例;数值复验归 C3;100 = 恢复点变全满泉、0 = 死节点 | -| AdventureTable.level_clear_hp_bonus | int [0,999] 单行全局 | 10 | ✓ | 大奖励上限提升;值锚 = C3 平移换算率(+10hp ≈ +1 轮);上调须 C3 重扫 L2 带 | -| AdventureTable.token_per_level | int [0,999] 单行全局 | 10 | ✓ | 代币记账;消费方 C4 | -| 链模板节点构成 | level.tres nodes 数组 | 战×2→奖励→战×2→恢复→Boss | 内容批 | 节点类型序列修订 = 内容批(随 C3 数值同批验带),非调参 | - -- 非 knob(结构冻结):序列线性无跳关、Boss 恒末节点、死亡即冒险终、大奖励三件构成、冒险内零流消费、收束点编排边界。 -- Knob 交互:level_clear_hp_bonus × C3 L2 通关率带(回满 + 上限共同抬开局强度——上调走 C3 重扫);rest_heal_pct × 通关余量带(C3 通关余量 p10 ≥ 3 的对冲杠杆)。 - -## 验收标准 - -| AC | Given | When | Then | -|---|---|---|---| -| AC-1 | 冒险 Idle | 开始新冒险 | reseed 恰一次注入新 master_seed;HP 账本 = 表值上限满血;start_level(1) 受理;L1 行集加载零诊断 | -| AC-2 | RunActive 当前关 < N | level_end(cleared) | 大奖励恰一次:max_hp_eff += level_clear_hp_bonus、账本 = max_hp_eff、tokens += token_per_level;随后 start_level(L+1) | -| AC-3 | RunActive 当前关 = N | level_end(cleared) | 冒险完成结算:无上限提升、无 start_level(N+1);摘要 run_completed = true、tokens = N × token_per_level | -| AC-4 | RunActive 任意战斗 | 英雄死亡 → level_end(defeated) | 冒险失败结算;摘要 levels_cleared = 已通关数、level_reached = 当前关;账本封闭 | -| AC-5 | 冒险结算后 | 开始新冒险 | 全状态重置(账本 / 序列位置 / 库存域空 / 摘要新生成);reseed 新种子注入 | -| AC-6 | RunActive 全程 | 逐战核对入参 | begin_battle.hero_hp = 账本当前值、hero_max_hp = max_hp_eff;战后账本 = 英雄终值投影(载荷自包含) | -| AC-7 | MVP 全行集 | 冒烟跨表断言 | 每关 battle/boss 节点 (L,D) 在 enemy / board_gen 有精确行;序列关数 = 行集关数 | -| AC-8 | C2 文件集 | 静态扫描 | RngService 流消费(open_stream)零命中;reseed 每冒险恰一次调用 | -| AC-9 | Settling 已受理 | level_end 重复宣布 | 拒绝 + 诊断;账本与摘要零变化 | -| AC-10 | 生效前提未兑现(L2 行集缺行) | 冒烟运行 | 以单关行集载体运行(N=1 合法态);N=2 断言显式 SKIP 非 FAIL | -| AC-11 | RunActive 战斗中提交放弃请求 | 请求受理判定 | 拒绝;非战斗期受理 → abandoned 同失败型结算、已获大奖励不追回 | -| AC-12 | 大奖励后首战 | begin_battle 入参核对 | hero_max_hp = 旧上限 + level_clear_hp_bonus(覆盖值通道);hero_atk 走表值通道(MVP 恒不覆盖) | -| AC-13 | rest 节点兑付 | 满血 / 缺血两腿 | 恢复 = floor(max_hp_eff × rest_heal_pct ÷ 100) clamp 上限;满血腿回复 0 合法 | - -## 开放问题 - -| # | 悬案 | owner | 时机 | -|---|---|---|---| -| OQ1 | 冒险长度扩展节奏——MVP N=2(约 15–25 分钟)vs 愿景单局 20–40 分钟;扩关 = 内容批,节奏按真人单关时长数据定 | C2 + C3 | playtest 批次 2 后 | -| OQ2 | 大奖励形态扩展(三选一 / 攻击型 / 通关加成)——AdventureTable 扩列结构位已留,设计随 C4 元进度 | C2 + C4 | C4 GDD | -| OQ3 | master_seed 生成源(熵源通道禁走玩法随机——种子值生成器归属) | D2 / 实现期 ADR | 实现期 | -| OQ4 | 放弃入口呈现与受理细节(仅语义已定:非战斗期受理、同失败型结算) | D1 | D1 / UX 批 | -| OQ5 | L2 display_name 表现层命名(provisional 名"第二层 · 雾漫巢径"——风格对齐 L1"苔藓回廊") | C2 表现层 | L2 内容批 | - -## 版本历史 - -| 版本 | 日期 | 改动 | -|---|---|---| -| v1 | 2026-09-14 | 初版 solo 出稿:七核心规则(冒险骨架 / 序列覆盖 / HP 账本 / 大奖励 / 失败重开 / 种子接线 / C1-C2 编排边界)+ F1–F3 + 13 AC + 给 C1 接口契约四件套;MVP N=2 + AdventureTable 单行全局 + N=2 生效前提登记;切片 level_runner 关卡域先例切分转正(冒险域归 C2、关内行进归 C1) | -| v1.1 | 2026-09-14 | 评审通过状态同步:状态头 In Design → Approved、复核注记更新(--solo APPROVED + 日志路径登记);零规则变更 | diff --git a/design/gdd/legacy-2026-09-14-v1/c3-difficulty-curve.md b/design/gdd/legacy-2026-09-14-v1/c3-difficulty-curve.md deleted file mode 100644 index 5a3f4b3a..00000000 --- a/design/gdd/legacy-2026-09-14-v1/c3-difficulty-curve.md +++ /dev/null @@ -1,526 +0,0 @@ -# C3 难度曲线与精英/Boss(Difficulty Curve & Elite/Boss) - -> **状态**:In Design · lean 格式 -> **版本**:v2 · 2026-09-14 · 作者:DK + design-system -> **承载支柱**:P4 地牢下探的探险氛围(主)· P1 推理的掌控感 / P3 风险与收益同源(难度即压力源) -> **一句话**:C3 定义"难度 = f(关卡序号, 节点深度, 精英/Boss 修饰)"中每一项随进度如何变化——敌人强度曲线、雷图压力曲线、奖励供给曲线与精英/Boss 修饰语义的唯一数值所有者。 -> **复核注记**:v1 solo 出稿 → 经 /design-review(lean 单会话)NEEDS REVISION 8 blocking,同日修订核销(本 v2);专员/总监代理未咨询——生产前人工复核保留。 - -## 速览 - -| 关键问题 | 答案 | -|---|---| -| 定位 | 数值 owner 而非机制 owner:表结构归 D2、生成算法归 A1、结算规则归 B1、敌种机制归 B2——C3 以行值与参数驱动已定稿机制,形成"越下越险"的进度体感(P4);玩家不直接感知本系统(Indirect),它是体感背后的统一坐标系 | -| 拥有 | EnemyTable / BoardGenTable / RewardTable / RewardConfigTable / HeroTable 行值与参数 · DifficultyTable 修饰结构位(MVP 空表)· 难度期望表(按 (L,D) 的期望胜轮带 / 期望承伤占 max_hp 比 / 通关率目标带 / 通关余量带——调参的"正确行为"基准)· **生存链区间模型**(替代关级供给带:每战 S/K 区间三档判定 + 关级通关恒等式 + 输出占比带)· 七步调参流程 · P_perfect 乘数调参权 · m_w 调参通道(终值共裁 B4/B1)· B1 对账约束清单的承接与消解 | -| 不拥有 | 表结构(D2)· 生成算法(A1)· 结算规则与护甲克制矩阵机制(B1——C3 投值)· 敌种机制(B2)· 变异机制框架(A4——C3 只投内容行)· 精英节点完整语义(C1 联动)· 元进度天赋数值(C4——C3 是其世界侧对照物)· 呈现(B2/B5/D1)· encounter 掷骰执行(B1 编排)· 供给控制器机制本体(B4——C3 投参数) | -| 上游输入 | D2 表 schema 与 R1 解析 · B1 条款③⑤对账输出(B1 F4/F5 = 约束生成器)· B2 字段语义与校验域 · B4 联动重算义务与供给控制器机制 · A1 F4 批量红线 · 切片 v3 行集实测数据(含减伤墙批) | -| 下游输出 | 各基表行值(经 ConfigDB 单点读取)· 每战 S/K 区间与三档判定数据面(level_monte_carlo actuals 生产,B4/B1 对账消费)· 难度期望表(C2 难度排布 / C4 天赋标定基准——区间平移换算率:+10hp ≈ +1 轮、atk 翻倍 ≈ K 减半)· unlock_level 投放计划(A4)· "何时变难"数据面(B2/B5/D1 呈现消费) | -| 硬约束 | 运行时零新增公式(C3 侧数值直填基表行;机制本体——encounter 掷骰 / 护甲克制 / 供给控制器——归各 owner GDD,C3 只投行值与参数)· 可推理率 target ∈ [0.85, 1] 绝对锚不可下探 · 条款③⑤与预警⑥约束内调参或显式扩界 · 联动网络六组禁独立调参 · 每次修订强制走七步流程 · 全部值 provisional 起步随 playtest 修正 | - -## 体验锚点 - -> Indirect 体验一句话:**玩家不操作本系统,但每一分钟都在感受它**——第二层的熊地精比第一层的地精更凶、关底 Boss 的压迫性血量、"这一层开始有雾了"的解锁节奏,本系统是这些体感背后的统一坐标系。 - -| 支柱 | 关键词 | 机制承诺 | -|---|---|---| -| P4 越下越险的压迫节奏 | "这一层开始有雾了" | 每层一个可感知难度台阶:新敌种登场 / 新行为环段 / 新变异解锁 + 基准数值跳升(L 轴)与温和加压(D 轴);台阶可感知但可解释——跃升可归因于可见变化而非纯数字膨胀(后者产生"被坑"感而非"变险"感);可量化形态 = S/K 区间随 (L,D) 的漂移轨迹(绿→黄→红空间分布) | -| P1 攻克的对照物 | "我变强了" | 首关基线明显吃紧但多数玩家能过(通关率目标带);后续关卡陡升使 C4 天赋提升产生可测量的通关期望改善——区间平移换算率(+10hp ≈ +1 轮、atk 翻倍 ≈ K 减半)使"我变强了"从体感变为可推导结论 | -| P3 压迫的顶点 | "Boss 房开门前" | 恢复点/囤刀决策压力顶点——供给稀缺性在此处兑现价值;Boss 血量压迫由 Boss 血量锚承载 | -| 锚点时刻 | "三拍 vs 单拍" | 第二层首遇熊地精——三拍行为环 vs 地精单拍攻击,难度跃升有具体面孔;击杀 Boss——"这层我算下来了"的完成感 | - -- 参考感受合成:Peglin 的地图难度爬升 × 杀戮尖塔的 Act 结构(普通→精英→Boss 三段节奏)→ 本作 = 关间大台阶 × 关内小坡度 × Boss=Dmax 关底压轴。 - -## 全局流程 - -### 难度曲线生成(设计期直填 → 运行时直读) - -``` -设计期(本 GDD 唯一产出物 = 表行值) - │ ① L 轴台阶:每关 ≥1 项新内容投放(新敌种/新环段/新变异)+ base 跳升 k_L ∈ [1.3, 1.6] - │ ② D 轴坡度:同敌种 hp 平缓上移(坡度域)+ 板参数温和加压(target ≥ 0.85 绝对锚) - │ ③ Boss 行:Dmax 直填行(数值大台阶 + 专属行为环 + 本关最大板形) - │ ④ 七步调参流程走查 → 行值写入 enemy / board_gen / reward / reward_config / hero .tres - ▼ -运行时(C3 零公式;机制归各 owner) - │ ⑤ B1.begin_battle 实例化期:unit_count 区间均匀骰(encounter 封闭流)→ 本战实际数量 - │ ⑥ B2.spawn(L, D):R1 floor 解析 → 行值快照 → DifficultyTable 修饰套乘(快照之前;MVP 空表无修饰) - │ ⑦ A1 读 BoardGenTable 行生成 → 挖掘期 → B1 结算(既有乘区:护甲克制 / 状态池 / 充能伤害) - ▼ -战斗/挖掘按既有系统运作(C3 运行时零公式) -``` - -### F7 调参流程(每次行值修订强制走完——七步) - -``` -① 改表值(C3 直辖 knob) - │ ② smoke_all 全绿(含 A1 生成质量闸——d0.28 回退先例的拦截点) - │ ③ level_monte_carlo 扫描(通关率带 + 三档判定 + 通关余量 + 输出占比) - │ ④ B4 登记常数与对账重制(AC-19 对账对漂移检测 / AC-6 分支 4 / AC-18 重跑——B4 义务 #10) - │ ⑤ 对账复算(条款③⑤ / 预警⑥) - │ ⑥ README 调参日志登记(含期望偏离) - ▼ -行值生效(任一步 FAIL → 回滚或登记 OQ——禁止带病前进) -``` - -### 出口分发 - -| 出口 | 触发 | 动作/去向 | 约束 | -|---|---|---|---| -| 调参通过 | 七步全 PASS | 行值生效 → 期望表复算 → 调参日志登记 | 期望偏离必须登记,禁止静默出带 | -| 调参失败 | 任一步 FAIL | 回滚行值或登记 OQ | 禁止带病前进 | -| 红档组合 | 任一战 S_max ≤ K_min | 扫描步拦截,行值禁止入表 | 配置事故——区间模型判定 | -| 期望表偏离 | 调参后越出通关率/余量带 | 回滚或 OQ 登记 | 禁止静默出带(状态表同名行) | -| 投放断档 | 某关无新敌种且无新环段 | 流程投放检查项拦截 | 内容生产缺口——C3 调参无法修补(数值不是内容) | - -## 核心规则 - -| # | 规则 | 要点 | 依据 | -|---|---|---|---| -| 1 | 难度承载结构 = 直填行值主体 + DifficultyTable 修饰结构位 | 全部 (level_index, node_depth) 维度最终数值**直填**各基表行(EnemyTable / BoardGenTable / RewardTable——切片已验证的工作方式:R1 floor 解析直读、零新机制);**DifficultyTable 仅承载"按坐标施加的全局修饰"结构位**(键 (L,D)、乘数域;施加点 = B2.spawn 实例化时套乘于行值快照之前)——MVP 不产生任何修饰行(空表结构位;首个使用场景 = 精英节点;Boss 走 Dmax 直填行、不走修饰表) | D2 接口漂移规则;registry `difficulty_table`;B2 实例化条款"接口未定"预留由本条兑现 | -| 2 | 难度 = f(L, D) 双轴语义 | **L 维(关间)= 大台阶**——每关至少一项新内容投放(新敌种 或 新行为环段 或 新变异解锁)+ 基准数值跳升;**D 维(关内)= 小坡度**——同敌种数值平缓上移(坡度域见关内深度坡度公式)、板参数温和加压(尺寸/密度小步上调,推理率 target 不低于 0.85 绝对锚);**Boss = 各关 Dmax 行**(A1 登记约定兑现)——数值大台阶 + 专属行为环 + 专属板形,见 Boss 遭遇语义条 | B2 投放节奏规则(OQ8);Boss 血量锚公式(F3);A1 第三轴登记约定 | -| 3 | 敌种投放节奏 | 每关至少一个新敌种或既有敌种新环段投放;MVP 投放 = L1 三段(goblin→bugbear→ogre_chief,行值总表);**DND 更名批生效**:grub→goblin、ambusher→bugbear、boss_guardian→ogre_chief——registry/B2/D1/art-bible 键集随本修订批对齐;多敌种同深度选择规则:MVP 每行集恰一敌种(B2 锁定),C1 分支地图定稿时若需同深度多敌种选择,走预登记改键通道——本 GDD 预留不定义 | B2 投放节奏规则(OQ8);B2 多敌种共裁项(OQ7);D1 键集冲突② | -| 4 | 切片行集转正为 MVP 默认曲线 | 垂直切片调参登记的行集有实测依据,转正为 MVP 默认值——**权威枚举 = 「MVP 行值总表」(v3,出处 = 切片 .tres)**,旧登记表(grub 时代值)由本表替代;后续 L2+ 曲线数值随关卡内容扩展填充(结构本条已定,数值行随内容扩展) | MVP 行值总表;L2+ 数值开放问题(OQ1) | -| 5 | Boss 遭遇语义 | ① Boss = 关卡末节点 = Dmax 行(LevelTable 末节点必须 Boss——schema 校验);② Boss 数值台阶 = hp 取本关普通战斗 hp 期望总和的 0.5–1.1 倍 + **atk ≥ 本关普通战最高行 atk**(本次重定义——原"高于均值一档"无档位定义;现值 Boss 9 ≥ bugbear 9 ✓)+ 专属行为环(含 charge 拍——玩家可规划的安全挖掘拍);③ Boss 板 = 本关最大板形 + 密度上探(受可推理率 target 绝对锚约束);④ Boss 战胜利 = 关卡通关(C1/C2 域编排) | Boss 血量锚公式(F3,加难走廊 [1.1, 1.35] 预登记);LevelTable schema 校验;A1 第三轴登记约定 | -| 6 | 精英节点(MVP 不实现,语义预留) | `elite_` / `boss_` 前缀字段命名空间预留保留;精英修饰完整语义(独立节点类型/词缀系统/出现规则)**归 C1 关卡节点地图定稿后的联动设计**——分支地图中"同深度并存精英与普通节点"触发棋盘生成端强制重审(改键走 D2 接口漂移规则);本 GDD 承诺:DifficultyTable 结构位 + 命名空间预留足以承载,不预写语义 | A1 第三轴登记约定(命名空间预留 + 定稿强制重审) | -| 7 | A4 全局变异语义(scope=global 兑现) | `scope=global` 行 = 该变异**施加于整板全部合格格**(区别于 region 的区域布置);**全局变异仅 Boss/精英图可产生**(普通图禁用——加载期校验:global 变异的布置行须伴随 elite/boss 标记;MVP 无标记字段前 = MVP 不产生 global 行,A4 既有 warning 承载);MVP 不定义任何具体全局变异行(岩浆/冰冻无 MVP 容器——A4 锁定),本条只锁定语义框架与禁用面 | A4 scope=global 预留位条款;A4 例外表 warning 行 | -| 8 | 遭遇随机化(区间 unit_count) | EnemyTable 行 `unit_count` 升级为**区间语义** [unit_count, unit_count_max](域 [unit_count, 3],B2 上界锁定不变);掷骰经 RngService `encounter` 封闭流——**接口漂移登记完成**:registry 流集合含 encounter、B1 begin_battle 掷骰增补、B2 spawn override 参数与 unit_count_max 字段增补、D2 schema 两字段增补;细则见下表 | registry `rng_service`(encounter 增流登记);B1/B2/D2 增补条款(X-6~X-8);遭遇随机化细则表 | -| 9 | 调参约束内工作纪律(B1 对账输出承接) | C3 每次行值修订必须走满七步调参流程,且不得触碰已锁约束边界——四条边界见下表(B1 条款③⑤对账输出与预警⑥ = "禁止独立调参"纪律的量化边界,C3 调参必须在其内工作或显式扩界;registry 回执见依赖节对账登记表) | F7 七步流程;B1 条款③⑤对账输出;对账登记表 | - -### MVP 行值总表(权威枚举,出处 = 切片 .tres v3) - -| 关卡 | 深度 | enemy_id | display_name | hp | atk(区间) | unit_count(_max) | pattern | armor_type | -|---|---|---|---|---|---|---|---|---| -| L1 | D0 | goblin | 地精 | 24 | 7 [4,10] | 1 (2) | [attack] | none | -| L1 | D1 | goblin | 地精一伙 | 13 | 5 [2,8] | 2 (3) | [attack] | none | -| L1 | D2 | bugbear | 熊地精 | 40 | 9 [6,12] | 1 | [attack, charge, heavy] | a | -| L1 | D3 | bugbear | 熊地精双雄 | 18 | 6 [3,9] | 2 (3) | [attack, charge, heavy] | a | -| L1 | D4 | ogre_chief | 食人魔酋长 | 150 | 9 [6,12] | 1 | [attack, attack, charge, heavy] | b | -| L2 | D0 | bugbear | 熊地精 | 30 | 7 [4,10] | 1 | [attack, charge, heavy] | a | - -| 表 | 转正行集(登记值) | -|---|---| -| BoardGenTable L1 深度轴 | D0/D1 10×10 · D2–D4 12×12 · d0.25/t0.88 · attempts 24 | -| HeroTable | atk = 6 · max_hp = 50 | -| RewardTable 要点 | 格子池四行即时类(attack_up 20 / defense_up 16 / spark_aoe 16 / heal_minor 15)· 注入池三行可选类(knife_t1 60 / knife_adv 30 / heal_pack 10——供给控制器注入)· clear_blast 40(clear_default 槽,instant_aoe 当场兑付,完美 ×2) | -| RewardConfigTable | t_fog_min=2 · k_dmg=0(保底语义由战斗首件保证取代)· n_draft=32 · p_min=8 · active_p0=0.4 · active_decay=0.5 | -| SettlementTable 增补字段 | damage_a_per_cell=1 · damage_a_cap=8 · damage_b_per_flag=2 · armor_effectiveness 克制矩阵(base/dmg_a/dmg_b × none/a/b——特化 ×150 / 无甲 ×100 / 对位 ×50)· p_perfect=200 · D_ref=12 | - -- 实测依据:期望扫描 N=15–30 × 多种子 + 8 种子密度实验 + 试玩批次 1 + 减伤墙批。 -- v3 数值批(试玩批次 1 裁决):atk 4/4/6/4/7 → 7/5/9/6/9(约 +50%,承伤侧主杠杆);D0 24 保持防秒杀(20hp 会被首轮盲挖粉尘秒杀——12+9);Boss 130→150(用户拍板可上调)。 -- **区间批(现行)**:奖励五行 power 区间化(heal_minor [2,6] / knife_t1 [5,11] / heal_pack [6,18] / knife_adv [10,22] / clear_blast [25,55]——身份批内 roll,中点恒等原值)+ 敌方 atk 区间化(上表 [min,max],遭遇骰同流 spawn 期整战持久,±3 provisional)——宽度均 provisional 归本 GDD 测量迭代;A3 条款①当量锚以中点口径维持;验收口径 = 完美策略档 0 加成通关 ≤40%(OQ7)。 -- **加难走廊(带锚定稿预登记)**:L1 基线通关率目标 [30%, 50%],现扫描 60% 越上界——杠杆候选 = r_boss 上探走廊(Boss 180–207,见 Boss 血量锚公式)+ 群战上探 + 供给 decay 0.5→0.6;**扫描验证待执行(OQ7——本会话无 godot 运行时),落带前 v3 值维持 provisional-pending-scan**。 - -### 遭遇随机化细则(Core Rule 8) - -| 项 | 语义 | -|---|---| -| 区间语义 | unit_count 升级为 [unit_count, unit_count_max];unit_count_max 可省略——缺省 = 定值,旧行零迁移 | -| 域 | [unit_count, 3](B2 unit_count 上界锁定不变) | -| 掷骰时点 | B1.begin_battle 实例化期(扫雷开始前)按区间均匀骰定本战实际数量(B1 GDD 增补条款) | -| 敌种不变 | 同敌种掷骰——不触碰 B2"每行集恰一敌种"锁定 | -| 随机通道 | RngService `encounter` 封闭流(registry 流集合已登记);scope_event_binding = 每次战斗实例化恰一 scope;发生在挖掘决策域之外(P1 合规) | -| 消费方式 | B1 掷骰 → B2.spawn 以 override 参数接收实际数量(B2 零随机纪律保持——收到的即确定值;B2 GDD 增补条款) | -| 教学位豁免 | 新敌种首遇节点固定数量不加骰(D0 goblin ×1、D2 bugbear ×1 固定——行值总表) | -| 可回放性 | 同种子全程可回放(流取号确定性不变) | -| 设计原则 | 数量是比单体质变更优先的深度表达(关内深度坡度公式 Example 延伸);期望总量对齐关级恒等式检算 | - -### 调参约束边界(Core Rule 9) - -| # | 约束边界 | 内容 | -|---|---|---| -| ① | 条款③满配破线 | unit_count>1 的行须满足"降密度或降 m_amb"补偿——registry clause3_supply 已登记;切片群战行 hp/atk 下调为合规先例 | -| ② | 条款⑤清图支配性 | 约束包①需求对 clear_blast(instant_aoe,C = power = 40)重推:缺口 = 46.1−40 = 6.1(L1)/ 91.8−40 = 51.8(L2)——登记为非支配设计态 + OQ4 playtest 观测弃图率(原 clear_knife C=8/16 模型由现行登记替代) | -| ③ | 可推理率绝对锚 | target ∈ [0.85, 1] 不可下探(P1 生成端保证) | -| ④ | 期望表对照 | 调参后期望表必须复算并在 README 调参日志登记偏离 | - -## 枚举 - -### DifficultyTable(新表,MVP 空表——结构位) - -| 项 | 值 | 语义 | -|---|---|---| -| 键 | (level_index, node_depth) | 按坐标施加的全局修饰 | -| 乘数域 | [0.1, 10](registry 预登记) | 套乘施加点 = B2.spawn 实例化时、行值快照之前;越域 → clamp 至域界 + warning(registry 登记的显式例外——组合事故非配置事故,非 fail-fast 场景) | -| MVP 行集 | 空(零修饰行) | 首个使用场景 = 精英节点;Boss 走 Dmax 直填行、不走修饰表;建表走 D2 接口漂移规则 | - -### EnemyTable.unit_count 区间语义(Core Rule 8) - -| 字段 | 域 | 语义 | -|---|---|---| -| unit_count | int [1, 3] | 区间下界;旧行语义 = 固定数量 | -| unit_count_max | int [unit_count, 3],可省略 | 区间上界——缺省 = 定值,旧行零迁移;掷骰 = B1 实例化期区间均匀骰 | - -### RngService 流集合(encounter——已登记) - -| 流 | scope 绑定 | 消费点 | 语义 | -|---|---|---|---| -| encounter | 每次战斗实例化恰一 scope | B1.begin_battle 实例化期(扫雷开始前) | unit_count 区间均匀骰——同敌种数量随机;发生在挖掘决策域之外(P1 合规);同种子全程可回放 | - -### A4 变异 unlock_level 门控序列(投放计划归 C3) - -| 序 | 内容 | 门控 | 说明 | -|---|---|---|---| -| 1 | 普通图(无变异) | 基线 | — | -| 2 | 雾 | unlock_level = 2(A4 锁定) | 雾参数 f≤8d / ≤0.25(P1 度量绝对上限) | -| 3 | 岩浆/冰冻 | 随关卡扩展 | 无 MVP 容器(A4 锁定)——投放计划归 C3 | - -## 数值结论与推导 - -> 定位声明:C3 是数据系统——运行时零新增公式(数值直填基表行,运行时仅经既有 B1 乘区 / B2 接口 / R1 直读运作)。本节全部公式为**设计期工具式**(曲线拟合基准、区间估算、对账复算),执行载体 = 调参期批量工具(level_monte_carlo.gd / reward_expectation.gd,见 F7),不进入游戏运行时。全部数值 provisional 起步,随 playtest 修正。 - -### F1 关内深度坡度(D 轴小坡度) - -**结论**:hp_D = round(hp_0 × (1 + s_hp × D))——每档 +5%–20%,Dmax=4 处 1.2–1.8 × D0、Dmax=5 处 1.25–2.0 × D0(同敌种内);MVP 直填行近似此式、不运行时计算;敌种切换(新敌种登场)不受本式约束——台阶值直接定。 - -#### 推导 - -``` -hp_D = round(hp_0 × (1 + s_hp × D)) -``` - -**Variables:** - -| Variable | Symbol | Type | Range | Description | -|---|---|---|---|---| -| 深度基准值 | hp_0 | int | [1,999] | 该敌种 D0 行 hp | -| 坡度系数 | s_hp | float | [0.05, 0.20] | 每深度档增幅 | -| 节点深度 | D | int | [0, Dmax] | 节点深度(Boss = Dmax) | - -**验算与边界:** - -| 项 | 内容 | -|---|---| -| Example | goblin 24hp:D1 理论 24×1.1 ≈ 26——切片实际以"群×2"(13hp ×2–3 只)表达深度压力:数量是比单体质变更优先的深度表达(保持单拍环低威胁读数、总量受控) | - -### F2 关间台阶(L 轴大台阶) - -**结论**:base(L+1) ≈ base(L).Dmax × k_L、k_L ∈ [1.3, 1.6]——k_L 作用于**同敌种基准**(敌种延续场景,如 L2 bugbear 延续至 L3);新敌种登场时基准按其环复杂度重定(三拍环单位 hp 低于单拍环同关值——切片先例:bugbear 40/18 < goblin 群总量但威胁更高)。 - -#### 推导 - -``` -base(L+1) ≈ base(L).Dmax × k_L k_L ∈ [1.3, 1.6] -``` - -**Variables:** - -| Variable | Symbol | Type | Range | Description | -|---|---|---|---|---| -| 关间系数 | k_L | float | [1.3, 1.6] | 下一关 D0 基准 = 本关 Dmax × k_L(数值跳升 + 新敌种/新变异共同构成台阶感) | - -**验算与边界:** - -| 项 | 内容 | -|---|---| -| Output Range | 相邻关数值倍率 1.3–1.6;叠加新敌种环复杂度,实际体感台阶更大 | -| 反例 | L1 Dmax 酋长 150hp → L2 D0 bugbear 基准 ≈ 210 的直推不成立——新敌种登场基准按环复杂度重定,k_L 仅适用于敌种延续场景(L2 锚行 30/7 为内容行非 k_L 直推) | - -### F3 Boss 血量锚 - -**结论**:boss_hp ≈ round(Σ普通战斗hp期望 × r_boss)、r_boss ∈ [0.5, 1.1]——"Boss 是本关最大的单场消耗",量级上探至全关消耗;**加难走廊 [1.1, 1.35] 预登记**(带锚定稿——L1 通关率压带首选杠杆,扫描终裁后落带)。 - -#### 推导 - -``` -boss_hp ≈ round(Σ普通战斗hp期望 × r_boss) r_boss ∈ [0.5, 1.1](走廊 [1.1, 1.35]) -``` - -**Variables:** - -| Variable | Symbol | Type | Range | Description | -|---|---|---|---|---| -| 本关普通战斗 hp 期望总和 | Σ普通战斗hp期望 | float | [1,999]×N | 本关全部非 Boss 节点的敌方 hp 期望合计(**含 unit_count 区间骰期望**——口径与击杀侧恒等式统一) | -| Boss 占比 | r_boss | float | [0.5, 1.1](走廊 [1.1, 1.35]) | Boss 相对全关消耗的血量锚 | - -**验算与边界:** - -| 验算 | 读数 | 判定 | -|---|---|---| -| L1 v3:Σ = 36(D0 [1,2]×24)+ 32.5(D1 [2,3]×13)+ 40(D2)+ 45(D3 [2,3]×18)= 153.5 → Boss 150/153.5 ≈ **0.98** | 带内 | ✓(口径更正:旧验算 Σ=142 为固定数量口径与旧 Boss 值混算,由本行替代;口径与击杀侧恒等式统一) | -| 走廊验算 | Boss 180/153.5 ≈ 1.17、200/153.5 ≈ 1.30 ∈ [1.1, 1.35] | 走廊内 ✓ | -| 败北分布 | 向 Boss 集中(4/6) | 符合压迫预期 ✓ | - -### F4 生存侧:期望承伤与 S 区间 - -**结论**:E[承伤/场] ≈ Σ_rounds Σ_enemies E[beat_dmg] × (1 − E[减伤] − weaken覆盖);对照带 ≤20%/普通场、≤50%/Boss 场。派生**生存区间** S = [(HP进战 + 治疗下界) ÷ 入伤峰值, (HP进战 + 治疗上界) ÷ 入伤谷值]——区间模型三档判定的生存侧输入。 - -#### 推导 - -``` -E[承伤/场] ≈ Σ_rounds Σ_enemies E[beat_dmg] × (1 − E[减伤] − E[weaken覆盖]) -S = [ (HP进战 + 治疗min) ÷ 入伤峰值 , (HP进战 + 治疗max) ÷ 入伤谷值 ] -``` - -**Variables:** - -| Variable | Symbol | Type | Range | Description | -|---|---|---|---|---| -| 每拍期望伤害 | E[beat_dmg] | float | [0,999] | 敌 atk × 拍别乘数(heavy=2)+ 伏击 flat(+3×层数,帽 4)——行为环确定性轮转 | -| 减伤期望 | E[减伤] | float | [0,0.6] | defense_up 授予率 × 当次减伤(−30×2 层帽 −60%——减伤墙批现行值) | -| weaken 覆盖 | E[weaken覆盖] | float | [0,0.65] | 标中旗 −65% 输出对战斗轮的覆盖期望——**生存侧最大单一杠杆**(P3 兑现点) | -| 入伤峰值/谷值 | d_max / d_min | float | [0,999] | 峰值 = heavy 齐射尖峰 + 伏击满层、零减伤;谷值 = charge 拍 + 全减伤 | - -**验算与边界:** - -| 验算 | 读数 | 判定 | -|---|---|---| -| D0 goblin ×1(7atk 单拍环)每结算恒 7 × (1−0.22 平均减伤) ≈ 5.5/轮 → 裸 R_survive ≈ 50/5.5 ≈ 9 轮 | — | L1 五战 S 区间手算见区间模型验算表 | -| 减伤墙批注 | defense_scan 实测墙轮 39%、真人 12/12 轮零承伤满血通关 → defense_up −50→−30、石肤权重 24→16 | 承伤带复验责任随批(B3 侧注记已挂) | - -### F5 通关率目标带(期望表核心) - -**结论**:通关率按 (L, 天赋档) 目标带验收——**L1 基线 30–50%**(带锚定稿,替换原 40–60%);区间机制解释:+100% atk → K 区间近似减半 → K_max ≈ S_min 转绿档 → ≥95%。**真人方向更正**:批次 1 实测真人显著强于模拟者(v2 真人 100% vs 模拟 80%)——原"真人预期低于模拟"方向声明由本结论更正;带按模拟口径定义,真人系数批次 2 标定(OQ3)。 - -#### 推导 - -**Variables(目标带):** - -| 目标带 | 基线(无天赋) | 中天赋(+100% atk) | 高天赋(+200%) | -|---|---|---|---| -| L1(首关) | **30–50%** | ≥95% | 100% | -| L2 | 20–40%(provisional,随 OQ1 校准) | 60–80% | ≥90% | -| L3+ | 10–25%(provisional) | 40–60% | 60–80% | - -**验算与边界:** - -| 项 | 内容 | -|---|---| -| v3 扫描 | 基线 60%——**越 [30,50] 上界** → 加难杠杆批内即调(带锚定稿杠杆:r_boss 走廊 + 群战上探 + decay 0.6 候选);扫描落带前登记 provisional-pending-scan(OQ7) | -| 完美策略档扫描(OQ7;工具 = smoke/auto_player.gd 完美档求解器 + level_monte_carlo 策略轴) | **区间批后复测(2026-09-14,N=30)**:0 加成通关仍 **100%**、剩余 HP 均 47.4/50、承伤均 3.9(区间前 3.5)、踩雷 0.00/局——+50%~+200% 恒 100%;**承伤带与 F5 带对技能轴上界零分辨力**(calibration_gap 定量读数)。实测结论:**奖励侧 + 敌方侧数值区间已全部落地仍压不动完美档**——其结构性优势(零踩雷直伤 + 全标旗 weaken 顶格 + 快杀)使 47/50 血缓冲吞掉全部值域方差;≤40% 验收线需结构性杠杆(承伤硬地板 / weaken 饱和语义 / 完美度定价)或极端宽度(毁基线与可读性,建议否决)——**待用户裁决(OQ7 待拍板主项)** | -| 败北分布 | 向 Boss 集中(4/6)✓;+200% 天赋 100% ✓ | -| 机制钩子 | 天赋列由区间位移承载(K 减半 → 绿档),非独立拍脑袋带 | - -### F6 生存链区间模型(替代关级供给带) - -**结论**:原关级供给带(比值 ∈ [1.1, 2.0])由本模型替代——其验算 0.54"短缺态"与实测 60% 通关矛盾,方向指引反指(对偏易的游戏报"加供给")。现行 = **生存链区间模型**:每战 S/K 区间三档判定(绿=稳定通过 / 黄=期望通过 / 红=配置事故禁止入表)+ 关级通关恒等式 + 输出占比带。设计期工具式,运行时零公式。 - -#### 推导 - -``` -S = [ (HP进战 + 治疗min) ÷ 入伤峰值 , (HP进战 + 治疗max) ÷ 入伤谷值 ] (生存区间——F4) -K = [ (Σ敌hp − 一次性伤害max) ÷ 输出峰值 , (Σ敌hp − 一次性伤害min) ÷ 输出谷值 ] (击杀区间) - -绿档: S_min > K_max —— 最坏也能过,与运气无关(教学位必须绿档) -黄档: E[S] ≥ E[K] + 1 且非绿 —— 有失败分支,期望占优(margin ≥ 1 轮最低阈值) -红档: S_max ≤ K_min —— 最好也打不过,配置事故(F7 第③步拦截) - -关级恒等式: atk × Σ R_survive(i) + Σ奖励输出 ≈ Σ敌hp期望 × (1 + 缓冲) - (actuals 逐项审计闭合——五项输出 × 三项输入全部入账) -``` - -**Variables:** - -| Variable | 来源 | Description | -|---|---|---| -| 入伤 | 表值 + actuals | 敌 atk × 拍别乘数 + 伏击 flat − 减伤 − weaken(F4) | -| 输出 | 表值 + actuals | 基础攻击 6×(1+attack_up) + 伤害A(开格充能 1/格 帽 8,甲A ×1.5/甲B ×0.5)+ 伤害B(标雷充能 2/雷,甲B ×1.5/甲A ×0.5)+ 刀(8/16,不吃 percent) | -| 一次性伤害 | 表值 + actuals | clear_blast 40×清图数(完美 ×2)、囤刀倾泻 | -| 治疗 | 表值 + actuals | heal_pack 12 + heal_minor 4(注入/格子池期望) | -| 数量骰 | 表值 | unit_count 区间 [unit_count, unit_count_max] | - -**验算与边界:** - -| 项 | 内容 | -|---|---| -| L1 五战区间手算(≈ 估算,p10–p90 口径) | D0 goblin×1(教学位固定):S≈[7,12] vs K≈[2,4] → **绿** ✓ · D1 ×[2,3]:S≈[4,10] vs K≈[2,6] → 黄 · D2 bugbear(首遇固定):S≈[4,12] vs K≈[2,6] → 黄 · D3 ×[2,3]:S≈[2,6] vs K≈[2,7] → 黄偏红 · Boss 酋长:S≈[4,15](旗覆盖率主导)vs K≈[7,18](囤刀+甲B 对策)→ 黄红边缘 | -| L1 形态带 | ≥1 绿(教学位)+ 中段黄 + Boss 黄不红——手算形态符合 ✓ | -| 关级恒等式漏项审计 | 原供给 180 的漏项:clear_blast 只算一次(实际 ×清图数 3–4 = 120–160)、伤害A/B 充能、attack_up 增量、RAP 刷新新板追加供给——逐项入账后闭合,"0.54 短缺"消失 | -| 输出占比带 | 奖励侧输出(刀+clear_blast+A/B 充能)÷ 总输出 ∈ **[15%, 40%]**——<15% 奖励摆设、>40% 供给依赖(AC-14) | -| 口径注记 | 区间两口径:公式包络(必过/必死结论)与 actuals p10–p90(日常判定——B1 actuals p10 纪律同构);HP 持久化耦合各战区间,联合分布由 monte_carlo 裁决 | -| C4 平移换算率 | +10hp ≈ +1 轮(÷d̄≈8–10);atk 翻倍 ≈ K 减半——区间位移机制承载通关率天赋列,非独立拍带 | - -### F7 调参流程(每次修订强制走完——七步) - -**结论**:改表值 → smoke_all 全绿 → level_monte_carlo 扫描(通关率带 + 三档判定 + 通关余量 + 占比)→ B4 登记常数与对账重制 → 对账复算(条款③⑤/预警⑥)→ README 调参日志登记——任一步 FAIL → 回滚或登记 OQ,禁止带病前进。 - -#### 推导 - -**Variables:** - -| Variable | Symbol | Type | Range | Description | -|---|---|---|---|---| -| 批量样本量 | N | int | ≥256(正式)/ 15–30(切片临时) | 正式批量工具 = level_monte_carlo 扩展(逐行聚合 + N 参数化 + 区间分位/降级统计)——**扫描执行本体归 A1 F4 工具交付(A1 OQ1),C3 的 level_monte_carlo 扩展为消费方**(所有权澄清:A1 工具产出 actuals → C3 扫描消费,非替代) | - -**验算与边界:** - -| 项 | 内容 | -|---|---| -| Output Range | 任一步 FAIL → 回滚或登记 OQ,禁止带病前进 | -| Example | 切片 d0.28 回退先例:d0.28/t0.87 → best≈0.81 降级告警 → 回退 0.25/0.88——第 2 步(A1 生成质量闸)拦截的成功案例 | -| 第④步依据 | B4 义务 #10:"C3 调参流程若无'登记常数与对账重制'步骤则相关 AC 假失败"(T_fog_min/K_dmg/N_draft/P_min/默认根行值调参 → B4 AC-19 对账对 (knife_adv, attack_up_basic) 漂移检测、AC-6 分支 4、AC-18 重跑) | - -## 状态 - -| 状态 | 进入条件 | 行为/出口 | -|---|---|---| -| 未调参行 | 新增 (L,D) 行仅有结构占位 | 经七步流程 → 已调参 | -| 已调参行 | 行值经批量仿真 + 期望表对照 + 对账复算 | 任何修订 → 重走七步流程 | -| SLICE-TUNED 转正 | 切片临时值经本 GDD 背书(行值总表 v3) | → 已调参(切片行集转正条款) | -| provisional-pending-scan | 加难杠杆候选值已登记、扫描步未执行 | 扫描落带 → 已调参;越带 → 回滚候选 | -| 期望表偏离 | 调参后期望值越出目标带 | → 回滚或 OQ 登记(禁止静默出带) | - -不变式:C3 无运行时状态机(数值系统);设计期任一行值恒处于上表五态之一;期望表偏离禁止静默出带。 - -## 边界情况 - -| 条件 | 行为 | 依据 | -|---|---|---| -| unit_count>1 行与高密度板组合 | 条款③满配语境破线(B1 F4 双轴约束)——该组合**禁止入表**;切片先例 = 群战行 hp/atk 下调补偿;对账复算在流程第 5 步强制执行 | Core Rule 9① / B1 F4 | -| 关卡深度轴缺行(如 D3 缺失、D4 存在) | **调参期冒烟断言拦截**(跨表存在性检查——C3 调参工具域载体;D2 R1 fail-fast 语义不动);R1 floor 解析静默兜底至低档(难度降而非崩)+ ConfigDB warning 四元组仅作运行时兜底——缺行根因是调参事故而非运行时事件 | AC-1 / D2 R1 | -| 请求越界关卡(level 999) | R1 floor 解析至表尾行(难度封顶 = 尾行值)+ warning——冒险结构(C2)应在其内容覆盖范围内生成关卡序列;越界 = 内容生产缺口,非玩家可达态 | D2 R1 | -| 玩家天赋拉满(atk+200%)打最低难度行 | 速杀退化(预警⑥——战斗 1–2 轮终局、奖励系统饿死自己的高光);处置 = 预警⑥仪表监控(战斗结束未开资格格占比 >70% 警)+ 接受——低难度行被高天赋速杀是 Roguelike 成长兑现的合法形态,无需修复(区间形态:K_min < 2 = 预警⑥观测位) | 区间模型 / 预警⑥ | -| 密度上探压垮推理率(d0.28 案例) | best inferability ≈0.81 < target 0.87 → 降级告警"接受最优出图";处置 = **回退**(切片先例:0.28/0.87 → 0.25/0.88)——密度与 target 是联动对(A1 求解器能力的天花板内联动调参),禁止为难度牺牲 P1 度量达标;流程第 2 步闸拦截 | F7 / A1 F4 | -| 条款⑤清图支配性反转(弃图率 >30%) | 玩家普遍发现"挖一半就弃图刷 RAP"优于"推到底清图"→ 清图奖励与清图体验被支配;处置 = OQ4 playtest 观测(自动模拟者不弃图,测不到真人策略);届时杠杆 = C 量级上调(B1 约束包①,现值 clear_blast 40)或弃图成本重定价(A3 域)——MVP 接受当前非支配设计态(缺口 6.1/51.8,实测后再裁) | B1 F5 / OQ4 | -| 投放节奏断档(某关无新敌种且无新环段) | OQ8 违例——敌信息总量见底,学习曲线枯竭;处置 = 流程投放检查项(每关至少一项新内容——敌种投放节奏条款);违规 = 内容生产缺口,C3 调参无法修补(数值不是内容) | B2 OQ8 / AC-6 | -| 全部行值调至域上限(hp 999 等) | 数值可行但可玩性崩塌;处置 = 通关率带对照拦截(期望表全面越带 = 配置事故)+ 域校验既有护栏;本场景属调参事故而非玩家可达态 | F5 / D2 域校验 | -| DifficultyTable 修饰行与直填行值叠加后越域(首个精英节点上线时) | B2.spawn 套乘后 hp >999 → **clamp 至域界 + warning**(fail-fast 不适用——修饰乘数是合法配置,越界是组合事故;域界 = 玩法硬顶);MVP 空表无此场景,规则预登记 | DifficultyTable 乘数域 | -| 通关余量越带 | p90 >13(赢得从容)→ 生存侧杠杆优先(治疗稀有度下调 / 敌 atk 上探),击杀侧杠杆次之;p10 <3(1–2 血惨胜成常态)→ 治疗供给上浮或 Boss 前恢复点增益——余量是形态指标,与通关率带联合判读 | AC-13 / 区间模型 | - -## 依赖 - -**上游**: - -| 系统 | 性质 | 接口要点 | -|---|---|---| -| D2 | 上游(硬) | 全部基表 schema、R1 解析、ConfigDB 单点读取归 D2;C3 产出 = 行值;DifficultyTable 新表走 D2 接口漂移规则(registry `difficulty_table` 已登记);禁绕过 ConfigDB 自建 load(D2 Rule 2);RngService `encounter` 封闭流(registry 已登记);**EnemyTable schema +2 字段(unit_count_max、armor_type)——接口漂移已回写 D2** | -| B2 | 上游(硬) | EnemyTable/HeroTable 行值由 C3 填(B2 拥有字段语义与校验域);修饰施加点 = B2.spawn(实例化时套乘、行值快照之前);**spawn override 参数 + unit_count_max 字段语义 + 物种集 {goblin, bugbear, ogre_chief}——接口漂移已回写 B2**;投放节奏 OQ8 共担;多敌种同深度选择规则共裁(OQ7——C1 联动) | -| B1 | 上游(soft,事实依赖) | 条款③⑤对账输出 = 调参约束输入(B1 F4/F5 = 约束生成器);P_perfect 乘数调参权归 C3(B1 登记);**begin_battle encounter 掷骰增补 + 护甲克制结算(armor_effectiveness/damage_a/damage_b 字段)——接口漂移已回写 B1**;期望口径双读数纪律(锚行读数不得用于 unit_count=2 放行);对账复算义务随每次修订 | -| B4 | 上游(soft) | RewardTable/RewardConfigTable 参数值归 C3;**供给控制器机制本体归 B4(转正登记——首件保证 + 指数递减注入,active_p0/active_decay 参数归 C3)**;clear_blast 换位 + K_dmg=0 转正(B4 保底语义迁移);敌 hp 曲线与奖励供给禁止独立调参(registry 联动重算义务——区间模型恒等式为联合检算工具);调参期批量仿真义务载体 | -| A1 | 上游(类型依赖) | BoardGenTable 行值归 C3(含 max_gen_attempts 策略);禁反向调用生成(仅经 D2/编排器传值);F4 批量红线(严格零降级)= 调参闸;**F4 全量批量工具 = A1 交付物(A1 OQ1),C3 level_monte_carlo 扩展为消费方**;d0.28 回退先例 = 密度×target 联动调参的实证;黄金向量/solver_rules 冻结不经 C3 | -| A4 | 上游(soft) | scope=global 语义由本 GDD 定稿(Core Rule 7);unlock_level 门控序列投放计划归 C3(随关卡扩展);**AC-11 未来腿 = elite/boss 标记字段落地时 A4 warning 升闸——已登记为 A4 接口漂移义务** | -| A3 | 上游(soft) | ActionEconomyTable 联动观测(ap_per_round 双重身份——节奏兼 RAP 转存规模)——**联动评估归 C3,调参所有权归 A3**(措辞更正:A3 GDD 无调参权授予回执);跨字段校验(动作成本 ≤ ap_per_round)约束内观测 | -| B3 | 上游(soft) | StatusEffectTable 四行强度(attack_up +50 / defense_up −30 / weaken −65 / ambush +3)provisional 归 C3 联动评估(B1 免伤轮合法性注记——强度评估归 C3 对账联动);减伤墙批(−50→−30)为 B3 侧行值批,C3 承伤带复验随批 | - -**下游**: - -| 系统 | 接口要点 | -|---|---| -| C1 | 节点深度语义消费;精英节点形态联动(精英节点预留条款 / A1 定稿强制重审);未设计——Boss=Dmax 约定即为其预留的接口 | -| C2 | 关卡序列的难度排布消费本 GDD 期望表;越界关卡 = 内容生产缺口(边界情况表);未设计 | -| C4 | 下游(远)——元进度天赋数值的"世界侧对照物":通关率目标带(F5)是 C4 天赋强度的标定基准;**区间平移换算率(+10hp ≈ +1 轮、atk 翻倍 ≈ K 减半)为 C4 设计输入**;未设计 | -| 呈现层(B5/D1) | Boss 登场仪式感 / 难度台阶可感知性——视觉义务归 B2/B5,C3 仅提供"何时变难"的数据(见呈现与 UI 契约) | - -**双向一致性核对(registry / systems-index 回执):** - -| 编号 | 内容 | 对侧 | 状态 | -|---|---|---|---| -| X-1 | systems-index 依赖表 C3 ← D2,B2;B1 块增补"C3 消费 B1 对账输出的事实依赖成立" | systems-index | ✅ | -| X-2 | "敌种 hp/atk/pattern 曲线数值、难度修饰 → C3" | B2 | ✅ | -| X-3 | "C3 = 条款③⑤约束输入方" | B1 | ✅ | -| X-4 | "权重/档位/威力曲线 + RewardConfigTable 参数归 C3" | B4 | ✅ | -| X-5 | "每行难度数值与曲线 → C3" | A1 | ✅ | -| X-6 | B1:begin_battle encounter 掷骰增补 + 扫描 scope 腿 + B1"零随机"边界扩界注记(encounter 流在结算步流之外) | B1 | ✅(本次修订批回写) | -| X-7 | B2:spawn override 参数、unit_count_max 字段语义与实例化记号调和、物种集 {goblin, bugbear, ogre_chief} | B2 | ✅(本次修订批回写) | -| X-8 | D2:EnemyTable schema +2 字段(unit_count_max、armor_type);SettlementTable +4 字段(damage_a_per_cell/damage_a_cap/damage_b_per_flag/armor_effectiveness) | D2 | ✅(本次修订批回写) | -| X-9 | B4:供给控制器机制承接 + clear_blast 换位 + K_dmg=0 禁区条款解除(保底语义迁移) | B4 | ✅(本次修订批回写) | -| X-10 | A4:elite/boss 标记字段落地时 warning 升闸(AC-11 未来腿) | A4 | ✅(义务登记) | - -**对账与义务登记(B1 对账输出承接——审计资产):** - -| 编号 | 内容 | 对侧 | 状态 | -|---|---|---|---| -| 条款③ | 满配破线两轴:unit_count>1 行须满足"降密度或降 m_amb"补偿(B1 F4 双轴约束)——registry clause3_supply 登记在案 | B1 / registry | 已登记——切片群战行 hp/atk 下调为合规先例 | -| 条款⑤ | 清图支配性:46.1/91.8 需求 vs **clear_blast C=40 现值(缺口 6.1/51.8,对 clear_blast 重推)**——登记为非支配设计态;预留杠杆 = C 量级上调(B1 约束包①)或弃图成本重定价(A3 域) | B1(B1 F5) | 已登记——OQ4 playtest 持续观测弃图率 | -| 预警⑥ | 快杀退化:战斗结束未开资格格占比 >70% 警——高天赋速杀低难度行 = 合法形态,仪表监控不修复;区间形态钩子 = K_min < 2 观测位 | B4 / B1 | 已登记 | -| unit_count 约束 | 区间 [unit_count, unit_count_max] ⊆ [1,3];>1 行联动条款③复算(流程第 5 步强制) | B1 / B2 | 已登记 | -| 期望口径双读数 | 锚行读数(2.0×/2.6× 类)不得作为 unit_count=2 的放行依据 | B1 | 已登记 | - -## 呈现与 UI 契约 - -> C3 无自有视觉/音频/UI 资产(数值系统)——义务转注如下;无新增资产需求、无 D1 新增义务登记。 - -| # | 义务 | 归属 | -|---|---|---| -| 1 | Boss 登场呈现(仪式感锚点——体验锚点"压迫的顶点");设计输入 = Boss=Dmax 行的数据面(本 GDD 提供) | B5 战斗表现 / D1 | -| 2 | 难度台阶可感知性:新敌种 = 新图像线索 = 台阶的可视面孔(意图推测型——图像线索档位编码,"这只比上层的硬"可读) | B2(D1×4 义务) | -| 3 | 变异解锁的"这一层有雾了":图例与首遇提示(已登记义务) | A4 / D1 | -| 4 | 期望表 / 批量仿真输出 = 调参期开发工具(headless——非游戏内 UI) | 开发工具 | -| 5 | 恢复点/奖励点呈现:C1-lite 切片已实现的节点覆盖层;正式形态归 D1/C1 | D1 / C1 | - -## Tuning Knobs - -> C3 是全项目 knob 保有量最大的系统(数值 owner)。全部值 provisional 起步;域与校验归各表 schema(D2);本表只登记所有权、联动与危险方向。 - -| Knob | 表 | 域 | 联动 | 过高 | 过低 | -|---|---|---|---|---|---| -| EnemyTable.hp/atk(逐行) | enemy.tres | [1,999] / [0,999] | **与 B4 供给禁独立调参**(区间模型恒等式联合检算);cap×atk 禁独立(B2) | 打不死、战斗冗长 | 快杀退化预警⑥ | -| EnemyTable.unit_count / unit_count_max(逐行) | enemy.tres | [1,3] / [unit_count,3] | **>1 行须降密度或降 m_amb**(条款③);区间骰经 encounter 流 | 条款③破线 | 压力不足/遭遇零随机 | -| EnemyTable.pattern(逐行) | enemy.tres | MVP 三值组合 | OQ8 投放节奏(每关新环段) | 信息过载 | 学习曲线枯竭 | -| EnemyTable.armor_type(逐行) | enemy.tres | {none, a, b} | **克制矩阵联动**(settlement armor_effectiveness);伤害A/B 充能消费面(B1 域,C3 投值) | 克制失配 | 特化对策失效 | -| HeroTable.atk/max_hp | hero.tres | [1,999] | 全部输出式的分母锚(F4/F6) | 奖励价值稀释 | 挫败感 | -| BoardGenTable 尺寸/密度/attempts(逐行) | board_gen.tres | 域见 schema | **密度×target 联动**(d0.28 回退先例);unit_count>1 行联动 | 推理率不达标降级 | 板退化(低密度先布后删) | -| BoardGenTable.inferability_target(逐行) | board_gen.tres | **[0.85,1] 绝对锚** | 与密度成反耦 | 生成耗时/降级 | P1 空心化 | -| BoardGenTable 雾参数 | board_gen.tres | f≤8d / ≤0.25 | unlock_level=2 锁定 | P1 度量空心(绝对上限) | 雾内容缺位 | -| RewardTable.weight/power/tier(逐行) | reward.tres | 域见 schema | 区间模型恒等式;攻击面稀释;clear_blast 单行槽 | 即时类淹没明细/可选类贬值 | 窗口空转/重 roll 频发 | -| RewardConfigTable.{t_fog_min,k_dmg,n_draft,p_min} | reward_config.tres | 域见 schema | k_dmg=0 = 保底断言关闭(禁区条款已解除——保底语义由首件保证取代) | 保底永不触发 | 种子轮盘致命 | -| 供给控制器 active_p0/active_decay | reward_config.tres | [0,1] / (0,1] | E[战斗获取]≈1 目标(B4 机制本体承接);**与敌 hp 联动** | 速杀+囤积回归 | 可选类绝育 | -| SettlementTable.{damage_a_per_cell,damage_a_cap,damage_b_per_flag,armor_effectiveness} | settlement.tres | 域见 schema | Boss 甲B 对策 = B 充能;A 克制甲A;联动网络 #6 | Boss 裸打过慢 | 充能失效 | -| ActionEconomyTable.{ap_per_round,rap_refresh_cost,refresh_max_per_round} | action_economy.tres | 域见 schema | ap 兼 RAP 转存规模;**调参所有权归 A3,C3 联动评估** | 轮次冗长 | 决策密度坍缩 | -| SettlementTable.P_perfect(乘数) | settlement.tres | {100,200} | 完美排雷×清图支配性互 feed | 钓鱼线(护栏 B) | 高光缺位 | -| DifficultyTable 修饰乘数(MVP 空表) | difficulty.tres(待建) | [0.1,10](registry 预登记) | 精英节点上线时启用 | 越域 clamp+warning | 无修饰 | - -### DifficultyTable schema(difficulty.tres 待建——D2 接口漂移建表) - -| 字段 | 类型/域 | 默认 | knob | -|---|---|---|---| -| level_index + node_depth(复合键) | int × int | — | ✗(结构键) | -| 修饰乘数 | float [0.1, 10](registry 预登记域) | —(MVP 空表无行) | ✓(精英节点上线时启用;越域 clamp + warning——域界 = 玩法硬顶) | -| elite_ / boss_ 前缀预留字段位 | 命名空间预留(D2 schema 断言期望暴露) | 无 | ✗(预留,随精英节点语义定稿) | - -### 联动网络(禁止独立调参清单) - -| # | 联动 | 纪律 | -|---|---|---| -| 1 | 敌 hp ↔ 奖励供给(registry 已锁) | 单边移动必走区间模型恒等式联合检算 | -| 2 | unit_count ↔ 密度/m_amb(条款③) | 群战行上线前的强制复算 | -| 3 | 密度 ↔ target ↔ attempts(A1) | d0.28 回退先例的三元组 | -| 4 | ap_per_round ↔ RAP 体系 ↔ refresh 上限(A3 + 轮内刷新批) | 跨字段校验闸承载 | -| 5 | m_w(weaken −65)↔ 锚对照表(B1 F0) | 终值共裁 B4/B1,调参走 C3 提案通道 | -| 6 | armor_type ↔ 伤害A/B 充能 ↔ 克制矩阵(B1 域) | 敌种甲型变更须复算 Boss/普通战 K 区间 | - -## 验收标准 - -| AC | Given | When | Then | -|---|---|---|---| -| AC-1 | LevelTable 任一 battle/boss 节点 (L,D);ConfigDB 加载全部表 | 调参期冒烟断言逐节点查两表 | board_gen 与 enemy 两表存在该 (L,D) 精确行(跨表护栏⑧转正——载体 = C3 调参期冒烟断言;运行时 floor 兜底属 D2 R1 既有语义) | -| AC-2 | MVP 全部 (L,D) 行 | 逐行扫描 inferability(批量 N=256/行——A1 F4 工具交付后的正式红线) | 全部行 inferability ≥ target ≥ 0.85(P1 绝对锚)且 A1 断言族(退化板/R₀≠S)零违例 | -| AC-3 | EnemyTable 全部 unit_count>1 行 | 条款③复算(密度 × m_amb 组合) | 无破线组合存在(Core Rule 9①) | -| AC-4 | MVP 全部行集(区间模型) | level_monte_carlo 逐战 S/K 区间扫描 | **零红档组合**(S_max ≤ K_min 禁止入表);教学位绿档;L1 形态带 = D0 绿 + 中段黄 + Boss 黄不红(F6 三档判定) | -| AC-5 | 期望表目标带(F5) | level_monte_carlo 全带扫描(基线/+100%/+200%) | L1 基线通关率 ∈ [30, 50](现值 60% 越上界——加难杠杆批内执行,扫描落带前 provisional-pending-scan);越带须 OQ 登记——禁止静默出带 | -| AC-6 | L1 全部行集 | 枚举敌种与环段 | 每关至少一项新投放(新敌种或新环段——OQ8;L1 = goblin→bugbear→ogre_chief 三段 ✓) | -| AC-7 | Boss 行(Dmax) | F3 检算(期望口径 Σ=153.5) | r_boss 记录在案(现值 0.98 带内 ✓;越带须 OQ 登记——加难走廊 [1.1,1.35] 走 OQ2/扫描) | -| AC-8 | 每轮刷新 | 计数达 refresh_max_per_round | 第 N+1 次拒绝(表值驱动——A3 域行为,C3 侧验收 = 联动评估记录存在) | -| AC-9 | 任何 C3 直辖 knob 修订 | 检查其联动网络(Tuning Knobs 六组) | 对应联合检算记录存在于调参日志(禁止独立调参纪律的流程面) | -| AC-10 | DifficultyTable MVP 空表 | B2.spawn 任一 (L,D) | 无修饰行被消费(结构位不产生行为)且未来首行上线时套乘点 = 行值快照前 | -| AC-11 | scope=global 变异行 | MVP 腿:扫描 VariationTable 全行 | MVP 无 global 行存在(表级约束)且 A4 warning 通道在位;未来腿:elite/boss 标记字段落地时加载/生成期拒绝(A4 接口漂移义务——X-10) | -| AC-12 | 每次调参批 | 检查 README 调参日志 | 七步流程的执行记录齐备(流程纪律的可审计面) | -| AC-13 | 通关余量(新指标) | level_monte_carlo 通关轨迹采集 | E[HP_end \| 通关] 的 p90 ≤ 13 且 p10 ≥ 3("只剩一点血"量化带——越带按边界情况表杠杆处置) | -| AC-14 | 关级恒等式闭合 | actuals 逐项审计(流程第③步输出) | 输出侧五项(基础攻击/刀/clear_blast/A+B 充能/attack_up)与输入侧(承伤/治疗/减伤)合计闭合 Σ敌hp期望×(1+缓冲),残差 <5%(provisional 阈值)且奖励输出占比 ∈ [15%, 40%] | - -## 开放问题 - -| # | 悬案 | 进展 | owner | 时机 | -|---|---|---|---|---| -| OQ1 | L2+ 曲线数值——本 GDD 定结构/流程/目标带;具体数值行随关卡内容扩展填充(内容与数值同批——C2 关卡序列定稿后) | 结构已定 | C3 随批 | L2 内容扩展时 | -| OQ2 | Boss 血量占比——v3 记录值更正 0.98(153.5 期望口径,带内 ✓);加难走廊 [1.1, 1.35] 预登记(Boss 180–207 候选);真人实测 Boss 战时长后终裁 | 走廊预登记 | C3 | F7 扫描 + playtest 批次 2 | -| OQ3 | 真人修正系数——批次 1 方向确认:真人显著强于模拟者(v2 真人 100% vs 模拟 80%);F5 方向声明已更正落地;真人系数待 v3 试玩采集定量 | 方向已定 | C3 + playtest | playtest 批次 2 | -| OQ4 | 条款⑤支配性真人观测——批次 1 初步裁决:真人零弃图倾向 → 非支配设计态成立、C 量级不上调 ✓(B1 约束包②采信);**P1 对冲弱化同步声明(B1 ② 条件):本裁决弱化 A3 条款⑤对 P1 失败模式的经济对冲,弃图率观测加权监控随之**;维持登记:单一样本 | 初步裁决 | C3 + B4 | 持续 | -| OQ5 | 精英节点形态——完整语义(独立节点/词缀/出现规则)= C1 分支地图定稿后的联动设计(A1 定稿强制重审随之触发) | 未设计 | C3 + C1 | C1 GDD 定稿 | -| OQ6 | 轮内刷新对难度模型的冲击——批次 1 初步读数:刷新零使用,根因是盲猜墙不足(inferability 0.88);杠杆预登记:密度联动上探(d0.28/t0.85——A1 回退先例风险);保持开放 | 初步读数 | C3 | playtest 批次 2 | -| OQ7 | **加难杠杆扫描执行 + 完美策略档测量**——杠杆候选(r_boss 走廊 180–207 / 群战上探 / decay 0.6)已预登记;执行 = 七步流程第③步 level_monte_carlo 扫描(三档判定 + 通关率带 + 通关余量 + 占比四表对照)。**2026-09-14 完美策略档落地(用户拍板)**:零盲挖/全标旗/卡死刷新技能轴上界测量仪(godot 本机可用已验证)。**区间批已落地并复测(同日拍板②——奖励五行 power 区间 + 敌方 atk 区间 ±3)**:完美档 0 加成仍 100%(承伤 3.5→3.9)——**数值区间杠杆族对 ≤40% 验收线无效已实测坐实;主项待裁决 = 结构性杠杆三选**(承伤硬地板〔不可减免平伤,B1/B2 域〕/ weaken 饱和语义〔全标旗收益递减,B3/B1 域〕/ 极端区间宽度〔建议否决——毁基线与数字可读性锚〕);落带前 v3 值 provisional-pending-scan | 完美档已测;区间批无效性已证;结构杠杆待裁决 | C3 | 用户裁决后 | - -### 试玩批次记录 - -| 批次 | 日期 | 数值基线 | 读数 | 裁决产出 | -|---|---|---|---|---| -| 批次 1(用户本人) | 2026-09-12 | v2 | 全部满血通关(清图为主/优先标雷/不用道具三策略均通)——基线难度不足定量坐实;Boss 血量 OK 或可上调;刷新零使用;零弃图倾向;治疗包零使用(不掉血伴生);伤害道具无特色(暂保留) | v3 数值批(atk 4/4/6/4/7 → 7/5/9/6/9;D0 24 保持防秒杀、Boss 130→150)+ DND 命名批(goblin/bugbear/ogre_chief——用户指令)+ 护甲克制批(armor_type none/a/b + 克制矩阵,数值 provisional)+ F3 带修订 + OQ2/3/4/6 读数;v3 扫描:基线 60%、败北向 Boss 集中 4/6、+200% 100%;下一批 = v3 真人试玩(OQ3 定量 + OQ2 终裁) | -| 减伤墙批(defense_scan 触发) | 2026-09-13 | v3 + 减伤墙批 | defense_scan 实测墙轮 39%、真人局 12/12 轮零承伤满血通关——减伤墙过强定量坐实 | defense_up magnitude −50→−30(叠满两层 = −60 帽)+ 石肤权重 24→16(attack_up 升池内最高行)——B3 侧行值批,C3 承伤带(F4)复验责任随批 | - -## 版本历史 - -| 版本 | 日期 | 改动 | -|---|---|---| -| v2 | 2026-09-14 | /design-review 修订批(8 blocking 核销 + 4 项用户拍板):**F6 供给带退役 → 生存链区间模型**(S/K 区间三档判定 + 关级恒等式 + 输出占比带 + C4 平移换算率——用户设计)· **带锚定稿**(通关率 [30,50] / 通关余量 p90≤13 & p10≥3 / L1 形态带)· F3 口径统一 Σ=153.5 / r_boss 0.98(旧验算 142 替代)+ 加难走廊预登记 · F4 升级生存侧(S 区间)· F5 带 [30,50] + 真人方向更正 · **MVP 行值总表 v3 转正**(切片 .tres 权威源,旧 SLICE-TUNED 表替代)· DND 更名生效(goblin/bugbear/ogre_chief)· **四批转正登记**(armor_type / K_dmg=0 / clear_blast 换位 / 供给控制器归 B4——用户拍板)· B1/B2/D2/registry 接口漂移回写(X-6~X-10)· F7 六步→七步(B4 对账重制步)· AC-4/5 重写 + AC-13/14 新增 · 条款⑤重推(C=40,缺口 6.1/51.8)· Boss atk 台阶重定义 · 减伤墙批补录 · OQ7 新增(扫描执行) | -| v1-lean | 2026-09-13 | 格式迁移:legacy 原稿按 lean 样例重排——修订注记出正文收敛至本表;规则/枚举/边界情况/对账登记/AC 转表格;曲线生成与调参流程转字符画;公式、Variables 与验算数据全保留;F3 带按现行 [0.5, 1.1] 成文;语义零变更 | -| 试玩批次 1 / v3 数值批 | 2026-09-12 | 遭遇随机化引入(unit_count 区间语义 + RngService encounter 封闭流——Roguelike 局感引入批,Peglin 对比报告结论 2 的本切片落地项);F3 带修订 [0.35, 0.55] → [0.5, 1.1];v3 数值批(atk 7/5/9/6/9、Boss 130→150、D0 24 保持防秒杀)+ DND 命名批 + 护甲克制批;OQ2/3/4/6 读数登记(条款⑤非支配设计态采信) | -| 初稿 | 2026-09-12 | solo 模式出稿:九核心规则 + F1–F7 + 12 AC + 六 OQ;SLICE-TUNED 转正声明;Boss=Dmax 约定、DifficultyTable 结构位与 scope=global 语义定稿 | diff --git a/design/gdd/legacy-2026-09-14-v1/d1-hud-framework.md b/design/gdd/legacy-2026-09-14-v1/d1-hud-framework.md deleted file mode 100644 index 2dc7b5cf..00000000 --- a/design/gdd/legacy-2026-09-14-v1/d1-hud-framework.md +++ /dev/null @@ -1,771 +0,0 @@ -# D1 HUD 与界面框架(HUD & UI Framework) - -> **状态**:Designed · lean 格式(评审后修订稿——评审记录见 `design/gdd/reviews/` 与版本历史) -> **版本**:v1.0-lean · 2026-09-13 · 作者:user + agents -> **承载支柱**:P1 主("我算对了"看得见的感知面)· P2 主(逐行归因的呈现半边)· P4(地牢氛围容器:五区布局与能量档承载) -> **层级**:Layer 4 Presentation · Milestone MVP · 设计顺序第 10 位(MVP 最后一块) -> **上游**:A1–B4/B1 + D2 全部 Approved(C3 为 Designed 未经评审——D1 零玩法消费;battle.md APPROVED · art-bible §1–4 定稿)——项目首个零玩法上游假设的表现层系统 -> **一句话**:D1 把 A1–B4 的全部玩法事实变成玩家看得见、点得动、归因得了的界面——零玩法状态的双层边界呈现框架。 -> **复核注记**:solo 模式下 creative-director(体验锚点情绪定位——与 battle.md Purpose & Player Need 同源,本节为系统级转写)与 art-director(Visual/Audio 与 art-bible 一致性)未经咨询——生产前人工复核。呈现义务承载依据 = `design/ux/battle.md`(APPROVED,§13 台账 27 项经 ux-review 实存验证)+ `design/art/art-bible.md` §1–4。 - -## 速览 - -| 关键问题 | 答案 | -|---|---| -| 定位 | 呈现层框架:战斗屏(MVP 唯一玩法屏,五区常驻双舞台布局,屏级 spec = `design/ux/battle.md`)+ 一族共享呈现设施——toast 提示体系、模态覆盖层家族(图例 / 明细回看 / 胜负终局)、输入翻译(鼠标意图 → A2 意图对象)、模态层级管理、面向呈现的信号载荷契约、ux 遥测 | -| 拥有 | 系统级呈现契约:五区布局落位与常驻组件呈现形态 · 输入翻译与单意图帧收集 · toast/图例/提示体系 · 模态层级纪律 · 13 项信号载荷 schema · 程序化占位策略 · 键位映射表挂接 · ux 遥测 · F1 呈现几何与 F2 可读性判据执行 | -| 不拥有 | 任何玩法状态与玩法数值(读经核心只读面与封装呈现面、写经组合根——架构七原则"依赖单向组合根",ADR-0001/0003)· 屏级布局/组件/交互/动画时长裁决权威(battle.md)· 美术裁决(art-bible)· 机制语义(各玩法 GDD)· 动画密度(B5)· 音频(D4) | -| 上游输入 | A2 三事件流 + 呈现面(`current_board` / `reveal_record` / `compute_move_path`)· A3 getter(phase/ap/rap/last_round_end)· B1 步骤流(13 类行协议)+ `presentation_snapshot` / `is_battle_live` / `stock_count` / `query_reward_identity` · B2 单位投影 · B3 状态投影(经 B1)· B4 库存/身份载荷(经 B1)· runner 节点链/当前节点/HP 携带 | -| 下游输出 | B5(hard):五区布局与双舞台裁决、B 区演出区结构、明细带呈现位、行协议呈现语义、敌人卡呈现语义、art-bible §4.6 键位映射表——B5 只叠动画密度与演出 · D4:音频挂点事件源 · D5:教学承载位 · D6:本地化契约消费 | -| 硬约束 | 零玩法数值字面量 · 零规则逻辑(不判合法性、不裁语义)· 零核心写调用(唯一发生在组合根)· 零 RNG · 呈现层永不直订 A2/A3(ADR-0001——只订 B1/runner 信号 + 命令式回执)· 禁回读核心生命周期状态(只许成文呈现面与快照) | - -D1 的存在理由(四条): - -- **义务承载**:systems-index 门禁体系向 D1 登记 27 项呈现义务(A2×6 / B2×4 / B3×4 / B4×5 / B1×3 / A4×3 / A3 + A1 EC5——逐项落位表见依赖节,缺项即 blocking),battle.md 已逐项裁决呈现形态,本 GDD 升格为系统级 Core Rules 与 AC。 -- **切片教训兜底**:垂直切片两起呈现层崩溃(窗口载荷缺字段、battle_finished 后读已销毁对象)暴露"已定稿 AC 全覆盖 core、呈现层零测试承载"的系统性盲区——本 GDD 落实三条硬性要求:信号载荷 schema 成文(Rule 17)/ 场景级 headless 测试进 AC / 信号时点状态可见性规则(Rule 18)。 -- **美术解耦**:art-bible §4.6 图标键契约已冻结(键与通道分配定稿、终稿美术归样张批),样张未制作不阻塞 D1——呈现层以程序化占位先行(白话:用代码按冻结色板与形状规则直接画出的临时图形,终稿美术到位后原位替换),验收引用 art-bible §1.4 格子样张标准(Rule 19)。 -- **无 D1 的后果**:A2 的三事件流没有读者、B1 的流水协议没有呈现面、27 项上游义务没有兑付点——"自动战斗沦为无聊过场"(game-concept 已识别风险 #1)的防线就设在 D1 的逐行明细与高光反馈上。 - -## 体验锚点 - -| 支柱 | 关键词 | 机制承诺 | -|---|---|---| -| P1 推理掌控感(感知面) | "我看见的每一步都是真的" | 四种格态一瞥可辨(左键双义消歧前提——误挖不可逆)· 悬停预承诺三态光标 · 可挖域常驻呼吸微光 · 每次拒绝可感知——规则层的诚实(A2 数字恒真、三源拒绝)由呈现层原样送达;任何呈现失真(雾格显影 / 拒绝吞掉 / 格态混淆)= P1 的死亡体验 | -| P2 规划延迟兑现(呈现半边) | "这个结果是我哪步扫雷带来的" | 结算明细逐行兑现 + 每行来源标注(B1 流水行协议)· 四类未生效行不静默 · 零值行不被吞——P2 裁剪判据的最后半米由 D1 走完 | -| P4 地牢氛围容器 | "挖掘期一块干净的玻璃,结算期一场丰收" | 挖掘期画面无杂音(能量 2/10,唯一在动 = 悬停呼吸微光——art-bible §2.1)→ 结算期金橙光带逐行横扫(7/10)→ 清图金粒喷泉短促丰收(8/10)→ 失败暮蓝最静一拍(1/10)——§2 能量档与明度恒定硬规则由 D1 的转场与反馈系统承载 | -| 高光节拍 | "完美被加倍看见" | 完美排雷全屏喝彩级反馈(金光带加倍 + 「完美排雷 ×2」横幅)+ 标中旗金框行 + H2 清图奖励金框——P2 爆发兑现节点(创意风险 #2 落点) | - -- 直接承载(Section A 定框):玩家每一次点击、每一行结算、每一面旗都直接与 D1 互动——情绪目标 = **"我看见的每一步都是真的"**:数字是真实雷数(雾格只是不显示,数据层恒真)、拒绝有原因、voided 有提示、结算逐行可归因。 -- 参考感受:Into the Breach 的格内信息分层(预告上格——威胁画在格子上)+ 杀戮尖塔的逐卡结算反馈。 -- **反向护栏**:界面绝不替玩家思考(不预判合法点击以外的东西)、绝不静默改判(voided 不提示 = 读感欺骗)、绝不用装饰伪装逻辑差异(art-bible 原则三)——玩家对 D1 的正确感觉是"一块干净的玻璃":看穿它直接看到棋局与战果,玻璃本身不添乱。 - -## 全局流程 - -### 呈现刷新链路(命令式回执 + 事件流双通道) - -``` -玩家输入(D 区,仅挖掘期可交互;全部操作纯鼠标可完成——Gamepad Partial 非 MVP) - │ 左键已开格 = 移动 ─ 左键未开相邻格 = 挖 ─ 右键 = 插拔旗 ─ 停手按钮 = settle_batch([stop]) - ▼ -单意图帧收集(一帧内 collected 意图整批;stop 点击终结当帧收集;F4 语义序仲裁退为防御性兜底) - ▼ -组合根 ──► A2 settle_batch(intents) [唯一写路径;零直调 A3] - │ - ├─ 回执链(零事件外发动作:旗插拔 / 移动 / AP / RAP / 库存——Rule 2 命令式回执) - │ settle_batch 返回 → 组合根立刻重查只读面(current_board / A3 getter / query_inventory) - │ → 视图 setter 只读注入 → 就地更新(字段级 setter,禁全量重建) - │ - └─ 事件链(A2 cell_revealed / flag_judged → B1 按轮缓冲) - ▼ - B1 结算编排(七段)→ 步骤流(13 类行协议——呈现层唯一订阅面之一) - │ - ├─ 明细带:逐行来源标注「{行为} {值} → {目标}(来源)」→ 84px 实时流(挖掘期收起为 24px 摘要) - ├─ 窗口锚点(授予段后、增益/减益段前):E 区原位激活(usable_now 投影;空库存 skip 不弹窗) - ├─ 高光:flag_hit 金框行 ─ clear_reward_h2 金框 ─ perfect 独立高光行(全屏喝彩级) - ├─ 状态栏刷新(B3 零信号外发):绑 B1 结算编排完成时点(命令式) - ▼ - 判定段 → 判定行(终局呈现数据锚)→ presentation_snapshot()(despawn 前捕获——Rule 18①) - ▼ - 终局呈现(胜利金蜡封 / 失败暮蓝 overlay)→ 状态槽全清 + RAP 清零反馈(battle_over) - ▼ - level_clear(关卡末)→ 库存清空反馈「剩余道具 ×N」→ 下一节点 / 返回(runner 推进,写经组合根) -``` - -### 出口分发 - -| 出口 | 触发 | 呈现动作 | 约束 | -|---|---|---|---| -| 继续挖掘 | settle_batch 回执、轮次未结束 | 命令式重查刷新对应面;明细带保持上轮摘要 1 行 | 每帧至多一批提交(单意图帧) | -| 结算展示 | `round_end`(A2 棋盘路径 / A3 stopped 直发——双发射源同构) | D 区锁输入(去饱和 + 金橙色相偏移、明度不变、数字保持全对比);明细带展开 84px 逐行兑现;阶段指示→"结算中";能量 7/10 | 呈现订阅面 = B1 步骤流;零直订 A2/A3 | -| 清图换图 | cleared 判定 | 金粒喷泉 + 彩纸 3–5s 即收;H2 清图奖励行金框强调;随后换新图 install(200ms 淡入) | 完美排雷高光叠加于清图瞬间之上 | -| 道具窗口 | B1 授予段完成(窗口锚点信号) | E 区原位激活(Rule 13);选用/跳过 → 回结算流(结算阶段续) | 空库存直接 skip 不弹窗、结算零停顿 | -| 战斗终局 | 判定行 verdict=win / lose | 胜利 = 金蜡封 + 暖白金 overlay;失败 = 暮蓝 overlay(明度不变);终局数据全部来自流水行 + `presentation_snapshot()` | 出口 = 下一节点(win)/ 返回(lose)——写经组合根 | -| 关卡结束 | level_clear 编排 | 库存清空反馈「剩余道具 ×N 随关卡结束清空」(N = 清空前快照计数) | 与 battle_over 反馈不合并、时序不倒挂 | - -## 核心规则 - -> 每条规则两段:**人话**(作用于哪个系统、什么情况下、谁触发、触发后发生什么;效果与情况用枚举表)→ **举证**(计算方法/公式;纯流程规则明写"无计算")。 -> **归属声明**:屏级布局、组件形态、交互细节、动画时长的裁决权威 = `design/ux/battle.md`(APPROVED)——本 GDD 引用其裁决不重复论证,只做三件事:① 升格为系统级 Core Rules 与 AC;② 补齐 spec 之外的系统级契约(信号载荷 schema / 订阅纪律 / 程序化占位 / 命名统一 / 遥测);③ 逐项落位 27 项门禁义务。冲突时以 battle.md + art-bible 为呈现形态权威、以本 GDD 为系统契约权威,机制语义以各玩法 GDD 为准。 - -#### 规则 1:界面只当翻译不当裁判——数值不写死、对错不自己判、核心数据不碰 -**人话**:这条管 D1 自己的代码边界。屏幕上出现的每个玩法数字都不是界面写死的——全部从上游系统的只读接口现读现显;一个动作合不合法、一个结果算什么意思,界面一律不裁——交上游裁定,界面只把裁定结果翻译成画面;挖格、插旗、选道具这类改变游戏状态的操作,界面只递话,真正的写入只发生在组合根一处。界面单元只做两件事:向外发信号、被 setter 注入数据后就地刷新。 - -| 界面不做什么 | 实际从哪来 | -|---|---| -| 不写死玩法数值 | 期望值全部经核心只读面读表值现推 | -| 不判合法性、不裁语义 | 一切判定交上游,呈现只翻译结果 | -| 不直接写核心状态 | 写调用全部经组合根一处下发 | - -**举证**:无计算。视图单元九件套 = BoardView / HUDView / HudPresenter / BattleLogView / ItemWindowOverlay / NodeOverlay / LevelStripView / TunePanel / UiKit(切片九单元形态转正);零玩法数值字面量的读表口径 = D2 Rule 1 对呈现消费面的适用;写路径唯一入口 = 组合根(ADR-0003 Key Interfaces)。 - -#### 规则 2:界面听消息只走中转,不私接玩法系统的线 -**人话**:这条管界面怎么"听到"游戏里发生了什么。界面永远不直接订阅扫雷系统(A2)与行动经济系统(A3)的通知——要听的消息全部由组合根接线转发,或直接来自结算编排(B1)的流水信号与关卡进程(runner)的信号。棋盘、资源、库存这些"不发通知"的数据面靠命令式回执刷新:动作调用一返回,组合根立刻重查一次只读数据来刷新界面,而不是干等通知信号——部分动作本来就不发信号。 - -| 界面听什么 | 从哪听 | -|---|---| -| 结算流水与结算快照 | B1 步骤流信号(经组合根接线) | -| 关卡进程信号 | runner | -| 不发通知的面(棋盘 / AP / RAP / 库存等) | 动作回执后命令式重查只读面 | - -**举证**:无计算。订阅纪律固化自 ADR-0001;battle.md §Events Fired 的"呈现订阅 A2 三事件"表述按本条收窄为"经组合根转发或命令式回执"(措辞差登记冲突清单⑥,battle.md 正文不改动)。 - -#### 规则 3:读数据只走登记过的口子,内部字段一律不碰 -**人话**:这条管界面取数。界面要显示的每个数据,只允许从一张成文的"读数清单"里拿,清单之外的私有字段直读一律禁止。清单按数据来源分家:棋盘事实读扫雷系统,阶段与资源读行动经济的 getter,结算、库存、战斗存活性读结算编排,敌我单位读战斗系统的只读投影,关卡进度读关卡进程;状态效果与战斗背包没有直读口子——一律经结算编排转交。 - -| 数据从哪来 | 允许读的口子 | -|---|---| -| A2 扫雷 | `current_board()`(格态/旗/小人/变异只读投影)、`reveal_record()`、`compute_move_path(cell)`(不可达返回空——预览与执行同源) | -| A3 行动经济 | `phase / ap / rap / last_round_end`(getter-only) | -| B1 结算编排 | `presentation_snapshot() / is_battle_live() / stock_count() / query_reward_identity()` + 步骤流信号 | -| B2 战斗单位 | `hero_unit() / all_enemies()` 投影 | -| B3 / B4 | 零直读——经 B1 呈现面与流水投影(协作对象私有化) | -| runner | 节点链 / 当前节点 / HP 携带(A 区) | - -**举证**:无计算。读接口白名单 = 上表(封装收口批 entry 39/40 转正);登记载体 = registry `d1_presentation_surface`(切片实现、owner GDD 契约登记待批——接口漂移见冲突清单⑧/OQ3)。 - -#### 规则 4:界面的每个动作都走同一条提交通道,总闸只有组合根 -**人话**:这条管界面"递话"。玩家在界面上能发起的每类操作各只有一条提交通道,而且全部先过组合根这道总闸、再由总闸转给对应系统——没有任何绕过总闸的第二写入口。每帧至多提交一批意图(单意图帧,规则 7)。 - -| 玩家动作 | 提交通道 | -|---|---| -| 挖掘 / 插拔旗 / 移动 / 停手 | A2 `settle_batch(intents)`——停手也打包成 stop 走同一接口,不直调 A3 | -| 窗口里选道具 | B1 `submit_window_selection(窗口条目位置序)`——传窗口条目位置,不传库存句柄 | -| 弃图刷新 | 组合根提交刷新意图 → B1 `refresh_board` 编排:A3 扣费 → A2 retire → A1 generate → A2 install → B4 roll_board | -| 节点推进 | runner | - -**举证**:无计算。窗口选择传位置序 = 切片缺陷④的契约修正;停手不经 A3 直调 = 义务 A2×6①;单意图帧 = 规则 7。 - -#### 规则 5:战斗画面分五区常驻同屏,棋盘与敌人不切场景 -**人话**:这条管战斗屏的骨架。1280×800 基座下(canvas_items/expand 拉伸),战斗画面固定分成五块常驻区域:关卡进度条、战斗画面、角色信息、扫雷图、道具栏。战斗画面与扫雷图同屏常驻是硬形态:挖掘期敌人在上方待机可见、结算期原地展开明细,全程不切场景——这是对"双舞台陷阱"的第三形态裁决输入。逐区位置、尺寸与内容见下方实现参照表。 - -**举证**:无计算。分区尺寸与组件落位的屏级权威 = `design/ux/battle.md`;拉伸模式 = ADR-0002;五区布局为结构冻结项(非调参 knob,修订走 GDD 流程)。 - -### 规则 5 的实现参照——五区布局规格 -| 区 | 位置 / 尺寸 | 内容 | 数据源 | -|---|---|---|---| -| A 关卡进度条 | 全宽 28px | 节点链步进、当前高亮、已过暗金(LevelStripView) | runner | -| B 战斗画面 | 全宽 252px | 英雄卡 + 敌人卡 ×1–3 + 轮次·阶段指示 + 结算明细带(24px 摘要 / 84px 实时流) | B2 投影 + B1 步骤流 | -| C 角色信息 | 左下 240×520 | HP / 攻击值含修正显示 / RAP 数据框(直角细线素面)+ 状态效果槽固定 4 槽 + 小人立绘占位 | A3 getter + B3 投影(经 B1) | -| D 扫雷图 | 中下 ~760×520 | AP 点阵条 44px(停手按钮居左、图例与弃图刷新按钮居右——刷新按钮置雷图右上角)+ BoardView 棋盘 + toast 槽(上缘内侧) | A2 呈现面 | -| E 道具栏 | 右下 280×520 | 库存常读列表 + 窗口态原位激活 | B4 库存载荷(经 B1) | - -#### 规则 6:敌人卡把"它是谁、下拍干什么、还剩几滴血"全写在脸上 -**人话**:这条管 B 区的敌人卡(B2 敌人系统的呈现承载)。每张敌人卡固定六件套,玩家不点开任何东西就能读出敌人的关键状态: - -| 卡面元素 | 玩家读出什么 | -|---|---| -| 敌像 | 这是谁——姿态即线索 | -| 血条 | 还剩多少血(hp/max_hp 数字可读) | -| 顺位徽标 | 它第几个出手(固定顺位可读) | -| 意图徽标 | 下一拍它要干什么——把即将执行的一拍的视觉状态摆出来;挖掘期全程可见,结算期不另设播片 | -| 行为环点 | 行动周期多长(环点数 = 环长)、现在走到哪(当前位置高亮) | -| 状态槽 | 它身上挂着什么增益减益 | - -**人话**:三条纪律:伏击层数是全体敌人共享的一个数——各卡显示同一个值;敌人死亡 = 血条直角递减归零 → 卡体灰化 + 碎裂退场,禁止瞬间消失;战斗段被短路掐灭的重击不单独产行动明细行(从行序可推断)。敌卡刷新必须就地更新(字段级 setter),禁止逐行重建——全量重建会把死亡灰化态吞掉。 - -**举证**:无计算。敌像线索键 = art-bible §4.6.4(强度档位与环长的直觉编码——意图线索映射目录见依赖节附表);意图预告时序 = B2 Rule 8⑤;侧池共享单值(数据源 = B1 流水经 B3 投影)与顺位徽标的义务源 = B2×4④ / D1×4③④;禁瞬消 = B2 资产下限;就地更新 = 切片 entry 36 教训。 - -#### 规则 7:鼠标点哪就是哪个意思,一帧内的操作合成一批提交 -**人话**:这条管 D 区输入。界面把鼠标动作翻译成扫雷系统的意图对象: - -| 鼠标操作 | 翻译成 | -|---|---| -| 左键点已开格 | 移动(免费) | -| 左键点未开的相邻格 | 挖 | -| 右键 | 插旗 / 拔旗 | -| 点停手按钮 | 提交 stop——本轮结束 | - -**人话**:单意图帧纪律:一帧内收集到的意图整批提交,点到停手当帧收集立即终结——语义序仲裁只作防御性兜底(生产面造不出会乱序的输入)。悬停预承诺:光标按目标切换三种语义、目标格边框高亮——点下去会发生什么,先看见再点。可挖域常驻指示:小人八向相邻的未开格呼吸微光,是挖掘期唯一在动的元素。悬停不可挖域 = 禁止光标 + 每 run 一次提示「需先走近(点击已开格移动,免费)」。点击远格自动"先移动再挖"的复合意图本期不做——移动免费高频,两击的摩擦符合观测假设。 - -**举证**:无计算。光标三语义与伴随指示见「枚举·光标语义」;no_adjacent 提示见「枚举·一次性提示 hint_id」;单帧整批与每次拒绝可感知的义务源 = A2×6①⑥,悬停预承诺 = A2×6③;复合意图不做 = A2 评估项留痕(P4 ≤2 观测假设);F4 语义序仲裁退为防御性兜底(联合清图让位条款生产面不可达)。 - -#### 规则 8:悬停已开的格,先画给你看小人会怎么走 -**人话**:这条管移动的手感。悬停在任何已开格上,界面立刻把小人到那格的合法路径用蓝色细线点迹画出来——它回答"点这里小人会怎么走",是合法性指示,不是穿行动画。真正执行移动用不超过 150 毫秒的短滑表现。备选方案"穿行动画轨道"明确不采纳:移动免费且高频,动画时间税违反点击摩擦护栏;playtest 若反馈"移动太瞬"再议(留痕,旋钮 = move_slide_ms)。 - -**举证**:无计算。路径数据 = `compute_move_path` 的 BFS 结果(不可达返回空——预览与执行同源);短滑时长 ≤150ms 与再议挂 playtest 观测(battle.md OQ5,knob = move_slide_ms);合法性指示定稿义务源 = A2×6⑤(继承 battle.md 布局决策 D3)。 - -#### 规则 9:四种格子一眼分得清,黑白截图也能逐格分类 -**人话**:这条管棋盘可读性的根。棋盘上四种格态——已开 0 格、已开雾格、未开格、未开雾格——必须一眼可辨,灰度截图下也能逐格分类。这是左键双义的消歧前提:点已开格是移动、点未开格是挖,而误挖不可逆(花 1 AP、可能触雷)——两种格子看起来一样就是事故。已引爆的雷格要"可通行可读":已开的底 + 巢穴纹(危险红族)+ 可作移动目标的视觉线索——走过的雷、能走。四态的视觉构成与语义见「枚举·四种格态」。 - -**举证**:无计算。数字显示判定数据源 = `variant_ids`(digit 恒真透传、雾格隐藏呈现——A2 Core Rule 2;呈现层禁读真实数字自行判定);绘制优先级栈:数字 > 小人 > 旗 > 徽章 > 变异纹理 > 底色,任何元素不遮挡数字、小人与旗不得覆盖文本(art-bible §1.2);义务源 = A2×6②④。 - -#### 规则 10:奖励是什么、包里有什么,随时一眼可读 -**人话**:这条管奖励身份的呈现(B4 奖励系统的呈现承载)。已开的格子里若藏着奖励,格面显示它的家族类型徽章、拾取瞬间档位可读;右侧道具栏是挖掘期的规划面——背包每一件一行: - -| 常读条每行显示 | 说明 | -|---|---| -| 图标 | 家族键定纹样(同族不同档可互辨——刀的两档并排分得清) | -| 名称 | 道具显示名 | -| 属性简述 | 行值快照派生的一句话(伤害 / 回复 / 增益) | -| 状态 | 在包 / 已用(已用的过滤出常读条) | - -**人话**:悬停看完整描述与触发注记,但看不到来源——来源归因是结算明细行的职责。奖励身份键全局恒定、跨 run 禁重掷。其余口径(徽章键集、MVP 呈现范围、栈位、枚举序、Used 过滤)见下方实现参照表。 - -**举证**:无计算。逐项口径与依据 = 「规则 10 的实现参照——奖励徽章与库存常读条」;义务源 = B4×5①。 - -### 规则 10 的实现参照——奖励徽章与库存常读条 - -| 口径 | 内容 | 依据 | -|---|---|---| -| 格面家族徽章 | 五键 attack/defense/heal/blast/weaken——键集冻结;五键槽位在程序化占位映射表预留、未启用键不呈现 | art-bible §4.6.3 | -| 拾取瞬间 | 格面徽章 tier 档位可读 | H1 节拍 | -| 库存徽章 | 八键、reward_id 键——knife_t1/knife_adv 同族互辨是硬需求 | art-bible §4.6.2 | -| MVP 呈现范围 | 格面徽章只在已开格呈现(未开格不预告身份) | B4 Rule 8 现行锁定;art-bible §4.6.3"未开格预读徽章"呈现前提属极性提案实施批——冲突清单⑤ | -| 徽章栈位 | 旗之下、变异纹理之上、不进数字区、不构成格内第二焦点 | art-bible §3.4 | -| 常读条枚举序 | 入包受理序 | B4 E21 | -| tooltip | 完整描述 + 触发注记、不含来源(来源归因由结算明细行承载) | battle.md 口径 | -| Used 过滤 | 已用件过滤出常读条——查询面保留只读、过滤归呈现 | query_inventory 保留只读 | -| 身份恒定 | reward_id / enemy_id / effect_id 三键全局恒定、跨 run 禁重掷 | B4×5① | - -#### 规则 11:身上的增益减益看得见、好坏分得清、没了有交代 -**人话**:这条管 C 区状态槽(B3 状态系统的呈现承载)。角色信息区固定 4 个状态槽,每槽四件套: - -| 槽位元素 | 玩家读出什么 | -|---|---| -| 图标 | 哪种效果(形状纹样定身份,色相不承载身份) | -| 层数角标(L) | 叠了几层 | -| 剩余结算次数点(R) | 还会结算几次 | -| 悬停 tooltip | 来源 + 语义 + 剩余 | - -**人话**:好坏一望即知:有利 = 金族满框、有害 = 红族缺框——判别按效果键的极性表,不看数值正负(存在负值的增益,光看池归属也判不了极性)。开局没有任何状态 → 整排槽隐藏、HP/攻击/RAP 数据框上移补位(空槽占位浪费紧张的纵向空间);图例面板载一句空态说明:「战斗中拾取的增益在此显示,随战斗结束消散」。状态系统不发任何信号——状态栏刷新绑定在结算编排完成的时点(命令式)。 - -**举证**:无计算。逐项口径与依据 = 「规则 11 的实现参照——状态槽呈现口径」;义务源 = B3×4①②③。 - -### 规则 11 的实现参照——状态槽呈现口径 - -| 口径 | 内容 | 依据 | -|---|---|---| -| 图标键 | 效果图标七键——形状纹样身份、色相不承载身份 | art-bible §4.6.1(七键冻结) | -| 极性判别 | 键级极性表:attack_up/defense_up/weaken 有利、ambush 有害——禁以 magnitude 符号判极性(负值增益存在;pool 亦不足以判——enemy_output 池两向并存) | B3×4③ | -| 极性键扩容 | 提案扩展键 enrage/off_guard/sapped 随极性提案实施批 | 极性提案实施批 | -| 语义归属 | 经 SettlementTable `effect_pool_map` 成文(作用面) | B3×4③ | -| 空态裁决 | 槽整体隐藏 + HP/攻击/RAP 上移补位(D1 定稿) | B3×4① | -| 数据源 | B3 投影:六归因字段 + display_name + 授予时数值快照(经 B1 编排面) | B3 已 schema——引用 | -| tooltip 文案 | source_class 文案经 B1 `source_label_map` | B1/B3 协作 | - -#### 规则 12:结算逐行念账——每笔收益标明来源,该高光的当场高光 -**人话**:这条管结算明细带与高光(B1 流水的呈现承载 + B4 行语义)。结算推进时,明细带把 B1 流水逐行实时滚出,每行标明「做了什么、多少、到谁头上、因为什么」——玩家能把每一分收益对回自己哪一步扫雷决策。行按类型各有呈现口径(见下方实现参照表);高光分三档:标中旗金框、清图奖励金框、完美排雷全屏喝彩级——庆祝不打在空兑现上。 - -**举证**:无计算。行协议 = 13 类封闭枚举(B1 Core Rule 14——字段分层见载荷表 #4);高光使用规则 = 事件型用独立高光行、属性型强调用行字段标记(B1);义务源 = B4×5③④ / B1×3①②。 - -### 规则 12 的实现参照——结算明细行呈现口径 - -| 行的类型 | 呈现口径 | 依据 | -|---|---|---| -| 生效行(伤害 / 道具入库) | 实时滚出,逐行来源标注「{行为} {值} → {目标}(来源)」——模板插值,行宽预留 40% 膨胀 + 固定槽高 + clip_contents | 切片缺陷①回归 | -| 效果行 | 两列分示:value = 单次贡献值、pool_value = 池合成值——禁相加(防"−130%×2 行 = −260%"误读) | B1 Core Rule 14 字段 | -| 零值伤害行 | 照常可见、不被吞 | B4×5③ | -| 未生效四类行 + 标旗未中行 | 聚合计数呈现(防逐行惩罚轰炸)+ 形状冗余(图标 / 划线——非色相独载,色弱清单 #9) | B4×5③ | -| 四类未生效行划分 | 道具行(入库 / 生效语境注记)/「奖励未生效」(聚合计数)/「已消耗未生效」/「使用被拒」 | B4×5③ | -| 未选用件 | 语境注记「未选用件随关卡结束清空」(关卡域口径) | B4×5③ | -| 标中旗高光行 | 旗化暴击弹道加重 + 明细行金框(chord 缺席的即时兑现补偿) | B1×3① | -| H2 清图奖励行 | 金框高亮行(轮末仪式峰值) | B1×3① / B4×5④ | -| 完美排雷 | 全屏喝彩级:金光带加倍扫射 + 「完美排雷 ×2」横幅;高光行 value = 实际有效兑付当量;首份即零兑付不发高光 | B1×3② / art-bible §2.2 最高档(创意风险 #2 落点) | - -#### 规则 13:轮末道具窗口在道具栏原地亮起,至多选一件 -**人话**:这条管轮末道具窗口(B4 的呈现承载)。结算推进到窗口锚点(授予段之后、增益减益段之前)时,E 区道具栏原地激活:面板点亮金描边、标题换成「轮末道具窗口 · 至多选用 1 件」,阶段指示同步标出窗口锚点位置;棋盘区去饱和 + 金橙色相偏移并锁输入(明度不变)。满血的治疗包灰置、悬停说明禁选原因(「HP 已满 · 禁选」)。 - -**人话**:选中即承诺——窗口关闭、回结算流,提交的是窗口条目位置;跳过按钮恒在;政策注记常驻「未选用件随关卡结束清空」。背包为空就不弹窗(窗口标记照常登记——回放输入完整性归 B1),结算零停顿。窗口期棋盘输入不竞争——结算期棋盘本就锁输入。窗口激活期间跳过常读条全量重建——全量刷新会冲掉窗口态。 - -**举证**:无计算。E 区原位激活 = battle.md 布局决策 D2;usable_now 投影 = B1 组装载荷;去饱和 + 金橙偏移 = art-bible §2 明度恒定硬规则的合规化实例;窗口触发政策 = MVP 有库存恒弹(候选"仅可用品触发 / 常驻库存条非模态"归垂直切片——B4 D1 义务②注记);窗口态 stomped 教训 = 切片 entry 36;义务源 = B4×5②。 - -#### 规则 14:新机制第一次遇到给提示,忘了随时查图例 -**人话**:这条管 toast 提示、图例面板与教学承载。toast = 棋盘区上缘内侧浮出的非模态提示:自动消退 2.5 秒、不劫持输入、不打断挖掘流。一次性提示共三种(雾首遇 / chord 肌肉记忆 / 不可挖域走近),每个整 run 只弹一次;拒绝、voided、零合法板的提示不属于一次性族——每次都要可感知。 - -图例面板 = 模态覆盖层:格态 / 变异 / 雾语义三组条目,「迷雾 = 无雷盲区」条目恒在、不设解锁门、可随时回看,并载状态槽空态说明(规则 11)。文案定稿权归实现期文案 pass——本规则只锁必含要点与形态。 - -**举证**:无计算。一次性提示封闭枚举(三值 = 雾首遇 / chord / no_adjacent——同时是遥测值域与去重键)的触发、必含要点与频次见「枚举·一次性提示 hint_id」;拒绝与 voided 呈现映射见「枚举·拒绝与 voided 呈现映射」;零合法板见边界情况表;义务源 = A2×6③ / A4×3①②。 - -#### 规则 15:雾格有雾的样子,整片雾开完只报一次"开完了" -**人话**:这条管雾图的呈现(A4 雾变体的呈现承载)。双通道画雾:没开的雾格 = 掩尘完整砖 + 雾纹带——雾身份走形状通道、色相不承载;开过的雾格 = 地板无字 + 底色层淡雾 tint 残留——残留 tint 与"已开 0 格"必须灰度可判定区分:0 格携带"八邻无雷"的推理信息,混淆即污染推理。整片连续雾区全开时,完成信号以视觉合并域为单位一次呈现——相邻两个雾区规则上是独立实例、呈现上合并成一片,禁止逐实例响两次。 - -**举证**:无计算。雾语义条目(无雷盲区)见图例(规则 14);tint 与完成信号随雾重设计批可复核(art-bible 雾格资产占位——内容封禁期);双雾区相邻 = A4 EC11(边界情况表);采纳裁决 = OQ8(battle.md);义务源 = A4×3③。 - -#### 规则 16:一场打完,输了赢了、剩什么没了什么,样样有交代 -**人话**:这条管战斗收尾与资源变化的反馈(B3 / A3 / B4 的呈现承载)。六种反馈各有触发与呈现,逐项见下方实现参照表:胜负终局、状态槽全清、RAP 清零、库存清空、Boss 遭遇变体、弃图刷新确认。两条硬线贯穿:暮蓝 overlay 是全部界面里唯一的暮蓝档、明度不变——失败氛围靠色相与运动表达、不靠变暗;不存在"RAP 满自动刷"——刷新的决策主体恒为玩家。 - -**举证**:无计算。逐项触发与呈现 = 「规则 16 的实现参照——终局与清空反馈」;battle_over 与 level_clear 两反馈不合并、时序不倒挂(边界情况表);"禁止 RAP 满自动刷" = A3 Rule 11;义务源 = B3×4④ / A3 / B4×5⑤。 - -### 规则 16 的实现参照——终局与清空反馈 -| 反馈 | 触发 | 呈现 | -|---|---|---| -| 胜利终局 | 判定行 verdict=win | 金蜡封落于扫雷图区中央 + 全屏暖白金 overlay + 判定行(终局判定行 = 胜负画面数据锚)+「下一节点」+ 明细回看入口 | -| 失败终局 | 判定行 verdict=lose | 明度不变的暮蓝 `#5A6C8C` 氛围 overlay(全作唯一暮蓝档)+ 小人坐砖掸灰 + 插过的旗逐面化光点收回 + 判定行 + 返回 | -| 状态槽全清 | battle_over(B3×4④) | 状态逐槽化光收回 + 微文案「状态随战斗结束消散」(防"我的 buff 哪去了"误读——胜负两终局同款) | -| RAP 清零 | battle_over(A3) | RAP 数字滚动归零 + 微文案(防"攒的钱凭空没了") | -| 库存清空 | level_clear(B4×5⑤——关卡域口径) | 道包逐件化光点飞出 +「剩余道具 ×N 随关卡结束清空」(N = clear_inventory 返回的清空前快照计数——B1 编排义务⑤数据面) | -| Boss 遭遇变体 | encounter=boss | 战斗开始一次性紫赤影子爬过棋盘(§2.6——纯视觉预告)+ 敌人卡体量最大 + 阶段指示附 Boss 名 | -| 弃图刷新确认 | 按钮点击(A3 契约的呈现半边) | 按钮置 AP 条右端,文案实时「RAP−{rap_refresh_cost 表读值} · 本轮剩 N 次」(剩余次数 = `refresh_cap_per_round` − 本轮已用;轮内已用次数读数 = A3 只读观测量缺口,接口漂移登记见 OQ2);入口可用性 = 组合根按只读观测量预判(rap ≥ rap_refresh_cost ∧ 剩余次数 > 0)+ `request_refresh` 返回值兜底(A3 无 `can_request_refresh` API——不引入);确认微交互显式提示代价与旧板旗失效;确认交互与常规确认不同位(位置通道——破坏性确认异位,色弱清单 #7);RAP<8 / cap 超限拒绝可见(边界情况表);换图后 AP 不重置、剩余次数扣减可见 | - -#### 规则 17:界面收到的每份消息,字段清单先写成合同 -**人话**:这条管跨系统消息的契约(切片教训的硬性要求之一)。界面消费的每一份跨系统载荷——事件、快照、回执、遥测行——都必须先把字段清单写成文(共 13 项,见下方实现参照表)。清单双重用途:既是实现契约,也是消费侧断言——信号参数没有运行时类型检查,切片就曾因窗口载荷缺字段直接崩溃,逐字段断言就是防缺字段、防多字段的那道闸。 - -**举证**:无计算。13 项载荷 schema = 「规则 17 的实现参照——呈现信号载荷 schema」;口径对齐 A2 三事件先例;消费侧断言 = ADR-0001"信号参数无运行时类型检查"的缓解;切片教训硬性要求①(entry 17①——缺项即 blocking),AC-24 承载。 - -### 规则 17 的实现参照——呈现信号载荷 schema(13 项) -| # | 载荷 | 来源 | 字段 schema | 状态 | -|---|---|---|---|---| -| 1 | `cell_revealed` | A2 | `{cell, kind ∈ {safe,mine}, digit(仅 safe 携带,恒真透传), variant_ids, channel ∈ {initial,chain,dig}, reward_eligible}` | A2 Core Rule 2 已 schema——引用 | -| 2 | `flag_judged` | A2 | `{cell, hit}`(轮末判定批、行主序) | 同上 | -| 3 | `round_end_board` / `round_end_stopped` | A2 / A3 | `{path_tag ∈ {ap_exhausted,cleared}, continuation_hint ∈ {same_board,new_board}}`(双发射源 payload 同构;信号实名 per ADR-0001) | 同上 + ADR-0001 | -| 4 | 流水行 ×13 类 | B1 | 公共 7 字段 `type / source_class / origin_cell(板级行可空)/ round_index / display_name / value / highlight?({flag_hit, clear_reward_h2, perfect_broken})` + 特有:伤害行/道具行(生效)→ `target`;效果行 → `effect_id` + `pool_value`;未生效四类 + 标旗未中行 → 聚合计数/批次字段;source_class 值域 ⊆ `source_label_map` 键集(B3 source_class ∪ {道具/判定扩展, enemy_action, flag_miss, hero_attack}) | B1 Core Rule 14 已 schema——引用+重述 | -| 5 | 结算快照 | B1 | `presentation_snapshot()` 返回(终局呈现数据面——despawn 前全量状态);独立 `settlement_snapshot` 信号系切片实现、B1 GDD 未登记契约——D1 现行消费 = 步骤流判定行 + `presentation_snapshot()`;若需独立信号回 B1 修订批补登记(OQ3) | 切片实现 / 契约待登记 | -| 6 | 意图回执 | A2 | `ActionOutcome{accepted, outcome ∈ {executed, voided, rejected}, reject_reason ∈ {board_face, resource_face, phase, board_invalid}, sub_reason(仅 board_face:not_adjacent / target_revealed / target_concealed / flag_present / flag_absent / no_path / out_of_catalog)}` | A2 已 schema——拒绝呈现数据源 | -| 7 | 资源面拒绝 | A3 | 无载荷(`try_spend` / `request_refresh` 仅 bool + debug 诊断)——呈现文案按动作上下文映射(诚实登记:资源面原因客户端推断,双源可辨由"动作种类 + 拒绝源"组合承载) | A3 AC 前言口径——引用 | -| 8 | 窗口载荷 | B1 组装 | `query_inventory` 逐件 `{item_id, source{cell,round}(不呈现于库存列表与 tooltip), 行值快照投影, 状态 InStock/Used}`(枚举序 = stock 受理序)+ `usable_now`(B1 守卫预判——满血治疗包 false) | B4/B1 已 schema——引用 | -| 9 | 奖励身份投影 | B1 呈现面 | `query_reward_identity(cell) → {reward_id, category, tier} \| null`(引用级投影;未开格可查但 MVP 不呈现) | B4 AC-2 已 schema——引用 | -| 10 | 状态投影 | B3 经 B1 | `query_active(side)` 元素 = 六归因字段 + `display_name` + 授予时快照 `(magnitude, unit)`;有效值 = L×快照 magnitude | B3 已 schema——引用 | -| 11 | 单位投影 | B2 | 敌单位七字段 `enemy_id/hp/max_hp/atk/heavy_multiplier/pattern/cap` + `beat` + 存活态;hero 投影 `hp/max_hp/atk`(经 `hero_unit()/all_enemies()`) | B2 已 schema——引用 | -| 12 | 零事件外发动作刷新面(命令式回执清单) | A2/A3/B3/B4 | 旗插/拔与移动成功(A2 零事件外发)→ `settle_batch` 回执后重查 `current_board()`;AP/RAP(A3 无推送)→ 每次写路径回执后重读 getter;状态效果(B3 零信号)→ B1 结算编排完成时点刷新;库存(B4 查询面)→ 写路径回执后重查 `query_inventory` / `stock_count()` | battle.md 更新触发注记——本行成文为契约 | -| 13 | D1 自有遥测 | D1 | `ux_round_input_ratio{ratio}` · `ux_round_exit{path_tag}` · `ux_refresh_attempt{result ∈ {accepted,rejected_rap,rejected_cap}, round_refresh_index ∈ [1,2]}` · `ux_window_choice{selected_item_id, usable_now, skip}` · `ux_reject{source ∈ {board,resource,phase}, sub_reason}` · `ux_hint_shown{hint_id}`——写 playtest JSONL `ux` 行族(playtest_logger 扩展) | 本 GDD 成文(新) | - -#### 规则 18:对象销毁前先拍快照——界面永远不回读已销毁的东西 -**人话**:这条管信号到达时点的状态可见性(切片教训的硬性要求之一)。核心对象销毁前后,界面不准"回头查"核心内部——只许用三样东西:消息载荷自带的数据、销毁前已取好的快照、封装好的只读投影。落到三条细则: - -| 细则 | 内容 | -|---|---| -| 销毁前捕获 | 终局与死亡的呈现数据(血条归零、卡体灰化、判定行)在核心对象销毁前已进流水行与快照 | -| 载荷自包含 | 每行流水自带来源 / 值 / 目标——界面不按行序反推目标状态机、不回查容器补数据 | -| 生命周期态禁读 | "战斗还能不能刷"只准问 `is_battle_live()` 与阶段投影,禁止读核心对象内部状态位 | - -**人话**:敌卡死亡灰化后仍留场的呈现 = 就地更新保留的最后已知投影(规则 6)——不回读 Dead 句柄以外的任何东西。 - -**举证**:无计算。销毁时序 = B1 判定段先于 battle_over 清理序列(快照含 despawn 前终局——切片缺陷②教训:battle_finished 后读已销毁的 b2.hero 崩溃);自包含字段 = `target` / `effect_id` / `pool_value` / `origin_cell`;生命周期观测口经组合根;切片教训硬性要求③(entry 17③——缺项即 blocking),AC-20 静态扫描承载。 - -#### 规则 19:美术没画好先用代码画的占位图顶着,占位图同样要过硬指标 -**人话**:这条管美术资产的解耦。全部等终稿美术的面(砖面 / 雾纹 / 敌像 / 图标 / 徽章 / 立绘 / 蜡封)都以程序化占位先行:色值直接取冻结色板、形状按形状语言参数域用代码绘制(圆角砖 / 直角数据框 / 纹带形);图标、徽章、线索按键契约挂进键位映射表(数据键 → 占位纹样 ID,一键一槽位)——终稿美术到位时零数据层改动、零运行时换图。 - -**人话**:占位图同样要过硬指标:数字可读性(1–8 全档对格底 ≥4.5:1、0.5× 缩放可辨、纹带不侵数字字形区)必须通过——色板参数域从结构上保证(底足够亮、墨足够深)。样张定稿 = 砖面形态与色板的冻结闸、终稿资产开工的前置;样张批不阻塞 D1 其余全部验收。 - -**举证**:判据 = F2 数字对比恒等式(「数值结论与推导·F2」);色板 = art-bible §4.1 冻结色板(底 L≥0.30 ∧ 饱和 ≤0.40 ∧ 墨 L≤0.027);形状语言 = §3;样张标准 = §1.4 第一验收项;键集扩容走 §4.6 修订;终稿开工 = asset-spec 批。 - -#### 规则 20:切片里的临时名字统一换成正式名 -**人话**:这条管命名(正式批次的一次性统一)。切片阶段用的几个临时名换成本 GDD 正式名——换的只是名字、不改任何行为:刷新接口名、每轮刷新上限字段名、装板参数、终局信号实名各归其位,明细见下方实现参照表。只增不换的特例:`can_request_refresh` 不引入——上游没有这个接口。 - -**举证**:无计算。五项对照 = 「规则 20 的实现参照——切片 provisional 命名统一」;入口可用性 = 组合根按只读观测量预判 + `request_refresh` 返回值兜底(规则 16);统一核销 = session-state entry 35,AC-25 grep 断言承载。 - -### 规则 20 的实现参照——切片 provisional 命名统一 -| 切片 provisional 名 | GDD 正式名 | 载体 | -|---|---|---| -| `request_refresh_active()` | `request_refresh` | A3 API(Active 相位受理——A3 Rule 11 现行口径) | -| `can_request_refresh()` | 不引入(A3 无此 API) | 入口可用性 = 组合根按只读观测量预判 + `request_refresh` 返回值兜底(规则 16) | -| `refresh_max_per_round` | `refresh_cap_per_round` | ActionEconomyTable 结构位(默认 2)——D2/registry 字段回写随实现批(A3 Schema 定稿节已预留) | -| `during_round`(A2 装板参数) | 无独立参数(受理域语义) | A2 `install_board` 受理域增 Active·仅弃图刷新路径(B1 `refresh_board` 编排内)——A2 Core Rule 3 | -| `round_end`(信号名) | 实名 `round_end_board`(A2 面)/ `round_end_stopped`(A3 面) | ADR-0001 信号实名映射 | - -#### 规则 21:弹层排队进出——打开哪层,哪层就真的能用 -**人话**:这条管模态覆盖层的层级纪律(切片缺陷⑤的纪律转正)。全部模态弹层(图例面板 / 明细回看 / 胜利 overlay / 失败 overlay)走同一张登记序栈:统一入栈出栈、后开置顶、关闭逐层恢复;任何一层打开时,"被它遮住的东西要么隐藏、要么锁输入"必须成立——功能存在但被遮住点不到,是呈现层隐形缺陷的高发区。道具窗口不是模态:不入栈,但锁 D 区输入(规则 13)。 - -**人话**:TunePanel 显式初始化为不可见(历史 quirk 转正);它是切片调试入口,正式侧归 C4 天赋树——C4 落位时退役,Playtest 诊断按钮(卡死转储)保留为调试设施。 - -**举证**:无计算。窗口态锁 D 区 = 规则 13;退役时点 = battle.md OQ10 承接;AC-21 承载。 - -#### 规则 22:中文不缺字、字看得清、颜色不独挑大梁、不用键盘也能玩 -**人话**:这条管本地化与可访问性的内建基线:中文显示不缺字、字看得清、颜色不是唯一的信息通道、动效可以减弱、全程只用鼠标也能玩。逐项如下表: - -| 基线 | 要求 | -|---|---| -| 中文字体 | 随包内置 + 设为主题默认字体——运行时默认字体无 CJK 字形,豆腐块 = 验收硬断言 | -| 按钮文案 | 4 汉字上限(「停手」「弃图刷新」「跳过」「选用」);译英 ≤1.6× 不破版;德语长词允许两行或图标+缩写 | -| 明细行宽 | 模板预留 40% 膨胀 | -| 对比度 | 数字对格底 ≥4.5:1(WCAG AA) | -| 色弱安全 | 无信息仅靠色相承载(九对语义对逐项成立)、灰度可辨 | -| 字号下限 | 棋盘数字 ≥18px / 明细正文 ≥14px / tooltip ≥13px(@1280×800) | -| 闪烁 | 无 >3 次/秒 | -| 减动效 | 全部动画时长减半或跳终态开关;结算逐行兑现是信息载体——不可整体跳过、可加速 | -| 输入 | 纯鼠标可完成全部操作 | - -**举证**:无计算。对比判据引用 = F2;本地化契约消费方 = D6(CJK / 按钮宽 / 术语表);正式分层(文本缩放 / 色盲模式 / 按键重映射)待 accessibility-requirements.md 定稿(battle.md OQ2 登记缺口);承载 AC-23 / AC-26。 - -## 枚举 - -### 四种格态(A2×6②——灰度截图逐格可分类) - -| 格态 | 视觉构成 | 语义 | -|---|---|---| -| 已开 0 格 | 裸土地板 | 携带"八邻无雷"推理信息——与已开雾格必须灰度可判定区分(混淆即污染推理) | -| 已开雾格 | 地板无字 + 底色层淡雾 tint 残留 | 雾格只是不显示;tint 为残留视觉锚(OQ8 采纳) | -| 未开格 | 掩尘完整砖 | 左键 = 挖(1 AP) | -| 未开雾格 | 掩尘砖 + 雾纹带 | 左键 = 挖;雾语义 = 无雷盲区(图例恒在条目) | - -### 光标语义(A2×6③⑤——悬停预承诺) - -| 光标 | 悬停目标 | 伴随指示 | -|---|---|---| -| 移动箭头 | 已开格 | `compute_move_path` 路径蓝细线点迹(Rule 8)+ 目标格边框高亮 | -| 挖镐 | 可挖未开格 | 目标格边框高亮(可挖域另有常驻呼吸微光) | -| 旗形 | 旗插拔语义 | 目标格边框高亮 | -| 禁止 | 不可挖域 | + 首 run 一次 no_adjacent toast | - -### 一次性提示 hint_id(封闭枚举——遥测值域与去重键) - -| 值 | 触发 | 必含要点 | 频次 | -|---|---|---|---| -| `fog_first`(雾首遇——A4×3②) | 首个实际含雾格的板进入可操作状态(挖掘阶段开始;生成期一次查询即判定,免疫降级板误触发) | 无雷盲区不赌命 / 雾格不传播连锁(连锁止于雾界属正常)/ 雾内插旗纯损 | 每 run 一次 | -| `chord`(chord 肌肉记忆——A2×6③) | 经典扫雷玩家首日尝试双击快开 | 本作无双击快开——插旗后轮末自动判定标中;点数字格可移动小人 | 每 run 一次 | -| `no_adjacent`(不可挖域——Rule 7) | 不可挖域悬停 | 需先走近(点击已开格移动,免费) | 每 run 一次 | - -- hint_id 封闭枚举 = 上表三值;拒绝 / voided / 零合法板 toast 族不占 hint_id(拒绝须每次可感知——见边界情况表)。 -- 文案定稿权归实现期文案 pass(本 GDD 只锁必含要点与形态约束)。 - -### 拒绝与 voided 呈现映射(A2×6⑥——映射源 = reject_reason + sub_reason) - -| 拒绝源 | 触发 | 呈现动作 | 文案 | -|---|---|---|---| -| board_face·not_adjacent | 挖非相邻格 | 目标格旗朱 `#C63D22` 边框闪 + toast | 「需先走近」 | -| board_face·target_revealed | 目标已开 | 同上 | 「该格已翻开」 | -| board_face·target_concealed | 目标未探明 | 同上 | 「该格未探明」 | -| board_face·flag_present | 目标有旗 | 同上 | 「须先拔旗」 | -| board_face·flag_absent | 目标无旗 | 同上 | 「该格没有旗」 | -| board_face·no_path | 路径不通 | 同上 | 「路径不通」 | -| board_face·out_of_catalog | 调试态 | debug 级 | 不与玩家语义混桶 | -| resource_face(AP 不足 / RAP 不足——无上游载荷,按动作上下文映射) | 资源不足 | AP/RAP 数字脉冲 + toast | 「AP 不足 · 剩 0 点」 | -| phase | 非 Active | toast | 「结算进行中」 | - -- 图标 + 文案冗余(非色相独载)。 - -### ux 遥测行族(载荷表 #13 的字段与值域展开) - -| 行 | 字段 | 值域 | -|---|---|---| -| ux_round_input_ratio | ratio | 每轮输入动作数 ∶ AP 消耗(P4 ≤2 观测假设) | -| ux_round_exit | path_tag | 上游封闭枚举(ap_exhausted / cleared / stopped) | -| ux_refresh_attempt | result; round_refresh_index | result ∈ {accepted, rejected_rap, rejected_cap};index ∈ [1,2] | -| ux_window_choice | selected_item_id; usable_now; skip | skip / usable_now 布尔 | -| ux_reject | source; sub_reason | source ∈ {board, resource, phase};sub_reason 同 ActionOutcome | -| ux_hint_shown | hint_id | hint_id 封闭枚举(上表) | - -## 数值结论与推导 - -> D1 零玩法公式(显式排除声明见本节末)——本节仅承载呈现几何与可读性判据。全部取色禁新增色值,一切经 art-bible §4.1/§4.4 冻结色板。 - -### F1 棋盘格尺寸(cell_size) - -**结论**:cell 为两档定值(battle.md 拍板)——12×12 → 36px、10×10 → 45px;F1 公式为可行性校验器而非闭式推导:floor(min(D_w − pad_h, D_h − ap_bar_h − pad_v) ÷ N) ≥ cell(N) 且 cell(N) ∈ [30, 45] 断言成立;数字字号 = max(18, ceil(cell × 0.5)),像素字体整数倍缩放。 - -#### 公式 - -``` -两档定值:cell(12) = 36px、cell(10) = 45px(battle.md 拍板值,非公式导出) -可行性校验(装板期断言,违例 fail-fast): - floor(min(D_w − pad_h, D_h − ap_bar_h − pad_v) / N) ≥ cell(N) - 且 cell(N) ∈ [30, 45] -N ∈ {10, 12}(A1 BoardGenTable 尺寸档);D 区基准 1280×800 下 D_w=760、D_h=520−44(AP 条) -@1280×800 实算(pad_h=pad_v=16):min(744, 460) = 460 - 460 ÷ 12 → 38 ≥ 36 ✓ 460 ÷ 10 → 46 ≥ 45 ✓ -数字字号 = max(18, ceil(cell × 0.5)),像素字体整数倍缩放(canvas_items stretch 保证清晰) -``` - -**Variables:** - -| 变量 | 符号 | 类型 | 范围 | 说明 | -|---|---|---|---|---| -| D 区宽/高 | D_w / D_h | int px | 布局常量 | 五区布局基准(battle.md Layout) | -| AP 条高 | ap_bar_h | int px | 44 | D 区顶条 | -| 棋盘维数 | N | int | {10, 12} | A1 行值(MVP 两档) | -| 定值档 | cell(N) | int px | {36, 45} | battle.md 拍板两档;非闭式导出(固定边距下无单式可同时得出两档——两定值所需可用高度区间不相交) | - -- **Example**:12×12 → floor(min(760−16, 476−16)/12) = 38 ≥ 36 ✓(定值取 36)→ 数字字号 = 18px;10×10 → floor(460/10) = 46 ≥ 45 ✓(定值取 45)。 -- **为何定值而非闭式**:cell=36 要求可用高度 ∈ [432,443]、cell=45 要求 ∈ [450,459]——两区间不相交,任何固定 pad 的闭式都无法同时得出两档;两档值来源 = battle.md 拍板("格 36–45px 见方"两端),公式只承载界限与可行性断言。 - -### F2 数字对比恒等式(引用 art-bible §4.1——D1 不新增参数) - -**结论**:1–8 全档数字对所在格底 WCAG 对比 ≥4.5:1(§1.4 第一验收项,对程序化占位同样适用)——由色板参数域结构保证:格底相对亮度 L≥0.30 ∧ HSV 饱和 ≤0.40 ∧ 数字墨 L≤0.027 ⇒ 任意底墨组合 ≥4.5:1 恒成立。 - -| 实测锚(底 / 墨) | 对比 | -|---|---| -| #33261B / #C9AF83 | 6.9:1 | -| #4A1E14 / #B39A78 | 5.3:1 | - -- D1 侧判据 = 灰度截图分类 + 对比抽测进 AC;换 biome 色板须重跑 §1.4(换皮只换四槽、永不变信)。 - -### 显式排除声明 - -| 对象 | 归属 | -|---|---| -| 伤害 / 经济 / 概率 / 生成公式 | A1–B4/B1/C3 | -| AP/RAP/价目显示值 | A3 表读值投影 | -| 伤害数字 | B1 流水行 value 投影 | -| D1 拥有的全部 | F1 几何换算、F2 可读性判据的引用执行、Tuning Knobs 节呈现常量 | -| 随机 | 零——呈现层无任何 RNG 消费(S1/S2 扫描域适用) | - -## 状态 - -战斗屏状态机(触发全部来自核心信号/回执——呈现层不自持玩法状态;"阶段"投影枚举 = {挖掘中, 结算中, 道具窗口}): - -| 屏状态 | 进入触发 | 变化 / 出口 | -|---|---|---| -| 挖掘阶段(默认态) | 轮次开始 / 结算完毕回 Active | D 区可交互(AP 条点亮、可挖域呼吸微光);B 区敌人待机(意图徽标全程可见);明细带收起为上轮摘要 1 行;能量 2/10 | -| 结算阶段 | `round_end`(A2 棋盘路径 / A3 stopped 直发) | D 区锁输入(棋盘去饱和 + 金橙色相偏移,明度不变,数字保持全对比);明细带展开 84px 逐行滚动;阶段指示→"结算中";能量 7/10;B1 步骤流驱动逐行兑现 | -| 道具窗口态 | B1 授予段完成(窗口锚点信号) | E 区原位激活(Rule 13);空库存直接 skip 不弹窗;选用/跳过 → 回结算流(结算阶段续) | -| 清图瞬间 | cleared 判定(round_end) | 金粒喷泉 + 彩纸 3–5s 即收(§2.3);H2 清图奖励行金框强调;随后换新图 install | -| 完美排雷高光 | B1 高光行(perfect_sweep) | 全屏喝彩级:金光带加倍扫射 + 「完美排雷 ×2」横幅(叠加于清图瞬间之上) | -| 标中旗高光 | 流水行 highlight=flag_hit | 该旗化暴击弹道加重 + 明细行金框(当轮即兑付) | -| 敌人死亡呈现 | 流水行击杀标记(target 字段) | 该敌卡血条归零 → 灰化 + 碎裂退场(禁瞬消、就地更新) | -| 胜利终局 | 判定行 verdict=win | 金蜡封落于扫雷图区中央 + 暖白金 overlay + 判定行 + 状态槽全清反馈 + RAP 清零反馈;出口 = 下一节点(runner) | -| 失败终局 | 判定行 verdict=lose | 暮蓝氛围 overlay(明度不变)+ 旗化光点收回 + 判定行 + 明细回看 + 状态槽全清反馈 + RAP 清零反馈;出口 = 返回 | -| Boss 遭遇变体 | encounter=boss | 战斗开始一次性紫赤影子爬棋盘 + 敌卡体量最大 + 阶段指示附 Boss 名 | -| 雾图变体 | 板含雾格 | 雾纹带 + 首遇提示(每 run 一次)+ 已开雾格 tint 残留 + 雾区全开合并域完成信号 | -| 空态:无状态效果 | query_active 双侧空 | 状态槽隐藏、数据框上移补位(Rule 11) | -| 空态:零库存 | 关卡初 / 清空后 | E 区「道包空空——安全格里藏着补给」(指引性空态,非报错) | -| 调试变体 | 测试模式 | TunePanel 入口(正式侧归 C4 退役)+ Playtest 诊断按钮 | - -**不变式**:全部状态触发来自核心信号/回执——呈现层不自持玩法状态;模态子栈(Rule 21 统一登记序)= 图例面板 / 明细回看 / 胜利 overlay / 失败 overlay——任一打开时遮挡物隐藏或输入锁定;非模态层 = toast(自动消退)与窗口态(锁 D 区)。 - -## 边界情况 - -| 条件 | 行为 | 依据 | -|---|---|---| -| 每次拒绝(A2×6⑥) | 棋盘面拒绝(sub_reason 七值)→ 目标格旗朱 `#C63D22` 边框闪 + toast(文案映射见枚举节);资源面拒绝(AP 不足 / RAP 不足——无上游载荷,按动作上下文映射)→ AP/RAP 数字脉冲 + toast;相位拒绝 → toast「结算进行中」;图标+文案冗余(非色相独载) | 映射源 = reject_reason + sub_reason——每次拒绝玩家可感知 | -| 轮末意图 voided(至少 stop 被清零须可感知) | toast「本轮已清图,停手未执行 · 剩余 AP 已清零」——防 [dig清, stop] 静默改判清图、剩余 AP 清零不入 RAP 的读感欺骗(F4 联合清图让位在生产面不可构造,本条为诚实兜底) | A2×6⑥ / A2 voided 语义 | -| 零合法板(A1 EC5 → B1×3③——三形态选型定稿) | B1 上抛非法产物标记 → toast 诚实提示(非模态、不打断);补偿与回退不提供(补偿逻辑归 B1 域外、确定性回退已知好种子 = 实现期 ADR 候选〔A1 OQ2 关联〕——MVP 面向玩家的形态 = 仅提示);玩家永不卡死由 A1 验收三分支保证,提示是体验债的诚实兜底(原"玩家不可见遥测域"口径由本条承接闭合) | B1×3③ / A1 EC5 | -| 弃图刷新被拒(RAP 不足) | 按钮 + RAP 读数脉冲 + toast | A3 EC13 | -| 弃图刷新被拒(本轮 cap=2 超限) | toast「本轮刷新次数已用完」 | A3 EC15 | -| 确认微交互缺一步 | 不提交(防误触——破坏性确认异位) | Rule 16 | -| 两个雾区相邻(A4 EC11) | 规则上独立布置实例、呈现合并为一片——雾区全开完成信号以视觉合并域为单元、禁实例级双响(信号只响一次);样张最坏用例含"宽度 1 雾带两侧毗邻数字格" | A4 EC11 / A4 AC-9 | -| 雾首遇触发边界 | 触发谓词 = 首个实际含雾格的板进入可操作状态——免疫 EC2 降级板(无变异)误触发、免疫贴脸雾 t=0 歧义;一次性作用域 = 每 run | A4 UI Requirements 修正口径 | -| 敌人死亡与终局同帧(despawn 时序) | 死亡呈现数据 = 流水行击杀标记 + 目标字段(despawn 前已产出——Rule 18①);battle_over 清理序列后呈现层零核心回读;`is_battle_live()` false 后视图进入终局态只消费快照 | Rule 18① | -| 窗口打开时库存为空 | 不弹窗、直接 skip(结算零停顿);窗口标记照常登记(B1 回放输入完整性) | B4 E8 | -| 满血时窗口含治疗包 | usable_now=false 灰置 + 禁选原因 tooltip;强制提交(不可经 UI 达成——禁选态拦截)→「使用被拒」行兜底 | B1 守卫 | -| battle_over 与 level_clear 反馈叠加(关卡末战) | RAP 清零 + 状态槽全清反馈先行(battle_over),库存清空反馈随后(level_clear 编排)——两反馈不合并(防"N 道具消失"误读为战斗结算内容) | Rule 16 | -| 模态覆盖层叠开(图例上开明细回看) | 统一登记序栈——后开者置顶、关闭逐层恢复;任一层打开时其遮挡物隐藏/输入锁定断言成立 | 缺陷⑤回归 | -| 悬停文案换行 | 全部动态区固定槽高 + clip_contents——换行裁剪不推挤布局(明细行 40% 膨胀 + tooltip 独立浮层) | 缺陷①回归 | -| CJK 字形缺失 | 豆腐块 = AC 硬断言失败(字体随包 + theme 默认;首次导出 checklist 项) | ADR-0003 | -| 敌卡刷新与死亡灰化竞争 | 就地更新(字段级 setter)禁全量重建——死亡灰化态不被后续刷新吞掉;窗口激活期同理跳过常读重建 | entry 36 教训 | -| 减动效开启 | 全部转场/高光/演出时长减半或跳终态;结算逐行兑现降速不跳过(信息载体);无闪烁 >3 次/秒恒成立 | Rule 22 | -| 移动目标 = 当前格 | 幂等零移动——无动画、无 toast | A2 EC14(合法受理的呈现静默) | -| `compute_move_path` 返回空(不可达) | 路径预览不显示 + 禁止光标(预览与执行同源) | A2 AC-14② 对侧 | -| 键集扩容(新 effect_id / reward_id / enemy_id 上线) | 键槽映射表缺键 = 呈现层 fail-fast(debug 断言 + 占位"?"纹样 + 诊断,禁静默空图标)——扩容走 art-bible §4.6 修订(禁运行时换图) | Rule 19 / AC-15 | - -## 依赖 - -| 系统 | 方向 / 性质 | 接口契约 | -|---|---|---| -| A2 | 上游 hard | 读:`current_board()` / `reveal_record()` / `compute_move_path(cell)`(呈现面,entry 39 E2 收口);订阅:零直订(ADR-0001——B1 facts 与组合根转发);写:`settle_batch(intents)` 经组合根(D1×6①);消费其三事件 schema(载荷表 #1–3)与 ActionOutcome(#6);D1×6 六项义务全落位(台账表) | -| A3 | 上游 hard | 读:`phase / ap / rap / last_round_end`(getter-only——entry 39 E5);刷新意图经组合根 → B1 `refresh_board` 编排内 A3 `request_refresh`(D4——挖掘期 Active 受理、每轮上限 `refresh_cap_per_round`=2);接口漂移登记:轮内已用刷新次数读数缺口(OQ2);AP/RAP 常显、RAP 清零反馈、双源拒绝呈现(A3 契约) | -| B1 | 上游 hard(数据供给主通道) | 读:步骤流信号(13 类行协议——载荷表 #4)、`presentation_snapshot()` / `is_battle_live()` / `stock_count()` / `query_reward_identity()`(切片实现、registry `d1_presentation_surface` 登记、B1 GDD 契约登记待批——冲突⑧/OQ3);写:`submit_window_selection(窗口位置序)` / 刷新提交面;level_clear 反馈行数据面(清空前快照计数);B1×3 + B4×5 + B3×4 呈现义务的统一数据源契约 = B1 Core Rule 14 | -| B2 | 上游投影 | `hero_unit() / all_enemies()` 只读投影(entry 39 E3;切片实现、B2 GDD 契约登记待批——冲突⑧);血条/顺位/姿态/存活数据面;despawn 前捕获纪律(Rule 18);B2×4 四项义务落位(敌人卡 Rule 6) | -| B3 | 上游投影(经 B1) | 零直读(B1 协作对象私有化)——状态投影经 B1 编排面(载荷表 #10);EC12 空态、极性映射、全清反馈(Rule 11/16) | -| B4 | 上游投影(经 B1) | 零直读——`query_reward_identity()` / 库存载荷经 B1(载荷表 #8–9);奖励徽章键 §4.6.2、窗口呈现、四类行、H2、关卡末清空反馈(Rule 10/12/13/16) | -| A4 | 上游 soft(呈现规格) | 雾纹理双通道、图例条目、首遇提示三要点、tint + 完成信号(A4×3——Rule 9/14/15);A4 UI Requirements 为本 GDD 引用源 | -| A1 | 间接 | 零直接接口——EC5 零合法板数据面经 B1 上抛(非法产物标记 → toast 告知);biome 标签 = 换皮色板数据锚(程序化占位消费);产物字段保真是呈现诚实的数据前提 | -| D2 | 数据读取 | display_name 等本地化名经核心读表面;D1 自有常量不入 D2 玩法表(Tuning Knobs 载体声明) | -| C1-lite(level_runner) | 上游 hard | A 区节点链 / 当前节点 / HP 携带(关卡域);胜利 overlay「下一节点」→ runner 推进(写经组合根);level_clear 编排反馈;C1 GDD 未开始——本三项为切片代码契约,C1 GDD 定稿时回填(接口漂移回 C1 批) | -| C2 | 预留 | 关卡结算屏(关卡末清空反馈的完整屏形态)归后续 spec `design/ux/level-clear.md`(battle.md OQ9)——MVP 以 overlay 反馈承载 | -| B5 | 下游 hard | D1→B5 交付物:五区布局与双舞台裁决(第三形态)、B 区演出区结构、明细带呈现位、流水行协议呈现语义、敌人卡呈现语义(死亡灰化/禁瞬消)、art-bible §4.6 键位映射表——B5 只叠加动画密度与演出(受击反馈/弹道/退场动画),呈现语义已在本 GDD 定稿;"战斗表现美术测试"以本布局出样 | -| D4 | 下游 soft | 音频挂点事件源 = 明细行类型流 + toast 提示触发(B1/B4 音频挂钩点清单引用);MVP 无音频(Alpha) | -| D5 | 下游 soft | 教学承载位 = toast 体系 + 图例面板(雾三要点 / chord 提示 / 蓄力拍提示候选 / RAP 清零 / 库存清空教学条目)——D5 GDD 定稿口径 | -| A5 | 预留 | 探测类道具显影面(未开格身份呈现深度 OQ2)——接口归 A5 GDD,本 GDD 不预写 | -| D6 | 下游 | 本地化契约消费方(CJK/按钮宽/术语表——Rule 22) | - -- **索引分层注记**:systems-index 依赖分层 "D1 ← A2,A3,B1"——本 GDD 实际投影消费扩至 B2/B3/B4/A4/runner,全部经 B1 编排呈现面 + 封装收口批成文呈现面(entry 39/40),零新增运行时直调边(B2/B3/B4 相互与对 D1 的"零直接接口"纪律保持;呈现面接口清单 = API Boundaries 登记载体)。D1 无游戏状态、无 knob 联动、无 RNG——层 4 Presentation 定位不变。 - -### 呈现义务台账逐项落位表(门禁核对用——27 项,缺项即 blocking) - -| 义务源 | 义务 | 承接方式(本 GDD 落点) | 状态 | -|---|---|---|---| -| A2×6 | ① stop 意图经 `settle_batch` 提交、不直调 A3 | Core Rule 7 + 写路径总表(Rule 4)+ AC-13 | 落位 | -| A2×6 | ② 四种格态一眼可辨 | Core Rule 9 + AC-4 | 落位 | -| A2×6 | ③ 悬停预承诺 + 可挖域常驻指示 + chord 首遇提示 | Core Rule 7 / 14② + AC-5 / AC-14 | 落位 | -| A2×6 | ④ 已引爆雷格"可通行可读" | Core Rule 9 + AC-4 | 落位 | -| A2×6 | ⑤ `compute_move_path` 呈现语义 = 合法性指示(裁决继承 battle.md D3) | Core Rule 8 + AC-6 | 落位 | -| A2×6 | ⑥ 单意图帧收集 + voided 呈现 + 每次拒绝可感知 | Core Rule 7 + 边界情况表 + AC-7 / AC-8 | 落位 | -| B2×4 | ① enemy_id→图像线索映射清单成文(预告时序 = 下一拍、挖掘期全程可见;含强度档位/环长直觉编码;双通道) | Core Rule 6 + 意图线索映射目录(下表)+ AC-10 | 落位 | -| B2×4 | ② 线索映射全局恒定(enemy_id 键,跨 run 禁重掷) | Core Rule 6 / 10 + AC-10 | 落位 | -| B2×4 | ③ 单位顺位与存活可读 | Core Rule 6(顺位徽标)+ AC-10 | 落位 | -| B2×4 | ④ 敌方 side 池呈现口径(共享单值、各卡同值) | Core Rule 6 + AC-10 | 落位 | -| B3×4 | ① HUD 常显 + EC12 空态规格定稿(裁决:槽隐藏) | Core Rule 11 + AC-12 | 落位 | -| B3×4 | ② effect_id→icon 映射键契约 | Core Rule 11(引用 art-bible §4.6.1 七键冻结)+ AC-15 | 落位 | -| B3×4 | ③ 有利/有害极性呈现映射(非 magnitude 符号) | Core Rule 11(键级极性表 + pool 语义归属)+ AC-12 | 落位 | -| B3×4 | ④ 战斗结束全清的状态栏去留 | Core Rule 16 + 状态节胜负终局 + AC-16 | 落位 | -| B4×5 | ① 已开格 + 库存奖励身份恒定可读(常读条 = 挖掘期规划面) | Core Rule 10 + AC-9 | 落位 | -| B4×5 | ② 道具使用窗口呈现(原位激活/单件/usable_now/政策注记/空库存) | Core Rule 13 + AC-13 / AC-17 | 落位 | -| B4×5 | ③ 结算明细四类行呈现(聚合计数 + 语境注记) | Core Rule 12 + AC-11 | 落位 | -| B4×5 | ④ H2 清图奖励行强调呈现 | Core Rule 12 + 状态节清图瞬间 + AC-11 | 落位 | -| B4×5 | ⑤ 关卡末(level_clear)库存清空可见反馈 | Core Rule 16 + 边界情况表 + AC-16 | 落位 | -| B1×3 | ① 高光行强调呈现(标中旗金框 / H2 金框) | Core Rule 12 + AC-11 | 落位 | -| B1×3 | ② 完美排雷呈现形态 | Core Rule 12 + 状态节 + AC-11 | 落位 | -| B1×3 | ③ EC5 零合法板提示/补偿/回退形态(裁决:仅提示) | 边界情况表 + AC-19 | 落位 | -| A4×3 | ① 图例「迷雾 = 无雷盲区」条目(恒在/可回看) | Core Rule 14① + AC-14 | 落位 | -| A4×3 | ② 雾首遇提示(每 run 一次、三要点、非模态) | Core Rule 14② + AC-14 | 落位 | -| A4×3 | ③ 已开雾格 tint 残留 + 雾区全开合并域完成信号(OQ8 采纳) | Core Rule 9 / 15 + AC-4 | 落位 | -| A3 | AP/RAP 常显 + 刷新入口(玩家发起)+ RAP 清零反馈 + 双源拒绝 | Core Rule 16 + 边界情况表 + AC-8 / AC-16 | 落位 | -| A1 | EC5 零合法板诚实呈现(数据面经 B1×3③ 上抛) | 同 B1×3③ | 落位 | - -### 附:意图线索映射目录(B2×4① 成文载体——继承 battle.md 目录 + art-bible §4.6.4 键契约;资产定稿归 B5,本表为 D1 侧成文占位) - -| enemy_id(§4.6.4 冻结键集) | 视觉状态(下一拍预告) | 强度档位编码 | 环长编码 | -|---|---|---|---| -| grub(蛆虫) | 攻击 ×1 态 | 小体量墩形 = 轻击(§3.1 普通怪) | 环点 1(单拍环——无蓄力态 = 每拍都动手) | -| ambusher(伏击兽) | 攻击 / 蓄力 / 重击 ×3 态 | 垂直延伸体量 = 重击(heavy_multiplier 直觉) | 环点 = 拍数;蓄力态在场 = 环里空一拍("可以贪") | - -- 预告时序 = 下一拍预告、挖掘期全程可见、结算期不另设意图播片(B2 Rule 8⑤);精确数值只在结算明细兑现(B2 Rule 8④——图像不报数)。 -- 映射键 = enemy_id,跨 run 恒定、禁重掷(B2 Rule 8③);形状 + 色相双通道;蓄力姿态必须含可辨识蓄力记号(§4.6.4——读怪核心课)。 -- 资产需求下限三类(受击反馈 / 死亡表现 / 顺位标记)在程序化占位中先行(占位纹样挂键);终稿归 B5/样张批。 -- 键集注记:切片 DND 更名(goblin/bugbear/ogre_chief)与 GDD 键集 {grub, ambusher} 差异登记冲突清单②——键位映射表以 GDD 键集为锚,切片更名随 B2/C3 修订批对齐。 - -### 切片教训三条硬性要求落位表(entry 17——门禁评审核对项,缺项即 blocking) - -| # | 硬性要求 | 落位 | -|---|---|---| -| ① | 面向呈现的信号载荷成文 schema | Core Rule 17(13 项载荷表——A2 三事件/B1 行协议引用 + D1 自有遥测成文 + 零事件外发命令式刷新面成文) | -| ② | 场景级 headless 测试进 AC | AC「场景级 headless 测试」硬性块(真实实例化战斗屏场景 + 驱动完整对局 + 断言零脚本错误;载体 = 场景探针,ADR-0004 双载体、gdUnit4 deferred) | -| ③ | 信号时点状态可见性规则 | Core Rule 18(销毁前捕获 / 载荷自包含 / 禁回读核心生命周期态)+ AC 硬性块断言 | - -### 发现冲突清单(列示待裁决——不改已定稿 GDD 正文与提案) - -| # | 冲突 / 待对齐项 | D1 侧处置 | -|---|---|---| -| ① | game-concept 视觉锚原则 1"暗色地牢底色" vs art-bible 明亮底色反转 | 在案(entry 41)——概念侧注记待概念层修订批;D1 全部取色按 art-bible | -| ② | B2 GDD 敌种键 {grub, ambusher} vs 切片 DND 更名 {goblin, bugbear, ogre_chief} | 键位映射表以 GDD 键集为锚(§4.6.4 冻结);切片更名随 B2/C3 修订批对齐 | -| ③ | B4 GDD 默认根 clear_knife vs 切片供给控制器批 clear_blast + active_inject 池 | 徽章键按 reward_id 冻结、池归属不影响键(§4.6.2 注记);clear_blast 键并列预留、启用随 B4 修订批 | -| ④ | 极性提案 §3.5 跨文档回写清单全部待实施批(B3 四行→七行、B4 schema 扩列、A2 OQ1 关闭、D1 义务条目正式登记〔未开格类型图标/极性视觉语言/负向文案族〕) | 本 GDD 已按 §4.6 冻结键预留槽位;义务条目登记随提案实施批入 systems-index D1 台账 | -| ⑤ | art-bible §4.6.3"全部未开格呈现类型徽章"(提案 R3)vs B4 Rule 8"未开格身份 MVP 不呈现" | D1 裁决:MVP 格面徽章只在已开格呈现(B4 Rule 8 为现行锁定规则);未开格预读随极性提案实施批(其机制前提 = cell_type/pool_tag 扩列)随批修订 | -| ⑥ | battle.md §Events Fired"呈现订阅 A2 三事件"表述 vs ADR-0001 订阅纪律(呈现层只订 B1/runner) | 本 GDD 按 ADR-0001 收窄(Core Rule 2);battle.md 复检批对齐措辞(正文不改动) | -| ⑦ | A3 只读观测量(ap/rap/phase/last_round_end)缺轮内已用刷新次数——刷新按钮"本轮剩 N 次"读数无上游供给 | 接口漂移登记义务(OQ2):A3 随批补只读观测量;落地前按钮显示退化为"RAP−{rap_refresh_cost 表读值} · 每轮至多 2 次"静态文案 | -| ⑧ | 切片已实现的 B1/B2 呈现面 API 未在 owner GDD 登记契约:B1 面 `presentation_snapshot` / `is_battle_live` / `stock_count` / `query_reward_identity` / `submit_window_selection` + `settlement_snapshot` 信号、B2 面 `hero_unit` / `all_enemies`(registry `d1_presentation_surface` 已成文——owner=D1,切片事实转正) | OQ3:现行消费以 registry 条目为契约(D1 消费 = 步骤流判定行 + `presentation_snapshot()`,零阻塞);回 B1/B2 修订批补登记 API 面(接口漂移) | - -## Tuning Knobs - -> D1 knob = 呈现节奏与可读性常量(非玩法数值——D2 Rule 1"全部玩法数值入表"纪律不适用;单一来源登记防散落,载体 = presentation 主题资源/常量单点,实现期裁决载体形态;修订走本 GDD 流程非调参)。全部标注尺度。 - -| Knob | 默认 | 尺度 | 调过高 | 调过低 | -|---|---|---|---|---| -| toast_display_ms | 2500 | 每条提示 | 信息滞留、遮挡节奏 | 读不完即消(拒绝原因漏读) | -| move_slide_ms | ≤150 | 每次移动 | 移动拖沓(违反 P4 摩擦护栏) | "太瞬"无方向感(battle.md OQ5 playtest 观测调) | -| board_install_fade_ms | 200 | 每次装板 | 换图迟滞 | 闪切无地牢感 | -| clear_celebration_ms | 3000–5000 | 每次清图 | 拖节奏(§2.3"三五秒即收"上限约束) | 丰收感不足 | -| font_min_board / detail / tooltip | 18 / 14 / 13 px | @1280×800 基座 | 挤占格内空间 | 可读性下限击穿(可访问性基线) | -| hint_once_scope | per_run | 每提示项 | —— | ——(存档级"一生一次"归 D3/C4 后重议) | -| reduce_motion_scale | 0.5(或跳终态) | 每动画 | 减动效失效 | 等效关闭动效 | -| detail_band_height | 24 / 84 px | 摘要 / 实时流 | 挤压 B 区演出区 | 行数不足(逐行归因截断) | - -- **非 knob(结构冻结,修订走 GDD 流程)**:五区布局与分区尺寸(battle.md 拍板)、双舞台常驻、窗口原位激活形态、单意图帧纪律、模态层级纪律、键位映射契约(§4.6)、程序化占位策略、订阅纪律(ADR-0001)。 -- **性能预算(引用非 knob)**:同屏 draw calls < 200、进入战斗屏 ≤500ms 可交互、headless 全套 < 30s(technical-preferences / ADR-0004)。 -- **Knob 交互**:font_min_board × cell 尺寸(F1 字号下限随格尺寸联动——12×12 板 36px 格是 18px 下限的绑定域);toast_display_ms × 一次性提示去重(提示频率观感)。 -- **调参流程**:改先测量后复测(切片 mock 数据先行——code-conventions 数值纪律);playtest 观测项 = 移动手感(OQ5)/ 明细带常驻(OQ6)/ 窗口存在感(OQ7)。 - -## Visual/Audio 要求 - -D1 是本 GDD 体系中唯一的自有渲染面系统——视觉义务从"数据供给规格"反转为"执行 art-bible"。逐条锚定: - -| art-bible 锚点 | D1 执行 | -|---|---| -| §1.2 绘制优先级栈 | 数字 > 小人 > 旗 > 徽章 > 变异纹理 > 底色——BoardView 分层绘制/控件叠序按此栈实现,任何元素不遮挡数字(小人与旗不得覆盖文本;小人所在格边框高亮) | -| §1.4 格子样张(引用依据) | 样张 = 砖面形态定稿闸;D1 引用其验收标准(第一验收项 = 数字可读性硬指标)作为程序化占位与正式资产的共同判据;样张未制作不阻塞 D1(Core Rule 19);样张通过后冻结为制作标准,终稿资产替换走 asset-spec 批 | -| §3.3 UI 形状语法 | 半拟物——面板 = 石板圆角矩形(与地砖同圆角率)、按钮 = 凸圆角"可按的砖"、仪式性确认(胜利蜡封)= 圆形;数据框/准线/进度条一律直角细线无纹理("圆角 = 可触摸的物件,直角 = 须精确的信息") | -| §4.1/§4.4 UI 色板 | 数据素面墨族(#33261B 系)——棋盘与面板读同一种墨;战斗容器中性石色(防暖色渗入分走数字对比预算);语义色规则(红只说危险 / 金只说收益 / 蓝只说己方 / 紫赤只说 Boss / 绿零逻辑语义 / 禁入色相带 300°–345°)逐条适用;明度恒定硬规则(状态区分只经色相/饱和/运动/元素——去饱和 + 金橙偏移即其合规化实例) | -| §4.5 色弱安全清单(逐对执行) | 九对语义对的冗余通道(形/图标/位置/运动)在对应组件落实——四格态靠完整/碎裂形、奖励金 vs 危险红靠剪影+运动、UI 红/金强调对加图标+文案冗余、破坏性确认异位(位置通道)、图标键族一键一纹样色相不承载身份 | -| §4.6 图标键契约(键位挂接) | 效果图标 §4.6.1(七键——sapped 键冻结未入表前禁引用)、奖励徽章 §4.6.2(八键 + clear_blast 并列预留)、格面类型 §4.6.3(五键——MVP 只挂已开格)、敌种线索 §4.6.4(行为拍姿态键)——键位映射表(Core Rule 19)为唯一挂接点,键集扩容走 §4.6 修订、禁运行时换图 | -| §2 能量档承载 | 五区布局的动效与色彩转场按 §2.1–2.6 能量档实现(挖掘 2/10 唯一微光在动 → 结算 7/10 金橙光带 → 清图 8/10 金粒喷泉 → 胜利 6/10 克制 → 失败 1/10 暮蓝最静一拍 → Boss 5/10 紫赤)——"状态间区分度自检"三条(挖掘 vs 结算靠谁在动+饱和;胜负以色相即判;Boss 以紫赤登场标记)为转场验收锚 | -| 音频(D4,Alpha 占位) | MVP 无音频;挂点清单引用 B1/B4 音频挂钩点(明细行类型流 / 负反馈聚合单次 / 开格拾取按 category 分色 / 清图奖励音)+ toast 提示触发(本 GDD 新增挂点候选);临时 SFX 随垂直切片(AD 项先例) | - -> 📌 **Asset Spec**:Visual/Audio 义务已定义。art-bible 已定稿(§1–4),样张批后运行 `/asset-spec system:d1-hud-framework` 产出逐资产视觉描述/尺寸/生成提示词(样张先行——§1.4 为定稿闸)。 - -## UI 要求 - -| 项 | 要点 | -|---|---| -| 权威屏级 spec | `design/ux/battle.md`(APPROVED,B1 UX Flag 的 /ux-design 产物——覆盖子屏:挖掘主界面 / 结算明细 / 道具窗口 / 终局 / 明细回看):本 GDD 为其系统级承接(布局/组件/交互裁决全部继承,见核心规则二—七组);本节不重复 spec 内容,stories 引用 `design/ux/battle.md` 而非本 GDD 直引组件细节 | -| UX Flag 处置 | B1 UX Flag(结算明细屏 + 道具窗口 → Phase 4 前置 /ux-design)已由 battle.md 兑现闭合;D1 自身无新增屏(战斗屏 = 唯一 MVP 玩法屏);相邻域屏 NodeOverlay / 关卡结算 = 后续 spec `design/ux/node-reward.md` / `design/ux/level-clear.md`(battle.md OQ9——本 GDD 只锁出口锚点) | -| pattern 库 | `design/ux/interaction-patterns.md` 已建(核心 8 条:双源拒绝反馈 / 原位窗口激活 / 逐行兑现明细带 / 悬停预承诺光标 / 点阵资源显示 / 模态 overlay 层级纪律 / 破坏性确认异位 / 禁用态即理由全文)——本 GDD 组件全部对号入座;12 目录占位(实现期回写义务) | -| accessibility | `design/accessibility-requirements.md` 未建(gate-check Pre-Production 缺口在案)——本 GDD 内建基线承诺(Rule 22),正式分层(文本缩放/色盲模式/按键重映射)待该文档定稿 | -| 场景探针标配(code-conventions) | 每个可交互 UI 区域配套场景级探针——切片三探针(ui_probe / ui_click_probe / ui_tune_probe)扩展 + 战斗屏场景级探针(AC 硬性块);探针即呈现层契约的活文档 | - -## 验收标准 - -### 测试口径 - -| 口径 | 要点 | -|---|---| -| 测试载体 | ADR-0004 双载体定稿(gdUnit4 deferred——D2 OQ1 关闭形态):逻辑断言类 = `godot --headless --script` 冒烟扩展;场景级类 = 场景探针(`godot --headless --path . res://smoke/.tscn` 走正常项目引导——autoload 在位、真实 SceneTree;切片三探针为先例) | -| 期望值纪律 | 呈现断言引用表读值(AP=ap_per_round 表读值、RAP 门槛=rap_refresh_cost 表读值等)与 art-bible 冻结参数,不写死玩法数值;呈现常量(toast 时长等)为本 GDD Tuning Knobs 登记值可直断;每用例先 `reset_diagnostics()` | -| 覆盖声明(out-of-scope) | 玩法行为正确性(上游 GDD AC 域——D1 只断言呈现投影与上游契约一致)· 美术终稿质量(样张/asset-spec 批)· 动画密度(B5)· 音频(D4)· gamepad 焦点序(OQ5) | - -### AC 清单(编号不变,Given-When-Then) - -#### 布局与可读 - -| AC | Given | When | Then | 覆盖 | -|---|---|---|---|---| -| AC-1 | 1280×800 与 16:9 全屏(canvas_items/expand) | 进入战斗屏(12×12 板) | 五区无遮挡/无重叠/无内容裁切(棋盘全部格子+数字完整可见)、分区尺寸 = battle.md 布局表值、同屏 draw calls < 200、进入后 ≤500ms 内首格可点 | 五区布局与基座 | -| AC-2 | 12×12 / 10×10 两档板 | 装板渲染 | cell = F1 定值档(36 / 45px @1280×800)且可行性校验通过、数字字号 ≥ max(18, cell/2)、像素字体整数倍缩放无模糊 | F1 格尺寸与字号 | -| AC-3 | 全部格底×数字组合 | 灰度截图 + 对比抽测 | 1–8 全档对比 ≥4.5:1(F2)、0.5× 缩放数字仍可辨、纹带不侵数字字形区;全部状态转场(去饱和+金橙偏移 / 暮蓝 / Boss 紫赤)明度恒定(无变亮/变暗表达) | 对比度与明度恒定(F2) | -| AC-4 | 含雾板 | 逐格渲染后灰度截图(+代码走查) | 四种格态一眼可辨;已引爆雷格呈"可通行可读"(已开底+巢穴纹+可作移动目标);已开雾格 = 地板无字 + 底色层 tint 残留且与已开 0 格灰度可判定区分;数字显示判定消费 variant_ids(呈现层无独立雾判定——代码走查) | A2×6②④ / A4×3③ | -| AC-5 | 小人在场 | 挖掘期任意时刻静止截图 | 8 向相邻未开格常驻呼吸微光(挖掘期唯一在动元素——其余静止截图断言);绘制优先级栈成立(徽章在旗之下纹理之上、不进数字区、无第二焦点) | 可挖域与绘制栈 | - -#### 输入与交互 - -| AC | Given | When | Then | 覆盖 | -|---|---|---|---|---| -| AC-6 | 悬停已开格 | 悬停 / 点击移动 | `compute_move_path` BFS 路径以小人蓝细线点迹高亮(合法性指示);移动执行 ≤150ms 短滑;不可达格返回空且禁止光标(预览执行同源——A2 AC-14② 对侧);点击远格无自动 move+dig 复合意图(负空间) | A2×6⑤ 定稿 | -| AC-7 | 一帧内多意图(含 stop) | 提交 | 整批经 `settle_batch` 单批到达(stop 终结当帧收集——探针断言单批);光标三语义(移动/挖/旗)随悬停目标正确切换 + 目标格边框高亮 | A2×6⑥③ | -| AC-8 | Active 挖掘期 | ① 点击停手 ② 弃图刷新成功 ③ RAP<8 或 cap 超限提交 | ① 意图经 `settle_batch([stop])` 提交(代码走查 + 探针:零直调 A3 符号)+ 按钮下压 + AP→RAP 飞行数字(RAP 增量 = 剩余 AP 读数投影)② RAP 扣 rap_refresh_cost、AP 不重置、剩余次数扣减可见、旧板旗失效提示可见 ③ 资源面拒绝可见(脉冲 + toast——EC13/EC15) | A2×6① / A3 | -| AC-9 | 已开格 + 库存 | 渲染已开格与库存常读条 | 已开格家族徽章(§4.6.3 键)+ tier 档位拾取瞬间可读;库存常读条逐件 icon+名称+属性简述、枚举序 = stock 受理序、不含来源信息(列表与 tooltip 均无);Used 件不在常读条;同族刀(knife_t1/knife_adv)并排互辨 | B4×5① | - -#### 信息与归因 - -| AC | Given | When | Then | 覆盖 | -|---|---|---|---|---| -| AC-10 | 双敌种遭遇 | 渲染敌卡 + 击杀驱动 | 意图徽标 = 下一拍预告且挖掘期全程可见、映射按 enemy_id 全局恒定(跨 run 重放同姿态)、含强度档位与环长编码(环点数 = 拍数)、蓄力态含蓄力记号;顺位徽标可读(固定顺位最前者可辨);血条 hp/max_hp 数字可读;多敌伏击层数各卡同值呈现;敌死亡 = 血条归零→灰化+碎裂退场(禁瞬消)、就地更新不丢灰化态(entry 36 回归) | B2×4①②③④ | -| AC-11 | 完整结算 | B1 步骤流驱动明细带 | 逐行明细实时可见且每行带来源标注(source_label_map 文案)、四类未生效行按聚合计数呈现且带形状冗余、零值行可见、效果行 value/pool_value 分示禁相加;标中旗行金框+弹道加重;H2 清图奖励行金框;完美排雷 = 金光带加倍+「完美排雷 ×2」横幅、value = 实际有效兑付当量、首份零兑付时高光降级不发;战斗后可经明细回看 overlay 复看完整流水 | B4×5③④ / B1×3①② | -| AC-12 | 状态在场/清空 | 渲染状态槽 | 槽显示 icon(§4.6.1 键)+层数+剩余结算次数点+tooltip(来源+语义);极性按键级表呈现(金满框/红缺框——非 magnitude 符号:负 magnitude 有利行测试例);空态 = 槽隐藏 + 数据框上移 + 图例载空态说明;battle_over 逐槽化光收回 + 微文案 | B3×4①③④ | -| AC-13 | 窗口触发 | 窗口交互 | E 区原位激活(非中央弹窗)+ 至多选 1 件 + usable_now=false 灰置带禁选原因 + 政策注记「未选用件随关卡结束清空」常驻 + 空库存不弹窗 + 选中提交 = 窗口条目位置(选中件库存态必变 Used——缺陷④回归探针)+ 窗口期不被常读刷新 stomped(entry 36 回归)+ D 区去饱和锁输入(明度不变) | B4×5② | -| AC-14 | 含雾板首遇 + 图例/提示系统在位 | 驱动各 hint_id 触发条件(含同 run 重复触发) | 图例面板「迷雾 = 无雷盲区」条目恒在可随时回看、载状态空态说明;雾首遇提示每 run 一次、非模态不劫持输入、必含三要点;chord 提示每 run 一次含「点数字格 = 移动小人」锚点;no_adjacent 首次提示;hint_id 去重生效(同 run 二次触发零 toast) | A2×6③ / A4×3①② | -| AC-15 | 程序化占位渲染全组件集 | 键位映射表挂接核查 + 未知键注入 | 全部 icon/徽章/线索经键位映射表挂接(数据键→纹样 ID);§4.6.1 七键/§4.6.2 八键/§4.6.3 五键/§4.6.4 姿态键逐一在位;未知键 = fail-fast 断言 + "?"占位 + 诊断(禁静默空图标);sapped 键未入 StatusEffectTable 前零引用 | 键契约执行 | - -#### 状态·资源·终局反馈 - -| AC | Given | When | Then | 覆盖 | -|---|---|---|---|---| -| AC-16 | battle_over 与 level_clear 信号(关卡末战) | 清空反馈逐项到达 | battle_over:RAP 数字滚动归零+微文案、状态槽逐槽化光+微文案;level_clear:库存逐件化光飞出+「剩余道具 ×N 随关卡结束清空」(N = 清空前快照计数);两反馈不合并、时序不倒挂 | A3 / B3×4④ / B4×5⑤ | -| AC-17 | 判定行 verdict=win/lose(Boss encounter 变体) | 终局呈现 | 胜利 = 金蜡封落于扫雷图区中央+暖白金 overlay+判定行+明细回看入口;失败 = 暮蓝 overlay(明度不变)+旗化光点收回+判定行;判定行内容 = B1 终局判定行投影(数据锚);Boss 战 = 紫赤影子爬棋盘一次性演出 + 阶段指示附 Boss 名 | 终局与变体 | -| AC-18 | 完整对局驱动 | 采集 playtest JSONL | 六类 ux 行按 Core Rule 17#13 schema 写入 playtest JSONL(字段名与值域逐项对表);ux_round_exit.path_tag 值域 = 上游封闭枚举 | 遥测 | - -#### 场景级 headless 测试(切片教训硬性要求②③——缺项即 blocking) - -| AC | Given | When | Then | 覆盖 | -|---|---|---|---|---| -| AC-19 | 真实实例化战斗屏场景(探针场景加载、autoload 在位) | 驱动完整对局(两场遭遇 × 含雾板 × 窗口选用/跳过 × 刷新 × 胜负两终局) | 全程零脚本错误(stderr 归零)+ 五区断言 + 首格可点计时 ≤500ms(切片 ui_probe/click_probe 模式扩展) | 战斗屏场景级探针 | -| AC-20 | AC-19 对局至 despawn 与 battle_over 之后 | 静态扫描 views/ 文件集 + 终局后重放渲染比对 | 呈现层对核心生命周期状态的读数 = 零(静态扫描:views/ 文件集禁 `is_battle_live()` 以外的核心状态位读取、禁核心内部字段访问——只许成文呈现面);终局呈现数据全部来自流水行/快照(断言终局后重放渲染与实时渲染逐像素一致——快照自包含判据) | 信号时点状态可见性——缺陷②回归 | -| AC-21 | 逐一打开全部模态覆盖层(含叠开) | 逐层打开 / 关闭 | 每层打开时遮挡物隐藏/输入锁定断言成立、关闭逐层恢复;TunePanel 默认不可见(显式初始化) | 模态层级——缺陷⑤回归 | -| AC-22 | 悬停 tooltip 最长文案 / 明细行 40% 膨胀宽度构造 | 渲染后截图差分 | 全部动态区固定槽高 + clip_contents:布局零推挤(截图差分断言) | 布局稳定——缺陷①回归 | -| AC-23 | 全部中文文案界面 | 渲染 + 字形覆盖抽测 | 全部中文文案渲染非豆腐块(字形覆盖抽测——ADR-0003 硬性前置) | CJK 字体 | -| AC-24 | AC-19 对局全载荷流 + 六面回执 | 探针逐字段断言 + 代码走查 | 探针对 Core Rule 17 表 #1–#9 载荷逐字段断言(消费侧校验——缺字段/多字段 = 失败,切片"窗口载荷缺 round_index"崩溃回归);#12 命令式刷新面 = 代码走查(旗插拔/移动/AP/RAP/状态/库存六面各一个回执后重查断言) | payload schema 消费断言——硬性要求①兑现 | -| AC-25 | 呈现层文件集 | 静态扫描 / grep | 零 `randomize()`/`randi()`/`randf*`(S1/S2)、零玩法数值字面量(期望值经只读面推导——人工三要素口径 warning 级 + AC-1/2/8 表读值推导合成判定)、核心写调用仅组合根(S7 呈现侧)、切片 provisional 名(`request_refresh_active` / `can_request_refresh` / `refresh_max_per_round` / `during_round`)零残留(grep 断言——entry 35 命名统一核销);每视图单元头注含「实现 GDD:design/gdd/d1-hud-framework.md(系统 ID D1)」溯源行 | 静态扫描与命名 | -| AC-26 | 1280×800 全量界面(含 AC-19 对局) | 截图抽测 + 静态扫描 + 探针 | 字号下限成立(棋盘数字 ≥18px / 明细正文 ≥14px / tooltip ≥13px);无闪烁 >3 次/秒(动画时长/频率参数扫描);减动效开启 = 全部转场/高光/演出减半或跳终态、结算逐行兑现降速不跳过(探针断言);AC-19 对局全程纯鼠标驱动(零键盘依赖) | 可访问性基线(Rule 22) | - -### 覆盖矩阵(门禁评审用) - -| 类别 | 映射 | -|---|---| -| Core Rules | 1–4→AC-19/24/25 · 5→AC-1 · 6→AC-10 · 7→AC-6/7 · 8→AC-6 · 9→AC-4/5 · 10→AC-9 · 11→AC-12/15 · 12→AC-11 · 13→AC-13 · 14→AC-14 · 15→AC-4/11 · 16→AC-8/16/17 · 17→AC-24 · 18→AC-20 · 19→AC-15(键位)/样张引用 · 20→AC-25 · 21→AC-21 · 22→AC-23/26 | -| Formulas | F1→AC-2 · F2→AC-3 | -| Edge Cases | 全表→AC-4/6/8/10/11/13/14/16/17/21/22/23/15(拒绝与 voided→AC-8 及探针负例;零合法板→AC-19 注入腿;双雾区→AC-4/11 腿) | -| 义务台账 | 27 项→呈现义务台账落位表逐行(依赖节) | -| 切片教训 | 3 项→AC-19/20/24 + Core Rules 17/18 | - -## 开放问题 - -| # | 悬案 | owner | 时机 | -|---|---|---|---| -| 1 | _draw 迁移复议(ADR-0003 Decision 3 的 D1 裁决登记):MVP 维持 GridContainer + 逐格控件(裁决依据:呈现层程序化占位、样张未定稿、雾纹理/终稿表现力需求未冻结、三探针与现形态耦合〔改造 = 隐藏成本〕)——样张定稿后按表现力需求(biome 色板/雾纹理/动效复杂度)复议二选一;若迁移,`Viewport.push_input` 端到端探针从加分项变必需项(ADR-0004) | D1 复议批 | 样张定稿后 | -| 2 | A3 轮内刷新次数读数(接口漂移登记):刷新按钮"本轮剩 N 次"需要 A3 暴露轮内已用刷新计数(现只读观测量 ap/rap/phase/last_round_end 未含)——A3 修订批补只读观测量 + AC 前言扩列;落地前按钮退化为静态文案"RAP−{rap_refresh_cost 表读值} · 每轮至多 2 次" | A3 | 正式实现接线批 | -| 3 | B1/B2 呈现面 API 契约登记(冲突⑧扩条):切片已实现的 `presentation_snapshot` / `is_battle_live` / `stock_count` / `query_reward_identity` / `submit_window_selection`(B1 面)+ `settlement_snapshot` 信号 + `hero_unit` / `all_enemies`(B2 面)均未在 B1/B2 GDD 登记——registry `d1_presentation_surface` 为现行契约载体;回 B1/B2 修订批补登记 API 面,独立信号需求随批裁决(接口漂移) | B1 / B2 | B5 GDD 前 | -| 4 | battle.md 订阅表述对齐(冲突清单⑥):ADR-0001 订阅纪律(呈现层只订 B1/runner)与 battle.md §Events Fired"A2 三事件呈现订阅"的措辞差——本 GDD 按 ADR-0001 收窄;battle.md 复检批对齐 | battle.md 复检 | 下次 /ux-review | -| 5 | Gamepad 焦点序(battle.md OQ8 继承):Partial 支持非 MVP——焦点环顺序待 gamepad 批次 | gamepad 批次 | gamepad 批 | -| 6 | 相邻域屏 spec(battle.md OQ9 继承):`design/ux/node-reward.md` / `design/ux/level-clear.md`——本 GDD 只锁出口锚点(节点奖励覆盖层 / 关卡结算屏的完整形态归后续 spec) | 后续 spec | 垂直切片后 | -| 7 | accessibility-requirements.md(battle.md OQ2 继承):正式分层(文本缩放/色盲模式/按键重映射)待该文档定稿——gate-check Pre-Production 缺口在案 | 该文档定稿批 | 文档定稿 | -| 8 | 键集扩容流程锚定:新 effect_id / reward_id / enemy_id / cell_type 上线 → art-bible §4.6 修订 + SettlementTable effect_pool_map 随批登记(接口漂移双登记——本 GDD AC-15 fail-fast 强制暴露漏登记) | art-bible / D2 修订批 | 键集扩容时 | -| 9 | 极性提案实施批的 D1 义务条目(冲突清单④):未开格类型图标 / 极性视觉语言 / 负向文案族按提案 §3.5 正式登记入 systems-index D1 台账(本 GDD 已预留键槽位与裁决⑤) | 极性提案实施批 | 提案实施批 | -| 10 | 明细带挖掘期常驻摘要(battle.md OQ6 继承):常驻(现方案)vs 结算后收起——playtest 观测回看频率后裁决 | playtest 后裁决 | 垂直切片 playtest | -| 11 | D5 教学挂靠(battle.md OQ13 继承):挖到雷=敌方优势 / 旗挡链 / 首次蓄力提示 / 囤刀闭环——toast 体系为落点候选,D5 GDD 批定 | D5 | D5 GDD 批 | -| 12 | TunePanel 退役时点(battle.md OQ10 继承):C4 天赋树落位批退役(Rule 21 已标注);Playtest 诊断按钮保留 | C4 | C4 落位批 | - -## 版本历史 - -| 版本 | 日期 | 改动 | -|---|---|---| -| v1.1 | 2026-09-14 | /design-review(lean)NEEDS REVISION 同日核销:F1 改两档定值 + 可行性校验式(原闭式在固定边距下无法同时得出 36/45——用户裁决方案 A);呈现面 API 接口漂移登记扩条(冲突⑧/OQ3 覆盖 B1×5 函数 + B2×2 投影 + settlement_snapshot 信号);状态头 C3 状态更正(Designed 非 Approved);C1-lite 切片契约注记(C1 GDD 定稿时回填);新增 AC-26 可访问性基线(字号下限/无闪烁/减动效/纯鼠标)并扩覆盖矩阵 Rule 22→AC-23/26;"尸位"用语替换为直白表述;RAP 文案模板改表读值占位 | -| v1.0-lean | 2026-09-13 | 格式迁移:legacy 原稿按 lean 样例重排——修订注记出正文收敛至本表;核心规则/枚举/边界情况/AC 转表格;呈现刷新链路转字符画 + 出口分发表;13 项载荷 schema、27 项呈现义务台账、意图线索目录、切片教训落位表、冲突清单、25 条 AC 全保留;语义与当日定稿版对齐,零规则变更 | -| v1 | 2026-09-13 | /design-system 一次会话定稿:27 项呈现义务落位 + 22 条核心规则 + 13 项载荷 schema 成文 + 25 条 AC + 三条切片硬性要求(solo 模式出稿,未经 /design-review) | diff --git a/design/gdd/legacy-2026-09-14-v1/d2-data-config.md b/design/gdd/legacy-2026-09-14-v1/d2-data-config.md deleted file mode 100644 index dce35e5e..00000000 --- a/design/gdd/legacy-2026-09-14-v1/d2-data-config.md +++ /dev/null @@ -1,629 +0,0 @@ -# D2 数据配置与数值表(Data Config & Balance Tables) - -> **状态**:Approved · lean 格式 -> **版本**:v1.0-lean · 2026-09-13 · 作者:user + agents -> **承载支柱**:P1、P2(基础设施层,间接支撑全部四支柱) -> **层级**:Layer 1 Foundation · Milestone MVP · 设计顺序第 1 位 -> **评审**:lean 门禁 systems-designer / qa-lead;full 评审 + 同日 re-review 含 game-designer / creative-director,CD-GDD-ALIGN 终裁 Approved——评审日志 `design/gdd/reviews/d2-data-config-review-log.md` -> **一句话**:D2 把全部影响手感与平衡的数字收进可配置、可校验的数值表,经 ConfigDB 单点发放、RngService 统一种子化——战斗可复现、平衡可热调、headless 可测的数据底座。 - -## 速览 - -| 关键问题 | 答案 | -|---|---| -| 定位 | 数据底座:全部玩法数值的单一事实源(data/tables 的 .tres)+ 统一注册表 autoload ConfigDB + 随机数种子服务 autoload RngService——schema 先行、数值回填 | -| 拥有 | 全部表 schema 类(data/schemas)与数据文件(data/tables)· ConfigDB / RngService · SCHEMA_VERSION · 加载/校验/热重载状态机 · 校验双通道与诊断收集器 · debug override 链 · 难度行解析 resolve | -| 不拥有 | 平衡数值定值与玩法公式(owner 系统 GDD 与 registry)· 玩法随机预置(须走 Rule 5 增流通道 + P1 评审)· 存档(D3)· 任何 UI 表现面 · 精英/Boss 修饰语义(C1/C3) | -| 上游输入 | 无——Foundation 层不依赖任何系统;master_seed 由 C2 冒险开始时设定 | -| 下游输出 | 全部 19 系统经 ConfigDB 类型化读取 · board_gen / reward_roll / encounter 封闭流 · SCHEMA_VERSION + master_seed/计数器快照(D3)· config_reloaded 信号(仅 debug) | -| 硬约束 | 玩法数值零代码字面量 · 零 UI 依赖 · fail-fast 无软回退 · RNG 流集合封闭 · 表路径固定(debug 注入根除外)· release 无 override 源 | - -- 存在理由:没有 D2,参数散落各处硬编码——调一次难度要改五处代码,战斗无法用固定种子复现,headless 自动化测试无从谈起。 -- 策略:schema 先行、数值回填——本 GDD 只定数据结构、注册表与校验模式;具体数值由 owner 系统 GDD 按设计顺序回填(十张已定稿 + 两张占位)。 -- 定位:玩家永远不该注意到的地基——不制造情绪,但失职会直接摧毁 P1/P2 的信任底线(三种消极保障见体验锚点)。 - -## 体验锚点 - -| 支柱 | 关键词 | 机制承诺 | -|---|---|---| -| P1 / P2(正面对象在别处) | "玩家永远不该注意到的地基" | D2 无专属玩家幻想——P1"我算对了"的掌控感来自 A1/A2 可推理设计,P2 的延迟兑现感来自 B1 可见结算;D2 只提供下列三种消极保障 | -| 手感稳定(消极保障) | "改数字不改代码" | 全部影响手感的数字(AP、旗、折算比例、奖励值)集中一处可调 + 热重载即改即验——"测试数据驱动平衡"的开发方式,任何"这轮玩起来不对劲"都能快速修正且不引入新毛刺 | -| 公平可信(消极保障) | "同决策必同结果" | RNG 统一种子化:相同决策序列必然相同战斗结果——可复现是开发侧信任底线(回放/审计/自动化测试),不等于玩家侧可推理;玩法随机零预置(走增流通道 + P1 评审,Rule 5) | -| 难度可信(消极保障,P4) | "越下越险由结构保证" | 数值表天生带关卡序号/节点深度两维——难度曲线可审计、可回溯,而非散落各处的魔法数字(离线审计 = 曲线导出工具,C3 期交付) | - -## 全局流程 - -### 数据加载与校验链路 - -``` -进程启动(Unloaded) - │ ConfigDB._ready() / load_tables(root, collect_only) - ▼ -Loading ──── 按表清单逐一 load() ── 文件缺失 → Failed - ▼ -Validating ── 单个资源加载成功 → schema validate(),错误入诊断收集器 - ▼ -┌ 校验双通道 ──────────────────────────────────────────┐ -│ 游戏通道 collect_only=false(默认): │ -│ 错误 → push_error 清单 → 致命错误路径 │ -│ editor / CI / headless / release 一律致命 │ -│ 测试通道 collect_only=true(仅 debug/测试构建): │ -│ 收集不升级 → 冒烟脚本逐夹具断言类别 → 一次性退出 │ -└──────────────────────────────────────────────────────┘ - ▼ -Ready ────── 全部通过 → 类型化属性可读 -``` - -### 热重载链路(仅 debug) - -``` -编辑器热重载 / 调试键 → Reloading - │ - ├─ 战斗中(set_reload_gate 已置位)→ 拒绝返回 false,停留 Ready - │ (战斗结束后手动再触发,不自动重放) - ▼ -重走 Loading → Validating - │ - ├─ 校验失败 → 保留旧表停留 Ready + debug 错误清单(唯一软着陆,不杀调试会话) - ▼ -校验通过 → Ready:新值经类型化属性可读 + config_reloaded 恰一次(仅 debug,D1 调试用) -※ RNG 状态线独立:Reloading / Failed 不触碰 RngService——计数器与 master_seed 不变(AC-4) -``` - -### RNG 取数链路 - -``` -进程启动 → 流待命(未播种取数 = 致命) - ▼ -冒险开始 → C2 set_master_seed()(仅全流计数器全零时受理) - ▼ -scope 事件:board_gen = 每次生成新扫雷图(A1 换图时) - reward_roll = 每次 board install 批(格奖励批 + 清图奖励批) - encounter = 每场战斗实例化(B1 begin_battle——unit_count 区间骰) - │ open_stream(stream):计数器 +1 → R2 派生 → 返回已播种实例(同一 scope 事件内取数共用) - ▼ -冒险结束 → 流保留供复盘;快照 = master_seed + 各流 scope 计数器 - (须在无在飞 open_stream 实例时切出——scope 事件边界之外) -``` - -### 出口分发 - -| 出口 | 触发 | 动作 | 约束 | -|---|---|---|---| -| 启动致命中止 | 启动加载任一致命错误 | 输出错误清单并中止构建;headless 独立进程非 0 退出 | 全构建一致,无软回退(Rule 6) | -| 热重载软着陆 | debug 热重载校验失败 | 保留旧表停留 Ready + debug 错误清单 | 唯一例外(EC16) | -| 运行期致命 | 请求越域 / 未播种流取数 | 游戏内致命错误路径;headless quit 非 0 | 不分构建(EC7 / EC14) | -| 热重载成功 | debug 且门未置位且校验通过 | 新值可读 + config_reloaded 恰一次 | 战斗中被门拒绝(EC8) | -| 存档拒读 | SCHEMA_VERSION 高于当前 | 拒绝读取 | 比较归 D3,常量归 D2(EC9) | - -## 核心规则 - -> 每条规则两段:**人话**(作用于哪个系统、什么情况下、谁触发、触发后发生什么;效果与情况用枚举表)→ **举证**(计算方法/公式;纯流程规则明写"无计算")。 - -#### 规则 1:能调的数字只写在表文件里,代码里不写死 -**人话**:管的是整个项目的玩法代码。凡是设计师要调的数字(行动点、插旗成本、奖励值、敌人数值……)只存在于 data/tables/ 下的 .tres 数值表里,一处定义、处处引用;代码文件里禁止出现玩法数值字面量(引擎/工程常量除外)。谁在评审里发现写死的玩法数值,即视为评审阻塞项。 -**举证**:无计算。违规检测 = 启发式扫描 + 人工复核(AC-14,随各 owner 回填定稿与里程碑 gate-check 执行)。 - -#### 规则 2:所有系统读数值,都只找 ConfigDB 这一个入口 -**人话**:管的是全部 19 个系统的取数动作。任何系统要读数值只有一条路:经 autoload ConfigDB 的类型化属性读取(例 `ConfigDB.action_economy.ap_per_round`)。禁止绕过它自己 `load()` 表文件或长期缓存一份副本——副本绕过校验,热重载换新值时它也不知情。唯一例外:debug/测试构建可从命令行注入的根目录加载。 -**举证**:无计算。注入根的机制见本节末「规则 6 的实现参照——校验双通道」夹具注入行。 - -#### 规则 3:先把表结构定下来,数值随后由各系统回填 -**人话**:管的是全部数值表的交付方式。每张表都是"结构 + 数据"两件套:结构 = 一个自定义 Resource 类(data/schemas/),每个字段带类型、范围、默认值和注释;数据 = 数据文件(data/tables/)。本文档先交付全部 schema 与占位表(含键结构),具体数值由 owner 系统 GDD 回填——先有格子、后填数字。 -**举证**:无计算。十张已回填表 schema 目录见「枚举」节,逐表字段行见 Tuning Knobs 节。 - -#### 规则 4:难度数值按"第几关、第几层"的坐标查行 -**人话**:管的是跟着冒险进度成长的数值表(难度、生成参数、敌人配置)。这类表每行都带(关卡序号, 节点深度)两维坐标:系统按坐标取数,进度坐标没有精确命中时就取"不超过请求坐标的最近已有行";敌人等实体键在命中的行里按名字精确匹配、不做近似——那一行里没有这个名字就是悬空引用,直接致命中止。道理:进度坐标可以就近近似,"是哪种敌人"不能近似——身份近似会静默改变遭遇构成、损害 P2 归因。 - -| 表的形状 | 行键怎么定 | -|---|---| -| 进度成长表 | 行键 =(关卡序号 level_index, 节点深度 node_depth) | -| 实体复合键表 | 进度两键之后再复合实体主键列(如 EnemyTable 的 enemy_id;合成规则写入 schema 注释) | -| 单行全局常量表 | 无成长语义的表允许只放一行 | -| 元进度表 | 存档/天赋/代币归 MetaTable,键结构归 C4 定 | - -| 两维坐标之外的数值轴 | 归宿 | -|---|---| -| 战斗内轴(胜场/轮次等) | 由 owner 公式承载或作为表列;归属登记进 schema 注释(C3 定稿时声明) | -| 难度第三维"精英/Boss 修饰" | game-concept 定稿:难度 = f(关卡序号, 节点深度, 精英/Boss 修饰);DifficultyTable 预留 elite_ / boss_ 前缀扩展字段命名空间,语义由 C3 定稿——本 GDD 不定义任何修饰数值、不预写修饰枚举 | -| 两键定不了精英性的节点形态 | 如分支地图同深度并存精英与普通节点——允许改键,按接口漂移修订规则回写(与 MetaTable 同等豁免待遇) | - -**举证**:解析规则(floor 取行、warning 四元组去重、越域前置守卫)见「数值结论与推导 · R1 难度行解析」;悬空引用 = 加载期致命,见规则 6。 - -#### 规则 5:全项目随机数只从 RngService 一处按流取 -**人话**:管的是全项目玩法代码的随机数。只此一家:autoload RngService(D2 范围)持有封闭的三条具名流(下表),流集合封闭、只含具名消费者;要新增随机流(含 B1 若需结算随机)必须改代码走增流通道并通过 P1 支柱评审(随机须有界、可见或可推理)。玩法代码禁止 `randomize()` 或自建 RandomNumberGenerator。master seed 由 C2 在冒险开始时设定——同一冒险内相同决策序列必然相同战斗结果。 - -| 流 | 谁在用 | 取号时机(scope 事件,唯一绑定) | -|---|---|---| -| board_gen | A1 布雷 | 每次生成新扫雷图(A1 换图时) | -| reward_roll | B4 掉落 | 每次 board install 批(格奖励批 + 清图奖励批) | -| encounter | B1 战斗实例化 | 每场战斗实例化恰一次取号(begin_battle 实例化期,扫雷开始前;敌人数量 unit_count 区间骰——挖掘决策域之外,P1 合规) | - -| 取数入口 | 给谁用 | 行为 | -|---|---|---| -| `open_stream(stream) -> RandomNumberGenerator` | 玩法代码(有状态流门面) | 每调用一次 = 一次 scope 取号:该流计数器 +1 → 派生 → 返回已播种实例;一个 scope 事件内所有取数共用该实例 | -| `derive_at(stream, scope)` | 测试/预览(纯函数) | 不推计数器——预览取数不污染正式序列(杜绝预览类取数的平衡 Heisenbug) | - -**举证**:种子派生公式与黄金向量见「数值结论与推导 · R2 流种子派生」;流封闭清单见「枚举 · RNG 流」;依据 = B4 契约源〔AC-1〕· R2 黄金向量。 - -#### 规则 6:数据出错当场中止,绝不带病运行 -**人话**:管的是 D2 的加载与运行期错误处置。数据出错一律致命中止,MVP 有意不做软回退——错误数值上线比崩溃更伤(P1/P2 的信任底线)。错误分两类,处置见下表。唯一例外:debug 热重载校验失败时保留旧表停留 Ready、给出错误清单——不杀运行中的调试会话。 - -| 错误类别 | 什么情况 | 处置 | -|---|---|---| -| 加载期校验错误 | 启动加载/热重载时查出:字段越界、类型错、NaN、表为空或某 level 无行、缺 depth-0 锚行、重复键、悬空引用、权重和 ≤0 | 经校验双通道处理;启动路径在 editor、CI、headless、release 一律致命 | -| 运行期致命 | 运行中越界请求:关卡/深度坐标越域(解析入口前置守卫拦截)、未设种子就取随机数 | 不分构建一律致命:游戏内走致命错误路径,headless 冒烟进程 quit 非 0 | - -**举证**:未播种流取数见 EC7;请求越域见 R1 前置守卫。致命错误类别总表见「枚举 · 致命错误类别」;两类构建如何分流,见下方「规则 6 的实现参照——校验双通道」。 - -#### 规则 7:数据层零界面依赖,无头环境照样跑 -**人话**:管的是 D2 自己的代码与测试。它们一律不 import 任何 Control/场景类——纯数据层不碰表现。这是"Core 层 `--headless` 跑完整战斗"工程债在数据侧的落实:没有界面依赖,CI 与无窗口环境才能跑完整战斗。 -**举证**:无计算。验收 = 静态扫描 + headless 实跑两项合成判定(AC-10)。 - -#### 规则 8:表和存档带版本号,版本太高就拒读 -**人话**:管的是表文件与存档的版本兼容。版本常量 `SCHEMA_VERSION` 归 D2;表文件与存档(D3)携带版本号。存档带来的版本号高于当前支持时,直接拒绝读取——旧程序不硬猜新格式的数据。 -**举证**:无计算。拒读行为见 EC9(比较逻辑归 D3,常量归 D2)。 - -### 规则 6 的实现参照——校验双通道(ConfigDB.load_tables(root, collect_only)) - -| 通道 / 机制 | 要点 | -|---|---| -| 游戏通道(collect_only=false,默认) | 校验错误 → push_error 错误清单 → 走致命错误路径(游戏内中止构建;headless 下独立进程非 0 退出——`--script` 协议,设计顺序 #1 时无主场景可依赖);release 构建的致命表现(引擎默认错误路径的实际行为验证)显式 deferred→首次 release 导出 checklist(与 AC-18 同待遇) | -| 测试通道(collect_only=true,仅 debug/测试构建) | 收集错误不升级,供冒烟脚本逐夹具断言错误类别后一次性退出 | -| 夹具注入 | debug/test 构建允许经命令行 `--data-root=<路径>` 让 ConfigDB 从注入根加载(夹具放 tests/fixtures/);禁止把夹具拷进 data/tables/(污染 AC-1 的干净检出前提) | -| 诊断收集器 | resolve / 校验 / override 的 warning 与错误共用同一类目体系,统一经 ConfigDB 内部诊断收集器投递,同时镜像 push_warning 供开发期控制台(Godot 无进程内拦截 push_warning 的 API——冒烟断言必须走收集器);测试通道暴露只读诊断清单与 `reset_diagnostics()`;跨调用去重状态(R1 四元组注册表)随 `load_tables()` 或 `reset_diagnostics()` 清空(用例间无顺序依赖);游戏通道 warning 仅镜像控制台,不承诺收集 | - -## 枚举 - -### 十张已回填表 schema 目录(Rule 3 交付清单——逐表字段行见 Tuning Knobs 节) - -| 表资源 | 键结构 | Rule 4 豁免 | 跨字段 / 结构校验(加载期致命) | 悬空引用政策 | Owner | -|---|---|---|---|---|---| -| ActionEconomyTable | 单行全局 | 单行全局定义表(先例) | 任一动作成本 ≤ ap_per_round(schema validate() 跨字段类别承载,条件性夹具登记) | — | A3 ✓ | -| VariationTable | 按 variant_id(含 unlock_level 列) | 定义表非进度成长表——进度语义承载于 unlock_level 列(schema 注释) | info_mask=hide_numbers ⇒ cell_constraint=safe_nonzero(夹具 variation_mask_constraint) | counter_item_ids MVP 不校验——A5 首个道具 id 回填时补校验 + 条件性夹具 | A4 ✓ | -| StatusEffectTable | 按 effect_id | 定义表非进度成长表(schema 注释承载) | magnitude:percent ∈ [-100,100] ∧ ≠0 / flat ≥ 1 跨字段校验 | effect_id 校验已激活(B4 RewardTable 首引 defense_up——夹具 b4_dangling_effect) | B3 ✓ | -| BoardGenTable | (level_index, node_depth)——首个进度键表(depth-0 锚行内建;第三轴落点 = Boss:Dmax 行约定 + elite 命名空间预留 + A1 OQ6 重审;改键退路 = Rule 4 接口漂移通道) | 无(进度成长表) | fog_domain_ok(F2)+ min_safe_feasible(F2b)+ cost_feasible(F2c:attempts×W×H ≤ 16384 provisional,运行期禁墙钟逃生) | — | A1 ✓ | -| EnemyTable | (level_index, node_depth, enemy_id)——每行集恰一敌种 | 无(进度成长表,A1 同型) | 每行集恰一敌种(行集内 enemy_id 唯一,违规加载期致命) | — | B2 ✓ | -| HeroTable | 单行全局 | 单行全局定义表(ActionEconomyTable 先例) | atk = 0 加载拒绝("0 基线 × 百分比增益恒零"死锁自 schema 层杜绝) | — | B2 ✓ | -| RewardTable | 按 reward_id(多行;pool_tag 分池不参与键) | 定义表非进度成长表(schema 注释承载) | 池空(pool_tag × 雾/非雾两态各 ≥1 活行)· clear_default 恒正当量 · buff⇒effect_id 必填 · safe_cell 活 buff 行集非空 · floor_supply_missing / no_damage_row(跨 RewardConfigTable) | effect_id 精确引用 StatusEffectTable(已激活) | B4 ✓ | -| RewardConfigTable | 单行全局 | 单行全局常量表(HeroTable / ActionEconomyTable 先例) | k_dmg=0 = F5 断言关闭(现行默认——刀保底语义由供给控制器战斗首件保证取代;no_damage_row 后闸托底) | — | B4 ✓ | -| SettlementTable | 单行全局 | 单行全局常量/结构表(HeroTable / ActionEconomyTable 先例) | segment_order 恒等拍板段序校验违例致命 · effect_pool_map 键 ⊆ StatusEffectTable 活行集 · p_perfect 载体域 {100,200} 域外加载致命——三行致命 manifest:segorder_violation / poolmap_dangling / pperfect_oob | effect_pool_map 悬空加载期致命 | B1 ✓ | -| AuxItemTable | 按 item_id | 定义表非进度成长表(schema 注释承载) | target ∈ 各空间 effect_kind 支持域交集(A5 承载——真视窄域护栏校验,夹具 a5_target_violation) | counter_item_ids(VariationTable → item_id)首引已定稿〔probe_dust〕、悬空校验激活随 D2×② 对侧批 | A5 ✓(原 HelperItemTable 占位更名转正——A5 定稿登记) | - -### 未回填占位表 - -| 表资源 | 占位内容 | 键结构 | Owner | -|---|---|---|---| -| DifficultyTable | 成长参数 + 精英/Boss 修饰预留命名空间(乘数域 [0.1,10] registry 预登记;**越域 clamp+warning = registry 登记的显式例外——组合事故非配置事故,非 fail-fast 场景**) | (level_index, node_depth) | C3(第 12 位) | -| MetaTable | 代币/天赋字段名 | 单行全局(元进度轴豁免,C4 可改键) | C4(第 16 位) | - -### MVP 内容行(事实登记归 registry) - -| 表 | MVP 行集 | 值状态 | -|---|---|---| -| ActionEconomyTable | 单行:ap_per_round=8 · dig/插旗/拔旗=1 · rap_refresh_cost=8 · move/chain=0(冻结) | 定稿值,登记归 registry `action_economy` | -| VariationTable | 恰含 fog 行(unlock_level=2 · hide_numbers · safe_nonzero) | 岩浆/冰冻无 MVP 行(垂直切片建行) | -| StatusEffectTable | 四行 attack_up / defense_up / ambush / weaken(全 stack) | 值 provisional,锚验收归 B4/B2/B1;weaken = −65(值域 [60,85]——B1 F0 裁决,条款 2 锚闭合);defense_up = −30(减伤墙批 C3 投值,叠满两层 −60 帽——B3/registry 同批) | -| BoardGenTable | 参考行 L1 / L2 | provisional(C3 调参所有权) | -| EnemyTable | 三敌种行 goblin / bugbear / ogre_chief(C3 修订批转正——registry `enemy.mvp_content` 为准) | 值 provisional——溯源义务见登记与对账义务表 | -| HeroTable | 单行(max_hp / atk=6 原型锚) | max_hp 出处待查;atk provisional 归 C3 | -| RewardTable | 默认根行集八行:defense_up_basic / attack_up_basic / spark_aoe / heal_minor / knife_t1 / knife_adv / heal_pack / clear_blast | 值 provisional 归 C3;格子池四行即时类 + 注入池三行可选类(active_inject——供给控制器承载,原"即时 75% / 可选 25%"权重占比由注入机制替代)+ 清图槽单行 | -| RewardConfigTable | 单行 t_fog_min=2 · k_dmg=0 · n_draft=32 · p_min=8 · active_p0=0.4 · active_decay=0.5 | provisional 归 C3 | -| SettlementTable | 单行默认(D_ref=12 · p_perfect=200 · 拍板段序 · clamp −100/+100 · floor · **+4 字段:damage_a_per_cell=1 / damage_a_cap=8 / damage_b_per_flag=2 / armor_effectiveness 克制矩阵——护甲克制批,C3 修订批接口漂移**) | provisional 归 C3 | - -### RNG 流(封闭枚举,3 流) - -| 流 | 消费者 | scope 取号事件 | -|---|---|---| -| board_gen | A1 布雷 | 每次生成新扫雷图(A1 换图时) | -| reward_roll | B4 掉落 | 每次 board install 批(格奖励批 + 清图奖励批)——B4 AC-1 为契约源 | -| encounter | B1 战斗实例化 | 每场战斗实例化恰一 scope(begin_battle 实例化期,扫雷开始前——unit_count 区间均匀骰,挖掘决策域之外 P1 合规;C3 遭遇随机化批增流,registry 已登记) | - -新增流 = 增流通道:改代码 + P1 支柱评审(随机须有界、可见或可推理)。 - -### missing_type(R1 warning 分类枚举) - -| 值 | 判定 | -|---|---| -| base_ceil | level 分量向上解析(请求低于表最小键)——恒记 base_ceil(depth 分量缺失与否只写入 warning 内容,不改类型) | -| level_floor / depth_floor | 单维向下解析 | -| both | level_floor 与 depth_floor 同时发生 | - -- depth 分量只有精确命中或向下 floor 两种情形(EC15 锚行保证每个 level 含 depth-0,永不 ceil);AC-5 各用例的 missing_type 均由本规则推导。 - -### 致命错误类别(Rule 6 两类) - -| 类别 | 通道 | 覆盖 | -|---|---|---| -| 加载期校验错误 | 校验双通道(启动路径全构建致命) | 字段越界 / 类型错 / NaN / 表为空 / 某 level 无行 / 缺 depth-0 锚行 / 重复键 / 悬空引用 / 权重和 ≤0 / 段序违例 / 池映射悬空 / p_perfect 越域 | -| 运行期致命 | 不分构建 | 请求越域(R1 前置守卫)· 未播种流取数(EC7) | - -### override key 空间(v1) - -| 项 | 值 | -|---|---| -| key 形态 | schema 字段点路径(与 Rule 2 属性路径同构,例 `action_economy.ap_per_round`) | -| 支持域 | 仅单行全局表字段;进度键表行寻址语法(如 `difficulty.(2,0).hp`)登记为后续扩展——当前 override 对进度表无 key 空间 | - -## 数值结论与推导 - -### R1 难度行解析(difficulty_row_resolution) - -**结论**:resolve 恒返回已有行——进度键 floor 解析、实体键精确匹配;不存在 default 行兜底、不存在 clamp 外推;非精确命中记 warning(四元组去重);请求越域在解析前置守卫致命。Output Range:行资源必有值(前置条件由校验保证);极端输入(超表大关卡号)命中最大已有行。 - -#### 推导 - -``` -row = resolve(table, level_index, node_depth) (ConfigDB 公开解析方法,table 经类型化属性取得) -前置守卫:level_index < 1 ∨ node_depth < 0 → Rule 6 致命(请求越域,不进解析) -L* = max{ lv ∈ LevelKeys(table) | lv ≤ level_index };空集(请求低于表最小键,向上解析)→ L* = min LevelKeys(table) -D* = max{ dp ∈ DepthKeys(L*) | dp ≤ node_depth };空集 → D* = min DepthKeys(L*) -``` - -**Variables:** - -| 变量 | 类型 | 范围 | 说明 | -|---|---|---|---| -| level_index | int | ≥1 | 当前关卡序号(1 起);越域 → 致命 | -| node_depth | int | ≥0 | 节点深度(0=关卡入口);越域 → 致命 | -| L* / D* | int | 表内键 | 命中行键 | - -- 无兜底 / 无外推的前置:表非空、每个 level 至少 1 行、每个 level 含 depth-0 锚行是 Rule 6 校验前置;超表成长外推是 C3 owner 公式的职责,D2 只解析到最近已有行。 -- warning 定位为开发期异常信号(防刷屏去重是刻意的),不是难度审计工具——离线审计由曲线导出工具承担(headless 脚本导出 resolve(level 1..N × depth 0..M) 矩阵供 diff,登记为 C3 期交付物)。 -- Example:表含行 (1,0)(1,4)(2,0)(2,6)——`resolve(3,3)` → L*=2、D*=0 → 返回 (2,0) 行,warning 一条(missing_type=both);`resolve(1,4)` → 精确命中零 warning;`resolve(99,99)` → 命中 (2,6),missing_type=both(与前者去重键不同,各自一条)。 -- 去重键 = (table_id, missing_type, L*, D*) 四元组,内容含请求 (level_index, node_depth)、解析结果 (L*, D*)、缺失类型;去重注册表随每次 `load_tables()` 或 `reset_diagnostics()` 清空。 - -### R2 流种子派生(stream_seed_derivation) - -**结论**:纯派生函数——同一冒险内(master_seed 固定)同流各 scope 种子互不碰撞;同输入恒同输出;跨 Godot 版本恒定(因此不用运行时 `hash()`——其跨版本稳定性无承诺);输出 ∈ [0, 2^63)。跨 master_seed 的全局单射不做声明(数学上由鸽笼原理排除)。Output Range:[0, 2^63)。 - -#### 公式 - -``` -derive_at(stream, scope) = ( SALT_s XOR wrap64(master_seed + scope × GOLDEN_RATIO) ) AND 0x7FFFFFFFFFFFFFFF -wrap64 = GDScript int(64 位二补数)自然回绕 = MOD 2^64 -``` - -#### 实现级规约(必须逐条遵守,否则黄金向量失配) - -| 规约 | 要点 | -|---|---| -| wrap64 | GDScript int(64 位二补数)的自然回绕 = MOD 2^64;禁止 float 中间量(53 位尾数必丢精度)、禁止对中间量使用 `%`(带符号取余语义易误用)、禁止"主动修复溢出"(中间积本就越界——乘数 GOLDEN_RATIO = 0x9E3779B97F4A7C15 > 2^63,scope=1 即回绕,这是设计依赖的语义,不是缺陷) | -| 常量书写 | 三个常量(盐×2 + 乘数)均 ≥2^63,GDScript 十六进制字面量按二补数解析为负——统一用分段表达式书写(例 `(0x9E3779B9 << 32) \| 0x7F4A7C15`,显式括号、不依赖优先级记忆),禁止直接书写 ≥2^63 的完整字面量;注意 GDScript 的 `^` 是按位 XOR | -| 输出掩码 | 经 AND 掩码保证非负(∈ [0, 2^63))后再赋 `RandomNumberGenerator.seed` | - -**Variables:** - -| 变量 | 类型 | 范围 | 说明 | -|---|---|---|---| -| SALT_s | int64 | 编译期常量 | board_gen=0xA0761D6478BD642F · reward_roll=0xE7037ED1A0B428DB · encounter=0x8EBC6AF09C88C6E3(互异奇常数,均 ≠ 乘数) | -| master_seed | int64 | [0, 2^63) | 冒险主种子;`set_master_seed()` 对负输入 abs() 归一化并 warning;恰为 INT64_MIN → 致命(abs 在 int64 对 INT64_MIN 恒等回绕,实测与 0 在全流种子逐一相等——别名机理是输出掩码抹掉 bit 63,掩码本身是规约的一部分);仅许全流计数器全零时调用(冒险中途重播种会静默清零计数器,击穿同冒险无碰撞前提与 D3 快照语义 → debug 断言) | -| scope | int64 | ≥0 | 派生入参;有状态门面的取号值(每流独立计数器:set_master_seed() 时归零,每次 `open_stream` +1,永不重置、不随关卡/图序重置——否则不同关卡的同序号图会得到相同种子);负 scope → debug 断言中止(`derive_at` 是预览工具入口,静默负值会与 scope+2^63 经输出掩码别名) | - -**黄金向量(AC-3 的常量依据,经独立复算验证):** - -| 流 | master_seed | scope | stream_seed | -|---|---|---|---| -| board_gen | 42 | 0 | 2339089373825164293 | -| board_gen | 42 | 1 | 4485977604321908752 | -| board_gen | 42 | 2 | 2024629813010603131 | -| board_gen | 42 | 3 | 8849696722413293638 | -| reward_roll | 42 | 0 | 7422916049646135537 | -| encounter | 42 | 0 | 1061841193803499209 | - -- Example:同流同 scope 重复调用 `derive_at` 恒等(纯函数);同帧对同一流连续 `open_stream` 两次 → 计数器各 +1,得两个互异且顺序确定的种子。 - -### R3 调试覆盖链(debug_override,仅 debug 构建) - -**结论**:`effective = override[key] if _has_override(key) else table_value`——仅 debug 构建加载 override 源;v1 仅支持单行全局表字段;类型/范围不符 → warning + 忽略;release 结构性不存在;永不回写 .tres。 - -#### 边界五条 - -| # | 边界 | -|---|---| -| ① | 覆盖判定与存储内聚于 ConfigDB(Rule 2 单点),gameplay 不可见 override 来源 | -| ② | key = schema 字段点路径(与 Rule 2 属性路径同构,例 `action_economy.ap_per_round`);未知 key → debug warning + 忽略该条;v1 仅支持单行全局表字段——进度键表的行寻址语法(如 `difficulty.(2,0).hp`)登记为后续扩展,当前 override 对进度表无 key 空间 | -| ③ | override 值类型与范围必须与 schema 字段一致,不一致 → debug warning + 忽略该条(复用 schema 校验逻辑,防止 debug 会话注入越界值污染平衡基线) | -| ④ | release 构建不加载、不注册任何 override 源(恒等是结构保证而非"碰巧不生效");debug 谓词实现为可注入形式(`OS.is_debug_build()` 之外引入 feature 标签闸,例 `sim_release`)——AC-8 的模拟以此为基础 | -| ⑤ | override 仅为运行时状态,永不回写 .tres | - -### R4 显式排除 - -**结论**:玩法平衡公式(伤害、掉落权重、成长曲线)不在 D2——归 owner 系统 GDD(B1/B4/C3 等);本 GDD 不含任何平衡数值公式,只负责取数与解析。玩法随机同理:任何系统若需玩法随机(如结算浮动),自带方案走 Rule 5 增流通道并通过 P1 评审,D2 不预置。 - -## 状态 - -| 状态 | 进入条件 | 行为/出口 | -|---|---|---| -| Unloaded | 进程启动前 | 磁盘 .tres 未加载 | -| Loading | `ConfigDB._ready()` 或 `load_tables()` | 按表清单逐一 `load()`;文件缺失即入 Failed | -| Validating | 单个资源加载成功 | 调 schema 的 `validate()`,错误入收集器 | -| Ready | 全部通过 | 类型化属性可读 | -| Failed(启动路径) | 启动加载任一致命错误 | 全构建致命中止并输出错误清单(Rule 6) | -| Failed(reload 路径) | 热重载校验失败 | 保留旧表停留 Ready + debug 错误清单(不杀运行中的调试会话) | -| Reloading(仅 debug) | 编辑器热重载 / 调试键 | 战斗中拒绝(返回 false,战斗结束后手动再触发);否则重走 Loading → Ready | - -不变式:RNG 与 ConfigDB 状态线相互独立——Reloading / Failed(任一路径)不触碰 RngService,计数器与 master_seed 不变(派生只依赖盐/master_seed/scope,与表数据无关;若按状态机对称性在 reload 时重置 RNG 将击穿 AC-4)。 - -- RNG 生命周期:进程启动 → 流待命(未播种时取数即致命)→ 冒险开始设定 master_seed → 每次具名 scope 事件派生种子 → 冒险结束保留供复盘。 -- 快照 = master_seed + 各流 scope 计数器(仅记录计数器、缺 master_seed 不足以恢复序列——进程重启会从种子序列起点重放;见 D3 接口)。 -- 快照切出须发生在无在飞 `open_stream` 实例时(scope 事件边界之外):门面实例作用域限定于单次 scope 事件、消费者不得跨事件持有——在飞实例的内部取数进度不入快照,违反则续玩/复盘与实况分叉(AC-15 失效),该前提由 D3 消费侧遵守。 - -## 边界情况 - -| # | 条件 | 行为 | 依据 | -|---|---|---|---| -| EC1 | 表文件缺失或 load() 失败 | 致命中止,错误清单含路径;无软回退 | Rule 6 | -| EC2 | 字段越界 / NaN / 类型不符 | `validate()` 收集后致命 | Rule 6 | -| EC3 | 表为空或某 level 行集为空 | 校验阶段致命(R1 前置条件),不会进入运行期 | Rule 6 | -| EC4 | 请求 (level_index, node_depth) 无精确行 | 按 R1 floor 解析 + warning(按四元组去重)——预期行为,不是错误 | R1 | -| EC5 | level_index 超过表最大 level | 命中最大 level 行(floor 规则的自然结果,无独立 clamp 分支) | R1 | -| EC6 | master_seed 为负 | abs() 归一化 + warning,保证 ∈ [0, 2^63);恰为 INT64_MIN → 致命(abs 恒等回绕,与 0 静默别名——机理是输出掩码抹掉 bit 63) | R2 | -| EC7 | 未设 master_seed 就取随机数 | `push_error` 后显式中止(GDScript 的 push_error 本身不终止进程——游戏内走致命错误路径,冒烟脚本 `quit(1)`),取到的值不可用——C2 未接线的显式暴露,禁止 seed=0 软回退 | Rule 6 | -| EC8 | 战斗进行中请求热重载 | 拒绝并返回 false;战斗结束后手动再触发(不自动重放) | 状态表 | -| EC9 | 存档携带的 SCHEMA_VERSION 高于当前 | 拒绝读取(比较逻辑归 D3,常量归 D2) | Rule 8 | -| EC10 | 奖励权重表权重和 ≤ 0 | validate 致命(B4 回填后必须 > 0) | Rule 6 | -| EC11 | debug override 类型或范围与 schema 字段不符 | warning + 忽略该条(仅 debug;release 无 override 源) | R3 | -| EC12 | 同一流名被重复注册或请求未知名流 | debug 断言中止(流名封闭) | Rule 5 | -| EC13 | 两个系统同帧请求同一流 | 允许——`open_stream` 各自取号(计数器各 +1)按调用顺序串行生效;单线程假设成立(Godot 主线程玩法逻辑),不引入锁 | Rule 5 | -| EC14 | 请求越域(level_index < 1 或 node_depth < 0) | Rule 6 致命(R1 前置守卫) | R1 | -| EC15 | 某 level 行集缺 depth-0 锚行 | validate 致命(防"入口天灾":入口请求静默 floor 到深行造成难度突刺);写死开、无运行期开关,C3 如需重议走本 GDD 显式修订流程(非 knob) | Rule 6 | -| EC16 | 热重载校验失败 | 保留旧表停留 Ready + debug 错误清单 | 状态表 reload 路径 | - -## 依赖 - -**上游(hard)**:无——Foundation 层,D2 不依赖任何系统(依赖层 1:无)。 - -| 系统 | 方向 / 性质 | 接口契约 | -|---|---|---| -| 全部其他 19 系统 | 它们 → D2(hard,Rule 1) | ConfigDB 类型化读取;禁止其他取数路径(A2 经 A3 表间接承载参数) | -| A1 | 消费 | BoardGenTable 回填(首个进度键表)+ VariationTable schema(biome/tag 字段)+ `board_gen` 流(换图时取号) | -| A3 | 消费 | ActionEconomyTable schema 回填 | -| A4 | 消费 | VariationTable 回填 | -| B2 | 消费 | EnemyTable 回填(十字段 + 三敌种行 + 每行集恰一敌种校验)+ HeroTable 新增(接口漂移回写) | -| B3 | 消费 | StatusEffectTable 回填 | -| B4 | 消费 | RewardTable 回填(九字段 + 跨字段校验族 + 默认根行集,use_timing 承重 MVP 单值)+ RewardConfigTable 新增(单行全局)+ `reward_roll` 流(scope = 每次 board install 批——格奖励批 + 清图奖励批,B4 Rule 2 接口漂移) | -| B1 | 消费 | SettlementTable 回填(可回放步骤流的数据前提)+ debug 热重载门标志 `set_reload_gate()`(战斗开始置位 / 结束复位,仅 debug 构建)+ `encounter` 流(战斗实例化期取号恰一 scope——unit_count 区间骰,C3 遭遇随机化批增流) | -| C2 / C3 | 消费 | `RngService.set_master_seed()` + DifficultyTable 行解析 + 曲线导出工具交付物 | -| D3 | 消费 | `SCHEMA_VERSION` + 存档内 master_seed + 各流 scope 计数器快照(续玩/复盘;含只读计数器接口,快照须在无在飞实例时切出) | -| A5 / C4 | 消费(垂直切片 / Alpha) | AuxItemTable 回填(A5 定稿登记——原 HelperItemTable 占位更名转正;counter_item_ids 表值回填与悬空校验激活随 D2×② 对侧批)/ MetaTable 回填 | -| D1 / D4 / D5 / D6 | soft | 如需参数表再增 schema(现无占位);display_name 本地化归 D6 | -| D2 外发 | → | 不订阅任何玩法事件;仅 debug 构建发 `config_reloaded`(D1 调试用) | - -- 数据读取类事实依赖不逐条列边(完整清单以本表为准);A2 无直接依赖(只外发事件,参数经 A3 表承载),与 systems-index 的 A2 回边规则一致。 -- 接口漂移修订规则:owner GDD 定稿时可修改占位 schema 类(schema 与表同仓),但必须回写本 GDD 核心规则表清单与 `design/registry/entities.yaml`,并在本文件版本历史登记修订;**回执登记粒度 = 受影响字段/枚举/流——逐表 diff schema 目录(枚举节目录 + 逐表字段行 + MVP 内容行 + 依赖表),禁按"对侧 GDD"粒度整批登记**;占位参考值定稿时必须删除本 GDD Tuning Knobs 清单中的对应条目(值的事实登记归 owner GDD 与 registry)。 -- 双向一致性(与 systems-index 依赖分层表核对一致):A1←A4,D2 · B2←D2 · B4←D2 · B1←A3,B2,B3,B4,D2 · C2←C3,D2 · C4←D3,C2,D2 · C3←D2,B2 · Foundation 含 D2;C2 / B1 / B4 / C4 ← D2 四条边已补入索引依赖分层表;B4←D2 边已按 B4 定稿收窄——A2 事实经 B1 转化零直接接口、B3 为验收锚关系非运行时边。 -- 已知待定:C3 是否消费 B1 输出——见索引门禁增补记录,C3 GDD 定稿,不影响 D2。 - -### 登记与对账义务(条件性夹具 / deferred / 溯源——审计资产) - -| 编号 | 内容 | 对侧 | 状态 | -|---|---|---|---| -| 1 | ActionEconomyTable 跨字段校验(任一动作成本 ≤ ap_per_round)条件性夹具登记 | A3 | 已登记(schema 类别承载,随 A3 冒烟) | -| 2 | VariationTable 跨字段校验 hide_numbers⇒safe_nonzero 夹具 variation_mask_constraint | A4 | 已激活 | -| 3 | StatusEffectTable effect_id 悬空引用校验(条件性夹具——首个含引用字段的 owner 回填时补) | B3 / B4 | 已激活(B4 defense_up 首引,夹具 b4_dangling_effect) | -| 4 | counter_item_ids 悬空引用(D2 首个引用型字段)——MVP 不校验,首个道具 id 回填时补校验 + 条件性夹具 | A5 | 条件性(未激活) | -| 5 | EnemyTable MVP 行值(goblin 18HP / 4ATK 等)溯源补登(原型 REPORT,出处待查) | B2 / C3 | 待补 | -| 6 | HeroTable max_hp MVP 值溯源补登(出处待查) | B2 / C3 | 待补 | -| 7 | 胜场成长机制去留(+25% HP / +1 ATK——反雪球问题) | C3 | 待裁决 | -| 8 | 曲线导出工具(headless 导出 resolve 矩阵供 diff)——R1 审计的离线载体 | C3 | C3 期交付物(排期倒挂注意见开放问题 #5) | -| 9 | Rule 5 对全项目玩法代码的随机扫描 | Technical Setup | 项目级 CI 项 | -| 10 | release 构建致命表现验证(引擎默认错误路径实际行为) | 首次 release 导出 | deferred(AC-18 checklist) | -| 11 | 战斗级可回放集成测试(同 master_seed 同动作序列 → 步骤流逐行相同) | B1 | deferred(AC-15) | -| 12 | 双向一致性四条边补入索引依赖分层表(C2 / B1 / B4 / C4 ← D2) | systems-index | 已完成 | - -## 呈现与 UI 面 - -| 项 | 要点 | -|---|---| -| 玩家 UI | 无——MVP 无面向玩家的 UI;debug override 与夹具注入均经 Godot 编辑器 / 命令行参数设置(`--data-root=`,仅 debug),不做自定义面板 | -| 校验失败呈现 | editor / CI 输出控制台(错误清单格式见 AC-1);release 构建走引擎默认错误路径(实际表现验证 deferred→首次导出 checklist) | -| 开发侧可视化 | Godot 编辑器 Resource inspector(自带)+ 校验错误控制台输出 | -| 音频 | 无需求(纯数据层,无直接表现面) | - -## Tuning Knobs - -### D2 自身 knobs(元参数) - -| Knob | 默认 | 调过高 | 调过低 | -|---|---|---|---| -| floor 解析策略 | floor + warning(无外推) | —— | 引入外推/静默会掩盖 C3 难度断档 | -| rng_stream_names | 封闭 3 流(board_gen / reward_roll / encounter) | 增流需改代码 + P1 评审(有意设卡) | 流复用破坏可复现隔离 | -| debug_override_enabled | false(仅 debug 构建) | 污染测试基线 | —— | -| 表路径清单 | data/tables/ 固定(debug 注入根除外) | —— | 散装路径破坏单点访问 | -| depth-0 锚行校验 | 写死开(非 knob,Rule 6) | —— | ——(重议须走本 GDD 显式修订,EC15) | - -- Knob 交互:floor 策略与 C3 的难度语义共享,改动需 C3 GDD 知情;校验严格度不设 knob(fatal 写死——放行带病数值会使 CI 冒烟失去意义)。 -- 未决占位与溯源义务(provisional——owner 定稿前不视为平衡事实;定稿后删除对应条目,值的事实登记归 owner GDD 与 registry):EnemyTable 行值溯源(义务 #5)· HeroTable max_hp 溯源(义务 #6)· 胜场成长机制去留(义务 #7)——见登记与对账义务表;已定稿占位参考值(标中旗 / 清图奖励 / 状态四行 / 奖励池等)已随各 owner 定稿清退出本清单。 - -### 九张表 schema 逐表字段行(D2 核心资产——字段全集以各 owner GDD Schema 节与 registry 为准) - -#### ActionEconomyTable(单行全局 · A3 回填 ✓) - -| 字段 | knob | 说明 | -|---|---|---| -| ap_per_round | ✓ | 每轮行动点 | -| dig_ap_cost | ✓ | 挖掘成本 | -| flag_place_ap_cost | ✓ | 插旗成本 | -| flag_pull_ap_cost | ✓ | 拔旗成本 | -| rap_refresh_cost | ✓ | RAP 刷新门槛 | -| move_ap_cost | ✗ 冻结 | 移动成本 | -| chain_ap_cost | ✗ 冻结 | 连锁展开成本 | -| 跨字段校验 | — | 任一动作成本 ≤ ap_per_round(违规加载期致命,条件性夹具登记) | - -#### VariationTable(按 variant_id · A4 回填 ✓) - -| 字段 | 类型 / 域 | knob | 说明 | -|---|---|---|---| -| variant_id | String 主键唯一 | — | 行键 | -| display_name | String | — | 本地化归 D6 | -| unlock_level | int [1,999] | ✓ | 进度语义承载列(Rule 4 豁免载体) | -| scope | region / global | — | global 预留 C3 | -| info_mask | none / hide_numbers | — | 雾行 = hide_numbers | -| cell_constraint | any / safe_nonzero | — | 雾行 = safe_nonzero | -| biome_tag | StringList | ✓ | ∅=通配 | -| counter_item_ids | StringList | ✗ | A5 预留;悬空引用政策见目录表 | -| 承重规则 | — | — | 生成期布置约束:雾区仅非 0 安全格(区内无雷无 0 格,A1 生成期强制)+ 零特判原则 | - -#### StatusEffectTable(按 effect_id · B3 回填 ✓) - -| 字段 | 类型 / 域 | 说明 | -|---|---|---| -| effect_id | String 主键唯一 | 行键;引用校验已激活 | -| display_name | String | 本地化归 D6 | -| target_side | hero / enemy | 作用侧 | -| magnitude | percent ∈ [-100,100] ∧ ≠0 / flat ≥ 1 | 跨字段校验 | -| unit | percent / flat | 量纲 | -| duration_settlements | [1,99] | 持续结算次数 | -| stack_policy | stack / refresh / independent | 叠层策略 | -| max_stack | [1,16] | 仅 stack 消费 | - -#### BoardGenTable((level_index, node_depth) 首个进度键表 · A1 回填 ✓) - -| 字段 | 类型 / 域 | knob | 说明 | -|---|---|---|---| -| board_width / board_height | int [8,64] | ✓ | 板尺寸 | -| mine_density | float (0,0.5] | ✓ | 密度浮点(尺寸解耦);布雷数下限 round(d×(W×H−9)) ≥ 1 | -| inferability_target | float [0.85,1] | ✓ | P1 门槛承重参数 + 绝对锚 | -| solver_rules | single / single_subset | ✗ 冻结 single_subset | 推理定义域非调参 | -| min_safe_count | int [1,999] | ✓ | 退化板对冲 | -| max_gen_attempts | int [1,32] | ✓ | 生成-验证循环上限 | -| fog_region_count | int [0,32] | ✓ | 雾区数 | -| fog_target_ratio | float [0,1) | ✓ | ≤ min(8d, 0.25) 绝对上限 | -| board_biome | StringSet 非空 | — | 域校验致命(词表 owner 未定稿前只校验非空) | -| elite_ / boss_ 前缀 | 命名空间预留 | ✗ | 第三轴登记约定——语义归 C1/C3,本 GDD 不定义 | -| 跨字段谓词 | — | — | fog_domain_ok(F2)+ min_safe_feasible(F2b)+ cost_feasible(F2c:attempts×W×H ≤ 16384 provisional,运行期禁墙钟逃生)——加载期致命 | - -#### EnemyTable((level_index, node_depth, enemy_id) · B2 回填 ✓) - -| 字段 | 类型 / 域 | knob | 说明 | -|---|---|---|---| -| enemy_id | String(行集内主键) | — | 行集内唯一(每行集恰一敌种) | -| display_name | String | — | 本地化归 D6 | -| unit_count | int [1,3] | ✓ | **遭遇区间下界**(C3 修订批——区间 [unit_count, unit_count_max] 经 B1 encounter 骰定本战实际数量;新敌种首遇节点固定不加骰) | -| unit_count_max | int [unit_count,3],可省略 | ✓ | 遭遇区间上界(缺省 = 定值,旧行零迁移——C3 修订批新增字段) | -| armor_type | enum {none, a, b},缺省 none | ✓ | 护甲类型(克制矩阵 = SettlementTable.armor_effectiveness;MVP 映射 goblin=none / bugbear=a / ogre_chief=b——护甲克制批) | -| hp | int [1,999] | ✓ | 难度修饰前基线 | -| atk | int [0,999] | ✓ | attack 行为伤害基值;0 = 纯伏击伤敌种合法 | -| heavy_multiplier | int [1,16] | ✓ | 无 heavy 拍敌种不消费(非校验项先例) | -| pattern | StringList,环长 [1,8] | — | MVP 校验域 {attack, charge, heavy}——guard/boost/hinder/summon 预留值校验拒绝 | -| advantage_per_round_cap | int [0,16] | ✓ | 默认 4 定稿(反灾难护栏);0 = 免疫伏击合法极端 | - -#### HeroTable(单行全局 · B2 回填 ✓ · 接口漂移新增) - -| 字段 | 类型 / 域 | knob | 说明 | -|---|---|---|---| -| max_hp | int [1,999] | ✓ | MVP 值 provisional(出处待查) | -| atk | int [1,999] | — | 0 = 加载拒绝(基础攻击恒存在,"0 基线 × 百分比增益恒零"死锁自 schema 层杜绝);MVP = 6 原型锚 provisional 归 C3;消费面 = 主角战斗段先手攻击 | - -#### RewardTable(按 reward_id · B4 回填 ✓) - -| 字段 | 类型 / 域 | knob | 说明 | -|---|---|---|---| -| reward_id | String 主键 | — | 行键(多行;pool_tag 分池不参与键) | -| category | buff / damage_item / heal_pack / instant_aoe / instant_heal | — | 两类交付轴:即时类 {buff, instant_aoe, instant_heal} 当场兑付不进库存 / 可选类 {damage_item, heal_pack} 入关卡域库存;预留值校验拒绝 | -| effect_id | String 可空 | — | buff 类必填(StatusEffectTable 精确引用);非 buff 恒空 | -| display_name | String 非空 | — | D1 呈现数据源,本地化归 D6(B2/B3 同库惯例) | -| power | int [0,999] | ✓ | item 类加载校验 ≥1;buff 类不消费非校验 | -| weight | int [0,999] | ✓ | 0 = 不入池 | -| pool_tag | safe_cell / active_inject / clear_default | — | clear_\ 命名空间预留拒绝;active_inject = 供给控制器注入池(可选类三行——install 期注入,非逐格 roll) | -| tier | int [1,8] | ✓ | A4 雾档约束载体 | -| use_timing | pre_settlement(MVP 单值) | — | 承重——道具使用窗口 MVP 激活,扩枚举走修订 | - -#### RewardConfigTable(单行全局 · B4 回填 ✓ · 接口漂移新增) - -| 字段 | 类型 / 域 | 默认 | 说明 | -|---|---|---|---| -| t_fog_min | int [1,8] | 2 | F2 雾档过滤门限 | -| k_dmg | int [0,999] | 0 | 0 = F5 断言关闭(现行默认——刀保底语义由供给控制器战斗首件保证取代;no_damage_row 后闸托底) | -| active_p0 | float [0,1] | 0.4 | 供给控制器注入概率初值(首件之后每张新板)——E[战斗获取] ≈ 1 标定目标,归 C3 | -| active_decay | float (0,1] | 0.5 | 注入概率指数递减 0.4→0.2→0.1→…(加难杠杆候选 0.6 随 C3 OQ7 扫描) | -| n_draft | int [1,999] | 32 | F5 草稿重 roll 上限 | -| p_min | int [1,999] | 8 | 默认根最低刀 power——K≥1 供给闸刀力下界(floor_supply_missing) | - -#### SettlementTable(单行全局 · B1 回填 ✓ · 共十二字段) - -| 字段 | 类型 / 域 | 默认 | knob | 说明 | -|---|---|---|---|---| -| equivalence_ref_damage(D_ref) | int [1,999] | 12 | ✓ | 当量参考敞口;变更触发 B1 全对照表 + 条款③⑤对账重跑(禁独立调参) | -| p_perfect | percent {100,200} | 200 | ✓ | 完美排雷清图奖励第二份兑付触发——非整数倍数乘数无运行时载体,域外加载致命 | -| segment_order | StringList | 拍板段序 | ✗ 结构冻结 | 恒等拍板段序校验,违例致命(防实现乱序静默漂移) | -| source_label_map | Dictionary source_class→文案键 | 封闭枚举全覆盖 | ✗ 结构冻结 | P2 归因呈现映射;键集 = B3 source_class ∪ {道具/判定扩展, enemy_action, flag_miss, hero_attack};新增键 = 接口漂移 | -| effect_pool_map | Dictionary effect_id→{hero_offense, hero_defense, enemy_output, flat_attach} | 四键定稿映射 | ✗ 结构冻结 | 效果语义映射;键 ⊆ StatusEffectTable 活行集,悬空加载期致命;新 effect_id 上线须随批登记 | -| pool_clamp_lo | int pp | −100 | ✗ 结构冻结 | percent 池地板域下界(乘数域随之 [0,2]) | -| pool_clamp_hi | int pp | +100 | ✗ 结构冻结 | percent 池地板域上界 | -| round_direction | enum {floor} | floor | ✗ 结构冻结 | 单一取整规则 | -| damage_a_per_cell | int ≥ 0 | 1 | ✓ | 伤害A 开格充能/格(护甲克制批——充能与结算归 B1 战斗段〔F6〕,C3 投值) | -| damage_a_cap | int ≥ 0 | 8 | ✓ | 伤害A 单轮充能封顶(0 = 不封顶——防连锁轮失控) | -| damage_b_per_flag | int ≥ 0 | 2 | ✓ | 伤害B 标雷充能/首次标中雷(每雷实例一次去重) | -| armor_effectiveness | Dictionary {base, dmg_a, dmg_b} × {none, a, b} | 特化 ×150 / 无甲 ×100 / 对位 ×50 | 键集 ✗ 结构冻结 / 数值 ✓ | 伤害类型 × 护甲克制矩阵——主角攻击三分量(基础/伤害A/伤害B)各自查表后 floor 相加;敌种甲型映射归 EnemyTable.armor_type | - -## 验收标准 - -### 测试口径 - -| 口径 | 要点 | -|---|---| -| 测试载体 | `--headless --script` 冒烟框架(脚本 extends SceneTree 以获得 quit(code);该模式 autoload 须由脚本显式实例化——AC-1 前提声明;设计顺序 #1 时无主场景可依赖) | -| 覆盖 | 8/8 Core Rules;Rule 6 加载期校验错误类别全部有夹具(悬空引用为条件性夹具,已随 B4 首引激活);运行期致命(请求越域 EC14、未播种 EC7)由 AC-5b / AC-17 行为级覆盖;R1 / R2 全部边界 | -| 致命类断言协议 | 致命用例(AC-2b、AC-5b 游戏通道半、AC-6 后半、AC-11、AC-17)各为独立进程调用,冒烟 runner 清单逐条登记"调用 → 期望退出码";单进程内只做测试通道收集断言 | -| warning 断言 | 一律经诊断收集器(见校验双通道),每用例先 `reset_diagnostics()` | -| 人工与延迟 | AC-14 人工 · AC-15 deferred→B1 · AC-18 deferred→首次 release 导出 | - -### AC 清单(Given-When-Then,编号不变) - -| AC | Given | When | Then | 覆盖 | -|---|---|---|---|---| -| AC-1 | 干净检出 | `godot --headless --script tests/smoke_data.gd` | 核心规则 #3 表清单的全部表(以清单为准,不写死数量)加载且 data/tables/ 无清单外 .tres;脚本成功 `quit(0)`,任一失败 `quit(1)` 并输出错误清单(表路径 + 字段 + 错误类别) | Rule 3/6 | -| AC-2 | tests/fixtures/ 夹具集(越界字段 / 文件缺失 / 空表 / 某 level 无行 / 缺 depth-0 锚行 / 重复键 / 权重和 ≤0 各一;悬空引用为条件性夹具——已随 B4 首引激活) | 冒烟脚本经 `--data-root` 注入逐夹具运行 `load_tables(root, collect_only=true)`(测试通道,单进程逐个断言) | 每个夹具的错误清单含对应类别(EC1 / EC2 / EC3 / EC15 / EC10 及重复键类别) | Rule 6 / EC | -| AC-2b | 任一致命夹具经注入根加载 | 冒烟 runner 以独立 headless 进程执行游戏通道 `load_tables(root, collect_only=false)`(`--script` 协议,脚本显式实例化 autoload;不依赖主场景) | 进程非 0 退出且错误清单完整——验证"游戏内真的会死"而非仅"校验器能发现" | Rule 6 游戏通道 | -| AC-3 | R2 黄金向量表(6 常量) | 纯函数 `derive_at` 复算(board_gen master=42 scope 0–3、reward_roll master=42 scope=0、encounter master=42 scope=0);同流同 scope 重复调用 | 逐个等于向量表常量;重复调用恒等(纯函数无副作用) | R2 | -| AC-4 | master_seed=42 | `open_stream("board_gen")` 连续取号 ≥100 次(跨模拟"关卡切换");同期调用任意 `reload()` | 公开只读计数器单调不重置(各关同序号图种子互异);计数器不变(状态线独立) | R2 / Rule 5 / 状态表 | -| AC-5 | 真实 DifficultyTable schema 构造的表含行 (1,0)(1,4)(2,0)(2,6)(每用例先 `reset_diagnostics()`) | 依次 `resolve(3,3)` → `resolve(3,4)` → `resolve(1,4)` → `resolve(99,99)`;单行表 {(2,0)} 上 `resolve(1,5)` | (3,3):返回 (2,0) 行且诊断收集器 warning 恰一条(missing_type=both,含请求/结果/类型);(3,4):warning 不新增(四元组去重键相同);(1,4):精确命中且零 warning;(99,99):命中 (2,6) 且新增恰一条(去重键含 D*,与首条不同);单行表:命中 (2,0) 且 missing_type=base_ceil(由 R1 分类规则推导:level 分量向上解析恒记 base_ceil) | R1 | -| AC-5b | 真实 DifficultyTable schema 构造的合法表 | `resolve(0, 3)`(level_index < 1)与 `resolve(2, -1)`(node_depth < 0);同用例经游戏通道独立进程复跑 | 测试通道诊断清单各含"请求越域"致命类别一条且不进入解析(EC14 / R1 前置守卫);独立进程非 0 退出 | R1 / EC14 | -| AC-6 | master_seed=-7;master_seed=INT64_MIN;`derive_at` 传入负 scope | `set_master_seed()`;`set_master_seed()`;`derive_at` | 归一化为 7 + 诊断收集器 warning 一条,后续种子 ∈ [0, 2^63)(EC6);INT64_MIN 致命(非 warning;独立进程断言退出码非 0);负 scope debug 断言中止(负值经输出掩码与 scope+2^63 别名) | R2 / EC6 | -| AC-7 | debug 构建 override{"action_economy.ap_per_round"=12}(域内值——A3 schema 域 [1,32];越域 override 会被 R3③ 忽略,出域示例会使本 AC 假失败) | 经 ConfigDB 读取;override key 为未知路径、类型或范围与 schema 不符;`reload()` 后 | effective=12;诊断收集器 warning + 忽略该条;.tres 文件内容不变(R3 边界①③⑤) | R3 | -| AC-8 | 非 debug 谓词模拟(feature 标签) | `_has_override(key)` | 恒 false——本条仅证明门存在性;"release 不加载 override 源"的结构保证验证 deferred→首次 release 导出 checklist | R3④ | -| AC-9 | D2 文件集(data/schemas、ConfigDB、RngService、tests) | 静态扫描(模式覆盖 `load(`、`preload(`、`ResourceLoader.load`、`"res://data/" +` 动态拼接;`res://tests/fixtures/` 前缀豁免——不在 `res://data/` 扫描域) | 无 `randomize()` 调用、无 ConfigDB 之外的 data 表加载(Rule 2/5);Rule 5 对全项目玩法代码的扫描登记为项目级 CI 项(义务 #9) | Rule 2/5 | -| AC-10 | D2 文件集 | 静态扫描 + AC-1 headless 实跑 | 无 `extends Control/Node2D`、无 `.tscn` preload,且 AC-1 headless 实跑通过——两项合成判定 Rule 7(扫描是启发式,硬证据是 headless 实跑) | Rule 7 | -| AC-11 | RngService(debug 构建) | 请求未知名流或重复注册流名 | debug 断言中止(EC12;独立进程退出码非 0) | Rule 5 / EC12 | -| AC-12 | 同帧对同一流 | 连续两次 `open_stream` | 两个互异且顺序确定的种子(EC13) | Rule 5 / EC13 | -| AC-13 | 冒烟脚本运行 | 反射断言 | `SCHEMA_VERSION` 常量存在且 ConfigDB 可读;全部 schema 携带版本字段;进度类表(BoardGen/Enemy/Difficulty)暴露 (level_index, node_depth[, enemy_id]) 键字段;DifficultyTable schema 暴露 `elite_` / `boss_` 前缀预留字段("高版本拒读"路径 deferred→D3) | Rule 8 + Rule 4 键契约 + 第三维命名空间 | -| AC-14(人工) | 每次回填定稿 | 验收人复核 | Rule 1 数值字面量禁令成立:启发式扫描(warning 级,误报难免)+ 人工复核三要素——验收人 = owner GDD 回填定稿评审 + 里程碑 gate-check;时机 = 每次回填定稿;证据 = 评审记录 / gate-check 登记 | Rule 1 | -| AC-15(deferred→B1) | 同 master_seed 同动作序列 | B1 集成测试重放 | 结算步骤流逐行相同(D2 阶段无战斗载体) | Rule 5 可回放 | -| AC-16 | debug 构建且 B1 侧经 `set_reload_gate(true)` 置位(模拟战斗中);门未置位;reload 后新表校验失败 | `reload()` | 置位:返回 false、ConfigDB 值不变、不发 `config_reloaded`;未置位:返回 true 且新值经类型化属性可读且 `config_reloaded` 发出恰一次(仅 debug 构建);校验失败:旧表保留、状态停留 Ready(EC16) | 状态表 / EC16 / Rule 6 | -| AC-17 | 未设 master_seed | `open_stream` 或 `derive_at` | push_error + 冒烟通道断言中止路径(quit 非 0)(EC7) | Rule 6 / EC7 | -| AC-18(deferred→首次 release 导出) | release 模板构建 | 致命校验错误发生;查找 override 源 | 表现符合"引擎默认错误路径"预期;override 结构性不存在(R3 边界④、校验双通道 release 侧) | Rule 6 / R3④ | - -## 开放问题 - -| # | 问题 | owner | -|---|---|---| -| 1 | headless 测试载体终稿:MVP 用 `--headless --script` 冒烟(本 GDD 决策);gdUnit4 是否在 Technical Setup 引入并迁移冒烟用例 | Technical Setup 阶段(systems-index 门禁增补记录项) | -| 2 | 编辑器内表文件热重载自动化(当前仅 debug 键触发;低优先) | 未指派 | -| 3 | 数值表显示名的本地化 | D6 | -| 4 | C4 MetaTable 并入 ConfigDB 还是独立 autoload(倾向并入) | C4 GDD | -| 5 | 难度曲线导出工具(R1 审计的离线载体):headless 导出 resolve 矩阵脚本,C3 期交付——排期倒挂:BoardGenTable 可推理率曲线自 A1(第 5 位)起回填,A1 定稿前须有临时抽查载体(入 systems-index 门禁记录) | C3 GDD 登记排期 | - -## 版本历史 - -| 版本 | 日期 | 改动 | -|---|---|---| -| 跨评审 D2 漂移批 | 2026-09-14 | /review-all-gdds 🔴-2 五处补漂移修订批(X-8 遗漏项补登,registry 同批):**RNG 流封闭清单 2→3 流**(encounter——消费者 B1,scope = 每场战斗实例化恰一 scope;Core Rule 5 / 取数链路 / 盐值 0x8EBC6AF09C88C6E3 / 黄金向量 +1 常量〔AC-3 五→六〕/ set_master_seed 全流零计数前提)· **pool_tag 枚举增 active_inject** · **RewardConfigTable +2 字段**(active_p0=0.4 / active_decay=0.5)+ k_dmg 默认 1→0 且"C3 禁区默认值"条款解除 · **默认根行集 clear_knife→clear_blast**(注入池占比注记替代 75/25)· **HelperItemTable 更名 AuxItemTable**(A5 定稿转正,schema 目录九→十张)· X-8 补登:SettlementTable 逐表字段行补 4 字段(共十二字段)、EnemyTable MVP 行三敌种登记 · 接口漂移修订规则增"回执按受影响字段/枚举粒度逐表 diff schema 目录"流程纪律;核心规则表增依据列(lint R8 引用列迁移) | -| C3 修订批回写 | 2026-09-14 | /design-review C3 修订批(X-8 回执,registry 同批):**EnemyTable schema +2 字段**(unit_count_max——遭遇区间上界 / armor_type——护甲类型枚举 {none,a,b},克制矩阵挂 SettlementTable)· **SettlementTable +4 字段**(damage_a_per_cell=1 / damage_a_cap=8 / damage_b_per_flag=2 / armor_effectiveness 克制矩阵——护甲克制批转正,机制与结算归 B1、C3 投值)· DifficultyTable 表清单行补乘数域与 clamp 例外注记(registry 登记的组合事故例外,非 fail-fast 场景)· 敌种键更名 goblin/bugbear/ogre_chief(DND 批对齐) | -| v1.0-lean | 2026-09-13 | 格式迁移:legacy 原稿按 lean 样例重排——修订注记出正文收敛至本表;核心规则 / 枚举 / 边界 / AC 转表格;加载校验与热重载链路转字符画;九张表 schema 逐表字段行入 Tuning Knobs;义务与夹具登记收敛为登记与对账义务表。正文残留旧称按 registry 与各 owner 成稿写现行值:SettlementTable 八字段口径(pool_clamp 拆 lo/hi)、p_perfect 载体域 {100,200}、source_label_map 键集含 hero_attack、RewardTable category 五值与默认根八行集——语义零变更 | -| 两级奖励批 + 基础攻击裁决 | 2026-09-11 | RewardTable category 三值扩为五值(即时 / 可选两类交付轴)+ 默认根行集重登记八行(原五行为集退役);RewardConfigTable p_min 默认 4→8;HeroTable atk 改域 [1,999] 且 0 = 加载拒绝(基础攻击恒存在),消费面 = 主角战斗段先手攻击 | -| B1 回填 + 评审批收编 | 2026-09-10 | SettlementTable 定稿回填(registry 原记七字段);同日评审批统一八字段口径——pool_clamp_lo_hi 拆 lo/hi 两字段、p_perfect 域 [100,999] 改载体域 {100,200}、source_label_map 键集补 enemy_action / flag_miss(hero_attack 随 B1 成稿) | -| B4 full 评审 delta | 2026-09-09 | RewardTable 增 display_name(九字段)+ 默认根行集登记 + RewardConfigTable 新增(单行全局四字段,接口漂移——B4 标量 knob 的 Rule 1 载体)+ Core Rule 5 reward_roll 语义正文补同步(每次 board install 批) | -| B4 回填定稿 | 2026-09-09 | RewardTable 八字段 + 跨字段校验族 + use_timing 占位转承重 + 首个 effect_id 引用回填激活 StatusEffectTable 悬空校验 + reward_roll scope 语义改写 + Tuning Knobs 奖励池占位条目清退 | -| B2 回填定稿 | 2026-09-09 | EnemyTable 八字段 + 双敌种行 + 每行集恰一敌种校验;HeroTable 新增(接口漂移回写) | -| A1 full 评审 delta | 2026-09-09 | BoardGenTable inferability_target 收窄 [0.85,1](P1 绝对锚)+ fog_target_ratio 绝对上限 min(8d, 0.25) + 布雷数下限 round(d×(W×H−9)) ≥ 1 + F2c 成本谓词(运行期禁墙钟逃生)+ elite_/boss_ 命名空间预留(第三轴登记约定,Boss=Dmax 行 + A1 OQ6 重审门) | -| A1 回填定稿 | 2026-09-09 | BoardGenTable 九字段 + F2/F2b 跨字段谓词 + solver_rules 冻结 + MVP 参考行(provisional,C3 调参所有权)——首个进度键表 | -| B3 回填定稿 | 2026-09-08 | StatusEffectTable schema 八字段 + 四行 MVP 内容(键 = effect_id,Rule 4 豁免注明;effect_id 悬空校验待首引激活) | -| A4 re-review delta | 2026-09-08 | VariationTable 增跨字段校验 hide_numbers⇒safe_nonzero(加载期致命,夹具 variation_mask_constraint)+ counter_item_ids knob 误标修正(非 knob) | -| A4 回填定稿 | 2026-09-08 | VariationTable 八字段 + fog 行 + Rule 4 豁免注明(registry 新条目 variation_table / variant_pool_gate) | -| A3 三轮评审 delta | 2026-09-07 | ActionEconomyTable 增跨字段 validate 规则(任一动作成本 ≤ ap_per_round,schema 类承载、违规致命、条件性夹具登记) | -| A3 RAP 结构修订 | 2026-09-07 | flags_per_round / flag_unit_cost / stop_multiplier / clear_multiplier 四字段删除(旗无上限、停手 / 清图折算乘数退役)、rap_refresh_cost 新增;AC-7 示例值域内修正(99 出域会使本 AC 假失败) | -| A3 回填定稿 | 2026-09-07 | ActionEconomyTable 字段清单交付 + 成本三字段入表 + 冻结字段(ap_per_round=8 等定稿值登记 registry) | -| 收口 | 2026-09-07 | 两轮评审 + delta 复核 5/5 PASS 后 Approved;CD-GDD-ALIGN 终裁 NEEDS REVISION → 修订落实 → 独立 delta 核对通过 | -| 原型占位值清退 | 2026-09-07 起随各 owner 定稿 | 标中旗 +5 / 面旗(量纲与语义经 A3 OQ5 重锚 → weaken 行)、清图 +10(→ B4 清图奖励插槽)、增伤 1.5× / 减伤 0.5× / 持续 2 次结算(→ StatusEffectTable 四行)、奖励池 5 类(→ RewardTable 五值)——机制与数值事实登记归 owner GDD 与 registry | diff --git a/design/gdd/systems/冒险循环/元进度.md b/design/gdd/systems/冒险循环/元进度.md new file mode 100644 index 00000000..e83effeb --- /dev/null +++ b/design/gdd/systems/冒险循环/元进度.md @@ -0,0 +1,3 @@ +# 元进度 + +> 旧版参考:../../../archive/gdd-2026-09-14/systems-index.md(旧体系未单独成文,旧编号 C4) diff --git a/design/gdd/systems/冒险循环/关卡节点地图.md b/design/gdd/systems/冒险循环/关卡节点地图.md new file mode 100644 index 00000000..e252f991 --- /dev/null +++ b/design/gdd/systems/冒险循环/关卡节点地图.md @@ -0,0 +1,3 @@ +# 关卡节点地图 + +> 旧版参考:../../../archive/gdd-2026-09-14/systems-index.md(旧体系未单独成文,旧编号 C1) diff --git a/design/gdd/systems/冒险循环/冒险结构.md b/design/gdd/systems/冒险循环/冒险结构.md new file mode 100644 index 00000000..747423e9 --- /dev/null +++ b/design/gdd/systems/冒险循环/冒险结构.md @@ -0,0 +1,3 @@ +# 冒险结构 + +> 旧版参考:../../../archive/gdd-2026-09-14/c2-adventure-structure.md diff --git a/design/gdd/systems/冒险循环/难度曲线与Boss.md b/design/gdd/systems/冒险循环/难度曲线与Boss.md new file mode 100644 index 00000000..adbdfb0a --- /dev/null +++ b/design/gdd/systems/冒险循环/难度曲线与Boss.md @@ -0,0 +1,3 @@ +# 难度曲线与Boss + +> 旧版参考:../../../archive/gdd-2026-09-14/c3-difficulty-curve.md diff --git a/design/gdd/systems/战斗循环/增益状态.md b/design/gdd/systems/战斗循环/增益状态.md new file mode 100644 index 00000000..1153c43b --- /dev/null +++ b/design/gdd/systems/战斗循环/增益状态.md @@ -0,0 +1,3 @@ +# 增益状态 + +> 旧版参考:../../../archive/gdd-2026-09-14/b3-status-effect.md diff --git a/design/gdd/systems/战斗循环/奖励道具经济.md b/design/gdd/systems/战斗循环/奖励道具经济.md new file mode 100644 index 00000000..7f451d32 --- /dev/null +++ b/design/gdd/systems/战斗循环/奖励道具经济.md @@ -0,0 +1,3 @@ +# 奖励道具经济 + +> 旧版参考:../../../archive/gdd-2026-09-14/b4-reward-item-economy.md diff --git a/design/gdd/systems/战斗循环/战斗结算.md b/design/gdd/systems/战斗循环/战斗结算.md new file mode 100644 index 00000000..75aacd5e --- /dev/null +++ b/design/gdd/systems/战斗循环/战斗结算.md @@ -0,0 +1,3 @@ +# 战斗结算 + +> 旧版参考:../../../archive/gdd-2026-09-14/b1-settlement.md diff --git a/design/gdd/systems/战斗循环/战斗表现.md b/design/gdd/systems/战斗循环/战斗表现.md new file mode 100644 index 00000000..04d02905 --- /dev/null +++ b/design/gdd/systems/战斗循环/战斗表现.md @@ -0,0 +1,3 @@ +# 战斗表现 + +> 旧版参考:../../../archive/gdd-2026-09-14/systems-index.md(旧体系未单独成文,旧编号 B5) diff --git a/design/gdd/systems/战斗循环/敌人系统.md b/design/gdd/systems/战斗循环/敌人系统.md new file mode 100644 index 00000000..bffbd640 --- /dev/null +++ b/design/gdd/systems/战斗循环/敌人系统.md @@ -0,0 +1,3 @@ +# 敌人系统 + +> 旧版参考:../../../archive/gdd-2026-09-14/b2-enemy-system.md diff --git a/design/gdd/systems/排雷循环/地形变异.md b/design/gdd/systems/排雷循环/地形变异.md new file mode 100644 index 00000000..c1fad4d4 --- /dev/null +++ b/design/gdd/systems/排雷循环/地形变异.md @@ -0,0 +1,3 @@ +# 地形变异 + +> 旧版参考:../../../archive/gdd-2026-09-14/a4-terrain-variation.md diff --git a/design/gdd/systems/排雷循环/排雷玩法.md b/design/gdd/systems/排雷循环/排雷玩法.md new file mode 100644 index 00000000..f99d96da --- /dev/null +++ b/design/gdd/systems/排雷循环/排雷玩法.md @@ -0,0 +1,3 @@ +# 排雷玩法 + +> 旧版参考:../../../archive/gdd-2026-09-14/a2-minesweeper-rules.md diff --git a/design/gdd/systems/排雷循环/棋盘生成.md b/design/gdd/systems/排雷循环/棋盘生成.md new file mode 100644 index 00000000..42dfb62f --- /dev/null +++ b/design/gdd/systems/排雷循环/棋盘生成.md @@ -0,0 +1,3 @@ +# 棋盘生成 + +> 旧版参考:../../../archive/gdd-2026-09-14/a1-board-generation.md diff --git a/design/gdd/systems/排雷循环/行动经济.md b/design/gdd/systems/排雷循环/行动经济.md new file mode 100644 index 00000000..bd8ebde0 --- /dev/null +++ b/design/gdd/systems/排雷循环/行动经济.md @@ -0,0 +1,3 @@ +# 行动经济 + +> 旧版参考:../../../archive/gdd-2026-09-14/a3-action-economy.md diff --git a/design/gdd/systems/排雷循环/辅助道具.md b/design/gdd/systems/排雷循环/辅助道具.md new file mode 100644 index 00000000..65163367 --- /dev/null +++ b/design/gdd/systems/排雷循环/辅助道具.md @@ -0,0 +1,3 @@ +# 辅助道具 + +> 旧版参考:../../../archive/gdd-2026-09-14/a5-minesweeper-aux-items.md diff --git a/design/gdd/systems/表现与支撑/HUD框架.md b/design/gdd/systems/表现与支撑/HUD框架.md new file mode 100644 index 00000000..37c9b859 --- /dev/null +++ b/design/gdd/systems/表现与支撑/HUD框架.md @@ -0,0 +1,3 @@ +# HUD框架 + +> 旧版参考:../../../archive/gdd-2026-09-14/d1-hud-framework.md diff --git a/design/gdd/systems/表现与支撑/存档序列化.md b/design/gdd/systems/表现与支撑/存档序列化.md new file mode 100644 index 00000000..d2cc9d5f --- /dev/null +++ b/design/gdd/systems/表现与支撑/存档序列化.md @@ -0,0 +1,3 @@ +# 存档序列化 + +> 旧版参考:../../../archive/gdd-2026-09-14/systems-index.md(旧体系未单独成文,旧编号 D3) diff --git a/design/gdd/systems/表现与支撑/教学引导.md b/design/gdd/systems/表现与支撑/教学引导.md new file mode 100644 index 00000000..4f3b1400 --- /dev/null +++ b/design/gdd/systems/表现与支撑/教学引导.md @@ -0,0 +1,3 @@ +# 教学引导 + +> 旧版参考:../../../archive/gdd-2026-09-14/systems-index.md(旧体系未单独成文,旧编号 D5) diff --git a/design/gdd/systems/表现与支撑/数据配置.md b/design/gdd/systems/表现与支撑/数据配置.md new file mode 100644 index 00000000..cfb6e9fd --- /dev/null +++ b/design/gdd/systems/表现与支撑/数据配置.md @@ -0,0 +1,3 @@ +# 数据配置 + +> 旧版参考:../../../archive/gdd-2026-09-14/d2-data-config.md diff --git a/design/gdd/systems/表现与支撑/设置与本地化.md b/design/gdd/systems/表现与支撑/设置与本地化.md new file mode 100644 index 00000000..ca13cc52 --- /dev/null +++ b/design/gdd/systems/表现与支撑/设置与本地化.md @@ -0,0 +1,3 @@ +# 设置与本地化 + +> 旧版参考:../../../archive/gdd-2026-09-14/systems-index.md(旧体系未单独成文,旧编号 D6) diff --git a/design/gdd/systems/表现与支撑/音频.md b/design/gdd/systems/表现与支撑/音频.md new file mode 100644 index 00000000..ca1af357 --- /dev/null +++ b/design/gdd/systems/表现与支撑/音频.md @@ -0,0 +1,3 @@ +# 音频 + +> 旧版参考:../../../archive/gdd-2026-09-14/systems-index.md(旧体系未单独成文,旧编号 D4) diff --git a/production/session-state/active.md b/production/session-state/active.md index 1cac0839..a045bc38 100644 --- a/production/session-state/active.md +++ b/production/session-state/active.md @@ -124,3 +124,5 @@ D2 数据配置 → A3 行动经济 → A4 地形变异 → B3 增益状态 → 44. **完美策略档测量批(2026-09-14,用户拍板"增加完美策略档测试验证"——OQ7 技能轴上界仪,零玩法数值变更)**:auto_player 增 single+subset 完美求解器(零盲挖/全标旗/卡死刷新,只读 A2 查询面、去 safe_set oracle)+ level_autoplay `policy` 参数 + level_monte_carlo 策略轴(CLI 第 3 参)与踩雷/刷新观测列(零踩雷断言 quit(1));core 零改动,冒烟 **149/149**。**读数(N=30,种子 4200–4229)**:0 加成完美档通关 **100%**、剩 HP 均 **47.4/50**、踩雷 0.00(弱策略基线 60%);+50%~+200% 恒 100% 满血——F5 带与 S/K 区间对技能轴零分辨力,calibration_gap 获机制解释与定量上界。**待拍板**:完美档目标带口径 + 杠杆(r_boss 走廊/群战/decay 0.6 + 新候选"上限掺运气"系:供给量值随机化/承伤硬地板);详情 = 切片 README「2026-09-14 完美策略档测量批」。 45. **伤害量值区间批(2026-09-14,用户拍板②——验收口径改完美策略档 0 加成 ≤40%;两步全落地 + 无效性实测)**:第一步奖励侧五行 power 区间化(heal_minor[2,6]/knife_t1[5,11]/heal_pack[6,18]/knife_adv[10,22]/clear_blast[25,55]——身份批追加取号,E14 快照口径不变,B1/呈现零改动)+ 第二步敌方 atk 区间(六行 ±3,遭遇骰同流 spawn 期整战持久——每拍抖动否决〔数字可读性锚〕,B2 零随机保持,spawn +1 参数接口漂移登记);中点恒等现值 = A3 条款①锚不漂移;schema 双批校验(成对/中点锚/buff 禁止)+ smoke `_smoke_power_interval` 4 断言;冒烟 **154/154**。**实测(N=30)**:完美档 0 加成仍 **100%**(承伤 3.5→3.9——方差真实流动被 47/50 血缓冲全吞);基线档 17% 不变——**数值区间杠杆族对 ≤40% 线无效已坐实**(完美玩家结构性优势 = 零踩雷直伤 + weaken 顶格 + 快杀)。**待用户三选裁决(C3 OQ7 主项)**:①承伤硬地板(B1/B2)②weaken 饱和语义(B3/B1——拆全标旗基石)③极端宽度(建议否决——毁基线与可读性);区间机制保留(普通玩家方差体验有效)。registry reward_table/enemy 条目 + clause5 义务 + C3 行值总表/F5/OQ7 同批登记。 + +46. **GDD 体系重构(2026-09-14,用户拍板批)**:旧 GDD 体系整体封存为 `design/archive/gdd-2026-09-14/`(只读参考、不作事实引用,两个 legacy 子目录不保留);`design/gdd/` 原位重建循环式新骨架——6 份顶层文档 + `systems/` 四循环(排雷/战斗/冒险/表现与支撑)20 份子系统占位文档,根索引 = `02-系统清单.md`(文档增删必须同步)。雾格已从设计中移除,地形变异未来范围只覆盖非雾变异(待定)。