refactor(ui): C 区精简批——信息归属拍板代码实装(2026-09-26):①C 区面板=攻击+护甲AC 数据框+魔法道具槽(预留 4 空槽)+本关强化列表(预留空态隐藏)——HP 条/立绘占位/状态槽/RAP/GP/钥石退役;②状态效果唯一展示面=B 区站桩(compact 档 StatusSlotRow 整体迁入——16px 图标+层数角标+悬停 tooltip 义务随迁,BUG-0001 回归组件同源;清空反馈逐槽化光+微文案随迁站桩);③RAP 读数迁 D 区 AP 条贴弃图刷新消费口(点阵+数字+清零脉冲微文案+拒绝脉冲载体随迁);④hud_presenter 单投喂改造(B/C 双投喂重复展示退役)+钱包投喂退役(GP/钥石迁出战斗屏,去向=关卡画面/结算/营地归对应 UX 批);冒烟 557/0+五探针全绿

This commit is contained in:
DKChan committed 2026-09-26 01:26:26 +08:00
1 parent d6eee49945
commit effb98e57d
9 files changed
+203 -224

No files matched your search

+34 -43
View File
@@ -2,9 +2,9 @@
# 实现 GDD:design/ux/battle.md(B 区全站桩形态——2026-09-20 用户看对照样张拍板,台账 99:
# 主角与敌人均为无框立绘+底座,英雄卡/敌人卡卡片式整体退役禁再提)。
# 形态契约:无框立绘(程序占位字形;set_portrait_texture = 资产挂点,战斗表现样张批落位零代码换装)
# + 底座;血条悬浮头顶;状态小图标一排挂血条正下方(2026-09-24 状态图标接入批:定稿 PNG 纹理
# 取代程序化占位字形,极性染色退役——绿↑红↓极性语言内化于图标本体;层数 ×N 角标保留;
# 词汇单点复用 StatusSlotRow.EFFECT_ICON,未知键同款 fail-fast + ? 占位)。
# + 底座;血条悬浮头顶;状态效果唯一展示面挂血条正下方(2026-09-26 C 区精简批:compact 档
# StatusSlotRow 组件整体迁入——定稿 PNG 图标+层数 ×N 角标+悬停 tooltip〔来源+语义+剩余〕,
# tooltip 义务自 C 区状态槽并入;空态 = 图标行隐藏)。
# 敌方专属:顺位徽标悬浮头顶;意图三档动作动画占位(表现层升级批拍板:不显示技能名——普攻零表示 /
# 攻击系 ⚔ / 增益系 ✦ / 妨害系 ☠ / 蓄力 = ⚔ 金档;开轮摇定播一次性短动画后静帧保持,
# 挖掘期不循环——art-bible §2.1 能量纪律,终稿动画密度归战斗表现批);底座下 护甲类型图标+名字
@@ -28,7 +28,9 @@ var _platform: Panel
var _hp_bar: ProgressBar
var _order_badge: Label = null
var _intent_badge: Label = null
var _status_row: HBoxContainer
var _top_row: VBoxContainer
var slot_row: StatusSlotRow # 状态效果唯一展示面(2026-09-26 C 区精简批——compact 档组件整体迁入;
# 悬停 tooltip 来源+语义+剩余 义务随之从 C 区状态槽并入,主角/敌方共用)
var _name_line: HBoxContainer = null
var _armor_icon: Label = null
var _name_label: Label = null
@@ -46,6 +48,7 @@ func _init(kind: String = "enemy") -> void:
# 头顶悬浮层:血条(敌附顺位徽标)+ 状态小图标行
var top := VBoxContainer.new()
_top_row = top
top.set_anchors_preset(Control.PRESET_TOP_WIDE)
top.offset_left = 8.0
top.offset_right = -8.0
@@ -64,10 +67,12 @@ func _init(kind: String = "enemy") -> void:
_hp_bar.size_flags_horizontal = Control.SIZE_EXPAND_FILL
_hp_bar.size_flags_vertical = Control.SIZE_SHRINK_CENTER
hp_row.add_child(_hp_bar)
_status_row = HBoxContainer.new()
_status_row.alignment = BoxContainer.ALIGNMENT_CENTER
_status_row.add_theme_constant_override("separation", 4)
top.add_child(_status_row)
slot_row = StatusSlotRow.new()
slot_row.compact = true # 站桩迷你档——图标 16px+层数角标,tooltip 全明细
slot_row.alignment = BoxContainer.ALIGNMENT_CENTER
slot_row.size_flags_horizontal = Control.SIZE_SHRINK_CENTER
slot_row.mouse_filter = Control.MOUSE_FILTER_IGNORE # 行容器放行鼠标事件给槽位(悬停 tooltip)
top.add_child(slot_row)
# 立绘(程序占位字形)
_portrait = UiKit.label("人" if kind == "hero" else "敌", 42, true)
@@ -164,32 +169,28 @@ func set_idle() -> void:
set_effects([])
# 主角/敌方共用——状态小图标行重建(B 区迷你版:定稿纹理 16px + 层数 ×N 角标;
# 完整 tooltip 义务归 C 区状态槽。2026-09-24 状态图标接入批:占位字形+极性染色退役)
# 主角/敌方共用——状态效果唯一展示面(2026-09-26 C 区精简批:compact 档 StatusSlotRow 整体迁入,
# 原 B 区迷你字形行退役;悬停 tooltip(来源+语义+剩余结算次数)义务自 C 区状态槽并入本组件;
# 空态 = 图标行隐藏不占位(增益状态 EC12))
func set_effects(effects: Array) -> void:
for c in _status_row.get_children():
_status_row.remove_child(c)
c.queue_free()
for eff in effects:
var tex := _icon_tex(String(eff.get("effect_id", "")))
var layers := maxi(1, int(eff.get("layers", 1)))
if tex != null:
var icon := TextureRect.new()
icon.texture = tex
icon.custom_minimum_size = Vector2(16, 16) # 32px 源 ÷2 整数档缩放
icon.expand_mode = TextureRect.EXPAND_IGNORE_SIZE
icon.stretch_mode = TextureRect.STRETCH_KEEP_ASPECT_CENTERED
icon.texture_filter = CanvasItem.TEXTURE_FILTER_LINEAR
icon.mouse_filter = Control.MOUSE_FILTER_IGNORE
_status_row.add_child(icon)
else:
var ph := UiKit.label(StatusSlotRow.ICON_PLACEHOLDER, 12, true) # release 回退占位(debug 已断言)
ph.mouse_filter = Control.MOUSE_FILTER_IGNORE
_status_row.add_child(ph)
if layers > 1:
var lab := UiKit.label("×%d" % layers, 12, true)
lab.mouse_filter = Control.MOUSE_FILTER_IGNORE
_status_row.add_child(lab)
slot_row.set_effects(effects)
slot_row.visible = not effects.is_empty()
# battle_over:状态图标行全清可见反馈(增益状态×4④ 载体迁移——逐槽化光 + 微文案,
# 自 C 区状态槽迁入;主角侧调用,敌方不适用)
func set_effects_cleared_feedback() -> void:
slot_row.visible = true
slot_row.set_cleared_feedback()
var note := UiKit.label("状态随战斗结束消散", 11, false)
note.add_theme_color_override("font_color", UiKit.STONE_FAINT)
note.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
note.mouse_filter = Control.MOUSE_FILTER_IGNORE
_top_row.add_child(note)
var tw := create_tween()
tw.tween_interval(1.2)
tw.tween_property(note, "modulate:a", 0.0, UiKit.motion(0.8))
tw.tween_callback(note.queue_free)
func set_order(i: int) -> void:
@@ -321,13 +322,3 @@ func _refresh_portrait_glyph() -> void:
_portrait.text = "█" # 最大体量
_:
_portrait.text = "敌"
# 状态图标键解析(词汇单点复用 C 区 StatusSlotRow——HUD框架:查不到的键按错误处理,
# 立即断言 + ? 占位 + 诊断,禁止静默显示空图标)
func _icon_tex(effect_id: String) -> Texture2D:
if StatusSlotRow.EFFECT_ICON.has(effect_id):
return StatusSlotRow.EFFECT_ICON[effect_id]
push_error("[站桩] 未知状态图标键(映射表外键——立即断言): %s" % effect_id)
assert(false, "未知状态图标键: " + effect_id)
return null