diff --git a/scenes/ui/main_menu.gd b/scenes/ui/main_menu.gd index 36aacaa..7a33580 100644 --- a/scenes/ui/main_menu.gd +++ b/scenes/ui/main_menu.gd @@ -5,6 +5,8 @@ var _settings_layer: CanvasLayer = null var _settings_root: Control = null var _leaderboard_layer: CanvasLayer = null var _ftue_layer: CanvasLayer = null +var _unlock_layer: CanvasLayer = null +var _unlock_root: Control = null var _continue_btn: Button = null var _quit_confirm: bool = false @@ -15,6 +17,7 @@ func _ready() -> void: _build_settings_panel() _build_leaderboard_panel() _build_ftue_panel() + _build_unlock_panel() func _build_bg() -> void: # 深色渐变背景 @@ -49,6 +52,7 @@ func _build_menu() -> void: ["MENU_NEW_GAME", _on_new_game], ["MENU_CONTINUE", _on_continue], ["MENU_LEADERBOARD", _on_leaderboard], + ["MENU_UNLOCK", _on_unlock], ["MENU_SETTINGS", _on_settings], ["MENU_QUIT", _on_quit], ] @@ -121,11 +125,13 @@ func _on_lang() -> void: c.queue_free() _settings_layer = null _leaderboard_layer = null + _unlock_layer = null _settings_root = null _build_bg() _build_menu() _build_settings_panel() _build_leaderboard_panel() + _build_unlock_panel() func _on_quit() -> void: if not _quit_confirm: @@ -154,6 +160,8 @@ func _input(event: InputEvent) -> void: _settings_layer.visible = false elif _leaderboard_layer and _leaderboard_layer.visible: _leaderboard_layer.visible = false + elif _unlock_layer and _unlock_layer.visible: + _unlock_layer.visible = false # ── 设置面板 ───────────────────────────────────────────────── func _build_settings_panel() -> void: @@ -351,3 +359,77 @@ func _on_ftue_pick(difficulty_idx: int) -> void: AudioManager.play("buy") _ftue_layer.visible = false SceneManager.start_new_game() + +# ── 解锁面板 ───────────────────────────────────────────────── +func _on_unlock() -> void: + _unlock_layer.visible = true + _rebuild_unlock() + +func _build_unlock_panel() -> void: + _unlock_layer = CanvasLayer.new() + _unlock_layer.layer = 10 + _unlock_layer.visible = false + add_child(_unlock_layer) + var bg := ColorRect.new() + bg.color = Color(0.0, 0.0, 0.0, 0.72) + bg.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT) + _unlock_layer.add_child(bg) + _unlock_root = Control.new() + _unlock_layer.add_child(_unlock_root) + +func _rebuild_unlock() -> void: + for c in _unlock_root.get_children(): + c.queue_free() + var panel := ColorRect.new() + panel.color = Color(0.06, 0.06, 0.14, 0.98) + panel.size = Vector2(560, 470) + panel.position = Vector2(300, 90) + _unlock_root.add_child(panel) + var title := Label.new() + title.text = tr("META_TITLE") + title.position = Vector2(324, 106) + title.add_theme_font_size_override("font_size", 28) + title.modulate = Color.GOLD + _unlock_root.add_child(title) + var aether_lbl := Label.new() + aether_lbl.text = tr("META_AETHER") % MetaProgress.aether + aether_lbl.position = Vector2(324, 148) + aether_lbl.add_theme_font_size_override("font_size", 18) + aether_lbl.modulate = Color(0.6, 0.85, 1.0) + _unlock_root.add_child(aether_lbl) + var y: float = 188.0 + for id in SpellRegistry.get_all_ids(): + var s: SpellNode = SpellRegistry.get_spell(id) + if s == null: + continue + var cost: int = int(s.meta.get("unlock_cost", 0)) + if cost <= 0: + continue + var name_lbl := Label.new() + name_lbl.text = s.display_name + name_lbl.position = Vector2(324, y + 4) + name_lbl.add_theme_font_size_override("font_size", 16) + _unlock_root.add_child(name_lbl) + var btn := Button.new() + btn.position = Vector2(560, y) + btn.size = Vector2(230, 32) + if MetaProgress.is_unlocked(id): + btn.text = tr("META_UNLOCKED") + btn.disabled = true + else: + btn.text = tr("META_UNLOCK_BTN") % cost + btn.disabled = MetaProgress.aether < cost + var sid := id + var scost := cost + btn.connect("pressed", func(): + if MetaProgress.unlock(sid, scost): + AudioManager.play("buy") + _rebuild_unlock()) + _unlock_root.add_child(btn) + y += 40.0 + var close := Button.new() + close.text = tr("META_CLOSE") + close.position = Vector2(700, 508) + close.size = Vector2(120, 36) + close.connect("pressed", func(): _unlock_layer.visible = false) + _unlock_root.add_child(close)