diff options
Diffstat (limited to 'src/world.odin')
| -rw-r--r-- | src/world.odin | 39 |
1 files changed, 32 insertions, 7 deletions
diff --git a/src/world.odin b/src/world.odin index 1e22cb1..d2e8601 100644 --- a/src/world.odin +++ b/src/world.odin @@ -3,11 +3,20 @@ package demonchime import rl "vendor:raylib" Object_Spawner :: proc(Object_Resource) +Room_Change_Callback :: proc(Room_Id) current_room: Room_Position_Resource object_spawners := [Object_Type]Object_Spawner{ .PLAYER_SPAWN = object_spawner_player_spawn, + // .COLLISION = object_spawner_collision, +} + +room_open_cb := []Room_Change_Callback{ + on_room_open_platforms, +} + +room_close_cb := []Room_Change_Callback{ } @(private = "file") @@ -15,10 +24,28 @@ spawn_objects :: proc(room_id: Room_Id) { room := get_room(room_id) for obj in room.objects { - object_spawners[obj.type](obj) + spawner := object_spawners[obj.type] + if spawner != nil { + spawner(obj) + } } } +@(private = "file") +_open_room :: proc(room_pos: Room_Position_Resource) { + for cb in room_close_cb { + cb(current_room.id) + } + + current_room = room_pos + + for cb in room_open_cb { + cb(current_room.id) + } + + spawn_objects(current_room.id) +} + open_room_at :: proc(pos: [2]i32) -> bool { pos := pos pos += {current_room.x, current_room.y} @@ -32,8 +59,7 @@ open_room_at :: proc(pos: [2]i32) -> bool { pos.x <= room_pos.x + room_pos.width && pos.y >= room_pos.y && pos.y <= room_pos.y + room_pos.height { - current_room = room_pos - spawn_objects(current_room.id) + _open_room(room_pos) return true } } @@ -43,8 +69,7 @@ open_room_at :: proc(pos: [2]i32) -> bool { open_room :: proc(id: Room_Id) -> bool { for room_pos in world { if room_pos.id == id { - current_room = room_pos - spawn_objects(current_room.id) + _open_room(room_pos) return true } } @@ -79,9 +104,9 @@ draw_room :: proc(id: Room_Id) { iterate_room_tiles(id, draw_tile) } -Map_Iterate_Callback :: proc(_: i32, _: i32, _: u32) +Room_Iterate_Callback :: proc(_: i32, _: i32, _: u32) -iterate_room_tiles :: proc(id: Room_Id, callback: Map_Iterate_Callback) { +iterate_room_tiles :: proc(id: Room_Id, callback: Room_Iterate_Callback) { room := get_room(id) for layer in room.layers { |
