mirror of
https://github.com/HarbourMasters/Starship
synced 2026-06-30 12:01:57 -04:00
184 lines
6.2 KiB
C
184 lines
6.2 KiB
C
#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;
|
||
}
|
||
}
|