better quick save / load scene functionality
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 7 Feb 2022 02:53:30 +0000 (20:53 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 7 Feb 2022 02:53:30 +0000 (20:53 -0600)
run_tree/scenes/quick_save.scene [new file with mode: 0644]
src/entity/manager.onyx
src/entity/store.onyx
src/main.onyx

diff --git a/run_tree/scenes/quick_save.scene b/run_tree/scenes/quick_save.scene
new file mode 100644 (file)
index 0000000..80b9324
--- /dev/null
@@ -0,0 +1,105 @@
+:Player
+entity.id = 1
+entity.flags = 2
+entity.pos.x = 891.5230
+entity.pos.y = 279.3731
+entity.size.x = 32.0000
+entity.size.y = 32.0000
+holding = 4
+controls.up = 87
+controls.down = 83
+controls.left = 65
+controls.right = 68
+controls.interact = 70
+controls.pick_up = 71
+color.r = 0.0000
+color.g = 0.0000
+color.b = 1.0000
+color.a = 1.0000
+facing = 3
+
+:Player
+entity.id = 2
+entity.flags = 2
+entity.pos.x = 328.9612
+entity.pos.y = 309.7936
+entity.size.x = 32.0000
+entity.size.y = 32.0000
+holding = 0
+controls.up = 265
+controls.down = 264
+controls.left = 263
+controls.right = 262
+controls.interact = 44
+controls.pick_up = 46
+color.r = 1.0000
+color.g = 0.0000
+color.b = 0.0000
+color.a = 1.0000
+facing = 4
+
+:Door
+entity.id = 3
+entity.flags = 7
+entity.pos.x = 290.0374
+entity.pos.y = 211.0090
+entity.size.x = 370.0000
+entity.size.y = 24.0000
+target_openness = 0.8000
+
+:Item
+entity.id = 4
+entity.flags = 0
+entity.pos.x = 891.5230
+entity.pos.y = 259.3731
+entity.size.x = 10.0000
+entity.size.y = 8.0000
+color.r = 1.0000
+color.g = 0.0000
+color.b = 1.0000
+color.a = 1.0000
+
+:Item
+entity.id = 5
+entity.flags = 4
+entity.pos.x = 167.6909
+entity.pos.y = 283.5205
+entity.size.x = 13.0000
+entity.size.y = 10.0000
+color.r = 1.0000
+color.g = 0.0000
+color.b = 1.0000
+color.a = 1.0000
+
+:Wall
+entity.id = 6
+entity.flags = 2
+entity.pos.x = 501.0000
+entity.pos.y = 291.0000
+entity.size.x = 62.0000
+entity.size.y = 180.0000
+
+:Wall
+entity.id = 7
+entity.flags = 2
+entity.pos.x = 275.0000
+entity.pos.y = 391.0000
+entity.size.x = 461.0000
+entity.size.y = 34.0000
+
+:Wall
+entity.id = 8
+entity.flags = 2
+entity.pos.x = 74.0000
+entity.pos.y = 313.0000
+entity.size.x = 65.0000
+entity.size.y = 222.0000
+
+:Wall
+entity.id = 9
+entity.flags = 2
+entity.pos.x = 686.0000
+entity.pos.y = 302.0000
+entity.size.x = 50.0000
+entity.size.y = 363.0000
+
index b18c077125dce0b9e45017a572f5e5d87580b62b..1d10e622881f99cac1ffce678e522723c6507cc6 100644 (file)
@@ -69,6 +69,9 @@ Entity_Manager :: struct {
     query          :: entity_manager_query;
     query_by_type  :: entity_manager_query_by_type;
     query_by_flags :: entity_manager_query_by_flags;
+
+    load_from_file :: entity_manager_load_from_file;
+    save_to_file   :: entity_manager_save_to_file;
 }
 
 entity_manager_create :: () -> Entity_Manager {
index bc3293ca4d73d139d5e02f2585150f9061ff139e..54c0b3efedf074cd319492ced0a124a355c1eec6 100644 (file)
@@ -68,9 +68,18 @@ entity_manager_save_to_file :: (use this: ^Entity_Manager, filename: str) {
 
 entity_manager_load_from_file :: (use this: ^Entity_Manager, filename: str) {
     err, input_file := os.open(filename, .Read);
+    if err != .None {
+        printf("Failed to open file: {}\n", filename);
+        return;
+    }
     defer os.close(^input_file);
     reader := io.reader_make(^input_file);
 
+    for entities do raw_free(entity_allocator, it);
+    map.clear(^entity_map);
+    array.clear(^entities);
+    next_entity_id = 0;
+
     use type_info;
 
     current_entity: ^Entity;
@@ -96,18 +105,33 @@ entity_manager_load_from_file :: (use this: ^Entity_Manager, filename: str) {
                 }
             }
 
+            if entity_info == null {
+                printf("Unknown entity kind '{}' on line {}.\n", entity_kind, line_number);
+                current_entity = null;
+                continue;
+            }
+
             current_entity = entity_info.create_default(this);
             continue;
         }
 
+        if current_entity == null do continue;
+
         var_name := string.read_until(^line, #char "=")
                  |> string.strip_whitespace();
         string.advance(^line, 1);
         string.strip_whitespace(^line);
 
         member := get_any_for_member(any.{current_entity, current_entity.type}, var_name);
+        if member.data == null {
+            entity_info := cast(^Type_Info_Struct) get_type_info(current_entity.type);
+            printf("'{}' is not a valid member of '{}' on line {}.\n", var_name, entity_info.name, line_number);
+            continue;
+        }
+
         if !conv.parse_any(member.data, member.type, line) {
             printf("Unable to parse '{}' for type '{}' on line {}.\n", line, member.type, line_number);
+            continue;
         }
     }
 
@@ -133,6 +157,8 @@ entity_manager_load_from_file :: (use this: ^Entity_Manager, filename: str) {
                 }
             }
         }
+
+        return .{null, void};
     }
 }
 
index aed6668accc645f0b941770124355760108fa0ec..d09836a981c9ffad24c48bc24fc2103c45ae3c48 100644 (file)
@@ -49,11 +49,8 @@ init :: () {
     scene->register(Wall);
     scene->register(Door);
     scene->register(Item);
-    entity_manager_load_from_file(^scene, "./Asdf");
+    scene->load_from_file("scenes/quick_save.scene");
 
-    // scene->make(Player, .{ pos = .{300, 300}, controls=player_1_controls });
-    // scene->make(Player, .{ pos = .{400, 300}, controls=player_2_controls, color=.{1,0,0} });
-    
     #if DEBUG {
         println("Registered Entity types:");
         for scene.entity_types.entries {
@@ -76,7 +73,11 @@ update :: (dt: f32) {
     }
 
     if is_key_just_up(GLFW_KEY_F8) {
-        entity_manager_save_to_file(^scene, "Asdf");
+        scene->save_to_file("scenes/quick_save.scene");
+    }
+
+    if is_key_just_up(GLFW_KEY_F9) {
+        scene->load_from_file("scenes/quick_save.scene");
     }
 
     if editor_shown() {