合并(美术圣经去数值化+文档结构搬移批): 两笔合入(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

# Conflicts:
#	reports/需求卡片-营地交互修复批-2026-11-05.md
#	待办清单.md
This commit is contained in:
DKChan committed 2026-11-07 04:32:54 +08:00
commit 2a17260c8e
61 files changed
+486 -273

No files matched your search

+2 -1
View File
@@ -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` |
+2
View File
@@ -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——端口单实例/业务类零引擎直连源码锚/事实面闭集两对照)
+1 -1
View File
@@ -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 呈现参数冻结)",