extends Node # Drop-in that automatically connects signals from player to chest objects signal ChestInteractedWith(chest: BaseChest) signal OpeningOfOpenedChestAttempted @export var auto_connect_all_chests := true var chests_in_range: Array[BaseChest] = [] # Public Methods func OnPlayerInteractScannerAreaEntered(area: Area2D) -> void: var chest = area.get_parent() if chest == null or chest is not BaseChest: return if chests_in_range.has(chest): return chests_in_range.append(chest) func OnPlayerInteractScannerAreaExited(area: Area2D) -> void: var chest = area.get_parent() if chest == null or chest is not BaseChest: return if !chests_in_range.has(chest): return chests_in_range.erase(chest) func OnPlayerInteractionActionTriggered() -> void: if chests_in_range.is_empty(): return var chest := chests_in_range[0] if !chest.is_open: chest.Open() else: chest.OpenAlreadyOpened() OpeningOfOpenedChestAttempted.emit() # Private Methods func _ready() -> void: var player := GroupUtils.GetPlayer() if player == null: return player.InteractScannerAreaEntered.connect(OnPlayerInteractScannerAreaEntered) player.InteractScannerAreaExited.connect(OnPlayerInteractScannerAreaExited) player.InteractionActionTriggered.connect(OnPlayerInteractionActionTriggered) var chests := GroupUtils.GetAllTreasureChests() for chest in chests: chest.OpeningAnimationStarted.connect(_on_chest_opening_animation_started) func _on_chest_opening_animation_started() -> void: var player := GroupUtils.GetPlayer() var children := player.get_children() player.OnCutsceneStarted() var camera_idx := children.find_custom(func(x): return x is Camera2D) if camera_idx == -1: return # Zoom In var camera := children[camera_idx] as Camera2D var current_zoom := camera.zoom await get_tree().create_tween().tween_property(camera, "zoom", current_zoom + Vector2(2, 2), 0.5).finished # Player the player's chest opening animation player.state_machine.QueueStateChange(PlayerStateMachine.States.PLAY_ANIMATION, { "animation_name": "opening-chest-down" }) await player.state_machine.StateChanged var play_animation_state := player.state_machine.current_state as PlayerPlayAnimationState await play_animation_state.AnimationFinished player.state_machine.QueueStateChange(PlayerStateMachine.States.IDLE) # Zoom back out await get_tree().create_tween().tween_property(camera, "zoom", current_zoom, 0.5).finished