summaryrefslogtreecommitdiff
path: root/arm9/src/msgdata.c
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2020-06-19 16:57:44 -0400
committerPikalaxALT <pikalaxalt@gmail.com>2020-06-19 16:57:44 -0400
commit06a7bf4c8c36af699b9882623d2642baf0269bf3 (patch)
tree26a68c3112fe55f8cbb48f4749e5d0635925024b /arm9/src/msgdata.c
parent1c13e2f57b53b3e4e5f9daac42ec4baadbb4c60b (diff)
msgdata.c through DecryptMessageDirect
Diffstat (limited to 'arm9/src/msgdata.c')
-rw-r--r--arm9/src/msgdata.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/arm9/src/msgdata.c b/arm9/src/msgdata.c
new file mode 100644
index 00000000..b3a1c027
--- /dev/null
+++ b/arm9/src/msgdata.c
@@ -0,0 +1,59 @@
+#include "global.h"
+#include "filesystem.h"
+#include "msg_data.h"
+#include "heap.h"
+
+#pragma thumb on
+
+void * LoadSingleElementFromNarc(NarcId narc_id, s32 file_id, u32 heap_id);
+void FreeMsgDataRawData(void * data);
+void CopyEncryptedMessage16(u16 * dest, const u16 * src, struct UnkStruct_200A394_4 * param);
+void DecryptMessageDirect(struct UnkStruct_200A394 * r3, u32 r5, u16 * r4);
+
+void * LoadSingleElementFromNarc(NarcId narc_id, s32 file_id, u32 heap_id)
+{
+ return AllocAndReadWholeNarcMemberByIdPair(narc_id, file_id, heap_id);
+}
+
+void FreeMsgDataRawData(void * data)
+{
+ FreeToHeap(data);
+}
+
+inline static void Decrypt1(struct UnkStruct_200A394_4 * arg0, u32 arg1, u32 seed)
+{
+ seed = seed * 765 * (arg1 + 1) & 0xffff;
+ seed |= seed << 16;
+ arg0->unk0 ^= seed;
+ arg0->unk4 ^= seed;
+}
+
+inline static void Decrypt2(u16 * arg0, u32 count, u32 arg2)
+{
+ u16 seed = (arg2 + 1) * 596947;
+
+ while (count-- > 0)
+ {
+ *arg0 ^= seed;
+ seed += 18749;
+ arg0++;
+ }
+}
+
+void DecryptMessageDirect(struct UnkStruct_200A394 * r3, u32 r5, u16 * r4)
+{
+ struct UnkStruct_200A394_4 sp0;
+
+ if (r5 < r3->unk0)
+ {
+ sp0 = r3->unk4[r5];
+ Decrypt1(&sp0, r5, r3->unk2);
+
+ CopyEncryptedMessage16(r4, (const u16 *)((u8 *)r3 + sp0.unk0), &sp0);
+ Decrypt2(r4, sp0.unk4, r5);
+ }
+ else
+ {
+ GF_ASSERT(0);
+ }
+}