Files
Starship/src/engine/fox_save.c
T
2024-12-24 23:25:42 -06:00

184 lines
6.2 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "global.h"
SaveFile gSaveFile;
// clang-format off
Save gDefaultSave = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // PlanetData
0x01, 0x02, 0x03, 0x04, // pad10
SOUNDMODE_STEREO,
99, // musicVolume
99, // voiceVolume
99, // sfxVolume
// rankNameEntry
'F', 'O', 'X',
'P', 'E', 'P',
'S', 'L', 'P',
'F', 'A', 'L',
'W', 'L', 'F',
'L', 'O', 'N',
'P', 'I', 'G',
'A', 'N', 'R',
'B', 'I', 'L',
'K', 'A', 'T',
// rankingRoute
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
// rankingLives
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// rankingMedal
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
// stats
PLANET_STATS(100, PLANET_CORNERIA, false, false, false),
PLANET_STATS(9, PLANET_SECTOR_Y, true, true, true),
PLANET_STATS(9, PLANET_AQUAS, true, true, true),
PLANET_STATS(9, PLANET_ZONESS, true, true, true),
PLANET_STATS(9, PLANET_SECTOR_Z, true, true, true),
PLANET_STATS(9, PLANET_AREA_6, true, true, true),
PLANET_STATS(9, SAVE_SLOT_VENOM_2, true, true, true),
PLANET_STATS(90, PLANET_CORNERIA, false, false, false),
PLANET_STATS(9, PLANET_SECTOR_Y, true, false, false),
PLANET_STATS(9, PLANET_KATINA, true, false, false),
PLANET_STATS(9, PLANET_VENOM, true, false, false),
PLANET_STATS(9, PLANET_MACBETH, true, false, false),
PLANET_STATS(9, PLANET_AREA_6, true, false, false),
PLANET_STATS(9, SAVE_SLOT_VENOM_2, true, false, false),
PLANET_STATS(80, PLANET_CORNERIA, false, false, false),
PLANET_STATS(9, PLANET_METEO, false, true, false),
PLANET_STATS(9, PLANET_FORTUNA, false, true, false),
PLANET_STATS(9, PLANET_SECTOR_X, false, true, false),
PLANET_STATS(9, PLANET_TITANIA, false, true, false),
PLANET_STATS(9, PLANET_BOLSE, false, true, false),
PLANET_STATS(9, SAVE_SLOT_VENOM_1, false, true, false),
PLANET_STATS(70, PLANET_CORNERIA, false, false, false),
PLANET_STATS(9, PLANET_METEO, false, false, true),
PLANET_STATS(9, PLANET_FORTUNA, false, false, true),
PLANET_STATS(9, PLANET_SECTOR_X, false, false, true),
PLANET_STATS(9, PLANET_TITANIA, false, false, true),
PLANET_STATS(9, PLANET_BOLSE, false, false, true),
PLANET_STATS(9, SAVE_SLOT_VENOM_1, false, false, true),
PLANET_STATS(60, PLANET_CORNERIA, false, false, false),
PLANET_STATS(9, PLANET_METEO, true, false, true),
PLANET_STATS(9, PLANET_FORTUNA, true, false, true),
PLANET_STATS(9, PLANET_SECTOR_X, true, false, true),
PLANET_STATS(9, PLANET_TITANIA, true, false, true),
PLANET_STATS(9, PLANET_BOLSE, true, false, true),
PLANET_STATS(9, SAVE_SLOT_VENOM_1, true, false, true),
PLANET_STATS(50, PLANET_CORNERIA, false, false, false),
PLANET_STATS(4, PLANET_METEO, false, true, true),
PLANET_STATS(9, PLANET_FORTUNA, false, true, true),
PLANET_STATS(9, PLANET_SECTOR_X, false, true, true),
PLANET_STATS(9, PLANET_TITANIA, false, true, true),
PLANET_STATS(9, PLANET_BOLSE, false, true, true),
PLANET_STATS(9, SAVE_SLOT_VENOM_1, false, true, true),
PLANET_STATS(40, PLANET_CORNERIA, false, false, false),
PLANET_STATS(1, PLANET_METEO, true, true, false),
PLANET_STATS(2, PLANET_FORTUNA, true, true, false),
PLANET_STATS(9, PLANET_SECTOR_X, true, true, false),
PLANET_STATS(9, PLANET_TITANIA, true, true, false),
PLANET_STATS(9, PLANET_BOLSE, true, true, false),
PLANET_STATS(9, SAVE_SLOT_VENOM_1, true, true, false),
PLANET_STATS(30, PLANET_CORNERIA, false, false, false),
PLANET_STATS(1, PLANET_METEO, false, true, false),
PLANET_STATS(1, PLANET_FORTUNA, true, false, false),
PLANET_STATS(1, PLANET_SECTOR_X, true, true, true),
PLANET_STATS(8, PLANET_TITANIA, true, false, true),
PLANET_STATS(9, PLANET_BOLSE, false, true, true),
PLANET_STATS(9, SAVE_SLOT_VENOM_1, true, true, false),
PLANET_STATS(20, PLANET_CORNERIA, false, false, false),
PLANET_STATS(1, PLANET_METEO, false, true, true),
PLANET_STATS(1, PLANET_FORTUNA, true, false, true),
PLANET_STATS(1, PLANET_SECTOR_X, true, true, true),
PLANET_STATS(1, PLANET_TITANIA, true, false, false),
PLANET_STATS(6, PLANET_BOLSE, false, true, false),
PLANET_STATS(9, SAVE_SLOT_VENOM_1, false, false, true),
PLANET_STATS(10, PLANET_CORNERIA, false, false, false),
PLANET_STATS(1, PLANET_METEO, true, true, true),
PLANET_STATS(1, PLANET_FORTUNA, true, false, false),
PLANET_STATS(1, PLANET_SECTOR_X, true, false, false),
PLANET_STATS(1, PLANET_TITANIA, false, true, false),
PLANET_STATS(1, PLANET_BOLSE, false, false, true),
PLANET_STATS(4, SAVE_SLOT_VENOM_1, true, false, true),
// unk_EA
0xFF,
// padding
0x09, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
};
// clang-format on
u16 Save_Checksum(Save* arg0) {
u16 var_v1;
s32 i;
for (i = 0, var_v1 = 0; i < sizeof(SaveData); i++) {
var_v1 ^= arg0->raw[i];
var_v1 <<= 1;
var_v1 = (var_v1 & 0xFE) | ((var_v1 >> 8) & 1);
}
var_v1 = (var_v1 & 0xFF) | 0x9500;
return var_v1;
}
s32 Save_Write(void) {
OSMesg sp1C;
gSaveFile.save.checksum = Save_Checksum(&gSaveFile.save);
gSaveFile.backup = gSaveFile.save;
gSaveIOBuffer = gSaveFile;
return Save_WriteData();
}
s32 Save_Read(void) {
OSMesg* sp24;
s32 i;
//if(!Save_ReadData()) {
// return 0;
//}
Save_ReadData();
gSaveFile = gSaveIOBuffer;
if (gSaveFile.save.checksum == Save_Checksum(&gSaveFile.save)) {
PRINTF("EEPROM ROM[0] 正常\n");
return 0;
}
#ifdef AVOID_UB
for (i = 0; i < sizeof(SaveData); i++) {
#else
for (i = 0; i <= sizeof(SaveData); i++) { // should be <, but gets overwritten immediately.
#endif
gSaveFile.save.raw[i] = gSaveFile.backup.raw[i];
}
gSaveFile.save.checksum = gSaveFile.backup.checksum;
if (gSaveFile.save.checksum == Save_Checksum(&gSaveFile.save)) {
PRINTF("EEPROM ROM[1 正常\n");
return 0;
} else {
PRINTF("EEPROM ROM[0] & ROM[1] 異常\n");
return -1;
}
}