mirror of
https://github.com/pret/pokediamond.git
synced 2026-08-28 03:34:38 -05:00
Decompile pokemon_storage_system
This commit is contained in:
@@ -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}
|
||||
322
arm9/src/pokemon_storage_system.c
Normal file
322
arm9/src/pokemon_storage_system.c
Normal file
@@ -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;
|
||||
}
|
||||
48
include/pokemon_storage_system.h
Normal file
48
include/pokemon_storage_system.h
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user