aboutsummaryrefslogtreecommitdiff
path: root/src/enemy.odin
diff options
context:
space:
mode:
Diffstat (limited to 'src/enemy.odin')
-rw-r--r--src/enemy.odin39
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")
+}