generated from krampus/template-godot4
78 lines
1.6 KiB
GDScript
78 lines
1.6 KiB
GDScript
extends Node3D
|
|
|
|
signal cleaned
|
|
signal activated
|
|
|
|
const CLEAN_THRESHOLD := 1400
|
|
|
|
@export var clean := false
|
|
@export var enabled := false
|
|
|
|
@onready var animation_player: AnimationPlayer = %AnimationPlayer
|
|
@onready var light_animation: AnimationPlayer = %LightAnimation
|
|
@onready var gunk_body: GunkBody = %GunkBody
|
|
@onready var interactive: Interactive = %Interactive
|
|
|
|
# XXX I must have been smoking crack when I wrote this logic. Why so complicated?
|
|
|
|
|
|
func _ready() -> void:
|
|
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")
|
|
activated.emit()
|
|
# 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()
|