diff options
Diffstat (limited to 'src/muntik.odin')
| -rw-r--r-- | src/muntik.odin | 94 |
1 files changed, 48 insertions, 46 deletions
diff --git a/src/muntik.odin b/src/muntik.odin index 0612fd6..566befc 100644 --- a/src/muntik.odin +++ b/src/muntik.odin @@ -8,14 +8,17 @@ import hm "core:container/handle_map" import "fw" import "phys" +muntik_stats := Enemy_Stats{ + iframes = 0.2, + max_health = 5, +} + Muntik :: struct { - handle: Handle, - body: phys.Body_Handle, - sprite: Sprite, + using enemy: Enemy, walk_dir: f32, } -make_muntik :: proc(pos: Vec2, direction: f32) -> (Handle, ^Muntik) { +make_muntik :: proc(pos: Vec2, direction: f32) -> (int, ^Muntik) { sprite: Sprite init_sprite(&sprite, .Muntik) sprite.offset = { @@ -24,65 +27,64 @@ make_muntik :: proc(pos: Vec2, direction: f32) -> (Handle, ^Muntik) { } body := phys.make_body( - phys.Rect{-sprite.offset, {14, 9}}, + phys.Rect{-sprite.offset, {14, 10}}, layers = {.Enemy}, mask = {.Player, .Hard}, ) phys.set_position(body, pos) - handle := hm.add(&state.muntik_list, Muntik{ - body = body, - sprite = sprite, - walk_dir = direction, - }) - return handle, hm.get(&state.muntik_list, handle) + muntik := make_enemy( + Muntik, + &muntik_stats, + sprite, + body, + ) + + muntik.walk_dir = direction + + return muntik.handle, muntik } -update_muntiks :: proc(dt: f32) { - iter := hm.iterator_make(&state.muntik_list) - for m, _ in hm.iterate(&iter) { - vel := phys.get_velocity(m.body) - vel.x = m.walk_dir * MUNTIK_SPEED - vel.y = math.min(vel.y + GRAVITY * dt, TERMINAL_VELOCITY) - phys.set_velocity(m.body, vel) +update_muntik :: proc(e: ^Enemy, dt: f32) { + m, is_muntik := e.variant.(^Muntik) + if !is_muntik { + return + } - phys.update_body(m.body) + vel := phys.get_velocity(m.body) + vel.x = m.walk_dir * MUNTIK_SPEED + vel.y = math.min(vel.y + GRAVITY * dt, TERMINAL_VELOCITY) + phys.set_velocity(m.body, vel) - pos := phys.get_position(m.body) + phys.update_body(m.body) - m.sprite.pos = pos - m.sprite.scale.x = -m.walk_dir + pos := phys.get_position(m.body) - set_sprite_active_tag(&m.sprite, "walk") - update_sprite(&m.sprite, dt) + m.sprite.pos = pos + m.sprite.scale.x = -m.walk_dir - turnaround_rc_start := Vec2{pos.x + m.walk_dir * 4, pos.y} - turnaround_rc := phys.make_raycast( - turnaround_rc_start, - turnaround_rc_start + {0, 16}, - ) + set_sprite_active_tag(&m.sprite, "walk") + update_sprite(&m.sprite, dt) - collisions := phys.get_colliding_bodies(m.body) - defer delete(collisions) + turnaround_rc_start := Vec2{pos.x + m.walk_dir * 4, pos.y} + turnaround_rc := phys.make_raycast( + turnaround_rc_start, + turnaround_rc_start + {0, 16}, + ) - for body in collisions { - layers := phys.get_layers(body) - if .Player in layers { - bpos := phys.get_position(body) - dir := linalg.normalize0(bpos - pos) * 500 - player_take_damage(MUNTIK_DAMAGE, dir) - } - } + collisions := phys.get_colliding_bodies(m.body) + defer delete(collisions) - if !phys.is_colliding(turnaround_rc) { - m.walk_dir *= -1 + for body in collisions { + layers := phys.get_layers(body) + if .Player in layers { + bpos := phys.get_position(body) + dir := linalg.normalize0(bpos - pos) * 500 + player_take_damage(MUNTIK_DAMAGE, dir) } } -} -draw_muntiks :: proc() { - iter := hm.iterator_make(&state.muntik_list) - for m, _ in hm.iterate(&iter) { - draw_sprite(m.sprite) + if !phys.is_colliding(turnaround_rc) { + m.walk_dir *= -1 } } |
