From b5b2c5555741b998288e2d75682600e058963db0 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Sat, 31 Oct 2026 07:25:42 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E8=BF=AD=E4=BB=A346=E5=AE=9A=E4=B9=89?= =?UTF-8?q?=E5=B7=B2=E5=85=A5=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../需求卡片-换图系双基座七件批-2026-10-31.md | 431 ++++++++++++++++++ 1 file changed, 431 insertions(+) create mode 100644 reports/需求卡片-换图系双基座七件批-2026-10-31.md diff --git a/reports/需求卡片-换图系双基座七件批-2026-10-31.md b/reports/需求卡片-换图系双基座七件批-2026-10-31.md new file mode 100644 index 00000000..656d2024 --- /dev/null +++ b/reports/需求卡片-换图系双基座七件批-2026-10-31.md @@ -0,0 +1,431 @@ +# 需求卡片:换图系双基座七件批 + +> 日期:2026-10-31 +> 性质:需求改动实现批卡片;零待裁点,开工门=U0。 +> 来源:待办清单「「封锁-蓄力」combo 设计素材」条。唯一事实源:[奇物](../design/gdd/systems/冒险循环/奇物.md) v1.3+[行动经济](../design/gdd/systems/排雷循环/行动经济.md) v1.3+[战斗结算](../design/gdd/systems/战斗循环/战斗结算.md) v1.4+[地图战斗资源](../design/gdd/systems/战斗循环/地图战斗资源.md) v1.3;参考设计过程件:[提案 v0.5](提案-弃图刷新系专长流派-2026-10-30.md)。 +> 估时:T0–T8 ≈ **7.75~8.5 个工作日**;切分预案见第十二节。 + +## 一、设计事实源 + +本卡实现下列已闭合设计,不重新裁断机制: + +| 来源 | 本卡采用的事实 | +|---|---| +| [奇物 v1.3](../design/gdd/systems/冒险循环/奇物.md) | 基座先行原则、七件名称与职责、双基座叠加 | +| [行动经济 v1.3](../design/gdd/systems/排雷循环/行动经济.md) | 付费挖格产 RAP、刷新成本减半、两件基座叠加 | +| [战斗结算 v1.4](../design/gdd/systems/战斗循环/战斗结算.md) | 成功刷新事实、当轮结算兑付、全局 `damage_taken` | +| [地图战斗资源 v1.3](../design/gdd/systems/战斗循环/地图战斗资源.md) | 现行清图奖励语义不变;旧探索进度回收方案已注销 | +| [提案 v0.5](提案-弃图刷新系专长流派-2026-10-30.md) | 七件最终结构与行为验收面;保留作实现参考,不替代 GDD | + +## 二、目标与完成定义 + +交付七件专长: + +| 层 | feat_id | 显示名 | 稀有度/cap | provisional 数值 | +|---|---|---|---|---| +| 基座 | `vein_reserve` | 矿脉储能 | excellent/1 | 每次受理的付费挖格 +1 RAP | +| 基座 | `easy_swap` | 省力周转 | excellent/1 | 刷新成本为基线 50% | +| 输出 | `wall_blast` | 崩壁冲击 | excellent/1 | 全体存活敌各受 2 点 | +| 输出 | `charge_rotation` | 蓄力周转 | excellent/1 | 每刷一次 +1 层,上限 3;下一次主角攻击消费全部层 | +| 生存 | `stone_mitigation` | 石层缓冲 | common/1 | 当轮有成功刷新时,每次主角受伤固定 −2 | +| 生存 | `tunnel_rest` | 坑道小憩 | common/1 | 每刷一次累计 1 点恢复,上限 3;本轮授予段合计回血 | +| 资源 | `mine_profit` | 矿道红利 | rare/1 | 每次成功刷新固定 +1 GP | + +完成定义: + +1. `feats.tres` 30→37 行;稀有度 普通14/优秀13/稀有10/传说0;牌库 132→139。 +2. 两件基座可叠加;刷新次数与 RAP 清零限制保持现行。 +3. 所有主角伤害路径统一经过 `damage_taken`,每种伤害单据恰发射一次。 +4. 刷新效果只在成功刷新后产生;RAP 不足、相位非法、每轮上限均零触发。 +5. 崩壁冲击沿用案 C,在战斗段末结账;石层缓冲、坑道小憩、矿道红利均在本轮既有通道兑付。 +6. 无七件专长时现行行为逐位不漂移;持有旧 `damage_taken` 专长时按全局受伤语义生效。 +7. 新测试套件与计数回归全部通过,旧断言只允许因语义扩展而改,不得放宽阈值。 + +## 三、现状事实 + +1. `dig_paid` 在 AP 扣费前发射,消费环已有 counter/grant AP 通道,无 RAP 通道:[action_economy.gd:101](../game/core/action_economy.gd#L101)。 +2. `grant_reserve_ap()` 已存在,直接增加 RAP:[action_economy.gd:177](../game/core/action_economy.gd#L177)。 +3. `request_refresh()` 固定读全局基线成本:[action_economy.gd:199](../game/core/action_economy.gd#L199)。 +4. 刷新成功序=扣 RAP→计数→旧资源退役→旧板退役→装新板:[battle_orchestrator.gd:610](../game/core/battle_orchestrator.gd#L610)。 +5. 当前事件词表20种,效果词表32种:[effect_engine.gd:12](../game/core/effect_engine.gd#L12)。 +6. `damage_taken` 现只在敌方攻击路径发射:[damage_controller.gd:472](../game/core/damage_controller.gd#L472)。 +7. 地形伤害在开单前单独发射并只消费 `damage_reduce/ac_bonus/counter_add`,不消费 shield:[grant_segment.gd:174](../game/core/settlement/grant_segment.gd#L174)。 +8. 棋盘主角直伤在控制器终段只做伤害下限后扣血,不发射事件:[damage_controller.gd:569](../game/core/damage_controller.gd#L569)。 +9. 危险格与错误封印的负向资源直伤最终进入同一 `board_flat_hero` 单据:[reward_grant.gd:320](../game/core/reward_grant.gd#L320)、[reward_grant.gd:369](../game/core/reward_grant.gd#L369)。 +10. 授予段伤害单已有案 C 暂存队列,战斗段末统一补提交:[grant_segment.gd:24](../game/core/settlement/grant_segment.gd#L24)、[combat_segment.gd:114](../game/core/settlement/combat_segment.gd#L114)。 +11. `grant_gp` 现消费点写 `reward_grant.escrow` 并发专长 GP 行:[grant_segment.gd:265](../game/core/settlement/grant_segment.gd#L265)。 +12. `attack_bonus` 已支持 `value_counter`:[damage_controller.gd:360](../game/core/damage_controller.gd#L360)。 +13. GP 袋正常格面行值为3,普通战斗掉落均值3:[reward.tres:184](../game/data/tables/reward.tres#L184)、[shop.tres:7](../game/data/tables/shop.tres#L7)。 +14. 现行专长表30行、牌库132;稀有度12/9/9/0:[adventure_feats_test.gd:465](../game/tests/unit/core/adventure_feats_test.gd#L465)。 +15. 刷新真实入口回归已覆盖 RAP、AP保留、上限与刷新图零清图:[round_flow_skill_pool_test.gd:145](../game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd#L145)。 +16. BattleOrchestrator 当前811行,类变量与文件长度均有 S13 登记值:[battle_orchestrator.gd:600](../game/core/battle_orchestrator.gd#L600)、[gdstyle_baseline.txt:9](../tools/gdstyle_baseline.txt#L9)。 +17. `BattleFacts` 成员冻结15/15,不得新增刷新队列:[battle_facts.gd:10](../game/core/battle_facts.gd#L10)。 +18. `RewardGrant` 类变量封闭15/15,不得新增 GP/回收队列:[reward_grant.gd:13](../game/core/reward_grant.gd#L13)。 + +## 四、设计契约 + +- 🔴 **C1 无专长基线零扰动**:挖格不产 RAP、刷新成本8、伤害事件旧结果、GP与清图路径均保持现行。 +- 🔴 **C2 成功刷新才登记**:RAP不足、非Active、每轮第3次均不产生 `board_refreshed`;成本折扣只改变门槛与扣费,不改变拒绝判据。 +- 🔴 **C3 全局受伤事件恰一次**:敌方攻击、危险格、错误封印资源格、地形伤害都经统一 `damage_taken`;同一伤害单据不得重复发射。 +- 🔴 **C4 减伤固定不堆**:石层缓冲只看当轮是否至少成功刷新一次;同一轮多刷不提高减伤,减后仍走现行全局伤害下限。 +- 🔴 **C5 不引入临时生命**:本批不新增HP护盾池、承伤库存或生命上限变化。 +- 🔴 **C6 五段时序不变**:崩壁冲击走现有延迟伤害队列;坑道小憩在授予段;GP走现有战斗内缓冲。 +- 🔴 **C7 矿道红利不绑清图奖励**:每次成功刷新固定1 GP;不读取旧图探索进度、不触发清图事件。 +- 🔴 **C8 数值单源**:RAP产量、50%折扣、群伤、恢复、减伤、GP均从 `feats.tres` 读取;代码零玩法数值字面量。 +- 🔴 **C9 词表封闭**:只新增 `refresh_request`、`board_refreshed` 两事件与 `grant_reserve_ap`、`apply_discount` 两效果。 +- 🔴 **C10 结构预算**:BattleOrchestrator文件长度与类变量只降不升;新增流程件独立承载刷新生命周期。 +- 🔴 **C11 反自动刷新**:仍只允许玩家入口发起,RAP满不自动刷新。 +- 🔴 **C12 信息红线**:不揭示格、不改数字、不改棋盘生成分布。 +- 🔴 **C13 拆分边界**:`BattleRefreshFlow` 只负责刷新可用性、扣费、换图与成功事实登记;七件效果的算法留在效果引擎、授予段与伤害控制器。 +- 🔴 **C14 禁凑计数袋**:不把所有分支堆进一个无名 helper;中央受伤消费件只处理 `damage_taken` 命中组合。 + +## 五、行为结构 + +```mermaid +flowchart LR + A[付费挖格受理] -->|矿脉储能| B[RAP增加] + C[玩家请求刷新] -->|省力周转| D[折后成本] + D -->|成功| E[board_refreshed] + E --> F[崩壁冲击:延迟群伤单] + E --> G[蓄力周转:当轮攻击层数] + E --> H[石层缓冲:当轮全局减伤] + E --> I[坑道小憩:当轮累计恢复] + E --> J[矿道红利:1 GP] + K[敌方攻击/危险格/错误封印/地形] --> L[damage_taken 恰一次] + H --> L +``` + +## 六、范围边界 + +做: + +1. 扩两事件、两效果;统一全局 `damage_taken` 发射与消费。 +2. 实现两件基座、三件输出/两件生存/一件资源的数据行与消费点。 +3. 拆 `BattleRefreshFlow`,保持编排器入口与唯一通道。 +4. 新增七件专项测试,同步词表、专长池与刷新回归。 +5. 能力清单入表。 + +不做: + +1. 不做探索进度回收、清图奖励折算或旧图快照。 +2. 不做临时生命值或独立护盾池。 +3. 不新增 UI、素材、渲染基线、MC档位。 +4. 不重构自爆流、不改 `增益状态`、不新增数据表。 +5. 不抬高刷新成本,不做全板开,不返 RAP。 + +## 七、关联文档同步面 + +| 文档 | 关联点 | 同步义务 | +|---|---|---| +| [奇物](../design/gdd/systems/冒险循环/奇物.md) | 七件由设计声明改为实装;行数、稀有度与验收口径 | 实现批禁写;落 `reports/iter-反哺点-<日期>.md`,用户裁决后文档批执行 | +| [行动经济](../design/gdd/systems/排雷循环/行动经济.md) | 两件基座由待实现改为在册 | 同上 | +| [战斗结算](../design/gdd/systems/战斗循环/战斗结算.md) | 全局受伤事件与刷新事实落码状态 | 同上 | +| [地图战斗资源](../design/gdd/systems/战斗循环/地图战斗资源.md) | 确认清图奖励不受矿道红利改变 | 同上 | +| [架构文档](../design/engineering/architecture/architecture.md) | 新增事件、效果、BattleRefreshFlow与API边界 | 同上 | +| [测试手册](../game/tests/README.md) | 换图系能力行 | 本写卡段已入表;实现批只核对名实一致 | + +## 八、文件结构与职责 + +| 文件 | 职责 | 改动类型 | 验收行 | +|---|---|---|---| +| [effect_engine.gd](../game/core/effect_engine.gd) | 封闭词表扩两事件、两效果 | 行为改动 | V1 | +| [action_economy.gd](../game/core/action_economy.gd) | dig_paid产RAP、折价成本受理 | 行为改动 | V2/V3 | +| [battle_refresh_flow.gd](../game/core/settlement/battle_refresh_flow.gd) | 新建:刷新门、扣费、换图、成功事实 | 行为改动 | V4/V10 | +| [battle_orchestrator.gd](../game/core/battle_orchestrator.gd) | 刷新公开口单行转发;来源豁免 | 行为改动 | V4 | +| [damage_controller.gd](../game/core/damage_controller.gd) | 全局受伤消费、攻击层消费、延迟群伤目标解析 | 行为改动 | V5/V6/V7 | +| [grant_segment.gd](../game/core/settlement/grant_segment.gd) | 刷新命中施加、GP、当轮恢复、地形路径接入统一消费 | 行为改动 | V5/V6/V7/V9 | +| [reward_grant.gd](../game/core/reward_grant.gd) | 群伤单延迟入队 | 行为改动 | V6 | +| [feats.tres](../game/data/tables/feats.tres) | 七行专长与数值 | 行为改动 | V2/V3/V6/V7/V8/V9/V11 | +| [run_all.gd](../game/tests/run_all.gd) | 新测试登记 | 非行为改动 | V12 | +| [refresh_feats_test.gd](../game/tests/unit/battle_settlement/refresh_feats_test.gd) | 新建七件与全局受伤链路专项 | 非行为改动 | V2–V10 | +| [adventure_feats_test.gd](../game/tests/unit/core/adventure_feats_test.gd) | 专长行数、稀有度、牌库 | 非行为改动 | V11 | +| [forge_table_test.gd](../game/tests/unit/data_config/forge_table_test.gd) | 事件/效果闭集计数 | 非行为改动 | V1 | +| [effect_words_t1_test.gd](../game/tests/unit/core/effect_words_t1_test.gd) | 新词在册与出域拒绝 | 非行为改动 | V1 | +| [round_flow_skill_pool_test.gd](../game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd) | 无专长基线回归 | 非行为改动 | V12 | +| [README.md](../game/tests/README.md) | 能力清单 | 非行为改动 | V11 | + +## 九、落位与可复用性预检 + +### 9.1 新增件 + +| 新件 | 复用结论 | 唯一落点 | 调用路径 | +|---|---|---|---| +| `BattleRefreshFlow` | 已查 `can_refresh`、`player_request_refresh`、`request_refresh`、商店代理、autoplay;没有同时负责成本查询与成功事实登记的现成件。不能复用 GrantSegment,因为刷新发生在授予段外;不能塞 BattleOrchestrator,因其文件长度贴顶 | `game/core/settlement/battle_refresh_flow.gd` | 呈现层→编排器转发→流程件→行动经济/装板壳/授予段 | +| `refresh_feats_test.gd` | 现有刷新测试只覆盖无专长基线;专长宿主没有经真实 `player_request_refresh` 驱动七件的夹具 | `game/tests/unit/battle_settlement/refresh_feats_test.gd` | `settle_batch`/`player_request_refresh`/轮末结算 | +| `_apply_hero_damage_effects` | 复用现有 `_enemy_shield_apply` 的组合算法,不新造事件消费件 | DamageController私有族 | 所有 `damage_taken` 发射点唯一消费 | + +### 9.2 实现规范预算 + +| 触面 | 实测预算 | 结论 | +|---|---|---| +| `battle_refresh_flow.gd` | 公开函数2/类变量0 | ≤20/≤15,通过 | +| `battle_orchestrator.gd` | 类变量38不变;当前811行,删除旧刷新体并改两行转发,目标下降至少8行 | S13只降不升 | +| `action_economy.gd` | 公共方法15→15,仅扩参与局部状态 | ≤20,通过 | +| `grant_segment.gd` | 类变量3→3;公开方法1→2;新增私有施加函数≤4 | ≤20/≤15,通过 | +| `damage_controller.gd` | 公共方法不新增;现有 `_enemy_shield_apply` 改名为 `_apply_hero_damage_effects`,私有函数净增≤2 | S13逐键实测 | +| `reward_grant.gd` | 类变量15→15;新增一个公开延迟入口 | 禁增员,通过 | +| `feats.tres` | 同一专长表30→37 | 无第二数据源 | + +## 十、任务卡 + +### T0 开工基线与预算实测(0.5d) + +步骤: + +- [ ] 读 `game/tests/.gates/ci-status.json`;CI红未修即停卡。 +- [ ] 复核第三节 file:line;任一事实漂移先停卡核对。 +- [ ] 跑开发期局部读数:`bash tools/gdstyle.sh game`。 +- [ ] 记录 BattleOrchestrator行数/类变量、RewardGrant类变量、DamageController与GrantSegment方法数。 + +产出:所有结构预算基线;本卡无事实漂移。 + +### T1 词表扩签与计数(0.5d) + +接口块: + +- EVENTS 新增:`refresh_request`、`board_refreshed` +- EFFECT_KINDS 新增:`grant_reserve_ap`、`apply_discount` + +步骤: + +- [ ] 在 [effect_engine.gd:12](../game/core/effect_engine.gd#L12) 追加两事件,并同步 [effect_engine.gd:19](../game/core/effect_engine.gd#L19) 的 MINE_EVENTS。 +- [ ] 在 [effect_engine.gd:24](../game/core/effect_engine.gd#L24) 追加两效果;不新增fact/op/DO_KEYS。 +- [ ] 更新 [forge_table_test.gd:202](../game/tests/unit/data_config/forge_table_test.gd#L202):EVENTS20→22、EFFECT_KINDS32→34。 +- [ ] 更新 [effect_words_t1_test.gd:14](../game/tests/unit/core/effect_words_t1_test.gd#L14):两事件与两效果在册;旧出域负例全部保留。 +- [ ] 孤立验证:`effect_words_t1_test.gd`、`forge_table_test.gd`。 + +验收:词表封闭性无洞,旧词行为不变。 + +### T2 全局 `damage_taken` 统一(1.75d) + +接口块: + +```gdscript +func _emit_hero_damage_taken(amount: int, damage_kind: String, source: String, cell: Vector2i, ri: int) -> Dictionary +func _apply_hero_damage_effects(hits: Array, total: int) -> Dictionary +``` + +步骤: + +- [ ] 把 [damage_controller.gd:507](../game/core/damage_controller.gd#L507) 的敌方受伤消费族改名为 `_apply_hero_damage_effects`,保留 shield、damage_reduce、ac_bonus、counter_add 的组合次序。 +- [ ] 新增 `_emit_hero_damage_taken()`:payload必含 `kind/amount/source/cell/round/hp_ratio`,dispatch后调用唯一消费族,返回减后金额与命中束。 +- [ ] 敌方攻击改走该方法,保持现有“掷点后、交付前”消费时点。 +- [ ] `_resolve_board_flat_hero()` 在伤害下限前调用该方法;若单据 context 已标 `hero_damage_consumed=true` 则跳过,避免重复。 +- [ ] 地形伤害改为调用该方法并把 `hero_damage_consumed=true` 写入单据 context,删除本地重复消费:[grant_segment.gd:174](../game/core/settlement/grant_segment.gd#L174)。 +- [ ] 危险格与错误封印的负向主角直伤经 `board_flat_hero` 自动进入该方法,不新增第二发射点。 +- [ ] 写专项函数: + - `test_all_hero_damage_paths_emit_once()`:注入临时 `counter_add damage_taken` 专长,从敌方攻击、危险格、错误封印、地形四种真实入口进入,每种单据恰好计数一次。 + - `test_no_duplicate_damage_taken_event()`:同一伤害不得出现两次消费。 +- [ ] 窄测:`refresh_feats|damage_controller|seal_polarity|round_flow` 红件最小复跑。 + +验收:`damage_taken` 字面语义覆盖所有主角承伤;无专长仍逐位保持原伤害。 + +### T3 两件基座(1d) + +接口块: + +```gdscript +func request_refresh(cost_override: int = -1) -> bool +static func _effective_refresh_cost(oc: BattleOrchestrator) -> int +``` + +步骤: + +- [ ] 在 [action_economy.gd:101](../game/core/action_economy.gd#L101) 的 `dig_paid` 命中环累计 `grant_reserve_ap`,只在扣费受理后一次性调用 `grant_reserve_ap()`;连锁不二次调用。 +- [ ] `refresh_request` 命中只认 `kind=="apply_discount" && mode=="refresh"`;取声明序第一个命中,按 `floor(base*cost_mult/100)` 计算。 +- [ ] 新建 `BattleRefreshFlow`:公开 `can_refresh(oc)`、`execute(oc)`;execute只在ActionEconomy扣费成功后继续。 +- [ ] 编排器两个公开方法改为单行转发,删除旧刷新体。 +- [ ] 写: + - `test_reserve_on_accepted_dig()`:真实挖格入口,RAP+1,AP按表扣。 + - `test_refresh_discount_gate_and_charge()`:真实刷新入口成本4,can_refresh同源判断。 + - `test_double_base_stack()`:同时持两件时挖格产RAP、刷新扣4。 + - `test_no_feats_baseline()`:旧成本与RAP来源逐值不变。 +- [ ] 窄测 `--only=refresh_feats|round_flow`。 + +验收:两件基座改变行为但不破坏现行经济闸。 + +### T4 成功刷新事实与命中施加(1d) + +接口块: + +```gdscript +static func execute(oc: BattleOrchestrator) -> bool +func apply_board_refreshed(ri: int) -> void +func defer_ticket(t: Dictionary) -> void +``` + +步骤: + +- [ ] `execute()` 成功序钉死:折价扣RAP→refresh_used+1→旧资源退役→旧板退役→装新板→GrantSegment `apply_board_refreshed(ri)`。 +- [ ] install失败时返回false且零效果;成功事实只在新板就位后发射。 +- [ ] `apply_board_refreshed()` dispatch一次 `board_refreshed`,payload `{round:ri}`,命中消费: + - `counter_add` → 既有单点落账。 + - `grant_gp` → `reward_grant.escrow += value` 并发 `fx_grant_gp` 行。 + - `open_ticket && channel=="blast"` → `DamageController.KIND_BOARD_BLAST`、`TARGET_ALL_ALIVE`、`source_class="fx_board_refresh"`,调用新增 `defer_ticket()`。 +- [ ] 在 [battle_orchestrator.gd:35](../game/core/battle_orchestrator.gd#L35) 的来源豁免追加 `"fx_board_refresh"`。 +- [ ] 写 `test_board_refresh_fact_only_on_success()`、`test_mine_profit_gp()`。 +- [ ] 窄测 `--only=refresh_feats|round_flow`。 + +验收:拒绝刷新零事实;GP固定入账且每轮上限同时限制次数。 + +### T5 五件后续效果(1.75d) + +接口块: + +```gdscript +func _apply_hero_damage_effects(hits: Array, total: int) -> Dictionary +func _round_end_apply(ri: int) -> void +``` + +步骤: + +- [ ] 崩壁冲击已在T4延迟开单;确认授予段不结账、战斗段末按存活目标结账,最后敌死亡仍由判定段胜。 +- [ ] 石层缓冲用 `round_swap_guard`:成功刷新时+1;`damage_taken` 条件≥1时 `damage_reduce value=2`,不清层、不随伤害段变化。round桶轮始自然清空。 +- [ ] 坑道小憩用 `round_swap_rest`:成功刷新累计至上限3;`round_end` 命中 `heal value_counter=round_swap_rest`,调用 `units.heal()`封顶,满血发未生效行;随后同事件行 `counter_add set=0`。 +- [ ] 蓄力周转用战斗桶 `swap_charge_layers`:成功刷新至上限3;`attack_commit` 消费全部层数,随后清零;战斗新建自然清空。 +- [ ] 写: + - `test_stone_mitigation_all_damage()` + - `test_rest_rotation_cap_and_clear()` + - `test_charge_layers_consumed_same_round()` + - `test_blast_defers_to_combat_segment()` +- [ ] 窄测 `--only=refresh_feats|damage_controller|seal_polarity`。 + +验收:五件只在成功刷新链生效;固定减伤不堆、恢复累计、GP定额。 + +### T6 七件数据行与牌库计数(1d) + +接口块:`feats.tres` 行键沿用 `feat_id/display_name/rarity/cap/desc/triggers`,不扩schema。 + +步骤: + +- [ ] 追加七行,trigger结构固定: + +| feat_id | triggers | +|---|---| +| `vein_reserve` | `dig_paid → grant_reserve_ap value=1` | +| `easy_swap` | `refresh_request → apply_discount mode=refresh cost_mult=50` | +| `wall_blast` | `board_refreshed → open_ticket channel=blast value=2` | +| `charge_rotation` | `board_refreshed when counter<3 → counter_add swap_charge_layers1`;`attack_commit when≥1 → attack_bonus value_counter=swap_charge_layers`;`attack_commit when≥1 → set0` | +| `stone_mitigation` | `board_refreshed → counter_add round_swap_guard1`;`damage_taken when≥1 → damage_reduce value=2` | +| `tunnel_rest` | `board_refreshed when<3 → counter_add round_swap_rest1`;`round_end when≥1 → heal value_counter=round_swap_rest`;`round_end when≥1 → set0` | +| `mine_profit` | `board_refreshed → grant_gp value=1` | + +- [ ] desc分别写:挖格储能、刷新半价、刷后群伤、刷后蓄力、当轮减伤、当轮恢复、刷后GP;禁“雷/旗”字面。 +- [ ] 行数30→37;稀有度12/9/9/0→14/13/10/0;relic令牌30→37;牌库132→139。 +- [ ] 同步 [adventure_feats_test.gd:465](../game/tests/unit/core/adventure_feats_test.gd#L465)、[:476](../game/tests/unit/core/adventure_feats_test.gd#L476),旧30行断言只按实数换代,不降低 validate/禁词检查。 +- [ ] 写 `test_seven_feats_validate_and_pool()`。 + +验收:七件全部数据驱动,跨表计数器引用闭合。 + +### T7 回归与能力名实核对(0.75d) + +步骤: + +- [ ] 核对 [README.md](../game/tests/README.md) 五类换图能力行,文件名与测试函数逐字一致。 +- [ ] `round_flow_skill_pool_test.gd:_smoke_active_refresh()` 无专长基线断言不删除、不放宽。 +- [ ] `seal_polarity_test.gd:_smoke_refresh_provenance_guard()` 继续证明刷新图零清图奖励。 +- [ ] 实跑关联窄测: + `--only=refresh_feats|adventure_feats|round_flow|seal_polarity|damage_controller|effect_words|forge_table|config_db` +- [ ] 出红只按红件最小复跑,波内不跑全量。 + +验收:新增与旧专长并存;无UI/素材改动,不新增golden。 + +### T8 批末出口与产出物(1d) + +步骤: + +- [ ] 里程碑出口跑 `bash tools/run_all_gates.sh --code`。 +- [ ] 回执必须 `all_green=true`、`dirty_game=false`。 +- [ ] 独立验收审计报告 `reports/iter-验收审计-<日期>.md` 未过禁合并。 +- [ ] 轻闸全绿、合并前写齐: + 1. `reports/iter-实现报告-<日期>.md` + 2. `reports/iter-代拍板追认单-<日期>.md` + 3. `reports/iter-反哺点-<日期>.md` +- [ ] 实现报告列七卡状态、V1–V12读数、S13前后数、旧damage_taken专长覆盖面变化、玩家主动刷新目检项。 +- [ ] 反哺点逐条覆盖第七节六个目标。 + +完成定义:三份产出物齐全+代码域闸全绿+验收审计通过。 + +## 十一、验证闸:改动—验收对照表 + +| 需求点 | 改动(文件/行为) | 验收测试 | 层级 | 真实入口 | 判据绑定面 | 能力行 | +|---|---|---|---|---|---|---| +| V1 词表扩签 | effect_engine;forge/effect_words | `effect_words_t1_test.gd:_init`;`forge_table_test.gd:_test_effect_kinds_closed` | 单元 | validate与整表加载 | EVENTS=22、EFFECT_KINDS=34、出域仍拒 | 新增:换图系刷新链路与效果词表接线 | +| V2 矿脉储能 | action_economy dig_paid消费 | `refresh_feats_test.gd:test_reserve_on_accepted_dig` | 接口 | `settle_batch(dig)` | RAP恰+1、AP扣值与板资源不变 | 新增:换图基座:挖格产 RAP 与刷新折扣 | +| V3 省力周转 | BattleRefreshFlow成本门 | `test_refresh_discount_gate_and_charge`;`test_double_base_stack` | 接口 | `player_request_refresh()` | base8→扣4;can与执行同源;两件都生效 | 新增:换图基座:挖格产 RAP 与刷新折扣 | +| V4 成功事实 | BattleRefreshFlow install尾点 | `test_board_refresh_fact_only_on_success` | 集成 | `player_request_refresh()` | RAP不足/第3次上限/非Active均board_changed与效果零变化 | 新增:换图系刷新链路与效果词表接线 | +| V5 全局受伤 | damage_controller统一发射消费 | `test_all_hero_damage_paths_emit_once`;`test_no_duplicate_damage_taken_event` | 集成 | 敌方攻击、dig danger、seal wrong、terrain触发 | 每路径一次事件、无重复扣血或重复counter | 新增:换图生存:全局固定减伤与轮末恢复 | +| V6 石层缓冲 | round_swap_guard+damage_reduce | `test_stone_mitigation_all_damage` | 集成 | 刷新→四种真实受伤路径 | 每种伤害最终金额减2;多刷不增加;下限1保持 | 新增:换图生存:全局固定减伤与轮末恢复 | +| V7 崩壁冲击 | open_ticket延迟队列 | `test_blast_defers_to_combat_segment` | 集成 | 刷新→停手 | 授予段无伤害行、战斗段末全体存活敌各受伤 | 新增:换图输出:刷新群伤与蓄力攻击 | +| V8 蓄力周转 | counter+attack_bonus value_counter | `test_charge_layers_consumed_same_round` | 接口 | 两次刷新→本轮主角攻击 | 攻击加2层、随后0;战斗新建0;上限3 | 新增:换图输出:刷新群伤与蓄力攻击 | +| V9 坑道小憩 | round_end heal消费 | `test_rest_rotation_cap_and_clear` | 集成 | 三次刷新→停手 | 回复3、上限3、层清0、hp≤max;满血未生效 | 新增:换图生存:全局固定减伤与轮末恢复 | +| V10 矿道红利 | board_refreshed grant_gp | `test_mine_profit_gp` | 集成 | `player_request_refresh()` | escrow每次成功刷新+1;拒绝零变化;fx_grant_gp行在案 | 新增:换图资源:刷新固定 GP 收益 | +| V11 数据与池 | feats七行;adventure计数 | `test_seven_feats_validate_and_pool`;adventure_feats | 单元 | ConfigDB整表与冒险牌库 | rows37、relic37、14/13/10、deck139、validate空、禁词0 | 既有:专长(奇物)授予与凭证保底 | +| V12 无专长回归 | round_flow/seal旧基线 | `_smoke_active_refresh`;`_smoke_refresh_provenance_guard` | 单元+集成 | 现行刷新/清图入口 | RAP8、AP保留、上限2、刷新图零清图、五段与回放不降 | 既有:停手转存储备与轮内刷新(上限/AP 不重置/刷新图零清图奖励) | + +## 十二、测试方式与削弱申报 + +自动验证: + +- V1–V12均从真实公共入口进入;计数器、事件行、escrow、hp与伤害行都是可观测提交面。 +- 不造变异或回退hunk证明;临时专长夹具通过现行ConfigDB注入,属正常数据配置路径。 + +真人目检: + +- 登记一项:玩家持基座与收益件后,是否主动规划刷新而非只在坏图刷新。写入实现报告,不阻塞合回。 + +测试削弱申报: + +- 允许把行数、稀有度、事件/效果计数从旧实数改到新实数。 +- 允许旧 `damage_taken` 行为测试增加危险格/错误封印路径,以体现用户已裁的全局语义;原敌方攻击与地形断言不得删除或放宽。 +- 禁止删除RAP8基线、每轮上限2、AP保留、刷新图零清图、伤害下限、五段序、同种子回放等断言。 + +## 十三、估时与切分预案 + +| T0 | T1 | T2 | T3 | T4 | T5 | T6 | T7 | T8 | 合计 | +|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:| +| 0.5 | 0.5 | 1.75 | 1 | 1 | 1.75 | 1 | 0.75 | 1 | **8d** | + +浮动±0.5d。 + +切分预案:段一=T0–T4+T6(基座、全局受伤事件、刷新事实、数据接线,约4.75d);段二=T5+T7–T8(五件收益兑现与回归出口,约3.5d)。两段各自独立可测、独立提交。 + +## 十四、异常分级 + +L1(自救一次):编译错误、签名拼写、manifest登记遗漏。 + +L2(记录继续;同红三次升L3):既有无关文档域红;局部测试文案漂移。 + +L3(停卡写报告): + +- CI红未修。 +- 同一伤害出现两次 `damage_taken`,或某路径完全不出现。 +- 石层缓冲使伤害归零、突破下限或改变治疗语义。 +- 刷新生效出现清图奖励/探索进度耦合。 +- BattleOrchestrator或RewardGrant结构预算被迫上升。 +- 机检键与本卡契约互斥;禁为凑绿保留无效成员。 +- 任何需求点找不到真实入口与特有可观测提交面。 + +## 十五、代拍板白名单 + +允许实现期自拍: + +1. 私有函数换行、局部变量名、内部注释位置。 +2. 测试断言消息措辞与helper顺序。 +3. 错误扫描暴露的纯格式修复。 +4. 不改变语义的前提下复用现有 `units.heal()`、counter API与GP行格式。 + +超清单必停卡呈报: + +- 数值、稀有度、cap、counter_id、事件/效果名、来源类别、文件职责、验收入口。 +- 任何把清图奖励、探索进度、临时生命重新引入本批的改法。 + +## 十六、零待裁点 + +七件名称、收益对象、全局受伤范围、叠加规则、时序、数值与稀有度均由最终确认单锁定。本卡零待裁点,开工门=U0。 + +## 十七、开工门 + +1. 由 iter-plan 编入迭代后,`/iter` 才可开工;无迭代外执行通道。 +2. 开工前四份GDD凭据在待办清单闭合、CI绿、T0实测无漂移。 +3. 本卡预计8个工作日,符合迭代硬线。