diff options
Diffstat (limited to 'src/wonder_mail_2.c')
-rw-r--r-- | src/wonder_mail_2.c | 308 |
1 files changed, 301 insertions, 7 deletions
diff --git a/src/wonder_mail_2.c b/src/wonder_mail_2.c index 21074d6..fda000b 100644 --- a/src/wonder_mail_2.c +++ b/src/wonder_mail_2.c @@ -7,6 +7,7 @@ #include "menu.h" #include "save.h" #include "sub_8095228.h" +#include "gUnknown_203B46C.h" #include "wonder_mail.h" struct unkStruct_203B2C8 @@ -32,7 +33,7 @@ struct unkStruct_203B2C8 struct unkStruct_203B2CC { // size: 0xD4; - u8 unk0[0x38]; + u8 receivedNewsletters[NUM_POKEMON_NEWS]; u32 unk38; u8 fill3C[0x50 - 0x3C]; @@ -43,7 +44,7 @@ struct unkStruct_203B2CC s16 unk56; u16 unk58; - u16 unk5A; + u16 numPKMNNews; u8 fill5C[0x6C - 0x5C]; @@ -54,13 +55,38 @@ struct unkStruct_203B2CC }; extern struct unkStruct_203B2CC *gUnknown_203B2CC; -extern u32 sub_802B9A8(void); + +struct unkStruct_203B2D4 +{ + // size: 0x94 + s32 state; + u8 currMailIndex; + u8 fill5[0x8 - 0x5]; + s32 unk8; + s32 unkC; + u8 *unk10[4]; + u32 unk20; + u32 unk24; + struct UnkTextStruct2 unk28[4]; + u32 unk88; + u8 fill8C[0x94 - 0x8C]; +}; + +extern struct unkStruct_203B2D4 *gUnknown_203B2D4; + +extern struct UnkSaveStruct1 *gUnknown_203B46C; + + +extern s32 GetNumPKMNNews(void); extern void sub_802B880(void); extern void sub_802B8D4(void); extern void sub_8013818(void *, u32, u32, u32); extern void sub_8012D08(struct UnkTextStruct2 *, s32); extern void sub_8013984(u32 *); extern u8 HasNoPKMNNews(void); +extern u8 CheckPKMNNewsSlot(u8 r0); +extern struct PokemonStruct *sub_808D3BC(void); +extern void sub_808DA34(u8 *buffer, struct PokemonStruct *pokemon); extern u16 gUnknown_203B2D0; extern u16 gUnknown_203B2D2; @@ -70,10 +96,21 @@ extern s32 GetKeyPress(u32 *); extern void sub_8013660(u32 *); extern void AddMenuCursorSprite(u32 *); +extern void sub_802BB98(void); +extern void sub_802BC08(void); +extern void sub_802BB28(void); +extern void sub_8013E54(void); +extern s32 sub_8012A64(u32 *, u32); +extern void PlayMenuSoundEffect(u32); + extern struct UnkTextStruct2 gUnknown_80DFBEC; extern struct UnkTextStruct2 gUnknown_80DFBD0; +extern struct UnkTextStruct2 gUnknown_80DFC34; + +extern struct UnkTextStruct2 gUnknown_80DFC18; + extern struct unkStruct_203B2C8 *gUnknown_203B2C8; extern void sub_8014248(const char *r0, u32, u32, const struct MenuItem *r4, u32, u32, u32, struct OpenedFile **r5, u32); @@ -82,6 +119,8 @@ extern void sub_80920D8(u8 *buffer); extern void sub_8097790(void); extern char gUnknown_202E5D8[0x50]; extern char gAvailablePokemonNames[0x50]; +extern u8 gUnknown_80DFC4C[]; +extern u8 gUnknown_80DFC50[]; extern u32 sub_802F298(void); extern void sub_802F2C0(void); extern u8 sub_8099394(u8 *); @@ -103,6 +142,23 @@ extern u8 sub_80023E4(u32); extern void nullsub_131(void); extern void sub_802ABF8(void); +extern u8 gUnknown_80DFC04[]; +extern u8 gUnknown_80DFBE8[]; +extern char *GetPokemonMailHeadline(u8 index); +extern void sub_8008C54(u32); +extern void sub_80073B8(u32); +extern void sub_802BC7C(void); +extern void sub_80073E0(u32); +extern void xxx_call_draw_string(s32 x, u32 y, u8 *, u32 , u32); +extern void sub_8012BC4(u32 x, u32 y, u32, u32, u32, u32); +extern void xxx_format_and_draw(u32, u32, u8 *, u32, u32); +extern void sub_803B6B0(u32, u32, u32, u32); +extern s32 sub_8013800(u32 *, s32); + +extern void sub_802BCC4(void); +extern void sub_802BB14(u32); +extern void sub_801317C(u32 *); + ALIGNED(4) const char gUnknown_80DF9F0[] = "????"; // NOTE: had to be pre-proc'd to match @@ -348,7 +404,7 @@ u32 sub_802B640(u32 r0, struct UnkTextStruct2_sub *r1, u32 r2) ResetUnusedInputStruct(); sub_800641C(gUnknown_203B2CC->unk74, 1, 1); - sub_8013818(&gUnknown_203B2CC->unk38, sub_802B9A8(), r2, r0); + sub_8013818(&gUnknown_203B2CC->unk38, GetNumPKMNNews(), r2, r0); gUnknown_203B2CC->unk50 = gUnknown_203B2D0; gUnknown_203B2CC->unk56 = gUnknown_203B2D2; @@ -393,9 +449,9 @@ u32 sub_802B720(u8 r0) } } -u8 sub_802B7A8(void) +u8 GetPokemonNewsIndex(void) { - return gUnknown_203B2CC->unk0[(gUnknown_203B2CC->unk56 * gUnknown_203B2CC->unk54) + gUnknown_203B2CC->unk50]; + return gUnknown_203B2CC->receivedNewsletters[(gUnknown_203B2CC->unk56 * gUnknown_203B2CC->unk54) + gUnknown_203B2CC->unk50]; } void sub_802B7D0(u32 r0) @@ -407,7 +463,7 @@ void sub_802B7D0(u32 r0) ResetUnusedInputStruct(); sub_800641C(gUnknown_203B2CC->unk74, 0, 0); - gUnknown_203B2CC->unk5A = sub_802B9A8(); + gUnknown_203B2CC->numPKMNNews = GetNumPKMNNews(); sub_8013984(&gUnknown_203B2CC->unk38); sub_802B880(); sub_802B8D4(); @@ -435,3 +491,241 @@ void sub_802B81C(void) gUnknown_203B2CC = NULL; } } + +NAKED +void sub_802B880(void) +{ + asm_unified( + "\tpush {r4,lr}\n" + "\tldr r4, _0802B8D0\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0x52\n" + "\tmovs r1, 0\n" + "\tldrsh r0, [r0, r1]\n" + "\tmovs r1, 0xC\n" + "\tbl sub_80095E4\n" + "\tadds r0, 0x2\n" + "\tlsls r0, 16\n" + "\tldr r2, [r4]\n" + "\tldr r3, [r2, 0x6C]\n" + "\tlsls r1, r3, 1\n" + "\tadds r1, r3\n" + "\tlsls r1, 3\n" + "\tadds r1, r2, r1\n" + "\tadds r1, 0x82\n" + "\tasrs r3, r0, 16\n" + "\tlsrs r0, 16\n" + "\tstrh r0, [r1]\n" + "\tldr r1, [r2, 0x6C]\n" + "\tlsls r0, r1, 1\n" + "\tadds r0, r1\n" + "\tlsls r0, 3\n" + "\tadds r2, r0\n" + "\tadds r3, 0x2\n" + "\tadds r2, 0x84\n" + "\tstrh r3, [r2]\n" + "\tbl ResetUnusedInputStruct\n" + "\tldr r0, [r4]\n" + "\tadds r0, 0x74\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" +"\t_0802B8D0: .4byte gUnknown_203B2CC"); +} + +void sub_802B8D4(void) +{ + s32 iVar2; + s32 retvar; + s32 new_index; + u8 mailIndex; + + + sub_8008C54(gUnknown_203B2CC->unk6C); + sub_80073B8(gUnknown_203B2CC->unk6C); + xxx_call_draw_string(0xA, 0, gUnknown_80DFC04, gUnknown_203B2CC->unk6C, 0); + 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); + new_index = (gUnknown_203B2CC->unk56 * gUnknown_203B2CC->unk54) + iVar2; + mailIndex = gUnknown_203B2CC->receivedNewsletters[new_index]; + sub_803B6B0(0xA, retvar, 6, gUnknown_203B2CC->unk6C); + sub_802BC7C(); + xxx_format_and_draw(0x15, retvar, GetPokemonMailHeadline(mailIndex), gUnknown_203B2CC->unk6C, 0); + } + sub_80073E0(gUnknown_203B2CC->unk6C); +} + +s32 GetNumPKMNNews(void) +{ + s32 iVar2; + s32 newsCount; + + newsCount = 0; + + for(iVar2 = 0; iVar2 < NUM_POKEMON_NEWS; iVar2++) + { + if(CheckPKMNNewsSlot(iVar2)) + { + gUnknown_203B2CC->receivedNewsletters[newsCount] = iVar2; + newsCount++; + } + } + return newsCount; +} + +bool8 HasNoPKMNNews(void) +{ + s32 iVar2; + + for(iVar2 = 0; iVar2 < NUM_POKEMON_NEWS; iVar2++) + { + if(CheckPKMNNewsSlot(iVar2)) + { + return FALSE; + } + } + return TRUE; +} + +u32 sub_802B9FC(u8 mailIndex) +{ + gUnknown_203B2D4 = MemoryAlloc(sizeof(struct unkStruct_203B2D4), 0x8); + gUnknown_203B2D4->currMailIndex = mailIndex; + sub_801317C(&gUnknown_203B2D4->unk88); + gUnknown_203B2D4->unk24 = 0; + gUnknown_203B2D4->unk28[0] = gUnknown_80DFC34; + gUnknown_203B2D4->unk28[1] = gUnknown_80DFC18; + gUnknown_203B2D4->unk28[2] = gUnknown_80DFC18; + gUnknown_203B2D4->unk28[3] = gUnknown_80DFC18; + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B2D4->unk28, 1, 1); + gUnknown_203B2D4->unk8 = 0; + sub_802BCC4(); + sub_802BC7C(); + sub_802BB14(0); + return 1; +} + +u32 sub_802BA8C(void) +{ + switch(gUnknown_203B2D4->state) + { + case 0: + sub_802BB98(); + break; + case 1: + sub_802BC08(); + break; + case 3: + return 3; + case 2: + default: + return 2; + + } + return 0; +} + +void sub_802BACC(void) +{ + if(gUnknown_203B2D4 != NULL) + { + gUnknown_203B2D4->unk28[gUnknown_203B2D4->unk24] = gUnknown_80DFC18; + ResetUnusedInputStruct(); + sub_800641C(gUnknown_203B2D4->unk28, 1, 1); + MemoryFree(gUnknown_203B2D4); + gUnknown_203B2D4 = NULL; + } +} + +void sub_802BB14(u32 newState) +{ + gUnknown_203B2D4->state = newState; + sub_802BB28(); +} + +void sub_802BB28(void) +{ + switch(gUnknown_203B2D4->state) + { + case 0: + case 1: + sub_8008C54(gUnknown_203B2D4->unk24); + sub_80073B8(gUnknown_203B2D4->unk24); + xxx_format_and_draw(0xA, 0, GetPokemonMailHeadline(gUnknown_203B2D4->currMailIndex), gUnknown_203B2D4->unk24, 0); + xxx_format_and_draw(0x6, 0x14, gUnknown_203B2D4->unk10[gUnknown_203B2D4->unk8], gUnknown_203B2D4->unk24, 0); + sub_80073E0(gUnknown_203B2D4->unk24); + gUnknown_203B2D4->unk8++; + break; + case 2: + case 3: + break; + } +} + +void sub_802BB98(void) +{ + if(gUnknown_203B2D4->unkC != 0) + { + if(gUnknown_203B2D4->unk20 & 8) + sub_8013E54(); + gUnknown_203B2D4->unk20++; + } + switch(sub_8012A64(&gUnknown_203B2D4->unk88, gUnknown_203B2D4->unk24)) + { + case 1: + PlayMenuSoundEffect(0); + if(gUnknown_203B2D4->unkC != 0) + sub_802BB14(1); + else + sub_802BB14(3); + break; + case 2: + PlayMenuSoundEffect(1); + sub_802BB14(2); + break; + } +} + +void sub_802BC08(void) +{ + if(gUnknown_203B2D4->unk8 < gUnknown_203B2D4->unkC) + { + if(gUnknown_203B2D4->unk20 & 8) + sub_8013E54(); + gUnknown_203B2D4->unk20++; + } + switch(sub_8012A64(&gUnknown_203B2D4->unk88, gUnknown_203B2D4->unk24)) + { + case 1: + PlayMenuSoundEffect(0); + if(gUnknown_203B2D4->unk8 < gUnknown_203B2D4->unkC) + sub_802BB14(1); + else + sub_802BB14(3); + break; + case 2: + PlayMenuSoundEffect(1); + sub_802BB14(2); + break; + } +} + +void sub_802BC7C(void) +{ + sub_808DA34(gAvailablePokemonNames, sub_808D3BC()); + if(gUnknown_203B46C->playerGender == FEMALE) + { + strcpy(gAvailablePokemonNames + 0x50, gUnknown_80DFC4C); // She + } + else + { + strcpy(gAvailablePokemonNames + 0x50, gUnknown_80DFC50); // He + } +} |