Persist level completion

Changelog:
- Set and save level completion on hitting the exit
- Load level completion on program start
main
En Yi 2025-09-03 21:29:27 +08:00
parent 9ebacbc572
commit 3098926e21
6 changed files with 27 additions and 6 deletions

1
.gitignore vendored
View File

@ -5,3 +5,4 @@ web/
compile_commands.json compile_commands.json
.gdb_history .gdb_history
heaptrack.* heaptrack.*
save.dat

2
main.c
View File

@ -4,6 +4,7 @@
#include "ent_impl.h" #include "ent_impl.h"
#include "mempool.h" #include "mempool.h"
#include "constants.h" #include "constants.h"
#include "save_data.h"
#include <stdio.h> #include <stdio.h>
#include <math.h> #include <math.h>
#define N_SCENES 4 #define N_SCENES 4
@ -29,6 +30,7 @@ int main(void)
SetConfigFlags(FLAG_WINDOW_RESIZABLE); SetConfigFlags(FLAG_WINDOW_RESIZABLE);
init_engine(&engine, (Vector2){screenWidth, screenHeight}); init_engine(&engine, (Vector2){screenWidth, screenHeight});
SetTargetFPS(60); // Set our game to run at 60 frames-per-second SetTargetFPS(60); // Set our game to run at 60 frames-per-second
load_savedata();
#ifndef NDEBUG #ifndef NDEBUG
load_from_infofile("res/assets.info.raw", &engine.assets); load_from_infofile("res/assets.info.raw", &engine.assets);
init_player_creation("res/player_spr.info", &engine.assets); init_player_creation("res/player_spr.info", &engine.assets);

View File

@ -531,7 +531,7 @@ static void at_level_start(Scene_t* scene)
static void at_level_complete(Scene_t* scene) static void at_level_complete(Scene_t* scene)
{ {
LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data); LevelSceneData_t* data = &(CONTAINER_OF(scene, LevelScene_t, scene)->data);
set_level_completed(data->current_level, true);
data->sm.fractional += scene->delta_time; data->sm.fractional += scene->delta_time;
if (data->sm.fractional > 1.0f) if (data->sm.fractional > 1.0f)
{ {

View File

@ -11,6 +11,8 @@
#include "EC.h" #include "EC.h"
#include "constants.h" #include "constants.h"
#include "save_data.h"
#include <stdio.h> #include <stdio.h>
#define CRITICAL_WATER_OVERLAP 0.4f #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); 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); change_level_state(&lvl_scene->data, LEVEL_STATE_COMPLETE);

View File

@ -1,5 +1,8 @@
#include "save_data.h" #include "save_data.h"
#include "constants.h" #include "constants.h"
#include "raylib.h"
#include <string.h>
// Bit flags for level completion. // Bit flags for level completion.
// Expect 30 levels. // Expect 30 levels.
@ -9,14 +12,24 @@
#define NUMBER_OF_BYTES 4 #define NUMBER_OF_BYTES 4
static uint8_t completion_flags[NUMBER_OF_BYTES] = {0}; 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; 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) bool is_level_completed(uint32_t level_num)

View File

@ -15,8 +15,8 @@
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
int load_savedata(uint8_t* bytes, size_t len); int load_savedata();
int writeout_savedata(uint8_t* bytes, size_t len); int writeout_savedata();
bool is_level_completed(uint32_t level_num); bool is_level_completed(uint32_t level_num);
void set_level_completed(uint32_t level_num, bool complete); void set_level_completed(uint32_t level_num, bool complete);