summaryrefslogtreecommitdiff
path: root/src/wonder_mail_2.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/wonder_mail_2.c')
-rw-r--r--src/wonder_mail_2.c308
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
+ }
+}