61 lines
1.3 KiB
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);
|
|
}
|
|
}
|