diff --git a/include/item_menu.h b/include/item_menu.h index 69c88efcb..9151dcb37 100644 --- a/include/item_menu.h +++ b/include/item_menu.h @@ -5,9 +5,15 @@ #include "task.h" #include "constants/item.h" -// Exported type declarations - -// Exported RAM declarations +#define ITEMMENU_SWAP_LINE_LENGTH 9 +// Indexes for gItemMenuIconSpriteIds +enum { + ITEMMENUSPRITE_BAG, + ITEMMENUSPRITE_SWAP_LINE, + ITEMMENUSPRITE_ITEM = ITEMMENUSPRITE_SWAP_LINE + ITEMMENU_SWAP_LINE_LENGTH, + ITEMMENUSPRITE_ITEM_ALT, + ITEMMENUSPRITE_COUNT +}; struct BagStruct { @@ -20,6 +26,7 @@ struct BagStruct }; extern struct BagStruct gBagMenuState; +extern u8 gItemMenuIconSpriteIds[ITEMMENUSPRITE_COUNT]; extern u16 gSpecialVar_ItemId; diff --git a/include/item_menu_icons.h b/include/item_menu_icons.h index d531cde92..a26fd680d 100644 --- a/include/item_menu_icons.h +++ b/include/item_menu_icons.h @@ -14,7 +14,7 @@ void AddBagItemIconSprite(u16 itemId, u8 id); void RemoveBagItemIconSprite(u8 id); void CreateItemMenuSwapLine(void); void SetItemMenuSwapLineInvisibility(bool8 invisible); -void UpdateItemMenuSwapLinePos(s16 x, u16 y); +void UpdateItemMenuSwapLinePos(u16 y); void ResetItemMenuIconState(void); void CreateBerryPouchItemIcon(u16 itemId, u8 id); diff --git a/include/menu_helpers.h b/include/menu_helpers.h index e8bfc8de3..ffe82daec 100644 --- a/include/menu_helpers.h +++ b/include/menu_helpers.h @@ -8,6 +8,15 @@ #define MENU_L_PRESSED 1 #define MENU_R_PRESSED 2 +#define SWAP_LINE_HAS_MARGIN (1 << 7) + +enum { + TAG_BAG_GFX = 100, + TAG_SWAP_LINE, + TAG_ITEM_ICON, + TAG_ITEM_ICON_ALT, +}; + struct YesNoFuncTable { TaskFunc yesFunc; @@ -30,5 +39,8 @@ u8 GetLRKeysPressedAndHeld(void); bool8 IsHoldingItemAllowed(u16 itemId); bool8 IsWritingMailAllowed(u16 itemId); void ResetVramOamAndBgCntRegs(void); +void CreateSwapLineSprites(u8 *spriteIds, u8 count); +void SetSwapLineSpritesInvisibility(u8 *spriteIds, u8 count, bool8 invisible); +void UpdateSwapLineSpritesPos(u8 *spriteIds, u8 count, s16 x, u16 y); #endif //GUARD_MENU_HELPERS_H diff --git a/include/strings.h b/include/strings.h index a355adf61..81606df14 100644 --- a/include/strings.h +++ b/include/strings.h @@ -1097,9 +1097,6 @@ extern const u8 gOtherText_Walk[]; extern const u8 gOtherText_Check[]; extern const u8 gOtherText_Open[]; extern const u8 gOtherText_Deselect[]; -extern const u8 gText_Items2[]; -extern const u8 gText_PokeBalls2[]; -extern const u8 gText_KeyItems2[]; extern const u8 gText_CloseBag[]; extern const u8 gText_CantWriteMailHere[]; extern const u8 gText_DepositHowManyStrVars1[]; diff --git a/src/item_menu.c b/src/item_menu.c index 4ea7b1824..2bf6b97e7 100644 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -88,9 +88,9 @@ static u8 CreateBagInputHandlerTask(u8 location); static bool8 TryAllocListMenuBuffers(void); static void Bag_BuildListMenuTemplate(u8 pocket); static void BagListMenuGetItemNameColored(u8 *dest, u16 itemId); -static void BagListMenuMoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list); +static void BagMenu_MoveCursorCallback(s32 itemIndex, bool8 onInit, struct ListMenu *list); static void BagListMenuItemPrintFunc(u8 windowId, u32 itemId, u8 y); -static void bag_menu_print_cursor(u8 y, u8 colorIdx); +static void BagMenu_PrintCursorAtPos(u8 y, u8 colorIdx); static void PrintBagPocketName(void); static void PrintItemDescriptionOnMessageWindow(s32 itemIndex); static void CreatePocketScrollArrowPair(void); @@ -107,10 +107,10 @@ static void Task_BagMenu_HandleInput(u8 taskId); static void Task_ItemContextMenuByLocation(u8 taskId); static void Bag_FillMessageBoxWithPalette(u32 a0); static u8 ProcessPocketSwitchInput(u8 taskId, u8 pocketId); -static void SwitchPockets(u8 taskId, s16 direction, bool16 a2); +static void SwitchBagPocket(u8 taskId, s16 direction, bool16 a2); static void Task_AnimateSwitchPockets(u8 taskId); static void BeginMovingItemInPocket(u8 taskId, s16 itemIndex); -static void Task_MoveItemInPocket_HandleInput(u8 taskId); +static void Task_HandleSwappingItemsInput(u8 taskId); static void ExecuteMoveItemInPocket(u8 taskId, u32 itemIndex); static void AbortMovingItemInPocket(u8 taskId, u32 itemIndex); static void DrawItemListRow(u8 row); @@ -183,10 +183,10 @@ static const struct BgTemplate sBgTemplates[2] = { } }; -static const u8 *const sPocketNames[] = { - gText_Items2, - gText_KeyItems2, - gText_PokeBalls2 +static const u8 *const gPocketNamesStringsTable[] = { + [ITEMS_POCKET] = COMPOUND_STRING("ITEMS"), + [KEYITEMS_POCKET] = COMPOUND_STRING("KEY ITEMS"), + [BALLS_POCKET] = COMPOUND_STRING("POKé BALLS"), }; #define LIST_TILES_WIDTH 18 @@ -663,7 +663,7 @@ static void Bag_BuildListMenuTemplate(u8 pocket) gMultiuseListMenuTemplate.cursorPal = 2; gMultiuseListMenuTemplate.fillValue = 0; gMultiuseListMenuTemplate.cursorShadowPal = 3; - gMultiuseListMenuTemplate.moveCursorFunc = BagListMenuMoveCursorFunc; + gMultiuseListMenuTemplate.moveCursorFunc = BagMenu_MoveCursorCallback; gMultiuseListMenuTemplate.itemPrintFunc = BagListMenuItemPrintFunc; gMultiuseListMenuTemplate.cursorKind = 0; gMultiuseListMenuTemplate.scrollMultiple = 0; @@ -681,7 +681,7 @@ static void BagListMenuGetItemNameColored(u8 *dest, u16 itemId) PrependFontIdToFit(dest, end, FONT_NARROW, 61); } -static void BagListMenuMoveCursorFunc(s32 itemIndex, bool8 onInit, struct ListMenu *list) +static void BagMenu_MoveCursorCallback(s32 itemIndex, bool8 onInit, struct ListMenu *list) { if (onInit != TRUE) { @@ -708,9 +708,9 @@ static void BagListMenuItemPrintFunc(u8 windowId, u32 itemId, u8 y) if (sBagMenuDisplay->itemOriginalLocation != 0xFF) { if (sBagMenuDisplay->itemOriginalLocation == (u8)itemId) - bag_menu_print_cursor(y, 2); + BagMenu_PrintCursorAtPos(y, 2); else - bag_menu_print_cursor(y, 0xFF); + BagMenu_PrintCursorAtPos(y, 0xFF); } if (itemId != -2 && sBagMenuDisplay->nItems[gBagMenuState.pocket] != itemId) { @@ -729,12 +729,12 @@ static void BagListMenuItemPrintFunc(u8 windowId, u32 itemId, u8 y) } } -static void bag_menu_print_cursor_(u8 taskId, u8 colorIdx) +static void BagMenu_PrintCursor(u8 listTaskId, u8 colorIndex) { - bag_menu_print_cursor(ListMenuGetYCoordForPrintingArrowCursor(taskId), colorIdx); + BagMenu_PrintCursorAtPos(ListMenuGetYCoordForPrintingArrowCursor(listTaskId), colorIndex); } -static void bag_menu_print_cursor(u8 y, u8 colorIdx) +static void BagMenu_PrintCursorAtPos(u8 y, u8 colorIdx) { if (colorIdx == 0xFF) { @@ -749,7 +749,7 @@ static void bag_menu_print_cursor(u8 y, u8 colorIdx) static void PrintBagPocketName(void) { FillWindowPixelBuffer(2, PIXEL_FILL(0)); - BagPrintTextOnWin1CenteredColor0(sPocketNames[gBagMenuState.pocket], gBagMenuState.pocket); + BagPrintTextOnWin1CenteredColor0(gPocketNamesStringsTable[gBagMenuState.pocket], gBagMenuState.pocket); } static void PrintItemDescriptionOnMessageWindow(s32 itemIndex) @@ -1052,10 +1052,10 @@ static void Task_BagMenu_HandleInput(u8 taskId) switch (ProcessPocketSwitchInput(taskId, gBagMenuState.pocket)) { case 1: - SwitchPockets(taskId, -1, FALSE); + SwitchBagPocket(taskId, -1, FALSE); return; case 2: - SwitchPockets(taskId, 1, FALSE); + SwitchBagPocket(taskId, 1, FALSE); return; default: if (JOY_NEW(SELECT_BUTTON) && gBagMenuState.location == ITEMMENULOCATION_FIELD) @@ -1093,7 +1093,7 @@ static void Task_BagMenu_HandleInput(u8 taskId) else { BagDestroyPocketScrollArrowPair(); - bag_menu_print_cursor_(data[0], 2); + BagMenu_PrintCursor(data[0], 2); data[1] = input; data[2] = BagGetQuantityByPocketPosition(gBagMenuState.pocket + 1, input); gSpecialVar_ItemId = BagGetItemIdByPocketPosition(gBagMenuState.pocket + 1, input); @@ -1146,13 +1146,13 @@ static u8 ProcessPocketSwitchInput(u8 taskId, u8 pocketId) return 0; } -static void SwitchPockets(u8 taskId, s16 direction, bool16 a2) +static void SwitchBagPocket(u8 taskId, s16 deltaBagPocketId, bool16 skipEraseList) { s16 *data = gTasks[taskId].data; tSwitchState = 0; tSwitchCounter = 0; - tSwitchDir = direction; - if (!a2) + tSwitchDir = deltaBagPocketId; + if (!skipEraseList) { ClearWindowTilemap(0); ClearWindowTilemap(1); @@ -1164,7 +1164,7 @@ static void SwitchPockets(u8 taskId, s16 direction, bool16 a2) } FillBgTilemapBufferRect_Palette0(1, 0x02D, 11, 1, 18, 12); ScheduleBgCopyTilemapToVram(1); - SetBagVisualPocketId(gBagMenuState.pocket + direction); + SetBagVisualPocketId(gBagMenuState.pocket + deltaBagPocketId); SetTaskFuncWithFollowupFunc(taskId, Task_AnimateSwitchPockets, gTasks[taskId].func); } @@ -1178,12 +1178,12 @@ static void Task_AnimateSwitchPockets(u8 taskId) case 1: gBagMenuState.pocket += tSwitchDir; SwitchTaskToFollowupFunc(taskId); - SwitchPockets(taskId, -1, TRUE); + SwitchBagPocket(taskId, -1, TRUE); return; case 2: gBagMenuState.pocket += tSwitchDir; SwitchTaskToFollowupFunc(taskId); - SwitchPockets(taskId, 1, TRUE); + SwitchBagPocket(taskId, 1, TRUE); return; } } @@ -1229,14 +1229,14 @@ static void BeginMovingItemInPocket(u8 taskId, s16 itemIndex) StringExpandPlaceholders(gStringVar4, gOtherText_WhereShouldTheStrVar1BePlaced); FillWindowPixelBuffer(1, PIXEL_FILL(0)); BagPrintTextOnWindow(1, FONT_NORMAL, gStringVar4, 0, 3, 2, 0, 0, 0); - UpdateItemMenuSwapLinePos(0, ListMenuGetYCoordForPrintingArrowCursor(data[0])); + UpdateItemMenuSwapLinePos(ListMenuGetYCoordForPrintingArrowCursor(data[0])); SetItemMenuSwapLineInvisibility(FALSE); BagDestroyPocketSwitchArrowPair(); - bag_menu_print_cursor_(data[0], 2); - gTasks[taskId].func = Task_MoveItemInPocket_HandleInput; + BagMenu_PrintCursor(data[0], 2); + gTasks[taskId].func = Task_HandleSwappingItemsInput; } -static void Task_MoveItemInPocket_HandleInput(u8 taskId) +static void Task_HandleSwappingItemsInput(u8 taskId) { s16 *data = gTasks[taskId].data; s32 input; @@ -1246,7 +1246,7 @@ static void Task_MoveItemInPocket_HandleInput(u8 taskId) return; input = ListMenu_ProcessInput(data[0]); ListMenuGetScrollAndRow(data[0], &gBagMenuState.cursorPos[gBagMenuState.pocket], &gBagMenuState.itemsAbove[gBagMenuState.pocket]); - UpdateItemMenuSwapLinePos(0, ListMenuGetYCoordForPrintingArrowCursor(data[0])); + UpdateItemMenuSwapLinePos(ListMenuGetYCoordForPrintingArrowCursor(data[0])); if (JOY_NEW(SELECT_BUTTON)) { PlaySE(SE_SELECT); @@ -1516,7 +1516,7 @@ static void Task_TossItem_No(u8 taskId) HideBagWindow(6); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); - bag_menu_print_cursor_(data[0], 1); + BagMenu_PrintCursor(data[0], 1); Task_RedrawArrowsAndReturnToBagMenuSelect(taskId); } @@ -1545,7 +1545,7 @@ static void Task_SelectQuantityToToss(u8 taskId) PutWindowTilemap(0); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); - bag_menu_print_cursor_(data[0], 1); + BagMenu_PrintCursor(data[0], 1); BagDestroyPocketScrollArrowPair(); Task_RedrawArrowsAndReturnToBagMenuSelect(taskId); } @@ -1577,7 +1577,7 @@ static void Task_WaitAB_RedrawAndReturnToBag(u8 taskId) data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); - bag_menu_print_cursor_(data[0], 1); + BagMenu_PrintCursor(data[0], 1); Task_RedrawArrowsAndReturnToBagMenuSelect(taskId); } } @@ -1657,7 +1657,7 @@ void Task_ReturnToBagFromContextMenu(u8 taskId) Bag_BuildListMenuTemplate(gBagMenuState.pocket); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]); ScheduleBgCopyTilemapToVram(0); - bag_menu_print_cursor_(data[0], 1); + BagMenu_PrintCursor(data[0], 1); Task_RedrawArrowsAndReturnToBagMenuSelect(taskId); } @@ -1668,7 +1668,7 @@ static void Task_ItemMenuAction_Cancel(u8 taskId) PutWindowTilemap(0); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); - bag_menu_print_cursor_(gTasks[taskId].data[0], 1); + BagMenu_PrintCursor(gTasks[taskId].data[0], 1); Task_RedrawArrowsAndReturnToBagMenuSelect(taskId); } @@ -1861,7 +1861,7 @@ static void Task_SellItem_No(u8 taskId) PutWindowTilemap(0); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); - bag_menu_print_cursor_(data[0], 1); + BagMenu_PrintCursor(data[0], 1); Task_RedrawArrowsAndReturnToBagMenuSelect(taskId); } @@ -1911,7 +1911,7 @@ static void Task_SelectQuantityToSell(u8 taskId) PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); BagDestroyPocketScrollArrowPair(); - bag_menu_print_cursor_(data[0], 1); + BagMenu_PrintCursor(data[0], 1); Task_RedrawArrowsAndReturnToBagMenuSelect(taskId); } } @@ -1940,7 +1940,7 @@ static void Task_FinalizeSaleToShop(u8 taskId) sBagMenuDisplay->inhibitItemDescriptionPrint = TRUE; Bag_BuildListMenuTemplate(gBagMenuState.pocket); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]); - bag_menu_print_cursor_(data[0], 2); + BagMenu_PrintCursor(data[0], 2); BagDrawTextBoxOnWindow(GetBagWindow(2)); PrintMoneyAmountInMoneyBox(GetBagWindow(2), GetMoney(&gSaveBlock1Ptr->money), 0); gTasks[taskId].func = Task_WaitPressAB_AfterSell; @@ -1997,7 +1997,7 @@ static void Task_SelectQuantityToDeposit(u8 taskId) HideBagWindow(0); PutWindowTilemap(1); ScheduleBgCopyTilemapToVram(0); - bag_menu_print_cursor_(data[0], 1); + BagMenu_PrintCursor(data[0], 1); BagDestroyPocketScrollArrowPair(); Task_RedrawArrowsAndReturnToBagMenuSelect(taskId); } @@ -2121,11 +2121,11 @@ static void Task_Bag_OldManTutorial(u8 taskId) case 102: case 204: PlaySE(SE_BAG_POCKET); - SwitchPockets(taskId, 1, FALSE); + SwitchBagPocket(taskId, 1, FALSE); break; case 306: PlaySE(SE_SELECT); - bag_menu_print_cursor_(data[0], 2); + BagMenu_PrintCursor(data[0], 2); Bag_FillMessageBoxWithPalette(1); gSpecialVar_ItemId = ITEM_POKE_BALL; OpenContextMenu(taskId); @@ -2224,11 +2224,11 @@ static void Task_Bag_TeachyTvRegister(u8 taskId) { case 102: PlaySE(SE_BAG_POCKET); - SwitchPockets(taskId, 1, FALSE); + SwitchBagPocket(taskId, 1, FALSE); break; case 204: PlaySE(SE_SELECT); - bag_menu_print_cursor_(data[0], 2); + BagMenu_PrintCursor(data[0], 2); Bag_FillMessageBoxWithPalette(1); gSpecialVar_ItemId = ITEM_TEACHY_TV; OpenContextMenu(taskId); @@ -2248,7 +2248,7 @@ static void Task_Bag_TeachyTvRegister(u8 taskId) Bag_BuildListMenuTemplate(gBagMenuState.pocket); data[0] = ListMenuInit(&gMultiuseListMenuTemplate, gBagMenuState.cursorPos[gBagMenuState.pocket], gBagMenuState.itemsAbove[gBagMenuState.pocket]); Bag_FillMessageBoxWithPalette(0); - bag_menu_print_cursor_(data[0], 1); + BagMenu_PrintCursor(data[0], 1); CopyWindowToVram(0, COPYWIN_MAP); break; case 510: @@ -2285,7 +2285,7 @@ static void Task_Bag_TeachyTvCatching(u8 taskId) case 102: case 204: PlaySE(SE_BAG_POCKET); - SwitchPockets(taskId, 1, FALSE); + SwitchBagPocket(taskId, 1, FALSE); break; case 306: case 408: @@ -2301,7 +2301,7 @@ static void Task_Bag_TeachyTvCatching(u8 taskId) break; case 714: PlaySE(SE_SELECT); - bag_menu_print_cursor_(data[0], 2); + BagMenu_PrintCursor(data[0], 2); Bag_FillMessageBoxWithPalette(1); gSpecialVar_ItemId = ITEM_POKE_BALL; OpenContextMenu(taskId); @@ -2343,7 +2343,7 @@ static void Task_Bag_TeachyTvStatus(u8 taskId) break; case 204: PlaySE(SE_SELECT); - bag_menu_print_cursor_(data[0], 2); + BagMenu_PrintCursor(data[0], 2); Bag_FillMessageBoxWithPalette(1); gSpecialVar_ItemId = ITEM_ANTIDOTE; OpenContextMenu(taskId); @@ -2375,7 +2375,7 @@ static void Task_Bag_TeachyTvTMs(u8 taskId) { case 102: PlaySE(SE_BAG_POCKET); - SwitchPockets(taskId, 1, 0); + SwitchBagPocket(taskId, 1, 0); break; case 204: gMain.newKeys = 0; @@ -2384,7 +2384,7 @@ static void Task_Bag_TeachyTvTMs(u8 taskId) break; case 306: PlaySE(SE_SELECT); - bag_menu_print_cursor_(data[0], 2); + BagMenu_PrintCursor(data[0], 2); Bag_FillMessageBoxWithPalette(1); gSpecialVar_ItemId = ITEM_TM_CASE; OpenContextMenu(taskId); diff --git a/src/item_menu_icons.c b/src/item_menu_icons.c index 9a5ba53c1..6f7dfa82a 100644 --- a/src/item_menu_icons.c +++ b/src/item_menu_icons.c @@ -1,42 +1,18 @@ #include "global.h" - -#include "sprite.h" - #include "graphics.h" #include "item_icon.h" +#include "item_menu.h" #include "item_menu_icons.h" +#include "menu_helpers.h" +#include "sprite.h" #include "constants/item.h" -enum { - TAG_BAG = 100, - TAG_SWAP_LINE, - TAG_ITEM_ICON, - TAG_ITEM_ICON_ALT, -}; - -#define NUM_SWAP_LINE_SPRITES 9 - -// Indexes for sItemMenuIconSpriteIds -enum { - SPR_BAG, - SPR_SWAP_LINE_START, - SPR_ITEM_ICON = SPR_SWAP_LINE_START + NUM_SWAP_LINE_SPRITES, - SPR_ITEM_ICON_ALT, - SPR_COUNT -}; - -enum { - ANIM_SWAP_LINE_START, - ANIM_SWAP_LINE_MID, - ANIM_SWAP_LINE_END, -}; - enum { AFFINEANIM_BAG_IDLE, AFFINEANIM_BAG_SHAKE, }; -static EWRAM_DATA u8 sItemMenuIconSpriteIds[SPR_COUNT] = {0}; +EWRAM_DATA u8 gItemMenuIconSpriteIds[ITEMMENUSPRITE_COUNT] = {0}; static void SpriteCB_BagVisualSwitchingPockets(struct Sprite *sprite); static void SpriteCB_ShakeBagSprite(struct Sprite *sprite); @@ -94,23 +70,23 @@ static const union AffineAnimCmd *const sAffineAnimTable_Bag[] = { const struct CompressedSpriteSheet gSpriteSheet_BagMale = { .data = gBagMale_Gfx, .size = 0x2000, - .tag = TAG_BAG + .tag = TAG_BAG_GFX }; const struct CompressedSpriteSheet gSpriteSheet_BagFemale = { .data = gBagFemale_Gfx, .size = 0x2000, - .tag = TAG_BAG + .tag = TAG_BAG_GFX }; const struct SpritePalette gSpritePalette_Bag = { .data = gBag_Pal, - .tag = TAG_BAG + .tag = TAG_BAG_GFX }; static const struct SpriteTemplate sSpriteTemplate_Bag = { - .tileTag = TAG_BAG, - .paletteTag = TAG_BAG, + .tileTag = TAG_BAG_GFX, + .paletteTag = TAG_BAG_GFX, .oam = &sOamData_Bag, .anims = sAnims_Bag, .images = NULL, @@ -118,56 +94,6 @@ static const struct SpriteTemplate sSpriteTemplate_Bag = { .callback = SpriteCallbackDummy }; -static const struct OamData sOamData_SwapLine = { - .affineMode = ST_OAM_AFFINE_OFF, - .shape = SPRITE_SHAPE(16x16), - .size = SPRITE_SIZE(16x16), - .priority = 1, - .paletteNum = 1 -}; - -static const union AnimCmd sAnim_SwapLine_Start[] = { - ANIMCMD_FRAME(0, 0), - ANIMCMD_END -}; - -static const union AnimCmd sAnim_SwapLine_Mid[] = { - ANIMCMD_FRAME(4, 0), - ANIMCMD_END -}; - -static const union AnimCmd sAnim_SwapLine_End[] = { - ANIMCMD_FRAME(0, 0, .hFlip = TRUE), - ANIMCMD_END -}; - -static const union AnimCmd *const sAnims_SwapLine[] = { - [ANIM_SWAP_LINE_START] = sAnim_SwapLine_Start, - [ANIM_SWAP_LINE_MID] = sAnim_SwapLine_Mid, - [ANIM_SWAP_LINE_END] = sAnim_SwapLine_End -}; - -const struct CompressedSpriteSheet gBagSwapSpriteSheet = { - .data = gSwapLine_Gfx, - .size = 0x100, - .tag = TAG_SWAP_LINE -}; - -const struct SpritePalette gBagSwapSpritePalette = { - .data = gSwapLine_Pal, - .tag = TAG_SWAP_LINE -}; - -static const struct SpriteTemplate sSpriteTemplate_SwapLine = { - .tileTag = TAG_SWAP_LINE, - .paletteTag = TAG_SWAP_LINE, - .oam = &sOamData_SwapLine, - .anims = sAnims_SwapLine, - .images = NULL, - .affineAnims = gDummySpriteAffineAnimTable, - .callback = SpriteCallbackDummy -}; - static const struct OamData sOamData_ItemIcon = { .affineMode = ST_OAM_AFFINE_OFF, .shape = SPRITE_SHAPE(32x32), @@ -199,19 +125,19 @@ void ResetItemMenuIconState(void) { u16 i; - for (i = 0; i < SPR_COUNT; i++) - sItemMenuIconSpriteIds[i] = SPRITE_NONE; + for (i = 0; i < ITEMMENUSPRITE_COUNT; i++) + gItemMenuIconSpriteIds[i] = SPRITE_NONE; } void AddBagVisualSprite(u8 bagPocketId) { - sItemMenuIconSpriteIds[SPR_BAG] = CreateSprite(&sSpriteTemplate_Bag, 40, 68, 0); + gItemMenuIconSpriteIds[ITEMMENUSPRITE_BAG] = CreateSprite(&sSpriteTemplate_Bag, 40, 68, 0); SetBagVisualPocketId(bagPocketId); } void SetBagVisualPocketId(u8 bagPocketId) { - struct Sprite *sprite = &gSprites[sItemMenuIconSpriteIds[SPR_BAG]]; + struct Sprite *sprite = &gSprites[gItemMenuIconSpriteIds[ITEMMENUSPRITE_BAG]]; sprite->y2 = -5; sprite->callback = SpriteCB_BagVisualSwitchingPockets; StartSpriteAnim(sprite, bagPocketId); @@ -227,7 +153,7 @@ static void SpriteCB_BagVisualSwitchingPockets(struct Sprite *sprite) void ShakeBagSprite(void) { - struct Sprite *sprite = &gSprites[sItemMenuIconSpriteIds[SPR_BAG]]; + struct Sprite *sprite = &gSprites[gItemMenuIconSpriteIds[ITEMMENUSPRITE_BAG]]; if (sprite->affineAnimEnded) { StartSpriteAffineAnim(sprite, AFFINEANIM_BAG_SHAKE); @@ -246,11 +172,12 @@ static void SpriteCB_ShakeBagSprite(struct Sprite *sprite) void AddBagItemIconSprite(u16 itemId, u8 id) { - u8 *spriteIds = &sItemMenuIconSpriteIds[SPR_ITEM_ICON]; - u8 spriteId; + u8 *spriteIds = &gItemMenuIconSpriteIds[ITEMMENUSPRITE_ITEM]; if (spriteIds[id] == SPRITE_NONE) { + u8 spriteId; + // Either TAG_ITEM_ICON or TAG_ITEM_ICON_ALT FreeSpriteTilesByTag(TAG_ITEM_ICON + id); FreeSpritePaletteByTag(TAG_ITEM_ICON + id); @@ -266,7 +193,7 @@ void AddBagItemIconSprite(u16 itemId, u8 id) void RemoveBagItemIconSprite(u8 id) { - u8 *spriteIds = &sItemMenuIconSpriteIds[SPR_ITEM_ICON]; + u8 *spriteIds = &gItemMenuIconSpriteIds[ITEMMENUSPRITE_ITEM]; if (spriteIds[id] != SPRITE_NONE) { @@ -277,52 +204,22 @@ void RemoveBagItemIconSprite(u8 id) void CreateItemMenuSwapLine(void) { - u8 i; - u8 *spriteIds = &sItemMenuIconSpriteIds[SPR_SWAP_LINE_START]; - - for (i = 0; i < NUM_SWAP_LINE_SPRITES; i++) - { - spriteIds[i] = CreateSprite(&sSpriteTemplate_SwapLine, i * 16 + 96, 7, 0); - switch (i) - { - case 0: - // ANIM_SWAP_LINE_START, by default - break; - case NUM_SWAP_LINE_SPRITES - 1: - StartSpriteAnim(&gSprites[spriteIds[i]], ANIM_SWAP_LINE_END); - break; - default: - StartSpriteAnim(&gSprites[spriteIds[i]], ANIM_SWAP_LINE_MID); - break; - } - gSprites[spriteIds[i]].invisible = TRUE; - } + CreateSwapLineSprites(&gItemMenuIconSpriteIds[ITEMMENUSPRITE_SWAP_LINE], ITEMMENU_SWAP_LINE_LENGTH); } void SetItemMenuSwapLineInvisibility(bool8 invisible) { - u8 i; - u8 *spriteIds = &sItemMenuIconSpriteIds[SPR_SWAP_LINE_START]; - - for (i = 0; i < NUM_SWAP_LINE_SPRITES; i++) - gSprites[spriteIds[i]].invisible = invisible; + SetSwapLineSpritesInvisibility(&gItemMenuIconSpriteIds[ITEMMENUSPRITE_SWAP_LINE], ITEMMENU_SWAP_LINE_LENGTH, invisible); } -void UpdateItemMenuSwapLinePos(s16 x, u16 y) +void UpdateItemMenuSwapLinePos(u16 y) { - u8 i; - u8 *spriteIds = &sItemMenuIconSpriteIds[SPR_SWAP_LINE_START]; - - for (i = 0; i < NUM_SWAP_LINE_SPRITES; i++) - { - gSprites[spriteIds[i]].x2 = x; - gSprites[spriteIds[i]].y = y + 7; - } + UpdateSwapLineSpritesPos(&gItemMenuIconSpriteIds[ITEMMENUSPRITE_SWAP_LINE], ITEMMENU_SWAP_LINE_LENGTH, 0, y + 6); } void CreateBerryPouchItemIcon(u16 itemId, u8 id) { - u8 *spriteIds = &sItemMenuIconSpriteIds[SPR_ITEM_ICON]; + u8 *spriteIds = &gItemMenuIconSpriteIds[ITEMMENUSPRITE_ITEM]; u8 spriteId; if (spriteIds[id] == SPRITE_NONE) diff --git a/src/item_pc.c b/src/item_pc.c index 674bf13ac..ace6b4056 100644 --- a/src/item_pc.c +++ b/src/item_pc.c @@ -76,8 +76,8 @@ static u16 ItemPc_GetItemQuantityBySlotId(u16 itemIndex); static void ItemPc_CountPcItems(void); static void ItemPc_SetScrollPosition(void); static void Task_ItemPcMain(u8 taskId); -static void ItemPc_MoveItemModeInit(u8 taskId, s16 pos); -static void Task_ItemPcMoveItemModeRun(u8 taskId); +static void ItemStorage_StartItemSwap(u8 taskId, s16 pos); +static void ItemStorage_ProcessItemSwapInput(u8 taskId); static void ItemPc_InsertItemIntoNewSlot(u8 taskId, u32 pos); static void ItemPc_MoveItemModeCancel(u8 taskId, u32 pos); static void Task_ItemPcSubmenuInit(u8 taskId); @@ -343,7 +343,7 @@ static bool8 ItemPc_DoGfxSetup(void) gMain.state++; break; case 14: - CreateItemMenuSwapLine(); + CreateSwapLineSprites(&gItemMenuIconSpriteIds[ITEMMENUSPRITE_SWAP_LINE], ITEMMENU_SWAP_LINE_LENGTH); gMain.state++; break; case 15: @@ -729,7 +729,7 @@ static void Task_ItemPcMain(u8 taskId) if (scroll + row != sStateDataPtr->nItems) { PlaySE(SE_SELECT); - ItemPc_MoveItemModeInit(taskId, scroll + row); + ItemStorage_StartItemSwap(taskId, scroll + row); return; } } @@ -764,7 +764,12 @@ static void ItemPc_ReturnFromSubmenu(u8 taskId) gTasks[taskId].func = Task_ItemPcMain; } -static void ItemPc_MoveItemModeInit(u8 taskId, s16 pos) +static void ItemStorage_UpdateSwapLinePos(u8 y) +{ + UpdateSwapLineSpritesPos(&gItemMenuIconSpriteIds[ITEMMENUSPRITE_SWAP_LINE], ITEMMENU_SWAP_LINE_LENGTH, -32, y + 6); +} + +static void ItemStorage_StartItemSwap(u8 taskId, s16 pos) { s16 * data = gTasks[taskId].data; @@ -775,19 +780,19 @@ static void ItemPc_MoveItemModeInit(u8 taskId, s16 pos) StringExpandPlaceholders(gStringVar4, gOtherText_WhereShouldTheStrVar1BePlaced); FillWindowPixelBuffer(1, 0x00); ItemPc_AddTextPrinterParameterized(1, FONT_NORMAL, gStringVar4, 0, 3, 2, 3, 0, 0); - UpdateItemMenuSwapLinePos(-32, ListMenuGetYCoordForPrintingArrowCursor(data[0])); + ItemStorage_UpdateSwapLinePos(ListMenuGetYCoordForPrintingArrowCursor(data[0])); SetItemMenuSwapLineInvisibility(FALSE); ItemPc_PrintOrRemoveCursor(data[0], 2); - gTasks[taskId].func = Task_ItemPcMoveItemModeRun; + gTasks[taskId].func = ItemStorage_ProcessItemSwapInput; } -static void Task_ItemPcMoveItemModeRun(u8 taskId) +static void ItemStorage_ProcessItemSwapInput(u8 taskId) { s16 * data = gTasks[taskId].data; ListMenu_ProcessInput(data[0]); ListMenuGetScrollAndRow(data[0], &sListMenuState.scroll, &sListMenuState.row); - UpdateItemMenuSwapLinePos(-32, ListMenuGetYCoordForPrintingArrowCursor(data[0])); + ItemStorage_UpdateSwapLinePos(ListMenuGetYCoordForPrintingArrowCursor(data[0])); if (JOY_NEW(A_BUTTON | SELECT_BUTTON)) { PlaySE(SE_SELECT); diff --git a/src/menu_helpers.c b/src/menu_helpers.c index 93b7f5f77..a35ab8f81 100644 --- a/src/menu_helpers.c +++ b/src/menu_helpers.c @@ -1,20 +1,81 @@ #include "global.h" -#include "gflib.h" -#include "task.h" +#include "bg.h" +#include "field_specials.h" +#include "gpu_regs.h" +#include "graphics.h" +#include "link.h" +#include "mail.h" #include "menu.h" #include "menu_helpers.h" -#include "link.h" #include "overworld.h" -#include "mail.h" -#include "field_specials.h" +#include "sound.h" +#include "string_util.h" +#include "task.h" #include "constants/songs.h" #include "constants/items.h" #include "constants/maps.h" +enum { + ANIM_SWAP_LINE_START, + ANIM_SWAP_LINE_MID, + ANIM_SWAP_LINE_END, +}; + static EWRAM_DATA const struct YesNoFuncTable *sYesNo = NULL; static EWRAM_DATA TaskFunc sMessageNextTask = NULL; static EWRAM_DATA u8 sMessageWindowId = {0}; + +static const struct OamData sOamData_SwapLine = { + .affineMode = ST_OAM_AFFINE_OFF, + .shape = SPRITE_SHAPE(16x16), + .size = SPRITE_SIZE(16x16), + .priority = 1, + .paletteNum = 1 +}; + +static const union AnimCmd sAnim_SwapLine_Start[] = { + ANIMCMD_FRAME(0, 0), + ANIMCMD_END +}; + +static const union AnimCmd sAnim_SwapLine_Mid[] = { + ANIMCMD_FRAME(4, 0), + ANIMCMD_END +}; + +static const union AnimCmd sAnim_SwapLine_End[] = { + ANIMCMD_FRAME(0, 0, .hFlip = TRUE), + ANIMCMD_END +}; + +static const union AnimCmd *const sAnims_SwapLine[] = { + [ANIM_SWAP_LINE_START] = sAnim_SwapLine_Start, + [ANIM_SWAP_LINE_MID] = sAnim_SwapLine_Mid, + [ANIM_SWAP_LINE_END] = sAnim_SwapLine_End +}; + +const struct CompressedSpriteSheet gBagSwapSpriteSheet = { + .data = gSwapLine_Gfx, + .size = 0x100, + .tag = TAG_SWAP_LINE +}; + +const struct SpritePalette gBagSwapSpritePalette = { + .data = gSwapLine_Pal, + .tag = TAG_SWAP_LINE +}; + +static const struct SpriteTemplate sSpriteTemplate_SwapLine = { + .tileTag = TAG_SWAP_LINE, + .paletteTag = TAG_SWAP_LINE, + .oam = &sOamData_SwapLine, + .anims = sAnims_SwapLine, + .images = NULL, + .affineAnims = gDummySpriteAffineAnimTable, + .callback = SpriteCallbackDummy +}; + static void Task_ContinueTaskAfterMessagePrints(u8 taskId); void DisplayMessageAndContinueTask(u8 taskId, u8 windowId, u16 tileNum, u8 paletteNum, u8 fontId, u8 textSpeed, const u8 *string, void *taskFunc) @@ -245,3 +306,46 @@ u8 GetDialogBoxFontId(void) else return FONT_FEMALE; } + +void CreateSwapLineSprites(u8 *spriteIds, u8 count) +{ + u8 i; + + for (i = 0; i < count; i++) + { + spriteIds[i] = CreateSprite(&sSpriteTemplate_SwapLine, i * 16 + 96, 7, 0); + if (i != 0) + StartSpriteAnim(&gSprites[spriteIds[i]], ANIM_SWAP_LINE_MID); + + gSprites[spriteIds[i]].invisible = TRUE; + } +} + +void SetSwapLineSpritesInvisibility(u8 *spriteIds, u8 count, bool8 invisible) +{ + u8 i; + + for (i = 0; i < count; i++) + gSprites[spriteIds[i]].invisible = invisible; +} + +void UpdateSwapLineSpritesPos(u8 *spriteIds, u8 count, s16 x, u16 y) +{ + u8 i; + bool8 hasMargin = count & SWAP_LINE_HAS_MARGIN; + count &= ~SWAP_LINE_HAS_MARGIN; + + for (i = 0; i < count; i++) + { + // If the list menu has a right margin, the swap line + // shouldn't extend all the way to the edge of the screen. + // If this is the last sprite in the line, move it a bit + // to the left to keep it out of the margin. + if (i == count - 1 && hasMargin) + gSprites[spriteIds[i]].x2 = x - 8; + else + gSprites[spriteIds[i]].x2 = x; + + gSprites[spriteIds[i]].y = 1 + y; + } +} diff --git a/src/strings.c b/src/strings.c index 9ddd922eb..4c949bbdf 100644 --- a/src/strings.c +++ b/src/strings.c @@ -185,9 +185,6 @@ const u8 gText_SeasonWinter[] = _("Winter"); const u8 gText_TimesStrVar1[] = _("×{STR_VAR_1}"); const u8 gText_Berry[] = _(" BERRY"); const u8 gText_Coins[] = _("{STR_VAR_1} COINS"); -const u8 gText_Items2[] = _("ITEMS"); -const u8 gText_PokeBalls2[] = _("POKé BALLS"); -const u8 gText_KeyItems2[] = _("KEY ITEMS"); const u8 gText_DepositItem[] = _("DEPOSIT ITEM"); const u8 gText_CloseBag[] = _("CLOSE BAG"); const u8 gText_Var1IsSelected[] = _("{STR_VAR_1} is\nselected.");