68 lines
1.5 KiB
Odin
68 lines
1.5 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,
|
|
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
|
|
}
|
|
}
|
|
|