From 3098926e2193b98ee65ca6be6f37c8997662d462 Mon Sep 17 00:00:00 2001 From: En Yi Date: Wed, 3 Sep 2025 21:29:27 +0800 Subject: [PATCH] Persist level completion Changelog: - Set and save level completion on hitting the exit - Load level completion on program start --- .gitignore | 1 + main.c | 2 ++ scenes/game_scene.c | 2 +- scenes/game_systems.c | 5 +++++ scenes/save_data.c | 19 ++++++++++++++++--- scenes/save_data.h | 4 ++-- 6 files changed, 27 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 139c170..26110c9 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ web/ compile_commands.json .gdb_history heaptrack.* +save.dat diff --git a/main.c b/main.c index 8091b22..c2f5ee8 100644 --- a/main.c +++ b/main.c @@ -4,6 +4,7 @@ #include "ent_impl.h" #include "mempool.h" #include "constants.h" +#include "save_data.h" #include #include #define N_SCENES 4 @@ -29,6 +30,7 @@ int main(void) SetConfigFlags(FLAG_WINDOW_RESIZABLE); init_engine(&engine, (Vector2){screenWidth, screenHeight}); SetTargetFPS(60); // Set our game to run at 60 frames-per-second + load_savedata(); #ifndef NDEBUG load_from_infofile("res/assets.info.raw", &engine.assets); init_player_creation("res/player_spr.info", &engine.assets); diff --git a/scenes/game_scene.c b/scenes/game_scene.c index ee1035a..a8c793e 100644 --- a/scenes/game_scene.c +++ b/scenes/game_scene.c @@ -531,7 +531,7 @@ static void at_level_start(Scene_t* scene) static void at_level_complete(Scene_t* scene) { LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data); - set_level_completed(data->current_level, true); + data->sm.fractional += scene->delta_time; if (data->sm.fractional > 1.0f) { diff --git a/scenes/game_systems.c b/scenes/game_systems.c index 05599c7..353f9a1 100644 --- a/scenes/game_systems.c +++ b/scenes/game_systems.c @@ -11,6 +11,8 @@ #include "EC.h" #include "constants.h" + +#include "save_data.h" #include #define CRITICAL_WATER_OVERLAP 0.4f @@ -2157,6 +2159,9 @@ void level_end_detection_system(Scene_t* scene) } destroy_entity(scene, &lvl_scene->data.tilemap, p_other_ent); + + set_level_completed(lvl_scene->data.current_level, true); + writeout_savedata(); change_level_state(&lvl_scene->data, LEVEL_STATE_COMPLETE); diff --git a/scenes/save_data.c b/scenes/save_data.c index a65fbd7..e8e87bb 100644 --- a/scenes/save_data.c +++ b/scenes/save_data.c @@ -1,5 +1,8 @@ #include "save_data.h" #include "constants.h" +#include "raylib.h" + +#include // Bit flags for level completion. // Expect 30 levels. @@ -9,14 +12,24 @@ #define NUMBER_OF_BYTES 4 static uint8_t completion_flags[NUMBER_OF_BYTES] = {0}; -int load_savedata(uint8_t* bytes, size_t len) +int load_savedata() { + int len = 0; + unsigned char* data = LoadFileData(SAVE_FILE_NAME, &len); + if (data != NULL) + { + if (len == NUMBER_OF_BYTES) + { + memcpy(completion_flags, data, NUMBER_OF_BYTES); + } + UnloadFileData(data); + } return 0; } -int writeout_savedata(uint8_t* bytes, size_t len) +int writeout_savedata() { - return 0; + return SaveFileData(SAVE_FILE_NAME, completion_flags, NUMBER_OF_BYTES)? 0 : 1; } bool is_level_completed(uint32_t level_num) diff --git a/scenes/save_data.h b/scenes/save_data.h index 6c07285..5d1d270 100644 --- a/scenes/save_data.h +++ b/scenes/save_data.h @@ -15,8 +15,8 @@ #include #include -int load_savedata(uint8_t* bytes, size_t len); -int writeout_savedata(uint8_t* bytes, size_t len); +int load_savedata(); +int writeout_savedata(); bool is_level_completed(uint32_t level_num); void set_level_completed(uint32_t level_num, bool complete);