iter34 卡④ T1-T3: 信息迷雾类型可见性——层距 N+Boss/候选豁免+单圈回雾(N 读表)+呈现显隐决策面+画布大图断言与探针常数同源

- level_table.gd: info_visible_layers 字段(int≥1)+validate 越域 domain 错;level.tres 挂 2
- level_runner.gd: type_visible_ids() 纯函数(入口 BFS 层差 ≤N ∪ Boss ∪ 候选,锚=当前节点层/入口停点 0;visited 不豁免)+_bfs_layers()
- level_map_screen.gd: node_display() 静态决策面+display_probe()+_draw_graph 图标/文字/Boss 描边三处改读决策面(结构通道零改动)
- 新单测 level_map_type_vis_test(26 断言)/level_map_info_fog_test(19 断言);run_all 注册两行
- smoke_all ⑬ 真图 L2 入口停点可见性组(+5 断言);ui_input_probe ⑬ 常数锚同源化+⑱ 雾不扩可点域

轻闸读数:冒烟 1211 项 0 失败(主区基线 1206,+5=新增组)/probe_gate --click 全绿
This commit is contained in:
DKChan committed 2026-10-22 05:52:11 +08:00
1 parent 43c0f3c118
commit ed8e0f9f3d
11 files changed
+571 -21

No files matched your search

+46
View File
@@ -414,6 +414,52 @@ func visited_ids() -> Array:
return out
# ---- 类型可见性读面(信息迷雾 v2.1:近处见类型,远处起雾)----
# 可见集 = Boss/终点(type=="boss")∪ 当前候选(下一跳恒可见——生成承诺)∪
# {id : |层(id) − 锚层| ≤ N};N = db.level.info_visible_layers(禁硬编码);
# 锚层 = 当前节点层,入口停点(无当前节点)= 0;层 = 入口 BFS 深度(与呈现层分层同源口径)。
# 纯函数零状态:已过节点不豁免(单圈语义,零累积记忆);断点快照零新增字段。
func type_visible_ids() -> Array[int]:
var out: Array[int] = []
var layers := _bfs_layers()
var anchor := 0
var cur := current_node()
if not cur.is_empty():
anchor = int(layers.get(_node_id(cur), 0))
var n: int = int(db.level.info_visible_layers)
for node in nodes():
var nid := _node_id(node)
if String(node.get("type", "")) == "boss" \
or (layers.has(nid) and absi(int(layers[nid]) - anchor) <= n):
out.append(nid)
for cid in next_candidate_ids():
if not out.has(int(cid)):
out.append(int(cid))
return out
# 入口 BFS 层表(id → 层深;入口层 0、出边逐层 +1,与 LevelMapScreen._assign_layers 同源)。
# 不可达节点不落表(加载期孤儿校验应已拦截)。
func _bfs_layers() -> Dictionary:
var layers := {}
var entry := _entry_node()
if entry.is_empty():
return layers
var queue: Array[Dictionary] = [entry]
layers[_node_id(entry)] = 0
var i := 0
while i < queue.size():
var cur: Dictionary = queue[i]
i += 1
var d := int(layers[_node_id(cur)])
for nxt in _out_nodes(cur):
var nid := _node_id(nxt)
if not layers.has(nid):
layers[nid] = d + 1
queue.append(nxt)
return layers
func awaiting_choice() -> bool:
return _phase == Phase.AWAITING_CHOICE