extends Node3D signal cleaned signal activated const CLEAN_THRESHOLD := 1400 @export var clean := false @export var enabled := false @export var label: String @onready var animation_player: AnimationPlayer = %AnimationPlayer @onready var light_animation: AnimationPlayer = %LightAnimation @onready var gunk_body: GunkBody = %GunkBody @onready var interactive: Interactive = %Interactive @onready var action_sfx: AudioStreamPlayer3D = %ActionSFX @onready var action_delay: Timer = %ActionDelay # XXX I must have been smoking crack when I wrote this logic. Why so complicated? func _ready() -> void: interactive.label = label if clean: gunk_body.clear_all() _on_clean() if enabled: _on_enable() ## Called once all gunk is cleared. Enables interaction & plays animations func enable() -> void: enabled = true _on_enable() func _on_enable() -> void: if clean: light_animation.play("success") if not animation_player.is_playing(): interactive.enabled = true ## Called once the switch is no longer usable. Disables interaction & plays animations func disable() -> void: _on_disable() enabled = false func _on_disable() -> void: if enabled and clean: light_animation.play("disable") else: light_animation.play("RESET") interactive.enabled = false func _on_clean() -> void: clean = true if enabled: _on_enable() else: _on_disable() cleaned.emit() func _activate() -> void: animation_player.play("activate") action_sfx.play() action_delay.start() # Disable while animation is playing interactive.enabled = false func _animation_finished(anim_name: StringName) -> void: if anim_name == "activate": interactive.enabled = enabled func _on_gunk_body_clear_total_updated(clear_total: float) -> void: if not clean and clear_total >= CLEAN_THRESHOLD: _on_clean() func _on_action_delay_timeout() -> void: activated.emit() func serialize() -> Dictionary: return {"enabled": enabled} func deserialize(state: Dictionary) -> void: if state["enabled"]: enable() else: disable()