Files
Archipelago-Game/Scripts/dialogue_trigger_connector.gd
2026-03-15 12:19:12 -06:00

56 lines
1.5 KiB
GDScript

extends Node
# Signals
signal DialogueTriggered(dialogue_name: String)
# Exports
@export var dialogue_box: DialogueBox
# Private Variables
var _dialogue_triggers_in_area: Array[DialogueTrigger] = []
# Private Methods
func _on_map_changed(map_id: Enums.MapIds) -> void:
var player := GroupUtils.GetPlayer()
if !player:
return
player.interact_scanner.area_entered.connect(_on_interact_scanned)
player.interact_scanner.area_exited.connect(_on_interact_unscanned)
player.interact_scanner.InteractionActionTriggered.connect(_on_interact_triggered)
dialogue_box.DialogueStarted.connect(player.QueueCutsceneState)
dialogue_box.DialogueEnded.connect(player.QueueEndCutsceneState)
var dialogue_triggers := GroupUtils.GetAllDialogueTriggers()
for trigger in dialogue_triggers:
trigger.DialogueTriggered.connect(_on_dialogue_triggered)
func _on_dialogue_triggered(dialogue_name: String) -> void:
# Wait one frame so we don't immediately close dialogue box
# TODO This is stupid
await get_tree().process_frame
DialogueTriggered.emit(dialogue_name)
func _on_interact_scanned(area: Area2D) -> void:
if area is not DialogueTrigger or _dialogue_triggers_in_area.has(area):
return
_dialogue_triggers_in_area.append(area)
func _on_interact_unscanned(area: Area2D) -> void:
if area is not DialogueTrigger or !_dialogue_triggers_in_area.has(area):
return
_dialogue_triggers_in_area.erase(area)
func _on_interact_triggered() -> void:
if _dialogue_triggers_in_area.is_empty():
return
var trigger := _dialogue_triggers_in_area[0]
trigger.Trigger()