grunk/src/props/bulkhead/bulkhead.gd

81 lines
1.6 KiB
GDScript

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()