104 lines
4.2 KiB
GDScript
104 lines
4.2 KiB
GDScript
# VERTICAL SLICE - NOT FOR PRODUCTION
|
||
# 实现 GDD:design/ux/battle.md(C 区角色信息 240×548——2026-09-26 信息归属拍板精简:
|
||
# 攻击(+修正来源角标)/护甲 AC 数据框 + 魔法道具槽(预留)+ 本关强化列表(预留)。
|
||
# HP 条/立绘占位/状态效果槽/RAP 池/GP/钥石退役——HP 与状态唯一展示面 = B 区站桩(同一数据
|
||
# hud_presenter 双投喂 B/C 两区的重复展示);RAP 迁 D 区 AP 条(贴弃图刷新消费口);
|
||
# GP(中循环)/钥石(大循环)迁出战斗屏)。
|
||
# Date: 2026-09-12(2026-09-26 C 区精简批重写)
|
||
# 高内聚边界:纯视图 setter 面——装配(含修正文案/AC 投喂)归 hud_presenter.gd;定长槽 + clip_contents
|
||
# (缺陷①回归约束)。
|
||
class_name HeroInfoPanelView
|
||
extends PanelContainer
|
||
|
||
const COL_INK := UiKit.INK
|
||
|
||
var _atk_label: Label
|
||
var _armor_label: Label
|
||
var item_slots: HBoxContainer # 魔法道具槽(预留——4 空槽占位;数量/交互形态待魔法道具批定稿)
|
||
var _bonus_section: VBoxContainer # 本关强化(预留——空态隐藏,接线归大奖励/锻造呈现批)
|
||
var _bonus_list: VBoxContainer
|
||
|
||
|
||
func _init() -> void:
|
||
custom_minimum_size = Vector2(240, 0)
|
||
clip_contents = true
|
||
var sb := UiKit.panel_flat(UiKit.PANEL_HERO, UiKit.PANEL_BORDER, 0, 1, Vector4(8, 6, 8, 6))
|
||
add_theme_stylebox_override("panel", sb)
|
||
var col := VBoxContainer.new()
|
||
col.add_theme_constant_override("separation", 6)
|
||
add_child(col)
|
||
|
||
col.add_child(UiKit.label("探险者", 16, true))
|
||
_atk_label = _data_line()
|
||
col.add_child(_atk_label)
|
||
_armor_label = _data_line()
|
||
col.add_child(_armor_label)
|
||
|
||
# 魔法道具槽(预留):随身战斗用道具的唯一展示面——空槽占位承诺格子在此,
|
||
# 不预设交互(挖掘期指向交互归 E 区既有裁决);终稿样式/槽位数归魔法道具批
|
||
col.add_child(UiKit.label("魔法道具", 14, true))
|
||
item_slots = HBoxContainer.new()
|
||
item_slots.add_theme_constant_override("separation", 6)
|
||
col.add_child(item_slots)
|
||
for i in 4:
|
||
var slot := PanelContainer.new()
|
||
slot.custom_minimum_size = Vector2(40, 40)
|
||
slot.add_theme_stylebox_override("panel",
|
||
UiKit.panel_flat(UiKit.PANEL_DATA, UiKit.PANEL_BORDER, 0, 1, Vector4(4, 4, 4, 4)))
|
||
slot.mouse_filter = Control.MOUSE_FILTER_IGNORE
|
||
item_slots.add_child(slot)
|
||
|
||
# 本关强化(预留):锻造/大奖励/关卡奖励节点的属性提升——中循环数据因改变战斗数学准入;
|
||
# 与战斗内状态效果(B 区站桩,随战斗消散)分区,防「战斗结束被清」误读;空态整节隐藏
|
||
_bonus_section = VBoxContainer.new()
|
||
_bonus_section.add_theme_constant_override("separation", 4)
|
||
_bonus_section.visible = false
|
||
col.add_child(_bonus_section)
|
||
_bonus_section.add_child(UiKit.label("本关强化", 14, true))
|
||
_bonus_list = VBoxContainer.new()
|
||
_bonus_list.add_theme_constant_override("separation", 2)
|
||
_bonus_section.add_child(_bonus_list)
|
||
|
||
|
||
func set_attack(atk: int, mod_text: String) -> void:
|
||
# 修正来源角标:mod_text 形如「(+50% 增伤)」——来源 = 效果 display_name(增益状态 投影)
|
||
_atk_label.text = "攻击 %d %s" % [atk, mod_text]
|
||
|
||
|
||
func set_armor(ac: int) -> void:
|
||
# 护甲 AC(2026-09-26 二轮拍板补入)——我方 AC 唯一展示面;掷点判定轴受击侧可读性
|
||
_armor_label.text = "护甲 AC %d" % ac
|
||
|
||
|
||
# 本关强化列表(预留接线面):lines = 文案行数组(如「锻造 +2 攻击」)——空数组 = 整节隐藏
|
||
func set_level_bonuses(lines: Array) -> void:
|
||
for c in _bonus_list.get_children():
|
||
_bonus_list.remove_child(c)
|
||
c.queue_free()
|
||
for line in lines:
|
||
var l := UiKit.label(String(line), 13, false)
|
||
l.add_theme_color_override("font_color", COL_INK)
|
||
_bonus_list.add_child(l)
|
||
_bonus_section.visible = not lines.is_empty()
|
||
|
||
|
||
func set_idle() -> void:
|
||
_atk_label.text = "攻击 —"
|
||
_armor_label.text = "护甲 AC —"
|
||
set_level_bonuses([])
|
||
|
||
|
||
func attack_text() -> String:
|
||
return _atk_label.text
|
||
|
||
|
||
func armor_text() -> String:
|
||
return _armor_label.text
|
||
|
||
|
||
func _data_line() -> Label:
|
||
var l := UiKit.label("", 14, false)
|
||
l.clip_text = true
|
||
l.text_overrun_behavior = TextServer.OVERRUN_TRIM_ELLIPSIS
|
||
return l
|