Refactor signal logic

This commit is contained in:
2026-03-15 13:06:21 -05:00
parent 1c95315496
commit 8bcf406576
21 changed files with 234 additions and 223 deletions

View File

@@ -1,31 +1,41 @@
extends Node
class_name BenchInteractionConnector
# Signals
signal SitOnBenchTriggered(position: Vector2, sitting_direction: Enums.Directions)
@export var player: CharacterBody2D
# Exports
@export var player: PlayerCharacter
var benches_in_range: Array[WoodenBench] = []
# Private Variables
var _benches_in_range: Array[WoodenBench] = []
# Public Methods
func OnPlayerInteractScannerAreaEntered(area: Area2D) -> void:
# Private Methods
func _ready() -> void:
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)
func _on_interact_scanned(area: Area2D) -> void:
var parent := area.get_parent()
if parent == null or parent is not WoodenBench or benches_in_range.has(parent):
if parent == null or parent is not WoodenBench or _benches_in_range.has(parent):
return
benches_in_range.append(parent)
_benches_in_range.append(parent)
func OnPlayerInteractScannerAreaExited(area: Area2D) -> void:
var parent = area.get_parent()
if parent == null or parent is not WoodenBench or !benches_in_range.has(parent):
func _on_interact_unscanned(area: Area2D) -> void:
var parent: Node = area.get_parent()
if parent == null or parent is not WoodenBench or !_benches_in_range.has(parent):
return
benches_in_range.erase(parent)
_benches_in_range.erase(parent)
func OnPlayerInteractionActionTriggered() -> void:
if benches_in_range.is_empty():
func _on_interact_triggered() -> void:
if _benches_in_range.is_empty():
return
var bench := benches_in_range[0]
var bench := _benches_in_range[0]
var sitting_spots_container := bench.get_node("Sitting Spots") as Node2D
var sitting_spot_markers := sitting_spots_container.get_children()
@@ -41,18 +51,4 @@ func OnPlayerInteractionActionTriggered() -> void:
if !closest_marker:
return
SitOnBenchTriggered.emit(closest_marker.global_position, Enums.Directions.DOWN)
# Private Methods
func _ready() -> void:
var all_players := get_tree().get_nodes_in_group("Player Group")
if all_players == null or all_players.is_empty():
return
for player_node in all_players:
var player := player_node as PlayerCharacter
player.InteractScannerAreaEntered.connect(OnPlayerInteractScannerAreaEntered)
player.InteractScannerAreaExited.connect(OnPlayerInteractScannerAreaExited)
player.InteractionActionTriggered.connect(OnPlayerInteractionActionTriggered)
player.SitOnFurnitureTriggered.emit(closest_marker.global_position, Enums.Directions.DOWN)

View File

@@ -1,53 +1,20 @@
extends Node
# Drop-in that automatically connects signals from player to chest objects
signal ChestInteractedWith(chest: BaseChest)
# Signals
signal OpeningOfOpenedChestAttempted
# Exports
@export var player: PlayerCharacter
@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 Variables
var _chests_in_range: Array[BaseChest] = []
# 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)
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)
var chests := GroupUtils.GetAllTreasureChests()
for chest in chests:
@@ -58,7 +25,7 @@ func _on_chest_opening_animation_started() -> void:
var player := GroupUtils.GetPlayer()
var children := player.get_children()
player.OnCutsceneStarted()
player.QueueCutsceneState()
var camera_idx := children.find_custom(func(x): return x is Camera2D)
if camera_idx == -1: return
@@ -77,4 +44,33 @@ func _on_chest_opening_animation_started() -> void:
# Zoom back out
await get_tree().create_tween().tween_property(camera, "zoom", current_zoom, 0.5).finished
func _on_interact_scanned(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 _on_interact_unscanned(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 _on_interact_triggered() -> 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()

View File

@@ -1,39 +1,35 @@
extends Node
# Exports
@export var player: PlayerCharacter
# Private Variables
var _zones_in_range: Array[InteractiveLoadingZone] = []
# Public Methods
func OnPlayerInteractScannerAreaEntered(area: Area2D) -> void:
# Private Methods
func _ready() -> void:
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)
func _on_interact_scanned(area: Area2D) -> void:
if area is not InteractiveLoadingZone or _zones_in_range.has(area):
return
_zones_in_range.append(area)
func OnPlayerInteractScannerAreaExited(area: Area2D) -> void:
func _on_interact_unscanned(area: Area2D) -> void:
if area is not InteractiveLoadingZone or !_zones_in_range.has(area):
return
_zones_in_range.erase(area)
func OnPlayerInteractionActionTriggered() -> void:
func _on_interact_triggered() -> void:
if _zones_in_range.is_empty():
return
var zone := _zones_in_range[0]
zone.Activate()
# Private Methods
func _ready() -> void:
var all_players := get_tree().get_nodes_in_group("Player Group")
if all_players == null or all_players.is_empty():
return
for player_node in all_players:
var player := player_node as PlayerCharacter
player.InteractScannerAreaEntered.connect(OnPlayerInteractScannerAreaEntered)
player.InteractScannerAreaExited.connect(OnPlayerInteractScannerAreaExited)
player.InteractionActionTriggered.connect(OnPlayerInteractionActionTriggered)

2
Scripts/Maps/base_map.gd Normal file
View File

@@ -0,0 +1,2 @@
extends Node2D
class_name BaseMap

View File

@@ -0,0 +1 @@
uid://da5dg36wink7x