summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-08-25 15:37:40 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2020-08-25 15:42:23 -0400
commit2d15e6612b94971cd26dafb508dbedbd9e8e4686 (patch)
treeeb5b819c55232898651a7c3270222712492af0bb
parent3ba4677d3c00c7b607df7f147723a408dbb3d2b1 (diff)
Decompile hall_of_fame.c
-rw-r--r--arm9/arm9.lsf2
-rw-r--r--arm9/asm/scrcmd.s4
-rw-r--r--arm9/asm/unk_02022504.s8
-rw-r--r--arm9/asm/unk_0202B034.s425
-rw-r--r--arm9/asm/unk_020377F0.s2
-rw-r--r--arm9/asm/unk_020484A8.s8
-rw-r--r--arm9/global.inc20
-rw-r--r--arm9/modules/70/asm/module_70.s10
-rw-r--r--arm9/src/hall_of_fame.c147
-rw-r--r--arm9/src/save_arrays.c8
-rw-r--r--include/hall_of_fame.h55
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