工程(判据出处注记4/7·presentation+剩余探针+system/smoke/example): 21套件+11探针+3宿主逐函数/逐段挂# oracle注记——HUD框架:260-282拒绝三源/明细行/状态槽/微光/三区几何/对比度+camp.md:16/29/45+level-map:3/11+level-clear+node-reward+设置与本地化:95+锻造工坊窗口内容+battle.md:122/128/154+战斗表现:148+test-conventions:30/37/84+code-conventions:41/54+architecture:168+README术语表; tune_sim_batch_parity(调参测量域)零规格句不造锚——记规格缺口待裁; 本步凭据: 抽验4套件+5探针+system_test+ui_click直跑全绿
This commit is contained in:
1 parent
9e26df16be
commit
085717166d
32 files changed
+97
-2
No files matched your search
@@ -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)
|
||||
|
||||
@@ -8,6 +8,7 @@ extends Node
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
# oracle: design/gdd/systems/战斗循环/战斗表现.md:148(结算演出——挖掘期零打扰组)
|
||||
await get_tree().process_frame
|
||||
var problems: Array = []
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 重入唯一动作通道):缓存清空 +
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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"))
|
||||
|
||||
@@ -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)"))
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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({
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 := ""
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 := []
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -69,6 +69,7 @@ class FakeDB:
|
||||
|
||||
|
||||
func _init() -> void:
|
||||
# oracle: design/gdd/ux/battle.md:154(站桩呈现域缺陷扫掠组)
|
||||
UiKit.motion_scale = 1.0
|
||||
|
||||
# ---- ⑤ 站桩按 id 解析(两口共用同名字敌载体)----
|
||||
|
||||
@@ -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]
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in new issue
Block a user