test(ui): 呈现层状态断言批(A 档方案落地——ui_input_probe 七断言→十一断言 2026-09-26 用户拍板):⑧影子构成与贴脚(英雄子件唯一性/中心贴脚锚 ZERO/z 相对-1/alpha 0.35/GradientTexture2D 组件/父子 use_parent_material 链);⑨右移朝向 flip_h=true+到位墙钟回站帧+缩放 1.5 均匀档(无可达右邻已开格打印 SKIP 不判失败);⑩变格边长即时重排(set_cell_area 缩格→英雄即时落新脚锚+scale 均匀、还原→46px 复位——窗口缩放路径回归闸);⑪贴图缺位回退(texture 置 null+refresh→数字 0 格字形必回退「人」/数字格不破坏——回退判据与抑制判据同源验证);踩坑在案:Variant 链 get_children() 用 := 推断失败=探针脚本载入失败静默挂死(显式 Array 标注修复——GDScript 探针新坑第二例);冒烟 557/0+click 探针绿

This commit is contained in:
DKChan committed 2026-09-25 14:31:42 +08:00
1 parent 3c55a0c6fd
commit 9bbffd849f
1 file changed
+74 -2
+74 -2
View File
@@ -5,7 +5,9 @@
# 悬停/点选/chord 既有出口 → 组合根信号。四 case:①悬停可挖域(金框+十字光标)②悬停禁入
# (hover_forbidden 信号+灰禁红框)③悬停已开格(路径预览点迹+移动光标)④右键插旗(flag_place
# 到达组合根+核心旗态)⑤双击 chord(禁入格双左击,核心拒挖零副作用)⑥左键挖(dig 到达组合根+核心揭格)
# ⑦英雄精灵世界落位(棋盘小人贴图批回归闸——SubViewport 世界坐标判据,素材缺位树跳过)。
# ⑦英雄精灵世界落位(棋盘小人贴图批回归闸——SubViewport 世界坐标判据,素材缺位树跳过)
# ⑧影子构成与贴脚 ⑨右移朝向+到位回站帧+缩放档 ⑩变格边长即时重排 ⑪贴图缺位回退字形
#(⑧–⑪=呈现层状态断言批 2026-09-26——Node2D 展示几何/状态面单元化,A 档方案)。
# 事件路径:Viewport.push_input(ev, in_local_coords=true)——落点用 BoardView.cell_center_local
# (与 _cell_at 同一公式族)换算画布坐标,SubViewportContainer mouse_filter=IGNORE 不拦截。
# 运行:Godot_console.exe --headless --path . res://smoke/ui_input_probe.tscn
@@ -133,8 +135,78 @@ func _ready() -> void:
+ Vector2(bv.cell_size * 0.5, bv.cell_size * (1.0 - bv.HERO_GROUND_FRAC))
if bv._world.hero.position.distance_to(expect) > 0.5:
_problems.append("case⑦ 英雄精灵世界落位偏移 pos=%s expect=%s" % [str(bv._world.hero.position), str(expect)])
# ---- case⑧ 影子构成与贴脚(小人立体感批回归闸 2026-09-26):椭圆影=英雄子件、中心贴脚锚
#(上批 (0,2) 下坠脱脚用户报缺陷)、z 相对回落格面之上英雄之下、黑色半透明、渐变纹理组件
# 合成;父子 use_parent_material 双挂(结算期随世界去饱和与格面同口径)。 ----
if bv._world.hero != null:
var kids: Array = bv._world.hero.get_children()
if kids.size() != 1 or not (kids[0] is Sprite2D):
_problems.append("case⑧ 影子子件缺失或类型不对(children=%d)" % kids.size())
else:
var sh: Sprite2D = kids[0]
if sh.position != Vector2.ZERO:
_problems.append("case⑧ 影子未贴脚(pos=%s 应=ZERO)" % str(sh.position))
if sh.z_index != -1:
_problems.append("case⑧ 影子 z 相对档不对(%d 应=-1)" % sh.z_index)
if absf(sh.modulate.a - 0.35) > 0.01:
_problems.append("case⑧ 影子透明度漂移(%s 应=0.35)" % str(sh.modulate.a))
if not (sh.texture is GradientTexture2D):
_problems.append("case⑧ 影子纹理非径向渐变组件(%s)" % str(sh.texture))
if not sh.use_parent_material or not bv._world.hero.use_parent_material:
_problems.append("case⑧ 去饱和材质链漏挂(shadow=%s hero=%s)" % [str(sh.use_parent_material), str(bv._world.hero.use_parent_material)])
# ---- case⑨ 右移朝向+到位回站帧+缩放档(贴图批回归闸):素材基准朝左——向右移动 flip_h=true;
# 到位(0.3s 墙钟 > 位移 Tween 140ms)纹理回站帧、scale 恒 1.5 均匀档。无可达右邻已开格跳过。 ----
if bv._world.hero != null:
var hp9: Vector2i = ms.hero_pos()
var mv9 := Vector2i(-9, -9)
for n in bv._board.neighbors8(hp9):
if n.x == hp9.x + 1 and ms.is_revealed(n):
mv9 = n
break
if mv9.x == -9:
print("[ui_input_probe] SKIP case⑨(无可达右邻已开格)")
else:
_push_click(_pos(bv, mv9), MOUSE_BUTTON_LEFT)
await get_tree().create_timer(0.3).timeout
var sp9: Sprite2D = bv._world.hero
if not sp9.flip_h:
_problems.append("case⑨ 右移后未翻转朝向(flip_h=false,素材基准朝左)")
if sp9.texture != bv._hero_tex_idle:
_problems.append("case⑨ 到位未回站帧(texture=%s)" % str(sp9.texture))
if sp9.scale != Vector2.ONE * bv.HERO_SPRITE_SCALE:
_problems.append("case⑨ 缩放档漂移(%s 应=%s 均匀)" % [str(sp9.scale), str(bv.HERO_SPRITE_SCALE)])
# ---- case⑩ 变格边长即时重排(窗口缩放路径回归闸):set_cell_area 换小格 → 英雄即时落新脚锚、
# 缩放均匀不残弹跳形;还原 → 46px 档复验。 ----
if bv._world.hero != null:
var hp10: Vector2i = ms.hero_pos()
bv.set_cell_area(Vector2(300, 300))
var expect10: Vector2 = Vector2(hp10) * (bv.cell_size + float(bv.SEP)) \
+ Vector2(bv.cell_size * 0.5, bv.cell_size * (1.0 - bv.HERO_GROUND_FRAC))
if bv._world.hero.position.distance_to(expect10) > 0.5 or bv._world.hero.scale != Vector2.ONE * bv.HERO_SPRITE_SCALE:
_problems.append("case⑩ 缩格后英雄未即时重排(pos=%s expect=%s scale=%s)" % [str(bv._world.hero.position), str(expect10), str(bv._world.hero.scale)])
bv.set_cell_area(bv.size)
var expect10b: Vector2 = Vector2(hp10) * (bv.cell_size + float(bv.SEP)) \
+ Vector2(bv.cell_size * 0.5, bv.cell_size * (1.0 - bv.HERO_GROUND_FRAC))
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 时字形
# 必须回退「人」(数字格仍显数字——回退判据与抑制判据同源);验毕还原纹理重绘。 ----
if bv._world.hero != null:
var hp11: Vector2i = ms.hero_pos()
var u11 = bv._cells[hp11]
var tex_saved: Texture2D = bv._hero_tex_idle
bv._hero_tex_idle = null
bv.refresh()
var digit11: int = int(ms.reveal_record(hp11).get("digit", 0))
if digit11 == 0:
if u11.glyph != "人":
_problems.append("case⑪ 贴图缺位未回退字形「人」(glyph=%s)" % u11.glyph)
elif u11.glyph != str(digit11):
_problems.append("case⑪ 缺位态数字格字形被破坏(glyph=%s 应=%d)" % [u11.glyph, digit11])
bv._hero_tex_idle = tex_saved
bv.refresh()
if _problems.is_empty():
print("[ui_input_probe] PASS — 悬停金框/禁入信号/路径预览/flag_place/chord/dig/英雄落位 七断言全绿(真实 push_input 路径)")
print("[ui_input_probe] PASS — 悬停金框/禁入信号/路径预览/flag_place/chord/dig/英雄落位/影子构成/朝向/缩格重排/缺位回退 十一断言全绿(真实 push_input 路径)")
get_tree().quit(0)
else:
for p in _problems: