summaryrefslogtreecommitdiff
path: root/src/mevent_server_ish.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mevent_server_ish.c')
-rw-r--r--src/mevent_server_ish.c308
1 files changed, 308 insertions, 0 deletions
diff --git a/src/mevent_server_ish.c b/src/mevent_server_ish.c
new file mode 100644
index 000000000..7e9639303
--- /dev/null
+++ b/src/mevent_server_ish.c
@@ -0,0 +1,308 @@
+#include "global.h"
+#include "malloc.h"
+#include "decompress.h"
+#include "util.h"
+#include "link.h"
+#include "link_rfu.h"
+#include "overworld.h"
+#include "script.h"
+#include "battle_tower.h"
+#include "mystery_event_script.h"
+#include "mevent.h"
+#include "mevent_server.h"
+
+extern u16 gBlockRecvBuffer[][128];
+
+struct mevent_srv_ish
+{
+ u32 unk_00;
+ u32 unk_04;
+ u32 mainseqno;
+ u32 unk_0C;
+ u32 unk_10;
+ void * unk_14;
+ void * unk_18;
+ void * unk_1C;
+ void * unk_20;
+ struct mevent_srv_sub unk_24;
+};
+
+struct mevent_cmd
+{
+ u32 instr;
+ bool32 flag;
+ u32 parameter;
+};
+
+EWRAM_DATA struct mevent_srv_ish * gUnknown_203F3C0 = NULL;
+
+void mevent_srv_ish_init(struct mevent_srv_ish *, u32, u32);
+u32 mevent_srv_ish_exec(struct mevent_srv_ish *);
+void sub_8144BC0(struct mevent_srv_ish *);
+extern const u8 gUnknown_84687E0[];
+
+void sub_8144AEC(void)
+{
+ gUnknown_203F3C0 = AllocZeroed(sizeof(struct mevent_srv_ish));
+ mevent_srv_ish_init(gUnknown_203F3C0, 1, 0);
+}
+
+u32 sub_8144B0C(u16 * a0)
+{
+ u32 result;
+ if (gUnknown_203F3C0 == NULL)
+ return 6;
+ result = mevent_srv_ish_exec(gUnknown_203F3C0);
+ if (result == 6)
+ {
+ *a0 = gUnknown_203F3C0->unk_04;
+ sub_8144BC0(gUnknown_203F3C0);
+ Free(gUnknown_203F3C0);
+ gUnknown_203F3C0 = NULL;
+ }
+ return result;
+}
+
+void sub_8144B48(void)
+{
+ gUnknown_203F3C0->unk_0C++;
+}
+
+void * sub_8144B58(void)
+{
+ return gUnknown_203F3C0->unk_20;
+}
+
+void sub_8144B64(u32 a0)
+{
+ gUnknown_203F3C0->unk_04 = a0;
+}
+
+void mevent_srv_ish_init(struct mevent_srv_ish * svr, u32 a1, u32 a2)
+{
+ svr->unk_00 = 0;
+ svr->mainseqno = 0;
+ svr->unk_0C = 0;
+ svr->unk_14 = AllocZeroed(ME_SEND_BUF_SIZE);
+ svr->unk_18 = AllocZeroed(ME_SEND_BUF_SIZE);
+ svr->unk_1C = AllocZeroed(ME_SEND_BUF_SIZE);
+ svr->unk_20 = AllocZeroed(0x40);
+ sub_814485C(&svr->unk_24, a1, a2);
+}
+
+void sub_8144BC0(struct mevent_srv_ish * svr)
+{
+ Free(svr->unk_14);
+ Free(svr->unk_18);
+ Free(svr->unk_1C);
+ Free(svr->unk_20);
+}
+
+void sub_8144BE4(struct mevent_srv_ish * svr)
+{
+ memcpy(svr->unk_1C, svr->unk_18, ME_SEND_BUF_SIZE);
+ svr->unk_10 = 0;
+}
+
+void sub_8144C00(struct mevent_srv_ish * svr, u32 a1, u32 a2)
+{
+ CpuFill32(0, svr->unk_14, ME_SEND_BUF_SIZE);
+ *(u32 *)svr->unk_14 = a2;
+ sub_8144888(&svr->unk_24, a1, svr->unk_14, 4);
+}
+
+// funcs in array gUnknown_8466F60
+
+u32 sub_8144C34(struct mevent_srv_ish * svr)
+{
+ memcpy(svr->unk_1C, gUnknown_84687E0, ME_SEND_BUF_SIZE);
+ svr->unk_10 = 0;
+ svr->mainseqno = 4;
+ svr->unk_0C = 0;
+ return 0;
+}
+
+u32 sub_8144C5C(struct mevent_srv_ish * svr)
+{
+ return 6;
+}
+
+u32 sub_8144C60(struct mevent_srv_ish * svr)
+{
+ if (sub_8144844(&svr->unk_24))
+ {
+ svr->mainseqno = 4;
+ svr->unk_0C = 0;
+ }
+ return 1;
+}
+
+u32 sub_8144C80(struct mevent_srv_ish * svr)
+{
+ if (sub_8144850(&svr->unk_24))
+ {
+ svr->mainseqno = 4;
+ svr->unk_0C = 0;
+ }
+ return 1;
+}
+
+u32 sub_8144CA0(struct mevent_srv_ish * svr)
+{
+ u32 * r2 = (u32 *)svr->unk_1C + 2 * svr->unk_10;
+ ++svr->unk_10;
+ switch (r2[0])
+ {
+ case 0:
+ break;
+ case 1:
+ svr->unk_04 = r2[1];
+ svr->mainseqno = 1;
+ svr->unk_0C = 0;
+ break;
+ case 2:
+ sub_81448AC(&svr->unk_24, r2[1], svr->unk_18);
+ svr->mainseqno = 2;
+ svr->unk_0C = 0;
+ break;
+ case 3:
+ svr->mainseqno = 3;
+ svr->unk_0C = 0;
+ break;
+ case 20:
+ sub_8144888(&svr->unk_24, 0x14, svr->unk_14, 0);
+ svr->mainseqno = 3;
+ svr->unk_0C = 0;
+ break;
+ case 19:
+ sub_8144C00(svr, 0x12, GetGameStat(r2[1]));
+ svr->mainseqno = 3;
+ svr->unk_0C = 0;
+ break;
+ case 6:
+ if (svr->unk_04 == 0)
+ sub_8144BE4(svr);
+ break;
+ case 7:
+ if (svr->unk_04 == 1)
+ sub_8144BE4(svr);
+ break;
+ case 4:
+ sub_8144BE4(svr);
+ break;
+ case 5:
+ memcpy(svr->unk_20, svr->unk_18, 0x40);
+ svr->mainseqno = 5;
+ svr->unk_0C = 0;
+ return 2;
+ case 11:
+ memcpy(svr->unk_20, svr->unk_18, 0x40);
+ svr->mainseqno = 5;
+ svr->unk_0C = 0;
+ return 3;
+ case 12:
+ memcpy(svr->unk_20, svr->unk_18, 0x40);
+ svr->mainseqno = 5;
+ svr->unk_0C = 0;
+ return 5;
+ case 13:
+ svr->mainseqno = 5;
+ svr->unk_0C = 0;
+ return 4;
+ case 8:
+ sub_81442CC(svr->unk_14);
+ sub_8144888(&svr->unk_24, 0x11, svr->unk_14, 0x64);
+ break;
+ case 14:
+ sub_8144C00(svr, 0x13, svr->unk_04);
+ break;
+ case 10:
+ sub_8143F68(svr->unk_18);
+ break;
+ case 9:
+ if (!sub_8143EF4(svr->unk_18))
+ {
+ sub_8143DC8(svr->unk_18);
+ sub_8144C00(svr, 0x13, 0);
+ }
+ else
+ sub_8144C00(svr, 0x13, 1);
+ break;
+ case 15:
+ svr->mainseqno = 6;
+ svr->unk_0C = 0;
+ break;
+ case 16:
+ sub_8144254(svr->unk_18);
+ break;
+ case 17:
+ sub_8069EA4(svr->unk_18, 1000);
+ break;
+ case 18:
+ memcpy(gSaveBlock2Ptr->unk_4A0, svr->unk_18, 0xbc);
+ sub_80E7490();
+ break;
+ case 21:
+ memcpy(gDecompressionBuffer, svr->unk_18, ME_SEND_BUF_SIZE);
+ svr->mainseqno = 7;
+ svr->unk_0C = 0;
+ break;
+ }
+
+ return 1;
+}
+
+u32 sub_8144E6C(struct mevent_srv_ish * svr)
+{
+ if (svr->unk_0C)
+ {
+ svr->mainseqno = 4;
+ svr->unk_0C = 0;
+ }
+ return 1;
+}
+
+u32 sub_8144E84(struct mevent_srv_ish * svr)
+{
+ switch (svr->unk_0C)
+ {
+ case 0:
+ sub_80DA89C(svr->unk_18);
+ ++svr->unk_0C;
+ break;
+ case 1:
+ if (!sub_80DA8B0(&svr->unk_04))
+ {
+ svr->mainseqno = 4;
+ svr->unk_0C = 0;
+ }
+ break;
+ }
+ return 1;
+}
+
+u32 sub_8144EBC(struct mevent_srv_ish * svr)
+{
+ u32 (*func)(u32 *, struct SaveBlock2 *, struct SaveBlock1 *) = (void *)gDecompressionBuffer;
+ if (func(&svr->unk_04, gSaveBlock2Ptr, gSaveBlock1Ptr) == 1)
+ {
+ svr->mainseqno = 4;
+ svr->unk_0C = 0;
+ }
+ return 1;
+}
+
+u32 mevent_srv_ish_exec(struct mevent_srv_ish * svr)
+{
+ u32 (*funcs[])(struct mevent_srv_ish *) = {
+ sub_8144C34,
+ sub_8144C5C,
+ sub_8144C60,
+ sub_8144C80,
+ sub_8144CA0,
+ sub_8144E6C,
+ sub_8144E84,
+ sub_8144EBC
+ };
+ return funcs[svr->mainseqno](svr);
+}