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
.gdb_history
heaptrack.*
save.dat

2
main.c
View File

@ -4,6 +4,7 @@
#include "ent_impl.h"
#include "mempool.h"
#include "constants.h"
#include "save_data.h"
#include <stdio.h>
#include <math.h>
#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);

View File

@ -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)
{

View File

@ -11,6 +11,8 @@
#include "EC.h"
#include "constants.h"
#include "save_data.h"
#include <stdio.h>
#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);

View File

@ -1,5 +1,8 @@
#include "save_data.h"
#include "constants.h"
#include "raylib.h"
#include <string.h>
// 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)

View File

@ -15,8 +15,8 @@
#include <stdint.h>
#include <stdbool.h>
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);