extends Node3D ## A Room is a location that can be played through, and it emits a proceed signal that holds ## the scene path to the next room (or null for credits roll) class_name Room ## Tells the main loop to proceed to the next scene signal proceed(next_scene_path: String) @export var id: State.rooms = State.rooms.NULL @onready var scene_player : AnimationPlayer = %SceneAnimationPlayer var save_game : SaveGame: get: return State.save_game func _ready() -> void: prints("room.gd", "_ready()", self) assert(id != State.rooms.NULL, "Room " + str(self) + name + " has no proper ID set, it's still State.Rooms.NULL") State.room = self if not State.save_game: var debug_save_path := "res://dev-util/debug_save.tres" push_warning("Room initialised without a SaveGame. Loading DEBUG save.", debug_save_path) State.save_game = ResourceLoader.load(debug_save_path) if not Main.normal_boot: _debug_mode() func get_ready(): prints("----------", "GET_READY", self.name, "--------------") for i in range(20): await get_tree().process_frame func play() -> String: for i in range(20): await get_tree().process_frame await get_ready() await start_room() var next_room : StringName = await proceed prints("----------", "PROCEEDING", next_room, "--------------") return next_room func start_room(): prints("----------", "START_ROOM", self.name, "--------------") await get_tree().process_frame # so this registers as a coroutine in IDE func pull_save_state(_save: SaveGame) -> void: # Override this function to load the state of the chapter from State.save_game restore_player_from_save(_save) ## Attempts to find player controller and restore position/rotation from save func restore_player_from_save(save: SaveGame) -> void: var player: PlayerController = null # Try to find player controller in common locations if has_node("%PlayerController"): player = get_node("%PlayerController") elif has_node("logic/PlayerController"): player = get_node("logic/PlayerController") if player and player is PlayerController: player.restore_from_save(save) else: print("RoomTemplate: Could not find PlayerController to restore position") func save_room(): save_game.save_to_file(get_tree().root.get_texture()) func unload(): # Override this function to clean up things not owned by this room pass ## Called before a scene starts to allow room-specific preparation (e.g., animations) ## Override in subclasses to add custom scene preparation logic func prepare_scene_start(_scene_id: Scenes.id, _is_repeating: bool) -> void: prints("PREPARE SCENE", _scene_id, _is_repeating) await get_tree().process_frame # Dummy wait for LSP warning otherwise ## Override this (and call super._debug_mode()) if you want to initialize some data ## for running this Room standalone ("play current scene") func _debug_mode() -> void: push_warning("room.gd: DEBUG MODE - ", self) await get_tree().create_timer(1).timeout play()