92 lines
4.1 KiB
GDScript
92 lines
4.1 KiB
GDScript
## VERTICAL SLICE - NOT FOR PRODUCTION
|
|
## 局内状态面板·只读:本局信息面板(钥石总量+本局四件:带的秘宝/已获专长/当前属性/现有 GP)。
|
|
## 跨关解锁概览(秘宝匣解锁态/天赋树已购)由营地/生涯承载,本面板不镜像。
|
|
## 账面快照由组合根 open_status 喂入;进出零动效直开直关;构成件全部经 UiKit 工厂产出——禁裸色值自建样式。
|
|
class_name StatusPanel
|
|
extends Control
|
|
|
|
signal closed
|
|
|
|
var _balance_badge: UiKit.KeystoneBadge # 钥石总量徽(badge 工厂件——Q10 甲)
|
|
var _attrs_label: Label
|
|
var _curios_label: Label
|
|
var _feats_label: Label
|
|
|
|
|
|
func _init() -> void:
|
|
var shell: Dictionary[Variant, Variant] = UiKit.modal_shell(self, Color(UiKit.DIM, 0.55), Vector2(560, 0), 10, true,
|
|
UiKit.panel_skinned(Vector4(20, 16, 20, 16))) # 石板皮(缺位回退数据板——同设置面先例)
|
|
var box: VBoxContainer = shell.box
|
|
|
|
var title := UiKit.label("状态",UiKit.FS_TITLE, true, UiKit.INK_TITLE)
|
|
title.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
|
box.add_child(title)
|
|
var hint := UiKit.label("查看本局冒险进度(只读)",UiKit.FS_HINT, false, UiKit.INK_HINT)
|
|
hint.horizontal_alignment = HORIZONTAL_ALIGNMENT_CENTER
|
|
box.add_child(hint)
|
|
|
|
# 钥石总量行(badge 工厂件——与营地顶栏钥石徽同形制)
|
|
var bal_row := HBoxContainer.new()
|
|
bal_row.alignment = BoxContainer.ALIGNMENT_CENTER
|
|
box.add_child(bal_row)
|
|
_balance_badge = UiKit.keystone_badge("钥石 0")
|
|
bal_row.add_child(_balance_badge)
|
|
|
|
box.add_child(HSeparator.new())
|
|
_section_head(box, "本局状态")
|
|
_attrs_label = UiKit.label("",UiKit.FS_HINT, false, UiKit.INK_LABEL)
|
|
_attrs_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
|
|
box.add_child(_attrs_label)
|
|
|
|
_section_head(box, "带的秘宝")
|
|
_curios_label = UiKit.label("",UiKit.FS_HINT, false, UiKit.INK_LABEL)
|
|
_curios_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
|
|
box.add_child(_curios_label)
|
|
|
|
_section_head(box, "已获专长")
|
|
_feats_label = UiKit.label("",UiKit.FS_HINT, false, UiKit.INK_LABEL)
|
|
_feats_label.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART
|
|
box.add_child(_feats_label)
|
|
|
|
box.add_child(HSeparator.new())
|
|
var close_row := HBoxContainer.new()
|
|
close_row.alignment = BoxContainer.ALIGNMENT_CENTER
|
|
box.add_child(close_row)
|
|
var close_btn := UiKit.button("继续", 90.0) # 紧凑返回钮(设置面先例形制;文案=代拍板白名单「继续」级措辞)
|
|
close_btn.tooltip_text = "关闭状态面板,继续当前冒险(本层只读,不发生任何购买或修改)"
|
|
close_btn.pressed.connect(_emit_closed)
|
|
close_row.add_child(close_btn)
|
|
visible = false # 显式初始化——不靠树序巧合(缺陷⑤家族纪律)
|
|
|
|
|
|
# 分组小节头(营地屏分组同构——fs 副标题档深墨)
|
|
func _section_head(box: VBoxContainer, text: String) -> void:
|
|
var head := UiKit.label(text,UiKit.FS_BODY, true, UiKit.INK_LABEL)
|
|
box.add_child(head)
|
|
|
|
|
|
# ---- 开层(组合根唯一调用口——快照随开随建,R4 单次开层生命周期口径)----
|
|
# 八键快照(组合根 _status_data 换代):balance/hero_hp/max_hp/atk/ac/gp/curios/feats——
|
|
# 本局四件拼装在此,禁第二份投影(秘宝=inventory_projection 行映射、专长=feat_holdings_lines 现成行)
|
|
func open_status(data: Dictionary) -> void:
|
|
_balance_badge.set_text("钥石 %d" % int(data.get("balance", 0)))
|
|
_attrs_label.text = "生命 %d/%d · 攻击 %d · 护甲 AC %d · GP %d" % [
|
|
int(data.get("hero_hp", 0)), int(data.get("max_hp", 0)), int(data.get("atk", 0)),
|
|
int(data.get("ac", 0)), int(data.get("gp", 0))]
|
|
var curios: Array[Variant] = data.get("curios", [])
|
|
if curios.is_empty():
|
|
_curios_label.text = "未携带秘宝"
|
|
else:
|
|
var parts: Array[String] = []
|
|
for row in curios:
|
|
var r: Dictionary[Variant, Variant] = row
|
|
parts.append(String(r.get("name", "")) + ("(已用)" if bool(r.get("used", false)) else ""))
|
|
_curios_label.text = " · ".join(parts)
|
|
var feats: Array[Variant] = data.get("feats", [])
|
|
_feats_label.text = "未获专长" if feats.is_empty() else " · ".join(feats)
|
|
visible = true
|
|
|
|
|
|
func _emit_closed() -> void:
|
|
closed.emit()
|