2024-10-06 09:31:47 +00:00
|
|
|
class_name InteractiveSprite extends Area3D
|
2023-04-22 13:11:10 +00:00
|
|
|
|
2026-01-05 20:39:16 +00:00
|
|
|
@export var interaction_ui: PackedScene = null
|
2026-01-05 20:52:20 +00:00
|
|
|
@export var is_board: bool = false
|
2026-01-05 20:39:16 +00:00
|
|
|
|
2025-12-13 12:41:18 +00:00
|
|
|
@onready var pass_to_actor: = $UiWrapper/UiSprite/SubViewport/CollectableUi
|
|
|
|
|
@onready var wrapper := $UiWrapper
|
2025-03-23 13:32:24 +00:00
|
|
|
@onready var ui: CollectableUi = $UiWrapper/UiSprite/SubViewport.get_child(0)
|
|
|
|
|
@onready var viewport:= $UiWrapper/UiSprite/SubViewport
|
2023-07-13 14:14:40 +00:00
|
|
|
|
2025-10-07 22:35:55 +00:00
|
|
|
@onready var distance_tween: Tween
|
2025-09-05 00:01:28 +00:00
|
|
|
|
2023-07-13 14:14:40 +00:00
|
|
|
var revealed: bool = false:
|
2024-09-15 09:30:31 +00:00
|
|
|
set(reveal):
|
|
|
|
|
revealed = reveal
|
|
|
|
|
if reveal:
|
|
|
|
|
wrapper.show()
|
2025-10-07 22:35:55 +00:00
|
|
|
if distance_tween != null:
|
|
|
|
|
if distance_tween.is_running(): distance_tween.stop()
|
2025-09-05 00:01:28 +00:00
|
|
|
distance_tween = get_tree().create_tween()
|
2025-12-30 20:00:53 +00:00
|
|
|
distance_tween.tween_property($UiWrapper/Frame, ^":visibility_range_end", 3.0, 1.0)
|
2024-09-15 09:30:31 +00:00
|
|
|
else:
|
2026-01-11 22:26:15 +00:00
|
|
|
wrapper.hide()
|
2025-03-23 13:32:24 +00:00
|
|
|
ui.vanish()
|
2025-10-07 22:35:55 +00:00
|
|
|
if distance_tween != null:
|
|
|
|
|
if distance_tween.is_running(): distance_tween.stop()
|
2025-09-05 00:01:28 +00:00
|
|
|
distance_tween = get_tree().create_tween()
|
2025-12-30 20:00:53 +00:00
|
|
|
distance_tween.tween_property($UiWrapper/Frame, ^":visibility_range_end", 0.6, 1.0)
|
2024-09-15 09:30:31 +00:00
|
|
|
await get_tree().create_timer(1).timeout
|
2025-09-04 23:59:58 +00:00
|
|
|
if not ui.visible:
|
|
|
|
|
wrapper.hide()
|
2025-12-08 09:43:02 +00:00
|
|
|
|
2023-04-22 13:11:10 +00:00
|
|
|
var has_mouse: bool = false
|
2025-12-08 09:43:02 +00:00
|
|
|
|
2026-01-11 20:33:37 +00:00
|
|
|
# Automatically triggered story playback - e.g. for Intro in Youth Room
|
2026-01-10 11:33:27 +00:00
|
|
|
func play_story() -> void:
|
2026-01-11 20:33:37 +00:00
|
|
|
await ui.collect_memento()
|
2026-01-10 11:33:27 +00:00
|
|
|
|
2023-04-22 13:11:10 +00:00
|
|
|
# Called when the node enters the scene tree for the first time.
|
|
|
|
|
func _ready():
|
2026-01-05 20:39:16 +00:00
|
|
|
if interaction_ui:
|
|
|
|
|
%CanvasLayer.add_child(interaction_ui.instantiate())
|
|
|
|
|
|
|
|
|
|
ui.canvas_layer = %CanvasLayer
|
|
|
|
|
# Find and wire the StoryPlayable if not already set
|
2026-01-05 20:52:20 +00:00
|
|
|
for child in %CanvasLayer.get_children():
|
|
|
|
|
if child is StoryPlayable:
|
|
|
|
|
ui.story_playable = child
|
|
|
|
|
break
|
|
|
|
|
if child is CardBoard:
|
|
|
|
|
ui.is_board = true
|
|
|
|
|
|
2026-01-05 20:39:16 +00:00
|
|
|
# Connect playback_finished to restore player control
|
|
|
|
|
ui.playback_finished.connect(_on_playback_finished)
|
2023-04-22 13:11:10 +00:00
|
|
|
|
|
|
|
|
func _on_mouse_entered():
|
2026-01-05 15:28:45 +00:00
|
|
|
if not Scenes.is_playing:
|
2024-09-15 09:30:31 +00:00
|
|
|
input_ray_pickable = false
|
|
|
|
|
has_mouse = true
|
2025-12-08 09:43:02 +00:00
|
|
|
|
2023-04-22 13:11:10 +00:00
|
|
|
func _on_mouse_exited():
|
2024-09-15 09:30:31 +00:00
|
|
|
input_ray_pickable = true
|
|
|
|
|
has_mouse = false
|
2023-07-13 14:14:40 +00:00
|
|
|
|
2025-12-13 12:49:08 +00:00
|
|
|
func try_reveal(for_player: PlayerController) -> bool:
|
2025-12-13 10:06:15 +00:00
|
|
|
print_debug("reveal ui!")
|
2025-06-10 19:09:47 +00:00
|
|
|
revealed = ui.try_reveal()
|
|
|
|
|
if revealed:
|
|
|
|
|
call_deferred("wait_for_ui_exit", for_player)
|
|
|
|
|
return revealed
|
|
|
|
|
|
2025-12-13 12:49:08 +00:00
|
|
|
func wait_for_ui_exit(for_player: PlayerController):
|
2025-06-10 19:09:47 +00:00
|
|
|
await for_player.ui_exited
|
|
|
|
|
collapse()
|
2023-07-18 16:27:30 +00:00
|
|
|
|
|
|
|
|
func collapse():
|
2024-09-15 09:30:31 +00:00
|
|
|
_on_mouse_exited()
|
|
|
|
|
revealed = false
|
2025-03-23 13:32:24 +00:00
|
|
|
|
2026-01-05 17:18:48 +00:00
|
|
|
func _on_playback_finished():
|
2026-01-12 17:39:34 +00:00
|
|
|
# Restore player control via central signal
|
|
|
|
|
Scenes.player_enable.emit(true)
|
2026-01-05 17:18:48 +00:00
|
|
|
|
2025-03-23 13:32:24 +00:00
|
|
|
func handle(event: InputEvent):
|
|
|
|
|
viewport.push_input(event)
|