48 lines
1.4 KiB
GDScript
48 lines
1.4 KiB
GDScript
extends Node
|
|
|
|
const WAVE_DURATION := 60.0
|
|
|
|
var tick_accumulator := 0.0
|
|
|
|
func _ready() -> void:
|
|
EventBus.portal_defeated.connect(_on_portal_defeated)
|
|
EventBus.invasion_ended.connect(_on_invasion_ended)
|
|
call_deferred("_start_run")
|
|
|
|
func _start_run() -> void:
|
|
if not GameState.run_initialized:
|
|
GameState.current_wave = 1
|
|
GameState.wave_timer_remaining = WAVE_DURATION
|
|
GameState.run_initialized = true
|
|
EventBus.run_started.emit(GameState.current_wave)
|
|
EventBus.wave_started.emit(GameState.current_wave)
|
|
|
|
func _process(delta: float) -> void:
|
|
if GameState.wave_timer_remaining <= 0:
|
|
return
|
|
GameState.wave_timer_remaining -= delta
|
|
tick_accumulator += delta
|
|
if tick_accumulator >= 1.0:
|
|
tick_accumulator -= 1.0
|
|
EventBus.wave_timer_tick.emit(max(0.0, GameState.wave_timer_remaining))
|
|
if GameState.wave_timer_remaining <= 0:
|
|
GameState.wave_timer_remaining = 0.0
|
|
EventBus.wave_timer_tick.emit(0.0)
|
|
|
|
func _on_portal_defeated(portal: Node) -> void:
|
|
if not portal.is_in_group("red_portal"):
|
|
return
|
|
_advance_wave()
|
|
|
|
func _on_invasion_ended(success: bool) -> void:
|
|
if not success:
|
|
return
|
|
_advance_wave()
|
|
|
|
func _advance_wave() -> void:
|
|
EventBus.wave_ended.emit(GameState.current_wave, true)
|
|
GameState.current_wave += 1
|
|
GameState.wave_timer_remaining = WAVE_DURATION
|
|
tick_accumulator = 0.0
|
|
EventBus.wave_started.emit(GameState.current_wave)
|