diff options
author | red031000 <rubenru09@aol.com> | 2020-08-31 14:33:17 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-08-31 14:33:17 +0100 |
commit | 0a880566f5889cdeb6fa3f96f5916c39dbb16b38 (patch) | |
tree | b8c7ad379c2e7bdbec6d9c7e4f9021f73243f302 /arm9/src | |
parent | 656e4a2fee9ff86d678d6a7477611bfaca5171d4 (diff) | |
parent | 3adc93018bf3deabde775905169c2b87d0560bd9 (diff) |
Merge pull request #274 from PikalaxALT/pikalax_work
Decompile mail_message.c
Diffstat (limited to 'arm9/src')
-rw-r--r-- | arm9/src/mail.c | 16 | ||||
-rw-r--r-- | arm9/src/mail_message.c | 201 | ||||
-rw-r--r-- | arm9/src/msgdata.c | 3 | ||||
-rw-r--r-- | arm9/src/pokemon.c | 1 |
4 files changed, 210 insertions, 11 deletions
diff --git a/arm9/src/mail.c b/arm9/src/mail.c index 96074471..b2f8e92d 100644 --- a/arm9/src/mail.c +++ b/arm9/src/mail.c @@ -9,10 +9,8 @@ #pragma thumb on -extern void FUN_02013724(u16 * ptr); extern u32 FUN_0206B6C8(struct Pokemon * pokemon); extern u16 FUN_0206B7BC(u16 species, u32 forme, BOOL is_egg); -extern void FUN_02013960(u16 * dest, const u16 * src); void Mail_init(struct Mail * mail) { @@ -29,7 +27,7 @@ void Mail_init(struct Mail * mail) } for (i = 0; i < 3; i++) { - FUN_02013724(mail->unk_20[i]); + MailMsg_init(&mail->unk_20[i]); } } @@ -72,7 +70,7 @@ void Mail_SetNewMessageDetails(struct Mail * mail, u8 type, u8 monIdx, struct Sa mail->author_otId = PlayerProfile_GetTrainerID(profile); for (i = 0; monIdx < GetPartyCount(party); monIdx++) { - union MailMessage * ptr; + union MailPatternData * ptr; pokemon = GetPartyMonByIndex(party, monIdx); species = (u16)GetMonData(pokemon, MON_DATA_SPECIES, NULL); is_egg = (BOOL)GetMonData(pokemon, MON_DATA_IS_EGG, NULL); @@ -142,18 +140,18 @@ u16 Mail_GetAttrFromUnk18Array(struct Mail * mail, u32 idx, u32 attr) return 0; } -u16 * Mail_GetUnk20Array(struct Mail * mail, u32 idx) +struct MailMessage * Mail_GetUnk20Array(struct Mail * mail, u32 idx) { if (idx < 3) - return mail->unk_20[idx]; + return &mail->unk_20[idx]; else - return mail->unk_20[0]; + return &mail->unk_20[0]; } -void Mail_CopyToUnk20Array(struct Mail * mail, const u16 * src, u32 idx) +void Mail_CopyToUnk20Array(struct Mail * mail, const struct MailMessage * src, u32 idx) { if (idx < 3) - FUN_02013960(mail->unk_20[idx], src); + MailMsg_copy(&mail->unk_20[idx], src); } struct Mail * Sav2_Mailbox_get(struct SaveBlock2 * sav2) diff --git a/arm9/src/mail_message.c b/arm9/src/mail_message.c new file mode 100644 index 00000000..4d1b75c6 --- /dev/null +++ b/arm9/src/mail_message.c @@ -0,0 +1,201 @@ +#include "global.h" +#include "msgdata.h" +#include "script_buffers.h" +#include "unk_0201B8B8.h" +#include "mail_message.h" + +#pragma thumb on + +struct UnkStruct_020ED556 +{ + u8 unk_0; + u8 unk_1; + s16 unk_2; + u16 unk_4; + s16 unk_6; + u16 unk_8; +}; + +extern u16 FUN_02013A9C(s16 bank, u16 num); + +const u16 UNK_020ED54C[] = { + 397, + 399, + 395, + 396, + 398 +}; + +const struct UnkStruct_020ED556 UNK_020ED556[] = { + { 0, 0, 0x184, 7, -1, 0 }, + { 1, 0, 0x184, 33, -1, 0 }, + { 2, 0, 0x188, 10, -1, 0 }, + { 1, 4, 0x184, 1, -1, 0 } +}; + +void MailMsg_init(struct MailMessage * mailMsg) +{ + s32 i; + mailMsg->msg_bank = 0xFFFF; + for (i = 0; i < 2; i++) + { + mailMsg->fields[i] = 0xFFFF; + } +} + +void MailMsg_init_withBank(struct MailMessage * mailMsg, u16 bank) +{ + s32 i; + mailMsg->msg_bank = bank; + mailMsg->msg_no = 0; + for (i = 0; i < 2; i++) + { + mailMsg->fields[i] = 0xFFFF; + } +} + +void MailMsg_init_default(struct MailMessage * mailMsg) +{ + MailMsg_init_withBank(mailMsg, 4); + mailMsg->msg_no = 5; +} + +void MailMsg_init_fromTemplate(struct MailMessage * mailMsg, u32 a1) +{ + GF_ASSERT(a1 < 4); + if (a1 < 4) + { + MailMsg_init_withBank(mailMsg, UNK_020ED556[a1].unk_0); + mailMsg->msg_no = UNK_020ED556[a1].unk_1; + if (UNK_020ED556[a1].unk_2 != -1) + mailMsg->fields[0] = FUN_02013A9C(UNK_020ED556[a1].unk_2, UNK_020ED556[a1].unk_4); + if (UNK_020ED556[a1].unk_6 != -1) + mailMsg->fields[1] = FUN_02013A9C(UNK_020ED556[a1].unk_6, UNK_020ED556[a1].unk_8); + } +} + +struct String * MailMsg_GetExpandedString(struct MailMessage * mailMsg, u32 heap_id) +{ + s32 i; + struct ScrStrBufs * mgr = ScrStrBufs_new(heap_id); + struct MsgData * msgData; + struct String * ret; + for (i = 0; i < 2; i++) + { + if (mailMsg->fields[i] == 0xFFFF) + break; + FUN_0200B518(mgr, (u32)i, mailMsg->fields[i]); + } + msgData = NewMsgDataFromNarc(1, NARC_MSGDATA_MSG, UNK_020ED54C[mailMsg->msg_bank], heap_id); + ret = ReadMsgData_ExpandPlaceholders(mgr, msgData, mailMsg->msg_no, heap_id); + DestroyMsgData(msgData); + ScrStrBufs_delete(mgr); + return ret; +} + +struct String * MailMsg_GetRawString(struct MailMessage * mailMsg, u32 heap_id) +{ + return ReadMsgData_NewNarc_NewString(NARC_MSGDATA_MSG, UNK_020ED54C[mailMsg->msg_bank], mailMsg->msg_no, heap_id); +} + +BOOL MailMsg_IsInit(struct MailMessage * mailMsg) +{ + return mailMsg->msg_bank != 0xFFFF; +} + +BOOL MailMsg_AllFieldsAreInit(struct MailMessage * mailMsg) +{ + s32 i; + u32 n = MailMsg_NumFields(mailMsg->msg_bank, mailMsg->msg_no); + for (i = 0; i < n; i++) + { + if (mailMsg->fields[i] == 0xFFFF) + return FALSE; + } + return TRUE; +} + +u32 MailMsg_NumFields(u16 bank, u16 num) +{ + struct String * str; + const u16 * cstr; + u32 count; + GF_ASSERT(bank < 5); + GF_ASSERT(num < MailMsg_NumMsgsInBank(bank)); + str = ReadMsgData_NewNarc_NewString(NARC_MSGDATA_MSG, UNK_020ED54C[bank], num, 0); + cstr = String_c_str(str); + count = 0; + while (*cstr != EOS) + { + if (*cstr == 0xFFFE) + { + if (MsgArray_ControlCodeIsStrVar(cstr)) + count++; + cstr = MsgArray_SkipControlCode(cstr); + } + else + cstr++; + } + String_dtor(str); + return count; +} + +u16 MailMsg_GetFieldI(struct MailMessage * mailMsg, u32 a1) +{ + return mailMsg->fields[a1]; +} + +u16 MailMsg_GetMsgBank(struct MailMessage * mailMsg) +{ + return mailMsg->msg_bank; +} + +u16 MailMsg_GetMsgNo(struct MailMessage * mailMsg) +{ + return mailMsg->msg_no; +} + +BOOL MailMsg_compare(struct MailMessage * mailMsg, struct MailMessage * a1) +{ + s32 i; + if (mailMsg->msg_bank != a1->msg_bank || mailMsg->msg_no != a1->msg_no) + return FALSE; + for (i = 0; i < 2; i++) + { + if (mailMsg->fields[i] != a1->fields[i]) + return FALSE; + } + return TRUE; +} + +void MailMsg_copy(struct MailMessage * mailMsg, const struct MailMessage * a1) +{ + *mailMsg = *a1; +} + +u32 MailMsg_NumMsgsInBank(u16 bank) +{ + return (u32)((bank < 5) ? 20 : 0); +} + +void MailMsg_SetMsgBankAndNum(struct MailMessage * mailMsg, u16 bank, u16 num) +{ + GF_ASSERT(bank < 5); + mailMsg->msg_bank = bank; + mailMsg->msg_no = num; +} + +void MailMsg_SetFieldI(struct MailMessage * mailMsg, u32 idx, u16 word) +{ + GF_ASSERT(idx < 2); + mailMsg->fields[idx] = word; +} + +void MailMsg_SetTrailingFieldsEmpty(struct MailMessage * mailMsg) +{ + u32 n; + for (n = MailMsg_NumFields(mailMsg->msg_bank, mailMsg->msg_no); n < 2; n++) + { + mailMsg->fields[n] = 0xFFFF; + } +} diff --git a/arm9/src/msgdata.c b/arm9/src/msgdata.c index 13d1a9da..b3526f55 100644 --- a/arm9/src/msgdata.c +++ b/arm9/src/msgdata.c @@ -4,7 +4,6 @@ #include "heap.h" #include "MI_memory.h" #include "string16.h" -#include "proto.h" #pragma thumb on @@ -350,7 +349,7 @@ void GetSpeciesNameIntoArray(u16 species, u32 heap_id, u16 * dest) DestroyMsgData(msgData); } -struct String * ReadMsgData_ExpandPlaceholders(u32 * a0, struct MsgData * msgData, u32 msgno, u32 a3) +struct String * ReadMsgData_ExpandPlaceholders(struct ScrStrBufs * a0, struct MsgData * msgData, u32 msgno, u32 a3) { struct String * ret = NULL; struct String * r4 = String_ctor(1024, 0); diff --git a/arm9/src/pokemon.c b/arm9/src/pokemon.c index 1f48d0fc..fb1ad894 100644 --- a/arm9/src/pokemon.c +++ b/arm9/src/pokemon.c @@ -12,6 +12,7 @@ #include "string_util.h" #include "text.h" #include "msgdata.h" +#include "itemtool.h" #include "constants/abilities.h" #include "constants/items.h" #include "constants/moves.h" |