class_name Room extends Node2D signal player_spawned(player: Player) @export var config: RoomConfig @onready var camera: RoomCamera = $RoomCamera @onready var director: StateMachine = $RoomDirector @onready var palette_shader: ColorRect = $CanvasLayer/PaletteShader @onready var canvas_modulate: CanvasModulate = $CanvasModulate # TODO: better alternative to preloading as i add functionality? # https://theduriel.github.io/Godot/Do-not-use---Preload var player_scene: PackedScene = preload("uid://cqm5besqgsb7x") var initial_spawn: Vector2i = Vector2i.ZERO var player: Player var wake_timer: Timer func _ready() -> void: assert(config != null, "room config is null") func spawn_player(waking: bool) -> Player: var p: Player = player_scene.instantiate() add_child(p) if waking: wake_timer = Timer.new() p.add_child(wake_timer) wake_timer.one_shot = true wake_timer.start(config.transition_in_duration) wake_timer.timeout.connect(_on_wake_timer) p.state_machine._transition_to_next_state(PlayerState.PAUSED) if initial_spawn != Vector2i.ZERO: p.global_position = initial_spawn else: assert( config.initial_spawn != Vector2i.ZERO, "invalid player initial spawn provided" ) p.global_position = config.initial_spawn player_spawned.emit(p) return p func _on_wake_timer() -> void: player.state_machine._transition_to_next_state(PlayerState.WAKING) wake_timer.queue_free()