diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/field_fadetransition.c | 2 | ||||
-rw-r--r-- | src/item_use.c | 4 | ||||
-rw-r--r-- | src/mailbox_pc.c | 10 | ||||
-rw-r--r-- | src/map_preview_screen.c | 2 | ||||
-rw-r--r-- | src/player_pc.c | 741 |
5 files changed, 750 insertions, 9 deletions
diff --git a/src/field_fadetransition.c b/src/field_fadetransition.c index 62254a559..6447ae1b2 100644 --- a/src/field_fadetransition.c +++ b/src/field_fadetransition.c @@ -522,7 +522,7 @@ static bool32 sub_807E40C(void) bool32 sub_807E418(void) { - if (sub_807AA70() == TRUE && sub_80F83B0()) + if (field_weather_is_fade_finished() == TRUE && sub_80F83B0()) return TRUE; else return FALSE; diff --git a/src/item_use.c b/src/item_use.c index f8a99cb1d..9657488f3 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -117,7 +117,7 @@ void sub_80A1084(void) void sub_80A109C(u8 taskId) { - if (sub_807AA70() == TRUE) + if (field_weather_is_fade_finished() == TRUE) { sItemUseOnFieldCB(taskId); } @@ -172,7 +172,7 @@ bool8 sub_80A1194(void) void sub_80A11C0(u8 taskId) { - if (sub_807AA70() == TRUE) + if (field_weather_is_fade_finished() == TRUE) { UnfreezeMapObjects(); ScriptContext2_Disable(); diff --git a/src/mailbox_pc.c b/src/mailbox_pc.c index 0ebffc67e..0a4535271 100644 --- a/src/mailbox_pc.c +++ b/src/mailbox_pc.c @@ -94,10 +94,10 @@ static void ItemPrintFunc(u8 windowId, s32 itemId, u8 y) } } -u8 MailboxPC_InitListMenu(struct PlayerPC_Unk_203AAC4 * playerPcStruct) +u8 MailboxPC_InitListMenu(struct PlayerPCItemPageStruct * playerPcStruct) { u16 i; - for (i = 0; i < playerPcStruct->unk_5; i++) + for (i = 0; i < playerPcStruct->count; i++) { sListMenuItems[i].label = sString_Dummy; sListMenuItems[i].index = i; @@ -106,7 +106,7 @@ u8 MailboxPC_InitListMenu(struct PlayerPC_Unk_203AAC4 * playerPcStruct) sListMenuItems[i].index = -2; gMultiuseListMenuTemplate.items = sListMenuItems; - gMultiuseListMenuTemplate.totalItems = playerPcStruct->unk_5 + 1; + gMultiuseListMenuTemplate.totalItems = playerPcStruct->count + 1; gMultiuseListMenuTemplate.windowId = sWindowIds[1]; gMultiuseListMenuTemplate.header_X = 0; gMultiuseListMenuTemplate.item_X = GetMenuCursorDimensionByFont(2, 0); @@ -132,9 +132,9 @@ static void MoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu * list) PlaySE(SE_SELECT); } -void MailboxPC_AddScrollIndicatorArrows(struct PlayerPC_Unk_203AAC4 * playerPcStruct) +void MailboxPC_AddScrollIndicatorArrows(struct PlayerPCItemPageStruct * playerPcStruct) { - playerPcStruct->unk_A = AddScrollIndicatorArrowPairParameterized(2, 0xC2, 0xC, 0x94, playerPcStruct->unk_5 - playerPcStruct->unk_4 + 1, 110, 110, &playerPcStruct->scrollOffset); + playerPcStruct->scrollIndicatorId = AddScrollIndicatorArrowPairParameterized(2, 0xC2, 0xC, 0x94, playerPcStruct->count - playerPcStruct->pageItems + 1, 110, 110, &playerPcStruct->scrollOffset); } void MailboxPC_DestroyListMenuBuffer(void) diff --git a/src/map_preview_screen.c b/src/map_preview_screen.c index 7d9fa935e..c465a5683 100644 --- a/src/map_preview_screen.c +++ b/src/map_preview_screen.c @@ -495,7 +495,7 @@ static void sub_80F83D0(u8 taskId) } break; case 2: - if (sub_807AA70()) + if (field_weather_is_fade_finished()) { Overworld_PlaySpecialMapMusic(); data[0]++; diff --git a/src/player_pc.c b/src/player_pc.c new file mode 100644 index 000000000..7197f65f1 --- /dev/null +++ b/src/player_pc.c @@ -0,0 +1,741 @@ +#include "global.h" +#include "palette.h" +#include "item.h" +#include "task.h" +#include "menu_indicators.h" +#include "new_menu_helpers.h" +#include "strings.h" +#include "menu.h" +#include "mail.h" +#include "mail_data.h" +#include "help_system.h" +#include "sound.h" +#include "overworld.h" +#include "script.h" +#include "mailbox_pc.h" +#include "player_pc.h" +#include "field_weather.h" +#include "event_scripts.h" +#include "field_fadetransition.h" +#include "string_util.h" +#include "item_menu.h" +#include "item_pc.h" +#include "party_menu.h" +#include "constants/items.h" +#include "constants/songs.h" + +#define PC_ITEM_ID 0 +#define PC_QUANTITY 1 +#define NEW_GAME_PC_ITEMS(i, type) (((u16 *)gNewGamePCItems + type)[i * 2]) + +#define tCount data[2] +#define tPageItems data[4] +#define tItemPcParam data[6] +#define tWindowId data[10] +#define tListMenuTaskId data[11] + +static EWRAM_DATA const u8 *sItemOrder = NULL; +static EWRAM_DATA u8 sTopMenuItemCount = 0; +EWRAM_DATA struct PlayerPCItemPageStruct gPlayerPcMenuManager = {}; + +#define SELECTED_MAIL (gSaveBlock1Ptr->mail[PC_MAIL_NUM(gPlayerPcMenuManager.scrollOffset) + gPlayerPcMenuManager.selectedRow]) + +static void Task_DrawPlayerPcTopMenu(u8 taskId); +static void Task_TopMenuHandleInput(u8 taskId); +static void Task_PlayerPcItemStorage(u8 taskId); +static void Task_PlayerPcMailbox(u8 taskId); +static void Task_PlayerPcTurnOff(u8 taskId); +static void Task_CreateItemStorageSubmenu(u8 taskId, u8 cursorPos); +static void PrintStringOnWindow0WithDialogueFrame(const u8 *str); +static void Task_TopMenu_ItemStorageSubmenu_HandleInput(u8 taskId); +static void Task_PlayerPcDepositItem(u8 taskId); +static void Task_DepositItem_WaitFadeAndGoToBag(u8 taskId); +static void CB2_ReturnFromDepositMenu(void); +static void Task_PlayerPcWithdrawItem(u8 taskId); +static void CB2_ReturnFromWithdrawMenu(void); +static void Task_WithdrawItemBeginFade(u8 taskId); +static void Task_PlayerPcCancel(u8 taskId); +static void Task_SetPageItemVars(u8 taskId); +static u8 CountPCMail(void); +static void PCMailCompaction(void); +static void Task_DrawMailboxPcMenu(u8 taskId); +static void Task_MailboxPcHandleInput(u8 taskId); +static void Task_PrintWhatToDoWithSelectedMail(u8 taskId); +static void Task_DestroyMailboxPcViewAndCancel(u8 taskId); +static void Task_DrawMailSubmenu(u8 taskId); +static void Task_MailSubmenuHandleInput(u8 taskId); +static void Task_PlayerPcReadMail(u8 taskId); +static void Task_WaitFadeAndReadSelectedMail(u8 taskId); +static void CB2_SetCbToReturnToMailbox(void); +static void Task_PlayerPcMoveMailToBag(u8 taskId); +static void Task_DrawYesNoMenuToConfirmMoveToBag(u8 taskId); +static void Task_MoveToBagYesNoMenuHandleInput(u8 taskId); +static void Task_TryPutMailInBag_DestroyMsgIfSuccessful(u8 taskId); +static void Task_DeclinedMoveMailToBag(u8 taskId); +static void Task_PlayerPcGiveMailToMon(u8 taskId); +static void Task_WaitFadeAndGoToPartyMenu(u8 taskId); +static void Task_Error_NoPokemon(u8 taskId); +static void Task_PlayerPcExitMailSubmenu(u8 taskId); + +static const u8 *const sItemStorageActionDescriptionPtrs[] = { + gText_TakeOutItemsFromThePC, + gText_StoreItemsInThePC, + gText_GoBackToThePreviousMenu +}; + +static const struct MenuAction sMenuActions_TopMenu[] = { + {gText_ItemStorage, Task_PlayerPcItemStorage}, + {gText_Mailbox, Task_PlayerPcMailbox}, + {gText_TurnOff, Task_PlayerPcTurnOff} +}; + +static const u8 gUnknown_8402200[] = { 0, 1, 2 }; +static const u8 gUnknown_8402203[] = { 0, 1, 2 }; + +static const struct MenuAction sMenuActions_ItemPc[] = { + {gText_WithdrawItem2, Task_PlayerPcWithdrawItem}, + {gText_DepositItem2, Task_PlayerPcDepositItem}, + {gFameCheckerText_Cancel, Task_PlayerPcCancel} +}; + +static const struct ItemSlot gNewGamePCItems[] = { + { ITEM_POTION, 1 }, + { ITEM_NONE, 0 } +}; + +static const struct MenuAction sMenuActions_MailSubmenu[] = { + {gOtherText_Read, Task_PlayerPcReadMail}, + {gOtherText_MoveToBag, Task_PlayerPcMoveMailToBag}, + {gOtherText_Give2, Task_PlayerPcGiveMailToMon}, + {gOtherText_Exit, Task_PlayerPcExitMailSubmenu} +}; + +static const struct WindowTemplate sWindowTemplate_TopMenu_3Items = { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 13, + .height = 6, + .paletteNum = 15, + .baseBlock = 0x008 +}; + +static const struct WindowTemplate sWindowTemplate_TopMenu_4Items = { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 13, + .height = 8, + .paletteNum = 15, + .baseBlock = 0x008 +}; + +static const struct WindowTemplate sWindowTemplate_ItemStorageSubmenu = { + .bg = 0, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 14, + .height = 6, + .paletteNum = 15, + .baseBlock = 0x008 +}; + +void NewGameInitPCItems(void) +{ + u8 i; + + for (i = 0, ClearPCItemSlots(); NEW_GAME_PC_ITEMS(i, PC_ITEM_ID) && NEW_GAME_PC_ITEMS(i, PC_QUANTITY) && + AddPCItem(NEW_GAME_PC_ITEMS(i, PC_ITEM_ID), NEW_GAME_PC_ITEMS(i, PC_QUANTITY)) == TRUE; i++) + ; +} + +void sub_80EB6AC(void) +{ + u8 taskId; + + gPlayerPcMenuManager.unk_9 = 0; + sub_812B234(); + sItemOrder = gUnknown_8402200; + sTopMenuItemCount = 3; + taskId = CreateTask(TaskDummy, 0); + DisplayItemMessageOnField(taskId, 2, gText_WhatWouldYouLikeToDo, Task_DrawPlayerPcTopMenu); +} + +void sub_80EB6FC(void) +{ + u8 taskId; + + gPlayerPcMenuManager.unk_9 = 1; + sub_812B234(); + sItemOrder = gUnknown_8402203; + sTopMenuItemCount = 3; + taskId = CreateTask(TaskDummy, 0); + DisplayItemMessageOnField(taskId, 2, gText_WhatWouldYouLikeToDo, Task_DrawPlayerPcTopMenu); +} + +static void Task_DrawPlayerPcTopMenu(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + if (sTopMenuItemCount == 3) + tWindowId = AddWindow(&sWindowTemplate_TopMenu_3Items); + else + tWindowId = AddWindow(&sWindowTemplate_TopMenu_4Items); + SetStdWindowBorderStyle(tWindowId, 0); + AddItemMenuActionTextPrinters(tWindowId, 2, GetMenuCursorDimensionByFont(2, 0), 2, GetFontAttribute(2, FONTATTR_LETTER_SPACING), 16, sTopMenuItemCount, sMenuActions_TopMenu, sItemOrder); + Menu_InitCursor(tWindowId, 2, 0, 2, 16, sTopMenuItemCount, 0); + ScheduleBgCopyTilemapToVram(0); + gTasks[taskId].func = Task_TopMenuHandleInput; +} + +static void Task_TopMenuHandleInput(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + s8 input = Menu_ProcessInputNoWrapAround(); + switch (input) + { + case -2: + break; + case -1: + PlaySE(SE_SELECT); + ClearStdWindowAndFrameToTransparent(tWindowId, FALSE); + ClearWindowTilemap(tWindowId); + RemoveWindow(tWindowId); + ScheduleBgCopyTilemapToVram(0); + gTasks[taskId].func = Task_PlayerPcTurnOff; + break; + default: + ClearStdWindowAndFrameToTransparent(tWindowId, FALSE); + ClearWindowTilemap(tWindowId); + RemoveWindow(tWindowId); + ScheduleBgCopyTilemapToVram(0); + gTasks[taskId].func = sMenuActions_TopMenu[sItemOrder[input]].func.void_u8; + break; + } +} + +static void Task_ReturnToTopMenu(u8 taskId) +{ + sub_812B248(); + DisplayItemMessageOnField(taskId, 2, gText_WhatWouldYouLikeToDo, Task_DrawPlayerPcTopMenu); +} + +static void Task_PlayerPcItemStorage(u8 taskId) +{ + Task_CreateItemStorageSubmenu(taskId, FALSE); + gTasks[taskId].func = Task_TopMenu_ItemStorageSubmenu_HandleInput; +} + +static void Task_PlayerPcMailbox(u8 taskId) +{ + gPlayerPcMenuManager.count = CountPCMail(); + if (gPlayerPcMenuManager.count == 0) + { + DisplayItemMessageOnField(taskId, 2, gText_TheresNoMailHere, Task_ReturnToTopMenu); + } + else + { + gPlayerPcMenuManager.selectedRow = 0; + gPlayerPcMenuManager.scrollOffset = 0; + PCMailCompaction(); + Task_SetPageItemVars(taskId); + if (gPlayerPcMenuManager.unk_9 == 0) + HelpSystem_SetSomeVariable2(34); + else + HelpSystem_SetSomeVariable2(30); + if (MailboxPC_InitBuffers(gPlayerPcMenuManager.count) == TRUE) + { + ClearDialogWindowAndFrame(0, FALSE); + Task_DrawMailboxPcMenu(taskId); + gTasks[taskId].func = Task_MailboxPcHandleInput; + } + else + { + DisplayItemMessageOnField(taskId, 2, gText_TheresNoMailHere, Task_ReturnToTopMenu); + } + } +} + +static void Task_PlayerPcTurnOff(u8 taskId) +{ + if (gPlayerPcMenuManager.unk_9 == 0) + ScriptContext1_SetupScript(EventScript_PalletTown_PlayersHouse_2F_ShutDownPC); + else + EnableBothScriptContexts(); + DestroyTask(taskId); +} + +static void Task_CreateItemStorageSubmenu(u8 taskId, u8 cursorPos) +{ + s16 *data = gTasks[taskId].data; + if (gPlayerPcMenuManager.unk_9 == 0) + HelpSystem_SetSomeVariable2(33); + else + HelpSystem_SetSomeVariable2(29); + tWindowId = AddWindow(&sWindowTemplate_ItemStorageSubmenu); + SetStdWindowBorderStyle(tWindowId, FALSE); + PrintTextArray(tWindowId, 2, GetMenuCursorDimensionByFont(2, 0), 2, 16, 3, sMenuActions_ItemPc); + Menu_InitCursor(tWindowId, 2, 0, 2, 16, 3, cursorPos); + ScheduleBgCopyTilemapToVram(0); + PrintStringOnWindow0WithDialogueFrame(sItemStorageActionDescriptionPtrs[cursorPos]); +} + +static void PrintStringOnWindow0WithDialogueFrame(const u8 *str) +{ + DrawDialogueFrame(0, FALSE); + AddTextPrinterParameterized(0, 2, str, 0, 1, 0, NULL); +} + +static void Task_TopMenu_ItemStorageSubmenu_HandleInput(u8 taskId) +{ + if (JOY_REPT(DPAD_UP)) + { + if (Menu_GetCursorPos() != 0) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(-1); + PrintStringOnWindow0WithDialogueFrame(sItemStorageActionDescriptionPtrs[Menu_GetCursorPos()]); + } + } + else if (JOY_REPT(DPAD_DOWN)) + { + if (Menu_GetCursorPos() != 2) + { + PlaySE(SE_SELECT); + Menu_MoveCursor(+1); + PrintStringOnWindow0WithDialogueFrame(sItemStorageActionDescriptionPtrs[Menu_GetCursorPos()]); + } + } + else if (JOY_NEW(A_BUTTON)) + { + PlaySE(SE_SELECT); + sMenuActions_ItemPc[Menu_GetCursorPos()].func.void_u8(taskId); + } + else if (JOY_NEW(B_BUTTON)) + { + PlaySE(SE_SELECT); + sMenuActions_ItemPc[2].func.void_u8(taskId); + } +} + +static void Task_DepositItem_WaitFadeAndGoToBag(u8 taskId) +{ + if (!gPaletteFade.active) + { + CleanupOverworldWindowsAndTilemaps(); + sub_8107DB4(3, POCKET_ITEMS - 1, CB2_ReturnToField); + gFieldCallback = CB2_ReturnFromDepositMenu; + DestroyTask(taskId); + } +} + +static void Task_PlayerPcDepositItem(u8 taskId) +{ + gTasks[taskId].func = Task_DepositItem_WaitFadeAndGoToBag; + fade_screen(1, 0); +} + +static void Task_ReturnToItemStorageSubmenu(u8 taskId) +{ + if (field_weather_is_fade_finished() == TRUE) + gTasks[taskId].func = Task_TopMenu_ItemStorageSubmenu_HandleInput; +} + +static void CB2_ReturnFromDepositMenu(void) +{ + u8 taskId; + sub_80F6E9C(); + DrawDialogueFrame(0, TRUE); + taskId = CreateTask(Task_ReturnToItemStorageSubmenu, 0); + Task_CreateItemStorageSubmenu(taskId, 1); + sub_807DC00(); +} + +static void Task_PlayerPcWithdrawItem(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + tCount = CountItemsInPC(); + if (tCount != 0) + { + tItemPcParam = 0; + gTasks[taskId].func = Task_WithdrawItemBeginFade; + gFieldCallback = CB2_ReturnFromWithdrawMenu; + } + else + { + ClearStdWindowAndFrameToTransparent(tWindowId, FALSE); + ClearWindowTilemap(tWindowId); + RemoveWindow(tWindowId); + DisplayItemMessageOnField(taskId, 2, gText_ThereAreNoItems, Task_PlayerPcItemStorage); + } +} + +static void CB2_ReturnFromWithdrawMenu(void) +{ + u8 taskId; + sub_80F6E9C(); + DrawDialogueFrame(0, TRUE); + taskId = CreateTask(Task_ReturnToItemStorageSubmenu, 0); + Task_CreateItemStorageSubmenu(taskId, 0); + sub_807DC00(); +} + +static void Task_WithdrawItem_WaitFadeAndGoToItemStorage(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + if (!gPaletteFade.active) + { + CleanupOverworldWindowsAndTilemaps(); + ItemPc_Init(tItemPcParam, CB2_ReturnToField); + DestroyTask(taskId); + } +} + +static void Task_WithdrawItemBeginFade(u8 taskId) +{ + gTasks[taskId].func = Task_WithdrawItem_WaitFadeAndGoToItemStorage; + ItemPc_SetInitializedFlag(0); + fade_screen(1, 0); +} + +static void Task_PlayerPcCancel(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + ClearStdWindowAndFrameToTransparent(tWindowId, FALSE); + ClearWindowTilemap(tWindowId); + CopyWindowToVram(tWindowId, 1); + RemoveWindow(tWindowId); + Task_ReturnToTopMenu(taskId); +} + +static void Task_SetPageItemVars(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + if (tCount >= 8) + tPageItems = 8; + else + tPageItems = tCount + 1; + if (gPlayerPcMenuManager.count >= 8) + gPlayerPcMenuManager.pageItems = 8; + else + gPlayerPcMenuManager.pageItems = gPlayerPcMenuManager.count + 1; +} + +static u8 CountPCMail(void) +{ + u8 count = 0; + u8 i; + + for (i = PC_MAIL_NUM(0); i < MAIL_COUNT; i++) + { + if (gSaveBlock1Ptr->mail[i].itemId != ITEM_NONE) + count++; + } + return count; +} + +static void PCMailCompaction(void) +{ + u8 i; + u8 j; + for (i = PC_MAIL_NUM(0); i < MAIL_COUNT - 1; i++) + { + for (j = i + 1; j < MAIL_COUNT; j++) + { + if (gSaveBlock1Ptr->mail[i].itemId == ITEM_NONE) + { + struct MailStruct mail = gSaveBlock1Ptr->mail[i]; + gSaveBlock1Ptr->mail[i] = gSaveBlock1Ptr->mail[j]; + gSaveBlock1Ptr->mail[j] = mail; + } + } + } +} + +static void Task_DrawMailboxPcMenu(u8 taskId) +{ + u8 windowId = MailboxPC_GetAddWindow(0); + s32 width = GetStringWidth(2, gText_Mailbox, 0); + MailboxPC_GetAddWindow(1); + AddTextPrinterParameterized(windowId, 2, gText_Mailbox, (80 - width) / 2, 2, 0, NULL); + ScheduleBgCopyTilemapToVram(0); + gTasks[taskId].tListMenuTaskId = MailboxPC_InitListMenu(&gPlayerPcMenuManager); + MailboxPC_AddScrollIndicatorArrows(&gPlayerPcMenuManager); +} + +static void Task_MailboxPcHandleInput(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + s32 input; + if (!gPaletteFade.active) + { + input = ListMenu_ProcessInput(tListMenuTaskId); + ListMenuGetScrollAndRow(tListMenuTaskId, &gPlayerPcMenuManager.scrollOffset, &gPlayerPcMenuManager.selectedRow); + switch (input) + { + case -1: + break; + case -2: + PlaySE(SE_SELECT); + RemoveScrollIndicatorArrowPair(gPlayerPcMenuManager.scrollIndicatorId); + Task_DestroyMailboxPcViewAndCancel(taskId); + break; + default: + PlaySE(SE_SELECT); + MailboxPC_RemoveWindow(0); + MailboxPC_RemoveWindow(1); + DestroyListMenuTask(tListMenuTaskId, &gPlayerPcMenuManager.scrollOffset, &gPlayerPcMenuManager.selectedRow); + ScheduleBgCopyTilemapToVram(0); + RemoveScrollIndicatorArrowPair(gPlayerPcMenuManager.scrollIndicatorId); + gTasks[taskId].func = Task_PrintWhatToDoWithSelectedMail; + break; + } + } +} + +static void Task_PrintWhatToDoWithSelectedMail(u8 taskId) +{ + s32 length; + s32 i; + u8 *ptr; + StringCopy(gStringVar1, SELECTED_MAIL.playerName); + length = StringLength(gStringVar1); + if (length > 5) + { + for (ptr = gStringVar1 + length - 1; ptr >= gStringVar1; ptr--) + { + if (*ptr) + break; + *ptr = EOS; + } + } + else + { + ConvertInternationalString(gStringVar1, LANGUAGE_JAPANESE); + } + StringExpandPlaceholders(gStringVar4, gText_WhatWouldYouLikeToDoWithPlayersMail); + DisplayItemMessageOnField(taskId, 2, gStringVar4, Task_DrawMailSubmenu); +} + +static void Task_DestroyMailboxPcViewAndCancel(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + MailboxPC_RemoveWindow(0); + MailboxPC_RemoveWindow(1); + DestroyListMenuTask(tListMenuTaskId, NULL, NULL); + ScheduleBgCopyTilemapToVram(0); + MailboxPC_DestroyListMenuBuffer(); + Task_ReturnToTopMenu(taskId); +} + +static void Task_DrawMailSubmenu(u8 taskId) +{ + u8 windowId = MailboxPC_GetAddWindow(2); + PrintTextArray(windowId, 2, GetMenuCursorDimensionByFont(2, 0), 2, 16, 4, sMenuActions_MailSubmenu); + Menu_InitCursor(windowId, 2, 0, 2, 16, 4, 0); + ScheduleBgCopyTilemapToVram(0); + gTasks[taskId].func = Task_MailSubmenuHandleInput; +} + +static void Task_MailSubmenuHandleInput(u8 taskId) +{ + s8 input = Menu_ProcessInput_other(); + switch (input) + { + case -1: + PlaySE(SE_SELECT); + Task_PlayerPcExitMailSubmenu(taskId); + break; + case -2: + break; + default: + PlaySE(SE_SELECT); + sMenuActions_MailSubmenu[input].func.void_u8(taskId); + break; + } +} + +static void Task_PlayerPcReadMail(u8 taskId) +{ + fade_screen(1, 0); + gTasks[taskId].func = Task_WaitFadeAndReadSelectedMail; +} + +static void Task_WaitFadeAndReadSelectedMail(u8 taskId) +{ + if (!gPaletteFade.active) + { + MailboxPC_DestroyListMenuBuffer(); + CleanupOverworldWindowsAndTilemaps(); + sub_80BEBEC(&SELECTED_MAIL, CB2_SetCbToReturnToMailbox, 1); + DestroyTask(taskId); + } +} + +static void Task_WaitFadeAndReturnToMailboxPcInputHandler(u8 taskId) +{ + if (field_weather_is_fade_finished() == TRUE) + gTasks[taskId].func = Task_MailboxPcHandleInput; +} + +static void CB2_ReturnToMailbox(void) +{ + u8 taskId; + if (gPlayerPcMenuManager.unk_9 == 0) + HelpSystem_SetSomeVariable2(34); + else + HelpSystem_SetSomeVariable2(30); + sub_80F6E9C(); + taskId = CreateTask(Task_WaitFadeAndReturnToMailboxPcInputHandler, 0); + if (MailboxPC_InitBuffers(gPlayerPcMenuManager.count) == TRUE) + Task_DrawMailboxPcMenu(taskId); + else + DestroyTask(taskId); + sub_807DC00(); +} + +static void CB2_SetCbToReturnToMailbox(void) +{ + gFieldCallback = CB2_ReturnToMailbox; + SetMainCallback2(CB2_ReturnToField); +} + +static void Task_PlayerPcMoveMailToBag(u8 taskId) +{ + DisplayItemMessageOnField(taskId, 2, gText_MessageWillBeLost, Task_DrawYesNoMenuToConfirmMoveToBag); +} + +static void Task_DrawYesNoMenuToConfirmMoveToBag(u8 taskId) +{ + DisplayYesNoMenuDefaultYes(); + gTasks[taskId].func = Task_MoveToBagYesNoMenuHandleInput; +} + +static void Task_MoveToBagYesNoMenuHandleInput(u8 taskId) +{ + switch (Menu_ProcessInputNoWrapClearOnChoose()) + { + case -2: + break; + case 0: + Task_TryPutMailInBag_DestroyMsgIfSuccessful(taskId); + break; + case -1: + PlaySE(SE_SELECT); + // fallthrough + case 1: + Task_DeclinedMoveMailToBag(taskId); + break; + } +} + +static void Task_TryPutMailInBag_DestroyMsgIfSuccessful(u8 taskId) +{ + struct MailStruct * mail = &SELECTED_MAIL; + if (!AddBagItem(mail->itemId, 1)) + { + DisplayItemMessageOnField(taskId, 2, gText_BagIsFull, Task_PlayerPcExitMailSubmenu); + } + else + { + DisplayItemMessageOnField(taskId, 2, gText_MailReturnedToBagMessageErased, Task_PlayerPcExitMailSubmenu); + ClearMailStruct(mail); + PCMailCompaction(); + gPlayerPcMenuManager.count--; + if (gPlayerPcMenuManager.count < gPlayerPcMenuManager.pageItems + gPlayerPcMenuManager.scrollOffset) + { + if (gPlayerPcMenuManager.scrollOffset != 0) + gPlayerPcMenuManager.scrollOffset--; + } + Task_SetPageItemVars(taskId); + } +} + +static void Task_DeclinedMoveMailToBag(u8 taskId) +{ + Task_PlayerPcExitMailSubmenu(taskId); +} + +static void Task_PlayerPcGiveMailToMon(u8 taskId) +{ + if (CalculatePlayerPartyCount() == 0) + { + Task_Error_NoPokemon(taskId); + } + else + { + fade_screen(1, 0); + gTasks[taskId].func = Task_WaitFadeAndGoToPartyMenu; + } +} + +static void Task_WaitFadeAndGoToPartyMenu(u8 taskId) +{ + if (!gPaletteFade.active) + { + MailboxPC_DestroyListMenuBuffer(); + CleanupOverworldWindowsAndTilemaps(); + PartyMenuInit_FromPlayerPc(); + DestroyTask(taskId); + } +} + +static void CB2_ReturnToMailboxPc_UpdateScrollVariables(void) +{ + u8 taskId; + u8 count; + if (gPlayerPcMenuManager.unk_9 == 0) + HelpSystem_SetSomeVariable2(34); + else + HelpSystem_SetSomeVariable2(30); + taskId = CreateTask(Task_WaitFadeAndReturnToMailboxPcInputHandler, 0); + count = gPlayerPcMenuManager.count; + gPlayerPcMenuManager.count = CountPCMail(); + PCMailCompaction(); + if (count != gPlayerPcMenuManager.count) + { + if (gPlayerPcMenuManager.count < gPlayerPcMenuManager.pageItems + gPlayerPcMenuManager.scrollOffset) + { + if (gPlayerPcMenuManager.scrollOffset != 0) + gPlayerPcMenuManager.scrollOffset--; + } + } + Task_SetPageItemVars(taskId); + sub_80F6E9C(); + if (MailboxPC_InitBuffers(gPlayerPcMenuManager.count) == TRUE) + Task_DrawMailboxPcMenu(taskId); + else + DestroyTask(taskId); + sub_807DC00(); +} + +void CB2_PlayerPC_ReturnFromPartyMenu(void) +{ + gFieldCallback = CB2_ReturnToMailboxPc_UpdateScrollVariables; + SetMainCallback2(CB2_ReturnToField); +} + +static void Task_Error_NoPokemon(u8 taskId) +{ + DisplayItemMessageOnField(taskId, 2, gText_ThereIsNoPokemon, Task_PlayerPcExitMailSubmenu); +} + +static void Task_RedrawPlayerPcMailboxAndSetUpInputHandler(u8 taskId) +{ + ClearDialogWindowAndFrame(0, FALSE); + Task_DrawMailboxPcMenu(taskId); + ScheduleBgCopyTilemapToVram(0); + gTasks[taskId].func = Task_MailboxPcHandleInput; +} + +static void Task_PlayerPcExitMailSubmenu(u8 taskId) +{ + MailboxPC_RemoveWindow(2); + ScheduleBgCopyTilemapToVram(0); + gTasks[taskId].func = Task_RedrawPlayerPcMailboxAndSetUpInputHandler; +} + +#undef tListMenuTaskId +#undef tWindowId +#undef tItemPcParam +#undef tPageItems +#undef tCount |