81 lines
2.4 KiB
GDScript
81 lines
2.4 KiB
GDScript
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
|
|
|