diff --git a/game/probe/probe_coverage_recorder.gd b/game/probe/probe_coverage_recorder.gd
index feff5ca1..c7f2f27f 100644
--- a/game/probe/probe_coverage_recorder.gd
+++ b/game/probe/probe_coverage_recorder.gd
@@ -164,6 +164,38 @@ func _bump(key: String) -> void:
_hits[key] = int(_hits.get(key, 0)) + 1
+# ---- 场景树全量交互面枚举(控件缺口数据源:seen−hit=「存在但零真输入覆盖」)----
+# 成员面与登记同源:场景树全部 BaseButton(main 建树常驻——未开过的屏的钮也算存在;
+# 已接线钮复用接线键防序位错位,未接线者落盘期才补键——落盘是终态动作,序位计数此后不再消费)
+# +营地物件(经 db 布局表 hotspot_key 公共数据面枚举;物件命中见 _on_camp_object 的 #物件id 后缀)。
+func enumerate_seen() -> Array[String]:
+ var keys: Array[String] = []
+ _seen_into(_main, keys)
+ var db = _main.get("db")
+ if db != null and db.get("presentation") != null:
+ var layout = db.presentation.camp_scene_layout
+ if layout != null:
+ for spec in layout.layers:
+ var hk: StringName = spec.hotspot_key
+ var ck := "camp_object#" + String(hk)
+ if hk != &"" and not keys.has(ck):
+ keys.append(ck)
+ return keys
+
+
+func _seen_into(node: Node, keys: Array[String]) -> void:
+ if node is BaseButton:
+ var id := node.get_instance_id()
+ var key := String(_node_keys.get(id, ""))
+ if key == "":
+ key = _assign_key(node)
+ _node_keys[id] = key
+ if not keys.has(key):
+ keys.append(key)
+ for child in node.get_children():
+ _seen_into(child, keys)
+
+
# ---- 落盘(JSONP 式 .js——file:// 页面
+
+
+
+
+
+
+
+
+
+
+
+