From 767920827990c2404d566b88c7050346278b3e06 Mon Sep 17 00:00:00 2001 From: DKChan <524912269@qq.com> Date: Fri, 6 Nov 2026 05:44:55 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B7=A5=E7=A8=8B(=E7=9C=9F=E8=BE=93=E5=85=A5?= =?UTF-8?q?=E5=8C=961/7=C2=B7ui=5Finput=5Fprobe):=20=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E9=9D=A2=E6=9D=BF=E5=85=B3=E9=97=AD=E9=92=AE=20emit=E2=86=92?= =?UTF-8?q?=E7=9C=9F=E8=BE=93=E5=85=A5(push=5Fclick+release=E6=B2=BF,p16?= =?UTF-8?q?=E5=B1=80=E9=83=A8=E5=8F=98=E9=87=8F)=E2=80=94=E2=80=94case?= =?UTF-8?q?=E2=91=AF=E5=85=B3=E9=97=AD=E6=81=A2=E5=A4=8D=E9=93=BE=E8=B7=AF?= =?UTF-8?q?=E6=94=B9=E7=BB=8F=E8=BE=93=E5=85=A5=E7=AE=A1=E7=BA=BF;=20?= =?UTF-8?q?=E5=90=8C=E6=96=87=E4=BB=B6=E5=88=A4=E6=8D=AE=E5=87=BA=E5=A4=84?= =?UTF-8?q?=E6=B3=A8=E8=AE=B011=E6=9D=A1=E8=90=BDcase=E6=AE=B5(=E2=91=A0-?= =?UTF-8?q?=E2=91=A2=E2=86=92HUD=E6=A1=86=E6=9E=B6:269=E6=82=AC=E5=81=9C?= =?UTF-8?q?=E8=AF=AD=E4=B9=89/=E2=91=A3=E2=91=A5=E2=86=92=E6=8E=92?= =?UTF-8?q?=E9=9B=B7=E7=8E=A9=E6=B3=95:231=E5=B0=81=E5=8D=B0=E6=8C=96?= =?UTF-8?q?=E6=8E=98=E5=8F=97=E7=90=86/=E2=91=A4=E2=86=92:236=E6=8B=92?= =?UTF-8?q?=E7=BB=9D=E4=B8=89=E6=BA=90/=E2=91=A6-=E2=91=A9=E2=86=92battle.?= =?UTF-8?q?md:154=E4=B8=BB=E8=A7=92=E7=AB=99=E6=A1=A9=E8=90=BD=E5=BD=B1/?= =?UTF-8?q?=E2=91=AA=E2=86=92HUD=E6=A1=86=E6=9E=B6:264=E6=95=B0=E5=AD=97?= =?UTF-8?q?=E5=8F=AF=E8=AF=BB/=E2=91=AD=E2=86=92=E5=9C=B0=E5=BD=A2?= =?UTF-8?q?=E5=8F=98=E5=BC=82:154=E6=95=B0=E6=8D=AE=E8=B7=AF=E7=94=B1/?= =?UTF-8?q?=E2=91=AE=E2=86=92HUD=E6=A1=86=E6=9E=B6:268=E8=BF=B7=E9=9B=BE?= =?UTF-8?q?=E4=B8=A4=E6=80=81+=E5=85=83=E8=BF=9B=E5=BA=A6:156=E8=A3=85?= =?UTF-8?q?=E9=85=8D=E5=8F=AF=E8=A7=81/=E2=91=AF=E2=86=92HUD=E6=A1=86?= =?UTF-8?q?=E6=9E=B6:277=E6=A8=A1=E6=80=81=E9=94=81/=E2=91=B0=E2=86=92HUD?= =?UTF-8?q?=E6=A1=86=E6=9E=B6:267=E5=BE=AE=E5=85=89=E7=94=9F=E5=91=BD?= =?UTF-8?q?=E5=91=A8=E6=9C=9F);=20=E6=9C=AC=E6=AD=A5=E5=87=AD=E6=8D=AE:=20?= =?UTF-8?q?ui=5Finput=5Fprobe=20headless=E7=9B=B4=E8=B7=91PASS=20exit=3D0(?= =?UTF-8?q?18=E6=96=AD=E8=A8=80=E7=BB=84=E5=85=A8=E7=BB=BF=E5=90=ABcase?= =?UTF-8?q?=E2=91=AF=E7=9C=9F=E7=82=B9=E5=85=B3=E9=97=AD=E6=81=A2=E5=A4=8D?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- game/probe/ui_input_probe.gd | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/game/probe/ui_input_probe.gd b/game/probe/ui_input_probe.gd index e3ecde7c..968124c5 100644 --- a/game/probe/ui_input_probe.gd +++ b/game/probe/ui_input_probe.gd @@ -242,6 +242,7 @@ func _ready() -> void: _pre_fail("目标格选取失败 seal=%s dig=%s forbid=%s reveal=%s" % [seal_t, dig_t, forbid_t, reveal_t]) return # ---- case① 悬停可挖域:motion → 悬停态到达(金框 + 十字光标)---- + # oracle: design/gdd/systems/表现与支撑/HUD框架.md:269 悬停光标三语义随目标切换、已开格路径预览、可挖域常驻微光(case①-③ 输入面) _push_motion(_pos(bv, seal_t)) await get_tree().process_frame if bv.hover_probe() != seal_t: @@ -270,6 +271,7 @@ func _ready() -> void: if bv.mouse_default_cursor_shape != Input.CURSOR_ARROW: _problems.append("case③ 移动光标缺失(%d)" % bv.mouse_default_cursor_shape) # ---- case④ 右键封印:seal_place 到达组合根 + 核心封印态落位 ---- + # oracle: design/gdd/systems/排雷循环/排雷玩法.md:231 封印受理与印记随挖消失(case④/④b) _push_click(_pos(bv, seal_t), MOUSE_BUTTON_RIGHT) await get_tree().process_frame if not _has_action(seal_t, "seal_place"): @@ -283,12 +285,14 @@ func _ready() -> void: if seal_unit == null or not seal_unit.seal_on: _problems.append("case④b 封印印记未下发(seal_on=%s)" % ["无单元" if seal_unit == null else str(seal_unit.seal_on)]) # ---- case⑤ 双击 chord:禁入格双左击(核心拒挖零副作用)→ chord_attempted ---- + # oracle: design/gdd/systems/排雷循环/排雷玩法.md:236 拒绝三源可辨、任何拒绝零副作用(case⑤ chord) _push_click(_pos(bv, forbid_t), MOUSE_BUTTON_LEFT) _push_click(_pos(bv, forbid_t), MOUSE_BUTTON_LEFT) await get_tree().process_frame if _chords.is_empty() or _chords[_chords.size() - 1] != forbid_t: _problems.append("case⑤ chord_attempted 未达(chords=%s)" % [str(_chords)]) # ---- case⑥ 左键挖:dig 到达组合根 + 核心揭格落位 ---- + # oracle: design/gdd/systems/排雷循环/排雷玩法.md:231 挖掘受理与揭格落位(case⑥) _push_click(_pos(bv, dig_t), MOUSE_BUTTON_LEFT) await get_tree().process_frame if not _has_action(dig_t, "dig"): @@ -297,6 +301,7 @@ func _ready() -> void: if not ms.is_revealed(dig_t): _problems.append("case⑥ 核心揭格未落位(目标=%s)" % dig_t) # ---- case⑦ 英雄精灵世界落位(回归闸):精灵在 SubViewport 世界内, + # oracle: design/gdd/ux/battle.md:154 主角站桩立绘带落影、贴脚与缩放档(case⑦-⑩ 呈现落位) # 落位 = 格×步距 + 脚底锚(横=格中线/纵=格底往上 25% 线=HERO_GROUND_FRAC 自底边口径——「脚踩 # 格子 1/4 处·从下往上数」;禁带壳层 _svp_container.position 居中偏移——上批误用壳层 # cell_origin 实测右偏 ~7 格+偏离格心,实机截图用户报缺陷)。素材缺位树(hero==null,字形 @@ -363,6 +368,7 @@ func _ready() -> void: if bv._world.hero.position.distance_to(expect10b) > 0.5: _problems.append("case⑩ 还原后英雄未复位(pos=%s expect=%s)" % [str(bv._world.hero.position), str(expect10b)]) # ---- case⑪ 贴图缺位回退(字形「人」回归闸):texture 置 null + refresh → 英雄格数字 0 时字形 + # oracle: design/gdd/systems/表现与支撑/HUD框架.md:264 棋盘格子与数字完整可见——贴图缺位回退字形保可读(case⑪) # 必须回退「人」(数字格仍显数字——回退判据与抑制判据同源);验毕还原纹理重绘。 ---- if bv._world.hero != null: var hp11: Vector2i = ms.hero_pos() @@ -379,6 +385,7 @@ func _ready() -> void: bv._hero_sprite.tex_idle = tex_saved bv.refresh() # ---- case⑭ 变异角标(flat_damage 未开格视觉标记;resolver 注入面+落位+复位) ---- + # oracle: design/gdd/systems/排雷循环/地形变异.md:154 呈现按 effect/trigger/placement 数据路由、零特判(case⑭ 角标) var mark_t: Vector2i = _pick_forbidden(bv, ms) # 任一未开格(禁入=未开非相邻) if mark_t.x >= 0: bv.set_variant_mark_resolver(func(_c): return "flat_damage") @@ -392,6 +399,7 @@ func _ready() -> void: else: _problems.append("case⑭ 无未开格可验(板面异常)") # ---- case⑮ 视野迷雾(三态呈态/半径圈/移动跟随/开关两态零扰动/提灯插值位; + # oracle: design/gdd/systems/表现与支撑/HUD框架.md:268 视野迷雾:灯光区随移动跟随、开关两态结算逐位一致(case⑮) # 纯呈现零逻辑——迷雾开关切换前后 minesweeper 状态摘要逐位一致) ---- var fogp: Dictionary = bv.fog_params_probe() if int(bv.FOG_RADIUS) != 8 or int(fogp["lantern"]) != 0 or not fogp["enabled"]: @@ -487,6 +495,7 @@ func _ready() -> void: # attune_param_sum 只读出口→set_fog_glow_bonus〕→视野 +4 生效与卸装复原。 # settlement.attunement 手动注入=模拟 begin_battle enc 注入后的运行态〔注入面本体归 # 冒烟+单测覆盖〕;不重启冒险——case⑯ 起既有板面继续用) + # oracle: design/gdd/systems/跨局循环/元进度.md:156 解锁可见:装配强化下一局生效(case⑮ 装配链) main.save_manager.meta_state.set_attunement_equipped(["wide_scout_band"]) var p_lantern: Dictionary = main.build_adventure_params(main.save_manager, main.meta) if not (p_lantern.get("attunement", []) as Array).has("wide_scout_band"): @@ -505,6 +514,7 @@ func _ready() -> void: _problems.append("case⑮ 卸装后 dist==R+1 格未复原遮蔽") main.save_manager.meta_state.set_attunement_equipped([]) # ---- case⑯ 状态面板输入锁语义(R3——开层锁棋盘、关层恢复无残留;真实 push_input + # oracle: design/gdd/systems/表现与支撑/HUD框架.md:277 模态打开输入锁定、关闭逐层恢复(case⑯ R3) # 路径:入口角标本体 press+release 真点击 → 状态面板开;锁期挖掘点击零穿透;「继续」关层后 # 同格挖掘重新到达——锁语义与既有模态同款,无状态残留。置于全 case 之尾:取格若需前沿移位 #(真实点击 move 扩大可挖域),其板面扰动不再波及任何既有断言——域恰 2 枚时 seal_t 带封印+ @@ -547,7 +557,9 @@ func _ready() -> void: if resume_btn == null: _problems.append("case⑯ 状态面板关闭钮缺失") else: - resume_btn.pressed.emit() + var rpos16: Vector2 = resume_btn.get_global_rect().get_center() + _push_click(rpos16, MOUSE_BUTTON_LEFT) + _push_release(rpos16, MOUSE_BUTTON_LEFT) # Button pressed 信号走 release 沿——按压+释放成对 await get_tree().process_frame if main.ui.modals.run.status_panel.visible or main.ui.flow.locks_input(): _problems.append("case⑯ 关闭后未恢复(visible=%s locked=%s——R3 残留)" @@ -558,6 +570,7 @@ func _ready() -> void: if not _has_action(status_dig, "dig") or not ms.is_revealed(status_dig): _problems.append("case⑯ 关闭后挖掘未到达(恢复无残留验证失守)") # ---- case⑰ 未开格类型微光(活板面走查:作用集恒等/开格灭/移动复亮 + # oracle: design/gdd/systems/表现与支撑/HUD框架.md:267 类型微光出圈即灭入圈即亮、已开与封锁格恒无微光(case⑰) # 与出圈灭/相位门控/开关两态零扰动。与冒烟段数据面断言分工:此处走真实点击路径) ---- if not bool(bv.type_glow_probe().get("enabled", false)): _problems.append("case⑰ 微光默认态非开(生产默认开——Q4 丙案)")