diff --git a/game/probe/board_shot_probe.gd b/game/probe/board_shot_probe.gd index 17bd56b0..85fa5d23 100644 --- a/game/probe/board_shot_probe.gd +++ b/game/probe/board_shot_probe.gd @@ -26,6 +26,7 @@ var _cur_settlement = null # 当关 settlement(身份回调读取面—— func _ready() -> void: +# oracle: design/engineering/test-conventions.md:84(棋盘截图取证——渲染闸采集组) # 运行前提=窗口化真渲染面(shot_probe 同款护栏——headless 下 frame_post_draw 永不触发+视口纹理恒空) if DisplayServer.get_name() == "headless": print("[board_shot] FAIL — 本探针必须窗口化运行(headless 无渲染面,截图必空);现行事实源=tools/render_gate.sh 取证段") @@ -181,6 +182,7 @@ func _ready() -> void: # 判据:环外径像素 ÷ 格边 落 0.82±1px;封印格最外圈 1px 框最暗值与相邻未封印未开格同位框最暗值差 ≤1/255 #(halo 在 0.455×格边归零——格边框不应被压暗;相邻未开格同砖纹理同套瓦片为无封印参照)。 func _seal_evidence(tag: String, view: Node, settlement: Object, off_img: Image, out: String) -> void: +# oracle: design/engineering/test-conventions.md:84(封印印记像素取证组) var ms = settlement.minesweeper var seal_cell := Vector2i(-9, -9) var ref_cell := Vector2i(-9, -9) diff --git a/game/probe/fx_probe.gd b/game/probe/fx_probe.gd index b26f509b..dd1416e5 100644 --- a/game/probe/fx_probe.gd +++ b/game/probe/fx_probe.gd @@ -8,6 +8,7 @@ extends Node func _ready() -> void: +# oracle: design/gdd/systems/战斗循环/战斗表现.md:148(结算演出——挖掘期零打扰组) await get_tree().process_frame var problems: Array = [] diff --git a/game/probe/fx_shot_probe.gd b/game/probe/fx_shot_probe.gd index 14075ee3..d2f2375b 100644 --- a/game/probe/fx_shot_probe.gd +++ b/game/probe/fx_shot_probe.gd @@ -21,6 +21,7 @@ var _problems: Array = [] func _ready() -> void: +# oracle: design/engineering/test-conventions.md:84(特效截图取证——渲染闸采集组) var args := OS.get_cmdline_user_args() out_dir = args[0] if args.size() >= 1 and args[0] != "" else "user://qa-fx" DirAccess.make_dir_recursive_absolute(out_dir) diff --git a/game/probe/layout_probe.gd b/game/probe/layout_probe.gd index cdeebcdc..4fd16f21 100644 --- a/game/probe/layout_probe.gd +++ b/game/probe/layout_probe.gd @@ -19,6 +19,7 @@ var _est_reads: Dictionary = {} # 逐档 13/14 板推定读数留痕(label func _ready() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:264(战斗屏三区几何与棋盘格边长——分辨率档位组) await get_tree().process_frame var main: Node = load("res://presentation/main.tscn").instantiate() add_child(main) @@ -58,6 +59,7 @@ func _ready() -> void: # 一份不变量断言,逐档代入——代码量与档数无关 func _check_one(label: String, main: Node) -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:264(单档几何断言组) var vr: Rect2 = get_viewport().get_visible_rect() if vr.size != Vector2(VIEWPORTS[0]["size"]) and vr.size.y < 1.0: _problems.append("[%s] 逻辑视口退化 %s" % [label, vr.size]) diff --git a/game/probe/level_map_shot_probe.gd b/game/probe/level_map_shot_probe.gd index 0f920158..0b34ff25 100644 --- a/game/probe/level_map_shot_probe.gd +++ b/game/probe/level_map_shot_probe.gd @@ -11,6 +11,7 @@ extends Node const SEED_L3 := 910212 # 深图固定种子(与 level_map_viewport_probe 同源——图确定性承载) func _ready() -> void: +# oracle: design/engineering/test-conventions.md:84(关卡画面截图取证——载入守卫组) var args := OS.get_cmdline_user_args() var out_dir := args[0] if args.size() > 0 else "user://" await get_tree().process_frame diff --git a/game/probe/level_map_viewport_probe.gd b/game/probe/level_map_viewport_probe.gd index 6c1ede3a..0b6448f0 100644 --- a/game/probe/level_map_viewport_probe.gd +++ b/game/probe/level_map_viewport_probe.gd @@ -28,6 +28,7 @@ func _check(desc: String, ok: bool) -> void: func _ready() -> void: +# oracle: design/gdd/ux/level-map.md:3(关卡画面视口跟随——卷轴视口组) await get_tree().process_frame await get_tree().process_frame var host := Control.new() @@ -60,6 +61,7 @@ func _ready() -> void: ## R1 浅图整幅居中无裁切+画布入视口件承载(画布=视口首子件——setup 注入序) func _probe_shallow_no_crop(screen, vp) -> void: +# oracle: design/gdd/ux/level-map.md:3(浅层不裁切组) _runner = _make_runner_entry(1, SEED_L1) screen.open_choices(_cand_nodes(_runner), _runner) await get_tree().process_frame @@ -78,6 +80,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(深层入口钳制组) _runner = _make_runner_entry(3, SEED_L3) screen.open_choices(_cand_nodes(_runner), _runner) await get_tree().process_frame diff --git a/game/probe/t17_defer_probe.gd b/game/probe/t17_defer_probe.gd index 086adf3c..3fab58f2 100644 --- a/game/probe/t17_defer_probe.gd +++ b/game/probe/t17_defer_probe.gd @@ -13,6 +13,7 @@ var _problems: Array = [] func _ready() -> void: +# oracle: design/gdd/ux/battle.md:122(明细带挖掘期收起——T17 视觉扩展时序组) await get_tree().process_frame main = load("res://presentation/main.tscn").instantiate() add_child(main) diff --git a/game/probe/type_glow_shot_probe.gd b/game/probe/type_glow_shot_probe.gd index 73fd27fe..10f024dc 100644 --- a/game/probe/type_glow_shot_probe.gd +++ b/game/probe/type_glow_shot_probe.gd @@ -30,6 +30,7 @@ var _hero_pos := Vector2i.ZERO func _ready() -> void: +# oracle: design/engineering/test-conventions.md:84(微光截图取证——渲染闸采集组) if DisplayServer.get_name() == "headless": print("[type_glow_shot] FAIL — 本探针必须窗口化运行(headless 无渲染面,截图必空)") get_tree().quit(1) diff --git a/game/probe/ui_click_probe.gd b/game/probe/ui_click_probe.gd index cae32cfd..823383b3 100644 --- a/game/probe/ui_click_probe.gd +++ b/game/probe/ui_click_probe.gd @@ -54,6 +54,7 @@ func _ready() -> void: if main.ui.modals.menu.debug_overlay.visible: _problems.append("调试浮窗 boot 自动开(菜单优先失守)") # ---- 营地购买合成点击路径(选档进档开层→购买→关闭全走真实按钮信号路径; + # oracle: design/gdd/systems/跨局循环/天赋树.md:198(营地购买段——单币购买只扣钥石组) # 隔离存档换注 main.meta 保确定性(禁碰真实档 user://save.json);陈旧档段首清理)---- for p0 in ["user://smoke_click_probe_reset.json", "user://smoke_click_probe_reset.json.tmp"]: if FileAccess.file_exists(p0): @@ -191,6 +192,7 @@ func _ready() -> void: if main.ui.modals.camp.scene.visible or not main.ui.screens.start_overlay.visible: _problems.append("营地关闭后未恢复开始层〔句柄子容器批 V1〕") # ---- 选档界面行为走查(迭代 33 卡③):sl5 空槽新档链/sl6 有档槽进档链/sl7 删档二次确认双路径 + # oracle: design/gdd/systems/表现与支撑/存档序列化.md:61(选档走查段——激活态建立组) # /sl8 消费方分派单口/sl12 动线序不回闪。开层=函数直调(「进入存档」钮归卡② mn3——中间态在案); # 隔离=attach_slot_template 注入命名空间,夹具按槽直写(卡① 注入口)。---- var csel_tpl := "user://smoke_click_probe_savesel_slot_%d.json" @@ -294,6 +296,7 @@ func _ready() -> void: _problems.append("[savesel] 关闭后层未隐藏或开始层未恢复(模态栈单口失守)") # ---- 设置面段(隔离 store 换注禁碰真实 user://settings.cfg;真实按钮信号路径)---- + # oracle: design/gdd/systems/表现与支撑/设置与本地化.md:4(设置面段——最小设置面组) for p0 in ["user://smoke_click_probe_settings.cfg"]: if FileAccess.file_exists(p0): DirAccess.remove_absolute(p0) @@ -360,6 +363,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(生涯页段——同壳同形态组) # 值断言归冒烟投影段与 ui_struct 结构族,此处只验开合路径与零跳转)---- # 生涯页驱动=函数直调中间态(卡② mn10——careerbtn 已撤,卡④ 笔记本改挂前无 UI 路径) if true: @@ -604,7 +608,7 @@ func _ready() -> void: _run_modal_probes_once() _play_one_action() # ---- 预算耗尽收口(T17 硬锁批适配):选件变强后 probe 可能活过预算不再战败——断点段前提 - # (冒险终局面在案)须主动满足。收口驱动:任何停点层逐个推进(复用主循环分支语义)至 + # oracle: design/gdd/ux/level-map.md:11(主循环选路段——入口候选组) # (冒险终局面在案)须主动满足。收口驱动:任何停点层逐个推进(复用主循环分支语义)至 # level_screen 选路停点→真实放弃二击→终局面。战斗中则继续 autoplay 打完。 if not _done and not main.ui.modals.run.end_overlay.is_open(): var close_guard := 8000 @@ -649,7 +653,7 @@ func _ready() -> void: _play_one_action() # 排播期/Waiting 等待态=自然流逝(演播秒级、锁随队列空解除) # T17 适配:战败或放弃二途皆达终局面(放弃=预算耗尽收口路径——见上),断点段前提不变。 - await get_tree().process_frame + # oracle: design/gdd/systems/表现与支撑/存档序列化.md:180(断点段——断点域与续玩组) await get_tree().process_frame var bp_file := "user://smoke_click_probe_reset.json" var iso_chk = load("res://core/save_manager.gd").new(bp_file) iso_chk.load_from_disk() @@ -680,6 +684,7 @@ func _ready() -> void: # ① 战斗收口断点写盘断言保留(上方——冒险流直调中间态 mn10)。 # ---- 大门两分支断言段(卡④ T5 接收——卡② 移交落点;V3 断言面)---- + # oracle: design/gdd/ux/camp.md:16(大门段——点大门先出确认组) # 驱动=营地场景根点选信号(真实路由)→组合根 _on_camp_object_pressed→确认弹窗。 # 无断点=两出口(是/否);有断点=三出口(set_breakpoint 注入选路停点形——同下方开场行③先例)。 # 判据绑可观测提交面:点大门不直接进冒险(is_adventure 翻转只在 confirmed 后);cancelled 恒= @@ -1046,6 +1051,7 @@ func _click_stop() -> void: # ---- T1 D1:锁期/重放断言(每 run 一次,脚本化场景——演播期豁免的断言化承载) ---- +# oracle: design/gdd/systems/排雷循环/排雷玩法.md:236(锁期/重放段——拒绝与锁组) # 锁期断言(排播队列活跃=锁面):注入封印击 → 直落被冻结不受理(封印未置)+ `_locked_click` # 缓存命中且为本注入(「最后一次」语义——注入帧内无并发点击)。 # 重放断言(演播完边沿 pump_ended→_replay_locked_click 重入唯一动作通道):缓存清空 + diff --git a/game/probe/ui_contrast_probe.gd b/game/probe/ui_contrast_probe.gd index 98de808f..860c9d37 100644 --- a/game/probe/ui_contrast_probe.gd +++ b/game/probe/ui_contrast_probe.gd @@ -88,6 +88,7 @@ func _ratio(a: Color, b: Color) -> float: func _ready() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:281(UI 文字对比度机检 ≥4.5:1 无区域例外——对比度组) var problems: Array = [] var pairs := _pairs() for p in pairs: diff --git a/game/tests/smoke_boot.gd b/game/tests/smoke_boot.gd index 2220633a..eed5e76e 100644 --- a/game/tests/smoke_boot.gd +++ b/game/tests/smoke_boot.gd @@ -16,6 +16,7 @@ var _checks: int = 0 func check(cond: bool, label: String) -> void: +# oracle: game/tests/README.md:366(冒烟宿主判据通道——存活检查组) _checks += 1 if cond: print(" [PASS] " + label) @@ -34,6 +35,7 @@ func _ready() -> void: # 开机前置面:autoload 注册与资源可加载(挂主屏之前先查,失败时主屏断言整段跳过) func _check_autoloads() -> void: +# oracle: game/tests/README.md:366(autoload 在位组) for autoload_name in ["ConfigDB", "RngService", "SaveManager", "MetaProgression"]: var node: Node = get_node_or_null(NodePath("/root/" + autoload_name)) check(node != null, "autoload %s 在位" % autoload_name) @@ -62,6 +64,7 @@ func _boot_main_scene() -> Node: # 主屏存活面:组合根装配句柄在位(main.X 一级句柄契约,探针挂载假设的启动侧证明) func _check_main_scene(main: Node) -> void: +# oracle: game/tests/README.md:366(主屏可达组) check(main != null and main.is_inside_tree(), "主屏场景已实例化并在树") if main == null: return diff --git a/game/tests/system_test.gd b/game/tests/system_test.gd index 0f88873f..b98c626a 100644 --- a/game/tests/system_test.gd +++ b/game/tests/system_test.gd @@ -409,6 +409,7 @@ func _face_liveness(name: String, v, want: String) -> String: #(level_started→choices_presented 同步到达,无可观测中间态)——合并为 V3b 一处断言。 # (自 game/smoke/smoke_all.gd 剪切迁入——label 与 cond 逐字原样,断言迁移批 B G1) func _smoke_lifecycle_matrix() -> void: +# oracle: design/gdd/systems/冒险循环/冒险结构.md:284(生命周期矩阵——三关序列组) print("--- 迭代28 T3 生命周期存活性矩阵(V3:九阶段×五引用面)---") var main: Node = load("res://presentation/main.tscn").instantiate() root.add_child(main) diff --git a/game/tests/unit/example_test.gd b/game/tests/unit/example_test.gd index e10073a1..e5412e1a 100644 --- a/game/tests/unit/example_test.gd +++ b/game/tests/unit/example_test.gd @@ -10,6 +10,7 @@ extends SceneTree const Kit := preload("res://tests/unit/test_kit.gd") # T6 收口:check/汇总退出样板单点 func _init() -> void: +# oracle: design/engineering/test-conventions.md:37(套件协议模板——执行载体与退出码范例组) Kit.check("headless SceneTree 协议可用(quit(code) 通道)", _test_headless_protocol()) Kit.check("命名规范可执行:test_[scenario]_[expected]", _test_naming_convention_followed()) quit(Kit.finish("example_test")) diff --git a/game/tests/unit/presentation/battle_narrator_test.gd b/game/tests/unit/presentation/battle_narrator_test.gd index 09255c20..a5153d9c 100644 --- a/game/tests/unit/presentation/battle_narrator_test.gd +++ b/game/tests/unit/presentation/battle_narrator_test.gd @@ -18,6 +18,7 @@ class _BossRunner: func _init() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:260(战斗叙述宿主——装载组) _test_numeric_lines_carry_values() _test_end_text_differs_by_result() _test_phase_text_nonempty() @@ -28,6 +29,7 @@ func _init() -> void: func _test_numeric_lines_carry_values() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:272(结算行数值带入组) var rest: String = NarratorScript.rest_line(12, 30, 40) Kit.check("休整叙述带入回复量与当前血量(实际「%s」)" % rest, rest.contains("12") and rest.contains("30") and rest.contains("40")) @@ -38,6 +40,7 @@ func _test_numeric_lines_carry_values() -> void: func _test_end_text_differs_by_result() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:272(胜负互异文案组) # 关卡收束(level_end=true)恒为「关卡完成!」——单场胜负文案只在非收束态出现 var level: String = NarratorScript.battle_end_text("lose", true) Kit.check("关卡收束态恒为「关卡完成!」(实际「%s」)" % level, level == "关卡完成!") @@ -50,6 +53,7 @@ func _test_end_text_differs_by_result() -> void: func _test_phase_text_nonempty() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:272(阶段行非空组) var t: String = NarratorScript.phase_text(1, "", false, false, "") Kit.check("相位叙述非空(实际「%s」)" % t, t != "") var boss: String = NarratorScript.phase_text(2, "", false, true, "灰矮人石君王") @@ -59,6 +63,7 @@ func _test_phase_text_nonempty() -> void: # 叙述寻址按行类取 Boss 行集(S 清单 S15 换代):Boss 节点名必须来自 (关卡, boss, 带) 行集, # 不能落到同深度的战斗行集——期望名由表行集首行读出,不写死字面量。 func _test_boss_name_uses_boss_rowset() -> void: +# oracle: design/gdd/systems/战斗循环/敌人系统.md:295(Boss 名读行集组) var db = load("res://core/config_db.gd").new() var loaded: bool = db.load_tables("res://data/tables", false) Kit.check_quiet(loaded, "叙述寻址用例:数值表加载成功") @@ -87,6 +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(关卡结算屏文案组) 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)")) diff --git a/game/tests/unit/presentation/camp_scene_layout_test.gd b/game/tests/unit/presentation/camp_scene_layout_test.gd index 8605dc48..9da306de 100644 --- a/game/tests/unit/presentation/camp_scene_layout_test.gd +++ b/game/tests/unit/presentation/camp_scene_layout_test.gd @@ -10,10 +10,12 @@ const _EXPECTED_KEYS: Array[StringName] = [&"gate", &"forge", &"dummy", &"chest" func _initialize() -> void: +# oracle: design/gdd/ux/camp.md:29(营地场景布局数据件——纵深与地平线组) call_deferred("_test_layout_hotspot_geometry") func _test_layout_hotspot_geometry() -> void: +# oracle: design/gdd/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: diff --git a/game/tests/unit/presentation/forge_workbench_test.gd b/game/tests/unit/presentation/forge_workbench_test.gd index fc05d97b..a4f94893 100644 --- a/game/tests/unit/presentation/forge_workbench_test.gd +++ b/game/tests/unit/presentation/forge_workbench_test.gd @@ -10,6 +10,7 @@ const _TEST_SAVE := "user://test_forge_workbench.json" func _initialize() -> void: +# oracle: design/gdd/systems/跨局循环/锻造工坊.md:219(工作间两区六路线——装载组) call_deferred("_run") @@ -21,6 +22,7 @@ func _row_by_id(ov) -> Dictionary: func _run() -> void: +# oracle: design/gdd/systems/跨局循环/锻造工坊.md:219(六路线 UI 直验组) var db = load("res://core/config_db.gd").new() var load_ok: bool = db.load_tables("res://data/tables", true) if not load_ok: diff --git a/game/tests/unit/presentation/hud_presenter_test.gd b/game/tests/unit/presentation/hud_presenter_test.gd index 7912de12..5aaba4c7 100644 --- a/game/tests/unit/presentation/hud_presenter_test.gd +++ b/game/tests/unit/presentation/hud_presenter_test.gd @@ -9,6 +9,7 @@ const HudScript := preload("res://presentation/hud_presenter.gd") func _init() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:260(HUD 投影宿主——装载组) _test_accepted_text() _test_reject_text_by_reason() _test_unknown_reason_fallback() @@ -16,11 +17,13 @@ func _init() -> void: func _test_accepted_text() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:212(受理反馈呈现组) var t: String = HudScript.outcome_text({"accepted": true}) Kit.check("受理态文案固定为「执行完成。」(实际「%s」)" % t, t == "执行完成。") func _test_reject_text_by_reason() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:212(拒绝三源可辨文案组) var cases := { "not_adjacent": "不能执行:目标与小人不相邻", "target_revealed": "不能执行:目标已开", @@ -39,6 +42,7 @@ func _test_reject_text_by_reason() -> void: func _test_unknown_reason_fallback() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:212(未知兜底文案组) var t: String = HudScript.outcome_text({"accepted": false, "reject_reason": "brand_new_reason"}) Kit.check("未知拒绝原因兜底为「动作被拒。」而非空串(实际「%s」)" % t, t == "动作被拒。") var sub: String = HudScript.outcome_text({ diff --git a/game/tests/unit/presentation/level_map_info_fog_test.gd b/game/tests/unit/presentation/level_map_info_fog_test.gd index 4c4163fa..b0f42d62 100644 --- a/game/tests/unit/presentation/level_map_info_fog_test.gd +++ b/game/tests/unit/presentation/level_map_info_fog_test.gd @@ -11,10 +11,12 @@ const ScreenScript := preload("res://presentation/views/level_map_screen.gd") func _initialize() -> void: +# oracle: design/gdd/systems/冒险循环/关卡节点地图.md:178(信息迷雾呈现宿主——装载组) call_deferred("_run") func _run() -> void: +# oracle: design/gdd/systems/冒险循环/关卡节点地图.md:178(迷雾显隐宿主组) var db = load("res://core/config_db.gd").new() var loaded: bool = db.load_tables("res://data/tables", false) Kit.check_quiet(loaded, "迷雾呈现用例:数值表加载成功") @@ -46,6 +48,7 @@ func _runner(db, nodes: Array, candidates: Array, n: int = 2): # ---- ① 范围外只见结构:雾下节点类型图标与文字均不绘制〔fv2〕---- func _test_fog_hides_type() -> void: +# oracle: design/gdd/systems/冒险循环/关卡节点地图.md:178(雾下类型隐藏组) var node := {"id": 3, "type": "battle", "depth": 3, "next": []} var shown: Dictionary = ScreenScript.node_display(node, 2, [2], false, false) Kit.check("可见集内节点:图标/类型文字均绘制〔fv2〕", @@ -59,6 +62,7 @@ func _test_fog_hides_type() -> void: # ---- ② Boss/终点不入雾+多终点标记〔fv3〕---- func _test_boss_exempt_and_multi_boss() -> void: +# oracle: design/gdd/systems/冒险循环/关卡节点地图.md:178(Boss 描边豁免与多 Boss 组) var type_vis: Array = [1, 7, 9] # 双 Boss 图:7/9 均在可见集 var boss_a: Dictionary = ScreenScript.node_display({"id": 7, "type": "boss", "depth": 7, "next": []}, 7, type_vis, false, false) var boss_b: Dictionary = ScreenScript.node_display({"id": 9, "type": "boss", "depth": 9, "next": []}, 9, type_vis, false, false) @@ -76,6 +80,7 @@ func _test_boss_exempt_and_multi_boss() -> void: # ---- ③ 节点内详情图上从不显示〔fv5〕---- func _test_details_never_shown() -> void: +# oracle: design/gdd/systems/冒险循环/关卡节点地图.md:178(详情零显示组) var plain := {"id": 3, "type": "battle", "depth": 3, "next": [4]} var loaded := {"id": 3, "type": "battle", "depth": 3, "next": [4], "enemy_id": "goblin_secret", "reward_id": "reward_secret"} var a: Dictionary = ScreenScript.node_display(plain, 3, [3], false, true) diff --git a/game/tests/unit/presentation/modal_flow_test.gd b/game/tests/unit/presentation/modal_flow_test.gd index 97177d67..892eaa4e 100644 --- a/game/tests/unit/presentation/modal_flow_test.gd +++ b/game/tests/unit/presentation/modal_flow_test.gd @@ -11,6 +11,7 @@ const ModalStackScript := preload("res://presentation/modal_stack.gd") func _init() -> void: +# oracle: design/engineering/code-conventions.md:54(模态编排纯逻辑——层级与输入锁组) # 哑层与桩 Callable(纯逻辑类零场景前提的证明面) var start := Control.new() var inter := Control.new() diff --git a/game/tests/unit/presentation/pacing_queue_test.gd b/game/tests/unit/presentation/pacing_queue_test.gd index 2a7bf058..5992ea18 100644 --- a/game/tests/unit/presentation/pacing_queue_test.gd +++ b/game/tests/unit/presentation/pacing_queue_test.gd @@ -42,6 +42,7 @@ func check(cond: bool, msg: String) -> void: func _init() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:272(排播节奏——排空零分叉/零丢行/延迟双态组) var main: Node = load("res://presentation/main.tscn").instantiate() root.add_child(main) await process_frame diff --git a/game/tests/unit/presentation/player_copy_sweep_test.gd b/game/tests/unit/presentation/player_copy_sweep_test.gd index b0b5db89..0da52ecc 100644 --- a/game/tests/unit/presentation/player_copy_sweep_test.gd +++ b/game/tests/unit/presentation/player_copy_sweep_test.gd @@ -23,6 +23,7 @@ var _db func _init() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:281(玩家面文案清扫宿主——装载组) _db = ConfigDBScript.new() var load_ok: bool = _db.load_tables("res://data/tables", true) if not load_ok: @@ -42,6 +43,7 @@ func _init() -> void: # ① C 区两段头(u1/u2——直建 hero 面板,adventure_feats_test ⑦c 族同构) func _sweep_hero_panel() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:274(英雄面板文案组) var panel = load("res://presentation/views/hero_info_panel_view.gd").new(_db.presentation.battle_layout) var feat_head := _first_label(panel._feat_section) var curio_head := _first_label(panel._curio_section) @@ -53,6 +55,7 @@ func _sweep_hero_panel() -> void: # ②③ 奖励节点头部+专长卡兜底(u3/u11——静态直调) func _sweep_narrator() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:272(叙述文案组) var narrator = load("res://presentation/battle_narrator.gd") var head := String(narrator.node_curio_header()) Kit.check("奖励点头部含「冒险牌库」(u3 机制事实①同库)〔wa4〕", head.contains("冒险牌库")) @@ -65,6 +68,7 @@ func _sweep_narrator() -> void: # ④ 图例封印行(u4——直建 LegendOverlay 读 ENTRIES 常量) func _sweep_legend() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:267(图例文案组) load("res://presentation/views/legend_overlay.gd").new() # 直建(_init(rap_cost) 现签名) var seal_row: Array = [] for e in load("res://presentation/views/legend_overlay.gd").ENTRIES: @@ -80,6 +84,7 @@ func _sweep_legend() -> void: # ⑤⑥ 来源名双源(u5/u6——状态槽消费半+表值 ConfigDB 真装载+battle_log 行消费半) func _sweep_source_names() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:274(来源名读表组) var row_view = load("res://presentation/views/status_slot_row.gd").new() row_view.set_effects([{"effect_id": "alert", "source_class": "mine_hit", "display_name": "危险格受击", "remaining_settlements": 2, "round_index": 1}]) @@ -105,6 +110,7 @@ func _sweep_source_names() -> void: # ⑦⑧ 已开危险格字形族(u7/u8/u9——BoardView rebuild 真实刷新路径+源 token 扫描) func _sweep_board_glyph() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:264(危险格字形组) var board_generator = load("res://core/board_generator.gd").new() var b = board_generator.generate(1, 0, _mk_stream("board_gen", 4242), _db) var ae = load("res://core/action_economy.gd").new(_db) @@ -160,6 +166,7 @@ func _sweep_token_scans() -> void: # 刷新两 toast 文案零数字字面量(架构整改 R4——格式串零数字、插值位与表字段一一对应; # 静态判据+评审注记观测面局限:真机文案随表值由实机目检兜——T10 清单两项) func _sweep_refresh_toast_no_literals() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:260(刷新提示读表拼接——零字面量组) var main_src := FileAccess.get_file_as_string("res://presentation/main.gd") var rap_toast := "" var cap_toast := "" diff --git a/game/tests/unit/presentation/presentation_encapsulation_sweep_test.gd b/game/tests/unit/presentation/presentation_encapsulation_sweep_test.gd index bba15d00..461752d3 100644 --- a/game/tests/unit/presentation/presentation_encapsulation_sweep_test.gd +++ b/game/tests/unit/presentation/presentation_encapsulation_sweep_test.gd @@ -33,6 +33,7 @@ const A1_FILES := { func _init() -> void: +# oracle: design/engineering/code-conventions.md:41(presentation 封装——四族零命中扫描组) _sweep_a1_data_classes() _sweep_a2_subparts() _sweep_b_combo_root() @@ -42,6 +43,7 @@ func _init() -> void: # 源文件读取+非空前置(返 "" 即已判红——调用侧跳过后续正则断言) func _src(path: String) -> String: +# oracle: design/engineering/code-conventions.md:41(源码采样组) var src := FileAccess.get_file_as_string(path) Kit.check("扫描面非空前置:%s" % path, src.length() > 0) return src @@ -49,18 +51,21 @@ func _src(path: String) -> String: # 正则零命中断言(-pattern 意图写入断言文案——可 grep 定位;suffix 区分族组) func _zero(pattern: String, src: String, label: String, suffix: String = "pres封装 V1") -> void: +# oracle: design/engineering/code-conventions.md:41(零命中扫描组) var re := RegEx.create_from_string(pattern) Kit.check("%s:%s 零命中〔%s〕" % [label, pattern, suffix], re.search(src) == null) # 正锚在案断言(正则命中 ≥1——新公开面/新形态在用;suffix 区分族组) func _anchor(pattern: String, src: String, label: String, suffix: String = "pres封装 V1") -> void: +# oracle: design/engineering/code-conventions.md:41(正锚存在组) var re := RegEx.create_from_string(pattern) Kit.check("%s:%s 正锚在案〔%s〕" % [label, pattern, suffix], re.search(src) != null) # ② V2 A2 拆件子件(行为归位子件公开方法、读走公开读法、身份构造交付) func _sweep_a2_subparts() -> void: +# oracle: design/engineering/code-conventions.md:41(A2 子件封装扫描组) var body := _src("res://presentation/views/standee_body.gd") if body.length() > 0: _zero("\\bst\\._|\\bmo\\._", body, "子件私取模式零命中(standee_body)", "pres封装 V2") @@ -77,6 +82,7 @@ func _sweep_a2_subparts() -> void: # ③ V3 B 组合根交接面(main+五分文件——成对单行转发梯换代为公开入口+Callable 束) func _sweep_b_combo_root() -> void: +# oracle: design/engineering/code-conventions.md:41(组合根束封装扫描组) var b_files := { "res://presentation/main.gd": false, "res://presentation/main_ui_build.gd": true, diff --git a/game/tests/unit/presentation/reward_overlay_test.gd b/game/tests/unit/presentation/reward_overlay_test.gd index 0f02d1b9..f6323e36 100644 --- a/game/tests/unit/presentation/reward_overlay_test.gd +++ b/game/tests/unit/presentation/reward_overlay_test.gd @@ -9,6 +9,7 @@ const Kit := preload("res://tests/unit/test_kit.gd") # 断言 + 失败即停(原直写 print FAIL + quit(1) + return 样板单点化——早退语义逐位保持) func _req(desc: String, ok: bool) -> bool: +# oracle: design/gdd/ux/node-reward.md:9(奖励覆盖层直验——需求包装组) Kit.check(desc, ok) if not ok: quit(1) @@ -16,9 +17,11 @@ func _req(desc: String, ok: bool) -> bool: return true func _initialize() -> void: +# oracle: design/gdd/ux/node-reward.md:9(奖励节点装载组) call_deferred("_run") func _run() -> void: +# oracle: design/gdd/ux/node-reward.md:9(奖励三选一呈现组) var ov = load("res://presentation/views/curio_pick_overlay.gd").new() root.add_child(ov) var picked := [] diff --git a/game/tests/unit/presentation/seal_mark_params_test.gd b/game/tests/unit/presentation/seal_mark_params_test.gd index 2b72e8b5..f13d220b 100644 --- a/game/tests/unit/presentation/seal_mark_params_test.gd +++ b/game/tests/unit/presentation/seal_mark_params_test.gd @@ -10,6 +10,7 @@ const CELL_UNIT := preload("res://presentation/views/board_cell_unit.gd") func _init() -> void: +# oracle: design/gdd/ux/battle.md:128(封印印记参数宿主——装载组) _test_param_values() _test_shader_uniforms() _test_fog_gate() @@ -18,6 +19,7 @@ func _init() -> void: # R1–R3/R7 前置:五常量取值逐项相等(art-bible §8.2 定值) func _test_param_values() -> void: +# oracle: design/gdd/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) @@ -27,6 +29,7 @@ func _test_param_values() -> void: # R1–R3/R7:着色器存在+七个 uniform 名在文(参数注入面契约) func _test_shader_uniforms() -> void: +# oracle: design/gdd/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: @@ -40,6 +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(迷雾联动门控组) var u: Node2D = CELL_UNIT.new() u.seal_on = true Kit.check("seal_on 即挂封印子件〔seal批 V4〕", u._seal_layer != null) diff --git a/game/tests/unit/presentation/settings_store_test.gd b/game/tests/unit/presentation/settings_store_test.gd index 91a7e4a0..4a4710f5 100644 --- a/game/tests/unit/presentation/settings_store_test.gd +++ b/game/tests/unit/presentation/settings_store_test.gd @@ -12,6 +12,7 @@ const ISO_PATH := "user://settings_store_unit_test.cfg" # 隔离注路径( func _init() -> void: +# oracle: design/gdd/systems/表现与支撑/设置与本地化.md:4(设置存储宿主——装载组) _test_settings_roundtrip() _test_settings_default() _test_settings_apply_chain() @@ -26,6 +27,7 @@ func _cleanup() -> void: # ---- 持久化回读(写 true→存→新实例回读 true;节/键 motion/reduced)---- func _test_settings_roundtrip() -> void: +# oracle: design/gdd/systems/表现与支撑/设置与本地化.md:4(设置写读往返组) var w = StoreScript.new(ISO_PATH) w.reduced_motion = true Kit.check("前置:save_settings 落盘成功", w.save_settings()) @@ -42,6 +44,7 @@ func _test_settings_roundtrip() -> void: # ---- 缺省值(无文件缺省 false)---- func _test_settings_default() -> void: +# oracle: design/gdd/systems/表现与支撑/设置与本地化.md:4(出厂默认组) var absent_path := "user://settings_store_unit_absent_%d.cfg" % (Time.get_ticks_msec()) DirAccess.remove_absolute(ProjectSettings.globalize_path(absent_path)) # 确保无文件 var d = StoreScript.new(absent_path) @@ -52,6 +55,7 @@ func _test_settings_default() -> void: # ---- 引擎档应用链(reduced→apply()→UiKit.motion_scale==0.5,false→1.0;测毕还原静态初值)---- func _test_settings_apply_chain() -> void: +# oracle: design/gdd/systems/表现与支撑/设置与本地化.md:4(应用链组) var saved_scale: float = UiKit.motion_scale # 静态初值留底——测毕还原 var a = StoreScript.new(ISO_PATH) a.reduced_motion = true diff --git a/game/tests/unit/presentation/stage_background_test.gd b/game/tests/unit/presentation/stage_background_test.gd index cf14e387..4958b7c1 100644 --- a/game/tests/unit/presentation/stage_background_test.gd +++ b/game/tests/unit/presentation/stage_background_test.gd @@ -26,10 +26,12 @@ class AllMissingStage extends BattleStageView: func _initialize() -> void: +# oracle: design/gdd/ux/battle.md:122(舞台背景宿主——装载组) call_deferred("_run") func _run() -> void: +# oracle: design/gdd/ux/battle.md:122(B 区背景宿主组) _test_layout_ground_field() await _test_background_selection() await _test_background_fallback() @@ -40,6 +42,7 @@ func _run() -> void: # ---- V1 ground_h 字段与校验(表值/默认表 validate 空/三态拒绝族) ---- func _test_layout_ground_field() -> void: +# oracle: design/gdd/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()) @@ -72,6 +75,7 @@ func _make_stage() -> Node: # ---- V2 背景按 board_type 选图(直建默认 dungeon + 三值路径逐值对应 + 层序在世界之下) ---- func _test_background_selection() -> void: +# oracle: design/gdd/ux/battle.md:122(三关变体选图组) var layout = load("res://data/tables/battle_layout.tres") var stage: Node = _make_stage() await process_frame @@ -100,6 +104,7 @@ func _test_background_selection() -> void: # ---- V3 缺图回退(目标缺→dungeon;全缺→平色兜底不崩不刷产品日志) ---- func _test_background_fallback() -> void: +# oracle: design/gdd/ux/battle.md:122(缺位回退组) var s1: Node = MissingUnderdarkStage.new(null, load("res://data/tables/battle_layout.tres")) root.add_child(s1) await process_frame diff --git a/game/tests/unit/presentation/standee_fx_sweep_test.gd b/game/tests/unit/presentation/standee_fx_sweep_test.gd index 9c372832..ad5a9cd3 100644 --- a/game/tests/unit/presentation/standee_fx_sweep_test.gd +++ b/game/tests/unit/presentation/standee_fx_sweep_test.gd @@ -69,6 +69,7 @@ class FakeDB: func _init() -> void: +# oracle: design/gdd/ux/battle.md:154(站桩呈现域缺陷扫掠组) UiKit.motion_scale = 1.0 # ---- ⑤ 站桩按 id 解析(两口共用同名字敌载体)---- diff --git a/game/tests/unit/presentation/standee_present_values_test.gd b/game/tests/unit/presentation/standee_present_values_test.gd index 22260714..35e1e589 100644 --- a/game/tests/unit/presentation/standee_present_values_test.gd +++ b/game/tests/unit/presentation/standee_present_values_test.gd @@ -31,6 +31,7 @@ func _read_source(rel_path: String) -> String: func _init() -> void: +# oracle: design/gdd/ux/battle.md:154(站桩呈现定值与素材绑定组) # ---- V5 血条填充 = 危险红 #A8321F(§4.2 语义物件显式落法) ---- Kit.check("血条填充常量 = 危险红 #A8321F〔样张批 V5〕", UiKit.HP_BAR_FILL.to_html(false) == "a8321f") @@ -136,6 +137,7 @@ func _enemy_tex_path(key: String) -> String: func _check_display_tier() -> void: +# oracle: design/gdd/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] diff --git a/game/tests/unit/presentation/terrain_tile_sets_test.gd b/game/tests/unit/presentation/terrain_tile_sets_test.gd index a7f295e4..706c7155 100644 --- a/game/tests/unit/presentation/terrain_tile_sets_test.gd +++ b/game/tests/unit/presentation/terrain_tile_sets_test.gd @@ -13,6 +13,7 @@ const Kit := preload("res://tests/unit/test_kit.gd") # T6 收口:_check/汇 func _init() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:260(地形瓦片套宿主——装载组) var board_dir := ProjectSettings.globalize_path("res://assets/art/board/") var probe_path := board_dir.path_join("terrain_wall_center_dungeon.png") if not FileAccess.file_exists(probe_path): @@ -41,6 +42,7 @@ func _init() -> void: # 套完整性:词表每个 board_type 的 16 墙 + 5 地面变体全部在盘(缺位 → BoardView 整批回落 dungeon 的 # 缺位回退断言由 ui_input_probe 覆盖;本断言管「入包完整」面) func _test_set_completeness(board_dir: String, types: Array) -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:260(瓦片套完整性组) var wall_names: Array = TilePaletteScript.TILE_WALL_NAMES var variants: int = int(TilePaletteScript.TILE_FLOOR_VARIANTS) for bt in types: @@ -58,6 +60,7 @@ func _test_set_completeness(board_dir: String, types: Array) -> void: # 色相域抽检:wall_center 上半幅(墙顶面)与 floor_1 全幅的均值色相/明度 func _test_hue_domains(board_dir: String) -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:260 地形瓦片色相域(色相域组) var bands := { "dungeon": [0.02, 0.16], # 暖石棕 ≈15°–58° "underdark": [0.50, 0.72], # 灰白蓝紫 ≈180°–260° @@ -121,6 +124,7 @@ func _load_stats(board_dir: String, fname: String, top_half: bool) -> Dictionary # (双峰纹理直画不可救——渲染帧取证深墨隐形实证,牌上深墨 12:1);③直画模式的双门槛值照抄 # TilePalette 判据常量(防判据漂移) func _test_digit_ink_modes(board_dir: String, types: Array) -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:260(数字墨色模式组) var expect_plate := {"dungeon": false, "underdark": true, "deep_underdark": true} var variants: int = int(TilePaletteScript.TILE_FLOOR_VARIANTS) for bt in types: diff --git a/game/tests/unit/presentation/theme_projection_test.gd b/game/tests/unit/presentation/theme_projection_test.gd index 7c46c3c2..d18f3b48 100644 --- a/game/tests/unit/presentation/theme_projection_test.gd +++ b/game/tests/unit/presentation/theme_projection_test.gd @@ -30,6 +30,7 @@ var _rng func _init() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:260(呈现投影与主题宿主——装载组) _db = ConfigDBScript.new() # 表加载失败不中止(承 G2–G5 同款:表损坏的红落在具体断言上) var load_ok: bool = _db.load_tables("res://data/tables", true) @@ -180,6 +181,7 @@ func _meta_new_save(path: String): # ---- 未开格类型微光(作用集恒等/九型归组封闭/零玩法写入)---- func _smoke_type_glow() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:267(未开格类型微光数据面组) print("--- 未开格类型微光(作用集恒等/九型归组封闭/零玩法写入)---") var board_generator = load("res://core/board_generator.gd").new() var b = board_generator.generate(1, 0, _mk_stream("board_gen", 4242), _db) @@ -381,6 +383,7 @@ func _smoke_type_glow() -> void: # _format_row Invalid access 使结算段中途夭折、界面卡死。行协议变更必须同步呈现层〔战斗结算 §行协议〕, # 本段把现行行形态逐型喂进真实视图:拆行残留与行字段错位在此转红)---- func _smoke_battle_log_view() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:272(明细带行协议组) print("--- 战斗日志视图行格式化(行协议 9 类呈现层同步闸)---") var view = load("res://presentation/views/battle_log_view.gd").new(_db, _db.presentation.battle_layout) # 敌方行动伤害行(现行形态:baseline 在场、attach 已出协议——修复前此行即 Invalid access) @@ -425,6 +428,7 @@ func _smoke_battle_log_view() -> void: # ---- 开场行后缀尾接协议(迭代36 wc1 静态半——level_open_line 第五参布尔直控尾接,签名零变; # 该函数此前零既有断言,尾接行为由此钉住)---- func _smoke_level_open_line() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:272(关卡开启行组) var NarratorScript := load("res://presentation/battle_narrator.gd") Kit.check("开场行 boosted=true 尾接「(含面板加成)」〔wc1〕", String(NarratorScript.level_open_line("第一层", 42, 5, 30, true)).contains("(含面板加成)")) @@ -439,6 +443,7 @@ func _smoke_level_open_line() -> void: # V1 挂载覆盖 / V2 滑轨两段 / V3 预盖件运行时证词 / V4 旧形态零残留 / # V5 回归(本冒烟全绿即回归网)/ V6 中文字体防御(挂主题后 default_font 顶掉 custom_font 也不丢字形) func _smoke_global_theme() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:260(全局主题组) print("--- UI 全局主题(main_theme.tres 挂载与词条断言)---") var th := ThemeDB.get_project_theme() Kit.check("V1 项目主题挂载(project.godot gui/theme/custom → main_theme.tres)", th != null) @@ -543,6 +548,7 @@ func _smoke_global_theme() -> void: # ---- 按钮五态矩阵冒烟(四工厂产物逐实例 override 断言;V1/V2)---- func _smoke_button_five_states() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:260(按钮五态组) print("--- UI 按钮五态矩阵(四工厂五态样式盒)---") var uikit_s = load("res://presentation/views/ui_kit.gd") var states := ["normal", "hover", "pressed", "disabled", "focus"] @@ -614,6 +620,7 @@ func _smoke_button_five_states() -> void: # ---- 全局纹理过滤冒烟(工程设置 Nearest+平滑渐变件 LINEAR 白名单;V3)---- func _smoke_texture_filter() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:260(纹理过滤白名单组) print("--- UI 全局纹理过滤(Nearest+白名单三件)---") var v = ProjectSettings.get_setting("rendering/textures/canvas_textures/default_texture_filter") Kit.check("V3 工程设置 default_texture_filter=0(Nearest,翻转面=立绘/瓦片/九宫格 crisp)", @@ -663,6 +670,7 @@ func _smoke_texture_filter() -> void: # ---- <4.5:1 文字位换墨冒烟(站桩徽标两族亮档+RAP 行深石墨;V4)---- 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 换色合并③——阈值与判据不变) @@ -689,6 +697,7 @@ func _smoke_contrast_inks() -> void: # ---- 元素细节余②③冒烟(BCard 图标槽明度差降档+商店居中+营地四栏等高)---- func _smoke_element_details() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:274(元素细节源码锚组) print("--- UI 元素细节余②③(图标槽降档+布局修)---") var uikit_s = load("res://presentation/views/ui_kit.gd") # ②白图标 ≥3:1 图形对比硬约束+降档方向锚定 @@ -711,6 +720,7 @@ func _smoke_element_details() -> void: # ---- 诊断转储钮冒烟(角落钮不在玩家画面+转储入口在调试浮窗;V6)---- func _smoke_diag_button_retired() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:260(诊断钮退役契约组) print("--- UI 诊断转储钮退役(V6:玩家画面清零+浮窗可达)---") var main_src: String = FileAccess.get_file_as_string("res://presentation/main.gd") Kit.check("V6 主区无 build_diag_button 调用残留(旧实现同批清理)", @@ -734,6 +744,7 @@ func _smoke_diag_button_retired() -> void: # 断言归 ui_struct_probe 呈现侧,本段只管数据面;跨关解锁概览断言族随面板换代退役—— # 替换判据=sv5 零旧段+八键投影断言(实现报告 §8.3 申报))---- func _status_panel_projection() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:274(状态面板只读投影组) print("--- 状态面板·本局信息面板投影一致性(迭代36 卡③——八键快照手拼夹具,同构口径不依赖 runner)---") _meta_smoke_cleanup() # 套件级夹具清场(生涯页 fixture 依赖此前置——旧状态段同款保留) # 夹具(代拍板 4——任意非零可辨值,禁读 data/tables 现值、禁与属性行断言共值致误判掩盖) @@ -794,6 +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(生涯页只读投影组) 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) diff --git a/game/tests/unit/presentation/type_glow_test.gd b/game/tests/unit/presentation/type_glow_test.gd index fdfaf69d..b4fc4bb7 100644 --- a/game/tests/unit/presentation/type_glow_test.gd +++ b/game/tests/unit/presentation/type_glow_test.gd @@ -46,6 +46,7 @@ const CONST_NAME := { func _init() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:267(微光数据面宿主——装载组) _test_grouping_closed() _test_frozen_hue_face() _test_render_params() diff --git a/game/tests/unit/presentation/ui_font_asset_test.gd b/game/tests/unit/presentation/ui_font_asset_test.gd index c22c1a74..6e1d7801 100644 --- a/game/tests/unit/presentation/ui_font_asset_test.gd +++ b/game/tests/unit/presentation/ui_font_asset_test.gd @@ -11,6 +11,7 @@ const Kit := preload("res://tests/unit/test_kit.gd") # T6 收口:_check/汇 func _init() -> void: +# oracle: design/gdd/systems/表现与支撑/HUD框架.md:281(中文字体随包与字形覆盖组) var path: String = UiKitScript.FONT_UI var f: Font = UiKitScript.load_font(path) Kit.check("随包字体守卫装载非空(res://assets/fonts/ui_font_fusion_pixel_zh_hans.ttf)", f != null)