extends VBoxContainer const Style := preload("res://scripts/ui/ui_style.gd") var main: Control var stats_label: Label func _ready() -> void: set_anchors_preset(Control.PRESET_FULL_RECT) add_theme_constant_override("separation", 18) var headline := Label.new() headline.text = "Answer board-style questions. Earn XP. Unlock the map." headline.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART Style.set_label(headline, 38, Style.TEXT) add_child(headline) var subhead := Label.new() subhead.text = "A desktop study game for STEP 3-style single-best-answer blocks with tutor and timed modes." subhead.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART Style.set_label(subhead, 18, Style.MUTED) add_child(subhead) var hero := PanelContainer.new() hero.add_theme_stylebox_override("panel", Style.panel_box(Color("172337"), Color("2bdbff"))) hero.size_flags_vertical = Control.SIZE_EXPAND_FILL add_child(hero) var hero_content := VBoxContainer.new() hero_content.add_theme_constant_override("separation", 16) hero.add_child(hero_content) var loop := Label.new() loop.text = "XP Rush | Streak Heat | System Zones | Timed Blocks" Style.set_label(loop, 24, Style.CYAN) hero_content.add_child(loop) var details := Label.new() details.text = "Pick a clinical zone, clear a block, review every miss, and turn weak systems into unlock progress." details.autowrap_mode = TextServer.AUTOWRAP_WORD_SMART Style.set_label(details, 18, Style.TEXT) hero_content.add_child(details) var button_row := HBoxContainer.new() button_row.add_theme_constant_override("separation", 12) hero_content.add_child(button_row) var start := Button.new() start.text = "Start Block" start.custom_minimum_size = Vector2(180, 52) Style.style_primary_button(start) start.pressed.connect(func(): main.show_screen("setup", "All Systems")) button_row.add_child(start) var map := Button.new() map.text = "Open Study Map" map.custom_minimum_size = Vector2(180, 52) map.pressed.connect(func(): main.show_screen("map")) button_row.add_child(map) var profile := Button.new() profile.text = "View Profile" profile.custom_minimum_size = Vector2(180, 52) profile.pressed.connect(func(): main.show_screen("profile")) button_row.add_child(profile) stats_label = Label.new() stats_label.name = "Stats" Style.set_label(stats_label, 20, Style.LIME) hero_content.add_child(stats_label) func on_show(_payload: Variant = null) -> void: var profile := ProfileService.get_profile() stats_label.text = "Level %d | %d XP | Current streak: %d | Badges: %d" % [ profile["level"], profile["xp"], profile["current_streak"], profile["badges"].size() ]