55 lines
1.4 KiB
GDScript
55 lines
1.4 KiB
GDScript
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()
|