Files
tower-defense-prototype/game/wave.odin
T
2026-06-13 23:33:03 -07:00

64 lines
1.3 KiB
Odin

package game
Game_Phase :: enum {
Build,
Combat,
Game_Over,
Victory,
}
Wave_Spawner :: struct {
enemies_to_spawn: int,
spawn_timer: f32,
spawn_interval: f32,
}
start_wave :: proc(world: ^World) {
if world.phase != .Build do return
world.wave += 1
world.phase = .Combat
world.spawner = Wave_Spawner {
enemies_to_spawn = 5 + world.wave * 2,
spawn_timer = 0,
spawn_interval = 0.55,
}
}
update_wave :: proc(world: ^World, dt: f32) {
if world.phase != .Combat do return
if world.spawner.enemies_to_spawn <= 0 do return
if len(world.path) < 2 do return
world.spawner.spawn_timer -= dt
if world.spawner.spawn_timer <= 0 {
health := 15 + world.wave * 5
speed := 55 + f32(world.wave) * 5
spawn_enemy(world, health, speed)
world.spawner.enemies_to_spawn -= 1
world.spawner.spawn_timer = world.spawner.spawn_interval
}
}
wave_clear :: proc(world: ^World) -> bool {
if world.spawner.enemies_to_spawn > 0 do return false
return active_enemy_count(world) == 0
}
update_phase :: proc(world: ^World) {
if world.phase == .Combat && wave_clear(world) {
world.phase = .Build
push_event(world, .Wave_Survived, gold_reward = 25)
}
}
check_end :: proc(world: ^World) {
if world.base_health <= 0 {
world.phase = .Game_Over
}
if world.wave >= MAX_WAVES && world.phase == .Build && wave_clear(world) {
world.phase = .Victory
}
}