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: 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 # 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 ui.is_collapsed = false has_mouse = true func _on_mouse_exited(): input_ray_pickable = true ui.is_collapsed = 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 controller control using the room's unique node reference var player_controller = owner.get_node_or_null("%PlayerController") if player_controller and "has_stage" in player_controller: player_controller.has_stage = true else: # Fallback: ensure mouse is visible if we can't find player controller Input.mouse_mode = Input.MOUSE_MODE_VISIBLE func handle(event: InputEvent): viewport.push_input(event)