diff --git a/src/logic-scenes/interactable/interactable.gd b/src/logic-scenes/interactable/interactable.gd index 655b629..ad80cc2 100644 --- a/src/logic-scenes/interactable/interactable.gd +++ b/src/logic-scenes/interactable/interactable.gd @@ -7,9 +7,11 @@ var interaction_ui : Control = null @onready var frame: Sprite3D = $Frame @onready var canvas_layer: CanvasLayer = $CanvasLayer +@onready var note: Node3D = $View/Sprite3D @onready var caption : Label3D = %Caption @onready var prompt : Label3D = %Prompt + @export var billboard : bool = true var active : bool = true @@ -24,6 +26,7 @@ var collected : bool = false: var tween: Tween = null func _ready() -> void: + assert(note and frame and canvas_layer, "Interactable must have views and frame attached") view.scale = Vector3.ZERO frame.modulate.a = 0 if interaction: @@ -44,21 +47,29 @@ func _player_active(value: bool) -> void: func expand() -> void: shown = true - view.scale = Vector3.ZERO - frame.modulate = Color.TRANSPARENT - view.rotation.z = -PI*0.5 # Godot angle wrapping is ... something - if tween: tween.kill() + + if tween and tween.is_valid(): + tween.kill() + else: + view.scale = Vector3.ZERO + note.rotation.z = -PI*0.5 # Godot angle wrapping is ... something + frame.modulate = Color.TRANSPARENT + frame.scale = Vector3(1.5, 1.5, 1.5) + tween = create_tween().set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_BACK) tween.parallel().tween_property(view, "scale", Vector3.ONE, 1.0).set_delay(0.5) - tween.parallel().tween_property(view, "rotation:z", 0, 0.8).set_delay(0.5) - tween.parallel().tween_property(frame, "modulate:a", 1.0, 2.0) + tween.parallel().tween_property(note, "rotation:z", 0, 0.8).set_delay(0.5) + tween.parallel().tween_property(frame, "modulate:a", 1.0, 2.0).set_trans(Tween.TRANS_QUAD) + tween.parallel().tween_property(frame, "scale", Vector3.ONE, 1.0).set_trans(Tween.TRANS_QUART) + func collapse() -> void: shown = false - if tween: tween.kill() + if tween and tween.is_valid(): tween.kill() tween = create_tween().set_ease(Tween.EASE_IN).set_trans(Tween.TRANS_BACK) tween.parallel().tween_property(view, "scale", Vector3.ZERO, 0.3) - tween.parallel().tween_property(frame, "modulate:a", 0, 0.6) + tween.parallel().tween_property(frame, "modulate:a", 0, 0.5).set_trans(Tween.TRANS_QUAD) + tween.parallel().tween_property(frame, "scale", Vector3.ONE * 2.0, 1.0).set_trans(Tween.TRANS_QUAD) func _process(_delta: float) -> void: _process_billboard()