From 1970e0efc4203510cef7cc0ed0548ad083a65bb3 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Thu, 22 Oct 2026 15:42:44 +0800 Subject: [PATCH] =?UTF-8?q?iter34=20=E5=8D=A1=E2=91=A3=20D1=20=E5=9B=9E?= =?UTF-8?q?=E7=82=89=20T2=EF=BC=88=E7=94=B2=E6=A1=88=EF=BC=89:=20=5Fdraw?= =?UTF-8?q?=5Fgraph=20=E5=9C=A8=E5=AE=9E=E9=99=85=E7=BB=98=E5=88=B6?= =?UTF-8?q?=E7=82=B9=E8=AE=B0=E5=BD=95=E6=9C=AC=E5=B8=A7=E7=BB=98=E5=88=B6?= =?UTF-8?q?=E4=BA=8B=E5=AE=9E=EF=BC=8Cdisplay=5Fprobe=20=E6=94=B9=E8=AF=BB?= =?UTF-8?q?=E8=AF=A5=E8=AE=B0=E5=BD=95=EF=BC=88=E6=8E=A5=E7=BA=BF=E5=9D=8F?= =?UTF-8?q?=E5=8F=AF=E5=88=A4=E7=BA=A2=EF=BC=89=EF=BC=9B=E6=8E=A2=E9=92=88?= =?UTF-8?q?=E2=91=B1=20=E9=80=89=E5=8C=BA=E6=94=B9=E6=8C=89=E6=A0=B8?= =?UTF-8?q?=E5=BF=83=E5=8F=AF=E8=A7=81=E9=9B=86=E8=A7=A3=E9=99=A4=E8=87=AA?= =?UTF-8?q?=E6=8C=87=EF=BC=8CPASS=20=E6=96=87=E6=A1=88=E8=A1=A5=E5=88=97?= =?UTF-8?q?=20=E2=91=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/presentation/views/level_map_screen.gd | 24 ++++++++++----------- game/smoke/ui_input_probe.gd | 17 +++++++++------ 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/game/presentation/views/level_map_screen.gd b/game/presentation/views/level_map_screen.gd index 607cdf9d..d0516d07 100644 --- a/game/presentation/views/level_map_screen.gd +++ b/game/presentation/views/level_map_screen.gd @@ -48,6 +48,7 @@ var _hover_id := -1 # 悬停预承诺候选(-1 = 无) var abandon_btn: Button # 放弃入口(可见性归组合根 set_abandon_available——只在冒险模式开) var status_badge: Button # 状态面板入口角标(顶栏 GP 徽右侧;连接归组合根) var _abandon_timer := ArmedTimer.new() # 放弃确认窗(_process 帧驱动倒计时机制收口;窗口=CONFIRM_WINDOW_S) +var _drawn_disp: Dictionary[int, Dictionary] = {} # 本停点实际绘制记录(_draw_graph 逐帧在实际绘制点重建——display_probe 消费面) var _node_icons := {} # 节点图标贴图(load_tex 守卫——缺位 null → 字形回退,冒烟/无素材检出安全) var _noise_rect: TextureRect # 屏底石纹(换层色板渐变承载面——null = 纯色回退无挂点) var _tint_level := 0 # 当前已应用 tint 的层号(0 = 未应用) @@ -440,6 +441,7 @@ static func node_display(node: Dictionary, nid: int, type_vis: Array, func _draw_graph(canvas: Control) -> void: if _runner == null or not visible: return + _drawn_disp.clear() # 绘制记录随本帧重建——只反映实际发生的绘制(接线坏的判据面) var nodes: Array[Variant] = _runner.nodes() var pos := _layout(nodes, canvas) var current_id: int = _runner.current_node_id() @@ -476,17 +478,21 @@ func _draw_graph(canvas: Control) -> void: var rect := Rect2(p - NODE_HALF, NODE_HALF * 2.0) canvas.draw_rect(rect, col) var disp := node_display(node, nid, type_vis, nid == current_id, cand_ids.has(nid)) + var rec: Dictionary[String, Variant] = {"draw_icon": false, "draw_label": false, + "label_text": "", "boss_border": false} 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) canvas.draw_rect(rect, COL_BOSS_BORDER, false, 2.0) + rec["boss_border"] = true elif cand_ids.has(nid): # 悬停预承诺 = 亮金描边加粗(4px),常态候选 = 亮金描边 2px(spec States 悬停预承诺行) canvas.draw_rect(rect, COL_PASSAGE_LIT, false, 4.0 if _hover_id == nid else 2.0) # 节点图标(20px 烘焙 1:1 消费;双色墨制=乘法调制——当前金底深墨,暗底系 WARM 原色; # 贴图缺位 → 字形回退=贴图在位字形退役惯例) if bool(disp["draw_icon"]): + rec["draw_icon"] = true 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) @@ -503,9 +509,12 @@ func _draw_graph(canvas: Control) -> void: # 类型文字标签(demo ④:节点下方 11px;当前位=「当前位置」金、候选=类型名+「 · 可选」烛光黄、 # 其余=类型名暖米弱化;文字+图标+形状三通道) if bool(disp["draw_label"]): + rec["draw_label"] = true + rec["label_text"] = String(disp["label_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), String(disp["label_text"]), HORIZONTAL_ALIGNMENT_CENTER, 88, 11, type_ink) + _drawn_disp[nid] = rec func _layout(nodes: Array, canvas: Control) -> Dictionary: @@ -532,19 +541,10 @@ func canvas_probe() -> Dictionary: return {"origin": _canvas.get_global_position(), "min_size": _canvas.custom_minimum_size} -# 类型可见性呈现只读快照(id → node_display 决策输出;真机绘制面断言消费点) +# 类型可见性绘制只读记录(id → 本帧实际绘制事实:图标/文字/描边/文案;_draw_graph 在实际绘制点写入—— +# 接线层断言消费点:绕开决策面直接画,这里就露出「雾下也画了」) func display_probe() -> Dictionary: - var out := {} - if _runner == null: - return out - var nodes: Array[Variant] = _runner.nodes() - var type_vis: Array[int] = _runner.type_visible_ids() - var current_id: int = _runner.current_node_id() - var cand_ids: Array[Variant] = _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 + return _drawn_disp # 分层(layout/fit 共享件):layer = 入口 BFS 深度;同层 slot 垂直排布;未达节点兜底排末层 diff --git a/game/smoke/ui_input_probe.gd b/game/smoke/ui_input_probe.gd index 80cfc264..3b455342 100644 --- a/game/smoke/ui_input_probe.gd +++ b/game/smoke/ui_input_probe.gd @@ -41,9 +41,11 @@ func _ready() -> void: if main.level_screen.visible: var ro = main.level_screen var cands: Array = main.run_scope.runner.next_candidate_ids() - # ---- ⑱ 信息迷雾呈现接线(回归闸):真机 display_probe 读绘制面(雾下节点类型不绘制、 - # Boss 描边在、候选类型在)+点击雾下非候选节点零提交(雾不扩大可点域——候选集即合法集)---- + # ---- ⑱ 信息迷雾呈现接线(回归闸):真机 display_probe 读实际绘制记录(雾下节点类型未画、 + # Boss 描边画了、候选类型画了)+点击雾下非候选节点零提交(雾不扩大可点域——候选集即合法集)---- var disp: Dictionary = ro.display_probe() + var vis: Array = main.run_scope.runner.type_visible_ids() + var cur_id: int = main.run_scope.runner.current_node_id() var fog_id := -1 var boss_id := -1 var nds_vis: Array = main.run_scope.runner.nodes() @@ -51,10 +53,13 @@ func _ready() -> void: var vnid: int = main.run_scope.runner.node_id_of(n) if String(n.get("type", "")) == "boss": boss_id = vnid - elif fog_id < 0 and disp.has(vnid) and not bool(disp[vnid]["draw_icon"]): + elif fog_id < 0 and vnid != cur_id and not cands.has(vnid) and not vis.has(vnid): + # 选区只按核心可见集判(不读绘制记录——选区与断言解耦,防「按记录选、再断言记录」自指) fog_id = vnid - if boss_id < 0 or fog_id < 0: - _pre_fail("case⑱ 雾面节点选取失败(boss=%d fog=%d)" % [boss_id, fog_id]) + if boss_id < 0 or fog_id < 0 or not disp.has(fog_id) or not disp.has(boss_id) \ + or not disp.has(int(cands[0])): + _pre_fail("case⑱ 雾面节点选取失败或绘制记录缺位(boss=%d fog=%d 记录数=%d)" + % [boss_id, fog_id, disp.size()]) return if bool(disp[fog_id]["draw_icon"]) or bool(disp[fog_id]["draw_label"]): _pre_fail("case⑱ 雾下节点类型仍出示(图标=%s 文字=%s——范围外只见结构)〔fv2〕" @@ -641,7 +646,7 @@ func _ready() -> void: if not bool(bv.type_glow_probe().get("enabled", false)): _problems.append("case⑰ 微光开关未恢复开态") if _problems.is_empty(): - print("[ui_input_probe] PASS — 悬停金框/禁入信号/路径预览/seal_place/chord/dig/英雄落位/影子构成/朝向/缩格重排/缺位回退/变异角标/视野迷雾/状态面板输入锁/未开格类型微光 十八断言全绿(真实 push_input 路径——⑫图上命中⑬画布拟合 2026-09-28 增,⑭变异角标 2026-09-29 增,④b 封印纹理槽回归 2026-10-02 增,⑮视野迷雾 2026-10-03 增〔+提灯接线断言 2026-10-05 迭代14⑤〕,⑯状态面板输入锁 2026-10-06 迭代17卡③增,⑰未开格类型微光 2026-10-17 迭代30卡①增)") + print("[ui_input_probe] PASS — 悬停金框/禁入信号/路径预览/seal_place/chord/dig/英雄落位/影子构成/朝向/缩格重排/缺位回退/变异角标/视野迷雾/状态面板输入锁/未开格类型微光 十八断言全绿(真实 push_input 路径——⑫图上命中⑬画布拟合 2026-09-28 增,⑭变异角标 2026-09-29 增,④b 封印纹理槽回归 2026-10-02 增,⑮视野迷雾 2026-10-03 增〔+提灯接线断言 2026-10-05 迭代14⑤〕,⑯状态面板输入锁 2026-10-06 迭代17卡③增,⑰未开格类型微光 2026-10-17 迭代30卡①增,⑱信息迷雾绘制接线(display_probe 读实际绘制记录)增)") get_tree().quit(0) else: for p in _problems: