diff --git a/reports/需求卡片-封印动作改版批-2026-11-07.md b/reports/需求卡片-封印动作改版批-2026-11-07.md index e77d56cf..47302113 100644 --- a/reports/需求卡片-封印动作改版批-2026-11-07.md +++ b/reports/需求卡片-封印动作改版批-2026-11-07.md @@ -51,14 +51,14 @@ 呈现层: -- `game/presentation/views/board_view.gd`——印记可见性 `u.seal_on = seal and not revealed` :541;瓦片切换 revealed?:floor:wall :597-623;`_diggable` :301-304(未开且未移除即入可挖域,含封印格);左键分派 revealed→move 否则 dig :471-485(:483-484 注释「相邻封印格直接挖」);悬停 `board_hover.gd` :96-121(相邻封印格=挖掘光标 :113-116);拒绝文案 `hud_presenter.gd` :169-191(`seal_present` :179 含「相邻时左键直接挖开」);图例 `legend_overlay.gd` :9-13;操作提示条 `board_zone_view.gd` :80(含 chord 退役后残留错句「同格双击 快开」)。 +- `game/presentation/views/board_view.gd`——印记可见性 `u.seal_on = seal and not revealed` :541;瓦片切换 revealed?:floor:wall :597-623;`_diggable` :301-304(未开且未移除即入可挖域,含封印格);左键分派 revealed→move 否则 dig :471-485(:483-484 注释「相邻封印格直接挖」);悬停 `board_hover.gd` :96-121(相邻封印格=挖掘光标 :109-112;:113-116 为**非相邻**封印格禁入分支);拒绝文案 `hud_presenter.gd` :169-191(`seal_present` :179 含「相邻时左键直接挖开」);图例 `legend_overlay.gd` :9-13;操作提示条 `board_zone_view.gd` :80(含 chord 退役后残留错句「同格双击 快开」)。 测试、探针、sim、数据(第 7 节文件结构图逐件列): -- 单元:`minesweeper_rules_test.gd`(`_test_dig_face_rules` :72-84 断言 `target_revealed`;`_test_seal_place` :101-111;preview 形态 B :122-161;判据锚 :73/:88/:102/:115);`seal_polarity_test.gd`(末点 AP 封印收轮 :46-82;封印不可逆四情况组 :579-651;资源资格面 :778-826);`settlement_wiring_snapshot_test.gd` 内嵌 golden(`"seals": 1`/`"revealed": 42` 等计数);`hud_presenter_test.gd` :29-30 与 `player_copy_sweep_test.gd` :69-82/:125-140(文案逐字);`adventure_feats_test.gd` :721-723(破封一击 `dug_under_seal`);`effect_words_t1_test.gd` :16-27/:37-71(词表在册断言)。 +- 单元:`minesweeper_rules_test.gd`(`_test_dig_face_rules` :72-84 断言 `target_revealed`;`_test_seal_place` :101-111;preview 形态 B :122-161;判据锚 :73/:88/:102/:115);`seal_polarity_test.gd`(末点 AP 封印收轮 :46-82;封印不可逆四情况组 :579-651;资源资格面 :778-826);`settlement_wiring_snapshot_test.gd` 内嵌 golden(`"seals": 1`/`"revealed": 42` 等计数);`hud_presenter_test.gd` :29-30 与 `player_copy_sweep_test.gd` :69-82/:144-147(文案逐字);`adventure_feats_test.gd` :721-723(破封一击 `dug_under_seal`);`effect_words_t1_test.gd` :16-33(词表在册断言;:37-71 为封闭性后段)。 - 探针:`ui_input_probe.gd`(case④ 右键封印 :273-281、case④b 印记落位断言 :282-286、目标选取排除封印格 :230-242/:522-540/:601-608);`board_shot_probe.gd`(封印取证选择器 `has_seal and not is_revealed` :78/:191);`ui_click_probe.gd`(行为②撤封印 :1063-1069 恒假死路;随机封印行为① :1055-1062;图例行断言 :899-908)。 - sim:`auto_player.gd`(choose_dig 跳封印格 :20;已证雷先封后挖 :38-50/:86-97;`_constraints` 封印位计入已知雷约束 :162-185);`level_autoplay.gd`(「标雷误挖」滑失注入 :507-521——封印意图按概率转成同格挖意图)。 -- 数据:`game/data/tables/feats.tres` :624 起「破封一击」行;`game/data/tables/adventure.tres` feat_ticket_* 概率行(:46-49,本批不动);golden 基线 `game/tests/golden/`(board_L1/L2/L3 × windows/mac 六件+palette_baseline)。 +- 数据:`game/data/tables/feats.tres` :622 起「破封一击」行(feat_id=`breaker_strike` :623,display_name 行 :624);`game/data/tables/adventure.tres` feat_ticket_* 概率行(:46-49,本批不动);golden 基线 `game/tests/golden/`(board_L1/L2/L3 × windows/mac 六件+palette_baseline)。 - 存档:`breakpoint_store.gd` 28 键(BREAKPOINT_FIELDS :16-45)无格子状态键、停点粒度=节点级——**本批存档零改动**(同种子重放重建棋盘态)。 ## 4. 设计契约(违反即返工;🔴 触碰=L3 停机呈报) @@ -100,12 +100,12 @@ | game/presentation/hud_presenter.gd | `seal_present` 文案换代+新增 `target_sealed` 文案 | R10 | 修改 | | game/presentation/views/legend_overlay.gd | 图例封印行重写(受理即揭示口径) | R10 | 修改 | | game/presentation/views/board_zone_view.gd | 提示条换代+chord 残留错句顺带修 | R10 | 修改 | -| game/data/tables/feats.tres | 删「破封一击」行(:624 起)+全仓引用清零 | R7 | 修改 | +| game/data/tables/feats.tres | 删「破封一击」行(:622 起,feat_id=breaker_strike)+全仓引用清零 | R7 | 修改 | | game/tests/unit/core/minesweeper_rules_test.gd | 挖已揭示拒绝保留;新增挖封印格被拒/受理揭示/清图口径断言;preview 形态 B 删;判据锚刷新 | R1 R2 R3 | 修改 | | game/tests/unit/battle_settlement/seal_polarity_test.gd | 四情况组重写(挖封印格两情况→被拒负面断言);末点 AP 收轮/seal_pull 出目录/标中标空判定/资源资格面保留 | R2 R5 R6 | 修改 | | game/tests/unit/battle_settlement/settlement_wiring_snapshot_test.gd | 内嵌 golden 重录(seals/revealed 计数漂移) | R6 | 修改 | | game/tests/unit/presentation/hud_presenter_test.gd、player_copy_sweep_test.gd | 文案断言换代 | R10 | 修改 | -| game/tests/unit/battle_settlement/adventure_feats_test.gd、effect_words_t1_test.gd | 破封一击断言退役、词表断言换代 | R7 | 修改 | +| game/tests/unit/core/adventure_feats_test.gd、effect_words_t1_test.gd | 破封一击断言退役、词表断言换代 | R7 | 修改 | | game/tests/unit/presentation/seal_mark_params_test.gd | 迷雾门控断言前提换代(印记承载面) | R8 | 修改 | | game/probe/ui_input_probe.gd、board_shot_probe.gd、ui_click_probe.gd | case④b 印记落位断言换代、取证选择器换代、撤封印死路段清理 | R8 R9 | 修改 | | game/tests/smoke/critical-paths.md | 第 4 条改写 | 非行为改动(清单句) | 修改 | @@ -164,7 +164,7 @@ **T3 呈现层换代**(0.75–1.25 日,中值 1.0)|取用:T1 `sealed_identity`|产出:封印格渲染与输入分派 - [ ] board_view.gd:`u.seal_on = seal`;瓦片切换 sealed→地板;封印格身份字形=数字/「危」垫现行色牌件(读 `sealed_identity`);`_diggable` 排除封印格;左键封印格零发射 -- [ ] board_hover.gd:封印格悬停=禁止光标+说明(删「左键直接挖」分支) +- [ ] board_hover.gd:封印格悬停=禁止光标+说明(:109-112 相邻分支内的封印格豁免删——封印格改落 :113-116 禁入分支) - [ ] hud_presenter.gd:`seal_present` 句换代+`target_sealed` 新句;legend_overlay.gd 图例封印行重写;board_zone_view.gd 提示条换代+chord 错句顺带修 - [ ] 验收步骤:R8/R9/R10 单元侧断言绿(探针断言随 T4 全链跑) @@ -178,7 +178,7 @@ - [ ] 验收步骤:改过的套件与探针逐件孤立跑绿后并入全套(读数进提交信息) **T5 内容退役**(0.25–0.5 日,中值 0.375)|取用:无|产出:破封一击零引用 -- [ ] feats.tres 删「破封一击」行;grep 全仓 `破封`/其 feat_id 清零 +- [ ] feats.tres 删「破封一击」行(:622 起);grep 全仓 `破封`/`breaker_strike` 清零 - [ ] 验收步骤:数据装载冒烟绿+R7 断言绿 **T6 sim 域换代+MC 同批重锚**(0.75–1.25 日,中值 1.0)|取用:T1 查询面|产出:新 MC 锚落盘 @@ -245,5 +245,11 @@ | 1 | 同上 | F12 对照表注记缺口:board_view 行缺 R9 标注、rules 行缺 R6/R7 归属、R8 子件直查未申报受控例外 | 补写 | 三处已补(board_view 行标 R8 R9;rules 行标 R1-R4/R6/R7;R8 行随行申报受控例外理由) | | 1 | 同上 | F13 悬停说明文案(ux/battle.md:299)无断言载体 | 补写 | R9 收编「悬停说明在册可见」断言(措辞按白名单 2 润) | | 1 | 同上 | 核实通过面:九文档行锚逐一实核、15+ 处现状 file:line 全对、`sealed_identity`/`notify_cleared` 全仓零命中、引擎三查(NEVER list/Gotchas/性能预算)零触碰、MC 纪律与渲染闸 mac 缺件 SKIP 语义一致 | 自判 | 不改+依据:实核通过,记录在案供审计追溯 | +| 2 | 卡修批复核(2026-11-07,写卡段核对+子代理逐行实读) | F14 board_hover 行锚失位——「相邻封印格=挖掘光标 :113-116」实为非相邻封印格禁入分支,相邻封印格挖掘光标在 :109-112 | 补写 | §3 锚改 :109-112 并注明 :113-116 为非相邻禁入分支;T3 步骤钉死删分支对象(:109-112 内的封印格豁免,删后封印格落 :113-116 禁入分支) | +| 2 | 同上 | F15 feats.tres 行锚偏差——破封一击行块自 :622 起、feat_id=`breaker_strike` 在 :623(:624 是 display_name 行) | 补写 | §3/§7/T5 改锚并补 feat_id;T5 grep 清零词补 `breaker_strike` | +| 2 | 同上 | F16 player_copy_sweep_test.gd 文案逐字断言实际在 :144-147(卡写 :125-140 是夹具构造循环) | 补写 | §3 改锚 | +| 2 | 同上 | F17 adventure_feats_test.gd/effect_words_t1_test.gd 实际在 game/tests/unit/core/ 而非卡内所写 unit/battle_settlement/ 路径 | 补写 | §7 路径改正(§3 引用不带路径,不受影响) | +| 2 | 同上 | F18 effect_words_t1_test.gd :37-71 实为封闭性后段,词表在册断言在 :16-33 | 自判 | §3 锚改 :16-33 | +| 2 | 同上 | F19 §5 不做清单引「结算明细文案入表(待办清单在册)」失实——该条目当时待办清单缺册 | 补写 | 本卡修批已补登记待办清单条目「结算明细文案入表」(2026-11-07,批次移交,待文档设计),§5 引用随登记成立 | -复核结论:待裁类 1 条(F2)已经用户裁决(2026-11-07 裁③退役+重标定补偿)并落卡;自判 5、补写 5、退回上游 1 全部处置——**卡片成立**。 +复核结论:待裁类 1 条(F2)已经用户裁决(2026-11-07 裁③退役+重标定补偿)并落卡;轮 1 自判 5、补写 5、退回上游 1 全部处置;轮 2(卡修批)六发现全处置(补写 4、自判 2)、零待裁——**卡片修订成立**。 diff --git a/reports/需求卡片-结算期文字列表退役批-2026-11-07.md b/reports/需求卡片-结算期文字列表退役批-2026-11-07.md index e3b524a2..3e3ec061 100644 --- a/reports/需求卡片-结算期文字列表退役批-2026-11-07.md +++ b/reports/需求卡片-结算期文字列表退役批-2026-11-07.md @@ -9,7 +9,7 @@ 撤掉战斗屏结算期一行行滚动的文字列表;保留伤害飘字、攻击特效与站桩动画;日志侧零中文文案、只存结构化字段,并保证数值分析判读结论与改前逐位一致。 -完成定义:①结算期 B 区不产任何逐行文字;②FX 排播链与两类 toast 仍在;③新日志 `step` 行零中文字段、原有全字段与全部 payload 仍在;④`tools/analyze_playtest.py` 对同一份历史锚与一份新日志的判读结论与改前一致;⑤每个需求点有从真实入口进入的正向验收断言并跑绿,读数写进该步提交信息。 +完成定义:①结算期 B 区不产任何逐行文字;②FX 排播链与两类 toast 仍在;③新日志 `step` 行零中文字段、原有全字段与全部 payload 仍在;④`tools/analyze_playtest.py` 判读等价:T0 两份基线日志(现行历史锚+改前同种子日志)改后复跑逐位一致+同种子改前改后日志配对逐位一致;⑤每个需求点有从真实入口进入的正向验收断言并跑绿,读数写进该步提交信息。 ## 2 设计事实源 @@ -23,15 +23,15 @@ | 事实 | 位置 | |---|---| | 结算行协议:`_emit_row()` 发 `step_row`,公共字段 type/source_class/origin_cell/round_index/display_name/value/highlight+extra 全平铺 | `game/core/battle_orchestrator.gd:710-735` | -| 玩家侧逐行文字渲染(7 处读 display_name、BBCode 行模板、上轮摘要、聚合计数) | `game/presentation/views/battle_log_view.gd:87-103`、`:146-264` | +| 玩家侧逐行文字渲染(7 处读 display_name、BBCode 行模板) | `game/presentation/views/battle_log_view.gd:87-103`(逐行渲染入口)、`:146-263`(行格式化域);上轮摘要 `:72-84`、聚合计数 `:109-130` | | 排播泵:文字入带是 `log_view.append_row/append_bb/finish_settlement_round`;FX 链是 `stage.on_step_row_fx`/`_play_cross_zone_fx`/`_play_settlement_mark`/`refresh_request`/`pump_ended` | `game/presentation/row_pacer.gd:83-101`、`:106-152` | | 动画定位走 target/target_id,不读行文案 | `game/presentation/views/battle_stage_view.gd:327-344` | | 两类 toast 仍读 display_name/display:清图奖励、Boss 半血解锁技名 | `game/presentation/main.gd:417-425`;`row_pacer.gd:97-100`;规格 `design/gdd/systems/战斗循环/敌人系统.md:207` | | 日志逐行全字段落盘;中文字段两处=`text`(:138)与平铺进去的 `display_name`(:140-142) | `game/presentation/playtest_logger.gd:130-143` | | 开新/续玩均开日志会话并挂接战斗 | `game/presentation/main.gd:247-253`、`:295-302`;`game/presentation/main_adventure_flow.gd:62` | | 分析工具依赖 `text` 做四类判读:effect_id 反查、群伤奖励判定(两处)、未生效原因分类 | `tools/analyze_playtest.py:83-88`、`:189`、`:434`、`:471-478` | -| 群伤行已有结构化 `target: "all_enemies"`;未生效行散有 `batch_key`/`forfeit`/`deferred`,无统一「原因」字段 | `game/core/damage_controller.gd:515-516`、`:623-624`;`game/core/reward_grant.gd:269-271`、`:362-369`;`game/core/settlement/combat_segment.gd:123-124`;`game/core/settlement/grant_segment.gd:103`、`:321` | -| 玩家可见文案的现役测试/探针面 | `game/tests/README.md:135`;`game/tests/unit/presentation/theme_projection_test.gd:385`;`player_copy_sweep_test.gd:86-108`;`pacing_queue_test.gd:165`;`game/probe/ui_probe.gd:133-135`;`game/probe/ui_click_probe.gd:423`、`:473`、`:616`、`:798-844` | +| 群伤行已有结构化 `target: "all_enemies"`;未生效行散有 `batch_key`/`forfeit`/`deferred`,无统一「原因」字段——全仓 `reward_ineffective` 发射点共七处:补 `reason` 的六处=damage_controller:623-624/reward_grant:269-271/:362-364/:366-369/combat_segment:123-124/grant_segment:321;**grant_segment:103 不补**(封印作废行「奖励作废(封印格直接挖开)」——四类枚举无对应文案,且该行块 :102-104 随同迭代后行批「封印动作改版批」整块删除) | `game/core/damage_controller.gd:515-516`、`:623-624`;`game/core/reward_grant.gd:269-271`、`:362-369`;`game/core/settlement/combat_segment.gd:123-124`;`game/core/settlement/grant_segment.gd:103`、`:321` | +| 玩家可见文案的现役测试/探针面 | `game/tests/README.md:137`/`:138`(写卡段已入表的新能力行;旧行「结算明细带逐行呈现与排播节奏」已删);`game/tests/unit/presentation/theme_projection_test.gd:385`;`player_copy_sweep_test.gd:86-108`;`pacing_queue_test.gd:108-120`(:165 是收尾 PASS 打印行);`game/probe/ui_probe.gd:133-135`(折叠态断言——读 `pending_rows()` 与尺寸,不读行文本);`game/probe/ui_click_probe.gd:423`、`:473`、`:616`、`:798-844` | ## 4 设计契约(🔴 触碰=L3 停机呈报) @@ -52,11 +52,11 @@ | 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 | |---|---|---| -| `design/ux/battle.md:157`/`:230`/`:304` | 结算期明细带逐行滚动;「结算逐行兑现不可整体跳过、只给减动效」 | 实现批禁写 `design/`;逐条列进 `reports/iter-反哺点-<日期>.md`,用户裁决后由文档批落文 | +| `design/ux/battle.md:199`/`:272`/`:347` | 结算期明细带逐行滚动(:199 明细带行/:272 结算阶段逐行);「结算逐行兑现不可整体跳过、只给减动效」(:347)——旧锚 :157/:230/:304 系封印预览节插入前行号,已失位(下移约 42 行) | 实现批禁写 `design/`;逐条列进 `reports/iter-反哺点-<日期>.md`,用户裁决后由文档批落文 | | `design/gdd/systems/战斗循环/战斗结算.md:73`/`:87` | 明细流水是结算明细屏的数据源;「显示名等玩家可见文案是数据面字段、代码读表拼行」 | 同上 | | `design/gdd/systems/战斗循环/战斗表现.md:53`/`:99`/`:149` | 结算逐行兑现是信息载体;因果可读验收「能说出这一行来自哪步操作」 | 同上 | | `design/gdd/08-Alpha版本标准.md` v1.29 | 「逐行结算排播」行已删(合并 `f7d7761e`) | 已落地,本批零动作 | -| `game/tests/README.md:135` | 能力行「结算明细带逐行呈现与排播节奏」 | 实现批禁写;归写卡段维护,换代项写在 T3,本卡登记 | +| `game/tests/README.md:137`/`:138` | 新能力行两行(「结算期零逐行文字与 FX 排播链保持」「日志 step 行零文案与结构化判读等价」)**已由写卡段入表**;旧行「结算明细带逐行呈现与排播节奏」已删 | 实现批禁写;批末只核对名实一致(T3) | | `体验验证清单.md:86`/`:206`/`:220`/`:314`/`:315`/`:326`/`:442`/`:519` | 逐行结算、明细带来源/行序/文案可读性、减半标签等目检项 | 实现批禁写根规则文件;列进反哺点清单,由文档批落文;真人目检登记不阻塞 | ## 7 文件结构图 @@ -70,13 +70,13 @@ | `game/core/damage_controller.gd`/`reward_grant.gd`/`settlement/combat_segment.gd`/`settlement/grant_segment.gd` | `reward_ineffective` 行补 `reason` 枚举 extra | 行为改动 | R5 | 复用既有 `_emit_row` 出口 | | `tools/analyze_playtest.py` | 四处 `text` 判读改读结构化字段,保留历史锚兼容分支 | 行为改动 | R4 | 复用既有解析入口 | | `game/tests/unit/presentation/*`/`game/probe/*` | 旧断言改写成退役后正向断言 | 行为改动 | R1/R2/R3 | 复用既有套件 | -| `game/tests/README.md` | 能力行换代 | 非行为改动 | — | 复用既有表行 | +| `game/tests/README.md` | 能力行已由写卡段入表(新行 :137/:138、旧行已删)——本批零改动,批末只核对名实一致 | 非行为改动 | — | 复用既有表行 | | `reports/需求卡片-…`/实现报告/代拍板追认单/反哺点清单/验收审计 | 过程件 | 非行为改动 | — | 复用既有模板 | ## 8 落位与可复用性预检 -- **复用面**:本批零新增视图、服务、工具脚本。`grep` 现成实现结果=文字渲染唯一在 `battle_log_view.gd`,排播唯一在 `row_pacer.gd`,日志落盘唯一在 `playtest_logger.gd:130-143`,分析判读唯一在 `tools/analyze_playtest.py`;同名同义标识符无第二处。新增文件只有 `reports/` 过程件与新增测试函数(落在既有套件内)。 -- **唯一面**:`step` 行字段定义只在 `battle_orchestrator.gd:723-735`;`reason` 枚举取值只在第 9 节 T2 定义一次,四个发射点只引用不各自定义;日志行字段组装只在 `playtest_logger.gd:136-143`;分析工具的「旧日志兼容分支」只在 `effect_id_of()` 一处。 +- **复用面**:本批零新增视图、服务、工具脚本(游戏码零新增文件)。`grep` 现成实现结果=文字渲染唯一在 `battle_log_view.gd`,排播唯一在 `row_pacer.gd`,日志落盘唯一在 `playtest_logger.gd:130-143`,分析判读唯一在 `tools/analyze_playtest.py`;同名同义标识符无第二处。新增文件面=四件:测试三件(`battle_log_zero_text_test.gd`/`playtest_logger_step_fields_test.gd` 落 `game/tests/unit/presentation/`,`reward_ineffective_reason_test.gd` 落 `game/tests/unit/battle_settlement/`)+工具一件(`tools/analyze_parity_check.py`)。 +- **唯一面**:`step` 行字段定义只在 `battle_orchestrator.gd:723-735`;`reason` 枚举取值只在第 9 节 T2 定义一次,各发射点只引用不各自定义;日志行字段组装只在 `playtest_logger.gd:136-143`;分析工具的「旧日志兼容分支」只在 `effect_id_of()` 一处。 - **分层与交互面**:core 发 `step_row` → 呈现层 `row_pacer`/`playtest_logger` 并列订阅(删文字只动呈现层那条);`row_pacer` → `stage.on_step_row_fx`/`settlement_fx`/`board_zone` 的调用链不变;core 零 UI、数值经 ConfigDB、随机经 RngService 三条红线不因补 `reason` 而绕。 ## 9 任务卡 @@ -89,6 +89,7 @@ - [ ] 逐条复核第 3 节 file:line 与现役代码一致,不一致处回呈写卡段,不改卡硬做。 - [ ] 跑 `python tools/analyze_playtest.py` 对现行历史锚出一份判读基线,落 `sim-data/` 并在实现报告登记路径。 +- [ ] 经 sim 采集链采改前同种子日志一份(`level_autoplay.gd` 挂 `logger.start_session(seed)`,headless 直跑),同法出第二份判读基线——与历史锚基线一并落盘登记;此日志是 T3 改后同种子复放的配对腿(现行历史锚四类未生效计数为零,判读力由本腿承担)。 - [ ] 跑 `python tools/run_all_gates.sh --docs` 确认写卡段文档域闸绿,回执记入实现报告。 ### T1 撤玩家侧逐行文字(1–1.5 日) @@ -97,7 +98,7 @@ - [ ] 在 `row_pacer.gd:83-101` 移除 `log_view.append_row(row)`、`log_view.append_bb(...)`、`log_view.finish_settlement_round()` 三处调用,保留 `:89-101` 其余 FX 调用与 `refresh_request.call()`。 - [ ] 在 `row_pacer.gd` 移除 `log_view: BattleLogView` 句柄声明与组合根注入面,保留 `stage`/`board_zone`/`settlement_fx`/`board_view` 四个句柄。 -- [ ] 在 `main.gd` 移除 `_start_adventure`/`_resume_from_menu` 的 `ui.battle.log_view.clear()` 与 `wire_battle` 相关文字接线,`_on_step_row` 的清图奖励 toast 保留。 +- [ ] 在 `main.gd` 移除 `_start_adventure`/`_resume_from_menu` 的 `ui.battle.log_view.clear()` 调用(:252/:300);`wire_battle`(:408-412)唯一调用方在 `main_debug_flow.gd`、不在本批改动面,不动;`_on_step_row` 的清图奖励 toast 保留。 - [ ] 定 `battle_log_view.gd` 去留并落实现:视图壳整体退役或只保留挖掘期摘要位,二选一以「B 区结算期零文字节点」为准,改动写进实现报告。 - [ ] 从真实入口(停手→结算)跑 `battle_log_zero_text_test.gd:_smoke_settle_zero_rows`,断言结算期 B 区 `RichTextLabel` 行文本为空且无逐行追加,读数写进本步提交信息。 @@ -107,7 +108,7 @@ - [ ] 在 `playtest_logger.gd:136-143` 从 `line` 去掉 `"text"`,并在 `:140-142` 平铺循环里跳过 `display_name`,其余字段与 payload 一行不减。 - [ ] 定义 `REASON_ENUM` 四个取值:`full_layers`/`full_hp`/`no_enemy_alive`/`hero_down`,只在本卡定义一次。 -- [ ] 在 `damage_controller.gd:623-624`/`reward_grant.gd:269-271`、`:362-369`/`combat_segment.gd:123-124`/`grant_segment.gd:103`、`:321` 的 `reward_ineffective` 行 extra 各补一个 `reason` 键,取值按现文案对号入座。 +- [ ] 在 `damage_controller.gd:623-624`(调用方 :483/:508 均传「无存活敌人」)、`reward_grant.gd:269-271`(满层)、`:362-364`(主角已倒下)、`:366-369`(满血)、`combat_segment.gd:123-124`(主角已倒下)、`grant_segment.gd:321`(满血)的 `reward_ineffective` 行 extra 各补一个 `reason` 键,取值对号入座即 `REASON_ENUM`。**`grant_segment.gd:103` 不补**——封印作废行「奖励作废(封印格直接挖开)」四类枚举无对应文案,且该行块 :102-104 随同迭代后行批「封印动作改版批」整块删除;分析器对缺 `reason` 行落「其他」桶,与改前该行分类一致,R4 等价不受影响。 - [ ] 从真实入口(开新局→真实结算→落盘 JSONL 读回)跑 `playtest_logger_step_fields_test.gd:_assert_no_text_and_full_payload`,断言 `step` 行无 `text`/`display_name`、且 `type`/`source`/`cell`/`round`/`value`/`highlight` 与全部 payload 键集与改前逐位一致。 ### T3 分析工具、测试与探针正面化(0.75–1 日) @@ -118,8 +119,8 @@ - [ ] 在 `:189`/`:434` 把 `"全体敌人" in r.get("text","")` 改读 `r.get("target") == "all_enemies"`。 - [ ] 在 `:471-478` 把未生效原因分类由 `text` 子串改读 `s.get("reason")`,四类取值与 `REASON_ENUM` 一一对应。 - [ ] 把 `theme_projection_test.gd:_smoke_battle_log_view`/`player_copy_sweep_test.gd:_sweep_source_names`/`ui_probe.gd:133-135`/`ui_click_probe.gd:423`、`:473`、`:616`、`:798-844` 的旧文字断言改写为退役后的正向断言(例:结算期零行文本、来源标签从数据表读而非从行文本读),逐条登记进测试削弱申报表。 -- [ ] 同步 `game/tests/README.md:135` 能力行为退役后口径。 -- [ ] 对同一份历史锚与一份新日志各跑一次 `tools/analyze_playtest.py`,判读结论与 T0 基线逐位一致,读数写进本步提交信息。 +- [ ] 批末核对 `game/tests/README.md:137`/`:138` 两条能力行(写卡段已入表)与实际落地名实一致(改名则回表走写卡段通道);实现批禁写该文件(第 4 节 🔴5)。 +- [ ] 判读等价三读数:①对 T0 两份基线日志(历史锚+改前同种子日志)各复跑一次 `tools/analyze_playtest.py`,结论与各自 T0 基线逐位一致(兼容分支等价);②同种子复放采改后新日志跑一次,结论与 T0 改前同种子日志基线逐位一致(同种子+第 4 节 🔴4 玩法零改动=事件流逐位同)。读数写进本步提交信息。 ### T4 批末验收与产出物落位(0.5 日) @@ -134,13 +135,13 @@ | 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 | |---|---|---|---|---|---|---| -| R1 结算期零逐行文字(design/ux/battle.md:157) | `battle_log_view.gd:87-103`/`row_pacer.gd:83-101`/`main.gd:417-425` | `battle_log_zero_text_test.gd:_smoke_settle_zero_rows`(新增,落在表现层单元套件) | 单元+探针 | 真实停手→轮末结算→读 B 区场景树与 `RichTextLabel` 行文本 | `step_row` 消费后 `RichTextLabel.append_text` 调用计数=0、parsed_text 空;不绑终屏态 | 新增:结算期零逐行文字与 FX 排播链保持 | -| R2 FX 与 toast 链不断(design/ux/battle.md:297) | `row_pacer.gd:89-101` 保留 | `pacing_queue_test.gd:_assert_fx_chain`(既有套件扩断言)+`standee_fx_sweep_test.gd:_init` | 单元+集成 | `step_row`→`row_pacer`→`stage.on_step_row_fx`/`settlement_fx` | `on_step_row_fx`/`play_damage_number`/`play_projectile` 调用计数与改前逐位一致 | 新增:结算期零逐行文字与 FX 排播链保持 | +| R1 结算期零逐行文字(design/ux/battle.md:199) | `battle_log_view.gd:87-103`/`row_pacer.gd:83-101`/`main.gd:417-425` | `battle_log_zero_text_test.gd:_smoke_settle_zero_rows`(新增,落在表现层单元套件) | 单元+探针 | 真实停手→轮末结算→读 B 区场景树与 `RichTextLabel` 行文本 | `step_row` 消费后 `RichTextLabel.append_text` 调用计数=0、parsed_text 空;不绑终屏态 | 新增:结算期零逐行文字与 FX 排播链保持 | +| R2 FX 与 toast 链不断(design/ux/battle.md:347) | `row_pacer.gd:89-101` 保留 | `pacing_queue_test.gd:_assert_fx_chain`(既有套件内新增断言函数——套件文件已存在)+`standee_fx_sweep_test.gd:_init` | 单元+集成 | `step_row`→`row_pacer`→`stage.on_step_row_fx`/`settlement_fx` | `on_step_row_fx`/`play_damage_number`/`play_projectile` 调用计数与改前逐位一致 | 新增:结算期零逐行文字与 FX 排播链保持 | | R3 日志零文案、字段不缺(design/gdd/systems/战斗循环/战斗结算.md:73) | `playtest_logger.gd:136-143` | `playtest_logger_step_fields_test.gd:_assert_no_text_and_full_payload`(新增) | 单元+集成 | `start_session`→真实结算→落盘 JSONL 读回 | 落盘 `step` 行键集:`type`/`source`/`cell`/`round`/`value`/`highlight`+全部 payload 与改前一致,且无 `text`/`display_name` | 新增:日志 step 行零文案与结构化判读等价 | -| R4 分析判读等价(design/engineering/test-conventions.md:133) | `tools/analyze_playtest.py:83-88`/`:189`/`:434`/`:471-478` | `analyze_parity_check.py`(新增,落在 `tools/`) | 工具/集成 | 同一份 `sim-data/` 历史锚+一份新日志各跑一次判读 | `eff_counts`/`reward_dmg`/未生效分类计数字典与 T0 基线逐位一致 | 新增:日志 step 行零文案与结构化判读等价 | +| R4 分析判读等价(design/engineering/test-conventions.md:133) | `tools/analyze_playtest.py:83-88`/`:189`/`:434`/`:471-478` | `analyze_parity_check.py`(新增,落在 `tools/`) | 工具/集成 | T0 两份基线日志复跑+同种子改后新日志配对判读 | 复跑读数与 T0 基线逐位一致;改后新日志读数与改前同种子基线逐位一致(配对腿——未生效分类判读力主要在此腿,现行历史锚四类计数为零) | 新增:日志 step 行零文案与结构化判读等价 | | R5 未生效原因结构化(design/gdd/systems/战斗循环/战斗结算.md:80) | 四处 `reward_ineffective` 发射点 extra 补 `reason` | `reward_ineffective_reason_test.gd:_assert_four_reasons`(新增,落在结算域单元套件) | 单元 | 真实结算产生满层/满血/无存活敌人/主角已倒下四类未生效行→`step_row` 载荷 | `step_row` 载荷 `reason` 键取值四类逐一命中,不绑终态结算结果 | 新增:日志 step 行零文案与结构化判读等价 | -**测试削弱申报**:随文字列表退役需改写的旧断言=`theme_projection_test.gd:_smoke_battle_log_view`、`player_copy_sweep_test.gd:_sweep_source_names`、`ui_probe.gd:133-135`、`ui_click_probe.gd:423`/`:473`/`:616`/`:798-844`、`pacing_queue_test.gd:165` 的文字呈现部分。一律改写为退役后的正向断言,**不删除、不放宽阈值、不缩小扫描面**;实现期出现未申报的删除断言由独立验收审计判红。 +**测试削弱申报**:随文字列表退役需改写的旧断言=`theme_projection_test.gd:_smoke_battle_log_view`、`player_copy_sweep_test.gd:_sweep_source_names`、`ui_probe.gd:133-135`(折叠态断言)、`ui_click_probe.gd:423`/`:473`/`:616`/`:798-844`、`pacing_queue_test.gd:108-120` 的文字呈现部分。一律改写为退役后的正向断言,**不删除、不放宽阈值、不缩小扫描面**;实现期出现未申报的删除断言由独立验收审计判红。 **独立验收审计**:`reports/iter-验收审计-<日期>.md`,由未参与实现的会话或子代理执行,未过不得合并。 @@ -153,7 +154,7 @@ ## 12 代拍板白名单 1. 新增测试函数命名与落点(须落在第 7 节列出的既有套件/工具目录)。 -2. `battle_log_view.gd` 视图壳整体退役 vs 只留挖掘期摘要位,以「结算期 B 区零文字节点」为判据自判,结论写进实现报告。 +2. `battle_log_view.gd` 视图壳整体退役 vs 只留挖掘期摘要位,以「结算期 B 区零文字节点」为判据自判,结论写进实现报告;**选整体退役时须同批处置 `main_adventure_flow.gd` 的五处叙述行 `log_view.append_bb` 调用(:65/:70/:75/:88/:170)迁置**(该分支改动面随结论登记进实现报告;选「只留摘要位」则这些调用不动)。 3. `reason` 四个枚举键在四个发射点的写法(照现役 `_emit_row` extra 模式,不新增helper)。 超出以上三项一律呈报。 @@ -175,8 +176,16 @@ | 未生效原因缺统一结构化字段 | 补写 | 补进 T2/R5,定义 `REASON_ENUM` 四个取值 | | 验收对照表列名与 2026-10-24/10-28 两裁冲突 | 补写 | 第六列改「判据绑定面」,内容全改正向断言与改前改后对照 | | req-card 第〇步「标题带设计面=标记」与现行 §12.1 模板冲突 | 补写 | 按现行规约,闭合凭据以用户裁定+`08-Alpha版本标准.md` v1.29 为准,第 2 节写明 | +| 【轮 2·卡修批 2026-11-07】跨卡冲突:T2 六处发射点中 `grant_segment.gd:103` 是封印作废行「奖励作废(封印格直接挖开)」——四类 `REASON_ENUM` 无对应文案,且该行块 :102-104 随同迭代后行批「封印动作改版批」整块删除 | 补写 | §3/T2 剔除 :103(注明不补缘由);四类 reason 各另有独立归属点,R5 不受影响;分析器对缺 `reason` 行落「其他」桶,与改前该行分类一致,R4 等价不破 | +| 【轮 2·卡修批】R4 新日志腿缺改前采集——T0 只对历史锚出基线,「新日志结论与 T0 基线逐位一致」照字面不可执行(新日志与历史锚是两局内容) | 补写 | T0 增「改前同种子日志采集+判读基线」步(sim 采集链 headless 可产:`level_autoplay.gd` 挂 `logger.start_session(seed)`);T3 改三读数(历史锚复跑+改前日志复跑+同种子改前改后配对);§1 完成定义④与 R4 行同步改写 | +| 【轮 2·卡修批】T3「同步 game/tests/README.md:135 能力行」撞本卡 🔴5(实现批禁写 README),且 :135 旧行已被写卡段删除、新能力行 :137/:138 已在册 | 自判 | T3 改「批末核对 :137/:138 名实一致」;§6 表行与 §7 README 行同步改写 | +| 【轮 2·卡修批】R1/R2 判据出处 ux/battle.md :157/:297 与 §6 四锚 :157/:230/:304 失位——封印预览节(:130-170)插入后下移约 42 行,:157 现为预览 SVG 内字形文本 | 补写 | R1 锚改 :199、R2 锚改 :347、§6 改 :199/:272/:347(三处内容均已实读核实) | +| 【轮 2·卡修批】T1「移除 wire_battle 相关文字接线」措辞失实——`wire_battle`(main.gd:408-412)唯一调用方在 main_debug_flow.gd:99,不在两函数内 | 补写 | T1 改为只移除 :252/:300 的 `ui.battle.log_view.clear()` 调用 | +| 【轮 2·卡修批】白名单 2「整体退役」分支缺改动面——`main_adventure_flow.gd` 五处叙述行 `log_view.append_bb`(:65/:70/:75/:88/:170)未列入卡内文件清单 | 补写 | 白名单 2 补「整体退役分支须同批处置五处 append_bb 迁置」 | +| 【轮 2·卡修批】§8「新增文件只有过程件与新增测试函数」与 R4 新增 `tools/analyze_parity_check.py`+三个新测试文件自相矛盾 | 自判 | §8 改事实句(四件新增面点名落目录) | +| 【轮 2·卡修批】锚漂移三处:battle_log_view 上轮摘要/聚合计数实为 :72-84/:109-130(卡写 :146-264);pacing_queue_test 文字断言实为 :108-120(:165 是 PASS 打印行);ui_probe:133-135 为折叠态断言不读行文本 | 自判 | §3/削弱申报行号已改正;ui_probe 性质注记随 §3 行 | -零待裁点、零退回上游。 +零待裁点、零退回上游。轮 2(卡修批)八发现全处置——**卡片修订成立**。 **自审六查**:①规格覆盖——第 1 节五条完成定义逐条指到 T1..T4 与 R1..R5,无悬空;②步骤扫描——每步一个动作+一个可核查结果,无「TBD/酌情/适当优化」;③类型一致性——`REASON_ENUM` 四个取值在 T2 定义、T3 与 R5 逐字引用;④审查焦点+改动覆盖——最可能坑到玩家的失败模式=FX 链被误删(R2 兜)、分析判读静默失真(R4 兜)、日志丢 payload(R3 兜),文件结构图每个行为改动都有对照表行;⑤篇幅比例——本卡以签名、取值、断言名为主,未抄函数体;⑥落位与复用——第 8 节三问逐条答完,零新增视图/服务/工具,与第 7 节「复用既有」标注一致。 diff --git a/待办清单.md b/待办清单.md index c9a11371..17bd0eba 100644 --- a/待办清单.md +++ b/待办清单.md @@ -147,6 +147,13 @@ **状态**:待文档设计 +#### 结算明细文案入表(2026-11-07 登记,来源=批次移交) + +**实况**:结算期文字列表退役批([需求卡片](reports/需求卡片-结算期文字列表退役批-2026-11-07.md),已编迭代 56)落地后,剩余玩家可见文案(清图奖励/Boss 解锁技名等 toast 与明细行显示名)的承载面换代——文案从代码字面量迁数据表,与 [战斗结算](design/gdd/systems/战斗循环/战斗结算.md) v1.9 :87「显示名等玩家可见文案是数据面字段」对齐。 +**缺口**:还差一次文档设计讨论——入哪张表、哪些文案入表、日志零文案后 toast 文案的承载形态。 +**改动面**:文档+游戏代码 +**状态**:待文档设计 + #### UI 贴图重构批——元进度件仍是程序化占位(2026-10-13 登记,来源=审计发现) **实况**:元进度图标目前仍是程序化画出来的占位形态,没有上贴图(原登记见 [美术资产清单](design/art/art-assets-checklist.md))。规格已定——烛光黄 `#F6C667` 配木色 `#8A5A34`(见 [美术圣经](design/art/art-bible.md) §4.4),素材来源允许走"通用图标改色复用"低成本渠道。营地柜台贴图义务已随营地场景图形态终结(见 [camp](design/ux/camp.md))。本条余元进度件贴图终稿,排 Beta。