frame-of-mind/src/ui/menu_main/main_menu.gd

103 lines
3.1 KiB
GDScript

class_name MainMenu extends Panel
@onready var new_game_button: Button = $PanelContainer/NewGameButton
@onready var continue_button: Button = $PanelContainer/ContinueGameButton
@onready var load_game_button: Button = $PanelContainer/LoadGameButton
@onready var settings_button: Button = $PanelContainer/SettingsButton
@onready var settings_popup: SettingsPopup = %SettingsPopup
@onready var credits_button: Button = $PanelContainer/CreditsButton
@onready var quit_button: Button = $PanelContainer/QuitButton
@onready var save_game_handle: SaveGameList = %SaveGameList
# Internal Signals
signal _next_room(result: String)
func execute() -> String:
print_debug("main_menu.gd: execute()")
assert(is_node_ready(), "MainMenu node not ready yet! (???)")
if State.save_game == null or State.save_game.current_room == 0:
continue_button.visible = false
continue_button.disabled = true
new_game_button.theme_type_variation = "H1Button"
else:
continue_button.visible = true
continue_button.disabled = false
new_game_button.theme_type_variation = ""
load_game_button.disabled = not save_game_handle.has_existing_saves()
save_game_handle.visible = save_game_handle.has_existing_saves()
_activate()
var result = await _next_room
_deactivate()
return str(result)
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
print_debug("main_menu.gd: ready()")
_deactivate()
continue_button.pressed.connect(_start_game)
new_game_button.pressed.connect(_new_game)
load_game_button.pressed.connect(_load_save_game)
load_game_button.disabled = not save_game_handle.has_existing_saves()
settings_button.pressed.connect(settings_popup.show_settings)
credits_button.pressed.connect(_choose.bind("credits")) #FIXME: Needs some other encoding, like path
quit_button.pressed.connect(get_tree().quit)
func _new_game() -> void:
print_debug("main_menu.gd: start_new_game()")
State.save_game = SaveGame.new()
_start_game()
func _start_game() -> void:
print_debug("main_menu.gd: _start_game()")
_next_room.emit(State.save_game.current_room_path)
func _load_save_game() -> void:
print_debug("main_menu.gd: _load_save_game()")
var save: SaveGame = await save_game_handle.pick_save_slot()
_on_save_picked(save)
func _choose(choice: String) -> void:
print_debug("main_menu.gd: _choose(", choice, ")")
_next_room.emit(choice)
func _activate() -> void:
save_game_handle.visible = false
for child: Control in $PanelContainer.get_children():
child.focus_mode = Control.FOCUS_ALL
child.modulate = Color.WHITE
child.mouse_filter = Control.MOUSE_FILTER_STOP
if continue_button.visible:
continue_button.grab_focus()
else:
new_game_button.grab_focus()
func _deactivate() -> void:
save_game_handle.visible = false
for child: Control in $PanelContainer.get_children():
child.focus_mode = FOCUS_NONE
child.modulate = Color.WEB_GRAY
child.mouse_filter = Control.MOUSE_FILTER_IGNORE
func _on_save_picked(save: SaveGame):
print_debug("main_menu.gd: _on_save_picked(", save, ")")
if (save != null):
State.save_game = save
_next_room.emit("start_game")