summaryrefslogtreecommitdiff
path: root/arm9/src
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/src')
-rw-r--r--arm9/src/mail.c16
-rw-r--r--arm9/src/mail_message.c201
-rw-r--r--arm9/src/msgdata.c3
-rw-r--r--arm9/src/pokemon.c1
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"