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:
1 parent
43c0f3c118
commit
ed8e0f9f3d
11 files changed
+571
-21
No files matched your search
@@ -415,6 +415,26 @@ func _id_of(node: Dictionary) -> int:
|
||||
return _runner.node_id_of(node)
|
||||
|
||||
|
||||
# ---- 节点呈现决策面(信息迷雾 v2.1:类型仅在可见集内出示,Boss 标记不入雾)----
|
||||
# 纯函数、零内容读取:只消费类型与状态(节点内详情=打谁/给什么,图上从不显示)。
|
||||
static func node_display(node: Dictionary, nid: int, type_vis: Array,
|
||||
is_current: bool, is_candidate: bool) -> Dictionary:
|
||||
var t := String(node.get("type", ""))
|
||||
var is_boss: bool = t == "boss"
|
||||
var type_shown: bool = is_boss or type_vis.has(nid)
|
||||
var label_text := String(NODE_TYPE_NAMES.get(t, t))
|
||||
if is_current:
|
||||
label_text = "当前位置"
|
||||
elif is_candidate:
|
||||
label_text += " · 可选"
|
||||
return {
|
||||
"draw_icon": type_shown,
|
||||
"draw_label": type_shown,
|
||||
"label_text": label_text,
|
||||
"boss_border": is_boss,
|
||||
}
|
||||
|
||||
|
||||
# ---- 整图自绘(程序化占位——分层布局:层 = 入口 BFS 深度,同层垂直排布)----
|
||||
|
||||
func _draw_graph(canvas: Control) -> void:
|
||||
@@ -426,6 +446,7 @@ func _draw_graph(canvas: Control) -> void:
|
||||
# 当前节点 id(单链=下标 / 图=编号)——visited_ids() 已按编号空间解析
|
||||
var visited: Array[Variant] = _runner.visited_ids()
|
||||
var cand_ids: Array[Variant] = _runner.next_candidate_ids()
|
||||
var type_vis: Array = _runner.type_visible_ids() # 本停点类型可见集(每帧一取——纯函数零状态)
|
||||
# 连线(通道)先行画(方块覆盖其上);悬停预承诺 = 所属通道再增亮(加粗)
|
||||
# 选路停点(候选非空)非候选通道降透明——金岔路从结构网分离(干线共线重叠缺陷的
|
||||
# 视觉主因:不同源通道共用同一垂直干线,金边与石色边焊接成「整列可走」假象)
|
||||
@@ -454,7 +475,8 @@ func _draw_graph(canvas: Control) -> void:
|
||||
col = COL_ROOM_CURRENT
|
||||
var rect := Rect2(p - NODE_HALF, NODE_HALF * 2.0)
|
||||
canvas.draw_rect(rect, col)
|
||||
if t == "boss":
|
||||
var disp := node_display(node, nid, type_vis, nid == current_id, cand_ids.has(nid))
|
||||
if bool(disp["boss_border"]):
|
||||
# Boss 描边 = 紫赤 2px(§4.2 色相独占)+ 外缘 1px 深墨环(灰度冗余通道强制:
|
||||
# 紫赤灰度 72 对石纹噪底 65 灰度不可辨;灰度/色弱下 Boss 环经深墨环可辨)
|
||||
canvas.draw_rect(Rect2(rect.position - Vector2(3, 3), rect.size + Vector2(6, 6)), UiKit.INK_ROUTE, false, 1.0)
|
||||
@@ -464,29 +486,26 @@ func _draw_graph(canvas: Control) -> void:
|
||||
canvas.draw_rect(rect, COL_PASSAGE_LIT, false, 4.0 if _hover_id == nid else 2.0)
|
||||
# 节点图标(20px 烘焙 1:1 消费;双色墨制=乘法调制——当前金底深墨,暗底系 WARM 原色;
|
||||
# 贴图缺位 → 字形回退=贴图在位字形退役惯例)
|
||||
var icon: Texture2D = _node_icons.get(t)
|
||||
if icon != null:
|
||||
var tint := UiKit.ICON_TINT_ON_GOLD if col == COL_ROOM_CURRENT else Color(1.0, 1.0, 1.0)
|
||||
canvas.draw_texture_rect(icon, Rect2(p - Vector2(NODE_ICON_PX, NODE_ICON_PX) / 2.0,
|
||||
Vector2(NODE_ICON_PX, NODE_ICON_PX)), false, tint)
|
||||
else:
|
||||
var font := get_theme_default_font()
|
||||
var label := String(NODE_LABELS.get(t, "?"))
|
||||
canvas.draw_string(font, p + Vector2(-6, 2), label, HORIZONTAL_ALIGNMENT_LEFT, -1, 16, UiKit.INK_ROUTE)
|
||||
if bool(disp["draw_icon"]):
|
||||
var icon: Texture2D = _node_icons.get(t)
|
||||
if icon != null:
|
||||
var tint := UiKit.ICON_TINT_ON_GOLD if col == COL_ROOM_CURRENT else Color(1.0, 1.0, 1.0)
|
||||
canvas.draw_texture_rect(icon, Rect2(p - Vector2(NODE_ICON_PX, NODE_ICON_PX) / 2.0,
|
||||
Vector2(NODE_ICON_PX, NODE_ICON_PX)), false, tint)
|
||||
else:
|
||||
var font := get_theme_default_font()
|
||||
var label := String(NODE_LABELS.get(t, "?"))
|
||||
canvas.draw_string(font, p + Vector2(-6, 2), label, HORIZONTAL_ALIGNMENT_LEFT, -1, 16, UiKit.INK_ROUTE)
|
||||
# 编号(右上角——与图标占位区零重叠;双色墨随态)
|
||||
var num_ink := UiKit.INK_ROUTE if col == COL_ROOM_CURRENT else UiKit.WARM
|
||||
canvas.draw_string(get_theme_default_font(), Vector2(rect.end.x - 16.0, rect.position.y + 8.0),
|
||||
str(nid), HORIZONTAL_ALIGNMENT_RIGHT, 14, 10, num_ink)
|
||||
# 类型文字标签(demo ④:节点下方 11px;当前位=「当前位置」金、候选=类型名+「 · 可选」烛光黄、
|
||||
# 其余=类型名暖米弱化;文字+图标+形状三通道)
|
||||
var type_text := String(NODE_TYPE_NAMES.get(t, t))
|
||||
if nid == current_id:
|
||||
type_text = "当前位置"
|
||||
elif cand_ids.has(nid):
|
||||
type_text += " · 可选"
|
||||
var type_ink := COL_ROOM_CURRENT if nid == current_id else (UiKit.CANDLE if cand_ids.has(nid) else UiKit.WARM_FAINT)
|
||||
canvas.draw_string(get_theme_default_font(), Vector2(p.x - 44.0, rect.end.y + 15.0),
|
||||
type_text, HORIZONTAL_ALIGNMENT_CENTER, 88, 11, type_ink)
|
||||
if bool(disp["draw_label"]):
|
||||
var type_ink := COL_ROOM_CURRENT if nid == current_id else (UiKit.CANDLE if cand_ids.has(nid) else UiKit.WARM_FAINT)
|
||||
canvas.draw_string(get_theme_default_font(), Vector2(p.x - 44.0, rect.end.y + 15.0),
|
||||
String(disp["label_text"]), HORIZONTAL_ALIGNMENT_CENTER, 88, 11, type_ink)
|
||||
|
||||
|
||||
func _layout(nodes: Array, canvas: Control) -> Dictionary:
|
||||
@@ -513,6 +532,21 @@ func canvas_probe() -> Dictionary:
|
||||
return {"origin": _canvas.get_global_position(), "min_size": _canvas.custom_minimum_size}
|
||||
|
||||
|
||||
# 类型可见性呈现只读快照(id → node_display 决策输出;真机绘制面断言消费点)
|
||||
func display_probe() -> Dictionary:
|
||||
var out := {}
|
||||
if _runner == null:
|
||||
return out
|
||||
var nodes: Array[Variant] = _runner.nodes()
|
||||
var type_vis: Array = _runner.type_visible_ids()
|
||||
var current_id: int = _runner.current_node_id()
|
||||
var cand_ids: Array = _runner.next_candidate_ids()
|
||||
for node in nodes:
|
||||
var nid := _id_of(node)
|
||||
out[nid] = node_display(node, nid, type_vis, nid == current_id, cand_ids.has(nid))
|
||||
return out
|
||||
|
||||
|
||||
# 分层(layout/fit 共享件):layer = 入口 BFS 深度;同层 slot 垂直排布;未达节点兜底排末层
|
||||
func _assign_layers(nodes: Array, layer: Dictionary, slot: Dictionary) -> void:
|
||||
var layer_counts := {}
|
||||
|
||||
Reference in new issue
Block a user