aboutsummaryrefslogtreecommitdiff
path: root/src/platform.odin
blob: e495b36c5a5617042de7ad5435cc7de611e3c123 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package demonchime

import "fw"
import "phys"
import hm "core:container/handle_map"

Platform :: struct {
  handle: Handle,
  body: phys.Body_Handle,
}

make_platform :: proc(rect: Rect) -> (Handle, ^Platform) {
  phys_handle := phys.make_body(transmute(phys.Rect)rect, layers = {.Hard})
  handle := hm.add(&state.platform_list, Platform{body = phys_handle})
  return handle, hm.get(&state.platform_list, handle)
}

draw_platforms :: proc() {
  iter := hm.iterator_make(&state.platform_list)
  color := Color{1, 0, 0, 0.25}
  for p, _ in hm.iterate(&iter) {
    rect := phys.get_rect(p.body)
    fw.draw_rect(rect.start, rect.size, color = color)
  }
}

clear_platforms :: proc() {
  iter := hm.iterator_make(&state.platform_list)
  for p, _ in hm.iterate(&iter) {
    phys.remove_body(p.body)
  }

  hm.clear(&state.platform_list)
}

setup_room_collisions :: proc() {
  clear_platforms()

  iterate_room_tiles(current_room.id, proc(x: i32, y: i32, tile_id: u32) {
    tile := tiles[tile_id]

    for coll in tile.collisions {
      make_platform({coll.start + {f32(x), f32(y)}, coll.size})
    }
  })
}

on_room_open_platforms :: proc(room_id: Room_Id) {
  setup_room_collisions()
}

object_spawner_collision :: proc(obj: Object_Resource) {
  make_platform(Rect{obj.pos, obj.size})
}