extends Node signal DialogueTriggered(dialogue_name: String) @onready var dialogue_box: DialogueBox = $"../Gui/Dialogue Box" var dialogue_triggers_in_area: Array[DialogueTrigger] = [] # Public Methods func OnPlayerInteractScannerAreaEntered(area: Area2D) -> void: if area is not DialogueTrigger or dialogue_triggers_in_area.has(area): return dialogue_triggers_in_area.append(area) func OnPlayerInteractScannerAreaExited(area: Area2D) -> void: if area is not DialogueTrigger or !dialogue_triggers_in_area.has(area): return dialogue_triggers_in_area.erase(area) func OnPlayerInteractionActionTriggered() -> void: if dialogue_triggers_in_area.is_empty(): return var trigger := dialogue_triggers_in_area[0] trigger.Trigger() # Private Methods func _on_map_changed(map_id: Enums.MapIds) -> void: var player := GroupUtils.GetPlayer() if !player: return player.InteractScannerAreaEntered.connect(OnPlayerInteractScannerAreaEntered) player.InteractScannerAreaExited.connect(OnPlayerInteractScannerAreaExited) player.InteractionActionTriggered.connect(OnPlayerInteractionActionTriggered) dialogue_box.DialogueStarted.connect(player.OnCutsceneStarted) dialogue_box.DialogueEnded.connect(player.OnCutsceneEnded) var dialogue_triggers := GroupUtils.GetAllDialogueTriggers() print("Dialogue Triggers on map [%s]: [%d]" % [Enums.MapIds.keys()[map_id], len(dialogue_triggers)]) for trigger in dialogue_triggers: trigger.DialogueTriggered.connect(_on_dialogue_triggered) func _on_dialogue_triggered(dialogue_name: String) -> void: DialogueTriggered.emit(dialogue_name)