frame-of-mind/src/base-environments/youth_room/interactive_sprite.gd

89 lines
2.6 KiB
GDScript3
Raw Normal View History

2024-10-06 09:31:47 +00:00
class_name InteractiveSprite extends Area3D
@export var interaction_ui: PackedScene = null
2026-01-05 20:52:20 +00:00
@export var is_board: bool = false
@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
2026-01-05 20:52:20 +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()
distance_tween = get_tree().create_tween()
distance_tween.tween_property($UiWrapper/Frame, ^":visibility_range_end", 3.0, 1.0)
2024-09-15 09:30:31 +00:00
else:
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()
distance_tween = get_tree().create_tween()
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
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
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
# Connect playback_finished to restore player control
ui.playback_finished.connect(_on_playback_finished)
func _on_mouse_entered():
if not Scenes.is_playing:
2024-09-15 09:30:31 +00:00
input_ray_pickable = false
2025-03-23 13:32:24 +00:00
ui.is_collapsed = false
2024-09-15 09:30:31 +00:00
has_mouse = true
func _on_mouse_exited():
2024-09-15 09:30:31 +00:00
input_ray_pickable = true
2025-03-23 13:32:24 +00:00
ui.is_collapsed = true
2024-09-15 09:30:31 +00:00
has_mouse = false
2023-07-13 14:14:40 +00:00
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()
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():
# 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
2025-03-23 13:32:24 +00:00
func handle(event: InputEvent):
viewport.push_input(event)