## 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