aboutsummaryrefslogtreecommitdiff
path: root/src/tiled/world.odin
diff options
context:
space:
mode:
authorXander Swan <[hidden email]>2026-01-01 18:32:20 -0500
committerXander Swan <[hidden email]>2026-01-01 18:32:20 -0500
commit65a2ceda55198dab3bab75c06c0d50adeb0a1101 (patch)
tree2a08400520f60fcd86b381bc840bb5c739ff998a /src/tiled/world.odin
parentdc373b507ca68ada2cbf4c8e0d7949d6bc46ed9b (diff)
lots of changes + player dash
Diffstat (limited to 'src/tiled/world.odin')
-rw-r--r--src/tiled/world.odin84
1 files changed, 84 insertions, 0 deletions
diff --git a/src/tiled/world.odin b/src/tiled/world.odin
new file mode 100644
index 0000000..c55097a
--- /dev/null
+++ b/src/tiled/world.odin
@@ -0,0 +1,84 @@
+package tiled
+
+import os "core:os/os2"
+import "core:log"
+import "core:encoding/json"
+import "core:path/filepath"
+import "core:strings"
+
+World_Room :: struct {
+ file_name: string `json:"fileName"`,
+ x: i32,
+ y: i32,
+ width: i32,
+ height: i32,
+}
+
+res_dir: string
+world: []World_Room
+current_room: struct {
+ tmap: Map,
+ using room: World_Room,
+}
+
+load_world :: proc(path: string) -> bool {
+ world_text, read_err := os.read_entire_file(path, context.temp_allocator)
+ if read_err != nil {
+ log.errorf("Failed to read file %v (%v)", path, read_err)
+ return false
+ }
+
+ jworld: struct {
+ maps: []World_Room,
+ }
+ unmarshal_err := json.unmarshal(
+ world_text,
+ &jworld,
+ )
+ if unmarshal_err != nil {
+ log.errorf("Failed to unmarshal file %v (%v)", path, unmarshal_err)
+ return false
+ }
+
+ world = jworld.maps
+ res_dir = filepath.dir(path)
+
+ return true
+}
+
+delete_world :: proc() {
+ delete_map(current_room.tmap)
+ delete(world)
+ delete(res_dir)
+}
+
+open_new_room_at :: proc(pos: [2]i32) -> bool {
+ pos := pos
+ pos += {current_room.room.x, current_room.room.y}
+
+ log.debug("trying to change room...", pos)
+ for room in world {
+ if strings.compare(room.file_name, current_room.room.file_name) == 0 {
+ continue
+ }
+
+ if pos.x >= room.x && pos.x <= room.x + room.width \
+ && pos.y >= room.y && pos.y <= room.y + room.height {
+ delete_map(current_room.tmap)
+
+ path := strings.concatenate(
+ {res_dir, "/", room.file_name},
+ allocator = context.temp_allocator,
+ )
+ new_map, err := load_map(path)
+ if err != .NONE {
+ log.error("could not load new room")
+ return false
+ }
+ current_room.tmap = new_map
+ current_room.room = room
+ return true
+ }
+ }
+ return false
+}