Decompile pokemon_storage_system

This commit is contained in:
PikalaxALT
2020-08-19 17:27:36 -04:00
parent cd9bca320c
commit bde92c3012
3 changed files with 370 additions and 737 deletions

View File

@@ -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}

View 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;
}

View 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