diff options
author | PikalaxALT <PikalaxALT@users.noreply.github.com> | 2019-04-26 12:50:51 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-04-26 12:50:51 -0400 |
commit | a1e8de5098b9bc3a978240e893a494f1a25248d8 (patch) | |
tree | 1381887937def8daa4cc9e9cc477a59e9ff74390 /src | |
parent | 1a4867a4bf4427c45af7545adcabae58ee19eb6e (diff) | |
parent | 274151836b44d960ab357d861a4d79602a8722d5 (diff) |
Merge pull request #53 from PikalaxALT/mystery_gift_menu
Mystery gift menu
Diffstat (limited to 'src')
-rw-r--r-- | src/menews_jisan.c | 4 | ||||
-rw-r--r-- | src/mevent.c | 86 | ||||
-rw-r--r-- | src/mevent_8145654.c | 28 | ||||
-rw-r--r-- | src/mevent_server.c | 92 | ||||
-rw-r--r-- | src/mystery_gift_menu.c | 1756 | ||||
-rw-r--r-- | src/script.c | 4 |
6 files changed, 1863 insertions, 107 deletions
diff --git a/src/menews_jisan.c b/src/menews_jisan.c index 530762990..0d406e66a 100644 --- a/src/menews_jisan.c +++ b/src/menews_jisan.c @@ -10,7 +10,7 @@ static u32 sub_8146E0C(struct MysteryEventStruct *); static void sub_8146DA0(struct MysteryEventStruct *); static void sub_8146D94(struct MysteryEventStruct *); -void sub_8146C30(u32 a0) +void GenerateRandomNews(u32 a0) { struct MysteryEventStruct *r5 = sub_8143D94(); @@ -59,7 +59,7 @@ u16 sub_8146CE8(void) struct MysteryEventStruct *r4 = sub_8143D94(); u16 r5; - if (!sub_806E2BC() || !sub_8143E1C()) + if (!sub_806E2BC() || !ValidateReceivedWonderNews()) return 0; r5 = sub_8146E0C(r4); diff --git a/src/mevent.c b/src/mevent.c index a62286f21..4d625987e 100644 --- a/src/mevent.c +++ b/src/mevent.c @@ -240,7 +240,7 @@ u32 sub_8143770(u8 * r4, u16 * r5) return 0; } -void sub_81438A0(void) +void task_add_00_ereader(void) { u8 taskId = CreateTask(sub_8143910, 0); struct MEventTaskData1 *data = (struct MEventTaskData1 *)gTasks[taskId].data; @@ -279,7 +279,7 @@ void sub_8143910(u8 taskId) switch (data->t08) { case 0: - if (mevent_0814257C(&data->t09, gUnknown_841DE52)) + if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE52)) data->t08 = 1; break; case 1: @@ -294,16 +294,16 @@ void sub_8143910(u8 taskId) case 3: if (!sub_814374C()) { - sub_80098B8(); + CloseLink(); data->t08 = 4; } else data->t08 = 13; break; case 4: - if (mevent_0814257C(&data->t09, gUnknown_841DE53)) + if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE53)) { - sub_8142504(gUnknown_841DE54); + AddTextPrinterToWindow1(gUnknown_841DE54); sub_81438E8(&data->t00); data->t08 = 5; } @@ -325,36 +325,36 @@ void sub_8143910(u8 taskId) if (JOY_NEW(B_BUTTON)) { PlaySE(SE_SELECT); - sub_80098B8(); + CloseLink(); sub_81438E8(&data->t00); data->t08 = 23; } else if (GetLinkPlayerCount_2() > 1) { sub_81438E8(&data->t00); - sub_80098B8(); + CloseLink(); data->t08 = 7; } else if (sub_81436EC()) { PlaySE(SE_SELECT); - sub_80098B8(); + CloseLink(); sub_81438E8(&data->t00); data->t08 = 8; } else if (sub_81438F0(&data->t00, 10)) { - sub_80098B8(); + CloseLink(); sub_81436BC(); sub_81438E8(&data->t00); } break; case 7: - if (mevent_0814257C(&data->t09, gUnknown_841DE7C)) + if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE7C)) data->t08 = 4; break; case 8: - sub_8142504(gUnknown_841DE95); + AddTextPrinterToWindow1(gUnknown_841DE95); sub_81435DC(&gUnknown_3005ED0, gUnknownSerialData_End - gUnknownSerialData_Start, gUnknownSerialData_Start); data->t08 = 9; break; @@ -370,7 +370,7 @@ void sub_8143910(u8 taskId) else if (data->t0E == 1) { sub_81438E8(&data->t00); - sub_8142504(gUnknown_841DE9B); + AddTextPrinterToWindow1(gUnknown_841DE9B); data->t08 = 11; } else @@ -382,7 +382,7 @@ void sub_8143910(u8 taskId) break; case 12: sub_81436BC(); - sub_8142504(gUnknown_841DE98); + AddTextPrinterToWindow1(gUnknown_841DE98); data->t08 = 13; break; case 13: @@ -391,21 +391,21 @@ void sub_8143910(u8 taskId) case 0: break; case 2: - sub_8142504(gUnknown_841DE95); + AddTextPrinterToWindow1(gUnknown_841DE95); data->t08 = 14; break; case 1: PlaySE(SE_SELECT); - sub_80098B8(); + CloseLink(); data->t08 = 23; break; case 5: - sub_80098B8(); + CloseLink(); data->t08 = 21; break; case 3: case 4: - sub_80098B8(); + CloseLink(); data->t08 = 20; break; } @@ -413,7 +413,7 @@ void sub_8143910(u8 taskId) case 14: if (HasLinkErrorOccurred()) { - sub_80098B8(); + CloseLink(); data->t08 = 20; } else if (GetBlockReceivedStatus()) @@ -439,7 +439,7 @@ void sub_8143910(u8 taskId) case 17: if (sub_815D794(gDecompressionBuffer)) { - sub_8142504(gUnknown_841DE99); + AddTextPrinterToWindow1(gUnknown_841DE99); sub_81438E8(&data->t00); data->t08 = 18; } @@ -449,7 +449,7 @@ void sub_8143910(u8 taskId) case 18: if (sub_81438F0(&data->t00, 120)) { - sub_8142504(gUnknown_841DE9A); + AddTextPrinterToWindow1(gUnknown_841DE9A); PlayFanfare(258); data->t08 = 19; } @@ -459,26 +459,26 @@ void sub_8143910(u8 taskId) data->t08 = 26; break; case 23: - if (mevent_0814257C(&data->t09, gUnknown_841DE7D)) + if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE7D)) data->t08 = 26; break; case 20: - if (mevent_0814257C(&data->t09, gUnknown_841DE96)) + if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE96)) data->t08 = 0; break; case 21: - if (mevent_0814257C(&data->t09, gUnknown_841DE97)) + if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE97)) data->t08 = 0; break; case 22: - if (mevent_0814257C(&data->t09, gUnknown_841DE9C)) + if (MG_PrintTextOnWindow1AndWaitButton(&data->t09, gUnknown_841DE9C)) data->t08 = 0; break; case 26: sub_812B484(); Free(data->t10); DestroyTask(taskId); - SetMainCallback2(sub_81422FC); + SetMainCallback2(MainCB_FreeAllBuffersAndReturnToInitTitleScreen); break; } } @@ -490,12 +490,12 @@ void sub_8143D24(void) sub_80BDE28(); } -struct MEventBuffer_3120_Sub * sub_8143D58(void) +struct MEventBuffer_3120_Sub * GetSavedWonderNews(void) { return &gSaveBlock1Ptr->unk_3120.buffer_000.data; } -struct MEventBuffer_32E0_Sub * sav1_get_mevent_buffer_1(void) +struct MEventBuffer_32E0_Sub * GetSavedWonderCard(void) { return &gSaveBlock1Ptr->unk_3120.buffer_1c0.data; } @@ -515,7 +515,7 @@ u16 * sub_8143DA8(void) return gSaveBlock1Ptr->unk_3120.unk_338; } -void sub_8143DBC(void) +void DestroyWonderNews(void) { sub_8143E9C(); } @@ -530,7 +530,7 @@ bool32 sub_8143DC8(const struct MEventBuffer_3120_Sub * src) return TRUE; } -bool32 sub_8143E1C(void) +bool32 ValidateReceivedWonderNews(void) { if (CalcCRC16WithTable((void *)&gSaveBlock1Ptr->unk_3120.buffer_000.data, sizeof(struct MEventBuffer_3120_Sub)) != gSaveBlock1Ptr->unk_3120.buffer_000.crc) return FALSE; @@ -546,7 +546,7 @@ bool32 sub_8143E64(const struct MEventBuffer_3120_Sub * data) return TRUE; } -bool32 sub_8143E78(void) +bool32 WonderNews_Test_Unk_02(void) { const struct MEventBuffer_3120_Sub * data = &gSaveBlock1Ptr->unk_3120.buffer_000.data; if (data->unk_02 == 0) @@ -556,7 +556,7 @@ bool32 sub_8143E78(void) void sub_8143E9C(void) { - CpuFill32(0, sub_8143D58(), sizeof(gSaveBlock1Ptr->unk_3120.buffer_000.data)); + CpuFill32(0, GetSavedWonderNews(), sizeof(gSaveBlock1Ptr->unk_3120.buffer_000.data)); gSaveBlock1Ptr->unk_3120.buffer_000.crc = 0; } @@ -570,7 +570,7 @@ bool32 sub_8143EF4(const u8 * src) { const u8 * r5 = (const u8 *)&gSaveBlock1Ptr->unk_3120.buffer_000.data; u32 i; - if (!sub_8143E1C()) + if (!ValidateReceivedWonderNews()) return FALSE; for (i = 0; i < sizeof(struct MEventBuffer_3120_Sub); i++) { @@ -580,7 +580,7 @@ bool32 sub_8143EF4(const u8 * src) return TRUE; } -void sub_8143F38(void) +void DestroyWonderCard(void) { sub_814407C(); sub_81440B4(); @@ -597,7 +597,7 @@ bool32 sub_8143F68(const struct MEventBuffer_32E0_Sub * data) struct MEventBuffer_32E0_Sub * r1; if (!sub_8144018(data)) return FALSE; - sub_8143F38(); + DestroyWonderCard(); memcpy(&gSaveBlock1Ptr->unk_3120.buffer_1c0.data, data, sizeof(struct MEventBuffer_32E0_Sub)); gSaveBlock1Ptr->unk_3120.buffer_1c0.crc = CalcCRC16WithTable((void *)&gSaveBlock1Ptr->unk_3120.buffer_1c0.data, sizeof(struct MEventBuffer_32E0_Sub)); r2 = &gSaveBlock1Ptr->unk_3120.buffer_310.data; @@ -606,7 +606,7 @@ bool32 sub_8143F68(const struct MEventBuffer_32E0_Sub * data) return TRUE; } -bool32 sub_8143FC8(void) +bool32 ValidateReceivedWonderCard(void) { if (gSaveBlock1Ptr->unk_3120.buffer_1c0.crc != CalcCRC16WithTable((void *)&gSaveBlock1Ptr->unk_3120.buffer_1c0.data, sizeof(struct MEventBuffer_32E0_Sub))) return FALSE; @@ -632,7 +632,7 @@ bool32 sub_8144018(const struct MEventBuffer_32E0_Sub * data) return TRUE; } -bool32 sub_8144054(void) +bool32 WonderCard_Test_Unk_08_6(void) { const struct MEventBuffer_32E0_Sub * data = &gSaveBlock1Ptr->unk_3120.buffer_1c0.data; if (data->unk_08_6 == 0) @@ -654,7 +654,7 @@ void sub_81440B4(void) u16 sub_81440E8(void) { - if (sub_8143FC8()) + if (ValidateReceivedWonderCard()) return gSaveBlock1Ptr->unk_3120.buffer_1c0.data.unk_00; return 0; } @@ -672,7 +672,7 @@ bool32 sub_8144124(u16 a0) return FALSE; } -bool32 sub_8144144(void) +bool32 CheckReceivedGiftFromWonderCard(void) { u16 value = sub_81440E8(); if (!sub_8144124(value)) @@ -721,7 +721,7 @@ bool32 sub_81441F0(const u16 * data) s32 sub_8144218(void) { struct MEventBuffer_32E0_Sub * data; - if (!sub_8143FC8()) + if (!ValidateReceivedWonderCard()) return 0; data = &gSaveBlock1Ptr->unk_3120.buffer_1c0.data; if (data->unk_08_0 != 1) @@ -759,11 +759,11 @@ void sub_81442CC(struct MEventStruct_Unk1442CC * data) data->unk_08 = 1; data->unk_0C = 1; data->unk_10 = 1; - if (sub_8143FC8()) + if (ValidateReceivedWonderCard()) { - data->unk_14 = sav1_get_mevent_buffer_1()->unk_00; + data->unk_14 = GetSavedWonderCard()->unk_00; data->unk_20 = *sav1_get_mevent_buffer_2(); - data->unk_44 = sav1_get_mevent_buffer_1()->unk_09; + data->unk_44 = GetSavedWonderCard()->unk_09; } else data->unk_14 = 0; @@ -945,7 +945,7 @@ bool32 sub_81446D0(u16 a0) gUnknown_203F3BC = FALSE; if (a0 == 0) return FALSE; - if (!sub_8143FC8()) + if (!ValidateReceivedWonderCard()) return FALSE; if (gSaveBlock1Ptr->unk_3120.buffer_1c0.data.unk_00 != a0) return FALSE; diff --git a/src/mevent_8145654.c b/src/mevent_8145654.c index 65f515d1b..af3024bff 100644 --- a/src/mevent_8145654.c +++ b/src/mevent_8145654.c @@ -126,7 +126,7 @@ const struct UnkStruct_8467FB8 gUnknown_8467FB8[8] = { {1, 0, 0, 7, gUnknown_8467A7C, gUnknown_8467CAC, gUnknown_846716C} }; -bool32 sub_8145654(struct MEventBuffer_32E0_Sub * r5, struct MEventBuffer_3430_Sub * r6) +bool32 InitWonderCardResources(struct MEventBuffer_32E0_Sub * r5, struct MEventBuffer_3430_Sub * r6) { if (r5 == NULL || r6 == NULL) return FALSE; @@ -145,7 +145,7 @@ bool32 sub_8145654(struct MEventBuffer_32E0_Sub * r5, struct MEventBuffer_3430_S return TRUE; } -void sub_81456F0(void) +void DestroyWonderCardResources(void) { if (gUnknown_203F3C8 != NULL) { @@ -155,7 +155,7 @@ void sub_81456F0(void) } } -s32 sub_814571C(void) +s32 FadeToWonderCardMenu(void) { if (gUnknown_203F3C8 == NULL) return -1; @@ -219,7 +219,7 @@ s32 sub_814571C(void) return 0; } -s32 sub_814593C(bool32 flag) +s32 FadeOutFromWonderCard(bool32 flag) { if (gUnknown_203F3C8 == NULL) return -1; @@ -252,7 +252,7 @@ s32 sub_814593C(bool32 flag) FreeMonIconPalettes(); break; case 5: - sub_8142344(gUnknown_203F3B8, flag); + PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, flag); break; case 6: CopyBgTilemapBufferToVram(0); @@ -508,7 +508,7 @@ const struct UnkStruct_8467FB8 gUnknown_8468720[] = { {1, 0, 0, 0, gUnknown_84685B4, gUnknown_8468644, gUnknown_84680A0} }; -bool32 sub_8146288(const struct MEventBuffer_3120_Sub * a0) +bool32 InitWonderNewsResources(const struct MEventBuffer_3120_Sub * a0) { if (a0 == NULL) return FALSE; @@ -523,7 +523,7 @@ bool32 sub_8146288(const struct MEventBuffer_3120_Sub * a0) return TRUE; } -void sub_81462EC(void) +void DestroyWonderNewsResources(void) { if (gUnknown_203F3CC != NULL) { @@ -533,7 +533,7 @@ void sub_81462EC(void) } } -s32 sub_8146318(void) +s32 FadeToWonderNewsMenu(void) { if (gUnknown_203F3CC == NULL) return -1; @@ -608,7 +608,7 @@ s32 sub_8146318(void) return 0; } -s32 sub_8146604(bool32 flag) +s32 FadeOutFromWonderNews(bool32 flag) { if (gUnknown_203F3CC == NULL) return -1; @@ -653,10 +653,10 @@ s32 sub_8146604(bool32 flag) } break; case 5: - sub_8142344(gUnknown_203F3B8, flag); + PrintMysteryGiftOrEReaderTopMenu(gGiftIsFromEReader, flag); break; case 6: - sub_8142420(); + MG_DrawCheckerboardPattern(); CopyBgTilemapBufferToVram(0); CopyBgTilemapBufferToVram(3); BeginNormalPaletteFade(0xFFFFFFFF, 0, 16, 0, 0); @@ -671,7 +671,7 @@ s32 sub_8146604(bool32 flag) return 0; } -void sub_81467EC(void) +void MENews_RemoveScrollIndicatorArrowPair(void) { if (!gUnknown_203F3CC->unk_01C0_0 && gUnknown_203F3CC->unk_01C1 != 0xFF) { @@ -682,7 +682,7 @@ void sub_81467EC(void) } -void sub_8146834(void) +void MENews_AddScrollIndicatorArrowPair(void) { if (gUnknown_203F3CC->unk_01C0_0) { @@ -691,7 +691,7 @@ void sub_8146834(void) } } -u8 sub_8146884(u16 input) +u32 MENews_GetInput(u16 input) { if (gUnknown_203F3CC->unk_01C2_0) { diff --git a/src/mevent_server.c b/src/mevent_server.c index 5e384ae0b..1c2dc4ced 100644 --- a/src/mevent_server.c +++ b/src/mevent_server.c @@ -11,12 +11,12 @@ #include "mevent.h" #include "mevent_server.h" -EWRAM_DATA struct mevent_srv_ish * s_mevent_srv_ish_ptr = NULL; +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_srv_ish_init(struct mevent_srv_ish *, u32, u32); -static u32 mevent_srv_ish_exec(struct mevent_srv_ish *); -static void mevent_srv_ish_free_resources(struct mevent_srv_ish *); +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 *); @@ -25,44 +25,44 @@ extern const u8 gUnknown_84687E0[]; extern const struct mevent_cmd gUnknown_8468B6C[]; extern const struct mevent_cmd gUnknown_8468BCC[]; -void mevent_srv_ish_do_init(void) +void mevent_client_do_init(void) { - s_mevent_srv_ish_ptr = AllocZeroed(sizeof(struct mevent_srv_ish)); - mevent_srv_ish_init(s_mevent_srv_ish_ptr, 1, 0); + s_mevent_client_ptr = AllocZeroed(sizeof(struct mevent_client)); + mevent_client_init(s_mevent_client_ptr, 1, 0); } -u32 mevent_srv_ish_do_exec(u16 * a0) +u32 mevent_client_do_exec(u16 * a0) { u32 result; - if (s_mevent_srv_ish_ptr == NULL) + if (s_mevent_client_ptr == NULL) return 6; - result = mevent_srv_ish_exec(s_mevent_srv_ish_ptr); + result = mevent_client_exec(s_mevent_client_ptr); if (result == 6) { - *a0 = s_mevent_srv_ish_ptr->param; - mevent_srv_ish_free_resources(s_mevent_srv_ish_ptr); - Free(s_mevent_srv_ish_ptr); - s_mevent_srv_ish_ptr = NULL; + *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_srv_ish_inc_flag(void) +void mevent_client_inc_flag(void) { - s_mevent_srv_ish_ptr->flag++; + s_mevent_client_ptr->flag++; } -void * mevent_srv_ish_get_buffer(void) +void * mevent_client_get_buffer(void) { - return s_mevent_srv_ish_ptr->buffer; + return s_mevent_client_ptr->buffer; } -void mevent_srv_ish_set_param(u32 a0) +void mevent_client_set_param(u32 a0) { - s_mevent_srv_ish_ptr->param = a0; + s_mevent_client_ptr->param = a0; } -static void mevent_srv_ish_init(struct mevent_srv_ish * svr, u32 sendPlayerNo, u32 recvPlayerNo) +static void mevent_client_init(struct mevent_client * svr, u32 sendPlayerNo, u32 recvPlayerNo) { svr->unk_00 = 0; svr->mainseqno = 0; @@ -74,7 +74,7 @@ static void mevent_srv_ish_init(struct mevent_srv_ish * svr, u32 sendPlayerNo, u mevent_srv_sub_init(&svr->manager, sendPlayerNo, recvPlayerNo); } -static void mevent_srv_ish_free_resources(struct mevent_srv_ish * svr) +static void mevent_client_free_resources(struct mevent_client * svr) { Free(svr->sendBuffer); Free(svr->recvBuffer); @@ -82,20 +82,20 @@ static void mevent_srv_ish_free_resources(struct mevent_srv_ish * svr) Free(svr->buffer); } -static void mevent_srv_ish_jmp_buffer(struct mevent_srv_ish * svr) +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_srv_ish_send_word(struct mevent_srv_ish * svr, u32 ident, u32 word) +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_srv_ish * svr) +static u32 ish_mainseq_0(struct mevent_client * svr) { // init memcpy(svr->cmdBuffer, gUnknown_84687E0, ME_SEND_BUF_SIZE); @@ -105,13 +105,13 @@ static u32 ish_mainseq_0(struct mevent_srv_ish * svr) return 0; } -static u32 ish_mainseq_1(struct mevent_srv_ish * svr) +static u32 ish_mainseq_1(struct mevent_client * svr) { // done return 6; } -static u32 ish_mainseq_2(struct mevent_srv_ish * svr) +static u32 ish_mainseq_2(struct mevent_client * svr) { // do recv if (mevent_srv_sub_recv(&svr->manager)) @@ -122,7 +122,7 @@ static u32 ish_mainseq_2(struct mevent_srv_ish * svr) return 1; } -static u32 ish_mainseq_3(struct mevent_srv_ish * svr) +static u32 ish_mainseq_3(struct mevent_client * svr) { // do send if (mevent_srv_sub_send(&svr->manager)) @@ -133,7 +133,7 @@ static u32 ish_mainseq_3(struct mevent_srv_ish * svr) return 1; } -static u32 ish_mainseq_4(struct mevent_srv_ish * svr) +static u32 ish_mainseq_4(struct mevent_client * svr) { // process command struct mevent_cmd_ish * cmd = &svr->cmdBuffer[svr->cmdidx]; @@ -162,20 +162,20 @@ static u32 ish_mainseq_4(struct mevent_srv_ish * svr) svr->flag = 0; break; case 19: - mevent_srv_ish_send_word(svr, 0x12, GetGameStat(cmd->parameter)); + mevent_client_send_word(svr, 0x12, GetGameStat(cmd->parameter)); svr->mainseqno = 3; svr->flag = 0; break; case 6: if (svr->param == 0) - mevent_srv_ish_jmp_buffer(svr); + mevent_client_jmp_buffer(svr); break; case 7: if (svr->param == 1) - mevent_srv_ish_jmp_buffer(svr); + mevent_client_jmp_buffer(svr); break; case 4: - mevent_srv_ish_jmp_buffer(svr); + mevent_client_jmp_buffer(svr); break; case 5: memcpy(svr->buffer, svr->recvBuffer, 0x40); @@ -201,7 +201,7 @@ static u32 ish_mainseq_4(struct mevent_srv_ish * svr) mevent_srv_sub_init_send(&svr->manager, 0x11, svr->sendBuffer, sizeof(struct MEventStruct_Unk1442CC)); break; case 14: - mevent_srv_ish_send_word(svr, 0x13, svr->param); + mevent_client_send_word(svr, 0x13, svr->param); break; case 10: sub_8143F68(svr->recvBuffer); @@ -210,10 +210,10 @@ static u32 ish_mainseq_4(struct mevent_srv_ish * svr) if (!sub_8143EF4(svr->recvBuffer)) { sub_8143DC8(svr->recvBuffer); - mevent_srv_ish_send_word(svr, 0x13, 0); + mevent_client_send_word(svr, 0x13, 0); } else - mevent_srv_ish_send_word(svr, 0x13, 1); + mevent_client_send_word(svr, 0x13, 1); break; case 15: svr->mainseqno = 6; @@ -239,7 +239,7 @@ static u32 ish_mainseq_4(struct mevent_srv_ish * svr) return 1; } -static u32 ish_mainseq_5(struct mevent_srv_ish * svr) +static u32 ish_mainseq_5(struct mevent_client * svr) { // wait flag if (svr->flag) @@ -250,7 +250,7 @@ static u32 ish_mainseq_5(struct mevent_srv_ish * svr) return 1; } -static u32 ish_mainseq_6(struct mevent_srv_ish * svr) +static u32 ish_mainseq_6(struct mevent_client * svr) { // ??? switch (svr->flag) @@ -270,7 +270,7 @@ static u32 ish_mainseq_6(struct mevent_srv_ish * svr) return 1; } -static u32 ish_mainseq_7(struct mevent_srv_ish * svr) +static u32 ish_mainseq_7(struct mevent_client * svr) { // exec arbitrary code u32 (*func)(u32 *, struct SaveBlock2 *, struct SaveBlock1 *) = (void *)gDecompressionBuffer; @@ -282,9 +282,9 @@ static u32 ish_mainseq_7(struct mevent_srv_ish * svr) return 1; } -static u32 mevent_srv_ish_exec(struct mevent_srv_ish * svr) +static u32 mevent_client_exec(struct mevent_client * svr) { - u32 (*funcs[])(struct mevent_srv_ish *) = { + u32 (*funcs[])(struct mevent_client *) = { ish_mainseq_0, ish_mainseq_1, ish_mainseq_2, @@ -297,19 +297,19 @@ static u32 mevent_srv_ish_exec(struct mevent_srv_ish * svr) return funcs[svr->mainseqno](svr); } -void mevent_srv_common_do_init_1(void) +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); } -void mevent_srv_common_do_init_2(void) +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); } -u32 mevent_srv_init_do_exec(u16 * a0) +u32 mevent_srv_common_do_exec(u16 * a0) { u32 result; if (s_mevent_srv_common_ptr == NULL) @@ -526,12 +526,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, sav1_get_mevent_buffer_1(), 332); + memcpy(svr->mevent_32e0, GetSavedWonderCard(), 332); sub_814410C(svr->mevent_32e0); 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, sub_8143D58(), 444); + memcpy(svr->mevent_3120, 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); diff --git a/src/mystery_gift_menu.c b/src/mystery_gift_menu.c new file mode 100644 index 000000000..0cbfb4be5 --- /dev/null +++ b/src/mystery_gift_menu.c @@ -0,0 +1,1756 @@ +#include "global.h" +#include "palette.h" +#include "dma3.h" +#include "gpu_regs.h" +#include "bg.h" +#include "task.h" +#include "scanline_effect.h" +#include "malloc.h" +#include "text.h" +#include "window.h" +#include "text_window.h" +#include "menu.h" +#include "new_menu_helpers.h" +#include "sound.h" +#include "mystery_gift_menu.h" +#include "title_screen.h" +#include "list_menu.h" +#include "link_rfu.h" +#include "string_util.h" +#include "mevent.h" +#include "save.h" +#include "link.h" +#include "event_data.h" +#include "mevent_server.h" +#include "menews_jisan.h" +#include "help_system.h" +#include "constants/songs.h" + +EWRAM_DATA u8 sDownArrowCounterAndYCoordIdx[8] = {}; +EWRAM_DATA bool8 gGiftIsFromEReader = FALSE; + +void task_add_00_mystery_gift(void); +void task00_mystery_gift(u8 taskId); +void task_add_00_ereader(void); + +extern const u8 gText_PickOKExit[]; +extern const u8 gText_PickOKCancel[]; +extern const u8 gText_MysteryGift[]; +extern const u8 gJPText_MysteryGift[]; +extern const u8 gJPText_DecideStop[]; +extern const u8 gText_WhatToDoWithCards[]; +extern const u8 gText_WhatToDoWithNews[]; +extern const u8 gText_OkayToDiscardNews[]; +extern const u8 gText_IfThrowAwayCardEventWontHappen[]; +extern const u8 gText_WonderCardThrownAway[]; +extern const u8 gText_WonderNewsThrownAway[]; +extern const u8 gText_DataWillBeSaved[]; +extern const u8 gText_SaveCompletedPressA[]; +extern const u8 gText_WonderCards[]; +extern const u8 gText_WonderNews[]; +extern const u8 gText_Exit3[]; +extern const u8 gText_WirelessCommunication[]; +extern const u8 gText_Friend2[]; +extern const u8 gFameCheckerText_Cancel[]; +extern const u8 gText_Receive[]; +extern const u8 gText_Send[]; +extern const u8 gText_Toss[]; +extern const u8 gText_VarietyOfEventsImportedWireless[]; +extern const u8 gText_WonderCardsInPossession[]; +extern const u8 gText_ReadNewsThatArrived[]; +extern const u8 gText_ReturnToTitle[]; +extern const u8 gText_NothingSentOver[]; +extern const u8 gText_RecordUploadedViaWireless[]; +extern const u8 gText_WonderCardReceived[]; +extern const u8 gText_WonderCardReceivedFrom[]; +extern const u8 gText_WonderNewsReceived[]; +extern const u8 gText_WonderNewsReceivedFrom[]; +extern const u8 gText_NewStampReceived[]; +extern const u8 gText_AlreadyHadCard[]; +extern const u8 gText_AlreadyHadStamp[]; +extern const u8 gText_AlreadyHadNews[]; +extern const u8 gText_NoMoreRoomForStamps[]; +extern const u8 gText_CommunicationCanceled[]; +extern const u8 gText_CantAcceptCardFromTrainer[]; +extern const u8 gText_CantAcceptNewsFromTrainer[]; +extern const u8 gText_CommunicationError[]; +extern const u8 gText_NewTrainerReceived[]; +extern const u8 gText_WonderCardSentTo[]; +extern const u8 gText_WonderNewsSentTo[]; +extern const u8 gText_StampSentTo[]; +extern const u8 gText_OtherTrainerHasCard[]; +extern const u8 gText_OtherTrainerHasStamp[]; +extern const u8 gText_OtherTrainerHasNews[]; +extern const u8 gText_OtherTrainerCanceled[]; +extern const u8 gText_GiftSentTo[]; +extern const u8 gText_CantSendGiftToTrainer[]; +extern const u8 gText_DontHaveCardNewOneInput[]; +extern const u8 gText_DontHaveNewsNewOneInput[]; +extern const u8 gText_WhereShouldCardBeAccessed[]; +extern const u8 gText_WhereShouldNewsBeAccessed[]; +extern const u8 gText_Communicating[]; +extern const u8 gText_ThrowAwayWonderCard[]; +extern const u8 gText_HaventReceivedCardsGift[]; +extern const u8 gText_CommunicationCompleted[]; +extern const u8 gText_HaventReceivedGiftOkayToDiscard[]; +extern const u8 gText_SendingWonderCard[]; +extern const u8 gText_SendingWonderNews[]; + +const u16 gUnkTextboxBorderPal[] = INCBIN_U16("graphics/interface/unk_textbox_border.gbapal"); +const u32 gUnkTextboxBorderGfx[] = INCBIN_U32("graphics/interface/unk_textbox_border.4bpp.lz"); + +struct MysteryGiftTaskData +{ + u16 curPromptWindowId; + u16 unk2; + u16 unk4; + u16 unk6; + u8 state; + u8 textState; + u8 unkA; + u8 unkB; + u8 IsCardOrNews; + u8 source; + u8 prevPromptWindowId; + u8 * buffer; +}; + +const struct BgTemplate sBGTemplates[] = { + { + .bg = 0, + .charBaseIndex = 2, + .mapBaseIndex = 15, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0x000 + }, { + .bg = 1, + .charBaseIndex = 0, + .mapBaseIndex = 14, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0x000 + }, { + .bg = 2, + .charBaseIndex = 0, + .mapBaseIndex = 13, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0x000 + }, { + .bg = 3, + .charBaseIndex = 0, + .mapBaseIndex = 12, + .screenSize = 0, + .paletteMode = 0, + .priority = 3, + .baseTile = 0x000 + } +}; + +const struct WindowTemplate sMainWindows[] = { + { + .priority = 0x00, + .tilemapLeft = 0x00, + .tilemapTop = 0x00, + .width = 0x1e, + .height = 0x02, + .paletteNum = 0x0f, + .baseBlock = 0x0013 + }, { + .priority = 0x00, + .tilemapLeft = 0x01, + .tilemapTop = 0x0f, + .width = 0x1c, + .height = 0x04, + .paletteNum = 0x0f, + .baseBlock = 0x004f + }, { + .priority = 0x00, + .tilemapLeft = 0x00, + .tilemapTop = 0x0f, + .width = 0x1e, + .height = 0x05, + .paletteNum = 0x0d, + .baseBlock = 0x004f + }, { + 0xFF + } +}; + +const struct WindowTemplate sWindowTemplate_PromptYesOrNo_Width28 = { + .priority = 0x00, + .tilemapLeft = 0x01, + .tilemapTop = 0x0f, + .width = 0x1c, + .height = 0x04, + .paletteNum = 0x0f, + .baseBlock = 0x00e5 +}; + +const struct WindowTemplate sWindowTemplate_PromptYesOrNo_Width20 = { + .priority = 0x00, + .tilemapLeft = 0x01, + .tilemapTop = 0x0f, + .width = 0x14, + .height = 0x04, + .paletteNum = 0x0f, + .baseBlock = 0x00e5 +}; + +const struct WindowTemplate sMysteryGiftMenuWindowTemplate = { + .priority = 0x00, + .tilemapLeft = 0x01, + .tilemapTop = 0x0f, + .width = 0x13, + .height = 0x04, + .paletteNum = 0x0f, + .baseBlock = 0x00e5 +}; + +const struct WindowTemplate sWindowTemplate_ThreeOptions = { + .priority = 0x00, + .tilemapLeft = 0x08, + .tilemapTop = 0x05, + .width = 0x0e, + .height = 0x05, + .paletteNum = 0x0e, + .baseBlock = 0x0155 +}; + +const struct WindowTemplate sWindowTemplate_YesNoBox = { + .priority = 0x00, + .tilemapLeft = 0x17, + .tilemapTop = 0x0f, + .width = 0x06, + .height = 0x04, + .paletteNum = 0x0e, + .baseBlock = 0x0155 +}; + +const struct WindowTemplate sWindowTemplate_7by8 = { + .priority = 0x00, + .tilemapLeft = 0x16, + .tilemapTop = 0x0c, + .width = 0x07, + .height = 0x07, + .paletteNum = 0x0e, + .baseBlock = 0x0155 +}; + +const struct WindowTemplate sWindowTemplate_7by6 = { + .priority = 0x00, + .tilemapLeft = 0x16, + .tilemapTop = 0x0e, + .width = 0x07, + .height = 0x05, + .paletteNum = 0x0e, + .baseBlock = 0x0155 +}; + +const struct WindowTemplate sWindowTemplate_7by4 = { + .priority = 0x00, + .tilemapLeft = 0x16, + .tilemapTop = 0x0f, + .width = 0x07, + .height = 0x04, + .paletteNum = 0x0e, + .baseBlock = 0x0155 +}; + +const struct ListMenuItem sListMenuItems_CardsOrNews[] = { + { gText_WonderCards, 0 }, + { gText_WonderNews, 1 }, + { gText_Exit3, -2 } +}; + +const struct ListMenuItem sListMenuItems_WirelessOrFriend[] = { + { gText_WirelessCommunication, 0 }, + { gText_Friend2, 1 }, + { gFameCheckerText_Cancel, -2 } +}; + +const struct ListMenuTemplate sListMenuTemplate_ThreeOptions = { + .items = NULL, + .moveCursorFunc = ListMenuDefaultCursorMoveFunc, + .itemPrintFunc = NULL, + .totalItems = 3, + .maxShowed = 3, + .windowId = 0, + .header_X = 0, + .item_X = 8, + .cursor_X = 0, + .upText_Y = 0, + .cursorPal = 2, + .fillValue = 1, + .cursorShadowPal = 3, + .lettersSpacing = 0, + .itemVerticalPadding = 0, + .scrollMultiple = 0, + .fontId = 2, + .cursorKind = 0 +}; + +const struct ListMenuItem sListMenuItems_ReceiveSendToss[] = { + { gText_Receive, 0 }, + { gText_Send, 1 }, + { gText_Toss, 2 }, + { gFameCheckerText_Cancel, -2 } +}; + +const struct ListMenuItem sListMenuItems_ReceiveToss[] = { + { gText_Receive, 0 }, + { gText_Toss, 2 }, + { gFameCheckerText_Cancel, -2 } +}; + +const struct ListMenuItem sListMenuItems_ReceiveSend[] = { + { gText_Receive, 0 }, + { gText_Send, 1 }, + { gFameCheckerText_Cancel, -2 } +}; + +const struct ListMenuItem sListMenuItems_Receive[] = { + { gText_Receive, 0 }, + { gFameCheckerText_Cancel, -2 } +}; + +const struct ListMenuTemplate sListMenu_ReceiveSendToss = { + .items = sListMenuItems_ReceiveSendToss, + .moveCursorFunc = ListMenuDefaultCursorMoveFunc, + .itemPrintFunc = NULL, + .totalItems = 4, + .maxShowed = 4, + .windowId = 0, + .header_X = 0, + .item_X = 8, + .cursor_X = 0, + .upText_Y = 2, + .cursorPal = 2, + .fillValue = 1, + .cursorShadowPal = 3, + .lettersSpacing = 0, + .itemVerticalPadding = 0, + .scrollMultiple = 0, + .fontId = 2, + .cursorKind = 0 +}; + +const struct ListMenuTemplate sListMenu_ReceiveToss = { + .items = sListMenuItems_ReceiveToss, + .moveCursorFunc = ListMenuDefaultCursorMoveFunc, + .itemPrintFunc = NULL, + .totalItems = 3, + .maxShowed = 3, + .windowId = 0, + .header_X = 0, + .item_X = 8, + .cursor_X = 0, + .upText_Y = 0, + .cursorPal = 2, + .fillValue = 1, + .cursorShadowPal = 3, + .lettersSpacing = 0, + .itemVerticalPadding = 0, + .scrollMultiple = 0, + .fontId = 2, + .cursorKind = 0 +}; + +const struct ListMenuTemplate sListMenu_ReceiveSend = { + .items = sListMenuItems_ReceiveSend, + .moveCursorFunc = ListMenuDefaultCursorMoveFunc, + .itemPrintFunc = NULL, + .totalItems = 3, + .maxShowed = 3, + .windowId = 0, + .header_X = 0, + .item_X = 8, + .cursor_X = 0, + .upText_Y = 0, + .cursorPal = 2, + .fillValue = 1, + .cursorShadowPal = 3, + .lettersSpacing = 0, + .itemVerticalPadding = 0, + .scrollMultiple = 0, + .fontId = 2, + .cursorKind = 0 +}; + +const struct ListMenuTemplate sListMenu_Receive = { + .items = sListMenuItems_Receive, + .moveCursorFunc = ListMenuDefaultCursorMoveFunc, + .itemPrintFunc = NULL, + .totalItems = 2, + .maxShowed = 2, + .windowId = 0, + .header_X = 0, + .item_X = 8, + .cursor_X = 0, + .upText_Y = 0, + .cursorPal = 2, + .fillValue = 1, + .cursorShadowPal = 3, + .lettersSpacing = 0, + .itemVerticalPadding = 2, + .scrollMultiple = 0, + .fontId = 2, + .cursorKind = 0 +}; + +const u8 *const Unref_08366ED8[] = { + gText_VarietyOfEventsImportedWireless, + gText_WonderCardsInPossession, + gText_ReadNewsThatArrived, + gText_ReturnToTitle +}; + +ALIGNED(4) const struct TextColor sMG_Ereader_TextColor_1 = { 0, 1, 2 }; +ALIGNED(4) const struct TextColor sMG_Ereader_TextColor_1_Copy = { 0, 1, 2 }; +ALIGNED(4) const struct TextColor sMG_Ereader_TextColor_2 = { 1, 2, 3 }; + +const u8 gUnknown_8466EF3[] = _("テスト"); +const u8 gUnknown_8466EF7[] = _("むげんのチケット"); + +void vblankcb_mystery_gift_e_reader_run(void) +{ + ProcessSpriteCopyRequests(); + LoadOam(); + TransferPlttBuffer(); +} + +void c2_mystery_gift_e_reader_run(void) +{ + RunTasks(); + RunTextPrinters(); + AnimateSprites(); + BuildOamBuffer(); +} + +bool32 HandleMysteryGiftOrEReaderSetup(s32 mg_or_ereader) +{ + switch (gMain.state) + { + case 0: + SetVBlankCallback(NULL); + ResetPaletteFade(); + ResetSpriteData(); + FreeAllSpritePalettes(); + ResetTasks(); + ScanlineEffect_Stop(); + ResetBgsAndClearDma3BusyFlags(1); + + InitBgsFromTemplates(0, sBGTemplates, ARRAY_COUNT(sBGTemplates)); + ChangeBgX(0, 0, 0); + ChangeBgY(0, 0, 0); + ChangeBgX(1, 0, 0); + ChangeBgY(1, 0, 0); + ChangeBgX(2, 0, 0); + ChangeBgY(2, 0, 0); + ChangeBgX(3, 0, 0); + ChangeBgY(3, 0, 0); + + SetBgTilemapBuffer(3, Alloc(0x800)); + SetBgTilemapBuffer(2, Alloc(0x800)); + SetBgTilemapBuffer(1, Alloc(0x800)); + SetBgTilemapBuffer(0, Alloc(0x800)); + + sub_814FE40(0, 10, 0xE0); + sub_814FDA0(0, 1, 0xF0); + sub_80F696C(3, gUnkTextboxBorderGfx, 0x100, 0, 0); + InitWindows(sMainWindows); + DeactivateAllTextPrinters(); + ClearGpuRegBits(REG_OFFSET_DISPCNT, DISPCNT_WIN0_ON | DISPCNT_WIN1_ON); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_BLDALPHA, 0); + SetGpuReg(REG_OFFSET_BLDY, 0); + gMain.state++; + break; + case 1: + LoadPalette(gUnkTextboxBorderPal, 0, 0x20); + LoadPalette(stdpal_get(2), 0xd0, 0x20); + FillBgTilemapBufferRect(0, 0x000, 0, 0, 32, 32, 0x11); + FillBgTilemapBufferRect(1, 0x000, 0, 0, 32, 32, 0x11); + FillBgTilemapBufferRect(2, 0x000, 0, 0, 32, 32, 0x11); + MG_DrawCheckerboardPattern(); + PrintMysteryGiftOrEReaderTopMenu(mg_or_ereader, 0); + gMain.state++; + break; + case 2: + CopyBgTilemapBufferToVram(3); + CopyBgTilemapBufferToVram(2); + CopyBgTilemapBufferToVram(1); + CopyBgTilemapBufferToVram(0); + gMain.state++; + break; + case 3: + ShowBg(0); + ShowBg(3); + PlayBGM(BGM_FRLG_MYSTERY_GIFT); + SetVBlankCallback(vblankcb_mystery_gift_e_reader_run); + EnableInterrupts(INTR_FLAG_VBLANK | INTR_FLAG_VCOUNT | INTR_FLAG_TIMER3 | INTR_FLAG_SERIAL); + return TRUE; + } + + return FALSE; +} + +void c2_mystery_gift(void) +{ + if (HandleMysteryGiftOrEReaderSetup(0)) + { + SetMainCallback2(c2_mystery_gift_e_reader_run); + gGiftIsFromEReader = FALSE; + task_add_00_mystery_gift(); + } +} + +void c2_ereader(void) +{ + if (HandleMysteryGiftOrEReaderSetup(1)) + { + SetMainCallback2(c2_mystery_gift_e_reader_run); + gGiftIsFromEReader = TRUE; + task_add_00_ereader(); + } +} + +void MainCB_FreeAllBuffersAndReturnToInitTitleScreen(void) +{ + gGiftIsFromEReader = FALSE; + FreeAllWindowBuffers(); + Free(GetBgTilemapBuffer(0)); + Free(GetBgTilemapBuffer(1)); + Free(GetBgTilemapBuffer(2)); + Free(GetBgTilemapBuffer(3)); + SetMainCallback2(CB2_InitTitleScreen); +} + +void PrintMysteryGiftOrEReaderTopMenu(bool8 mg_or_ereader, bool32 usePickOkCancel) +{ + const u8 * src; + s32 width; + FillWindowPixelBuffer(0, 0x00); + if (!mg_or_ereader) + { + src = usePickOkCancel == TRUE ? gText_PickOKExit : gText_PickOKCancel; + AddTextPrinterParametrized2(0, 2, 2, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, gText_MysteryGift); + width = 222 - GetStringWidth(0, src, 0); + AddTextPrinterParametrized2(0, 0, width, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, src); + } + else + { + AddTextPrinterParametrized2(0, 2, 2, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, gJPText_MysteryGift); + AddTextPrinterParametrized2(0, 0, 0x78, 2, 0, 0, &sMG_Ereader_TextColor_1, 0, gJPText_DecideStop); + } + CopyWindowToVram(0, 2); + PutWindowTilemap(0); +} + +void MG_DrawTextBorder(u8 windowId) +{ + DrawTextBorderOuter(windowId, 0x01, 0xF); +} + +void MG_DrawCheckerboardPattern(void) +{ + s32 i = 0, j; + + FillBgTilemapBufferRect(3, 0x003, 0, 0, 32, 2, 0x11); + + for (i = 0; i < 18; i++) + { + for (j = 0; j < 32; j++) + { + if ((i & 1) != (j & 1)) + { + FillBgTilemapBufferRect(3, 1, j, i + 2, 1, 1, 0x11); + } + else + { + FillBgTilemapBufferRect(3, 2, j, i + 2, 1, 1, 0x11); + } + } + } +} + +void ClearScreenInBg0(bool32 ignoreTopTwoRows) +{ + switch (ignoreTopTwoRows) + { + case 0: + FillBgTilemapBufferRect(0, 0, 0, 0, 32, 32, 0x11); + break; + case 1: + FillBgTilemapBufferRect(0, 0, 0, 2, 32, 30, 0x11); + break; + } + CopyBgTilemapBufferToVram(0); +} + +void AddTextPrinterToWindow1(const u8 *str) +{ + StringExpandPlaceholders(gStringVar4, str); + FillWindowPixelBuffer(1, 0x11); + AddTextPrinterParametrized2(1, 2, 0, 2, 0, 2, &sMG_Ereader_TextColor_2, 0, gStringVar4); + DrawTextBorderOuter(1, 0x001, 0xF); + PutWindowTilemap(1); + CopyWindowToVram(1, 3); +} + +void ClearTextWindow(void) +{ + rbox_fill_rectangle(1); + ClearWindowTilemap(1); + CopyWindowToVram(1, 1); +} + +bool32 MG_PrintTextOnWindow1AndWaitButton(u8 *textState, const u8 *str) +{ + switch (*textState) + { + case 0: + AddTextPrinterToWindow1(str); + goto inc; + case 1: + DrawDownArrow(1, 0xD0, 0x14, 1, FALSE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]); + if (JOY_NEW(A_BUTTON | B_BUTTON)) + { + inc: + (*textState)++; + } + break; + case 2: + DrawDownArrow(1, 0xD0, 0x14, 1, TRUE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]); + *textState = 0; + ClearTextWindow(); + return TRUE; + case 0xFF: + *textState = 2; + break; + } + return FALSE; +} + +void HideDownArrow(void) +{ + DrawDownArrow(1, 0xD0, 0x14, 1, FALSE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]); +} + +void ShowDownArrow(void) +{ + DrawDownArrow(1, 0xD0, 0x14, 1, TRUE, &sDownArrowCounterAndYCoordIdx[0], &sDownArrowCounterAndYCoordIdx[1]); +} + +bool32 unref_HideDownArrowAndWaitButton(u8 * textState) +{ + switch (*textState) + { + case 0: + HideDownArrow(); + if (JOY_NEW(A_BUTTON | B_BUTTON)) + { + (*textState)++; + } + break; + case 1: + ShowDownArrow(); + *textState = 0; + return TRUE; + } + return FALSE; +} + +bool32 PrintStringAndWait2Seconds(u8 * counter, const u8 * str) +{ + if (*counter == 0) + { + AddTextPrinterToWindow1(str); + } + if (++(*counter) > 120) + { + *counter = 0; + ClearTextWindow(); + return TRUE; + } + else + { + return FALSE; + } +} + +u32 MysteryGift_HandleThreeOptionMenu(u8 * unused0, u16 * unused1, u8 whichMenu) +{ + struct ListMenuTemplate listMenuTemplate = sListMenuTemplate_ThreeOptions; + struct WindowTemplate windowTemplate = sWindowTemplate_ThreeOptions; + u32 width; + s32 finalWidth; + s32 response; + u32 i; + + if (whichMenu == 0) + { + listMenuTemplate.items = sListMenuItems_CardsOrNews; + } + else + { + listMenuTemplate.items = sListMenuItems_WirelessOrFriend; + } + width = 0; + for (i = 0; i < listMenuTemplate.totalItems; i++) + { + u32 curWidth = GetStringWidth(2, listMenuTemplate.items[i].unk_00, listMenuTemplate.lettersSpacing); + if (curWidth > width) + width = curWidth; + } + finalWidth = (((width + 9) / 8) + 2) & ~1; + windowTemplate.width = finalWidth; + windowTemplate.tilemapLeft = (30 - finalWidth) / 2; + response = DoMysteryGiftListMenu(&windowTemplate, &listMenuTemplate, 1, 0x00A, 0xE0); + if (response != -1) + { + ClearWindowTilemap(2); + CopyWindowToVram(2, 1); + } + return response; +} + +s8 mevent_message_print_and_prompt_yes_no(u8 * textState, u16 * windowId, bool8 yesNoBoxPlacement, const u8 * str) +{ + struct WindowTemplate windowTemplate; + s8 input; + + switch (*textState) + { + case 0: + StringExpandPlaceholders(gStringVar4, str); + if (yesNoBoxPlacement == 0) + { + *windowId = AddWindow(&sWindowTemplate_PromptYesOrNo_Width28); + } + else + { + *windowId = AddWindow(&sWindowTemplate_PromptYesOrNo_Width20); + } + FillWindowPixelBuffer(*windowId, 0x11); + AddTextPrinterParametrized2(*windowId, 2, 0, 2, 0, 2, &sMG_Ereader_TextColor_2, 0, gStringVar4); + DrawTextBorderOuter(*windowId, 0x001, 0x0F); + CopyWindowToVram(*windowId, 2); + PutWindowTilemap(*windowId); + (*textState)++; + break; + case 1: + windowTemplate = sWindowTemplate_YesNoBox; + if (yesNoBoxPlacement == 0) + { + windowTemplate.tilemapTop = 9; + } + else + { + windowTemplate.tilemapTop = 15; + } + sub_810FF60(&windowTemplate, 2, 0, 2, 10, 14, 0); + (*textState)++; + break; + case 2: + input = ProcessMenuInputNoWrap_(); + if (input == -1 || input == 0 || input == 1) + { + *textState = 0; + rbox_fill_rectangle(*windowId); + ClearWindowTilemap(*windowId); + CopyWindowToVram(*windowId, 1); + RemoveWindow(*windowId); + return input; + } + break; + case 0xFF: + *textState = 0; + rbox_fill_rectangle(*windowId); + ClearWindowTilemap(*windowId); + CopyWindowToVram(*windowId, 1); + RemoveWindow(*windowId); + return -1; + } + + return -2; +} + +s32 HandleMysteryGiftListMenu(u8 * textState, u16 * windowId, bool32 cannotToss, bool32 cannotSend) +{ + struct WindowTemplate windowTemplate; + s32 input; + + switch (*textState) + { + case 0: + if (cannotToss == 0) + { + StringExpandPlaceholders(gStringVar4, gText_WhatToDoWithCards); + } + else + { + StringExpandPlaceholders(gStringVar4, gText_WhatToDoWithNews); + } + *windowId = AddWindow(&sMysteryGiftMenuWindowTemplate); + FillWindowPixelBuffer(*windowId, 0x11); + AddTextPrinterParametrized2(*windowId, 2, 0, 2, 0, 2, &sMG_Ereader_TextColor_2, 0, gStringVar4); + DrawTextBorderOuter(*windowId, 0x001, 0x0F); + CopyWindowToVram(*windowId, 2); + PutWindowTilemap(*windowId); + (*textState)++; + break; + case 1: + windowTemplate = sWindowTemplate_YesNoBox; + if (cannotSend) + { + if (cannotToss == 0) + { + input = DoMysteryGiftListMenu(&sWindowTemplate_7by6, &sListMenu_ReceiveToss, 1, 0x00A, 0xE0); + } + else + { + input = DoMysteryGiftListMenu(&sWindowTemplate_7by4, &sListMenu_Receive, 1, 0x00A, 0xE0); + } + } + else + { + if (cannotToss == 0) + { + input = DoMysteryGiftListMenu(&sWindowTemplate_7by8, &sListMenu_ReceiveSendToss, 1, 0x00A, 0xE0); + } + else + { + input = DoMysteryGiftListMenu(&sWindowTemplate_7by6, &sListMenu_ReceiveSend, 1, 0x00A, 0xE0); + } + } + if (input != -1) + { + *textState = 0; + rbox_fill_rectangle(*windowId); + ClearWindowTilemap(*windowId); + CopyWindowToVram(*windowId, 1); + RemoveWindow(*windowId); + return input; + } + break; + case 0xFF: + *textState = 0; + rbox_fill_rectangle(*windowId); + ClearWindowTilemap(*windowId); + CopyWindowToVram(*windowId, 1); + RemoveWindow(*windowId); + return -2; + } + + return -1; +} + +bool32 ValidateCardOrNews(bool32 cardOrNews) +{ + if (cardOrNews == 0) + { + return ValidateReceivedWonderCard(); + } + else + { + return ValidateReceivedWonderNews(); + } +} + +bool32 HandleLoadWonderCardOrNews(u8 * state, bool32 cardOrNews) +{ + s32 v0; + + switch (*state) + { + case 0: + if (cardOrNews == 0) + { + InitWonderCardResources(GetSavedWonderCard(), sav1_get_mevent_buffer_2()); + } + else + { + InitWonderNewsResources(GetSavedWonderNews()); + } + (*state)++; + break; + case 1: + if (cardOrNews == 0) + { + v0 = FadeToWonderCardMenu(); + check: + if (v0 != 0) + { + goto done; + } + break; + } + else + { + v0 = FadeToWonderNewsMenu(); + goto check; + } + done: + *state = 0; + return TRUE; + } + + return FALSE; +} + +bool32 DestroyNewsOrCard(bool32 cardOrNews) +{ + if (cardOrNews == 0) + { + DestroyWonderCard(); + } + else + { + DestroyWonderNews(); + } + return TRUE; +} + +bool32 TearDownCardOrNews_ReturnToTopMenu(bool32 cardOrNews, bool32 arg1) +{ + if (cardOrNews == 0) + { + if (FadeOutFromWonderCard(arg1) != 0) + { + DestroyWonderCardResources(); + return TRUE; + } + else + { + return FALSE; + } + } + else + { + if (FadeOutFromWonderNews(arg1) != 0) + { + DestroyWonderNewsResources(); + return TRUE; + } + else + { + return FALSE; + } + } +} + +s32 mevent_message_prompt_discard(u8 * textState, u16 * windowId, bool32 cardOrNews) +{ + if (cardOrNews == 0) + { + return mevent_message_print_and_prompt_yes_no(textState, windowId, TRUE, gText_IfThrowAwayCardEventWontHappen); + } + else + { + return mevent_message_print_and_prompt_yes_no(textState, windowId, TRUE, gText_OkayToDiscardNews); + } +} + +bool32 mevent_message_was_thrown_away(u8 * textState, bool32 cardOrNews) +{ + if (cardOrNews == 0) + { + return MG_PrintTextOnWindow1AndWaitButton(textState, gText_WonderCardThrownAway); + } + else + { + return MG_PrintTextOnWindow1AndWaitButton(textState, gText_WonderNewsThrownAway); + } +} + +bool32 mevent_save_game(u8 * state) +{ + switch (*state) + { + case 0: + AddTextPrinterToWindow1(gText_DataWillBeSaved); + (*state)++; + break; + case 1: + TrySavingData(0); + (*state)++; + break; + case 2: + AddTextPrinterToWindow1(gText_SaveCompletedPressA); + (*state)++; + break; + case 3: + if (JOY_NEW(A_BUTTON | B_BUTTON)) + { + (*state)++; + } + break; + case 4: + *state = 0; + ClearTextWindow(); + return TRUE; + } + + return FALSE; +} + +const u8 * mevent_message(u32 * flag_p, u8 cardOrNews, u8 cardOrNewsSource, u32 msgId) +{ + const u8 * msg = NULL; + *flag_p = 0; + + switch (msgId) + { + case 0: + *flag_p = 0; + msg = gText_NothingSentOver; + break; + case 1: + *flag_p = 0; + msg = gText_RecordUploadedViaWireless; + break; + case 2: + *flag_p = 1; + msg = cardOrNewsSource == 0 ? gText_WonderCardReceived : gText_WonderCardReceivedFrom; + break; + case 3: + *flag_p = 1; + msg = cardOrNewsSource == 0 ? gText_WonderNewsReceived : gText_WonderNewsReceivedFrom; + break; + case 4: + *flag_p = 1; + msg = gText_NewStampReceived; + break; + case 5: + *flag_p = 0; + msg = gText_AlreadyHadCard; + break; + case 6: + *flag_p = 0; + msg = gText_AlreadyHadStamp; + break; + case 7: + *flag_p = 0; + msg = gText_AlreadyHadNews; + break; + case 8: + *flag_p = 0; + msg = gText_NoMoreRoomForStamps; + break; + case 9: + *flag_p = 0; + msg = gText_CommunicationCanceled; + break; + case 10: + *flag_p = 0; + msg = cardOrNews == 0 ? gText_CantAcceptCardFromTrainer : gText_CantAcceptNewsFromTrainer; + break; + case 11: + *flag_p = 0; + msg = gText_CommunicationError; + break; + case 12: + *flag_p = 1; + msg = gText_NewTrainerReceived; + break; + case 13: + *flag_p = 1; + break; + case 14: + *flag_p = 0; + break; + } + + return msg; +} + +bool32 PrintMGSuccessMessage(u8 * state, const u8 * arg1, u16 * arg2) +{ + switch (*state) + { + case 0: + if (arg1 != NULL) + { + AddTextPrinterToWindow1(arg1); + } + PlayFanfare(MUS_FANFA4); + *arg2 = 0; + (*state)++; + break; + case 1: + if (++(*arg2) > 0xF0) + { + (*state)++; + } + break; + case 2: + if (IsFanfareTaskInactive()) + { + *state = 0; + ClearTextWindow(); + return TRUE; + } + break; + } + return FALSE; +} + +const u8 * mevent_message_stamp_card_etc_send_status(u32 * a0, u8 unused, u32 msgId) +{ + const u8 * result = gText_CommunicationError; + *a0 = 0; + switch (msgId) + { + case 0: + result = gText_NothingSentOver; + break; + case 1: + result = gText_RecordUploadedViaWireless; + break; + case 2: + result = gText_WonderCardSentTo; + *a0 = 1; + break; + case 3: + result = gText_WonderNewsSentTo; + *a0 = 1; + break; + case 4: + result = gText_StampSentTo; + break; + case 5: + result = gText_OtherTrainerHasCard; + break; + case 6: + result = gText_OtherTrainerHasStamp; + break; + case 7: + result = gText_OtherTrainerHasNews; + break; + case 8: + result = gText_NoMoreRoomForStamps; + break; + case 9: + result = gText_OtherTrainerCanceled; + break; + case 10: + result = gText_CantSendGiftToTrainer; + break; + case 11: + result = gText_CommunicationError; + break; + case 12: + result = gText_GiftSentTo; + break; + case 13: + result = gText_GiftSentTo; + break; + case 14: + result = gText_CantSendGiftToTrainer; + break; + } + return result; +} + +bool32 PrintMGSendStatus(u8 * state, u16 * arg1, u8 arg2, u32 msgId) +{ + u32 flag; + const u8 * str = mevent_message_stamp_card_etc_send_status(&flag, arg2, msgId); + if (flag) + { + return PrintMGSuccessMessage(state, str, arg1); + } + else + { + return MG_PrintTextOnWindow1AndWaitButton(state, str); + } +} + +void task_add_00_mystery_gift(void) +{ + u8 taskId = CreateTask(task00_mystery_gift, 0); + struct MysteryGiftTaskData * data = (void *)gTasks[taskId].data; + data->state = 0; + data->textState = 0; + data->unkA = 0; + data->unkB = 0; + data->IsCardOrNews = 0; + data->source = 0; + data->curPromptWindowId = 0; + data->unk2 = 0; + data->unk4 = 0; + data->unk6 = 0; + data->prevPromptWindowId = 0; + data->buffer = AllocZeroed(0x40); +} + +void task00_mystery_gift(u8 taskId) +{ + struct MysteryGiftTaskData * data = (void *)gTasks[taskId].data; + u32 sp0; + const u8 * r1; + + switch (data->state) + { + case 0: + data->state = 1; + break; + case 1: + switch (MysteryGift_HandleThreeOptionMenu(&data->textState, &data->curPromptWindowId, FALSE)) + { + case 0: + data->IsCardOrNews = 0; + if (ValidateReceivedWonderCard() == TRUE) + { + data->state = 18; + } + else + { + data->state = 2; + } + break; + case 1: + data->IsCardOrNews = 1; + if (ValidateReceivedWonderNews() == TRUE) + { + data->state = 18; + } + else + { + data->state = 2; + } + break; + case -2u: + data->state = 37; + break; + } + break; + case 2: + { + if (data->IsCardOrNews == 0) + { + if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gText_DontHaveCardNewOneInput)) + { + data->state = 3; + PrintMysteryGiftOrEReaderTopMenu(0, 1); + } + } + else + { + if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gText_DontHaveNewsNewOneInput)) + { + data->state = 3; + PrintMysteryGiftOrEReaderTopMenu(0, 1); + } + } + break; + } + case 3: + if (data->IsCardOrNews == 0) + { + AddTextPrinterToWindow1(gText_WhereShouldCardBeAccessed); + } + else + { + AddTextPrinterToWindow1(gText_WhereShouldNewsBeAccessed); + } + data->state = 4; + break; + case 4: + switch (MysteryGift_HandleThreeOptionMenu(&data->textState, &data->curPromptWindowId, TRUE)) + { + case 0: + ClearTextWindow(); + data->state = 5; + data->source = 0; + break; + case 1: + ClearTextWindow(); + data->state = 5; + data->source = 1; + break; + case -2u: + ClearTextWindow(); + if (ValidateCardOrNews(data->IsCardOrNews)) + { + data->state = 18; + } + else + { + data->state = 0; + PrintMysteryGiftOrEReaderTopMenu(0, 0); + } + break; + } + break; + case 5: + { + register u8 eos asm("r1"); + gStringVar1[0] = (eos = EOS); + gStringVar2[0] = eos; + gStringVar3[0] = eos; + } + switch (data->IsCardOrNews) + { + case 0: + if (data->source == 1) + { + MEvent_CreateTask_CardOrNewsWithFriend(0x15); + } + else if (data->source == 0) + { + MEvent_CreateTask_CardOrNewsOverWireless(0x15); + } + break; + case 1: + if (data->source == 1) + { + MEvent_CreateTask_CardOrNewsWithFriend(0x16); + } + else if (data->source == 0) + { + MEvent_CreateTask_CardOrNewsOverWireless(0x16); + } + break; + } + data->state = 6; + break; + case 6: + if (gReceivedRemoteLinkPlayers != 0) + { + ClearScreenInBg0(TRUE); + data->state = 7; + mevent_client_do_init(); + } + else if (gSpecialVar_Result == 5) + { + ClearScreenInBg0(TRUE); + data->state = 3; + } + break; + case 7: + AddTextPrinterToWindow1(gText_Communicating); + data->state = 8; + break; + case 8: + switch (mevent_client_do_exec(&data->curPromptWindowId)) + { + case 6: + task_add_05_task_del_08FA224_when_no_RfuFunc(); + data->prevPromptWindowId = data->curPromptWindowId; + data->state = 13; + break; + case 5: + memcpy(data->buffer, mevent_client_get_buffer(), 0x40); + mevent_client_inc_flag(); + break; + case 3: + data->state = 10; + break; + case 2: + data->state = 9; + break; + case 4: + data->state = 11; + StringCopy(gStringVar1, gLinkPlayers[0].name); + break; + } + break; + case 9: + switch ((u32)mevent_message_print_and_prompt_yes_no(&data->textState, &data->curPromptWindowId, FALSE, mevent_client_get_buffer())) + { + case 0: + mevent_client_set_param(0); + mevent_client_inc_flag(); + data->state = 7; + break; + case 1: + mevent_client_set_param(1); + mevent_client_inc_flag(); + data->state = 7; + break; + case -1u: + mevent_client_set_param(1); + mevent_client_inc_flag(); + data->state = 7; + break; + } + break; + case 10: + if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, mevent_client_get_buffer())) + { + mevent_client_inc_flag(); + data->state = 7; + } + break; + case 11: + switch ((u32)mevent_message_print_and_prompt_yes_no(&data->textState, &data->curPromptWindowId, FALSE, gText_ThrowAwayWonderCard)) + { + case 0: + if (CheckReceivedGiftFromWonderCard() == TRUE) + { + data->state = 12; + } + else + { + mevent_client_set_param(0); + mevent_client_inc_flag(); + data->state = 7; + } + break; + case 1: + mevent_client_set_param(1); + mevent_client_inc_flag(); + data->state = 7; + break; + case -1u: + mevent_client_set_param(1); + mevent_client_inc_flag(); + data->state = 7; + break; + } + break; + case 12: + switch ((u32)mevent_message_print_and_prompt_yes_no(&data->textState, &data->curPromptWindowId, FALSE, gText_HaventReceivedCardsGift)) + { + case 0: + mevent_client_set_param(0); + mevent_client_inc_flag(); + data->state = 7; + break; + case 1: + mevent_client_set_param(1); + mevent_client_inc_flag(); + data->state = 7; + break; + case -1u: + mevent_client_set_param(1); + mevent_client_inc_flag(); + data->state = 7; + break; + } + break; + case 13: + if (IsNoOneConnected()) + { + DestroyWirelessStatusIndicatorSprite(); + data->state = 14; + } + break; + case 14: + if (PrintStringAndWait2Seconds(&data->textState, gText_CommunicationCompleted)) + { + if (data->source == 1) + { + StringCopy(gStringVar1, gLinkPlayers[0].name); + } + data->state = 15; + } + break; + case 15: + { + register bool32 flag asm("r1"); + r1 = mevent_message(&sp0, data->IsCardOrNews, data->source, data->prevPromptWindowId); + if (r1 == NULL) + { + r1 = data->buffer; + } + if (sp0) + { + flag = PrintMGSuccessMessage(&data->textState, r1, &data->curPromptWindowId); + } + else + { + flag = MG_PrintTextOnWindow1AndWaitButton(&data->textState, r1); + } + if (flag) + { + if (data->prevPromptWindowId == 3) + { + if (data->source == 1) + { + GenerateRandomNews(1); + } + else + { + GenerateRandomNews(2); + } + } + if (sp0 == 0) + { + data->state = 0; + PrintMysteryGiftOrEReaderTopMenu(0, 0); + } + else + { + data->state = 17; + } + } + break; + } + case 16: + if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gText_CommunicationError)) + { + data->state = 0; + PrintMysteryGiftOrEReaderTopMenu(0, 0); + } + break; + case 17: + if (mevent_save_game(&data->textState)) + { + data->state = 0; + PrintMysteryGiftOrEReaderTopMenu(0, 0); + } + break; + case 18: + if (HandleLoadWonderCardOrNews(&data->textState, data->IsCardOrNews)) + { + data->state = 20; + } + break; + case 20: + if (data->IsCardOrNews == 0) + { + if (JOY_NEW(A_BUTTON)) + { + data->state = 21; + } + if (JOY_NEW(B_BUTTON)) + { + data->state = 27; + } + } + else + { + switch (MENews_GetInput(gMain.newKeys)) + { + case 0: + MENews_RemoveScrollIndicatorArrowPair(); + data->state = 21; + break; + case 1: + data->state = 27; + break; + } + } + break; + case 21: + { + u32 result; + if (data->IsCardOrNews == 0) + { + if (WonderCard_Test_Unk_08_6()) + { + result = HandleMysteryGiftListMenu(&data->textState, &data->curPromptWindowId, data->IsCardOrNews, FALSE); + } + else + { + result = HandleMysteryGiftListMenu(&data->textState, &data->curPromptWindowId, data->IsCardOrNews, TRUE); + } + } + else + { + if (WonderNews_Test_Unk_02()) + { + result = HandleMysteryGiftListMenu(&data->textState, &data->curPromptWindowId, data->IsCardOrNews, FALSE); + } + else + { + result = HandleMysteryGiftListMenu(&data->textState, &data->curPromptWindowId, data->IsCardOrNews, TRUE); + } + } + switch (result) + { + case 0: + data->state = 28; + break; + case 1: + data->state = 29; + break; + case 2: + data->state = 22; + break; + case -2u: + if (data->IsCardOrNews == 1) + { + MENews_AddScrollIndicatorArrowPair(); + } + data->state = 20; + break; + } + break; + } + case 22: + switch (mevent_message_prompt_discard(&data->textState, &data->curPromptWindowId, data->IsCardOrNews)) + { + case 0: + if (data->IsCardOrNews == 0 && CheckReceivedGiftFromWonderCard() == TRUE) + { + data->state = 23; + } + else + { + data->state = 24; + } + break; + case 1: + data->state = 21; + break; + case -1: + data->state = 21; + break; + } + break; + case 23: + switch ((u32)mevent_message_print_and_prompt_yes_no(&data->textState, &data->curPromptWindowId, TRUE, gText_HaventReceivedGiftOkayToDiscard)) + { + case 0: + data->state = 24; + break; + case 1: + data->state = 21; + break; + case -1u: + data->state = 21; + break; + } + break; + case 24: + if (TearDownCardOrNews_ReturnToTopMenu(data->IsCardOrNews, 1)) + { + DestroyNewsOrCard(data->IsCardOrNews); + data->state = 25; + } + break; + case 25: + if (mevent_save_game(&data->textState)) + { + data->state = 26; + } + break; + case 26: + if (mevent_message_was_thrown_away(&data->textState, data->IsCardOrNews)) + { + data->state = 0; + PrintMysteryGiftOrEReaderTopMenu(0, 0); + } + break; + case 27: + if (TearDownCardOrNews_ReturnToTopMenu(data->IsCardOrNews, 0)) + { + data->state = 0; + } + break; + case 28: + if (TearDownCardOrNews_ReturnToTopMenu(data->IsCardOrNews, 1)) + { + data->state = 3; + } + break; + case 29: + if (TearDownCardOrNews_ReturnToTopMenu(data->IsCardOrNews, 1)) + { + switch (data->IsCardOrNews) + { + case 0: + MEvent_CreateTask_Leader(21); + break; + case 1: + MEvent_CreateTask_Leader(22); + break; + } + data->source = 1; + data->state = 30; + } + break; + case 30: + if (gReceivedRemoteLinkPlayers != 0) + { + ClearScreenInBg0(1); + data->state = 31; + } + else if (gSpecialVar_Result == 5) + { + ClearScreenInBg0(1); + data->state = 18; + } + break; + case 31: + { + register u8 eos asm("r1"); + gStringVar1[0] = (eos = EOS); + gStringVar2[0] = eos; + gStringVar3[0] = eos; + } + if (data->IsCardOrNews == 0) + { + AddTextPrinterToWindow1(gText_SendingWonderCard); + mevent_srv_new_wcard(); + } + else + { + AddTextPrinterToWindow1(gText_SendingWonderNews); + mevent_srv_init_wnews(); + } + data->state = 32; + break; + case 32: + if (mevent_srv_common_do_exec(&data->curPromptWindowId) == 3) + { + data->prevPromptWindowId = data->curPromptWindowId; + data->state = 33; + } + break; + case 33: + task_add_05_task_del_08FA224_when_no_RfuFunc(); + StringCopy(gStringVar1, gLinkPlayers[1].name); + data->state = 34; + break; + case 34: + if (IsNoOneConnected()) + { + DestroyWirelessStatusIndicatorSprite(); + data->state = 35; + } + break; + case 35: + if (PrintMGSendStatus(&data->textState, &data->curPromptWindowId, data->source, data->prevPromptWindowId)) + { + if (data->source == 1 && data->prevPromptWindowId == 3) + { + GenerateRandomNews(3); + data->state = 17; + } + else + { + data->state = 0; + PrintMysteryGiftOrEReaderTopMenu(0, 0); + } + } + break; + case 36: + if (MG_PrintTextOnWindow1AndWaitButton(&data->textState, gText_CommunicationError)) + { + data->state = 0; + PrintMysteryGiftOrEReaderTopMenu(0, 0); + } + break; + case 37: + CloseLink(); + sub_812B484(); + Free(data->buffer); + DestroyTask(taskId); + SetMainCallback2(MainCB_FreeAllBuffersAndReturnToInitTitleScreen); + break; + } +} + +u16 GetMysteryGiftBaseBlock(void) +{ + return 0x19B; +} diff --git a/src/script.c b/src/script.c index d7246752c..608dc6ba0 100644 --- a/src/script.c +++ b/src/script.c @@ -9,7 +9,7 @@ extern u8 gUnknown_203ADFA; extern void sub_80CBDE8(void); // field_specials extern u16 CalcCRC16WithTable(u8 *data, int length); // util -extern bool32 sub_8143FC8(void); // mevent +extern bool32 ValidateReceivedWonderCard(void); // mevent enum { @@ -525,7 +525,7 @@ bool32 sub_8069DFC(void) u8 *sub_8069E48(void) { struct RamScriptData *scriptData = &gSaveBlock1Ptr->ramScript.data; - if (!sub_8143FC8()) + if (!ValidateReceivedWonderCard()) return NULL; if (scriptData->magic != RAM_SCRIPT_MAGIC) return NULL; |