class_name MainMenu_TopLevel extends Control @onready var buttons := $'PanelContainer/HBoxContainer/Buttons' @onready var story_button := ( buttons.get_node(^'StoryButton') ) as TextureButton @onready var options_button := ( buttons.get_node(^'OptionsButton') ) as TextureButton @onready var mission_button := ( buttons.get_node(^'MissionButton') ) as TextureButton @onready var freerun_button := ( buttons.get_node(^'FreerunButton') ) as TextureButton @onready var about_button := ( buttons.get_node(^'AboutButton') ) as TextureButton @onready var quit_button := ( buttons.get_node(^'QuitButton') ) as TextureButton @onready var hour_hand := ( buttons.get_node(^'HourHand') ) as Control @onready var minute_hand := ( buttons.get_node(^'MinuteHand') ) as Control @onready var info_mode_name := ( $PanelContainer/HBoxContainer/Info/MarginContainer/VBoxContainer/ModeName ) as Label @onready var info_screenshot := ( $PanelContainer/HBoxContainer/Info/MarginContainer/VBoxContainer/Screenshot ) as TextureRect @onready var info_mode_description := ( $PanelContainer/HBoxContainer/Info/MarginContainer/VBoxContainer\ /Description ) as Label func _ready() -> void: var args := UI.Args(self) args.on_cancel = _on_cancel story_button.pressed.connect(_on_story_button) options_button.pressed.connect(_on_options_button) mission_button.pressed.connect(_on_mission_button) freerun_button.pressed.connect(_on_freerun_button) about_button.pressed.connect(_on_about_button) quit_button.pressed.connect(_on_quit_button) buttons.focus_entered.connect(_show_info_generic) story_button.mouse_entered.connect(_show_info_story) story_button.focus_entered.connect(_show_info_story) options_button.mouse_entered.connect(_show_info_options) options_button.focus_entered.connect(_show_info_options) mission_button.mouse_entered.connect(_show_info_mission) mission_button.focus_entered.connect(_show_info_mission) freerun_button.mouse_entered.connect(_show_info_freerun) freerun_button.focus_entered.connect(_show_info_freerun) about_button.mouse_entered.connect(_show_info_about) about_button.focus_entered.connect(_show_info_about) quit_button.mouse_entered.connect(_show_info_quit) quit_button.focus_entered.connect(_show_info_quit) _show_info_generic() _initialize_clock_hands.call_deferred() func _initialize_clock_hands() -> void: minute_hand.pivot_offset.x = minute_hand.size.x*0.375 hour_hand.pivot_offset.x = hour_hand.size.x*0.375 minute_hand.pivot_offset.y = minute_hand.size.y*0.5 hour_hand.pivot_offset.y = hour_hand.size.y*0.5 func _process(delta: float) -> void: var focused := get_viewport().gui_get_focus_owner() match focused: story_button: minute_hand.rotation = lerp(minute_hand.rotation, TAU*0.4, delta) hour_hand.rotation = lerp(hour_hand.rotation, TAU*0.6, delta) options_button: minute_hand.rotation = lerp(minute_hand.rotation, TAU*0.9, delta) hour_hand.rotation = lerp(hour_hand.rotation, TAU*0.7, delta) mission_button: minute_hand.rotation = lerp(minute_hand.rotation, TAU*0.1, delta) hour_hand.rotation = lerp(hour_hand.rotation, TAU*0.9, delta) freerun_button: minute_hand.rotation = lerp(minute_hand.rotation, TAU*0.3, delta) hour_hand.rotation = lerp(hour_hand.rotation, TAU*0.1, delta) _: minute_hand.rotation = fposmod( minute_hand.rotation - delta*PI, TAU ) hour_hand.rotation = fposmod( hour_hand.rotation + delta*PI/60.0, TAU ) func _on_story_button() -> void: var params = await UI.Call(load( "res://ui/MainMenu/CharacterSelect/MainMenu_CharacterSelect.tscn" ), { &'mode': &'story' }) if params: print(params) UI.Return(self, params) func _on_options_button() -> void: UI.Call(load("res://ui/MainMenu/Options/MainMenu_Options.tscn")) func _on_mission_button() -> void: var params = await UI.Call(load( "res://ui/MainMenu/CharacterSelect/MainMenu_CharacterSelect.tscn" ), { &'mode': &'mission' }) if params: UI.Return(self, params) func _on_freerun_button() -> void: var params = await UI.Call(load( "res://ui/MainMenu/CharacterSelect/MainMenu_CharacterSelect.tscn" ), { &'mode': &'freerun' }) if params: UI.Return(self, params) func _on_about_button() -> void: UI.Call(load("res://ui/MainMenu/About/MainMenu_About.tscn")) func _on_quit_button() -> void: await FX.fade(Color.BLACK) get_tree().quit() func _on_cancel() -> void: buttons.grab_focus() func _show_info_generic() -> void: if Storyboard.save_data_exists(): info_mode_name.text = "Save data" info_screenshot.texture = null # TODO info_mode_description.text = (( "Play time: %s\n" + "Ico'z snagged: %d\n" ) % [ TimeIntervalFormatting.format_systime_interval( Storyboard.get_play_time() ), Storyboard.count_cleared_missions() ]) else: info_mode_name.text = "Welcome!" info_screenshot.texture = null # TODO info_mode_description.text = "" func _show_info_story() -> void: info_mode_name.text = "Story mode" info_screenshot.texture = null # TODO info_mode_description.text = ( "Play through the game's story in sequential order." ) func _show_info_options() -> void: info_mode_name.text = "Options" info_screenshot.texture = null # TODO info_mode_description.text = ( "Configure the game's behavior as an application." ) func _show_info_mission() -> void: info_mode_name.text = "Mission mode" info_screenshot.texture = null # TODO info_mode_description.text = ( "Return to missions you've cleared in story mode " + "and replay them for a better clear time." ) func _show_info_freerun() -> void: info_mode_name.text = "Freerun" info_screenshot.texture = null # TODO info_mode_description.text = ( "If you've cleared at least one mission in a level, " + "you can return to that level and play it " + "as a sandbox with no objective." ) func _show_info_about() -> void: info_mode_name.text = "About" info_screenshot.texture = null # TODO info_mode_description.text = ( "View license agreement and/or credits." ) func _show_info_quit() -> void: info_mode_name.text = "Quit" info_screenshot.texture = null # TODO info_mode_description.text = ( "Exit the game." )