diff options
Diffstat (limited to 'src/mevent_server.c')
-rw-r--r-- | src/mevent_server.c | 320 |
1 files changed, 20 insertions, 300 deletions
diff --git a/src/mevent_server.c b/src/mevent_server.c index 9fe9e9e79..252a8885f 100644 --- a/src/mevent_server.c +++ b/src/mevent_server.c @@ -1,9 +1,6 @@ #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" @@ -11,302 +8,25 @@ #include "mevent.h" #include "mevent_server.h" -EWRAM_DATA struct mevent_client * s_mevent_client_ptr = NULL; EWRAM_DATA struct mevent_srv_common * s_mevent_srv_common_ptr = NULL; -static void mevent_client_init(struct mevent_client *, u32, u32); -static u32 mevent_client_exec(struct mevent_client *); -static void mevent_client_free_resources(struct mevent_client *); static void mevent_srv_init_common(struct mevent_srv_common *, const void *, u32, u32); static void mevent_srv_free_resources(struct mevent_srv_common *); static u32 mevent_srv_exec_common(struct mevent_srv_common *); -extern const u8 gUnknown_84687E0[]; -extern const struct mevent_cmd gUnknown_8468B6C[]; -extern const struct mevent_cmd gUnknown_8468BCC[]; - -void mevent_client_do_init(void) -{ - s_mevent_client_ptr = AllocZeroed(sizeof(struct mevent_client)); - mevent_client_init(s_mevent_client_ptr, 1, 0); -} - -u32 mevent_client_do_exec(u16 * a0) -{ - u32 result; - if (s_mevent_client_ptr == NULL) - return 6; - result = mevent_client_exec(s_mevent_client_ptr); - if (result == 6) - { - *a0 = s_mevent_client_ptr->param; - mevent_client_free_resources(s_mevent_client_ptr); - Free(s_mevent_client_ptr); - s_mevent_client_ptr = NULL; - } - return result; -} - -void mevent_client_inc_flag(void) -{ - s_mevent_client_ptr->flag++; -} - -void * mevent_client_get_buffer(void) -{ - return s_mevent_client_ptr->buffer; -} - -void mevent_client_set_param(u32 a0) -{ - s_mevent_client_ptr->param = a0; -} - -static void mevent_client_init(struct mevent_client * svr, u32 sendPlayerNo, u32 recvPlayerNo) -{ - svr->unk_00 = 0; - svr->mainseqno = 0; - svr->flag = 0; - svr->sendBuffer = AllocZeroed(ME_SEND_BUF_SIZE); - svr->recvBuffer = AllocZeroed(ME_SEND_BUF_SIZE); - svr->cmdBuffer = AllocZeroed(ME_SEND_BUF_SIZE); - svr->buffer = AllocZeroed(0x40); - mevent_srv_sub_init(&svr->manager, sendPlayerNo, recvPlayerNo); -} - -static void mevent_client_free_resources(struct mevent_client * svr) -{ - Free(svr->sendBuffer); - Free(svr->recvBuffer); - Free(svr->cmdBuffer); - Free(svr->buffer); -} - -static void mevent_client_jmp_buffer(struct mevent_client * svr) -{ - memcpy(svr->cmdBuffer, svr->recvBuffer, ME_SEND_BUF_SIZE); - svr->cmdidx = 0; -} - -static void mevent_client_send_word(struct mevent_client * svr, u32 ident, u32 word) -{ - CpuFill32(0, svr->sendBuffer, ME_SEND_BUF_SIZE); - *(u32 *)svr->sendBuffer = word; - mevent_srv_sub_init_send(&svr->manager, ident, svr->sendBuffer, sizeof(u32)); -} - -static u32 ish_mainseq_0(struct mevent_client * svr) -{ - // init - memcpy(svr->cmdBuffer, gUnknown_84687E0, ME_SEND_BUF_SIZE); - svr->cmdidx = 0; - svr->mainseqno = 4; - svr->flag = 0; - return 0; -} - -static u32 ish_mainseq_1(struct mevent_client * svr) -{ - // done - return 6; -} - -static u32 ish_mainseq_2(struct mevent_client * svr) -{ - // do recv - if (mevent_srv_sub_recv(&svr->manager)) - { - svr->mainseqno = 4; - svr->flag = 0; - } - return 1; -} - -static u32 ish_mainseq_3(struct mevent_client * svr) -{ - // do send - if (mevent_srv_sub_send(&svr->manager)) - { - svr->mainseqno = 4; - svr->flag = 0; - } - return 1; -} - -static u32 ish_mainseq_4(struct mevent_client * svr) -{ - // process command - struct mevent_cmd_ish * cmd = &svr->cmdBuffer[svr->cmdidx]; - ++svr->cmdidx; - switch (cmd->instr) - { - case 0: - break; - case 1: - svr->param = cmd->parameter; - svr->mainseqno = 1; - svr->flag = 0; - break; - case 2: - mevent_srv_sub_init_recv(&svr->manager, cmd->parameter, svr->recvBuffer); - svr->mainseqno = 2; - svr->flag = 0; - break; - case 3: - svr->mainseqno = 3; - svr->flag = 0; - break; - case 20: - mevent_srv_sub_init_send(&svr->manager, 0x14, svr->sendBuffer, 0); - svr->mainseqno = 3; - svr->flag = 0; - break; - case 19: - mevent_client_send_word(svr, 0x12, GetGameStat(cmd->parameter)); - svr->mainseqno = 3; - svr->flag = 0; - break; - case 6: - if (svr->param == 0) - mevent_client_jmp_buffer(svr); - break; - case 7: - if (svr->param == 1) - mevent_client_jmp_buffer(svr); - break; - case 4: - mevent_client_jmp_buffer(svr); - break; - case 5: - memcpy(svr->buffer, svr->recvBuffer, 0x40); - svr->mainseqno = 5; - svr->flag = 0; - return 2; - case 11: - memcpy(svr->buffer, svr->recvBuffer, 0x40); - svr->mainseqno = 5; - svr->flag = 0; - return 3; - case 12: - memcpy(svr->buffer, svr->recvBuffer, 0x40); - svr->mainseqno = 5; - svr->flag = 0; - return 5; - case 13: - svr->mainseqno = 5; - svr->flag = 0; - return 4; - case 8: - sub_81442CC(svr->sendBuffer); - mevent_srv_sub_init_send(&svr->manager, 0x11, svr->sendBuffer, sizeof(struct MEventStruct_Unk1442CC)); - break; - case 14: - mevent_client_send_word(svr, 0x13, svr->param); - break; - case 10: - sub_8143F68(svr->recvBuffer); - break; - case 9: - if (!sub_8143EF4(svr->recvBuffer)) - { - sub_8143DC8(svr->recvBuffer); - mevent_client_send_word(svr, 0x13, 0); - } - else - mevent_client_send_word(svr, 0x13, 1); - break; - case 15: - svr->mainseqno = 6; - svr->flag = 0; - break; - case 16: - sub_8144254(svr->recvBuffer); - break; - case 17: - sub_8069EA4(svr->recvBuffer, 1000); - break; - case 18: - memcpy(&gSaveBlock2Ptr->unk_B0.field_3F0, svr->recvBuffer, sizeof(struct BattleTowerEReaderTrainer)); - ValidateEReaderTrainer(); - break; - case 21: - memcpy(gDecompressionBuffer, svr->recvBuffer, ME_SEND_BUF_SIZE); - svr->mainseqno = 7; - svr->flag = 0; - break; - } - - return 1; -} - -static u32 ish_mainseq_5(struct mevent_client * svr) -{ - // wait flag - if (svr->flag) - { - svr->mainseqno = 4; - svr->flag = 0; - } - return 1; -} - -static u32 ish_mainseq_6(struct mevent_client * svr) -{ - // ??? - switch (svr->flag) - { - case 0: - sub_80DA89C(svr->recvBuffer); - ++svr->flag; - break; - case 1: - if (!sub_80DA8B0(&svr->param)) - { - svr->mainseqno = 4; - svr->flag = 0; - } - break; - } - return 1; -} - -static u32 ish_mainseq_7(struct mevent_client * svr) -{ - // exec arbitrary code - u32 (*func)(u32 *, struct SaveBlock2 *, struct SaveBlock1 *) = (void *)gDecompressionBuffer; - if (func(&svr->param, gSaveBlock2Ptr, gSaveBlock1Ptr) == 1) - { - svr->mainseqno = 4; - svr->flag = 0; - } - return 1; -} - -static u32 mevent_client_exec(struct mevent_client * svr) -{ - u32 (*funcs[])(struct mevent_client *) = { - ish_mainseq_0, - ish_mainseq_1, - ish_mainseq_2, - ish_mainseq_3, - ish_mainseq_4, - ish_mainseq_5, - ish_mainseq_6, - ish_mainseq_7 - }; - return funcs[svr->mainseqno](svr); -} +extern const struct mevent_server_cmd gMEventSrvScript_SendNews[]; +extern const struct mevent_server_cmd gMEventSrvScript_SendCard[]; void mevent_srv_init_wnews(void) { s_mevent_srv_common_ptr = AllocZeroed(sizeof(struct mevent_srv_common)); - mevent_srv_init_common(s_mevent_srv_common_ptr, gUnknown_8468B6C, 0, 1); + mevent_srv_init_common(s_mevent_srv_common_ptr, gMEventSrvScript_SendNews, 0, 1); } void mevent_srv_new_wcard(void) { s_mevent_srv_common_ptr = AllocZeroed(sizeof(struct mevent_srv_common)); - mevent_srv_init_common(s_mevent_srv_common_ptr, gUnknown_8468BCC, 0, 1); + mevent_srv_init_common(s_mevent_srv_common_ptr, gMEventSrvScript_SendCard, 0, 1); } u32 mevent_srv_common_do_exec(u16 * a0) @@ -329,10 +49,10 @@ static void mevent_srv_init_common(struct mevent_srv_common * svr, const void * { svr->unk_00 = 0; svr->mainseqno = 0; - svr->mevent_32e0 = AllocZeroed(sizeof(struct MEventBuffer_32E0_Sub)); - svr->mevent_3120 = AllocZeroed(sizeof(struct MEventBuffer_3120_Sub)); + svr->card = AllocZeroed(sizeof(struct MEWonderCardData)); + svr->news = AllocZeroed(sizeof(struct MEWonderNewsData)); svr->recvBuffer = AllocZeroed(ME_SEND_BUF_SIZE); - svr->mevent_unk1442cc = AllocZeroed(sizeof(struct MEventStruct_Unk1442CC)); + svr->mevent_unk1442cc = AllocZeroed(sizeof(struct MEventClientHeaderStruct)); svr->cmdBuffer = cmdBuffer; svr->cmdidx = 0; mevent_srv_sub_init(&svr->manager, sendPlayerNo, recvPlayerNo); @@ -340,8 +60,8 @@ static void mevent_srv_init_common(struct mevent_srv_common * svr, const void * static void mevent_srv_free_resources(struct mevent_srv_common * svr) { - Free(svr->mevent_32e0); - Free(svr->mevent_3120); + Free(svr->card); + Free(svr->news); Free(svr->recvBuffer); Free(svr->mevent_unk1442cc); } @@ -402,7 +122,7 @@ static u32 common_mainseq_3(struct mevent_srv_common * svr) static u32 common_mainseq_4(struct mevent_srv_common * svr) { // process command - const struct mevent_cmd * cmd = &svr->cmdBuffer[svr->cmdidx]; + const struct mevent_server_cmd * cmd = &svr->cmdBuffer[svr->cmdidx]; void * ptr; svr->cmdidx++; @@ -429,12 +149,12 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr) case 5: AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 376); AGB_ASSERT_EX(cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 377); - memcpy(svr->mevent_unk1442cc, svr->recvBuffer, sizeof(struct MEventStruct_Unk1442CC)); + memcpy(svr->mevent_unk1442cc, svr->recvBuffer, sizeof(struct MEventClientHeaderStruct)); break; case 6: AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 382); AGB_ASSERT_EX(cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 383); - svr->param = sub_81443D4(svr->mevent_unk1442cc); + svr->param = ValidateMEventClientHeader(svr->mevent_unk1442cc); break; case 4: if (svr->param == cmd->flag) @@ -445,7 +165,7 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr) break; case 7: AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 396); - ptr = mevent_first_if_not_null_else_second(cmd->parameter, svr->mevent_32e0); + ptr = mevent_first_if_not_null_else_second(cmd->parameter, svr->card); svr->param = sub_8144418(ptr, svr->mevent_unk1442cc, ptr); break; case 8: @@ -472,11 +192,11 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr) break; case 14: AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 432); - mevent_srv_common_init_send(svr, 0x17, mevent_first_if_not_null_else_second(cmd->parameter, svr->mevent_3120), sizeof(struct MEventBuffer_3120_Sub)); + mevent_srv_common_init_send(svr, 0x17, mevent_first_if_not_null_else_second(cmd->parameter, svr->news), sizeof(struct MEWonderNewsData)); break; case 13: AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 438); - mevent_srv_common_init_send(svr, 0x16, mevent_first_if_not_null_else_second(cmd->parameter, svr->mevent_32e0), sizeof(struct MEventBuffer_32E0_Sub)); + mevent_srv_common_init_send(svr, 0x16, mevent_first_if_not_null_else_second(cmd->parameter, svr->card), sizeof(struct MEWonderCardData)); break; case 16: AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 444); @@ -506,11 +226,11 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr) break; case 22: AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 481); - memcpy(svr->mevent_32e0, cmd->parameter, 332); + memcpy(svr->card, cmd->parameter, 332); break; case 23: AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 486); - memcpy(svr->mevent_3120, cmd->parameter, 444); + memcpy(svr->news, cmd->parameter, 444); break; case 21: AGB_ASSERT_EX(cmd->flag == FALSE, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 491); @@ -526,12 +246,12 @@ static u32 common_mainseq_4(struct mevent_srv_common * svr) break; case 26: AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 506); - memcpy(svr->mevent_32e0, GetSavedWonderCard(), 332); - sub_814410C(svr->mevent_32e0); + memcpy(svr->card, GetSavedWonderCard(), 332); + sub_814410C(svr->card); break; case 27: AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 512); - memcpy(svr->mevent_3120, GetSavedWonderNews(), 444); + memcpy(svr->news, GetSavedWonderNews(), 444); break; case 28: AGB_ASSERT_EX(cmd->flag == FALSE && cmd->parameter == NULL, "C:/WORK/POKeFRLG/src/pm_lgfr_ose/source/mevent_server.c", 517); |