#include "save.h" #include #include #include "logic.h" #include "util.h" #define SAVEFILE "CHICKS" const uint8_t VERSION = 0; void gen_save_data(struct save_contents *save, const struct game_state *state) { save->lamp_on = state->lamp_on; save->last_time = state->time; save->start_time = state->start_time; save->lamp_switch_time = state->lamp_switch_time; } void load_save_data(const struct save_contents *save, struct game_state *state) { state->num_days = (save->last_time - save->start_time) / ONE_DAY; state->lamp_on = save->lamp_on; state->time = save->last_time; state->start_time = save->start_time; state->lamp_switch_time = save->lamp_switch_time; for(uint8_t i = 0; i < NUM_CHICKS; i++) { init_chick(&state->chicks[i]); } } bool save(const struct save_contents *save) { ti_var_t f = ti_Open(SAVEFILE, "w"); if(!f) { dbg_printf("Failed to open save file for writing\n"); return false; } ti_Write(&VERSION, sizeof VERSION, 1, f); ti_Write(save, sizeof *save, 1, f); ti_Close(f); // todo: security stuff return true; } bool load_save(struct save_contents *save) { ti_var_t f = ti_Open(SAVEFILE, "r"); if(!f) { dbg_printf("Failed to open save file for reading\n"); goto error; } uint8_t version; ti_Read(&version, sizeof version, 1, f); if(version != VERSION) { dbg_printf("Version mismatch: file has %u instead of %u\n", version, VERSION); goto error; } uint24_t size = ti_Read(save, sizeof *save, 1, f); ti_Close(f); ti_Delete(SAVEFILE); if(!size) { dbg_printf("Failed to read from save file\n"); goto error; } // todo: security stuff return true; error: get_default_save(save); return true; } void get_default_save(struct save_contents *save) { dbg_printf("Generating new default savefile\n"); save->start_time = time(NULL); save->last_time = save->start_time; save->lamp_switch_time = save->start_time; save->lamp_on = lamp_should_be_on(save->last_time); }