工程(基线合一批·golden单基线跨平台+补锚14张+审核关卡立规): 分平台基线机制拆除(2026-11-08用户裁:跨平台渲染必须一致,禁加基线消化差异)——windows 6件基线提升到golden/根,删windows/mac两平台目录与根目录遗留(level_map.png+边车,零引用核实); 闸件去平台化(render_gate.sh GOLDEN直拼/golden_compare.py删_PLAT与plat_missing/golden_baseline_refresh.sh落点改根+--screens换代入口); 拆自愈采集(ci.yml步+tools/ci/golden_selfheal.sh——CI自动落基线=既当裁判又当选手,测量数据已采完退役); 补锚14张(用户裁:发现少了就补,备案清零)——shot_probe扩九态(营地五窗真点热点开窗/图例真点钮/战末结算与三选一直调喂真实形态文案/调试浮窗直调)+battle段呼吸相位冻结(motion_scale0.5+1.2s动画完结锚定,board_shot同款)+热点键→基线语义名映射(dummy→tree/board→codex); 渲染闸屏态浮层golden段(golden_compare 14面)+shot_checker 16屏清单; 基线审核关卡立规(test-conventions §8.2:逐张审核确认后才入库生效+审核记录落档+非卡片批基线操作同关卡;process-conventions五·实现行:未审核的基线禁合回;req-card/iter技能特殊标注——豁免面直改); 实测依据: mac真渲染vs windows基线四指标(棋盘0.025~0.033%/menu 0.674% changed,RGB零色偏,块平均≈0)全在容差带内——数据归档reports/基线合一批-反哺点-2026-11-08.md; 读数: shot_probe直跑16图问题=0+渲染闸直跑exit=0(20面全PASS,新候选changed=0.00%)+bash -n×3+py_compile+文档域闸绿; 基线审核记录: 20张全部DKChan 2026-11-08确认(README审核记录节)
No files matched your search
@@ -1,6 +1,7 @@
|
||||
# VERTICAL SLICE - NOT FOR PRODUCTION
|
||||
# 整屏截图探针(呈现层测试分级 B 档基建:视口截图程序化产出;七屏——
|
||||
# 菜单/设置面/生涯页/营地/关卡画面/战斗/状态面板,现行事实源=tools/render_gate.sh)。
|
||||
# 整屏截图探针(呈现层测试分级 B 档基建:视口截图程序化产出;七屏+九态——
|
||||
# 菜单/设置面/生涯页/营地/关卡画面/战斗/状态面板+营地五窗开态/图例/战末结算/三选一/调试浮窗,
|
||||
# 现行事实源=tools/render_gate.sh;九态=golden 补锚批 2026-11-08)。
|
||||
# 必须**窗口化**运行(真渲染设备——headless 无渲染面,get_image 得到空纹理):
|
||||
# Godot_console.exe --path . res://probe/shot_probe.tscn -- <输出目录>
|
||||
# 流程 = 真实按钮信号路径驱动(ui_click_probe 同款;存档/设置/元进度三面换注隔离档——禁碰真实档,
|
||||
@@ -129,6 +130,30 @@ func _ready() -> void:
|
||||
else:
|
||||
await get_tree().process_frame
|
||||
await _snap("camp")
|
||||
# ②b 营地五窗打开态(真点热点开窗→截→「返回」前缀真点关——screen_flow_probe 窗壳链同款)
|
||||
# 判据出处: design/ux/camp.md:45 五窗统一窗壳形态·互斥单开(营地窗态组)
|
||||
for k: StringName in [&"forge", &"chest", &"dummy", &"board", &"notebook"]:
|
||||
ProbeUiUtil.push_click_at(main, main.ui.modals.camp.scene.get_hotspot_rect(k).get_center())
|
||||
for i in 3:
|
||||
await get_tree().process_frame
|
||||
var wv: Control = main.ui.modals.camp.forge if k == &"forge" else (
|
||||
main.ui.modals.camp.treasure if k == &"chest" else (
|
||||
main.ui.modals.camp.tree if k == &"dummy" else (
|
||||
main.ui.modals.camp.codex if k == &"board" else main.ui.modals.menu.career_overlay)))
|
||||
# 截图键=基线语义名(dummy→tree 天赋树/board→codex 图鉴——热点键≠呈现名,映射单点在此)
|
||||
var wkey: String = {"forge": "forge", "chest": "chest", "dummy": "tree",
|
||||
"board": "codex", "notebook": "notebook"}[String(k)]
|
||||
if not wv.visible:
|
||||
_problems.append("营地窗未打开: %s(真点热点路径)" % String(k))
|
||||
else:
|
||||
await _snap("camp_%s" % wkey)
|
||||
var back: Button = ProbeUiUtil.find_button(wv, "返回", "prefix")
|
||||
if back == null:
|
||||
_problems.append("营地窗返回钮缺失: %s" % String(k))
|
||||
else:
|
||||
ProbeUiUtil.push_click(main, back)
|
||||
for i in 3:
|
||||
await get_tree().process_frame
|
||||
ProbeUiUtil.push_click_at(main, main.ui.modals.camp.scene.get_hotspot_rect(&"campfire").get_center()) # 收闭改接篝火动线(营地根态无关闭钮——卡④ T5)
|
||||
await get_tree().process_frame
|
||||
ProbeUiUtil.push_click(main, main.ui.modals.menu.confirm_dialog._confirm_btn) # 二次确认离场(关层收闭——选档层随收)
|
||||
@@ -152,9 +177,14 @@ func _ready() -> void:
|
||||
# ④ 战斗(节点一——candidate_rect 命中矩形真点选路提交,ui_click_probe 同款)
|
||||
# 判据出处: design/ux/battle.md:122 B 区构建:站桩/明细带/轮次指示(战斗出图与几何锚组)
|
||||
if main.ui.modals.run.level_screen != null and main.ui.modals.run.level_screen.visible:
|
||||
# 接触带呼吸相位冻结(board_shot_probe 同款:motion_scale<1.0 ⇒ 施静态带色)——
|
||||
# golden 基线逐像素比对禁动画相位抖动;必须在进战 rebuild 前置位(rebuild/带色施用按当时相位取样)
|
||||
UiKit.motion_scale = 0.5
|
||||
ProbeUiUtil.push_click_at(main, main.ui.modals.run.level_screen.candidate_rect(0).get_center())
|
||||
for i in 10:
|
||||
await get_tree().process_frame
|
||||
# 全板淡入+涟漪完结锚定(board_shot_probe 同款 1.2s=2×余量——基线禁采动画中途帧)
|
||||
await get_tree().create_timer(1.2).timeout
|
||||
await _snap("battle")
|
||||
# 战斗屏文字框/明度带锚点(全局 rect——checker 取样坐标源;明细带锚 S1 裁后改认现行文案)
|
||||
_meta["battle_log_hint"] = ProbeUiUtil.label_rect(main.ui.battle.stage, "上轮摘要")
|
||||
@@ -190,6 +220,63 @@ func _ready() -> void:
|
||||
await get_tree().process_frame
|
||||
if main.ui.modals.run.status_panel.visible:
|
||||
_problems.append("状态面板关闭后未隐藏(继续钮路径)")
|
||||
# ⑤b 图例浮窗(战斗屏 AP 条真点开→截→close() 关——ui_click_probe 真点先例)
|
||||
# 判据出处: design/gdd/systems/表现与支撑/HUD框架.md:88 图例面板=模态族(图例组)
|
||||
var lgb: Button = main.ui.battle.board_zone.ap_bar._btn_legend
|
||||
if lgb == null or not lgb.visible:
|
||||
_problems.append("图例钮缺失/不可见(战斗屏 AP 条)")
|
||||
else:
|
||||
ProbeUiUtil.push_click(main, lgb)
|
||||
for i in 3:
|
||||
await get_tree().process_frame
|
||||
if not main.ui.modals.run.legend_overlay.visible:
|
||||
_problems.append("图例层未打开(图例钮路径)")
|
||||
else:
|
||||
await _snap("legend")
|
||||
main.ui.modals.run.legend_overlay.close()
|
||||
for i in 3:
|
||||
await get_tree().process_frame
|
||||
# ⑤c 战末结算浮层(直调 open_victory 喂真实形态摘要——ui_struct_probe 合成先例)
|
||||
# 判据出处: design/gdd/systems/表现与支撑/HUD框架.md:276 终局:胜利金蜡封(战末结算组)
|
||||
main.ui.modals.run.end_overlay.open_victory("胜利", "继续", Rect2(200, 200, 400, 300),
|
||||
{"gp_summary": "GP +3", "ks_summary": "击杀 2", "bonus_summary": "无伤奖励", "gp_gain": 3, "gp_total": 3})
|
||||
for i in 3:
|
||||
await get_tree().process_frame
|
||||
if not main.ui.modals.run.end_overlay.visible:
|
||||
_problems.append("战末结算浮层未打开(open_victory 直调)")
|
||||
else:
|
||||
await _snap("battle_end")
|
||||
main.ui.modals.run.end_overlay.close()
|
||||
for i in 3:
|
||||
await get_tree().process_frame
|
||||
# ⑤d 三选一浮层(直调 open_pick 喂真实形态卡——ui_struct_probe 合成先例)
|
||||
# 判据出处: design/gdd/systems/冒险循环/奇物.md:166 三选一呈现(三选一组)
|
||||
main.ui.modals.run.curio_overlay.open_pick("三选一", [
|
||||
{"id": "probe_heal", "text": "回血\n恢复 3 点"},
|
||||
{"id": "probe_magic", "text": "爆裂轰击\n下一击 +5"},
|
||||
{"id": "probe_pierce", "text": "穿甲\n无视护甲"},
|
||||
])
|
||||
for i in 3:
|
||||
await get_tree().process_frame
|
||||
if not main.ui.modals.run.curio_overlay.visible:
|
||||
_problems.append("三选一浮层未打开(open_pick 直调)")
|
||||
else:
|
||||
await _snap("curio_pick")
|
||||
main.ui.modals.run.curio_overlay.visible = false
|
||||
for i in 3:
|
||||
await get_tree().process_frame
|
||||
# ⑤e 调试浮窗(函数直调开/关——ui_struct_probe/ui_tune_probe 先例;对局中可开)
|
||||
# 判据出处: design/engineering/test-conventions.md:65 人工体验=DebugOverlay/DS_DEBUG 调试面(调试浮窗组)
|
||||
main._show_debug_overlay()
|
||||
for i in 3:
|
||||
await get_tree().process_frame
|
||||
if not main.ui.modals.menu.debug_overlay.visible:
|
||||
_problems.append("调试浮窗未打开(_show_debug_overlay 直调)")
|
||||
else:
|
||||
await _snap("debug")
|
||||
main._close_debug_overlay()
|
||||
for i in 3:
|
||||
await get_tree().process_frame
|
||||
else:
|
||||
_problems.append("关卡画面未出现(函数直调中间态路径)")
|
||||
# ── 几何元数据落盘(shot_checker 取样坐标源) ──
|
||||
@@ -197,8 +284,10 @@ func _ready() -> void:
|
||||
if mf != null:
|
||||
mf.store_string(JSON.stringify(_meta))
|
||||
mf.close()
|
||||
# ── 最小自检:七件存在且非零字节 ──
|
||||
for s in ["menu", "settings", "career", "camp", "level", "battle", "status"]:
|
||||
# ── 最小自检:十六件存在且非零字节 ──
|
||||
for s in ["menu", "settings", "career", "camp", "level", "battle", "status",
|
||||
"camp_forge", "camp_chest", "camp_tree", "camp_codex", "camp_notebook",
|
||||
"legend", "battle_end", "curio_pick", "debug"]:
|
||||
var p := out_dir.path_join("shot_%s.png" % s)
|
||||
if not FileAccess.file_exists(p):
|
||||
_problems.append("截图缺失: %s" % p)
|
||||
|
||||
@@ -1,33 +1,56 @@
|
||||
# 视觉 golden 基线(渲染闸的比对基准)
|
||||
|
||||
基线**按平台各存**(2026-11-03 用户裁:跨显卡/字形渲染机制差异使跨平台逐像素必失配——
|
||||
`windows/` 与 `mac/` 子目录各持一套,平台内部照常严格比对,跨平台不互比;
|
||||
平台选择实现单点 = `tools/gate_platform.sh` 的 `gate_platform_id`,比较器 `tools/golden_compare.py`
|
||||
自动拼平台子目录)。本目录现持:`windows/`(棋盘三图 `board_L1_dungeon` / `board_L2_underdark` /
|
||||
`board_L3_deep_underdark`,裁剪区 1036×548(D 区基座档全幅;2026-11-07 棋盘地形换代后由探针视图全幅裁剪,
|
||||
原 900×760 口径退役)+ 启动态菜单 `menu_boot`,全屏 + 关卡视口两 Shot
|
||||
`lmap_entry` / `lmap_boss`——2026-11-05 用户裁两 Shot 面:只对拍关卡最开始(入口停点)与
|
||||
关卡 Boss 节点(末列锚定),中间过程不对拍)、
|
||||
`level_map`(关卡画面全屏,历史基线留根——现行闸件未对拍它,由两 Shot 面接替)、
|
||||
`palette_baseline/`(色板基线,纯文件内容比对与平台无关)。
|
||||
比对判据与工具见 `tools/golden_compare.py`
|
||||
(逐像素灰度差 >16 的像素占比 ≤2%)。两 Shot 基线采集=`res://probe/level_map_shot_probe.tscn`
|
||||
(固定种子单关直构——确定性采集),换代入口=`tools/golden_baseline_refresh.sh --lmap`;
|
||||
他平台(mac)的关卡视口基线尚未冻结——渲染闸对本平台缺基线记 SKIP 不判红,冻结义务归批末呈报。
|
||||
基线**跨平台单套**(2026-11-08 用户裁:跨平台渲染必须一致——Windows 与 macOS 对拍同一份基线,
|
||||
差异必须落在容差带内;跨平台实测噪声棋盘 ≤0.033% / menu ≤0.68% changed,口径 ≤16/像素、≤2% 面积,
|
||||
比较器 `tools/golden_compare.py`,禁以加基线方式消化差异)。本目录现持(单层,无平台子目录):
|
||||
|
||||
**未建锚面备案**:营地/设置/战斗三屏与战末结算/三选一/图例/调试浮窗四浮层无改前 golden 锚;这些呈现面的等价证据承载=现役探针/单元测试断言面+实机目检(体验验证清单 ㊵ 节)。
|
||||
- 棋盘三图 `board_L1_dungeon` / `board_L2_underdark` / `board_L3_deep_underdark`——裁剪区由探针按
|
||||
`board_meta.json` 采样坐标决定(禁硬编码像素)
|
||||
- 启动态菜单 `menu_boot`(全屏,迭代 28 T4 立)
|
||||
- 关卡视口两 Shot `lmap_entry` / `lmap_boss`——2026-11-05 用户裁:只对拍关卡最开始(入口停点)与
|
||||
关卡 Boss 节点(末列锚定),中间过程不对拍
|
||||
- 屏态五锚 `camp_screen` / `settings_screen` / `battle_screen` / `career_screen` / `status_panel`
|
||||
(全屏,shot_probe 七屏采集——golden 补锚批 2026-11-08:battle 段带呼吸相位冻结)
|
||||
- 营地窗态五锚 `camp_forge` / `camp_chest` / `camp_tree` / `camp_codex` / `camp_notebook`
|
||||
(真点热点开窗态,camp.md:45 五窗窗壳)
|
||||
- 浮层四锚 `battle_end`(战末结算)/ `curio_pick`(三选一)/ `legend`(图例)/ `debug_overlay`(调试浮窗)
|
||||
- `palette_baseline/`(色板基线,纯文件内容比对,与平台无关)
|
||||
|
||||
采集=**真实引擎渲染**:探针以固定种子跑到指定状态截屏(棋盘 golden 帧=微光关态,呼吸相位冻结;
|
||||
确定性采集)。换代入口=`tools/golden_baseline_refresh.sh`(缺省棋盘/`--menu`/`--lmap`),
|
||||
提交说明须写明触发原因(强制)。两 Shot 基线采集=`res://probe/level_map_shot_probe.tscn`。
|
||||
|
||||
## 基线冻结与审核(2026-11-08 用户立)
|
||||
|
||||
基线=**人定标准、机器守标准**。任何基线的新建/换代/迁移/容差修订,须**呈报用户逐张审核、
|
||||
确认后才能提交入库生效**;确认记录登记于下方审核记录节(审核人+时间+基线清单),未审核的
|
||||
基线禁合回。机器侧前置:探针自检 PASS(结构断言——非生效格零变化/生效格实绘非空等——在案)
|
||||
才允许出候选图;候选图不满足自检=采集失败,不得送审。
|
||||
|
||||
## 审核记录
|
||||
|
||||
| 日期 | 基线清单 | 审核人 | 结果 |
|
||||
|---|---|---|---|
|
||||
| 2026-11-08 | 棋盘三图+menu_boot+lmap 两 Shot+单基线合并(6 张) | DKChan | 确认 |
|
||||
| 2026-11-08 | 屏态五锚+营地窗态五锚+浮层四锚(14 张补锚) | DKChan | 确认 |
|
||||
|
||||
## 时效判定纪律
|
||||
|
||||
基线冻结于 2026-09-30;关卡视口两 Shot(lmap_entry/lmap_boss)冻结于 2026-11-05;棋盘三图 2026-11-07 换代(采集态扩型——cell_mark_overlay 六绘制域入帧,需求卡片「QA覆盖余量收口批」卡修轮 2 V14 渲染通道裁定,新帧用户过目后重制)——两 Shot 面口径(只对拍入口停点与 Boss 节点)见上文现持清单行。**判定先于动作**:每代换代面(视觉/素材/布局改动)
|
||||
跑批时先跑一次渲染闸看差异落不落在裁剪区与容差内——
|
||||
基线冻结时点:menu_boot=迭代 28 T4;lmap 两 Shot=2026-11-05;棋盘三图=2026-11-08 迭代 56 卡 2
|
||||
换代(封印受理即揭示渲染入帧);单基线合并=2026-11-08。**判定先于动作**:每代换代面
|
||||
(视觉/素材/布局改动)跑批时先跑一次渲染闸看差异落不落在裁剪区与容差内——
|
||||
|
||||
- **判有效**(changed 远低于 2% 阈值):基线**留在位**,不得顺手重制;
|
||||
- **判失效**(changed 超阈值或换代面落在裁剪区外):**显式重制 + 呈报 + 复闸**,
|
||||
- **判失效**(changed 超阈值或换代面落在裁剪区外):**显式重制+呈报+复闸**,
|
||||
禁止先动后判、禁止用「重制一下就绿了」掩盖真实视觉回归。
|
||||
- **加严口径(棋盘三图)**:棋盘图 changed>0 且差异像素落在棋盘裁剪区内(1036×548)一律按**判失效**
|
||||
处理——占比远低于 2% 阈值也不判有效,显式呈报后由用户定是否重制。该口径只收紧棋盘三图的判读,
|
||||
不改写 2% 容差本身的语义(`golden_compare.py` 判据不动);启动态菜单不适用本口径。
|
||||
- **越格口径(2026-11-07 棋盘地形换代)**:棋盘地形允许越格绘制——岩顶抬升、南/东崖面、四段投影、
|
||||
- **加严口径(棋盘三图·同平台复跑)**:windows 本地对拍棋盘 changed>0 一律按**判失效**处理——
|
||||
同种子同参数应逐位一致,任何非零差异都可能是真回归,显式呈报后由用户定是否重制;
|
||||
该口径只收紧棋盘三图的判读,不改写 2% 容差本身的语义;启动态菜单不适用本条。
|
||||
- **跨平台对拍(CI mac)**:不适用上一条——跨平台字形锯齿噪声按容差带吸收(2026-11-08 用户裁),
|
||||
changed 落容差带内判有效;超容差即红停批呈报,禁加基线消化。
|
||||
- **越格口径(棋盘地形换代立)**:棋盘地形允许越格绘制——岩顶抬升、南/东崖面、四段投影、
|
||||
浮空数字与引导线均按 art-bible §3.2 越出逻辑格边界;**「禁越圈」只约束类型微光层**(按该格抬升后
|
||||
岩顶面 rect 判,不按逻辑格 rect),不约束地形/小人/浮空层。棋盘金标仍按上一条加严口径整幅严格比对。
|
||||
岩顶面 rect 判,不按逻辑格 rect),不约束地形/小人/浮空层。棋盘金标仍按加严口径整幅严格比对。
|
||||
|
||||
**未建锚面备案**:(2026-11-08 补锚批后备案清零——上列营地/设置/战斗三屏、生涯/状态两屏顺带锚、
|
||||
营地五窗、四浮层全部入锚;此后新画面按 §8.2 扩项机制随批立锚,发现缺失即补、不再登记待置。)
|
||||
|
After Width: | Height: | Size: 216 KiB |
|
After Width: | Height: | Size: 310 KiB |
|
After Width: | Height: | Size: 251 KiB |
|
After Width: | Height: | Size: 248 KiB |
|
After Width: | Height: | Size: 252 KiB |
|
After Width: | Height: | Size: 260 KiB |
|
After Width: | Height: | Size: 493 KiB |
|
After Width: | Height: | Size: 275 KiB |
|
After Width: | Height: | Size: 117 KiB |
|
After Width: | Height: | Size: 217 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 242 KiB |
|
Before Width: | Height: | Size: 251 KiB |
|
Before Width: | Height: | Size: 109 KiB |
|
Before Width: | Height: | Size: 127 KiB |
|
Before Width: | Height: | Size: 125 KiB |
|
Before Width: | Height: | Size: 329 KiB |
|
After Width: | Height: | Size: 18 KiB |
|
After Width: | Height: | Size: 194 KiB |
@@ -0,0 +1 @@
|
||||
uid://dpk58o5aqeht5
|
||||
@@ -0,0 +1 @@
|
||||
uid://djqye4hpwgjjr
|
||||
@@ -0,0 +1 @@
|
||||
uid://ch2u8pvad2upd
|
||||