class_name InteractiveSprite extends Area3D @export var interaction_ui: PackedScene = null @export var is_board: bool = false @onready var pass_to_actor: = $UiWrapper/UiSprite/SubViewport/CollectableUi @onready var wrapper := $UiWrapper @onready var ui: CollectableUi = $UiWrapper/UiSprite/SubViewport.get_child(0) @onready var viewport:= $UiWrapper/UiSprite/SubViewport @onready var distance_tween: Tween var revealed: bool = false: set(reveal): revealed = reveal if reveal: wrapper.show() if distance_tween != null: if distance_tween.is_running(): distance_tween.stop() distance_tween = get_tree().create_tween() distance_tween.tween_property($UiWrapper/Frame, ^":visibility_range_end", 3.0, 1.0) else: wrapper.hide() ui.vanish() if distance_tween != null: if distance_tween.is_running(): distance_tween.stop() distance_tween = get_tree().create_tween() distance_tween.tween_property($UiWrapper/Frame, ^":visibility_range_end", 0.6, 1.0) await get_tree().create_timer(1).timeout if not ui.visible: wrapper.hide() var has_mouse: bool = false # Automatically triggered story playback - e.g. for Intro in Youth Room func play_story() -> void: await ui.collect_memento() # Called when the node enters the scene tree for the first time. func _ready(): if interaction_ui: %CanvasLayer.add_child(interaction_ui.instantiate()) ui.canvas_layer = %CanvasLayer # Find and wire the StoryPlayable if not already set for child in %CanvasLayer.get_children(): if child is StoryPlayable: ui.story_playable = child break if child is CardBoard: ui.is_board = true # Connect playback_finished to restore player control ui.playback_finished.connect(_on_playback_finished) func _on_mouse_entered(): if not Scenes.is_playing: input_ray_pickable = false has_mouse = true func _on_mouse_exited(): input_ray_pickable = true has_mouse = false func try_reveal(for_player: PlayerController) -> bool: print_debug("reveal ui!") revealed = ui.try_reveal() if revealed: call_deferred("wait_for_ui_exit", for_player) return revealed func wait_for_ui_exit(for_player: PlayerController): await for_player.ui_exited collapse() func collapse(): _on_mouse_exited() revealed = false func _on_playback_finished(): # Restore player control via central signal Scenes.player_enable.emit(true) func handle(event: InputEvent): viewport.push_input(event)