Files

122 lines
6.3 KiB
GDScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
## VERTICAL SLICE - NOT FOR PRODUCTION
## 生涯页·只读功能窗口:跨局终身计数汇总(不统计天赋树与账号成长态)。
## 入口=营地场景图帐篷旁笔记本;窗内零跳转零动效(直开直关)。
## 构成件全部经 UiKit 工厂产出——禁新素材/新色值/自建样式。
class_name CareerOverlay
extends Control
signal closed
var _total_label: Label # 冒险总局数(开局即计含放弃与失败)
var _cleared_label: Label # 冒险成功局数(三关全通才计 1)
var _clears_label: Label # 各关完成次数(一行三关——display_name ×次数)
var _boss_first_label: Label # Boss 首杀(已首杀关数/总关数)
var _boss_kills_label: Label # Boss 总击杀(含重复)
var _keystone_badge: UiKit.KeystoneBadge # 钥石余额(badge 工厂件——状态面板同形制)
func _init() -> void:
# 功能窗口壳(camp.md v2.5 生涯页与四子界面同壳同形态——居中定尺寸窗板+半透明压暗遮罩 0.6;
# 窗几何单点=CampSubViewBase.WINDOW_SIZE,禁第二处字面值)
var shell := UiKit.modal_shell(self, Color(UiKit.DIM, 0.6), Vector2.ZERO, 8, UiKit.panel_skinned(Vector4(14, 12, 14, 12)))
shell.panel.custom_minimum_size = CampSubViewBase.WINDOW_SIZE
_build_top_row(shell)
# 内容列滚动面(窗内滚动——窗尺寸不随内容增长;横向禁滚同四子界面形态)
var scroll := ScrollContainer.new()
scroll.size_flags_vertical = Control.SIZE_EXPAND_FILL
scroll.size_flags_horizontal = Control.SIZE_EXPAND_FILL
scroll.horizontal_scroll_mode = ScrollContainer.SCROLL_MODE_DISABLED
shell.box.add_child(scroll)
# 内容板(BG_BRIGHT——原页底色随壳迁移,内容板文字 token 零改——契约 9 口径)
var body := PanelContainer.new()
body.add_theme_stylebox_override("panel",
UiKit.panel_flat(UiKit.BG_BRIGHT, UiKit.PANEL_BORDER, UiKit.RADIUS_OBJECT, 1, Vector4(12, 12, 12, 12)))
body.size_flags_horizontal = Control.SIZE_EXPAND_FILL
scroll.add_child(body)
var box := VBoxContainer.new()
box.add_theme_constant_override("separation", 8)
body.add_child(box)
var hint := UiKit.label("跨局生涯汇总(只读——购买与装配在营地;历史冒险回看随后续批次)",
UiKit.FS_HINT, false, UiKit.WARM_SOFT)
hint.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART # 窗内换行——单行 min 宽会把定尺寸窗板撑宽(720 契约)
hint.size_flags_horizontal = Control.SIZE_EXPAND_FILL
box.add_child(hint)
# 组一·冒险战绩(终身计数域——存档 v6:总局数开局即计、冒险成功局数三关全通才计)
# 对比度口径:内容板底=暖亮档深棕(BG_BRIGHT),文字全用亮墨族 token(WARM 9.0:1 / WARM_SOFT 8.0:1 /
# CANDLE 7.2:1 / INK_L_GOLD 9.1:1 实测对 BG_BRIGHT 全过 §7.2 ≥4.5:1——深墨族〔INK_LABEL〕
# 压深棕底仅 ~1.3:1 属违例,禁用;顶行标题墨压石板皮不在此列——INK_TITLE 深墨族先例)
_section_head(box, "冒险战绩")
_total_label = _row(box, "冒险总局数")
_cleared_label = _row(box, "冒险成功局数")
_clears_label = _row(box, "各关完成次数")
_boss_first_label = _row(box, "Boss 首杀")
_boss_kills_label = _row(box, "Boss 总击杀")
# 组二·资源(钥石余额——终身计数域同段只读投影;账号成长态概览三投影已退役)
_section_head(box, "资源")
var bal_row := HBoxContainer.new()
bal_row.add_theme_constant_override("separation", 8)
box.add_child(bal_row)
var bal_name := UiKit.label("钥石余额",UiKit.FS_BODY, false, UiKit.WARM)
bal_row.add_child(bal_name)
_keystone_badge = UiKit.keystone_badge("钥石 0")
bal_row.add_child(_keystone_badge)
visible = false # 显式初始化——不靠树序巧合(缺陷⑤家族纪律)
# 顶行(「生 涯」标题+「返回」钮——文案与连接零改;标题墨随亮底石板皮惯例订正 INK_TITLE——设置/状态面板先例)
func _build_top_row(shell: Dictionary[Variant, Variant]) -> void:
var top := HBoxContainer.new()
top.add_theme_constant_override("separation", 10)
(shell.box as VBoxContainer).add_child(top)
top.add_child(UiKit.label("生 涯",UiKit.FS_TITLE, true, UiKit.INK_TITLE))
var top_sp := Control.new()
top_sp.size_flags_horizontal = Control.SIZE_EXPAND_FILL
top.add_child(top_sp)
var close_btn := UiKit.button("返回", 90.0) # 紧凑返回钮(设置/状态面板先例形制)
close_btn.tooltip_text = "关闭生涯页,返回主菜单(本页只读,不发生任何购买或修改)"
close_btn.pressed.connect(_emit_closed)
top.add_child(close_btn)
# ---- 开层(组合根唯一调用口——快照随开随建,只读同源口径同状态面板 R4)----
func open_career(data: Dictionary) -> void:
_total_label.text = "%d 局" % int(data.get("total", 0))
_cleared_label.text = "%d 局(三关全通)" % int(data.get("cleared", 0))
var parts: Array[String] = []
for row in (data.get("clears", []) as Array):
parts.append("%s ×%d" % [String(row.get("display_name", "")), int(row.get("count", 0))])
_clears_label.text = " · ".join(parts) if not parts.is_empty() else "—"
_boss_first_label.text = "%d/%d 关" % [int(data.get("boss_first_kills", 0)), int(data.get("boss_first_total", 0))]
_boss_kills_label.text = "%d 次" % int(data.get("boss_kills", 0))
_keystone_badge.set_text("钥石 %d" % int(data.get("keystone", 0)))
visible = true
func _emit_closed() -> void:
closed.emit()
# ---- 行构件(名称列 + 数值列——状态面板行族同构;数值 Label 返回供探针/冒烟投影断言)----
func _section_head(box: VBoxContainer, text: String) -> void:
box.add_child(UiKit.label(text,UiKit.FS_BODY, true, UiKit.INK_L_GOLD))
func _row(box: VBoxContainer, name_text: String) -> Label:
var line := HBoxContainer.new()
line.add_theme_constant_override("separation", 8)
box.add_child(line)
var name_l := UiKit.label(name_text,UiKit.FS_BODY, false, UiKit.WARM)
name_l.custom_minimum_size = Vector2(150, 0)
line.add_child(name_l)
var val_l := UiKit.label("—",UiKit.FS_BODY, true, UiKit.CANDLE)
val_l.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART # 长值窗内换行——定尺寸窗禁单行 min 宽撑宽(同 hint 口径)
val_l.size_flags_horizontal = Control.SIZE_EXPAND_FILL
line.add_child(val_l)
return val_l