diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/berry_pouch.c | 1528 | ||||
-rw-r--r-- | src/item_use.c | 8 | ||||
-rw-r--r-- | src/menu_helpers.c | 2 |
3 files changed, 1533 insertions, 5 deletions
diff --git a/src/berry_pouch.c b/src/berry_pouch.c new file mode 100644 index 000000000..525249514 --- /dev/null +++ b/src/berry_pouch.c @@ -0,0 +1,1528 @@ +#include "global.h" +#include "malloc.h" +#include "bg.h" +#include "decompress.h" +#include "gpu_regs.h" +#include "palette.h" +#include "text.h" +#include "berry_pouch.h" +#include "item_menu.h" +#include "menu_helpers.h" +#include "new_menu_helpers.h" +#include "scanline_effect.h" +#include "item_menu_icons.h" +#include "list_menu.h" +#include "graphics.h" +#include "berry.h" +#include "item.h" +#include "item_use.h" +#include "party_menu.h" +#include "text_window.h" +#include "strings.h" +#include "string_util.h" +#include "sound.h" +#include "link.h" +#include "money.h" +#include "shop.h" +#include "menu.h" +#include "menu_indicators.h" +#include "pokemon_storage_system.h" +#include "constants/items.h" +#include "constants/songs.h" + +struct BerryPouchStruct_203F36C +{ + void (*exitCallback)(void); + u16 indicatorOffset; + u8 indicatorTaskId; + u8 listMenuNumItems; + u8 listMenuMaxShowed; + u8 itemMenuIconId; + u8 ALIGNED(4) bg1TilemapBuffer[BG_SCREEN_SIZE]; + s16 data[4]; +}; + +struct BerryPouchStruct_203F370 +{ + void (*savedCallback)(void); + u8 type; + u8 allowSelect; + u8 unused_06; + u16 listMenuSelectedRow; + u16 listMenuScrollOffset; +}; + +enum +{ + BP_ACTION_USE = 0, + BP_ACTION_TOSS, + BP_ACTION_GIVE, + BP_ACTION_EXIT, + BP_ACTION_DUMMY +}; + +static EWRAM_DATA struct BerryPouchStruct_203F36C *sResources = NULL; +static EWRAM_DATA struct BerryPouchStruct_203F370 sStaticCnt = {}; +static EWRAM_DATA struct ListMenuItem *sListMenuItems = NULL; +static EWRAM_DATA u8 * sListMenuStrbuf = NULL; +static EWRAM_DATA const u8 * sContextMenuOptions = NULL; +static EWRAM_DATA u8 sContextMenuNumOptions = 0; +static ALIGNED(4) EWRAM_DATA u8 sVariableWindowIds[14] = {}; +static ALIGNED(4) EWRAM_DATA u8 sBerryPouchSpriteId = 0; + +static void CB2_InitBerryPouch(void); +static bool8 RunBerryPouchInit(void); +static void AbortBerryPouchLoading(void); +static void Task_AbortBerryPouchLoading_WaitFade(u8 taskId); +static void BerryPouchInitBgs(void); +static bool8 BerryPouchLoadGfx(void); +static bool8 AllocateListMenuBuffers(void); +static void SetUpListMenuTemplate(void); +static void GetBerryNameAndIndexForMenu(u8 * dest, u16 itemId); +static void BerryPouchMoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list); +static void BerryPouchItemPrintFunc(u8 windowId, s32 itemId, u8 y); +static void BerryPouchSetArrowCursorAt(u8 y, u8 colorIdx); +static void PrintSelectedBerryDescription(s32 itemIndex); +static void CreateScrollIndicatorArrows_BerryPouchList(void); +static void PrintBerryPouchHeaderCentered(void); +static void SanitizeListMenuSelectionParams(void); +static void UpdateListMenuScrollOffset(void); +static void BerryPouch_DestroyResources(void); +static void Task_BerryPouchFadeToExitCallback(u8 taskId); +static void SortAndCountBerries(void); +static void Task_BerryPouchMain(u8 taskId); +static void Task_NormalContextMenu(u8 taskId); +static void Task_NormalContextMenu_HandleInput(u8 taskId); +static void Task_BerryPouch_Use(u8 taskId); +static void Task_BerryPouch_Toss(u8 taskId); +static void Task_AskTossMultiple(u8 taskId); +static void Task_TossNo(u8 taskId); +static void Task_Toss_SelectMultiple(u8 taskId); +static void Task_TossYes(u8 taskId); +static void Task_WaitButtonThenTossBerries(u8 taskId); +static void Task_BerryPouch_Give(u8 taskId); +static void Task_Give_PrintThereIsNoPokemon(u8 taskId); +static void Task_WaitButtonBeforeDialogueWindowDestruction(u8 taskId); +static void Task_BerryPouch_Exit(u8 taskId); +static void Task_ContextMenu_FromPartyGiveMenu(u8 taskId); +static void Task_ContextMenu_FromPokemonPC(u8 taskId); +static void Task_ContextMenu_Sell(u8 taskId); +static void Task_AskSellMultiple(u8 taskId); +static void Task_SellMultiple_CreateYesNoMenu(u8 taskId); +static void Task_SellNo(u8 taskId); +static void Task_Sell_PrintSelectMultipleUI(u8 taskId); +static void SellMultiple_UpdateSellPriceDisplay(s32 price); +static void Task_Sell_SelectMultiple(u8 taskId); +static void Task_SellYes(u8 taskId); +static void Task_SellBerries_PlaySfxAndRemoveBerries(u8 taskId); +static void Task_SellBerries_WaitButton(u8 taskId); +static void BerryPouchInitWindows(void); +static void BerryPouchPrint(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx); +static u8 GetOrCreateVariableWindow(u8 winIdx); +static void DestroyVariableWindow(u8 winIdx); +static void TryDestroyVariableWindow(u8 winIdx); +static u8 GetVariableWindowId(u8 winIdx); +static void CreateYesNoMenuWin3(u8 taskId, const struct YesNoFuncTable *ptrs); +static void CreateYesNoMenuWin4(u8 taskId, const struct YesNoFuncTable *ptrs); +static void PrintMoneyInWin2(void); +static void CreateBerryPouchSprite(void); +static void StartBerryPouchSpriteWobbleAnim(void); +static void SpriteCB_BerryPouchWaitWobbleAnim(struct Sprite *sprite); + +static const struct BgTemplate sBgTemplates[] = { + { + .bg = 0, + .charBaseIndex = 0, + .mapBaseIndex = 31, + .screenSize = 0, + .paletteMode = 0, + .priority = 1, + .baseTile = 0x000 + }, { + .bg = 1, + .charBaseIndex = 3, + .mapBaseIndex = 30, + .screenSize = 0, + .paletteMode = 0, + .priority = 2, + .baseTile = 0x000 + }, { + .bg = 2, + .charBaseIndex = 0, + .mapBaseIndex = 29, + .screenSize = 0, + .paletteMode = 0, + .priority = 0, + .baseTile = 0x000 + } +}; + +static const TaskFunc sBerryPouchContextMenuTasks[] = { + Task_NormalContextMenu, + Task_ContextMenu_FromPartyGiveMenu, + Task_ContextMenu_Sell, + Task_ContextMenu_FromPokemonPC, + Task_NormalContextMenu +}; + +static const struct YesNoFuncTable sYesNoFuncs_Toss = { + .yesFunc = Task_TossYes, + .noFunc = Task_TossNo +}; + +static const struct YesNoFuncTable sYesNoFuncs_Sell = { + .yesFunc = Task_SellYes, + .noFunc = Task_SellNo +}; + +static const struct MenuAction sContextMenuActions[] = { + {gOtherText_Use, Task_BerryPouch_Use}, + {gOtherText_Toss, Task_BerryPouch_Toss}, + {gOtherText_Give, Task_BerryPouch_Give}, + {gOtherText_Exit, Task_BerryPouch_Exit}, + {gString_Dummy, NULL} +}; + +static const u8 sOptions_UseGiveTossExit[] = { + BP_ACTION_USE, + BP_ACTION_GIVE, + BP_ACTION_TOSS, + BP_ACTION_EXIT +}; + +static const u8 sOptions_GiveExit[] = { + BP_ACTION_GIVE, + BP_ACTION_EXIT, + BP_ACTION_DUMMY, + BP_ACTION_DUMMY +}; + +static const u8 sOptions_Exit[] = { + BP_ACTION_EXIT, + BP_ACTION_DUMMY, + BP_ACTION_DUMMY, + BP_ACTION_DUMMY +}; + +static const u8 sOptions_UseToss_Exit[] = { + BP_ACTION_USE, + BP_ACTION_TOSS, + BP_ACTION_EXIT, + BP_ACTION_DUMMY +}; + +static const u8 sText_Space[] = _(" "); + +static const struct WindowTemplate sWindowTemplates_Main[] = { + { + .bg = 0, + .tilemapLeft = 11, + .tilemapTop = 1, + .width = 18, + .height = 14, + .paletteNum = 15, + .baseBlock = 0x027 + }, { + .bg = 0, + .tilemapLeft = 5, + .tilemapTop = 16, + .width = 25, + .height = 4, + .paletteNum = 15, + .baseBlock = 0x123 + }, { + .bg = 2, + .tilemapLeft = 1, + .tilemapTop = 1, + .width = 9, + .height = 2, + .paletteNum = 15, + .baseBlock = 0x187 + }, DUMMY_WIN_TEMPLATE +}; + +static const struct WindowTemplate sWindowTemplates_Variable[] = { + { + .bg = 0x02, + .tilemapLeft = 0x18, + .tilemapTop = 0x0f, + .width = 0x05, + .height = 0x04, + .paletteNum = 0x0f, + .baseBlock = 0x1d1 + }, { + .bg = 0x02, + .tilemapLeft = 0x11, + .tilemapTop = 0x09, + .width = 0x0c, + .height = 0x04, + .paletteNum = 0x0f, + .baseBlock = 0x1d1 + }, { + .bg = 0x02, + .tilemapLeft = 0x01, + .tilemapTop = 0x01, + .width = 0x08, + .height = 0x03, + .paletteNum = 0x0c, + .baseBlock = 0x201 + }, { + .bg = 0x02, + .tilemapLeft = 0x17, + .tilemapTop = 0x0f, + .width = 0x06, + .height = 0x04, + .paletteNum = 0x0f, + .baseBlock = 0x219 + }, { + .bg = 0x02, + .tilemapLeft = 0x15, + .tilemapTop = 0x09, + .width = 0x06, + .height = 0x04, + .paletteNum = 0x0f, + .baseBlock = 0x219 + }, { + .bg = 0x02, + .tilemapLeft = 0x02, + .tilemapTop = 0x0f, + .width = 0x1a, + .height = 0x04, + .paletteNum = 0x0f, + .baseBlock = 0x231 + }, { + .bg = 0x02, + .tilemapLeft = 0x06, + .tilemapTop = 0x0f, + .width = 0x0e, + .height = 0x04, + .paletteNum = 0x0c, + .baseBlock = 0x231 + }, { + .bg = 0x02, + .tilemapLeft = 0x06, + .tilemapTop = 0x0f, + .width = 0x0f, + .height = 0x04, + .paletteNum = 0x0c, + .baseBlock = 0x269 + }, { + .bg = 0x02, + .tilemapLeft = 0x06, + .tilemapTop = 0x0f, + .width = 0x10, + .height = 0x04, + .paletteNum = 0x0c, + .baseBlock = 0x2a5 + }, { + .bg = 0x02, + .tilemapLeft = 0x06, + .tilemapTop = 0x0f, + .width = 0x17, + .height = 0x04, + .paletteNum = 0x0c, + .baseBlock = 0x2e5 + }, { + .bg = 0x02, + .tilemapLeft = 0x16, + .tilemapTop = 0x11, + .width = 0x07, + .height = 0x02, + .paletteNum = 0x0f, + .baseBlock = 0x199 + }, { + .bg = 0x02, + .tilemapLeft = 0x16, + .tilemapTop = 0x0f, + .width = 0x07, + .height = 0x04, + .paletteNum = 0x0f, + .baseBlock = 0x199 + }, { + .bg = 0x02, + .tilemapLeft = 0x16, + .tilemapTop = 0x0d, + .width = 0x07, + .height = 0x06, + .paletteNum = 0x0f, + .baseBlock = 0x199 + }, { + .bg = 0x02, + .tilemapLeft = 0x16, + .tilemapTop = 0x0b, + .width = 0x07, + .height = 0x08, + .paletteNum = 0x0f, + .baseBlock = 0x199 + } +}; + +static const u8 sTextColors[][3] = { + { 0, 1, 2 }, + { 0, 2, 3 }, + { 0, 3, 2 } +}; + +static const struct OamData sOamData = { + .affineMode = ST_OAM_AFFINE_NORMAL, + .shape = ST_OAM_SQUARE, + .size = ST_OAM_SIZE_3, + .priority = 1 +}; + +static const union AnimCmd sSpriteAnim_Dummy[] = { + ANIMCMD_FRAME(0, 0), + ANIMCMD_END +}; + +static const union AnimCmd *const sSpriteAnimTable[] = { + sSpriteAnim_Dummy +}; + +static const union AffineAnimCmd sSpriteAffineAnim_Static[] = { + AFFINEANIMCMD_FRAME(0x100, 0x100, 0, 0), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd sSpriteAffineAnim_Wobble[] = { + AFFINEANIMCMD_FRAME(0, 0, -2, 2), + AFFINEANIMCMD_FRAME(0, 0, 2, 4), + AFFINEANIMCMD_FRAME(0, 0, -2, 4), + AFFINEANIMCMD_FRAME(0, 0, 2, 2), + AFFINEANIMCMD_END +}; + +static const union AffineAnimCmd *const sSpriteAffineAnimTable[] = { + sSpriteAffineAnim_Static, + sSpriteAffineAnim_Wobble +}; + +static const struct CompressedSpriteSheet sBerryPouchSpriteSheet = { + gBerryPouchSpriteTiles, 0x800, 100 +}; + +static const struct CompressedSpritePalette sBerryPouchSpritePal = { + gBerryPouchSpritePalette, 100 +}; + +static const struct SpriteTemplate sSpriteTemplate_BerryPouch = { + 100, 100, &sOamData, sSpriteAnimTable, NULL, sSpriteAffineAnimTable, SpriteCallbackDummy +}; + +void InitBerryPouch(u8 type, void (*savedCallback)(void), u8 allowSelect) +{ + u8 i; + + sResources = Alloc(sizeof(struct BerryPouchStruct_203F36C)); + if (sResources == NULL) + { + SetMainCallback2(savedCallback); + } + else + { + if (type != BERRYPOUCH_NA) + sStaticCnt.type = type; + if (allowSelect != 0xFF) + sStaticCnt.allowSelect = allowSelect; + if (savedCallback != NULL) + sStaticCnt.savedCallback = savedCallback; + sResources->exitCallback = NULL; + sResources->itemMenuIconId = 0; + sResources->indicatorTaskId = 0xFF; + for (i = 0; i < 4; i++) + sResources->data[i] = 0; + gTextFlags.autoScroll = FALSE; + gSpecialVar_ItemId = ITEM_NONE; + SetMainCallback2(CB2_InitBerryPouch); + } +} + +static void CB2_BerryPouchIdle(void) +{ + RunTasks(); + AnimateSprites(); + BuildOamBuffer(); + DoScheduledBgTilemapCopiesToVram(); + UpdatePaletteFade(); +} + +static void VBlankCB_BerryPouchIdle(void) +{ + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); +} + +static void CB2_InitBerryPouch(void) +{ + while (1) + { + if (sub_80BF72C() == TRUE) + break; + if (RunBerryPouchInit() == TRUE) + break; + if (MenuHelpers_LinkSomething() == TRUE) + break; + } +} + +static bool8 RunBerryPouchInit(void) +{ + u8 taskId; + + switch (gMain.state) + { + case 0: + SetVBlankHBlankCallbacksToNull(); + ClearScheduledBgCopiesToVram(); + gMain.state++; + break; + case 1: + ScanlineEffect_Stop(); + gMain.state++; + break; + case 2: + FreeAllSpritePalettes(); + gMain.state++; + break; + case 3: + ResetPaletteFade(); + gMain.state++; + break; + case 4: + ResetSpriteData(); + gMain.state++; + break; + case 5: + ResetItemMenuIconState(); + gMain.state++; + break; + case 6: + if (!MenuHelpers_LinkSomething()) + ResetTasks(); + gMain.state++; + break; + case 7: + BerryPouchInitBgs(); + sResources->data[0] = 0; + gMain.state++; + break; + case 8: + if (BerryPouchLoadGfx()) + gMain.state++; + break; + case 9: + BerryPouchInitWindows(); + gMain.state++; + break; + case 10: + SortAndCountBerries(); + SanitizeListMenuSelectionParams(); + UpdateListMenuScrollOffset(); + gMain.state++; + break; + case 11: + if (!AllocateListMenuBuffers()) + { + AbortBerryPouchLoading(); + return TRUE; + } + gMain.state++; + break; + case 12: + SetUpListMenuTemplate(); + gMain.state++; + break; + case 13: + PrintBerryPouchHeaderCentered(); + gMain.state++; + break; + case 14: + taskId = CreateTask(Task_BerryPouchMain, 0); + gTasks[taskId].data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sStaticCnt.listMenuScrollOffset, sStaticCnt.listMenuSelectedRow); + gTasks[taskId].data[8] = 0; + gMain.state++; + break; + case 15: + CreateBerryPouchSprite(); + gMain.state++; + break; + case 16: + CreateScrollIndicatorArrows_BerryPouchList(); + gMain.state++; + break; + case 17: + BlendPalettes(0xFFFFFFFF, 16, RGB_BLACK); + gMain.state++; + break; + case 18: + BeginNormalPaletteFade(0xFFFFFFFF, -2, 16, 0, RGB_BLACK); + gMain.state++; + break; + default: + SetVBlankCallback(VBlankCB_BerryPouchIdle); + SetMainCallback2(CB2_BerryPouchIdle); + return TRUE; + } + + return FALSE; +} + +static void AbortBerryPouchLoading(void) +{ + BeginNormalPaletteFade(0xFFFFFFFF, -2, 0, 16, RGB_BLACK); + CreateTask(Task_AbortBerryPouchLoading_WaitFade, 0); + SetVBlankCallback(VBlankCB_BerryPouchIdle); + SetMainCallback2(CB2_BerryPouchIdle); +} + +static void Task_AbortBerryPouchLoading_WaitFade(u8 taskId) +{ + if (!gPaletteFade.active) + { + SetMainCallback2(sStaticCnt.savedCallback); + BerryPouch_DestroyResources(); + DestroyTask(taskId); + } +} + +static void BerryPouchInitBgs(void) +{ + ResetAllBgsCoordinatesAndBgCntRegs(); + memset(sResources->bg1TilemapBuffer, 0, BG_SCREEN_SIZE); + ResetBgsAndClearDma3BusyFlags(FALSE); + InitBgsFromTemplates(0, sBgTemplates, NELEMS(sBgTemplates)); + SetBgTilemapBuffer(1, sResources->bg1TilemapBuffer); + ScheduleBgCopyTilemapToVram(1); + SetGpuReg(REG_OFFSET_BLDCNT, 0); + SetGpuReg(REG_OFFSET_DISPCNT, DISPCNT_MODE_0 | DISPCNT_OBJ_1D_MAP | DISPCNT_OBJ_ON); + ShowBg(0); + ShowBg(1); + ShowBg(2); +} + +static bool8 BerryPouchLoadGfx(void) +{ + switch (sResources->data[0]) + { + case 0: + ResetTempTileDataBuffers(); + DecompressAndCopyTileDataToVram(1, gBerryPouchBgGfx, 0, 0, 0); + sResources->data[0]++; + break; + case 1: + if (FreeTempTileDataBuffersIfPossible() != TRUE) + { + LZDecompressWram(gBerryPouchBg1Tilemap, sResources->bg1TilemapBuffer); + sResources->data[0]++; + } + break; + case 2: + LoadCompressedPalette(gBerryPouchBgPals, 0, 0x60); + if (gSaveBlock2Ptr->playerGender != MALE) + LoadCompressedPalette(gBerryPouchBgPal0FemaleOverride, 0, 0x20); + sResources->data[0]++; + break; + case 3: + LoadCompressedSpriteSheet(&sBerryPouchSpriteSheet); + sResources->data[0]++; + break; + default: + LoadCompressedSpritePalette(&sBerryPouchSpritePal); + sResources->data[0] = 0; + return TRUE; + } + + return FALSE; +} + +static bool8 AllocateListMenuBuffers(void) +{ + sListMenuItems = Alloc(NUM_BERRIES * sizeof(struct ListMenuItem)); + if (sListMenuItems == NULL) + return FALSE; + sListMenuStrbuf = Alloc(sResources->listMenuNumItems * 27); + if (sListMenuStrbuf == NULL) + return FALSE; + return TRUE; +} + +static void SetUpListMenuTemplate(void) +{ + u16 i; + struct BagPocket *pocket = &gBagPockets[POCKET_BERRY_POUCH - 1]; + for (i = 0; i < sResources->listMenuNumItems; i++) + { + GetBerryNameAndIndexForMenu(&sListMenuStrbuf[i * 27], pocket->itemSlots[i].itemId); + sListMenuItems[i].label = &sListMenuStrbuf[i * 27]; + sListMenuItems[i].index = i; + } + sListMenuItems[i].label = gText_Close; + sListMenuItems[i].index = i; + gMultiuseListMenuTemplate.items = sListMenuItems; + if (sStaticCnt.type != BERRYPOUCH_FROMBERRYCRUSH) + gMultiuseListMenuTemplate.totalItems = sResources->listMenuNumItems + 1; + else + gMultiuseListMenuTemplate.totalItems = sResources->listMenuNumItems; + gMultiuseListMenuTemplate.windowId = 0; + gMultiuseListMenuTemplate.header_X = 0; + gMultiuseListMenuTemplate.item_X = 9; + gMultiuseListMenuTemplate.cursor_X = 1; + gMultiuseListMenuTemplate.lettersSpacing = 0; + gMultiuseListMenuTemplate.itemVerticalPadding = 2; + gMultiuseListMenuTemplate.upText_Y = 2; + gMultiuseListMenuTemplate.maxShowed = sResources->listMenuMaxShowed; + gMultiuseListMenuTemplate.fontId = 2; + gMultiuseListMenuTemplate.cursorPal = 2; + gMultiuseListMenuTemplate.fillValue = 0; + gMultiuseListMenuTemplate.cursorShadowPal = 3; + gMultiuseListMenuTemplate.moveCursorFunc = BerryPouchMoveCursorFunc; + gMultiuseListMenuTemplate.itemPrintFunc = BerryPouchItemPrintFunc; + gMultiuseListMenuTemplate.cursorKind = 0; + gMultiuseListMenuTemplate.scrollMultiple = 0; +} + +static void GetBerryNameAndIndexForMenu(u8 * dest, u16 itemId) +{ + StringCopy(gStringVar4, gText_FontSize0); + StringAppend(gStringVar4, gOtherText_UnkF9_08_Clear_01); + ConvertIntToDecimalStringN(gStringVar1, itemId - FIRST_BERRY_INDEX + 1, STR_CONV_MODE_LEADING_ZEROS, 2); + StringAppend(gStringVar4, gStringVar1); + CopyItemName(itemId, gStringVar1); + StringAppend(gStringVar4, sText_Space); + StringAppend(gStringVar4, gText_FontSize2); + StringAppend(gStringVar4, gStringVar1); + StringCopy(dest, gStringVar4); +} + +static void CopySelectedListMenuItemName(s16 itemIdx, u8 * dest) +{ + StringCopy(dest, &sListMenuStrbuf[itemIdx * 27]); +} + +static void BerryPouchMoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list) +{ + if (onInit != TRUE) + { + PlaySE(SE_W287B); + StartBerryPouchSpriteWobbleAnim(); + } + DestroyItemMenuIcon(sResources->itemMenuIconId ^ 1); + if (sResources->listMenuNumItems != itemIndex) + sub_80989A0(BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, itemIndex), sResources->itemMenuIconId); + else + sub_80989A0(ITEM_N_A, sResources->itemMenuIconId); + sResources->itemMenuIconId ^= 1; + PrintSelectedBerryDescription(itemIndex); +} + +static void BerryPouchItemPrintFunc(u8 windowId, s32 itemId, u8 y) +{ + u16 unused; + u16 itemQuantity; + if (itemId != -2 && sResources->listMenuNumItems != itemId) + { + unused = BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, itemId); + itemQuantity = BagGetQuantityByPocketPosition(POCKET_BERRY_POUCH, itemId); + ConvertIntToDecimalStringN(gStringVar1, itemQuantity, STR_CONV_MODE_RIGHT_ALIGN, 3); + StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); + BerryPouchPrint(windowId, 0, gStringVar4, 110, y, 0, 0, 0xFF, 1); + } +} + +static void BerryPouchSetArrowCursorFromListMenu(u8 taskId, u8 colorIdx) +{ + BerryPouchSetArrowCursorAt(ListMenuGetYCoordForPrintingArrowCursor(taskId), colorIdx); +} + +static void BerryPouchSetArrowCursorAt(u8 y, u8 colorIdx) +{ + u8 width; + u8 height; + if (colorIdx == 0xFF) + { + width = GetMenuCursorDimensionByFont(2, 0); + height = GetMenuCursorDimensionByFont(2, 1); + FillWindowPixelRect(0, 0, 1, y, width, height); + CopyWindowToVram(0, 2); + } + else + { + BerryPouchPrint(0, 2, gFameCheckerText_ListMenuCursor, 1, y, 0, 0, 0, colorIdx); + } +} + +static void PrintSelectedBerryDescription(s32 itemIdx) +{ + const u8 * str; + if (itemIdx != sResources->listMenuNumItems) + str = ItemId_GetDescription(BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, itemIdx)); + else + str = gText_TheBerryPouchWillBePutAway; + FillWindowPixelBuffer(1, PIXEL_FILL(0)); + BerryPouchPrint(1, 2, str, 0, 2, 2, 0, 0, 0); +} + +static void SetDescriptionWindowBorderPalette(s32 pal) +{ + SetBgRectPal(1, 0, 16, 30, 4, pal + 1); + ScheduleBgCopyTilemapToVram(1); +} + +static void CreateScrollIndicatorArrows_BerryPouchList(void) +{ + if (sStaticCnt.type != BERRYPOUCH_FROMBERRYCRUSH) + sResources->indicatorTaskId = AddScrollIndicatorArrowPairParameterized(2, 160, 8, 120, sResources->listMenuNumItems - sResources->listMenuMaxShowed + 1, 110, 110, &sStaticCnt.listMenuScrollOffset); + else + sResources->indicatorTaskId = AddScrollIndicatorArrowPairParameterized(2, 160, 8, 120, sResources->listMenuNumItems - sResources->listMenuMaxShowed, 110, 110, &sStaticCnt.listMenuScrollOffset); +} + +static void CreateScrollIndicatorArrows_TossQuantity(void) +{ + sResources->indicatorOffset = 1; + sResources->indicatorTaskId = AddScrollIndicatorArrowPairParameterized(2, 212, 120, 152, 2, 110, 110, &sResources->indicatorOffset); +} + +static void CreateScrollIndicatorArrows_SellQuantity(void) +{ + sResources->indicatorOffset = 1; + sResources->indicatorTaskId = AddScrollIndicatorArrowPairParameterized(2, 152, 72, 104, 2, 110, 110, &sResources->indicatorOffset); +} + +static void DestroyScrollIndicatorArrows(void) +{ + if (sResources->indicatorTaskId != 0xFF) + { + RemoveScrollIndicatorArrowPair(sResources->indicatorTaskId); + sResources->indicatorTaskId = 0xFF; + } +} + +static void PrintBerryPouchHeaderCentered(void) +{ + u32 slack = 72 - GetStringWidth(1, gText_BerryPouch, 0); + BerryPouchPrint(2, 1, gText_BerryPouch, slack / 2, 1, 0, 0, 0, 0); +} + +void BerryPouch_CursorResetToTop(void) +{ + sStaticCnt.listMenuSelectedRow = 0; + sStaticCnt.listMenuScrollOffset = 0; +} + +static void SanitizeListMenuSelectionParams(void) +{ + s32 r2; + if (sStaticCnt.type != BERRYPOUCH_FROMBERRYCRUSH) + r2 = sResources->listMenuNumItems + 1; + else + r2 = sResources->listMenuNumItems; + if (sStaticCnt.listMenuScrollOffset != 0 && sStaticCnt.listMenuScrollOffset + sResources->listMenuMaxShowed > r2) + sStaticCnt.listMenuScrollOffset = r2 - sResources->listMenuMaxShowed; + if (sStaticCnt.listMenuScrollOffset + sStaticCnt.listMenuSelectedRow >= r2) + { + if (r2 == 0 || r2 == 1) + sStaticCnt.listMenuSelectedRow = 0; + else + sStaticCnt.listMenuSelectedRow = r2 - 1; + } +} + +static void UpdateListMenuScrollOffset(void) +{ + u8 lim; + u8 i; + if (sStaticCnt.type != BERRYPOUCH_FROMBERRYCRUSH) + lim = sResources->listMenuNumItems + 1; + else + lim = sResources->listMenuNumItems; + if (sStaticCnt.listMenuSelectedRow > 4) + { + for (i = 0; i <= sStaticCnt.listMenuSelectedRow - 4; sStaticCnt.listMenuSelectedRow--, sStaticCnt.listMenuScrollOffset++, i++) + { + if (sStaticCnt.listMenuScrollOffset + sResources->listMenuMaxShowed == lim) + break; + } + } +} + +static void BerryPouch_DestroyResources(void) +{ + if (sResources != NULL) + Free(sResources); + if (sListMenuItems != NULL) + Free(sListMenuItems); + if (sListMenuStrbuf != NULL) + Free(sListMenuStrbuf); + FreeAllWindowBuffers(); +} + +void BerryPouch_StartFadeToExitCallback(u8 taskId) +{ + BeginNormalPaletteFade(0xFFFFFFFF, -2, 0, 16, RGB_BLACK); + gTasks[taskId].func = Task_BerryPouchFadeToExitCallback; +} + +static void Task_BerryPouchFadeToExitCallback(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + if (!gPaletteFade.active) + { + DestroyListMenuTask(data[0], &sStaticCnt.listMenuScrollOffset, &sStaticCnt.listMenuSelectedRow); + if (sResources->exitCallback != NULL) + SetMainCallback2(sResources->exitCallback); + else + SetMainCallback2(sStaticCnt.savedCallback); + DestroyScrollIndicatorArrows(); + BerryPouch_DestroyResources(); + DestroyTask(taskId); + } +} + +static void SortAndCountBerries(void) +{ + u16 i; + u32 r2; + struct BagPocket *pocket = &gBagPockets[POCKET_BERRY_POUCH - 1]; + SortAndCompactBagPocket(pocket); + sResources->listMenuNumItems = 0; + for (i = 0; i < pocket->capacity; i++) + { + if (pocket->itemSlots[i].itemId == ITEM_NONE) + break; + sResources->listMenuNumItems++; + } + if (sStaticCnt.type != BERRYPOUCH_FROMBERRYCRUSH) + r2 = sResources->listMenuNumItems + 1; + else + r2 = sResources->listMenuNumItems; + if (r2 > 7) + sResources->listMenuMaxShowed = 7; + else + sResources->listMenuMaxShowed = r2; +} + +void BerryPouch_SetExitCallback(void (*callback)(void)) +{ + sResources->exitCallback = callback; +} + +void InitTossQuantitySelectUI(u8 taskId, const u8 * str) +{ + s16 * data = gTasks[taskId].data; + u8 windowId = GetOrCreateVariableWindow(8); + u8 windowId2; + CopySelectedListMenuItemName(data[1], gStringVar1); + StringExpandPlaceholders(gStringVar4, str); + BerryPouchPrint(windowId, 2, gStringVar4, 0, 2, 1, 2, 0, 1); + windowId2 = GetOrCreateVariableWindow(0); + ConvertIntToDecimalStringN(gStringVar1, 1, STR_CONV_MODE_LEADING_ZEROS, 3); + StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); + BerryPouchPrint(windowId2, 0, gStringVar4, 4, 10, 1, 0, 0, 1); +} + +static void PrintxQuantityOnWindow(u8 whichWindow, s16 quantity, u8 ndigits) +{ + u8 windowId = GetVariableWindowId(whichWindow); + FillWindowPixelBuffer(windowId, PIXEL_FILL(1)); + ConvertIntToDecimalStringN(gStringVar1, quantity, STR_CONV_MODE_LEADING_ZEROS, ndigits); + StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); + BerryPouchPrint(windowId, 0, gStringVar4, 4, 10, 1, 0, 0, 1); +} + +static void Task_BerryPouchMain(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + s32 menuInput; + if (!gPaletteFade.active && sub_80BF72C() != TRUE) + { + menuInput = ListMenu_ProcessInput(data[0]); + ListMenuGetScrollAndRow(data[0], &sStaticCnt.listMenuScrollOffset, &sStaticCnt.listMenuSelectedRow); + if (JOY_NEW(SELECT_BUTTON) && sStaticCnt.allowSelect == 1) + { + PlaySE(SE_SELECT); + gSpecialVar_ItemId = 0; + BerryPouch_StartFadeToExitCallback(taskId); + } + else + { + switch (menuInput) + { + case -1: + return; + case -2: + if (sStaticCnt.type != BERRYPOUCH_FROMBERRYCRUSH) + { + PlaySE(SE_SELECT); + gSpecialVar_ItemId = 0; + BerryPouch_StartFadeToExitCallback(taskId); + } + break; + default: + PlaySE(SE_SELECT); + if (sStaticCnt.type == BERRYPOUCH_FROMBERRYCRUSH) + { + gSpecialVar_ItemId = BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, menuInput); + BerryPouch_StartFadeToExitCallback(taskId); + } + else if (menuInput == sResources->listMenuNumItems) + { + gSpecialVar_ItemId = 0; + BerryPouch_StartFadeToExitCallback(taskId); + } + else + { + DestroyScrollIndicatorArrows(); + SetDescriptionWindowBorderPalette(1); + BerryPouchSetArrowCursorFromListMenu(data[0], 2); + data[1] = menuInput; + data[2] = BagGetQuantityByPocketPosition(POCKET_BERRY_POUCH, menuInput); + gSpecialVar_ItemId = BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, menuInput); + gTasks[taskId].func = sBerryPouchContextMenuTasks[sStaticCnt.type]; + } + break; + } + } + } +} + +static void Task_CleanUpAndReturnToMain(u8 taskId) +{ + SetDescriptionWindowBorderPalette(0); + CreateScrollIndicatorArrows_BerryPouchList(); + gTasks[taskId].func = Task_BerryPouchMain; +} + +static void CreateNormalContextMenu(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + u8 windowId; + u8 windowId2; + + if (sStaticCnt.type == BERRYPOUCH_FROMBATTLE) + { + sContextMenuOptions = sOptions_UseToss_Exit; + sContextMenuNumOptions = 3; + } + else if (MenuHelpers_LinkSomething() == TRUE || InUnionRoom() == TRUE) + { + if (!itemid_link_can_give_berry(gSpecialVar_ItemId)) + { + sContextMenuOptions = sOptions_Exit; + sContextMenuNumOptions = 1; + } + else + { + sContextMenuOptions = sOptions_GiveExit; + sContextMenuNumOptions = 2; + } + } + else + { + sContextMenuOptions = sOptions_UseGiveTossExit; + sContextMenuNumOptions = 4; + } + windowId = GetOrCreateVariableWindow(sContextMenuNumOptions + 9); + AddItemMenuActionTextPrinters(windowId, 2, GetMenuCursorDimensionByFont(2, 0), 2, GetFontAttribute(2, FONTATTR_LETTER_SPACING), GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT) + 2, sContextMenuNumOptions, sContextMenuActions, sContextMenuOptions); + Menu_InitCursor(windowId, 2, 0, 2, GetFontAttribute(2, FONTATTR_MAX_LETTER_HEIGHT) + 2, sContextMenuNumOptions, 0); + windowId2 = GetOrCreateVariableWindow(6); + CopySelectedListMenuItemName(data[1], gStringVar1); + StringExpandPlaceholders(gStringVar4, gOtherText_StrVar1); + BerryPouchPrint(windowId2, 2, gStringVar4, 0, 2, 1, 2, 0, 1); +} + +static void Task_NormalContextMenu(u8 taskId) +{ + CreateNormalContextMenu(taskId); + gTasks[taskId].func = Task_NormalContextMenu_HandleInput; +} + +static void Task_NormalContextMenu_HandleInput(u8 taskId) +{ + s8 input; + if (sub_80BF72C() != TRUE) + { + input = Menu_ProcessInputNoWrapAround(); + switch (input) + { + case -2: + break; + case -1: + PlaySE(SE_SELECT); + sContextMenuActions[BP_ACTION_EXIT].func.void_u8(taskId); + break; + default: + PlaySE(SE_SELECT); + sContextMenuActions[sContextMenuOptions[input]].func.void_u8(taskId); + break; + } + } +} + +static void Task_BerryPouch_Use(u8 taskId) +{ + DestroyVariableWindow(sContextMenuNumOptions + 9); + DestroyVariableWindow(6); + PutWindowTilemap(0); + PutWindowTilemap(1); + ScheduleBgCopyTilemapToVram(0); + ScheduleBgCopyTilemapToVram(2); + if (sStaticCnt.type == BERRYPOUCH_FROMBATTLE) + { + if (ItemId_GetBattleFunc(gSpecialVar_ItemId) == NULL) + FieldUseFunc_OakStopsYou(taskId); + else + ItemId_GetBattleFunc(gSpecialVar_ItemId)(taskId); + } + else if (CalculatePlayerPartyCount() == 0 && ItemId_GetType(gSpecialVar_ItemId) == 1) + Task_Give_PrintThereIsNoPokemon(taskId); + else + ItemId_GetFieldFunc(gSpecialVar_ItemId)(taskId); +} + +static void Task_BerryPouch_Toss(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + ClearWindowTilemap(GetVariableWindowId(sContextMenuNumOptions + 9)); + ClearWindowTilemap(GetVariableWindowId(6)); + DestroyVariableWindow(sContextMenuNumOptions + 9); + DestroyVariableWindow(6); + PutWindowTilemap(0); + data[8] = 1; + if (data[2] == 1) + Task_AskTossMultiple(taskId); + else + { + InitTossQuantitySelectUI(taskId, gText_TossOutHowManyStrVar1s); + CreateScrollIndicatorArrows_TossQuantity(); + gTasks[taskId].func = Task_Toss_SelectMultiple; + } +} + +static void Task_AskTossMultiple(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3); + StringExpandPlaceholders(gStringVar4, gText_ThrowAwayStrVar2OfThisItemQM); + BerryPouchPrint(GetOrCreateVariableWindow(7), 2, gStringVar4, 0, 2, 1, 2, 0, 1); + CreateYesNoMenuWin3(taskId, &sYesNoFuncs_Toss); +} + +static void Task_TossNo(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + DestroyVariableWindow(7); + PutWindowTilemap(1); + PutWindowTilemap(0); + ScheduleBgCopyTilemapToVram(0); + ScheduleBgCopyTilemapToVram(2); + BerryPouchSetArrowCursorFromListMenu(data[0], 1); + Task_CleanUpAndReturnToMain(taskId); +} + +static void Task_Toss_SelectMultiple(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE) + PrintxQuantityOnWindow(0, data[8], 3); + else if (JOY_NEW(A_BUTTON)) + { + PlaySE(SE_SELECT); + ClearWindowTilemap(GetVariableWindowId(8)); + DestroyVariableWindow(8); + DestroyVariableWindow(0); + ScheduleBgCopyTilemapToVram(0); + ScheduleBgCopyTilemapToVram(2); + DestroyScrollIndicatorArrows(); + Task_AskTossMultiple(taskId); + } + else if (JOY_NEW(B_BUTTON)) + { + PlaySE(SE_SELECT); + DestroyVariableWindow(8); + DestroyVariableWindow(0); + PutWindowTilemap(0); + PutWindowTilemap(1); + ScheduleBgCopyTilemapToVram(0); + ScheduleBgCopyTilemapToVram(2); + BerryPouchSetArrowCursorFromListMenu(data[0], 1); + DestroyScrollIndicatorArrows(); + Task_CleanUpAndReturnToMain(taskId); + } +} + +static void Task_TossYes(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + DestroyVariableWindow(7); + CopySelectedListMenuItemName(data[1], gStringVar1); + ConvertIntToDecimalStringN(gStringVar2, data[8], STR_CONV_MODE_LEFT_ALIGN, 3); + StringExpandPlaceholders(gStringVar4, gText_ThrewAwayStrVar2StrVar1s); + BerryPouchPrint(GetOrCreateVariableWindow(9), 2, gStringVar4, 0, 2, 1, 2, 0, 1); + gTasks[taskId].func = Task_WaitButtonThenTossBerries; +} + +static void Task_WaitButtonThenTossBerries(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) + { + PlaySE(SE_SELECT); + RemoveBagItem(gSpecialVar_ItemId, data[8]); + DestroyVariableWindow(9); + DestroyListMenuTask(data[0], &sStaticCnt.listMenuScrollOffset, &sStaticCnt.listMenuSelectedRow); + SortAndCountBerries(); + SanitizeListMenuSelectionParams(); + SetUpListMenuTemplate(); + data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sStaticCnt.listMenuScrollOffset, sStaticCnt.listMenuSelectedRow); + PutWindowTilemap(1); + ScheduleBgCopyTilemapToVram(0); + BerryPouchSetArrowCursorFromListMenu(data[0], 1); + Task_CleanUpAndReturnToMain(taskId); + } +} + +static void Task_BerryPouch_Give(u8 taskId) +{ + DestroyVariableWindow(sContextMenuNumOptions + 9); + DestroyVariableWindow(6); + PutWindowTilemap(0); + PutWindowTilemap(1); + ScheduleBgCopyTilemapToVram(0); + ScheduleBgCopyTilemapToVram(2); + if (CalculatePlayerPartyCount() == 0) + Task_Give_PrintThereIsNoPokemon(taskId); + else + { + sResources->exitCallback = sub_8126EDC; + gTasks[taskId].func = BerryPouch_StartFadeToExitCallback; + } +} + +static void Task_Give_PrintThereIsNoPokemon(u8 taskId) +{ + DisplayItemMessageInBerryPouch(taskId, 2, gText_ThereIsNoPokemon, Task_WaitButtonBeforeDialogueWindowDestruction); +} + +static void Task_WaitButtonBeforeDialogueWindowDestruction(u8 taskId) +{ + if (JOY_NEW(A_BUTTON)) + { + PlaySE(SE_SELECT); + Task_BerryPouch_DestroyDialogueWindowAndRefreshListMenu(taskId); + } +} + +void Task_BerryPouch_DestroyDialogueWindowAndRefreshListMenu(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + TryDestroyVariableWindow(5); + DestroyListMenuTask(data[0], &sStaticCnt.listMenuScrollOffset, &sStaticCnt.listMenuSelectedRow); + SortAndCountBerries(); + SanitizeListMenuSelectionParams(); + SetUpListMenuTemplate(); + data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sStaticCnt.listMenuScrollOffset, sStaticCnt.listMenuSelectedRow); + ScheduleBgCopyTilemapToVram(0); + BerryPouchSetArrowCursorFromListMenu(data[0], 1); + Task_CleanUpAndReturnToMain(taskId); +} + +static void Task_BerryPouch_Exit(u8 taskId) +{ + DestroyVariableWindow(sContextMenuNumOptions + 9); + DestroyVariableWindow(6); + PutWindowTilemap(0); + PutWindowTilemap(1); + ScheduleBgCopyTilemapToVram(0); + ScheduleBgCopyTilemapToVram(2); + BerryPouchSetArrowCursorFromListMenu(gTasks[taskId].data[0], 1); + Task_CleanUpAndReturnToMain(taskId); +} + +static void Task_ContextMenu_FromPartyGiveMenu(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + u16 itemId = BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, data[1]); + if (!itemid_link_can_give_berry(itemId)) + { + CopyItemName(itemId, gStringVar1); + StringExpandPlaceholders(gStringVar4, gText_TheStrVar1CantBeHeldHere); + DisplayItemMessageInBerryPouch(taskId, 2, gStringVar4, Task_WaitButtonBeforeDialogueWindowDestruction); + } + else + { + sResources->exitCallback = c2_8123744; + gTasks[taskId].func = BerryPouch_StartFadeToExitCallback; + } +} + +static void Task_ContextMenu_FromPokemonPC(u8 taskId) +{ + sResources->exitCallback = sub_808CE60; + gTasks[taskId].func = BerryPouch_StartFadeToExitCallback; +} + +static void Task_ContextMenu_Sell(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + if (itemid_get_market_price(gSpecialVar_ItemId) == 0) + { + CopyItemName(gSpecialVar_ItemId, gStringVar1); + StringExpandPlaceholders(gStringVar4, gText_OhNoICantBuyThat); + DisplayItemMessageInBerryPouch(taskId, sub_80BF8E4(), gStringVar4, Task_BerryPouch_DestroyDialogueWindowAndRefreshListMenu); + } + else + { + data[8] = 1; + if (data[2] == 1) + { + PrintMoneyInWin2(); + Task_AskSellMultiple(taskId); + } + else + { + if (data[2] > 99) + data[2] = 99; + CopyItemName(gSpecialVar_ItemId, gStringVar1); + StringExpandPlaceholders(gStringVar4, gText_HowManyWouldYouLikeToSell); + DisplayItemMessageInBerryPouch(taskId, sub_80BF8E4(), gStringVar4, Task_Sell_PrintSelectMultipleUI); + } + } +} + +static void Task_AskSellMultiple(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + ConvertIntToDecimalStringN(gStringVar3, itemid_get_market_price(BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, data[1])) / 2 * data[8], STR_CONV_MODE_LEFT_ALIGN, 6); + StringExpandPlaceholders(gStringVar4, gText_ICanPayThisMuch_WouldThatBeOkay); + DisplayItemMessageInBerryPouch(taskId, sub_80BF8E4(), gStringVar4, Task_SellMultiple_CreateYesNoMenu); +} + +static void Task_SellMultiple_CreateYesNoMenu(u8 taskId) +{ + CreateYesNoMenuWin4(taskId, &sYesNoFuncs_Sell); +} + +static void Task_SellNo(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + DestroyVariableWindow(2); + TryDestroyVariableWindow(5); + PutWindowTilemap(2); + PutWindowTilemap(0); + PutWindowTilemap(1); + ScheduleBgCopyTilemapToVram(0); + BerryPouchSetArrowCursorFromListMenu(data[0], 1); + Task_CleanUpAndReturnToMain(taskId); +} + +static void Task_Sell_PrintSelectMultipleUI(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + u8 windowId = GetOrCreateVariableWindow(1); + ConvertIntToDecimalStringN(gStringVar1, 1, STR_CONV_MODE_LEADING_ZEROS, 2); + StringExpandPlaceholders(gStringVar4, gText_TimesStrVar1); + BerryPouchPrint(windowId, 0, gStringVar4, 4, 10, 1, 0, 0xFF, 1); + SellMultiple_UpdateSellPriceDisplay(itemid_get_market_price(BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, data[1])) / 2 * data[8]); + PrintMoneyInWin2(); + CreateScrollIndicatorArrows_SellQuantity(); + gTasks[taskId].func = Task_Sell_SelectMultiple; +} + +static void SellMultiple_UpdateSellPriceDisplay(s32 price) +{ + PrintMoneyAmount(GetVariableWindowId(1), 56, 10, price, 0); +} + +static void Task_Sell_SelectMultiple(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + if (AdjustQuantityAccordingToDPadInput(&data[8], data[2]) == TRUE) + { + PrintxQuantityOnWindow(1, data[8], 2); + SellMultiple_UpdateSellPriceDisplay(itemid_get_market_price(BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, data[1])) / 2 * data[8]); + } + else if (JOY_NEW(A_BUTTON)) + { + PlaySE(SE_SELECT); + DestroyVariableWindow(1); + PutWindowTilemap(0); + ScheduleBgCopyTilemapToVram(0); + DestroyScrollIndicatorArrows(); + Task_AskSellMultiple(taskId); + } + else if (JOY_NEW(B_BUTTON)) + { + PlaySE(SE_SELECT); + DestroyVariableWindow(1); + DestroyVariableWindow(2); + TryDestroyVariableWindow(5); + PutWindowTilemap(2); + PutWindowTilemap(0); + PutWindowTilemap(1); + ScheduleBgCopyTilemapToVram(0); + DestroyScrollIndicatorArrows(); + BerryPouchSetArrowCursorFromListMenu(data[0], 1); + Task_CleanUpAndReturnToMain(taskId); + } +} + +static void Task_SellYes(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + PutWindowTilemap(0); + ScheduleBgCopyTilemapToVram(0); + CopyItemName(gSpecialVar_ItemId, gStringVar1); + ConvertIntToDecimalStringN(gStringVar3, itemid_get_market_price(BagGetItemIdByPocketPosition(POCKET_BERRY_POUCH, data[1])) / 2 * data[8], STR_CONV_MODE_LEFT_ALIGN, 6); + StringExpandPlaceholders(gStringVar4, gText_TurnedOverItemsWorthYen); + DisplayItemMessageInBerryPouch(taskId, 2, gStringVar4, Task_SellBerries_PlaySfxAndRemoveBerries); +} + +static void Task_SellBerries_PlaySfxAndRemoveBerries(u8 taskId) +{ + s16 * data = gTasks[taskId].data; + PlaySE(SE_CASHIER); + RemoveBagItem(gSpecialVar_ItemId, data[8]); + AddMoney(&gSaveBlock1Ptr->money, itemid_get_market_price(gSpecialVar_ItemId) / 2 * data[8]); + sub_809C09C(gSpecialVar_ItemId, data[8], 2); + DestroyListMenuTask(data[0], &sStaticCnt.listMenuScrollOffset, &sStaticCnt.listMenuSelectedRow); + SortAndCountBerries(); + SanitizeListMenuSelectionParams(); + SetUpListMenuTemplate(); + data[0] = ListMenuInit(&gMultiuseListMenuTemplate, sStaticCnt.listMenuScrollOffset, sStaticCnt.listMenuSelectedRow); + BerryPouchSetArrowCursorFromListMenu(data[0], 2); + PrintMoneyAmountInMoneyBox(GetVariableWindowId(2), GetMoney(&gSaveBlock1Ptr->money), 0); + gTasks[taskId].func = Task_SellBerries_WaitButton; +} + +static void Task_SellBerries_WaitButton(u8 taskId) +{ + if (JOY_NEW(A_BUTTON) || JOY_NEW(B_BUTTON)) + { + PlaySE(SE_SELECT); + DestroyVariableWindow(2); + PutWindowTilemap(2); + Task_BerryPouch_DestroyDialogueWindowAndRefreshListMenu(taskId); + } +} + +static void BerryPouchInitWindows(void) +{ + u8 i; + InitWindows(sWindowTemplates_Main); + DeactivateAllTextPrinters(); + TextWindow_SetUserSelectedFrame(0, 0x001, 0xE0); + TextWindow_LoadResourcesStdFrame0(0, 0x013, 0xD0); + TextWindow_SetStdFrame0_WithPal(0, 0x00A, 0xC0); + LoadPalette(gTMCaseMainWindowPalette, 0xF0, 0x20); + for (i = 0; i < 3; i++) + FillWindowPixelBuffer(i, PIXEL_FILL(0)); + PutWindowTilemap(0); + PutWindowTilemap(1); + PutWindowTilemap(2); + ScheduleBgCopyTilemapToVram(0); + ScheduleBgCopyTilemapToVram(2); + for (i = 0; i < 14; i++) + sVariableWindowIds[i] = 0xFF; +} + +static void BerryPouchPrint(u8 windowId, u8 fontId, const u8 * str, u8 x, u8 y, u8 letterSpacing, u8 lineSpacing, u8 speed, u8 colorIdx) +{ + AddTextPrinterParameterized4(windowId, fontId, x, y, letterSpacing, lineSpacing, sTextColors[colorIdx], speed, str); +} + +static u8 GetOrCreateVariableWindow(u8 winIdx) +{ + u8 retval = sVariableWindowIds[winIdx]; + if (retval == 0xFF) + { + sVariableWindowIds[winIdx] = AddWindow(&sWindowTemplates_Variable[winIdx]); + if (winIdx == 2 || winIdx == 6 || winIdx == 7 || winIdx == 8 || winIdx == 9) + DrawStdFrameWithCustomTileAndPalette(sVariableWindowIds[winIdx], FALSE, 0x00A, 0xC); + else + DrawStdFrameWithCustomTileAndPalette(sVariableWindowIds[winIdx], FALSE, 0x001, 0xE); + ScheduleBgCopyTilemapToVram(2); + retval = sVariableWindowIds[winIdx]; + } + return retval; +} + +static void VariableWindowSetAltFrameTileAndPalette(u8 winIdx) +{ + DrawStdFrameWithCustomTileAndPalette(sVariableWindowIds[winIdx], FALSE, 0x001, 0xE); +} + +static void DestroyVariableWindow(u8 winIdx) +{ + ClearStdWindowAndFrameToTransparent(sVariableWindowIds[winIdx], FALSE); + ClearWindowTilemap(sVariableWindowIds[winIdx]); + RemoveWindow(sVariableWindowIds[winIdx]); + ScheduleBgCopyTilemapToVram(2); + sVariableWindowIds[winIdx] = 0xFF; +} + +static void TryDestroyVariableWindow(u8 winIdx) +{ + if (sVariableWindowIds[winIdx] != 0xFF) + { + ClearDialogWindowAndFrameToTransparent(sVariableWindowIds[winIdx], FALSE); + ClearWindowTilemap(sVariableWindowIds[winIdx]); + RemoveWindow(sVariableWindowIds[winIdx]); + PutWindowTilemap(1); + ScheduleBgCopyTilemapToVram(0); + ScheduleBgCopyTilemapToVram(2); + sVariableWindowIds[winIdx] = 0xFF; + } +} + +static u8 GetVariableWindowId(u8 winIdx) +{ + return sVariableWindowIds[winIdx]; +} + +void DisplayItemMessageInBerryPouch(u8 taskId, u8 fontId, const u8 * str, TaskFunc followUpFunc) +{ + if (sVariableWindowIds[5] == 0xFF) + sVariableWindowIds[5] = AddWindow(&sWindowTemplates_Variable[5]); + DisplayMessageAndContinueTask(taskId, sVariableWindowIds[5], 0x013, 0xD, fontId, GetTextSpeedSetting(), str, followUpFunc); + ScheduleBgCopyTilemapToVram(2); +} + +static void CreateYesNoMenuWin3(u8 taskId, const struct YesNoFuncTable *ptrs) +{ + CreateYesNoMenuWithCallbacks(taskId, &sWindowTemplates_Variable[3], 2, 0, 2, 0x001, 0xE, ptrs); +} + +static void CreateYesNoMenuWin4(u8 taskId, const struct YesNoFuncTable *ptrs) +{ + CreateYesNoMenuWithCallbacks(taskId, &sWindowTemplates_Variable[4], 2, 0, 2, 0x001, 0xE, ptrs); +} + +static void PrintMoneyInWin2(void) +{ + PrintMoneyAmountInMoneyBoxWithBorder(GetOrCreateVariableWindow(2), 0x00A, 0xC, GetMoney(&gSaveBlock1Ptr->money)); +} + +static void CreateBerryPouchSprite(void) +{ + sBerryPouchSpriteId = CreateSprite(&sSpriteTemplate_BerryPouch, 40, 76, 0); +} + +static void StartBerryPouchSpriteWobbleAnim(void) +{ + struct Sprite *sprite = &gSprites[sBerryPouchSpriteId]; + if (sprite->affineAnimEnded) + { + StartSpriteAffineAnim(sprite, 1); + sprite->callback = SpriteCB_BerryPouchWaitWobbleAnim; + } +} + +static void SpriteCB_BerryPouchWaitWobbleAnim(struct Sprite *sprite) +{ + if (sprite->affineAnimEnded) + { + StartSpriteAffineAnim(sprite, 0); + sprite->callback = SpriteCallbackDummy; + } +} diff --git a/src/item_use.c b/src/item_use.c index 3653a1699..5fa9390c1 100644 --- a/src/item_use.c +++ b/src/item_use.c @@ -435,7 +435,7 @@ void FieldUseFunc_BerryPouch(u8 taskId) void InitBerryPouchFromBag(void) { - InitBerryPouch(0, ReturnToBagFromKeyItem, 0); + InitBerryPouch(BERRYPOUCH_FROMFIELD, ReturnToBagFromKeyItem, 0); } void Task_InitBerryPouchFromField(u8 taskId) @@ -444,7 +444,7 @@ void Task_InitBerryPouchFromField(u8 taskId) { CleanupOverworldWindowsAndTilemaps(); sub_80A1184(); - InitBerryPouch(0, CB2_ReturnToField, 1); + InitBerryPouch(BERRYPOUCH_FROMFIELD, CB2_ReturnToField, 1); DestroyTask(taskId); } } @@ -457,7 +457,7 @@ void BattleUseFunc_BerryPouch(u8 taskId) void InitBerryPouchFromBattle(void) { - InitBerryPouch(4, sub_8107ECC, 0); + InitBerryPouch(BERRYPOUCH_FROMBATTLE, sub_8107ECC, 0); } void FieldUseFunc_TeachyTv(u8 taskId) @@ -852,7 +852,7 @@ void FieldUseFunc_OakStopsYou(u8 taskId) if (GetPocketByItemId(gSpecialVar_ItemId) == POCKET_BERRY_POUCH) { StringExpandPlaceholders(gStringVar4, gUnknown_8416425); - DisplayItemMessageInBerryPouch(taskId, 4, gStringVar4, sub_813E2B8); + DisplayItemMessageInBerryPouch(taskId, 4, gStringVar4, Task_BerryPouch_DestroyDialogueWindowAndRefreshListMenu); } else sub_80A1110(taskId, gTasks[taskId].data[3]); diff --git a/src/menu_helpers.c b/src/menu_helpers.c index fdcb9a56e..06e7bb08b 100644 --- a/src/menu_helpers.c +++ b/src/menu_helpers.c @@ -95,7 +95,7 @@ u8 sub_80BF66C(void) return 0; } -bool8 sub_80BF6A8(u16 itemId) +bool8 itemid_link_can_give_berry(u16 itemId) { if (itemId != ITEM_ENIGMA_BERRY) return TRUE; |