extends CanvasLayer @export var pause_sound : AudioStream @export var resume_sound : AudioStream @export var click_sound : AudioStream @onready var resume_button: Button = $PanelContainer/VBoxContainer/Resume @onready var team_button: Button = $PanelContainer/VBoxContainer/Team @onready var storage_button: Button = $PanelContainer/VBoxContainer/Storage @onready var save_button: Button = $PanelContainer/VBoxContainer/Save @onready var load_button: Button = $PanelContainer/VBoxContainer/Load @onready var menu_panel: PanelContainer = $PanelContainer @onready var animation_player: AnimationPlayer = $AnimationPlayer var is_transitioning : bool = false var sub_screen : Control = null #page ouverte depuis le menu (equipe, PC...) var sub_screen_origin : Button = null #bouton qui a ouvert la page, pour lui rendre le focus var save_feedback_active : bool = false func _ready() -> void: process_mode = Node.PROCESS_MODE_ALWAYS visible = false animation_player.play("RESET") func _unhandled_input(event: InputEvent) -> void: if is_transitioning or sub_screen != null: return #une page ouverte gere ses propres entrees if event.is_action_pressed("pause"): if get_tree().paused: resume() else: pause() func pause() -> void: if is_transitioning: return is_transitioning = true visible = true get_tree().paused = true UiAudio.play(pause_sound) animation_player.play("blur") await animation_player.animation_finished resume_button.grab_focus() is_transitioning = false func resume() -> void: if is_transitioning: return is_transitioning = true UiAudio.play(resume_sound) animation_player.play_backwards("blur") await animation_player.animation_finished visible = false get_tree().paused = false is_transitioning = false func _on_resume_pressed() -> void: resume() #---------- pages (equipe, PC) ---------- func _open_sub_screen(screen : Control, origin : Button) -> void: sub_screen = screen sub_screen_origin = origin add_child(screen) #ajoute en dernier : s'affiche au-dessus du menu screen.connect("closed", _on_sub_screen_closed) menu_panel.hide() #le flou de fond reste visible derriere la page func _on_sub_screen_closed() -> void: if sub_screen: sub_screen.queue_free() sub_screen = null menu_panel.show() if sub_screen_origin: sub_screen_origin.grab_focus() func _on_team_pressed() -> void: if is_transitioning or sub_screen != null: return UiAudio.play(click_sound) var screen := TeamScreen.new() _open_sub_screen(screen, team_button) screen.setup(GameData.player_team) func _on_storage_pressed() -> void: if is_transitioning or sub_screen != null: return UiAudio.play(click_sound) var screen := PCScreen.new() _open_sub_screen(screen, storage_button) screen.setup(GameData.player_team, GameData.player_storage) #---------- sauvegarde ---------- func _on_save_pressed() -> void: UiAudio.play(click_sound) GameData.save() #retour visuel temporaire sur le bouton (le focus reste dessus, pour la manette) if save_feedback_active: return save_feedback_active = true save_button.text = "Sauvegardé !" await get_tree().create_timer(1.5, true).timeout #true = continue meme en pause save_button.text = "Sauvegarder" save_feedback_active = false func _on_load_pressed() -> void: UiAudio.play(click_sound) GameData.load_data() #retour visuel temporaire sur le bouton (le focus reste dessus, pour la manette) if save_feedback_active: return save_feedback_active = true load_button.text = "Chargé !" await get_tree().create_timer(1.5, true).timeout #true = continue meme en pause load_button.text = "Charger" save_feedback_active = false func _on_restart_pressed() -> void: UiAudio.play(click_sound) get_tree().paused = false visible = false get_tree().reload_current_scene() func _on_quit_pressed() -> void: UiAudio.play(click_sound) get_tree().quit()