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:// 页面 + + + + + + + + + + + + + diff --git a/tools/extract_capability_list.py b/tools/extract_capability_list.py new file mode 100644 index 00000000..f1fc445e --- /dev/null +++ b/tools/extract_capability_list.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +r"""extract_capability_list.py — 能力清单义务层提取器(B 覆盖总览面板·义务层) + +把 game/tests/README.md「能力清单」的四列表(能力|系统|真实入口|代表用例)按旅程段 +解析成机器可读 JSONP .js,供 tools/coverage_report.html 经