extends Node3D signal animation_finished @export var start_open := false @export var close_2_probability := 0.03 @export_category("Editor Tools") @export var debug_open: bool: set(value): open() @export var debug_close: bool: set(value): close() @onready var animation: AnimationPlayer = $AnimationPlayer @onready var dust_animation: AnimationPlayer = %DustAnimation @onready var open_sfx: AudioStreamPlayer3D = %OpenSFX @onready var bulkhead_game_sound_emitter: GameSoundEmitter = %BulkheadGameSoundEmitter @onready var nav_link: NavigationLink3D = %NavLink func _ready() -> void: _deferred_init.call_deferred() func _deferred_init() -> void: if start_open: _instant_open() func _instant_open() -> void: nav_link.enabled = true animation.play("open") animation.advance(100) func _instant_close() -> void: nav_link.enabled = false animation.play("close") animation.advance(100) animation.stop() func is_open() -> bool: return nav_link.enabled func open() -> void: nav_link.enabled = true animation.play("open") dust_animation.play("spray") open_sfx.play() bulkhead_game_sound_emitter.emit_sound_here() func close() -> void: var close_anim := "close" if randf() > close_2_probability else "close2" animation.play(close_anim) nav_link.enabled = false func toggle() -> void: if is_open(): close() else: open() func serialize() -> Dictionary: return {"open": is_open()} func deserialize(state: Dictionary) -> void: start_open = state["open"] func _on_animation_player_animation_finished(_anim_name: StringName) -> void: animation_finished.emit()