summaryrefslogtreecommitdiff
path: root/src/mevent_client.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mevent_client.c')
-rw-r--r--src/mevent_client.c354
1 files changed, 181 insertions, 173 deletions
diff --git a/src/mevent_client.c b/src/mevent_client.c
index 9a62bf18e..2bcab1e5a 100644
--- a/src/mevent_client.c
+++ b/src/mevent_client.c
@@ -8,284 +8,292 @@
#include "mystery_event_script.h"
#include "mevent_client.h"
-EWRAM_DATA struct mevent_client * s_mevent_client_ptr = NULL;
+enum {
+ FUNC_INIT,
+ FUNC_DONE,
+ FUNC_RECV,
+ FUNC_SEND,
+ FUNC_RUN,
+ FUNC_WAIT,
+ FUNC_6,
+ FUNC_7,
+};
-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 *);
+EWRAM_DATA static struct MysteryGiftClient * sClient = NULL;
-extern const struct mevent_client_cmd gUnknown_082F2598[];
+static void MysteryGiftClient_Init(struct MysteryGiftClient *, u32, u32);
+static u32 MysteryGiftClient_CallFunc(struct MysteryGiftClient *);
+static void MysteryGiftClient_Free(struct MysteryGiftClient *);
-void mevent_client_do_init(u32 arg)
+extern const struct MysteryGiftClientCmd gUnknown_082F2598[];
+
+void MysteryGiftClient_Create(bool32 isWonderNews)
{
- s_mevent_client_ptr = AllocZeroed(sizeof(struct mevent_client));
- mevent_client_init(s_mevent_client_ptr, 1, 0);
- s_mevent_client_ptr->unk_4C = arg;
+ sClient = AllocZeroed(sizeof(*sClient));
+ MysteryGiftClient_Init(sClient, 1, 0);
+ sClient->isWonderNews = isWonderNews;
}
-u32 mevent_client_do_exec(u16 * a0)
+u32 MysteryGiftClient_Run(u16 * endVal)
{
u32 result;
- if (s_mevent_client_ptr == NULL)
- return 6;
- result = mevent_client_exec(s_mevent_client_ptr);
- if (result == 6)
+ if (sClient == NULL)
+ return CLI_RET_END;
+ result = MysteryGiftClient_CallFunc(sClient);
+ if (result == CLI_RET_END)
{
- *a0 = s_mevent_client_ptr->param;
- mevent_client_free_resources(s_mevent_client_ptr);
- Free(s_mevent_client_ptr);
- s_mevent_client_ptr = NULL;
+ *endVal = sClient->param;
+ MysteryGiftClient_Free(sClient);
+ Free(sClient);
+ sClient = NULL;
}
return result;
}
-void mevent_client_inc_flag(void)
+void MysteryGiftClient_AdvanceState(void)
{
- s_mevent_client_ptr->flag++;
+ sClient->funcState++;
}
void * mevent_client_get_buffer(void)
{
- return s_mevent_client_ptr->buffer;
+ return sClient->buffer;
}
-void mevent_client_set_param(u32 a0)
+void MysteryGiftClient_SetParam(u32 val)
{
- s_mevent_client_ptr->param = a0;
+ sClient->param = val;
}
-static void mevent_client_init(struct mevent_client * svr, u32 sendPlayerNo, u32 recvPlayerNo)
+static void MysteryGiftClient_Init(struct MysteryGiftClient * client, 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);
+ client->unk_00 = 0;
+ client->funcId = FUNC_INIT;
+ client->funcState = 0;
+ client->sendBuffer = AllocZeroed(ME_SEND_BUF_SIZE);
+ client->recvBuffer = AllocZeroed(ME_SEND_BUF_SIZE);
+ client->cmdBuffer = AllocZeroed(ME_SEND_BUF_SIZE);
+ client->buffer = AllocZeroed(0x40);
+ MysteryGiftLink_Init(&client->link, sendPlayerNo, recvPlayerNo);
}
-static void mevent_client_free_resources(struct mevent_client * svr)
+static void MysteryGiftClient_Free(struct MysteryGiftClient * client)
{
- Free(svr->sendBuffer);
- Free(svr->recvBuffer);
- Free(svr->cmdBuffer);
- Free(svr->buffer);
+ Free(client->sendBuffer);
+ Free(client->recvBuffer);
+ Free(client->cmdBuffer);
+ Free(client->buffer);
}
-static void mevent_client_jmp_buffer(struct mevent_client * svr)
+static void MysteryGiftClient_CopyRecvScript(struct MysteryGiftClient * client)
{
- memcpy(svr->cmdBuffer, svr->recvBuffer, ME_SEND_BUF_SIZE);
- svr->cmdidx = 0;
+ memcpy(client->cmdBuffer, client->recvBuffer, ME_SEND_BUF_SIZE);
+ client->cmdidx = 0;
}
-static void mevent_client_send_word(struct mevent_client * svr, u32 ident, u32 word)
+static void MysteryGiftClient_InitSend(struct MysteryGiftClient * client, 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));
+ CpuFill32(0, client->sendBuffer, ME_SEND_BUF_SIZE);
+ *(u32 *)client->sendBuffer = word;
+ MysteryGiftLink_InitSend(&client->link, ident, client->sendBuffer, sizeof(u32));
}
-static u32 mainseq_0(struct mevent_client * svr)
+static u32 Client_Init(struct MysteryGiftClient * client)
{
- // init
- memcpy(svr->cmdBuffer, gUnknown_082F2598, ME_SEND_BUF_SIZE);
- svr->cmdidx = 0;
- svr->mainseqno = 4;
- svr->flag = 0;
- return 0;
+ memcpy(client->cmdBuffer, gUnknown_082F2598, ME_SEND_BUF_SIZE);
+ client->cmdidx = 0;
+ client->funcId = FUNC_RUN;
+ client->funcState = 0;
+ return CLI_RET_INIT;
}
-static u32 mainseq_1(struct mevent_client * svr)
+static u32 Client_Done(struct MysteryGiftClient * client)
{
- // done
- return 6;
+ return CLI_RET_END;
}
-static u32 mainseq_2(struct mevent_client * svr)
+static u32 Client_Recv(struct MysteryGiftClient * client)
{
- // do recv
- if (mevent_srv_sub_recv(&svr->manager))
+ if (MysteryGiftLink_Recv(&client->link))
{
- svr->mainseqno = 4;
- svr->flag = 0;
+ client->funcId = FUNC_RUN;
+ client->funcState = 0;
}
- return 1;
+ return CLI_RET_1;
}
-static u32 mainseq_3(struct mevent_client * svr)
+static u32 Client_Send(struct MysteryGiftClient * client)
{
- // do send
- if (mevent_srv_sub_send(&svr->manager))
+ if (MysteryGiftLink_Send(&client->link))
{
- svr->mainseqno = 4;
- svr->flag = 0;
+ client->funcId = FUNC_RUN;
+ client->funcState = 0;
}
- return 1;
+ return CLI_RET_1;
}
-static u32 mainseq_4(struct mevent_client * svr)
+static u32 Client_Run(struct MysteryGiftClient * client)
{
// process command
- struct mevent_client_cmd * cmd = &svr->cmdBuffer[svr->cmdidx];
- ++svr->cmdidx;
+ struct MysteryGiftClientCmd * cmd = &client->cmdBuffer[client->cmdidx];
+ client->cmdidx++;
switch (cmd->instr)
{
- case 0:
+ case CLI_NONE:
break;
- case 1:
- svr->param = cmd->parameter;
- svr->mainseqno = 1;
- svr->flag = 0;
+ case CLI_RETURN:
+ client->param = cmd->parameter; // Set for endVal in MysteryGiftClient_Run
+ client->funcId = FUNC_DONE;
+ client->funcState = 0;
break;
- case 2:
- mevent_srv_sub_init_recv(&svr->manager, cmd->parameter, svr->recvBuffer);
- svr->mainseqno = 2;
- svr->flag = 0;
+ case CLI_RECV:
+ MysteryGiftLink_InitRecv(&client->link, cmd->parameter, client->recvBuffer);
+ client->funcId = FUNC_RECV;
+ client->funcState = 0;
break;
- case 3:
- svr->mainseqno = 3;
- svr->flag = 0;
+ case CLI_SEND_LOADED:
+ // Send without a MysteryGiftLink_InitSend
+ // Sends whatever has been loaded already
+ client->funcId = FUNC_SEND;
+ client->funcState = 0;
break;
- case 20:
- mevent_srv_sub_init_send(&svr->manager, 0x14, svr->sendBuffer, 0);
- svr->mainseqno = 3;
- svr->flag = 0;
+ case CLI_20:
+ MysteryGiftLink_InitSend(&client->link, 0x14, client->sendBuffer, 0);
+ client->funcId = FUNC_SEND;
+ client->funcState = 0;
break;
- case 19:
- mevent_client_send_word(svr, 0x12, GetGameStat(cmd->parameter));
- svr->mainseqno = 3;
- svr->flag = 0;
+ case CLI_SEND_STAT:
+ MysteryGiftClient_InitSend(client, 0x12, GetGameStat(cmd->parameter));
+ client->funcId = FUNC_SEND;
+ client->funcState = 0;
break;
- case 6:
- if (svr->param == 0)
- mevent_client_jmp_buffer(svr);
+ case CLI_COPY_RECV_IF_N:
+ if (client->param == FALSE)
+ MysteryGiftClient_CopyRecvScript(client);
break;
- case 7:
- if (svr->param == 1)
- mevent_client_jmp_buffer(svr);
+ case CLI_COPY_RECV_IF:
+ if (client->param == TRUE)
+ MysteryGiftClient_CopyRecvScript(client);
break;
- case 4:
- mevent_client_jmp_buffer(svr);
+ case CLI_COPY_RECV:
+ MysteryGiftClient_CopyRecvScript(client);
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_801B580(svr->sendBuffer, svr->unk_4C);
- mevent_srv_sub_init_send(&svr->manager, 0x11, svr->sendBuffer, sizeof(struct MEventStruct_Unk1442CC));
+ case CLI_5:
+ memcpy(client->buffer, client->recvBuffer, 0x40);
+ client->funcId = FUNC_WAIT;
+ client->funcState = 0;
+ return CLI_RET_2;
+ case CLI_11:
+ memcpy(client->buffer, client->recvBuffer, 0x40);
+ client->funcId = FUNC_WAIT;
+ client->funcState = 0;
+ return CLI_RET_3;
+ case CLI_12:
+ memcpy(client->buffer, client->recvBuffer, 0x40);
+ client->funcId = FUNC_WAIT;
+ client->funcState = 0;
+ return CLI_RET_5;
+ case CLI_ASK_TOSS:
+ client->funcId = FUNC_WAIT;
+ client->funcState = 0;
+ return CLI_RET_ASK_TOSS;
+ case CLI_8:
+ sub_801B580(client->sendBuffer, client->isWonderNews);
+ MysteryGiftLink_InitSend(&client->link, 0x11, client->sendBuffer, sizeof(struct MEventStruct_Unk1442CC));
break;
- case 14:
- mevent_client_send_word(svr, 0x13, svr->param);
+ case CLI_LOAD_TOSS_RESPONSE:
+ // param here is set by MG_STATE_LINK_ASK_TOSS or MG_STATE_LINK_ASK_TOSS_UNRECEIVED
+ MysteryGiftClient_InitSend(client, 0x13, client->param);
break;
- case 10:
- sub_801B21C(svr->recvBuffer);
+ case CLI_10:
+ SaveWonderCard(client->recvBuffer);
break;
- case 9:
- if (!sub_801B1A4(svr->recvBuffer))
+ case CLI_9:
+ if (!sub_801B1A4(client->recvBuffer))
{
- sub_801B078(svr->recvBuffer);
- mevent_client_send_word(svr, 0x13, 0);
+ SaveWonderNews(client->recvBuffer);
+ MysteryGiftClient_InitSend(client, 0x13, 0);
}
else
- mevent_client_send_word(svr, 0x13, 1);
+ MysteryGiftClient_InitSend(client, 0x13, 1);
break;
- case 15:
- svr->mainseqno = 6;
- svr->flag = 0;
+ case CLI_15:
+ client->funcId = FUNC_6;
+ client->funcState = 0;
break;
- case 16:
- sub_801B508(svr->recvBuffer);
+ case CLI_16:
+ sub_801B508(client->recvBuffer);
break;
- case 17:
- InitRamScript_NoObjectEvent(svr->recvBuffer, 1000);
+ case CLI_17:
+ InitRamScript_NoObjectEvent(client->recvBuffer, 1000);
break;
- case 18:
- memcpy(&gSaveBlock2Ptr->frontier.ereaderTrainer, svr->recvBuffer, 0xbc);
+ case CLI_RECV_EREADER_TRAINER:
+ memcpy(&gSaveBlock2Ptr->frontier.ereaderTrainer, client->recvBuffer, sizeof(gSaveBlock2Ptr->frontier.ereaderTrainer));
ValidateEReaderTrainer();
break;
- case 21:
- memcpy(gDecompressionBuffer, svr->recvBuffer, ME_SEND_BUF_SIZE);
- svr->mainseqno = 7;
- svr->flag = 0;
+ case CLI_21:
+ memcpy(gDecompressionBuffer, client->recvBuffer, ME_SEND_BUF_SIZE);
+ client->funcId = FUNC_7;
+ client->funcState = 0;
break;
}
- return 1;
+ return CLI_RET_1;
}
-static u32 mainseq_5(struct mevent_client * svr)
+static u32 Client_Wait(struct MysteryGiftClient * client)
{
- // wait flag
- if (svr->flag)
+ if (client->funcState)
{
- svr->mainseqno = 4;
- svr->flag = 0;
+ client->funcId = FUNC_RUN;
+ client->funcState = 0;
}
- return 1;
+ return CLI_RET_1;
}
-static u32 mainseq_6(struct mevent_client * svr)
+static u32 Client_6(struct MysteryGiftClient * client)
{
- // ???
- switch (svr->flag)
+ switch (client->funcState)
{
case 0:
- sub_8153870(svr->recvBuffer);
- ++svr->flag;
+ InitMysteryGiftScriptContext(client->recvBuffer);
+ client->funcState++;
break;
case 1:
- if (!sub_8153884(&svr->param))
+ if (!RunMysteryGiftScriptContextCommand(&client->param))
{
- svr->mainseqno = 4;
- svr->flag = 0;
+ client->funcId = FUNC_RUN;
+ client->funcState = 0;
}
break;
}
- return 1;
+ return CLI_RET_1;
}
-static u32 mainseq_7(struct mevent_client * svr)
+static u32 Client_7(struct MysteryGiftClient * client)
{
// exec arbitrary code
u32 (*func)(u32 *, struct SaveBlock2 *, struct SaveBlock1 *) = (void *)gDecompressionBuffer;
- if (func(&svr->param, gSaveBlock2Ptr, gSaveBlock1Ptr) == 1)
+ if (func(&client->param, gSaveBlock2Ptr, gSaveBlock1Ptr) == 1)
{
- svr->mainseqno = 4;
- svr->flag = 0;
+ client->funcId = FUNC_RUN;
+ client->funcState = 0;
}
- return 1;
+ return CLI_RET_1;
}
-static u32 mevent_client_exec(struct mevent_client * svr)
+static u32 MysteryGiftClient_CallFunc(struct MysteryGiftClient * client)
{
- u32 (*funcs[])(struct mevent_client *) = {
- mainseq_0,
- mainseq_1,
- mainseq_2,
- mainseq_3,
- mainseq_4,
- mainseq_5,
- mainseq_6,
- mainseq_7
+ u32 (*funcs[])(struct MysteryGiftClient *) = {
+ [FUNC_INIT] = Client_Init,
+ [FUNC_DONE] = Client_Done,
+ [FUNC_RECV] = Client_Recv,
+ [FUNC_SEND] = Client_Send,
+ [FUNC_RUN] = Client_Run,
+ [FUNC_WAIT] = Client_Wait,
+ [FUNC_6] = Client_6,
+ [FUNC_7] = Client_7
};
- return funcs[svr->mainseqno](svr);
+ return funcs[client->funcId](client);
}