diff options
Diffstat (limited to 'src/enemy.odin')
| -rw-r--r-- | src/enemy.odin | 39 |
1 files changed, 33 insertions, 6 deletions
diff --git a/src/enemy.odin b/src/enemy.odin index 7da2635..b60b292 100644 --- a/src/enemy.odin +++ b/src/enemy.odin @@ -10,17 +10,20 @@ import "fw" import "phys" Enemy_Ai :: enum(u16) { + None, + Corpse, Muntik, } Enemy_Update_Callback :: #type proc(^Enemy, f32) update_funcs := [Enemy_Ai]Enemy_Update_Callback{ + .None = noop_ai, + .Corpse = corpse_ai, .Muntik = update_muntik, } Enemy_Stats :: struct { - iframes: f32, max_health: i16, defense: i16, } @@ -60,6 +63,8 @@ make_enemy :: proc( e.enemy.health = stats.max_health e.enemy.variant = e + phys.set_udata(body, &e.enemy) + e.enemy.handle = len(state.enemy_list) append(&state.enemy_list, e) @@ -67,21 +72,30 @@ make_enemy :: proc( } enemy_take_damage :: proc(e: ^Enemy, damage: i16, kb_dir: Vec2) { - current_time := f32(fw.get_time()) - if current_time - e.hit_timestamp < e.stats.iframes { - return - } + kb_dir := kb_dir - e.hit_timestamp = current_time + e.hit_timestamp = f32(fw.get_time()) total_damage := math.max(damage - e.stats.defense, 1) e.health -= total_damage e.health = math.max(e.health, 0) + + if e.health == 0 { + e.ai = .Corpse + phys.set_velocity(e.body, kb_dir) + } else { + vel := phys.get_velocity(e.body) + kb_dir + phys.set_velocity(e.body, vel) + } } update_enemies :: proc(dt: f32) { for e in state.enemy_list { update_funcs[e^.ai](e, dt) + + e.sprite.pos = phys.get_position(e.body) + update_sprite(&e.sprite, dt) + phys.update_body(e.body) } } @@ -97,3 +111,16 @@ clear_enemies :: proc() { free(e) } } + +noop_ai :: proc(e: ^Enemy, _: f32) {} + +corpse_ai :: proc(e: ^Enemy, dt: f32) { + e.sprite.tint = Color{0.5, 0.5, 0.5, 1} + + vel := phys.get_velocity(e.body) + vel.x = dt_lerp(vel.x, 0, 20) + vel.y = math.min(vel.y + GRAVITY * dt, TERMINAL_VELOCITY) + phys.set_velocity(e.body, vel) + + set_sprite_active_tag(&e.sprite, "dead") +} |
