Rework player state system to use an event subscription system to avoid directly calling methods on individual state and having to worry about validity

This commit is contained in:
2026-04-01 11:11:02 -05:00
parent 7cd34cb07e
commit eabfeab91a
35 changed files with 882 additions and 2288 deletions

View File

@@ -1,55 +1,51 @@
extends Node
# Signals
#
## 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()
#
## 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.GetPlayerBody() as PlayerBody
#if !player:
#return
#
#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()