extends Node3D signal room_loaded var has_stage: bool = false: set(stage): has_stage = stage if in_game and has_stage: in_game = false _return_to_menu() @export_file(".tscn") var youth_room_path: String @export_file(".tscn") var transition_room_path: String @export_file(".tscn") var adulthood_room_path: String @export_file(".tscn") var ending_path: String @onready var main_menu:MainMenu = %"Main Menu" @onready var menu_animation: AnimationTree = %MenuAnimationTree @onready var focus_forward = %"Main Menu" var current_room_id: State.rooms var in_game = false var current_loaded_room: Node3D var currently_loading_room: String = "": set(path): if path != "": ResourceLoader.load_threaded_request(path, "PackedScene") menu_animation["parameters/conditions/loading_done"] = false menu_animation["parameters/conditions/load_save"] = true currently_loading_room = path else: menu_animation["parameters/conditions/loading_done"] = true menu_animation["parameters/conditions/load_save"] = false # Called when the node enters the scene tree for the first time. func _ready(): currently_loading_room = youth_room_path func _process(delta: float) -> void: if currently_loading_room != "": if ResourceLoader.load_threaded_get_status(currently_loading_room) == 3: current_loaded_room = ResourceLoader.load_threaded_get(youth_room_path).instantiate() add_child(current_loaded_room) move_child(current_loaded_room, 0) currently_loading_room = "" room_loaded.emit() if Input.is_action_just_pressed("reset_demo") and (OS.has_feature("demo") or true): State.stage_list = [self] _return_to_menu() $"Messe-Menue".show() func debug_youth(): get_child(1).hide() get_child(2).hide() get_child(3).hide() get_child(0).get_ready() get_child(0).start() func _return_to_menu(): State.active_save_game = null menu_animation["parameters/conditions/start_game"] = false State.pass_stage_to(main_menu) currently_loading_room = get_room_path_from_id(main_menu.save_game_handle.get_most_recent_save().current_room) menu_animation["parameters/conditions/return_to_menu"] = true await(get_tree().create_timer(0.5).timeout) menu_animation["parameters/conditions/return_to_menu"] = false _on_ready_to_unload() func load_save(save: SaveGame): #if currently_loading_room != "": # await(room_loaded) if save.current_room != current_room_id: # TODO Prevent race condition from appearing when save is loaded while room is still loading. currently_loading_room = get_room_path_from_id(save.current_room) await(room_loaded) menu_animation["parameters/conditions/start_game"] = true State.active_save_game = save State.pass_stage_to(get_child(0)) func _on_ready_to_unload(): if get_child(0) is Node3D: get_child(0).free() func get_room_path_from_id(id: State.rooms) -> String: match id: State.rooms.YOUTH, State.rooms.MENU, State.rooms.DRAVEN: return youth_room_path State.rooms.TRANSITION: return transition_room_path State.rooms.ADULTHOOD: return adulthood_room_path _: return ending_path func start_demo(): load_save(SaveGame.new()) $"Messe-Menue".hide() var last_mode := DisplayServer.WINDOW_MODE_WINDOWED func _unhandled_input(event: InputEvent) -> void: if event.is_action_pressed("toggle_fullscreen"): if DisplayServer.window_get_mode() == DisplayServer.WINDOW_MODE_FULLSCREEN: DisplayServer.window_set_mode(last_mode) else: last_mode = DisplayServer.window_get_mode() DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_FULLSCREEN)