diff --git a/consts/game_records.json b/consts/game_records.json new file mode 100644 index 0000000000..422d6387f9 --- /dev/null +++ b/consts/game_records.json @@ -0,0 +1,158 @@ +{ + "definitions": { + "@GameRecord": { + "type": "enum", + "values": [ + "RECORD_UNK_000", + "RECORD_UNK_001", + "RECORD_UNK_002", + "RECORD_UNK_003", + "RECORD_UNK_004", + "RECORD_UNK_005", + "RECORD_UNK_006", + "RECORD_UNK_007", + "RECORD_UNK_008", + "RECORD_UNK_009", + "RECORD_UNK_010", + "RECORD_UNK_011", + "RECORD_UNK_012", + "RECORD_UNK_013", + "RECORD_UNK_014", + "RECORD_UNK_015", + "RECORD_UNK_016", + "RECORD_UNK_017", + "RECORD_UNK_018", + "RECORD_UNK_019", + "RECORD_UNK_020", + "RECORD_UNK_021", + "RECORD_UNK_022", + "RECORD_UNK_023", + "RECORD_UNK_024", + "RECORD_UNK_025", + "RECORD_UNK_026", + "RECORD_UNK_027", + "RECORD_UNK_028", + "RECORD_UNK_029", + "RECORD_UNK_030", + "RECORD_UNK_031", + "RECORD_UNK_032", + "RECORD_UNK_033", + "RECORD_UNK_034", + "RECORD_UNK_035", + "RECORD_UNK_036", + "RECORD_UNK_037", + "RECORD_UNK_038", + "RECORD_UNK_039", + "RECORD_UNK_040", + "RECORD_UNK_041", + "RECORD_UNK_042", + "RECORD_UNK_043", + "RECORD_UNK_044", + "RECORD_UNK_045", + "RECORD_UNK_046", + "RECORD_UNK_047", + "RECORD_UNK_048", + "RECORD_UNK_049", + "RECORD_UNK_050", + "RECORD_UNK_051", + "RECORD_UNK_052", + "RECORD_UNK_053", + "RECORD_UNK_054", + "RECORD_UNK_055", + "RECORD_UNK_056", + "RECORD_UNK_057", + "RECORD_UNK_058", + "RECORD_UNK_059", + "RECORD_UNK_060", + "RECORD_UNK_061", + "RECORD_UNK_062", + "RECORD_UNK_063", + "RECORD_UNK_064", + "RECORD_UNK_065", + "RECORD_UNK_066", + "RECORD_UNK_067", + "RECORD_UNK_068", + "RECORD_UNK_069", + "RECORD_UNK_070", + "RECORD_UNK_071", + "RECORD_UNK_072", + "RECORD_UNK_073", + "RECORD_UNK_074", + "RECORD_UNK_075", + "RECORD_UNK_076", + "RECORD_UNK_077", + "RECORD_UNK_078", + "RECORD_UNK_079", + "RECORD_UNK_080", + "RECORD_UNK_081", + "RECORD_UNK_082", + "RECORD_UNK_083", + "RECORD_UNK_084", + "RECORD_UNK_085", + "RECORD_UNK_086", + "RECORD_UNK_087", + "RECORD_UNK_088", + "RECORD_UNK_089", + "RECORD_UNK_090", + "RECORD_UNK_091", + "RECORD_UNK_092", + "RECORD_UNK_093", + "RECORD_UNK_094", + "RECORD_UNK_095", + "RECORD_UNK_096", + "RECORD_UNK_097", + "RECORD_UNK_098", + "RECORD_UNK_099", + "RECORD_UNK_100", + "RECORD_UNK_101", + "RECORD_UNK_102", + "RECORD_UNK_103", + "RECORD_UNK_104", + "RECORD_UNK_105", + "RECORD_UNK_106", + "RECORD_UNK_107", + "RECORD_UNK_108", + "RECORD_UNK_109", + "RECORD_UNK_110", + "RECORD_UNK_111", + "RECORD_UNK_112", + "RECORD_UNK_113", + "RECORD_UNK_114", + "RECORD_UNK_115", + "RECORD_UNK_116", + "RECORD_UNK_117", + "RECORD_UNK_118", + "RECORD_UNK_119", + "RECORD_UNK_120", + "RECORD_UNK_121", + "RECORD_UNK_122", + "RECORD_UNK_123", + "RECORD_UNK_124", + "RECORD_UNK_125", + "RECORD_UNK_126", + "RECORD_UNK_127", + "RECORD_UNK_128", + "RECORD_UNK_129", + "RECORD_UNK_130", + "RECORD_UNK_131", + "RECORD_UNK_132", + "RECORD_UNK_133", + "RECORD_UNK_134", + "RECORD_UNK_135", + "RECORD_UNK_136", + "RECORD_UNK_137", + "RECORD_UNK_138", + "RECORD_UNK_139", + "RECORD_UNK_140", + "RECORD_UNK_141", + "RECORD_UNK_142", + "RECORD_UNK_143", + "RECORD_UNK_144", + "RECORD_UNK_145", + "RECORD_UNK_146", + "RECORD_UNK_147", + "RECORD_UNK_148" + ] + } + } +} diff --git a/consts/meson.build b/consts/meson.build index 1187b5eea8..aabbaaf5fb 100644 --- a/consts/meson.build +++ b/consts/meson.build @@ -3,6 +3,7 @@ consts_manifest_basenames = [ 'battle', 'battle_subscripts', 'btlcmd', + 'game_records', 'gender', 'items', 'map', diff --git a/src/game_records.c b/src/game_records.c index d962281159..a97715adf7 100644 --- a/src/game_records.c +++ b/src/game_records.c @@ -1,6 +1,8 @@ #include #include +#include "consts/game_records.h" + #include "struct_decls/pokedexdata_decl.h" #include "unk_0201D15C.h" @@ -8,8 +10,11 @@ #include "unk_0202631C.h" #include "game_records.h" -static void sub_0202CD94(GameRecords * param0, int param1); -static void sub_0202CDC0(GameRecords * param0, int param1); +#define START_ENCODED_RECORDS RECORD_UNK_001 +#define SIZE_ENCODED_RECORDS (sizeof(GameRecords) - sizeof(EncodingSeed) - (START_ENCODED_RECORDS * sizeof(u32))) + +static void EncodeGameRecords(GameRecords *records, int id); +static void DecodeGameRecords(GameRecords *records, int id); int GameRecords_SaveSize(void) { @@ -21,7 +26,7 @@ void GameRecords_Init(GameRecords *records) MI_CpuClear32(records, sizeof(GameRecords)); records->seed.modifier = OS_GetVBlankCount() | (OS_GetVBlankCount() << 8); - sub_0202CD94(records, 1); + EncodeGameRecords(records, START_ENCODED_RECORDS); } GameRecords *SaveData_GetGameRecordsPtr(SaveData *savedata) @@ -29,23 +34,29 @@ GameRecords *SaveData_GetGameRecordsPtr(SaveData *savedata) return SaveData_SaveTable(savedata, SAVE_TABLE_ENTRY_GAME_RECORDS); } -static void sub_0202CD94 (GameRecords * records, int param1) +// this inline does not match when operating on the substruct +static inline u32 HashEncodingSeed(GameRecords *records) { - if (param1 == (0 + 0)) { - return; - } - - records->seed.byteSum = SumBytes(&records->recordsU32[1], sizeof(GameRecords) - sizeof(EncodingSeed) - sizeof(u32)) & 0xffff; - EncodeData(&records->recordsU32[1], sizeof(GameRecords) - sizeof(EncodingSeed) - sizeof(u32), records->seed.byteSum + (records->seed.modifier << 16)); + return records->seed.byteSum + (records->seed.modifier << 16); } -static void sub_0202CDC0 (GameRecords * records, int param1) +static void EncodeGameRecords(GameRecords *records, int id) { - if (param1 == (0 + 0)) { + if (id == RECORD_UNK_000) { return; } - DecodeData(&records->recordsU32[1], sizeof(GameRecords) - sizeof(EncodingSeed) - sizeof(u32), records->seed.byteSum + (records->seed.modifier << 16)); + records->seed.byteSum = SumBytes(&records->recordsU32[START_ENCODED_RECORDS], SIZE_ENCODED_RECORDS) & 0xFFFF; + EncodeData(&records->recordsU32[START_ENCODED_RECORDS], SIZE_ENCODED_RECORDS, HashEncodingSeed(records)); +} + +static void DecodeGameRecords(GameRecords *records, int id) +{ + if (id == RECORD_UNK_000) { + return; + } + + DecodeData(&records->recordsU32[START_ENCODED_RECORDS], SIZE_ENCODED_RECORDS, HashEncodingSeed(records)); } static u32 sub_0202CDE0 (const GameRecords * records, int param1) @@ -279,7 +290,7 @@ u32 sub_0202CE90 (GameRecords * records, int param1, u32 param2) u32 v0 = sub_0202CE3C(param1); u32 v1; - sub_0202CDC0(records, param1); + DecodeGameRecords(records, param1); if (param2 < v0) { v1 = sub_0202CE08(records, param1, param2); @@ -287,7 +298,7 @@ u32 sub_0202CE90 (GameRecords * records, int param1, u32 param2) v1 = sub_0202CE08(records, param1, v0); } - sub_0202CD94(records, param1); + EncodeGameRecords(records, param1); return v1; } @@ -298,7 +309,7 @@ u32 sub_0202CED0 (GameRecords * records, int param1, u32 param2) u32 v1; u32 v2; - sub_0202CDC0(records, param1); + DecodeGameRecords(records, param1); v1 = sub_0202CDE0(records, param1); v2 = v1; @@ -315,7 +326,7 @@ u32 sub_0202CED0 (GameRecords * records, int param1, u32 param2) } } - sub_0202CD94(records, param1); + EncodeGameRecords(records, param1); return v2; } @@ -326,7 +337,7 @@ u32 sub_0202CF28 (GameRecords * records, int param1) u32 v1; u32 v2; - sub_0202CDC0(records, param1); + DecodeGameRecords(records, param1); v1 = sub_0202CDE0(records, param1); @@ -336,7 +347,7 @@ u32 sub_0202CF28 (GameRecords * records, int param1) v2 = sub_0202CE08(records, param1, v0); } - sub_0202CD94(records, param1); + EncodeGameRecords(records, param1); return v2; } @@ -347,7 +358,7 @@ u32 sub_0202CF70 (GameRecords * records, int param1, u32 param2) u32 v1; u32 v2; - sub_0202CDC0(records, param1); + DecodeGameRecords(records, param1); v1 = sub_0202CDE0(records, param1); @@ -357,7 +368,7 @@ u32 sub_0202CF70 (GameRecords * records, int param1, u32 param2) v2 = sub_0202CE08(records, param1, v0); } - sub_0202CD94(records, param1); + EncodeGameRecords(records, param1); return v2; } @@ -367,9 +378,9 @@ u32 sub_0202CFB8 (GameRecords * records, int param1) u32 v0 = sub_0202CE3C(param1); u32 v1; - sub_0202CDC0(records, param1); + DecodeGameRecords(records, param1); v1 = sub_0202CDE0(records, param1); - sub_0202CD94(records, param1); + EncodeGameRecords(records, param1); if (v1 > v0) { return v0;