diff options
author | PikalaxALT <pikalaxalt@gmail.com> | 2020-08-19 17:27:36 -0400 |
---|---|---|
committer | PikalaxALT <pikalaxalt@gmail.com> | 2020-08-19 17:27:36 -0400 |
commit | bde92c30125ebcc8a5fa98497e93ae89ebc28230 (patch) | |
tree | 65b859b6708b5844ef8601d6a8c0450d3bf31fa9 | |
parent | cd9bca320c7e6950402ed7b176d972d31d40aac2 (diff) |
Decompile pokemon_storage_system
-rw-r--r-- | arm9/asm/pokemon_storage_system.s | 737 | ||||
-rw-r--r-- | arm9/src/pokemon_storage_system.c | 322 | ||||
-rw-r--r-- | include/pokemon_storage_system.h | 48 |
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 |