Merge branch 'master' into board-material-fix
# Conflicts: # reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md
This commit is contained in:
commit
d3018a5948
174 files changed
+2682
-970
No files matched your search
@@ -0,0 +1,123 @@
|
||||
# 交接:棋盘材质回退与浮空数字修正(2026-11-09)
|
||||
|
||||
> 性质:会话交接过程稿,供下一次会话接着干;结论被吸收后按「中间产物吸收即死」退役。
|
||||
> 状态:**未提交、未合回**;三关材质预览已生成,**等用户目检确认**。
|
||||
> 主工作区:`D:/code/g-plan2`(本文件所在,本会话只写了本件与 `reports/2026-11-09-棋盘材质预览.html`)
|
||||
> 改动工作区:`D:/code/g-plan2-board-material-fix`(分支 `board-material-fix`,全部改动未提交)
|
||||
> 迭代实现工作区:`D:/code/g-plan2-iter57`(分支 `iter57`,本会话未触碰)
|
||||
|
||||
---
|
||||
|
||||
## 1. 本会话所做工作的当前状态
|
||||
|
||||
### 1.1 起点与已定结论
|
||||
|
||||
- 迭代 57「棋盘瓦片与立体表现重做」实现中断。原因:需求卡片把用户过审的 C 方向(连续岩顶图/连续地面贴图+浮空数字)写成了「程序化材质」;用户从未裁过程序化材质。
|
||||
- 2026-11-09 用户裁定:回到原本方式——**贴图材质+程序化结构**。已按此改卡、改文档、出材质与预览。
|
||||
- 材质与结构分工:岩顶/地面 = 无缝贴图(按整板全局坐标一次铺图,禁逐格重置);崖面/临空边缘/受光棱/内阴影/投影/层序 = 程序化绘制。
|
||||
|
||||
### 1.2 已完成(全部在 `board-material-fix` 工作区,未提交)
|
||||
|
||||
**需求卡片**:`reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md`
|
||||
|
||||
- §2 上游已裁:明确用户裁的是画面外观,不含程序化材质;材质=无缝贴图、结构=程序化。
|
||||
- §4-2、§5:改回贴图口径;新增 T-A(6 张材质制作与验收);T3 增材质加载与材质/结构分界测试;T6 保留「6 张新材质在库、旧 `terrain_*` 63 件退役」;T7 预览图作渲染测试黄金基线。
|
||||
- §16 增两行:第七轮(材质实现回退)、第八轮(浮空数字几何);卡片状态行同步;估时 9.5→11.0 个工作日(T-A 0.5/T3 2.5/T7 1.5)。
|
||||
- 第八轮新增硬口径(本次预览暴露、实现会重犯):
|
||||
- 字高 21 = **字形墨高**(不含描边);渲染字号取使墨高=21 的值(现行融合像素字体 27 号 → 墨高 21),`FONT_H` 仍记 21 作墨高/矩形高。
|
||||
- `draw_string`/`draw_string_outline` 的 `pos` 是**基线**,一律传 `rect.position + Vector2(0, FONT_H)`(矩形底边),禁把矩形顶当绘制原点。
|
||||
- `_label_rect` 行 y 用**步距 `(格边+2)`**,禁按 `c.y × 格边`(逐行漂移 2px)。
|
||||
- 引导线 2px 双色自格顶 −12 连续落到 +4,线底接阴影圆上缘;圆 10×6、圆心格顶 +7、小人之下。
|
||||
|
||||
**设计文档**(同工作区)
|
||||
|
||||
- `design/art/art-bible.md`:版本 v3.51→v3.52;§8.1 改「岩顶/地面材质取无缝贴图,崖面、临空边缘、投影等结构件程序化绘制」;§1.4 第一验收项改「正式地形贴图资产开工前」;§8.5「材质归模型、结构归程序」保留不动。
|
||||
- `design/art/asset-path-map.md`:`board/` 行改为 6 张 `board_rock_<board_type>.png`/`board_ground_<board_type>.png`+`seal_mark.png`;旧 `terrain_*` 63 件退役。
|
||||
- `design/art/art-assets-checklist.md`:「棋盘改程序化材质」→「棋盘改贴图材质」;§3.3 状态改贴图+程序化结构。
|
||||
- `design/ux/battle.md`、`design/gdd/08-Alpha版本标准.md`、`待办清单.md`:art-bible 引用 v3.51→v3.52。
|
||||
|
||||
**材质与预览**(`D:/code/g-plan2/artwork/`,该目录 gitignored)
|
||||
|
||||
- `2026-11-09-棋盘方案C回收/`:从归档会话找回的 C 方向原稿 13 张 PNG+5 份 HTML(用户当时过审的画面依据)。
|
||||
- `2026-11-09-棋盘材质候选/`:
|
||||
- 6 张候选无缝材质:`board_rock_{dungeon,underdark,deep_underdark}.png`、`board_ground_{...}.png`;均 128×128、≤32 色。
|
||||
- 三关整板预览:`board_preview2_{dungeon,underdark,deep_underdark}.png` 与合并图 `board_preview2_three_levels.png`(12×8、格边 46、间距 2、LIFT 20、ESHIFT 5,画布 630×438)。
|
||||
- 生成器:`render_preview3.py`(旧版 `render_preview.py`/`render_preview2.py` 留作对照)。
|
||||
- 浮空数字已修正:线—圆连续;数字墨底距格顶 15、墨高 21;阴影圆 10×6 在格顶+7;数字与引导线最顶、阴影圆在小人之下。三关预览已按此重生成。
|
||||
|
||||
**渲染黄金基线**(`board-material-fix/game/tests/golden/`,未提交的新文件)
|
||||
|
||||
- `board_material_L1.png`、`_zoom2`、`_digit6`、`_hero4`、`_top4`:从 `artwork/2026-11-09-棋盘方案C回收/` 复制,作为 T7 的目检黄金基线。
|
||||
- 注意:这 5 张是**C 方向原稿**,不是本次 `board_preview2_*` 材质稿。新材料稿是否另立黄金基线,等用户确认后再定。
|
||||
|
||||
**验证读数**
|
||||
|
||||
- `python tools/pipeline_gate.py`(`board-material-fix` 工作区):PASS(37 条目 / 57 行 / 2 链 / 4 卡全过)。
|
||||
- 本会话未改游戏代码,未跑游戏测试、探针、渲染闸。
|
||||
|
||||
### 1.3 明确未做
|
||||
|
||||
- 未 `git commit`、未 `git merge`、未 `git push`(用户 2026-11-09 明确要求)。
|
||||
- 未把 6 张材质拷入 `game/assets/art/board/`,未生成 `.import`(asset-ingest 等用户确认预览)。
|
||||
- 未改 `iter57` 工作区的任何代码;其已知缺陷见 §4。
|
||||
- 未重制三关 golden 基线,未跑渲染闸。
|
||||
|
||||
---
|
||||
|
||||
## 2. 预览 HTML
|
||||
|
||||
- 文件:`reports/2026-11-09-棋盘材质预览.html`(主工作区)
|
||||
- 自包含:三关整板预览、2 张数字/引导线/阴影圆细部(4×)、6 张 128×128 材质,全部 base64 内嵌;双击即可打开。
|
||||
- SHA256:`61df9a23d094a294cb652c636a780a2bf6b72f1b7a656eee9ed39451fe928949`
|
||||
- 内容对应的磁盘产物:`artwork/2026-11-09-棋盘材质候选/board_preview2_three_levels.png` 等。
|
||||
|
||||
---
|
||||
|
||||
## 3. 关键几何(预览、卡片、art-bible §3.2 已对齐)
|
||||
|
||||
| 项 | 值 |
|
||||
|---|---|
|
||||
| 格边/间距/步距 | 46 / 2 / 48 |
|
||||
| 岩顶抬升 | LIFT 20、ESHIFT 5;顶面 rect = 格矩形左上偏移 (−5,−20)、边长 46 |
|
||||
| 浮空数字 | 墨高 21、字底距格顶 15、视觉顶距格顶 38;2px 深墨描边 `#1A140E`+1px 浮空投影;字芯暖白 `#F0E2C8` |
|
||||
| 引导线 | 2px 双色竖线,左深 `#1A140E`/右浅 `#E8D3AB`;自格顶 −12 连续落到 +4 |
|
||||
| 阴影圆 | 10×6,圆心 = 横向格心、格顶 +7;四层同心椭圆 α 40/70/105/140,尺寸 100/80/60/40% |
|
||||
| 层序 | 地面 → 投影 → 阴影圆(小人之下)→ 按脚底 y 排序的深度对象(岩体/小人)→ 顶面贴花与交互(随所属格件分档)→ 浮空数字+引导线(最顶) |
|
||||
| 预览构图 | 12×8、外白边 28;墙格掩码与绘制细节见 `render_preview3.py` |
|
||||
|
||||
---
|
||||
|
||||
## 4. 下次会话的待办顺序
|
||||
|
||||
1. **用户目检预览**(`reports/2026-11-09-棋盘材质预览.html`):材质、构图、浮空数字/引导线/阴影圆。未点头前不动游戏资产。
|
||||
2. 用户确认后:按 asset-ingest 把 6 张材质录入 `game/assets/art/board/`,生成 `.import`,补 art-bible 条款与素材状态清单。
|
||||
3. 恢复迭代 57(`iter57` 工作区)T-A/T3/T7:
|
||||
- T3:材质经 `UiKit.load_tex` 加载,`_tex_rock`/`_tex_ground` 按整板 UV 铺图;新增 `_test_material_assets_present`、`_test_material_vs_structure`。
|
||||
- T6:确认旧 `terrain_*` 63 件退役、6 张新材质在库。
|
||||
- T7:`board_shot_probe` 12×8/46 复刻样张;三关 golden 换代;渲染闸复闸。
|
||||
4. **修 `iter57` 浮空层四处实现缺陷**(本会话已定位,未改代码):
|
||||
- `board_float_layer.gd:65,67,68`:`draw_string`/`draw_string_outline` 的 pos 传的是 `rect.position`(矩形顶),实为基线 → 数字整体上浮 21px、与引导线分离;改传 `rect.position + Vector2(0, FONT_H)`。
|
||||
- `board_float_layer.gd:83`:`_label_rect` 的 y 用 `* _cell`,未用步距 → 每行漂移 2px;改 `* (_cell + 2)`(与 `_draw` 的线、`board_label_shadow_layer` 的圆同式)。
|
||||
- `board_float_layer.gd:8`:`FONT_H=21` 当作字号传入,实际墨高 17;按卡片第八轮口径改用使墨高=21 的渲染字号(现行字体 27),`FONT_H` 保留 21 作墨高/矩形高。
|
||||
- `board_float_layer.gd:73-74`:深色线画在 `gx−2..gx−1`、浅色线画在 `gx..gx+1`,中间空 1px;改为深色 `gx−1`、浅色 `gx`,形成连续 2px。
|
||||
5. 三关实机截图目检:数字与线相接、线底接圆、无长线悬空;顶行数字不裁切;小人遮阴影圆、不遮数字与线。
|
||||
6. 独立验收审计(`test-conventions §8.7`)→ 合回(`git merge --no-ff`,pre-merge 钩子跑前置检查)→ 远端 CI 按需现查。
|
||||
|
||||
---
|
||||
|
||||
## 5. 文件清单(本次涉及)
|
||||
|
||||
| 文件 | 状态 |
|
||||
|---|---|
|
||||
| `board-material-fix/reports/需求卡片-棋盘瓦片与立体表现重做批-2026-11-07.md` | 已改,未提交 |
|
||||
| `board-material-fix/design/art/art-bible.md` | 已改(v3.52),未提交 |
|
||||
| `board-material-fix/design/art/asset-path-map.md` | 已改,未提交 |
|
||||
| `board-material-fix/design/art/art-assets-checklist.md` | 已改,未提交 |
|
||||
| `board-material-fix/design/ux/battle.md` | 已改(版本引用),未提交 |
|
||||
| `board-material-fix/design/gdd/08-Alpha版本标准.md` | 已改(版本引用),未提交 |
|
||||
| `board-material-fix/待办清单.md` | 已改(版本引用),未提交 |
|
||||
| `board-material-fix/game/tests/golden/board_material_L1*.png`(5 张) | 新增,未提交 |
|
||||
| `artwork/2026-11-09-棋盘方案C回收/`(13 PNG+5 HTML) | 已找回,gitignored |
|
||||
| `artwork/2026-11-09-棋盘材质候选/`(6 材质+预览+生成器) | 已生成,gitignored |
|
||||
| `reports/2026-11-09-棋盘材质预览.html` | 本件配套,未提交 |
|
||||
| `reports/2026-11-09-交接-棋盘材质与浮空数字修正.md` | 本件,未提交 |
|
||||
@@ -0,0 +1,18 @@
|
||||
<style>
|
||||
body{margin:0;background:#17130e;color:#f0e2c8;font:15px/1.7 "Microsoft YaHei",sans-serif}
|
||||
.wrap{max-width:1200px;margin:0 auto;padding:28px 20px 60px}
|
||||
h1{font-size:24px;margin:0 0 6px}h2{font-size:18px;margin:30px 0 10px;color:#f2c14e}
|
||||
p{color:#b9a582;margin:6px 0}
|
||||
.row{display:flex;gap:14px;flex-wrap:wrap}
|
||||
figure{flex:1 1 300px;margin:0;background:#221c15;border:1px solid #3a2f22;border-radius:10px;padding:10px}
|
||||
figure img{width:100%;display:block;image-rendering:pixelated;border-radius:4px}
|
||||
figcaption{color:#b9a582;font-size:13px;text-align:center;margin-top:8px}
|
||||
.tex{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
|
||||
footer{color:#8f7d5f;font-size:12px;margin-top:30px;border-top:1px solid #3a2f22;padding-top:10px}
|
||||
</style><div class=wrap>
|
||||
<h1>棋盘材质效果预览(浮空数字已按条款重画)</h1>
|
||||
<p>岩顶/地面=无缝贴图;崖面/临空边缘/投影/层序=程序化结构。浮空数字:墨高 21、字底距格顶 15、2px 深墨描边+1px 浮空投影;引导线 2px 双色自格顶−12 连续落到 +4;阴影圆 10×6、圆心格顶+7,位于小人之下。</p>
|
||||
<div class=row><figure><img src="data:image/png;base64,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 truncated
|
||||
<h2>浮空数字细部(4×)</h2><div class=row><figure><img src="data:image/png;base64,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 truncated
|
||||
<h2>无缝材质(128×128,≤32 色)</h2><div class=tex><figure><img src="data:image/png;base64,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"><figcaption>岩顶 dungeon</figcaption></figure><figure><img src="data:image/png;base64,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 truncated
|
||||
<footer>文件目录:artwork/2026-11-09-棋盘材质候选/ · 整板预览:board_preview2_three_levels.png</footer></div>
|
||||
@@ -0,0 +1,27 @@
|
||||
# 复核报告——测试面四项收口批(2026-11-10)
|
||||
|
||||
复核对象:reports/需求卡片-测试面四项收口批-2026-11-10.md
|
||||
复核者:只读子代理(general-purpose,未参与卡片撰写);形态=对抗复核一轮,禁改文件、禁跑测试。
|
||||
工作区:D:/code/g-plan2-testface-closure(worktree,基点 0f686900)。
|
||||
|
||||
## 审点结论
|
||||
|
||||
1. 验收三问(V1–V5):真实入口均走第二段 push_click_at/push_click→_submit_choice→route_chosen→组合根,不绕改动点;判据绑定面绑被测特有提交面。两条观察:equal_width 腿 enable 态空转风险(自判,钉值腿兜底);V5 注记改动可观测面=capability_audit 内容锚核验(非行为改动,机检兜底成立)。
|
||||
2. F1–F13 实读对账:全部属实,零漂移。
|
||||
3. 预检 vs 结构图:新增文件零、新增函数三均落 ui_struct_probe.gd,不能复用理由与唯一落点在案。零发现。
|
||||
4. 预算:返回出口计数「两」与 T2 三返回不符(自判,改「三」);余数字核实。
|
||||
5. 拆分边界:三单元各有职责与单一变化原因,adventure 拆二/legend 自包含的不对称有据。零发现。
|
||||
6. 引擎 4.7.2 三查:push_input/InputEventMouseButton press+release/custom_minimum_size/Array.find/await 均有库内实证;push_click_at 成对不踩焦点钉死;钉值用 custom_minimum_size.x、等宽用 size.x 区分正确;探针非热路径。零发现。
|
||||
7. 契约可执行性:C-2 与 T1–T4 自洽;begin_session(true) queue_free 旧 run_scope 重开成立(main.gd:112-118/:295);真输入段 isolate_save 三参未显式钉(补写)。
|
||||
8. 能力表:README 新增两行与卡能力行格、T2 函数名逐字一致。零发现。
|
||||
9. 判据锚:三锚按 anchor_util 口径手工核全 PASS(节名命中标题行、关键词落节块内)。
|
||||
|
||||
## 发现清单(3 条 actionable)
|
||||
|
||||
| 卡内位置 | 发现 | 去向 | 依据 | 处置 |
|
||||
|---|---|---|---|---|
|
||||
| §14 预算 | 「两返回出口」与 T2 三返回不符 | 自判 | 卡 T2 真点段三步 | 改「三返回出口」,已落卡 |
|
||||
| T2 真输入段步骤 | isolate_save 三参未显式钉 | 补写 | ui_struct_probe.gd:219、ui_click_probe.gd:615 | 补确切调用 (main, tag, true, false, true),已落卡 |
|
||||
| V2/V4 equal_width 腿 | 停手钮 disabled 时排除出组致该腿空转 | 自判 | ui_struct_probe.gd:710/:791-792 | 不改判据(钉值腿兜底);T4 报告步骤补 enable 态读数义务,已落卡 |
|
||||
|
||||
无待裁、无退回上游。结论:卡片设计闭合、判据锚与能力表名实相符,复核通过。
|
||||
@@ -0,0 +1,161 @@
|
||||
# 需求卡片:全局特殊间隔闸批(2026-11-09)
|
||||
|
||||
> 来源:待办清单「全局特殊间隔旋钮」条目(2026-10-18 登记)。
|
||||
> 验收档:高(数值表结构校验+敌人出招行为随结算传播)。
|
||||
> 来源:设计事实源见下节(唯一事实源声明)。
|
||||
|
||||
## 1. 目标与完成定义
|
||||
|
||||
给敌人加**特殊技公共冷却**(全局特殊间隔闸):任一特殊技兑现后,该敌接下来 K 拍只能执行普通攻击——堵死「不同大招背靠背接力」(现行各技能自己的冷却只堵同招连发)。
|
||||
|
||||
完成定义(全部满足才算完):
|
||||
|
||||
1. 技能表新字段 `special_interval`(全局单旋钮,域 [0,99],0=关闭)在 schema 域校验与 `skills.tres` 行值两处落位,K=1。
|
||||
2. 敌人实例带间隔闸计数,闸期内特殊技不进可摇集合与保底集合(双面过滤,保底顺延)。
|
||||
3. 验证闸对照表 A1–A8 全部在当轮真实跑批执行并通过;代码域闸全绿。
|
||||
4. 同种子回放契约保持(新行为下逐位复现);EV 锚按新行为换代。
|
||||
|
||||
## 2. 设计事实源
|
||||
|
||||
`design/gdd/systems/战斗循环/敌人系统.md` v2.0「三道闸」表(全局特殊间隔行)+同文档「调参表」`special_interval` 行+同文档「验收标准·池节奏」;投值所有权=`design/gdd/systems/冒险循环/难度曲线与Boss.md` v1.8「调参表」特殊间隔 K 行。与待办清单条目闭合凭据一致(该条目状态=文档设计已闭合+已写卡)。
|
||||
|
||||
三裁点已随设计闭合裁死(用户 2026-11-09 批准在案,卡内不再开裁):**K=1**;**每敌独立计数**(全部敌人含 Boss);**双面过滤+保底顺延**。
|
||||
|
||||
## 3. 现状事实(开工自行复核)
|
||||
|
||||
- 开轮摇号主体在 `game/core/settlement/round_cycle.gd:91` `roll_round_actions(ri)`——逐存活敌:可摇集合(`units.rollable_skills`)→ 保底判定(`basic_streak >= pity_m` 时 `special_skills` 非空则整体替换)→ `SkillLottery.draw` 取号(behavior_roll 流,每敌每轮恰一次)→ 末尾 `tick_cooldowns()`(递减在摇号读值之后)。
|
||||
- 可摇集合过滤在 `game/core/unit_container.gd:227` `rollable_skills`——条目级排除触发条件不满足(`_entry_blocked`)与冷却中(`cooldown_left <= 0` 判断)。保底集合在 `game/core/unit_container.gd:242` `special_skills`——type≠basic 全部非锁定条目,不受冷却限制(注释明示「锁定条目双面过滤」先例)。
|
||||
- 执行上报在 `game/core/unit_container.gd:300` `commit_action`——按 `cooldown_beats` 置 `cooldown_left`(施放行),普攻 `basic_streak +1`/特殊技归零;摇定后兑现前死亡不经本方法=作废不进账。
|
||||
- 冷却递减在 `game/core/unit_container.gd:324` `tick_cooldowns`——时序口径(`:320` 注记):摇号按当前值排除、递减在其后=「施放后连续 N 拍不可摇中」的等价实现。间隔闸计数沿用同一时序口径。
|
||||
- 实例状态初始化在 `game/core/unit_container.gd` `_spawn_rowset`(`basic_streak = 0` 同点);保底读数 `basic_streak` 在 `:289`。
|
||||
- 表值:`game/data/tables/skills.tres` `pity_threshold = 4`;schema 在 `game/data/schemas/skill_table.gd`(`@export var pity_threshold: int = 4`,域校验 [1,99] 越域报 category=domain 止动,同函数即本卡新增校验的落点)。
|
||||
- ConfigDB 装配单点在 `game/core/config_db.gd`(`combat.skill` 整容器挂载)——新表字段零装配改动。
|
||||
- 既有测试面:`game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd`(`_smoke_skill_pool` 总入口、`_smoke_skill_pool_data` 表数据面、`_smoke_skill_pool_replay_independence` 同种子回放、`_smoke_skill_pool_ev_anchor` 5000 拍 EV 对锚〔内含保底替换逻辑复刻〕、`_smoke_skill_pool_death_void`、`_smoke_skill_pool_validation_reject`);`trigger_cond_test.gd`(保底不逼条件不满足技);`skill_unlock_test.gd`(保底不逼锁定技)。系统测试与探针无敌人出招节奏断言(`skill_rhythm_probe.gd`/`rhythm_batch.gd` 为零断言取数件,不在本卡面)。
|
||||
|
||||
## 4. 设计契约(违反即返工)
|
||||
|
||||
- 🔴 **双面过滤**:闸期内特殊技不进可摇集合、也不进保底集合——保底禁止逼出闸中技;闸期内保底集合可为空,保底不兑现、顺延到闸后满 M 首拍。
|
||||
- 🔴 **数值单点**:K 只存 `skills.tres` `special_interval`,经 ConfigDB 单点读;禁数值字面量、禁自建 load 路径。
|
||||
- 🔴 **随机零新增**:不加随机源、不改取号次数(每敌每轮恰一次 behavior_roll);过滤发生在取号前的集合组装面。同种子回放契约=新行为下逐位复现(旧种子轨迹因行为换代不续用,属预期换代非回归)。
|
||||
- 🔴 **两计时器独立**:`special_lock` 与各条目 `cooldown_left` 互不读写;死亡作废(未经 commit_action)不进闸、不清闸。
|
||||
- 🔴 **Core 零 UI**:改动全部落在 core/数据层与单元测试;零呈现面、零场景改动。
|
||||
- 🔴 **fail-fast**:`special_interval` 越域 [0,99] 加载期 domain 错误止动,无软回退。
|
||||
|
||||
## 5. 范围边界
|
||||
|
||||
做什么:上列 T0–T3。不做什么:呈现面(不碰);MC/verifier 重跑(读数类不属改完即测域,是否重测全冒险期望=合回后用户按 MC 档位表裁);池权重/冷却/倍率重投值(EV 重锚仅指测试锚换代,投值调参归难度曲线批);术语表增删(无新术语)。明示不收件去向:实测节奏读数需求归 `skill_rhythm_probe.gd`/`rhythm_batch.gd` 既有取数件,不在本卡。
|
||||
|
||||
## 6. 关联文档同步面
|
||||
|
||||
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 |
|
||||
|---|---|---|
|
||||
| `design/gdd/systems/战斗循环/敌人系统.md` | 「三道闸」表与「调参表」special_interval 行(v2.0 已落文) | 设计权威文档——实现批禁直改;实现与条款失配→列 `reports/iter<N>-反哺点-<日期>.md` 由用户裁决后归文档批 |
|
||||
| `design/gdd/systems/冒险循环/难度曲线与Boss.md` | 「调参表」特殊间隔 K 投值行(v1.8 已落文) | 同上 |
|
||||
| `game/tests/README.md` | 能力表增行「全局特殊间隔闸」 | 本写卡批已随卡增行(机械面);实现批禁写,批末只核对表上名字与实际落地一致 |
|
||||
| `待办清单.md` | 「全局特殊间隔旋钮」条目状态 | 流水线面——实现批禁写;实现批完成入库后按退役规则整条删除(归收尾段) |
|
||||
|
||||
## 7. 卡前·文件结构图(全部既有件,零新增文件)
|
||||
|
||||
| 文件 | 职责 | 改动性质 |
|
||||
|---|---|---|
|
||||
| `game/data/schemas/skill_table.gd` | 技能表 schema:加 `special_interval` 字段与域校验 | 行为改动(A4、A5) |
|
||||
| `game/data/tables/skills.tres` | 技能表行值:`special_interval = 1` | 行为改动(A1 全部行为的表值源) |
|
||||
| `game/core/unit_container.gd` | 实例闸计数与双面过滤(rollable/special_skills/commit/tick/初始化) | 行为改动(A1、A2、A3) |
|
||||
| `game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd` | 新增节奏断言、数据面与校验扩展、EV 锚换代 | 行为改动(A1–A7 的测试面) |
|
||||
| `game/tests/README.md` | 能力表增行(本写卡批已做) | 非行为改动 |
|
||||
|
||||
## 8. 任务卡
|
||||
|
||||
估时总计 ≈1.75 个工作日(区间 1.5–2.0)。T 卡间接口:T1 产出 `special_lock` 实例键与双过滤行为(T2/T3 取用);T0 产出表字段与读数路径(T1 的 `db.combat.skill.special_interval` 取用)。
|
||||
|
||||
### T0 表与 schema(0.25d)
|
||||
|
||||
- [ ] `skill_table.gd` 加 `@export var special_interval: int = 1`(pity_threshold 同区;注释一行口径:全局特殊间隔 K——任一特殊技兑现后该敌连续 K 拍只能执行普通攻击,0=关闭;provisional 归难度曲线与Boss)。
|
||||
- [ ] `_validate_table_invariants` 加域校验:`special_interval` 出 [0,99] → `{"category": "domain", ...}` 止动(pity 同款句式)。
|
||||
- [ ] `skills.tres` `[resource]` 区加 `special_interval = 1`(pity_threshold 行下)。
|
||||
- [ ] `_smoke_skill_pool_data` 扩展:断言 `db.combat.skill.special_interval == 1`(表实一致读数面)。
|
||||
- [ ] 验证步:直跑单元套件(`--script res://tests/run_all.gd`)全绿,读数记录。
|
||||
|
||||
### T1 实例闸(0.5d)
|
||||
|
||||
- [ ] 实例创建处(`_spawn_rowset` 内 `basic_streak = 0` 同点)增 `special_lock = 0` 初始化。
|
||||
- [ ] `rollable_skills`:`int(u.get("special_lock", 0)) > 0` 时,非 basic 条目跳过(type 经 `db.combat.skill.row_by_id` 查——`special_skills` 同款查法);签名为既有签名零改。
|
||||
- [ ] `special_skills`:lock>0 时返回空数组(含注释一行:闸中特殊技不进保底集合——保底顺延)。
|
||||
- [ ] `commit_action`:`srow.type != "basic"` 分支置 `u.special_lock = int(db.combat.skill.special_interval)`;普攻分支不动 lock。
|
||||
- [ ] `tick_cooldowns`:逐敌 `u["special_lock"] = maxi(0, int(u.get("special_lock", 0)) - 1)`(与池条目冷却递减同轮同点)。
|
||||
- [ ] 验证步:直跑单元套件全绿,读数记录。
|
||||
|
||||
### T2 节奏断言(0.5d)
|
||||
|
||||
- [ ] 新增 `_smoke_skill_pool_interval_gate`:真实入口 `BattleOrchestrator.begin_battle()` → `roll_round_actions()`。**夹具钉死**:单敌实例、池=恰一普攻+恰一无条件特殊技、且该特殊技 `cooldown_beats = 0`(排除冷却混淆归因——无闸时背靠背才机制可能,有闸时交替的排除唯一来自闸)。调试接口设 `pity_threshold = 1`、`special_interval = 1`:断言执行行序列严格「特殊技/普攻」逐拍交替(保底每拍触发+闸强制普攻的合成节奏);再设 `special_interval = 0`:断言出现背靠背特殊技(连续两拍 special)=旧口径等价(种子与权重按本文件既有种子狩猎惯例定)。判据绑定面=行动执行行的 skill_id 逐拍序列(单特殊技池 → id 级确定)。测试毕恢复表值。
|
||||
- [ ] 新增 `_smoke_skill_pool_interval_pity`:`pity_threshold = 4`、`special_interval = 6`:断言特殊技兑现后 6 拍内零特殊技(其中 streak≥4 的拍保底不兑现)、第 7 拍保底兑现出特殊技。判据绑定面同上;表值直改收尾恢复(凡直改共享表值的测试函数一律收尾恢复——泄漏即污染同套件下游读数)。
|
||||
- [ ] 每敌独立断言(并入 `_smoke_skill_pool_interval_gate`):双实例同池(同 T2 首条钉死的零冷却池),容器 API 对 u1 先 `set_pending_action(u1, 特殊技 id)` 再 `commit_action`(无 pending 则 commit 空转——前置必写),断言 u1 可摇集合排除特殊技、u2 可摇集合含特殊技。
|
||||
- [ ] `_smoke_skill_pool_validation_reject` 扩展:`special_interval` 越域(−1 与 101 两例)加载期 domain 止动断言。
|
||||
- [ ] `_smoke_skill_pool_death_void` 扩展:摇定后兑现前死亡作废拍后断言 `special_lock` 保持 0(死亡作废不进闸)。
|
||||
- [ ] 验证步:直跑单元套件全绿,读数记录。
|
||||
|
||||
### T3 锚换代与收尾(0.5d)
|
||||
|
||||
- [ ] `_smoke_skill_pool_ev_anchor`:测试内保底替换复刻补 lock 过滤(与实现同口径);5000 拍重锚——新阈值按新行为实测读数推导(换代申报见「测试削弱申报」节)。
|
||||
- [ ] `_smoke_skill_pool_replay_independence` 复闸:观测窗覆盖保底与间隔闸共存段,同种子逐位复现绿。
|
||||
- [ ] 里程碑步(T 段)出口跑一次全套代码域闸;波内修复只做出红最小单元的最窄确认。
|
||||
- [ ] 产出物落位卡:轻闸全绿后、合并前写齐 `reports/iter<N>-实现报告-<日期>.md`(各卡状态+实机目检总清单〔本批零呈现面,目检清单登记「无」〕+遗留读数义务+实现决定记录)与 `reports/iter<N>-反哺点-<日期>.md`(同步面四条的落点逐条交代:两份 GDD 本卡批已落文无需同步、README 已增行、待办清单归收尾段删除)。
|
||||
|
||||
## 9. 验证闸(改动—验收对照表)
|
||||
|
||||
| # | 需求点(含判据出处锚) | 改动(文件/行为) | 验收测试(名称+落点) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| A1 | 兑现后 K 拍强制普攻、K=0 等价旧口径——`design/gdd/systems/战斗循环/敌人系统.md「技能池:每敌种一张带权技能池,每拍开轮摇号出招」全局特殊间隔 | `unit_container.gd` rollable/commit/tick+`skills.tres` 表值 | `round_flow_skill_pool_test.gd:_smoke_skill_pool_interval_gate` | 单元 | `BattleOrchestrator.begin_battle()` → 开轮摇号(调试接口 pity=1 配 K=1 与 K=0 两档;夹具零冷却单特殊技池) | 行动执行行 skill_id 逐拍序列(交替/背靠背两判据;单特殊技池 id 级确定) | 新增:全局特殊间隔闸 |
|
||||
| A2 | 保底顺延(闸期不兑现、闸后满 M 首拍兑现)——`design/gdd/systems/战斗循环/敌人系统.md「技能池:每敌种一张带权技能池,每拍开轮摇号出招」保底顺延 | `unit_container.gd` special_skills 排空+保底替换路径 | `round_flow_skill_pool_test.gd:_smoke_skill_pool_interval_pity` | 单元 | 同上(调试接口 pity=4 配 K=6) | 执行序:兑现后 6 拍零特殊技、第 7 拍保底兑现 | 新增:全局特殊间隔闸 |
|
||||
| A3 | 每敌独立计数——`design/gdd/systems/战斗循环/敌人系统.md「调参表」special_interval | per-instance `special_lock` | `_smoke_skill_pool_interval_gate` 内独立断言 | 单元 | `UnitContainer` 容器 API(commit→rollable 对照) | 双实例可摇集合返回差异 | 新增:全局特殊间隔闸 |
|
||||
| A4 | 越域加载期止动——`design/gdd/systems/战斗循环/敌人系统.md「调参表」special_interval | `skill_table.gd` 域校验 | `_smoke_skill_pool_validation_reject` 扩展 | 单元 | 表加载校验链(ConfigDB 装载) | category=domain 错误+止动 | 既有:技能池数据面与回放独立 |
|
||||
| A5 | 表实一致(字段在库、读数路径通)——`design/gdd/systems/战斗循环/敌人系统.md「调参表」special_interval | `skills.tres`+`skill_table.gd` | `_smoke_skill_pool_data` 扩展 | 单元 | `BattleOrchestrator.begin_battle()` 表读数 | `db.combat.skill.special_interval == 1` | 既有:技能池数据面与回放独立 |
|
||||
| A6 | 同种子回放契约保持——`design/gdd/systems/战斗循环/敌人系统.md「验收标准」摇号确定性 | 全部改动面 | `_smoke_skill_pool_replay_independence` 复闸 | 单元 | `begin_battle()` 同种子双跑 | 逐实例摇定轨迹逐位相同 | 既有:技能池数据面与回放独立 |
|
||||
| A7 | EV 锚随行为换代——`design/gdd/systems/冒险循环/难度曲线与Boss.md「调参表」特殊间隔 | 行为换代→测试内期望复刻同步 | `_smoke_skill_pool_ev_anchor` 重锚 | 单元 | `begin_battle()` 5000 拍模拟 | 复刻期望与模拟频率对锚通过 | 既有:技能池数据面与回放独立 |
|
||||
| A8 | 死亡作废不进闸——`design/gdd/systems/战斗循环/敌人系统.md「验收标准」死亡即不动手 | 作废路径零 lock 副作用 | `_smoke_skill_pool_death_void` 扩展 | 单元 | `begin_battle()`(摇定后兑现前击杀路径) | 作废拍后 `special_lock == 0` | 既有:技能池数据面与回放独立 |
|
||||
|
||||
测试方式两分法:A1–A7 全部走调试接口直改表值(能力验证),无正常流程体验项;实机目检登记「无」(零呈现面)。
|
||||
|
||||
**测试削弱申报**:`_smoke_skill_pool_ev_anchor` 对锚阈值换代(行为换代所致,断言形态不变)——此外零删零宽。
|
||||
|
||||
**独立验收审计**:入口=未参与实现的会话或子代理;报告落 `reports/iter<N>-验收审计-<日期>.md`;未过不得合并。验收档=高(审计深度按 test-conventions §8.7 高档执行)。
|
||||
|
||||
**回归措辞**:里程碑步(T 段)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增测试先行孤立验证再并入全套。
|
||||
|
||||
## 10. 异常分级
|
||||
|
||||
- **L1 自救**:断言夹具表值恢复遗漏、测试函数内变量遮蔽之类自净问题——当场修,读数进提交信息。
|
||||
- **L2 记录继续**:EV 重锚一次不中(实测读数与推导偏差)——按读数修正推导再锚,连续 3 次不中升 L3。
|
||||
- **L3 停机呈报**:①闸语义与 GDD 条款失配(退回上游);②机检预算互斥=上游缺陷停卡退回写卡段;③保底×间隔时序出现设计未预见的死锁形态(保底永不兑现类)——停机写报告等用户。
|
||||
|
||||
## 11. 代拍板白名单
|
||||
|
||||
测试夹具的池配置(池构成纪律内的最小池);断言消息文案;EV 锚新阈值的具体推导取值(按实测读数);闸内代码注释措辞;提交信息措辞。超清单决定记入实现报告「实现决定记录」节。
|
||||
|
||||
## 12. 待裁点
|
||||
|
||||
零待裁点,开工门=U0。三裁点(K=1/每敌独立/双面过滤+保底顺延)已随设计段闭合由用户裁死(2026-11-09 计划批准在案),卡内不再重开。
|
||||
|
||||
## 13. 落位与可复用性预检
|
||||
|
||||
- **新增面清点**:零新增文件;新增 schema 字段 1 个(`special_interval`)、实例字典键 1 个(`special_lock`)、单元测试函数 2 个。
|
||||
- **复用面**:字段落点复用 `pity_threshold` 同区同款(全局单旋钮先例);实例闸计数复用 `basic_streak`/`cooldown_left` 的实例字典键与「commit 置值→tick 递减→摇号读值排除」既有三段式时序(`:320` 注记口径),不新增计时器机制——**为什么不是复用冷却本身**:冷却按技能行条目计,堵不住异名接力(本闸语义恰是跨条目),实例级单键是唯一落点。
|
||||
- **唯一面**:K 读数只在 `db.combat.skill.special_interval` 一处定义、`skills.tres` 一处存值;`special_lock` 读写集中在 `unit_container.gd` 四处(init/rollable+special_skills 过滤/commit 置值/tick 递减),无第二落点。
|
||||
- **分层与交互面**:改动全在 core 与数据层——ConfigDB 单点取值、零 UI、零事件、随机消费面不变(RngService/SkillLottery 零触碰);测试经既有 `begin_battle()` 真实装配链驱动。
|
||||
|
||||
## 14. 实现规范预算
|
||||
|
||||
零新增文件,新件三查不适用。存量触面:`skill_table.gd`(+1 export、+1 校验分支)、`unit_container.gd`(rollable +1 分支、special_skills +1 早退、commit +1 分支、tick +1 行、init +1 键)——增量均在 gdstyle 默认阈值内,S13 键较登记值只降不升预期;测试文件新增 2 函数(单函数分支 ≤8 内)。
|
||||
|
||||
## 15. 复核记录
|
||||
|
||||
| 轮次 | 复核者 | 发现 | 去向 | 处置结果 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | 只读子代理(未参与撰写) | 锚 8 行全实读命中、现状 file:line 全对、时序推演严格等价(K=1 恰覆盖下拍/M4+K6 第 7 拍兑现/死亡路径零触碰 lock)、引擎面三查过、落位预算自洽 | 自判 | 核实为真,零改 |
|
||||
| 1 | 同上 | A1 双臂缺「夹具特殊技冷却=0」前提——K=0 臂机制不可能绿、K=1 臂排除归因被冷却混淆 | 补写 | T2 首条钉死夹具(恰一普攻+恰一无条件特殊技、cooldown_beats=0);A1 绑定面补「单特殊技池 id 级确定」 |
|
||||
| 1 | 同上 | A3 双实例对照受冷却冒领风险;commit 前置 set_pending_action 未写明 | 补写 | T2 独立断言条补零冷却夹具与 pending 前置 |
|
||||
| 1 | 同上 | `_interval_pity` 直改共享表值缺恢复义务(泄漏污染同套件下游) | 补写 | T2 补「凡直改共享表值的测试函数一律收尾恢复」 |
|
||||
| 1 | 同上 | K=0 臂背靠背是种子/权重依存非结构保证 | 自判 | 不改——种子狩猎=本文件既有惯例且在代拍板白名单,实现期定 |
|
||||
| 1 | 同上 | 回放观测窗可能整窗零特殊技(闸未被行使) | 自判 | 不改——种子狩猎惯例可解,T3 义务在卡 |
|
||||
| 1 | 同上 | A4/A5 真实入口措辞与直构 validate/直读 db 惯例有出入 | 自判 | 不改——既有单元面惯例内,语义不失真 |
|
||||
| 1 | 同上 | A7 锚行与 EV 重锚义务有语义距离(重锚落文在相邻表行) | 自判 | 不改——锚词命中节内、所有权读法成立 |
|
||||
@@ -0,0 +1,262 @@
|
||||
# 需求卡片——刷新经济改版批
|
||||
|
||||
> 来源:待办清单「刷新门槛调整与两件储能秘宝」条目(唯一事实源:design/gdd/systems/排雷循环/行动经济.md v1.8 §核心规则「停手与储备行动点」「挖掘期刷新」+design/gdd/systems/跨局循环/秘宝.md v1.5 §目录(重设计 v1)储能件两行)
|
||||
> 验收档:高(经济入账+冒险级账本随断点写读+数值表结构校验——失败代价随存档与结算传播)
|
||||
> 估时:2–3.25 个工作日(中值 2.625);超 3.25 日软盒预挂=T1 冒险级账本落点与断点往返不对齐时停机呈报,不扩面自救
|
||||
|
||||
## 1. 目标与完成定义
|
||||
|
||||
把「遇推理死路时几乎换不了图」改成能换:刷新价格降到每轮预算的一半;储备点不再随战斗结束清零,整局冒险保留、只有弃图刷新消耗、冒险收束清零;新增两件储能秘宝(每关开始 +4 储备点/挖开安全格或封印标中 +1 储备点,做错了不给)。
|
||||
|
||||
完成定义:
|
||||
- V1–V10 验收行全部在真实跑批中执行并通过;N1/N2 非行为改动行写明判断依据;生产表加载零新增 error。
|
||||
- 四件需求点各有判据绑定面:刷新扣费按表值、储备点跨战回写与断点往返、关首注入、正确动作产储备点。
|
||||
- 代码域闸按改动域选档全绿;独立验收审计(高档)通过;reports/ 两份产出物落齐;能力表新增行在场。
|
||||
|
||||
## 2. 设计事实源
|
||||
|
||||
design/gdd/systems/排雷循环/行动经济.md v1.8:
|
||||
- :84 储备池生命周期「以一整局冒险为界……只有弃图刷新会消耗它,冒险收束时清零」。
|
||||
- :92 基线节拍「刷新门槛按每轮预算的一半设定,半轮停手够刷一次,满预算停手够刷两次」。
|
||||
- :277 调参表 rap_refresh_cost 行(按每轮预算的一半设定)。
|
||||
- :296 验收标准「储备点整局冒险保留,战斗结束不清零」;:299「冒险收束信号到达后归 0,且界面可见」。
|
||||
- :146 第五条行为说明(清图不需要跟弃图比收益)——本批不改该条,仅作为「门槛降低不改变清图定位」的边界。
|
||||
|
||||
design/gdd/systems/表现与支撑/存档序列化.md::180「断点域契约:写读往返逐位一致」(V7 锚);:57 局内资源持久化归属登记要求列第 6 节反哺点。
|
||||
|
||||
design/gdd/systems/跨局循环/秘宝.md v1.5:
|
||||
- :44 开局储备(代号)「每个关卡开始时储备点 +4(够一次刷新)」。
|
||||
- :45 推演储能(代号)「挖开安全格或封印标中时储备点 +1」。
|
||||
- :47 两件边界「按正确结果给……可叠加;开局储备只在关卡开始注入一次」(V8 锚:正确结果=排除错误结果)。
|
||||
- :228 效果声明形态「卡面效果摘要=行 `desc_key` 经 strings.csv 取文案(code-conventions §2.5)」——两件新秘宝行文案面按 display_key/desc_key 落(code-conventions §2.5「数据表文案字段更名 display_key/desc_key」;文案值住 game/data/l10n/strings.csv,行内零文案字面)。
|
||||
|
||||
design/gdd/systems/排雷循环/行动经济.md v1.8::100 矿脉储能「连锁展开只随首格的一次付费动作结算,不逐格追加」(V9 锚,本批沿用先例)。
|
||||
|
||||
会话裁决沿革查 git 提交 750b491b(用户四案裁断:8→4/整局保留/每关 +4/做对了才给)。
|
||||
|
||||
## 3. 现状事实(开工自行复核)
|
||||
|
||||
- F1 刷新价现值 8:game/data/tables/action_economy.tres:10 `rap_refresh_cost = 8`;:7 `ap_per_round = 8`;:11 `refresh_cap_per_round = 2`。表注释 :19-20「默认 = ap_per_round,满停一轮 = 恰好一刷基线节拍……若有意解耦须单独立批」、:25-26 同义。
|
||||
- F2 表默认值 6 与表值不一致:game/data/schemas/action_economy_table.gd:10 `@export var rap_refresh_cost: int = 6`;域检查 :24 `[1,64]`;跨字段检查 :33 只覆盖 dig_ap_cost/seal_place_ap_cost,无「刷新价 = 每轮 AP」硬绑定。
|
||||
- F3 RAP 池在 ActionEconomy:game/core/action_economy.gd:28 `var _rap := 0`、:29-30 只读 getter;注入 :195 `func grant_reserve_ap(n: int) -> void`;停手转存 :202-204 `finish_round_stop(transfer_pct)`;刷新扣费 :211-219 `request_refresh(cost_override)` 按 :215 表值取价。
|
||||
- F4 战斗结束清零唯一生产点:action_economy.gd:267-274 `notify_combat_end()`,:272 `_rap = 0`;调用方 game/core/battle_orchestrator.gd:585(`:563 _battle_over`)。
|
||||
- F5 冒险桶现成且随断点:game/core/adventure_runner.gd:23 `adventure_counters: Dictionary`(跨战持久);game/core/level_runner.gd:539 `"adv_bucket": _adv_bucket` 下传同一引用;game/core/breakpoint_store.gd:38 `"adventure_counters": {"strategy": "keep_on_null"}`、:123 快照 `counters.duplicate(true)`。断点 28 键无 rap 键(:16-45),续玩桶回填经 game/core/adventure_runner.gd:168-170 `resume_adventure` 计数器回填(breakpoint_store.gd:144-147 `restore_ledger` 只回填 stats/wallet/journal,不涉桶)。
|
||||
- F6 关首注入面现成:battle_orchestrator.gd:379-390 `_begin_battle_preview_economy(enc)`(:388-390 凭证 RAP 注入);:368 `int(enc.get("battle_index", 1)) == 1` 为每关首战判定;level_runner.gd:543 `"battle_index": _battle_index()`、:544 `"voucher_rap"`。
|
||||
- F7 两件新秘宝的数据承载:game/data/tables/treasure_items.tres:18 `rows = [{`、:224 `}]`(12 件);game/data/schemas/treasure_item_table.gd:23-32 `EFFECT_KINDS` 封闭枚举(无「关卡开始」类 kind)、:121-122 passive 行 triggers 与 effect_kinds 禁并存、:108/:123 转交 `EffectEngine.validate_trigger_row`。
|
||||
- F8 正确结果事件:game/core/effect_engine.gd:12-18 `EVENTS`(`dig_reveal`/`seal_hit`/`mine_hit`/`seal_missed` 在册,无「关卡开始」事件);:51 `EFFECT_KINDS` 含 `grant_reserve_ap`;发射点 game/core/settlement/grant_segment.gd:105 `dig_reveal`(:97 注释「本函数只受理真实揭示的 safe 事件」)、:355 `seal_hit`;错误侧 :149 `mine_hit`、:430 `seal_missed`。grant_segment.gd:25 已有 `action_economy: ActionEconomy` 成员(:43 解包)。
|
||||
- F9 `grant_reserve_ap` 现役唯一消费点:action_economy.gd:114 `_port.emit("dig_paid", …)` → :125-126 累加 rap_gain → :101 入池(feats.tres:887-890 矿脉储能挂 dig_paid)。`dig_reveal`/`seal_hit` 的 hits 目前无 RAP 转译。
|
||||
- F10 测试与能力面:game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd:151 `_smoke_active_refresh`、:190 按表值断言扣费;refresh_feats_test.gd:345 `test_no_feats_baseline`、:306 `test_refresh_discount_gate_and_charge`;game/tests/unit/core/treasure_effects_test.gd:31 装配生效、:44-47 未装配零扰动(:44-45 参数零读数/:46-47 首轮零命中);game/tests/unit/core/feat_vouchers_test.gd:61 储备金袋 +3、:134-139 断点往返;game/tests/run_all.gd:221/:222/:232/:236 套件登记 expect=0;game/tests/README.md「测试层级」能力行「AP 扣费、末点耗尽即收轮与战斗收束清零」:125、「停手转存储备与轮内刷新」:126、「换图基座:挖格产 RAP 与刷新折扣」:130、覆盖域行:232。
|
||||
- F11 gdstyle 基线:tools/gdstyle_baseline.txt:8 `adventure_runner.gd|max-class-variables = 23`、:9-10 `level_runner.gd|max-class-variables = 30`/`max-public-methods = 33`;action_economy.gd/battle_orchestrator.gd/grant_segment.gd/treasure_item_table.gd 均无键(默认阈值内)。
|
||||
|
||||
## 4. 设计契约(违反即返工,🔴 触碰=L3 停机呈报)
|
||||
|
||||
- 🔴 C1 刷新价唯一落 action_economy.tres,产品码只经 `db.run.action_economy.rap_refresh_cost` 读取(battle_refresh_flow.gd:44、action_economy.gd:215);禁在产品码读取路径与测试断言写死 4 或 8(schema 缺省声明面随表值同步除外,测试只读 `db.run.action_economy.rap_refresh_cost`)。
|
||||
- 🔴 C2 储备点的冒险级账本唯一落 `adventure_counters["rap"]`(F5);禁新增第二个 RAP 持有者、禁在 adventure_runner.gd/level_runner.gd 新增类变量(F11 基线已超阈,新增即升键)。
|
||||
- 🔴 C3 战斗结束不清零;冒险收束清零;断点随 adventure_counters 自动写读,禁另立断点顶层键。
|
||||
- 🔴 C4 推演储能只挂 `dig_reveal`/`seal_hit`(做对了才给);禁挂 `mine_hit`/`seal_missed`/`dig_paid`,禁把错误结果算进 RAP。
|
||||
- 🔴 C5 开局储备只在每关首战(battle_index==1)注入一次,注入量读行内 magnitude;不改停手转存率与刷新折价判据(秘宝.md「普通档」两件储能件的代号)。
|
||||
- 🔴 C6 数值表结构、RNG 单点、Core 零 UI 依赖不变;禁删既有断言、禁放宽阈值;本卡测试削弱申报=V18 白板档计数换代一项(§9 表下申报——护栏语义零削弱)。
|
||||
- 🔴 C7 连锁展开只随首格的一次付费动作结算,不逐格追加(沿用 design/gdd/systems/排雷循环/行动经济.md「换图系专长对储备与刷新的改写」矿脉储能 矿脉储能先例);`_reveal_safe` 只在 `channel=="dig"` 时转译 RAP hits,`channel=="chain"` 的格零转译。
|
||||
|
||||
## 5. 范围边界
|
||||
|
||||
做:表值与表注释;ActionEconomy 战斗收束语义改为回写冒险桶;关首注入;秘宝表两行(display_key/desc_key 文案形态)+schema 三处扩面(两词表+行键白名单+display_name 空判据迁移)+strings.csv 新建四键值+秘宝匣投影 key 解析+一个参数面 kind 词表项+grant_segment 的 RAP hits 转译;冒险收束清桶;单元断言扩展;能力表两行(写卡段同批)。
|
||||
|
||||
不做(明示去向):
|
||||
- 条款⑤行为说明、SVG 两条路图、GDD/ux 文档面——文档设计段已落文,实现批禁写 design/ 与根规则文件;机械面描述差异列第 6 节反哺点。
|
||||
- 秘宝两件的正式命名、最终档位与解锁阈值——GDD 标 provisional 归调参批;本批按现役普通档同款 `unlock_keystone_cost = 10` 作 provisional 占位(treasure_items.tres:95 同款),不定案。
|
||||
- 每轮刷新上限 2、停手转存率 1:1、省力周转半价、矿脉储能 +1——全部不动。
|
||||
- 全冒险期望(蒙特卡洛)采集与难度带重扫——无数值改动窗口授权,不属本批;如日后要做另行登记。
|
||||
- 断点 28 键清单不变(RAP 借 adventure_counters 桶随快照,不新增顶层键)。
|
||||
|
||||
## 6. 关联文档同步面
|
||||
|
||||
| 文档 | 关联点 | 同步义务 |
|
||||
|---|---|---|
|
||||
| design/gdd/systems/跨局循环/秘宝.md v1.5 :44 | 效果实现列写「订阅行 关卡开始→grant_reserve_ap(4)」,框架 EVENTS 无「关卡开始」事件;实现改为参数面 kind + 关首注入面 | 列反哺点,由文档批落文(改实现形态描述,玩法规则不动) |
|
||||
| design/gdd/systems/跨局循环/秘宝.md v1.5 :45 | 效果实现列写订阅行;实现另需 grant_segment 两处 hits 转译 | 列反哺点,由文档批落文(补消费点一句) |
|
||||
| design/gdd/systems/跨局循环/秘宝.md v1.5 :28/:224/:228/:239 | 「普通档 9 件/现行 14 件」已按本批定稿写就;实现落表后无条文变化 | 无同步义务(实现核对行数一致即可) |
|
||||
| game/tests/README.md 能力表 :126/:130/:232 | 写卡段同批新增两条能力行;覆盖域行补新能力名 | 覆盖域表更新列反哺点,由文档批落文(能力表本体写卡段维护,实现批禁写) |
|
||||
| design/gdd/systems/排雷循环/行动经济.md v1.8 | 条文已定稿(价格/寿命/验收标准),实现照条文落地 | 无同步义务(实现核对条文一致即可) |
|
||||
| design/gdd/systems/表现与支撑/存档序列化.md :36/:57/:181 | 现条文「局内数值的持久化:无」「若未来某局内资源要开放跨战斗携带(如储备行动点),须修订池规则并向本系统登记持久化归属,禁止静默超域」;本批 RAP 借 adventure_counters 随断点写读即属该登记面 | 列反哺点,由文档批落文(登记 RAP 持久化归属/修订 :57 措辞),实现批禁写该文档;未落文前不静默超域 |
|
||||
| design/gdd/systems/跨局循环/秘宝.md v1.5 :45 | 现条文只写正向「挖开安全格或封印标中时 +1」;「错误结果不产 RAP」「连锁不逐格追加」两句规格句缺席(V8/V9 取 :47 与 行动经济.md「换图系专长对储备与刷新的改写」矿脉储能 推得) | 列反哺点,由文档批落文(补两句规格句),实现批禁写该文档 |
|
||||
| design/ux/battle.md、interaction-patterns.md | 文档设计段已把 RAP−8 改 RAP−4、清零时点改冒险收束 | 无同步义务 |
|
||||
|
||||
## 7. 文件结构图(卡前定分解)
|
||||
|
||||
| 文件 | 职责 | 新增/复用 | 行为改动→验收行 |
|
||||
|---|---|---|---|
|
||||
| game/data/tables/action_economy.tres | rap_refresh_cost 8→4+表注释解耦说明 | 复用既有 | 是→V1 |
|
||||
| game/data/schemas/action_economy_table.gd | 缺省值 6→4(消漂移,域不变) | 复用既有 | 否(缺省面) |
|
||||
| game/core/action_economy.gd | notify_combat_end 去清零改回写冒险桶;新增 `set_adventure_bucket(bucket: Dictionary) -> void` | 复用既有(扩展) | 是→V2/V3 |
|
||||
| game/core/battle_orchestrator.gd | begin_battle 传桶引用;_begin_battle_preview_economy 注入 carry_rap 与关首 +4 | 复用既有(扩展) | 是→V2/V4 |
|
||||
| game/core/adventure_runner.gd | _settle 清 adventure_counters["rap"]=0(字典键赋值,零新增成员) | 复用既有 | 是→V3 |
|
||||
| game/data/schemas/treasure_item_table.gd | EFFECT_KINDS/MAGNITUDE_KINDS 扩 `level_start_rap_grant`;KEY_WHITELIST 扩 display_key/desc_key 两键(:50-53);display_name 空判据迁移「至少一方非空」(:89-90) | 复用既有(扩词表/白名单) | 否(词表/白名单/判据面→N2) |
|
||||
| game/data/tables/treasure_items.tres | 新增 level_start_rap / correct_action_rap 两行(display_key/desc_key 文案形态) | 复用既有(增 2 行) | 是→V4/V5/V6 |
|
||||
| game/data/l10n/strings.csv | 新建文案单点文件(表头 key,zh_CN)+两件新秘宝四键值 | 新增 | 否(文案数据面) |
|
||||
| game/project.godot | internationalization/locale/translations 追加 strings.csv 导出的 zh_CN 翻译资源(首建翻译注册面) | 复用既有(配置追加) | 否(加载注册面) |
|
||||
| game/core/meta_progression.gd | treasure_shop_status 两字段 key 解析(display_key/desc_key 优先经 tr()、存量 display_name/desc 字面回退,:108-109) | 复用既有(扩展) | 是→V10 |
|
||||
| game/tests/unit/data_config/table_structure_guard_test.gd | 秘宝 V18 白板档计数 12→14+投影两查(段内扩展,无新测试函数名) | 复用既有(扩展) | 测试件 |
|
||||
| game/core/settlement/grant_segment.gd | 新增 `_apply_rap_hits(hits: Array) -> void`,在 _reveal_safe/_judge_seal_hit 发射后调用 | 复用既有(扩展) | 是→V5/V6 |
|
||||
| game/tests/unit/battle_settlement/round_flow_skill_pool_test.gd | V1/V2/V3 断言扩展 | 复用既有(扩展) | 测试件 |
|
||||
| game/tests/unit/core/treasure_effects_test.gd | V4/V5/V6 断言扩展 | 复用既有(扩展) | 测试件 |
|
||||
| game/tests/unit/core/feat_vouchers_test.gd | V7 断点往返断言扩展 | 复用既有(扩展) | 测试件 |
|
||||
| game/tests/README.md | 能力表新增两行(写卡段同批) | 复用既有 | 否 |
|
||||
| reports/需求卡片-刷新经济改版批-2026-11-09.md | 本卡 | 新增(写卡段产出) | 否 |
|
||||
|
||||
## 8. 任务卡 T0..Tn
|
||||
|
||||
### T0 刷新价与表注释(估时 0.25–0.5 日,中值 0.375)
|
||||
|
||||
取用:无(首卡)。产出:`db.run.action_economy.rap_refresh_cost == 4`(T1–T3 只读)。
|
||||
|
||||
- [ ] action_economy.tres:10 改 `rap_refresh_cost = 4`;:19-20/:25-26 表注释改写为「按每轮预算的一半设定,解耦单独立批(本批即该批)」,删「默认=ap_per_round」不变式句(注释面,非 design/ 文档)。
|
||||
- [ ] action_economy_table.gd:10 缺省值 6→4,注释改「缺省与现行表值一致」;域 [1,64] 与跨字段检查零改动。
|
||||
- [ ] round_flow_skill_pool_test.gd 增断言 `_smoke_active_refresh` 内:`int(_db.run.action_economy.rap_refresh_cost) * 2 == int(_db.run.action_economy.ap_per_round)`(V1),真实入口=`BattleOrchestrator.player_request_refresh()`,判据绑定面=扣费后 `action_economy.rap` 等于 `rap_banked - 表值`(沿用 :190 既有断言,不重复写死数值)。
|
||||
- [ ] 孤立直跑该套件绿,读数写进本步提交信息。
|
||||
|
||||
### T1 储备点整局冒险保留(估时 0.75–1.25 日,中值 1.0)
|
||||
|
||||
取用:`db.run.action_economy.rap_refresh_cost == 4`(T0 定)。产出:`ActionEconomy.set_adventure_bucket(bucket: Dictionary) -> void`、`adventure_counters["rap"]: int`(T2/T3 引用逐字一致)。
|
||||
|
||||
- [ ] action_economy.gd 增成员 `var _adv_bucket := {}`(Dictionary 推断形态,现役 :36 `_port` 同款)与 `set_adventure_bucket(bucket: Dictionary) -> void`;`notify_combat_end()` 去 :272 `_rap = 0`,改为「桶为空字典时零扰动不回写、否则把 `_rap` 写回桶键 `"rap"`」(相位回 Idle/`_ap = 0` 不变,:117 既有相位断言不受影响)。
|
||||
- [ ] 回写完成即由下一场 `begin_battle` 经 carry 注入重建(本 ActionEconomy 实例每战新建、不复用,battle_orchestrator.gd:208/level_runner.gd:517);保留 `_rap` 只为当次回写读数,不承载跨战状态。
|
||||
- [ ] battle_orchestrator.gd `begin_battle(enc)` 在 `_begin_battle_preview_economy` 之前调 `action_economy.set_adventure_bucket(enc.get("adv_bucket", {}))`(enc 已带 adv_bucket,F6);空字典=单关模式零扰动。
|
||||
- [ ] `_begin_battle_preview_economy(enc)` 增:`var carry: int = int((enc.get("adv_bucket", {}) as Dictionary).get("rap", 0))`,carry>0 时 `action_economy.grant_reserve_ap(carry)`;与凭证 voucher_rap 注入同段、各自独立(凭证是节点级一次性,carry 是冒险级结余)。
|
||||
- [ ] adventure_runner.gd `_settle` 内(:437 起、:462 `close_wallet()` 邻域)增 `adventure_counters["rap"] = 0`;三结局共用该出口。
|
||||
- [ ] round_flow_skill_pool_test.gd 增 V2 断言:两场连续战斗(同一 adv_bucket 引用)后第二场起战 `action_economy.rap == 第一场结束 rap`。
|
||||
- [ ] feat_vouchers_test.gd 增 V7 断言:断点快照 `breakpoint_snapshot()["adventure_counters"]["rap"]` 与续玩后起战 rap 逐位相等(复用 :134-139 往返夹具)。
|
||||
- [ ] 孤立直跑两套件绿,再跑单元测试全套件确认零回归。
|
||||
|
||||
### T2 开局储备秘宝(估时 0.5–0.75 日,中值 0.625)
|
||||
|
||||
取用:T1 的 `set_adventure_bucket` 与桶键 `"rap"`。产出:`treasure_items.tres` 行 `level_start_rap`(display_key/desc_key 形态)、`EFFECT_KINDS` 项 `level_start_rap_grant`、strings.csv 键值对两枚。
|
||||
|
||||
- [ ] treasure_item_table.gd 结构面四处::31-32 EFFECT_KINDS 追加 `"level_start_rap_grant"`、:44-46 MAGNITUDE_KINDS 追加同词(否则 :154-167 因 magnitude=4 且无 triggers 报 cross_field,整表加载致命);:50-53 KEY_WHITELIST 追加 `"display_key"`/`"desc_key"` 两键(文案 key 形态行承载,code-conventions §2.5);:89-90 display_name 空判据迁移为「display_name 与 display_key 至少一方非空」(存量 12 行 display_name 在场零扰动,新行走 display_key——不迁移则新行加载致命);各一处追加/改判,不做条件判断(N2)。
|
||||
- [ ] treasure_items.tres 增行:`item_id="level_start_rap"`, `display_key="treasure.level_start_rap.name"`, `desc_key="treasure.level_start_rap.desc"`, `dimension_tags=["action"]`, `tier="common"`, `target="none"`, `magnitude=4`, `use_phase="active_dig"`, `form="passive"`, `slot_cost=1`, `unlock_keystone_cost=10`, `effect_kinds=["level_start_rap_grant"]`(文案形态=display_key/desc_key 经 strings.csv 取值——code-conventions §2.5、秘宝.md :228;行内零文案字面;禁挂 triggers,:121-122 互斥)。
|
||||
- [ ] 新建 game/data/l10n/strings.csv(表头 `key,zh_CN`)增两行:`treasure.level_start_rap.name`=开局储备、`treasure.level_start_rap.desc`=每个关卡开始时储备点 +4(够一次刷新)(文案值照 秘宝.md :44 代号与一句话 provisional;正式命名归用户);project.godot internationalization/locale/translations 追加该 CSV 导出的 zh_CN 翻译资源(首建翻译注册面——全仓现无 l10n 数据件与注册面,game/data/l10n/ 实查不存在);取文案只经 `tr()`(Object 在役方法,meta_progression 为 RefCounted 直调)。
|
||||
- [ ] meta_progression.gd:108-109 treasure_shop_status 两字段改 key 解析:`display_key`/`desc_key` 优先经 `tr()` 取值、行内无 key 回退存量 `display_name`/`desc` 字面(存量 12 行未迁移——迁移归文案批,本批零扰动);table_structure_guard_test.gd `_smoke_adventure_table` 秘宝 V18 段:白板档计数 `locked_n == 12` 换代 `== 14`(目录 12→14 随批,护栏语义不变)并增两查——level_start_rap 投影 display_name/desc 非空(key 解析生效读数)、reserve_jar 投影仍为存量字面(回退零扰动)。
|
||||
- [ ] `_begin_battle_preview_economy(enc)` 增:`if int(enc.get("battle_index", 1)) == 1: var grant := attune_param_sum("level_start_rap_grant"); if grant > 0: action_economy.grant_reserve_ap(grant)`(attune_param_sum 现役 :160;magnitude 经参数面汇总,禁写死 4)。
|
||||
- [ ] treasure_effects_test.gd 增 V4:装配 `level_start_rap` 起战(battle_index=1)rap==4、同一关第二战(battle_index=2)不再注入、未装配零扰动(照 :31/:44-47 形态)。
|
||||
- [ ] 孤立直跑该套件绿。
|
||||
|
||||
### T3 推演储能秘宝与正确结果转译(估时 0.5–0.75 日,中值 0.625)
|
||||
|
||||
取用:`adventure_counters["rap"]`、`treasure_items.tres` 行 `level_start_rap` 的头字段形态。产出:`treasure_items.tres` 行 `correct_action_rap`(display_key/desc_key 形态)、strings.csv 键值对两枚、`GrantSegment._apply_rap_hits(hits: Array) -> void`。
|
||||
|
||||
- [ ] treasure_items.tres 增行:`item_id="correct_action_rap"`, `display_key="treasure.correct_action_rap.name"`, `desc_key="treasure.correct_action_rap.desc"`, `magnitude=1`, `form="passive"`, `effect_kinds` 不写, `triggers=[{"on":"dig_reveal","do":{"kind":"grant_reserve_ap","value_from":"magnitude"}},{"on":"seal_hit","do":{"kind":"grant_reserve_ap","value_from":"magnitude"}}]`(数值唯一源=行内 magnitude,照 morning_order :25-41 形态;词表校验转交 EffectEngine.validate_trigger_row,F7/F8)。
|
||||
- [ ] strings.csv 增两行:`treasure.correct_action_rap.name`=推演储能、`treasure.correct_action_rap.desc`=挖开安全格或封印标中时储备点 +1(照 秘宝.md :45 代号与一句话 provisional)。
|
||||
- [ ] grant_segment.gd 增 `func _apply_rap_hits(hits: Array) -> void`:累加 hits 中 `kind=="grant_reserve_ap"` 的 `value`,>0 时调 `action_economy.grant_reserve_ap(total)`(:25 成员在案)。
|
||||
- [ ] `_reveal_safe`(:105 邻域)在 `dr_hits` 发射后仅当 `String(evt.get("channel", "dig")) == "dig"` 时调 `_apply_rap_hits(dr_hits)`(minesweeper_rules.gd:345-362 连锁格 channel="chain" 逐格发射,不调即不逐格追加);`_judge_seal_hit`(:355 邻域)在 `fh_hits` 发射后调一次;`mine_hit`/`seal_missed` 发射点不调。
|
||||
- [ ] treasure_effects_test.gd 增 V5:单次付费动作挖安全格 +1、标中 +1、踩雷与标空零增、未装配零扰动。
|
||||
- [ ] treasure_effects_test.gd 增 V6:与矿脉储能同装时挖安全格一次 +2(秘宝.md「普通档」两件储能件的代号 叠加边界)。
|
||||
- [ ] treasure_effects_test.gd 增 V9:连锁夹具(首格 dig + N 格 chain)后 rap 恰 +1(C7)。
|
||||
- [ ] 真实入口统一=`LevelRunner` 真实结算段经 `BattleOrchestrator` 装配链的 `dig_reveal`/`seal_hit` 发射;判据绑定面=`action_economy.rap` 增量。
|
||||
- [ ] 孤立直跑该套件绿,再跑单元测试全套件。
|
||||
|
||||
### T4 产出物落位卡(估时含于上四卡,批末执行)
|
||||
|
||||
- [ ] 按 `tools/run_all_gates.sh` 本批改动域选档跑绿+改前改后 S13 读数对拍(只降不升)。
|
||||
- [ ] reports/iter<N>-实现报告-<日期>.md 写齐:各卡状态+实机目检总清单(RAP 数字、刷新按钮代价文案、冒险收束清零反馈,登记不阻塞)+遗留读数义务+实现决定记录。
|
||||
- [ ] reports/iter<N>-反哺点-<日期>.md:第 6 节两条秘宝效果实现列+覆盖域表更新各一条落点写明。
|
||||
- [ ] 独立验收审计(高档,test-conventions §8.7 梯度):没参与实现的会话或子代理执行,报告 reports/iter<N>-验收审计-<日期>.md;未过不得合并。
|
||||
|
||||
## 9. 验证闸(改动—验收对照表)
|
||||
|
||||
| # | 需求点(判据出处行锚) | 改动 | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| V1 | 刷新价=每轮预算一半(design/gdd/systems/排雷循环/行动经济.md「挖掘期刷新:花储备换新图」刷新门槛按每轮预算的一半设定) | action_economy.tres:10 8→4;schema :10 缺省同步 | round_flow_skill_pool_test.gd:_smoke_active_refresh 内 `_test_refresh_cost_is_half_budget`(_test_ 尾缀) | 单元 | BattleOrchestrator.player_request_refresh() | `rap_refresh_cost * 2 == ap_per_round` ∧ 扣费后 rap == 攒额 − 表值 | 既有:停手转存储备与轮内刷新(上限/AP 不重置/刷新图零清图奖励) |
|
||||
| V2 | 战斗结束储备点原样保留(design/gdd/systems/排雷循环/行动经济.md「验收标准」刷新规则) | action_economy.gd notify_combat_end 回写桶;battle_orchestrator 起战注入 carry | round_flow_skill_pool_test.gd:_test_rap_carries_across_battles | 单元 | 连续两场 BattleOrchestrator.begin_battle(同一 adv_bucket) | 第二场起战 action_economy.rap == 第一场 notify_combat_end 后 rap | 新增:储备点整局冒险携带与冒险收束清零 |
|
||||
| V3 | 冒险收束清零(design/gdd/systems/排雷循环/行动经济.md「验收标准」储备清零) | adventure_runner._settle 清桶键 | round_flow_skill_pool_test.gd:_test_rap_cleared_on_adventure_settle | 单元 | AdventureRunner._settle("completed") | adventure_counters["rap"] == 0 ∧ 三结局共用出口 | 新增:储备点整局冒险携带与冒险收束清零 |
|
||||
| V4 | 每关开始 +4 储备点(design/gdd/systems/跨局循环/秘宝.md「普通档」开局储备) | treasure_items.tres level_start_rap 行(display_key/desc_key)+strings.csv 两键值+关首注入面 | treasure_effects_test.gd:_test_level_start_rap_grant | 单元 | BattleOrchestrator.begin_battle(battle_index=1, attunement 含件) | 首战 rap==magnitude ∧ battle_index=2 不再注入 ∧ 未装配 rap==0 | 新增:储能秘宝关首注入与正确动作产储备点 |
|
||||
| V5 | 单次付费动作挖安全格/封印标中 +1(design/gdd/systems/跨局循环/秘宝.md「普通档」推演储能) | correct_action_rap 行(display_key/desc_key)+strings.csv 两键值+grant_segment 两处 hits 转译 | treasure_effects_test.gd:_test_correct_action_rap | 单元 | LevelRunner 真实结算段经 BattleOrchestrator 装配链的 dig_reveal/seal_hit 发射(内部驱动受控例外:本改动无公开可观测面可钉,判据绑 action_economy.rap 状态源取值) | 每次正确事件后 rap 恰 +1;mine_hit/seal_missed 后 rap 不变 | 新增:储能秘宝关首注入与正确动作产储备点 |
|
||||
| V6 | 与换图系专长可叠加(design/gdd/systems/跨局循环/秘宝.md「普通档」两件储能件的代号) | 同上行与转译(不覆盖 dig_paid 既有通道) | treasure_effects_test.gd:_test_correct_action_rap_stacks_with_vein_reserve | 单元 | 同 V5+装配 vein_reserve(内部驱动受控例外同 V5) | 单次付费动作挖安全格后 rap +2(dig_paid 与 dig_reveal 各 +1) | 既有:换图基座:挖格产 RAP 与刷新折扣 |
|
||||
| V7 | 断点往返不丢储备点(design/gdd/systems/表现与支撑/存档序列化.md「验收标准」断点域契约) | 借 adventure_counters 桶随快照(零新增断点键) | feat_vouchers_test.gd:_test_rap_breakpoint_roundtrip | 单元 | AdventureRunner.resume_adventure(bp) → 起战 | bp["adventure_counters"]["rap"] 与续玩起战 rap 逐位相等 | 新增:储备点整局冒险携带与冒险收束清零 |
|
||||
| V8 | 只按正确结果给(design/gdd/systems/跨局循环/秘宝.md「普通档」两件储能件的代号) | triggers 只挂 dig_reveal/seal_hit | treasure_effects_test.gd:_test_wrong_action_gives_no_rap | 单元 | LevelRunner 真实结算段经 BattleOrchestrator 装配链的 mine_hit/seal_missed 发射(内部驱动受控例外同 V5) | 两次错误事件后 rap 与事件前逐位相等;静态结构判据「订阅行无 mine_hit/seal_missed」申报观测面局限(该两事件不发射本 kind,动态只验 rap 不变) | 新增:储能秘宝关首注入与正确动作产储备点 |
|
||||
| V9 | 连锁展开不逐格追加(design/gdd/systems/排雷循环/行动经济.md「换图系专长对储备与刷新的改写」矿脉储能) | _reveal_safe 按 channel=="dig" 门控转译 | treasure_effects_test.gd:_test_chain_gives_one_rap | 单元 | LevelRunner 真实结算段经 BattleOrchestrator 装配链的 dig+chain 混合揭示 | 首格 dig+N 格 chain 后 rap 恰 +1 | 新增:储能秘宝关首注入与正确动作产储备点 |
|
||||
| V10 | 两件新秘宝卡面文案经 strings.csv 取值(design/engineering/code-conventions.md「2.5 玩家可见文案承载」数据表文案字段更名) | meta_progression.gd treasure_shop_status 两字段 key 解析+存量字面回退(:108-109) | table_structure_guard_test.gd:_smoke_adventure_table 秘宝 V18 段内两查(无新测试函数名) | 单元 | MetaProgression.treasure_shop_status() | level_start_rap 投影 display_name/desc 非空 ∧ reserve_jar 投影仍为存量字面 | 既有:储能秘宝关首注入与正确动作产储备点 |
|
||||
| N1 | 非行为改动:schema 缺省 6→4(design/gdd/systems/排雷循环/行动经济.md「调参表」刷新门槛) | action_economy_table.gd:10 缺省声明面 | 无新增断言(判断依据=运行时值由 .tres 覆盖,断言只读 db.run.action_economy.rap_refresh_cost) | — | — | 表加载零新增 error | 既有:停手转存储备与轮内刷新(上限/AP 不重置/刷新图零清图奖励) |
|
||||
| N2 | 非行为改动:schema 结构面三项——EFFECT_KINDS/MAGNITUDE_KINDS 扩 `level_start_rap_grant`、KEY_WHITELIST 扩 display_key/desc_key(:50-53)、display_name 空判据迁移(:89-90)(design/engineering/code-conventions.md「2.5 玩家可见文案承载」数据表文案字段更名) | treasure_item_table.gd 词表/白名单/判据三处 | 无新增断言(判据=表加载零新增 error,两新行与存量 12 行加载全过) | — | — | 表加载零新增 error | 既有:储能秘宝关首注入与正确动作产储备点 |
|
||||
|
||||
- 验证命令:单元套件直跑 `D:\code\godot\Godot_v4.7.2-stable_win64_console.exe --headless --path game --script res://tests/unit/battle_settlement/round_flow_skill_pool_test.gd`(treasure_effects/feat_vouchers 同形换路径);全套件 `--script res://tests/run_all.gd`。
|
||||
- 内部驱动受控例外申报:V5/V6/V8/V9 的改动点(秘宝订阅 hits 转译)无公开编排器入口可钉,真实入口取 LevelRunner 真实结算段经 BattleOrchestrator 装配链,判据绑 `action_economy.rap` 状态源取值(test-conventions.md「8.2 四层与真实入口」不依赖场景树和真实宿主的纯逻辑/:134-136)。
|
||||
- 测试方式两分法:V1–V10 全归单元夹具(能力验证);用户目检项=RAP 数字与清零反馈、刷新按钮「RAP−4」文案、秘宝匣柜台两新件名与卡面摘要显示(display_key 解析读数),写进实现报告实机目检总清单,登记不阻塞。
|
||||
- 回归措辞:T 段出口跑一次覆盖改动面的套件;修复只做出红最小单元的最窄确认;新增测试先行孤立验证再并入全套。
|
||||
- 测试削弱申报:table_structure_guard_test.gd 秘宝 V18 白板档计数断言 12→14(目录增 2 行的数据计数随批换代——全未解锁与 mode 分派护栏语义不变,非放宽阈值)。
|
||||
- 独立验收审计:入口=T4 第四步;报告 reports/iter<N>-验收审计-<日期>.md;高档梯度(test-conventions §8.7)。
|
||||
- 判据出处行锚逐行实读由复核门执行(req-card grilling 审点,机检 C5 只查存在性)。
|
||||
|
||||
## 10. 异常分级
|
||||
|
||||
- L1 自救:夹具 adv_bucket 引用未下传一次重试(改经 enc 显式带桶)。
|
||||
- L2 记录继续:导入缓存类在册环境坑按坑册处置。
|
||||
- L3 停机写报告等用户:🔴 契约触碰;adventure_counters 桶与断点往返不对齐(RAP 续玩丢失)停卡呈报;机检预算互斥=上游缺陷停卡退回写卡段。
|
||||
|
||||
## 11. 代拍板白名单
|
||||
|
||||
- 两件秘宝的 item_id 与 display_key/desc_key 键名字符串、strings.csv 中文文案措辞(键值照 GDD 代号与一句话 provisional 落——文案值单点住 strings.csv,code-conventions §2.5;正式命名归用户,GDD 已标 provisional)。
|
||||
- `_apply_rap_hits` 私有函数名与局部累加变量名。
|
||||
- 表注释改写措辞(须保留「按每轮预算的一半设定」与「解耦单独立批」两层意思)。
|
||||
- 两件秘宝行内键名字符串与 strings.csv 文案值(行内禁落 display_name/desc 字面;tier/unlock 仅用现役普通档 provisional 占位值,不另定案)。
|
||||
- 超清单事项记实现报告「实现决定记录」节。
|
||||
|
||||
## 12. 待裁点
|
||||
|
||||
零待裁点,开工门=U0。(四案裁断、条款⑤换代与两件秘宝边界已在 2026-11-09 会话闭合,git 750b491b 可考。)
|
||||
|
||||
## 13. 落位与可复用性预检
|
||||
|
||||
| 新增件 | 复用面核查 | 唯一面 | 分层与交互 |
|
||||
|---|---|---|---|
|
||||
| `set_adventure_bucket`(action_economy.gd 新方法) | 现役 RAP 注入已走 grant_reserve_ap(:195)与凭证通道(battle_orchestrator.gd:388-390),能复用;新增方法只为把「回写目标」交给同一实例,不另设 RAP 宿主 | 冒险级 RAP 唯一落 `adventure_counters["rap"]`;ActionEconomy 只持桶引用,不复制值 | Core 内:LevelRunner enc.adv_bucket → begin_battle → set_adventure_bucket → notify_combat_end 回写 |
|
||||
| `level_start_rap_grant`(EFFECT_KINDS+MAGNITUDE_KINDS 两处词表项) | EVENTS 无「关卡开始」事件(F8),订阅行做不到;现役参数面 kind 分发 `attune_param_sum`(battle_orchestrator.gd:160)已能按 kind 汇总 magnitude,扩一词即可复用整套注入面,不新增事件/组件 | kind 只在 treasure_item_table.gd EFFECT_KINDS 一处登记;注入点只在 _begin_battle_preview_economy 一处 | 装配集→attune_param_sum→battle_index==1 门→grant_reserve_ap;不碰排雷规则 |
|
||||
| `_apply_rap_hits`(grant_segment.gd 新私有函数) | `grant_reserve_ap` 已有消费点(action_economy.gd:114-126),但只服务 dig_paid;dig_reveal/seal_hit 的 hits 无转译,必须新增一个窄转译,不能改通用 fx_emit(会影响全部事件) | 转译只在 grant_segment 一处;同文件两个调用点(grant_segment.gd:101 `_reveal_safe`/:349 `_judge_seal_hit`);grant_segment 已有 action_economy 成员(:25/:43) | GrantSegment 经 fx_host.fx_emit 收 hits → 本函数 → action_economy.grant_reserve_ap;Core 零 UI |
|
||||
| 秘宝表两行(数据,非新文件) | 12 行现役结构照抄(:85-96 参数面/:30-42 triggers);文案面不走存量 display_name/desc 字面旧形态,按 display_key/desc_key 新形态落(值住 strings.csv——存量 12 行迁移归文案批,本批零扰动);档位/解锁 provisional 按 GDD :47 | 两行各一 item_id;strings.csv 四键全库唯一;无同名同义标识符在盘 | 经 ConfigDB 装载→attunement_rows→effect_engine.rebuild 订阅/注入面读 kind;卡面文案经 meta_progression.treasure_shop_status 投影→tr() 解析 |
|
||||
| strings.csv(新建数据件,game/data/l10n/) | 全仓无 l10n 数据件与翻译注册面(game/data/l10n/ 实查不存在——code-conventions §2.5 规制在、数据面未建),本批为首用批不能复用 | 文案值唯一容器;key 点分命名全库唯一 | 数据表行持 key→呈现投影面 tr() 取值;meta_progression 为 Core 投影件、Core 零 UI 依赖不破 |
|
||||
| 测试函数(扩展既有套件) | grep 现役三套已覆盖刷新/装配/断点,扩展不另立新文件 | 每断言只落一个套件,不散落 helper | 沿用 Kit.check_quiet/Kit.check 与 run_all.gd 既有登记 |
|
||||
|
||||
## 14. 实现规范预算
|
||||
|
||||
- action_economy.gd:无新文件;新增 1 公开方法(set_adventure_bucket)、1 类变量(桶引用),公开方法与类变量均远低于默认 20/15(F11 无基线键);notify_combat_end 分支数不变(去一赋值、加一回写)。
|
||||
- battle_orchestrator.gd/adventure_runner.gd/level_runner.gd:零新增类变量(adventure_runner 用现成 adventure_counters 字典键、F11 基线 23/30/33 不升);只加语句与一处参数传递。
|
||||
- grant_segment.gd:新增 1 私有函数 `func _apply_rap_hits(hits: Array) -> void`,分支 ≤3(遍历/累加/>0 调一次)、返回 1;文件无基线键,仍在默认阈值内。
|
||||
- treasure_item_table.gd:两处词表各加 1 项(EFFECT_KINDS/MAGNITUDE_KINDS)+KEY_WHITELIST 加 2 键+display_name 空判据一处改判,零新函数;treasure_items.tres:rows 12→14(数据行,非代码面)。
|
||||
- action_economy.gd 新成员形态 `var _adv_bucket := {}`(Dictionary 推断;类变量现役 12+新增 1=13 ≤ 15);桶为空字典时 notify_combat_end 零扰动不回写。
|
||||
- 存量触面一查:T0 首步记录 gdstyle 改前读数,S13 键较登记值只降不升(本批无基线键变动预期);如 adventure_runner/level_runner 键上升即停卡呈报。
|
||||
- 指标例外申报:无。
|
||||
|
||||
## 15. 拆分边界纪律
|
||||
|
||||
本批非拆分/重构类(扩展既有件+两行数据),无拆出单元;第 13/14 节条款照列备查:禁为机检文本保留无效成员;机检键与卡片契约互斥=停卡呈报。
|
||||
|
||||
## 16. 复核记录
|
||||
|
||||
复核形态:第 1 轮=未参与本卡撰写的只读子代理对抗复核(审点按 req-card 技能 grilling 门全清单:验收三问/对照表两端/真实入口/绑定面、判据出处行锚逐行实读、落位预检×结构图互指、预算实数、T 卡粒度/接口逐字/禁行句式、引擎技术面三查、范围边界与机检相容)。复核前作者已跑自审七查。本轮共 16 条发现,逐条四类分流:自判 5 条(含 2 条「判定不改+依据」)、补写 11 条;**零待裁类、零退回上游类**——F03 连锁口径、F10 错误结果规格句、F13 持久化归属、F14 解锁占位均可由在册先例/owner 文档/用户会话裁断给出唯一答案,按「禁把能推导的当灰色上交裁决」由复核者自判或列为反哺点补写,不转成问句呈报用户。复核凭据=本节自身,不另设报告文件(2026-11-06 用户裁)。
|
||||
|
||||
| 轮次 | 复核者身份 | 发现 | 去向 | 处置结果 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | 只读子代理(未参与本卡撰写) | 新 kind 只扩 EFFECT_KINDS,MAGNITUDE_KINDS 未扩会使 magnitude=4 加载期报 cross_field | 补写 | T2 首步已写死两处词表追加;§14 预算改「两处各 1 项」;§13 新增件名改「两处词表项」(依据 treasure_item_table.gd:44-46/:154-167) |
|
||||
| 1 | 只读子代理(未参与本卡撰写) | dig_reveal 在连锁展开时逐格发射,V5「恰 +1」/V6「+2」在连锁夹具下会假红 | 补写 | §4 新增 🔴 C7、T3 新增 channel=="dig" 门控步骤、新增 V9 验收行、V5/V6 判据改「单次付费动作」(依据 minesweeper_rules.gd:345-362、grant_segment.gd:83-93) |
|
||||
| 1 | 只读子代理(未参与本卡撰写) | 秘宝 B 连锁口径 owner 文档未定义,复核者初判待裁并列两案 | 自判 | 不改设计、不呈用户:沿用先例「连锁不逐格追加」有唯一答案(依据 行动经济.md「换图系专长对储备与刷新的改写」矿脉储能/:281/:297、feats.tres:887-889 矿脉储能挂 dig_paid 一次/动作、用户 2026-11-09 会话「一次动作四种情况」裁断);已落 C7 与 V9 |
|
||||
| 1 | 只读子代理(未参与本卡撰写) | 新增桶引用成员未给声明形态,notify_combat_end 缺空字典零扰动守卫 | 补写 | T1 已补 `var _adv_bucket := {}` 与「桶为空字典时零扰动不回写」;§14 补成员形态与阈值实数(依据 action_economy.gd:35/:113、gdstyle_baseline.txt:8-14) |
|
||||
| 1 | 只读子代理(未参与本卡撰写的只读复核者) | 「保留 _rap」按字面是死代码(ActionEconomy 每战新建),需钉清生命周期避免实施者误解 | 自判 | 判定不改结构、只改措辞:T1 已写「回写完成即由下一场 begin_battle 经 carry 注入重建,本实例不复用」(依据 battle_orchestrator.gd:208/:585、level_runner.gd:517/:591) |
|
||||
| 1 | 只读子代理(未参与本卡撰写) | correct_action_rap 行把 +1 同时写 magnitude 与 do.value,双写且违背现役 value_from 形态 | 补写 | T3 已改两条 triggers 的 do 为 `"value_from": "magnitude"`,行内 magnitude=1 为唯一源(依据 treasure_items.tres:25-41、effect_engine.gd:184-188) |
|
||||
| 1 | 只读子代理(未参与本卡撰写) | §13 写「两处调用点同文件、同一函数」与 T3/代码实况矛盾 | 自判 | 复核者当场改卡:§13 该格改「同文件两个调用点(grant_segment.gd:101/:349)」(依据代码实读) |
|
||||
| 1 | 只读子代理(未参与本卡撰写) | V5/V6/V8 真实入口写法不一致,内部 fx_emit 未申报受控例外,V8 静态判据未申报局限 | 补写 | 对照表四行统一为「LevelRunner 真实结算段经 BattleOrchestrator 装配链」;§9 表下补受控例外申报;V8 补静态判据局限注(依据 test-conventions.md「8.2 四层与真实入口」不依赖场景树和真实宿主的纯逻辑/:134-136) |
|
||||
| 1 | 只读子代理(未参与本卡撰写) | V7 锚 行动经济.md「停手与储备行动点」储备池的生命周期以一整局冒险为界 只讲生命周期,不承载「断点往返」判据 | 补写 | V7 重锚 存档序列化.md「验收标准」断点域契约「断点域契约:写读往返逐位一致」;§2 补该文档事实源行 |
|
||||
| 1 | 只读子代理(未参与本卡撰写) | 「做错了不给」在 design/ 无正向规格句,复核者初判退回 doc-design | 自判 | 不停笔:owner 文档 秘宝.md「普通档」两件储能件的代号「按正确结果给」+用户会话裁断「做对了才给,没做对不给」给出唯一答案;V8 重锚 :47,规格句补写列 §6 反哺点由文档批落文(依据 秘宝.md「普通档」两件储能件的代号、git 750b491b) |
|
||||
| 1 | 只读子代理(未参与本卡撰写) | 🔴 C1「禁写死 4/8」与 T0 把 schema 缺省写成 4 自相矛盾;缺省面未列非行为改动行 | 补写 | C1 改「禁在产品码读取路径与测试断言写死,schema 缺省声明面除外」;对照表新增 N1 非行为改动行并带锚 行动经济.md「调参表」刷新门槛(依据 test-conventions.md「8.1 验收单位是行为改动」一个行为改动) |
|
||||
| 1 | 只读子代理(未参与本卡撰写) | 复核记录占位行去向写「待定」,C6 判红 | 补写 | 本表已按四类去向逐条回填 16 条,删占位行(依据 pipeline_gate.py:650-687、.zcode/skills/req-card/SKILL.md「必备结构」复核记录) |
|
||||
| 1 | 只读子代理(未参与本卡撰写) | RAP 借 adventure_counters 随断点写读,与 存档序列化.md「存什么:表与档分家,局内系统资源不入档」第二条边界是反面清单「须登记持久化归属、禁止静默超域」冲突,复核者初判退回规约修订 | 补写 | 不停笔、不静默:§6 新增该文档同步面行,明确「列反哺点由文档批落文、实现批禁写、未落文前不静默超域」;§2 补 :57 依据(依据 存档序列化.md「系统范围」局内数值的持久化/:57/:181、breakpoint_store.gd:38/:123) |
|
||||
| 1 | 只读子代理(未参与本卡撰写) | §5 声明解锁「归调参批不做」,T2 却写死 tier/unlock,复核者初判退回 doc-design | 自判 | 不改数值、不呈用户:现役普通档解锁全为 provisional 占位,10 即占位非定案;§5 改「按现役普通档同款 provisional 占位,不定案」,§11 白名单补同位说明(依据 treasure_items.tres:95、秘宝.md「三档骨架」两件储能件暂落普通档-29) |
|
||||
| 1 | 只读子代理(未参与本卡撰写) | T1/T3 各把两组断言塞进一步,取用块用「T0 的表值」类模糊指代 | 补写 | T1 拆 V2/V7 两步、T3 拆 V5/V6/V9 三步;三处取用块改确切名字 `db.run.action_economy.rap_refresh_cost == 4`/`adventure_counters["rap"]`/`level_start_rap` 行形态(依据 .zcode/skills/req-card/SKILL.md「任务卡写作纪律」步骤粒度) |
|
||||
| 1 | 只读子代理(未参与本卡撰写) | Dictionary 重赋值会断桶引用,卡内未声明约束 | 自判 | 不改:重赋值只在起战前/冒险收束发生,战斗进行中零重赋值,不构成实战缺陷(依据 adventure_runner.gd:116/:170/:203/:348、level_runner.gd:88-89/:539);日后新增战斗中重赋值路径须回炉补条款 |
|
||||
| 修订 | 修订会话自复核(修订执行者) | 新形态行无 display_name,schema :89-90「display_name 空」domain 校验对新行加载致命 | 补写 | T2 schema 步补判据迁移「display_name 与 display_key 至少一方非空」(存量 12 行零扰动);§9 增 N2 非行为改动行;§7/§14 同步(依据 treasure_item_table.gd:89-90 实读) |
|
||||
| 修订 | 修订会话自复核(修订执行者) | 秘宝匣柜台投影 treasure_shop_status 直读行内 display_name/desc(:108-109),key 形态行投影空白 | 补写 | §7 增 meta_progression 行+T2 投影步(key 优先经 tr()、存量字面回退)+§9 增 V10 对照行+目检项补一条(依据 meta_progression.gd:108-109、camp_shop_presenter.gd:96 实读) |
|
||||
| 修订 | 修订会话自复核(修订执行者) | table_structure_guard_test.gd V18 白板档 locked_n==12 硬断言与目录 12→14 相撞假红 | 补写 | T2 补计数换代 12→14 步、§9 削弱申报列明、C6/§7 同步(依据 table_structure_guard_test.gd:211-212 实读) |
|
||||
| 修订 | 修订会话自复核(修订执行者) | strings.csv 与翻译注册面全仓不存在,l10n 运行面未建(code-conventions §2.5 规制在、数据面未落地) | 自判 | 本批为首用批:新建 strings.csv+project.godot 翻译注册+tr() 取值入 T2(Object 在役方法,RefCounted 直调),不另立前置批(依据 game/data/l10n/ 实查不存在、code-conventions.md §2.5 实读) |
|
||||
| 修订 | 修订会话自复核(修订执行者) | 用户裁读数 treasure_effects_test 未装配零扰动 :43-46,实读两断言落 :44-45/:46-47(夹具 :42-43) | 自判 | 卡按实读落 :44-47(依据 treasure_effects_test.gd:41-47 实读) |
|
||||
| 修订 | 修订会话自复核(修订执行者) | tests/README §6 行锚 :124 实读为棋盘 golden 行非能力行;停手转存能力行现役 :126 | 自判 | §6 行锚改 :126/:130/:232(依据 game/tests/README.md:124/:126/:130/:232 实读) |
|
||||
| 修订 | 修订会话自复核(修订执行者) | KEY_WHITELIST 实读 :50-53,用户单记 :53-56 | 自判 | 卡内引用按实读 :50-53 落(依据 treasure_item_table.gd:50-53 实读) |
|
||||
|
||||
修订轮(2026-11-10,写卡段修订批·用户令卡面修订):修订范围=文案形态裁决(display_key/desc_key+值住 strings.csv+schema 结构面扩面申报)、版本号换代(行动经济 v1.7→v1.8/秘宝 v1.3→v1.5)、行锚与读数修正(F5 断点回填归属/tests/README 行锚/行号小漂读数)。修订执行会话自复核(修订者即执行者——非对抗轮,对抗轮 1 已于 2026-11-09 完成;本轮审点=修订面实读核证+修订连带面三查,上表轮次=修订七行)。本轮 7 条发现逐条四类分流:自判 4、补写 3;零待裁、零退回上游,零待裁点维持。设计闭合凭据不变(秘宝.md v1.5 :228 已定新形态,设计面无缺口)。
|
||||
@@ -0,0 +1,194 @@
|
||||
# 需求卡片——可推理率退役批
|
||||
|
||||
> 来源:待办清单「可推理率承诺与生成-验证-重试管线退役」条目(唯一事实源:design/gdd/systems/排雷循环/棋盘生成.md v1.4 §核心规则「四阶段管线/出生区安全与反退化布雷/不做质量承诺」+§调参表+§验收标准)
|
||||
> 验收档:高(数值表结构校验与棋盘生成随机流消费在改动面上——失败代价随同种子复现承诺与表加载传播)
|
||||
> 估时:1.25–2.0 个工作日(中值 1.625);超 2.0 日软盒预挂=T1 白给板夹具构造不出(见 L3)时停机呈报,不扩面自救
|
||||
|
||||
## 1. 目标与完成定义
|
||||
|
||||
把「生成端担保好推理」整套机制从游戏里拆掉:删除可推理率求解器、质量重试、三分出口降级、成本闸与四个配套表字段,出板只查两件事——出生区无雷、开局不全开(白给板同流重摇);产品标记与诚实告知随之退役;推理度量程序迁到 sim 只留离线测量。
|
||||
|
||||
完成定义:
|
||||
- V1–V7 验收行全部在真实跑批中执行并通过;N1 非行为改动行写明判断依据;生产表加载零新增 error。
|
||||
- `game/core`、`game/data`、`game/presentation`、`game/tests/unit` 四目录(.gd/.tres)内,退役标识符带引号键形 `"inferability_target"|"solver_rules"|"min_safe_count"|"max_gen_attempts"|"r0_max_cap"` 与裸名 `inferability|is_clearable|measure_inferability|COST_BUDGET|illegal_product|degraded_product|accept_mode` 零命中;sim 侧合法在场止于 `inferability_measure.gd` 与其消费件(tres 历史注记裸名不算命中——键形口径)。
|
||||
- 代码域闸按改动域选档全绿;独立验收审计(高档)通过;reports/ 两份产出物落齐;能力表退役行删除、新增行在场。
|
||||
|
||||
## 2. 设计事实源
|
||||
|
||||
design/gdd/systems/排雷循环/棋盘生成.md v1.4:
|
||||
- :58 管线第三步「只查两条:出生区无雷、开局不全开;白给板同流重摇,直到不全开」。
|
||||
- :71 失败语义「开局白给板→同流重摇——这是唯一的重摇理由」。
|
||||
- :98 「数字恒真是布雷算法的本分……不设运行期检查——算错了是算法缺陷,修算法,不是加检查」。
|
||||
- :100–:102 「不做质量承诺」节:不度量、不筛选;求解器只保留在离线模拟测量(MC 批量模拟),不参与生成管线。
|
||||
- :152–:162 调参表(inferability_target/solver_rules/min_safe_count/max_gen_attempts/r0_max_cap 五行已不在场)。
|
||||
- :164 结构冻结句「出板检查只两条(出生区无雷、开局不全开)」。
|
||||
- :168–:176 验收标准(确定性复现、重摇同流、指标集口径)。
|
||||
|
||||
背景(非实现依据):行动经济 v1.8 锚句删除、秘宝 v1.4 ι 公式删除——两文档代码消费面查实为零(本批不动其代码)。
|
||||
|
||||
## 3. 现状事实(开工自行复核)
|
||||
|
||||
- 质量重试与三分出口:`game/core/board_generator.gd:55` `_attempt_loop`(达标即出/接受最优/接受最不坏)、`:88` `_accept_fallback`、`:413` `_badness`(不可达数+min_safe 缺口字典序)。
|
||||
- 求解器与度量:`:177` `measure_inferability` +算子族 `:206–:310`(连锁/single/subset 派生/约束构造)。
|
||||
- 合法性检查:`:342` `_legality_faults` 含 inv1 出生区雷、inv2a/2b 变异域、inv3 数字恒真、inv4 R₀=S、not_clearable(`:315` `is_clearable`)、min_safe_short(`:365`)、r0_cap_exceeded(`:371`)。
|
||||
- 指标集:`:387` `_finalize` 输出 inferability/accept_mode/degraded_product/illegal_product/attempts_used/r0_cap_rejected 等键;`game/core/board_data.gd:21–22` `illegal_product`/`degraded_product`。
|
||||
- schema 校验:`game/data/schemas/board_gen_table.gd:9–11` `SOLVER_RULES`/`COST_BUDGET`/`TARGET_ABS_FLOOR` 常量、`:54–60` target 域+solver 冻结、`:73–78` min_safe/attempts 域、`:83–88` F2b 可行/F2c 成本、`:96–113` `_validate_shave_params`(shave 域与 r0_cap 护栏混装一函数)。
|
||||
- 表:`game/data/tables/board_gen.tres` 31 行 × inferability_target/solver_rules/min_safe_count/max_gen_attempts/r0_max_cap 五列(带引号键形 93+ 处在行值;文件尾注散句提及 min_safe/attempts 属历史数据注记,非列定义)。
|
||||
- 诚实告知:`game/presentation/main.gd:481–493`(节头注+`check_board_hints` 两 toast,illegal/degraded),调用点 `main.gd:467`、`game/presentation/main_debug_flow.gd:107`。
|
||||
- 公有面消费:`legality()` 全仓消费点仅 `game/tests/unit/core/board_gen_reward_test.gd:177`(随 1.5 删组消亡),`measure_inferability()` 仅 `board_generator_test.gd:132`(同上)——core 内可一并删公有签名。
|
||||
- sim 消费:`game/sim/calibrate_boards.gd:40–45` 读五列快照、`:65` 统计 `metrics.inferability`;`game/sim/dump_battle.gd:26` 打印该键;`game/sim/board_stat_probe.gd:43` `illegal_product` 分支;`game/sim/auto_player.gd:114–217` 自带推理族(接口绑 minesweeper 运行时隐藏态,与整板生成侧口径两套),`:80` 注释引用「棋盘生成 F1 measure_inferability 同族」。
|
||||
- 测试:`game/tests/unit/core/board_generator_test.gd:27/:126–140` 可清图与及格线自洽套件、`:164–171` 表头域校验④(r0_max_cap=9 拒)、夹具行 `:166–169` 含五列;`game/tests/unit/core/board_gen_reward_test.gd:176–196` clearable/legality/及格线/降级标记/attempts 有界断言组、`:209–225` cap 闸组与压线组;`game/tests/unit/schema_vocab_violation_test.gd:135–152` ⑥ solver_rules 冻结拒域(`:34` 调用、`:5` 头注)。
|
||||
- 能力表:写卡段同批已落——README :115/:116 两新行(出板检查/离线测量)替换原「可推理率与清图可达、重试有界、降级诚实」行、:229 口径行换代;余下 :199「schema 违约词拒绝路径」行的括注「空表/冻结/出域/…七槽钉」含 ⑥ 冻结槽,随 ⑥ 改写须换口径(本批同落,见 §6)。
|
||||
|
||||
## 4. 设计契约(违反即返工,🔴 触碰=L3 停机呈报)
|
||||
|
||||
- 🔴 C1 出板检查恒两条:出生区无雷 ∧ R₀≠S(开局不全开)。不得保留或新增数字恒真/变异域/清图可达/min_safe/R₀≤cap 任何一条运行期检查(棋盘生成 v1.4 :164)。
|
||||
- 🔴 C2 重摇只消费本图 board_gen 单流、不开新流、不设次数上限与成本闸(:58/:71/:172);同种子必产同图承诺不破坏(:168)。
|
||||
- 🔴 C3 求解器在 `game/core/`、`game/data/`、`game/presentation/`、`game/tests/` 零残留;测量形态只许存在于 `game/sim/`(:102)。
|
||||
- 🔴 C4 玩法数值仍只经 ConfigDB 表行读取;退役字段禁在代码里以任何默认值续命(缺列即不存在,不写 `.get(key, 0)` 兜底)。
|
||||
- 🔴 C5 本批禁变异类测试与撤销类取证(AGENTS.md 验收闭合红线);不可达分支的退役按静态判据+申报(见 V5)。
|
||||
|
||||
## 5. 范围边界
|
||||
|
||||
做:§3 全部消费面的删除/重写/迁移;测试断言换代与删组申报;能力表行换代(写卡段已落,实现批核对名实)。
|
||||
不做(去向):
|
||||
- 黄金图向量重制(v1.4 :174)——盘上无登记向量件,属 P1 调参期批量断言工具面(棋盘生成.md「P1 / P2 后置」调参期批量断言工具全量交付),随该批走。
|
||||
- MC 档位重跑与数值重锚——v1.4 管线换代后旧读数作废,重跑归数值标定窗口(用户发令),本批只跑工具缩样冒烟证明不崩。
|
||||
- 体验验证清单实机目检登记——出板观感(白给板频率)变化归用户试玩面。
|
||||
- auto_player 策略改动——其推理族自含且属 MC 测量面(裁点 C 保留),本批只改 `:80` 注释引用(N1 非行为改动)。
|
||||
|
||||
## 6. 关联文档同步面
|
||||
|
||||
| 文档 | 关联点 | 同步义务 |
|
||||
|---|---|---|
|
||||
| design/gdd/systems/排雷循环/棋盘生成.md v1.4 | 实现口径应与文档一致 | 无直改义务(文档批已落现行);实现发现口径不符=停卡退回文档设计段,禁实现批写 design/ |
|
||||
| game/tests/README.md 能力表 | 行换代+:199 括注口径(⑥ 冻结槽措辞随改写更新) | 写卡段同批已落(本卡成立时生效);实现批批末只核对表上名字与落地一致,改名回表 |
|
||||
| design/gdd/术语表.md | 「盲赌」行不涉退役机制 | 无 |
|
||||
| 根两份流程清单 | 待办清单条目状态推进归本卡写作批;体验验证清单 v1.4 文档批已改 | 实现批禁写,若有新出入列 reports/iterN-反哺点 清单由用户裁决 |
|
||||
|
||||
## 7. 文件结构图(卡前定分解)
|
||||
|
||||
| 文件 | 职责 | 行为改动 |
|
||||
|---|---|---|
|
||||
| game/core/board_generator.gd | 确定性布雷+两条出板检查(重写后全文≤百行量级) | 是→V1/V2/V3 |
|
||||
| game/core/board_data.gd | 删除两标记字段 | 是→V5 |
|
||||
| game/data/schemas/board_gen_table.gd | 参数域校验(退役块删除) | 是→V4 |
|
||||
| game/data/tables/board_gen.tres | 数据行(五列删除) | 是→V4 |
|
||||
| game/presentation/main.gd | 删除 check_board_hints 与调用点 | 是→V5 |
|
||||
| game/presentation/main_debug_flow.gd | 删除调用点 | 是→V5 |
|
||||
| game/sim/inferability_measure.gd | 生成侧口径整板可推理率离线测量(新增,迁入件) | 是(工具面)→V6 |
|
||||
| game/sim/calibrate_boards.gd | 批量测量驱动(改读法与统计源) | 是(工具面)→V6 |
|
||||
| game/sim/dump_battle.gd | 单板指标打印(换键) | 非行为(闸外工具)→V6 |
|
||||
| game/sim/board_stat_probe.gd | 统计口径(删 illegal 分支) | 非行为(闸外工具)→V6 |
|
||||
| game/sim/auto_player.gd | :80 注释改指 sim 新落点 | 否(N1 非行为改动——判定依据:仅注释文本,函数体零改动) |
|
||||
| game/tests/unit/core/board_generator_test.gd | 套件换代(删两组、新增出板检查套件、夹具去列) | 是→V1/V4 |
|
||||
| game/tests/unit/core/board_gen_reward_test.gd | 冒烟段断言换代 | 是→V3 |
|
||||
| game/tests/unit/schema_vocab_violation_test.gd | 删 ⑥ 域 | 是→V4 |
|
||||
| reports/iterN-实现报告/反哺点(N 编排定) | 产出物 | 落位卡 |
|
||||
|
||||
## 8. 任务卡 T0..Tn
|
||||
|
||||
### T1 代码面退役与测试换代(估 0.75–1.25 日)
|
||||
|
||||
取用:无(首发卡)。
|
||||
产出:`BoardGenerator.generate(L, D, rng_stream, db) -> BoardData` 签名不变;metrics 键集={metric_version, ring_removed, actual_mines, target_mines, actual_safe_count, reroll_count, r0_count};私有 `_board_check(b: BoardData) -> bool`。
|
||||
|
||||
- [ ] 1.1 `board_gen_table.gd`:删 `:9–11` 三常量;删 `:54–60`(target 域+solver 冻结);`:73–78` 删 ms/att 两段;`:83–88` 删 F2b/F2c 两段;`_validate_shave_params` 更名语义收窄——保留 shave 域校验(`:103–105`),删 r0_cap 段(`:106–112`);头注同步(删「solver_rules 结构冻结」句)。
|
||||
- [ ] 1.2 `board_gen.tres`:31 行删五列键值对(带引号键形);表头 spawn_edge 与其余列原样;文件尾历史注记散句不动(非列定义,完成定义 grep 按键形口径不命中)。
|
||||
- [ ] 1.3 `board_generator.gd`:删 `measure_inferability` 与算子族(`:174–310`)、`is_clearable`(`:313–334`)、`_badness`/`_lex_less`(`:412–444`)、`_accept_fallback`(`:87–95`);`_attempt_loop` 重写为:循环「`_attempt` 布雷 → `_board_check`」,违例同流下一轮,通过即出;`_board_check`=出生 3×3 无雷 ∧ `compute_r0().size() != safe_cells().size()`(inv1/inv4 语义照旧、判据函数保留复用,见 §13);`_legality_faults` 收缩删除(inv2a/2b、inv3、not_clearable、min_safe_short、r0_cap_exceeded 全删);`legality()` 公有面删除(消费点仅测试,随 1.5 清);`_finalize` 键集换代:`attempts_used`→`reroll_count`(值=循环轮数),删 inferability/accept_mode/degraded_product/illegal_product/r0_cap_rejected 五键,`METRIC_VERSION` 1→2;`:41–44/:49` params 快照删 target/solver_rules/min_safe/max_attempts/r0_cap 五键;头注改「确定性布雷+两条出板检查」。
|
||||
- [ ] 1.4 `board_data.gd:21–22` 删两 var;`main.gd` 删 `:467` 调用与 `:481–493`(节头注+check_board_hints 整函数)、`main_debug_flow.gd` 删 `:107` 调用。
|
||||
- [ ] 1.5 测试换代(删除按语句界,不按行号区间硬切):
|
||||
- `board_generator_test.gd`:删 `_test_clearable_and_inferability_selfconsistent` 整函数(含函数头注)与 `_init` 里的调用行;删 `_test_spawn_edge_from_table` 中「④ 表头域校验 r0_max_cap=9 拒」子段(注释行+夹具 row dict+该 Kit.check),保留 V8 纯函数/几何/真路径三段;夹具 row dict 去五列键。新增 `_test_board_check_and_reroll`——判据:真表行出图出生格集与雷集交集空 ∧ `int(b.metrics.r0_count) < b.safe_cells().size()` ∧ 五退役键 `metrics.has()` 全 false ∧ `int(metrics.reroll_count) >= 1`;白给板触发段=夹具行 8×8、`mine_density` 取使 N=2 的值(双雷相邻可隔离板角数字格——N=1 时该尺寸全部出图恒白给,重摇不退出,禁用作夹具)、种子从 1 起序至 500 找自然 R₀=S 的触发种子,断言该种子出图 `reroll_count >= 2` 且出图非全开;同段补同种子两次生成 `reroll_count` 相等断言(重摇路径确定性)(找不到触发种子=L3-②)。
|
||||
- `board_gen_reward_test.gd:_smoke_board_generator`:整句删「clearable 断言+legality 全过断言」两句;删「var inf/var mode/实测 print 两句/出图验收注释两句/inferability≥target 断言」整块;删「三分出口表降级标记断言+degraded 等式断言+illegal 等式断言+非法产物=false 断言」四句组;删「attempts_used 有界断言」一句;删「初始展开收窄注释块(①–④)+cap_val/spawn_cells_n 变量定义+r0_max_cap 投值断言+R₀≤cap 结构断言+r0_cap_rejected 在位断言+row9 夹具至其两句压线断言」整段;保留产物非空、零变异、雷数≤N 断言、ring_removed 域断言(其读 shave_ring_radius 合法)、同种子/异种子段。新增 metrics 键集断言(§8 产出键集逐项 has 真、五退役键 has 假)。
|
||||
- `schema_vocab_violation_test.gd`:`_check_solver_frozen` 整函数(含节头注)改写为 `_check_vocab_retired_fields`——夹具行注入 `inferability_target = 0.5`(原越域值)与 `solver_rules = "single"`(原冻结拒值)→ 各自 `validate()` 零该类违例,判据绑「注入前后 errs 集相同」;`_init` 调用行与头注 `:5` 的 ⑥ 说明同步改写。
|
||||
- 判据出处注记随新断言重锚 v1.4 行号(:58/:164/:171–:172)。
|
||||
- [ ] 1.6 改完即测:单元全套直跑 `…console.exe --headless --path . --script res://tests/run_all.gd` 绿;冒烟直跑 `python tools/run_smoke.py` 绿;读数写进 T1 提交信息。
|
||||
- 里程碑出口:T1 尾跑一次 `tools/run_all_gates.sh --code`(改动含 game/ 非 .md=代码域档)。
|
||||
|
||||
### T2 求解器迁 sim(估 0.25–0.5 日)
|
||||
|
||||
取用:T1 产出=`BoardData` API(`safe_cells()/compute_r0()/digits/mines` 零改动);`game/core/board_generator.gd` 已不含算子。
|
||||
产出:`class_name SimInferabilityMeasure`,`static func measure(b: BoardData) -> Dictionary` 返回 {r0, r_inf_count, inferability}(键与原 core 件逐字一致)。
|
||||
|
||||
- [ ] 2.1 新增 `game/sim/inferability_measure.gd`:`board_generator.gd:177–310` 族逐函数原样迁入(measure_inferability→measure,算子族与约束构造私有 static),语义零变化——`tools/gdstyle_baseline.txt` 无该族条目级源键(登记面为类/文件级),对账口径=新件建档键+原文件键随删除收缩;迁入后逐函数自查 branches ≤8/returns ≤6 默认档,超限即拆(拆分不改语义)。
|
||||
- [ ] 2.2 `calibrate_boards.gd`:`:40–45` 行快照 rd 字典删五列读取;`:65` 改 `SimInferabilityMeasure.measure(b).inferability`(inf_mean 列保留换源);删 `cap_rej_mean` 列头与读数项(r0_cap_rejected 指标退役)。
|
||||
- [ ] 2.3 `dump_battle.gd:26` 打印行改 `reroll_count`(不再打印 inferability)。`board_stat_probe.gd:43` 删 illegal_product 过滤分支,统计口径改全样本。`auto_player.gd:80` 注释改「与 sim/inferability_measure.gd 同族」。
|
||||
- [ ] 2.4 工具缩样冒烟直跑:`…console.exe --headless --path . --script res://sim/calibrate_boards.gd`(参数取脚本头注最小档)——判据=退出码 0、stdout 出分布读数行、零 error;读数进实现报告。触到 MC 档位表口径=L3 停,禁扩跑。
|
||||
|
||||
### T3 产出物落位卡(估 0.25 日)
|
||||
|
||||
取用:T1/T2 全部读数与提交信息。
|
||||
产出:`reports/iterN-实现报告-<日期>.md`(各卡状态+实机目检总清单一行「白给板出板观感——登记不阻塞」+遗留读数义务=MC 重锚归数值窗口+实现决定记录=§11 触用项);`reports/iterN-反哺点-<日期>.md`(预期零条目,实现中发现的文档出入逐条列)。
|
||||
|
||||
- [ ] 3.1 两份产出物写齐。
|
||||
- [ ] 3.2 能力表核对:README 本卡新行代表用例名与实际测试函数逐字一致;`_smoke_board_generator` 等改名则回表。
|
||||
- [ ] 3.3 独立验收审计入口申报:`reports/iterN-验收审计-<日期>.md`(高档全量审计,审计方未参与实现,test-conventions §8.7)。
|
||||
- [ ] 3.4 全绿出口=代码域闸(T1 尾同一档)零新增红+§1 完成定义 grep 判据过,方进收口。
|
||||
|
||||
## 9. 验证闸(改动—验收对照表)
|
||||
|
||||
| 需求点(判据出处锚) | 改动(文件:行/行为) | 验收测试(名称+落点) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| R1 出板检查只两条+白给重摇(design/gdd/systems/排雷循环/棋盘生成.md「四阶段管线:一次调用跑完四步,同种子必产同图」出板检查、:171) | board_generator.gd `_attempt_loop` 重写、`_board_check` 新增 | `board_generator_test.gd:_test_board_check_and_reroll`(T1 1.5) | 单元 | `BoardGenerator.generate()`+单元夹具流(现件 `:31 _stream`) | 出图出生格∩雷=空、r0_count<安全格数、reroll_count≥1(白给夹具≥2) | 新增:出板检查(出生区无雷/开局不全开、白给板同流重摇、指标集换代) |
|
||||
| R1 重摇同流与确定性(design/gdd/systems/排雷循环/棋盘生成.md「验收标准」确定性复现、design/gdd/systems/排雷循环/棋盘生成.md「验收标准」重摇同流) | 重摇不开新流;attempts_used→reroll_count | 既有 `_test_same_seed_bit_identical`+`_test_board_check_and_reroll` 同种子 reroll_count 相等段+`board_gen_reward_test.gd:_smoke_board_generator` 同种子段 | 单元 | 同上 | mines/digits 逐位相等+reroll_count 相等 | 既有:同参数同种子逐位复现、异种子不退化 |
|
||||
| R1 指标集键集换代(design/gdd/systems/排雷循环/棋盘生成.md「依赖与输出」生成期指标集、design/gdd/systems/排雷循环/棋盘生成.md「验收标准」重摇同流) | `_finalize` 五键删除、reroll_count 新增、METRIC_VERSION=2 | `_smoke_board_generator` 键集断言(T1 1.5) | 单元 | `generate()` 真产物 | metrics.has() 逐项读数 | 新增:出板检查(出生区无雷/开局不全开、白给板同流重摇、指标集换代) |
|
||||
| R2 表与 schema 退役(design/gdd/systems/排雷循环/棋盘生成.md「验收标准」加载期校验、design/gdd/systems/排雷循环/棋盘生成.md「验收标准」表实一致) | board_gen_table.gd 六块删除;board_gen.tres 五列删除;schema_vocab ⑥ 改写 | 真表加载 errs=[](`board_generator_test.gd:15–19` 装载路)+`schema_vocab_violation_test.gd:_check_vocab_retired_fields` | 单元 | ConfigDB 真表加载 | 违例 errs 集合前后相同(退役检查不再产出) | 既有:棋盘按参数行出图、数字恒真 |
|
||||
| R3 标记与诚实告知退役(design/gdd/systems/排雷循环/棋盘生成.md「不做质量承诺:猜局是玩法的一部分」不做质量承诺) | board_data.gd:21–22、main.gd:467/:481–493、main_debug_flow.gd:107 删除 | 键形 grep 零命中+冒烟启动绿(`python tools/run_smoke.py`) | 冒烟 | 冒烟场景真启动 | 静态判据+评审注记:标记不可达、无运行期观测面可绑(C5 口径,测试削弱申报见下) | 既有:棋盘按参数行出图、数字恒真 |
|
||||
| R4 求解器迁 sim(design/gdd/systems/排雷循环/棋盘生成.md「不做质量承诺:猜局是玩法的一部分」生成端不度量) | 新增 sim/inferability_measure.gd+四件改指 | 工具缩样直跑(T2 2.4) | 工具(闸外) | headless `--script res://sim/calibrate_boards.gd` 缩样 | 工具 stdout 读数行进实现报告 | 新增:棋盘可推理率离线测量(仅 sim,不入生成管线) |
|
||||
| R5 测试口径换代(design/gdd/systems/排雷循环/棋盘生成.md「调参表」结构冻结) | 三件删组(清单见 1.5) | 单元全绿执行面+实现报告删组清单 | 单元 | run_all 全套 | 0 失败读数;被删面不复新断言 | 既有:出板检查(出生区无雷/开局不全开、白给板同流重摇、指标集换代) |
|
||||
|
||||
**测试削弱申报(2026-10-21 立)**:允许删除的旧断言与理由——reward 测试及格线/三分/cap 组(机制退役)、generator 可清图自洽套件与表头④护栏(检查退役)、schema_vocab ⑥(冻结域退役)、main.gd 两 toast(标记退役)。均为「对应功能整体撤除」,非放宽阈值;实现期未申报的额外删除=审计判红。
|
||||
|
||||
## 10. 异常分级
|
||||
|
||||
- L1 自救:注释/头注措辞、grep 残留的非代码命中(文档旧引述)——修后记实现报告。
|
||||
- L2 记录继续:tres 中发现 §3 未列的退役列残留行(如注释行)——清理并记录。
|
||||
- L3 停机呈报:①机检预算互斥=上游缺陷停卡退回写卡段;②白给板夹具(N=2 形态)500 种子找不出 R₀=S 触发样本(判据构造不出=停卡呈报,禁造变异注入替代、禁降回 N=1——N=1 全板恒白给会令重摇永不退出);③T2 缩样直跑触 MC 档位硬闸口径;④迁入族与迁出前同输入读数不等价(黄金对拍失败);⑤实现发现 v1.4 口径落不了地(如重摇循环与确定性承诺冲突)——退文档设计段,禁内联求裁。
|
||||
|
||||
## 11. 代拍板白名单
|
||||
|
||||
- metrics 键名 `reroll_count`;`METRIC_VERSION` 跳 2。
|
||||
- 新文件名与类名 `game/sim/inferability_measure.gd`/`SimInferabilityMeasure.measure()`。
|
||||
- 重摇循环形态=`while` 直到通过、无上限(C2 依据)。
|
||||
- `_board_check` 复用现件 `compute_r0()`/`spawn_cells()` 判据函数(§13 复用面)。
|
||||
- dump_battle/board_stat_probe/auto_player 的具体行式;夹具 8×8·N=2 与种子序 1..500(触发种子不存在时走 L3-②,禁改判据形态)。
|
||||
- 超清单决定一律进实现报告「实现决定记录」并当轮停机问,禁静默。
|
||||
|
||||
## 12. 待裁点
|
||||
|
||||
零待裁点,开工门=U0。设计裁点四件(A 出板检查/B 锚句/C 迁 sim/D ι 公式)已由用户 2026-11-09 会话裁决并落文 v1.4 系文档。
|
||||
|
||||
## 13. 落位与可复用性预检
|
||||
|
||||
- 新增件 `game/sim/inferability_measure.gd`(标「新增」):复用面核查过两条——`auto_player.gd:114–217` 推理族不能复用(接口绑 minesweeper 运行时已揭示态做逐着推理,本件要的是整板生成侧口径闭包测量,两套口径);`board_generator.gd:177–310` 不能原地保留(C3 红线=core 零残留,且用户裁决落点=迁 sim,迁=整体搬移非重写)。唯一面:全仓整板可推理率测量只此一处,迁出后 core 由完成定义 grep 判据兜零残留。分层面:sim 测量件→只被 calibrate_boards/dump_battle 消费;零 core 依赖(消费 BoardData 公有 API),不跨层。
|
||||
- 出板检查 `_board_check`:不新增判据逻辑——复用现件 `spawn_cells()`/`compute_r0()` 与 inv1/inv4 既有谓词,只是删其余检查后的收缩,非新能力。
|
||||
- 无新增数据件、无新增 autoload、无新增表。
|
||||
|
||||
## 14. 实现规范预算
|
||||
|
||||
- 新件一:`inferability_measure.gd` 公开方法数=1(≤20 过);类变量=0(≤15 过);迁移 8 函数(实测源位 177/206/219/236/251/267/288/305)——baseline 无条目级源键(类/文件级登记形态),对账=新件建档键、原文件键随 board_generator.gd 收缩;迁入后逐函数 branches/returns 超默认档即拆(见 2.1)。
|
||||
- 存量触面一查:`board_generator.gd`(删约 200 行,S13 键预期只降)、`board_gen_table.gd`、`main.gd`、三个测试件——T1 落笔前记录现读数为基线,落笔后只降不升,回升=查因进实现报告。
|
||||
- 指标例外申报:无。未申报超预算进实现段=L3。
|
||||
|
||||
## 15. 拆分边界纪律
|
||||
|
||||
- 迁入件族有集体身份:职责语句「生成侧口径的整板可推理率离线测量(求解器)」,单一变化原因=测量口径变更;算子族八函数各自有独立语义(连锁/单点/派生/约束构造),非凑计数袋。
|
||||
- 生成器删后残留职责单一:「确定性布雷+两条出板检查+指标上报」,无「剩下的成员」式打包。
|
||||
- 「过阈值」仅作发现信号:本批不因 gdstyle 数字硬拆任何未迁函数。
|
||||
|
||||
## 16. 复核记录
|
||||
|
||||
(成文后必经 grilling 对抗复核,逐轮登记于此;复核者未参与本卡撰写。)
|
||||
|
||||
| 轮次 | 复核者身份 | 发现 | 去向 | 处置结果 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | 只读子代理(general-purpose,未参与撰写,禁写文件) | F1 N=1 夹具恒白给、重摇永不退出 | 补写 | §8 1.5 夹具改 N≥2;§10 L3-②、§11 白名单同步 |
|
||||
| 1 | 同上 | F2 完成定义 grep 范围与键形未限 | 补写 | §1 第 2 条改四目录+键形口径 |
|
||||
| 1 | 同上 | F3 tres 尾注历史散句与「列原样」关系未写明 | 自判 | §8 1.2 补注+§3 表行加键形 93 处实数 |
|
||||
| 1 | 同上 | F4 删除区间多处跨语句、schema_vocab 两指令打架 | 补写 | §8 1.5 整段按语句界重写,⑥ 统一为整函数改写 |
|
||||
| 1 | 同上 | F5 reroll_count 相等判据无落实步骤 | 补写 | §8 1.5 新增断言补同种子相等段;§9 R1 行 2 点名落实处 |
|
||||
| 1 | 同上 | F6 README :199 括注「冻结」槽悬空 | 补写 | §6 增列同步义务;README :199 写卡段同批已改 |
|
||||
| 1 | 同上 | F7 行号簇 :150–155/:131/:483–493 等五处 | 自判 | §2/§9/§3/§8 1.4 改正(含节头注 :481–493) |
|
||||
| 1 | 同上 | F8 baseline 无条目级源键、对账无对象 | 自判 | §14/§8 2.1 措辞改「新件建档键+原文件键收缩+默认档自查」 |
|
||||
|
||||
复核凭据=本节自身(2026-11-06 用户裁:不另设报告文件)。
|
||||
@@ -0,0 +1,196 @@
|
||||
# 需求卡片:意图徽标类型级收敛批(2026-11-09)
|
||||
|
||||
> 来源:待办清单「意图徽标类型级收敛批」条目(2026-11-01 登记;2026-11-09 按现行 master 重写,原 2026-11-01 卡作废)。
|
||||
> 验收档:中(呈现数据面——玩家可见、不损持久状态)。
|
||||
> 来源:设计事实源见下节(唯一事实源声明)。
|
||||
|
||||
## 1. 目标与完成定义
|
||||
|
||||
敌方意图徽标收敛回类型级三态(⚔ 攻击系红/✦ 增益系蓝/☠ 妨害系紫)。拆除实现里超出规格的攻击系内部「重击档」:重击(`heavy`)徽标换金墨 `GOLD_INK`、徽标动画多一段「缓推+定格」。拆后重击与其他伤害技徽标完全相同;强度差异交给敌人本体准备动画(本批不动)。
|
||||
|
||||
完成定义(全部满足才算完):
|
||||
|
||||
1. `CHARGE_SKILL_IDS` 常量与 `_intent_charge` 成员退役;`set_pending` 选墨唯一判据=pending_type 三态;`play_intent_motion` 去参、缓推分支删除。
|
||||
2. `GOLD_INK` 常量保留(标签岗在役),徽标层金墨清零;对比度探针、样张工具、分档字样注记同步。
|
||||
3. 验证闸对照表 B1–B8 在当轮真实跑批执行并通过;代码域闸全绿;独立验收审计通过。
|
||||
|
||||
## 2. 设计事实源
|
||||
|
||||
`design/gdd/systems/战斗循环/敌人系统.md` v2.1「目标顺位与意图线索」节——规则句:「攻击系内部不分档预告——重击与普通伤害技的预告呈现完全相同,强度差异的感知通道是敌人本体的准备动画」;同节三档信息面表:特殊技=纯类型级提醒。美术侧=`design/art/character-design.md` v1.0 §5.6 意图准备动画三档(占位符号行已同步为三族、攻击系内部不分档)。与待办清单条目闭合凭据一致。
|
||||
|
||||
用户裁决(2026-11-01,卡内不再开裁):①收敛不拆分;②验证面改动与表现面改动同卡。
|
||||
|
||||
## 3. 现状事实(2026-11-09 master `cf807329` 实读;开工 T0 复核)
|
||||
|
||||
- **分档判据**:`game/presentation/views/standee_body.gd` 文件头常量区 `const CHARGE_SKILL_IDS := ["heavy"]`;成员 `var _intent_charge := false`(行尾注「蓄力档……源码锚承载成员住宿主」)。
|
||||
- **分档写点**:同文件 `set_pending()` 内四处——死亡残位分支与普攻分支各一处 `_intent_charge = false`;三态选墨之后 `_intent_charge = pid in CHARGE_SKILL_IDS` 与 `if _intent_charge: col = UiKit.GOLD_INK`;末行 `mo.play_intent_motion(_intent_charge)`。`mark_dead()` 内一处 `_intent_charge = false`。
|
||||
- **头注**:同文件 `##` 头注第 7–8 行「源码锚承载成员(_intent_charge——theme 源锚句所在行逐字保留)」——成员删除后失实。
|
||||
- **徽标注记**:同文件 `_draw_intent_badge()` 内注记「atk 5.3/buf 4.8/debuff 4.7/charge 4.9」「charge 换 GOLD_INK」——四墨旧口径。
|
||||
- **读出口**:同文件 `intent_probe()` 返回 `{visible, text}`,无墨色字段——本批不动。
|
||||
- **动画**:`game/presentation/views/standee_motion.gd` `play_intent_motion(charge: bool)`——`if charge:` 分支为缩放到 1.22 的缓推+0.40 定格+回落;`else` 分支为 1.26 二次弹跳。函数上方四行注记为「三档运动签名」口径,末行「(charge = 宿主 _intent_charge 分档布尔参判传入)」。全仓唯一调用者=`standee_body.gd` `set_pending()`。
|
||||
- **金墨常量**:`game/presentation/views/ui_kit.gd` `const GOLD_INK := Color8(116, 80, 11)`,注记「深金墨(意图蓄力徽标墨——PANEL_DATA 垫牌上 4.9:1)」。标签岗消费在役:`battle_end_overlay.gd`(结算 GP 行)、`ui_kit.gd`(货架价签)、`forge_view.gd`(锻造区头)、`tree_view.gd`(天赋树分组头)、`treasure_view.gd`(状态字)。
|
||||
- **旧断言①**:`game/tests/unit/presentation/theme_projection_test.gd` `_smoke_contrast_inks()` 内「V4 意图蓄力档判据=分档布尔……〔wd2〕」源码锚——判据 `sb_src.contains("_intent_charge = pid in CHARGE_SKILL_IDS")`。
|
||||
- **旧断言②**:`game/tests/unit/presentation/standee_fx_sweep_test.gd` `_init()` 内「① 意图蓄力档可达(d2)」段——`charge_cases` 四行表,逐行直读内部字段 `s1._intent_charge`(尾缀〔wd2〕);文件头注第 3 行「① 意图蓄力档可达」。
|
||||
- **探针测点**:`game/probe/ui_contrast_probe.gd` `_pairs()` 内「意图charge·垫牌」行(`GOLD_INK` 对 `PANEL_DATA`);文件头注「意图徽标四墨」。
|
||||
- **样张工具**:`tools/render_sample_sheet_v3.py` `draw_standee()` 内意图字典含 `"charge": ("⚔", (116, 80, 11))` 键,上方注记「四色墨对牌 4.7–5.8:1」;熊地精调用 `intent="charge"`(删键不改调用=KeyError);明细带摘要行文案「熊地精 蓄力(重击预告)」;文件尾部 S1b 自检段为「意图徽标四色墨对 PANEL_DATA 垫牌 ≥4.5:1」断言(墨表四行含「蓄力墨」,注记「四墨=意图色表 damage/buff/debuff/charge 四值」)。
|
||||
- **退役旧版样张工具**:`tools/render_sample_sheet.py`(v2)同样含 `"charge"` 键(旧墨值)与 `intent="charge"` 调用——已退役复现件(art-pipeline-tools.md:已被 v3 取代、只用于复现 v2 旧口径),**本批不动**;T0 按 "charge" 全仓检索命中它不判 L3。
|
||||
- **分档字样注记**:`game/probe/fx_probe.gd` 头注「意图三档动画(damage/buff/debuff/charge ……)」与 `_ready()` 内「与蓄力档(heavy)摇定」;`game/tests/run_all.gd` 套件清单 `standee_fx_sweep_test.gd` 行尾「d2 蓄力档」。`game/probe/ui_probe.gd` 的「意图三档动作动画占位」指 GDD 三档信息面(普攻/特殊技/暴击),不失实,不在触面。
|
||||
- **对比度基线**(`theme_projection_test.gd` `_theme_contrast` 同式 WCAG 复算,对 `PANEL_DATA`):RED_MINE 5.62/HERO_BLUE_DEEP 5.10/DEBUFF_PURPLE 4.97,全 ≥4.5。
|
||||
- **技能 id**:`game/data/tables/skills.tres` 含 `heavy` 与 `lunge` 两行(均为伤害技)。
|
||||
- **渲染基线**:`game/tests/golden/` 在库基线不含站桩意图徽标——本批零渲染闸换代面。
|
||||
|
||||
## 4. 设计契约(违反即返工)
|
||||
|
||||
- 🔴 **类型级三态、零分档**:徽标选墨唯一判据=pending_type(damage→RED_MINE/buff→HERO_BLUE_DEEP/debuff→DEBUFF_PURPLE);任何按 skill_id 的徽标分档=规格外分档复发。
|
||||
- 🔴 **强度感知归本体动画**:character-design §5.6 本体准备动画零触碰;徽标动画收敛为单形态(弹入+二次弹跳),禁重造徽标层强度动画。
|
||||
- 🔴 **墨岗守恒**:`GOLD_INK` 常量与取值保留(标签岗在役);RED_MINE/HERO_BLUE_DEEP/DEBUFF_PURPLE 语义岗不动。
|
||||
- 🔴 **拆除不新增、禁无效成员**:零新增文件/函数/常量;`CHARGE_SKILL_IDS`/`_intent_charge`/`play_intent_motion` 的参数禁以别名、注释句或死代码残留;禁为迎合机检消息文本保留无效成员——机检键与本卡契约互斥时停卡呈报,禁自造第三条路(code-conventions §1.1)。本批是拆除收敛,无拆出单元。
|
||||
- 🔴 **验证面同生死**(test-conventions §5.5):两处旧分档断言随实现同批摘除,由新断言替代;新断言从真实入口进入、当轮真实跑批通过。
|
||||
|
||||
## 5. 范围边界
|
||||
|
||||
做:§3 触面——徽标收敛、验证面换代、探针与样张镜像、分档字样注记改写。
|
||||
|
||||
不做(去向):
|
||||
- 敌人本体准备动画、战斗表现摇定动画位——不动,无去向;
|
||||
- `skills.tres` 表值——不动(技能数据零改);
|
||||
- 半血解锁 toast、结算明细行——不动;
|
||||
- 待办清单条目删除——归批后收尾段(实现批禁写待办清单)。
|
||||
|
||||
## 6. 关联文档同步面
|
||||
|
||||
| 文档 | 关联点(本批实现会改变它的哪条陈述) | 同步义务 |
|
||||
|---|---|---|
|
||||
| `design/gdd/systems/战斗循环/敌人系统.md` | 「目标顺位与意图线索」规则句=本批实现依据(v2.1 已落文) | 设计权威文档——实现批禁直改;实现与条款失配→列 `reports/iter<N>-反哺点-<日期>.md` 由用户裁决后归文档批 |
|
||||
| `design/art/character-design.md` | §5.6 占位符号行(已同步三族、攻击系不分档) | 同上 |
|
||||
| `game/tests/README.md` | 能力表行「敌方意图徽标类型级预告」+覆盖域表战斗表现行 | 本写卡批已随卡增行;实现批禁写,批末只核对表上名字与实际落地一致 |
|
||||
| `待办清单.md` | 本条目状态 | 流水线面——实现批禁写;入库后整条删除归收尾段 |
|
||||
|
||||
## 7. 卡前·文件结构图(全部既有件,零新增文件)
|
||||
|
||||
| 文件 | 职责 | 改动性质 |
|
||||
|---|---|---|
|
||||
| `game/presentation/views/standee_body.gd` | 徽标三态选墨收敛;分档常量/成员/复位句退役;头注与徽标注记改写 | 行为改动(B1、B2) |
|
||||
| `game/presentation/views/standee_motion.gd` | 徽标动画单形态(去参+删缓推分支+注记) | 行为改动(B3) |
|
||||
| `game/presentation/views/ui_kit.gd` | `GOLD_INK` 注记改标签岗口径(常量零动) | 非行为改动(B6) |
|
||||
| `game/tests/unit/presentation/theme_projection_test.gd` | 旧蓄力锚退役+新源码锚+三墨对比锚 | 非行为改动(验证面换代,B2/B3/B4) |
|
||||
| `game/tests/unit/presentation/standee_fx_sweep_test.gd` | 蓄力判据表退役+`intent_probe()` 真实入口断言 | 非行为改动(验证面换代,B1) |
|
||||
| `game/probe/ui_contrast_probe.gd` | charge 测点行退役+头注三墨 | 非行为改动(验证面换代,B5) |
|
||||
| `tools/render_sample_sheet_v3.py` | 样张镜像同步 | 非行为改动(工具镜像,B7) |
|
||||
| `game/probe/fx_probe.gd` | 分档字样注记两处改写;heavy 摇定用例保留 | 非行为改动(B8) |
|
||||
| `game/tests/run_all.gd` | 套件清单行尾注记改写 | 非行为改动(B8) |
|
||||
|
||||
## 8. 任务卡
|
||||
|
||||
估时总计 ≈0.75 个工作日(区间 0.5–1.0);单轮无切分,超盒停卡呈报。
|
||||
|
||||
### T0 事实坐实(0.25d)
|
||||
|
||||
- 取用:§3 全部事实。
|
||||
- [ ] 全仓检索 `CHARGE_SKILL_IDS`/`_intent_charge`/`play_intent_motion`/`GOLD_INK`,列消费面清单。判据:前三者消费面=§3 在册位;`GOLD_INK` 徽标岗仅 `standee_body.gd` 一处、标签岗 ≥1。清单外代码消费者=L3。
|
||||
- [ ] 跑 `bash game/tests/static_scan.sh`,记录 `standee_body.gd`/`standee_motion.gd`/`ui_kit.gd` 三件 S13 现值。
|
||||
- [ ] 直跑 `ui_contrast_probe.tscn`,记录现测点总数 N。
|
||||
- 产出:消费面清单、S13 现值、测点数 N(写进实现报告)。
|
||||
|
||||
### T1 拆除收敛与验证面换代(0.5d)
|
||||
|
||||
- 取用:T0 消费面清单。
|
||||
- [ ] `standee_body.gd`:删 `CHARGE_SKILL_IDS` 常量与 `_intent_charge` 成员;删 `set_pending()` 与 `mark_dead()` 内全部 `_intent_charge` 写句及 `if _intent_charge:` 金墨分支;末行改 `mo.play_intent_motion()`。三态选墨原样保留。
|
||||
- [ ] `standee_body.gd` 头注:删「与源码锚承载成员(_intent_charge——……)」半句,只写现行模块事实(措辞避开 audit_file_headers 变更叙事黑名单与日期形态)。
|
||||
- [ ] `standee_body.gd` `_draw_intent_badge()` 注记改三墨口径:atk 5.62/buf 5.10/debuff 4.97;删「charge 换 GOLD_INK」。
|
||||
- [ ] `standee_motion.gd`:签名改 `func play_intent_motion() -> void`;删 `if charge:` 分支,二次弹跳两行升为无条件;上方注记改两形态口径(①普攻零表示=`set_pending` 早退;②特殊技=弹入+二次弹跳;强度档归本体准备动画)。
|
||||
- [ ] `ui_kit.gd`:`GOLD_INK` 行尾注记改标签岗口径(结算 GP 行/价签/分组头/状态字;PANEL_DATA 上 5.21:1);常量值零动。
|
||||
- [ ] `theme_projection_test.gd` `_smoke_contrast_inks()`:删旧「V4 意图蓄力档判据=分档布尔」断言;同位置加四条——
|
||||
- 「V2 攻击系徽标墨=RED_MINE 原位」:`sb_src.contains("var col: Color = UiKit.RED_MINE")`;
|
||||
- 「V2 standee_body 源码零 GOLD_INK 零 CHARGE_SKILL_IDS」:`not sb_src.contains("GOLD_INK") and not sb_src.contains("CHARGE_SKILL_IDS")`;
|
||||
- 「V3 standee_motion 缓推分支清零」:读 `res://presentation/views/standee_motion.gd` 为 `motion_src`,判据 `not motion_src.contains("1.22") and motion_src.contains("func play_intent_motion() -> void")`;
|
||||
- 「V4 意图徽标三墨对垫牌 ≥4.5」三条:`_theme_contrast(uikit_s.RED_MINE, uikit_s.PANEL_DATA) >= 4.5`,HERO_BLUE_DEEP、DEBUFF_PURPLE 同式;消息带 `%.2f` 读数。
|
||||
- [ ] `standee_fx_sweep_test.gd` `_init()`:删「① 意图蓄力档可达」段与头注第 3 行;同位置加断言两条——`s1.set_pending("damage", "heavy")` 后「重击(heavy)徽标=攻击系 ⚔ 且可见〔徽标收敛 V1〕」:`s1.intent_probe().visible and s1.intent_probe().text == "⚔"`;`s1.set_pending("damage", "lunge")` 后「突刺(lunge)徽标=攻击系 ⚔ 且可见〔徽标收敛 V1〕」同判据。头注 ① 改为「① 意图徽标攻击系不分档(heavy 与 lunge 同呈现)」。
|
||||
- [ ] `ui_contrast_probe.gd`:删「意图charge·垫牌」行;头注「意图徽标四墨」→「意图徽标三墨」。
|
||||
- [ ] `tools/render_sample_sheet_v3.py`:删 `"charge"` 键;熊地精调用 `intent="charge"`→`intent="damage"`;摘要行「熊地精 蓄力(重击预告)」→「熊地精 攻击系预告」;注记「四色墨对牌 4.7–5.8:1」→「三色墨对牌 4.97–5.62:1」;尾部 S1b 自检段改三墨——墨表删「蓄力墨」行、断言名「四色墨」→「三色墨」、注记改「三墨=意图色表 damage/buff/debuff 三值」。
|
||||
- [ ] 分档字样注记:`fx_probe.gd` 头注 `damage/buff/debuff/charge` → `damage/buff/debuff`,`_ready()` 内「与蓄力档(heavy)摇定」→「含重击(heavy)同属攻击系」;`run_all.gd` 行尾「d2 蓄力档」→「d2 意图徽标攻击系不分档」。
|
||||
- [ ] 孤立验证:
|
||||
- `godot --headless --path game --script res://tests/unit/presentation/theme_projection_test.gd`,期望 exit 0;
|
||||
- `godot --headless --path game --script res://tests/unit/presentation/standee_fx_sweep_test.gd`,期望 exit 0;
|
||||
- 工作目录 `game/` 下 `…console.exe --headless --path . res://probe/ui_contrast_probe.tscn`,期望 PASS 且测点数=N−1;
|
||||
- 工作目录 `game/` 下直跑 `res://probe/fx_probe.tscn`,期望 PASS;
|
||||
- `python tools/render_sample_sheet_v3.py` 全路径试车,期望零异常退出、产物落盘。
|
||||
- [ ] 复跑 `static_scan.sh`,核对三件 S13 只降不升。
|
||||
- 产出:收敛落地+验证面换代+孤立验证读数(写进本步提交信息)。
|
||||
|
||||
### T2 产出物落位(末卡,0.25d 内含于总估时)
|
||||
|
||||
- [ ] 里程碑步出口跑一次改动域全套闸:`bash tools/run_all_gates.sh --code`,期望回执 all_green;波内修复只做出红最小单元的最窄确认。
|
||||
- [ ] 独立验收审计(未参与实现的会话或子代理),报告落 `reports/iter<N>-验收审计-<日期>.md`;未过不得合并。
|
||||
- [ ] 合并前写齐 `reports/iter<N>-实现报告-<日期>.md`(卡状态+实机目检总清单〔徽标弹入单形态观感一项,登记不阻塞〕+实现决定记录)与 `reports/iter<N>-反哺点-<日期>.md`(同步面四行逐条交代落点:两份设计文档已落文无需同步、README 已增行、待办清单归收尾段删除)。
|
||||
|
||||
## 9. 验证闸(改动—验收对照表)
|
||||
|
||||
| # | 需求点(含判据出处锚) | 改动(文件/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| B1 | 重击与其他伤害技徽标呈现相同——`design/gdd/systems/战斗循环/敌人系统.md「目标顺位与意图线索」攻击系内部不分档预告 | `standee_body.gd` `set_pending()` 分档退役 | 「重击(heavy)徽标=攻击系 ⚔ 且可见」「突刺(lunge)徽标=攻击系 ⚔ 且可见」`standee_fx_sweep_test.gd:_init`〔徽标收敛 V1〕 | 单元 | `StandeeBody.set_pending()` → `intent_probe()` | `intent_probe()` 返回 visible/text;观测面局限申报:墨色无运行期读出口,墨收敛由 B2 源码锚承载 | 新增:敌方意图徽标类型级预告 |
|
||||
| B2 | 徽标墨只按三态选、金墨退出徽标——`design/gdd/systems/战斗循环/敌人系统.md「目标顺位与意图线索」攻击系内部不分档预告 | `standee_body.gd` 常量/成员退役+头注改写 | 「攻击系徽标墨=RED_MINE 原位」「standee_body 源码零 GOLD_INK 零 CHARGE_SKILL_IDS」`theme_projection_test.gd:_smoke_contrast_inks`〔徽标收敛 V2〕 | 单元 | theme_projection 套件(FileAccess 读源码) | 源码 contains/not contains;观测面局限申报:墨值进 draw 调用、无运行期读出面,库内源码锚先例同型 | 新增:敌方意图徽标类型级预告 |
|
||||
| B3 | 徽标动画单形态、强度归本体——`design/gdd/systems/战斗循环/敌人系统.md「目标顺位与意图线索」强度差异的感知通道是敌人本体的准备动画 | `standee_motion.gd` 去参+删缓推分支 | 「standee_motion 缓推分支清零」`theme_projection_test.gd:_smoke_contrast_inks`〔徽标收敛 V3〕+`standee_fx_sweep_test.gd` 套件复跑(签名失配即红);弹入观感归实机目检(登记不阻塞) | 单元+目检登记 | theme_projection 套件;standee_fx_sweep 真实站桩实例链 | 源码 not contains "1.22" 且含无参签名;观测面局限申报:tween 时序无 headless 读出面 | 新增:敌方意图徽标类型级预告 |
|
||||
| B4 | 三墨对垫牌达标——`design/art/art-bible.md「7.2 UI 色板细则」全局文字可读性硬指标 | `theme_projection_test.gd` 增三条常量对比断言 | 「意图徽标三墨对垫牌 ≥4.5」三条 `theme_projection_test.gd:_smoke_contrast_inks`〔徽标收敛 V4〕 | 单元 | UiKit 常量实时求值(`_theme_contrast`) | 对比度 ≥4.5(基线 5.62/5.10/4.97) | 既有:UI 全局主题与按钮五态(含对比度锚) |
|
||||
| B5 | 探针测点随呈现面退役——`design/art/art-bible.md「7.2 UI 色板细则」全局文字可读性硬指标 | `ui_contrast_probe.gd` 删 charge 行+头注 | 探针直跑 PASS、测点数=N−1、`GOLD_INK` 标签岗行全绿〔徽标收敛 V5〕 | 探针 | `res://probe/ui_contrast_probe.tscn` headless 直跑 | 退出码 0+PASS 行测点计数 | 既有:UI 全局主题与按钮五态(含对比度锚) |
|
||||
| B6 | `GOLD_INK` 转标签岗注记——`design/art/art-bible.md「7.2 UI 色板细则」全局文字可读性硬指标 | `ui_kit.gd` 注记改写(常量零动) | **非行为改动**(纯注释)——B5 同轮标签岗行复跑绿〔徽标收敛 V6〕 | 探针 | `res://probe/ui_contrast_probe.tscn` | 标签岗测点全绿 | 既有:UI 全局主题与按钮五态(含对比度锚) |
|
||||
| B7 | 样张镜像同步——`design/art/character-design.md「意图准备动画三档」攻击系内部分档不作预告 | `render_sample_sheet_v3.py` 删键+改调用+改文案 | **非行为改动**(工具不入闸不入包)——全路径试车零异常+产物落盘〔徽标收敛 V7〕 | 工具试车 | `python tools/render_sample_sheet_v3.py` | 进程零异常退出(删键漏改调用即 KeyError) | 既有:站桩呈现定值与素材绑定 |
|
||||
| B8 | 分档字样注记清零——`design/gdd/systems/战斗循环/敌人系统.md「目标顺位与意图线索」攻击系内部不分档预告 | `fx_probe.gd` 两处、`run_all.gd` 一处注释改写 | **非行为改动**(纯注释)——`fx_probe.tscn` 直跑 PASS(heavy 摇定徽标可见用例保留)+两单元套件选跑〔徽标收敛 V8〕 | 探针+套件 | `res://probe/fx_probe.tscn`;`run_all.gd -- --only=theme_projection,standee_fx_sweep` | 退出码 0;选跑命中两套件 | 新增:敌方意图徽标类型级预告 |
|
||||
|
||||
测试方式两分法:无调试接口注入面,全部机检自动化;目检仅「徽标弹入单形态观感」一项,登记实现报告目检总清单即完成义务(登记不阻塞)。
|
||||
|
||||
**测试削弱申报**(允许改动的旧断言全集,超出由独立审计判红):
|
||||
1. `theme_projection_test.gd` 旧「V4 意图蓄力档判据=分档布尔」源码锚〔wd2〕退役——所绑成员随批删除,由 B2 双锚替代。
|
||||
2. `standee_fx_sweep_test.gd` 蓄力判据表四条〔wd2〕退役——内部字段直读随成员退役,由 B1 `intent_probe()` 真实入口断言替代(test-conventions §8.2 触碰即换代款)。
|
||||
3. `ui_contrast_probe.gd` charge 测点行删除——所绑呈现面退役,其余测点判据零动。
|
||||
显式禁止:删其他旧断言、放宽 4.5 阈值、把 `intent_probe()` 断言换回内部字段直读。
|
||||
|
||||
**独立验收审计**:入口=未参与实现的会话或子代理;逐行核对照表两端、抽查判据绑定面、核削弱申报、确认全文无变异/撤销类取证;报告落 `reports/iter<N>-验收审计-<日期>.md`;未过不得合并。验收档=中(审计深度按 test-conventions §8.7 中档)。
|
||||
|
||||
**回归措辞**:里程碑步(T 段)出口跑一次全套闸;波内修复只做出红最小单元的最窄确认;新增断言先行孤立验证再并入全套。
|
||||
|
||||
## 10. 异常分级
|
||||
|
||||
- **L1 自救一次**:注记与断言消息措辞、检索形态、单件直跑命令拼装、读数插值格式。
|
||||
- **L2 记录继续**(同一红连续三次升 L3):§3 位置描述与实读有出入但触面不变;S13 读数与预期不一致但键不升。
|
||||
- **L3 停机呈报**:①拆除面发现 §3 清单外代码消费者;②`GOLD_INK` 标签岗零消费(常量去留变化);③为凑机检保留无效成员/别名,或 S13 键被迫升=机检预算互斥,上游缺陷停卡退回写卡段;④换代后窄测红且非本批触面成因。禁变异类测试与撤销类取证。
|
||||
|
||||
## 11. 代拍板白名单
|
||||
|
||||
1. 注记、头注与断言消息措辞(判据取值与断言内容卡内已定)。
|
||||
2. 断言消息读数插值格式。
|
||||
3. 检索形态(grep/编辑器全局搜索,判据等价)。
|
||||
|
||||
超出必呈报:判据取值、成员与常量去留、触面增减、能力行名字、测试函数落点。
|
||||
|
||||
## 12. 待裁点
|
||||
|
||||
零待裁点,开工门=U0(用户发令,经迭代编排段编入迭代)。
|
||||
|
||||
## 13. 落位与可复用性预检
|
||||
|
||||
- **新增面清点**:零新增文件、零新增函数/方法、零新增常量与数据件;新增断言 8 条落在两个既有测试函数内。
|
||||
- **复用面**:徽标读出复用既有 `StandeeBody.intent_probe()`(全仓唯一徽标读出面,禁另造);对比度公式复用 `theme_projection_test.gd` `_theme_contrast`(禁复制公式);三墨锚落 `_smoke_contrast_inks()` 既有对比度锚段(能力清单在册代表用例);样张字典键集收敛,禁新增键。
|
||||
- **唯一面**:徽标选墨只在 `set_pending()` 一处;徽标动画只在 `play_intent_motion()` 一处;三墨对比锚只落单元套件一处,样张工具 S1b 同批改三墨(镜像读数面,不另立第二锚——S1b 现状即在重复该判据,随批同口径换代)。新增断言 8 条(theme_projection 6+standee_fx_sweep 2)落在两个既有测试函数内。
|
||||
- **分层与交互面**:只动 `standee_body` → `standee_motion` 的既有调用边(去参,调用关系不变);Core/RNG/数值表零触碰。
|
||||
|
||||
## 14. 实现规范预算
|
||||
|
||||
零新增文件,新件三查不适用。存量触面 S13 预期(较 T0 现值只降不升):
|
||||
|
||||
| 触面 | 预期 |
|
||||
|---|---|
|
||||
| `standee_body.gd` | 类变量 −1(`_intent_charge`);`set_pending()` 分支 −1 |
|
||||
| `standee_motion.gd` | `play_intent_motion()` 分支 −1 |
|
||||
| `ui_kit.gd` | 零变化(纯注释) |
|
||||
|
||||
S13 键被迫升=L3;禁手改 `tools/gdstyle_baseline.txt`。
|
||||
|
||||
## 15. 复核记录
|
||||
|
||||
| 轮次 | 复核者 | 发现 | 去向 | 处置结果 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | 只读子代理(未参与撰写) | 核实为真合并记录:§3 现状 16 条逐条实读全对(file:line 与字面判据串逐字一致);对比度五比值独立复算吻合(5.62/5.10/4.97/5.21/5.84);无 §3 清单外代码消费者;T1 断言判据改动后均成立(RED_MINE 原位、GOLD_INK 仅两处均在拆除面、"1.22" 仅缓推一行);B1–B8 内容锚逐行实读在位且语义匹配(敌人系统 v2.1:206、art-bible「7.2 UI 色板细则」:458、character-design v1.0:81);能力行三行在场;削弱申报完备;预算/落位/结构图自洽;引擎面 Tween 用法无 NEVER/Gotcha 触碰;无旧卡残留、无行号锚 | 自判 | 核实为真,零改 |
|
||||
| 1 | 同上 | 样张工具 S1b 自检段漏列——`render_sample_sheet_v3.py:1212-1223` 现有「意图徽标四色墨对 PANEL_DATA 垫牌 ≥4.5:1」断言(墨表含蓄力墨行、注记「四墨=…charge 四值」),删 charge 键后 S1b 原样保留=四墨分档字样在工具存活,完成定义 2 不闭合 | 补写 | §3 补 S1b 现状行;T1 render 步补「S1b 墨表删蓄力墨行、断言名与注记改三墨」;§13 唯一面改「S1b 同批改三墨,不另立第二锚」 |
|
||||
| 1 | 同上 | 退役 v2 样张工具 `render_sample_sheet.py:638,663` 同含 `"charge"` 键与 `intent="charge"`——T0 四词检索不命中它,但实现期按白名单搜 "charge" 会撞见并误触 L3① | 补写 | §3 补退役旧版工具现状行(已被 v3 取代、本批不动、命中不判 L3),T0 判据同口径 |
|
||||
| 1 | 同上 | §13「新增断言 7 条」计数不符——theme_projection 6(V2 两+V3 一+V4 三)+standee_fx_sweep 2=8 | 自判 | 改 8 条(theme_projection 6+standee_fx_sweep 2 口径) |
|
||||
@@ -0,0 +1,181 @@
|
||||
# 需求卡片:文案入表批(文案承载实装)
|
||||
|
||||
- 来源:待办清单「结算明细文案入表」(2026-11-07 登记,来源=批次移交)(唯一事实源:design/engineering/code-conventions.md §2.5「玩家可见文案承载」+design/gdd/systems/战斗循环/战斗结算.md v2.1 :87+design/gdd/术语表.md v1.30「文案承载」节)
|
||||
- 验收档:高(牵数值表结构与 schema 校验改名——存档无关但表结构校验面整体触改,按最高档申报)
|
||||
- 基线声明:本卡现状面以「明细带退役呈现改版批」合入后终态为基线(该卡删六类叙述行/两 toast,本卡不再迁它们);两卡同批编排时本卡排后,跨批时 T0 先核面
|
||||
|
||||
## 1. 目标与完成定义
|
||||
|
||||
文案承载换代实装:strings.csv 建立+翻译管线注册;数据表行文案字段 key 化(display_name→display_key、desc→desc_key,值迁 strings.csv);core 结算行 display 拼装改 key 发射;呈现层残余玩家可见文案全部经 tr() 取用;场景静态文案 key 化;漏网字面量 grep 断言清零。完成定义=对照表 W1–W6 全绿+代码域闸绿+产品码玩家可见文案字面量 grep=0。
|
||||
|
||||
## 2. 现状事实(file:line 实查)
|
||||
|
||||
- 翻译管线现状=零:project.godot 无 internationalization 配置(grep 零命中;默认 locale=en——注册 zh_CN 翻译后须同批设 locale/fallback,否则 tr() 按 key 原样返回);`tr(`/`atr(` 在 game/presentation 与 game/core 零使用。
|
||||
- **产品码全量字面量普查(2026-11-10 编排预检实核,非注释非诊断行)**:presentation ≈356 行、core ≈138 行——本卡迁移面=三目录全量(§2.5 红线全量口径,非窄清单)。presentation 整文件级清单(25+ 件):legend_overlay.gd:9-17(ENTRIES)、level_map_screen.gd:18-25、shop_overlay_view.gd(14)、career_overlay.gd(18,main_ui_build.gd:141 已接线)、settings_overlay.gd:49-91、save_select_overlay.gd(13)、status_panel.gd(13)、hero_info_panel_view.gd(13)、treasure_view.gd(16)、board_view.gd:570/:587/:598(u7 钉的 glyph「危」)、forge_view.gd(12)、curio_pick_overlay.gd:41/:48/:77/:81、tree_view.gd(8)、ap_bar_view.gd(9)、ui_kit.gd(4)、confirm_dialog.gd(4)、camp 系四件、ui_assembler.gd(8)、main_overlay_flow.gd(5)、debug_overlay.gd(24)、standee_body.gd:83/:115/:269/:272(4)等+既有零散清单(camp_shop_presenter 11/treasure_interact 5/curio_interact 6/main 16/main_adventure_flow 12/node_overlay 3/battle_end_overlay 2/status_slot_row 1/浮字装配 1)。core 件级:reward_grant.gd:100/:102(reason 中文值经 treasure_interact_controller.gd:103 toast 直达玩家)、effect_engine.gd(10)、battle_orchestrator.gd(8)、save_manager.gd(7)、treasure_items.gd(5)、combat_segment.gd(4)及结算四件 17 锚行(grant_segment:73/294/318/321/333/399/414/438/441、damage_controller:397/425/483/508/515/533、verdict_segment:38/42、round_cycle:109)。
|
||||
- 数据表文案值:tables/ 实存 21 张 .tres,含文案字段 13 张——display_name 163、desc 48、name_a/name_b 6、settlement.tres:9 source_label_map 7 值(总中文值行 229);另有 493 行中文为表内 `;` 注释(不迁)。
|
||||
- schema 键面:「display_name 空/为空」校验 13 处/11 件(feat:36、skill:66、status_effect:48、enemy:95、treasure_item:89、hero:22、shop:51/:93/:119 及 meta_tree/level/reward/variation 五件);键集同步面五处:feat_table.gd:16(ROW_KEYS)、meta_tree_table.gd:17(KEY_WHITELIST)、forge_table.gd:16(ROW_KEYS)、treasure_item_table.gd:50(KEY_WHITELIST)、hero_table.gd:11(默认值「探险者」)。
|
||||
- **既有断言钉值面(player_copy_sweep_test.gd 六组,迁移后须同步改写钉 key/译文)**:u1-u3(:50-66 hero 面板段头/兜底)、u4(:78-85 legend 钉值)、u5(:102-104 tooltip 来源注记)、u6(:105-106 source_label_map[mine_hit]==「危险格」)、u7(:153 glyph==「危」)、_sweep_refresh_toast_no_literals(:178-195——源锚=main.gd:721/:724 两 toast 中文字面量,「断言钉在场」与迁移清零对撞,改写义务本卡登记);另迭代 58 刷新经济批新增断言 table_structure_guard_test V10「reserve_jar 投影仍为存量字面」与 meta_progression.gd:108-109 存量字面回退分支——treasure_items.tres 全量迁移后断言必红、回退分支成死代码,改写/退役义务本卡登记。
|
||||
- 行号基线声明:本节行号=卡A(明细带退役批)执行前实测;卡A 先行改动后行号漂移由 T0 核面步统一重算(§17③)。
|
||||
- 场景静态文案:复核实证 game/ 全部 22 个 .tscn 中文字符=0——无独立场景迁移面,W5 降为核验行。
|
||||
## 3. 设计契约
|
||||
|
||||
- 🔴 文案值单点:玩家可见文案值只住 game/data/l10n/strings.csv(key 列+zh_CN 列);代码、数据表行、场景文件零文案字面量(code-conventions §2.5)。
|
||||
- 🔴 key 模板:点分 `<表域>.<行id或map键>.<字段>`(表行,覆盖 name/name_a/name_b/desc/source_label_map 子键)/`<界面域>.<用途>`(界面文案);全库唯一,登记于 strings.csv;禁两处同名异值。
|
||||
- 🔴 core 层只发 key 不取文案:结算行 display 字段值改 display_key(行协议字段形态变更已由战斗结算 v2.1 覆盖);core 禁 import 翻译服务取中文。
|
||||
- 🔴 schema 改名同步:display_key/desc_key 进各表 ROW_KEYS/KEY_WHITELIST,空校验改 key 格式校验(非空+点分),禁保留旧键双轨。
|
||||
- 🔴 日志落盘零文案不变:text/display 不落盘边界(战斗结算 v2.1)不因本卡改动。
|
||||
- 🔴 禁变异测试与撤销取证:字面量清零断言用产品码静态 grep(真实闸跑批),禁「先迁走再改回」式取证。
|
||||
|
||||
## 4. 范围边界
|
||||
|
||||
做:上列管线建立、三处迁移(表行 13 张/core 行全量/呈现层全量 ≈356 行)、漏网清零断言、能力表同批维护。
|
||||
不做(去向):诊断文案(push_error/assert/errs.append/fatal_screen/_fatal/logger.log/日志)与 sim/probe/tests 文字(code-conventions §2.5 豁免面);493 行 .tres 注释;静态扫描闸新增 S 规则(tools/ 面=工程改动直改类,登记待办清单另行批);多语言(语言列扩展归设置与本地化后置);UI 呈现观感(零视觉变化,golden 基线不受影响——场景 text 值渲染结果逐像素不变)。
|
||||
|
||||
## 5. 关联文档同步面
|
||||
|
||||
| 文档 | 关联点 | 同步义务 |
|
||||
|---|---|---|
|
||||
| game/data/tables/*.tres(18 张) | display_name/desc 值迁出 | 本批实现直接改(数据件非 design/) |
|
||||
| design/gdd/systems/战斗循环/战斗结算.md | :87 行公共字段「显示名」提法与 display_key 形态核 | 实现批列反哺点(v2.1 已写「数据表行只登记文案 key」,实现核对提法一致性) |
|
||||
| design/gdd/术语表.md | 文案 key 词条的 key 模板句核对 | 实现批列反哺点 |
|
||||
| game/tests/README.md | 能力行增删 | 本卡写卡段执行 |
|
||||
| design/ux/battle.md | 浮字文案来源句(暂字串→tr) | 实现批列反哺点 |
|
||||
|
||||
## 6. 卡前·文件结构图
|
||||
|
||||
| 文件 | 职责 | 行为改动 |
|
||||
|---|---|---|
|
||||
| game/data/l10n/strings.csv | 扩展:文案值唯一承载(迭代 58 刷新经济批首建,本卡第二使用批) | 是(W1) |
|
||||
| game/project.godot | 翻译资源注册(internationalization/translations) | 是(W1) |
|
||||
| game/data/tables/*.tres(含文案字段 13 张) | display_name→display_key、desc→desc_key,值改 key | 是(W2) |
|
||||
| game/data/schemas/ 十一件 | 键改名+key 格式校验(13 处「display_name 空/为空」校验全集+键集同步面五处) | 是(W2) |
|
||||
| game/core/config_db.gd 及读取面 | display_name 读取改 display_key(透传 key,取文案归呈现) | 是(W2) |
|
||||
| game/core/settlement/grant_segment.gd、damage_controller.gd、verdict_segment.gd、round_cycle.gd | display 拼装改 key 发射(插值数字留数值字段) | 是(W3) |
|
||||
| game/presentation/ 五控制器/Presenter+views(toast/账行/SOURCE_NAMES/浮字装配) | 字面量改 tr("KEY") | 是(W4) |
|
||||
| game/presentation/views/battle_end_overlay.gd | 固定名「战利品 GP」改 tr | 是(W4) |
|
||||
| game/tests/unit/presentation/player_copy_sweep_test.gd | 扩展三函数+六组既有钉值断言同步改写(u1-u7/refresh_toast——见 §2 断言钉值面) | 是(W1/W4/W6) |
|
||||
| game/tests/unit/core/config_table_key_test.gd | 新增:表行 key 格式断言(W2) | 是 |
|
||||
| game/tests/README.md | 能力行同批维护(写卡段执行,已入表) | 否 |
|
||||
|
||||
## 7. 任务卡
|
||||
|
||||
### T0 管线建立与核面(0.75 日)
|
||||
- [ ] 扩展既有 game/data/l10n/strings.csv(迭代 58 刷新经济改版批首建,表头 `key,zh_CN`——表头随实盘,本卡不再自定):追加本卡探路 key 与全部迁移 key(含 1 个带 %d 占位)
|
||||
- [ ] project.godot 注册翻译资源(设置键 `internationalization/locale/translations`)+**locale 设定**(`internationalization/locale/fallback` 或 test 默认 `TranslationServer.set_locale("zh_CN")`——缺此步 tr() 按 key 原样返回,W1 必红)
|
||||
- [ ] **跨批核面步**:卡A(明细带退役批)与迭代 58 五卡(刷新经济改版/可推理率退役/跨表量级护栏/全局特殊间隔闸/意图徽标类型级收敛)合入后,按终态重算本卡 §2 行号(file:line 窄复核,漂移处就地更新清单;已知漂移源=main.gd 删 check_board_hints 致锚行上移、battle_orchestrator/grant_segment 增行、skill_table/hero_table 增行、迭代 57 棋盘瓦片批 board_view 一族重做);另核对 treasure_item_table.gd 校验中间态(迭代 58 改「display_name 与 display_key 至少一方非空」双轨)——本卡 T1 在该中间态之后收拢为 key 格式校验
|
||||
- [ ] **全量普查脚本步**:跑字面量普查(python 读盘扫描三目录非注释非豁免行,豁免词法见 W6),逐行清单落 reports/iter<N>-实现报告附录——T3 迁移对账的唯一底册
|
||||
- [ ] **刷导入步**:`--editor --quit` 触发 strings.csv→.translation 导入(全新 checkout 无导入则 W1 必红)
|
||||
- [ ] 冒烟断言:一个探路 Label 经 tr() 取到中文(player_copy_sweep_test.gd:_sweep_tr_roundtrip 首个用例)
|
||||
- [ ] 接口产出:strings.csv 路径常量 `STRINGS_CSV_PATH`(归 T4 闸用)
|
||||
|
||||
### T1 数据表行 key 化(1–1.5 日)
|
||||
- [ ] 18 张 tres:display_name/desc/name_a/name_b/source_label_map 值改 key(模板 `<表域>.<行id>.<字段>`),中文值迁 strings.csv
|
||||
- [ ] 十一 schema:键改名+「display_name 空/为空」13 处校验改 key 格式(非空+含 `.`);键集同步面五处(feat:16/meta_tree:17/forge:16/treasure_item:50/hero:11)全数改
|
||||
- [ ] ConfigDB 与全部读取面改读 display_key;呈现消费点改 `tr(row.display_key)`
|
||||
- [ ] meta_progression.gd:108-109 存量字面回退分支改写(回退读 display_key 经 tr 取文案)+table_structure_guard_test V10 断言改钉 key 形态(迭代 58 断言退役/改写登记)
|
||||
- [ ] schema 校验闸+表驱动单元全绿
|
||||
- [ ] 接口产出:无新签名(键名替换);验证:单元全套件
|
||||
|
||||
### T2 core 行 key 化(1–1.5 日)
|
||||
- [ ] grant_segment/damage_controller/verdict_segment/round_cycle 的 display 拼装字串改 key 常量(`const DISPLAY_KEY_*`),插值数字留原数值字段
|
||||
- [ ] core 其余玩家可见面 key 化(按 T0 普查底册逐件):reward_grant.gd:100/:102 reason 中文值(经 treasure_interact_controller.gd:103 toast 直达玩家)改 reason key+呈现面 tr、effect_engine/battle_orchestrator/save_manager/treasure_items/combat_segment 逐件按消费面分类(玩家可见→key;纯诊断→§2.5 豁免登记)
|
||||
- [ ] 单元断言:结算行 display 值全库无中文字符(新用例挂 battle_settlement 套件)
|
||||
- [ ] 接口取用:无;产出:DISPLAY_KEY_* 常量名清单(T3 无消费、登记待办供生涯批取用)
|
||||
|
||||
### T3 呈现层全量迁移(3.5–5.5 日)
|
||||
- [ ] 按 T0 普查底册逐件迁移 presentation ≈356 行(§2 整文件级清单 25+ 件+零散清单全量)改 tr("KEY")——每件迁完即跑该件对应测试(改完即测)
|
||||
- [ ] **atr() 通道**:hud_presenter.gd 等 static 语境(非 Node 实例)用 `atr()`(Object 级翻译)——hud_presenter 十个 static 函数逐个过,禁为取文案把 static 改实例
|
||||
- [ ] 带插值的字串:tr 取模板后 `%` 格式化(tr("camp.buy_denied") % 值形态)
|
||||
- [ ] **player_copy_sweep_test 六组钉值断言同步改写**:u1-u7 改钉 key 或 tr 后译文、_sweep_refresh_toast_no_literals 改钉 tr 调用形态(main.gd:721/:724 两 toast 迁 tr 后源锚换 key)
|
||||
- [ ] 接口取用:strings.csv(T0);验证:单元+冒烟
|
||||
|
||||
### T4 漏网清零与收口(0.5 日)
|
||||
- [ ] player_copy_sweep_test 扩展静态断言 _sweep_zero_product_literals:grep 产品码三目录(core/data/presentation)非豁免文件的玩家可见中文字面量=0(诊断文案按 §2.5 豁免词法:push_error/assert/push_warning/_diag/errs.append/fatal_screen/_fatal/logger.log 行白名单);.tscn 面纳入扫描词法(实证现值 0,防回归)
|
||||
- [ ] 编辑器生成 POT 核对漏网(手动步,读数进实现报告)
|
||||
- [ ] 产出物落位卡:reports/iter<N>-实现报告、反哺点清单(同步面 5 行)
|
||||
|
||||
估时合计:6.75–9.75 日(中值 8.25)。
|
||||
|
||||
## 8. 验证闸(改动—验收对照表)
|
||||
|
||||
| 需求点 | 改动(文件:行为) | 验收测试 | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| W1 管线端到端 `design/engineering/code-conventions.md「2.5 玩家可见文案承载」文案值只住` | strings.csv+project.godot 翻译注册+locale 设定 | player_copy_sweep_test::_sweep_tr_roundtrip | 单元 | 场景 Label 实例化 | tr("探路key") 返回值=csv 中文列值 | 新增:文案承载单点 |
|
||||
| W2 表行 key 化 `design/engineering/code-conventions.md「2.5 玩家可见文案承载」数据表文案字段更名` | 13 张 tres+十一 schema | config_table_key_test::_test_display_key_format+schema 校验闸 | 单元 | ConfigDB 加载真实表 | 行键名=display_key/desc_key+值点分格式+旧键 grep=0(十一件全集) | 新增:表行文案 key 化 |
|
||||
| W3 core 行 key 化 `design/gdd/systems/战斗循环/战斗结算.md「明细流水」数据表行只登记文案 key` | 结算四件 display 发射 | battle_settlement 套件新用例 | 单元 | 真实结算流(round_end 驱动) | 发射行 display 值无中文字符 | 既有:表行文案 key 化 |
|
||||
| W4 呈现层迁移 `design/engineering/code-conventions.md「2.5 玩家可见文案承载」取文案只经` | toast 33 处/账行/SOURCE_NAMES/浮字/node_overlay | player_copy_sweep_test::_sweep_no_literal_toast | 单元 | 真实 UI 交互流 | show_toast/tr 调用点字面量 grep=0 | 既有:玩家面文案与危险格格面字形 |
|
||||
| W5 场景文案核验 `design/engineering/code-conventions.md「2.5 玩家可见文案承载」场景静态` | .tscn 静态中文核验(复核实证 game/ 22 个 .tscn 中文=0——动态装配中文已归 W4 面) | 渲染闸 golden 比对+_sweep_no_literal_toast 场景面 | 探针+单元 | 渲染闸跑批 | 逐像素不变;.tscn 中文字面量=0(断言纳入 W6 扫描词法) | 既有:文案漏网清零 |
|
||||
| W6 漏网清零 `design/engineering/code-conventions.md「2.5 玩家可见文案承载」禁在` | 静态断言 | player_copy_sweep_test::_sweep_zero_product_literals | 单元 | 闸跑批(读盘 grep) | 产品码三目录豁免词法外中文字面量=0 | 新增:文案漏网清零 |
|
||||
|
||||
测试方式两分法:W1–W4、W6 归调试接口验;场景文案渲染观感归用户目检(登记不阻塞)。
|
||||
测试削弱申报:无删旧断言;player_copy_sweep_test 六组钉值断言与迭代 58 V10「reserve_jar 投影仍为存量字面」断言改写=钉值对象从字面量换 key/译文,断言强度不减;meta_progression.gd:108-109 存量字面回退分支随迁移退役(回退语义由 key 形态回退承载,改写落 T1);display_name 空串校验改 key 格式校验=判据收紧非放宽。
|
||||
独立验收审计:reports/iter<N>-验收审计-<日期>.md;高档全量审计。
|
||||
|
||||
## 9. 异常分级
|
||||
|
||||
L1 自救:key 命名撞键时按模板加域段重排(登记 strings.csv 一次性变更)。L2 记录继续:单张表 key 迁移的进度性闸红(修复继续)。L3 停机呈报:表行 key 化发现 schema 外消费面(代码直读中文值比对)=停卡呈报;机检预算互斥=上游缺陷停卡退回写卡段;tr() 取不到 key(返回 key 本身)出现在真实入口=L3(fail-fast 精神:呈现面露 key 即缺陷,禁静默兜底字典)。
|
||||
|
||||
## 10. 代拍板白名单
|
||||
|
||||
key 命名的域段用词(模板内);strings.csv 行排序(按域分组);探路 key 的具体文案值;tr 取回后格式化的空参防御写法(不改变判据)。
|
||||
|
||||
## 11. 待裁点
|
||||
|
||||
零待裁点,开工门=U0。(承载形态 CSV/tr 单点已由 code-conventions §2.5 用户裁锁定;key 模板属实现细节,经第 3 节契约钉死。)
|
||||
|
||||
## 12. 落位与可复用性预检
|
||||
|
||||
- strings.csv=复用扩展:迭代 58 刷新经济改版批首建(表头 key,zh_CN),本卡为第二使用批——扩展不新建;落点唯一 game/data/l10n/ 不变。
|
||||
- **测试件复用面**:字面量扫描与 tr 往返断言**扩展在册 `player_copy_sweep_test.gd`**(同职责承载——README「玩家面文案」/「刷新提示文案读表拼接」两行已用该件做源扫描),不新增 strings_single_source_test.gd;表行 key 格式断言新增 `config_table_key_test.gd`(数据面校验与呈现扫描职责不同,不可并入 player_copy_sweep——单一变化原因不同)。
|
||||
- 翻译注册=引擎原生(Project Settings→`internationalization/locale/translations`),零自建加载代码;不复用/不自建 Dictionary 文案表(违反 §2.5 单点——用引擎原生 tr)。
|
||||
- SOURCE_NAMES 常量改 tr 后删除原 Dictionary——无别名残留。
|
||||
- 分层交互:core 只发 key(设计契约);取文案全部在 Node 语境 tr()(presentation/views);无 Core→翻译服务依赖。
|
||||
|
||||
## 13. 禁为机检文本保留无效成员
|
||||
|
||||
禁为迎合静态断言保留 display_name 旧键、空壳 getter、别名映射;schema 改名后旧键出现即 L3(第 9 节)。
|
||||
|
||||
## 14. 实现规范预算
|
||||
|
||||
新增测试文件一件:config_table_key_test.gd(三查:公开方法 1 个测试入口+少量 helper ≤20、成员 ≤15、分支 ≤8——单断言件远低于阈值)。扩展件 player_copy_sweep_test.gd 净增 3 个函数(现公开面远低于 20,S13 键预期只降不升)。无新增生产文件(strings.csv 为数据件)。存量触面:grant_segment 等四件为删改拼装行(函数分支数只降不升);十 schema 校验行数持平;T0 申报 S13 键只降不升。无迁移函数(拼装行就地改值,不跨文件迁移)。
|
||||
|
||||
## 15. 拆分边界纪律
|
||||
|
||||
本卡新增单元两件:①player_copy_sweep 扩展三函数——职责语句=「呈现面文案承载的扫描断言(tr 往返/toast 字面量/产品码漏网)」;单一变化原因=文案承载规则;集体身份=既有 PlayerCopySweep 套件扩展。②config_table_key_test——职责语句=「数据表行文案 key 的格式与旧键清零断言」;单一变化原因=表行 key 化契约;集体身份=ConfigTableKey 套件。表行 key 化为等值替换非拆分;无凑计数袋形态。判据权威=code-conventions §1.1。
|
||||
|
||||
## 16. 复核记录
|
||||
|
||||
| 轮次 | 复核者身份 | 发现 | 去向 | 处置结果 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | 只读子代理(Explore,未参与撰写) | B1 对照表 W1–W6 需求点格全缺判据出处锚 | 补写 | 六行锚补齐(锚目标句经复核者实读全命中:code-conventions §2.5、战斗结算 v2.1 :87、术语表 v1.30) |
|
||||
| 1 | 同上 | B2 对象级失实:game/ 22 个 .tscn 中文字符实为 0(卡写 70 行静态文案),T4/W5 验收对象不存在 | 补写 | 现状事实改「复核实证=0」;T4 场景 key 化删除、W5 重定为核验行(.tscn 面纳入 W6 扫描词法防回归);动态装配中文归 W4 面(B6 清单);估时重算 |
|
||||
| 1 | 同上 | B3 W1 判据缺 locale 前提:默认 locale=en,tr() 按 key 原样返回,默认态必红 | 补写 | T0 补 locale 设定步(internationalization/locale/fallback 或测试端 set_locale);设置键名一并修正 |
|
||||
| 1 | 同上 | B4 schema 面少报:「display_name 空」校验实为 12 处/10 件(卡写 7 处),W2 旧键 grep=0 会漏件打红 | 补写 | 现状事实/结构图/T1 改十件全集;W2 判据改「十件全集」 |
|
||||
| 1 | 同上 | B5 新增 strings_single_source_test.gd 与在册 player_copy_sweep_test 同职责,预检未回答为何不扩展 | 补写 | 改为扩展 player_copy_sweep_test 三函数;表行 key 断言独立成 config_table_key_test(职责不同);§12/§14/结构图同步 |
|
||||
| 1 | 同上 | B6 残余文案清单漏项:node_overlay 三处+main_adventure_flow 终局字串四处 | 补写 | §2 清单补 7 处(合计 33 处级);T3 范围并入 |
|
||||
| 1 | 同上 | B7 能力行未入 README 表 | 补写 | README 增「文案承载单点/表行文案 key 化/文案漏网清零」三行(写卡段当场入表) |
|
||||
| 1 | 同上 | B8 引擎面两处:设置键实名 internationalization/locale/translations;auto_translate 4.3 起弃用(4.7 现行=auto_translate_mode) | 自判 | T0 键名改正;auto_translate 提法随 T4 删除(B2)一并消解 |
|
||||
| 1 | 同上 | B9 估时加总与卡面不符 | 自判 | 合计改 3.5–5.25 日(中值 4.375,随 B2 重算) |
|
||||
| 2 | 只读子代理(Explore,确认轮,未参与撰写与处置) | N1 卡A 删件断编译面仍漏 5 处(player_copy_sweep_test:59/:110-112、stage_background_test:194-201、theme_projection_test 三处、feat_vouchers_test:294-296、battle_orchestrator.gd:19 注释) | 补写 | 卡A §2 现状、结构图、T1 三处补登等价改写义务(含 log_band 几何断言退役) |
|
||||
| 2 | 同上 | N2 卡B「合计 33 处级」与自身明细(37)矛盾,实际约 43 处级 | 补写 | §2 与 T3 计数改「约 43 处级」,清单以 §2 为唯一依据 |
|
||||
| 2 | 同上 | N3 终局字串与 battle_end 行锚错位(:113/:114/:181、:230/:231) | 自判 | 行号逐处改正 |
|
||||
| 2 | 同上 | N4 W4/W6 域内实测漏项(main.gd:367/374/378/381/453/497/502、main_adventure_flow:116/231/233/241、curio:79/137) | 补写 | §2 清单补 13 处;T3 以 §2 为唯一依据 |
|
||||
| 2 | 同上 | N5 跨卡漏项:Narrator.phase_text 阶段指示文案组(hud_presenter.gd:344)——卡A 直连后落地所在未入卡B 迁移清单 | 补写 | 卡A T1 补直连义务注记;卡B §2/T3 补该组 |
|
||||
| 2 | 同上 | N6 键集面不全:feat_table:16、meta_tree_table:17 两处无人认领;hero_table:23 校验漏计(13 处/11 件) | 补写 | §2/T1/结构图改十一件+键集同步面五处 |
|
||||
| 2 | 同上 | N7 卡A T1 锚「battle.md 组件表『终局判定文案』」悬空(实际在 README:168) | 自判 | 改指 game/tests/README.md 能力行 |
|
||||
| 2 | 同上 | N8 卡A §14「新增函数两处」实为一处 | 自判 | 改「一处」 |
|
||||
| 2 | 同上 | N9 行号/编号 drift:battle.md:194→:195、main.gd:420→:421、ks :403→:404、卡B T0「T3 闸用」→T4 | 自判 | 逐处改正 |
|
||||
|
||||
| 3 | 编排预检只读子代理(Explore 分片,未参与撰写) | P1-1 呈现层迁移清单与 W4/W6 全量判据不闭合(实测 ≈356 行 vs 清单 ≈50 处,25+ 整文件漏项) | 补写 | §2 重写为全量普查现状(整文件级清单入卡);T3 重写全量迁移(3.5–5.5 日);T0 补普查脚本步(底册落实现报告)——W4/W6 判据不变,迁移面补齐闭合 |
|
||||
| 3 | 同上 | P1-2 core 面漏项(reward_grant reason 经 toast 直达玩家等 ≈138 行) | 补写 | T2 扩面(结算四件+core 其余件按消费面分类迁移);§2 补件级清单 |
|
||||
| 3 | 同上 | P1-3 player_copy_sweep 六组钉值断言与 W2/W4/W6 方向对撞未登记改写义务 | 补写 | §2 补断言钉值面;T3 补六组同步改写步;测试削弱申报补强度不减说明 |
|
||||
| 3 | 同上 | P1-4 _sweep_refresh_toast_no_literals 源锚=main.gd:721/:724 中文字面量,迁移清零与断言钉在场对撞 | 补写 | 两行入迁移面(T3 全量覆盖);断言改写义务同上落卡 |
|
||||
| 3 | 同上 | P2 W2 行「十 schema/十件」残留;「18 张 tres」失实(21/13);T0 缺核面步与刷导入步;hud_presenter static 无 atr 通道;W6 词法缺 errs.append/fatal_screen/_fatal/logger.log;§2 行号未按卡A 终态重算;main/treasure/adventure_flow 漏行 12 处 | 补写 | 逐条落卡(W2 十一件/T0 两步/T3 atr/W6 词法/基线声明+T0 核面步/§2 全量清单吸收) |
|
||||
| 3 | 同上 | P3 key 模板不覆盖 name_a/b 与 source_label_map;schema 行锚 +1 漂移;「六件同类」列 5 计 6;T0 缺刷导入 | 自判 | 模板泛化「<表域>.<行id或map键>.<字段>」(§3 契约同步);行号按预检实测改正;T0 补刷导入步 |
|
||||
| 4 | 编排预检确认轮只读子代理(Explore,未参与撰写) | P1-① strings.csv 双首建与表头互斥(迭代 58 刷新经济批 key vs 本卡 keys);P1-② V10「reserve_jar 投影仍为存量字面」断言与全量迁移对撞未登记;P2 核面步只锚卡A/双轨中间态衔接/standee_body 漏列;P3 估时加总漂移与 board_view 错锚 | 补写/自判 | 六条全落卡:T0 改扩展既有+表头随实盘、§12 改复用扩展、§2 补 V10 断言与回退分支登记、测试削弱申报补、T1 补 meta_progression 改写步、T0 核面步扩面(迭代 58 五卡+迭代 57 棋盘瓦片批)、§2 补 standee_body、估时改 6.75–9.75(中值 8.25)、board_view 锚改 :570/:587/:598 |
|
||||
|
||||
引擎技术面三查(同轮):tr/TranslationServer 回退行为、Tween、Label 描边在 4.7 存在且行为如卡——B3/B8 已按引擎事实落卡,无未判发现。
|
||||
|
||||
## 17. 复核自审七查执行记录
|
||||
|
||||
①规格覆盖:目标 6 项→T0–T4 与 W1–W6 逐条对上;②步骤扫描:key 模板/豁免词法/断言形态全钉死,无 TBD;③类型一致性:STRINGS_CSV_PATH(T0 定义,T4 取用)、DISPLAY_KEY_*(T2 产出);④审查焦点:tr 取不到 key 的失败形态→W1 断言含返回值比对+L3 申报;.tscn 面零中文实证→W5 核验行+W6 扫描词法防回归;⑤篇幅:无函数体;⑥落位复用:见第 12 节(含测试件复用面);⑦预算:见第 14 节。
|
||||
@@ -0,0 +1,182 @@
|
||||
# 需求卡片:明细带退役呈现改版批
|
||||
|
||||
- 来源:待办清单「B 区明细带退役+即时反馈画面化」(2026-11-10 登记,来源=会话提及)(唯一事实源:design/ux/battle.md 2026-11-10 版「即时反馈画面化预览」节+组件表 B 区明细带行+design/gdd/systems/战斗循环/敌人系统.md v2.2「半血解锁呈现规格」)
|
||||
- 验收档:中(后果玩家可见、不损持久状态;golden 基线换代走审核关卡)
|
||||
- 设计前置:三屏预览 2026-11-10 用户人审通过(battle.md 内嵌 SVG+像素判据句);三裁记录=带整条退役/叙述行六类全砍/清图与解锁 toast 改画面,均为用户当轮裁决
|
||||
|
||||
## 1. 目标与完成定义
|
||||
|
||||
B 区明细带(battle_log_view)整条退役:组件、挂载、六类冒险叙述行、结算明细回看遗留件全删;清图兑付浮字实装(替代「清图奖励:××」toast);Boss 解锁拍零新增呈现(删 row_pacer 解锁技名 toast);探针与测试锚等价改写;渲染基线换代并过用户审核。完成定义=本卡对照表 V1–V7 全绿+基线过审+代码域闸绿。
|
||||
|
||||
## 2. 现状事实(file:line 实查)
|
||||
|
||||
- `game/presentation/views/battle_log_view.gd`(全件 70 行,实测):明细带壳——挖掘期摘要位(`_summary`,battle_log_view.gd:62 仅 clear、全库无写入点=恒空)+结算期叙述行 RichTextLabel(`_log.visible = settle`,battle_log_view.gd:69)+提示字「上轮摘要(回看归「生涯」)」(:56)。
|
||||
- 引用面 10 文件:main_ui_build.gd:45(装配)、scenes/adventure_screen.gd:12-13(壳声明)、ui_battle.gd、ui_assembler.gd、battle_stage_view.gd、hud_presenter.gd、main.gd、main_adventure_flow.gd、main_debug_flow.gd、views/ui_kit.gd:484(注释)。
|
||||
- 叙述行写入点:main_adventure_flow.gd:36(关卡开场)/65(节点横幅)/70(奖励)/75(恢复)/88(商店)/170(岔路)、main_debug_flow.gd:90(调试开场)。Narrator 其余消费点(删件断编译面,全数登记):main_adventure_flow.gd:109(adventure_summary_text)/111(keystone_settle_text)/179(battle_end_text)喂 end_overlay、main.gd:373/377/380(battle_end_text 开浮层)、hud_presenter.gd:344(phase_text——阶段指示文案,随带退役改组合根直拼或删除)、curio_interact_controller.gd(10 处 `Narrator.` 调用)、curio_pick_overlay.gd(仅 :3/:90 注释引用,零代码消费——删注释即可)。
|
||||
- 删件测试断编译面(load/实例化 battle_narrator 与 battle_log_view 的测试件,等价改写义务全数登记;第六处=adventure_feats_test):tests/unit/presentation/player_copy_sweep_test.gd:59(load battle_narrator)/:110-112(load battle_log_view 并走方法表)、stage_background_test.gd:194-201(实例化 log_view+log_band 几何断言)、theme_projection_test.gd:46/:385(_smoke_battle_log_view)/:473-480(Narrator.level_open_line 断言)、tests/unit/core/feat_vouchers_test.gd:294-296(load battle_log_view);tests/unit/core/adventure_feats_test.gd:780(load battle_narrator 直调 feat_card_text);core/battle_orchestrator.gd:19(注释提 battle_log_view._format_row——注释同步删)。
|
||||
- 清图 toast:main.gd:420 `show_toast("清图奖励:%s"…)`;Boss 解锁技名 toast:row_pacer.gd:94 `show_toast(String(row.get("display_name","")))`。
|
||||
- 结算明细回看:views/settlement_review_overlay.gd 全件零调用(唯一引用=ui_kit.gd:484 注释)。
|
||||
- 布局字段:battle_layout_table.gd:11-25(`log_band_h_dig`/`log_band_h_settle` 定义+域校验);游戏视图经 battle_log_view._init 读取(layout.log_band_h_dig,battle_log_view.gd:18)。
|
||||
- parsed_text/叙述行消费:probe/ui_probe.gd:113(等「节点 1/」)、probe/ui_click_probe.gd:624/684/1119/1152/1569(等「· 种子」叙述行出现)、tests/unit/presentation/battle_log_zero_text_test.gd:80-90(B 区零新增行断言)。
|
||||
- 恢复点一手呈现:views/node_overlay.gd:26 `show_rest(healed, hp_after, max_hp)`(main_adventure_flow.gd:74 调用)——B 区 rest_line 纯重复。
|
||||
- 套件清单引用:tests/run_all.gd:195(battle_log_zero_text_test)、:261(battle_narrator_test)——删件后 spawn 缺脚本=闸红,清单两行随删。
|
||||
- 渲染基线:game/tests/golden/battle_screen.png、board_L1_dungeon.png、board_L2_underdark.png、board_L3_deep_underdark.png(明细带在画者受影响)。
|
||||
|
||||
## 3. 设计契约
|
||||
|
||||
- 🔴 B 区零文字带:明细带退役后禁任何新文字条、日志壳、摘要位(battle.md「即时反馈画面化预览」节)。
|
||||
- 🔴 Boss 解锁拍零新增呈现:解锁拍 B 区新增可见元素数 = 0;告知仅由既有意图徽标承载(敌人系统 v2.2)。
|
||||
- 🔴 兑付浮字全程不遮棋盘:浮字底缘恒在棋盘上缘上方 ≥6px;无标题、无底牌(battle.md 像素判据)。
|
||||
- 🔴 结算 9 类行协议不动:数据面流水照记,display 字段值形态变更归文案入表卡,本卡禁碰。
|
||||
- 🔴 禁变异测试与撤销取证:解锁「零新增」断言用逐元素快照比对(真实入口进入),禁人为注入解锁再回退比对。
|
||||
|
||||
## 4. 范围边界
|
||||
|
||||
做:上列退役与浮字实装、探针/测试锚等价改写、能力表同批维护、golden 受影响图换代呈审。
|
||||
不做(去向):文案 key 化与 strings.csv(文案入表卡,紧随本卡;本卡新引入的浮字文案暂以呈现层字串承载,登记进该卡范围);`log_band_h_*` 表字段与 schema 删除(工具批,battle.md:118 已注明「字段删除归工具批」);生涯界面(在册概念);settlement_summary.md 等 ux 文档若涉叙述行提法的修订(实现批产出反哺点清单)。
|
||||
|
||||
## 5. 关联文档同步面
|
||||
|
||||
| 文档 | 关联点 | 同步义务 |
|
||||
|---|---|---|
|
||||
| design/ux/settlement-summary.md | 若含结算叙述行/摘要提法 | 实现批列反哺点,用户裁决后文档批落文 |
|
||||
| 体验验证清单.md | 逐行目检类条目在带退役后失锚 | 实现批列反哺点 |
|
||||
| roadmap.md | 本批入迭代后行状态 | 编排段义务,非实现批 |
|
||||
| design/gdd/systems/战斗循环/战斗表现.md | 若引用叙述行承载位 | 实现批列反哺点 |
|
||||
|
||||
## 6. 卡前·文件结构图
|
||||
|
||||
| 文件 | 职责 | 行为改动 |
|
||||
|---|---|---|
|
||||
| game/presentation/views/battle_log_view.gd | 删除(明细带壳全件) | 是(V1/V5) |
|
||||
| game/presentation/views/settlement_review_overlay.gd | 删除(遗留件报废) | 否(零调用,V1 树断言覆盖) |
|
||||
| game/presentation/battle_narrator.gd | 删除(六类叙述行生成器;phase_text/结算提示的消费点改直连或删除) | 是(V5) |
|
||||
| game/presentation/main_adventure_flow.gd | 删六处 append_bb;恢复/商店节点反馈已有弹窗浮层无需补 | 是(V5) |
|
||||
| game/presentation/main_debug_flow.gd | 删调试开场叙述行 | 是(V5) |
|
||||
| game/presentation/main_ui_build.gd、scenes/adventure_screen.gd、ui_battle.gd、ui_assembler.gd、battle_stage_view.gd、hud_presenter.gd、views/ui_kit.gd | 摘除 log_view 壳与引用 | 是(V1) |
|
||||
| game/presentation/main.gd | 清图 toast 改兑付浮字装配;删 Narrator 常量与消费 | 是(V2/V3) |
|
||||
| game/presentation/views/board_zone_view.gd | 新增兑付浮字层(spawn_clear_reward_text) | 是(V2/V3) |
|
||||
| game/presentation/row_pacer.gd | 删解锁技名 toast(row_pacer.gd:91-94) | 是(V4) |
|
||||
| game/presentation/views/curio_pick_overlay.gd(仅注释)、curio_interact_controller.gd(10 处) | Narrator 引用删净/消费点改写 | 是(V5) |
|
||||
| game/tests/unit/presentation/battle_narrator_test.gd | 删除(被测对象退役) | 是(V5) |
|
||||
| game/tests/unit/presentation/player_copy_sweep_test.gd、stage_background_test.gd、theme_projection_test.gd、tests/unit/core/feat_vouchers_test.gd | 删件断编译面等价改写(load/实例化/断言改写,§2 清单五处)+stage_background 的 log_band 几何断言退役 | 是(V1/V5) |
|
||||
| game/core/battle_orchestrator.gd:19 | 注释提 battle_log_view._format_row——删注 | 否 |
|
||||
| game/tests/unit/presentation/clear_reward_text_test.gd、log_band_retired_test.gd、unlock_zero_ui_test.gd | 新增(V2/V3、V1/V5、V4) | 是 |
|
||||
| game/probe/ui_probe.gd、ui_click_probe.gd | 等锚改写(叙述行锚→棋盘/意图锚) | 是(V7) |
|
||||
| game/tests/unit/presentation/battle_log_zero_text_test.gd | 删除(被测对象退役)+新增明细带退役断言归属测试 | 是(V1) |
|
||||
| game/tests/run_all.gd | 套件清单两行随删件同步(:195/:261) | 是(V1/V5) |
|
||||
| game/tests/unit/core/adventure_feats_test.gd | :780 load battle_narrator 直调 feat_card_text——等价改写(feat 文案读数改直取或删该用例段) | 是(V5) |
|
||||
| game/tests/README.md | 能力行同批维护(本卡写卡段执行,非实现批) | 否 |
|
||||
| game/tests/golden/battle_screen.png、board_L3_deep_underdark.png | 基线换代(逐张呈用户审核) | 是(V6) |
|
||||
|
||||
## 7. 任务卡
|
||||
|
||||
### T0 锚普查与基线预读(0.25–0.5 日)
|
||||
- [ ] 实跑 `ui_probe`/`ui_click_probe` 与渲染闸,记录改前读数(S13 键与基线图清单)
|
||||
- [ ] 逐处登记 parsed_text/叙述行锚的替位锚(等价语义:进战斗=棋盘 install 可见 / 换层信号),写进本卡附录不改码
|
||||
- [ ] S13 预期申报:删除件键清零、touch 面只降不升
|
||||
|
||||
### T1 明细带与叙述行退役(1–1.5 日)
|
||||
- [ ] 删 battle_log_view.gd、settlement_review_overlay.gd、battle_narrator.gd、battle_narrator_test.gd 四件(测试件随被测对象退役,语义由 log_band_retired_test 承接)
|
||||
- [ ] 摘除 6.结构图所列壳与引用(adventure_screen 壳声明、ui_battle/ui_assembler 装配、hud_presenter phase_text 消费改组合根直拼或删除、curio_interact_controller 十处消费点改写、curio_pick_overlay 两处注释删净)+终局消费点改写:main_adventure_flow.gd:109/111/179 与 main.gd:373/377/380(battle_end_text 退役,verdict_line/摘要串由组合根按 battle_result 与 runner 读数直拼——能力锚=game/tests/README.md「终局判定文案与战末账行」行)
|
||||
- [ ] 测试断编译面等价改写(§2 清单六处):player_copy_sweep_test/stage_background_test/theme_projection_test/feat_vouchers_test/adventure_feats_test 的 load 与断言改写(log_band 几何断言退役);battle_orchestrator.gd:19 删注
|
||||
- [ ] tests/run_all.gd 套件清单 :195/:261 两行随删件同步移除
|
||||
- [ ] 注释扫尾:battle_layout_table.gd:2(消费面注释提 BattleLogView)、views/ui_kit.gd:207(语义档注释;HEX_LOG_* 死常量族随带退役一并清)
|
||||
- [ ] main_adventure_flow.gd 删六处 append_bb;main_debug_flow.gd 删调试叙述行
|
||||
- [ ] row_pacer.gd 删解锁技名 toast(skill_unlock 行呈现侧不再消费 display_name)
|
||||
- [ ] 接口产出:无(纯删改);验证:单元+冒烟 exit 0
|
||||
|
||||
### T2 清图兑付浮字(0.5–1 日)
|
||||
- [ ] board_zone_view.gd 新增 `func spawn_clear_reward_text(text: String) -> void`:单行 Label(字高 17px、暖白 #F5EAD0、2px 深墨描边、微金光晕),自棋盘中央上方起、2.5s 内**上浮约 40px**(位移量,非起始定位——battle.md:195)并渐隐(Tween,尊重减动效开关→直达终态)
|
||||
- [ ] main.gd 清图 handler(:420 show_toast):`show_toast("清图奖励:%s"…)` 替换为 `board_zone.spawn_clear_reward_text(兑付值)`——兑付值取现行 toast 同源(row.get("display") 清洗后内容),暂以呈现层字串承载(文案入表卡收编);**零兑付守卫保留**(:419 `type != "reward_ineffective"`——未生效行不弹浮字,安静留数据面,语义重述随明细带退役)
|
||||
- [ ] 验收步骤:V2/V3 断言(见对照表)落 tests/unit/presentation/clear_reward_text_test.gd
|
||||
- [ ] 接口取用:无;产出:`spawn_clear_reward_text(text: String)`(T3 探针取用)
|
||||
|
||||
### T3 测试与探针锚改写(0.5–1 日)
|
||||
- [ ] 删 battle_log_zero_text_test.gd 与 battle_narrator_test.gd;新增 tests/unit/presentation/log_band_retired_test.gd:adventure_screen 实例树内无 log_view/settlement_review 节点(V1);B 区子树零 RichTextLabel 文字节点(V5)
|
||||
- [ ] 解锁零新增断言:tests/unit/presentation/unlock_zero_ui_test.gd——解锁触发前后 B 区子树逐元素快照比对,新增数=0(V4)
|
||||
- [ ] ui_probe.gd:113/:134-135、ui_click_probe.gd:624/684/879/1119/1152/1569 等锚改写(替位锚按 T0 附录;:134-135 挖掘期 24px 几何断言与 :879 _summary 私有直读随带退役)
|
||||
- [ ] 能力行落名:见对照表能力列
|
||||
- [ ] 验证:单元全套件+两探针 exit 0
|
||||
|
||||
### T4 基线换代与收口(0.5 日)
|
||||
- [ ] 渲染闸重截受影响图(battle_screen、board_L3;board_L1/L2 若带在画一并),**逐张呈用户审核后才入库**(触发基线审核关卡)
|
||||
- [ ] tools/coverage_exemptions.js:49 settlement_review_overlay 豁免条目随件撤除
|
||||
- [ ] 产出物落位卡:reports/iter<N>-实现报告(实机目检清单:浮字观感/解锁拍/挖掘结算两态布局)、reports/iter<N>-反哺点清单(同步面 4 行逐条给落点)
|
||||
|
||||
估时合计:2.75–4.5 日(中值 3.625)。
|
||||
|
||||
## 8. 验证闸(改动—验收对照表)
|
||||
|
||||
| 需求点 | 改动(文件:行为) | 验收测试 | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| V1 明细带退役 `design/ux/battle.md「Component Inventory」明细带整条退役` | battle_log_view/settlement_review 删除+壳摘除 | log_band_retired_test::_test_no_log_view_node | 单元 | adventure_screen 场景实例化 | 场景树节点名集合(无 log_view/settlement_review) | 新增:B 区零文字带 |
|
||||
| V2 兑付浮字呈现 `design/ux/battle.md「即时反馈画面化预览」清图兑付浮字` | board_zone_view.spawn_clear_reward_text+main.gd 装配 | clear_reward_text_test::_test_spawn_and_decay | 单元 | 清图完成信号(round_end clear 分支) | 浮字节点文本=兑付值+2.5s 后 freeing | 新增:清图兑付浮字 |
|
||||
| V3 浮字不遮棋盘 `design/ux/battle.md「即时反馈画面化预览」浮字全程不与棋盘格面重叠` | 同上 | clear_reward_text_test::_test_no_overlap+_test_decay_curves | 单元 | 同上 | 四判据全绑:rect 相交=空;底缘距棋盘上缘 ≥6px;渐隐 alpha 帧间步进 ≤0.1;兑付值可读时长 ≥60% 生命期 | 新增:清图兑付浮字 |
|
||||
| V4 解锁拍零新增 `design/gdd/systems/战斗循环/敌人系统.md「目标顺位与意图线索」解锁拍零新增呈现` | row_pacer.gd 删 toast | unlock_zero_ui_test::_test_zero_delta | 单元 | skill_unlock 高光行经 row_pacer 的真实消费流(固定种子令 Boss 半血后摇中闩技;快照取在 row_pacer 消费时刻,非阈值事件发射位) | B 区子树逐元素快照差=0(绑消费点提交面,防发射位空转假绿) | 新增:解锁拍零新增呈现 |
|
||||
| V5 叙述行全砍 `design/ux/battle.md「Component Inventory」冒险叙述行六类随带全砍` | battle_narrator 删+消费点摘除(main_adventure_flow 六处+main_adventure_flow:109/111/179 终局三处+main.gd:373/377/380+curio 十处+debug_flow 一处) | log_band_retired_test::_test_b_zone_zero_text | 单元 | 节点推进/恢复/商店/终局真实流 | B 区零文字节点+battle_narrator 符号 grep=0 | 新增:B 区零文字带 |
|
||||
| V6 基线换代 `design/ux/battle.md「即时反馈画面化预览」战斗屏纵向` | golden 受影响图重截 | 渲染闸 golden 比对 | 探针 | 渲染闸跑批 | 逐像素;**触发基线审核关卡**(T4 呈审) | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) |
|
||||
| V7 探针锚等价 `design/ux/battle.md「Component Inventory」结算明细带(已退役)` | ui_probe/ui_click_probe 五处 | 两探针跑批 exit 0 | 探针 | 真实 UI 驱动流 | 锚语义等价(进战斗/换层——叙述行锚失据即换) | 既有:停点链与控件级真输入命中 |
|
||||
|
||||
测试方式两分法:V1–V5、V7 归调试接口验;浮字观感、解锁拍目感、两态布局归用户目检(登记不阻塞,写入实现报告实机目检清单)。
|
||||
测试削弱申报:battle_log_zero_text_test.gd 与 battle_narrator_test.gd 删除(被测对象退役,语义由 log_band_retired_test 承接;game/tests/README.md「战斗叙述与终局文案」能力行同批退役改写为「终局判定文案与战末账行」——已入表);pacing_queue_test.gd:242-257「解锁技名 toast 计数与行分布」断言随 V4 退役(钉住被删 toast 面,语义由 unlock_zero_ui_test 零新增断言承接);无阈值放宽。
|
||||
独立验收审计:reports/iter<N>-验收审计-<日期>.md,入口=本对照表全量;未过禁合并。
|
||||
|
||||
## 9. 异常分级
|
||||
|
||||
L1 自救:探针锚替位的一次重试、Tween 参数微调。L2 记录继续:golden 图因既有环境色差微漂(容差内)。L3 停机呈报:基线审核被用户否决(回 T2 调观感);机检预算互斥=上游缺陷停卡退回写卡段;删除件发现隐藏消费面(grep 外的运行期引用)=停机呈报,禁就地续删。
|
||||
|
||||
## 10. 代拍板白名单
|
||||
|
||||
浮字缓动曲线与光晕参数微调(判据内);探针等锚的具体替位信号选择(语义等价前提);测试私有 helper 命名;叙述行删除时的连带死代码清理(同文件内)。
|
||||
|
||||
## 11. 待裁点
|
||||
|
||||
零待裁点,开工门=U0。(三裁——带退役/叙述行全砍/toast 画面化——已于设计段由用户裁决;浮字落点经落位预检自判见第 12 节。)
|
||||
|
||||
## 12. 落位与可复用性预检
|
||||
|
||||
- 浮字层=**新增**(board_zone_view 内私有层):不能复用浮空数字层——该层按格锚定、随棋盘滚动/换图重建,兑付浮字需整板锚定且横跨换图时序,语义不同;落点唯一(board_zone_view,棋盘容器的既有宿主);grep `spawn_.*text\|float_text` 盘上无同义件。
|
||||
- 删除件三件(battle_log_view/settlement_review_overlay/battle_narrator):无复用面,引用面已全数列入结构图。
|
||||
- 恢复/商店反馈复用在役 node_overlay.show_rest(node_overlay.gd:26)与 shop_overlay——零新增。
|
||||
- 分层交互:浮字层只读清图信号载荷(组合根装配传入),不触 Core;经 board_zone 既有出口,禁绕 HUD 框架直建 CanvasLayer。
|
||||
|
||||
## 13. 禁为机检文本保留无效成员
|
||||
|
||||
本卡为退役+小新增卡:删除件不留空壳、别名、转发函数;S13 键与删除件相关的登记值预期清零,机检键与本卡契约互斥时实现段停卡呈报,禁自造第三条路。
|
||||
|
||||
## 14. 实现规范预算
|
||||
|
||||
新增测试文件三件(三查:公开方法 ≤20/成员 ≤15——三件均为单套件测试件,各 1 个测试入口函数+少量 helper,分支 ≤8,远低于阈值):clear_reward_text_test.gd、log_band_retired_test.gd、unlock_zero_ui_test.gd。无新增生产文件。新增函数一处:board_zone_view.gd `spawn_clear_reward_text`(+1 公开方法,该文件现公开方法数远低于 20;成员 +2:浮字层引用、Tween 引用);main.gd 净增 0(toast 装配改浮字装配,同类替换)。迁移对账:battle_narrator 无函数迁入他件(全删);main_adventure_flow/main.gd 的 verdict 装配为就地改写非迁移。存量触面:T0 申报 S13 键只降不升。
|
||||
|
||||
## 15. 拆分边界纪律
|
||||
|
||||
本卡拆出单元仅浮字层一处:职责语句=「清图兑付的整板锚定浮字层(生成、上浮渐隐、减动效直达)」;单一变化原因=兑付呈现观感;集体身份=ClearRewardText 层。无凑计数袋形态;按纪律拆不出内聚单元的情形不适用(零重构拆分)。判据权威=code-conventions §1.1。
|
||||
|
||||
## 16. 复核记录
|
||||
|
||||
| 轮次 | 复核者身份 | 发现 | 去向 | 处置结果 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | 只读子代理(Explore,未参与撰写) | A1 对照表 V1–V7 需求点格全缺判据出处锚 | 补写 | 七行锚补齐(锚目标句经复核者实读全命中:battle.md「即时反馈画面化预览」/「Component Inventory」、敌人系统 v2.2「半血解锁呈现规格」) |
|
||||
| 1 | 同上 | A2 T2 把锚句「上浮约 40px」位移量误读为起始定位量 | 补写 | T2 改「自棋盘中央上方起、2.5s 内上浮约 40px(位移量)」(battle.md:194 依据随行) |
|
||||
| 1 | 同上 | A3 V3 只绑 rect 相交,缺节内另三条像素判据 | 补写 | V3 判据绑定面扩为四判据(相交空/≥6px/alpha 步进 ≤0.1/≥60% 可读),加 test_decay_curves 用例 |
|
||||
| 1 | 同上 | A4 V4 真实入口=阈值事件发射位(round_cycle.gd:121),快照恒 0=空转假绿;toast 可观测提交位=row_pacer 消费时刻(row_pacer.gd:93-94) | 补写 | V4 入口钉 skill_unlock 行真实消费流+固定种子取径+快照取消费时刻 |
|
||||
| 1 | 同上 | A5 删 battle_narrator 断编译消费点漏登记(main_adventure_flow:109/111/179、main.gd:373/377/380、curio 十处、curio_pick_overlay 仅注释) | 补写 | 现状事实、结构图、T1 三处补全(含 verdict_line 组合根直拼去路) |
|
||||
| 1 | 同上 | A6 battle_narrator_test.gd 未列删除面;README:168「战斗叙述与终局文案」能力行随删失效 | 补写 | 结构图/T1/测试削弱申报补四件删除;能力行同批改写(已在 game/tests/README.md 入表) |
|
||||
| 1 | 同上 | A7 预算节「无新增文件」与 T2/T3 三个新增测试件矛盾 | 补写 | 预算节补三件三查;结构图补测试件行 |
|
||||
| 1 | 同上 | A8 能力列写层名非能力名,且新增能力未入 README 表 | 补写 | 能力列改能力名;README 增「B 区零文字带/清图兑付浮字/解锁拍零新增呈现」三行(写卡段当场入表) |
|
||||
| 1 | 同上 | A9 battle_log_view.gd 实测 70 行(卡写约 110);curio_pick_overlay 仅注释引用 | 自判 | 两数/表述就地改正(wc -l 实测依据) |
|
||||
| 1 | 同上 | A10 估时加总实为 2.75–4.5 | 自判 | 合计改 2.75–4.5 日(中值 3.625) |
|
||||
| 1 | 同上 | A11 零兑付守卫(main.gd:418-420)去留未钉 | 补写 | T2 补守卫保留句(未生效行不弹浮字,语义重述随带退役) |
|
||||
|
||||
| 3 | 编排预检只读子代理(Explore 分片,未参与撰写) | F1-P1 删件断编译面第六处漏登记:adventure_feats_test.gd:780 load battle_narrator 直调 feat_card_text | 补写 | §2/结构图/T1 三处补登记(等价改写义务) |
|
||||
| 3 | 同上 | F2-P1 run_all.gd:195/:261 套件清单引用两待删测试件,删件后 spawn 缺脚本=闸红;run_all.gd 全卡未登记 | 补写 | §2/结构图/T1 补清单两行随删 |
|
||||
| 3 | 同上 | F3-P2 探针删件直读面漏 3 行(ui_probe:134-135 几何断言、ui_click_probe:879 私有直读) | 补写 | T3 枚举补全 |
|
||||
| 3 | 同上 | F4-P2 pacing_queue_test.gd:242-257 解锁 toast 计数断言钉住被删面,与 V4 冲突 | 补写 | 测试削弱申报补退役义务(语义由 unlock_zero_ui_test 承接) |
|
||||
| 3 | 同上 | F5-P3 行号漂移(T2 :421→:420、守卫 :420→:419;battle_log_view :69/:56 漂移);F6-P3 注释残留面(battle_layout_table:2、ui_kit:207 HEX_LOG 死常量);F7-P3 coverage_exemptions.js:49 豁免条目随件报废;F8-P3 README:170 缺 _test_decay_curves 用例名;F9-P3 工作区 12 件未跟踪棋盘贴图 | 自判/补写 | 行号改正;注释扫尾入 T1;豁免撤条入 T4;README 用例名已补(写卡段);F9 留痕——开工前确认入库/忽略口径 |
|
||||
|
||||
引擎技术面三查(同轮):Tween/Label 描边/减动效直达在 4.7 存在且行为如卡;UI 移动走 Tween 合 NEVER-9;Gotcha-3(Tween 随节点消亡)由 board_zone_view 常驻宿主承载——无发现。
|
||||
|
||||
## 17. 复核自审七查执行记录
|
||||
|
||||
①规格覆盖:目标 4 项→T1–T4 与 V1–V7 逐条对上;②步骤扫描:无 TBD/酌情,函数体未预写;③类型一致性:`spawn_clear_reward_text(text: String)` 单点定义 T2、取用 T3;④审查焦点:换图时序与浮字生命周期竞争(清图后即刻 install)→V2 断言含 decay 完成前置;减动效开启→T2 步骤内含直达终态分支;⑤篇幅:无函数体代码块;⑥落位复用:见第 12 节;⑦预算:见第 14 节。
|
||||
@@ -464,7 +464,7 @@
|
||||
| 2 | 同上 | 记忆态整格填色与 `removed_dim` 在 z=3 会压南邻越入岩顶(约 15px) | 补写 | T3/T5 增 `_memory_ground` 低层子件与 `draw_removed_dim` 顶面 rect;§12 行9 增 `_test_memory_cover` |
|
||||
| 2 | 写卡会话自查(第二轮同轮) | 阴影圆层在 `_world` 内却传 shell 原点,坐标系混用 | 补写 | `board_label_shadow_layer.setup(cell, cells)`(世界局部/格坐标),`circle_rects()` 明确世界局部;§7/T4 同步 |
|
||||
| 2 | 写卡会话自查(第二轮同轮) | T3「整板悬崖只在 back 画」与 `BoardWorld` 悬崖 z=0 重复绘制 | 补写 | T3 改为背岩体;整板悬崖仍由 `BoardWorld._draw` 承担,禁重复绘制 |
|
||||
| 2 | 写卡会话自查(第二轮同轮) | `architecture.md:178` 仍记 `cell_base_layer` 在役;架构写权限属用户 | 补写 | §6 增架构行:实现批禁直改,T8 反哺点列「架构表该行待用户发令修订」 |
|
||||
| 2 | 写卡会话自查(第二轮同轮) | `architecture.md「2. 事件/信号路径」呈现层订阅禁令` 仍记 `cell_base_layer` 在役;架构写权限属用户 | 补写 | §6 增架构行:实现批禁直改,T8 反哺点列「架构表该行待用户发令修订」 |
|
||||
| 2 | 写卡会话自查(第二轮同轮) | 另立 `reports/复核-*.md` 与 2026-11-06 用户裁「不另设复核报告文件」冲突 | 自判 | 删除该报告;复核凭据只留本卡 §16(`pipeline_gate` 判据同步) |
|
||||
| 2 | 写卡会话自查(第二轮同轮) | 去饱和材质链未覆盖新层/低层子件,结算期会出现彩色例外 | 补写 | T3/T4 增 `use_parent_material` 与 `FloatLayer.material` 同拍挂摘;§12 行7 增 `_test_desaturation` |
|
||||
| 2 | 后台第二轮复核(补审,2026-11-07) | 顶面贴花一律 z=3 与 art-bible §1.2/§3.2「印记低于小人」冲突 | 补写 | 格件 z 按脚底行分档(北 0/南 3),`_resort_cell_decals`;art-bible v3.50 §1.2/§3.2 与 battle 层序同步 |
|
||||
|
||||
@@ -0,0 +1,204 @@
|
||||
# 需求卡片——测试面四项收口批
|
||||
|
||||
> 来源:待办清单「测试面真输入化批发现四项待裁(2026-11-06 登记,来源=批次移交)」条目(唯一事实源:design/engineering/test-conventions.md v1.0「2. 场景级探针标配」两段式句+「8.3 改动—验收对照表」批量模拟测量语义句+design/ux/battle.md「Component Inventory」按钮组等宽纪律句)
|
||||
> 验收档:低(按钮宽度=纯呈现样式;探针与测试注记不进玩家持久状态——失败代价即看即知、无状态残留)
|
||||
> 估时:0.75–1.5 个工作日(中值 1.125);超 1.5 日软盒预挂=T2 真输入选路落点不稳(输入锁/视口变换漂移)时停机呈报,不扩面自救
|
||||
|
||||
## 1. 目标与完成定义
|
||||
|
||||
收口测试面真输入化批移交的四项发现:① ui_struct_probe 冒险簇 emit 选路绕过视图置隐前提、battle_hud 结构审计空转假绿——改两段式(先接线断言快速失败、后真输入保玩家可达);② AP 条停手钮 64px/图例钮 56px 同容器宽度不等——统一 64px;③ 图例段 emit 开启(被①卡住的真输入承载)——改两段式;④ tune_sim_batch_parity 两处判据出处注记锚泛称——改锚到批量模拟测量语义句。
|
||||
|
||||
完成定义:
|
||||
- V1–V5 验收行全部在真实跑批中执行并通过;代码域闸按改动域选档全绿。
|
||||
- 独立验收审计(低档)通过;reports/ 两份产出物落齐;能力表新增两行在场且名实相符。
|
||||
- 产品码改动仅限 ap_bar_view.gd:102 一处宽度值;选路/切屏/模态栈产品码零改动。
|
||||
|
||||
## 2. 设计事实源
|
||||
|
||||
- design/engineering/test-conventions.md v1.0「2. 场景级探针标配」两段式句:「UI 驱动断言两段式:先接线、后真输入……第一段接线断言……快速失败……第二段真输入断言……真实入口只认第二段……每个动线断言钉『落点』判定……防驱动中断后的空转假绿」(V1/V2/V3 判据)。
|
||||
- design/ux/battle.md「Component Inventory」按钮组等宽纪律句:「同一直接父容器内 ≥2 个可见按钮,宽度必须相等(差 ≤1px)……现行例:AP 条停手钮与图例钮同横排容器,两钮宽度统一 64px」(V4 判据)。
|
||||
- design/engineering/test-conventions.md v1.0「8.3 改动—验收对照表」批量模拟测量语义句:「逐帧步进每局恰占一帧……n=0 退化路径为调用点同步收尾零帧……双实现对拍套件……以本句为判据出处」(V5 改锚目标)。
|
||||
- design/gdd/systems/表现与支撑/HUD框架.md「提示与弹层:轻提示随起随消、重弹层排队进出」入栈出栈句(图例开合判据,沿用 ui_struct_probe.gd:248 现存注记锚)。
|
||||
- design/ux/level-map.md「UX Spec: 关卡画面」四项设计拍板(选路判据,沿用 ui_struct_probe.gd:218 现存注记锚)。
|
||||
|
||||
会话裁决沿革:用户 2026-11-09 裁——①③「两种都做、保持先后顺序:先接线断言快速失败,断言过了再真输入」;②「统一 64px、现在修」;④规格句落 test-conventions 测量面节;等宽句写入 battle.md。三句规格已随本 worktree 文档批定稿(test-conventions.md v1.0、battle.md 等宽句),实现批只消费不直改。
|
||||
|
||||
## 3. 现状事实(开工自行复核)
|
||||
|
||||
- F1 emit 绕过置隐前提:game/probe/ui_struct_probe.gd:227 `route_chosen.emit(battle_id)` 直发;产品正路=game/presentation/views/level_map_screen.gd:458-465 `_submit_choice`(战斗/Boss 先 `visible = false` 再 emit);game/presentation/main_adventure_flow.gd:195-197 `on_route_chosen` 只在地图屏已隐时收栈回战斗屏(:209-211 `exit_level_screen` 置 `battle_root.visible = true`)→ emit 路径下 battle_root 恒隐,:229 battle_hud 审计空转采样(:227 注记实证在案)。
|
||||
- F2 全仓唯一剩 emit 图例段=ui_struct_probe.gd:249 `_btn_legend.pressed.emit()`(:249 注记「真点不可达……呈报待裁」);ui_click_probe.gd:1208-1236 图例已真输入(push_click 开+find_button「关闭」真点关+locks_input 读)。
|
||||
- F3 宽度现值:game/presentation/views/ap_bar_view.gd:62 停手钮 `Vector2(64, 0)`;:102 图例钮 `Vector2(56, 0)`;两钮同 row HBox(:65/:105 `row.add_child`)。确认弃图钮(:94)与弃图刷新钮(:110)min_w=0 豁免宽度基准且各在独立容器(_confirm_row/refresh_box),不属等宽组。
|
||||
- F4 equal_width 审计:ui_struct_probe.gd:5 头注纪律②;:781-812 同直接父容器 ≥2 可见按钮宽度差 >1px 红;:17 `WL = {}` 空豁免。
|
||||
- F5 注记现锚:game/tests/unit/presentation/tune_sim_batch_parity_test.gd:166/:199 两处「判据出处」锚 test-conventions「5. 测试函数怎么写——验收清单条目的落码规范」需求卡片(泛称,非测量语义判据句);五面对拍断言体(:173-195/:206 起)不改。
|
||||
- F6 重开冒险先例:game/probe/ui_click_probe.gd:615-619/988-992 `isolate_save` 新 tag+种子钉死+`_start_adventure_from_menu()`;game/presentation/main.gd:190-196 该函数无上下文守卫(探针直调中间态保留),调 `_start_adventure()`(:292 起,begin_session 重开会话)。
|
||||
- F7 选路真点先例:game/probe/ui_input_probe.gd:110-136 press+release 成对、抬杆沿提交;落点断言=地图屏隐∧`awaiting_choice()` 假。命中矩形读口=level_map_screen.gd:470-481 `candidate_rect(index) -> Rect2`(全局坐标、与 _candidate_at 同源、越界返回空 Rect2)。
|
||||
- F8 探针共用面签名:game/probe/probe_ui_util.gd:98 `isolate_save(main, tag, mark_first_done=false, with_settings=false, swap_save=true)`;:130 `push_click(main, ctrl)`;:134 `push_click_at(main, pos)`;:19 `find_button(root, needle, mode="prefix")`;:200 `scroll_button_into_view(main, view, btn)`。
|
||||
- F9 接线断言观测面:game/core/level_runner.gd:646-654 `pick_next_node`(AWAITING_CHOICE→RUNNING+_enter_node,候选外拒绝);:482 `awaiting_choice() -> bool` 读口。
|
||||
- F10 能力表:game/tests/README.md:163 调参测速批量模拟行在场(本批入口/用例名不变);无 battle_hud 结构审计与结构探针图例能力行(本批新增两行,写卡段已落)。
|
||||
- F11 gdstyle 基线:tools/gdstyle_baseline.txt 对 ui_struct_probe.gd/ap_bar_view.gd/tune_sim_batch_parity_test.gd 三件零登记键(grep 零命中;基线只登 core/presentation 存量超限键)。
|
||||
- F12 注记内容锚口径:test-conventions.md:121 注记条款(测量面驱动契约锚「批量模拟测量语义」句;行号形态出现即红;机检=tools/capability_audit.py)。
|
||||
- F13 探针规模:ui_struct_probe.gd 859 行、25 函数、1 成员变量(problems);冒险簇现内联 _ready :217-259。
|
||||
|
||||
## 4. 设计契约
|
||||
|
||||
- 🔴 C-1 两段式顺序不可倒:连接线断言在前(快速失败)、真输入在后;真实入口只认第二段,第一段不充当能力行真实入口(test-conventions「2. 场景级探针标配」两段式句)。触碰=L3 停机呈报。
|
||||
- 🔴 C-2 游戏行为零改动:本批产品码改动仅限 ap_bar_view.gd:102 宽度值;选路/切屏/模态栈产品码(level_map_screen/main_adventure_flow/main.gd)一行不改——探针问题修探针,不修产品。触碰=L3。
|
||||
- 🔴 C-3 禁削弱测试:现存断言族(battle_hud/status/legend 结构审计、standeefit、状态面板只读/零动效契约、parity 五面对拍)不删不改判据;equal_width 豁免册 WL 保持空;不放宽阈值。
|
||||
- 🔴 C-4 禁为机检文本保留无效成员(code-conventions §1.1 同款):机检键与卡片契约互斥时一律停卡呈报,禁自造第三条路。
|
||||
- 🔴 C-5 拆分边界纪律(判据权威=code-conventions §1.1 拆分判据):本卡拆出的每个私有函数须有可陈述职责与单一变化原因、须有集体身份;「过阈值」只作发现信号不作拆分动机;按纪律拆不出内聚单元=停卡呈报走豁免通道,禁硬拆凑绿。
|
||||
|
||||
## 5. 范围边界
|
||||
|
||||
做:ui_struct_probe 冒险簇两段式重写(含 battle_hud 实采样落点钉);图例段两段式重写;ap_bar_view 图例钮宽度 56→64;parity 两处注记改锚;能力表新增两行(写卡段动作,随卡已落)。
|
||||
|
||||
不做:
|
||||
- 不改选路产品码时序(on_route_chosen/_submit_choice 的置隐先后是产品语义,探针绕过了它——修探针不修产品)。
|
||||
- 不动 ui_click_probe/ui_input_probe 既有真输入段(相邻面只跑回归确认)。
|
||||
- 不实装 battle.md 2026-11-07 侧栏改版定稿(停手左栏/图例右栏——代码未实装,属后续呈现改版批;本批只在现行横排布局下统一宽度)。
|
||||
- 不扩 equal_width 审计面(高度族/其他屏纪律不动);不改 tune_sim 产品码与对拍断言体。
|
||||
|
||||
## 6. 关联文档同步面
|
||||
|
||||
| 文档 | 关联点 | 同步义务 |
|
||||
|---|---|---|
|
||||
| design/engineering/test-conventions.md | §2 两段式句、§8.3 批量模拟测量语义句 | 无需同步——文档批已前置定稿(本 worktree),实现与规格句一致 |
|
||||
| design/ux/battle.md | Component Inventory 等宽纪律句现行例(64px) | 无需同步——规格句已前置写入,与实现一致 |
|
||||
| game/tests/README.md | 能力表新增两行(冒险簇两段式/图例两段式) | 写卡段已当场入表(本卡随附动作);实现批只核对名实相符,禁直改 |
|
||||
| 待办清单.md | 四项条目状态与凭据 | 写卡段推进「已写卡」并登记卡路径+复核报告路径;实现入库后条目整条删除归批后收尾段 |
|
||||
|
||||
本批实现不改任何设计文档陈述——反哺点清单预期零条(T4 仍产出文件并逐条对同步面声明落点)。
|
||||
|
||||
## 7. 文件结构图与任务卡
|
||||
|
||||
### 文件结构图
|
||||
|
||||
| 文件 | 职责 | 改动性质 |
|
||||
|---|---|---|
|
||||
| game/presentation/views/ap_bar_view.gd | 图例钮最小宽度 56→64(:102 单值) | 行为改动(呈现)→ V4 |
|
||||
| game/probe/ui_struct_probe.gd | 冒险簇两段式+图例两段式重写;新增三私有函数(复用既有件 ProbeUiUtil,新增函数理由见预检节) | 非行为改动(探针测试面)→ V1/V2/V3 |
|
||||
| game/tests/unit/presentation/tune_sim_batch_parity_test.gd | 两处判据出处注记改锚(:166/:199) | 非行为改动(注记)→ V5 |
|
||||
| game/tests/README.md | 能力表新增两行 | 非行为改动(写卡段动作,随卡完成) |
|
||||
|
||||
### T0 基线读数(0.1–0.2 日)
|
||||
|
||||
取用:无。产出:基线读数(T1/T2 对拍用)。
|
||||
|
||||
- [ ] 逐条复核 F1–F13(file:line 实查);漂移即停卡呈报。
|
||||
- [ ] 孤立直跑结构探针取基线:仓库根跑 `D:\code\godot\Godot_v4.7.2-stable_win64_console.exe --headless --path game res://probe/ui_struct_probe.tscn`,记录退出码与 problems 输出(预期零红;battle_hud 审计空转为在册现状)。
|
||||
|
||||
### T1 宽度统一(V4;0.15–0.3 日)
|
||||
|
||||
取用:无。产出:图例钮宽度 64(T2 equal_width 实采样依赖)。
|
||||
|
||||
- [ ] 改 ap_bar_view.gd:102 `Vector2(56, 0)` → `Vector2(64, 0)`。
|
||||
- [ ] 跑渲染闸 `bash tools/render_gate.sh game`:battle 截图 golden 若红,新基线逐张呈用户审核(登记不阻塞),实现报告记录换代读数;零红则记录读数。
|
||||
- [ ] 孤立直跑 ui_struct_probe.tscn 确认零新增红(此时审计仍空转、equal_width 未触发,属预期中间态)。
|
||||
|
||||
### T2 冒险簇与图例两段式(V1/V2/V3;0.3–0.6 日)
|
||||
|
||||
取用:ProbeUiUtil 既有面(F8 签名逐字);`LevelMapScreen.candidate_rect(index: int) -> Rect2`;`LevelRunner.awaiting_choice() -> bool`;`main._start_adventure_from_menu()`;`_pick_battle_node(main)`/`_settle(frames)`/`_audit(screen, roots)`(本件既有)。
|
||||
产出:三私有函数 `_adventure_wiring_stage`/`_adventure_real_stage`/`_legend_two_stage`(T4 名实核对);battle_hud 实采样断言族。
|
||||
|
||||
- [ ] 新增 `_adventure_wiring_stage(main: Node) -> void`(async):职责=选路接线快速失败面。迁入现 :219-223 段(isolate_save tag "smoke_ui_struct_probe_adv"+种子 42+开冒险+_settle(4)+level_map 审计)与 :225-227 选路 emit;emit 注记改〔接线断言〕。
|
||||
- [ ] 在 `_adventure_wiring_stage` emit 后保留 _settle(6),再加消费断言:`main.run_scope.runner.awaiting_choice()` 为假,否则 `problems.append("[route_wiring] emit 选路未被消费(awaiting_choice 仍真)")`;候选无战斗节点时沿用现 :259 红句。
|
||||
- [ ] 新增 `_adventure_real_stage(main: Node) -> bool`(async):职责=选路真输入可达面。`isolate_save(main, "smoke_ui_struct_probe_adv_real", true, false, true)`(与 wiring 段同参,保两段候选一致)+种子 42 重钉+`_start_adventure_from_menu()`+_settle(4)(F6 先例形态)。
|
||||
- [ ] 在 `_adventure_real_stage` 加真点段:`_pick_battle_node` 取 id→`_cand_ids.find(id)` 取索引→`candidate_rect(index)`;矩形空或 id<0 → problems append 驱动中断、返回 false;否则 `ProbeUiUtil.push_click_at(main, rect.get_center())`+_settle(6)。
|
||||
- [ ] 在 `_adventure_real_stage` 真点后加落点三钉:`level_screen.visible` 假 ∧ `main.ui.screens.battle_root.visible` 真 ∧ `awaiting_choice()` 假;任一不满足 → problems append「[route_real] 真点选路未落战斗屏(逐项读数)」、返回 false;全过返回 true。
|
||||
- [ ] 新增 `_legend_two_stage(main: Node) -> void`(async):职责=图例开合两段面。第一段〔接线断言〕:`_btn_legend.pressed.emit()`→_settle→visible 断言→`await _audit("legend", […])`→`close()`→_settle→隐藏断言(现 :249-257 断言族原样迁)。
|
||||
- [ ] 在 `_legend_two_stage` 加第二段真输入:`ProbeUiUtil.push_click(main, _btn_legend)`→_settle→visible 断言→`ProbeUiUtil.find_button(legend_overlay, "关闭")` 真点关(钮缺=problems+close() 兜底,ui_click_probe:1229-1236 同款)→_settle→隐藏断言。
|
||||
- [ ] 重写 _ready 冒险簇调用序:`await _adventure_wiring_stage(main)` → `if await _adventure_real_stage(main):` 守卫内=宽度钉值断言(`_btn_legend.custom_minimum_size.x == 64.0`,否则 problems「[battle_hud] 图例钮宽度未统一 64」)→ battle_hud 审计+standeefit+状态面板段(现 :229-243 原样迁)→ `await _legend_two_stage(main)`。
|
||||
- [ ] 给三新函数各挂判据出处注记(内容锚:test-conventions.md「2. 场景级探针标配」两段式;图例函数另锚 HUD框架.md「提示与弹层:轻提示随起随消、重弹层排队进出」入栈出栈)。
|
||||
- [ ] 孤立直跑 ui_struct_probe.tscn 跑绿(equal_width 实采样停手/图例对=64/64)。
|
||||
- [ ] 孤立直跑 ui_click_probe.tscn 与 ui_input_probe.tscn 确认零回归(相邻真输入段)。
|
||||
|
||||
### T3 注记改锚(V5;0.1–0.15 日)
|
||||
|
||||
取用:test-conventions「8.3 改动—验收对照表」批量模拟测量语义句(改锚目标)。产出:两处注记新锚(T4 审计核对)。
|
||||
|
||||
- [ ] 改 tune_sim_batch_parity_test.gd:166 注记为 `# 判据出处: design/engineering/test-conventions.md「8.3 改动—验收对照表」批量模拟测量语义 逐帧步进每局恰占一帧、n=0 同步收尾零帧(双形态对拍判据)`。
|
||||
- [ ] :199 同款改锚。
|
||||
- [ ] 跑单元测试全套件 `D:\code\godot\Godot_v4.7.2-stable_win64_console.exe --headless --path game --script res://tests/run_all.gd` 跑绿。
|
||||
- [ ] 跑 `python tools/capability_audit.py` 注记道零红(内容锚核验)。
|
||||
|
||||
### T4 产出物落位(0.1–0.25 日)
|
||||
|
||||
取用:T1–T3 全部产出。产出:reports/ 两份+审计入口。
|
||||
|
||||
- [ ] 代码域闸全绿:`bash tools/run_all_gates.sh --code`(里程碑出口一次全套;波内修复只跑红件最小单元)。
|
||||
- [ ] 派未参与实现的只读子代理做独立验收审计(低档),报告落 `reports/iter<N>-验收审计-<日期>.md`;未过不合回。
|
||||
- [ ] 落 `reports/iter<N>-实现报告-<日期>.md`:各卡状态+实机目检总清单(目检项=AP 条停手/图例两钮宽度观感,登记不阻塞)+实现决定记录+渲染闸基线换代读数(若有)+equal_width 采样时停手钮 enable 态读数(disabled 会排除出等宽组,钉值断言腿已兜底,此处只记观测读数)。
|
||||
- [ ] 落 `reports/iter<N>-反哺点-<日期>.md`:同步面四条逐条声明落点(预期零设计文档改动)。
|
||||
- [ ] 能力表名实核对:README 两新行代表用例名与落地函数逐字一致(不一致回表,禁实现批改 README)。
|
||||
|
||||
## 8. 验证闸(改动—验收对照表)
|
||||
|
||||
| 需求点(判据出处锚) | 改动 | 验收测试 | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| V1 选路两段式:design/engineering/test-conventions.md「2. 场景级探针标配」两段式 | ui_struct_probe.gd 冒险簇重写(_adventure_wiring_stage/_adventure_real_stage) | 接线消费断言(awaiting_choice 假)+真点落点三钉,problems 零(ui_struct_probe.gd:_adventure_wiring_stage/_adventure_real_stage) | 探针 | 第二段 push_click_at 真点候选命中矩形中心(第一段 emit 不充当真实入口) | awaiting_choice() 取值+level_screen/battle_root 可见性 | 新增:冒险簇选路两段式与战斗HUD实采样结构审计 |
|
||||
| V2 battle_hud 实采样:design/engineering/test-conventions.md「2. 场景级探针标配」落点 | 同上(落点三钉守卫审计族) | battle_hud 结构审计+equal_width 实采样跑于可见根(ui_struct_probe.gd:_ready 战斗屏段) | 探针 | 同 V1 第二段 | 审计前落点 battle_root.visible 真+同容器按钮 size.x 读数 | 新增:冒险簇选路两段式与战斗HUD实采样结构审计 |
|
||||
| V3 图例两段式:design/engineering/test-conventions.md「2. 场景级探针标配」两段式;design/gdd/systems/表现与支撑/HUD框架.md「提示与弹层:轻提示随起随消、重弹层排队进出」入栈出栈 | ui_struct_probe.gd:_legend_two_stage | 接线开合断言+真点开/真点「关闭」钮合断言,problems 零 | 探针 | 第二段 push_click 图例钮/关闭钮真点 | legend_overlay.visible 开合读数 | 新增:图例层两段式开合 |
|
||||
| V4 两钮统一 64px:design/ux/battle.md「Component Inventory」按钮组等宽纪律 | ap_bar_view.gd:102 56→64 | 钉值断言(custom_minimum_size.x==64.0)+equal_width 审计(ui_struct_probe.gd:_ready 战斗屏段) | 探针 | V1 第二段真点选路落战斗屏 | _btn_legend.custom_minimum_size.x+同容器 size.x 差 ≤1 | 新增:冒险簇选路两段式与战斗HUD实采样结构审计 |
|
||||
| V5 注记改锚:design/engineering/test-conventions.md「8.3 改动—验收对照表」批量模拟测量语义 | tune_sim_batch_parity_test.gd:166/:199 注记 | 五面对拍套件原样跑绿(tune_sim_batch_parity_test.gd:_init)+capability_audit 注记内容锚核验 | 单元 | TuneSimController.run()(对拍套件驱动,调试接口直改类) | 五面对拍断言(不改)+注记关键词命中节块 | 既有:调参测速批量模拟(逐帧步进与统计读数) |
|
||||
|
||||
- 测试削弱申报:零旧断言删除、零阈值放宽、零豁免新增(WL 保持空);emit 注记由「前提注入(保留 emit)」改写为〔接线断言〕标记,断言族本身不变。
|
||||
- 闸口径:重闸=tools/run_all_gates.sh 按本批改动域选档;里程碑步(T 段)出口跑一次全套闸,波内修复只做出红最小单元的最窄确认,新增测试/工具先行孤立验证再并入全套。
|
||||
- 测试方式两分法:V1–V5 全归调试接口/探针验;用户目检一项(AP 条两钮宽度观感)入实现报告实机目检总清单,登记不阻塞。
|
||||
- 独立验收审计:入口=T4 只读子代理;报告=reports/iter<N>-验收审计-<日期>.md;低档梯度(test-conventions §8.7)。
|
||||
|
||||
## 9. 异常分级
|
||||
|
||||
- L1 自救:_settle 帧数微调(4–8 帧域内);problems 红句措辞;隔离 tag 命名微差。
|
||||
- L2 记录继续:渲染闸 golden 红→基线换代呈用户审核(登记不阻塞);探针覆盖登记件读数漂移。
|
||||
- L3 停机写报告等用户:C-1~C-5 任一触碰;真输入选路落点不稳(T2 软盒超);要改产品码才能让探针通过(C-2 互斥);机检预算互斥=上游缺陷停卡退回写卡段。
|
||||
|
||||
## 10. 代拍板白名单
|
||||
|
||||
- 隔离存档 tag 命名(smoke_ui_struct_probe_adv_real 同形)。
|
||||
- _settle 帧数(4–8 帧域内取值)。
|
||||
- problems 红句措辞与逐项读数格式。
|
||||
- 三新函数在 ui_struct_probe.gd 内的落位次序。
|
||||
|
||||
超清单微决策一律记入实现报告「实现决定记录」节。
|
||||
|
||||
## 11. 待裁点
|
||||
|
||||
零待裁点,开工门=U0。四项裁决已全部落地(用户 2026-11-09:①③两段式先后有序、②统一 64px、④落 test-conventions 测量面节、等宽句入 battle.md),规格三句已定稿在场。
|
||||
|
||||
## 12. 落位与可复用性预检
|
||||
|
||||
新增文件零;新增数据件零;新增函数三(均在 ui_struct_probe.gd 内):
|
||||
|
||||
- `_adventure_wiring_stage`/`_adventure_real_stage`/`_legend_two_stage`:
|
||||
- 复用面:驱动全复用 ProbeUiUtil 既有面(isolate_save/push_click_at/push_click/find_button,F8)——不新造 push_input 封装;重开冒险复用 `_start_adventure_from_menu`(ui_click_probe:615-619 先例);命中矩形复用 `candidate_rect` 读口(F7)。grep 同职责零命中(库内无 adventure_wiring/route_real/legend_two_stage 同名同义件)。为什么不能复用既有那一个:ui_click_probe 的图例段是其主循环内同步形态(零 await、_tested_legend 旗标守卫),与本件 _ready 协程结构审计族不同形,强共用会跨探针耦合两段流程;三函数按职责拆出(接线快速失败面/真输入可达面/图例开合面),各带单一变化原因,_ready 净缩短(F13)。
|
||||
- 唯一面:宽度值 64 只改 ap_bar_view.gd:102 一处(停手钮 :62 已是 64,无第二处定义);两段式驱动逻辑只落本件,不落第二份 helper;注记锚句只改两处现存注记,不另立锚清单。
|
||||
- 分层与交互面:探针 → ProbeUiUtil(共用面)→ Viewport.push_input(引擎输入管线);探针只读产品读口(awaiting_choice/candidate_rect/_cand_ids——后两者探针读取先例在案 :259/:470);产品码写面零(C-2)。
|
||||
|
||||
## 13. 禁为机检文本保留无效成员
|
||||
|
||||
本卡含探针重写(重构性质):禁止为迎合机检消息文本(含计数)保留或新增无效成员/别名;机检键与卡片契约互斥时实现段一律停卡呈报,不得自造第三条路(同 C-4,判据权威=code-conventions §1.1)。
|
||||
|
||||
## 14. 实现规范预算
|
||||
|
||||
- 新增文件零 → 新件三查不适用。
|
||||
- 存量触面一查:三触面文件在 tools/gdstyle_baseline.txt 零登记键(F11,grep 实查)——无「S13 键较登记值只降不升」存量义务;改后若 S13 出新红=新键超标,按 L3 机检预算互斥处置,禁抬基线换绿。
|
||||
- 新增三私有函数预算:单函数分支 ≤8、返回 ≤6(_adventure_real_stage 三返回出口);ui_struct_probe.gd 成员变量维持 1(problems)、公开方法零新增(三函数均私有);_ready 内联冒险簇段迁出后净缩短。
|
||||
|
||||
## 15. 拆分边界纪律
|
||||
|
||||
条款见 C-5(判据权威=code-conventions §1.1,不复制定文)。拆出单元职责语句与集体身份:接线段=选路接线快速失败面;真输入段=选路真输入可达面;图例两段=图例开合两段面——三名各有单一变化原因,非「剩下的成员」打包。实现报告逐件一行承载。
|
||||
|
||||
## 16. 验收档申报
|
||||
|
||||
低(头部已申报)。判据=失败代价单维:宽度改错即看即知、无状态残留;探针/注记改错不随存档或结算传播。U0 时用户确认或改判。
|
||||
|
||||
## 17. 复核记录
|
||||
|
||||
| 轮次 | 复核者身份 | 发现 | 去向 | 处置结果 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | 只读子代理(general-purpose,未参与本卡撰写) | §14 预算「_adventure_real_stage 两返回出口」与 T2 三步(false/false/true)共三返回不符 | 自判 | 改「三返回出口」(≤6 预算仍满足);依据=卡 T2 真点段三步声明 |
|
||||
| 1 | 同上 | T2 真输入段 isolate_save 只写 tag+种子,未显式钉三参;两段候选一致依赖与 wiring 段同参 | 补写 | T2 步骤补确切调用 `isolate_save(main, "smoke_ui_struct_probe_adv_real", true, false, true)`;依据=ui_struct_probe.gd:219、ui_click_probe.gd:615 先例同参 |
|
||||
| 1 | 同上 | equal_width 腿若采样时停手钮 disabled 则排除出组、该腿空转(钉值断言腿已兜底不假绿) | 自判 | 不改判据;T4 实现报告步骤补「采样时停手钮 enable 态读数」观测义务;依据=ui_struct_probe.gd:710/:791-792 可见按钮采集口径 |
|
||||
|
||||
其余审点(验收三问 V1–V5、F1–F13 实读对账、预检与结构图、拆分边界、引擎 4.7.2 三查、C-2 契约自洽与重开冒险路径、能力表名实、三判据锚节块命中)零发现。无待裁、无退回上游。
|
||||
|
||||
复核报告落盘:reports/复核-测试面四项收口批-2026-11-10.md
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
### 1.1 目标
|
||||
|
||||
把营地十层换成重排后的新矩形:围墙 (0,220,1280,200)、大门/告示板尺寸不变跟随、其余六件(dummy/forge/tent/chest/notebook/campfire)按 2026-11-05 裁定落位;围墙最终件(1280×164,补尖+底边入土缺口)入包;**土线同时覆盖围墙底与门扇底**,实机读作插在土里;十层结构不变(不新增图层);最终墙件重新出预览并经用户过目;布局/土线/渲染/独立审计全部有读数;营地屏按 `test-conventions.md:100` 纳入渲染闸 golden 机器面。
|
||||
把营地十层换成重排后的新矩形:围墙 (0,220,1280,200)、大门/告示板尺寸不变跟随、其余六件(dummy/forge/tent/chest/notebook/campfire)按 2026-11-05 裁定落位;围墙最终件(1280×164,补尖+底边入土缺口)入包;**土线同时覆盖围墙底与门扇底**,实机读作插在土里;十层结构不变(不新增图层);最终墙件重新出预览并经用户过目;布局/土线/渲染/独立审计全部有读数;营地屏按 `test-conventions.md「8.2 四层与真实入口」测试项扩项` 纳入渲染闸 golden 机器面。
|
||||
|
||||
### 1.2 完成定义
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
| design/art/camp-scene-prompts.md §5 第 6 条 :244+第 13 条 | 第 6 条只载“宝箱离底、其余上移 46px”关系句;六件逐值已由第 13 条补录 | 已闭合(2026-11-08 补录);实现批不直改设计文档 |
|
||||
| design/ux/camp.md 第 29 行 | 现写围墙带/墙脚入土;门扇底土线需补 | 反哺点,归文档批 |
|
||||
| design/art/art-status-checklist.md 营地行 | 需补“围墙件最终件 2026-11-07 换代+土线”事实 | 反哺点,归文档批 |
|
||||
| game/tests/README.md:165 能力表 | 营地能力行代表用例需补 `check_soil_line`、`_test_gate_state_keeps_soil_cut`、camp golden | 实现批禁写;反哺点 |
|
||||
| game/tests/README.md「测试层级」试玩日志器 能力表 | 营地能力行代表用例需补 `check_soil_line`、`_test_gate_state_keeps_soil_cut`、camp golden | 实现批禁写;反哺点 |
|
||||
| roadmap.md / 待办清单.md | 本卡编入迭代与状态推进 | 待办条目已补回(状态「已写卡」);编入迭代归编排段 |
|
||||
| 体验验证清单.md | 游戏内终审登记项 | 归文档批/实现报告登记,实现批不直改 |
|
||||
|
||||
@@ -199,14 +199,14 @@
|
||||
|
||||
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 围墙显示矩形 220/200(判据出处 design/ux/camp.md:29) | `camp_scene_layout.tres` wall | V14 围墙矩形钉值(`camp_scene_layout_test.gd:_test_layout_hotspot_geometry`) | 单元 | load 表+validate | texture_rect 取值 | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
| 门/板跟随(判据出处 design/art/camp-scene-prompts.md:250) | `.tres` gate/board | V14 门扇/告示板矩形钉值(`camp_scene_layout_test.gd:_test_layout_hotspot_geometry`) | 单元 | 同上 | texture_rect 取值 | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
| 其余六件落位(判据出处 design/art/camp-scene-prompts.md:244+§5 第 13 条) | `.tres` 六件 | V14 六件落位钉值+几何红线(`camp_scene_layout_test.gd:_test_layout_hotspot_geometry`) | 单元 | 同上 | texture_rect/hotspot 取值 | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
| 门扇显示高 138(判据出处 design/art/camp-scene-prompts.md:250) | `camp_scene_view.gd` `EXPAND_IGNORE_SIZE` | `ui_struct_probe` camp V1 层贴图矩形(`ui_struct_probe.gd:_ready` camp 段) | 探针 | `res://probe/ui_struct_probe.tscn` | 节点 position/size | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
| 围墙最终件(判据出处 design/art/art-bible.md:404) | `scene_camp_wall.png` | T0 `palette_check`/`path_check`+最终墙预览过目 | 资产 | 文件读数+用户过目 | 尺寸 1280×164、不透明 12 色、柱尖/奶油描边/底缺口、源包 md5 | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
| 土线覆盖围墙底+门扇底(判据出处 design/art/art-bible.md:405) | `camp_scene_view.gd` 土线裁切材质挂 wall/gate | `shot_checker.py:check_soil_line(img, failures)`+`shot_camp.png`:顶线 410–416、≥3 个不同顶线值、接缝差≤1px、边界下首行对背景同列颜色距离≤容差且非墙色、`top−1` 暗边、gate 底无直边/灰影 | 探针 | `shot_probe` 营地窗口化截图 | 截图像素:边界行/颜色距离/暗边亮度 | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
| 门扇状态切换保留土线(判据出处 design/art/art-bible.md:405) | `camp_scene_view.gd` `_apply_state`/`_apply_hover`/`_apply_disabled` | `camp_scene_layout_test.gd:_test_gate_state_keeps_soil_cut`:实例化 `CampSceneView`,对 gate 依次 NORMAL/HOVER/DISABLED,断言 `gate.material` 始终为土线材质、`desat` 参数随态变化 | 单元 | `camp_scene_view.gd` 真实类+`camp_scene_layout.tres` | `gate.material` 引用+shader uniform 取值 | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
| 营地屏渲染不回归+golden(判据出处 design/engineering/test-conventions.md:100) | 十层+土线整体;`tools/render_gate.sh` camp 段;`game/tests/golden/<platform>/camp.png` | `render_gate.sh` 七屏+A-D+土线机检+camp golden 逐像素 | 探针 | `bash tools/render_gate.sh game` | 截图色彩/骨架/土线/camp.png 逐像素 | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
| 围墙显示矩形 220/200(判据出处 design/ux/camp.md「场景构成与七物件绑定」地平线在终稿) | `camp_scene_layout.tres` wall | V14 围墙矩形钉值(`camp_scene_layout_test.gd:_test_layout_hotspot_geometry`) | 单元 | load 表+validate | texture_rect 取值 | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
| 门/板跟随(判据出处 design/art/camp-scene-prompts.md「5. 已裁」围墙显示几何与墙脚入土) | `.tres` gate/board | V14 门扇/告示板矩形钉值(`camp_scene_layout_test.gd:_test_layout_hotspot_geometry`) | 单元 | 同上 | texture_rect 取值 | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
| 其余六件落位(判据出处 design/art/camp-scene-prompts.md「5. 已裁」宝箱离底 第 13 条) | `.tres` 六件 | V14 六件落位钉值+几何红线(`camp_scene_layout_test.gd:_test_layout_hotspot_geometry`) | 单元 | 同上 | texture_rect/hotspot 取值 | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
| 门扇显示高 138(判据出处 design/art/camp-scene-prompts.md「5. 已裁」围墙显示几何与墙脚入土) | `camp_scene_view.gd` `EXPAND_IGNORE_SIZE` | `ui_struct_probe` camp V1 层贴图矩形(`ui_struct_probe.gd:_ready` camp 段) | 探针 | `res://probe/ui_struct_probe.tscn` | 节点 position/size | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
| 围墙最终件(判据出处 design/art/art-bible.md「6.2 营地场景」交付形态) | `scene_camp_wall.png` | T0 `palette_check`/`path_check`+最终墙预览过目 | 资产 | 文件读数+用户过目 | 尺寸 1280×164、不透明 12 色、柱尖/奶油描边/底缺口、源包 md5 | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
| 土线覆盖围墙底+门扇底(判据出处 design/art/art-bible.md「6.2 营地场景」墙脚入土线) | `camp_scene_view.gd` 土线裁切材质挂 wall/gate | `shot_checker.py:check_soil_line(img, failures)`+`shot_camp.png`:顶线 410–416、≥3 个不同顶线值、接缝差≤1px、边界下首行对背景同列颜色距离≤容差且非墙色、`top−1` 暗边、gate 底无直边/灰影 | 探针 | `shot_probe` 营地窗口化截图 | 截图像素:边界行/颜色距离/暗边亮度 | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
| 门扇状态切换保留土线(判据出处 design/art/art-bible.md「6.2 营地场景」墙脚入土线) | `camp_scene_view.gd` `_apply_state`/`_apply_hover`/`_apply_disabled` | `camp_scene_layout_test.gd:_test_gate_state_keeps_soil_cut`:实例化 `CampSceneView`,对 gate 依次 NORMAL/HOVER/DISABLED,断言 `gate.material` 始终为土线材质、`desat` 参数随态变化 | 单元 | `camp_scene_view.gd` 真实类+`camp_scene_layout.tres` | `gate.material` 引用+shader uniform 取值 | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
| 营地屏渲染不回归+golden(判据出处 design/engineering/test-conventions.md「8.2 四层与真实入口」测试项扩项) | 十层+土线整体;`tools/render_gate.sh` camp 段;`game/tests/golden/<platform>/camp.png` | `render_gate.sh` 七屏+A-D+土线机检+camp golden 逐像素 | 探针 | `bash tools/render_gate.sh game` | 截图色彩/骨架/土线/camp.png 逐像素 | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
|
||||
注:未删改 V14 旧断言;新增钉值、门扇状态土线保留单测、土线机检与 camp golden 属追加。测试削弱申报:无。
|
||||
|
||||
@@ -265,7 +265,7 @@
|
||||
| 2 | 同上 | “其余物件 z4–z6”与视图子节点 0–9 混淆 | 自判 | §3 写明视图子节点序 0–9+设计 z 层 wall1/gate3/其余 z4–z6 |
|
||||
| 2 | 同上 | 单一材质无法处理 gate 局部 x 的 +520 偏移 | 补写 | §3 钉 `gx=UV.x*u_width+u_x_offset`(wall 0/1280;gate 520/240) |
|
||||
| 2 | 同上 | gate NORMAL 置 null、DISABLED 换 `_desat_mat` 会抹掉土线 | 补写 | §3 钉土线材质常驻+`desat` uniform;§7 增行 7;新增单测 `_test_gate_state_keeps_soil_cut` |
|
||||
| 2 | 同上 | 缺 camp golden(`test-conventions.md:100`) | 补写 | §1.2/§6 T2/T3/§7 行 8/§11/§12 增 camp golden;`render_gate.sh`+`golden_baseline_refresh.sh --camp` |
|
||||
| 2 | 同上 | 缺 camp golden(`test-conventions.md「8.2 四层与真实入口」测试项扩项`) | 补写 | §1.2/§6 T2/T3/§7 行 8/§11/§12 增 camp golden;`render_gate.sh`+`golden_baseline_refresh.sh --camp` |
|
||||
| 2 | 同上 | 土线机检写死 1280 且“同源”判据循环 | 补写 | §6 T2 改为按截图宽高比例取样;对 `scene_camp_bg.png` 同列颜色距离+非墙色;容差归白名单 |
|
||||
| 2 | 同上 | 缺文件结构图 | 补写 | 增 §5.5 文件结构图 |
|
||||
| 2 | 同上 | 测试函数名未钉(“或等价函数”、§9 循环) | 补写 | 钉 `check_soil_line(img: Image.Image, failures: list) -> None`+`_test_gate_state_keeps_soil_cut`;§7/§9 同步 |
|
||||
|
||||
@@ -32,7 +32,7 @@ design/gdd/systems/表现与支撑/数据配置.md v1.4:
|
||||
- F6 生产表安全余量:enemy.tres battle/boss 行 atk∈{1,3}(atk_max≤4,:16/:309 等)、elite 行 atk=2/atk_max=3(:217-219)、hero.tres:7 max_hp=26——新检查对生产表恒过(空难度表跳过)。
|
||||
- F7 单测先例:game/tests/unit/core/config_db_cross_validator_test.gd:49-87——夹具直构表对象、ValidatorScript.new() 直调、Kit.check 断言、每函数带「判据出处」注记;套件登记 game/tests/run_all.gd:259 expect=0。
|
||||
- F8 致命类先例:game/tests/unit/data_config/reward_dangling_treasure_test.gd:39-56——Kit.copy_tables 复制生产表到 user:// 夹具目录、文本注入违规、ConfigDBScript.new().load_tables(BAD_DIR,false) 正式通道、退出码协议 1=正确拒绝/2=放行回归;登记形态 run_all.gd:178 expect=1 negative=true。
|
||||
- F9 能力清单:game/tests/README.md:206 有「敌人技能池跨表链接校验」行(本批 :207 新增「跨表量级校验」行);:231 数据配置覆盖矩阵行不含跨表量级校验。
|
||||
- F9 能力清单:game/tests/README.md「测试层级」状态效果结算链 有「敌人技能池跨表链接校验」行(本批 :207 新增「跨表量级校验」行);:231 数据配置覆盖矩阵行不含跨表量级校验。
|
||||
- F10 gdstyle 基线:tools/gdstyle_baseline.txt 无 config_db_cross_validator.gd 与 hero_table.gd 键(均在默认阈值内);校验器现行 func 总数 14(公开 2:cross_validate/validate_skill_pool_links)。
|
||||
|
||||
## 4. 设计契约(违反即返工,🔴 触碰=L3 停机呈报)
|
||||
@@ -81,7 +81,7 @@ design/gdd/systems/表现与支撑/数据配置.md v1.4:
|
||||
|
||||
- [ ] S13 读数:直跑 gdstyle 对 config_db_cross_validator.gd 与 hero_table.gd 记改前读数(两文件基线无键=默认阈值内;预期改后公开方法 2→3、func 14→≤17,仍阈值内,基线零增键)。
|
||||
- [ ] hero_table.gd 增常量 `const MAX_HP_DOMAIN_MAX := 999`,:16 域检查上界改引常量(语义不变);跑 hero 相关单测最窄确认(config_db_test.gd 全套件直跑,命令见验证闸节)。
|
||||
- [ ] 校验器新增 `func validate_attack_magnitude(loaded: Dictionary, push_diag: Callable) -> void`:取 enemy/difficulty/hero 三表,任一 null 早退(单表已报错不连锁,同 :12-13 先例);难度表 rows 为空早退(数据配置.md:132);乘数上界=全行 atk_mult(缺省 1.0)逐个钳制到 DifficultyTable.MULT_MIN/MULT_MAX 后取最大;逐敌行——row_kind="boss" 跳过(:132),攻击上界=有 atk_max 取 atk_max 否则 atk(:130);乘积 > HeroTable.MAX_HP_DOMAIN_MAX 即 push_diag.call("error", "cross_magnitude", 消息含 enemy_id/行键、乘积值、域上界)。
|
||||
- [ ] 校验器新增 `func validate_attack_magnitude(loaded: Dictionary, push_diag: Callable) -> void`:取 enemy/difficulty/hero 三表,任一 null 早退(单表已报错不连锁,同 :12-13 先例);难度表 rows 为空早退(数据配置.md「跨表量级校验:组合数值的上界不得突破目标字段的取值域」难度表为空表时跳过本检查);乘数上界=全行 atk_mult(缺省 1.0)逐个钳制到 DifficultyTable.MULT_MIN/MULT_MAX 后取最大;逐敌行——row_kind="boss" 跳过(:132),攻击上界=有 atk_max 取 atk_max 否则 atk(:130);乘积 > HeroTable.MAX_HP_DOMAIN_MAX 即 push_diag.call("error", "cross_magnitude", 消息含 enemy_id/行键、乘积值、域上界)。
|
||||
- [ ] cross_validate 在 ⑦(:24)后接线 `_cv_attack_magnitude` 私有包装(缺表早退语义与 ⑤⑥⑦ 同款),第⑧项注释编号沿用既有圈码形态。
|
||||
- [ ] 单测五函数落地(签名与断言见验证闸 V1–V5),经 cross_validate 真实通道驱动(夹具 loaded 字典含三被测表+status_effects/reward 用 new() 空行+settlement 夹具=SettlementTable.new() 且 core=SettlementCoreTable.new(),source_label_map 填齐七必需键 safe_cell/seal_hit/mine_hit/clear_reward/hero_attack/enemy_action/seal_miss(值任意)、effect_pool_map 留空——否则②读 null core 脚本错误、③报 7 条 segorder_violation 污染零错断言,config_db_cross_validator.gd:68/:74-78;此三表过 :12-13 早退门);难度夹具行键=level_index/node_depth/hp_mult/atk_mult(difficulty_table.gd:7 声明面),英雄夹具=HeroTable.new()(检查只读域常量不读现行值);每函数带「判据出处」注记指向数据配置.md 行锚。
|
||||
- [ ] 直跑该单测套件绿(命令见验证闸节),读数写进本步提交。
|
||||
@@ -92,7 +92,7 @@ design/gdd/systems/表现与支撑/数据配置.md v1.4:
|
||||
取用:T0 的 `validate_attack_magnitude`(经 load_tables 间接消费,无直调)。产出:`cross_magnitude_fatal_test.gd`(run_all.gd 登记行)。
|
||||
|
||||
- [ ] 新建 game/tests/unit/data_config/cross_magnitude_fatal_test.gd,形态照 F8 先例:Kit.copy_tables("res://data/tables", "user://cross_magnitude_fixture") → 双表注入:enemy.tres 首行三改 `"atk": 1`→`"atk": 500`、`"atk_min": 0`→`"atk_min": 500`、`"atk_max": 2`→`"atk_max": 500`(首个 goblin battle 行锚 :16-18;该行带攻击区间,中点恒等锚 enemy_table.gd:134 要求 atk=(min+max)/2——只改 atk 则单表中点锚报错且跨表检查读上界=atk_max=2 不触发,三改保单表自洽+跨表上界 500)。注入取首现位置:find 定位+substr 拼接(照 F8 先例 substr 形态,reward_dangling_treasure_test.gd:27-30);禁 String.replace 全量替换——同值串遍布全表,且 :334-336/:362-364 行 atk_min=1 会被打破中点锚。difficulty.tres `rows = []` 改 `rows = [{ "level_index": 1, "node_depth": 0, "hp_mult": 1.0, "atk_mult": 3.0 }]`(500×3=1500>999 必触发)。
|
||||
- [ ] 断言协议:ConfigDBScript.new().load_tables(BAD_DIR,false) 返回 false 且 diagnostics 含 category="cross_magnitude" → quit(1);放行或无该诊断 → quit(2);夹具准备失败 → quit(2)。_init 函数体内首行写 `# 判据出处: design/gdd/systems/表现与支撑/数据配置.md:215 …` 注记(照 F8 :40 形态;G 道按函数扫,文件头注不计,capability_audit.py:347-410);文件头注另写明退出码协议。
|
||||
- [ ] 断言协议:ConfigDBScript.new().load_tables(BAD_DIR,false) 返回 false 且 diagnostics 含 category="cross_magnitude" → quit(1);放行或无该诊断 → quit(2);夹具准备失败 → quit(2)。_init 函数体内首行写 `# 判据出处: design/gdd/systems/表现与支撑/数据配置.md「验收标准」致命真的会死 …` 注记(照 F8 :40 形态;G 道按函数扫,文件头注不计,capability_audit.py:347-410);文件头注另写明退出码协议。
|
||||
- [ ] run_all.gd 致命类区(:178 邻域)增登记行 `{"path": "res://tests/unit/data_config/cross_magnitude_fatal_test.gd", "expect": 1, "negative": true}`。
|
||||
- [ ] 孤立直跑新套件确认退出码 1,再跑单元测试全套件确认登记生效且既有套件零回归,读数写进本步提交。
|
||||
|
||||
@@ -107,12 +107,12 @@ design/gdd/systems/表现与支撑/数据配置.md v1.4:
|
||||
|
||||
| # | 需求点(判据出处行锚) | 改动 | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| V1 | 越界组合加载期报错(design/gdd/systems/表现与支撑/数据配置.md:130) | 校验器第⑧项 | _test_magnitude_over_limit报cross_magnitude(夹具敌行 atk=500×难度行 atk_mult=3.0→1500>999;config_db_cross_validator_test.gd,_test_ 尾缀) | 单元 | ConfigDbCrossValidator.cross_validate(loaded,push_diag) | push_diag 收到 severity=error ∧ category="cross_magnitude" ∧ 消息含越界敌行键 | 新增:跨表量级校验 |
|
||||
| V2 | 合法组合与边界等值零误报(design/gdd/systems/表现与支撑/数据配置.md:214) | 同上 | _test_magnitude_legal_and_boundary_zero_error(三组:999×1.0 边界等值/100×2.0 域下/boss 行 atk=999×mult 3.0 豁免) | 单元 | 同 V1 | 三组各零 error;boss 组难度行 atk_mult=3.0 非空(若不跳过 boss 则 2997>999 必报——防空表跳过使豁免断言空转) | 新增:跨表量级校验 |
|
||||
| V3 | 空难度表跳过(design/gdd/systems/表现与支撑/数据配置.md:132) | 同上 | _test_magnitude_empty_difficulty_skipped | 单元 | 同 V1 | 敌 atk=999+难度 rows=[] 零 error | 新增:跨表量级校验 |
|
||||
| V4 | 区间取上限(design/gdd/systems/表现与支撑/数据配置.md:130) | 同上 | _test_magnitude_range_uses_atk_max | 单元 | 同 V1 | atk=350/atk_min=100/atk_max=600+乘数 2.0 → 报(600×2=1200>999);atk=250/atk_min=100/atk_max=400 → 零错(400×2=800);两组 atk 均满足区间中点恒等锚(enemy_table.gd:134) | 新增:跨表量级校验 |
|
||||
| V5 | 越域乘数按域边界值计(design/gdd/systems/表现与支撑/数据配置.md:130) | 同上 | _test_magnitude_mult_clamped_to_domain | 单元 | 同 V1 | atk=100+atk_mult=50.0(钳制 10.0)→ 报(100×10=1000>999);atk=99+同乘数 → 零错(990) | 新增:跨表量级校验 |
|
||||
| V6 | 致命真的会死(design/gdd/systems/表现与支撑/数据配置.md:215+:104) | 第⑧项经装载通道 | cross_magnitude_fatal_test.gd:_init(独立进程,expect=1 negative=true) | 单元(致命协议) | ConfigDB.load_tables(BAD_DIR,false) 正式通道 | 进程退出码 1 ∧ load_tables 返回 false ∧ diagnostics 含 cross_magnitude | 新增:跨表量级校验 |
|
||||
| V1 | 越界组合加载期报错(design/gdd/systems/表现与支撑/数据配置.md「跨表量级校验:组合数值的上界不得突破目标字段的取值域」敌人攻击) | 校验器第⑧项 | _test_magnitude_over_limit报cross_magnitude(夹具敌行 atk=500×难度行 atk_mult=3.0→1500>999;config_db_cross_validator_test.gd,_test_ 尾缀) | 单元 | ConfigDbCrossValidator.cross_validate(loaded,push_diag) | push_diag 收到 severity=error ∧ category="cross_magnitude" ∧ 消息含越界敌行键 | 新增:跨表量级校验 |
|
||||
| V2 | 合法组合与边界等值零误报(design/gdd/systems/表现与支撑/数据配置.md「验收标准」跨表量级护栏) | 同上 | _test_magnitude_legal_and_boundary_zero_error(三组:999×1.0 边界等值/100×2.0 域下/boss 行 atk=999×mult 3.0 豁免) | 单元 | 同 V1 | 三组各零 error;boss 组难度行 atk_mult=3.0 非空(若不跳过 boss 则 2997>999 必报——防空表跳过使豁免断言空转) | 新增:跨表量级校验 |
|
||||
| V3 | 空难度表跳过(design/gdd/systems/表现与支撑/数据配置.md「跨表量级校验:组合数值的上界不得突破目标字段的取值域」难度表为空表时跳过本检查) | 同上 | _test_magnitude_empty_difficulty_skipped | 单元 | 同 V1 | 敌 atk=999+难度 rows=[] 零 error | 新增:跨表量级校验 |
|
||||
| V4 | 区间取上限(design/gdd/systems/表现与支撑/数据配置.md「跨表量级校验:组合数值的上界不得突破目标字段的取值域」敌人攻击) | 同上 | _test_magnitude_range_uses_atk_max | 单元 | 同 V1 | atk=350/atk_min=100/atk_max=600+乘数 2.0 → 报(600×2=1200>999);atk=250/atk_min=100/atk_max=400 → 零错(400×2=800);两组 atk 均满足区间中点恒等锚(enemy_table.gd:134) | 新增:跨表量级校验 |
|
||||
| V5 | 越域乘数按域边界值计(design/gdd/systems/表现与支撑/数据配置.md「跨表量级校验:组合数值的上界不得突破目标字段的取值域」敌人攻击) | 同上 | _test_magnitude_mult_clamped_to_domain | 单元 | 同 V1 | atk=100+atk_mult=50.0(钳制 10.0)→ 报(100×10=1000>999);atk=99+同乘数 → 零错(990) | 新增:跨表量级校验 |
|
||||
| V6 | 致命真的会死(design/gdd/systems/表现与支撑/数据配置.md「验收标准」致命真的会死) | 第⑧项经装载通道 | cross_magnitude_fatal_test.gd:_init(独立进程,expect=1 negative=true) | 单元(致命协议) | ConfigDB.load_tables(BAD_DIR,false) 正式通道 | 进程退出码 1 ∧ load_tables 返回 false ∧ diagnostics 含 cross_magnitude | 新增:跨表量级校验 |
|
||||
|
||||
- 验证命令:单元套件直跑 `D:\code\godot\Godot_v4.7.2-stable_win64_console.exe --headless --path game --script res://tests/unit/core/config_db_cross_validator_test.gd`;致命套件同形换路径;全套件 `--script res://tests/run_all.gd`。
|
||||
- 测试方式两分法:V1–V6 全归调试夹具直构/夹具注入(能力验证);本批无玩家可见面,用户目检项=无。
|
||||
@@ -171,4 +171,4 @@ design/gdd/systems/表现与支撑/数据配置.md v1.4:
|
||||
| 1 | 只读子代理(未参与本卡撰写) | §16 占位句「节末申报复核报告落盘路径」为过期指令(2026-11-06 已裁不另设报告文件) | 补写 | 回填本节时已删该句;凭据=本节自身(req-card 必备结构第 17 节;pipeline_gate.py check_review :650-687 不查报告文件) |
|
||||
| 1 | 只读子代理(未参与本卡撰写) | V3 零错判据不能区分「空表跳过」与「缺省乘数 1.0」两种实现 | 自判 | 不改:敌 atk 域 [0,999]×1.0 恒 ≤999,两实现可观测面等价;V3 绑可观测契约仍抓空最大值崩溃与错误缺省 >1(依据 enemy_table.gd:115;req-card 判据绑定面口径只要求绑可观测提交面) |
|
||||
| 1 | 只读子代理(未参与本卡撰写) | F1 锚 :17-24 含一行 helper 调用(①–⑦链实在 :18-24) | 自判 | 不改::17 为 _effect_ids_of 调用,范围覆盖调用链、内容匹配,一行偏差不影响核对(config_db_cross_validator.gd:17-24 实读) |
|
||||
| 1 | 只读子代理(未参与本卡撰写) | 既有单测件判据注记锚指 数据配置.md:195 已漂移(历史遗留,非本批改动面) | 自判 | 不改:本批只增函数不触既有注记;G 道只查行号越界不查内容(capability_audit.py:401-403);日后触及该件另登记 |
|
||||
| 1 | 只读子代理(未参与本卡撰写) | 既有单测件判据注记锚指 数据配置.md「P1 / P2 后置」编辑器内表文件热重载自动化 已漂移(历史遗留,非本批改动面) | 自判 | 不改:本批只增函数不触既有注记;G 道只查行号越界不查内容(capability_audit.py:401-403);日后触及该件另登记 |
|
||||
Reference in new issue
Block a user