aboutsummaryrefslogtreecommitdiff
path: root/src/muntik.odin
diff options
context:
space:
mode:
authoriamcheeseman <[email protected]>2026-03-04 16:12:25 -0500
committeriamcheeseman <[email protected]>2026-03-04 16:12:25 -0500
commit69bfcb3c5fec6957e00264d24990dd2f1263cd50 (patch)
treebab0896b254d9158b31cbe2ae1073562deef230e /src/muntik.odin
parentccd4b29cc358d89d231e602522ca7b35d178b120 (diff)
better muntik
Diffstat (limited to 'src/muntik.odin')
-rw-r--r--src/muntik.odin94
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
}
}