96 lines
3.1 KiB
GDScript
96 lines
3.1 KiB
GDScript
## Global event bus for signal-based communication across systems.
|
|
##
|
|
## Centralizes game events to decouple systems and simplify event handling.
|
|
## Register as autoload singleton: Project Settings → Autoload → EventBus
|
|
extends Node
|
|
|
|
# ============================================================================
|
|
# Game State Events
|
|
# ============================================================================
|
|
|
|
## Emitted when game state changes
|
|
signal state_changed(new_state: int, old_state: int)
|
|
|
|
## Emitted when draft phase begins
|
|
signal draft_started(available_tetrominoes: Array[Resource])
|
|
|
|
## Emitted when placement phase begins
|
|
signal placement_started(tetromino: Resource)
|
|
|
|
## Emitted when telegraph phase begins
|
|
signal telegraph_started(wave_config: Resource)
|
|
|
|
## Emitted when combat phase begins
|
|
signal combat_started(wave_number: int)
|
|
|
|
## Emitted when escalation phase begins
|
|
signal escalation_started(wave_number: int)
|
|
|
|
# ============================================================================
|
|
# Wave & Enemy Events
|
|
# ============================================================================
|
|
|
|
## Emitted when enemy spawns
|
|
signal enemy_spawned(enemy: Node3D)
|
|
|
|
## Emitted when enemy is defeated
|
|
signal enemy_died(enemy: Node3D)
|
|
|
|
## Emitted when all enemies in wave are defeated
|
|
signal wave_completed(wave_number: int)
|
|
|
|
## Emitted when wave fails (enemies reach board/health depleted)
|
|
signal wave_failed(wave_number: int)
|
|
|
|
# ============================================================================
|
|
# Combat Events
|
|
# ============================================================================
|
|
|
|
## Emitted when tower fires projectile
|
|
signal tower_fired(tower: Node3D, target: Node3D)
|
|
|
|
## Emitted when projectile hits enemy
|
|
signal projectile_hit(projectile: Node3D, enemy: Node3D, damage: int)
|
|
|
|
## Emitted when tower takes damage from enemy
|
|
signal tower_damaged(tower: Node3D, damage: int)
|
|
|
|
## Emitted when synergy is activated
|
|
signal synergy_activated(towers: Array[Node3D], bonus_type: String, bonus_value: float)
|
|
|
|
# ============================================================================
|
|
# Player Resource Events
|
|
# ============================================================================
|
|
|
|
## Emitted when player gold changes
|
|
signal gold_changed(amount: int)
|
|
|
|
## Emitted when player health changes
|
|
signal health_changed(amount: int)
|
|
|
|
## Emitted when tower is placed
|
|
signal tower_placed(tower: Node3D, position: Vector3)
|
|
|
|
## Emitted when tower is moved/repositioned
|
|
signal tower_moved(tower: Node3D, new_position: Vector3, old_position: Vector3)
|
|
|
|
# ============================================================================
|
|
# Game End Events
|
|
# ============================================================================
|
|
|
|
## Emitted when player wins the encounter
|
|
signal game_won
|
|
|
|
## Emitted when player loses the encounter
|
|
signal game_lost
|
|
|
|
|
|
func _enter_tree() -> void:
|
|
# Ensure this is a singleton
|
|
if get_tree().root.get_child_count() > 1:
|
|
for i in range(get_tree().root.get_child_count()):
|
|
var child = get_tree().root.get_child(i)
|
|
if child is EventBus and child != self:
|
|
queue_free()
|
|
return
|