diff options
-rw-r--r-- | data/mevent/script_ish.inc | 2 | ||||
-rw-r--r-- | include/mevent_server.h | 8 | ||||
-rw-r--r-- | ld_script.txt | 2 | ||||
-rw-r--r-- | src/mevent_client.c | 289 | ||||
-rw-r--r-- | src/mevent_server.c | 283 | ||||
-rw-r--r-- | sym_ewram.txt | 9 |
6 files changed, 308 insertions, 285 deletions
diff --git a/data/mevent/script_ish.inc b/data/mevent/script_ish.inc index d96356887..7664e8391 100644 --- a/data/mevent/script_ish.inc +++ b/data/mevent/script_ish.inc @@ -1,4 +1,4 @@ -gMEVentClientScript_IntialListen:: @ 84687E0 +gMEventClientScript_IntialListen:: @ 84687E0 .4byte 0x02, 0x10 @ RECEIVE ID(0x10) .4byte 0x04, 0x00 @ JUMP TO RECEIVE BUFFER diff --git a/include/mevent_server.h b/include/mevent_server.h index f1e9df02b..3dafdff94 100644 --- a/include/mevent_server.h +++ b/include/mevent_server.h @@ -31,7 +31,7 @@ struct send_recv_header u16 size; }; -struct mevent_cmd_ish +struct mevent_client_cmd { u32 instr; u32 parameter; @@ -46,12 +46,12 @@ struct mevent_client u32 cmdidx; void * sendBuffer; void * recvBuffer; - struct mevent_cmd_ish * cmdBuffer; + struct mevent_client_cmd * cmdBuffer; void * buffer; struct mevent_srv_sub manager; }; -struct mevent_cmd +struct mevent_server_cmd { u32 instr; bool32 flag; @@ -64,7 +64,7 @@ struct mevent_srv_common u32 param; u32 mainseqno; u32 cmdidx; - const struct mevent_cmd * cmdBuffer; + const struct mevent_server_cmd * cmdBuffer; void * recvBuffer; struct MEventBuffer_32E0_Sub * card; struct MEventBuffer_3120_Sub * news; diff --git a/ld_script.txt b/ld_script.txt index f06309dfc..f62c6fd8d 100644 --- a/ld_script.txt +++ b/ld_script.txt @@ -261,6 +261,7 @@ SECTIONS { src/mystery_gift_menu.o(.text); src/mevent.o(.text); src/mevent_server_helpers.o(.text); + src/mevent_client.o(.text); src/mevent_server.o(.text); src/mevent_8145654.o(.text); src/menews_jisan.o(.text); @@ -532,6 +533,7 @@ SECTIONS { src/mystery_gift_menu.o(.rodata); src/mevent.o(.rodata); src/mevent_server_helpers.o(.rodata); + src/mevent_client.o(.rodata); src/mevent_server.o(.rodata); src/mevent_8145654.o(.rodata); data/data_8466FB8.o(.rodata); diff --git a/src/mevent_client.c b/src/mevent_client.c new file mode 100644 index 000000000..f411bd183 --- /dev/null +++ b/src/mevent_client.c @@ -0,0 +1,289 @@ +#include "global.h" +#include "malloc.h" +#include "decompress.h" +#include "overworld.h" +#include "script.h" +#include "battle_tower.h" +#include "mystery_event_script.h" +#include "mevent.h" +#include "mevent_server.h" + +static EWRAM_DATA struct mevent_client * s_mevent_client_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 *); + +extern const struct mevent_client_cmd gMEventClientScript_IntialListen[]; + +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 client_mainseq_0(struct mevent_client * svr) +{ + // init + memcpy(svr->cmdBuffer, gMEventClientScript_IntialListen, ME_SEND_BUF_SIZE); + svr->cmdidx = 0; + svr->mainseqno = 4; + svr->flag = 0; + return 0; +} + +static u32 client_mainseq_1(struct mevent_client * svr) +{ + // done + return 6; +} + +static u32 client_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 client_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 client_mainseq_4(struct mevent_client * svr) +{ + // process command + struct mevent_client_cmd * 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 client_mainseq_5(struct mevent_client * svr) +{ + // wait flag + if (svr->flag) + { + svr->mainseqno = 4; + svr->flag = 0; + } + return 1; +} + +static u32 client_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 client_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 *) = { + client_mainseq_0, + client_mainseq_1, + client_mainseq_2, + client_mainseq_3, + client_mainseq_4, + client_mainseq_5, + client_mainseq_6, + client_mainseq_7 + }; + return funcs[svr->mainseqno](svr); +} diff --git a/src/mevent_server.c b/src/mevent_server.c index 059bde4a9..a98216d93 100644 --- a/src/mevent_server.c +++ b/src/mevent_server.c @@ -8,291 +8,14 @@ #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 gMEVentClientScript_IntialListen[]; -extern const struct mevent_cmd gMEventSrvScript_SendNews[]; -extern const struct mevent_cmd gMEventSrvScript_SendCard[]; - -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, gMEVentClientScript_IntialListen, 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) { @@ -399,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++; diff --git a/sym_ewram.txt b/sym_ewram.txt index d3e29a065..5873bba2e 100644 --- a/sym_ewram.txt +++ b/sym_ewram.txt @@ -728,13 +728,22 @@ sLocationHistory: @ 203F3A8 sRoamerLocation: @ 203F3AE .space 0x2 + .align 2 .include "src/mystery_gift_menu.o" + .align 2 .include "src/mevent.o" + .align 2 .include "src/mevent_server_helpers.o" + .align 2 + .include "src/mevent_client.o" + .align 2 .include "src/mevent_server.o" + .align 2 .include "src/mevent_8145654.o" + .align 2 .include "src/seagallop.o" + .align 2 gUnknown_203F3D4: @ 203F3D4 .space 0x4 |