more wonder mail decomp

This commit is contained in:
Seth Barberee
2022-06-11 20:01:36 -05:00
parent bf5b67c5aa
commit b6bafe4527
6 changed files with 436 additions and 685 deletions

View File

@@ -1,673 +0,0 @@
#include "asm/constants/gba_constants.inc"
#include "asm/macros.inc"
.syntax unified
.text
thumb_func_start sub_802BF30
sub_802BF30:
push {r4,lr}
ldr r4, _0802BF9C
ldr r0, [r4]
adds r0, 0xA0
movs r2, 0
movs r1, 0x1
strb r1, [r0]
ldr r0, [r4]
adds r0, 0xA1
strb r2, [r0]
ldr r0, [r4]
adds r0, 0xA2
movs r1, 0xC
strb r1, [r0]
ldr r0, [r4]
adds r0, 0xA3
strb r2, [r0]
ldr r0, [r4]
movs r1, 0x1E
ldrsh r0, [r0, r1]
movs r1, 0x18
bl sub_8009614
adds r0, 0x2
lsls r0, 16
ldr r2, [r4]
ldr r3, [r2, 0x38]
lsls r1, r3, 1
adds r1, r3
lsls r1, 3
adds r1, r2, r1
adds r1, 0x4E
asrs r3, r0, 16
lsrs r0, 16
strh r0, [r1]
ldr r1, [r2, 0x38]
lsls r0, r1, 1
adds r0, r1
lsls r0, 3
adds r2, r0
adds r3, 0x2
adds r2, 0x50
strh r3, [r2]
bl ResetUnusedInputStruct
ldr r0, [r4]
adds r0, 0x40
movs r1, 0x1
movs r2, 0x1
bl sub_800641C
pop {r4}
pop {r0}
bx r0
.align 2, 0
_0802BF9C: .4byte gUnknown_203B2D8
thumb_func_end sub_802BF30
thumb_func_start CreateMailMenu
CreateMailMenu:
push {r4-r7,lr}
mov r7, r9
mov r6, r8
push {r6,r7}
sub sp, 0xDC
ldr r4, _0802C060
ldr r0, [r4]
ldr r0, [r0, 0x38]
bl sub_8008C54
ldr r0, [r4]
ldr r0, [r0, 0x38]
bl sub_80073B8
ldr r1, [r4]
movs r2, 0x22
ldrsh r0, [r1, r2]
lsls r0, 3
adds r0, 0xA
ldr r2, _0802C064
ldr r3, [r1, 0x38]
movs r1, 0
str r1, [sp]
bl xxx_call_draw_string
movs r6, 0
ldr r0, [r4]
movs r3, 0x1E
ldrsh r0, [r0, r3]
cmp r6, r0
bge _0802C09A
adds r7, r4, 0
ldr r0, _0802C068
mov r9, r0
add r1, sp, 0x5C
mov r8, r1
_0802BFE8:
ldr r1, [r7]
movs r3, 0x22
ldrsh r2, [r1, r3]
movs r3, 0x20
ldrsh r0, [r1, r3]
muls r0, r2
adds r0, r6
adds r1, r0
ldrb r0, [r1]
bl sub_8095FE8
adds r5, r0, 0
ldr r0, [r7]
ldr r1, [r0, 0x38]
str r1, [sp, 0x4]
adds r0, 0x4
adds r1, r6, 0
bl sub_8013800
str r0, [sp, 0x4C]
ldrb r0, [r5]
cmp r0, 0x1
bne _0802C06C
ldr r0, [r7]
adds r0, 0x4
adds r1, r6, 0
bl sub_8013800
adds r4, r0, 0
ldr r0, [r7]
ldr r3, [r0, 0x38]
movs r0, 0xA
adds r1, r4, 0
movs r2, 0x6
bl sub_803B6B0
bl GetPlayerPokemonStruct
adds r1, r0, 0
mov r0, r9
bl PrintPokeNameToBuffer
ldrb r0, [r5, 0x5]
bl GetPokemonMailHeadline
adds r1, r0, 0
mov r0, r8
mov r2, r9
bl sprintf_2
ldr r0, [r7]
ldr r3, [r0, 0x38]
movs r0, 0
str r0, [sp]
movs r0, 0x15
adds r1, r4, 0
mov r2, r8
bl xxx_call_draw_string
b _0802C08E
.align 2, 0
_0802C060: .4byte gUnknown_203B2D8
_0802C064: .4byte gMailboxText
_0802C068: .4byte gAvailablePokemonNames
_0802C06C:
adds r0, r5, 0
add r1, sp, 0x4
bl sub_803B35C
adds r0, r5, 0
bl sub_80968B0
lsls r0, 24
cmp r0, 0
beq _0802C088
mov r1, sp
adds r1, 0x47
movs r0, 0x2
strb r0, [r1]
_0802C088:
add r0, sp, 0x4
bl sub_803B6D4
_0802C08E:
adds r6, 0x1
ldr r0, [r7]
movs r1, 0x1E
ldrsh r0, [r0, r1]
cmp r6, r0
blt _0802BFE8
_0802C09A:
ldr r0, _0802C0B4
ldr r0, [r0]
ldr r0, [r0, 0x38]
bl sub_80073E0
add sp, 0xDC
pop {r3,r4}
mov r8, r3
mov r9, r4
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_0802C0B4: .4byte gUnknown_203B2D8
thumb_func_end CreateMailMenu
thumb_func_start CountEmptyMailSlots
CountEmptyMailSlots:
push {r4,r5,lr}
movs r5, 0
movs r4, 0
_0802C0BE:
lsls r0, r4, 24
lsrs r0, 24
bl IsMailSlotEmpty
lsls r0, 24
cmp r0, 0
bne _0802C0D6
ldr r0, _0802C0E4
ldr r0, [r0]
adds r0, r5
strb r4, [r0]
adds r5, 0x1
_0802C0D6:
adds r4, 0x1
cmp r4, 0x3
ble _0802C0BE
adds r0, r5, 0
pop {r4,r5}
pop {r1}
bx r1
.align 2, 0
_0802C0E4: .4byte gUnknown_203B2D8
thumb_func_end CountEmptyMailSlots
thumb_func_start HasNoMailinMailbox
HasNoMailinMailbox:
push {r4,lr}
movs r4, 0
_0802C0EC:
lsls r0, r4, 24
lsrs r0, 24
bl IsMailSlotEmpty
lsls r0, 24
cmp r0, 0
bne _0802C0FE
movs r0, 0
b _0802C106
_0802C0FE:
adds r4, 0x1
cmp r4, 0x3
ble _0802C0EC
movs r0, 0x1
_0802C106:
pop {r4}
pop {r1}
bx r1
thumb_func_end HasNoMailinMailbox
thumb_func_start sub_802C10C
sub_802C10C:
push {r4-r7,lr}
mov r7, r8
push {r7}
adds r6, r0, 0
adds r4, r1, 0
mov r8, r2
bl sub_802C4A4
lsls r0, 24
cmp r0, 0
beq _0802C126
movs r0, 0
b _0802C1CC
_0802C126:
ldr r5, _0802C1D8
ldr r0, [r5]
cmp r0, 0
bne _0802C138
movs r0, 0xA8
movs r1, 0x8
bl MemoryAlloc
str r0, [r5]
_0802C138:
ldr r0, [r5]
str r6, [r0, 0x3C]
lsls r1, r6, 1
adds r1, r6
lsls r1, 3
adds r1, 0x44
adds r1, r0, r1
str r1, [r0, 0x40]
adds r0, 0x44
bl sub_8006518
ldr r1, [r5]
ldr r2, [r1, 0x3C]
lsls r0, r2, 1
adds r0, r2
lsls r0, 3
adds r1, r0
adds r1, 0x44
ldr r0, _0802C1DC
ldm r0!, {r2,r3,r7}
stm r1!, {r2,r3,r7}
ldm r0!, {r2,r3,r7}
stm r1!, {r2,r3,r7}
ldr r2, [r5]
ldr r1, [r2, 0x40]
adds r0, r2, 0
adds r0, 0xA4
str r0, [r1, 0x14]
cmp r4, 0
beq _0802C186
ldr r1, [r2, 0x3C]
lsls r0, r1, 1
adds r0, r1
lsls r0, 3
adds r1, r2, 0
adds r1, 0x4C
adds r1, r0
ldr r0, [r4]
str r0, [r1]
_0802C186:
ldr r0, [r5]
ldr r0, [r0, 0x40]
mov r1, r8
bl sub_8012D34
bl ResetUnusedInputStruct
ldr r0, [r5]
adds r0, 0x44
movs r1, 0x1
movs r2, 0x1
bl sub_800641C
ldr r4, [r5]
adds r4, 0x8
bl sub_802C474
adds r1, r0, 0
adds r0, r4, 0
mov r2, r8
adds r3, r6, 0
bl sub_8013848
ldr r0, [r5]
ldr r1, _0802C1E0
ldrh r1, [r1]
strh r1, [r0, 0x20]
adds r0, 0x8
bl sub_8013984
bl sub_802C328
bl sub_802C39C
movs r0, 0x1
_0802C1CC:
pop {r3}
mov r8, r3
pop {r4-r7}
pop {r1}
bx r1
.align 2, 0
_0802C1D8: .4byte gUnknown_203B2E0
_0802C1DC: .4byte gUnknown_80DFCB4
_0802C1E0: .4byte gUnknown_203B2E4
thumb_func_end sub_802C10C
thumb_func_start sub_802C1E4
sub_802C1E4:
push {lr}
lsls r0, 24
cmp r0, 0
bne _0802C200
ldr r0, _0802C1FC
ldr r0, [r0]
adds r0, 0x8
bl sub_8013660
movs r0, 0
b _0802C266
.align 2, 0
_0802C1FC: .4byte gUnknown_203B2E0
_0802C200:
ldr r0, _0802C218
ldr r0, [r0]
adds r0, 0x8
bl GetKeyPress
cmp r0, 0x2
beq _0802C222
cmp r0, 0x2
bgt _0802C21C
cmp r0, 0x1
beq _0802C22C
b _0802C240
.align 2, 0
_0802C218: .4byte gUnknown_203B2E0
_0802C21C:
cmp r0, 0x4
beq _0802C236
b _0802C240
_0802C222:
movs r0, 0x1
bl PlayMenuSoundEffect
movs r0, 0x2
b _0802C266
_0802C22C:
movs r0, 0
bl PlayMenuSoundEffect
movs r0, 0x3
b _0802C266
_0802C236:
movs r0, 0x4
bl PlayMenuSoundEffect
movs r0, 0x4
b _0802C266
_0802C240:
ldr r0, _0802C258
ldr r0, [r0]
adds r0, 0x8
movs r1, 0x1
bl sub_80138B8
lsls r0, 24
cmp r0, 0
bne _0802C25C
movs r0, 0
b _0802C266
.align 2, 0
_0802C258: .4byte gUnknown_203B2E0
_0802C25C:
bl sub_802C328
bl sub_802C39C
movs r0, 0x1
_0802C266:
pop {r1}
bx r1
thumb_func_end sub_802C1E4
thumb_func_start sub_802C26C
sub_802C26C:
ldr r0, _0802C288
ldr r1, [r0]
movs r0, 0x26
ldrsh r2, [r1, r0]
movs r3, 0x24
ldrsh r0, [r1, r3]
muls r0, r2
movs r3, 0x20
ldrsh r2, [r1, r3]
adds r0, r2
adds r1, r0
ldrb r0, [r1]
bx lr
.align 2, 0
_0802C288: .4byte gUnknown_203B2E0
thumb_func_end sub_802C26C
thumb_func_start sub_802C28C
sub_802C28C:
push {r4,r5,lr}
adds r4, r0, 0
lsls r4, 24
lsrs r4, 24
bl ResetUnusedInputStruct
ldr r5, _0802C2D0
ldr r0, [r5]
adds r0, 0x44
movs r1, 0
movs r2, 0
bl sub_800641C
bl sub_802C474
adds r1, r0, 0
ldr r0, [r5]
strh r1, [r0, 0x2A]
adds r0, 0x8
bl sub_8013984
bl sub_802C328
bl sub_802C39C
cmp r4, 0
beq _0802C2CA
ldr r0, [r5]
adds r0, 0x8
bl AddMenuCursorSprite
_0802C2CA:
pop {r4,r5}
pop {r0}
bx r0
.align 2, 0
_0802C2D0: .4byte gUnknown_203B2E0
thumb_func_end sub_802C28C
thumb_func_start sub_802C2D4
sub_802C2D4:
push {r4,r5,lr}
ldr r4, _0802C31C
ldr r2, [r4]
cmp r2, 0
beq _0802C314
ldr r1, _0802C320
ldrh r0, [r2, 0x20]
strh r0, [r1]
ldr r0, [r2, 0x3C]
lsls r1, r0, 1
adds r1, r0
lsls r1, 3
adds r1, r2, r1
adds r1, 0x44
ldr r0, _0802C324
ldm r0!, {r2,r3,r5}
stm r1!, {r2,r3,r5}
ldm r0!, {r2,r3,r5}
stm r1!, {r2,r3,r5}
bl ResetUnusedInputStruct
ldr r0, [r4]
adds r0, 0x44
movs r1, 0x1
movs r2, 0x1
bl sub_800641C
ldr r0, [r4]
bl MemoryFree
movs r0, 0
str r0, [r4]
_0802C314:
pop {r4,r5}
pop {r0}
bx r0
.align 2, 0
_0802C31C: .4byte gUnknown_203B2E0
_0802C320: .4byte gUnknown_203B2E4
_0802C324: .4byte gUnknown_80DFC9C
thumb_func_end sub_802C2D4
thumb_func_start sub_802C328
sub_802C328:
push {r4,lr}
ldr r4, _0802C398
ldr r0, [r4]
ldrh r1, [r0, 0x28]
adds r0, 0xA4
movs r2, 0
strb r1, [r0]
ldr r0, [r4]
ldrh r1, [r0, 0x26]
adds r0, 0xA5
strb r1, [r0]
ldr r0, [r4]
adds r0, 0xA6
movs r1, 0xC
strb r1, [r0]
ldr r0, [r4]
adds r0, 0xA7
strb r2, [r0]
ldr r0, [r4]
movs r1, 0x22
ldrsh r0, [r0, r1]
movs r1, 0x18
bl sub_8009614
adds r0, 0x2
lsls r0, 16
ldr r2, [r4]
ldr r3, [r2, 0x3C]
lsls r1, r3, 1
adds r1, r3
lsls r1, 3
adds r1, r2, r1
adds r1, 0x52
asrs r3, r0, 16
lsrs r0, 16
strh r0, [r1]
ldr r1, [r2, 0x3C]
lsls r0, r1, 1
adds r0, r1
lsls r0, 3
adds r2, r0
adds r3, 0x2
adds r2, 0x54
strh r3, [r2]
bl ResetUnusedInputStruct
ldr r0, [r4]
adds r0, 0x44
movs r1, 0x1
movs r2, 0x1
bl sub_800641C
pop {r4}
pop {r0}
bx r0
.align 2, 0
_0802C398: .4byte gUnknown_203B2E0
thumb_func_end sub_802C328
thumb_func_start sub_802C39C
sub_802C39C:
push {r4-r7,lr}
sub sp, 0x60
ldr r7, _0802C3F8
ldr r0, [r7]
ldr r0, [r0, 0x3C]
bl sub_8008C54
ldr r0, [r7]
ldr r0, [r0, 0x3C]
bl sub_80073B8
ldr r0, [r7]
movs r1, 0x26
ldrsh r4, [r0, r1]
lsls r4, 3
adds r5, r4, 0
adds r5, 0xA
ldr r2, _0802C3FC
ldr r3, [r0, 0x3C]
movs r0, 0
str r0, [sp]
adds r0, r5, 0
movs r1, 0
bl xxx_call_draw_string
adds r4, 0x4
ldr r1, [r7]
adds r0, r1, 0
adds r0, 0xA6
ldrb r0, [r0]
lsls r0, 3
adds r5, r4, r0
movs r3, 0x26
ldrsh r2, [r1, r3]
adds r2, 0x1
movs r0, 0x7
str r0, [sp]
ldr r0, [r1, 0x3C]
str r0, [sp, 0x4]
adds r0, r5, 0
movs r1, 0
movs r3, 0x2
bl sub_8012BC4
movs r6, 0
b _0802C452
.align 2, 0
_0802C3F8: .4byte gUnknown_203B2E0
_0802C3FC: .4byte gBulletinBoardText
_0802C400:
ldr r1, [r7]
movs r3, 0x26
ldrsh r2, [r1, r3]
movs r3, 0x24
ldrsh r0, [r1, r3]
muls r0, r2
adds r0, r6
adds r1, r0
ldrb r5, [r1]
adds r0, r5, 0
bl sub_8096574
adds r4, r0, 0
ldr r0, [r7]
ldr r1, [r0, 0x3C]
str r1, [sp, 0x8]
adds r0, 0x8
adds r1, r6, 0
bl sub_8013800
str r0, [sp, 0x50]
adds r0, r4, 0
add r1, sp, 0x8
bl sub_803B35C
adds r0, r5, 0
bl sub_8096574
bl sub_80968B0
lsls r0, 24
cmp r0, 0
beq _0802C44A
mov r1, sp
adds r1, 0x4B
movs r0, 0x2
strb r0, [r1]
_0802C44A:
add r0, sp, 0x8
bl sub_803B6D4
adds r6, 0x1
_0802C452:
ldr r0, [r7]
movs r1, 0x22
ldrsh r0, [r0, r1]
cmp r6, r0
blt _0802C400
ldr r0, _0802C470
ldr r0, [r0]
ldr r0, [r0, 0x3C]
bl sub_80073E0
add sp, 0x60
pop {r4-r7}
pop {r0}
bx r0
.align 2, 0
_0802C470: .4byte gUnknown_203B2E0
thumb_func_end sub_802C39C
.align 2,0

View File

@@ -2,5 +2,6 @@
#define GUARD_CONSTANTS_MAILBOX_H
#define MAX_ACCEPTED_JOBS 8
#define NUM_MAILBOX_SLOTS 4
#endif // GUARD_CONSTANTS_MAILBOX_H

View File

@@ -125,7 +125,7 @@ SECTIONS {
src/wonder_mail.o(.text);
src/thank_you_wonder_mail.o(.text);
src/wonder_mail_2.o(.text);
asm/wonder_mail_2.o(.text);
src/wonder_mail_2_mid.o(.text);
src/wonder_mail_2_1.o(.text);
asm/wonder_mail_802C860.o(.text);
src/wonder_mail_3.o(.text);

View File

@@ -643,7 +643,7 @@ void sub_802B880(void)
void sub_802B8D4(void)
{
s32 iVar2;
s32 retvar;
s32 y;
s32 new_index;
u8 mailIndex;
@@ -654,12 +654,12 @@ void sub_802B8D4(void)
sub_8012BC4(((gUnknown_80DFBE8[2] << 3) + 4), 0, gUnknown_203B2CC->unk56 + 1, 2, 7, gUnknown_203B2CC->unk6C);
for(iVar2 = 0; iVar2 < gUnknown_203B2CC->unk52; iVar2++)
{
retvar = sub_8013800(&gUnknown_203B2CC->unk38, iVar2);
y = sub_8013800(&gUnknown_203B2CC->unk38, iVar2);
new_index = (gUnknown_203B2CC->unk56 * gUnknown_203B2CC->unk54) + iVar2;
mailIndex = gUnknown_203B2CC->receivedNewsletters[new_index];
sub_803B6B0(0xA, retvar, 6, gUnknown_203B2CC->unk6C);
sub_803B6B0(0xA, y, 6, gUnknown_203B2CC->unk6C);
sub_802BC7C();
xxx_format_and_draw(0x15, retvar, GetPokemonMailHeadline(mailIndex), gUnknown_203B2CC->unk6C, 0);
xxx_format_and_draw(0x15, y, GetPokemonMailHeadline(mailIndex), gUnknown_203B2CC->unk6C, 0);
}
sub_80073E0(gUnknown_203B2CC->unk6C);
}
@@ -953,3 +953,63 @@ void sub_802BEDC(void)
gUnknown_203B2D8 = NULL;
}
}
NAKED
void sub_802BF30(void)
{
asm_unified(
"\tpush {r4,lr}\n"
"\tldr r4, _0802BF9C\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0xA0\n"
"\tmovs r2, 0\n"
"\tmovs r1, 0x1\n"
"\tstrb r1, [r0]\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0xA1\n"
"\tstrb r2, [r0]\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0xA2\n"
"\tmovs r1, 0xC\n"
"\tstrb r1, [r0]\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0xA3\n"
"\tstrb r2, [r0]\n"
"\tldr r0, [r4]\n"
"\tmovs r1, 0x1E\n"
"\tldrsh r0, [r0, r1]\n"
"\tmovs r1, 0x18\n"
"\tbl sub_8009614\n"
"\tadds r0, 0x2\n"
"\tlsls r0, 16\n"
"\tldr r2, [r4]\n"
"\tldr r3, [r2, 0x38]\n"
"\tlsls r1, r3, 1\n"
"\tadds r1, r3\n"
"\tlsls r1, 3\n"
"\tadds r1, r2, r1\n"
"\tadds r1, 0x4E\n"
"\tasrs r3, r0, 16\n"
"\tlsrs r0, 16\n"
"\tstrh r0, [r1]\n"
"\tldr r1, [r2, 0x38]\n"
"\tlsls r0, r1, 1\n"
"\tadds r0, r1\n"
"\tlsls r0, 3\n"
"\tadds r2, r0\n"
"\tadds r3, 0x2\n"
"\tadds r2, 0x50\n"
"\tstrh r3, [r2]\n"
"\tbl ResetUnusedInputStruct\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0x40\n"
"\tmovs r1, 0x1\n"
"\tmovs r2, 0x1\n"
"\tbl sub_800641C\n"
"\tpop {r4}\n"
"\tpop {r0}\n"
"\tbx r0\n"
"\t.align 2, 0\n"
"_0802BF9C: .4byte gUnknown_203B2D8"
);
}

View File

@@ -5,6 +5,12 @@
#include "text.h"
#include "menu.h"
struct unkStruct_802C39C
{
/* 0x0 */ u32 local_6c[15];
/* 0x3C */ u8 local_29[12];
/* 0x48 */ u32 local_24[4];
};
struct unkStruct_203B2E8
{
@@ -143,7 +149,7 @@ extern s32 sub_8013800(void *, u32);
extern void sub_803B35C(void *, u32 *);
extern void xxx_call_draw_string(u32, u32, const u8 *, u32, u32);
extern void sub_8012BC4(u32 x, u32 y, u32, u32, u32, u32);
extern void sub_803B6D4(u32 *);
extern void sub_803B6D4(void *);
extern void sub_8013984(u32 *);
extern void sub_802C6DC(void);
@@ -356,8 +362,7 @@ void sub_802C750(void)
int iVar2;
s32 r4;
s32 r5;
u32 auStack104 [18];
u32 uStack32[4];
struct unkStruct_802C39C local;
sub_8008C54(gUnknown_203B2E8->unk3C);
sub_80073B8(gUnknown_203B2E8->unk3C);
@@ -374,10 +379,10 @@ void sub_802C750(void)
do
{
uVar1 = GetJobSlotInfo(gUnknown_203B2E8->unk0[gUnknown_203B2E8->unk26 * gUnknown_203B2E8->unk24 + iVar2]);
auStack104[0] = gUnknown_203B2E8->unk3C;
uStack32[0] = sub_8013800(&gUnknown_203B2E8->unk8,iVar2);
sub_803B35C(uVar1,auStack104);
sub_803B6D4(auStack104);
local.local_6c[0] = gUnknown_203B2E8->unk3C;
local.local_24[0] = sub_8013800(&gUnknown_203B2E8->unk8,iVar2);
sub_803B35C(uVar1,local.local_6c);
sub_803B6D4(&local);
iVar2++;
} while( iVar2 < gUnknown_203B2E8->unk22);
sub_80073E0(gUnknown_203B2E8->unk3C);

358
src/wonder_mail_2_mid.c Normal file
View File

@@ -0,0 +1,358 @@
#include "global.h"
#include "constants/mailbox.h"
#include "code_800D090.h"
#include "input.h"
#include "memory.h"
#include "text.h"
#include "pokemon_mail.h"
bool8 IsMailSlotEmpty(u8);
extern void sub_8013984(void *);
extern void sub_8013848(u32 *, s32, u32, u32);
extern s32 sub_802C474(void);
extern void sub_8012D34(struct UnkTextStruct2 *, u32);
extern void sub_802C328(void);
extern void sub_802C39C(void);
extern void PlayMenuSoundEffect(u32);
extern void sub_8013660(u32 *);
extern s32 GetKeyPress(u32 *);
extern bool8 sub_80138B8(u32 *, u32);
extern void AddMenuCursorSprite(u32 *);
extern u8 sub_802C4A4(void);
extern void sub_8008C54(u32);
extern void sub_80073B8(u32);
extern void sub_80073E0(u32);
extern s32 sub_8013800(u32 *, s32);
extern u8 *sub_8096574(u32);
extern void sub_803B35C(u8 *, u32 *);
extern u8 gBulletinBoardText[];
extern u8 sub_80968B0(u8 *);
extern void sub_803B6D4(void *);
extern void xxx_call_draw_string(s32, s32, u8 *, s32, s32);
extern void sub_8012BC4(s32, s32, s32, s32 ,s32 ,s32);
struct unkStruct_203B2D8
{
// size: 0xA4
u8 unk0[4];
u32 unk4;
u8 fill8[0x1C - 0x8];
s16 unk1C;
s16 unk1E;
s16 unk20;
s16 unk22;
s16 fill24;
/* 0x26 */ s16 emptyMailSlots;
u8 fill28[0x38 - 0x28];
u32 unk38;
struct UnkTextStruct2 *unk3C;
struct UnkTextStruct2 unk40[4];
u8 unkA0[4];
};
extern struct unkStruct_203B2D8 *gUnknown_203B2D8;
struct unkStruct_203B2E0
{
// size: 0xA8
u8 unk0[0x8];
u32 unk8;
u8 unkC[0x20 - 0xC];
s16 unk20;
s16 unk22;
s16 unk24;
s16 unk26;
s16 unk28;
s16 unk2A;
u8 fill22[0x3C - 0x2C];
s32 unk3C;
struct UnkTextStruct2 *unk40;
struct UnkTextStruct2 unk44[4];
u8 unkA4[4];
};
extern struct unkStruct_203B2E0 *gUnknown_203B2E0;
struct unkStruct_802C39C
{
/* 0x0 */ u32 local_6c[15];
/* 0x3C */ u8 local_29[12];
/* 0x48 */ u32 local_24[4];
};
extern struct UnkTextStruct2 gUnknown_80DFCB4;
extern struct UnkTextStruct2 gUnknown_80DFC9C;
extern u16 gUnknown_203B2E4;
extern u8 *sub_8095FE8(u8);
extern u8 sub_80968B0(u8 *);
extern void sub_803B35C(u8 *, u32 *);
extern void sub_803B6D4(void *);
extern struct PokemonStruct *GetPlayerPokemonStruct(void);
extern u8 gMailboxText[];
extern u8 gAvailablePokemonNames[];
extern void PrintPokeNameToBuffer(u8 *buffer, struct PokemonStruct *pokemon);
extern void sub_803B6B0(u32, u32, u32, u32);
void CreateMailMenu(void)
{
u8 *pcVar2;
s32 y;
s32 iVar5;
struct unkStruct_802C39C local;
u8 buffer [128];
sub_8008C54(gUnknown_203B2D8->unk38);
sub_80073B8(gUnknown_203B2D8->unk38);
xxx_call_draw_string(gUnknown_203B2D8->unk22 * 8 + 10,0,gMailboxText,gUnknown_203B2D8->unk38,0);
iVar5 = 0;
if (iVar5 < gUnknown_203B2D8->unk1E) {
do {
pcVar2 = sub_8095FE8(gUnknown_203B2D8->unk0[(gUnknown_203B2D8->unk22 * gUnknown_203B2D8->unk20) + iVar5]);
local.local_6c[0] = gUnknown_203B2D8->unk38;
local.local_24[0] = sub_8013800(&gUnknown_203B2D8->unk4, iVar5);
if (*pcVar2 == 1) {
y = sub_8013800(&gUnknown_203B2D8->unk4, iVar5);
sub_803B6B0(10,y,6,gUnknown_203B2D8->unk38);
PrintPokeNameToBuffer(gAvailablePokemonNames, GetPlayerPokemonStruct());
sprintf_2(buffer, GetPokemonMailHeadline(pcVar2[5]), gAvailablePokemonNames);
xxx_call_draw_string(0x15,y,buffer,gUnknown_203B2D8->unk38,0);
}
else {
sub_803B35C(pcVar2,local.local_6c);
if (sub_80968B0(pcVar2) != 0) {
local.local_29[7] = 2;
}
sub_803B6D4(&local);
}
iVar5++;
} while (iVar5 < gUnknown_203B2D8->unk1E);
}
sub_80073E0(gUnknown_203B2D8->unk38);
}
s32 CountEmptyMailSlots(void)
{
s32 mailSlots;
s32 index;
mailSlots = 0;
for(index = 0; index < NUM_MAILBOX_SLOTS; index++)
{
if(!IsMailSlotEmpty(index))
{
gUnknown_203B2D8->unk0[mailSlots] = index;
mailSlots++;
}
}
return mailSlots;
}
bool8 HasNoMailinMailbox(void)
{
s32 index;
for(index = 0; index < NUM_MAILBOX_SLOTS; index++)
{
if(!IsMailSlotEmpty(index))
return FALSE;
}
return TRUE;
}
bool8 sub_802C10C(s32 param_1,struct UnkTextStruct2_sub *param_2,s32 param_3)
{
if (sub_802C4A4() != 0) {
return FALSE;
}
else
{
if (gUnknown_203B2E0 == NULL) {
gUnknown_203B2E0 = MemoryAlloc(sizeof(struct unkStruct_203B2E0),8);
}
gUnknown_203B2E0->unk3C = param_1;
gUnknown_203B2E0->unk40 = &gUnknown_203B2E0->unk44[param_1];
sub_8006518(gUnknown_203B2E0->unk44);
gUnknown_203B2E0->unk44[gUnknown_203B2E0->unk3C] = gUnknown_80DFCB4;
gUnknown_203B2E0->unk40->unk14 = gUnknown_203B2E0->unkA4;
if (param_2 != NULL) {
gUnknown_203B2E0->unk44[gUnknown_203B2E0->unk3C].unk08 = *param_2;
}
sub_8012D34(gUnknown_203B2E0->unk40,param_3);
ResetUnusedInputStruct();
sub_800641C(gUnknown_203B2E0->unk44,1,1);
sub_8013848(&gUnknown_203B2E0->unk8,sub_802C474(),param_3,param_1);
gUnknown_203B2E0->unk20 = gUnknown_203B2E4;
sub_8013984(&gUnknown_203B2E0->unk8);
sub_802C328();
sub_802C39C();
return TRUE;
}
}
u32 sub_802C1E4(u8 param_1)
{
if (param_1 == '\0') {
sub_8013660(&gUnknown_203B2E0->unk8);
return 0;
}
else {
switch(GetKeyPress(&gUnknown_203B2E0->unk8))
{
case 2:
PlayMenuSoundEffect(1);
return 2;
case 1:
PlayMenuSoundEffect(0);
return 3;
case 4:
PlayMenuSoundEffect(4);
return 4;
default:
if (sub_80138B8(&gUnknown_203B2E0->unk8,1)) {
sub_802C328();
sub_802C39C();
return 1;
}
else {
return 0;
}
}
}
}
u8 sub_802C26C(void)
{
return gUnknown_203B2E0->unk0[(gUnknown_203B2E0->unk26 * gUnknown_203B2E0->unk24) + gUnknown_203B2E0->unk20];
}
void sub_802C28C(u32 r0)
{
u8 r0_u8;
r0_u8 = r0;
ResetUnusedInputStruct();
sub_800641C(gUnknown_203B2E0->unk44, 0, 0);
gUnknown_203B2E0->unk2A = sub_802C474();
sub_8013984(&gUnknown_203B2E0->unk8);
sub_802C328();
sub_802C39C();
if(r0_u8)
AddMenuCursorSprite(&gUnknown_203B2E0->unk8);
}
void sub_802C2D4(void)
{
if(gUnknown_203B2E0 != NULL)
{
gUnknown_203B2E4 = gUnknown_203B2E0->unk20;
gUnknown_203B2E0->unk44[gUnknown_203B2E0->unk3C] = gUnknown_80DFC9C;
ResetUnusedInputStruct();
sub_800641C(gUnknown_203B2E0->unk44, 1, 1);
MemoryFree(gUnknown_203B2E0);
gUnknown_203B2E0 = NULL;
}
}
NAKED
void sub_802C328(void)
{
asm_unified(
"\tpush {r4,lr}\n"
"\tldr r4, _0802C398\n"
"\tldr r0, [r4]\n"
"\tldrh r1, [r0, 0x28]\n"
"\tadds r0, 0xA4\n"
"\tmovs r2, 0\n"
"\tstrb r1, [r0]\n"
"\tldr r0, [r4]\n"
"\tldrh r1, [r0, 0x26]\n"
"\tadds r0, 0xA5\n"
"\tstrb r1, [r0]\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0xA6\n"
"\tmovs r1, 0xC\n"
"\tstrb r1, [r0]\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0xA7\n"
"\tstrb r2, [r0]\n"
"\tldr r0, [r4]\n"
"\tmovs r1, 0x22\n"
"\tldrsh r0, [r0, r1]\n"
"\tmovs r1, 0x18\n"
"\tbl sub_8009614\n"
"\tadds r0, 0x2\n"
"\tlsls r0, 16\n"
"\tldr r2, [r4]\n"
"\tldr r3, [r2, 0x3C]\n"
"\tlsls r1, r3, 1\n"
"\tadds r1, r3\n"
"\tlsls r1, 3\n"
"\tadds r1, r2, r1\n"
"\tadds r1, 0x52\n"
"\tasrs r3, r0, 16\n"
"\tlsrs r0, 16\n"
"\tstrh r0, [r1]\n"
"\tldr r1, [r2, 0x3C]\n"
"\tlsls r0, r1, 1\n"
"\tadds r0, r1\n"
"\tlsls r0, 3\n"
"\tadds r2, r0\n"
"\tadds r3, 0x2\n"
"\tadds r2, 0x54\n"
"\tstrh r3, [r2]\n"
"\tbl ResetUnusedInputStruct\n"
"\tldr r0, [r4]\n"
"\tadds r0, 0x44\n"
"\tmovs r1, 0x1\n"
"\tmovs r2, 0x1\n"
"\tbl sub_800641C\n"
"\tpop {r4}\n"
"\tpop {r0}\n"
"\tbx r0\n"
"\t.align 2, 0\n"
"_0802C398: .4byte gUnknown_203B2E0");
}
void sub_802C39C(void)
{
u32 uVar1;
u8 *uVar3;
s32 iVar4;
s32 iVar5;
s32 iVar6;
struct unkStruct_802C39C local;
sub_8008C54(gUnknown_203B2E0->unk3C);
sub_80073B8(gUnknown_203B2E0->unk3C);
iVar4 = gUnknown_203B2E0->unk26 * 8;
iVar5 = iVar4;
iVar5 += 10;
xxx_call_draw_string(iVar5,0,gBulletinBoardText,gUnknown_203B2E0->unk3C,0);
iVar4 += 4;
iVar5 = iVar4 + gUnknown_203B2E0->unkA4[2] * 8;
sub_8012BC4(iVar5,0,gUnknown_203B2E0->unk26 + 1,2,7,gUnknown_203B2E0->unk3C);
iVar6 = 0;
if(iVar6 < gUnknown_203B2E0->unk22)
do
{
uVar1 = (gUnknown_203B2E0->unk0[gUnknown_203B2E0->unk26 * gUnknown_203B2E0->unk24 + iVar6]);
uVar3 = sub_8096574(uVar1);
local.local_6c[0] = gUnknown_203B2E0->unk3C;
local.local_24[0] = sub_8013800(&gUnknown_203B2E0->unk8,iVar6);
sub_803B35C(uVar3,local.local_6c);
if (sub_80968B0(sub_8096574(uVar1)) != '\0') {
local.local_29[7] = 2;
}
sub_803B6D4(&local);
iVar6++;
} while (iVar6 < gUnknown_203B2E0->unk22);
sub_80073E0(gUnknown_203B2E0->unk3C);
}