iter56-收尾
This commit is contained in:
1 parent
5ec4a311bb
commit
cedc2e0b5d
21 files changed
+1065
-529
No files matched your search
@@ -0,0 +1,89 @@
|
||||
# 迭代 56 独立验收审计(结算期文字列表退役批+封印动作改版批)
|
||||
|
||||
> 2026-11-08。审计人=未参与实现的独立子代理;仓库 `D:\code\g-plan2-iter56`(分支 iter56,HEAD=043c24c0,工作区干净);diff 范围 a0ea828f..HEAD(13 个提交,48 文件,+1301/−485)。审计依据=test-conventions §8.7;卡1 验收档=中、卡2 验收档=高(两卡头部申报在案)。全部 grep、diff 与复跑为审计人独立执行,不采信实现报告自述。
|
||||
|
||||
## 一、执行深度声明
|
||||
|
||||
| 审计动作 | 卡1(中档) | 卡2(高档) |
|
||||
|---|---|---|
|
||||
| 对照表逐行核对 | 全量 5 行(R1-R5) | 全量 12 行(R1-R12) |
|
||||
| 判据绑定面抽查 | 3 行(R1/R3/R5,超 ≥2 下限) | 6 行(V1/V2/V3/V4/V9/V10,超 ≥5 下限) |
|
||||
| 测试削弱检查 | 逐处(diff 全部删除行/改判行逐一对申报清单) | 逐处(同左) |
|
||||
| 直查例外核对 | 逐条 | 逐条 |
|
||||
| 最窄测试复跑 | 档位规定省略;实际超额跑 2 件(R1/R5,退出码 0×2) | 跑 1 件(minesweeper_rules_test,含 V1-V4,退出码 0) |
|
||||
| 判据出处抽查 | 3 行(R1/R3/R5 锚句实读) | 6 行(V1/V2/V3/V4/V5/V10 锚句实读对照) |
|
||||
|
||||
## 二、卡1 对照表逐行核对(R1-R5)
|
||||
|
||||
| 行 | 判定 | 依据 |
|
||||
|---|---|---|
|
||||
| R1 结算期零逐行文字 | **缺漏(记账级)——测试实质通过** | 测试在位:`game/tests/unit/presentation/battle_log_zero_text_test.gd`(新增)。真实入口实证=main.tscn 实例→`_start_adventure_from_menu`→选节点→真实战斗→`ms.settle_batch` 挖掘/停手→断言 `main.ui.battle.log_view` 组合根链,未绕过改动点(停手经规则批次入口,与生产停手同路径;行流经真实 step_row→row_pacer 信号链)。尾缀〔退役改 V-退役卡 R1〕grep 命中断言 3 处(:77/:81/:85)+run_all 注册行。绑定面=三时点 parsed_text 冻结于进节点叙述基线(非终屏态),复跑 exit 0。**缺漏本体**:卡 §10 与 game/tests/README.md:137 点名函数 `_smoke_settle_zero_rows` 全仓不存在(断言内联在 `_init`)——白名单 1 授权命名自判,但 §8.9「改名则回表」未履行(能力清单仍载旧名),且实现报告 §三 记「落地一致」失实 |
|
||||
| R2 FX 与 toast 链不断 | 通过(附注记) | `pacing_queue_test.gd:_assert_fx_chain`(:190)在位,尾缀〔退役改 V-退役卡 R2〕命中 8 处断言;真实行集=main.tscn 真实结算采样 step_row,重放独立 RowPacer(生产类),弹道/标出/色环/横幅/toast 计数从行型分布独立推导(防同义反复形态);`standee_fx_sweep_test.gd:_init` 在位未改。附注:卡绑定面写「与改前逐位一致」,落地改为「期望独立推导逐位一致」+「FX 链三函数零 diff」(f0390714 可证)——防镜像性更强,判等价兑现 |
|
||||
| R3 日志零文案、字段不缺 | 通过 | `playtest_logger_step_fields_test.gd:_assert_no_text_and_full_payload`(:37)在位;真实入口=LevelAutoplay.run_level 挂 logger→落盘 JSONL 读回(:41-48),非直调 logger。尾缀 R3 命中断言 4 处。改动面核对:playtest_logger.gd 删 text 键+平铺跳 display_name,其余字段与 payload 一行未减(diff 实证) |
|
||||
| R4 分析判读等价 | 通过(读数为提交记载,未独立复采) | `tools/analyze_parity_check.py` 在位(剥名逐位 diff+exit 语义完整);analyze_playtest.py 三处 text 判读改结构化 reason 优先+text 子串兜底双分支(diff 实证,effect_id_of 既有双分支未动)。T0 两份基线快照在盘:`sim-data/改前判读基线_历史锚71000_20261107.md`(3394 行)、`改前判读基线_同种子71000_20261107.md`(149 行),与报告读数行数吻合;三读数一致记载于提交 82725501。改后同种子日志未留盘,审计未复采(复采属读数类采集,不在审计义务内)——以工具+基线+提交读数为凭 |
|
||||
| R5 未生效原因结构化 | 通过 | `reward_ineffective_reason_test.gd:_assert_four_reasons`(:63)在位;真实入口=begin_battle→grant_routed→轮末结账,四类 reason 逐一命中,复跑 exit 0(12 checks)。六发射点 reason 键全部落地(damage_controller/reward_grant×3/combat_segment/grant_segment,diff 实证)。尾缀 R5 的 grep 载体=run_all.gd:216 注册行;套件内断言消息未带尾缀(卡1 各套件落点不统一,注记不判缺) |
|
||||
|
||||
**卡1 削弱检查(逐处)**:diff 全部删除/改判行共 8 处,逐一对申报——①pacing_queue「末信号行原文在明细带」→卡 §10 申报面(:108-120)改判 FX 承接 ✓;②theme_projection 9 类格式化闸→卡 §10 申报(_smoke_battle_log_view)改写 FX 落拍闸 ✓;③player_copy_sweep u6→卡 §10 申报(_sweep_source_names)改防回潮 ✓;④feat_vouchers A12→申报外,§5.5 同生死登记(追认单 #3)✓;⑤ui_click_probe wr1-b 反转+开场行判定面→追认单 #6 ✓;⑥theme/player_copy/ui_probe:133-135 零改动→git diff 实证 ui_probe.gd 空 diff,追认单 #11 属实 ✓;⑦run_all.gd 只增不删 ✓。**未发现申报外削弱**。
|
||||
|
||||
**卡1 直查例外(逐条)**:①reward_ineffective_reason_test hero hp=0/敌 hp=1 直改——测试头注 :7 随行申报「无公开 setter」,报告 R5 行同记 ✓;②该件 `settlement._reward_economy`/`_enemy_system` 私有域直查——旧版 seal_polarity_test 已有 4 处同款(git show a0ea828f 实证),头注注记「seal_polarity 负向直验同款形态」,按既有先例豁免;③pacing_queue/theme_projection 的 FakeStage/FakeFx/FakeBoardZone 为测试替身记参件,非产品内字段直查,不属例外。
|
||||
|
||||
## 三、卡2 对照表逐行核对(R1-R12)
|
||||
|
||||
| 行 | 判定 | 依据 |
|
||||
|---|---|---|
|
||||
| R1 封印受理即揭示 | 通过 | `minesweeper_rules_test.gd:_test_seal_reveal_identity`(:201)在位;**真实入口=settle_batch**(:209/:225 提交 seal_place,未直调 `_do_seal_place`);身份断言=has_seal+`BoardData.cell_identity` 组合(T1b 落位重设计后形态,公开面);受理零 cell_revealed 哨兵在位;尾缀 V1 命中 4 断言。复跑 exit 0 |
|
||||
| R2 挖封印格被拒 | 通过 | `_test_dig_sealed_rejected`(:234)在位:sub_reason=="target_sealed"+封印/揭示/AP 三态零变化,经 settle_batch;seal_polarity 四情况组 ②④改判为拒绝断言(diff 实证,见削弱①);V2 尾缀命中 minesweeper_rules_test 2 处+seal_polarity 8 处 |
|
||||
| R3 清图口径换代 | 通过 | `_test_clear_by_seal`(:255)在位:非末封 false→唯一未完成格=已封印 true→干净板逐格封至清图、round_end 恰一条 path_tag=cleared;全部经 settle_batch。V3 尾缀命中 5 断言 |
|
||||
| R4 能清图的封最优先 | 通过 | `_test_classify_seal_clears`(:292)在位:同批 stop+清图封,赢家=清图封居执行序首、stop voided、round_end=cleared;经 settle_batch。V4 尾缀命中 4 断言 |
|
||||
| R5 判定批与溢价零改动 | 通过 | seal_polarity 保留组(末点 AP/标中溢价/标空负向/完美封印双份)断言原样未改(diff 实证删改仅限四情况 ②④改判面);V5 判据出处注记 grep 命中 2 处(:51/:444)——T4 提交说明称「三函数」,实落 2 处(注记级出入,两保留组函数均有载体,不判缺) |
|
||||
| R6 受理零兑付、改判路径死 | **缺漏(载体级)——实质通过** | 实质面:settlement_wiring_snapshot_test.gd 零改动(git diff 空),内嵌 golden 在「挖+封+停」驱动序下绿(提交 92086027 四套件绿含 wiring_snapshot)——golden 未漂移=改判路径零触发实证;grant_segment :102-104 作废行块删净+流水零作废行(代码 diff 实证)。**缺漏本体**:〔封印改 V6〕尾缀全仓(game/+tools/)grep 零命中——卡原定载体=golden 重录,实测零漂移未重录后载体消失;卡 F9 只为 V11/V12 补了「报告+提交说明」载体豁免,V6 漏补同类豁免 |
|
||||
| R7 破封一击退役、词除名 | 通过 | feats.tres 删行(diff 实证,feat_id=breaker_strike 整块);effect_engine 词表删 dug_under_seal(diff 实证);effect_words_t1 新增出册防回潮断言+adventure_feats V7 注记(:722);grep dug_under_seal/breaker_strike 非测试面=0(审计独立 grep 实证)。注记:effect_words_t1 断言尾缀用卡1 家族「退役改 V7」而非「封印改 V7」——V7 载体在 adventure_feats 在位,家族混用不判缺 |
|
||||
| R8 封印格呈现三件套 | 通过(附注记) | `seal_mark_params_test.gd:_test_seal_on_revealed_visible`(:62)在位:seal_on 与揭示同真印记仍可见(新组合态);board_shot_probe 选择器换代(:145);ui_input_probe case④b 印记落位断言在位。**附注**:卡探针半句「身份字形可查」在 case④b 无显式断言载体——身份字形可观测面由 golden 三图(含字形像素,R12)+V1 身份查询断言+board_view 读 cell_identity 代码(diff 实证)合围,无旧断言被删,不算削弱。直查例外:`u._seal_layer` 直读随行申报(测试注记+卡 §8 R8 行+复核 F12)✓ |
|
||||
| R9 已封印格零动作 | 通过 | ui_input_probe case④c(:288-312 新增):真输入左/右键已封印格 action_requested 零发射+CURSOR_FORBIDDEN+封印禁入框+图例说明在册含「受理即揭示」;V9 尾缀命中 5 断言;判据出处 ux/battle.md 已封印格行(Interaction Map)实读吻合 |
|
||||
| R10 文案四件 | 通过 | hud_presenter_test 文案逐字换代(seal_present 新句+target_sealed 新句,diff 实测与 hud_presenter.gd 逐字一致);player_copy_sweep u4 图例断言换代(含零雷字守恒);ui_click_probe 图例行断言换代(:1218,V10 尾缀在位)。措辞按白名单 2 授权 |
|
||||
| R11 sim 策略对齐+MC 同批重锚 | 通过(载体=报告+提交,卡 F9 豁免在案) | auto_player._constraints 封印身份增强(标中计已知雷/标空剔除,读 board.cell_identity 公开面);level_autoplay 标雷误挖退役→错触直挖 NORMAL_MISDIG_P=0.10(白名单 5+用户裁③);新锚 `sim-data/runsum_iter56reanchor_81000_n50both_20261108.jsonl` 在盘 100 行(审计实证);sim-data/README 现行锚指针换代+改前锚迁历史节+59% 失实注记(diff 实证);三方对照读数与偏差 -1.08 记报告 §四+追认单 #5+提交 043c24c0;规模 50/档=2026-11-08 用户批准在案 |
|
||||
| R12 渲染基线换代 | 通过(载体=报告+提交,卡 F9 豁免在案) | golden 三图 windows 三件换代(diff stat 二进制变更实证);提交 91882776 记 board_shot 双帧取证 PASS+渲染闸三屏绿;用户预览图人审 2026-11-07 在案;mac 三件缺件记遗留(卡 T7 预案:渲染闸 SKIP 不判红)。渲染闸未由审计复跑(昂贵件,以提交读数+基线字节换代为凭) |
|
||||
|
||||
**卡2 削弱检查(逐处)**:diff 删除/改判行共 11 处——①seal_polarity 四情况「直挖受理/隐式退役/零兑付作废」→卡 §8 削弱① ✓(改判后正向断言钉新语义:target_sealed+判定照发);②minesweeper_rules preview 形态 B→卡 §8 削弱② ✓(改判「preview 封印格零外扩」);③hud_presenter/player_copy_sweep 文案逐字→卡 §8 削弱③ ✓;④settlement_wiring golden→卡 §8 削弱④,实测零漂移未重录(追认单 #9),零削弱 ✓;⑤adventure_feats 破封一击断言删→卡 §8 R7 行明示 ✓;⑥种子 42→43+表行 37→36/优秀 13→12 判值换代→申报外 §5.5 同生死(追认单 #7,主区基线 42 绿对照坐实)✓;⑦effect_words 词表断言换代→卡 §8 R7 ✓;⑧board_shot 选择器放宽(has_seal 单条件)→取证选择器非断言放宽,卡 §8 R8 申报 ✓;⑨ui_click_probe 行为②摘除+恢复现场死调用删+簿记调整→卡 §7/§8 R9+追认单 #8 ✓;⑩ui_input_probe case④b 判据出处注记换代、断言体保留 ✓;⑪smoke/critical-paths.md 第 4 条改写→卡 §5/T4 申报 ✓。**未发现申报外削弱**。
|
||||
|
||||
**卡2 直查例外(逐条)**:①seal_mark_params `u._seal_layer` 直读——随行申报 ✓(见 R8 行);②minesweeper_rules_test `_ae._phase=1` 直置与 `_ae._ap` 直读——测试 :34-35 注记「与既有单测直读 action_economy._ap 先例同款」在案;`_ae._ap` 有公开读数(ap)可用,直读属非必要但注记在案、只读断言面,不判缺;③`_rules._safe_remaining()` 私有读——旧版同款既有面;④`_rules.dig_range_bonus=99`/`seal_range_free=true`——公开属性,注记在案;⑤`_board.cell_identity`——公开方法(T1b 后),非例外;⑥cells_probe()/legend ENTRIES——探针公开取证面。
|
||||
|
||||
## 四、判据出处抽查(卡2 6 行+卡1 3 行,规格句实读对照)
|
||||
|
||||
| 行 | 锚 | 独立可写性判定 |
|
||||
|---|---|---|
|
||||
| V1 | 排雷玩法.md:52 | 锚句「封印被受理的那一刻……格下身份当场可见……受理当场零兑付、零事件」——kind/digit 断言与零 cell_revealed 均可独立写出 ✓ |
|
||||
| V2 | 排雷玩法.md:56 | 合法性表「挖|8 向相邻、未开、无封印|……已封印」+「拒绝原因独立可辨」——target_sealed+三态零变化可独立写出 ✓ |
|
||||
| V3 | 排雷玩法.md:139 | 「清图 = 全部安全格完成,完成 = 挖开或封印——封印可以完成清图」——两阶段断言可独立写出 ✓ |
|
||||
| V4 | 排雷玩法.md:167 | 批次语义序表「最先|能清图的挖或封——防止耗尽优先把清图高光结算成最差结局」——赢家断言可独立写出 ✓ |
|
||||
| V5 | 战斗结算.md:139 | 判定批兑付表「标中则兑正向……标空则记归因行+负向」——保留组预期可独立写出 ✓ |
|
||||
| V10 | ux/battle.md:284 | 拒绝细分与 toast 要求实读吻合;字句按白名单 2 授权润色,语义四件(受理即揭示/不可再挖开/随图存续/零动作)全部溯至排雷玩法 :52/:56 ✓ |
|
||||
| 卡1 R1/R3/R5 | 08-Alpha:154/战斗结算:87/:80 | 零逐行文字、日志零文案全字段、四类合法例外 reason——预期值均可自锚句独立写出,非实现镜像 ✓ |
|
||||
|
||||
抽查结论:未发现「预期值只在实现里有的」同义反复断言。R2 的期望计数从行型分布独立推导(非抄实现),形态更优。
|
||||
|
||||
## 五、最窄测试复跑读数(审计独立执行)
|
||||
|
||||
| 测试 | 覆盖 | 结果 |
|
||||
|---|---|---|
|
||||
| `res://tests/unit/core/minesweeper_rules_test.gd` | 卡2 V1-V4(经 settle_batch) | **exit 0**(all green,36 checks;V1-V4 断言全 PASS) |
|
||||
| `res://tests/unit/battle_settlement/reward_ineffective_reason_test.gd` | 卡1 R5 | **exit 0**(all green,12 checks;四类 reason 全命中) |
|
||||
| `res://tests/unit/presentation/battle_log_zero_text_test.gd` | 卡1 R1 | **exit 0**(该测试 _problems 非空才 quit(1),exit 0 即全绿) |
|
||||
|
||||
环境:Godot_v4.7.2-stable_win64_console.exe --headless,工作目录 `D:\code\g-plan2-iter56\game`。只跑单件,未跑全套。
|
||||
|
||||
## 六、缺漏汇总与整改义务
|
||||
|
||||
| # | 缺漏 | 级别 | 整改义务与去向 |
|
||||
|---|---|---|---|
|
||||
| 1 | 卡1 R1 点名函数 `_smoke_settle_zero_rows` 未落(断言内联 `_init`);game/tests/README.md:137 仍载旧名;实现报告 §三「落地一致」记载失实;改名未回表 | 记账级(测试实质完整:真实入口/尾缀/绑定面/复跑全过) | 回表改 capability 行函数名=写卡段通道(实现批禁写 README,无法合并前自行修);实现报告 §三 勘误=实现会话合并前可改(reports/ 面合法) |
|
||||
| 2 | 卡2 R6〔封印改 V6〕尾缀全仓无 grep 载体(golden 零漂移未重录,原定载体消失;F9 豁免只补了 V11/V12) | 载体级(实质由未改动绿 golden+grant_segment 删净承接) | 补一处载体注记(settlement_wiring_snapshot_test 或实现报告 R6 行明示载体改报告+提交说明)——随追认单或文档批处理 |
|
||||
| 3 | 观察项(不判缺漏):T4 提交说明称 V5「三函数」实落 2 处;effect_words_t1 尾缀家族用「退役改 V7」;ui_click_probe `_play_one_action` 残留一处不可达 return(:1390 附近,死代码,解析无碍——探针 exit 0 实证可跑);reward_ineffective_reason_test 断言消息未带 R5 尾缀(载体在 run_all 注册行);smoke/critical-paths.md 第 7 条「明细逐行呈现」残留旧口径(卡1 未申报面,建议列反哺点);sim-data/README.md「历史锚(只读不判)」节标题重复两处(:12/:17,编辑残留) | 轻微 | 随下批顺手清或文档批收口 |
|
||||
|
||||
## 七、结论
|
||||
|
||||
**通过**(附上表 2 项记账级缺漏——均不触验收实质:无申报外削弱、无同义反复判据、无真实入口绕过、无直查例外未申报;缺漏 1 的回表通道归写卡段、缺漏 2 归载体注记补登,均不构成合并阻断)。
|
||||
|
||||
依据:17 行对照表全量核对,14 行干净通过、2 行缺漏(R1卡1/R6卡2,实质面均由独立证据承接)、1 行附注(R8 探针半句由 golden+V1 合围);削弱检查逐处零申报外删改;直查例外逐条有申报或既有先例;判据出处 9 行抽查全部可独立写出;最窄测试 3 件复跑全绿(exit 0×3)。卡1 中档四件全做+复跑超额执行;卡2 高档五件全做。
|
||||
|
||||
审计人注:本报告为合并前独立审计(test-conventions §8.7);卡1 中档的远端 CI 现查读数代证义务在合回后由 `tools/ci_check.sh <合并提交>` 兑现,本报告复跑读数已超额覆盖该档复跑面。
|
||||
@@ -1,292 +0,0 @@
|
||||
# 需求卡片:第二 / 三关棋盘观感——亮度与对比度批(T1 定性人闸 · T2 按轴修法 · 验收三件套 · 文档面全走反哺点)
|
||||
|
||||
- 版本:**v1.4(2026-10-17 开工前预授权 U1〔用户于开工前一次性决断,防开发中反复打断〕——①Q2 甲/乙由「延裁·T1 出口现场裁」改**判据自动裁**:甲案候选样张读数达标即直接走甲不停机,仅当读数证伪「纹理太碎」假说时才呈报裁乙;②V2 定向目标带数值授权批内按 T1 实测读数自定并随定性报告呈报,T1 出口人闸只确认轴归因与修法方向;③详见 §10 Q2 条与开工门 U1 预授权条);v1.3(2026-10-17 文档同步闸 v3 口径修订,纯文档批〔分支 carddoc-20261017〕按用户六条裁定执行——①本批(代码实现批)禁写 `design/` 整目录与根规则文件,§5 同步面的同步义务一律执行为「列进 `reports/iter30-反哺点-<完成日>.md`(哪个文件哪一节、改成什么、依据),用户会话裁决后归文档批落文」;②产出物落位换代:实现报告/代拍板追认单/反哺点清单三份落 `reports/`,不再 `design/qa/`;③T5 末卡改「产出物落位卡」(三份 reports/ 文件写齐才算收口);④闸口径按域选档:重闸 = `tools/run_all_gates.sh` 按改动域选档(本批 → `--code`),卡内不再写死闸件名单与「全量档」类字样;⑤实机目检项写进 `reports/iter30-实现报告-<完成日>.md` 实机目检总清单,「登记 07」转反哺点;§10 裁决留痕原文不动);v1.2(2026-10-16 裁决留痕版:三卡待裁项按用户令定案——Q3 已裁甲·同批、Q2 延裁留痕并将裁点挂至 T1 出口呈报硬流程步骤、排期栏定实「已编入迭代 30」与三卡串行序位、§4B 跨卡依赖按已裁事实改实、全卡零悬空待裁点;v1.1 同日 grilling 审查修订见 §11;v1.0 同日成文)**
|
||||
- **指路订正(2026-10-20)**:徽章卡(迭代 30 卡①)已按 doc-conventions §11「吸收即死」退役,本卡对其三处指路句改为结论内联+提交号 `7ffd1dc0`,裁决内容零变更。
|
||||
- 来源:[06-待办清单](../design/gdd/06-待办清单.md)「第二 / 三关棋盘观感——亮度与对比度」小节(2026-10-13 用户裁定条)+ [playnote](../playnote.md) 用户试玩原始记录:「UI优化,第二第三关的棋盘看着太累了;不知道是因为亮度还是对比度的原因,看着非常费劲,非常不舒服」
|
||||
- 归属:**表现层美术修批**(06 在册条目直接写卡;两轴归属 = [HUD框架](../design/gdd/systems/表现与支撑/HUD框架.md)(UI 轴)+ [美术圣经](../design/art/art-bible.md)(素材轴),定性前两方共裁——沿用 06 条裁决)
|
||||
- 排期:**已编入迭代 30(2026-10-16 用户令编入,roadmap 行已在案;批内状态刷新列反哺点)**。同迭代三卡串行序位第 3:未开格类型徽章批卡(迭代 30 卡①,已入库合并 7ffd1dc0,卡片已退役)→[战斗一屏样张批卡](需求卡片-战斗一屏样张批-2026-10-16.md)→本卡(徽章→样张→观感)。**并行例外**:本卡 T1/T1b 采样与定性读数允许与前两卡并行穿插——依据=采样是只读动作(出帧/读数/样张均不触碰 golden 三张、样张主板、§5 同步面文档等汇聚文件),落码修改(T2 起)仍按上述序位串行。开工门 = U0,须用户 `/iter` 发令;且 T1 出口定性人闸未过之前禁止动码——该闸 = [06 本条](../design/gdd/06-待办清单.md)既有裁决硬步骤(「开工前先过『素材轴 / UI 轴』定性人闸」,2026-10-13 用户裁定;[08 git 提交史](../design/gdd/08-Alpha版本标准.md) v0.3 同款注),**不是待裁点**(v1.1 撤销原 Q1,见 §10)。
|
||||
- **立场前提(用户原话,本卡设计的第一约束)**:此条立项原因就是用户实机觉得现在的画面累眼、且对「纯程序化重产现状」明确不满——「如果还是用原有方式弄出来的东西,有没有可能还是我不满意的?」。本卡对此的正面回应 = ①第一步定性用**可量化的读数归因**(明度直方图 / 相邻格对比 / 高频能量 / WCAG 对),禁止凭感觉猜轴;②两条修法各自的产出物写清**相对现状新增什么**(§6 T2 两案效果上限表);③**诚实的效果声明**:观感是主观项,机检只能证伪(读数红 = 必有问题)不能证真(读数绿 ≠ 用户满意),**阻塞性人闸全部前置**(T1 定性闸 + 契约 4 方向闸),入库后实机目检按 2026-10-12 用户令口径**登记不阻塞**——目检项登记进 `reports/iter30-实现报告-<完成日>.md` 实机目检总清单(「入册 07」列反哺点;[AGENTS.md](../AGENTS.md) 红线「真人检测只登记不阻塞——禁以等目检为停工理由」口径不变),用户复判否决走 §7 V4 回补机制(行回待做 + 06 立残留条,落文按 v3 口径归文档批)。防「改一轮还是不满意」的机制 = **先出改前/改后并排对比读数样张给用户定性确认方向,方向过了人闸才落码**(🔴 契约 4)——方向若被否决,返工停在样张层,不烧落码与基线。
|
||||
|
||||
---
|
||||
|
||||
### 0. 前置依赖与既有裁决
|
||||
|
||||
| # | 前置 | 内容 |
|
||||
|---|---|---|
|
||||
| P1 | **定性人闸(06 条既有裁决——流程硬步骤,非待裁点)** | 06 原文(445 节内):「开工前须先定性(沿用既有裁决)……两轴修法完全不同,定性错了等于白改一轮」+ 状态行「开工前先过『素材轴 / UI 轴』定性人闸」(2026-10-13 用户裁定条;该要求最早载于 06「奇物呈现优化探讨备忘两孤儿点」(e),本条承接转正)。本卡 T1 即该闸承载,结论过用户确认才进 T2——v1.0 曾把此闸再列 Q1 待裁,v1.1 撤销(禁再问已裁项) |
|
||||
| P2 | **与「呈现层残余 <4.5:1 文字位」条的分工(06 条既有注记)** | 06:451 分工句原文:「本条管**棋盘区域整体的观感**(亮度/对比度/费劲感),是体感问题;『呈现层残余 <4.5:1 文字位』管**具体文字位的对比度读数不达标**(B 区站桩名行/敌顺位徽标/RAP 反馈行三处),是机检可判的硬指标。两条不同面,不互相替代,各自保留」;该文字位条已随迭代 26 T3 完成(06:443)。本卡管棋盘区域整体观感(体感问题),**禁吞并该条**(🔴 契约 2);T1 读数若发现新的文字位红点,另行登记,不并入本卡 |
|
||||
| P3 | **08 标准覆盖行** | [08-Alpha版本标准](../design/gdd/08-Alpha版本标准.md)「五 · 表现」表「棋盘观感(第二/三关亮度与对比度)」行(08:145)现为**待做**(事实源指向本 06 条);Alpha 完成判据 = 全部条目在役 ⇒ 本卡完成时该行 待做→在役 改写列反哺点(§6 T5;时机=本批入库,落文归文档批,目检复判否决的回补机制见 V4) |
|
||||
| P4 | **08 未决项关联(按名指路;v1.1 按实查改写)** | 08「七 · 未决项」现行表含「**素材升档重产进不进 Alpha**」行(2026-10-16 实查为该表第 6 行,另有「**立绘清晰度回退评估**」行——未决项表 2026-10-16 v1.6 重编号过,**行号不作指路依据,一律按名找**);「素材升档重产」在「五 · 表现」表现为**待裁**(08:154)。06「资产升档重产批」条现行状态注记 = 2026-10-04 用户令「暂不做、先忽略,重启=用户点名」+ 2026-10-06「优先级再降」+ 2026-10-06 方案二注记(原升档路线已被八敌逐键定档实质走完、剩余挂起项=提灯点亮解禁候选)。划界:该批面向**立绘/小人帧尺寸升档**,本卡素材轴乙案 = **L2/L3 棋盘瓦片色板/纹理方案重做**——对象、管线、闸面均不同面,**裁本卡乙案 ≠ 放开升档重产**,呈报时须带此划界(§6 T2 乙案行) |
|
||||
| P5 | **渲染闸与基线现状** | 棋盘三关 golden 基线冻结于 2026-09-30(`tools/golden_compare.py:11`),改瓦片/改常量**必然**破 Δ≤16/changed≤2% 容差 ⇒ 基线换代是本卡的确定义务而非例外处理(§7 V3) |
|
||||
|
||||
---
|
||||
|
||||
## 1. 目标与完成定义
|
||||
|
||||
**目标**:把 L2/L3 棋盘「看着太累」的观感问题**归因到轴**(素材轴 / UI 轴 / 两轴共因),按轴修复,并经用户实机复核确认体感改善。
|
||||
|
||||
**完成定义**(五件齐才算完成,缺一即该条在 06 保持待办):
|
||||
1. T1 定性报告交付:逐关三测面(棋盘瓦片区 / 舞台底与屏根 / 叠加层)读数表 + 归因结论(轴判定,引用具体数值);**T1 出口定性人闸过**(06 已裁硬步骤,P1);
|
||||
2. T2 修法按裁定轴别落码/落素材,既有样张口径闸全部保持绿(A6 梯度均值 ≥4.70、F6 立面双明度带 Δ≥18、格底明度档 §4.1、图底分离——见 §2.4;**注**:该组断言现行落点=样张主板(dungeon 拼板,`render_sample_sheet_v3.py:130-131`),L2/L3 分关实测属本批新建读数件(T1b),见 §11 攻击面 2);
|
||||
3. 验收三件套走完:机检读数达标 + 渲染闸 golden 基线显式重制并呈报换代面 + 用户实机目检轮**登记**(目检项登记进 `reports/iter30-实现报告-<完成日>.md` 实机目检总清单,「入册 07」列反哺点;2026-10-12 用户令=登记不阻塞入库,否决走 V4 回补);
|
||||
4. 08「五 · 表现」棋盘观感行 待做→在役 改写列反哺点(含 07 目检登记注;落文归文档批);
|
||||
5. §5 同步面每条在 `reports/iter30-反哺点-<完成日>.md` 有落点(06 对应条目状态更新条在内);权威文档与根规则文件零直改。
|
||||
|
||||
**效果不确定性的诚实声明**:观感是主观项。机检读数能证伪(超带 = 必有问题)不能证真(达标 ≠ 满意)。证真面由**前置人闸**承担(T1 定性闸 + 契约 4 方向样张闸——方向不过不落码);入库后的实机目检轮按 2026-10-12 用户令「真人检测只登记不阻塞」执行,用户复判若仍不满意 = V4 回补机制触发(08 行回待做 + 06 记残留、下批重开),不算本批未入库。
|
||||
|
||||
---
|
||||
|
||||
## 2. 现状事实(2026-10-16 实查;开工日自行复核行号)
|
||||
|
||||
### 2.1 关级与瓦片(素材轴现状)
|
||||
|
||||
| # | 事实 | 出处 |
|
||||
|---|---|---|
|
||||
| F1 | 三关板型与图类型:L2 12×12 underdark / L3 13×13 deep_underdark;**L1 行群主体 10×10 dungeon、但含 12×12 dungeon 行**(2026-10-16 逐行实查 `board_gen.tres`——level_index 1 段内有一行 12×12),故 T1 的 L1 参照位读数面须覆盖两种板型(词表 v1.1) | `game/data/tables/board_gen.tres` 各行;`game/data/schemas/board_gen_table.gd:13` |
|
||||
| F2 | 每关瓦片 = **墙 16 件 + 地面 5 变体,合计 21 件**(v1.0 误写「墙类 21 件」,v1.1 订正:16 唯一墙名单单点在 `TILE_WALL_NAMES` 常量数组,件名数=16;21 为总数)按 `terrain_%s_%s.png` / `terrain_floor_%s_%d.png` 格式装载;源 dungeon 套为 v9.3 定稿,underdark/deep_underdark 套由程序换色产出;另有**不参与换色的板面相关件**:`flag_seal.png`(封印旗,三关共用独立可选件) | `game/presentation/views/board_view.gd:80-89`;`tools/recolor_terrain_tiles.py` 头注;素材实盘 `game/assets/art/board/`(underdark/deep_underdark 各 21 件与 dungeon 套同构;素材不入 git,用户裁定) |
|
||||
| F3 | 换色方法 = 槽位家族重映射(wall/facade/floor/crater 四族),**亮度秩序逐像素保持**、确定性零随机、唯一色数与源一致;目标色表在脚本 `PALETTES` 内 | `tools/recolor_terrain_tiles.py:10-12`(方法注)+ `:40-60`(色表) |
|
||||
| F4 | 现行换色色表读值:underdark 地面 `G_BASE (62,66,80)`、crater 最深 `P_DEEP (9,10,15)`;deep_underdark 地面 `G_BASE (46,48,64)`、crater 最深 `P_DEEP (5,5,9)`——**冷蓝紫、低明度、crater 近纯黑**;对照 dungeon 源 `G_BASE (88,66,50)` 暖中明度 | 同上 `PALETTES` |
|
||||
| F5 | 色相域方向(机检在案):underdark ≈180°–260° 灰白蓝紫 / deep_underdark ≈200°–280° 蓝黑紫黑;断言「deep 墙顶明度恒暗于 underdark」 | `game/tests/unit/presentation/terrain_tile_sets_test.gd:61-64, :82`;方向权威 = art-bible §4.3 |
|
||||
| F6 | 图类型换皮四槽(`tile_closed`/`tile_open`/`wall_ambient`/`variant_tint`)与恒定不变槽(信息语义色全图型恒定、格底两档明度关系恒定);格底硬指标:未开墙顶 L≥0.30、已开底走世界底层档候选 L 0.08–0.14、饱和 ≤0.55、避 300°–345° 禁入带 | [art-bible](../design/art/art-bible.md) §4.3 / §4.1「对比硬指标」/ §4.2 紫赤条 |
|
||||
|
||||
### 2.2 UI 轴现状(舞台底与叠加层常量位点)
|
||||
|
||||
| # | 事实 | 出处 |
|
||||
|---|---|---|
|
||||
| F7 | 舞台底 `STAGE_BG #3E342A`(62,52,42)= B 区舞台面板暗底;屏根 `BG_ROOT #3A2E22`;暖亮档 `BG_BRIGHT #453723`(提暖提亮禁近黑配色总纲在册) | `game/presentation/views/ui_kit.gd:111-113, :121`;`battle_stage_view.gd:44-47` |
|
||||
| F8 | 视野迷雾叠加层:灯光区半径 `FOG_RADIUS 8`(基准值改动 = 非白名单须用户);**区外未开格 = 全黑不渲染(不透明纯黑盖全部叠层)**;区外已开格 = 记忆态灰显;雾轮廓 `UiKit.FOG_OUTLINE` | `board_view.gd:137, :817-822`;`board_cell_unit.gd:111-117, :252-256`;规格 = art-bible §6.5 + HUD框架「视野迷雾」节 |
|
||||
| F9 | 数字墨三态管线(v3.4 定案):双峰纹理板(underdark/deep_underdark 系)= 色牌垫底 `DIGIT_PLATE + 深墨 #33261B`;亮族判据 p90 ≥4.5:1 / 均值 ≥2.5:1 | `board_view.gd:987-989`;art-bible §4.1 数字墨条 |
|
||||
| F10 | 类型微光 v2 呈现**规格** = 内缘带状泛光 α170 / 带宽 cell÷8,亮度不压格底明度档(§2 微光例外);五组色带样张 v2 定稿。**v1.1 注**:类型微光游戏内**尚无独立实装**(呈现层仅接触带微光在跑;实施归同迭代 30 的未开格徽章批,见 §4A)——本卡 T1 的微光测面读数源=样张 v2 静态定稿图,实机渲染帧里没有该层 | art-bible §4.2「类型微光色带」条;HUD框架「未开格类型微光」节实装状态行(:130-142) |
|
||||
|
||||
### 2.3 L2/L3 差异面(同批与否的判据)
|
||||
|
||||
- 板型不同(12×12 vs 13×13)、色板不同(F4/F5 两套槽值,deep 系整体再暗一档)、格边长换算随板型变(06 在册「格边长三方取值不一致」条为已知偏差,本卡不动);数字墨模式两关同属双峰板色牌态(F9)。⇒ L2、L3 观感读数**必须分开设点**,修法同批——Q3 已裁甲·同批(2026-10-16 用户令,§10),两关槽值差异由 T1 分关读数(T1b)承载。
|
||||
|
||||
### 2.4 既有量化口径(样张 v3 与机检链,验收判据引用面)
|
||||
|
||||
| # | 口径 | 定值 | 出处 |
|
||||
|---|---|---|---|
|
||||
| C1 | **A6 观感密度:明度梯度均值**(相邻像素相对亮度差均值——高频细节能量;低频双峰由 A3 承载) | ≥4.70(v1 同口径实测 4.09 上调 15%) | `tools/render_sample_sheet_v3.py:26, :338, :1007-1022`(历史脚本注释含 v1 实测值)。**v1.1 核注**:该组断言(A3/A6/F6)现行作用面 = 样张主板(`terrain_*_dungeon` 拼板,脚本 `:130-131`)——L2/L3 瓦片改动**既不会触动这组闸、也测不到它们**;「分关实测」属本批新建读数件(T1b),非现成能力 |
|
||||
| C2 | **F6 立面双明度带** | Δ≥18(现行执法定值 `FACADE_MIN`) | 同上 `:339`、`:996` 消费点与 v3.5 冻结口径注(`:1154`) |
|
||||
| C3 | **A3 图底分离**(墙/地) | **现行执法 = v3.5 冻结定值 A3b Δ≥30**(方向稿实测 38);旧 Δ≥55 系色牌制地板 L0.036 时代校定,与格底分档带数学冲突已退役 | 同上 `:975-979`(退役注+现行 check)、`:1154`;`:23, :340` 之 55 为历史注释残迹 |
|
||||
| C4 | 格底明度档 | §4.1:世界底层档候选 L 0.08–0.14 / 墙顶 L≥0.30 / 饱和 ≤0.55(48 色上限与 RGB 三通道差 ≥8/255 双门在 §4.1 增量纪律在案;「待定现用」态释义同节) | art-bible §4.1 |
|
||||
| C5 | 渲染闸现行链 | `tools/render_gate.sh` 四段:shot_probe 七屏→`shot_checker.py` A–D+F 语义断言(B 文字对比 ≥4.5:1 / C 明度三档带 / D 文字禁压纹理 / F 文字在判据〔2026-10-15 补〕;E 焦点预算归人闸)→ fx/board 取证 → 棋盘三张 golden(差 ≤16、changed ≤2%)→ 菜单 golden;基线重制工具 `tools/golden_baseline_refresh.sh`(缺省模式=棋盘三张;`--menu`=菜单全屏;素材缺位拒跑;呈现批 agent 自行换代+提交说明强制写明触发原因——权限口径在其头注) | `render_gate.sh:8-25, :109-155`;`shot_checker.py:8-19`;`golden_baseline_refresh.sh:2-14` |
|
||||
| C6 | 三关棋盘抓帧承载(读数采样源) | `board_shot_probe` targets = L1_dungeon / L2_underdark / L3_deep_underdark,随 render_gate 周期跑;同关驱动确定性=种子 420000+关号 + novice 18 步 + 1.2s 动画完结等待(可复现)。**v1.1 边界注**:帧面 = 空视口上裸挂 BoardView(900×900)——棋盘瓦片区与迷雾遮罩层**在帧内**,**舞台底/屏根像素不在帧内**(battle_stage_view/BG_ROOT 未实例化);「舞台底/叠加层只在渲染帧里存在」系 v1.0 不准确表述,舞台底为常量平铺(UiKit 可读值)。且 render_gate 过程帧落 mktemp 即弃禁入 git——T1 用帧须自行留档于库外目录 | `game/smoke/board_shot_probe.gd:34, :38-66`;`render_gate.sh:22`(过程产物纪律) |
|
||||
|
||||
---
|
||||
|
||||
## 3. 设计契约(红线,违反 = L3 停机呈报)
|
||||
|
||||
🔴 **契约 1 · 零玩法逻辑变更**:只动呈现(瓦片素材/色表、舞台底与叠加层常量、样张脚本判据)。板生成、数字真值、迷雾判定逻辑、`FOG_RADIUS` 基准值(改动须用户,`board_view.gd:137` 注)零触碰。
|
||||
|
||||
🔴 **契约 2 · 禁吞并文字位条**:「呈现层残余 <4.5:1 文字位」是另一面(该条已随迭代 26 完成,本卡不复活、不并账);本卡发现的任何文字位新红点 = 新登记条目,另批处理。
|
||||
|
||||
🔴 **契约 3 · 色板纪律不破**:任何换色/重产色板须过 art-bible §4.1 增量纪律双门(48 色上限、与既有任一色 RGB 三通道差 ≥8/255)+ §4.2 语义检查与信息面禁入带 300°–345°;素材轴甲案并须保持 recolor 脚本的亮度秩序逐像素保持方法学(改了方法 = 换案,须重述本契约)。
|
||||
|
||||
🔴 **契约 4 · 样张先行、方向人闸后落码**:T2 任一修法落码前,必先出**改前/改后并排对比样张 + 读数表**给用户定性;用户未确认方向 = 停在样张层,禁先行改素材改常量。此条是「防改一轮还是不满意」的机制本体。**v1.2 注**:素材轴甲/乙裁决呈报件(§6 T1 呈报硬步骤)与本闸是同批产物——用户呈报现场裁甲后,裁甲案时本闸即已过关、不重复呈报;裁乙案时乙方向样张另走本闸。
|
||||
|
||||
🔴 **契约 5 · 机检 ≠ 观感,前置人闸承担方向证真**:读数达标只构成必要条件,机检不能证明满意——「证真」面由**前置**人闸承担(T1 定性闸〔06 已裁〕+ 契约 4 方向样张闸)。入库后的实机目检轮按 2026-10-12 用户令口径执行(AGENTS.md 红线「真人检测只登记不阻塞」):目检项登记进 `reports/iter30-实现报告-<完成日>.md` 实机目检总清单即完成义务、不卡入库(「入册 07」列反哺点);**禁把「机检全绿」写成「用户满意」的等价表述**——用户复判否决时按 V4 回补(08 行回待做 + 06 记残留、下批重开,落文按 v3 口径归文档批)。(v1.1 改写注:v1.0 本条「完成判定必须含用户实机目检轮、目检未过禁宣布在役」与 2026-10-12 用户令冲突,已对齐。)
|
||||
|
||||
🔴 **契约 6 · golden 基线换代显式化**:改图必破基线——重制走 `tools/golden_baseline_refresh.sh` 显式流程(缺省模式重制棋盘三张:board_shot_probe 抓帧→`golden_board_crop.py` 按 meta 坐标裁剪→覆盖 `game/tests/golden/` 三张;触及菜单态加跑 `--menu`),并逐屏呈报换代面(新旧基线并排,沿 render_gate S2 停机点口径);权限与义务=呈现批 agent 自行换代、**提交说明强制写明触发原因**(refresh 脚本头注 Q6 在册);前置=素材齐盘(脚本逐项守卫,缺位拒跑)。**禁先刷基线后改图**(基线是判据不是障碍物)。
|
||||
|
||||
---
|
||||
|
||||
## 4. 范围边界
|
||||
|
||||
**做**:L2/L3 棋盘区域观感的定性归因(T1)、按轴修复落码(T2)、同批策略(T3)、验收三件套与基线换代(T4)、产出物落位(T5)。
|
||||
|
||||
**不做**(明示去向):
|
||||
- 不动 L1 dungeon 套外观——除非 T1 读数显示问题为系统性共因(如迷雾档/舞台底全关同因,则 UI 轴修法天然全关生效,素材轴仍只动 L2/L3 色表);
|
||||
- 不动数字墨三态管线本身(`_digit_ink_mode` 选模逻辑维持),只动其消费的板面;改后三模式断言 `terrain_tile_sets_test` 必仍绿;
|
||||
- 不做「格边长三方取值不一致」条的处置(06 在册待扩板定档,另批);
|
||||
- 不做「立绘清晰度回退评估」/「素材升档重产」两未决项的代裁(本卡甲/乙裁点仅覆盖棋盘瓦片重产路线,且已挂至 T1 出口呈报硬流程步骤——裁决留痕见 §10,未决项不代裁、禁重开);
|
||||
- 不动未开格类型微光的呈现规格(§4.2 单通道纪律维持;**该层引擎尚未实装,实施归未开格徽章批——§4B**;T1 会把微光层列为读数额外测面〔证据级别=样张 v2 静态图,F10〕,T2 无「动参数」可言——若归因指向它,处置为联裁或走 art-bible §4.2 修订登记)。
|
||||
|
||||
---
|
||||
|
||||
## 4B. 跨卡依赖(同迭代 30 的两张同板面批——v1.1 新增;v1.2 按 2026-10-16 三卡已裁定案改实)
|
||||
|
||||
本卡与**未开格类型徽章批**(迭代 30 卡①,已入库合并 7ffd1dc0,卡片已退役)、**战斗一屏样张批**(`需求卡片-战斗一屏样张批-2026-10-16.md`)共用 L2/L3 板面,事实与已裁结果如下(只列事实与裁决留痕,他批未裁项仍不代裁):
|
||||
|
||||
| # | 交叠面 | 事实 | 本卡处置 |
|
||||
|---|---|---|---|
|
||||
| X1 | **徽章批微光层 × 本卡格底/墙顶瓦片改色,同一张未开格面** | 徽章批把五组类型微光实装进未开格(其 T0-② 五组明度档以 art-bible §4.1「未开格底 L≥0.30 不被压破」为约束基线);本卡素材轴改的正是 `tile_closed`(墙顶/未开底)明度——**两批改同一板面、先后互为约束**:本卡若抬/压墙顶档,徽章批五组明度档取值基线随之移动。art-bible §4.3 共同纪律已册:「三套候选色相均须与五组类型微光色带(§4.2)抽测互辨(格底与微光同在未开格面,邻近色相有吞没风险)」(:379) | 色板/微光互辨复测两批并档一次跑;本卡新色表呈报件须含「对五组微光色带吞没风险」逐项比对;**v1.2 定实(2026-10-16 用户令)**:三卡串行序位徽章→样张→观感(排期栏),golden 棋盘三张换代次数=先落者(徽章批)刷一次、本卡作为后落者再刷一次,不再挂呈报定序;徽章批微光**明度档 provisional 值**(其 Q2 已裁甲=本批定档)与本卡**格底明度档同基线**(art-bible §4.1 格底档 L 0.08–0.14、墙顶/未开格底 L≥0.30)——两卡改格底/叠光时须逐位比对 golden 防互踩,该约束已同步写入 §6 T2 修法约束 |
|
||||
| X2 | **战斗一屏样张批 Q1(素材输入级别)/Q3(渲染手段)与本卡乙案(瓦片重产)** | 样张批 Q1 丙案语义 =「样张反向给素材重产提规格」;样张批明示「本批不重产任何正式素材」——**重产的产出义务全在本卡(若裁乙)**,样张的规格输入义务也在本卡上游对齐;若样张批先以占位板面冻结,本卡乙案重产后整屏样张的板面内容过期 | **v1.2 定实(2026-10-16 用户令)**:样张批已裁 **Q1 丙**(样张反提素材规格)/**Q3 乙**(引擎实拍+shader)——本卡乙案(远程生图重产)**若**在 T1 出口呈报后被裁,瓦片规格**必须与样张卡已冻结的目标规格清单对齐,先后次序=样张规格先行、本卡乙案在后**;甲案 recolor 换色不触样张主板(dungeon 拼板,C1 核注),对样张批零连带、不受该次序约束 |
|
||||
| X3 | **徽章批「不动格底明度档、棋盘瓦片素材、图类型换皮四槽」红线(其 §4 不做条)** | 徽章批单向避撞本卡面;反向不成立——本卡改瓦片会动其微光绘制基面(其 F5:微光画在 CellUnit `_draw` 瓦片层上) | 本卡任何改图产物过 V5 时须同时跑徽章批既有断言面(若其已入库);串行序位已定实(徽章→样张→观感,排期栏)——徽章批先落,本卡 T1 报告按该序位复核 X1/X3 承接项,不再挂定序呈报 |
|
||||
|
||||
**结论笔**:两依赖均为**次序与规格联动**问题,不是范围冲突;2026-10-16 用户令已定案——串行序位徽章→样张→观感(排期栏)、Q3 已裁甲(同批)、Q2 甲/乙裁点挂 T1 出口呈报硬流程步骤(§6 T1/§10);本卡无悬空待裁点。
|
||||
|
||||
---
|
||||
|
||||
## 5. 关联文档同步面
|
||||
|
||||
> **v1.3 执行口径(2026-10-17 文档同步闸 v3)**:本批(代码实现批)**禁写 `design/` 整目录与根规则文件**,唯一可写目录 = `reports/`(`active.md` 唯一例外)。下表「同步义务」列一律执行为「列进 `reports/iter30-反哺点-<完成日>.md`:哪个文件哪一节、改成什么、依据,用户会话裁决后归文档批落文」——下表保留原关联点事实供写反哺点条目时对表。
|
||||
|
||||
| 文档 | 关联点 | 同步义务(v1.3 全部=反哺点列清单,另注者除外) |
|
||||
|---|---|---|
|
||||
| [06-待办清单](../design/gdd/06-待办清单.md) 本条 | 状态行改写(定性报告交付/完成注记);T1 发现的新红点若立新条则同批登记 | 反哺点 · 列清单待裁 |
|
||||
| [08-Alpha版本标准](../design/gdd/08-Alpha版本标准.md) 「五 · 表现」棋盘观感行 | 待做→在役(完成定义第 4 件;批入库时改写并顺带 07 目检登记注;用户复判否决走 V4 回补——行回待做+06 记残留) | 反哺点 · 完成时列清单 |
|
||||
| [art-bible](../design/art/art-bible.md) §4.1/§4.3(素材轴改色表值)或 §6.5/§7(UI 轴改常量方向) | 数值定值单点纪律:改值 = 走该节修订并登记(「待定现用」态),禁只改代码不改文档 | 反哺点 · 列清单待裁(条目写明改值与修订登记要求) |
|
||||
| [HUD框架](../design/gdd/systems/表现与支撑/HUD框架.md) 视野迷雾节 | 仅当 T2 裁到迷雾灰显档参数时 | 反哺点 · 条件列清单 |
|
||||
| [07-体验验证清单](../design/gdd/07-体验验证清单.md) | T4 登记实机目检条目(L1/L2/L3 并排看后问卷式回报) | 反哺点 · 列清单待裁(目检项另进 reports/ 实现报告目检总清单) |
|
||||
| [roadmap](../roadmap.md) | 迭代 30 行已编入(2026-10-16 用户令,行已在案);余留义务=估时刷新(T5) | 反哺点 · 列清单待裁 |
|
||||
| `active.md` 状态记录 | 本批条目进度刷新 | **本批更新(唯一例外 · 会话状态源)** |
|
||||
| `tools/recolor_terrain_tiles.py` / `game/tests/golden/` | 甲案色表修订 = 脚本内定值换代;golden 基线三张重制 | 工程面 · 随修法落地(可写) |
|
||||
| [playnote](../playnote.md) | 历史试玩记录不回改(沿革留档),本卡即其正式承接 | 无义务 |
|
||||
|
||||
---
|
||||
|
||||
## 6. 任务卡
|
||||
|
||||
> 估时按工作日口径;每卡出口自跑轻闸;批末重闸 = `tools/run_all_gates.sh` 按改动域选档(本批 → `--code`)全绿才合入(脚本即唯一闸清单,卡内不另列名单)。
|
||||
|
||||
### T1 定性步骤(人闸前置;含 T1b 新建采样件合计 ≈2–2.5d,**必先做,产出物 = 定性报告 + 对比样张**)
|
||||
|
||||
逐关(L1 参照位·注意含 10×10 与 12×12 两板型〔F1〕 / L2 / L3)三测面采样。**采样源按测面分治(v1.1 修正)**:
|
||||
- 测面一(棋盘瓦片区)与测面三(迷雾遮罩部分)= `board_shot_probe` 实机渲染帧(确定性可复现,C6;过程帧 render_gate 即弃——本批帧自行留档于库外目录,读数表进 `reports/iter30-实现报告-<完成日>.md`);**禁拿素材文件代替渲染帧**(迷雾遮罩/揭示态只在渲染帧里存在);
|
||||
- 测面二(舞台底与屏根)= **现有探针拿不到**(board_shot_probe 帧内无舞台底/屏根像素;shot_probe 战斗屏只到 L1 首战)⇒ 由 **T1b 新建采样件**补齐,见下;退而求其次可用 UiKit 常量×帧内实测值合成 WCAG 对(可算,但板缘对比带需几何语境,合成判据只能佐证不能实证);
|
||||
- 测面三中的类型微光贡献 = 读数源仅样张 v2 静态定稿图(引擎未实装,F10),T1 报告如实标注该测面的证据级别。
|
||||
|
||||
输出读数表:
|
||||
|
||||
| 测面 | 指标(全部数值化,禁裸形容词) |
|
||||
|---|---|
|
||||
| 棋盘瓦片区 | 整板明度直方图 p10/p50/p90;A6 同口径**明度梯度均值**(相邻格/相邻像素亮度差——高频能量);唯一色数与色域跨度 |
|
||||
| 舞台底与屏根 | `STAGE_BG`/`BG_ROOT` 对棋盘墙顶、米白装饰族的两两 **WCAG 对比对**;三档带序(shot_checker C 断言口径的层带思想,按帧实测复算——其现行取样面是 L1 战斗屏,不直接复用)实测值——**取样依赖 T1b 全框帧** |
|
||||
| 叠加层 | 迷雾**全黑档面积占比**(区外未开格 = 不透明纯黑)与记忆档灰显值;色牌占板面像素占比;微光带宽与泛光 α 的观感贡献(**证据级别=样张 v2 静态图,引擎未实装——F10**;若徽章批同迭代先行实装则可升级为帧内实测,见 §4B) |
|
||||
|
||||
**T1b 新建采样件(批内任务,≈0.5–1d;v1.1 补——v1.0 默认现成件够用,实查不成立)**:给测面二供帧、并承载 **L2/L3 分关读数**(直方图/A6 同口径梯度按关出值——样张 v3 断言现只跑主板,C1 核注)。落点取一(白名单 1 域内):① 扩 `board_shot_probe` 加全框模式(BoardView 挂进 battle_stage_view/屏根底之上出 L2/L3 全框帧,与既有三张 golden 取样帧互不污染);② 新建 L2/L3 战斗整屏取证探针(shot_probe 真实路径口径只达 L1 首战,扩关需确定性到达方案)。出口判据:帧面含棋盘+舞台底+屏根三层且逐跑可复现。
|
||||
|
||||
**归因判据(写死在报告模板里)**:
|
||||
- 素材轴信号 = L2/L3 板区读数与 L1 参照位在 明度带(对照 §4.1 档)/ 梯度均值 / 色域 上的偏离为主因(例:crater `P_DEEP (5,5,9)` 近纯黑叠加迷雾纯黑 ⇒ 大面积死黑;亮部墙顶跨度过大 ⇒ 闪烁感;「纹理太碎」假说在案最强证据 = 2026-10-14 美术审计结论条「第二 / 三关地面是近黑斑加亮筋的双峰纹理——数字无论亮墨还是垫牌,盯久了都会累。这不是再叠一层界面能救的」〔`reports/美术审计-cursor会话存档-2026-10-14.md` 结论区〕);
|
||||
- UI 轴信号 = 舞台底/叠加层贡献为主因(例:全黑面积占比 × 边缘对比产生的频闪感;`STAGE_BG` 对板缘对比带过宽);
|
||||
- 两轴共因 = 两类偏离同时显著(报告须给出各自量级占比,修法按主次分配工作量)。
|
||||
|
||||
出口 = 定性报告 + **改前基准样张**提交用户,过 **T1 出口定性人闸**——06 已裁硬步骤(P1:「开工前先过『素材轴 / UI 轴』定性人闸」),闸上同时冻结轴归因结论与 §7 V2 定向目标带数值;v1.0 曾误把该闸本身列为待裁点 Q1,v1.1 撤销(禁再问已裁项)。
|
||||
|
||||
**T1 出口素材轴甲/乙裁决呈报点(v1.2 新增硬流程步骤——Q2 延裁所挂裁点的具名呈报动作,裁决留痕见 §10)**:
|
||||
- **触发条件**:T1 归因结论产出即触发,随定性报告一并呈报(无论归因指向哪条轴,呈报不可省略);
|
||||
- **动作**:开工默认先做**甲案(recolor 换色)候选样张**——按甲案试算槽值出改前/改后并排样张,用 T1b 分关读数证伪「纹理太碎」假说(甲样张读数达标而用户方向仍否决 = 指向乙);
|
||||
- **产物与落点**:改前/改后并排样张 + 分关读数表(含甲案试算槽值清单)随定性报告呈报用户。**v1.4 预授权(2026-10-17 用户裁)**:甲案样张读数达标即按 §10 Q2 判据**自动走甲**、不停机等现场裁;仅当读数证伪「纹理太碎」假说时才呈报裁乙(呈报内容照旧:改前/改后并排样张+分关读数表)。结论按 §10 格式补记留痕后即成 T2 执行依据——裁点由该具名动作承载,全卡不留悬空待裁点。
|
||||
|
||||
### T2 修法(按轴分支;≈1.5–2.5d,落码前须过契约 4 对比样张人闸)
|
||||
|
||||
**素材轴——甲/乙裁点已由 2026-10-16 用户令定为「延至 T1 定性读数出具后再裁;开工默认先做甲案候选样张以证伪纹理说」(裁决留痕 §10;呈报硬流程步骤见 §6 T1 末)**:
|
||||
|
||||
| 案 | 产出物**相对现状新增什么** | 效果上限 | 成本与风险 |
|
||||
|---|---|---|---|
|
||||
| **甲 · recolor 程序换色重校** | 新色表(`PALETTES` 两族槽值修订:抬地面明度地板、压 crater 近黑与墙顶亮端跨度、家族间 Δ 重排)+ 改前/改后并排样张 + 基线换代。输入面(v1.1 实查):脚本只重映射 wall/facade/floor/crater 四族颜色的 `terrain_*_dungeon.png`→underdark/deep_underdark 两套,**L2/L3 板面瓦片 2×21 件全在其输入面内**;不在输入面的板面相关件=`flag_seal.png`(三关共用,若归因触它另行呈报) | 确定性、可复现、逐项可机检比对;**明度水平与色相可调,纹理高频结构逐像素保持**——若 T1 归因指向「亮度秩序/对比带」,本案直达;若指向「纹理本身太碎/太 busy」,本案调不动(方法学上限——脚本头注定死「亮度秩序逐像素保持」,高频结构不改;在案佐证=2026-10-14 美术审计「双峰纹理…不是再叠一层界面能救的」) | 低;零新素材;不破 §4.3 三关方向需在修订登记中说明偏转幅度 |
|
||||
| **乙 · 瓦片重产(远程生图管线)** | 按新规格重出 L2/L3 瓦片([remote-gen-prompts](../design/art/remote-gen-prompts.md) 对话操作单 + [art-prompts](../design/art/art-prompts.md) 词库),纹理本体可重设计 | 上限高——高频细节/材质/装饰密度均可换;代价 = 非确定性、过闸周期长、需重锁色板与重跑 `terrain_tile_sets_test`+样张全套 | 高;与 08「五 · 表现」**待裁**行「素材升档重产」及 06「资产升档重产批」条(按名指路,08 未决项表行号以实查为准)方向相邻不同面——该批=立绘/小人帧尺寸升档(2026-10-04 用户令暂不做、重启=用户点名),本卡=棋盘瓦片色板/纹理方案重做,**裁本案不等于放开升档**,呈报须带划界;样张批 Q1 已裁丙案(样张反提素材规格,2026-10-16 用户令)——本案规格以其已冻结目标规格清单为上游,次序=样张规格先行(§4B X2) |
|
||||
|
||||
**T2 修法约束(v1.2 新增,承载 §4B X1/X2 已裁事实)**:①本卡改格底明度档与徽章批叠微光同基线(art-bible §4.1 格底档 L 0.08–0.14)——落码后两卡逐位比对 golden 棋盘三张防互踩;②串行序位徽章→样张→观感(排期栏),本卡落码在两批落码之后,基线换代走契约 6 显式流程;③若 T1 出口裁乙,瓦片规格与样张卡已冻结目标规格清单对齐,次序=样张规格先行(§4B X2);裁甲则对样张批零连带。
|
||||
|
||||
**UI 轴——参数重校(现读常量与候选方向,全部走样张人闸后定值)**:
|
||||
- 迷雾全黑档:现值 = 不透明纯黑盖全部叠层(HUD框架/art-bible §6.5 三档信息阶梯的既有裁决,改它 = 改概念定义,须回 HUD框架 修订);候选方向 = 保持三档结构下调不透明度或对纯黑加主题 tint——**列为 T2 内二级裁点,报告须呈报不动定义的纯参数位有哪些先穷尽**;
|
||||
- 舞台底:`STAGE_BG #3E342A` 对板缘对比带宽——候选 = 向 `BG_BRIGHT #453723` 方向提一档或收窄棋盘外缘留白;
|
||||
- 色牌/微光占用:色牌垫底是 v3.4 定案(改板纹理高频结构才谈撤牌);**类型微光引擎未实装(F10),本卡对该层无可动参数——读数若显示微光规格(α170/带宽 cell÷8)贡献显著,处置=与未开格徽章批联裁实施参数或走 art-bible §4.2 修订登记,呈报为 L3 停机点(触既定裁决面),不在本卡单方改动**。
|
||||
|
||||
### T3 L2/L3 同批与否(≈0.25d 结论笔)
|
||||
|
||||
事实:两关色板两套槽值、板型 12×12 vs 13×13、数字墨同模式(§2.3)。两案成本对照(v1.1 中立化留档;v1.2 已裁,见下):**同批** = 一次基线换代、一轮目检登记,色表两套槽值各改各的、互不连带;**分两批** = golden 链换代两次、目检登记两轮,单批体量更小、L3 可在 L2 复判后单独叫停。**Q3 已裁(2026-10-16 用户令,§10):甲·同批**——理由=基线换代与目检各只走一轮;两关槽值差异由 T1 分关读数(T1b)承载,不需以拆批消化。
|
||||
|
||||
### T4 验收三件套与换代(≈1–1.5d)
|
||||
|
||||
1. 机检读数达标:见 §7 V2 判据表;
|
||||
2. **渲染闸基线换代**:跑 `tools/golden_baseline_refresh.sh`(缺省模式=棋盘三张;触及菜单态加 `--menu`)显式重制基线,呈报换代面与新旧读数差、提交说明写明触发原因(契约 6 实操步骤);
|
||||
3. 用户实机目检轮:目检项(玩法:L1/L2/L3 各开一局,并排回报「费劲感」相对改善)登记进 `reports/iter30-实现报告-<完成日>.md` 实机目检总清单——登记即完成本批义务、不阻塞入库(2026-10-12 用户令;「入册 07」列反哺点);用户复判否决走 V4 回补。方向级否决(样张层)已在契约 4 前置拦截,本步只剩终验。
|
||||
|
||||
### T5 产出物落位卡(≈0.5d,末卡——三份 reports/ 文件写齐才算收口)
|
||||
|
||||
轻闸全绿后、合并前,把本批三份 `reports/` 产出物写齐(权威文档与根规则文件零直改;`active.md` 状态记录照常更新):
|
||||
|
||||
1. `reports/iter30-实现报告-<完成日>.md`——各卡状态+**实机目检总清单**(T4-3 目检条目)+遗留读数义务+T1 定性报告读数表归档指引+变异验证记录表(新建断言/读数件的注入实验记录);
|
||||
2. `reports/iter30-代拍板追认单-<完成日>.md`——§9 白名单内代拍板逐项留痕(含 Q2 甲/乙现场裁决的留痕补记);
|
||||
3. `reports/iter30-反哺点-<完成日>.md`——§5 同步面每条一落点(哪个文件哪一节、改成什么、依据):06 本条状态行、08「五 · 表现」棋盘观感行(含 07 目检登记注与 V4 回补条款)、art-bible §4.1/§4.3 或 §6.5/§7 修订登记条(色值/常量若动)、HUD框架迷雾节(迷雾参数若动)、07 入册条、roadmap 估时刷新。
|
||||
|
||||
**原 §5 机械面直改义务零执行(v3 口径),落文归文档批。**
|
||||
|
||||
**估时合计 ≈ 5–7d**(v1.1 上调:T1 新增 T1b 采样件 0.5–1d;v1.0 为 4–6d——彼时漏了采样件,批内各卡加总实为 4.25–6.25d);**v1.2 估时不动**:Q2 延裁的甲案候选样张与契约 4/T2 样张同源产出,仅时点前移至 T1 出口呈报点,批内不新增总量;T1b 职责不变(全框帧+分关读数与甲/乙裁决无涉),不因本批裁决再调;天然切分点:**T1 末**(定性报告+甲/乙裁决呈报即交付物,人闸天然停点)、**T2+T3 末**(修法落地)。
|
||||
|
||||
---
|
||||
|
||||
## 7. 验证闸(逐需求点验收清单)
|
||||
|
||||
| # | 需求点 | 测什么 | 判据 |
|
||||
|---|---|---|---|
|
||||
| V1 | T1 定性报告 | 读数表覆盖 3 关 × 3 测面 × 各指标(§6 T1 表全列,测面二经 T1b 全框帧);L1 参照位在场(含两板型,F1);归因结论引用数值;**v1.2 增**:甲/乙裁决呈报件(甲案候选样张+分关读数表)随报告同出、用户当场裁决记录在案(§6 T1 呈报硬步骤) | 报告模板齐件 + 用户过闸记录在案(**T1 出口定性人闸=06 已裁硬步骤,P1**;**v1.4 预授权:人闸只确认轴归因与修法方向,V2 定向目标带数值由批内按 T1 实测读数自定并随定性报告呈报,禁拍脑袋现编**)+ 裁决留痕补记 §10 |
|
||||
| V2 | 修法后机检达标 | **既有口径不破坏**:样张主板断言 A6 ≥4.70 / F6 Δ≥18 / A3b Δ≥30 / 格底明度档(已开 L 0.08–0.14 / 墙顶 ≥0.30 / 饱和 ≤0.55)保持绿(v1.1 注:该组现行只跑 dungeon 拼板主板,对 L2/L3 属「不动即可」约束而非覆盖,C1 核注);**L2/L3 分关实测 = T1b 新建读数件出值**;shot_checker A–D+F 零新增红;`terrain_tile_sets_test`/`ui_contrast_probe` 全绿。**定向判据**(针对「累眼」的归因侧):若 T1 判「死黑面积」→ 全黑档面积占比与明度直方图 p10 改善入目标带;若判「对比带过宽」→ 墙顶/地面 Δ 与板/舞台底对值入 T1 定标带——目标带数值由 T1 报告给出、**T1 出口定性人闸冻结**,禁拍脑袋现编。**目标带自设的合法性注(v1.1)**:art-bible §4.1「待定现用」态只管圣经在册数值(现行即执法、调整=修订登记,:207 释义);本卡自设目标带**首先只是批次验收判据**,过闸即合法生效于本批;若某带值要长期执法,须写入 art-bible 相应节修订登记转「待定现用」态,禁以批次判据身份直接成为执法值 | 读数表(改前/改后并排)进 `reports/iter30-实现报告-<完成日>.md`;**v1.4 预授权:目标带数值由批内按 T1 实测读数自定、随定性报告呈报即生效**(原「人闸冻结目标带」改为「人闸确认方向与量级」,数值仍禁拍脑袋现编) |
|
||||
| V3 | 渲染闸换代 | 先跑 `render_gate.sh` 见棋盘 golden 段红(确认破的是预期面)→ 跑 `golden_baseline_refresh.sh`(缺省=棋盘三张,菜单态触及加 `--menu`;素材齐盘前置)→ 复跑 `render_gate.sh` 全绿;三张新旧基线并排呈报,changed 面 = 预期面,零超预期漂移 | 闸日志 + 呈报件;提交说明含触发原因(契约 6) |
|
||||
| V4 | 用户实机目检 | 目检项登记(实现报告目检总清单;「入册 07」列反哺点)+ 用户回报「费劲感」相对改善且 L1 无退化——**登记不阻塞入库(2026-10-12 用户令)**;用户复判否决 = 回补机制触发:08 行回待做、06 本条记残留重开(落文按 v3 口径经反哺点归文档批)、返工起点=T1/T2 重议(不回滚已入库码面,按新条处置) | 主观判据的唯一权威=用户回报;入库前方向由契约 4 样张闸把关 |
|
||||
| V5 | 邻接零回归 | 冒烟全套 + 单元 + 探针链零新增红(呈现面触碰加跑 ui_contrast);同迭代徽章批断言面零回归(§4B X3) | 重闸 = `tools/run_all_gates.sh --code`(脚本即唯一闸清单) |
|
||||
| V6 | 反哺点清单 | §5 所列各条(08 行改写要求+目检登记注、06 状态刷新、art-bible 修订登记〔色值若动〕、HUD框架〔迷雾参数若动〕、07 入册、roadmap 估时)在 `reports/iter30-反哺点-<完成日>.md` 逐条有落点(文件/节/改成什么/依据) | 件核:§5 反哺点行数=清单条数 |
|
||||
|
||||
**闸口径**:机检(V2/V3/V5)自动判;V1 = 人闸停点(T1 出口定性闸,06 已裁);V4 = 登记后回补机制(非停点,2026-10-12 用户令);契约 5——机检绿 ≠ 用户满意,禁作等价表述写入 06/08。
|
||||
|
||||
---
|
||||
|
||||
## 8. 异常分级
|
||||
|
||||
- **L1(自救)**:采样脚本参数笔误、读数表排版缺件、文档行号漂移——立红即修。
|
||||
- **L2(记录继续)**:色表具体槽值、候选样张的构图取舍、07 目检条目的问法措辞——批内消化并登记。
|
||||
- **L3(停机呈报)**:①T1 读数显示 L1 同病(范围外溢,重划批次);②归因指向三态墨管线/迷雾概念定义本体(触既有裁决面);③用户否决对比样张方向两次以上(说明读数口径与体感脱节,须重议 T1 指标本身);④golden 重制后 changed 面超出预期(隐性回归);⑤色板增量纪律双门过不了且无合并方案;⑥跨卡同板面次序破裂——与徽章批/样张批的 §4B 联动被裁决成互相破坏已冻结断言面的顺序(§4B 呈报件被否即停,禁单方推进)。
|
||||
|
||||
---
|
||||
|
||||
## 9. 代拍板白名单(超清单必呈报)
|
||||
|
||||
1. 采样读数脚本的实现落点(新工具件 vs 扩 `shot_checker.py`,禁动其现有 A–D+F 断言语义)。**v1.1 注**:T1b 全框帧件(扩 board_shot_probe 或新建 L2/L3 整屏探针)即落在本条授权域内。
|
||||
2. 明度直方图/梯度均值在「整板」与「灯光区内」两口径的取舍(以 T1 报告说明为准)。
|
||||
3. 甲案色表的具体槽值设计(参数域内自由,出域即 L3)。
|
||||
4. 对比样张的排版形式(并排同屏 vs 逐关两帧)。
|
||||
5. 目检轮的注册话术与回报表格式(07 口径内)。
|
||||
6. 基线重制的执行时机(T2 出口 vs T4 出口,取一)。
|
||||
7. 提交切分与 worktree 分支命名(走既有纪律)。
|
||||
|
||||
---
|
||||
|
||||
## 10. 裁决留痕(v1.2 换代:原 Q1 撤销结论保留——已裁项禁再问;Q3 已裁甲·同批;Q2 延裁留痕;全卡零悬空待裁点)
|
||||
|
||||
**统一来源(逐条留痕均引此令)**:「2026-10-16 用户令:三卡全部待裁项按推荐方案裁决(用户将裁权授出,由主线会话代拍板留痕)」。以下 Q2/Q3 各行引该令留痕;两案选项原文照录,供后续复看。
|
||||
|
||||
**已裁移除项(原 Q1「定性报告要不要用户过目才进 T2」)——撤销结论不动(2026-10-16 用户令未触及,维持 grilling 结论)**:06 本条条内已明文裁决——「开工前须先定性(沿用既有裁决)……**开工前先过『素材轴 / UI 轴』定性人闸**」(06:449/:453,2026-10-13 用户裁定条;08 的 git 提交史同款注「P2 棋盘观感标『Alpha 阶段需完成 · 开工前过素材轴/UI 轴定性人闸』」)。「要不要过闸」不成立为问句,本卡处置 = 落为 T1 出口**流程硬步骤**(P1/V1),闸上同时冻结轴归因与 V2 目标带数值——**既裁人闸,不占裁点**。
|
||||
|
||||
### Q2 · 素材轴修法走哪案:程序换色重校(甲)还是瓦片重产(乙)?——**延裁留痕**
|
||||
|
||||
- **裁决(2026-10-16 用户令,来源句见本节顶)**:「待 T1 定性读数出来后再裁甲/乙;开工默认先做甲案(recolor 换色)候选样张以证伪纹理说」。
|
||||
- **v1.4 预授权(2026-10-17 用户裁):延裁改判据自动裁,不再停机等现场裁**——甲案候选样张读数达标(进入 §7 V2 定向目标带)→ **直接走甲**;仅当读数**证伪**「纹理太碎」假说(甲样张读数不达标、方向仍不成立)时才呈报裁乙。乙案分支的代价与划界(P4/§6 乙案行:本卡重产 ≠ 放开升档、规格与样张卡已冻结目标规格清单对齐)全部不变。
|
||||
- **延裁≠回避**:裁点挂到 T1 出口的**具名呈报动作**——硬流程步骤(触发条件/动作/产物)已成文于 §6 T1「素材轴甲/乙裁决呈报点」:产物=改前/改后并排样张+分关读数表,呈报后**用户当场裁**。本节不留悬空 Q。
|
||||
- **判据(原文照录)**:判据 = T1 归因指向:亮度秩序/对比带问题 → 甲可直达;纹理本身太碎太 busy → 甲调不动(recolor 头注定死「亮度秩序逐像素保持」,方法学上限;碎纹理假说在案证据 = 2026-10-14 美术审计双峰纹理结论条),须乙。乙与 08/06「素材升档重产」的关系已划界(P4/§6 乙案行):本卡重产 ≠ 放开升档,裁乙不重开该未决项。
|
||||
- **选项原文(保留)**:甲=recolor 换色重校(确定性、可复现、逐项可机检比对、零新素材;效果上限 = 参数域内明度/色相重排);乙=远程生图重产(可重设计纹理与高频细节,上限高;周期长、非确定性、全套闸重跑;若裁,规格与样张卡已冻结目标规格清单对齐、样张规格先行——§4B X2)。
|
||||
- **换向处置**:呈报点甲样张被当场否决→裁乙,属裁决规则本身(即「证伪纹理说」动作的出口分岔),不计入 §8 L3③「否决两次以上重议 T1 指标」计数;裁乙即为批次正式进入 T2 乙案行执行。
|
||||
|
||||
### Q3 · L2 与 L3 同批修还是分两批?——**已裁·甲(同批)**
|
||||
|
||||
- **裁决(2026-10-16 用户令,来源句见本节顶)**:**甲·同批**。理由 = 基线换代与目检登记各只走一轮;两关槽值差异(两套色板槽值、12×12 vs 13×13)由 T1 分关读数(§2.3 分关设点 / T1b)承载,无需拆批消化。
|
||||
- **事实(原文保留)**:两关色板两套槽值、板型 12×12 vs 13×13、数字墨同属双峰板色牌态;06 以单条覆盖两关。
|
||||
- **选项原文(保留)**:甲=同批(一次基线换代、一轮目检登记,色表各改各的);乙=分两批先 L2 后 L3(单批更小、L3 可在 L2 复判后单独叫停;基线换代两次、目检登记两轮)。
|
||||
|
||||
**开工门(v1.2 定实)**:Q3 已裁甲·同批;Q2 裁点由 T1 出口呈报硬流程步骤承载(§6 T1)——开工门 = U0,用户 `/iter` 发令即开(已编入迭代 30,2026-10-16 用户令,排期栏);原「Q2/Q3 裁决落」前置表述不再成立。本卡全卡无悬空待裁点(§10 之外各处 Q 指涉均已改为裁决留痕/流程步骤引用)。
|
||||
|
||||
**U1 预授权(2026-10-17 用户于开工前一次性决断,防开发中反复打断)**:
|
||||
1. **Q2 判据自动裁**——甲案候选样张读数达标即走甲,不停机等现场裁;仅读数证伪「纹理太碎」才呈报裁乙(§10 Q2、§6 T1 出口呈报点)。
|
||||
2. **V2 定向目标带授权批内自定**——按 T1 实测读数定并随定性报告呈报;T1 出口定性人闸(06 已裁硬步骤,不可跳过)只确认轴归因与修法方向。
|
||||
3. 其余 L3 停机点维持不变:触既有裁决面类(L1 同病外溢/迷雾概念定义本体/方向被否决两次以上/golden changed 超预期/色板双门/跨卡次序破裂)一律停机呈报。三卡串行序位不变(徽章→样张→观感),本卡位第 3。
|
||||
|
||||
---
|
||||
|
||||
## 11. grilling 审查记录(v1.0→v1.1,2026-10-16 对抗性审查;逐攻击面:结论/证据/处置)
|
||||
|
||||
| # | 攻击面 | 结论 | 证据(2026-10-16 实查) | v1.1 处置 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | 工具实存性 | `board_shot_probe` **实存非臆名**(三关 targets 名/行号 :34 全对,且自带确定性驱动可复现);render_gate/golden_compare/shot_checker 能力与 C5 描述相符。**翻案**:board_shot_probe 帧 = 空视口裸挂 BoardView,**不含舞台底/屏根像素**(探针只实例化 BoardView,battle_stage_view/BG_ROOT 未挂载);shot_probe 战斗屏真实路径只达 **L1 首战**(其头注商店房不纳屏段自证)⇒ T1「舞台底与屏根」测面与「L2/L3 分关实测」均**无现成采样件**,v1.0「采样源=board_shot_probe 渲染帧」对该测面不成立 | `game/smoke/board_shot_probe.gd:34, :55-61`;`game/smoke/shot_probe.gd:12-14, :159-164`;`tools/render_gate.sh:9, :55-68, :95-107` | 新增 **T1b 新建采样件任务**(≈0.5–1d,白名单 1 域内);T1 估时上调、合计 4–6d→**5–7d**;C6 加帧面边界注 + 过程帧即弃纪律注 |
|
||||
| 2 | 量化判据出处 | A6 ≥4.70(`:26/:338/:1021-1022`,v1 4.09×1.15)、F6 Δ≥18(`:339/:996`)、格底档 L 0.08–0.14/墙顶 ≥0.30/饱和 ≤0.55(art-bible :194/:205/:225-227)、48 色+三通道差 ≥8/255(art-bible :207)**全部实值相符**。**翻案两件**:①A3 现行执法 = **v3.5 冻结定值 Δ≥30**(实测 38),Δ≥55 已数学冲突退役(`:975-979`),v1.0 C3「开工时以当期为准复核」含糊化——已写死;②样张 v3 断言(A3/A6/F6)只跑 **dungeon 拼板主板**(`:130-131`),S3 underdark 仅为 HSV 示意不参断言——「分关实测」非现成能力。自设目标带合法性:「待定现用」态释义(:207)只覆盖**圣经在册数值**的执法态,不自动覆盖批次自设判据——二者不冲突但须写明边界 | 如上各行号 | C1–C3 加核注重写;V2 增「批次判据身份≠执法值,转执法须 art-bible 修订登记」条款;T1b 承载分关读数 |
|
||||
| 3 | 「重产≠放开升档」划界 | 划界**成立但引据须换代**:08 未决项表 2026-10-16 v1.6 已重编号(八项减七项)——行号指路不可靠,按名「素材升档重产进不进 Alpha」「立绘清晰度回退评估」现行确在第 6/7 行(实查);06「资产升档重产批」现行状态 = 2026-10-04 令暂不做 + 2026-10-06 优先级再降 + **2026-10-06 方案二注记:原 64/96/128 升档路线已被八敌逐键定档实质走完,剩余挂起=提灯点亮解禁候选**——v1.0 P4「该条方向=帧尺寸升档」表述滞后 | 08:154, :209-210, v1.6 行(:226);06 升档批条状态行全文 | P4 重写(按名指路+行号注明以实查为准+方案二注记现状);T2 乙案行同改 |
|
||||
| 4 | recolor 能力边界 | 头注方法=仅对 `terrain_*_dungeon.png` 按 wall/facade/floor/crater 四族槽重映射、输出 underdark/deep_underdark 两套;实盘 board/ 目录两套各 21 件(**墙 16+地 5**)与脚本输入面完全对齐,`flag_seal.png` 不在输入面。v1.0 F2「墙类 21 件」**件数错**(21 为总数,16 唯一墙名单单点 `TILE_WALL_NAMES`)。「纹理太碎调不动」有实证:recolor 头注定死亮度秩序逐像素保持(方法学上限)+ 2026-10-14 美术审计结论区「第二/三关地面=近黑斑加亮筋双峰纹理,盯久了累,不是再叠一层界面能救的」(该审计 md 在盘;同日另存 2026-10-06 旧审计 HTML,其棋盘相关结论未涉 L2L3 瓦片碎度) | `tools/recolor_terrain_tiles.py:1-12`;`game/presentation/views/board_view.gd:81-88`(16 件名数组+头注「16 唯一墙瓦片名单」);`reports/美术审计-cursor会话存档-2026-10-14.md` 结论区;Glob `game/assets/art/board/` 两套件名清点 | F2 订正件数+flag_seal 例外注;甲案行写明输入面全覆盖;T1 归因判据与 Q2 引审计实证 |
|
||||
| 5 | 文字位条分工句 | 06:451 原文在册:「两条不同面,不互相替代,各自保留」;三处文字位=站桩名行/敌顺位徽标/RAP 反馈行,06:443 已随迭代 26 T3 完成——v1.0 P2 语义与原文一致 | 06:451, :437-443 | P2 补原文引述 |
|
||||
| 6 | V 条判具 | V2=样张 v3(主板)+T1b 分关读数+shot_checker A–D**+F**(v1.0 漏 F 判据,2026-10-15 已入闸)+`terrain_tile_sets_test`/`ui_contrast_probe`(两探针实存);V3=`golden_baseline_refresh.sh` **实存**且用法查明:缺省模式=棋盘三张(probe 抓帧→crop→覆盖 `game/tests/golden/`),`--menu`=菜单全屏,素材缺位拒跑,呈现批 agent 自换代+提交说明强制写触发原因(其头注 Q5/Q6/S3 在册) | `tools/golden_baseline_refresh.sh:2-14, :52-76`;`tools/shot_checker.py:8-19` | C5/契约 6/T4/V2/V3 补齐实操步骤与 F 断言 |
|
||||
| 7 | Q1/Q3 已裁检索 | **Q1 属已裁项**:06:449 条内明文「开工前须先定性(沿用既有裁决)」+ 状态行「开工前先过定性人闸」(2026-10-13 用户裁定)+ 08 的 git 提交史同款注——v1.0 一边在 P1 引该裁决、一边把同一闸列为 Q1 待裁,自相矛盾,触用户红线。Q3(同批与否)与 Q2(甲/乙)全库检索**无既裁**(06 单条覆盖两关但未裁批次数;playnote 无;git log 无)——保留为待裁 | 06:445-453;08:220(v0.3);playnote.md:5;git log 2026-10 检索 | Q1 从 §10 删除、改 P1/T1 出口/V1 流程硬步骤引用(§10 载明移除理由);Q2/Q3 保留 |
|
||||
| 8 | 中立性 | v1.0 四处「推荐」:Q1(已裁项附裁决,撤销后消失)、T1 出口句(撤销)、T3「推荐=同批」与 §10 Q3「推荐 甲」(**无既裁依据→中立化**)、Q2 立场句「开工默认先做甲案候选样张」(改写为白名单内样张层探针动作,非路线裁决) | 全文 grep 推荐=0 残留(仅剩「已删字样」自述与列名注) | 列头改「卡片立场(不代裁)」;§10/§6 T3 中立化 |
|
||||
| 9 | 跨卡依赖 | 两卡同抢 L2/L3 板面:徽章批(类型微光实装者,其 T0-② 五组明度档以未开格底 L≥0.30 为基线——本卡改的正是该基线;art-bible :379 已册「格底与微光同在未开格面,邻近色相有吞没风险」互辨复测义务;其 §4「不动格底/瓦片/四槽」系单向避撞);样张批(Q1 丙案语义=样张反提素材规格、Q3 路线选型——本卡乙案重产与其冻结次序互锁) | `徽章卡(迭代 30 卡①,合并 7ffd1dc0,卡片已退役):13/82/109`;`需求卡片-战斗一屏样张批:33/59/70-71/168/170`;art-bible:379 | 新增 **§4B 跨卡依赖**(X1/X2/X3 三行+结论笔:次序与规格联动问题,不新增裁点,随 Q2/Q3 呈报交用户定序);§8 L3 增⑥跨卡次序破裂停机型 |
|
||||
| 10 | 外加翻案(非清单内,敌意自查所得) | **契约 5/完成定义 3/V4/T5「目检未过禁宣布完成/在役」与 2026-10-12 用户令红线冲突**:AGENTS.md「真人检测只登记不阻塞——禁以等目检为停工理由」(入库先例:迭代 25/26/28 均入库翻行、07 目检留残,git 提交 d337c9e5 立规)。另:F1「L1 10×10」不全——`board_gen.tres` level_index 1 段含一行 **12×12 dungeon**;F10/C6:类型微光引擎未实装(徽章批 F2 引 HUD框架实装状态行佐证),v1.0 把它当实机可测层不成立 | AGENTS.md:68;git log d337c9e5;roadmap 迭代 25/28 行「残留人闸=目检」先例;`game/data/tables/board_gen.tres` 行段实查 | 契约 5 重写(阻塞闸全前置:T1 定性闸+契约 4;V4 改登记不阻塞+回补机制:否决→08 行回待做+06 记残留重开);F1 补两板型注;F10/T1 微光测面降为样张 v2 证据级别并注升级路径 |
|
||||
|
||||
**词面合规自查**:v1.1 全部新增/改写文本已按仓库现行用语规范禁词表逐词 grep 复扫,命中 0(他文档引文原貌除外);本次修订同时把卡片里 v1.0 残留的两处旧措辞换代为规范词。**v1.2 增补**:本次裁决留痕新增/改写文本同口径 grep 复扫,禁词命中 0。**v1.2 留档注**:下表 §11 中「Q2/Q3 保留待裁」「随 Q2/Q3 呈报交用户定序」「无既裁→中立化」均为 v1.1 时点的审查动作实录,不作现行状态读——2026-10-16 用户令已定案(Q3=甲·同批;Q2=延裁挂 T1 出口呈报硬步骤),现行裁决状态一律以 §10 为准。
|
||||
@@ -0,0 +1,484 @@
|
||||
# 需求卡片:棋盘瓦片与立体表现重做批
|
||||
|
||||
> 来源:`待办清单.md`「棋盘瓦片与立体表现重做」(2026-11-07 登记)。
|
||||
> **设计事实源(唯一事实源)**:`design/art/art-bible.md` v3.51 §1.4/§3.2/§4.1「三关棋盘环境八色」/§6.3/§7/§8.2+`design/ux/battle.md`(Last Updated 2026-11-07)「Layout Zones」D 区行/「D 区布局与棋盘画法预览」/「封印格呈现预览」+`design/gdd/systems/表现与支撑/HUD框架.md`(2026-11-07)D 区行与字号下限+`game/tests/golden/README.md`「越格口径」。
|
||||
> **验收档:中**(呈现与交互几何改动,后果玩家可见但不损持久状态;用户 U0 可改判)。
|
||||
> **预计**:9.5 个工作日(区间 9–10;T0 0.5/T1 1.5/T2 0.5/T3 2.0/T4 1.5/T5 1.5/T6 0.5/T7 1.0/T8 0.5)。
|
||||
> **卡片状态**:复核记录见 §16;第一轮 19 条、第二轮 23 条、第三轮 4 条、第四轮 5 条、第五轮 1 条、第六轮(合并整合)6 条均已处置,第六轮定向复核通过。
|
||||
|
||||
---
|
||||
|
||||
## 1. 目标与完成定义
|
||||
|
||||
把棋盘从「逐格 32×32 墙/地瓦片+格内立面」换成**合并岩体+连续地面**的 2.5D 画法:连通未开格(四邻)共享一块抬升岩顶与连续南/东崖面,北/西受光,南/东投影;数字脱离格面,变成**浮空数字+双色引导线+格面小阴影圆**,数字与引导线永远最顶、阴影圆在小人之下;封印按迭代56已闭合的「受理即揭示」呈现——印记居已揭示地面格心、身份字形垫色牌叠于法阵之上、不参与浮空层,承载面取本关受光棱色封印石以保 ≥4.5:1 对比;D 区顶部 AP 条整条撤掉,AP 放左栏、RAP/图例/弃图刷新放右栏,棋盘占 D 区全高并在上方预留 44px 给顶行浮空数字越出棋盘;棋盘底常驻操作提示条退役;小人与南侧岩体按脚底 y 排序遮挡;旧 `terrain_*` 63 件与普通数字底牌路径退役(封印格身份色牌保留);三关色板按已过审样张冻结。
|
||||
|
||||
**完成定义**(全部满足才算完):
|
||||
|
||||
1. 1280×800 基座档:12×12 格边 38px、14×14 格边 32px;D 区 1036×548;左/右栏各 200px;棋盘 12×12 外框 478×478、**屏幕坐标**原点 (523,296)、board_area 局部原点 (279,44);14×14 外框 474×474、屏幕原点 (525,296)、局部原点 (281,44)。
|
||||
2. 顶行浮空数字视觉顶 y=258(含 2px 描边+1px 浮空投影),距 D 区上缘 6px;数字、引导线、阴影圆全部在 D 区内,无裁切。
|
||||
3. 岩体投影:LIFT=round(格边×0.435)、ESHIFT=round(格边×0.109);四邻连通合并;相邻岩顶搭接 2px;南崖高 LIFT、宽 格边+ESHIFT、顶缘 2px 口沿高光取本关受光棱(§4.1);东崖宽 ESHIFT、高 格边+LIFT;北/西 2px 主亮棱+2px 次亮棱+外 2px 深墨边;南/东 2px 深墨内缘+3×2px 内阴影(自缘内 0.217×格边起,α0.27/0.16/0.08);四段投影 4×4px(α0.44/0.30/0.16/0.07);整板悬崖 8px。
|
||||
4. 深度排序:深度键=格底 y;岩体取最南格格底;升序绘制;南侧岩体画在小人之后并遮住小人脚底;小人所在格数字仍完整可见。格件顶面贴花/交互反馈随所属格件参与同一深度排序——北侧(脚底≤小人)低于小人(`z=0`),南侧(脚底>小人)随岩体在前(`z=3`);浮空数字仍最顶。
|
||||
5. 浮空数字:字高 21px、2px 深墨描边+1px 浮空投影、暖白字芯、字底距格顶 15px、2px 双色引导线、10×6 阴影圆(圆心格顶+7,画在开启格地面、位于小人之下);数字与引导线 z 最高,任何地形/小人/特效不遮数字与引导线;小人可遮阴影圆。
|
||||
6. D 区:左栏 AP 点阵+停手,右栏 RAP 点阵+数字+图例+弃图刷新;`side_rail_w=200` 入布局表;`ap_bar_h` 游戏视图零引用(布局表字段暂留供样张渲染工具,删除归工具批);棋盘底常驻操作提示条退役;toast 槽在左栏顶部且不覆盖棋盘与浮空数字。
|
||||
7. 旧 `terrain_*` 63 件与 `tile_palette.gd`/`cell_base_layer.gd` 删除;`seal_mark.png` 保留;**普通数字**棋盘绘制路径零 `DIGIT_PLATE`/`plate` 调用;封印格身份字形色牌保留(迭代56封印改版,唯一例外)。
|
||||
8. 封印呈现按迭代56「受理即揭示」口径:印记居已揭示地面格心、身份字形垫色牌叠于法阵之上、印记与色牌固定低于小人、该格不生成浮空 entries;封印格地面铺本关受光棱色封印石(零新增色,对封印黑对比 6.45–9.94:1),普通已开格地面仍为连续新地面。
|
||||
9. 三关(dungeon/underdark/deep_underdark)都走新材质与同一画法;三关八色按 art-bible §4.1 冻结(underdark 冷蓝灰、deep 灰黑);三关 golden 基线重制并在渲染闸通过。
|
||||
10. 命中仍按逻辑格矩形:点在抬升岩顶/崖面/浮空数字上不改变格坐标映射;16×16 等非当前板型由同一公式求值。
|
||||
|
||||
**不做**:真 3D、HD-2D、A/B 方案对照、旧瓦片回退、逐格新 PNG 瓦片、B/C 区改版、核心规则/数值/RNG 改动。
|
||||
|
||||
---
|
||||
|
||||
## 2. 设计事实源
|
||||
|
||||
- **画法与配色**:`design/art/art-bible.md` v3.51 §3.2「棋盘地形体系」八条(术语与定义/投影与搭接/受光与崖面/材质与装饰/投影与整板悬崖/绘制序与遮挡/浮空数字/旧资产处理)+封印印记条、§4.1「棋盘环境子板/三关棋盘环境八色/封印黑/数字色牌」、§6.3「三关 tile_closed/tile_open 终值」、§8.2「封印印记参数表」、§1.4 第一验收项。
|
||||
- **封印呈现前置**:迭代56「封印动作改版批」已闭合 `design/gdd/systems/排雷循环/排雷玩法.md` v2.0「封印受理即揭示」与 `design/ux/battle.md`「封印格呈现预览」——封印格 = 已揭示地面+法阵+身份字形色牌;本卡承接其地形换代(承载面改受光棱封印石、圆心仍格心、色牌与法阵层序不变),不重写揭牌逻辑。
|
||||
- **布局与像素判据**:`design/ux/battle.md`(2026-11-07)D 区行、棋盘格尺寸公式、「D 区布局与棋盘画法预览」像素判据表(含顶面/视觉 rect、悬停/路径 rect、层序)、Component Inventory 三行(行动资源侧栏/棋盘地形层/棋盘浮空数字层)。
|
||||
- **HUD 契约**:`design/gdd/systems/表现与支撑/HUD框架.md` D 区行(侧栏/全高棋盘/提示条退役)、布局表高度口径、字号下限(浮空数字 21px 固定)。
|
||||
- **验收面**:`game/tests/golden/README.md`「加严口径(棋盘三图)」「越格口径(2026-11-07 棋盘地形换代)」。
|
||||
- **上游已裁**:C 方向(合并岩体+越格画法+新大岩板材质)2026-11-07 用户看样张通过;顶栏搬两侧(D)2026-11-07 用户看三方案预览后选定;北/西受光、按样张调深、脚底行排序三项同会话裁定;underdark/deep 两关色板 2026-11-07 用户看方向样张后选定「按目标八色冻结」;棋盘底操作提示条退役同会话选定。
|
||||
|
||||
---
|
||||
|
||||
## 3. 现状事实(代码级,开工自行复核)
|
||||
|
||||
| 现状 | 证据 |
|
||||
|---|---|
|
||||
| D 区当前是「AP 条 44px+棋盘区+底部提示条」的 VBox 结构;board_area 实际高度需扣 VBox 间距与提示条(T0 实读,禁预设 504) | `game/presentation/views/board_zone_view.gd:23-37`(VBox+`ApBarView`+board_area+hint);`ap_bar_view.gd:35`(`custom_minimum_size.y = layout.ap_bar_h`);`board_zone_view.gd:74-79`(hint 条) |
|
||||
| 布局表只有 `ap_bar_h`,没有 `side_rail_w` | `game/data/schemas/battle_layout_table.gd:10,21-22`;`game/data/tables/battle_layout.tres` |
|
||||
| 格边公式预留为「上 12+下 12+悬崖 8」,无顶栏/侧栏项 | `game/presentation/views/board_view.gd:205-232`(`_cell_for`:`reserve := 24.0 + d`、`avail.x - 12.0 - d`) |
|
||||
| 棋盘原点由 CenterContainer 居中;`cell_origin` 读 `_svp_container.position` | `board_view.gd:403-404`;`_wrap`/`_svp_container` 建于 `board_view.gd:90-110` |
|
||||
| 棋盘逐格 16 墙瓦片+5 地面变体,按 `board_type` 装 PNG | `game/presentation/views/tile_palette.gd:17-20,66-94`;`board_view.gd:118,264-267` |
|
||||
| 数字有「亮直/深直/落牌」三态与色牌垫底;封印格身份字形同走色牌 | `tile_palette.gd:50,88-94,166`;`board_view.gd:517-518,586-591`;`cell_mark_overlay.gd:74-104` |
|
||||
| 封印当前代码仍是「未开格+`seal_on = seal and not revealed`」;迭代56封印改版已编未开工(本卡排其后,按其实装后的「已揭示地面+身份色牌」口径承接) | `board_view.gd:536-545`;`board_cell_unit.gd:31,39,51-77`;`seal_mark_layer.gd:12-20`;`reports/需求卡片-封印动作改版批-2026-11-07.md` §7 |
|
||||
| 封印取证选择器仍 `has_seal and not is_revealed`、取证 rect 按逻辑格(圆心格心) | `game/probe/board_shot_probe.gd:264-281`;迭代56卡片 §7 换代选择器 |
|
||||
| 格内立面/北投影/东立面全在本格内画;接触带也在基座层 | `game/presentation/views/cell_base_layer.gd:60,82-91,109-115,168,183,196` |
|
||||
| 小人 z=1、落影相对 z=-1(全局 0);无脚底排序;格件默认 z=0 | `game/presentation/views/board_world.gd:39,48`;`board_cell_unit.gd`(全文无 `z_index` 赋值) |
|
||||
| 旧 `terrain_*` 63 件(16+5,三关各一套)在库 | `game/assets/art/board/`(63 PNG+63 `.import`+`seal_mark.png`+其 `.import`) |
|
||||
| 棋盘取证探针视图 900×900,微光「禁越圈」按逻辑格;封印取证也按逻辑 rect | `game/probe/board_shot_probe.gd:179,261,318,369` |
|
||||
| 微光取证探针同用逻辑 rect | `game/probe/type_glow_shot_probe.gd:126,161` |
|
||||
| 变格边长探针恢复时调 `set_cell_area(bv.size)`(无侧栏参) | `game/probe/ui_input_probe.gd:360-366` |
|
||||
| 布局探针等价断言 `_cell_for(n, bv.size)`(无侧栏参) | `game/probe/layout_probe.gd:108-120` |
|
||||
| 对比度探针的迷雾派生段依赖 TilePalette | `game/probe/ui_contrast_probe.gd:119-147,164-190` |
|
||||
| 能力清单旧行「地形瓦片套与格面数字可读」仍引用 terrain 套件 | `game/tests/README.md`(旧行保留;删除归写卡段后续) |
|
||||
| 普通已开危险格「危」当前垫色牌;落牌断言在玩家复制回归件(本卡后普通「危」改浮空、plate=false;封印格「危」仍垫牌) | `game/tests/unit/presentation/player_copy_sweep_test.gd:142-147`(`u.plate == true`) |
|
||||
| 单元测试入口登记 terrain 套件 | `game/tests/run_all.gd:225` |
|
||||
| 布局表字段被样张渲染工具读取(本批不改工具) | `tools/layout_config.py:12`;`tools/render_sample_sheet.py:51,956`;`tools/render_sample_sheet_v3.py:862,936` |
|
||||
| 档期现状:待办清单已「已写卡」、roadmap 待编池「棋盘瓦片与立体表现重做(已写卡,待编排)」、08 已写卡 | `待办清单.md:265-268`;`roadmap.md:9`;`design/gdd/08-Alpha版本标准.md:149` |
|
||||
|
||||
---
|
||||
|
||||
## 4. 设计契约(🔴 触碰=L3 停机呈报)
|
||||
|
||||
1. 🔴 **只改呈现层与必要接线**:禁止改 `game/core/` 的排雷规则、棋盘数据、AP/RAP、战斗结算、RNG;棋盘数据只读。新增/修改只落 `game/presentation/`(含 `main.gd`/`main_debug_flow.gd` 的重建接线)、`game/probe/`、`game/tests/`、`game/data/schemas/`、`game/data/tables/` 与 `reports/`。
|
||||
2. 🔴 **不做逐格瓦片**:禁止保留或新增 16+5 逐格瓦片路径、`terrain_*` 回退、`TilePalette` 装图链;岩体/地面/崖面必须按整板矩形与格边程序化绘制,连通按四邻。
|
||||
3. 🔴 **普通数字零底牌**:普通数字(含普通已开格的「危」/「?」)只走浮空描边字;禁止 `_digit_ink_mode` 三态、`plate_digit` 在普通数字路径复活。**封印格身份字形色牌为唯一例外**(迭代56封印改版:`plate=true`、`_draw_digit_plate` 保留、字形叠于法阵之上),禁把例外扩回普通数字。
|
||||
4. 🔴 **浮空分层**:数字+引导线必须比地形/小人/封印/微光/交互反馈都高,任何元素不得遮数字与引导线;**阴影圆相反——画在开启格地面、位于小人之下**,小人站该格时遮住圆;顶行数字必须在 D 区内完整可见。**顶面贴花/交互反馈不得一律置顶**——随所属格件脚底行分档:北侧(脚底≤小人)低于小人,南侧(脚底>小人)随岩体在前;禁恢复“格件一律 z=3”。**封印格例外**:该格不生成浮空 entries/阴影圆,印记与身份色牌固定低于小人(整格 z=0,不参与南侧前推)。
|
||||
5. 🔴 **命中按逻辑格**:`_cell_at` 仍用逻辑格矩形与 `SEP` 步长;抬升岩顶、崖面、浮空数字不是命中区;顶面左上角点按逻辑公式归属北/西邻格,不做“归本格”特判。
|
||||
6. 🔴 **脚底排序**:深度键=格底 y;岩体取最南格格底;升序绘制;南侧岩体必须能遮住小人脚底;格件贴花/交互反馈按同一格底 y 分档(北侧 z=0 低于小人、南侧 z=3 随岩体在前;**封印格恒 0**);禁止退回“全部岩体先画、小人最后画”。
|
||||
7. 🔴 **顶预留 44px**:`TOP_RESERVE=44`、`BOTTOM_RESERVE=12`、`DEPTH_PX=8`;公式与预览判据一致;禁止用 AP 条高度重新挤压棋盘;board_area 高 = D 区全高 548。
|
||||
8. 🔴 **侧栏宽表单源**:`side_rail_w` 只从 `BattleLayoutTable` 读,视图内禁止硬编码 200;`ap_bar_h` 游戏视图零引用(布局表字段暂留供样张工具,删除归工具批)。
|
||||
9. 🔴 **旧资产先验后删**:T0 采样三关当前画面读数入报告;新路径三关 golden 绿后,才允许删除 63 件 PNG 与 `.import`;`seal_mark.png` 禁删。
|
||||
10. 🔴 **文档不直改**:实现批禁写 `design/`、`game/tests/README.md`(能力清单由写卡段本批入表)、`roadmap.md`、`08-Alpha版本标准.md`、`待办清单.md`;发现条款偏差一律列 `reports/iter<N>-反哺点-<日期>.md`。
|
||||
11. 🔴 **不删断言换绿**:不得删除或放宽 `board_shot_probe` 的加严口径、渲染闸 2% 判据、`ui_contrast_probe` 对比断言;只允许按本卡 §12「测试削弱申报」列出的旧断言删除/替换。
|
||||
12. 🔴 **拆分边界**:判据权威=`design/engineering/code-conventions.md` §1.1;每个拆出单元必须有职责语句与单一变化原因(§10);禁止为过阈值凑数拆件;拆不出内聚单元=停卡呈报。
|
||||
13. 🔴 **RNG 单点**:程序化材质/装饰噪声禁止 `randomize()`、自建 `RandomNumberGenerator`、消耗 `RngService` 共享流;一律用格坐标确定性哈希(同板同参逐位复现)。
|
||||
14. 🔴 **色字面量落点**:三关八色只落 `board_terrain_palette.gd`;用 `Color("#RRGGBB")` 常量,禁 `Color8` 散落;其它绘制点只读 palette,禁第二份色值表。
|
||||
15. 🔴 **BoardView 公开面不增**:`board_view.gd` 公开方法保持 27、类成员 ≤31(S13 基线;删 `_palette` 后 30);新增地形/浮空/阴影圆层一律落为**固定名字子节点**(`_world` 下 `TerrainBack`/`TerrainFront`/`LabelShadow`,壳层下 `FloatLayer`),三层在 `_init` 创建一次常驻、`rebuild` 只重跑 `setup` 不重建节点,经 `get_node_or_null` 取用,不新增类成员;只允许 `set_cell_area`/`rebuild` 增加可选参数与私有 `_visual_rect_for`/`_top_face_rect`/`_resort_cell_decals`,禁新增公开方法或成员。
|
||||
16. 🔴 **封印呈现对齐迭代56**:封印印记居已揭示地面格心(不随岩顶 −ESHIFT/−LIFT 偏移);身份字形垫色牌叠于法阵之上(`seal_mark_layer` 子件 `show_behind_parent=true` 或等价实装)、不参与浮空层、不生成阴影圆;印记与色牌固定低于小人(封印格整格 z=0);封印格地面铺本关受光棱色封印石(零新增色,`palette.light_edge`);法阵参数(环径/环壁/十字/光圈)与揭牌逻辑沿迭代56,禁在本卡重写。
|
||||
|
||||
---
|
||||
|
||||
## 5. 范围边界
|
||||
|
||||
**收件**:
|
||||
|
||||
- D 区布局(左右侧栏、全高棋盘、44px 顶预留、toast 槽移位、底部提示条退役)。
|
||||
- 棋盘地形深度层(连续地面、合并岩顶、南/东崖面、内阴影、四段投影、整板悬崖)。
|
||||
- 浮空数字层(阴影圆、引导线、描边字、1px 浮空投影、数字/线最顶、顶行越界)。
|
||||
- 小人与岩体的脚底排序;阴影圆在小人之下。
|
||||
- 封印印记/身份色牌的承载面与层序(已揭示地面格心+受光棱封印石+色牌叠于法阵之上且低于小人);类型微光/变异纹带/奖励徽章/悬停/路径/可挖域微光的锚点迁移(顶面 rect)。
|
||||
- 迷雾黑罩/记忆态与抬升岩顶的几何对齐。
|
||||
- 布局表 schema/tres、AP 条→侧栏的视图改造、命中测试。
|
||||
- 旧瓦片与普通数字色牌路径退役(封印格身份色牌保留)、三关色板、三关 golden 基线重制、测试与能力行落地。
|
||||
- 棋盘底常驻操作提示条退役(`board_zone_view` 的 hint 条删除)。
|
||||
|
||||
**不收件**:
|
||||
|
||||
- B 区舞台/站桩、C 区数据框、AP/RAP 数值与规则、战斗结算、RNG、存档——一律不动。
|
||||
- 新增地形 PNG 素材:本批按已过审样张做程序化材质;若后续要换成 PNG 材质,另立登记条目走 asset-ingest。
|
||||
- 真 3D/HD-2D、A/B 方案对照、用户试玩结论——试玩只登记不阻塞。
|
||||
- 三关之外的板型专属美术(16×16 等)——同一公式与材质覆盖,不另出资产。
|
||||
- 样张渲染工具(`tools/layout_config.py`、`render_sample_sheet*`)的 `ap_bar_h` 字段清理——布局表字段本批保留,工具换代登记待办清单后续直改。
|
||||
- 三关互辨抽测工具 `tools/glow_discrimination_sheet.py` 的换代(读已删旧 `terrain_*`)——本批不跑;三关互辨由用户过审样张+`board_terrain_test._test_palette_three_boards` 逐值承担,工具换代登记待办清单后续工具批。
|
||||
|
||||
**不收件去向**:B/C 区改版→待办清单新条目;PNG 材质替换→asset-ingest 登记;样张/互辨工具换代→待办清单(tools 批);条款偏差→反哺点清单。
|
||||
|
||||
---
|
||||
|
||||
## 6. 关联文档同步面
|
||||
|
||||
| 文档 | 关联点(实现会改变它的哪条陈述) | 同步义务 |
|
||||
|---|---|---|
|
||||
| `design/art/art-bible.md` §1.2/§3.2/§4.1/§6.3/§6.5/§7/§8.2 | 三关八色、四邻合并、顶面/视觉 rect、阴影视小、浮空字 1px 投影、贴花按脚底行分档、记忆态合成底、提示条 caption 退役;封印印记改已揭示地面格心+受光棱封印石+身份色牌层序(v3.51) | 设计段已按本卡写入 v3.51;实现读数若与条款不符→列反哺点,文档批裁决,实现批禁直改 |
|
||||
| `design/ux/battle.md` §Layout/§Component/预览判据 | D 区全高、侧栏 200、棋盘 38/32、原点、顶预留 44、层序(贴花/交互按脚底行分档)、悬停/路径 rect、提示条退役;封印格承载面改受光棱封印石、圆心格心、色牌叠法阵 | 设计段已同步(2026-11-07);实现偏差→反哺点 |
|
||||
| `design/gdd/systems/表现与支撑/HUD框架.md` D 区/字号 | D 区侧栏、全高棋盘、`ap_bar_h` 不再参与、浮空数字 21px、提示条退役 | 设计段已同步(2026-11-07);实现偏差→反哺点 |
|
||||
| `game/tests/golden/README.md` | 棋盘裁剪 1036×548、越格口径、类型微光禁越圈范围 | 设计段已同步;实现批禁直改,基线重制按该文件口径执行(重制前用户确认) |
|
||||
| `design/gdd/术语表.md` 掩尘/裸土/浮空数字/色牌 | 基色值、浮空数字定义、普通数字色牌退役+封印格色牌例外 | 设计段已同步;实现批禁直改 |
|
||||
| `design/art/asset-path-map.md`/`art-assets-checklist.md` | 旧 terrain_* 退役、seal_mark 保留、普通数字色牌退役+封印格色牌例外、程序化材质无入包 PNG | 设计段已同步;实现删除资产后按反哺点核对 |
|
||||
| `design/engineering/architecture/architecture.md:178` | 单格两绘制域件行把 `cell_base_layer` 记为在役组件;本批删除该件、新增地形/浮空/阴影层 | 架构文档写权限=用户专属(2026-11-07 裁):实现批禁直改,T8 反哺点列「架构表该行待用户发令修订」 |
|
||||
| `game/tests/README.md` 能力表 | 新增 6 条能力;旧「地形瓦片套与格面数字可读」保留(删除归写卡段后续;实现批禁写);「战斗屏三区几何」代表用例改名 | 写卡段本批入表(本卡同 commit);实现批只核对名字与实际落地一致 |
|
||||
| `roadmap.md`/`design/gdd/08-Alpha版本标准.md`/`待办清单.md` | 本卡已写/待编排状态 | 编排段与收尾段推进;实现批禁直改 |
|
||||
|
||||
---
|
||||
|
||||
## 7. 文件结构图
|
||||
|
||||
| 文件 | 行为改动/非行为 | 职责 | 验收行 |
|
||||
|---|---|---|---|
|
||||
| `game/presentation/views/board_terrain_palette.gd`(新增) | 非行为(数据) | 三关八色表:`palette_for(board_type)`;dungeon/underdark/deep 取 art-bible v3.51 §4.1 冻结值;八槽键 `rock_top/ground/cliff/seam/bevel_light/bevel_dark/ink/light_edge`;封印石读 `light_edge`(零新增色);只读 | §12-14 |
|
||||
| `game/presentation/views/board_terrain_layer.gd`(新增) | 行为 | 地面、合并岩顶、南/东崖面、内阴影、四段投影、封印格受光棱封印石贴片;`setup(cell, cols, rows, wall_at, sealed_at, palette, board_type)`/`set_hero_foot_y()`/`set_pass()`/`mass_rects()`/`terrain_metrics()`;静态 `lift_for()`/`eshift_for()`;back/front 两实例(`_world` 下固定名字 `TerrainBack`/`TerrainFront`,不占 BoardView 成员) | §12-3/4/5/8 |
|
||||
| `game/presentation/views/board_float_layer.gd`(新增,Control) | 行为 | 外壳层浮空字:2px 描边、1px 浮空投影、双色引导线;`setup()`/`set_entries()`/`set_font()`/`label_rects()`/`label_metrics()`;不画阴影圆;**封印格不生成 entries**;壳层固定名字子节点 `FloatLayer`,不占 BoardView 成员 | §12-6/7 |
|
||||
| `game/presentation/views/board_label_shadow_layer.gd`(新增,Node2D) | 行为 | 开启格地面 10×6 四层阴影圆;`setup(cell, cells)`/`circle_rects()`(世界局部/格坐标);**封印格不生成圆**;`_world` 下固定名字 `LabelShadow`,不占 BoardView 成员;z=0,位于小人之下 | §12-6/7 |
|
||||
| `game/presentation/views/ap_bar_view.gd`(修改,保留类名/字段名) | 行为 | 根改为全幅 Control(IGNORE)+左右两个 PanelContainer(`_init` 局部变量,不新增成员);左 AP+停手,右 RAP+图例+弃图刷新;信号/setter 名不变;`side_rail_w` 从布局表读 | §12-1/12 |
|
||||
| `game/presentation/views/board_view.gd`(修改) | 行为 | 新格边公式、顶预留 44、棋盘原点、地形/浮空/阴影圆固定名字子节点装配(不新增成员)、`rebuild` 清场跳过三层、`_resort_cell_decals` 按脚底行分档、命中测试、refresh 清理(删 `_paint_cell_base`/`_paint_cell_facade` 与 `u.base.*`)、迷雾 rect、rebuild/set_cell_area 侧栏参 | §12-2~9 |
|
||||
| `game/presentation/views/board_zone_view.gd`(修改) | 行为 | 去掉 VBox/AP 条/hint;board_area 全幅;侧栏叠层;toast 左栏顶部;`_side_rail_w` 存 layout 值 | §12-1 |
|
||||
| `game/presentation/views/board_world.gd`(修改) | 行为 | 悬崖保留 z=0、材质色接新 palette;小人 z=1、落影相对 z=-1;格子 z 对齐 | §12-5 |
|
||||
| `game/presentation/views/board_cell_unit.gd`(修改) | 行为 | 去基座层(删 `base` 成员);新增 `top_face_offset`/`visual_rect`;**保留 `plate`**(封印格身份色牌);`z_index` 按脚底行分档(北侧 0/南侧 3;**封印格恒 0**,由 `_resort_cell_decals` 重算);`glyph` 只写封印格(色牌字形),普通数字不写格面;封印子件 `show_behind_parent=true`(法阵在色牌下);迷雾三块;记忆态地面色/灰罩/记忆墨数字迁入固定名字低层子件 `MemoryGround`(`z_as_relative=false`、全局 z=-1:地面之上、阴影圆 0 之下),不整矩形压南邻岩顶;`draw_removed_dim` 墙格改顶面 rect;接触带迁入固定名字低层子件 `ContactGlow`(同全局 -1);文件头注删 `cell_base_layer` 引用 | §12-8/9/13 |
|
||||
| `game/presentation/views/cell_mark_overlay.gd`(修改) | 行为 | 删普通数字字形/色牌路径;**保留封印格字形+`_draw_digit_plate` 色牌+徽章**;保留变异/路径/高亮/退色;顶面 rect 参数 | §12-8/11 |
|
||||
| `game/presentation/views/cell_base_layer.gd`(删除) | 非行为(清理) | 逐格基座/立面/投影/接触带职责移交 | §12-3/13 |
|
||||
| `game/presentation/views/tile_palette.gd`(删除) | 非行为(清理) | 16+5 装图/三态墨色职责退役 | §12-11 |
|
||||
| `game/data/schemas/battle_layout_table.gd`(修改) | 非行为(数据契约) | 增 `side_rail_w`;`ap_bar_h` 保留字段(游戏视图零读) | §12-1 |
|
||||
| `game/data/tables/battle_layout.tres`(修改) | 非行为(数据) | `side_rail_w = 200`;`ap_bar_h` 字段保留 | §12-1 |
|
||||
| `game/presentation/main.gd`/`main_debug_flow.gd`(修改) | 非行为(接线) | `BoardView.rebuild(..., side_rail_w)` 传布局表值 | §12-2 |
|
||||
| `game/probe/board_shot_probe.gd`(修改) | 非行为(取证) | 视图 1036×548、侧栏 200、顶面 rect 微光圈;**封印取证保持逻辑格 rect(圆心格心)**,选择器按迭代56后 `has_seal` 口径;三关截图 | §12-15 |
|
||||
| `game/probe/type_glow_shot_probe.gd`(修改) | 非行为(取证) | 视图 1036×548、`rebuild(..., 200)`、微光允许区改顶面 rect | §12-15 |
|
||||
| `game/probe/layout_probe.gd`(修改) | 非行为(取证) | `_cell_for` 带侧栏;D 区/原点/顶预留读数(含 1920 档) | §12-2/15 |
|
||||
| `game/probe/ui_input_probe.gd`(修改) | 非行为(取证) | `set_cell_area` 恢复时带侧栏参 | §12-2/15 |
|
||||
| `game/probe/ui_contrast_probe.gd`(修改) | 非行为(取证) | 去旧瓦片均值段;加浮空字四类底复合对比;迷雾派生段改读新 palette | §12-6/9 |
|
||||
| `game/tests/unit/presentation/board_terrain_test.gd`(新增) | 非行为(测试) | 格边/合并/投影/深度/锚点/命中/迷雾/接触/色板/旧资产/封印承载与色牌 | §12-2~5,8,9,11,13,14 |
|
||||
| `game/tests/unit/presentation/board_float_label_test.gd`(新增) | 非行为(测试) | 字高/间距/顶预留/最顶/阴影视小/复合对比/普通数字零底牌(封印格跳过) | §12-6/7/11 |
|
||||
| `game/tests/unit/presentation/board_side_rail_test.gd`(新增) | 非行为(测试) | 侧栏几何、信号、setter、提示条退役 | §12-1/12 |
|
||||
| `game/tests/unit/presentation/terrain_tile_sets_test.gd`(删除) | 非行为(测试) | 旧瓦片套断言整体退役 | §12-11 |
|
||||
| `game/tests/unit/presentation/stage_background_test.gd`(修改) | 非行为(测试) | 新增 `_test_side_rail_width_from_table`(现无 AP 条高度测试) | §12-1 |
|
||||
| `game/tests/unit/presentation/player_copy_sweep_test.gd`(修改) | 非行为(测试) | 普通已开危险格:`u.plate==true` 改 `u.plate==false`+浮空 entries 含该格;封印格色牌断言归 `board_terrain_test` | §12-6/11 |
|
||||
| `game/tests/unit/presentation/standee_present_values_test.gd`(修改) | 非行为(测试) | V11 口沿高光源码锚由 `cell_base_layer.gd` 改指 `board_terrain_layer.gd`(北/西主亮棱);`body_src` 段保留 | §12-3/11 |
|
||||
| `game/tests/run_all.gd`(修改) | 非行为(测试入口) | 注册三个新套件、移除 terrain 套件 | §12-16 |
|
||||
| `game/tests/README.md`(写卡段本批改) | 非行为(能力清单) | 新增 6 条能力;旧地形行保留(删除归写卡段后续);代表用例改名 | §12 全表 |
|
||||
|
||||
---
|
||||
|
||||
## 8. 落位与可复用性预检
|
||||
|
||||
| 新增件 | 复用面(为什么不能复用既有) | 唯一面 | 分层与交互 |
|
||||
|---|---|---|---|
|
||||
| `board_terrain_palette.gd` | 现有 `TilePalette` 只装 PNG/算墨色,不含三关程序化八色;改它会保留装图职责,职责混杂,故新件只放色表 | 三关八色只在此文件定义;视图只读 `palette_for()` | 纯数据件,不引用 UI/节点;`board_terrain_layer` 消费 |
|
||||
| `board_terrain_layer.gd` | `cell_base_layer.gd` 是逐格基座,无法表达合并岩体/脚底排序;扩它会变成两个职责,故新件承接地形 | 地面/岩体/崖面/投影只在此件绘制;`cell_base_layer` 删除;LIFT/ESHIFT 只在此件静态函数 | 由 `BoardView` 创建两个实例(back/front),读 `wall_at` Callable 与 palette;不反向调用 BoardView |
|
||||
| `board_float_layer.gd` | `cell_mark_overlay` 是逐格绘制域件,无法做跨格最高层与引导线;且 SubViewport 尺寸只到棋盘+悬崖,顶行浮空字会被裁,故必须做 BoardView 外壳 Control 覆盖层 | 数字/引导线只在此件绘制;`cell_mark_overlay` 删数字路径;不画阴影圆 | 由 `BoardView` 创建为全幅 Control;读 entries(cell/glyph);不写核心 |
|
||||
| `board_label_shadow_layer.gd` | 浮空层在外壳、会盖小人;阴影圆必须在小人之下且在地面之上,无法复用浮空层或格件(格件 z=3 会盖小人) | 阴影圆只在此件绘制;开启格局部圆心格顶+7 | 由 `BoardView` 创建于 `_world`,z=0;读 entries 的 cell 列表;不反向调用 BoardView |
|
||||
| `ap_bar_view.gd`(改造不换名) | 现有 `ApBarView` 已含 AP/RAP/确认/图例/刷新全部逻辑与信号,且被组合根/探针以字段名 `ap_bar` 引用;改名会波及 7 个接线文件,收益低风险高,故保留类名/字段名,只改布局职责 | 侧栏只此一件;`BoardZoneView` 只持有它 | 由 `BoardZoneView` 创建;信号经原有组合根路径上抛 |
|
||||
| 三个测试件 | 现有 `terrain_tile_sets_test` 只测旧瓦片套;新职责无法复用;按职责拆三件(地形/浮空/侧栏) | 每个测试件只测对应域 | 经真实 `BoardView`/`BoardZoneView` 入口实例化;不直调核心写 |
|
||||
|
||||
**唯一面核查**:`LIFT`/`ESHIFT`/`TOP_RESERVE`/`side_rail_w` 各只有一个定义点;普通数字路径 `DIGIT_PLATE`/`plate` 零引用(封印格身份色牌为唯一例外,`cell_mark_overlay`/`CellUnit.plate`);`terrain_*` 零引用;三关八色只在 palette 件;封印格承载色只读 `palette.light_edge`;层节点名 `_world/TerrainBack`/`_world/TerrainFront`/`_world/LabelShadow`/壳层 `FloatLayer` 各只有一个创建点,`rebuild` 只清格件与英雄、不误清三层。
|
||||
|
||||
**分层与交互**:Core 零 UI、数据只经 ConfigDB、RNG 零触碰、命中只读——全部保持;新增件不互相反向持宿主引用。
|
||||
|
||||
---
|
||||
|
||||
## 9. 实现规范预算
|
||||
|
||||
| 新文件 | 公开方法预算 | 成员变量预算 | 说明 |
|
||||
|---|---|---|---|
|
||||
| `board_terrain_palette.gd` | 1(`palette_for`) | 8 个常量 | 纯数据;不新增类状态 |
|
||||
| `board_terrain_layer.gd` | ≤7(`setup`/`set_hero_foot_y`/`set_pass`/`mass_rects`/`terrain_metrics`/`lift_for`/`eshift_for`) | ≤13(新增 `_sealed_at` 一个成员——封印石贴片输入;其余同前) | 两个实例共享一个类;`pass_mode` 区分 back/front |
|
||||
| `board_float_layer.gd` | ≤5(`setup`/`set_entries`/`set_font`/`label_rects`/`label_metrics`) | ≤8 | 一个 Control;所有数字在一个 `_draw` |
|
||||
| `board_label_shadow_layer.gd` | ≤2(`setup`/`circle_rects`) | ≤6 | 一个 Node2D;所有圆在一个 `_draw`;坐标=世界局部/格坐标 |
|
||||
| `ap_bar_view.gd`(改造) | 既有 10 个公开函数不减 | 既有 14 个成员不增(左右栏容器为 `_init` 局部变量) | 不新增公开面/成员;只改 `_init`/`_build_*` |
|
||||
| 三个测试件 | 每件 ≤20 个 `func _test_*` | 夹具变量 ≤15 | 不计生产接口;测试件无消费面 |
|
||||
|
||||
**存量触面**:`board_view.gd` 852 行、公开方法 27、类变量 31→30(删 `_palette`);本批只扩展 `set_cell_area(avail, side_rail_w := 0.0)` 与 `rebuild(board, minesweeper, side_rail_w := 0.0)` 的可选参数,新增 `_visual_rect_for`/`_top_face_rect`/`_resort_cell_decals` 私有方法,**不新增公开方法/成员**;地形/浮空/阴影圆层经固定名字子节点取用(`TerrainBack`/`TerrainFront`/`LabelShadow`/`FloatLayer`);S13 键只降不升。`board_zone_view.gd` 6→7 成员(新增 `_side_rail_w`,默认阈值内)。`board_cell_unit.gd` 12→13 成员(删 `base` 与 `_BASE_LAYER` 预载,新增 `top_face_offset`/`visual_rect`,保留 `plate` 封印色牌;净 +1;`ContactGlow`/`MemoryGround` 用固定名字子节点、不新增成员,默认阈值内)。`ap_bar_view.gd` 14 成员不增。`cell_mark_overlay.gd` 普通数字路径只减面,封印格色牌/字形面保留。迁移函数对账:`cell_base_layer.gd` 的 `draw_base`/`_draw_south_facade`/`_draw_north_projection`/`_draw_e_facade` 不迁入新件同名函数,新件按职责重写并保留像素判据;`tile_palette.gd` 的 `load_board_tiles`/`digit_ink_mode`/`normalize_floor_luma` 不迁移(职责退役)。
|
||||
|
||||
**指标例外申报**:无。若实现期发现 `board_terrain_layer.gd` 超过 7/13,按职责拆 `board_terrain_face_layer.gd`(崖面/投影)——先停卡呈报,不在实现段自行扩面。
|
||||
|
||||
---
|
||||
|
||||
## 10. 拆分边界纪律
|
||||
|
||||
判据权威 = `design/engineering/code-conventions.md` §1.1;本卡不复制定义,只写条款:
|
||||
|
||||
- 每个拆出单元(地形层/浮空层/阴影圆层/侧栏)必须有可陈述的职责语句与单一变化原因(实现报告逐件一行承载)。
|
||||
- 拆出单元必须有集体身份,命不出名字的「剩下的成员」打包=凑计数袋,禁止。
|
||||
- 过阈值只作发现信号,作拆分或收拢动机即违规。
|
||||
- 按职责拆不出内聚单元→停卡呈报走豁免/还债通道,禁硬拆凑绿。
|
||||
|
||||
职责语句:`board_terrain_layer`=「把棋盘格态画成连续地面/合并岩体/崖面/投影」;`board_float_layer`=「把开启格字形画成高于一切的浮空标注」;`board_label_shadow_layer`=「把浮空标注的所属格画成小人脚下的地面阴影圆」;`ap_bar_view`=「承载 D 区左/右行动资源读数与按钮」。
|
||||
|
||||
---
|
||||
|
||||
## 11. 任务卡 T0..T8
|
||||
|
||||
### T0 读数与基线(0.5 日)
|
||||
|
||||
**取用**:无(首卡)。
|
||||
**产出**:`reports/iter<N>-实现报告-<日期>.md` 的 T0 读数段;当前棋盘 golden 三图 hash;三关当前画面读数。
|
||||
|
||||
- [ ] 实读 `battle_layout.tres`:`stage_h=252`/`info_panel_w=240`/`ap_bar_h=44`/`log_band_h_dig=24`/`log_band_h_settle=84`,写入报告。
|
||||
- [ ] 实读当前 `board_area.size` 与 `BoardView.cell_size`(含 VBox 间距/hint 扣减;禁预设 504/37);写入报告。
|
||||
- [ ] 跑 `board_shot_probe` 存三关当前帧与 `board_meta.json`,记下 hash;不重制基线(T7 才换代)。
|
||||
- [ ] 确认 `game/assets/art/board/` 63 PNG+63 `.import`+`seal_mark.png` 在库;报告列清单。
|
||||
- [ ] 跑 `python tools/gdstyle_gate.py` 记录 `board_view.gd` 当前 27/31 基线读数;跑 `python tools/capability_audit.py` 记录当前红项(T8 复跑)。
|
||||
- [ ] 录三关 `board_type` 字符串与 art-bible v3.51 §4.1 三关八色;不采样旧瓦片均值。
|
||||
|
||||
### T1 布局表与 D 区侧栏(1.5 日)
|
||||
|
||||
**取用**:T0 读数。
|
||||
**产出**:`BattleLayoutTable.side_rail_w`(200);`ApBarView` 双侧栏改造;`BoardZoneView` 全高 board_area+toast 左栏+hint 删除;`stage_background_test` 改名断言。
|
||||
|
||||
- [ ] `battle_layout_table.gd` 增 `@export var side_rail_w: int = 200`;`validate()` 增域 [160,260];`ap_bar_h` 保留字段与校验(游戏视图零读)。
|
||||
- [ ] `battle_layout.tres` 写 `side_rail_w = 200`;`ap_bar_h` 保留。
|
||||
- [ ] `ap_bar_view.gd`:根改全幅 `Control`(`mouse_filter=IGNORE`),内部左右两个 `PanelContainer`(各宽 `layout.side_rail_w`,贴 D 区左右缘;两个容器用 `_init` 局部变量创建并 `add_child`,不新增成员);左栏 `_build_ap_face`(含停手按钮);右栏 `_build_rap_face`+`_build_legend_refresh`+`_build_refresh_confirm`;保留 `class_name ApBarView`、`stop_pressed`/`refresh_confirmed`/`legend_toggled` 与 `set_ap`/`set_rap`/`set_refresh_cost`/`set_refresh_state`/`set_stop_enabled` 签名;删除 `custom_minimum_size = layout.ap_bar_h`。
|
||||
- [ ] `BoardZoneView` 删 VBox;`ap_bar` 字段保留、改为全幅叠层子件(不再挂 VBox);删 hint 条(`board_zone_view.gd:74-79`);根 PanelContainer 清空 panel style(或改 Control 根),`board_area` 占满 D 区(1036×548);toast 挂 `ap_bar` 左上、宽 `side_rail_w`;`_init(layout)` 存 `_side_rail_w = layout.side_rail_w`;`_on_board_area_resized` 调 `board_view.set_cell_area(_board_area.size, float(_side_rail_w))`。
|
||||
- [ ] `stage_background_test.gd`:新增 `_test_side_rail_width_from_table`(该件现无 AP 条高度测试;读 `layout.side_rail_w==200`,并断言 `ApBarView` 无 `custom_minimum_size.y==ap_bar_h` 路径)。
|
||||
- [ ] `board_side_rail_test.gd` 新建:`_test_side_rail_layout`(左/右栏 x 宽、board_area 高 548、toast 不压棋盘、hint 节点不存在)+`_test_signals`(三个信号与 setter)。
|
||||
- [ ] `run_all.gd` 注册 `board_side_rail_test.gd`。
|
||||
- [ ] 跑 `board_side_rail_test` 与 `stage_background_test`;报告写读数。
|
||||
|
||||
### T2 格边公式、顶预留与命中(0.5 日)
|
||||
|
||||
**取用**:T1 的 `side_rail_w`;`BoardZoneView._side_rail_w`。
|
||||
**产出**:`board_view.gd` 的 `TOP_RESERVE=44`/`BOTTOM_RESERVE=12`、`_cell_for(n, avail, side_rail_w := 0.0)`、棋盘原点、命中不变;`layout_probe`/`ui_input_probe` 带侧栏参。
|
||||
|
||||
- [ ] `board_view.gd` 加 `const TOP_RESERVE := 44.0`、`const BOTTOM_RESERVE := 12.0`;`set_cell_area(avail: Vector2, side_rail_w: float = 0.0)`、`rebuild(board, minesweeper, side_rail_w: float = 0.0)`(公开方法数保持 27;`rebuild` 内调 `set_cell_area(size, side_rail_w)`)。
|
||||
- [ ] `_cell_for(n: int, avail: Vector2, side_rail_w: float = 0.0)`:`floor((min(avail.x - 2*side_rail_w - 12 - DEPTH_PX, avail.y - TOP_RESERVE - BOTTOM_RESERVE - DEPTH_PX) - (n-1)*SEP)/n)`,`clampi [26,46]` 不变。
|
||||
- [ ] `_wrap` 由 `CenterContainer` 改为全幅 `Control`(`mouse_filter=IGNORE`);`board_px` = 棋盘外框(`cols*stride - SEP`,12×12=478;**不含悬崖 8**);`_svp_container.position = Vector2((avail.x - board_px.x)*0.5, TOP_RESERVE)`;容器尺寸 = `board_px + Vector2(DEPTH_PX, DEPTH_PX)`(`_update_world_size` 现有 `px` 含悬崖,仅用于容器尺寸);`_update_world_size`/`set_cell_area` 同一处写入;`cell_origin`/`_cell_at` 继续读该 position;`set_cell_area` 同拍重跑 `TerrainBack/Front.setup(...)`、`FloatLayer.setup(cell, origin, entries, font)`、`LabelShadow.setup(cell, cells)`(格边/原点变更)。
|
||||
- [ ] `main.gd:470` 与 `main_debug_flow.gd:104` 的 `rebuild` 调用传布局表值(main 用 `db.presentation.battle_layout.side_rail_w`;debug flow 用 `root.db.presentation.battle_layout.side_rail_w`);`ApBarView` 不新增公开 `side_rail_w` 成员。
|
||||
- [ ] `board_terrain_test.gd:_test_cell_formula_base`:`_cell_for(12, Vector2(1036,548), 200)==38`、`_cell_for(14, Vector2(1036,548), 200)==32`;`cell_origin(Vector2i(0,0))==Vector2(279,44)`(board_area 局部;屏幕 523,296);14×14 局部 (281,44)。
|
||||
- [ ] `board_terrain_test.gd:_test_hit_test_logical_rect`:`_cell_at(cell_center_local(c))==c` 对 12×12 全格;顶面左上角点按逻辑公式归属北/西邻格(不做归本格特判);板外返回 `(-9,-9)`。
|
||||
- [ ] `layout_probe.gd` 的 `_cell_for` 调用带 `main.db.presentation.battle_layout.side_rail_w`;加 D 区/棋盘原点/顶预留读数;1920 档按全局等比 1.35 断言构图一致。
|
||||
- [ ] `ui_input_probe.gd:360-366` 的 `set_cell_area` 恢复调用带 `main.db.presentation.battle_layout.side_rail_w`;`board_gen_reward_test` 的 2 参调用保持(测试独立口径)。
|
||||
- [ ] 跑 `board_terrain_test` 与 `layout_probe`;报告写读数。
|
||||
|
||||
### T3 地形深度层(2.0 日)
|
||||
|
||||
**取用**:T2 的格边/原点;art-bible v3.51 §4.1 三关八色。
|
||||
**产出**:`board_terrain_palette.gd`、`board_terrain_layer.gd` 两个实例(back/front);`BoardView` 装配;`cell_base_layer.gd` 删除;接触带迁入 CellUnit。
|
||||
|
||||
- [ ] `board_terrain_palette.gd`:八色常量(`Color("#...")`)按 art-bible v3.51 §4.1 三关表;八槽键 `rock_top/ground/cliff/seam/bevel_light/bevel_dark/ink/light_edge`;`palette_for(board_type)` 返回 Dictionary;未知 board_type 回退 dungeon 并记录(fail-fast 只在核心,呈现回退不刷错)。
|
||||
- [ ] `board_terrain_layer.gd`:`setup(cell, cols, rows, wall_at, sealed_at, palette, board_type)`(`sealed_at` = 封印格查询 Callable);`set_pass("back"/"front")`;`set_hero_foot_y(y)`;`_draw()` 中**地面/投影/封印石/背岩体只在 back 画**(整板悬崖仍由 `BoardWorld._draw` 承担,不重复绘制),岩体按 pass 过滤(back=脚底≤hero,front=>hero),每个 setter 调 `queue_redraw()`;静态 `lift_for(cell)`/`eshift_for(cell)`。
|
||||
- [ ] 封印石贴片(back):`sealed_at(c)` 为真的格,在连续地面之上铺本格逻辑 rect 的 `palette.light_edge` 实色(可带 1px `palette.seam` 收边),不越格、不加新色;封印黑对受光棱对比 6.45–9.94:1(art-bible v3.51 §3.2/§4.1)。
|
||||
- [ ] 岩顶公式:`LIFT=round(cell*0.435)`、`ESHIFT=round(cell*0.109)`;四邻连通合并;相邻墙顶搭接 2;板边外延 ESHIFT;南崖高 LIFT、宽 cell+ESHIFT;东崖宽 ESHIFT、高 cell+LIFT;禁竖条纹。
|
||||
- [ ] `BoardView` 在 `_init` 以固定名字子节点创建一次常驻的 `_world/TerrainBack`(z=-1)与 `_world/TerrainFront`(z=2),不新增类成员;两层设 `use_parent_material = true`(随 `_world.material` 去饱和);back 画地面/投影/封印石/背岩体;front 画南侧岩体;`hero z=1` 不变;格件 z 按脚底行分档(北侧 0、南侧 3;**封印格恒 0**),由 `_resort_cell_decals` 重算(顶面贴花/交互/迷雾同格件 z);`board_world` 悬崖保留 z=0、`mat` 取新 palette 岩顶色(`_refresh_slab` 不再写 `COL_BRICK`);`rebuild` 清 `_world` 子件时跳过 `TerrainBack`/`TerrainFront`/`LabelShadow`(只清格件与英雄),再对各层重跑 `setup`(不重建节点);`setup` 传入 `_minesweeper.has_seal` 作 `sealed_at`。
|
||||
- [ ] `BoardView._resort_cell_decals()`(私有):遍历 `_cells`,`u.z_index = 0 if u.seal_on else (3 if c.y > hero.y else 0)`;`ContactGlow`/`MemoryGround` 子件 `z_as_relative=false`、`z_index=-1`(全局 -1:地面之上、阴影圆 0 之下);`refresh` 与 `_update_hero` 末尾调用;hero 缺位时全部按 0 档。
|
||||
- [ ] `board_view.gd` 删 `_paint_cell_base`/`_paint_cell_facade`(及 `_paint_cell`/`refresh` 调用)、`_floor_tile_for`/`_wall_tile_for`、`_build_cell_unit` 的 `u.base.bevel`;`_paint_cell_ink` 删 `bg` 计算/返回(`COL_FLOOR`/`COL_BRICK` 随之删)但保留 glyph 计算:**封印格写 `u.glyph`/`u.glyph_color`/`u.plate=true`(色牌字形),普通已开格只把 glyph 交给浮空 entries、`u.glyph` 留空**;`_apply_contact_bands`/`_process`/`_reset_breath` 的 `u.base.contact_*` 改调 `ContactGlow.set_bands(bands, corners, color, ground_visible_rect)`(不再经 `u.base`);`COL_DIGIT` 无引用即删;英雄贴图缺位字形「人」回退随基座退役(T4 登记)。
|
||||
- [ ] 删除 `cell_base_layer.gd`;`board_cell_unit.gd` 去 `_BASE_LAYER` 预载、`base` 成员与 `base.draw_base`,文件头注删 `cell_base_layer` 引用;英雄蓝框随基座退役;接触带绘制迁入固定名字低层子件 `ContactGlow`(`z_as_relative=false`、全局 z=-1:地面之上、阴影圆 0 之下;只画英雄格地面侧,正交整边/斜向角点+两半边,逻辑格边,不进岩体);记忆态地面色/灰罩/记忆墨数字迁入固定名字低层子件 `MemoryGround`(同全局 -1);BoardView 计算 `ground_visible_rect`(本格逻辑 rect 扣除南/东邻未开格岩顶越入,南邻约 LIFT−SEP、东邻约 ESHIFT−SEP)并下发 `MemoryGround.setup(...)`/`ContactGlow.set_bands(..., ground_visible_rect)`,子件不读棋盘、CellUnit 不增成员;两个低层子件只绘地面可见区,禁整矩形覆盖 back 岩顶/崖面;设 `use_parent_material = true`(随世界去饱和);`draw_removed_dim` 墙格改顶面 rect。
|
||||
- [ ] `standee_present_values_test.gd:79-86`:`cell_src` 源码锚由 `cell_base_layer.gd` 改指 `board_terrain_layer.gd`(北/西主亮棱绘制点),删 `FACADE_HIGHLIGHT_PX), UiKit.BRICK, true` 断言;`body_src` 段保留;跑该件至 0。
|
||||
- [ ] `board_terrain_test.gd:_test_merged_mass_geometry`:四邻合并、相邻墙顶 rect 相交/搭接 2、无墙顶内框、地面无缝;`_test_projection_ratios`:38 格 LIFT=17、ESHIFT=4、南崖 17×42、南崖顶缘高光=本关受光棱、东崖 4×55、北/西 2+2+外 2 墨边、南/东内阴影 3×2。
|
||||
- [ ] `board_terrain_test.gd:_test_depth_order`:三行夹具,断言 back 含北岩体、front 含南岩体、hero 在两者之间;北侧格件 `z_index=0`、南侧格件 `z_index=3`、**封印格(含南侧)`z_index=0`**、`ContactGlow`/`MemoryGround` 全局 -1;南岩体覆盖小人脚底像素(探针)。
|
||||
- [ ] `run_all.gd` 注册 `board_terrain_test.gd`。
|
||||
- [ ] 跑三关 golden 采集(先不重制基线)看差异落点;报告写地形层 draw calls。
|
||||
|
||||
### T4 浮空数字层与阴影圆(1.5 日)
|
||||
|
||||
**取用**:T2 的原点/格边;T3 的深度分层。
|
||||
**产出**:`board_float_layer.gd`(Control 外壳)、`board_label_shadow_layer.gd`(Node2D 世界层);`BoardView` 装配;`cell_mark_overlay` 删数字路径。
|
||||
|
||||
- [ ] `board_float_layer.gd`:`setup(cell, origin, entries, font)`(origin = 壳层棋盘原点);`_draw()` 画双色引导线(左深右浅、2px、格顶−12..格顶+4)→数字(字高 21、2px 八向描边、1px 浮空投影、暖白芯);`危/?` 同规则;`label_rects()`/`label_metrics()`(壳层局部坐标);全幅 Control(`mouse_filter=IGNORE`)、z 最高;每个 setter 调 `queue_redraw()`;**不画阴影圆;封印格不进 entries**。
|
||||
- [ ] `board_label_shadow_layer.gd`:`setup(cell, cells)`(世界局部/格坐标系,不传 shell 原点;`cells` = 浮空 entries 的格集,**不含封印格**);`_draw()` 画 10×6 四层同心椭圆(外→内 α40/70/105/140,尺寸 100%/80%/60%/40%;用 `draw_set_transform` 缩放后 `draw_circle` 或 16 点椭圆多边形,禁单用 `draw_circle`);圆心 = 逻辑格心、格顶+7;z=0(小人之下);`circle_rects()`(世界局部);setter 调 `queue_redraw()`。
|
||||
- [ ] `BoardView` 在 `_init` 以固定名字子节点创建一次常驻的 `FloatLayer`(BoardView 子 Control,全幅,z 最高)与 `_world/LabelShadow`(Node2D,z=0),不新增类成员;`LabelShadow` 设 `use_parent_material = true`,`FloatLayer` 不在 `_world` 材质链,`set_desaturated` 同拍给 `FloatLayer.material = _desat_mat`/`null`(结算期浮空数字同样灰化,禁成彩色例外);`rebuild` 清 `_world` 子件时跳过 `LabelShadow`(T3 同款跳过表);entries 由 `refresh` 的已开记录生成(`1–8`/`危`/`?`),**封印格跳过**(其字形走色牌),记忆态不生成 entries。
|
||||
- [ ] `BoardView.set_world_font(f)` 同时 `FloatLayer.set_font(f)`;`cell_mark_overlay.gd` 删普通数字字形/色牌路径,**保留封印格字形+`_draw_digit_plate` 色牌**;`BoardCellUnit.plate` 保留(封印格 `true`、普通格 `false`);`board_view.gd` 删 `_digit_ink`/`_palette.digit_*`;`refresh` 字形段删 `_digit_ink` 三档与 `plate_digit` 普通路径(:586-591),封印格写 `u.glyph`/`u.glyph_color`/`u.plate=true`,普通已开格只交 entries(记忆墨仍用 `FOG_MEMORY_INK`;浮空字固定暖白芯);英雄贴图缺位字形「人」回退随基座退役(资产在包,正常路径不可达),实现报告「实现决定记录」登记。
|
||||
- [ ] `run_all.gd` 注册 `board_float_label_test.gd`。
|
||||
- [ ] `board_float_label_test.gd:_test_label_geometry`:字高 21、字底距格顶 15、视觉顶距格顶 38、线 2px、1px 投影;`_test_topmost_layer`:`FloatLayer` 为 BoardView 子 Control、z 最高、顶行 rect 在 D 区内(顶行 top=6 local);`_test_shadow_circle`:圆 10×6、圆心格顶+7、`_world/LabelShadow.z==0` 低于 hero、开启格才有圆、封印格无圆;`_test_desaturation`:`set_desaturated(true)` 后 `FloatLayer.material` 与 `TerrainBack/TerrainFront/LabelShadow` 的 `use_parent_material` 同拍生效;`_test_contrast`:四类底复合对比 ≥4.5。
|
||||
- [ ] `board_float_label_test.gd:_test_no_ordinary_plate_path` 与 `board_terrain_test.gd:_test_seal_substrate` 扫描/断言:普通数字路径(`board_view.gd`/`board_float_layer.gd` 与 `cell_mark_overlay` 的非封印分支)零 `plate_digit`/`_digit_ink_mode`;`DIGIT_PLATE`/`_draw_digit_plate` 只在封印格分支命中。
|
||||
- [ ] 跑 `board_float_label_test`;三关截图看顶行数字越界与小人遮圆;报告写读数。
|
||||
|
||||
### T5 交互/封印/微光/迷雾锚点(1.5 日)
|
||||
|
||||
**取用**:T3 的地形顶面;T4 的浮空层/阴影圆。
|
||||
**产出**:`cell_mark_overlay`/`cell_unit`/`seal_mark_layer`/`cell_type_glow_layer`/`board_view` 锚点与 fog rect;`board_terrain_test` 锚点/迷雾断言。
|
||||
|
||||
- [ ] `BoardView._top_face_rect(c)`(私有)= 墙格 `Rect2(x-ESHIFT, y-LIFT, cell, cell)`、地面格逻辑 rect;`BoardView._visual_rect_for(c)`(私有)= 墙格 `Rect2(x-ESHIFT, y-LIFT, cell+ESHIFT, cell+LIFT)`、地面格逻辑 rect;两者不新增公开方法。
|
||||
- [ ] `CellUnit` 增 `top_face_offset`(墙格 `(-ESHIFT,-LIFT)`、地面 `(0,0)`)与 `visual_rect`;`_draw` 用 `Rect2(top_face_offset, edge, edge)` 传给 face;`_sync_seal_layer` 调 `setup(edge, visible)`(**不传 top_face_offset**——封印居逻辑格心,见下条);`cell_type_glow_layer.setup(edge, group, top_face_offset)`;`cell_mark_overlay` 的变异/徽章/悬停/退色/路径按该 rect(墙格顶面、地面逻辑;路径点迹只地面逻辑)。
|
||||
- [ ] 封印圆心:`seal_mark_layer.setup(edge, visible)` 不变(子件本地全幅 draw_rect,圆心 = CellUnit 本地 `(edge/2, edge/2)` = 逻辑格心);**不随岩顶 −ESHIFT/−LIFT 偏移**(art-bible v3.51 §3.2/§8.2);环径/环壁/十字/光圈比例不变;验收 `ring_px` 仍 82%±1。封印子件设 `show_behind_parent = true`,保证身份色牌叠于法阵之上;封印格地面受光棱石由 `board_terrain_layer` back 画(T3)。
|
||||
- [ ] 类型微光:绘制 rect 改顶面 rect;`board_shot_probe`/`type_glow_shot_probe` 的「禁越圈」允许区改顶面 rect;微光不越出本格岩顶。
|
||||
- [ ] 迷雾:`CellUnit._draw_fog_layer` 墙格画三块黑罩(顶面 rect+南面 `Rect2(x-ESHIFT,y-LIFT+cell,cell+ESHIFT,LIFT)`+东面 `Rect2(x-ESHIFT+cell,y-LIFT,ESHIFT,cell+LIFT)`;只在未开格);记忆态由固定名字低层子件 `MemoryGround` 画新地面色(palette floor)+灰罩+记忆墨数字,不读 `base.tex_base`,不生成浮空 entries;只绘地面可见区(扣南/东邻岩顶越入),不覆盖北/西邻格地面;封印格在记忆态同样随格隐没(印记与色牌不显)。
|
||||
- [ ] 接触带:绘制迁入固定名字低层子件 `ContactGlow`(全局 z=-1:地面之上、阴影圆 0 之下);`board_view._apply_contact_bands`/`_process`/`_reset_breath` 改调 `ContactGlow.set_bands(bands, corners, color, ground_visible_rect)`,不再经 `u.base.contact_*`;只画英雄格地面侧,正交整边/斜向角点+两半边;只绘地面可见区(扣南/东邻岩顶越入);`_contact_unit` rect 不改;光不进岩体。
|
||||
- [ ] `board_terrain_test.gd:_test_top_face_anchor`:**封印圆心 = 逻辑格心(不偏移)**、变异纹带/微光 rect 按 `-ESHIFT/-LIFT`;`_test_seal_substrate`:封印格地面像素 = 本关 `palette.light_edge`、普通已开格 = `palette.ground`;封印格 `plate=true`、`glyph` 为危/数字、无浮空 entries/无阴影圆;封印格 `z_index=0`;`_test_fog_rect`:墙格三块黑罩覆盖顶面+南+东、地面格不越格;采样北邻格左上 (x_n+2,y_n+2) 与西邻格左上 (x_w+2,y_w+2) 的非岩顶地面像素 = 原地面色、零黑罩(岩顶投影可越入邻格屏幕区);`_test_memory_cover`:记忆态格与南邻墙体重叠区采样,`MemoryGround` 只绘地面可见区,记忆地面/灰罩/记忆墨与 `removed_dim` 不覆盖南邻岩顶(重叠区像素来自南邻墙体);`_test_contact_glow`:接触带只绘地面可见区、在英雄格地面侧且全局 z=-1。
|
||||
- [ ] 跑 `seal_mark_params_test`/`type_glow_test`/`board_terrain_test`;报告写读数。
|
||||
|
||||
### T6 旧瓦片与旧路径退役(0.5 日)
|
||||
|
||||
**取用**:T3/T4/T5 绿。
|
||||
**产出**:63 PNG+63 `.import` 删除;`tile_palette.gd`/`terrain_tile_sets_test.gd` 删除;`player_copy_sweep_test` 落牌断言替换;`ui_contrast_probe` 迷雾派生段替换。
|
||||
|
||||
- [ ] 删除 `game/assets/art/board/terrain_*` 63 PNG 与同名 `.import`;保留 `seal_mark.png`+`.import`。
|
||||
- [ ] 删除 `tile_palette.gd`、`terrain_tile_sets_test.gd`;`run_all.gd` 移除该套件;`board_view.gd`/`board_world.gd`/`ui_contrast_probe.gd` 的 `TilePalette` 引用全清。
|
||||
- [ ] `player_copy_sweep_test.gd:142-147`:普通已开危险格 `u.plate==true` 改 `u.plate==false`,并断言浮空 entries 含该格(或 `label_metrics()` 有该格);封印格色牌断言归 `board_terrain_test._test_seal_substrate`;`ui_contrast_probe._fog_derived_check` 改读 `board_terrain_palette` 的新地面/岩顶色或渲染帧取样,三行行值按新地面色重算(±2/255),删除旧瓦片均值段。
|
||||
- [ ] `board_terrain_test.gd:_test_legacy_assets_absent`:目录无 `terrain_*`、`seal_mark.png` 在库;源码 grep 零 `terrain_`/`TilePalette`/`CellBaseLayer`/`u.base`。
|
||||
- [ ] 跑 `repo_structure_audit.py`、`capability_audit.py` 与 `board_terrain_test`;报告写清单;旧地形行**保留**(实现批禁写 `game/tests/README.md`;删除归写卡段后续,T8 audit 经卡内豁免通道绿)。
|
||||
|
||||
### T7 验收面换代与三关 golden(1.0 日)
|
||||
|
||||
**取用**:T3–T6 全绿。
|
||||
**产出**:`board_shot_probe` 视图 1036×548、侧栏 200、顶面 rect 微光圈/封印 rect;三关 golden 重制;渲染闸绿;`type_glow_shot_probe`/`layout_probe`/`ui_input_probe`/`ui_contrast_probe` 换代;三关色板逐值/互辨。
|
||||
|
||||
- [ ] `board_shot_probe.gd`:`view.size=Vector2(1036,548)`、`view.position=Vector2.ZERO`;`view.rebuild(..., 200)`;`_meta` 写全幅 rect;`_crop_cell` 用 `_visual_rect_for` 的屏幕换算;`_check_dual_frames` 的允许区改顶面 rect(用 `lift_for/eshift_for` 换算);**`_seal_evidence` 保持逻辑格 rect(封印居格心),选择器按迭代56后的 `has_seal` 口径**;注释与 `game/tests/golden/README.md` 口径一致。
|
||||
- [ ] `type_glow_shot_probe.gd:64-78` 视图改 1036×548、`rebuild(..., 200)`(与生产同格边 38),允许区/取样改顶面 rect;`layout_probe.gd` 的 `_cell_for` 带侧栏;`ui_input_probe.gd` 的恢复调用带侧栏;`ui_contrast_probe` 浮空四类底段与迷雾段换代。
|
||||
- [ ] 跑一次渲染闸看差异(预判棋盘三图全幅 changed>0,属换代);**显式呈报用户,按 `game/tests/golden/README.md` 现行口径获用户确认后**再按 `tools/golden_baseline_refresh.sh` 重制三关基线;复闸绿。
|
||||
- [ ] 三关色板逐值核对:`board_terrain_test.gd:_test_palette_three_boards` 与 art-bible v3.51 §4.1 三关八色同值(用户 2026-11-07 已看样张冻结);`glow_discrimination_sheet.py` 读已删旧 `terrain_*`,本批不跑,工具换代登记待办(tools 批);不过即停卡呈报,不调色绕过。
|
||||
- [ ] 跑 `bash tools/run_all_gates.sh --code`;报告写 smoke/unit/probe/render 读数。
|
||||
|
||||
### T8 产出物落位(0.5 日)
|
||||
|
||||
**取用**:T7 全绿。
|
||||
**产出**:`reports/iter<N>-实现报告-<日期>.md`(各卡状态+实机目检总清单+遗留读数义务+实现决定记录);`reports/iter<N>-反哺点-<日期>.md`(§6 每条同步面的落点);本卡验收对照表逐行勾选。
|
||||
|
||||
- [ ] 实现报告写 T0–T7 状态、三关实机目检清单、draw calls/格边/原点/锚点读数、旧资产删除清单、三关色板读数。
|
||||
- [ ] 反哺点清单逐条列 §6 各行的落点:已同步的写“无新增”,实现偏差写“待文档批裁决”,架构表 `cell_base_layer` 行写“待用户发令修订”。
|
||||
- [ ] 验收对照表 §12 每行勾选;未过行标红并停卡,不合并。
|
||||
- [ ] 独立验收审计(未参与实现的会话/子代理)按 `test-conventions §8.7` 跑;报告落 `reports/iter<N>-验收审计-<日期>.md`;未过不合并。
|
||||
- [ ] 复跑 `capability_audit.py`(红项 0)与 `pipeline_gate.py`(卡片自身零红);能力表名实一致(旧地形行为保留行,不参与核对;删除归写卡段后续)。
|
||||
|
||||
---
|
||||
|
||||
## 12. 验证闸(改动—验收对照表)
|
||||
|
||||
> 层级:单元/接口/集成/探针;真实入口列写实际驱动面;判据绑定面写被测改动特有的可观测面;能力行名称与 `game/tests/README.md` 同批入表。
|
||||
|
||||
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+通过判据) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 1. D 区侧栏+提示条退役(判据:`design/ux/battle.md:124`、`design/gdd/systems/表现与支撑/HUD框架.md:62`) | `battle_layout_table.gd`、`battle_layout.tres`、`ap_bar_view.gd`、`board_zone_view.gd:23-37,74-79,91-92` | `board_side_rail_test.gd:_test_side_rail_layout`+`_test_signals`;`stage_background_test.gd:_test_side_rail_width_from_table`;`layout_probe.gd:_ready` | 单元+探针 | `BoardZoneView.new(layout)`→`ap_bar`/`_board_area`(测试读私有) | 左/右栏各宽 200、board_area 高 548、`side_rail_w==200`、hint 节点不存在、toast 不压棋盘 | 新增:D 区行动资源侧栏(AP 左栏、RAP 右栏、全高棋盘) |
|
||||
| 2. 格边/原点/顶预留/重建接线(判据:`design/ux/battle.md:140,144`) | `board_view.gd:205-232,403-404,428-439`、`main.gd:470`、`main_debug_flow.gd:104` | `board_terrain_test.gd:_test_cell_formula_base`+`_test_hit_test_logical_rect`;`layout_probe.gd:_ready`;`ui_input_probe.gd` | 单元+探针 | `BoardView.set_cell_area(Vector2(1036,548), 200)`/`rebuild(..., 200)` | `_cell_for(12, Vector2(1036,548), 200)==38`、`_cell_for(14, Vector2(1036,548), 200)==32`、局部原点 (279,44)/(281,44)、屏幕 (523,296)、全格命中 | 新增:棋盘点击命中与格边公式(逻辑格矩形) |
|
||||
| 3. 合并岩体+连续地面(判据:`design/art/art-bible.md:170,173`) | `board_terrain_layer.gd`(新增)、`board_view.gd`、删 `cell_base_layer.gd` | `board_terrain_test.gd:_test_merged_mass_geometry`;`standee_present_values_test.gd:_init`(V11 源码锚改指 `board_terrain_layer.gd`);三关 `board_shot_probe` 截图 | 单元+探针 | `BoardView.rebuild()`→`_world/TerrainBack`、`_world/TerrainFront` 的 `mass_rects()` | 四邻合并、相邻墙顶搭接 2、无墙顶内框、地面无缝、板边外延 ESHIFT;V11 口沿高光新锚在位且全套件绿 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
|
||||
| 4. 投影/崖面/受光(判据:`design/art/art-bible.md:171,172,174`) | `board_terrain_layer.gd` | `board_terrain_test.gd:_test_projection_ratios`;三关 golden | 单元+探针 | 同上 | 38 格 LIFT=17、ESHIFT=4、南崖 17×42、南崖顶缘高光=本关受光棱、东崖 4×55、北/西 2+2+外2、南/东内阴影 3×2 自 0.217 起、投影 4×4 α0.44/0.30/0.16/0.07 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
|
||||
| 5. 脚底排序遮挡(判据:`design/art/art-bible.md:175`) | `board_terrain_layer.gd`、`board_world.gd:39,48` | `board_terrain_test.gd:_test_depth_order`;三关截图 | 单元+探针 | 构造 hero 行与南邻墙;`terrain_metrics()["order"]`/`CellUnit.z_index` | back 含脚底≤hero 的岩体、front 含 >hero 的岩体;北侧格件 z=0、南侧格件 z=3、**封印格(含南侧)z=0**、`ContactGlow`/`MemoryGround` 全局 -1;南岩体覆盖小人脚底像素 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
|
||||
| 6. 浮空字+阴影圆几何/对比(判据:`design/art/art-bible.md:176`、`design/ux/battle.md:307`) | `board_float_layer.gd`(新增)、`board_label_shadow_layer.gd`(新增) | `board_float_label_test.gd:_test_label_geometry`+`_test_shadow_circle`+`_test_contrast`;`ui_contrast_probe.gd` 浮空字段 | 单元+探针 | `BoardView.refresh()`→`FloatLayer.set_entries()`/`_world/LabelShadow.setup()` | 字高 21、间距 15、视觉顶 38、线 2、1px 投影;圆 10×6、圆心格顶+7、z=0 低于 hero;**封印格无 entries/无圆**;四类底复合对比 ≥4.5 | 新增:棋盘浮空数字与引导线(最顶层、顶部预留) |
|
||||
| 7. 浮空层最顶/顶行不裁切(判据:`design/ux/battle.md:165,307,313`) | `board_view.gd` 层装配、`board_float_layer.gd` | `board_float_label_test.gd:_test_topmost_layer`+`_test_desaturation`;三关截图 | 单元+探针 | `BoardView` 固定名字子件 z 序与 entries/`set_desaturated()` | `FloatLayer` 为 BoardView 子 Control、z 最高;`TerrainBack`/`TerrainFront`/`LabelShadow` 固定名字在树;顶行 rect top=6 local;无元素遮数字/线;结算期浮空层与地形层同拍灰化 | 新增:棋盘浮空数字与引导线(最顶层、顶部预留) |
|
||||
| 8. 顶面锚点/封印/交互(判据:`design/art/art-bible.md:167,175`、`design/ux/battle.md:311-312`) | `board_view.gd`、`cell_mark_overlay.gd`、`seal_mark_layer`、`cell_type_glow_layer`、`board_cell_unit.gd` | `board_terrain_test.gd:_test_top_face_anchor`+`_test_seal_substrate`;`seal_mark_params_test.gd`;`type_glow_test.gd` | 单元+探针 | `BoardView.refresh()`→`CellUnit.visual_rect`/`CellUnit.z_index`/封印格 `plate` | **封印圆心=逻辑格心(不偏移)**、变异/微光/墙格悬停按 -ESHIFT/-LIFT;地面路径按逻辑 rect;环径 82%±1;封印格 `plate=true`、`glyph` 为危/数字、无浮空/无圆、色牌叠法阵上;封印格 z=0 低于小人,其余格件北 0/南 3 | 新增:棋盘顶面锚点与迷雾几何(微光、变异岩顶偏移,封印格心) |
|
||||
| 9. 迷雾几何/记忆态(判据:`design/art/art-bible.md:427-429`) | `board_cell_unit.gd:_draw_fog_layer`/`MemoryGround`、`board_view.gd` | `board_terrain_test.gd:_test_fog_rect`+`_test_memory_cover`;`ui_contrast_probe.gd` 迷雾段;`type_glow_test.gd` | 单元+探针 | `BoardView.refresh()`→`CellUnit.fog_state`/`MemoryGround` | 墙格三块黑罩(顶面+南+东)覆盖、北/西邻格非岩顶地面像素零覆盖(岩顶投影可越入邻格屏幕区);地面格不越格;记忆态/退色不覆盖南邻岩顶(`MemoryGround` 只绘地面可见区,重叠区像素来自南邻墙体);封印格记忆态随格隐没;封印格地面=palette.light_edge;记忆态无浮空 entries;记忆墨对比 ≥4.5 | 新增:棋盘顶面锚点与迷雾几何(微光、变异岩顶偏移,封印格心) |
|
||||
| 10. 命中逻辑格(判据:`design/ux/battle.md:140`) | `board_view.gd:428-439` | `board_terrain_test.gd:_test_hit_test_logical_rect` | 单元 | `BoardView.cell_center_local()`/`_cell_at()` | 全格 `_cell_at(cell_center_local(c))==c`;顶面左上角点按逻辑归北/西邻格;板外 (-9,-9) | 新增:棋盘点击命中与格边公式(逻辑格矩形) |
|
||||
| 11. 旧资产退役/普通数字零底牌(判据:`design/art/art-bible.md:177,215`) | `game/assets/art/board/`、`tile_palette.gd`、`cell_base_layer.gd`、`terrain_tile_sets_test.gd` | `board_terrain_test.gd:_test_legacy_assets_absent`;`board_float_label_test.gd:_test_no_ordinary_plate_path`;`repo_structure_audit.py` | 单元+静态 | 扫描 `game/assets/art/board/` 与源码 | 零 `terrain_*`、零 `TilePalette`/`CellBaseLayer`/`u.base`、`seal_mark.png` 在库、普通数字零 `plate_digit`/`_digit_ink_mode`(封印格 `plate`/`DIGIT_PLATE` 为唯一例外) | 新增:旧瓦片退役与普通数字零底牌 |
|
||||
| 12. 侧栏信号/setter(判据:`design/ux/battle.md:163`) | `ap_bar_view.gd` | `board_side_rail_test.gd:_test_signals` | 单元 | 真实按钮 `pressed`/setter | `stop_pressed`/`refresh_confirmed`/`legend_toggled` 逐信号;`set_ap`/`set_rap`/`set_refresh_state` 读数 | 新增:D 区行动资源侧栏(AP 左栏、RAP 右栏、全高棋盘) |
|
||||
| 13. 接触带延续(判据:`design/art/art-bible.md:168`) | `board_cell_unit.gd`、`board_view.gd:740,764-765` | `board_terrain_test.gd:_test_contact_glow`;`type_glow_test.gd` | 单元 | `BoardView.refresh()`→`ContactGlow.set_bands(..., ground_visible_rect)` | 英雄格地面侧接触带在位,正交整边/斜向角点+两半边,只绘地面可见区、不进岩体;全局 z=-1 | 既有:未开格类型微光(8 邻作用集、五组色相、零玩法写入) |
|
||||
| 14. 三关色板/互辨(判据:`design/art/art-bible.md:202,415`) | `board_terrain_palette.gd` | `board_terrain_test.gd:_test_palette_three_boards` | 单元+静态 | `palette_for("dungeon"/"underdark"/"deep_underdark")` | 三关八色与 art-bible v3.51 §4.1 逐值一致;三关同名槽位不全等(用户过审样张冻结);不变槽恒定;封印石读 `light_edge` | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
|
||||
| 15. 取证面换代(判据:`game/tests/golden/README.md:28,31`) | `board_shot_probe.gd`、`type_glow_shot_probe.gd`、`layout_probe.gd`、`ui_input_probe.gd`、`ui_contrast_probe.gd` | 三关 `board_shot_probe`+渲染闸;`type_glow_shot_probe`;`layout_probe.gd:_ready`;`ui_input_probe.gd`;`ui_contrast_probe.gd` | 探针+渲染闸 | `res://probe/board_shot_probe.tscn`;`tools/render_gate.sh` | 视图 1036×548、侧栏 200、裁剪全幅、顶面 rect 微光圈、**封印取证保持逻辑格 rect(圆心格心)**、三关 golden 重制后 0 差异 | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) |
|
||||
| 16. 测试入口/能力审计(判据:`design/engineering/test-conventions.md:196`) | `run_all.gd:225`、新增测试件、`game/tests/README.md` | `bash tools/run_all_gates.sh --code`;`capability_audit.py` | 集成 | 单元测试全套件 | 三新套件在册、terrain 套件移除、能力审计红项 0、全绿 | 新增:棋盘合并岩体与连续地面(深度遮挡、投影、崖面) |
|
||||
| 17. 产出物/独立审计(判据:`design/engineering/test-conventions.md:147`) | `reports/` | 末卡产出物落位;`reports/iter<N>-验收审计-<日期>.md` | 集成 | 实现报告/反哺点清单/审计报告 | 三件齐、逐行勾选、审计未过不合并 | 既有:战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) |
|
||||
|
||||
**测试削弱申报**(允许删除/替换的旧断言):
|
||||
|
||||
- `terrain_tile_sets_test.gd` 整件删除(旧瓦片套/三态墨色已退役);其“格套完整性/色相域/墨模式”覆盖由 `board_terrain_test`/`board_float_label_test` 接班。
|
||||
- `ui_contrast_probe.gd` 旧瓦片均值段与 `_fog_derived_check` 的 TilePalette 依赖删除;改为读新 palette/渲染帧,浮空字四类底段新增。
|
||||
- `stage_background_test.gd` 新增 `_test_side_rail_width_from_table`(该件无旧 AP 条高度测试可改名),等价断言 `side_rail_w==200`;`player_copy_sweep_test.gd:142-147` 的普通已开危险格 `u.plate==true` 改 `u.plate==false`+浮空 entries 含该格(封印格色牌保留,归 `_test_seal_substrate`)。
|
||||
- `board_view.gd` 的 `_paint_cell_base`/`_paint_cell_facade` 段随基座退役(其立面/投影/蓝框覆盖由 `board_terrain_test` 的岩体/崖面/接触带断言接班);`u.base.*` 无残留。
|
||||
- `standee_present_values_test.gd:79-86` 的 `cell_src` 源码锚由 `cell_base_layer.gd` 改指 `board_terrain_layer.gd`(旧口沿高光绘制点随基座退役,等价断言改新落点);`body_src` 的 V11 断言保留。
|
||||
- `board_shot_probe.gd` 的 900×900 视图与逻辑格“禁越圈”允许区替换为 1036×548 与顶面 rect;加严口径本身不删、不放宽。
|
||||
- 其它旧断言禁止删除/放宽;未申报的删除由独立验收审计判红。
|
||||
|
||||
**判据绑定面口径**:所有行为行都绑被测改动特有的可观测面(绘制 rect/z 序/常量/信号/读数);`board_terrain_test` 的地形断言读 `mass_rects()`/`terrain_metrics()`,不读私有 `_draw` 内部;浮空断言读 `label_rects()`/`label_metrics()`/`circle_rects()`;侧栏读公开 setter/信号;golden 绑渲染帧。
|
||||
|
||||
---
|
||||
|
||||
## 13. 异常分级
|
||||
|
||||
- **L1 自救**:测试环境缺 `user://`、字体、导入缓存——按 `game/tests/README.md` 现行坑册处置。
|
||||
- **L2 记录继续**:三关色板派生读数偏差在 ±1 通道内、draw calls 波动 <10%——记入实现报告继续。
|
||||
- **L3 停机呈报**:
|
||||
- 新路径与 art-bible 条款冲突(比例/顶预留/圆心/层序/三关色板/封印承载任一不符)——停卡,列反哺点,禁自行改条款。
|
||||
- 封印呈现与迭代56「受理即揭示」或 art-bible v3.51 封印条冲突(印记落未开格、圆心随岩顶偏移、身份字形进浮空层、色牌层序颠倒、封印石对比 <4.5)——停卡呈报,禁把封印改回旧假设。
|
||||
- `board_terrain_layer` 超 7 公开方法/12 成员且按职责拆不出内聚单元——停卡走豁免/还债通道,禁凑数拆绿。
|
||||
- 机检键与卡片契约互斥(如测试要求保留 `plate` 字段)——停卡呈报,禁为机检保留无效成员。
|
||||
- 三关色板逐值/互辨不过——停卡呈报,禁调色绕过或改判据。
|
||||
- 三关 golden 重制后仍有非预期差异——停卡,先判有效/失效,禁“重制一下就绿”。
|
||||
- 迷雾黑罩覆盖北/西邻格地面——停卡,按三块形状修正,禁扩大/缩小判据掩盖。
|
||||
- 固定名字层子件(`TerrainBack`/`TerrainFront`/`LabelShadow`/`FloatLayer`)在 `rebuild`/换板后出现重名、丢失或被清场误删——停卡,按固定名字表修正,禁改成 BoardView 成员绕过 S13。
|
||||
|
||||
---
|
||||
|
||||
## 14. 代拍板白名单
|
||||
|
||||
允许实现期自行拍板(超清单记入实现报告「实现决定记录」):
|
||||
|
||||
1. `board_terrain_layer` 内 back/front 两实例的精确 z 值(只要满足 back<hero<front、float 最高、阴影圆 0)。
|
||||
2. 程序化材质噪声的确定性哈希种子与采样频率(同板同参逐位复现;禁 RngService/自建 RNG;三关可辨、不出现逐格拼缝)。
|
||||
3. 阴影圆四层 α 在 ±10% 内的微调与同心椭圆收缩比例(只要落样张轮廓、圆在格面、小人之下)。
|
||||
4. 侧栏按钮的纵向间距与面板内边距(只要左右栏各 200、不压棋盘、不换位)。
|
||||
5. 记忆态灰罩的绘制方式(只要不出现浮空层、对比 ≥4.5、地面色取 palette)。
|
||||
6. 测试夹具的构造方式(直接 `new()` 或场景实例化,只要走真实入口)。
|
||||
7. 记忆态地面/灰罩/记忆墨拆入低层子件的具体绘制顺序(只要不覆盖南邻岩顶、对比 ≥4.5)。
|
||||
8. 封印石贴片的收边方式(整格或内缩 0–1px、是否加 1px `palette.seam` 收边)——只要不越格、对比 ≥4.5、零新增色。
|
||||
|
||||
---
|
||||
|
||||
## 15. 待裁点
|
||||
|
||||
零待裁点。已裁记录:①underdark/deep 两关色板 2026-11-07 用户看方向样张后选「按目标八色冻结」;②棋盘底操作提示条退役 2026-11-07 用户选定;③合并 master 时与迭代56已闭合的封印改版对齐(用户 2026-11-07 已裁「封印受理即揭示」)——本卡承接其呈现面:已揭示地面格心+身份色牌+受光棱封印石承载(新地面 `#695038` 对封印黑仅 2.35–2.98:1,受光棱 6.45–9.94:1,保 art-bible ≥4.5 判据,零新增色);法阵参数/揭牌逻辑沿迭代56。开工门=U0(用户批卡);U0 前不写实现代码。
|
||||
|
||||
---
|
||||
|
||||
## 16. 复核记录
|
||||
|
||||
| 轮次 | 复核者身份 | 发现 | 去向 | 处置结果 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | 未参与本卡撰写的只读子代理(独立复核,2026-11-07) | 改 `ApBarView` 类名/删 `ap_bar` 字段的波及未列、照卡会编译失败 | 自判 | 保留 `ApBarView` 类名与 `ap_bar` 字段名,只改布局职责;文件结构/预检同步 |
|
||||
| 1 | 同上 | 能力表同批未闭合:capability_audit 4 红、新增实为 6 条非 5 条 | 补写 | README 恢复旧地形行至 T6、修真实入口 `类.方法()`、覆盖表换新能力;audit 复跑 |
|
||||
| 1 | 同上 | 同步面漏 HUD框架(AP 条/高度口径/字号 18/旧能力行) | 补写 | §6 增 HUD框架行;HUD 文档同步 D 区/高度/21px/提示条退役 |
|
||||
| 1 | 同上 | 旧瓦片均值派生 underdark/deep 与旧套退役冲突 | 待裁 | 用户 2026-11-07 选「先补两关样张再写卡」,看样张后裁「按目标八色冻结」;art-bible §4.1/§6.3 写入 |
|
||||
| 1 | 同上 | 浮空字漏 1px 投影、崖面/棱/内阴影/投影 α 不完整 | 补写 | §1/§2/§12 行4 与 battle 像素判据补齐(1px 投影、2+2+外2、3×2 α、4×4 α、东崖 55) |
|
||||
| 1 | 同上 | 阴影圆放 z=4 浮空层会盖小人 | 补写 | 拆 `board_label_shadow_layer`(z=0,小人之下);浮空层只画数字/线;art-bible/battle 层序同步 |
|
||||
| 1 | 同上 | 层序未闭合、CellUnit z=0 会被 front z=2 盖、`rebuild` 清子件生命周期、`board_world` 悬崖二选一 | 补写 | 明确 terrain back=-1/front=2、cell=3、hero=1、阴影圆=0;`rebuild` 重挂两层;BoardWorld 悬崖保留 z=0 |
|
||||
| 1 | 同上 | 删 `cell_base_layer` 后接触带无承接 | 补写 | T5 明确接触带迁入 `CellUnit._draw`,只画英雄格地面侧;`_test_contact_glow` |
|
||||
| 1 | 同上 | 合并岩体下迷雾几何未定,顶面黑罩会压邻格 | 自判 | 按 art-bible「区外未开格全黑」与抬升形状定为顶面+南+东三块;测试断言北/西邻格地面像素零覆盖(岩顶投影可越格) |
|
||||
| 1 | 同上 | `visual_rect_for` 宽高未给、封印 offset 无来源、悬停/路径偏移无设计句 | 补写 | 定义私有 `_top_face_rect`/`_visual_rect_for` 精确 Rect2;CellUnit `top_face_offset` 下发 seal/glow;battle 增悬停/路径 rect 行 |
|
||||
| 1 | 同上 | 判据锚/入口错:`BoardView.paint()` 不存在、`cell_origin==(523,44)` 混用、`_cell_for(12,548,200)` 第二参非 Vector2、顶面左上角归本格必错 | 补写 | 改 `refresh`;局部原点 (279,44)/屏 (523,296);`_cell_for(12, Vector2(1036,548), 200)`;顶面左上角按逻辑归北/西邻格 |
|
||||
| 1 | 同上 | 预算与步骤冲突:新增 `set_side_rail_w`/`visual_rect_for` 公开方法、10 个公开函数、`paint`/`_build_stop` 无调用点、两套件未注册 | 补写 | 改为 `set_cell_area`/`rebuild` 可选参 + 私有 rect;预算改 10 公开函数/13+2 成员;T1 补 run_all 注册;去掉不存在调用点 |
|
||||
| 1 | 同上 | 既有验证面漏 `type_glow_shot_probe`、`board_shot_probe._seal_evidence` | 补写 | T7/§7/§12 行15 增两件;允许区/取样改顶面 rect |
|
||||
| 1 | 同上 | 测试削弱未申报:`player_copy_sweep_test:145` 的 plate、`ui_contrast_probe` 迷雾派生段、Color8 静态段 | 补写 | §12 削弱申报列两处;T6 改断言/改 palette 读取;palette 用 `Color("#...")` |
|
||||
| 1 | 同上 | 程序化噪声“种子”未定源,可能触 RNG 单点 | 补写 | §4 契约 13/白名单 2 改确定性坐标哈希,禁 RngService/自建 RNG |
|
||||
| 1 | 同上 | 拆分边界未写判据权威 code-conventions §1.1、四条款无引用 | 补写 | §10 补权威与四条款 |
|
||||
| 1 | 同上 | golden 重制权限冲突(README 需用户确认 vs 脚本头注可自换代) | 自判 | 按较严的 golden README:T7 显式呈报并获用户确认后才重制 |
|
||||
| 1 | 同上 | 现状读数 `AP 44+棋盘区 504` 未扣 VBox 间距/hint;待办/roadmap 状态与卡不符 | 补写 | T0 改实读 board_area/cell(禁预设 504/37);§3 补 hint 行;状态推进由编排/收尾段做 |
|
||||
| 1 | 同上 | 新层 setter 未写 `queue_redraw`;10×6 圆不能用 `draw_circle` | 补写 | T3/T4 每 setter 调 `queue_redraw()`;圆用 `draw_set_transform` 缩放/椭圆多边形 |
|
||||
|
||||
| 轮次 | 复核者身份 | 发现 | 去向 | 处置结果 |
|
||||
|---|---|---|---|---|
|
||||
| 2 | 独立只读子代理(第二轮定向复核,2026-11-07) | BoardView 计划新增 4 个层成员(31+4=35),与契约 15/S13 基线「只降不升」冲突 | 补写 | 层改固定名字子节点(`_world/TerrainBack`、`_world/TerrainFront`、`_world/LabelShadow`、壳层 `FloatLayer`),经 `get_node_or_null` 取用,零新增成员;`rebuild` 跳过三层 |
|
||||
| 2 | 同上 | `ap_bar_view.gd` 实际 14 个成员,计划加 2 个 PanelContainer=16,预算表写 13+2≤15 | 补写 | 左右栏容器改 `_init` 局部变量,成员保持 14;§9/T1 同步 |
|
||||
| 2 | 同上 | `standee_present_values_test.gd:79-86` 读 `cell_base_layer.gd` 源码作 V11 断言,删件后断源未申报 | 补写 | §7 增该测试行;T3 改源码锚到 `board_terrain_layer.gd`;§12 行3/削弱申报同步 |
|
||||
| 2 | 同上 | 引证落点错:`board_cell_unit.gd:91-98` 是 `_draw` 不是 z_index;`board_shot_probe.gd:14-16` 不支撑 900×900 | 补写 | §3 改「`board_cell_unit.gd` 全文无 `z_index` 赋值」;探针证据改 `:112` |
|
||||
| 2 | 同上 | `type_glow_shot_probe.gd:78` 的 `rebuild` 未获侧栏参,900px 下 clampi 到 46,与生产格边不一致 | 补写 | T7/§7 改视图 1036×548、`rebuild(..., 200)` |
|
||||
| 2 | 同上 | §12 行1 真实入口写 `board_area`(实为私有 `_board_area`) | 补写 | 改 `ap_bar`/`_board_area`(测试读私有) |
|
||||
| 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 | 写卡会话自查(第二轮同轮) | 另立 `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 层序同步 |
|
||||
| 2 | 同上 | `board_view.gd` 仍写 `u.base.*`(`_paint_cell_base`/`_paint_cell_facade`/`_apply_contact_bands`/`_process`/`_reset_breath`/`_build_cell_unit`),删件后报错 | 补写 | T3/T5 明列删除/改调 `ContactGlow`;§12 削弱申报;`_test_legacy_assets_absent` 覆盖 |
|
||||
| 2 | 同上 | `stage_background_test.gd` 无 `_test_ap_bar_height_from_table`,「改名」无源 | 补写 | T1/§7 改「新增 `_test_side_rail_width_from_table`」 |
|
||||
| 2 | 同上 | `glow_discrimination_sheet.py` 读已删旧 `terrain_*`,T7 抽测必断 | 补写 | T7/§12 行14 改 palette 逐值+过审样张;工具换代登记 tools 批 |
|
||||
| 2 | 同上 | T6 删 README 旧地形行违 §4-10 禁写 | 补写 | 旧行保留,删除归写卡段后续;T6/T8/§6 同步 |
|
||||
| 2 | 同上 | art-bible §6.5 旧 `_normalize_floor_luma`、assets-checklist 色牌未退 | 补写 | art-bible v3.50 §6.5 改新 palette;checklist 三处色牌退役 |
|
||||
| 2 | 同上 | T1 `_build_stop` 不存在 | 补写 | 改 `_build_ap_face`(含停手) |
|
||||
| 2 | 同上 | T3/T4 未注册 terrain/float 套件 | 补写 | T3/T4 增 run_all 注册 |
|
||||
| 2 | 同上 | T5 接触带写 `CellUnit._draw` 与 T3 低层子件矛盾 | 补写 | 统一 `ContactGlow` 子件,BoardView 三处改调 |
|
||||
| 2 | 同上 | §12 行13 art-bible:167 应为 168 | 补写 | 改 168 |
|
||||
| 2 | 同上 | §12 行16 battle:298 不支撑审计 | 补写 | 改 test-conventions:196 |
|
||||
| 3 | 独立只读子代理(第三轮定向复核,2026-11-07) | §12 行2 `_cell_for(12,548,200)` 第二参标量 | 补写 | 改 `Vector2(1036,548)` |
|
||||
| 3 | 同上 | §16「第二轮 11 条」与 12 行不符;第二轮表无表头 | 补写 | 改 23 条;补表头 |
|
||||
| 3 | 同上 | §9 `board_cell_unit` 成员数算错(实为 12) | 补写 | 明确 12 成员(删 `plate`/`base`、加两成员,净 0);`ContactGlow`/`MemoryGround` 固定名字不占成员 |
|
||||
| 3 | 同上 | T8 反哺点二分类未含「待用户发令修订」 | 补写 | T8 增该去向 |
|
||||
| 4 | 独立只读子代理(第四轮定向复核,2026-11-07) | 低层子件全局 -1 与 back 地形同 z,仍会盖 back 岩顶/崖面;T3/T5「不覆盖南邻岩顶」在 back 档不成立 | 补写 | T3/T5/§12 行9/13 增「只绘地面可见区(扣南/东邻岩顶越入)」;测试采样 |
|
||||
| 4 | 同上 | `board_cell_unit.gd` 实为 12 个顶层 var,§9 写 12→13 | 补写 | §9/§16 改 12(净 0) |
|
||||
| 4 | 同上 | T7 产出/§13 L3 仍写「三关互辨抽测」 | 补写 | 改「三关色板逐值/互辨」 |
|
||||
| 4 | 同上 | README 旧行仍写「T6 与套件同拍退役」;T8 名实一致无例外 | 补写 | README 改「旧行保留;删行归写卡段后续」;卡 §3/T8 同步 |
|
||||
| 4 | 同上 | §16 补审/第三轮行前空行断表 | 补写 | 去空行并入同表 |
|
||||
| 5 | 独立只读子代理(第五轮定向复核,2026-11-07) | §16 第四轮 5 行前空行断表 | 补写 | 去空行并入同表;复核通过 |
|
||||
| 6 | 写卡会话(合并 master 整合复核,2026-11-07) | master 迭代56已闭合「封印受理即揭示」:印记在已揭示地面+身份字形垫色牌;本卡原写「封印在未开格岩顶+普通数字零底牌」与上游冲突 | 补写 | 全卡改配:封印居已揭示地面格心(不随岩顶偏移)、`plate` 保留且仅封印格为真、字形不进浮空层、封印格 z=0 低于小人;§1/§3/§4-3/§4-16/§5/§7/§9/T3/T4/T5/T7/§12 行8/9/11 同步;art-bible v3.51/battle.md/术语表/checklist 同步 |
|
||||
| 6 | 同上 | 新连续地面 `#695038` 对封印黑仅 2.35–2.98:1,低于 art-bible ≥4.5 判据;旧裸土 `#B39A78` 随旧地板退役 | 补写 | 封印格地面铺本关受光棱色封印石(6.45–9.94:1,零新增色,读 `palette.light_edge`);art-bible §3.2/§4.1/§8.2、battle.md 封印预览判据、卡 §1-2/§12 行8/§13 同步 |
|
||||
| 6 | 同上 | `game/tests/README.md` 冲突:master 迭代56「结算期零逐行文字与 FX 排播链保持」+旧地形行 vs 本卡新能力行 | 补写 | 合并保留 master 迭代56句与旧地形行(父注「旧行保留」),追加本卡 6 条新能力;能力名改「旧瓦片退役与普通数字零底牌」「棋盘顶面锚点与迷雾几何(微光、变异岩顶偏移,封印格心)」 |
|
||||
| 6 | 同上 | `roadmap.md` 冲突:master 迭代55/56行 vs 本卡旧版(无55/56、旧「二三关棋盘观感」) | 补写 | 保留 master 迭代位/下一步原文,仅把待编池「二三关棋盘观感(待设计+待美术)」替换为「棋盘瓦片与立体表现重做(已写卡,待编排)」 |
|
||||
| 6 | 同上 | 保留 `plate` 后成员预算变化:`board_cell_unit` 12→13;封印石输入给 `board_terrain_layer` 增 `_sealed_at` 成员 | 补写 | §9 改 `board_cell_unit` 12→13(删 base、加两成员、保留 plate);`board_terrain_layer` 成员预算 ≤13;§7/T3/T4 同步 |
|
||||
| 6 | 同上 | 测试面需区分普通数字与封印色牌:`player_copy_sweep_test:142-147`、`_test_no_plate_path`、`_test_top_face_anchor` 原断言把封印色牌一并判零 | 补写 | 普通已开危险格 `plate==false`+浮空 entries;`_test_no_ordinary_plate_path`;新增 `_test_seal_substrate`(封印石/色牌/无浮空/无圆/z=0);§7/T4/T5/§12 同步 |
|
||||
|
||||
第六轮定向复核:通过(第六轮 6 条已处置;合并冲突全部闭合)。
|
||||
@@ -1,26 +1,77 @@
|
||||
# 需求卡片 · 营地场景重排接线
|
||||
|
||||
> 批名:营地场景重排接线 · 日期:2026-11-07 · 验收档:中(布局呈现数据面,无存档/结算传播)
|
||||
> 来源:待办清单「营地场景重排接线——十层新矩形与游戏内终审」条目(2026-11-07 登记,批次移交)
|
||||
> 设计事实源(唯一):[camp-scene-prompts](../design/art/camp-scene-prompts.md) v1.9 §2.3/§3/§5 第 12 条(2026-11-05 与 2026-11-07 用户裁)+[art-bible](../design/art/art-bible.md) v3.48 §6.2(围墙显示矩形与墙脚入土线)+[camp](../design/ux/camp.md) 第 29 行(围墙带 y220–420)+2026-11-07 用户裁原话(墙高 200、顶 y220、门/板跟随、墙脚入土;预览过审 `artwork/2026-11-07-营地接线预览/camp_new_layout_preview_c.png`)
|
||||
> **接管必读**:本卡对应工作已有部分实现落库且未做完。已完成项/未完成项见 §2「写卡时实查基线」;接管人必须先按 §1.3 做 T0 扫描,逐项复核当前 commit 的真实状态,禁按「未做」整批重写,也禁按「已有」跳过核对。
|
||||
> 来源:待办清单「营地场景重排接线——十层新矩形与游戏内终审」条目(2026-11-07 登记,批次移交;**已补回**,状态「已写卡」,见 `待办清单.md`)。
|
||||
> 设计事实源(唯一):[camp-scene-prompts](../design/art/camp-scene-prompts.md) v1.10 §2.3/§3/§5 第 12 条+第 13 条+[art-bible](../design/art/art-bible.md) v3.48 §6.2+[camp](../design/ux/camp.md) 第 29 行+2026-11-07 用户讨论定稿(土线覆盖围墙底与门扇底;最终墙件预览过目;渲染闸与独立审计入场)+2026-11-05 用户裁定的六件落位值。**设计已补录**:六件逐值矩形(dummy/forge/tent/chest/notebook/campfire)已补入 `camp-scene-prompts.md` v1.10 §5 第 13 条(2026-11-08);art-bible §6.2 门扇底同口径仍列反哺点(不阻塞本卡成立)。
|
||||
> 本版任务边界:**只出需求卡片与两条上游缺口补录**(设计文档六件逐值、待办条目);不实现游戏代码、不提交、不合并。实现与提交须用户另行发令。
|
||||
|
||||
## 1. 目标与完成定义
|
||||
|
||||
把营地十层的运行数据换成重排后的新矩形:围墙 (0,220,1280,200)、大门/告示板尺寸不变跟随、其余六件(dummy/forge/tent/chest/notebook/campfire)按 2026-11-05 裁定落位;新围墙件(1280×164,补尖+墙脚入土缺口)入包;布局表几何红线单测与冒烟全绿;游戏内营地图层按新矩形铺底、墙脚无贯通直线。
|
||||
### 1.1 目标
|
||||
|
||||
完成定义:`camp_scene_layout_test.gd` V14 全绿(含新值钉断言)+冒烟测试 exit 0+`palette_check` 围墙对八件零新增色+`path_check` 0 问题;游戏内目检归用户(登记不阻塞)。
|
||||
把营地十层换成重排后的新矩形:围墙 (0,220,1280,200)、大门/告示板尺寸不变跟随、其余六件(dummy/forge/tent/chest/notebook/campfire)按 2026-11-05 裁定落位;围墙最终件(1280×164,补尖+底边入土缺口)入包;**土线同时覆盖围墙底与门扇底**,实机读作插在土里;十层结构不变(不新增图层);最终墙件重新出预览并经用户过目;布局/土线/渲染/独立审计全部有读数;营地屏按 `test-conventions.md:100` 纳入渲染闸 golden 机器面。
|
||||
|
||||
## 2. 现状事实(开工自行复核)
|
||||
### 1.2 完成定义
|
||||
|
||||
- 数据表 [camp_scene_layout.tres](../game/data/tables/camp_scene_layout.tres):wall `texture_rect=(0,261,1280,49)`、gate `(520,250,240,211)`、board `(845,268,130,121)`、tent `(982,520,251,170)`、forge `(40,467,240,193)`、dummy `(340,520,120,180)`、chest `(1097,700,106,90)`、notebook `(818,704,100,66)`、campfire `(560,571,160,149)`;`wall_band=(0,240,1280,70)`;`gate_gap=(520,760)`。
|
||||
- 视图按表建层、`TextureRect.STRETCH_SCALE` 拉伸到矩形尺寸:[camp_scene_view.gd:136](../game/presentation/views/camp_scene_view.gd#L136);子节点序=表序=z 序(同文件头注)。
|
||||
- schema 加载期 fail-fast:validate 入口 [camp_scene_layout_table.gd:15](../game/data/schemas/camp_scene_layout_table.gd#L15);贴图矩形不出画布、命中区不出画布/不侵 y<48/两两不相交、`wall_band` 必须包含 wall 贴图矩形([camp_scene_layout_table.gd:67](../game/data/schemas/camp_scene_layout_table.gd#L67))。
|
||||
- 单测读表动态取值、以关系谓词为主:[camp_scene_layout_test.gd:82](../game/tests/unit/presentation/camp_scene_layout_test.gd#L82)(门扇命中对齐 gate_gap)、`:87`(布告板命中顶落围墙带)、`:77`(篝火命中贴贴图底)。
|
||||
- 包内围墙件仍是旧 1280×49(`game/assets/art/scene/scene_camp_wall.png`);门扇件 240×211 由运行时压扁到矩形高(STRETCH_SCALE,2026-11-07 用户裁「不动美术素材」),无需换件。
|
||||
本批算完成,必须同时满足:
|
||||
|
||||
1. 最终墙件预览已用 `scene_camp_wall_final.png` 重新生成,并经用户过目(U0)。
|
||||
2. 十层 `.tres` 值与 §3 逐字一致;schema 默认值、视图层构建一致;层数仍为 10,bg/wall 仍占 z0/z1。
|
||||
3. 土线(围墙底+门扇底)与过审预览读感一致;底边界不是贯通全宽的直线;门扇底不再单独露直边,也不出现独立灰影;门扇 NORMAL/HOVER/DISABLED 切换后土线仍在。
|
||||
4. 营地单测 V14+新钉值+门扇状态土线保留单测全绿;结构探针 PASS;营地截图的土线机检 PASS;营地屏 camp golden 已冻结并经用户确认;渲染闸全绿。
|
||||
5. 独立验收审计(未参与实现的会话或子代理)通过,报告落 `reports/验收审计-营地场景重排接线-<实现日期>.md`(日期取审计当日)。
|
||||
6. 游戏内终审已登记(用户自排,登记不阻塞);art-status-checklist 的营地行补录事实已列反哺点。
|
||||
7. 代码域闸全绿,远端 CI 对合并提交为绿(跑闸步真跑过);静态扫描零新增红(S11「雷格」已在当前基线修复)。
|
||||
8. 实现报告与反哺点清单写齐;实现报告内含**完成进度扫描记录**(见 1.3)。
|
||||
9. 上游缺口已闭合:设计文档六件逐值已补录(`camp-scene-prompts.md` v1.10 §5 第 13 条);待办清单条目已在册(状态「已写卡」)。编入迭代/开工/提交/合并仍须用户发令。
|
||||
|
||||
### 1.3 完成需求时的完成进度扫描(收口前置,必做)
|
||||
|
||||
**任何卡或批次在宣称完成、写实现报告、请求合并之前,必须先扫描当前仓库的完成进度。未扫描不得宣称完成。**
|
||||
|
||||
- 扫描时以实查为准:已存在的实现也要逐项对照本卡,不因“看起来已有”而跳过;不假设“应该没做”或“应该已经做了”。
|
||||
- 发现缺失、值不一致、素材与卡不符、测试缺读数、文档未同步,一律记为未完成;逐条列缺口,不得用一句“已完成”带过。
|
||||
- 扫描记录写进实现报告,至少含:检查时间、当前 commit、每一项的实查值/实际状态、与卡的差异、结论。
|
||||
- 扫描时点:**T0 开工扫描一次(基线)**;**T4 收口再扫描一次(最终)**。两次都留读数。
|
||||
|
||||
扫描面(逐项勾):
|
||||
|
||||
| 面 | 要读什么 | 完成判据 |
|
||||
|---|---|---|
|
||||
| 布局表 | `game/data/tables/camp_scene_layout.tres` 十层 texture_rect/hotspot、wall_band、gate_gap | 与 §3 表逐字一致;层序不变 |
|
||||
| schema | `game/data/schemas/camp_scene_layout_table.gd` 默认值/注释 | wall_band=(0,220,1280,200);validate 通过 |
|
||||
| 视图 | `game/presentation/views/camp_scene_view.gd` 层构建、`expand_mode`、土线材质、门扇状态材质 | 门扇 138 高生效;土线覆盖墙+门扇底;NORMAL/HOVER/DISABLED 不丢土线;10 层 |
|
||||
| 素材 | `scene_camp_wall.png` 尺寸/色数/柱尖/底边;`scene_camp_gate.png`;`scene_camp_bg.png`;源/包 md5 | 墙 1280×164、不透明 12 色、柱尖完整、底边有缺口、源包 md5 一致;门扇 240×211;背景 1280×800 |
|
||||
| 导入缓存 | `game/.godot/imported/*.ctex` 的 mtime 与 `source_md5` | 与盘上源文件 md5 一致;改素材后已强制重导入 |
|
||||
| 单测 | `camp_scene_layout_test.gd` V14+钉值+门扇状态土线保留 | 全 PASS,exit 0 |
|
||||
| 结构探针 | `ui_struct_probe` camp 段 | PASS |
|
||||
| 渲染/土线/golden | `shot_probe` 营地截图+`check_soil_line`+camp golden+`render_gate.sh` | 土线断言 PASS;camp golden 在位且经用户确认;渲染闸全绿 |
|
||||
| 设计文档 | `design/art/camp-scene-prompts.md` §5 第 6 条/第 13 条、`design/art/art-bible.md` §6.2 | 六件逐值在册(本卡前置);门扇底同口径/240×147 与 138 口径统一属文档批反哺点,不阻塞本卡 |
|
||||
| 审计 | 独立验收审计报告 | 报告在位、发现已闭合 |
|
||||
| 文档/记录 | art-status-checklist、实现报告、反哺点清单、终审登记 | 各自落位;反哺点有去向 |
|
||||
| 仓库红账 | 当前 master 静态扫描/CI | 本卡改动面零新增红;静态扫描 S11 零命中;外部红有处置结论 |
|
||||
|
||||
## 2. 现状事实(开工复核基线,本卡不预写完成结论)
|
||||
|
||||
- 当前分支**已经包含**本卡的部分实现(历史合并所致),且**未做完**。开工先按 §1.3 扫描,按实查值决定“已对/需改/缺件”,禁按“未做”整批重写,也禁按“已有”跳过核对。
|
||||
- 数据表 [camp_scene_layout.tres](../game/data/tables/camp_scene_layout.tres):以 §3 为目标值逐层核对;当前值以实查为准。
|
||||
- 视图 [camp_scene_view.gd:130](../game/presentation/views/camp_scene_view.gd#L130) 按表建层,[camp_scene_view.gd:136](../game/presentation/views/camp_scene_view.gd#L136) 有 `EXPAND_IGNORE_SIZE`;土线材质是本案新增面。
|
||||
- schema 加载期 fail-fast:[camp_scene_layout_table.gd:15](../game/data/schemas/camp_scene_layout_table.gd#L15);`wall_band` 包络校验在 [:59–:62](../game/data/schemas/camp_scene_layout_table.gd#L59-L62)。
|
||||
- 单测 [camp_scene_layout_test.gd:26](../game/tests/unit/presentation/camp_scene_layout_test.gd#L26) 读表动态取值;[:88](../game/tests/unit/presentation/camp_scene_layout_test.gd#L88) 起为 2026-11-07 钉值断言。
|
||||
- 素材:包内 [scene_camp_wall.png](../game/assets/art/scene/scene_camp_wall.png)、[scene_camp_bg.png](../game/assets/art/scene/scene_camp_bg.png)、[scene_camp_gate.png](../game/assets/art/scene/scene_camp_gate.png);尺寸与色数以 T0 实查为准。
|
||||
- **素材源路径**:最终墙件 `scene_camp_wall_final.png` 在主区 `D:/code/g-plan2/artwork/2026-11-07-营地接线预览/`(artwork 不入 git,worktree 无副本);T0 从主区取源,核 md5 与包内一致。
|
||||
- **写卡时实查基线(2026-11-08,worktree 基线 89f4fc78,供 T0 对照,不作完成结论)**:
|
||||
- **已完成(实查)**:`.tres` 十层与 §3 逐字一致;schema 默认 `wall_band=(0,220,1280,200)`;view 有 `EXPAND_IGNORE_SIZE`/`STRETCH_SCALE`;V14 钉值断言在位;包内墙件 1280×164、全色 16(含透明/边缘 alpha)、不透明 12 色,与主区源件 md5 一致;门扇 240×211;背景 1280×800;`bash tests/static_scan.sh` S11 ok。
|
||||
- **未完成(实查)**:土线裁切材质(wall/gate);门扇 NORMAL/HOVER/DISABLED 保土线;土线机检 `check_soil_line`;门扇状态单测 `_test_gate_state_keeps_soil_cut`;camp golden+`render_gate.sh` camp 段+`golden_baseline_refresh.sh --camp`;最终墙件预览 U0;游戏内终审登记;实现报告/反哺点。
|
||||
- **接手动作**:上述均为写卡时点读数,接管人必须按 §1.3 做 T0 扫描复核当前 commit 的真实状态;已存在项逐项对照,不因「看起来已有」跳过;未完成项逐条补,不以一句「已完成」带过。
|
||||
- **导入缓存坑(本会话实证)**:主区曾出现 `.ctex` 停在 11-06、源文件已是 11-07 的旧缓存;旧缓存会让渲染闸拿到旧背景/旧围墙,绿读数无效。改素材后必须 `--editor --quit` 强制重导入,并核对 `source_md5`。
|
||||
- **S11 现状**:worktree 基线 89f4fc78 的 `game/probe/board_shot_probe.gd:34,35` 已是「危险格」;`bash tests/static_scan.sh` 实跑 S11 ok(扫描面 317 个文件)。历史日志里的「雷格」为旧读数,不构成本卡开工门;T3 复跑静态扫描,零新增红。
|
||||
- 待办清单条目已补回(状态「已写卡」);设计文档六件逐值已补录 `camp-scene-prompts.md` v1.10 §5 第 13 条;见头部。
|
||||
|
||||
## 3. 设计契约(违反即返工)
|
||||
|
||||
🔴 逐层锁定值(写进 .tres,值逐字照此):
|
||||
🔴 逐层锁定值(写进 `.tres`,值逐字照此):
|
||||
|
||||
| 层键 | texture_rect | hotspot | hotspot_key |
|
||||
|---|---|---|---|
|
||||
@@ -35,103 +86,193 @@
|
||||
| notebook | (870,515,100,66) | (870,501,100,80) | notebook |
|
||||
| campfire | (560,525,160,149) | (560,594,160,80) | campfire |
|
||||
|
||||
表级:`canvas=(1280,800)`、`hud_band_h=48`、`gate_gap=(520,760)`、`wall_band=(0,220,1280,200)`;层数组序不变(bg,wall,board,gate,dummy,forge,tent,chest,notebook,campfire)。
|
||||
表级:`canvas=(1280,800)`、`hud_band_h=48`、`gate_gap=(520,760)`、`wall_band=(0,220,1280,200)`;层数组序不变(bg,wall,board,gate,dummy,forge,tent,chest,notebook,campfire),**总层数仍为 10**。
|
||||
|
||||
🔴 围墙件:1280×164、RGBA、≤32 色(实测 12 色)、顶行仅柱尖若干列不透明(柱尖补全)、底行全透明(入土缺口 1–7px 低频起伏);源文件=主检出 `artwork/2026-11-07-营地接线预览/scene_camp_wall_final.png`。
|
||||
🔴 围墙最终件:1280×164、RGBA、≤32 色(全色 16 含透明/边缘 alpha;**不透明色实测 12**)、柱尖完整、奶油描边(与既有物件同色)、底边 1–7px 低频起伏透明缺口(按 200 高拉伸后约 1.2–8.5px);显示矩形 (0,220,1280,200),运行时按 200 高拉伸;源文件主区 `artwork/2026-11-07-营地接线预览/scene_camp_wall_final.png` 与包内文件 md5 必须一致(写卡时实查 md5 `328b83fa3a79a97ae3d0c02f5abf4604`)。
|
||||
|
||||
🔴 门扇 hotspot 高 147=贴图 138+底部 9px 余量(沿用旧表「命中比贴图高 9」口径,属实现微决策,见 §9 代拍板)。门扇件不换件:现 240×211 由运行时压扁到矩形(用户 2026-11-07 裁「不动美术素材」;设计文档中「随门洞压扁重画」旧句已在本批改为运行时压扁口径)。
|
||||
🔴 门扇:沿用 240×211,不换件;运行时压扁到矩形 240×138,底压 y420;hotspot 240×147(贴图 138+9px 余量);门扇件底行中心区不透明(写卡时实查:底行局部 x99–143、全局 619–663 不透明,两侧为透明拱边),土线作用于底边中心可见区,两侧透明像素本就透出背景。
|
||||
|
||||
🔴 其余六件的 hotspot 由旧表相对关系同偏移得出(dummy 同贴图;forge y−46/高+46;chest y−46/x−12/宽+24;notebook y−14/高+14;campfire y−46/高 80;board 同贴图 y/高+19)——值已列上表,禁止再自拟。
|
||||
🔴 **土线/入土线(围墙底+门扇底,2026-11-07 用户讨论定稿)**:
|
||||
|
||||
- 目标读感:围墙底与门扇底都不与地面形成直边,边界按低频起伏裁切,裁切处透出背景层同列地面像素;门扇底不能单独露直边加灰影。
|
||||
- 实现形态:在 `CampSceneView` 内新增一个**土线裁切材质**(shader 字符串常量+一个私有应用函数),同时挂到 wall 层与 gate 层;不改 10 层结构、不新增图层、不新增运行时图片素材、不重画门扇件。
|
||||
- 裁切参数:底边基线 y420;起伏带**名义 9px**(基准顶线 411,即基线往上 9px);逐列顶线 `top = 411 + round(2 + 1.5*sin(gx/11.0) + 1.0*sin(gx/29.0+1.3))`,公式摆动后**实际顶线 410–416(裁切深度 4–10px)**;`round` 半值方向按引擎实现,机检容差 ±1;`y ≥ top` 的像素裁掉(透出背景);紧邻裁切口的**最后可见行 `y = top−1` 压暗 0.85**(1px 暗边;`top` 行已被裁掉,压暗它无意义)。
|
||||
- 全局坐标:`gx = UV.x * u_width + u_x_offset`(wall:offset 0、width 1280;gate:offset 520、width 240);`gy = u_y_offset + UV.y * u_height`(wall:220/200;gate:282/138)。不用 `FRAGCOORD`,避免视口缩放/黑边影响。gate 局部 x 经 offset 520 还原成画布全局 x,保证墙与门扇接缝处同一条边界。
|
||||
- 材质与状态:土线材质直接挂 wall/gate 节点的 `material`。gate 的 NORMAL/HOVER **不得把 `material` 置 null**;DISABLED **不得替换成 `_desat_mat`**——土线 shader 内含 `desat` 强度 uniform(默认 0),gate DISABLED 时置 1、NORMAL/HOVER 时置 0;forge/chest 仍走既有 `_desat_mat`。`_apply_disabled` 改为 `_apply_disabled(key: StringName, node: Control) -> void` 以区分 gate;`_apply_state`/`_apply_hover` 的 `node.material = null` 对 gate 改为保留土线材质。wall 无状态切换,材质常驻。
|
||||
- 层序:视图子节点序=表序(bg 0、wall 1、board 2、gate 3、dummy 4、forge 5、tent 6、chest 7、notebook 8、campfire 9);设计 z 层为 wall z1、gate z3、其余物件 z4–z6(同 z 内按表序)。土线是 wall/gate 自身的材质,不新增节点/图层,**10 层不变**;其余物件绘制在 wall/gate 之后,土线不遮物件。
|
||||
- 悬停浮动:gate 既有 1–4px 整像素浮动沿用;土线裁切按节点基准矩形的 UV 计算,浮动时随节点整体移动(读作门扇抬起离土),验收截图取 NORMAL 态;浮动期 1–4px 离土读感不在本卡土线判据内。
|
||||
- 验收:营地截图在墙底与门扇底都能看到同一条起伏边界;边界不是贯通全宽的直线;裁切边界以下首行像素与背景层同列地面像素颜色距离 ≤ 容差,且与墙件不透明色集合的最小距离 > 容差(排除灰影/墙色);接缝 x519/521 的顶线差 ≤1px;门扇底无单独直边/灰影。
|
||||
- 素材与材质关系:围墙件底边 1–7px 缺口保留为素材属性(拉伸后约 1.2–8.5px);运行时土线材质按 4–10px 裁切;最终可见边界取两者**较深者(并集)**,两者都是低频起伏、方向一致,不冲突。
|
||||
|
||||
🔴 **最终墙件预览**:过审预览 `camp_new_layout_preview_c.png` 用的是候选墙 `wall_tipped_preview.png`;实现前必须用最终墙件(主区 artwork `scene_camp_wall_final.png`)重新生成预览(含土线裁切效果,裁切参数与 §3 同源),用户过目后才可开工。预览未过目=U0 未过,停。
|
||||
|
||||
🔴 背景:`scene_camp_bg.png` 1280×800(远景片+地面片拼接),接缝在围墙后;改素材后强制重导入。
|
||||
|
||||
## 4. 范围边界
|
||||
|
||||
做:上表十层数据、围墙件入包、单测新值钉断言(追加,不删旧断言)。
|
||||
不做:门扇/布告板/其余七件素材重出;背景层;土线改为独立代码层(入土效果落在围墙件缺口,零新代码);camp.md/art-bible/camp-scene-prompts 的进一步改写(归文档批)。
|
||||
不收件去向:art-status-checklist 营地行状态更新归文档批(反哺点);游戏内终审归用户(登记不阻塞)。
|
||||
做:§3 十层数据与视图、土线裁切材质与门扇状态材质保留、最终墙件预览、单测/结构探针/土线机检/camp golden/渲染闸、独立审计、实现报告与反哺点。
|
||||
|
||||
不做:重画背景;重画门扇/布告板/其余七件素材;新增第 11 层;新增运行时图片素材(golden 测试基线除外);把土线做成独立图层;直接改 `design/`、根规则文件、`待办清单.md`、`体验验证清单.md`、`game/tests/README.md`(实现批禁写;一律列反哺点);不改 `board_shot_probe.gd`(S11 已在当前基线修复,非本卡面)。
|
||||
|
||||
不收件去向:art-status-checklist 营地行 → 文档批反哺点;门扇底口径/240×147 与 138 口径 → doc-design(六件逐值已补录);待办条目状态 → 登记段(已补回);编入迭代 → 编排段;游戏内终审 → 用户(登记不阻塞);README 能力行代表用例 → 反哺点。
|
||||
|
||||
## 5. 关联文档同步面
|
||||
|
||||
| 文档 | 关联点 | 同步义务 |
|
||||
|---|---|---|
|
||||
| design/art/art-bible.md §6.2 | 围墙显示矩形与墙脚入土线(已随设计批改到 v3.48) | 实现批不直改;若实现取此卡值时偏差则列反哺点 |
|
||||
| design/art/camp-scene-prompts.md §2.3/§3/§5 | 坐标表(已随设计批改到 v1.9) | 同上 |
|
||||
| design/ux/camp.md 第 29 行 | 围墙带 y220–420(已随设计批改) | 同上 |
|
||||
| design/art/art-status-checklist.md 营地行 | 需补「围墙件 2026-11-07 换代」事实 | 反哺点,归文档批落文 |
|
||||
| design/art/art-bible.md §6.2 :405 | 入土线条款只写围墙底;§3 要求门扇底同口径 | 实现批不直改;反哺点,文档批补一句“门扇底同口径” |
|
||||
| design/art/camp-scene-prompts.md §5 第 12 条 :250 | 现写墙脚 1–7px;门扇底与最终墙件口径需补 | 反哺点,归文档批 |
|
||||
| design/art/camp-scene-prompts.md §5 第 3 条 :241 vs §2.3 :114 | :241 写“显示矩形 240×147”,:114 写“门扇可见 y282–420(高 138)”;本卡口径=显示矩形 240×138、命中 240×147 | 反哺点,文档批统一口径 |
|
||||
| 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 | 实现批禁写;反哺点 |
|
||||
| roadmap.md / 待办清单.md | 本卡编入迭代与状态推进 | 待办条目已补回(状态「已写卡」);编入迭代归编排段 |
|
||||
| 体验验证清单.md | 游戏内终审登记项 | 归文档批/实现报告登记,实现批不直改 |
|
||||
|
||||
## 5.5 文件结构图(T 卡分解依据)
|
||||
|
||||
| 文件 | 职责 | 改动性质 | 验收对照表行 | 复用/新增 |
|
||||
|---|---|---|---|---|
|
||||
| `game/data/tables/camp_scene_layout.tres` | 十层 texture_rect/hotspot/表级值唯一数据源 | 行为改动(数据);T0/T1 核对,若已一致则零改动 | 1–3 | 复用既有 |
|
||||
| `game/data/schemas/camp_scene_layout_table.gd` | 默认值/加载期校验 | 非行为(仅核对;默认值已一致) | 1(schema 前置) | 复用既有 |
|
||||
| `game/presentation/views/camp_scene_view.gd` | 十层建层、`EXPAND_IGNORE_SIZE`、土线裁切材质、门扇状态材质保留 | 行为改动 | 4、6、7 | 复用既有(新增 1 个 shader 常量+1 个私有函数+`_apply_disabled` 签名调整;不新增类变量) |
|
||||
| `game/tests/unit/presentation/camp_scene_layout_test.gd` | V14 钉值+门扇状态土线保留单测 | 非行为(测试) | 1–3、7 | 复用既有(新增 1 个测试函数) |
|
||||
| `tools/shot_checker.py` | 土线机检 `check_soil_line` | 非行为(闸机检) | 6 | 复用既有(新增 1 个函数) |
|
||||
| `tools/render_gate.sh` | camp 全屏 golden 段 | 非行为(闸机检) | 8 | 复用既有(新增 1 段) |
|
||||
| `tools/golden_baseline_refresh.sh` | `--camp` 冻结模式 | 非行为(闸机检) | 8 | 复用既有(新增 1 模式) |
|
||||
| `game/tests/golden/<platform>/camp.png` | camp 全屏逐像素基线 | 非行为(测试资产) | 8 | **新增**(测试基线;test-conventions:100 在册例外;运行时零新增图片) |
|
||||
| `game/assets/art/scene/scene_camp_wall.png` | 围墙最终件 | 资产改动(运行时) | 5 | 复用既有(覆盖同名件) |
|
||||
| `reports/实现报告-营地场景重排接线-<实现日期>.md` | T4 产出物 | 非行为(报告) | — | 新增产出物 |
|
||||
| `reports/反哺点-营地场景重排接线-<实现日期>.md` | T4 产出物 | 非行为(报告) | — | 新增产出物 |
|
||||
| `reports/验收审计-营地场景重排接线-<实现日期>.md` | 独立审计报告 | 非行为(报告) | — | 新增产出物 |
|
||||
| `artwork/2026-11-07-营地接线预览/compose_preview.py` | 最终预览生成 | 非行为(工作区,不入 git) | —(U0 人审) | 复用既有(改墙源/土线) |
|
||||
|
||||
## 6. 任务卡
|
||||
|
||||
### T0 围墙件入包(≈0.25 工作日)
|
||||
### T0 最终墙件预览+导入基线+开工扫描(≈0.25 天)
|
||||
|
||||
- 取用:无。产出:`game/assets/art/scene/scene_camp_wall.png`(覆盖)。
|
||||
- [ ] 从主检出 `artwork/2026-11-07-营地接线预览/scene_camp_wall_final.png` 拷入 → 核对尺寸 1280×164、模式 RGBA
|
||||
- [ ] 建隔离基线目录并跑色板闸:`mkdir -p /tmp/wall_base /tmp/wall_only && cp game/assets/art/scene/scene_camp_{board,gate,dummy,forge,tent,chest,notebook,campfire}.png /tmp/wall_base/ && cp game/assets/art/scene/scene_camp_wall.png /tmp/wall_only/ && python tools/palette_check.py /tmp/wall_only --baseline /tmp/wall_base` → 围墙零新增色(八件基线)
|
||||
- [ ] 跑 `python tools/path_check.py` → 0 问题(worktree 缺 `artwork/mockups` 时该项 SKIP/FAIL 属环境坑:以主检出 `--repo` 口径复核)
|
||||
- 取用:无。产出:用户过目的最终预览、导入缓存基线、开工扫描记录。
|
||||
- [ ] 从主区 `D:/code/g-plan2/artwork/2026-11-07-营地接线预览/` 取 `scene_camp_wall_final.png`;把 `compose_preview.py` 的墙源改为该件;把“土线贴条”改为与 §3 同参数的裁切(wall+gate、`gx` 全局坐标、顶线公式、`top−1` 暗边),生成 `camp_new_layout_preview_final.png`。
|
||||
- [ ] 用户过目最终预览(U0);未过目停。
|
||||
- [ ] 跑 `Godot_console.exe --headless --path game --editor --quit` 强制重导入;核对 `scene_camp_bg/wall/gate` 的 `.ctex` mtime 与 `source_md5` 和源文件一致,记录读数。
|
||||
- [ ] 按 §1.3 做 T0 扫描:读 `.tres`、schema、view、素材、单测、设计文档、golden、静态扫描,逐项记录实查值与差异;扫描记录进实现报告草稿。
|
||||
- [ ] 跑 `python tools/palette_check.py game/assets/art --baseline game/tests/golden/palette_baseline` 与 `python tools/path_check.py --repo D:/code/g-plan2`(artwork 在主区,worktree 无副本),核源/包 md5 一致;记录读数;预览文件不入 git(artwork 工作区)。
|
||||
|
||||
### T1 布局表换代(≈0.25 工作日)
|
||||
### T1 十层布局与视图(≈0.25 天)
|
||||
|
||||
- 取用:T0 的素材。产出:`game/data/tables/camp_scene_layout.tres`(十层+表级值)。
|
||||
- [ ] 按 §3 表逐字改十层 texture_rect/hotspot 与 wall_band → 跑 `godot --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd`(加载期 validate+钉值+关系谓词全绿,exit 0)
|
||||
- [ ] `_build_layer_node` 的 TextureRect 加 `expand_mode = EXPAND_IGNORE_SIZE`(否则门扇节点被贴图最小高 211 夹住、矩形 138 不生效)→ 场景探针 ui_struct_probe camp V1 转绿
|
||||
- 取用:T0 的扫描基线。产出:与 §3 逐字一致的 `.tres`/schema/视图。
|
||||
- [ ] 按 §3 表逐层核对 `camp_scene_layout.tres` 的 texture_rect/hotspot/hotspot_key、`wall_band`、`gate_gap`;不一致的按表改,已一致的保留并记录“已对”。
|
||||
- [ ] 核对 `camp_scene_layout_table.gd:9` 默认 `wall_band=(0,220,1280,200)` 与注释。
|
||||
- [ ] 核对 `camp_scene_view.gd:136` 的 `TextureRect.EXPAND_IGNORE_SIZE`+`STRETCH_SCALE`;确认门扇节点高 138。
|
||||
- [ ] 跑 `Godot_console.exe --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd` → exit 0;跑 `Godot_console.exe --headless --path game res://probe/ui_struct_probe.tscn` → PASS。
|
||||
- 产出:布局/视图一致;两条读数。
|
||||
|
||||
### T2 新值钉断言+收口(≈0.25 工作日)
|
||||
### T2 土线(围墙底+门扇底)+机检+camp golden(≈0.5 天)
|
||||
|
||||
- 取用:T1 的表。产出:`game/tests/unit/presentation/camp_scene_layout_test.gd`(追加断言);`reports/iter<N>-实现报告-2026-11-07.md`;`reports/iter<N>-反哺点-2026-11-07.md`。
|
||||
- [ ] 在 `_test_layout_hotspot_geometry` 追加:wall/gate/board/wall_band 四条钉值(已在本批落笔);六件落位钉值一条(逐层 Rect2 比对)
|
||||
- [ ] 跑 `python tools/run_smoke.py` → exit 0;跑营地套件 `godot --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd` → exit 0;跑场景探针 `…console.exe --headless --path . res://probe/shot_probe.tscn` + `python tools/shot_checker.py <截图目录>` → A 段 PASS
|
||||
- [ ] 写实现报告(各卡状态+目检清单+决定记录)与反哺点清单(§5 四条逐条落点)
|
||||
- 取用:T1 的 view。产出:土线材质+土线机检+camp golden+营地截图读数。
|
||||
- [ ] 在 `camp_scene_view.gd` 新增 `_SOIL_CUT_SHADER_SRC`(字符串常量)与 `_apply_soil_cut(node: TextureRect, x_offset: float, rect_w: float, y_offset: float, rect_h: float) -> void`;按 §3 的参数裁 wall/gate 底边;`_apply_disabled` 改为 `_apply_disabled(key: StringName, node: Control) -> void`,gate 走 `desat` uniform、NORMAL/HOVER 保留土线材质;不新增文件、不新增图层、不新增运行时素材、不新增类变量。
|
||||
- [ ] 在 `camp_scene_layout_test.gd` 新增 `_test_gate_state_keeps_soil_cut` 并接入 `_run_all`:实例化 `CampSceneView`,对 gate 依次 NORMAL/HOVER/DISABLED,断言 `gate.material` 始终为土线材质、`desat` 参数随态变化;跑单测 → exit 0。
|
||||
- [ ] 在 `tools/shot_checker.py` 新增 `check_soil_line(img: Image.Image, failures: list) -> None`,在 `main()` 处理 `shot_camp.png` 时调用;对墙底与门扇底取样:按截图宽高与设计基准 1280×800 的比例换算坐标(禁写死 1280/420);墙底取可见段(避开帐篷/门扇覆盖),门扇底取底行不透明中心区(写卡时实查全局 x619–663);断言顶线 410–416、≥3 个不同顶线值、接缝 x519/521 差 ≤1px、边界下首行对 `scene_camp_bg.png` 同列颜色距离 ≤ 容差且非墙色、`top−1` 暗边、gate 底无直边/灰影;失败写入 failures。
|
||||
- [ ] 窗口化跑 `Godot_console.exe --path game --quit-after 3000 res://probe/shot_probe.tscn -- <截图目录>` 产出营地截图;跑 `python tools/shot_checker.py <截图目录> shot_camp.png` → PASS。
|
||||
- [ ] 在 `tools/golden_baseline_refresh.sh` 增 `--camp` 模式(`shot_probe` 截图 → `game/tests/golden/<platform>/camp.png`);用户对照最终预览确认 `shot_camp.png` 后跑 `bash tools/golden_baseline_refresh.sh --camp` 冻结;未确认不得冻结。
|
||||
- [ ] 在 `tools/render_gate.sh` 菜单 golden 段后增加 camp 全屏 golden 段(比对 `camp.png`,容差沿用脚本头注释口径);跑 `bash tools/render_gate.sh game` → 全绿。
|
||||
- [ ] 记录营地截图的 std/colors/eff 与土线断言读数。
|
||||
|
||||
### T3 全量验证与独立审计(≈0.5 天)
|
||||
|
||||
- 取用:T2 的土线+机检+camp golden。产出:代码域全绿、独立审计报告、CI 读数。
|
||||
- [ ] 改素材后再次强制重导入;跑 `bash tools/run_all_gates.sh --code` → 冒烟/系统/单元 4 分片/探针/渲染/色板/静态扫描全绿;静态扫描零新增红(S11 已在基线修复)。
|
||||
- [ ] 独立验收审计:未参与实现的会话或子代理按本卡 §7 逐行核;发现按四类分流处置;报告落 `reports/验收审计-营地场景重排接线-<实现日期>.md`;未过不得合并。
|
||||
- [ ] 游戏内终审登记到实现报告实机目检总清单(用户自排,不阻塞)。
|
||||
- [ ] 合并后按需 `tools/ci_check.sh <合并提交>` 现查;绿必须坐实“跑闸”步真跑过;clone 失败不算绿。
|
||||
|
||||
### T4 收口产出物+最终完成进度扫描(≈0.25 天)
|
||||
|
||||
- 取用:T0–T3 全部读数。产出:实现报告、反哺点清单、最终扫描记录。
|
||||
- [ ] 写 `reports/实现报告-营地场景重排接线-<实现日期>.md`:各卡状态、实机目检总清单、遗留读数义务、实现决定记录;**内含 §1.3 的 T4 完成进度扫描记录**。
|
||||
- [ ] 写 `reports/反哺点-营地场景重排接线-<实现日期>.md`:§5 每条同步面都有落点;art-status-checklist、README 能力行、体验验证清单按实况列。
|
||||
- [ ] 按 §1.3 做 T4 扫描:逐项实查;缺项/偏差列清单;未闭合不得宣称完成。
|
||||
- [ ] 提交与合并前向用户请示;未获指令不得 commit/merge。
|
||||
|
||||
## 7. 验证闸(改动—验收对照表)
|
||||
|
||||
| 需求点 | 改动(文件:行/行为) | 验收测试(名称+落点+尾缀) | 层级 | 真实入口 | 判据绑定面 | 能力行 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 围墙显示矩形 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 门板矩形钉值 | 单元 | 同上 | texture_rect 取值 | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
| 其余六件落位(判据出处 design/art/camp-scene-prompts.md:244) | .tres 六件 | V14 六件落位钉值+七命中区几何红线(validate+不相交+不越界) | 单元 | 同上 | texture_rect/hotspot 取值 | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
| 门扇显示高 138(判据出处 design/art/camp-scene-prompts.md:250) | camp_scene_view.gd `_build_layer_node` 加 `EXPAND_IGNORE_SIZE` | 场景探针 ui_struct_probe camp V1「层贴图矩形≠layout 表」 | 探针 | `res://probe/ui_struct_probe.tscn`(camp 段) | 节点 position/size 逐值 | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
| 围墙件换代(判据出处 design/art/art-bible.md:212) | scene_camp_wall.png | T0 `palette_check`/`path_check` | 资产 | 文件读数 | 色数 12、零新增色 | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
| 墙脚入土(判据出处 design/art/art-bible.md:396) | 围墙件底行 | 目检(游戏内终审,登记式) | 目检 | 营地屏 | 墙底无贯通直线 | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
| 营地屏铺底不回归(判据出处 design/ux/camp.md:29) | 十层矩形整体 | 场景探针 `shot_probe` camp 截图+`shot_checker` A 段(角色/面板骨架不回归) | 探针 | `--headless --path . res://probe/shot_probe.tscn` | 截图色彩数/骨架 | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
| 围墙显示矩形 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 逐像素 | 既有:营地场景图十层铺底与门洞留空呈现 |
|
||||
|
||||
注:未删改任何旧断言;新增 5 条钉值断言(围墙/门扇/告示板/围墙带/六件落位),测试削弱申报:无。
|
||||
注:未删改 V14 旧断言;新增钉值、门扇状态土线保留单测、土线机检与 camp golden 属追加。测试削弱申报:无。
|
||||
|
||||
**独立验收审计**:入口=未参与实现的独立会话或子代理(对照本卡 §7 逐行核);报告文件 `reports/iter<N>-验收审计-2026-11-07.md`;未过不得合并。
|
||||
**独立验收审计**:入口=未参与实现的独立会话或子代理(对照本卡 §7 逐行核);报告文件 `reports/验收审计-营地场景重排接线-<实现日期>.md`;未过不得合并。
|
||||
|
||||
## 8. 异常分级
|
||||
|
||||
L1 自救:格式/导入缓存类异常自行重跑。L2 记录继续:非本卡面的既有红记录进报告。L3 停机:表值触 schema fail-fast 或与 §3 冲突=停卡呈报(上游缺陷退写卡段);素材缺位=停卡(不得用旧 49px 墙凑合)。
|
||||
- L1 自救:导入缓存/格式类异常自行重跑重导入。
|
||||
- L2 记录继续:非本卡面的存量红记录归属;若挡住代码域全绿,停在该红上,不修别批文件。当前基线 S11 已清零;若 T3 复跑出现新红,按红账不清不开新批处置。
|
||||
- L3 停机呈报:表值与 §3 冲突、schema fail-fast、最终墙预览未过目、土线机检失败、camp golden 未获用户确认即冻结、独立审计未过、CI 红、gdstyle/预算互斥——停卡写报告等用户;机检预算互斥=上游缺陷,退回写卡段。
|
||||
|
||||
## 9. 代拍板白名单
|
||||
|
||||
门扇 hotspot 高 147(贴图 138+9 余量);七件 hotspot 的平移口径(§3 已列值);T2 钉值断言的命名与位置(同套件内追加)。超出=记实现报告「实现决定记录」。
|
||||
- 门扇 hotspot 高 147、六件 hotspot 平移口径(§3 已定值)。
|
||||
- 土线 shader 的内部结构、uniform/material 命名;土线机检的取样窗口、颜色距离容差、暗边阈值;camp golden 的比对容差沿用 `render_gate.sh` 现行口径(但起伏带名义 9px/顶线 410–416、`top−1` 0.85 暗边、顶部函数为锁定值)。
|
||||
- 新测试函数命名与所在行:`check_soil_line(img: Image.Image, failures: list) -> None`、`_test_gate_state_keeps_soil_cut`(以本卡 §7 为准,实现照单落名)。
|
||||
- 超出=记实现报告“实现决定记录”。
|
||||
|
||||
## 10. 待裁点
|
||||
|
||||
零待裁点(用户已裁:墙 220/200、门板跟随、入土线;2026-11-07)。开工门=U0。
|
||||
零待裁点。上游缺口已闭合(设计文档六件逐值补录于 `camp-scene-prompts.md` v1.10 §5 第 13 条;待办清单条目已补回,状态「已写卡」)。开工门=U0:最终墙件预览用户过目;提交/合并须用户发令。
|
||||
|
||||
## 11. 落位与可复用性预检
|
||||
|
||||
本批零新增代码文件、零新增函数:改既有 `camp_scene_layout.tres`(数据行唯一落点)、既有单测追加断言、覆盖既有 `scene_camp_wall.png`(消费名不变,`UiKit.TEX_CAMP_WALL`);另产出两份 `reports/` 过程件(实现报告、反哺点清单)。复用面:视图/装载/校验链现成(camp_scene_view.gd、schema.validate、camp_scene_layout_test.gd),不新增渲染件。唯一面:坐标只落表一处,视图/探针/单测均读表。
|
||||
- 土线裁切:新增 1 个 shader 字符串常量+1 个私有应用函数+`_apply_disabled` 签名调整;落 `camp_scene_view.gd`;盘上无同类土线 shader(`_DESAT_SHADER_SRC` 是禁用态去饱和,职责不同,不能复用);wall/gate 共用同一 wave 函数,唯一落点在该文件;不新增文件、不新增图层、不新增运行时素材;土线材质挂节点 `material`,不新增类变量。
|
||||
- 土线机检:在 `tools/shot_checker.py` 新增 1 个函数,复用现有 PIL 读图与 `main()` 循环;不新增脚本文件;对 `shot_camp.png` 调用。
|
||||
- camp golden:新增 1 张测试基线 `game/tests/golden/<platform>/camp.png`(test-conventions:100 在册例外);`tools/golden_baseline_refresh.sh` 增 `--camp` 模式、`tools/render_gate.sh` 增 camp 段,均不新增脚本。
|
||||
- 预览:只改 `artwork/` 工作区 `compose_preview.py`(不入 git),不改游戏素材;最终预览是用户过目件,不是运行时资产。
|
||||
- 数据/素材:无新增运行时数据件、无新增运行时图片;十层结构不变;墙件覆盖同名件。
|
||||
|
||||
## 12. 实现规范预算
|
||||
|
||||
零新增文件、零新增方法 → gdstyle 阈值面无新增;存量触面:camp_scene_layout_test.gd 追加一段断言(方法数不变、成员数不变)。
|
||||
- `camp_scene_view.gd` 存量触面:`tools/gdstyle_baseline.txt` 无本文件登记键(实查零命中);按默认阈值 20/15 自查:公开方法 4/20、类变量 13/15;新增面=1 个 shader 常量+1 个私有函数+`_apply_disabled` 签名调整,**不新增类变量**;改后 4/20、13/15;超预算=停卡。
|
||||
- `tools/shot_checker.py` 新增 1 个函数,不新增文件;无 gdstyle 约束。
|
||||
- `tools/render_gate.sh`/`tools/golden_baseline_refresh.sh` 各增 1 段/1 模式,不新增文件;无 gdstyle 约束。
|
||||
- 零新增 `.gd` 文件、零新增 `.tscn`、零新增运行时资源;shader 以字符串常量存在,不新增 `.gdshader`;唯一新增入库件=`game/tests/golden/<platform>/camp.png`(测试基线,test-conventions:100 在册例外)。
|
||||
|
||||
## 13. 复核记录
|
||||
|
||||
> 第 1 轮=写卡人自审(非独立);第 2 轮=独立只读子代理复核(未参与本卡撰写,2026-11-08,17 条发现、零待裁);第 3 轮=复核处置中自审。17 条已全部处置:15 条就地改卡,2 条退回上游后经用户 2026-11-08 授权闭合(设计文档六件逐值补录、待办条目补回)。复核证据(文件/行锚/实跑命令)已并入 §2、§5、§7 与本节各条;复核报告文件按用户 2026-11-08 裁清理,不提交、不合回。**卡片达到成立判据;编入迭代/开工/提交/合并仍须用户发令。**
|
||||
|
||||
| 轮次 | 复核者身份 | 发现 | 去向 | 处置结果 |
|
||||
|---|---|---|---|---|
|
||||
| 1 | 前台只读复核子代理(未参与撰写) | 七件/六件计数不一(§1/§3/§7) | 补写 | 统一为六件(dummy/forge/tent/chest/notebook/campfire) |
|
||||
| 1 | 同上 | 六件新值未钉,V14 只证互斥/边界 | 补写 | T2 增六件落位钉值断言,本批已落(PASS 实测) |
|
||||
| 1 | 同上 | T2 单元套件无真实入口命令 | 补写 | 改为 `godot --headless --path game --script res://tests/unit/presentation/camp_scene_layout_test.gd` |
|
||||
| 1 | 同上 | T1 `python -c` 不能读 .tres;`db.load_tables` 无命令入口 | 补写 | T1 改为直跑该单测(加载期 validate+钉值) |
|
||||
| 1 | 同上 | T0 基线写占位目录;扫全 scene 会带 stage 件红 | 补写 | 写入临时隔离基线命令(八件拷贝)与限定扫描面;path_check 环境坑注明 |
|
||||
| 1 | 同上 | prompts §5 第 9 条布告板旧值 (845,224) | 退回上游 | 文档区已修:(845,241,130,121),底 362 落在墙内 |
|
||||
| 1 | 同上 | art-bible §6.2 门扇旧句「贴图 240×138 随门洞压扁重画、y283–367」 | 退回上游 | 文档区已修:运行时压扁、底压 y420 |
|
||||
| 1 | 同上 | prompts §2.3 门洞 y282–420 与在包墙件全高缺口不相符 | 退回上游 | 文档区已修:墙件缺口全高 220–420、门扇可见 282–420 |
|
||||
| 1 | 同上 | art-bible:395 不含色数判据 | 补写 | 锚改 art-bible.md:212(营地子板色数行) |
|
||||
| 1 | 同上 | §13 复核报告文件行违反 2026-11-06 裁(凭据=本节) | 自判 | 删除该行 |
|
||||
| 1 | 同上 | 门扇「重画 138」vs 运行时压扁,§10 零待裁是否成立 | 自判 | 用户 2026-11-07 明裁「不需要动任何美术素材」,运行时压扁即终稿;§10 零待裁成立 |
|
||||
| 2 | 后台只读复核子代理(未参与撰写) | schema 默认 `wall_band=(0,240,1280,70)` 与注释仍旧值 | 补写 | schema 默认改 (0,220,1280,200)+注释同步 |
|
||||
| 2 | 同上 | §7「未新增/删除任何断言」措辞与 +5 条钉值矛盾 | 补写 | 改为「未删改旧断言,新增 5 条钉值断言」 |
|
||||
| 2 | 同上 | test.gd 头注「禁坐标字面量」与新钉值冲突 | 补写 | 头注改为「关系谓词为主+重排钉值」,钉值前加 `# oracle:` 行锚 |
|
||||
|
||||
| 1 | 写卡人自审(非独立) | 旧方案把土线限定为“围墙件缺口、零新代码”,会丢掉门扇底土线 | 补写 | 本卡 §3 改为 wall+gate 共用土线裁切材质;10 层不变;不新增素材 |
|
||||
| 1 | 同上 | 过审预览用候选墙,最终墙件未单独过目 | 补写 | 本卡 §3/T0 增加最终墙预览用户过目(U0) |
|
||||
| 1 | 同上 | 渲染闸 A-D 不覆盖土线像素,旧完成定义只写单测/冒烟 | 补写 | 本卡 §1.2/§7/T2 增加土线机检与渲染闸 |
|
||||
| 1 | 同上 | 旧导入缓存会让渲染闸拿旧素材,绿读数无效 | 补写 | 本卡 §2/§6 T0/T3 增加强制重导入与 source_md5 核对 |
|
||||
| 1 | 同上 | 独立审计、游戏内终审、art-status-checklist 未进完成定义 | 补写 | 本卡 §1.2/§5/§6 T3/T4 补齐 |
|
||||
| 1 | 同上 | 待办清单已无本条目,卡片来源悬空 | 退回上游 | 头部记登记缺口;§10 开工门;编入迭代前由登记段补回 |
|
||||
| 1 | 同上 | 写卡时曾见外部 S11 红(board_shot_probe「雷格」),会挡住代码域全绿 | 自判 | 实查当前基线 89f4fc78 已修复为「危险格」,`static_scan.sh` S11 ok;本卡去除该开工门,T3 复跑确认零新增红 |
|
||||
| 1 | 同上 | 10 层结构不能新增图层,土线必须挂在既有 wall/gate 层 | 自判 | 本卡 §3/§11 采用裁切材质挂 wall/gate,不新增第 11 层 |
|
||||
| 2 | 独立只读子代理(未参与本卡撰写) | §7 art-bible 锚 `:395/:396` 实为 `:404/:405` | 自判 | 已改 §7 行 5/6 锚为 `:404/:405` |
|
||||
| 2 | 同上 | 六件逐值未载于设计文档(`prompts:244` 仅关系句;`grep design/` 零命中) | 退回上游(已闭合) | 用户 2026-11-08 授权补录:`camp-scene-prompts.md` v1.10 §5 第 13 条载六件逐值;头部/§5/§7/§10 同步 |
|
||||
| 2 | 同上 | 顶部公式实际 410–416(裁 4–10px),与“9px 带”表述矛盾 | 自判 | §3 改为“名义 9px(基准顶线 411)+实际 410–416”;§9 同步 |
|
||||
| 2 | 同上 | “y≥top 裁掉”与“top 行压暗”互斥(被裁行不可见) | 自判 | §3 改为“最后可见行 `top−1` 压暗 0.85” |
|
||||
| 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 | 同上 | 土线机检写死 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 同步 |
|
||||
| 2 | 同上 | §2 行锚错:schema `:67`→`:59–:62`、view `:133`→`:130`、test `:82`→`:26` | 自判 | 已改 |
|
||||
| 2 | 同上 | §12 写 S13 键,但 `camp_scene_view.gd` 无登记键 | 自判 | §12 改为“无登记键;默认 20/15;现状公开方法 4、类变量 13;不新增类变量” |
|
||||
| 2 | 同上 | 外部 S11 已不成立(`board_shot_probe` 现为「危险格」) | 自判 | §1.2/§2/§4/§8/§10/§13 去除 S11 红;T3 静态扫描零新增红 |
|
||||
| 2 | 同上 | `prompts` §5 第 3 条 `:241` 240×147 与 §2.3 `:114` 138 矛盾未列同步面 | 补写 | §5 增行;本卡口径=显示 240×138、命中 240×147 |
|
||||
| 2 | 同上 | §13 无独立复核记录 | 补写 | 本节增 17 行+复核报告路径 |
|
||||
| 2 | 同上 | 待办清单无本条目 | 退回上游(已闭合) | 用户 2026-11-08 授权补回:`待办清单.md` 条目状态「已写卡」;头部/§5/§10 同步 |
|
||||
| 3 | 写卡人自审(复核处置中,非独立) | 原文写“门扇件底行 alpha 全 255”,实查底行仅局部 x99–143 不透明、两侧 195px 透明,表述失真 | 自判 | §3 改为“底行中心区不透明+两侧透明拱边”;T2 门扇取样窗口钉全局 x619–663 |
|
||||
Reference in new issue
Block a user