extends Control ## #258: Main menu — New Game / Continue / Quit. ## New Game: generates per-game save directory (D-085), starts game. ## Continue: loads most recent save directory (#554 full loading screen deferred). const GAME_SCENE := "res://scenes/main.tscn" const BG_COLOR := Color(0.05, 0.05, 0.08, 1.0) const TITLE_COLOR := Color("#c8d0e0") const SUBTITLE_COLOR := Color("#8890a0") const BTN_NORMAL_COLOR := Color("#e8c547") const BTN_DISABLED_COLOR := Color("#4a5060") const FONT_SIZE_TITLE := 36 const FONT_SIZE_SUBTITLE := 14 const FONT_SIZE_BTN := 15 @onready var _new_game_btn: Button = $VBox/NewGameBtn @onready var _continue_btn: Button = $VBox/ContinueBtn @onready var _quit_btn: Button = $VBox/QuitBtn func _ready() -> void: _new_game_btn.pressed.connect(_on_new_game) _continue_btn.pressed.connect(_on_continue) _quit_btn.pressed.connect(_on_quit) _refresh_continue_state() func _refresh_continue_state() -> void: var saves := SessionManager.list_game_dirs() _continue_btn.disabled = saves.is_empty() func _on_new_game() -> void: var game_id := SessionManager.new_game() if game_id.is_empty(): push_error("MainMenu: new_game() failed to create save directory — cannot start") return get_tree().change_scene_to_file(GAME_SCENE) func _on_continue() -> void: # #554: Full loading screen blocked until server SaveCommand lands. # For now: automatically load the most recent game directory. var saves := SessionManager.list_game_dirs() if saves.is_empty(): return SessionManager.resume_game(saves[0].game_id) get_tree().change_scene_to_file(GAME_SCENE) func _on_quit() -> void: get_tree().quit()