diff --git a/asm/mail.s b/asm/mail.s index 5f76a5ef0..7ae0b78d6 100644 --- a/asm/mail.s +++ b/asm/mail.s @@ -5,164 +5,6 @@ .text - thumb_func_start sub_8121478 -sub_8121478: @ 8121478 - push {r4-r7,lr} - sub sp, 0x4 - adds r5, r0, 0 - adds r7, r1, 0 - lsls r2, 24 - lsrs r6, r2, 24 - ldr r4, =gUnknown_0203A134 - ldr r0, =0x0000222c - bl AllocZeroed - str r0, [r4] - ldr r1, =0x0000021d - adds r0, r1 - movs r1, 0x2 - strb r1, [r0] - ldr r0, [r4] - ldr r2, =0x0000021e - adds r0, r2 - movs r1, 0x1 - strb r1, [r0] - ldr r4, [r4] - movs r3, 0x88 - lsls r3, 2 - adds r1, r4, r3 - ldr r0, =CopyEasyChatWord - str r0, [r1] - movs r0, 0x89 - lsls r0, 2 - adds r1, r4, r0 - ldr r0, =ConvertEasyChatWordsToString - str r0, [r1] - ldrh r1, [r5, 0x20] - adds r0, r1, 0 - subs r0, 0x79 - lsls r0, 16 - lsrs r0, 16 - cmp r0, 0xB - bhi _081214E8 - subs r1, 0x79 - subs r2, 0x4 - adds r0, r4, r2 - strb r1, [r0] - b _081214F2 - .pool -_081214E8: - ldr r3, =0x0000021a - adds r1, r4, r3 - movs r0, 0 - strb r0, [r1] - movs r6, 0 -_081214F2: - ldr r0, =gUnknown_0203A134 - ldr r1, [r0] - ldr r2, =0x0000021e - adds r0, r1, r2 - ldrb r0, [r0] - cmp r0, 0 - beq _08121504 - cmp r0, 0x1 - beq _0812152C -_08121504: - movs r3, 0x8A - lsls r3, 2 - adds r2, r1, r3 - subs r3, 0xE - adds r0, r1, r3 - ldrb r1, [r0] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 - ldr r1, =gUnknown_0859F3B4 - b _08121540 - .pool -_0812152C: - movs r0, 0x8A - lsls r0, 2 - adds r2, r1, r0 - ldr r3, =0x0000021a - adds r0, r1, r3 - ldrb r1, [r0] - lsls r0, r1, 1 - adds r0, r1 - lsls r0, 2 - ldr r1, =gUnknown_0859F458 -_08121540: - adds r0, r1 - str r0, [r2] - ldrh r0, [r5, 0x1E] - mov r1, sp - bl sub_80D45E8 - lsls r0, 16 - ldr r1, =0xffff0000 - adds r0, r1 - movs r1, 0xCD - lsls r1, 17 - cmp r0, r1 - bhi _081215AC - ldr r1, =gUnknown_0203A134 - ldr r2, [r1] - ldr r3, =0x0000021a - adds r0, r2, r3 - ldrb r0, [r0] - adds r3, r1, 0 - cmp r0, 0x6 - beq _0812158C - cmp r0, 0x9 - beq _0812159C - ldr r0, =0x0000021b - adds r1, r2, r0 - movs r0, 0 - strb r0, [r1] - b _081215BA - .pool -_0812158C: - ldr r0, =0x0000021b - adds r1, r2, r0 - movs r0, 0x1 - strb r0, [r1] - b _081215BA - .pool -_0812159C: - ldr r0, =0x0000021b - adds r1, r2, r0 - movs r0, 0x2 - strb r0, [r1] - b _081215BA - .pool -_081215AC: - ldr r0, =gUnknown_0203A134 - ldr r1, [r0] - ldr r2, =0x0000021b - adds r1, r2 - movs r2, 0 - strb r2, [r1] - adds r3, r0, 0 -_081215BA: - ldr r1, [r3] - movs r3, 0x85 - lsls r3, 2 - adds r0, r1, r3 - str r5, [r0] - movs r2, 0x83 - lsls r2, 2 - adds r0, r1, r2 - str r7, [r0] - adds r3, 0x4 - adds r0, r1, r3 - strb r6, [r0] - ldr r0, =sub_81219F0 - bl SetMainCallback2 - add sp, 0x4 - pop {r4-r7} - pop {r0} - bx r0 - .pool - thumb_func_end sub_8121478 - thumb_func_start sub_81215EC sub_81215EC: @ 81215EC push {r4-r6,lr} diff --git a/include/easy_chat.h b/include/easy_chat.h index fc44b6a8a..c9ba81c6d 100644 --- a/include/easy_chat.h +++ b/include/easy_chat.h @@ -30,7 +30,8 @@ enum void InitEasyChatPhrases(void); void easy_chat_input_maybe(void); -void CopyEasyChatWord(u8 *, u16); +void CopyEasyChatWord(u8 *dest, u16 word); +void ConvertEasyChatWordsToString(u8 *dest, const u16 *src, u16 length1, u16 length2); bool32 sub_811F8D8(u16); #endif // GUARD_EASYCHAT_H diff --git a/include/mail_data.h b/include/mail_data.h new file mode 100644 index 000000000..bf6540bad --- /dev/null +++ b/include/mail_data.h @@ -0,0 +1,12 @@ +#ifndef GUARD_MAIL_DATA_H +#define GUARD_MAIL_DATA_H + +// Exported type declarations + +// Exported RAM declarations + +// Exported ROM declarations + +u16 sub_80D45E8(u16, u16 *); + +#endif //GUARD_MAIL_DATA_H diff --git a/include/malloc.h b/include/malloc.h index 4568e244a..f3a731797 100644 --- a/include/malloc.h +++ b/include/malloc.h @@ -2,7 +2,7 @@ #define GUARD_MALLOC_H #define malloc Alloc -#define calloc AllocZeroed +#define calloc(ct, sz) AllocZeroed((ct) * (sz)) #define free Free extern u8 gHeap[]; diff --git a/ld_script.txt b/ld_script.txt index 3e47864f1..dfc790530 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -164,6 +164,7 @@ SECTIONS { asm/easy_chat.o(.text); asm/mon_markings.o(.text); asm/mauville_old_man.o(.text); + src/mail.o(.text); asm/mail.o(.text); asm/menu_helpers.o(.text); asm/dewford_trend.o(.text); diff --git a/src/mail.c b/src/mail.c new file mode 100644 index 000000000..a21a297b6 --- /dev/null +++ b/src/mail.c @@ -0,0 +1,127 @@ + +// Includes +#include "global.h" +#include "main.h" +#include "species.h" +#include "malloc.h" +#include "easy_chat.h" +#include "mail_data.h" +#include "mail.h" + +// Static type declarations + +struct UnkMailStruct +{ + u8 unk_0_0:2; + u8 unk_0_2:2; + u8 unk_0_4:4; +}; + +struct MailLayout +{ + u8 var0; + u8 var1; + u8 var2; + u8 var3_0:4; + u8 var3_4:4; + struct UnkMailStruct *var4; + u32 var8; +}; + +struct Unk203A134 +{ + /*0x0000*/ u8 filler_0000[0x20c]; + /*0x020C*/ MainCallback callback; + /*0x0210*/ u8 filler_0210[4]; + /*0x0214*/ struct MailStruct *mail; + /*0x0218*/ bool8 flag; + /*0x0219*/ u8 filler_0219[1]; + /*0x021a*/ u8 mailType; + /*0x021b*/ u8 unk_021b; + /*0x021c*/ u8 unk_021c; + /*0x021d*/ u8 language; + /*0x021e*/ bool8 playerIsSender; + /*0x0220*/ void (*parserSingle)(u8 *dest, u16 word); + /*0x0224*/ void (*parserMultiple)(u8 *dest, const u16 *src, u16 length1, u16 length2); + /*0x0228*/ const struct MailLayout *layout; + /*0x022c*/ u8 filler_022C[0x2000]; +}; + +struct MailGraphics +{ + u16 (*palette)[]; + u8 (*tiles)[]; + u8 (*tileMap)[]; + u16 var0C; + u16 var0E; + u16 color10; + u16 color12; +}; + +// Static RAM declarations + +EWRAM_DATA struct Unk203A134 *gUnknown_0203A134; + +// Static ROM declarations + +void sub_81219F0(void); + +// .rodata + +extern const struct MailLayout gUnknown_0859F3B4[]; +extern const struct MailLayout gUnknown_0859F458[]; + +// .text + +void sub_8121478(struct MailStruct *mail, MainCallback callback, bool8 flag) { + u16 buffer[2]; + u16 species; + + gUnknown_0203A134 = calloc(1, sizeof(struct Unk203A134)); + gUnknown_0203A134->language = LANGUAGE_ENGLISH; + gUnknown_0203A134->playerIsSender = TRUE; + gUnknown_0203A134->parserSingle = CopyEasyChatWord; + gUnknown_0203A134->parserMultiple = ConvertEasyChatWordsToString; + if (mail->itemId >= ITEM_ORANGE_MAIL && mail->itemId <= ITEM_RETRO_MAIL) { + gUnknown_0203A134->mailType = mail->itemId - ITEM_ORANGE_MAIL; + } + else + { + gUnknown_0203A134->mailType = 0; + flag = FALSE; + } + switch (gUnknown_0203A134->playerIsSender) + { + case FALSE: + default: + gUnknown_0203A134->layout = &gUnknown_0859F3B4[gUnknown_0203A134->mailType]; + break; + case TRUE: + gUnknown_0203A134->layout = &gUnknown_0859F458[gUnknown_0203A134->mailType]; + break; + } + species = sub_80D45E8(mail->species, buffer); + if (species >= SPECIES_BULBASAUR && species < NUM_SPECIES) + { + switch (gUnknown_0203A134->mailType) + { + default: + gUnknown_0203A134->unk_021b = 0; + break; + case ITEM_BEAD_MAIL - ITEM_ORANGE_MAIL: + gUnknown_0203A134->unk_021b = 1; + break; + case ITEM_DREAM_MAIL - ITEM_ORANGE_MAIL: + gUnknown_0203A134->unk_021b = 2; + break; + } + } + else + { + gUnknown_0203A134->unk_021b = 0; + } + gUnknown_0203A134->mail = mail; + gUnknown_0203A134->callback = callback; + gUnknown_0203A134->flag = flag; + SetMainCallback2(sub_81219F0); +}