summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-08-19 17:27:36 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2020-08-19 17:27:36 -0400
commitbde92c30125ebcc8a5fa98497e93ae89ebc28230 (patch)
tree65b859b6708b5844ef8601d6a8c0450d3bf31fa9
parentcd9bca320c7e6950402ed7b176d972d31d40aac2 (diff)
Decompile pokemon_storage_system
-rw-r--r--arm9/asm/pokemon_storage_system.s737
-rw-r--r--arm9/src/pokemon_storage_system.c322
-rw-r--r--include/pokemon_storage_system.h48
3 files changed, 370 insertions, 737 deletions
diff --git a/arm9/asm/pokemon_storage_system.s b/arm9/asm/pokemon_storage_system.s
deleted file mode 100644
index 472e04b3..00000000
--- a/arm9/asm/pokemon_storage_system.s
+++ /dev/null
@@ -1,737 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- thumb_func_start PCStorage_init
-PCStorage_init: ; 0x0206B16C
- push {r3, lr}
- bl PCStorage_InitializeBoxes
- bl SaveSetDirtyBit
- pop {r3, pc}
-
- thumb_func_start PCStorage_sizeof
-PCStorage_sizeof: ; 0x0206B178
- ldr r0, _0206B17C ; =0x000121C8
- bx lr
- .balign 4
-_0206B17C: .word 0x000121C8
-
- thumb_func_start PCStorage_InitializeBoxes
-PCStorage_InitializeBoxes: ; 0x0206B180
- push {r3-r7, lr}
- str r0, [sp, #0x0]
- mov r7, #0x0
- add r6, r0, #0x4
-_0206B188:
- mov r4, #0x0
- add r5, r6, #0x0
-_0206B18C:
- add r0, r5, #0x0
- bl ZeroBoxMonData
- add r4, r4, #0x1
- add r5, #0x88
- cmp r4, #0x1e
- blo _0206B18C
- mov r0, #0xff
- lsl r0, r0, #0x4
- add r7, r7, #0x1
- add r6, r6, r0
- cmp r7, #0x12
- blo _0206B188
- mov r3, #0x0
- ldr r1, _0206B200 ; =0x000121B4
- add r4, r3, #0x0
- add r2, r3, #0x0
-_0206B1AE:
- ldr r0, [sp, #0x0]
- add r0, r0, r3
- strb r4, [r0, r1]
- add r4, r4, #0x1
- cmp r4, #0x10
- blo _0206B1BC
- add r4, r2, #0x0
-_0206B1BC:
- add r3, r3, #0x1
- cmp r3, #0x12
- blo _0206B1AE
- ldr r1, _0206B204 ; =0x000121C6
- ldr r0, [sp, #0x0]
- mov r3, #0x0
- strb r3, [r0, r1]
- mov r0, #0x1
- mov r1, #0x1a
- mov r2, #0xe
- bl NewMsgDataFromNarc
- add r6, r0, #0x0
- beq _0206B1F8
- ldr r1, _0206B208 ; =0x00011EE4
- ldr r0, [sp, #0x0]
- mov r5, #0x0
- add r4, r0, r1
-_0206B1E0:
- add r0, r6, #0x0
- add r1, r5, #0x6
- add r2, r4, #0x0
- bl ReadMsgDataIntoU16Array
- add r5, r5, #0x1
- add r4, #0x28
- cmp r5, #0x12
- blo _0206B1E0
- add r0, r6, #0x0
- bl DestroyMsgData
-_0206B1F8:
- ldr r0, [sp, #0x0]
- mov r1, #0x0
- str r1, [r0, #0x0]
- pop {r3-r7, pc}
- .balign 4
-_0206B200: .word 0x000121B4
-_0206B204: .word 0x000121C6
-_0206B208: .word 0x00011EE4
-
- thumb_func_start PCStorage_PlaceMonInFirstEmptySlotInAnyBox
-PCStorage_PlaceMonInFirstEmptySlotInAnyBox: ; 0x0206B20C
- push {r3-r7, lr}
- add r5, r0, #0x0
- ldr r4, [r5, #0x0]
- add r6, r1, #0x0
- mov r7, #0x0
-_0206B216:
- add r0, r6, #0x0
- bl RestoreBoxMonPP
- add r0, r5, #0x0
- add r1, r4, #0x0
- add r2, r6, #0x0
- bl PCStorage_PlaceMonInBoxFirstEmptySlot
- cmp r0, #0x0
- beq _0206B232
- bl SaveSetDirtyBit
- mov r0, #0x1
- pop {r3-r7, pc}
-_0206B232:
- add r4, r4, #0x1
- cmp r4, #0x12
- blo _0206B23A
- add r4, r7, #0x0
-_0206B23A:
- ldr r0, [r5, #0x0]
- cmp r4, r0
- bne _0206B216
- mov r0, #0x0
- pop {r3-r7, pc}
-
- thumb_func_start PCStorage_PlaceMonInBoxFirstEmptySlot
-PCStorage_PlaceMonInBoxFirstEmptySlot: ; 0x0206B244
- push {r3-r7, lr}
- sub sp, #0x8
- add r6, r0, #0x0
- add r0, r2, #0x0
- add r5, r1, #0x0
- str r2, [sp, #0x0]
- bl RestoreBoxMonPP
- mov r0, #0x0
- mvn r0, r0
- cmp r5, r0
- bne _0206B25E
- ldr r5, [r6, #0x0]
-_0206B25E:
- mov r0, #0xff
- lsl r0, r0, #0x4
- add r1, r6, #0x4
- mul r0, r5
- mov r4, #0x0
- add r5, r1, r0
- str r5, [sp, #0x4]
- mov r6, #0x5
- add r7, r4, #0x0
-_0206B270:
- add r0, r5, #0x0
- add r1, r6, #0x0
- add r2, r7, #0x0
- bl GetBoxMonData
- cmp r0, #0x0
- bne _0206B2A0
- mov r0, #0x88
- add r1, r4, #0x0
- mul r1, r0
- ldr r0, [sp, #0x4]
- mov r3, #0x11
- add r4, r0, r1
-_0206B28A:
- ldr r2, [sp, #0x0]
- sub r3, r3, #0x1
- ldmia r2!, {r0-r1}
- str r2, [sp, #0x0]
- stmia r4!, {r0-r1}
- bne _0206B28A
- bl SaveSetDirtyBit
- add sp, #0x8
- mov r0, #0x1
- pop {r3-r7, pc}
-_0206B2A0:
- add r4, r4, #0x1
- add r5, #0x88
- cmp r4, #0x1e
- blo _0206B270
- mov r0, #0x0
- add sp, #0x8
- pop {r3-r7, pc}
- .balign 4
-
- thumb_func_start PCStorage_PlaceMonInBoxByIndexPair
-PCStorage_PlaceMonInBoxByIndexPair: ; 0x0206B2B0
- push {r3-r7, lr}
- add r7, r3, #0x0
- add r5, r0, #0x0
- add r0, r7, #0x0
- add r4, r1, #0x0
- add r6, r2, #0x0
- bl RestoreBoxMonPP
- mov r0, #0x0
- mvn r0, r0
- cmp r4, r0
- bne _0206B2CA
- ldr r4, [r5, #0x0]
-_0206B2CA:
- cmp r4, #0x12
- bhs _0206B2F4
- cmp r6, #0x1e
- bhs _0206B2F4
- mov r0, #0xff
- lsl r0, r0, #0x4
- mul r0, r4
- add r1, r5, r0
- mov r0, #0x88
- mul r0, r6
- add r0, r1, r0
- add r3, r0, #0x4
- mov r2, #0x11
-_0206B2E4:
- ldmia r7!, {r0-r1}
- stmia r3!, {r0-r1}
- sub r2, r2, #0x1
- bne _0206B2E4
- bl SaveSetDirtyBit
- mov r0, #0x1
- pop {r3-r7, pc}
-_0206B2F4:
- bl ErrorHandling
- mov r0, #0x0
- pop {r3-r7, pc}
-
- thumb_func_start PCStorage_DeleteBoxMonByIndexPair
-PCStorage_DeleteBoxMonByIndexPair: ; 0x0206B2FC
- push {r3, lr}
- mov r3, #0x0
- mvn r3, r3
- cmp r1, r3
- bne _0206B308
- ldr r1, [r0, #0x0]
-_0206B308:
- cmp r2, #0x1e
- bhs _0206B32A
- cmp r1, #0x12
- bhs _0206B32A
- add r3, r0, #0x4
- mov r0, #0xff
- lsl r0, r0, #0x4
- mul r0, r1
- add r1, r3, r0
- mov r0, #0x88
- mul r0, r2
- add r0, r1, r0
- bl ZeroBoxMonData
- bl SaveSetDirtyBit
- pop {r3, pc}
-_0206B32A:
- bl ErrorHandling
- pop {r3, pc}
-
- thumb_func_start PCStorage_GetActiveBox
-PCStorage_GetActiveBox: ; 0x0206B330
- ldr r0, [r0, #0x0]
- bx lr
-
- thumb_func_start PCStorage_FindFirstBoxWithEmptySlot
-PCStorage_FindFirstBoxWithEmptySlot: ; 0x0206B334
- push {r3-r7, lr}
- sub sp, #0x8
- str r0, [sp, #0x0]
- ldr r6, [r0, #0x0]
- add r0, r0, #0x4
- mov r7, #0xab
- str r0, [sp, #0x4]
-_0206B342:
- mov r0, #0xff
- lsl r0, r0, #0x4
- add r1, r6, #0x0
- mul r1, r0
- ldr r0, [sp, #0x4]
- mov r4, #0x0
- add r5, r0, r1
-_0206B350:
- add r0, r5, #0x0
- add r1, r7, #0x0
- mov r2, #0x0
- bl GetBoxMonData
- cmp r0, #0x0
- bne _0206B364
- add sp, #0x8
- add r0, r6, #0x0
- pop {r3-r7, pc}
-_0206B364:
- add r4, r4, #0x1
- add r5, #0x88
- cmp r4, #0x1e
- blt _0206B350
- add r6, r6, #0x1
- cmp r6, #0x12
- blt _0206B374
- mov r6, #0x0
-_0206B374:
- ldr r0, [sp, #0x0]
- ldr r0, [r0, #0x0]
- cmp r6, r0
- bne _0206B342
- mov r0, #0x12
- add sp, #0x8
- pop {r3-r7, pc}
- .balign 4
-
- thumb_func_start PCStorage_FindFirstEmptySlot
-PCStorage_FindFirstEmptySlot: ; 0x0206B384
- push {r3-r7, lr}
- add r6, r1, #0x0
- str r2, [sp, #0x0]
- mov r1, #0x0
- ldr r2, [r6, #0x0]
- mvn r1, r1
- cmp r2, r1
- bne _0206B398
- ldr r1, [r0, #0x0]
- str r1, [r6, #0x0]
-_0206B398:
- ldr r1, [sp, #0x0]
- ldr r4, [r6, #0x0]
- ldr r5, [r1, #0x0]
- add r7, r0, #0x4
- b _0206B3C8
-_0206B3A2:
- mov r0, #0xff
- lsl r0, r0, #0x4
- mul r0, r4
- add r1, r7, r0
- mov r0, #0x88
- mul r0, r5
- add r0, r1, r0
- mov r1, #0xab
- mov r2, #0x0
- bl GetBoxMonData
- cmp r0, #0x0
- bne _0206B3C6
- ldr r0, [sp, #0x0]
- str r4, [r6, #0x0]
- str r5, [r0, #0x0]
- mov r0, #0x1
- pop {r3-r7, pc}
-_0206B3C6:
- add r5, r5, #0x1
-_0206B3C8:
- cmp r5, #0x1e
- blt _0206B3A2
- add r4, r4, #0x1
- cmp r4, #0x12
- blt _0206B3D4
- mov r4, #0x0
-_0206B3D4:
- ldr r0, [r6, #0x0]
- cmp r4, r0
- beq _0206B3DE
- mov r5, #0x0
- b _0206B3C8
-_0206B3DE:
- mov r0, #0x12
- pop {r3-r7, pc}
- .balign 4
-
- thumb_func_start PCStorage_CountMonsAndEggsInAllBoxes
-PCStorage_CountMonsAndEggsInAllBoxes: ; 0x0206B3E4
- push {r3-r7, lr}
- sub sp, #0x8
- mov r6, #0x0
- add r0, r0, #0x4
- str r6, [sp, #0x4]
- str r0, [sp, #0x0]
- mov r7, #0xab
-_0206B3F2:
- ldr r5, [sp, #0x0]
- mov r4, #0x0
-_0206B3F6:
- add r0, r5, #0x0
- add r1, r7, #0x0
- mov r2, #0x0
- bl GetBoxMonData
- cmp r0, #0x0
- beq _0206B406
- add r6, r6, #0x1
-_0206B406:
- add r4, r4, #0x1
- add r5, #0x88
- cmp r4, #0x1e
- blt _0206B3F6
- mov r0, #0xff
- ldr r1, [sp, #0x0]
- lsl r0, r0, #0x4
- add r0, r1, r0
- str r0, [sp, #0x0]
- ldr r0, [sp, #0x4]
- add r0, r0, #0x1
- str r0, [sp, #0x4]
- cmp r0, #0x12
- blt _0206B3F2
- add r0, r6, #0x0
- add sp, #0x8
- pop {r3-r7, pc}
-
- thumb_func_start PCStorage_SetActiveBox
-PCStorage_SetActiveBox: ; 0x0206B428
- push {r3, lr}
- cmp r1, #0x12
- bhs _0206B436
- str r1, [r0, #0x0]
- bl SaveSetDirtyBit
- pop {r3, pc}
-_0206B436:
- bl ErrorHandling
- pop {r3, pc}
-
- thumb_func_start PCStorage_GetBoxWallpaper
-PCStorage_GetBoxWallpaper: ; 0x0206B43C
- push {r3, lr}
- cmp r1, #0x12
- bhs _0206B44A
- add r1, r0, r1
- ldr r0, _0206B454 ; =0x000121B4
- ldrb r0, [r1, r0]
- pop {r3, pc}
-_0206B44A:
- bl ErrorHandling
- mov r0, #0x0
- pop {r3, pc}
- nop
-_0206B454: .word 0x000121B4
-
- thumb_func_start PCStorage_SetBoxWallpaper
-PCStorage_SetBoxWallpaper: ; 0x0206B458
- push {r3, lr}
- mov r3, #0x0
- mvn r3, r3
- cmp r1, r3
- bne _0206B464
- ldr r1, [r0, #0x0]
-_0206B464:
- cmp r1, #0x12
- bhs _0206B478
- cmp r2, #0x18
- bhs _0206B478
- add r1, r0, r1
- ldr r0, _0206B480 ; =0x000121B4
- strb r2, [r1, r0]
- bl SaveSetDirtyBit
- pop {r3, pc}
-_0206B478:
- bl ErrorHandling
- pop {r3, pc}
- nop
-_0206B480: .word 0x000121B4
-
- thumb_func_start PCStorage_GetBoxName
-PCStorage_GetBoxName: ; 0x0206B484
- push {r3, lr}
- add r3, r0, #0x0
- mov r0, #0x0
- mvn r0, r0
- cmp r1, r0
- bne _0206B492
- ldr r1, [r3, #0x0]
-_0206B492:
- cmp r1, #0x12
- bhs _0206B4A8
- add r0, r2, #0x0
- ldr r2, _0206B4B0 ; =0x00011EE4
- add r3, r3, r2
- mov r2, #0x28
- mul r2, r1
- add r1, r3, r2
- bl CopyU16ArrayToString
- pop {r3, pc}
-_0206B4A8:
- bl ErrorHandling
- pop {r3, pc}
- nop
-_0206B4B0: .word 0x00011EE4
-
- thumb_func_start PCStorage_SetBoxName
-PCStorage_SetBoxName: ; 0x0206B4B4
- push {r3, lr}
- add r3, r0, #0x0
- mov r0, #0x0
- mvn r0, r0
- cmp r1, r0
- bne _0206B4C2
- ldr r1, [r3, #0x0]
-_0206B4C2:
- cmp r1, #0x12
- bhs _0206B4DC
- add r0, r2, #0x0
- ldr r2, _0206B4E0 ; =0x00011EE4
- add r3, r3, r2
- mov r2, #0x28
- mul r2, r1
- add r1, r3, r2
- mov r2, #0x14
- bl CopyStringToU16Array
- bl SaveSetDirtyBit
-_0206B4DC:
- pop {r3, pc}
- nop
-_0206B4E0: .word 0x00011EE4
-
- thumb_func_start PCStorage_CountMonsAndEggsInBox
-PCStorage_CountMonsAndEggsInBox: ; 0x0206B4E4
- push {r3-r7, lr}
- mov r2, #0x0
- mvn r2, r2
- cmp r1, r2
- bne _0206B4F0
- ldr r1, [r0, #0x0]
-_0206B4F0:
- cmp r1, #0x12
- bhs _0206B520
- add r2, r0, #0x4
- mov r0, #0xff
- lsl r0, r0, #0x4
- mov r4, #0x0
- mul r0, r1
- add r6, r4, #0x0
- add r5, r2, r0
- mov r7, #0xab
-_0206B504:
- add r0, r5, #0x0
- add r1, r7, #0x0
- mov r2, #0x0
- bl GetBoxMonData
- cmp r0, #0x0
- beq _0206B514
- add r4, r4, #0x1
-_0206B514:
- add r6, r6, #0x1
- add r5, #0x88
- cmp r6, #0x1e
- blt _0206B504
- add r0, r4, #0x0
- pop {r3-r7, pc}
-_0206B520:
- bl ErrorHandling
- mov r0, #0x0
- pop {r3-r7, pc}
-
- thumb_func_start PCStorage_CountMonsInBox
-PCStorage_CountMonsInBox: ; 0x0206B528
- push {r3-r7, lr}
- mov r2, #0x0
- mvn r2, r2
- cmp r1, r2
- bne _0206B534
- ldr r1, [r0, #0x0]
-_0206B534:
- cmp r1, #0x12
- bhs _0206B572
- add r2, r0, #0x4
- mov r0, #0xff
- lsl r0, r0, #0x4
- mov r4, #0x0
- mul r0, r1
- add r6, r4, #0x0
- add r5, r2, r0
- mov r7, #0xab
-_0206B548:
- add r0, r5, #0x0
- add r1, r7, #0x0
- mov r2, #0x0
- bl GetBoxMonData
- cmp r0, #0x0
- beq _0206B566
- add r0, r5, #0x0
- mov r1, #0x4c
- mov r2, #0x0
- bl GetBoxMonData
- cmp r0, #0x0
- bne _0206B566
- add r4, r4, #0x1
-_0206B566:
- add r6, r6, #0x1
- add r5, #0x88
- cmp r6, #0x1e
- blt _0206B548
- add r0, r4, #0x0
- pop {r3-r7, pc}
-_0206B572:
- bl ErrorHandling
- mov r0, #0x0
- pop {r3-r7, pc}
- .balign 4
-
- thumb_func_start PCStorage_CountMonsInAllBoxes
-PCStorage_CountMonsInAllBoxes: ; 0x0206B57C
- push {r4-r6, lr}
- mov r5, #0x0
- add r6, r0, #0x0
- add r4, r5, #0x0
-_0206B584:
- add r0, r6, #0x0
- add r1, r5, #0x0
- bl PCStorage_CountMonsInBox
- add r5, r5, #0x1
- add r4, r4, r0
- cmp r5, #0x12
- blo _0206B584
- add r0, r4, #0x0
- pop {r4-r6, pc}
-
- thumb_func_start PCStorage_SetBoxMonDataByIndexPair
-PCStorage_SetBoxMonDataByIndexPair: ; 0x0206B598
- push {r3-r7, lr}
- add r4, r1, #0x0
- add r5, r0, #0x0
- add r6, r2, #0x0
- add r7, r3, #0x0
- cmp r4, #0x12
- blo _0206B5B2
- mov r0, #0x0
- mvn r0, r0
- cmp r4, r0
- beq _0206B5B2
- bl ErrorHandling
-_0206B5B2:
- cmp r6, #0x1e
- blo _0206B5BA
- bl ErrorHandling
-_0206B5BA:
- mov r0, #0x0
- mvn r0, r0
- cmp r4, r0
- bne _0206B5C4
- ldr r4, [r5, #0x0]
-_0206B5C4:
- mov r0, #0xff
- lsl r0, r0, #0x4
- add r1, r5, #0x4
- mul r0, r4
- add r1, r1, r0
- mov r0, #0x88
- mul r0, r6
- add r0, r1, r0
- ldr r2, [sp, #0x18]
- add r1, r7, #0x0
- bl SetBoxMonData
- bl SaveSetDirtyBit
- pop {r3-r7, pc}
- .balign 4
-
- thumb_func_start PCStorage_GetMonByIndexPair
-PCStorage_GetMonByIndexPair: ; 0x0206B5E4
- push {r4-r6, lr}
- add r4, r1, #0x0
- add r5, r0, #0x0
- add r6, r2, #0x0
- cmp r4, #0x12
- blo _0206B5FC
- mov r0, #0x0
- mvn r0, r0
- cmp r4, r0
- beq _0206B5FC
- bl ErrorHandling
-_0206B5FC:
- cmp r6, #0x1e
- blo _0206B604
- bl ErrorHandling
-_0206B604:
- mov r0, #0x0
- mvn r0, r0
- cmp r4, r0
- bne _0206B60E
- ldr r4, [r5, #0x0]
-_0206B60E:
- mov r0, #0xff
- lsl r0, r0, #0x4
- add r1, r5, #0x4
- mul r0, r4
- add r1, r1, r0
- mov r0, #0x88
- mul r0, r6
- add r0, r1, r0
- pop {r4-r6, pc}
-
- thumb_func_start PCStorage_UnlockBonusWallpaper
-PCStorage_UnlockBonusWallpaper: ; 0x0206B620
- push {r3-r5, lr}
- add r4, r1, #0x0
- add r5, r0, #0x0
- cmp r4, #0x8
- blo _0206B62E
- bl ErrorHandling
-_0206B62E:
- ldr r0, _0206B640 ; =0x000121C6
- mov r1, #0x1
- ldrb r2, [r5, r0]
- lsl r1, r4
- orr r1, r2
- strb r1, [r5, r0]
- bl SaveSetDirtyBit
- pop {r3-r5, pc}
- .balign 4
-_0206B640: .word 0x000121C6
-
- thumb_func_start PCStorage_IsBonusWallpaperUnlocked
-PCStorage_IsBonusWallpaperUnlocked: ; 0x0206B644
- push {r3-r5, lr}
- add r4, r1, #0x0
- add r5, r0, #0x0
- cmp r4, #0x8
- blo _0206B652
- bl ErrorHandling
-_0206B652:
- ldr r0, _0206B664 ; =0x000121C6
- ldrb r2, [r5, r0]
- mov r0, #0x1
- add r1, r0, #0x0
- lsl r1, r4
- tst r1, r2
- bne _0206B662
- mov r0, #0x0
-_0206B662:
- pop {r3-r5, pc}
- .balign 4
-_0206B664: .word 0x000121C6
-
- thumb_func_start PCStorage_CountUnlockedBonusWallpapers
-PCStorage_CountUnlockedBonusWallpapers: ; 0x0206B668
- push {r4-r6, lr}
- mov r4, #0x0
- add r6, r0, #0x0
- add r5, r4, #0x0
-_0206B670:
- add r0, r6, #0x0
- add r1, r4, #0x0
- bl PCStorage_IsBonusWallpaperUnlocked
- cmp r0, #0x0
- beq _0206B67E
- add r5, r5, #0x1
-_0206B67E:
- add r4, r4, #0x1
- cmp r4, #0x8
- blo _0206B670
- add r0, r5, #0x0
- pop {r4-r6, pc}
diff --git a/arm9/src/pokemon_storage_system.c b/arm9/src/pokemon_storage_system.c
new file mode 100644
index 00000000..228bc161
--- /dev/null
+++ b/arm9/src/pokemon_storage_system.c
@@ -0,0 +1,322 @@
+#include "global.h"
+#include "pokemon.h"
+#include "save_block_2.h"
+#include "pokemon_storage_system.h"
+#include "msgdata.h"
+#include "string16.h"
+
+#pragma thumb on
+
+void PCStorage_init(struct PCStorage * pc)
+{
+ PCStorage_InitializeBoxes(pc);
+ SaveSetDirtyBit();
+}
+
+u32 PCStorage_sizeof(void)
+{
+ return sizeof(struct PCStorage);
+}
+
+void PCStorage_InitializeBoxes(struct PCStorage * pc)
+{
+ int i, j;
+ for (i = 0; i < NUM_BOXES; i++)
+ {
+ for (j = 0; j < MONS_PER_BOX; j++)
+ {
+ ZeroBoxMonData(&pc->boxes[i][j]);
+ }
+ }
+ for (i = 0, j = 0; i < NUM_BOXES; i++)
+ {
+ pc->wallpapers[i] = (u8)j;
+ j++;
+ if (j >= NUM_DEFAULT_WALLPAPERS)
+ j = 0;
+ }
+ pc->unlockedWallpapers = 0;
+ struct MsgData * msgData = NewMsgDataFromNarc(1, NARC_MSGDATA_MSG, 14, 0);
+ if (msgData != NULL)
+ {
+ for (i = 0; i < NUM_BOXES; i++)
+ {
+ ReadMsgDataIntoU16Array(msgData, (u32)(i + 6), pc->names[i]);
+ }
+ DestroyMsgData(msgData);
+ }
+ pc->curBox = 0;
+}
+
+BOOL PCStorage_PlaceMonInFirstEmptySlotInAnyBox(struct PCStorage * pc, struct BoxPokemon * boxmon)
+{
+ int i = (int)pc->curBox;
+ do
+ {
+ RestoreBoxMonPP(boxmon);
+ if (PCStorage_PlaceMonInBoxFirstEmptySlot(pc, i, boxmon))
+ {
+ SaveSetDirtyBit();
+ return TRUE;
+ }
+ i++;
+ if (i >= NUM_BOXES)
+ i = 0;
+ } while (i != pc->curBox);
+ return FALSE;
+}
+
+BOOL PCStorage_PlaceMonInBoxFirstEmptySlot(struct PCStorage * pc, int boxno, struct BoxPokemon * boxmon)
+{
+ RestoreBoxMonPP(boxmon);
+ if (boxno == -1)
+ boxno = (int)pc->curBox;
+ for (int i = 0; i < MONS_PER_BOX; i++)
+ {
+ if (GetBoxMonData(&pc->boxes[boxno][i], MON_DATA_SPECIES, NULL) == SPECIES_NONE)
+ {
+ pc->boxes[boxno][i] = *boxmon;
+ SaveSetDirtyBit();
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
+BOOL PCStorage_PlaceMonInBoxByIndexPair(struct PCStorage * pc, int boxno, int slotno, struct BoxPokemon * boxmon)
+{
+ RestoreBoxMonPP(boxmon);
+ if (boxno == -1)
+ boxno = (int)pc->curBox;
+ if (boxno < NUM_BOXES && slotno < MONS_PER_BOX)
+ {
+ pc->boxes[boxno][slotno] = *boxmon;
+ SaveSetDirtyBit();
+ return TRUE;
+ }
+ GF_ASSERT(0);
+ return FALSE;
+}
+
+void PCStorage_DeleteBoxMonByIndexPair(struct PCStorage * pc, int boxno, int slotno)
+{
+ if (boxno == -1)
+ boxno = (int)pc->curBox;
+ if (slotno < MONS_PER_BOX && boxno < NUM_BOXES)
+ {
+ ZeroBoxMonData(&pc->boxes[boxno][slotno]);
+ SaveSetDirtyBit();
+ return;
+ }
+ GF_ASSERT(0);
+}
+
+int PCStorage_GetActiveBox(struct PCStorage * pc)
+{
+ return (int)pc->curBox;
+}
+
+int PCStorage_FindFirstBoxWithEmptySlot(struct PCStorage * pc)
+{
+ int i, j;
+ i = (int)pc->curBox;
+ do
+ {
+ for (j = 0; j < (int)MONS_PER_BOX; j++)
+ {
+ if (!GetBoxMonData(&pc->boxes[i][j], MON_DATA_SPECIES_EXISTS, NULL))
+ return i;
+ }
+ i++;
+ if (i >= (int)NUM_BOXES)
+ i = 0;
+ } while (i != pc->curBox);
+ return (int)NUM_BOXES;
+}
+
+BOOL PCStorage_FindFirstEmptySlot(struct PCStorage * pc, int * boxno, int * slotno)
+{
+ if (*boxno == -1)
+ *boxno = (int)pc->curBox;
+ int i = *boxno, j = *slotno;
+ do
+ {
+ while (j < (int)MONS_PER_BOX)
+ {
+ if (!GetBoxMonData(&pc->boxes[i][j], MON_DATA_SPECIES_EXISTS, NULL))
+ {
+ *boxno = i;
+ *slotno = j;
+ return TRUE;
+ }
+ j++;
+ }
+ i++;
+ if (i >= (int)NUM_BOXES)
+ i = 0;
+ if (i == *boxno)
+ break;
+ j = 0;
+ } while (1);
+ return (int)NUM_BOXES; // bug: should return FALSE if reached
+}
+
+int PCStorage_CountMonsAndEggsInAllBoxes(struct PCStorage * pc)
+{
+ int i, j, count = 0;
+ for (i = 0; i < (int)NUM_BOXES; i++)
+ {
+ for (j = 0; j < (int)MONS_PER_BOX; j++)
+ {
+ if (GetBoxMonData(&pc->boxes[i][j], MON_DATA_SPECIES_EXISTS, NULL))
+ count++;
+ }
+ }
+ return count;
+}
+
+void PCStorage_SetActiveBox(struct PCStorage * pc, int boxno)
+{
+ if (boxno < NUM_BOXES)
+ {
+ pc->curBox = (u32)boxno;
+ SaveSetDirtyBit();
+ return;
+ }
+ GF_ASSERT(0);
+}
+
+u8 PCStorage_GetBoxWallpaper(struct PCStorage * pc, int boxno)
+{
+ if (boxno < NUM_BOXES)
+ return pc->wallpapers[boxno];
+ GF_ASSERT(0);
+ return 0;
+}
+
+void PCStorage_SetBoxWallpaper(struct PCStorage * pc, int boxno, u8 wallpaper)
+{
+ if (boxno == -1)
+ boxno = (int)pc->curBox;
+ if (boxno < NUM_BOXES && wallpaper < NUM_WALLPAPERS)
+ {
+ pc->wallpapers[boxno] = wallpaper;
+ SaveSetDirtyBit();
+ return;
+ }
+ GF_ASSERT(0);
+}
+
+void PCStorage_GetBoxName(struct PCStorage * pc, int boxno, struct String * ret)
+{
+ if (boxno == -1)
+ boxno = (int)pc->curBox;
+ if (boxno < NUM_BOXES)
+ {
+ CopyU16ArrayToString(ret, pc->names[boxno]);
+ return;
+ }
+ GF_ASSERT(0);
+}
+
+void PCStorage_SetBoxName(struct PCStorage * pc, int boxno, struct String * src)
+{
+ if (boxno == -1)
+ boxno = (int)pc->curBox;
+ if (boxno < NUM_BOXES)
+ {
+ CopyStringToU16Array(src, pc->names[boxno], BOX_NAME_LENGTH);
+ SaveSetDirtyBit();
+ }
+}
+
+int PCStorage_CountMonsAndEggsInBox(struct PCStorage * pc, int boxno)
+{
+ if (boxno == -1)
+ boxno = (int)pc->curBox;
+ if (boxno < NUM_BOXES)
+ {
+ int i, count = 0;
+ for (i = 0; i < (int)MONS_PER_BOX; i++)
+ {
+ if (GetBoxMonData(&pc->boxes[boxno][i], MON_DATA_SPECIES_EXISTS, NULL))
+ count++;
+ }
+ return count;
+ }
+ GF_ASSERT(0);
+ return 0;
+}
+
+int PCStorage_CountMonsInBox(struct PCStorage * pc, int boxno)
+{
+ if (boxno == -1)
+ boxno = (int)pc->curBox;
+ if (boxno < NUM_BOXES)
+ {
+ int i, count = 0;
+ for (i = 0; i < (int)MONS_PER_BOX; i++)
+ {
+ if (GetBoxMonData(&pc->boxes[boxno][i], MON_DATA_SPECIES_EXISTS, NULL) && !GetBoxMonData(&pc->boxes[boxno][i], MON_DATA_IS_EGG, NULL))
+ count++;
+ }
+ return count;
+ }
+ GF_ASSERT(0);
+ return 0;
+}
+
+int PCStorage_CountMonsInAllBoxes(struct PCStorage * pc)
+{
+ int count, i;
+ for (i = 0, count = 0; i < NUM_BOXES; i++)
+ {
+ count += PCStorage_CountMonsInBox(pc, i);
+ }
+ return count;
+}
+
+void PCStorage_SetBoxMonDataByIndexPair(struct PCStorage * pc, int boxno, int slotno, u32 attr, void * value)
+{
+ if (boxno >= NUM_BOXES)
+ GF_ASSERT(boxno == -1);
+ GF_ASSERT(slotno < MONS_PER_BOX);
+ if (boxno == -1)
+ boxno = (int)pc->curBox;
+ SetBoxMonData(&pc->boxes[boxno][slotno], (int)attr, value);
+ SaveSetDirtyBit();
+}
+
+struct BoxPokemon * PCStorage_GetMonByIndexPair(struct PCStorage * pc, int boxno, int slotno)
+{
+ if (boxno >= NUM_BOXES)
+ GF_ASSERT(boxno == -1);
+ GF_ASSERT(slotno < MONS_PER_BOX);
+ if (boxno == -1)
+ boxno = (int)pc->curBox;
+ return &pc->boxes[boxno][slotno];
+}
+
+void PCStorage_UnlockBonusWallpaper(struct PCStorage * pc, int wallpaper)
+{
+ GF_ASSERT(wallpaper < NUM_BONUS_WALLPAPERS);
+ pc->unlockedWallpapers |= (1u << wallpaper);
+ SaveSetDirtyBit();
+}
+
+BOOL PCStorage_IsBonusWallpaperUnlocked(struct PCStorage * pc, int wallpaper)
+{
+ GF_ASSERT(wallpaper < NUM_BONUS_WALLPAPERS);
+ return (pc->unlockedWallpapers & (1u << wallpaper)) != 0;
+}
+
+int PCStorage_CountUnlockedBonusWallpapers(struct PCStorage * pc)
+{
+ int i, count;
+ for (i = 0, count = 0; i < NUM_BONUS_WALLPAPERS; i++)
+ {
+ if (PCStorage_IsBonusWallpaperUnlocked(pc, i))
+ count++;
+ }
+ return count;
+}
diff --git a/include/pokemon_storage_system.h b/include/pokemon_storage_system.h
new file mode 100644
index 00000000..c9dc6f29
--- /dev/null
+++ b/include/pokemon_storage_system.h
@@ -0,0 +1,48 @@
+#ifndef POKEDIAMOND_POKEMON_STORAGE_SYSTEM_H
+#define POKEDIAMOND_POKEMON_STORAGE_SYSTEM_H
+
+#include "pokemon.h"
+
+#define NUM_BOXES 18u
+#define MONS_PER_BOX 30u
+#define BOX_NAME_LENGTH 20u
+#define NUM_DEFAULT_WALLPAPERS 16u
+#define NUM_BONUS_WALLPAPERS 8u
+#define NUM_WALLPAPERS ((u32)(NUM_DEFAULT_WALLPAPERS + NUM_BONUS_WALLPAPERS))
+
+struct PCStorage
+{
+ /* 0x00000 */ u32 curBox;
+ /* 0x00004 */ struct BoxPokemon boxes[NUM_BOXES][MONS_PER_BOX];
+ /* 0x11EE4 */ u16 names[NUM_BOXES][BOX_NAME_LENGTH];
+ /* 0x121B4 */ u8 wallpapers[NUM_BOXES];
+ /* 0x121C6 */ u8 unlockedWallpapers;
+ /* 0x121C7 */ u8 pad_byte; // suppresses mwcc warning
+};
+
+void PCStorage_init(struct PCStorage * pc);
+u32 PCStorage_sizeof(void);
+void PCStorage_InitializeBoxes(struct PCStorage * pc);
+BOOL PCStorage_PlaceMonInFirstEmptySlotInAnyBox(struct PCStorage * pc, struct BoxPokemon * boxmon);
+BOOL PCStorage_PlaceMonInBoxFirstEmptySlot(struct PCStorage * pc, int boxno, struct BoxPokemon * boxmon);
+BOOL PCStorage_PlaceMonInBoxByIndexPair(struct PCStorage * pc, int boxno, int slotno, struct BoxPokemon * boxmon);
+void PCStorage_DeleteBoxMonByIndexPair(struct PCStorage * pc, int boxno, int slotno);
+int PCStorage_GetActiveBox(struct PCStorage * pc);
+int PCStorage_FindFirstBoxWithEmptySlot(struct PCStorage * pc);
+BOOL PCStorage_FindFirstEmptySlot(struct PCStorage * pc, int * boxno, int * slotno);
+int PCStorage_CountMonsAndEggsInAllBoxes(struct PCStorage * pc);
+void PCStorage_SetActiveBox(struct PCStorage * pc, int boxno);
+u8 PCStorage_GetBoxWallpaper(struct PCStorage * pc, int boxno);
+void PCStorage_SetBoxWallpaper(struct PCStorage * pc, int boxno, u8 wallpaper);
+void PCStorage_GetBoxName(struct PCStorage * pc, int boxno, struct String * ret);
+void PCStorage_SetBoxName(struct PCStorage * pc, int boxno, struct String * src);
+int PCStorage_CountMonsAndEggsInBox(struct PCStorage * pc, int boxno);
+int PCStorage_CountMonsInBox(struct PCStorage * pc, int boxno);
+int PCStorage_CountMonsInAllBoxes(struct PCStorage * pc);
+void PCStorage_SetBoxMonDataByIndexPair(struct PCStorage * pc, int boxno, int slotno, u32 attr, void * value);
+struct BoxPokemon * PCStorage_GetMonByIndexPair(struct PCStorage * pc, int boxno, int slotno);
+void PCStorage_UnlockBonusWallpaper(struct PCStorage * pc, int wallpaper);
+BOOL PCStorage_IsBonusWallpaperUnlocked(struct PCStorage * pc, int wallpaper);
+int PCStorage_CountUnlockedBonusWallpapers(struct PCStorage * pc);
+
+#endif //POKEDIAMOND_POKEMON_STORAGE_SYSTEM_H