diff options
-rw-r--r-- | arm9/arm9.lsf | 2 | ||||
-rw-r--r-- | arm9/asm/scrcmd.s | 4 | ||||
-rw-r--r-- | arm9/asm/unk_02022504.s | 8 | ||||
-rw-r--r-- | arm9/asm/unk_0202B034.s | 425 | ||||
-rw-r--r-- | arm9/asm/unk_020377F0.s | 2 | ||||
-rw-r--r-- | arm9/asm/unk_020484A8.s | 8 | ||||
-rw-r--r-- | arm9/global.inc | 20 | ||||
-rw-r--r-- | arm9/modules/70/asm/module_70.s | 10 | ||||
-rw-r--r-- | arm9/src/hall_of_fame.c | 147 | ||||
-rw-r--r-- | arm9/src/save_arrays.c | 8 | ||||
-rw-r--r-- | include/hall_of_fame.h | 55 |
11 files changed, 232 insertions, 457 deletions
diff --git a/arm9/arm9.lsf b/arm9/arm9.lsf index 7aee5d0d..ed8eb7ed 100644 --- a/arm9/arm9.lsf +++ b/arm9/arm9.lsf @@ -113,7 +113,7 @@ Static arm9 Object unk_0202A924.o Object unk_0202ABBC.o Object unk_0202AC20.o - Object unk_0202B034.o + Object hall_of_fame.o Object unk_0202B374.o Object unk_0202B870.o Object unk_0202BE98.o diff --git a/arm9/asm/scrcmd.s b/arm9/asm/scrcmd.s index 1a4dcdcb..1cd62a91 100644 --- a/arm9/asm/scrcmd.s +++ b/arm9/asm/scrcmd.s @@ -11771,7 +11771,7 @@ FUN_0203F760: ; 0x0203F760 mov r1, #0x20 ldr r0, [r0, #0xc] add r2, sp, #0x0 - bl LoadSaveFile + bl LoadHallOfFame ldr r1, [sp, #0x0] add r4, r0, #0x0 cmp r1, #0x0 @@ -11785,7 +11785,7 @@ _0203F798: cmp r1, #0x1 bne _0203F7AE mov r1, #0x0 - bl FUN_0202B21C + bl Sav2_HOF_TranslateRecordIdx strh r0, [r5, #0x0] add r0, r4, #0x0 bl FreeToHeap diff --git a/arm9/asm/unk_02022504.s b/arm9/asm/unk_02022504.s index 7f851622..e3463538 100644 --- a/arm9/asm/unk_02022504.s +++ b/arm9/asm/unk_02022504.s @@ -35,16 +35,16 @@ FUN_02022528: ; 0x02022528 nop _02022530: .word SavArray_get - thumb_func_start LoadSaveFile -LoadSaveFile: ; 0x02022534 + thumb_func_start LoadHallOfFame +LoadHallOfFame: ; 0x02022534 push {r3, lr} add r3, r2, #0x0 mov r2, #0x0 bl ReadSaveFileFromFlash pop {r3, pc} - thumb_func_start SaveGame -SaveGame: ; 0x02022540 + thumb_func_start SaveHallOfFame +SaveHallOfFame: ; 0x02022540 ldr r3, _02022548 ; =WriteSaveFileToFlash add r2, r1, #0x0 mov r1, #0x0 diff --git a/arm9/asm/unk_0202B034.s b/arm9/asm/unk_0202B034.s deleted file mode 100644 index f6d8f57e..00000000 --- a/arm9/asm/unk_0202B034.s +++ /dev/null @@ -1,425 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - thumb_func_start FUN_0202B034 -FUN_0202B034: ; 0x0202B034 - ldr r0, _0202B038 ; =0x00002AB0 - bx lr - .balign 4 -_0202B038: .word 0x00002AB0 - - thumb_func_start FUN_0202B03C -FUN_0202B03C: ; 0x0202B03C - ldr r3, _0202B048 ; =MIi_CpuClear32 - add r1, r0, #0x0 - mov r0, #0x0 - ldr r2, _0202B04C ; =0x00002AB0 - bx r3 - nop -_0202B048: .word MIi_CpuClear32 -_0202B04C: .word 0x00002AB0 - - thumb_func_start FUN_0202B050 -FUN_0202B050: ; 0x0202B050 - push {r3-r7, lr} - sub sp, #0x18 - str r0, [sp, #0x0] - str r1, [sp, #0x4] - str r2, [sp, #0x8] - cmp r0, #0x0 - bne _0202B062 - bl ErrorHandling -_0202B062: - ldr r1, _0202B1E0 ; =0x00002AA8 - ldr r0, [sp, #0x0] - ldr r0, [r0, r1] - cmp r0, #0x1e - blo _0202B070 - bl ErrorHandling -_0202B070: - ldr r1, _0202B1E4 ; =0x00002AAC - ldr r0, [sp, #0x0] - ldr r2, [r0, r1] - ldr r0, _0202B1E8 ; =0x0000270F - cmp r2, r0 - blo _0202B07E - b _0202B1DC -_0202B07E: - ldr r0, [sp, #0x0] - sub r1, r1, #0x4 - ldr r1, [r0, r1] - mov r0, #0x5b - lsl r0, r0, #0x2 - add r2, r1, #0x0 - mul r2, r0 - ldr r0, [sp, #0x0] - add r0, r0, r2 - str r0, [sp, #0x14] - ldr r0, [sp, #0x4] - bl GetPartyCount - str r0, [sp, #0x10] - mov r0, #0xb - mov r1, #0x0 - bl String_ctor - mov r2, #0x5a - add r6, r0, #0x0 - ldr r1, [sp, #0x14] - mov r0, #0x0 - lsl r2, r2, #0x2 - bl MIi_CpuClear16 - ldr r0, [sp, #0x10] - mov r7, #0x0 - cmp r0, #0x0 - ble _0202B18E - ldr r5, [sp, #0x14] -_0202B0BA: - ldr r0, [sp, #0x4] - add r1, r7, #0x0 - bl GetPartyMonByIndex - add r4, r0, #0x0 - bl AcquireMonLock - str r0, [sp, #0xc] - add r0, r4, #0x0 - mov r1, #0x4c - mov r2, #0x0 - bl GetMonData - cmp r0, #0x0 - bne _0202B17E - add r0, r4, #0x0 - mov r1, #0x5 - mov r2, #0x0 - bl GetMonData - strh r0, [r5, #0x0] - add r0, r4, #0x0 - mov r1, #0xa0 - mov r2, #0x0 - bl GetMonData - strb r0, [r5, #0x2] - add r0, r4, #0x0 - mov r1, #0x70 - mov r2, #0x0 - bl GetMonData - mov r1, #0x0 - strb r0, [r5, #0x3] - add r0, r4, #0x0 - add r2, r1, #0x0 - bl GetMonData - str r0, [r5, #0x4] - add r0, r4, #0x0 - mov r1, #0x7 - mov r2, #0x0 - bl GetMonData - str r0, [r5, #0x8] - add r0, r4, #0x0 - mov r1, #0x36 - mov r2, #0x0 - bl GetMonData - strh r0, [r5, #0x32] - add r0, r4, #0x0 - mov r1, #0x37 - mov r2, #0x0 - bl GetMonData - strh r0, [r5, #0x34] - add r0, r4, #0x0 - mov r1, #0x38 - mov r2, #0x0 - bl GetMonData - strh r0, [r5, #0x36] - add r0, r4, #0x0 - mov r1, #0x39 - mov r2, #0x0 - bl GetMonData - strh r0, [r5, #0x38] - cmp r6, #0x0 - beq _0202B176 - add r0, r4, #0x0 - mov r1, #0x76 - add r2, r6, #0x0 - bl GetMonData - add r1, r5, #0x0 - add r0, r6, #0x0 - add r1, #0xc - mov r2, #0xb - bl CopyStringToU16Array - add r0, r4, #0x0 - mov r1, #0x90 - add r2, r6, #0x0 - bl GetMonData - add r1, r5, #0x0 - add r0, r6, #0x0 - add r1, #0x22 - mov r2, #0x8 - bl CopyStringToU16Array - b _0202B17C -_0202B176: - ldr r0, _0202B1EC ; =0x0000FFFF - strh r0, [r5, #0xc] - strh r0, [r5, #0x22] -_0202B17C: - add r5, #0x3c -_0202B17E: - ldr r1, [sp, #0xc] - add r0, r4, #0x0 - bl ReleaseMonLock - ldr r0, [sp, #0x10] - add r7, r7, #0x1 - cmp r7, r0 - blt _0202B0BA -_0202B18E: - ldr r0, [sp, #0x8] - mov r1, #0x5a - ldr r2, [r0, #0x0] - ldr r0, [sp, #0x14] - lsl r1, r1, #0x2 - strh r2, [r0, r1] - ldr r0, [sp, #0x8] - add r2, r1, #0x2 - ldr r3, [r0, #0x4] - ldr r0, [sp, #0x14] - add r1, r1, #0x3 - strb r3, [r0, r2] - ldr r0, [sp, #0x8] - ldr r2, [r0, #0x8] - ldr r0, [sp, #0x14] - strb r2, [r0, r1] - ldr r1, _0202B1E0 ; =0x00002AA8 - ldr r0, [sp, #0x0] - ldr r0, [r0, r1] - add r2, r0, #0x1 - ldr r0, [sp, #0x0] - str r2, [r0, r1] - ldr r0, [r0, r1] - cmp r0, #0x1e - blo _0202B1C6 - ldr r0, [sp, #0x0] - mov r2, #0x0 - str r2, [r0, r1] -_0202B1C6: - ldr r1, _0202B1E4 ; =0x00002AAC - ldr r0, [sp, #0x0] - ldr r0, [r0, r1] - add r2, r0, #0x1 - ldr r0, [sp, #0x0] - cmp r6, #0x0 - str r2, [r0, r1] - beq _0202B1DC - add r0, r6, #0x0 - bl String_dtor -_0202B1DC: - add sp, #0x18 - pop {r3-r7, pc} - .balign 4 -_0202B1E0: .word 0x00002AA8 -_0202B1E4: .word 0x00002AAC -_0202B1E8: .word 0x0000270F -_0202B1EC: .word 0x0000FFFF - - thumb_func_start FUN_0202B1F0 -FUN_0202B1F0: ; 0x0202B1F0 - push {r4, lr} - add r4, r0, #0x0 - bne _0202B1FA - bl ErrorHandling -_0202B1FA: - ldr r0, _0202B214 ; =0x00002AA8 - ldr r0, [r4, r0] - cmp r0, #0x1e - blo _0202B206 - bl ErrorHandling -_0202B206: - ldr r0, _0202B218 ; =0x00002AAC - ldr r0, [r4, r0] - cmp r0, #0x1e - blo _0202B210 - mov r0, #0x1e -_0202B210: - pop {r4, pc} - nop -_0202B214: .word 0x00002AA8 -_0202B218: .word 0x00002AAC - - thumb_func_start FUN_0202B21C -FUN_0202B21C: ; 0x0202B21C - push {r3-r5, lr} - add r5, r0, #0x0 - add r4, r1, #0x0 - cmp r5, #0x0 - bne _0202B22A - bl ErrorHandling -_0202B22A: - ldr r0, _0202B248 ; =0x00002AA8 - ldr r0, [r5, r0] - cmp r0, #0x1e - blo _0202B236 - bl ErrorHandling -_0202B236: - cmp r4, #0x1e - blt _0202B23E - bl ErrorHandling -_0202B23E: - ldr r0, _0202B24C ; =0x00002AAC - ldr r0, [r5, r0] - sub r0, r0, r4 - pop {r3-r5, pc} - nop -_0202B248: .word 0x00002AA8 -_0202B24C: .word 0x00002AAC - - thumb_func_start FUN_0202B250 -FUN_0202B250: ; 0x0202B250 - push {r3-r5, lr} - add r5, r0, #0x0 - add r4, r1, #0x0 - cmp r5, #0x0 - bne _0202B25E - bl ErrorHandling -_0202B25E: - ldr r0, _0202B298 ; =0x00002AA8 - ldr r0, [r5, r0] - cmp r0, #0x1e - blo _0202B26A - bl ErrorHandling -_0202B26A: - cmp r4, #0x1e - blt _0202B272 - bl ErrorHandling -_0202B272: - ldr r0, _0202B298 ; =0x00002AA8 - ldr r0, [r5, r0] - sub r0, r0, #0x1 - sub r2, r0, r4 - bpl _0202B27E - add r2, #0x1e -_0202B27E: - mov r1, #0x5b - lsl r1, r1, #0x2 - mul r1, r2 - mov r0, #0x0 - add r2, r5, r1 -_0202B288: - ldrh r1, [r2, #0x0] - cmp r1, #0x0 - beq _0202B296 - add r0, r0, #0x1 - add r2, #0x3c - cmp r0, #0x6 - blo _0202B288 -_0202B296: - pop {r3-r5, pc} - .balign 4 -_0202B298: .word 0x00002AA8 - - thumb_func_start FUN_0202B29C -FUN_0202B29C: ; 0x0202B29C - push {r3-r7, lr} - add r5, r0, #0x0 - add r6, r1, #0x0 - add r7, r2, #0x0 - add r4, r3, #0x0 - cmp r5, #0x0 - bne _0202B2AE - bl ErrorHandling -_0202B2AE: - ldr r0, _0202B318 ; =0x00002AA8 - ldr r0, [r5, r0] - cmp r0, #0x1e - blo _0202B2BA - bl ErrorHandling -_0202B2BA: - cmp r6, #0x1e - blt _0202B2C2 - bl ErrorHandling -_0202B2C2: - ldr r0, _0202B318 ; =0x00002AA8 - ldr r0, [r5, r0] - sub r0, r0, #0x1 - sub r1, r0, r6 - bpl _0202B2CE - add r1, #0x1e -_0202B2CE: - mov r0, #0x5b - lsl r0, r0, #0x2 - mul r0, r1 - add r1, r5, r0 - mov r0, #0x3c - mul r0, r7 - add r5, r1, r0 - ldrh r0, [r1, r0] - add r1, r5, #0x0 - add r1, #0xc - strh r0, [r4, #0x10] - ldrb r0, [r5, #0x2] - strb r0, [r4, #0x12] - ldr r0, [r5, #0x4] - str r0, [r4, #0x8] - ldr r0, [r5, #0x8] - str r0, [r4, #0xc] - ldrb r0, [r5, #0x3] - strb r0, [r4, #0x13] - ldr r0, [r4, #0x0] - bl CopyU16ArrayToString - add r1, r5, #0x0 - ldr r0, [r4, #0x4] - add r1, #0x22 - bl CopyU16ArrayToString - mov r1, #0x0 -_0202B306: - ldrh r0, [r5, #0x32] - add r1, r1, #0x1 - add r5, r5, #0x2 - strh r0, [r4, #0x14] - add r4, r4, #0x2 - cmp r1, #0x4 - blt _0202B306 - pop {r3-r7, pc} - nop -_0202B318: .word 0x00002AA8 - - thumb_func_start FUN_0202B31C -FUN_0202B31C: ; 0x0202B31C - push {r4-r6, lr} - add r5, r0, #0x0 - add r6, r1, #0x0 - add r4, r2, #0x0 - cmp r5, #0x0 - bne _0202B32C - bl ErrorHandling -_0202B32C: - ldr r0, _0202B370 ; =0x00002AA8 - ldr r0, [r5, r0] - cmp r0, #0x1e - blo _0202B338 - bl ErrorHandling -_0202B338: - cmp r6, #0x1e - blt _0202B340 - bl ErrorHandling -_0202B340: - ldr r0, _0202B370 ; =0x00002AA8 - ldr r0, [r5, r0] - sub r0, r0, #0x1 - sub r2, r0, r6 - bpl _0202B34C - add r2, #0x1e -_0202B34C: - mov r0, #0x5b - lsl r0, r0, #0x2 - add r1, r2, #0x0 - mul r1, r0 - add r2, r5, r1 - sub r1, r0, #0x4 - ldrh r1, [r2, r1] - str r1, [r4, #0x0] - sub r1, r0, #0x2 - ldrb r1, [r2, r1] - sub r0, r0, #0x1 - str r1, [r4, #0x4] - ldrb r0, [r2, r0] - str r0, [r4, #0x8] - mov r0, #0x0 - str r0, [r4, #0xc] - pop {r4-r6, pc} - nop -_0202B370: .word 0x00002AA8 diff --git a/arm9/asm/unk_020377F0.s b/arm9/asm/unk_020377F0.s index 2a9321f1..9cd03e77 100644 --- a/arm9/asm/unk_020377F0.s +++ b/arm9/asm/unk_020377F0.s @@ -2253,7 +2253,7 @@ FUN_02038824: ; 0x02038824 ldr r0, [r5, #0xc] mov r1, #0xb add r2, sp, #0x0 - bl LoadSaveFile + bl LoadHallOfFame ldr r1, [sp, #0x0] add r4, r0, #0x0 cmp r1, #0x2 diff --git a/arm9/asm/unk_020484A8.s b/arm9/asm/unk_020484A8.s index a50964b1..81c79a9a 100644 --- a/arm9/asm/unk_020484A8.s +++ b/arm9/asm/unk_020484A8.s @@ -29,7 +29,7 @@ FUN_020484A8: ; 0x020484A8 add r6, r1, #0x0 mov r1, #0xb add r2, sp, #0x0 - bl LoadSaveFile + bl LoadHallOfFame add r4, r0, #0x0 ldr r0, [sp, #0x0] cmp r0, #0x1 @@ -38,7 +38,7 @@ FUN_020484A8: ; 0x020484A8 bne _020484CC _020484C6: add r0, r4, #0x0 - bl FUN_0202B03C + bl Sav2_HOF_init _020484CC: ldr r0, [r5, #0xc] bl SavArray_PlayerParty_get @@ -48,10 +48,10 @@ _020484CC: add r0, r4, #0x0 add r1, r6, #0x0 add r2, sp, #0x4 - bl FUN_0202B050 + bl Sav2_HOF_RecordParty ldr r0, [r5, #0xc] add r1, r4, #0x0 - bl SaveGame + bl SaveHallOfFame add r0, r4, #0x0 bl FreeToHeap add sp, #0x14 diff --git a/arm9/global.inc b/arm9/global.inc index c1781cdc..2416f1b7 100644 --- a/arm9/global.inc +++ b/arm9/global.inc @@ -1431,8 +1431,8 @@ .extern GetStoragePCPointer .extern FUN_0202251C .extern FUN_02022528 -.extern LoadSaveFile -.extern SaveGame +.extern LoadHallOfFame +.extern SaveHallOfFame .extern SaveBlock2_new .extern FUN_020225F8 .extern SavArray_get @@ -2102,14 +2102,14 @@ .extern FUN_0202AFC0 .extern FUN_0202AFFC .extern FUN_0202B020 -.extern FUN_0202B034 -.extern FUN_0202B03C -.extern FUN_0202B050 -.extern FUN_0202B1F0 -.extern FUN_0202B21C -.extern FUN_0202B250 -.extern FUN_0202B29C -.extern FUN_0202B31C +.extern Sav2_HOF_sizeof +.extern Sav2_HOF_init +.extern Sav2_HOF_RecordParty +.extern Sav2_HOF_GetNumRecords +.extern Sav2_HOF_TranslateRecordIdx +.extern Sav2_HOF_RecordCountMons +.extern Sav2_HOF_GetMonStatsByIndexPair +.extern Sav2_HOF_GetClearDate .extern FUN_0202B374 .extern FUN_0202B37C .extern FUN_0202B390 diff --git a/arm9/modules/70/asm/module_70.s b/arm9/modules/70/asm/module_70.s index 61998dcd..ef7b18bd 100644 --- a/arm9/modules/70/asm/module_70.s +++ b/arm9/modules/70/asm/module_70.s @@ -35,7 +35,7 @@ MOD70_021D74E0: ; 0x021D74E0 add r0, r4, #0 add r0, #0xcc ldr r0, [r0] - bl FUN_0202B1F0 + bl Sav2_HOF_GetNumRecords add r1, r4, #0 add r1, #0xd0 str r0, [r1] @@ -357,16 +357,16 @@ MOD70_021D777C: ; 0x021D777C str r2, [sp] add r0, r7, #0 add r1, r2, #0 - bl FUN_0202B21C + bl Sav2_HOF_TranslateRecordIdx str r0, [r6] ldr r1, [sp] add r0, r7, #0 - bl FUN_0202B250 + bl Sav2_HOF_RecordCountMons str r0, [r6, #0x14] ldr r1, [sp] add r0, r7, #0 add r2, r6, #4 - bl FUN_0202B31C + bl Sav2_HOF_GetClearDate ldr r0, [r6, #0x14] mov r4, #0 cmp r0, #0 @@ -378,7 +378,7 @@ _021D77AE: add r0, r7, #0 add r2, r4, #0 add r3, r5, #0 - bl FUN_0202B29C + bl Sav2_HOF_GetMonStatsByIndexPair ldr r0, [r6, #0x14] add r4, r4, #1 add r5, #0x1c diff --git a/arm9/src/hall_of_fame.c b/arm9/src/hall_of_fame.c new file mode 100644 index 00000000..1baf1c12 --- /dev/null +++ b/arm9/src/hall_of_fame.c @@ -0,0 +1,147 @@ +#include "global.h" +#include "pokemon.h" +#include "save_block_2.h" +#include "MI_memory.h" +#include "party.h" +#include "string16.h" +#include "RTC_api.h" +#include "hall_of_fame.h" + +#pragma thumb on + +u32 Sav2_HOF_sizeof(void) +{ + return sizeof(struct HallOfFame); +} + +void Sav2_HOF_init(struct HallOfFame * hof) +{ + MI_CpuClear32(hof, sizeof(struct HallOfFame)); +} + +void Sav2_HOF_RecordParty(struct HallOfFame * hof, struct PlayerParty * party, RTCDate * date) +{ + GF_ASSERT(hof != NULL); + GF_ASSERT(hof->next_record < NUM_HOF_RECORDS); + if (hof->num_total < 9999) + { + struct HOFParty * hof_party = &hof->parties[hof->next_record]; + int nmons = GetPartyCount(party); + struct String * str = String_ctor(POKEMON_NAME_LENGTH + 1, 0); + MI_CpuClear16(hof_party->party, 6 * sizeof(struct HOFMon)); + int i, j; + for (i = 0, j = 0; i < nmons; i++) + { + struct Pokemon * mon = GetPartyMonByIndex(party, i); + BOOL lock = AcquireMonLock(mon); + if (!GetMonData(mon, MON_DATA_IS_EGG, NULL)) + { + hof_party->party[j].species = (u16)GetMonData(mon, MON_DATA_SPECIES, NULL); + hof_party->party[j].level = (u8)GetMonData(mon, MON_DATA_LEVEL, NULL); + hof_party->party[j].forme = (u8)GetMonData(mon, MON_DATA_FORME, NULL); + hof_party->party[j].personality = GetMonData(mon, MON_DATA_PERSONALITY, NULL); + hof_party->party[j].otid = GetMonData(mon, MON_DATA_OTID, NULL); + hof_party->party[j].moves[0] = (u16)GetMonData(mon, MON_DATA_MOVE1, NULL); + hof_party->party[j].moves[1] = (u16)GetMonData(mon, MON_DATA_MOVE2, NULL); + hof_party->party[j].moves[2] = (u16)GetMonData(mon, MON_DATA_MOVE3, NULL); + hof_party->party[j].moves[3] = (u16)GetMonData(mon, MON_DATA_MOVE4, NULL); + if (str != NULL) + { + GetMonData(mon, MON_DATA_NICKNAME_3, str); + CopyStringToU16Array(str, hof_party->party[j].nickname, POKEMON_NAME_LENGTH + 1); + GetMonData(mon, MON_DATA_OT_NAME_2, str); + CopyStringToU16Array(str, hof_party->party[j].otname, OT_NAME_LENGTH + 1); + } + else + { + hof_party->party[j].nickname[0] = EOS; + hof_party->party[j].otname[0] = EOS; + } + j++; + } + ReleaseMonLock(mon, lock); + } + hof_party->year = (u16)date->year; + hof_party->month = (u8)date->month; + hof_party->day = (u8)date->day; + hof->next_record++; + if (hof->next_record >= NUM_HOF_RECORDS) + hof->next_record = 0; + hof->num_total++; + if (str != NULL) + String_dtor(str); + } +} + +u32 Sav2_HOF_GetNumRecords(struct HallOfFame * hof) +{ + GF_ASSERT(hof != NULL); + GF_ASSERT(hof->next_record < NUM_HOF_RECORDS); + if (hof->num_total < NUM_HOF_RECORDS) + return hof->num_total; + else + return NUM_HOF_RECORDS; +} + +int Sav2_HOF_TranslateRecordIdx(struct HallOfFame * hof, int a1) +{ + GF_ASSERT(hof != NULL); + GF_ASSERT(hof->next_record < NUM_HOF_RECORDS); + GF_ASSERT(a1 < NUM_HOF_RECORDS); + return (int)(hof->num_total - a1); +} + +u32 Sav2_HOF_RecordCountMons(struct HallOfFame * hof, int a1) +{ + GF_ASSERT(hof != NULL); + GF_ASSERT(hof->next_record < NUM_HOF_RECORDS); + GF_ASSERT(a1 < NUM_HOF_RECORDS); + int hofno = (int)(hof->next_record - 1 - a1); + if (hofno < 0) + hofno += NUM_HOF_RECORDS; + struct HOFParty * hof_party = &hof->parties[hofno]; + u32 i; + for (i = 0; i < 6; i++) + { + if (hof_party->party[i].species == SPECIES_NONE) + break; + } + return i; +} + +void Sav2_HOF_GetMonStatsByIndexPair(struct HallOfFame * hof, int a1, int a2, struct HofDisplayMon * dest) +{ + GF_ASSERT(hof != NULL); + GF_ASSERT(hof->next_record < NUM_HOF_RECORDS); + GF_ASSERT(a1 < NUM_HOF_RECORDS); + int hofno = (int)(hof->next_record - 1 - a1); + if (hofno < 0) + hofno += NUM_HOF_RECORDS; + struct HOFMon * mon = &hof->parties[hofno].party[a2]; + dest->species = mon->species; + dest->level = mon->level; + dest->personality = mon->personality; + dest->otid = mon->otid; + dest->forme = mon->forme; + CopyU16ArrayToString(dest->nickname, mon->nickname); + CopyU16ArrayToString(dest->otname, mon->otname); + for (int i = 0; i < 4; i++) + { + dest->moves[i] = mon->moves[i]; + } +} + +void Sav2_HOF_GetClearDate(struct HallOfFame * hof, int a1, RTCDate * dest) +{ + GF_ASSERT(hof != NULL); + GF_ASSERT(hof->next_record < NUM_HOF_RECORDS); + GF_ASSERT(a1 < NUM_HOF_RECORDS); + int hofno = (int)(hof->next_record - 1 - a1); + if (hofno < 0) + hofno += NUM_HOF_RECORDS; + struct HOFParty *party = &hof->parties[hofno]; + dest->year = party->year; + dest->month = party->month; + dest->day = party->day; + dest->week = RTC_WEEK_SUNDAY; +}
\ No newline at end of file diff --git a/arm9/src/save_arrays.c b/arm9/src/save_arrays.c index 02dc4a16..797539d2 100644 --- a/arm9/src/save_arrays.c +++ b/arm9/src/save_arrays.c @@ -7,8 +7,9 @@ #include "pokemon_storage_system.h" #include "sav_system_info.h" #include "poketch.h" +#include "hall_of_fame.h" +#include "unk_020286F8.h" -extern u32 FUN_0202B034(void); extern u32 FUN_0202AC20(void); extern u32 FUN_02034D7C(void); extern u32 FUN_02023D64(void); @@ -21,7 +22,6 @@ extern u32 FUN_02023AC8(void); extern u32 FUN_02026FD8(void); extern u32 FUN_02025844(void); extern u32 FUN_02028054(void); -extern u32 FUN_020286F8(void); extern u32 FUN_02028980(void); extern u32 FUN_02029A84(void); extern u32 FUN_02029FB0(void); @@ -38,7 +38,6 @@ extern u32 FUN_02029AE0(void); extern u32 FUN_0202BE98(void); extern u32 FUN_0202C0E0(void); extern u32 FUN_02013B28(void); -extern void FUN_0202B03C(void *); extern void FUN_0202AC28(void *); extern void FUN_02034D98(void *); extern void FUN_02024378(void *); @@ -51,7 +50,6 @@ extern void FUN_02023AD8(void *); extern void FUN_02026F60(void *); extern void FUN_0202584C(void *); extern void FUN_0202805C(void *); -extern void FUN_02028724(void *); extern void FUN_02028994(void *); extern void FUN_02029A8C(void *); extern void FUN_02029FB8(void *); @@ -70,7 +68,7 @@ extern void FUN_0202C0E4(void *); extern void FUN_02013B2C(void *); const struct SaveChunkHeader UNK_020EE6E0[] = { - { 0, 32, (SAVSIZEFN)FUN_0202B034, (SAVINITFN)FUN_0202B03C }, + { 0, 32, (SAVSIZEFN)Sav2_HOF_sizeof, (SAVINITFN)Sav2_HOF_init }, { 1, 35, (SAVSIZEFN)FUN_0202AC20, (SAVINITFN)FUN_0202AC28 } }; diff --git a/include/hall_of_fame.h b/include/hall_of_fame.h new file mode 100644 index 00000000..62349952 --- /dev/null +++ b/include/hall_of_fame.h @@ -0,0 +1,55 @@ +#ifndef POKEDIAMOND_HALL_OF_FAME_H +#define POKEDIAMOND_HALL_OF_FAME_H + +#define NUM_HOF_RECORDS 30 + +struct HOFMon +{ + /* 0x00 */ u16 species; + /* 0x02 */ u8 level; + /* 0x03 */ u8 forme; + /* 0x04 */ u32 personality; + /* 0x08 */ u32 otid; + /* 0x0C */ u16 nickname[POKEMON_NAME_LENGTH + 1]; + /* 0x22 */ u16 otname[OT_NAME_LENGTH + 1]; + /* 0x32 */ u16 moves[4]; + /* 0x3A */ u8 padding[2]; +}; + +struct HOFParty +{ + struct HOFMon party[6]; + u16 year; + u8 month; + u8 day; +}; + +struct HallOfFame +{ + struct HOFParty parties[NUM_HOF_RECORDS]; + u32 next_record; + u32 num_total; +}; + +struct HofDisplayMon +{ + struct String * nickname; + struct String * otname; + u32 personality; + u32 otid; + u16 species; + u8 level; + u8 forme; + u16 moves[4]; +}; + +u32 Sav2_HOF_sizeof(void); +void Sav2_HOF_init(struct HallOfFame * hof); +void Sav2_HOF_RecordParty(struct HallOfFame * hof, struct PlayerParty * party, RTCDate * date); +u32 Sav2_HOF_GetNumRecords(struct HallOfFame * hof); +int Sav2_HOF_TranslateRecordIdx(struct HallOfFame * hof, int a1); +u32 Sav2_HOF_RecordCountMons(struct HallOfFame * hof, int a1); +void Sav2_HOF_GetMonStatsByIndexPair(struct HallOfFame * hof, int a1, int a2, struct HofDisplayMon * dest); +void Sav2_HOF_GetClearDate(struct HallOfFame * hof, int a1, RTCDate * dest); + +#endif //POKEDIAMOND_HALL_OF_FAME_H |