Start encounter feature

This commit is contained in:
2026-01-13 08:31:42 +01:00
parent 93ac9555e9
commit 7b1b09e0c1
36 changed files with 2201 additions and 0 deletions

95
scripts/event_bus.gd Normal file
View File

@@ -0,0 +1,95 @@
## 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