HATPC/scenes/save_data.c

61 lines
1.3 KiB
C

#include "save_data.h"
#include "constants.h"
#include "raylib.h"
#include <string.h>
// Bit flags for level completion.
// Expect 30 levels.
// Could use a 32bit integer though.
// Using array to allow arbitrary length of flags.
#define NUMBER_OF_BYTES 4
static uint8_t completion_flags[NUMBER_OF_BYTES] = {0};
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()
{
return SaveFileData(SAVE_FILE_NAME, completion_flags, NUMBER_OF_BYTES)? 0 : 1;
}
bool is_level_completed(uint32_t level_num)
{
// 0-indexed
uint32_t byte_num = level_num >> 3;
if (byte_num >= NUMBER_OF_BYTES) return false;
uint32_t bit_num = level_num % 8;
return ((completion_flags[byte_num] >> bit_num) & 1) > 0;
}
void set_level_completed(uint32_t level_num, bool complete)
{
uint32_t byte_num = level_num >> 3;
if (byte_num >= NUMBER_OF_BYTES) return;
uint32_t bit_num = level_num % 8;
if (complete)
{
completion_flags[byte_num] |= (1 <<bit_num);
}
else
{
completion_flags[byte_num] &= ~(1 << bit_num);
}
}