## 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