package game Game_Phase :: enum { Build, Combat, Game_Over, Victory, } Wave_Spawner :: struct { enemies_to_spawn: int, spawn_timer: f32, spawn_interval: f32, spawn_count: int, } 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 kind := Enemy_Kind.Grunt if world.spawner.spawn_count % 3 == 2 do kind = .Runner if world.spawner.spawn_timer <= 0 { health := 15 + world.wave * 5 speed := 55 + f32(world.wave) * 5 spawn_enemy(world, kind) world.spawner.spawn_count += 1 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 } }