合并(美术圣经去数值化+文档结构搬移批): 两笔合入(77c1d360 结构搬移+85abe37c 去数值化)——design/gdd/ux 上提 design/ux 三目录同级(49 文件链接与声明同步)+art-bible v3.44 全文定值剥离(头注定值单点纪律, hex 清零, 数量面归执行件)+执行件三件(互辨抽测件 E 门子带检查/帧数规格守门测试/token 板两两互查守门测试, manifest 86 套)+art-pipeline-tools 升格执行件门值登记面+下游复写换代九件+待办去数值化条目闭合与欠账六对条目新立。区内凭据: 全仓 gdd/ux 零残留+熵增闸 PASS+流水线闸 PASS(34 条目)+能力审计红 0+七触碰套件与两新套件单跑 all green+--docs 域闸【验收通过】exit=0; 合回前置检查读数见本提交落地态; post-merge 钩子推送触发远端 CI
ci / gates (push) Successful in 7m2s
ci / gates (push) Successful in 7m2s
# Conflicts: # reports/需求卡片-营地交互修复批-2026-11-05.md # 待办清单.md
This commit is contained in:
commit
2a17260c8e
61 files changed
+486
-273
No files matched your search
@@ -2,7 +2,7 @@
|
||||
// 封印印记(卡④ 法阵化批)——环+十字+环外压暗光圈,canvas_item 距离场实时绘制(无贴图缩放,
|
||||
// 格边 26–46px 连续可变下任意格边清晰)。
|
||||
// 事实源:art-bible v3.41 §3.2「封印印记」(形/画法/光圈/层序纪律)+ §8.2「封印印记参数表」;
|
||||
// gdd/ux/battle.md「棋盘格尺寸公式」(格边 clampi 26–46)。
|
||||
// design/ux/battle.md「棋盘格尺寸公式」(格边 clampi 26–46)。
|
||||
// 纪律:参数五枚+色全由 gd 侧逐次注入(参数单点 = ui_kit SEAL_* 五常量——禁在此改值,
|
||||
// 下方默认值仅为兜底且与 §8.2 同值);光圈不出格(半径夹 cell_px/2);
|
||||
// 零动效(不呼吸不脉冲——§2.1 挖掘期唯一在动 = 接触带微光);印记与光圈同用一色(光圈只改 alpha)。
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# VERTICAL SLICE - NOT FOR PRODUCTION
|
||||
# 布局几何断言探针(现行事实源=tools/probe_gate.sh 默认段;呈现层三区布局的分辨率维度验收)
|
||||
# 用途:battle.md §验收「1280×800 与 16:9 全屏下三区无遮挡/无重叠/无裁切」的可执行化
|
||||
# GDD 锚:design/gdd/ux/battle.md §Layout Zones(B/C/D 三区几何)
|
||||
# GDD 锚:design/ux/battle.md §Layout Zones(B/C/D 三区几何)
|
||||
# 硬约束:档位表是数据、断言是一份函数据——加档只改表不动断言(禁每档建一个探针)
|
||||
extends Node
|
||||
|
||||
|
||||
@@ -22,14 +22,14 @@ var _runner # 当前停点的单关 runner(open_choices 驱动随记——
|
||||
|
||||
|
||||
func _check(desc: String, ok: bool) -> void:
|
||||
# oracle: design/gdd/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||
# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||
_checks += 1
|
||||
if not ok:
|
||||
_problems.append(desc)
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
# oracle: design/gdd/ux/level-map.md:3 (关卡画面视口跟随——卷轴视口组)
|
||||
# oracle: design/ux/level-map.md:3 (关卡画面视口跟随——卷轴视口组)
|
||||
await get_tree().process_frame
|
||||
await get_tree().process_frame
|
||||
var host := Control.new()
|
||||
@@ -62,7 +62,7 @@ func _ready() -> void:
|
||||
|
||||
## R1 浅图整幅居中无裁切+画布入视口件承载(画布=视口首子件——setup 注入序)
|
||||
func _probe_shallow_no_crop(screen, vp) -> void:
|
||||
# oracle: design/gdd/ux/level-map.md:3 (浅层不裁切组)
|
||||
# oracle: design/ux/level-map.md:3 (浅层不裁切组)
|
||||
_runner = _make_runner_entry(1, SEED_L1)
|
||||
screen.open_choices(_cand_nodes(_runner), _runner)
|
||||
await get_tree().process_frame
|
||||
@@ -81,7 +81,7 @@ func _probe_shallow_no_crop(screen, vp) -> void:
|
||||
|
||||
## R5 前置+深图入口停点:锚点=入口组包围盒中心夹紧(spec :101——多入口并列取包围盒居中)
|
||||
func _probe_deep_entry_clamp(screen, vp) -> void:
|
||||
# oracle: design/gdd/ux/level-map.md:3 (深层入口钳制组)
|
||||
# oracle: design/ux/level-map.md:3 (深层入口钳制组)
|
||||
_runner = _make_runner_entry(3, SEED_L3)
|
||||
screen.open_choices(_cand_nodes(_runner), _runner)
|
||||
await get_tree().process_frame
|
||||
@@ -175,7 +175,7 @@ func _probe_clamp_bounds_and_columns(screen, vp) -> void:
|
||||
|
||||
## R6 拖拽不触发选路提交;阈值另一侧完整点击仍提交(提交语义零改动)
|
||||
func _probe_drag_no_submit(screen, vp) -> void:
|
||||
# oracle: design/gdd/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||
# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||
# 重建到中段可居中停点(候选=停点出边——候选节点居屏中可拖可达)
|
||||
var stops := _centerable_stops(screen, vp)
|
||||
if stops.size() < 3:
|
||||
@@ -214,7 +214,7 @@ func _probe_drag_no_submit(screen, vp) -> void:
|
||||
|
||||
## R2 停点切换后当前节点居中(视口中线投影 x=640±2——视口满屏宽即屏中线)
|
||||
func _probe_follow_anchor(screen, vp) -> void:
|
||||
# oracle: design/gdd/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||
# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||
var stops := _centerable_stops(screen, vp)
|
||||
if stops.size() < 3:
|
||||
_problems.append("R2 可居中停点不足(=%d)" % stops.size())
|
||||
@@ -230,7 +230,7 @@ func _probe_follow_anchor(screen, vp) -> void:
|
||||
|
||||
## R7 平滑滚动有 tween 中间帧;减动效开=位置即达(画布坐标域判定)
|
||||
func _probe_smooth_scroll_reduced_motion(screen, vp) -> void:
|
||||
# oracle: design/gdd/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||
# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||
var saved_scale: float = UiKit.motion_scale
|
||||
UiKit.motion_scale = 1.0
|
||||
var stops := _centerable_stops(screen, vp)
|
||||
@@ -270,7 +270,7 @@ func _probe_smooth_scroll_reduced_motion(screen, vp) -> void:
|
||||
|
||||
## R8 指引件可见性与几何(深图超窗——像素级判据②③)
|
||||
func _probe_guidance_chrome(screen, vp) -> void:
|
||||
# oracle: design/gdd/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||
# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||
var band_l: Control = vp.get_node_or_null(NodePath("FadeL"))
|
||||
var band_r: Control = vp.get_node_or_null(NodePath("FadeR"))
|
||||
var chip: Control = vp.get_node_or_null(NodePath("PanHint"))
|
||||
@@ -302,7 +302,7 @@ func _probe_shallow_guidance_hidden(screen, vp) -> void:
|
||||
|
||||
## 入口停点 runner(defer_entry——选路态挂起、候选=入口节点)
|
||||
func _make_runner_entry(level_index: int, seed_val: int):
|
||||
# oracle: design/gdd/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||
# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||
var rng = load("res://core/rng_service.gd").new()
|
||||
rng.new_adventure(seed_val)
|
||||
var runner = load("res://core/level_runner.gd").new(get_node("/root/ConfigDB"), rng)
|
||||
@@ -313,7 +313,7 @@ func _make_runner_entry(level_index: int, seed_val: int):
|
||||
|
||||
## 中段停点 runner(断点续玩重建——图由种子+参数档重生成同图,零 RNG 消耗)
|
||||
func _make_runner_at_stop(level_index: int, seed_val: int, node_id: int):
|
||||
# oracle: design/gdd/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||
# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||
var rng = load("res://core/rng_service.gd").new()
|
||||
rng.new_adventure(seed_val)
|
||||
var runner = load("res://core/level_runner.gd").new(get_node("/root/ConfigDB"), rng)
|
||||
@@ -388,7 +388,7 @@ func _extreme_node(pos: Dictionary, nodes: Array, first: bool) -> Dictionary:
|
||||
|
||||
|
||||
func _finish() -> void:
|
||||
# oracle: design/gdd/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||
# oracle: design/ux/level-map.md:3 (判定上报通道——验证函数组)
|
||||
if _checks == 0:
|
||||
_problems.append("零断言执行(断言数下限闸——三硬闸③)")
|
||||
if _problems.is_empty():
|
||||
|
||||
@@ -119,7 +119,7 @@ func _step_boot_menu() -> void:
|
||||
|
||||
# ---- ② 菜单 → 营地(真实按钮信号路径)----
|
||||
func _step_menu_to_camp() -> void:
|
||||
# oracle: design/gdd/ux/camp.md:10 (菜单→营地组)
|
||||
# oracle: design/ux/camp.md:10 (菜单→营地组)
|
||||
# 营地经进档开层(卡② mn9 新路径——campbtn 已撤;槽模板注入隔离命名空间)
|
||||
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_screen_flow_camp"):
|
||||
_problems.append("②菜单→营地:选档层新档钮缺失(新路径驱动中断)")
|
||||
@@ -130,7 +130,7 @@ func _step_menu_to_camp() -> void:
|
||||
|
||||
# ---- ③ 营地 → 菜单(回退路径:篝火二次确认动线——卡④ 营地唯一回菜单出口;选档层随关层收闭同收)----
|
||||
func _step_camp_back_to_menu() -> void:
|
||||
# oracle: design/gdd/ux/camp.md:22 (营地→菜单组)
|
||||
# oracle: design/ux/camp.md:22 (营地→菜单组)
|
||||
if main.ui.modals.camp.scene == null:
|
||||
_problems.append("③营地→菜单:营地场景根句柄缺失〔句柄子容器批 V1〕")
|
||||
return
|
||||
@@ -194,7 +194,7 @@ func seals_check_single(f: Dictionary) -> bool:
|
||||
|
||||
|
||||
func _step_menu_to_adventure() -> void:
|
||||
# oracle: design/gdd/ux/level-map.md:11 (菜单→冒险组)
|
||||
# oracle: design/ux/level-map.md:11 (菜单→冒险组)
|
||||
# 开始冒险钮已随三入口化撤出——函数直调中间态(卡② mn10;卡④ 大门两分支换代)
|
||||
main._start_adventure_from_menu()
|
||||
await _frames(3)
|
||||
@@ -208,7 +208,7 @@ func _step_menu_to_adventure() -> void:
|
||||
|
||||
# ---- ⑤ 冒险内屏切换:关卡地图屏 ⇄ 战斗屏(屏内两态,屏级仍独占)----
|
||||
func _step_level_to_battle_and_back() -> void:
|
||||
# oracle: design/gdd/ux/battle.md:57 (冒险内切换组)
|
||||
# oracle: design/ux/battle.md:57 (冒险内切换组)
|
||||
if not main.ui.modals.run.level_screen.visible:
|
||||
_problems.append("⑤冒险内切换:前置不在关卡地图屏")
|
||||
return
|
||||
@@ -228,7 +228,7 @@ func _step_level_to_battle_and_back() -> void:
|
||||
|
||||
# ---- ⑥ 放弃 → 终局(放弃路径=回退路径的非正常出口)----
|
||||
func _step_abandon_to_end() -> void:
|
||||
# oracle: design/gdd/ux/level-map.md:42 (放弃→终局组)
|
||||
# oracle: design/ux/level-map.md:42 (放弃→终局组)
|
||||
if main.run_scope == null or main.run_scope.adventure == null:
|
||||
_problems.append("⑥放弃→终局:前置无冒险实例")
|
||||
return
|
||||
@@ -241,7 +241,7 @@ func _step_abandon_to_end() -> void:
|
||||
|
||||
# ---- ⑦ 终局 → 菜单(终局出口返回开始界面)----
|
||||
func _step_end_back_to_menu() -> void:
|
||||
# oracle: design/gdd/ux/settlement-summary.md:24 (终局→菜单组)
|
||||
# oracle: design/ux/settlement-summary.md:24 (终局→菜单组)
|
||||
if main.ui.modals.run.end_overlay == null or not main.ui.modals.run.end_overlay.visible:
|
||||
_problems.append("⑦终局→菜单:前置不在终局")
|
||||
return
|
||||
@@ -254,7 +254,7 @@ func _step_end_back_to_menu() -> void:
|
||||
|
||||
# ---- ③' 营地 Esc 浮窗+HUD(卡⑤——真实键盘合成路径 push_input;四态路由+三出口+语境分支+余额单口)----
|
||||
func _step_camp_esc_and_hud() -> void:
|
||||
# oracle: design/gdd/ux/camp.md:45 (Esc 段组)
|
||||
# oracle: design/ux/camp.md:45 (Esc 段组)
|
||||
ProbeUiUtil.isolate_save(main, "smoke_screen_flow_esc", false, false, true)
|
||||
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_screen_flow_esc"):
|
||||
_problems.append("[esc] 营地入口缺失(选档层新档钮驱动中断)〔ESC批 V1〕")
|
||||
@@ -320,7 +320,7 @@ func _step_camp_esc_and_hud() -> void:
|
||||
# 判的是呈现形态换壳(近全屏面板→居中定尺寸窗壳 720×640):窗几何/场景根留底/遮罩 0.6/关闭钮/
|
||||
# 互斥单开/ESC 优先序/窗内滚动/生涯同壳——行为面(开合路由)零改,只钉窗壳可观测提交面。
|
||||
func _step_camp_window_shell() -> void:
|
||||
# oracle: design/gdd/ux/camp.md:45 (窗壳 V1–V8 组)
|
||||
# oracle: design/ux/camp.md:45 (窗壳 V1–V8 组)
|
||||
ProbeUiUtil.isolate_save(main, "smoke_screen_flow_winshell", false, false, true)
|
||||
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_screen_flow_winshell"):
|
||||
_problems.append("[winshell] 营地入口缺失(选档层新档钮驱动中断)〔窗口化批 V1〕")
|
||||
@@ -478,7 +478,7 @@ func _step_camp_window_shell() -> void:
|
||||
|
||||
# 清窗经真实钮(逐窗巡检 visible→钮 pressed——栈 close 恢复账随层清空)
|
||||
func _close_all_windows(views: Dictionary) -> void:
|
||||
# oracle: design/gdd/ux/camp.md:45 (清窗组)
|
||||
# oracle: design/ux/camp.md:45 (清窗组)
|
||||
for k: StringName in [&"forge", &"chest", &"dummy", &"board"]:
|
||||
var w: Control = views[k]
|
||||
if not w.visible:
|
||||
|
||||
@@ -103,7 +103,7 @@ func _ready() -> void:
|
||||
ProbeUiUtil.push_click(main, set_close)
|
||||
await get_tree().process_frame
|
||||
# ①c 生涯页(函数直调中间态——卡② mn10:careerbtn 已撤,卡④ 笔记本改挂前无 UI 路径)
|
||||
# oracle: design/gdd/ux/camp.md:45 生涯页与四子界面同壳同形态(生涯组)
|
||||
# oracle: design/ux/camp.md:45 生涯页与四子界面同壳同形态(生涯组)
|
||||
if true:
|
||||
main._open_career()
|
||||
for i in 3:
|
||||
@@ -123,7 +123,7 @@ func _ready() -> void:
|
||||
if main.ui.modals.menu.career_overlay.visible or not main.ui.screens.start_overlay.visible:
|
||||
_problems.append("生涯页关闭后页未隐藏或开始层未恢复")
|
||||
# ② 营地场景图(进档开层新路径——卡② mn9;截图=可点击场景图形态——卡④ 契约 9 V1 验收载体)
|
||||
# oracle: design/gdd/ux/camp.md:16 营地=可点击场景图(七物件命中区表——场景图形态组)
|
||||
# oracle: design/ux/camp.md:16 营地=可点击场景图(七物件命中区表——场景图形态组)
|
||||
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_shot_probe_camp"):
|
||||
_problems.append("营地入口缺失(选档层新档钮——新路径驱动中断)〔句柄子容器批 V1〕")
|
||||
else:
|
||||
@@ -132,16 +132,16 @@ func _ready() -> void:
|
||||
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) # 二次确认离场(关层收闭——选档层随收)
|
||||
# oracle: design/gdd/ux/camp.md:22 篝火=离开营地回主菜单、必须二次确认(篝心动线组)
|
||||
# oracle: design/ux/camp.md:22 篝火=离开营地回主菜单、必须二次确认(篝心动线组)
|
||||
await get_tree().process_frame
|
||||
# ③ 关卡画面(开始冒险→停点出图——入口停点语义;函数直调中间态 mn10)
|
||||
# oracle: design/gdd/ux/level-map.md:11 入口停点候选数=入口个数(关卡画面出图组)
|
||||
# oracle: design/ux/level-map.md:11 入口停点候选数=入口个数(关卡画面出图组)
|
||||
main._start_adventure_from_menu()
|
||||
for i in 4:
|
||||
await get_tree().process_frame
|
||||
await _snap("level")
|
||||
# GP 常驻徽章断言(读数=runner.gp 现值,刷新=写路径回执后重查〔open_choices〕)
|
||||
# oracle: design/gdd/ux/level-map.md:77 GP 常驻徽章=GP 图标+数字(冒险钱包读数;写路径回执后重查)
|
||||
# oracle: design/ux/level-map.md:77 GP 常驻徽章=GP 图标+数字(冒险钱包读数;写路径回执后重查)
|
||||
var gp_label: Label = ProbeUiUtil.find_label(main.ui.modals.run.level_screen, "◈ ")
|
||||
if gp_label == null or not gp_label.is_visible_in_tree():
|
||||
_problems.append("GP 徽章不可见(关卡画面顶栏)")
|
||||
@@ -150,7 +150,7 @@ func _ready() -> void:
|
||||
if gp_label.text != expect:
|
||||
_problems.append("GP 徽章读数不符: %s != %s" % [gp_label.text, expect])
|
||||
# ④ 战斗(节点一——candidate_rect 命中矩形真点选路提交,ui_click_probe 同款)
|
||||
# oracle: design/gdd/ux/battle.md:122 B 区构建:站桩/明细带/轮次指示(战斗出图与几何锚组)
|
||||
# oracle: design/ux/battle.md:122 B 区构建:站桩/明细带/轮次指示(战斗出图与几何锚组)
|
||||
if main.ui.modals.run.level_screen != null and main.ui.modals.run.level_screen.visible:
|
||||
ProbeUiUtil.push_click_at(main, main.ui.modals.run.level_screen.candidate_rect(0).get_center())
|
||||
for i in 10:
|
||||
|
||||
@@ -13,7 +13,7 @@ var _problems: Array = []
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
# oracle: design/gdd/ux/battle.md:122 (明细带挖掘期收起——T17 视觉扩展时序组)
|
||||
# oracle: design/ux/battle.md:122 (明细带挖掘期收起——T17 视觉扩展时序组)
|
||||
await get_tree().process_frame
|
||||
main = load("res://presentation/main.tscn").instantiate()
|
||||
add_child(main)
|
||||
|
||||
@@ -385,7 +385,7 @@ func _ready() -> void:
|
||||
if ProbeUiUtil.find_button(main.ui.modals.menu.settings_overlay, "退出游戏", "prefix") != null:
|
||||
_problems.append("设置面仍含退出游戏按钮(二轮 D1——只在一级菜单出现)")
|
||||
# ---- 生涯页段(入口点击链+关闭回返,真实按钮信号路径;本页只读零写,
|
||||
# oracle: design/gdd/ux/camp.md:45 (生涯页段——同壳同形态组)
|
||||
# oracle: design/ux/camp.md:45 (生涯页段——同壳同形态组)
|
||||
# 值断言归冒烟投影段与 ui_struct 结构族,此处只验开合路径与零跳转)----
|
||||
# 生涯页驱动=函数直调中间态(卡② mn10——careerbtn 已撤,卡④ 笔记本改挂前无 UI 路径)
|
||||
if true:
|
||||
@@ -640,7 +640,7 @@ func _ready() -> void:
|
||||
_run_modal_probes_once()
|
||||
_play_one_action()
|
||||
# ---- 预算耗尽收口(T17 硬锁批适配):选件变强后 probe 可能活过预算不再战败——断点段前提
|
||||
# oracle: design/gdd/ux/level-map.md:11 (主循环选路段——入口候选组)
|
||||
# oracle: design/ux/level-map.md:11 (主循环选路段——入口候选组)
|
||||
# (冒险终局面在案)须主动满足。收口驱动:任何停点层逐个推进(复用主循环分支语义)至
|
||||
# level_screen 选路停点→真实放弃二击→终局面。战斗中则继续 autoplay 打完。
|
||||
if not _done and not main.ui.modals.run.end_overlay.is_open():
|
||||
@@ -721,7 +721,7 @@ func _ready() -> void:
|
||||
# ① 战斗收口断点写盘断言保留(上方——冒险流直调中间态 mn10)。
|
||||
|
||||
# ---- 大门两分支断言段(卡④ T5 接收——卡② 移交落点;V3 断言面)----
|
||||
# oracle: design/gdd/ux/camp.md:16 (大门段——点大门先出确认组)
|
||||
# oracle: design/ux/camp.md:16 (大门段——点大门先出确认组)
|
||||
# 驱动=营地场景根点选信号(真实路由)→组合根 _on_camp_object_pressed→确认弹窗。
|
||||
# 无断点=两出口(是/否);有断点=三出口(set_breakpoint 注入选路停点形——同下方开场行③先例)。
|
||||
# 判据绑可观测提交面:点大门不直接进冒险(is_adventure 翻转只在 confirmed 后);cancelled 恒=
|
||||
|
||||
@@ -27,7 +27,7 @@ func _pairs() -> Array:
|
||||
["RAP标签", UiKit.INK_LABEL, UiKit.PANEL_DATA, 1.0], # N1-7(T0 实测已合规,显式化)
|
||||
["锚·正文墨/数据板", UiKit.INK, UiKit.PANEL_DATA, 1.0], # 全站锚点:正文墨对数据板
|
||||
["锚·暖白/屏根", UiKit.WARM, UiKit.BG_ROOT, 1.0], # 全站锚点:暗底正文
|
||||
["锚·暖白弱/舞台底", UiKit.WARM_FAINT, UiKit.SLOT_BACKDROP, 1.0], # 全站锚点:B区辅助墨(合并目标——art-bible §4.1 换色合并③)
|
||||
["锚·暖白弱/舞台底", UiKit.WARM_FAINT, UiKit.SLOT_BACKDROP, 1.0], # 全站锚点:B区辅助墨(合并目标色,换色合并沿革查 git 提交史)
|
||||
["钥石徽·深墨/烛光黄", UiKit.INK_ON_GOLD, UiKit.CANDLE, 1.0], # badge 工厂件文字(营地徽+状态面板余额行同形制)
|
||||
["生涯页·行名墨/暖亮页底", UiKit.WARM, UiKit.BG_BRIGHT, 1.0], # 生涯页行名列/提示文(WARM_SOFT 同族亮墨)
|
||||
["生涯页·行值墨/暖亮页底", UiKit.CANDLE, UiKit.BG_BRIGHT, 1.0], # 生涯页数值列(烛光黄 bold)
|
||||
|
||||
@@ -301,7 +301,7 @@ func _ready() -> void:
|
||||
if not ms.is_revealed(dig_t):
|
||||
_problems.append("case⑥ 核心揭格未落位(目标=%s)" % dig_t)
|
||||
# ---- case⑦ 英雄精灵世界落位(回归闸):精灵在 SubViewport 世界内,
|
||||
# oracle: design/gdd/ux/battle.md:154 主角站桩立绘带落影、贴脚与缩放档(case⑦-⑩ 呈现落位)
|
||||
# oracle: design/ux/battle.md:154 主角站桩立绘带落影、贴脚与缩放档(case⑦-⑩ 呈现落位)
|
||||
# 落位 = 格×步距 + 脚底锚(横=格中线/纵=格底往上 25% 线=HERO_GROUND_FRAC 自底边口径——「脚踩
|
||||
# 格子 1/4 处·从下往上数」;禁带壳层 _svp_container.position 居中偏移——上批误用壳层
|
||||
# cell_origin 实测右偏 ~7 格+偏离格心,实机截图用户报缺陷)。素材缺位树(hero==null,字形
|
||||
|
||||
@@ -16,7 +16,7 @@ func _ready() -> void:
|
||||
await get_tree().process_frame
|
||||
var problems: Array = []
|
||||
# ---- 放弃入口(台账 119):默认隐藏(非冒险模式无冒险可放弃——开始层/调试两层)----
|
||||
# oracle: design/gdd/ux/level-map.md:59 放弃冒险入口=边缘动作、任意选路停点承载——非冒险模式无入口(默认隐藏)
|
||||
# oracle: design/ux/level-map.md:59 放弃冒险入口=边缘动作、任意选路停点承载——非冒险模式无入口(默认隐藏)
|
||||
if main.ui.modals.run.level_screen.abandon_btn == null or main.ui.modals.run.level_screen.abandon_btn.visible:
|
||||
print("[ui_probe] FAIL — 放弃按钮默认应隐藏(非冒险模式关)")
|
||||
get_tree().quit(1)
|
||||
@@ -24,7 +24,7 @@ func _ready() -> void:
|
||||
# ---- 营地覆盖层(主菜单入口/开合/余额文案/购买禁用态;
|
||||
# 隔离存档换注 main.meta 保确定性(禁碰真实档 user://save.json——SaveManager 路径注入纪律;
|
||||
# 营地先行段只换 meta 不换 save_manager——冒险段换注零档在前)----
|
||||
# oracle: design/gdd/ux/camp.md:45 五功能窗统一窗壳、五窗互斥单开、各窗自带关闭钮(营地开合组)
|
||||
# oracle: design/ux/camp.md:45 五功能窗统一窗壳、五窗互斥单开、各窗自带关闭钮(营地开合组)
|
||||
ProbeUiUtil.isolate_save(main, "smoke_ui_probe_camp", false, false, false)
|
||||
if not await ProbeUiUtil.open_camp_via_savesel(main, "smoke_ui_probe_camp"):
|
||||
problems.append("营地入口缺失(选档层新档钮——mn9 新路径驱动中断)〔句柄子容器批 V1〕")
|
||||
@@ -36,12 +36,12 @@ func _ready() -> void:
|
||||
problems.append("营地层打开时开始层未隐藏(规范 2.3 遮挡纪律)〔句柄子容器批 V1〕")
|
||||
else:
|
||||
# 天赋树子界面(场景点选真实路由——木桩命中区进树界面;卡④ T5 深员改指)
|
||||
# oracle: design/gdd/ux/camp.md:20 木桩命中区→天赋树界面入口(场景点选路由)
|
||||
# oracle: design/ux/camp.md:20 木桩命中区→天赋树界面入口(场景点选路由)
|
||||
ProbeUiUtil.push_click_at(main, main.ui.modals.camp.scene.get_hotspot_rect(&"dummy").get_center())
|
||||
await get_tree().process_frame
|
||||
if not main.ui.modals.camp.tree.visible:
|
||||
problems.append("天赋树子界面未打开(场景点选路由中断)〔营地图批 V2〕")
|
||||
# oracle: design/gdd/ux/camp.md:41 钥石余额常驻画面顶部 HUD 栏(余额文案组)
|
||||
# oracle: design/ux/camp.md:41 钥石余额常驻画面顶部 HUD 栏(余额文案组)
|
||||
if not String(main.ui.modals.camp.tree._balance_label.text).begins_with("钥石"):
|
||||
problems.append("营地余额文案缺失(%s)〔句柄子容器批 V1〕" % main.ui.modals.camp.tree._balance_label.text)
|
||||
if main.ui.modals.camp.tree._tree_buy_btns.is_empty():
|
||||
@@ -57,7 +57,7 @@ func _ready() -> void:
|
||||
ProbeUiUtil.push_click(main, ProbeUiUtil.find_button(main.ui.modals.camp.tree, "返回营地")) # 真点底栏返回钮→_emit_closed(camp_sub_view_base.gd:66-84)
|
||||
await get_tree().process_frame
|
||||
# 秘宝匣子界面(场景点选真实路由——宝箱命中区)
|
||||
# oracle: design/gdd/ux/camp.md:18 宝箱命中区→秘宝匣界面入口
|
||||
# oracle: design/ux/camp.md:18 宝箱命中区→秘宝匣界面入口
|
||||
ProbeUiUtil.push_click_at(main, main.ui.modals.camp.scene.get_hotspot_rect(&"chest").get_center())
|
||||
await get_tree().process_frame
|
||||
if main.ui.modals.camp.treasure._workshop_rows.size() != 12:
|
||||
@@ -76,7 +76,7 @@ func _ready() -> void:
|
||||
await get_tree().process_frame
|
||||
# ---- 入口选路停点(关卡开始即出节点图——level_started 后、首战前弹选路层;
|
||||
# candidate_rect 命中矩形真点 pick 入口单候选进首战)----
|
||||
# oracle: design/gdd/ux/level-map.md:11 入口停点候选数=入口个数(入口单候选断言)
|
||||
# oracle: design/ux/level-map.md:11 入口停点候选数=入口个数(入口单候选断言)
|
||||
# ---- 独立性断言(独立屏激活期战斗屏宿主整体隐藏,零透出)----
|
||||
if not main.ui.modals.run.level_screen.visible:
|
||||
problems.append("关卡开始未弹入口选路停点(level_screen 应可见)")
|
||||
@@ -92,7 +92,7 @@ func _ready() -> void:
|
||||
if not main.ui.screens.battle_root.visible or main.ui.modals.run.level_screen.visible:
|
||||
problems.append("选路提交战斗节点后未切回战斗屏(屏级互斥恢复失守)")
|
||||
# ---- 放弃入口·冒险模式可见 + 战斗中按下被拒(真实按钮路径——入口挂选路停点,战斗中拒绝为防御分支)----
|
||||
# oracle: design/gdd/ux/level-map.md:42 放弃冒险(任意选路停点)→ 冒险落幕——战斗域单事务在飞时拒绝
|
||||
# oracle: design/ux/level-map.md:42 放弃冒险(任意选路停点)→ 冒险落幕——战斗域单事务在飞时拒绝
|
||||
if main.ui.modals.run.level_screen.abandon_btn == null or not main.ui.modals.run.level_screen.abandon_btn.visible:
|
||||
problems.append("冒险模式放弃按钮未开放(选路停点入口在案)")
|
||||
else:
|
||||
@@ -101,7 +101,7 @@ func _ready() -> void:
|
||||
if main.run_scope.adventure == null or String(main.run_scope.adventure.state) != "running":
|
||||
problems.append("首战中放弃未被拒(战斗域单事务在飞——state 应保持 running)")
|
||||
# ---- 既有断言(回归基线;A 区无进度条——节点链进度由关卡画面独立屏承载)----
|
||||
# oracle: design/gdd/ux/battle.md:122 B 区构建组:主角与敌人站桩、明细带挖掘期收起、轮次指示、棋盘与 C 区/秘宝槽、首战进行中
|
||||
# oracle: design/ux/battle.md:122 B 区构建组:主角与敌人站桩、明细带挖掘期收起、轮次指示、棋盘与 C 区/秘宝槽、首战进行中
|
||||
if main.ui.battle.board_zone.board_view.cells_probe().is_empty():
|
||||
problems.append("棋盘格未生成(cells=0)")
|
||||
if main.ui.battle.board_zone.board_view.board() == null:
|
||||
@@ -237,7 +237,7 @@ func _ready() -> void:
|
||||
# ---- GP 终局行:summary gp_final 键取数+胜利面板 GP 行呈现(C5:GP 行只上冒险终局面板;
|
||||
# 断言面 = summary 键,无影子账清零转存)----
|
||||
# (置于战斗态断言之后——合成收束会灰化站桩并清 settlement 引用,具污染性)
|
||||
# oracle: design/gdd/ux/settlement-summary.md:20 战利品行=GP 增量+总量(冒险终局面板 GP 行组)
|
||||
# oracle: design/ux/settlement-summary.md:20 战利品行=GP 增量+总量(冒险终局面板 GP 行组)
|
||||
var meta_saved = main.meta.save
|
||||
for p2 in ["user://smoke_ui_probe_settle_scratch.json", "user://smoke_ui_probe_settle_scratch.json.tmp"]:
|
||||
if FileAccess.file_exists(p2):
|
||||
|
||||
@@ -89,7 +89,7 @@ func _ready() -> void:
|
||||
# ---- 生涯页:入口=帐篷旁笔记本(卡④ T3 改挂——场景点选信号真实路由→组合根 _open_career)→
|
||||
# 结构断言族→只读巡检(契约 3)+零动效契约+零跳转契约(提纲 P4 甲)→组合根真实路径关闭。
|
||||
#(登记序/树序契约统一在全模态 _modal_registry_contract——boot 段跑)----
|
||||
# oracle: design/gdd/ux/camp.md:19 帐篷旁笔记本→生涯记录;生涯页返回钮口径由结构校验兜底(生涯段)
|
||||
# oracle: design/ux/camp.md:19 帐篷旁笔记本→生涯记录;生涯页返回钮口径由结构校验兜底(生涯段)
|
||||
# 营地语境:开始层全程隐藏(笔记本入口在营地场景根——关生涯回营地不回开始层,卡④ T3 语境分支)
|
||||
main._camp_pres.open_camp() # 重开营地场景根(笔记本入口语境)
|
||||
_settle()
|
||||
@@ -106,7 +106,7 @@ func _ready() -> void:
|
||||
if main.ui.modals.menu.career_overlay.visible or main.ui.screens.start_overlay.visible:
|
||||
problems.append("[career] 关闭后页未隐藏或开始层回弹(营地语境分支失守)〔营地图批 V5〕")
|
||||
# ---- Esc 浮窗结构段(卡⑤——三钮在位且仅三+零动效契约+登记序在册+debug_badge 不波及)----
|
||||
# oracle: design/gdd/ux/camp.md:45 ESC 优先序:有窗先关最上层窗、无窗才进浮窗;各窗自带关闭钮(Esc 段)
|
||||
# oracle: design/ux/camp.md:45 ESC 优先序:有窗先关最上层窗、无窗才进浮窗;各窗自带关闭钮(Esc 段)
|
||||
main._camp_pres.open_camp()
|
||||
_settle()
|
||||
var gpos_gate: Vector2 = main.ui.modals.camp.scene.get_hotspot_rect(&"gate").get_center()
|
||||
@@ -213,7 +213,7 @@ func _ready() -> void:
|
||||
_settle()
|
||||
|
||||
# ---- 冒险簇(真流推进:开冒险→地图选路态→选战斗节点→战斗 HUD)----
|
||||
# oracle: design/gdd/ux/level-map.md:3 图上点击选路·候选按钮退役(冒险簇选路真点组)
|
||||
# oracle: design/ux/level-map.md:3 图上点击选路·候选按钮退役(冒险簇选路真点组)
|
||||
ProbeUiUtil.isolate_save(main, "smoke_ui_struct_probe_adv", true, false, true)
|
||||
main.ui.modals.menu.debug_overlay.seed_edit.text = "42" # 种子钉死(种子框默认为空=非首局随机,结构采样确定性禁依赖默认分支)
|
||||
main._start_adventure_from_menu()
|
||||
@@ -648,7 +648,7 @@ func _modal_registry_contract(main: Node) -> void:
|
||||
|
||||
# ⑬career 零跳转契约(提纲 P4 甲——页内零「前往他处」入口:除「返回」外任何导航钮=红)
|
||||
func _career_nojump_contract(main: Node) -> void:
|
||||
# oracle: design/gdd/ux/camp.md:19 生涯记录入口与返回钮口径由结构校验兜底——页内零导航入口(零跳转契约组)
|
||||
# oracle: design/ux/camp.md:19 生涯记录入口与返回钮口径由结构校验兜底——页内零导航入口(零跳转契约组)
|
||||
for nav in ["营地", "商店", "设置", "冒险", "继续上局", "退出", "前往"]:
|
||||
if ProbeUiUtil.find_button(main.ui.modals.menu.career_overlay, nav, "contains") != null:
|
||||
problems.append("[career][nojump] 页内出现导航入口「%s」(零跳转违约——生涯纯只读)" % nav)
|
||||
@@ -658,7 +658,7 @@ func _career_nojump_contract(main: Node) -> void:
|
||||
# (名行基线离盒底 1px 同型高危写法返修回归闸;
|
||||
# 内容矩形=StandeeBody.content_rect(),最低绘制元素=底座下缘)
|
||||
func _standeefit_contract(main: Node) -> void:
|
||||
# oracle: design/gdd/ux/battle.md:154 主角站桩立绘(无框立绘+落影)——站桩内容矩形⊆舞台(站桩适配组)
|
||||
# oracle: design/ux/battle.md:154 主角站桩立绘(无框立绘+落影)——站桩内容矩形⊆舞台(站桩适配组)
|
||||
var st: Node = main.ui.battle.stage
|
||||
if st == null or st.hero_standee == null:
|
||||
problems.append("[standee] 舞台/主角站桩缺失(断言中断)")
|
||||
|
||||
@@ -135,13 +135,14 @@ tests/
|
||||
| 模态句柄分域寻址面 | HUD框架 | 局内/菜单/营地三子容器句柄经注册面合同寻址(`UiRegistry.node()` 逐键取层)+模态编排口开合(`ModalFlow.open()`/`ModalFlow.close()`) | `ui_struct_probe.gd:_modal_registry_contract`(registry 合同序段+分域句柄段) |
|
||||
| 未开格类型微光(8 邻作用集/五组色相/零玩法写入) | HUD框架 | `BoardView.type_glow_probe()`/`UiKit.glow_group_for_cell_type()` | `theme_projection_test.gd:_smoke_type_glow`;`type_glow_test.gd:_test_grouping_closed`;`type_glow_test.gd:_test_frozen_hue_face` |
|
||||
| 棋盘悬停反馈(三语义光标/目标格边框/路径预览点迹) | HUD框架 | `ui_input_probe` 合成鼠标事件→`BoardView._gui_input()`;读面 `BoardView.hover_probe()` | `ui_input_probe.gd:_ready`(case①到达②禁入③路径预览三语义) |
|
||||
| UI 全局主题与按钮五态(含对比度锚) | HUD框架 | `UiKit.button()`/`UiKit.primary_button()` | `theme_projection_test.gd:_smoke_global_theme`;`theme_projection_test.gd:_smoke_button_five_states`;`theme_projection_test.gd:_smoke_contrast_inks` |
|
||||
| UI 全局主题与按钮五态(含对比度锚) | HUD框架 | `UiKit.button()`/`UiKit.primary_button()` | `theme_projection_test.gd:_smoke_global_theme`;`theme_projection_test.gd:_smoke_button_five_states`;`theme_projection_test.gd:_smoke_contrast_inks`;`palette_token_pairwise_test.gd:_test_pairwise`(色板近色纪律存量面) |
|
||||
| 中文字体随包与字形覆盖 | HUD框架 | `UiKit.load_font()` | `ui_font_asset_test.gd:_init`;`theme_projection_test.gd:_smoke_global_theme` |
|
||||
| 地形瓦片套与格面数字可读 | HUD框架 | `TilePalette.digit_ink_mode()`/`TilePalette.normalize_floor_luma()` | `terrain_tile_sets_test.gd:_test_set_completeness`;`terrain_tile_sets_test.gd:_test_hue_domains`;`terrain_tile_sets_test.gd:_test_digit_ink_modes` |
|
||||
| 站桩敌人呈现与结算演出落点 | 战斗表现 | `BattleStageView.enemy_standee_center()`/`BattleEndOverlay.open_victory()` | `standee_fx_sweep_test.gd:_init`;`pacing_queue_test.gd:_init` |
|
||||
| 站桩呈现定值与素材绑定 | 战斗表现 | `UiKit.load_tex()`/`StandeeBody.name_line_probe()` | `standee_present_values_test.gd:_init` |
|
||||
| 站桩显示档与素材分辨率绑定 | 战斗表现 | `StandeeBody.portrait_probe()`/`StandeeMotion.PORTRAIT_DISPLAY_H` | `standee_present_values_test.gd:_check_display_tier` |
|
||||
| B 区舞台背景三关变体与连续地面层(按 board_type 选图/地面层高度读布局表/四柱光柱退役) | HUD框架 | `BattleStageView.set_board_type()` | `stage_background_test.gd:_test_background_selection`;`stage_background_test.gd:_test_ground_layer_geometry`;`stage_background_test.gd:_test_beams_retired` |
|
||||
| 动画帧数规格(待机/攻击/受击;现役单帧形制锚定) | 战斗表现 | `UiKit.load_tex()`(`TEX_HERO_*` 四态件装载链——棋盘站立/行走与舞台三态同源) | `animation_frame_spec_test.gd:_test_spec_table`;`animation_frame_spec_test.gd:_test_current_form` |
|
||||
| 战斗屏三区几何与棋盘格边长(分辨率两档×四档板型) | HUD框架 | `BoardView.set_cell_area()`(D 区可用面积 → 格边长);读面 `BoardView.cell_size` | `layout_probe.gd:_ready`;`board_gen_reward_test.gd:_smoke_layout_cell_formula` |
|
||||
| 调参测速批量模拟(逐帧步进与统计读数) | 调参测量 | `TuneSimController.run()`(调试浮窗批量模拟入口) | `tune_sim_batch_parity_test.gd:_init`(配对对拍套件) |
|
||||
| sim 驱动循环单点(缺省零变化与策略/日志回调形态) | 调参测量 | `BattleDriver.drive_round()`(两参缺省与五参回调两形态) | `battle_driver_drive_test.gd:_smoke_drive_round_contract` |
|
||||
|
||||
@@ -206,6 +206,8 @@ func _suites() -> Array:
|
||||
{"path": "res://tests/unit/presentation/forge_workbench_test.gd", "expect": 0}, # 工作间两区六路线 UI 直验(V13 自动化前置面)
|
||||
{"path": "res://tests/unit/presentation/camp_scene_layout_test.gd", "expect": 0}, # 营地场景布局数据件校验(V14——fail-fast 判据+七命中区几何红线)
|
||||
{"path": "res://tests/unit/presentation/stage_background_test.gd", "expect": 0}, # B 区舞台背景三关变体与连续地面层(V1–V5/V8——ground_h 表单源/board_type 选图/缺图回退/地面几何/光柱退役)
|
||||
{"path": "res://tests/unit/presentation/animation_frame_spec_test.gd", "expect": 0}, # 动画帧数规格守门(帧数档定值面=本套件——规格表冻结+现役单帧形制锚定)
|
||||
{"path": "res://tests/unit/presentation/palette_token_pairwise_test.gd", "expect": 0}, # token 板两两互查守门(色板增量纪律存量面——豁免账外零近色对,六对欠账在册)
|
||||
{"path": "res://tests/unit/battle_settlement/damage_math_test.gd", "expect": 0},
|
||||
{"path": "res://tests/unit/battle_settlement/damage_controller_test.gd", "expect": 0},
|
||||
{"path": "res://tests/unit/battle_settlement/effect_port_test.gd", "expect": 0}, # 效果端口件(效果端口与掷格分件批 V1–V3——端口单实例/业务类零引擎直连源码锚/事实面闭集两对照)
|
||||
|
||||
@@ -608,7 +608,7 @@ func _smoke_lifecycle_matrix() -> void:
|
||||
|
||||
|
||||
func _smoke_camp_hud_band() -> void:
|
||||
# oracle: design/gdd/ux/camp.md:41 (营地顶栏栏体定值与落座——几何/色值/吃点击五钉组)
|
||||
# oracle: design/ux/camp.md:41 (营地顶栏栏体定值与落座——几何/色值/吃点击五钉组)
|
||||
print("--- 营地交互修复批 T3 顶栏栏体(R5:色值/铺满/不吃点击/首子件/徽章落座)---")
|
||||
var main: Node = load("res://presentation/main.tscn").instantiate()
|
||||
root.add_child(main)
|
||||
|
||||
@@ -1576,7 +1576,7 @@ func _has_err_category(errs: Array, category: String) -> bool:
|
||||
# ---- 货架位数读表(架构整改——shelf_size 表头单点:进店与重抽同源)----
|
||||
|
||||
func _test_shelf_size_from_table() -> void:
|
||||
# oracle: design/gdd/ux/shop.md:13 (货架位数读表组)
|
||||
# oracle: design/ux/shop.md:13 (货架位数读表组)
|
||||
var autoplay = load("res://sim/level_autoplay.gd")
|
||||
var st = _db.run.shop
|
||||
var saved: int = int(st.shelf_size)
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
uid://ccl0nket4ybvu
|
||||
@@ -0,0 +1,44 @@
|
||||
# tests/unit/presentation/animation_frame_spec_test.gd — 动画帧数规格守门(定值面=本测试)
|
||||
# 断言面:①帧数规格表冻结(待机循环 4 帧/攻击准备 6 帧单次/受击 2 帧——样张冻结定值落码于本表,
|
||||
# 文档侧只述规则并指路本测试);②现役四态单帧形制锚定(idle/walk 32×32、attack 92×92、
|
||||
# hit 88×92——现役为单帧状态件,序列帧资产入包时按规格表逐件判帧数并同批换代本套件);
|
||||
# ③死亡=灰化+碎裂退场(非帧件,无帧数断言面)。
|
||||
# 运行:godot --headless --path game --script res://tests/unit/presentation/animation_frame_spec_test.gd
|
||||
extends SceneTree
|
||||
|
||||
const Kit := preload("res://tests/unit/test_kit.gd")
|
||||
|
||||
# 帧数规格表(样张冻结值——多帧序列帧资产的生产规格;现役单帧占位件不适用本表)
|
||||
const SPEC := {"idle": 4, "attack": 6, "hit": 2}
|
||||
# 现役单帧形制(宽,高)——序列帧资产替换形制时同批修订本表并激活规格逐件断言
|
||||
const CURRENT_FORM := {
|
||||
"character_hero_idle.png": Vector2i(32, 32),
|
||||
"character_hero_walk.png": Vector2i(32, 32),
|
||||
"character_hero_attack.png": Vector2i(92, 92),
|
||||
"character_hero_hit.png": Vector2i(88, 92),
|
||||
}
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
# oracle: design/art/art-bible.md:538 (帧数规格条——样张冻结定值组)
|
||||
_test_spec_table()
|
||||
_test_current_form()
|
||||
quit(Kit.finish("animation_frame_spec_test"))
|
||||
|
||||
|
||||
# ① 规格表冻结面(帧数档定值单点=本表)
|
||||
func _test_spec_table() -> void:
|
||||
# oracle: design/art/art-bible.md:538 (帧数规格表冻结组)
|
||||
Kit.check("待机循环 4 帧在表〔帧规格 V1〕", SPEC.get("idle", 0) == 4)
|
||||
Kit.check("攻击准备 6 帧单次在表〔帧规格 V2〕", SPEC.get("attack", 0) == 6)
|
||||
Kit.check("受击 2 帧在表〔帧规格 V3〕", SPEC.get("hit", 0) == 2)
|
||||
|
||||
|
||||
# ② 现役单帧形制锚定(真实加载链——资产被换形制而未走规格表时此处红)
|
||||
func _test_current_form() -> void:
|
||||
# oracle: design/art/art-bible.md:538 (现役单帧形制组)
|
||||
for fn: String in CURRENT_FORM:
|
||||
var tex: Texture2D = load("res://assets/art/character/" + fn)
|
||||
var want := Vector2(CURRENT_FORM[fn])
|
||||
Kit.check("现役件在库且形制冻结:%s %s〔帧规格 V4〕" % [fn, want],
|
||||
tex != null and tex.get_size() == want)
|
||||
@@ -92,7 +92,7 @@ func _test_boss_name_uses_boss_rowset() -> void:
|
||||
# 关卡完成停点文案族措辞钉子(口径换代批):回血行/满血合法态/渠道句/摘要关数行——
|
||||
# 旧措辞退役后玩家可见面由本组断言钉在新措辞上(撤销证明:回退 battle_narrator 对应行→断言红→复原复绿)
|
||||
func _test_level_clear_wording() -> void:
|
||||
# oracle: design/gdd/ux/level-clear.md:11 (关卡结算屏文案组)
|
||||
# oracle: design/ux/level-clear.md:11 (关卡结算屏文案组)
|
||||
var healed: String = NarratorScript.curio_pick_header({"level_index": 1, "heal_gained": 5, "hp_before": 10, "hp_after": 15})
|
||||
Kit.check("关卡完成回血行带入回血量与生命区间(实际「%s」)〔口径换代 V1〕" % healed,
|
||||
healed.contains("关卡完成回血 +5(生命 10 → 15)"))
|
||||
|
||||
@@ -10,19 +10,19 @@ const _EXPECTED_KEYS: Array[StringName] = [&"gate", &"forge", &"dummy", &"chest"
|
||||
|
||||
|
||||
func _initialize() -> void:
|
||||
# oracle: design/gdd/ux/camp.md:29 (营地场景布局数据件——纵深与地平线组)
|
||||
# oracle: design/ux/camp.md:29 (营地场景布局数据件——纵深与地平线组)
|
||||
call_deferred("_run_all")
|
||||
|
||||
|
||||
func _run_all() -> void:
|
||||
# oracle: design/gdd/ux/camp.md:29 (套件统一收尾——双测试函数单进程单 quit)
|
||||
# oracle: design/ux/camp.md:29 (套件统一收尾——双测试函数单进程单 quit)
|
||||
await _test_layout_hotspot_geometry()
|
||||
await _test_hud_band_contrast_over_bg()
|
||||
quit(Kit.finish("camp_scene_layout_test", "PASS — 布局几何+顶栏栏体对比 全过"))
|
||||
|
||||
|
||||
func _test_layout_hotspot_geometry() -> void:
|
||||
# oracle: design/gdd/ux/camp.md:16 (七物件命中区几何红线组)
|
||||
# oracle: design/ux/camp.md:16 (七物件命中区几何红线组)
|
||||
var table: CampSceneLayoutTable = load("res://data/tables/camp_scene_layout.tres")
|
||||
Kit.check("V14 布局表加载且 schema 类在位〔营地图批 V14〕", table is CampSceneLayoutTable and table != null)
|
||||
if table == null:
|
||||
@@ -100,7 +100,7 @@ func _test_layout_hotspot_geometry() -> void:
|
||||
# 按规格句在测试内写死 #6E4526 与 α0.80,与背景贴图顶带实测均色做 α 合成后算 WCAG 对比 ≥3.0。
|
||||
# 禁把视图件的 color 直接当预期值喂进算式(oracle 镜像——test-conventions §8.7 判红)。
|
||||
func _test_hud_band_contrast_over_bg() -> void:
|
||||
# oracle: design/gdd/ux/camp.md:41 (顶栏栏体定值——对落位带底色对比 ≥3:1 组)
|
||||
# oracle: design/ux/camp.md:41 (顶栏栏体定值——对落位带底色对比 ≥3:1 组)
|
||||
var table: CampSceneLayoutTable = load("res://data/tables/camp_scene_layout.tres")
|
||||
var band_h := 48
|
||||
if table != null:
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
uid://d0afgefg84yin
|
||||
@@ -0,0 +1,101 @@
|
||||
# tests/unit/presentation/palette_token_pairwise_test.gd — 语义/UI token 板两两互查守门
|
||||
# 断言面:ui_kit 全部 Color 常量两两 RGB 三通道差禁止全部 <8/255(色板增量纪律第二道门的存量面;
|
||||
# 文档侧只述纪律并指路本测试,数值门=本件 NEAR_EPS);六对已登记欠账走豁免账(清偿批逐对销账,
|
||||
# 债务登记=待办清单「色板近色欠账六对清偿」条;新增欠账禁直入本账,须走待办清单修订)。
|
||||
# 豁免账中两对伙伴色(3e3731/3e4048/3f4147)为迷雾合成底素材侧色——不在 ui_kit 常量面,
|
||||
# 其清偿随素材批处理;本测试扫常量面,素材侧对子由互辨抽测件近色读数承载。
|
||||
# 运行:godot --headless --path game --script res://tests/unit/presentation/palette_token_pairwise_test.gd
|
||||
extends SceneTree
|
||||
|
||||
const Kit := preload("res://tests/unit/test_kit.gd")
|
||||
const UI_KIT_PATH := "res://presentation/views/ui_kit.gd"
|
||||
|
||||
const NEAR_EPS := 8
|
||||
|
||||
# 存量近色关系在册账(键=两色 hex 升序拼接,值=性质标签)。账面=常量面全量现状的机器真值;
|
||||
# 闸只拦「账外新增」。标「欠账」四对=art-bible 原六对债的常量面部分(清偿批销账);
|
||||
# 另两对(3e362c3e3731/3e40483f4147)伙伴为迷雾合成底素材侧色,不在常量面,随素材批清偿。
|
||||
# 同一键可覆盖多名对(同值别名与其伙伴构成的同 hex 对)。
|
||||
const EXEMPT_LEDGER := {
|
||||
"140f0d18120c": "深墨族(DIM↔DIM_NIGHT)",
|
||||
"140f0d181410": "深墨族(DIM↔INK_ROUTE)",
|
||||
"18120c181410": "深墨族(DIM_NIGHT↔INK_ROUTE)〔欠账〕",
|
||||
"18120c1e1812": "深墨族(DIM_NIGHT↔FOG_OUTLINE)",
|
||||
"291f172e2218": "暗底族(INK_LABEL↔TIP_BG)",
|
||||
"2820182e2218": "暗底族(CAMP_BADGE_PANEL↔INK_LABEL)",
|
||||
"282018291f17": "暗底族(CAMP_BADGE_PANEL↔TIP_BG)",
|
||||
"33261b342a20": "墨族近结构件(E_FACADE_FOOT_COL↔INK)",
|
||||
"33261b362b20": "墨族近屏底(INK↔BG_OVERLAY)〔欠账〕",
|
||||
"342a20362b20": "结构件暗棕近屏底(E_FACADE_FOOT_COL↔BG_OVERLAY)",
|
||||
"342a203a2e22": "结构件暗棕近屏底(E_FACADE_FOOT_COL↔BG_ROOT)",
|
||||
"362b203a2e22": "屏底双件(BG_OVERLAY↔BG_ROOT)〔欠账〕",
|
||||
"3a3a3a403a34": "暗板族(DARK_UPCOMING↔FOG_MEMORY_PLATE)",
|
||||
"4537234a3b2a": "暖亮底双件(BG_BRIGHT↔BG_MAP_TOP)〔欠账〕",
|
||||
"4a3b2a4a3e30": "同域暗棕(BG_MAP_TOP↔HINT_STRIP_EDGE)",
|
||||
"6e45266e4526": "α 派生别名(CAMP_HEADER_BAND↔CAMP_HUD_BAND,非色板新增)",
|
||||
"786e58786e58": "文档别名(DOT_OFF↔PANEL_BORDER——兼熄灭点阵)",
|
||||
"1a17141e1812": "深墨族(FOG_OUTLINE↔ICON_TINT_ON_GOLD)",
|
||||
"1814101a1714": "深墨族(ICON_TINT_ON_GOLD↔INK_ROUTE)",
|
||||
"1a17141e1a16": "深墨族(ICON_TINT_ON_GOLD↔INK_TITLE)",
|
||||
"1814101e1812": "深墨族(FOG_OUTLINE↔INK_ROUTE)",
|
||||
"1e18121e1a16": "深墨族(FOG_OUTLINE↔INK_TITLE)",
|
||||
"1814101e1a16": "深墨族(INK_ROUTE↔INK_TITLE)",
|
||||
"1a1a1c1e1a16": "深墨族(HP_BAR_TRACK↔INK_TITLE)",
|
||||
"2e221833261b": "墨族(INK↔INK_LABEL)",
|
||||
"c9b88ecdb88c": "暖米族(MAP_VDIV↔WARM_FAINT)",
|
||||
"e0b860e6be5a": "金族亮档双件(GOLD_BRIGHT↔GOLD_LIT)",
|
||||
"f0e2c8f0e2c8": "同值别名(INK_L_WARM↔WARM)",
|
||||
"f0e2c8f0e4c8": "暖米板族(INK_L_WARM/MAP_BAR_PLATE/WARM 同 hex 双名对)",
|
||||
"f0e2c8f0e6ce": "暖米板族(CAMP_ROW_PLATE↔INK_L_WARM/WARM 同 hex 双名对)",
|
||||
"f0e4c8f0e6ce": "暖米板族(CAMP_ROW_PLATE↔MAP_BAR_PLATE)",
|
||||
"f0e6cef5ead3": "暖米板族(CAMP_ROW_PLATE↔DIGIT_PLATE)",
|
||||
"f0e8d6f5ead3": "暖纸板族(DIGIT_PLATE↔TOAST_BG)",
|
||||
"f5ead3f6eeda": "暖纸板族(DIGIT_PLATE↔INK_ON_DEEP)",
|
||||
"f0e8d6f6eeda": "暖纸板族(INK_ON_DEEP↔TOAST_BG)",
|
||||
"f8e2a8f8e3a8": "同族亮金墨(INK_L_GOLD↔RAP_DOT_CORE_WARM)",
|
||||
}
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
# oracle: design/art/art-bible.md:220 (色板增量纪律条——存量两两互查组)
|
||||
_test_pairwise()
|
||||
quit(Kit.finish("palette_token_pairwise_test"))
|
||||
|
||||
|
||||
func _token_colors() -> Dictionary:
|
||||
var script: Script = load(UI_KIT_PATH)
|
||||
var cmap: Dictionary = script.get_script_constant_map()
|
||||
var out: Dictionary = {}
|
||||
for name: String in cmap:
|
||||
if cmap[name] is Color:
|
||||
out[name] = cmap[name]
|
||||
return out
|
||||
|
||||
|
||||
func _hex(c: Color) -> String:
|
||||
return "%02x%02x%02x" % [c.r8, c.g8, c.b8]
|
||||
|
||||
|
||||
# 存量两两互查:豁免账外零近色对(扫描面>0 前置防静默绿)
|
||||
func _test_pairwise() -> void:
|
||||
# oracle: design/art/art-bible.md:220 (色板增量纪律条——存量两两互查组)
|
||||
var tokens := _token_colors()
|
||||
Kit.check("token 面非空(扫描面>0)〔token互查 V1〕", tokens.size() >= 40)
|
||||
var names: Array = tokens.keys()
|
||||
names.sort()
|
||||
var bad: Array = []
|
||||
for i in range(names.size()):
|
||||
for j in range(i + 1, names.size()):
|
||||
var a: Color = tokens[names[i]]
|
||||
var b: Color = tokens[names[j]]
|
||||
if absi(a.r8 - b.r8) < NEAR_EPS and absi(a.g8 - b.g8) < NEAR_EPS \
|
||||
and absi(a.b8 - b.b8) < NEAR_EPS:
|
||||
var pair: Array = [_hex(a), _hex(b)]
|
||||
pair.sort()
|
||||
var key: String = pair[0] + pair[1]
|
||||
if not EXEMPT_LEDGER.has(key):
|
||||
bad.append("%s↔%s(%s)" % [names[i], names[j], key])
|
||||
Kit.check("豁免账外零新增近色对〔token互查 V2〕", bad.is_empty())
|
||||
if not bad.is_empty():
|
||||
for item: String in bad:
|
||||
print(" [近色对] ", item)
|
||||
@@ -10,7 +10,7 @@ const ProbeUiUtil := preload("res://probe/probe_ui_util.gd") # 真输入合成
|
||||
|
||||
# 断言 + 失败即停(原直写 print FAIL + quit(1) + return 样板单点化——早退语义逐位保持)
|
||||
func _req(desc: String, ok: bool) -> bool:
|
||||
# oracle: design/gdd/ux/node-reward.md:9 (奖励覆盖层直验——需求包装组)
|
||||
# oracle: design/ux/node-reward.md:9 (奖励覆盖层直验——需求包装组)
|
||||
Kit.check(desc, ok)
|
||||
if not ok:
|
||||
quit(1)
|
||||
@@ -18,11 +18,11 @@ func _req(desc: String, ok: bool) -> bool:
|
||||
return true
|
||||
|
||||
func _initialize() -> void:
|
||||
# oracle: design/gdd/ux/node-reward.md:9 (奖励节点装载组)
|
||||
# oracle: design/ux/node-reward.md:9 (奖励节点装载组)
|
||||
call_deferred("_run")
|
||||
|
||||
func _run() -> void:
|
||||
# oracle: design/gdd/ux/node-reward.md:9 (奖励三选一呈现组)
|
||||
# oracle: design/ux/node-reward.md:9 (奖励三选一呈现组)
|
||||
var ov = load("res://presentation/views/curio_pick_overlay.gd").new()
|
||||
root.add_child(ov)
|
||||
var picked := []
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
# tests/unit/presentation/seal_mark_params_test.gd — 封印印记参数化绘制守门(卡④ R1–R4)
|
||||
# 断言面:五常量取值逐项相等(ui_kit ↔ art-bible §8.2 对照);着色器文件存在且七个 uniform 名在文;
|
||||
# 断言面:五常量取值逐项相等(封印六参数定值面=本测试断言);着色器文件存在且七个 uniform 名在文;
|
||||
# 迷雾门控(seal_on × fog_state → 封印子件可见性)〔seal批 V1–V4〕。
|
||||
# 运行:godot --headless --path game --script res://tests/unit/presentation/seal_mark_params_test.gd
|
||||
extends SceneTree
|
||||
@@ -10,16 +10,16 @@ const CELL_UNIT := preload("res://presentation/views/board_cell_unit.gd")
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
# oracle: design/gdd/ux/battle.md:128 (封印印记参数宿主——装载组)
|
||||
# oracle: design/ux/battle.md:128 (封印印记参数宿主——装载组)
|
||||
_test_param_values()
|
||||
_test_shader_uniforms()
|
||||
_test_fog_gate()
|
||||
quit(Kit.finish("seal_mark_params_test"))
|
||||
|
||||
|
||||
# R1–R3/R7 前置:五常量取值逐项相等(art-bible §8.2 定值)
|
||||
# R1–R3/R7 前置:五常量取值逐项相等(定值面=本组断言)
|
||||
func _test_param_values() -> void:
|
||||
# oracle: design/gdd/ux/battle.md:128 (环径与法阵定值组)
|
||||
# oracle: design/ux/battle.md:128 (环径与法阵定值组)
|
||||
Kit.check("SEAL_RING_FRAC = 0.82〔seal批 V1〕", UiKit.SEAL_RING_FRAC == 0.82)
|
||||
Kit.check("SEAL_WALL_FRAC = 0.11〔seal批 V2〕", UiKit.SEAL_WALL_FRAC == 0.11)
|
||||
Kit.check("SEAL_ARM_FRAC = 0.156〔seal批 V2〕", UiKit.SEAL_ARM_FRAC == 0.156)
|
||||
@@ -29,7 +29,7 @@ func _test_param_values() -> void:
|
||||
|
||||
# R1–R3/R7:着色器存在+七个 uniform 名在文(参数注入面契约)
|
||||
func _test_shader_uniforms() -> void:
|
||||
# oracle: design/gdd/ux/battle.md:128 (着色器参数化绘制组)
|
||||
# oracle: design/ux/battle.md:128 (着色器参数化绘制组)
|
||||
var src := FileAccess.get_file_as_string(SEAL_SHADER)
|
||||
Kit.check("着色器文件存在且非空:%s〔seal批 V1〕" % SEAL_SHADER, src.length() > 0)
|
||||
if src.length() == 0:
|
||||
@@ -43,7 +43,7 @@ func _test_shader_uniforms() -> void:
|
||||
# R4 迷雾门控:seal_on × fog_state → 封印子件可见性(内部字段直查=受控例外——子件可见性无公开可观测面,
|
||||
# 卡面 R4 断言即 prescribe 子件 visible 直查;对照表该行注记理由)
|
||||
func _test_fog_gate() -> void:
|
||||
# oracle: design/gdd/ux/battle.md:128 (迷雾联动门控组)
|
||||
# oracle: design/ux/battle.md:128 (迷雾联动门控组)
|
||||
var u: Node2D = CELL_UNIT.new()
|
||||
u.seal_on = true
|
||||
Kit.check("seal_on 即挂封印子件〔seal批 V4〕", u._seal_layer != null)
|
||||
|
||||
@@ -26,12 +26,12 @@ class AllMissingStage extends BattleStageView:
|
||||
|
||||
|
||||
func _initialize() -> void:
|
||||
# oracle: design/gdd/ux/battle.md:122 (舞台背景宿主——装载组)
|
||||
# oracle: design/ux/battle.md:122 (舞台背景宿主——装载组)
|
||||
call_deferred("_run")
|
||||
|
||||
|
||||
func _run() -> void:
|
||||
# oracle: design/gdd/ux/battle.md:122 (B 区背景宿主组)
|
||||
# oracle: design/ux/battle.md:122 (B 区背景宿主组)
|
||||
_test_layout_ground_field()
|
||||
await _test_background_selection()
|
||||
await _test_background_fallback()
|
||||
@@ -42,7 +42,7 @@ func _run() -> void:
|
||||
|
||||
# ---- V1 ground_h 字段与校验(表值/默认表 validate 空/三态拒绝族) ----
|
||||
func _test_layout_ground_field() -> void:
|
||||
# oracle: design/gdd/ux/battle.md:122 (连续地面层组)
|
||||
# oracle: design/ux/battle.md:122 (连续地面层组)
|
||||
var layout = load("res://data/tables/battle_layout.tres")
|
||||
Kit.check("布局表 ground_h = 100 且默认表 validate 为空〔舞台背景 V1〕",
|
||||
int(layout.ground_h) == 100 and layout.validate().is_empty())
|
||||
@@ -75,7 +75,7 @@ func _make_stage() -> Node:
|
||||
|
||||
# ---- V2 背景按 board_type 选图(直建默认 dungeon + 三值路径逐值对应 + 层序在世界之下) ----
|
||||
func _test_background_selection() -> void:
|
||||
# oracle: design/gdd/ux/battle.md:122 (三关变体选图组)
|
||||
# oracle: design/ux/battle.md:122 (三关变体选图组)
|
||||
var layout = load("res://data/tables/battle_layout.tres")
|
||||
var stage: Node = _make_stage()
|
||||
await process_frame
|
||||
@@ -104,7 +104,7 @@ func _test_background_selection() -> void:
|
||||
|
||||
# ---- V3 缺图回退(目标缺→dungeon;全缺→平色兜底不崩不刷产品日志) ----
|
||||
func _test_background_fallback() -> void:
|
||||
# oracle: design/gdd/ux/battle.md:122 (缺位回退组)
|
||||
# oracle: design/ux/battle.md:122 (缺位回退组)
|
||||
var s1: Node = MissingUnderdarkStage.new(null, load("res://data/tables/battle_layout.tres"))
|
||||
root.add_child(s1)
|
||||
await process_frame
|
||||
|
||||
@@ -69,7 +69,7 @@ class FakeDB:
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
# oracle: design/gdd/ux/battle.md:154 (站桩呈现域缺陷扫掠组)
|
||||
# oracle: design/ux/battle.md:154 (站桩呈现域缺陷扫掠组)
|
||||
UiKit.motion_scale = 1.0
|
||||
|
||||
# ---- ⑤ 站桩按 id 解析(两口共用同名字敌载体)----
|
||||
|
||||
@@ -31,7 +31,7 @@ func _read_source(rel_path: String) -> String:
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
# oracle: design/gdd/ux/battle.md:154 (站桩呈现定值与素材绑定组)
|
||||
# oracle: design/ux/battle.md:154 (站桩呈现定值与素材绑定组)
|
||||
# ---- V5 血条填充 = 危险红 #A8321F(§4.2 语义物件显式落法) ----
|
||||
Kit.check("血条填充常量 = 危险红 #A8321F〔样张批 V5〕",
|
||||
UiKit.HP_BAR_FILL.to_html(false) == "a8321f")
|
||||
@@ -122,7 +122,7 @@ func _init() -> void:
|
||||
|
||||
# ---- V13–V18 立绘显示档(迭代 48 卡②——显示档 = 三档绝对高,入包件 = 原稿紧裁零降采样) ----
|
||||
|
||||
# 规格钉值(显示档定值单点 = art-bible §8.2;源高 = 原稿表值——旧降采样稿必红;
|
||||
# 规格钉值(显示档定值单点 = 本测试钉值;源高 = 原稿表值——旧降采样稿必红;
|
||||
# 显示宽 = round(源宽×档高/源高),食人魔酋长 157 为已接受超宽项):
|
||||
# 键 → [源高, 显示档高, 显示宽]
|
||||
const _DISPLAY_SPEC := {
|
||||
@@ -137,7 +137,7 @@ func _enemy_tex_path(key: String) -> String:
|
||||
|
||||
|
||||
func _check_display_tier() -> void:
|
||||
# oracle: design/gdd/ux/battle.md:154 (显示档与分辨率绑定组)
|
||||
# oracle: design/ux/battle.md:154 (显示档与分辨率绑定组)
|
||||
# V13/V15 九键逐一:真实入口 StandeeBody → set_data(enemy_id) → set_portrait_texture(真纹理) → portrait_probe
|
||||
for key: String in _DISPLAY_SPEC:
|
||||
var spec: Array = _DISPLAY_SPEC[key]
|
||||
|
||||
@@ -673,7 +673,7 @@ func _smoke_contrast_inks() -> void:
|
||||
# oracle: design/gdd/systems/表现与支撑/HUD框架.md:281 (对比度墨色锚组)
|
||||
print("--- UI 残余 <4.5:1 文字位换墨(V4 对比度锚定)---")
|
||||
var uikit_s = load("res://presentation/views/ui_kit.gd")
|
||||
var stage: Color = uikit_s.SLOT_BACKDROP # 舞台底对比锚改读合并目标(art-bible §4.1 换色合并③——阈值与判据不变)
|
||||
var stage: Color = uikit_s.SLOT_BACKDROP # 舞台底对比锚读合并目标色(换色合并沿革查 git 提交史——阈值与判据不变)
|
||||
var r_order := _theme_contrast(uikit_s.GOLD_BRIGHT, stage)
|
||||
Kit.check("V4 顺位徽标/重甲徽标 GOLD_BRIGHT 对舞台底 %.2f:1 ≥4.5:1" % r_order, r_order >= 4.5)
|
||||
var r_ward := _theme_contrast(uikit_s.HERO_BLUE_BRIGHT, stage)
|
||||
@@ -805,7 +805,7 @@ func _all_labels(root: Node) -> Array:
|
||||
# 只读性连接巡检与零动效断言归 ui_struct_probe 呈现侧,本段只管数据面+旧档载入显示
|
||||
# (v5 样档升 v6——完成定义 6「计数域缺省补零、页正常显示」))----
|
||||
func _career_overlay_projection() -> void:
|
||||
# oracle: design/gdd/ux/camp.md:45 (生涯页只读投影组)
|
||||
# oracle: design/ux/camp.md:45 (生涯页只读投影组)
|
||||
print("--- 生涯页·只读投影一致性(隔离档 smoke_meta_career/career_v5)---")
|
||||
var sv = _meta_new_save(_META_SMOKE_PATHS[9])
|
||||
var mp = load("res://core/meta_progression.gd").new(_db, sv)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# tests/unit/presentation/type_glow_test.gd — 未开格类型微光数据面直验
|
||||
# 断言面 = 纯函数/常量域(无渲染):① 九 cell_type → 五组封闭判定(含清单外显式失败、
|
||||
# 禁子串匹配、与卡顶带 tg_band 的归组差异锚定——Q3 甲案两带并存);② 五组色值冻结面
|
||||
# (HSV 对照 art-bible §4.2 冻结值只准动明度档——群伤组
|
||||
# (冻结值落码于本文件 FROZEN/IMPL,只准动明度档——群伤组
|
||||
# #A61D37 为终值,本测试即该判据的守门件);③ 呈现参数锚定(α170/带宽 cell÷8);④ 合成空间
|
||||
# 阶梯单调 + 相邻组模型 CR ≥1.20(色弱灰度互辨的数据面预判,终审在渲染取证探针实测);
|
||||
# ⑤ probe API 形状(默认开/空态键集)。
|
||||
@@ -13,13 +13,13 @@ const Kit := preload("res://tests/unit/test_kit.gd")
|
||||
const UiKitScript := preload("res://presentation/views/ui_kit.gd")
|
||||
const BoardViewScript := preload("res://presentation/views/board_view.gd")
|
||||
|
||||
# art-bible §4.2 样张 v2 冻结五组(F3 抄录表——本测试的冻结面基准)
|
||||
# 样张 v2 冻结五组(F3 定值面=本表——本测试的冻结面基准)
|
||||
const FROZEN := {
|
||||
"BUFF": Color8(0xD6, 0xC1, 0x3A), "HEAL": Color8(0x5C, 0xB8, 0x3A),
|
||||
"PIERCE": Color8(0x2E, 0x9E, 0x9E), "MAGIC": Color8(0x7B, 0x5B, 0xD6),
|
||||
"AOE": Color8(0xFF, 0x2D, 0x55),
|
||||
}
|
||||
# 九 cell_type 全值域 → 期望组号(art-bible §4.2 成员集合逐字照抄)
|
||||
# 九 cell_type 全值域 → 期望组号(微光五组成员集合,与 ui_kit 封闭判定逐字一致)
|
||||
const TYPE_EXPECT := {
|
||||
"attack": UiKitScript.GLOW_BUFF, "defense": UiKitScript.GLOW_BUFF,
|
||||
"weaken": UiKitScript.GLOW_BUFF, "action": UiKitScript.GLOW_BUFF,
|
||||
@@ -79,7 +79,7 @@ func _test_grouping_closed() -> void:
|
||||
UiKitScript.glow_color_for_group(99) == Color(0, 0, 0, 0))
|
||||
|
||||
|
||||
# ② 冻结色相面:逐组 HSV 对照 art-bible §4.2 冻结值——只准动明度(ΔH≤0.2°/ΔS≤0.01)
|
||||
# ② 冻结色相面:逐组 HSV 对照本文件 FROZEN 冻结值——只准动明度(ΔH≤0.2°/ΔS≤0.01)
|
||||
func _test_frozen_hue_face() -> void:
|
||||
# oracle: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组)
|
||||
for g in FROZEN:
|
||||
@@ -98,7 +98,7 @@ func _test_frozen_hue_face() -> void:
|
||||
Kit.check("群伤组专项:V=0.65 明度档( provisional 域内)", absf(aoe_m.v - 166.0 / 255.0) < 0.002)
|
||||
|
||||
|
||||
# ③ 呈现参数锚定(art-bible §4.2 v2 冻结参数)
|
||||
# ③ 呈现参数锚定(v2 冻结参数,定值面=本测试与 ui_kit 常量)
|
||||
func _test_render_params() -> void:
|
||||
# oracle: design/engineering/test-conventions.md:56 (判定上报通道——验证函数组)
|
||||
Kit.check("泛光强度 α = 170/255(v2 呈现参数冻结)",
|
||||
|
||||
Reference in new issue
Block a user