feat(meta): 主菜单解锁面板(花碎片解锁法术)

This commit is contained in:
2026-07-21 11:50:59 +08:00
parent a144d71557
commit 8d9aa617df
+82
View File
@@ -5,6 +5,8 @@ var _settings_layer: CanvasLayer = null
var _settings_root: Control = null var _settings_root: Control = null
var _leaderboard_layer: CanvasLayer = null var _leaderboard_layer: CanvasLayer = null
var _ftue_layer: CanvasLayer = null var _ftue_layer: CanvasLayer = null
var _unlock_layer: CanvasLayer = null
var _unlock_root: Control = null
var _continue_btn: Button = null var _continue_btn: Button = null
var _quit_confirm: bool = false var _quit_confirm: bool = false
@@ -15,6 +17,7 @@ func _ready() -> void:
_build_settings_panel() _build_settings_panel()
_build_leaderboard_panel() _build_leaderboard_panel()
_build_ftue_panel() _build_ftue_panel()
_build_unlock_panel()
func _build_bg() -> void: func _build_bg() -> void:
# 深色渐变背景 # 深色渐变背景
@@ -49,6 +52,7 @@ func _build_menu() -> void:
["MENU_NEW_GAME", _on_new_game], ["MENU_NEW_GAME", _on_new_game],
["MENU_CONTINUE", _on_continue], ["MENU_CONTINUE", _on_continue],
["MENU_LEADERBOARD", _on_leaderboard], ["MENU_LEADERBOARD", _on_leaderboard],
["MENU_UNLOCK", _on_unlock],
["MENU_SETTINGS", _on_settings], ["MENU_SETTINGS", _on_settings],
["MENU_QUIT", _on_quit], ["MENU_QUIT", _on_quit],
] ]
@@ -121,11 +125,13 @@ func _on_lang() -> void:
c.queue_free() c.queue_free()
_settings_layer = null _settings_layer = null
_leaderboard_layer = null _leaderboard_layer = null
_unlock_layer = null
_settings_root = null _settings_root = null
_build_bg() _build_bg()
_build_menu() _build_menu()
_build_settings_panel() _build_settings_panel()
_build_leaderboard_panel() _build_leaderboard_panel()
_build_unlock_panel()
func _on_quit() -> void: func _on_quit() -> void:
if not _quit_confirm: if not _quit_confirm:
@@ -154,6 +160,8 @@ func _input(event: InputEvent) -> void:
_settings_layer.visible = false _settings_layer.visible = false
elif _leaderboard_layer and _leaderboard_layer.visible: elif _leaderboard_layer and _leaderboard_layer.visible:
_leaderboard_layer.visible = false _leaderboard_layer.visible = false
elif _unlock_layer and _unlock_layer.visible:
_unlock_layer.visible = false
# ── 设置面板 ───────────────────────────────────────────────── # ── 设置面板 ─────────────────────────────────────────────────
func _build_settings_panel() -> void: func _build_settings_panel() -> void:
@@ -351,3 +359,77 @@ func _on_ftue_pick(difficulty_idx: int) -> void:
AudioManager.play("buy") AudioManager.play("buy")
_ftue_layer.visible = false _ftue_layer.visible = false
SceneManager.start_new_game() 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)