merge: 迭代 8 三轮修改批——#1 弹窗 z 序自提修复 + #3 结算逐条演出(状态脉冲→伤害数字标出→道具逐条,段内 0.22s)

This commit is contained in:
DKChan committed 2026-09-29 23:57:15 +08:00
commit 6abad29be2
4 files changed
+86 -3

No files matched your search

+26 -1
View File
@@ -94,7 +94,7 @@ var _row_queue: Array = [] # 待排播行(step_row 载荷原样入队
var _row_pace_wait := 0.0 # 距下一行排播的剩余秒(_process 消耗)
var _pace_prev_segment := "" # 上一排播行的段型(段间/段内延迟判据)
const PACE_SEGMENT_GAP := 0.3 # 段间阶梯延迟(代拍板:白名单 0.2–0.4s 内取值,追认清单呈报)
const PACE_ROW_GAP := 0.06 # 段内快排间隔(同行段连读性——非白名单约束面)
const PACE_ROW_GAP := 0.22 # 段内间隔(三轮 #3 上调 0.06→0.22——逐条演出可感知,配合数字浮现/状态脉冲)
func _ready() -> void:
@@ -638,6 +638,7 @@ func _consume_row(row: Dictionary) -> void:
log_view.append_row(row)
stage.on_step_row_fx(row)
_play_cross_zone_fx(row) # 跨区因果演出(结算演出链批):开格之因 → 站桩之果
_play_settlement_mark(row) # 三轮 #3——逐条标出:Buff/Debuff 色环脉冲 → 伤害/治疗数字浮现
# 高光演出(战斗结算×3①② 占位):完美排雷横幅 / 标中旗加重弹道
if String(row.get("type", "")) == "highlight":
board_zone.fx.play_perfect_sweep()
@@ -646,6 +647,30 @@ func _consume_row(row: Dictionary) -> void:
_refresh_presentations()
# 逐条结算标出(三轮 #3——用户裁决按结算顺序演出:先 Buff/Debuff 特效、再基础伤害数字;
# 打中谁标谁、主角被打标主角;道具/奖励行逐条冒出)。目标解析失败兜底棋盘中心。
func _play_settlement_mark(row: Dictionary) -> void:
var mark_type := String(row.get("type", ""))
if mark_type != "effect" and mark_type != "damage" and mark_type != "heal":
return
var target := String(row.get("target", ""))
var center: Vector2
if target == "hero":
center = stage.hero_standee_center()
else:
var v = stage.enemy_standee_center(target) if target != "" and target != "all_enemies" else null
center = v if v != null else board_view.get_global_rect().get_center()
match mark_type:
"effect":
var col: Color = Color("7cc47c") if int(row.get("value", 0)) > 0 else Color("c47c7c")
settlement_fx.play_status_pulse(center, col)
"damage":
settlement_fx.play_damage_number(center, "-%d" % int(row.get("value", 0)),
Color("d9402a"), bool(row.get("crit", false)))
"heal":
settlement_fx.play_damage_number(center, "+%d" % int(row.get("value", 0)), Color("7cc47c"), false)
func _process(delta: float) -> void:
# 排播泵(卡⑦——演出层帧驱动;队列空=零开销直返)
if _row_queue.is_empty():
@@ -52,6 +52,12 @@ func open(text: String, confirm_label: String, cancel_label: String = "取消")
_text.text = text
_confirm_btn.text = confirm_label
_cancel_btn.text = cancel_label
# z 序自提(三轮修改批 #1——用户实机实证:本弹窗构建序早于开始覆盖层,而开始层是组合根
# 尾部才 add_child 的(树序最末=绘制最上),弹窗被整层盖住——「看不见弹窗/离开菜单才显形」。
# 每次打开强制提到宿主子级最末,绘制序恒最上。)
var host := get_parent()
if host != null:
host.move_child(self, host.get_child_count() - 1)
visible = true
+45 -1
View File
@@ -71,7 +71,9 @@ func play_projectile(from: Vector2, to: Vector2, glyph: String, col: Color, crit
# 减动效=静态呈现(驻留后即隐,零位移/零透明度动画——行呈现不跳过同语义,卡⑦ AC③)。
const BANNER_DWELL := 0.6
var _fx_banners := 0 # 演出探针计数(fx_probe 断言面)
var _fx_banners := 0 # 演出探针计数(fx_probe 断言面)
var _fx_damage_marks := 0 # 三轮 #3——伤害/治疗数字浮现计数
var _fx_status_pulses := 0 # 三轮 #3——增益/减益状态脉冲计数
# 演出探针出口(卡⑦——轮横幅发射计数)
@@ -79,6 +81,48 @@ func probe_banners() -> int:
return _fx_banners
# 演出探针出口(三轮 #3——逐条结算演出计数)
func probe_settlement_marks() -> int:
return _fx_damage_marks + _fx_status_pulses
# 伤害/治疗数字浮现(三轮 #3——用户裁决「打中谁就标出多少伤害/主角被打标出多少」):
# 站桩头顶浮现数字,上飘 34px 渐隐 0.7s(减动效=时长折半同演不跳过);crit 加大加重。
func play_damage_number(pos: Vector2, text: String, col: Color, crit: bool = false) -> void:
_fx_damage_marks += 1
var lab := UiKit.label(text, 26 if crit else 20, true)
lab.add_theme_color_override("font_color", col)
lab.add_theme_color_override("font_outline_color", Color(0.1, 0.08, 0.06, 0.9))
lab.add_theme_constant_override("outline_size", 4)
lab.mouse_filter = Control.MOUSE_FILTER_IGNORE
lab.z_index = 6
add_child(lab)
await get_tree().process_frame # 等一帧取实际尺寸(文本度量)
lab.position = pos - lab.size * 0.5
var tw := lab.create_tween()
tw.tween_property(lab, "position:y", lab.position.y - 34.0, UiKit.motion(0.7)).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT)
tw.parallel().tween_property(lab, "modulate:a", 0.0, UiKit.motion(0.35)).set_delay(UiKit.motion(0.35))
tw.tween_callback(lab.queue_free)
# 增益/减益状态脉冲(三轮 #3——用户裁决「先上 Buff/Debuff 特效,再显基础伤害」):
# 目标站桩处色环扩散淡出 0.5s(增益绿/减益红由调用方传色)。
func play_status_pulse(pos: Vector2, col: Color) -> void:
_fx_status_pulses += 1
var ring := Panel.new()
ring.mouse_filter = Control.MOUSE_FILTER_IGNORE
var sb := UiKit.panel_flat(Color(col, 0.0), col, 100, 3)
ring.add_theme_stylebox_override("panel", sb)
ring.size = Vector2(22, 22)
ring.position = pos - ring.size * 0.5
ring.z_index = 5
add_child(ring)
var tw := ring.create_tween()
tw.tween_property(ring, "scale", Vector2(2.4, 2.4), UiKit.motion(0.5)).set_trans(Tween.TRANS_QUAD).set_ease(Tween.EASE_OUT)
tw.parallel().tween_property(ring, "modulate:a", 0.0, UiKit.motion(0.5))
tw.tween_callback(ring.queue_free)
func play_round_banner(ri: int) -> void:
_fx_banners += 1
var banner := Panel.new()
+9 -1
View File
@@ -96,6 +96,14 @@ func _ready() -> void:
problems.append("减动效轮横幅未发射(卡⑦ AC③——静态化仍呈现不跳过)")
UiKit.motion_scale = saved_motion
# ---- ④c 逐条结算标出(三轮 #3——状态脉冲+伤害数字浮现断言面) ----
sfx.play_status_pulse(Vector2(120, 120), Color("7cc47c"))
sfx.play_damage_number(Vector2(120, 120), "-7", Color("d9402a"), false)
await get_tree().process_frame
await get_tree().process_frame
if int(sfx.probe_settlement_marks()) != 2:
problems.append("逐条结算标出未落位(状态脉冲+数字浮现——三轮 #3),实得 %s" % sfx.probe_settlement_marks())
# ---- ⑤ 主角三态切换(迭代 6 T3——attack/hit 短驻自回 + 死亡复活态回 idle) ----
var hero_sb = sb_script.new("hero")
hero_sb.box = Vector2(150, 176)
@@ -148,7 +156,7 @@ func _ready() -> void:
# ---- 汇总 ----
if problems.is_empty():
print("[fx_probe] PASS — 死亡碎裂5块/命中火花6/意图三档+零表示/胜利纹章10/失败掸灰8+旗光8/结算光带+缘线/轮横幅双态/主角三态切换 全链路通过")
print("[fx_probe] PASS — 死亡碎裂5块/命中火花6/意图三档+零表示/胜利纹章10/失败掸灰8+旗光8/结算光带+缘线/轮横幅双态/逐条结算标出/主角三态切换 全链路通过")
get_tree().quit(0)
else:
for p in problems: