Add versioned save slot/settings schemas with strict version checks

Splits saveslot_t/savesettings_t into a stable, version-independent
in-memory struct (save/slot/, save/settings/) and a separate frozen
per-schema-version struct (saveslotver1_t/savesettingsver1_t) used only
for JSON serialization, converted between manually. Every write now
stamps a "version" field (SAVE_SLOT_CURRENT/SAVE_SETTINGS_CURRENT), and
every read requires it to match exactly, rejecting anything else -
laying the groundwork for a real migration path instead of silently
misreading old/incompatible save data.
This commit is contained in:
2026-09-08 12:49:06 -05:00
parent 327c2bec70
commit 8139a0ea54
28 changed files with 634 additions and 115 deletions
+4 -4
View File
@@ -8,8 +8,8 @@
#include "dusktest.h"
#include "savetestfixture.h"
#include "save/savedevice.h"
#include "save/saveslot.h"
#include "save/savesettings.h"
#include "save/slot/saveslot.h"
#include "save/settings/savesettings.h"
#include "util/memory.h"
#include "util/string.h"
@@ -224,7 +224,7 @@ static void test_saveDeviceSettings_dispatchesToPlatform(void **state) {
savesettings_t written;
saveSettingsInit(&written);
written.someSetting = 88;
written.audioMasterVolume = 0.25f;// exactly representable, safe to compare
errorret_t writeRet = saveDeviceSettingsWrite(&device, &written);
assert_true(errorIsOk(writeRet));
@@ -234,7 +234,7 @@ static void test_saveDeviceSettings_dispatchesToPlatform(void **state) {
errorret_t readRet = saveDeviceSettingsRead(&device, &read);
assert_true(errorIsOk(readRet));
assert_int_equal(read.someSetting, 88);
assert_true(read.audioMasterVolume == 0.25f);
}
// ============================================================