From 058765e4f6ea64d408dd0ca8c01aab06e1831c42 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Sun, 6 Feb 2022 20:53:30 -0600 Subject: [PATCH] better quick save / load scene functionality --- run_tree/scenes/quick_save.scene | 105 +++++++++++++++++++++++++++++++ src/entity/manager.onyx | 3 + src/entity/store.onyx | 26 ++++++++ src/main.onyx | 11 ++-- 4 files changed, 140 insertions(+), 5 deletions(-) create mode 100644 run_tree/scenes/quick_save.scene diff --git a/run_tree/scenes/quick_save.scene b/run_tree/scenes/quick_save.scene new file mode 100644 index 0000000..80b9324 --- /dev/null +++ b/run_tree/scenes/quick_save.scene @@ -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 + diff --git a/src/entity/manager.onyx b/src/entity/manager.onyx index b18c077..1d10e62 100644 --- a/src/entity/manager.onyx +++ b/src/entity/manager.onyx @@ -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 { diff --git a/src/entity/store.onyx b/src/entity/store.onyx index bc3293c..54c0b3e 100644 --- a/src/entity/store.onyx +++ b/src/entity/store.onyx @@ -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}; } } diff --git a/src/main.onyx b/src/main.onyx index aed6668..d09836a 100644 --- a/src/main.onyx +++ b/src/main.onyx @@ -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() { -- 2.25.1