From 52dd1ad239b4a6e38672876ed005d6d82103e2a6 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Thu, 22 Oct 2026 05:27:56 +0800 Subject: [PATCH] =?UTF-8?q?iter33=20=E5=8D=A1=E2=91=A2=20T3=20=E5=8F=98?= =?UTF-8?q?=E5=BC=82=E4=BC=B4=E7=94=9F=E6=96=AD=E8=A8=80=E5=BC=BA=E5=8C=96?= =?UTF-8?q?=EF=BC=9Asl4=20=E6=94=B9=E6=B8=B2=E6=9F=93=E9=9D=A2=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E6=89=AB=E6=8F=8F=EF=BC=88=E7=B0=BF=E8=AE=B0=E7=BC=9D?= =?UTF-8?q?=E7=9B=B2=E5=8C=BA=E7=94=B1=E5=8F=98=E5=BC=82m3=E6=9A=B4?= =?UTF-8?q?=E9=9C=B2=EF=BC=89=EF=BC=8Bsl3=20=E8=A1=A5=E5=85=B3=E6=95=B0?= =?UTF-8?q?=E8=AF=8D=E5=BD=A2=E3=80=8C=20=E5=85=B3=E3=80=8D=EF=BC=8Bsl12?= =?UTF-8?q?=20=E8=A1=A5=E6=A0=88=E9=81=AE=E6=8C=A1=E8=AE=B0=E8=B4=A6?= =?UTF-8?q?=E5=88=A4=E5=88=AB=EF=BC=88=E5=85=88=E5=85=B3=E5=90=8E=E5=BC=80?= =?UTF-8?q?=E7=9A=84=E5=8F=AF=E5=88=A4=E5=88=AB=E9=9D=A2=E2=80=94=E2=80=94?= =?UTF-8?q?=E5=9B=9E=E9=97=AA=E5=89=8D=E6=8F=90=E5=9C=A8=E7=8E=B0=E6=A8=A1?= =?UTF-8?q?=E6=80=81=E6=9C=BA=E5=88=B6=E4=B8=8B=E4=B8=8D=E6=88=90=E7=AB=8B?= =?UTF-8?q?=EF=BC=8C=E6=94=B9=E9=92=89=E9=80=89=E6=A1=A3=E8=A2=AB=E6=A0=88?= =?UTF-8?q?=E6=8C=82=E8=B5=B7=E9=9D=9E=E5=85=B3=E9=97=AD=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 变异组十条全数注入→最窄闸见红→git checkout 精确还原:m1 直连删除/m2 摘要读激活位/m3 空槽删档钮/m4 双常驻接线(忠实无条件形态)/m5 返回不恢复/m6 先关后开/m7 滚动容器/m8 预选标记/m9 拼禁词/m-ESC 加处理。 --- game/smoke/ui_click_probe.gd | 3 +++ game/smoke/ui_struct_probe.gd | 35 +++++++++++++++++++++++++---------- 2 files changed, 28 insertions(+), 10 deletions(-) diff --git a/game/smoke/ui_click_probe.gd b/game/smoke/ui_click_probe.gd index a0c17e6b..7b6c8343 100644 --- a/game/smoke/ui_click_probe.gd +++ b/game/smoke/ui_click_probe.gd @@ -163,6 +163,9 @@ func _ready() -> void: _problems.append("[savesel] sl12 动线序违约:开始层在落点帧恢复(回闪一帧)") if main.save_manager.active_slot() != 1 or not FileAccess.file_exists(csel_tpl % 1): _problems.append("[savesel] sl5 新档链失守(active=%d 应=1 且槽1 白板应落盘)" % main.save_manager.active_slot()) + var occluded: Array = main._modals._occluded.get(main.camp_overlay, []) + if not occluded.has(main.save_select_overlay): + _problems.append("[savesel] sl12 选档层被关闭而非栈记账挂起(先关后开形态——遮挡挂起中间态钉死)") if int((JSON.parse_string(FileAccess.get_file_as_string(csel_tpl % 1)) as Dictionary).get("meta", {}).get("keystone_balance", -1)) != 0: _problems.append("[savesel] sl5 新档非白板(槽1 落盘应全零)") main._on_camp_closed() diff --git a/game/smoke/ui_struct_probe.gd b/game/smoke/ui_struct_probe.gd index 67e6f580..a1b829e2 100644 --- a/game/smoke/ui_struct_probe.gd +++ b/game/smoke/ui_struct_probe.gd @@ -376,20 +376,27 @@ func _save_select_contract(main: Node, tpl: String) -> void: var scroll_count := _count_scroll(sso) if scroll_count > 0: problems.append("[savesel] 子树出现滚动容器 ×%d(sl1 禁滚动长列表)" % scroll_count) - # sl4 操作集二分:槽1 有档=进档+删档零新档;槽2 空=新档零进档删档;槽3 坏档=按空槽呈现(Q2 甲) + # sl4 操作集二分(渲染面实测——扫真实按钮文本,不走簿记缝):槽1 有档=进档+删档零新档; + # 槽2 空=新档零进档删档;槽3 坏档=按空槽呈现(Q2 甲) var occ: Dictionary = sso._occupied_flags if not (bool(occ.get(1, false)) and not bool(occ.get(2, false)) and not bool(occ.get(3, false))): problems.append("[savesel] 槽态判定失守(occ=%s 应=1有/2空/3坏按空)〔sl4〕" % str(occ)) - for slot in [1, 2, 3]: - var has_load: bool = sso._load_btns.has(slot) - var has_del: bool = sso._delete_btns.has(slot) - var has_new: bool = sso._new_btns.has(slot) - if slot == 1: + var row_idx := 0 + for row_c in rows.get_children(): + if not (row_c is Control) or row_c.is_queued_for_deletion(): + continue + row_idx += 1 + var btn_texts: Array[String] = [] + _collect_button_texts(row_c, btn_texts) + var has_load := btn_texts.has("进档") + var has_del := btn_texts.has("删档") + var has_new := btn_texts.has("新档") + if row_idx == 1: if not (has_load and has_del and not has_new): - problems.append("[savesel] 槽1 操作集失守(有档槽应=进档+删档、零新档)〔sl4〕") + problems.append("[savesel] 行1 操作集失守(有档槽应=进档+删档、零新档——渲染面实测)〔sl4〕") else: if not (has_new and not has_load and not has_del): - problems.append("[savesel] 槽%d 操作集失守(空/坏槽应=仅新档、零进档删档含置灰形态)〔sl4〕" % slot) + problems.append("[savesel] 行%d 操作集失守(空/坏槽应=仅新档、零进档删档含置灰形态)〔sl4〕" % row_idx) # sl2 摘要三项逐槽读数:槽1 喂入值逐字(钥石 555/通关 2 局/冒险 7 局) var sum1: Label = sso._summary_labels.get(1) if sum1 == null or sum1.text != "通关 2 局 · 冒险 7 局": @@ -402,8 +409,9 @@ func _save_select_contract(main: Node, tpl: String) -> void: has_keystone = true if not has_keystone: problems.append("[savesel] 槽1 钥石徽读数缺失(应=钥石 555)〔sl2〕") - # sl3 摘要禁项:断点/种子/「继续」字样零命中(裁决 4——零未完冒险读数) - for needle in ["断点", "种子", "继续"]: + # sl3 摘要禁项:断点/种子/「继续」/停点/「 关」(关数形——「通关」无空格不误伤)零命中 + #(裁决 4——零未完冒险读数;词形覆盖=对照表 sl3 变异「断点关数拼进槽卡」的拦截面) + for needle in ["断点", "种子", "继续", "停点", " 关"]: for t in all_texts: if t.contains(needle): problems.append("[savesel] 摘要禁项命中「%s」(label=「%s」)〔sl3〕" % [needle, t]) @@ -420,6 +428,13 @@ func _count_scroll(node: Node) -> int: return count +func _collect_button_texts(node: Node, out: Array[String]) -> void: + if node is Button and node.visible: + out.append(String(node.text)) + for c in node.get_children(): + _collect_button_texts(c, out) + + func _collect_labels(node: Node, out: Array[String]) -> void: if node is Label: out.append(String(node.text))