diff --git a/include/item.h b/include/item.h index 1f3b1fab1b..56fe152720 100644 --- a/include/item.h +++ b/include/item.h @@ -215,6 +215,7 @@ bool32 CheckBagHasSpace(u16 itemId, u16 count); u32 GetFreeSpaceForItemInBag(u16 itemId); bool32 AddBagItem(u16 itemId, u16 count); bool32 RemoveBagItem(u16 itemId, u16 count); +void RemoveBagItemFromSlot(struct BagPocket *pocket, u16 slotId, u16 count); u8 CountUsedPCItemSlots(void); bool32 CheckPCHasItem(u16 itemId, u16 count); bool32 AddPCItem(u16 itemId, u16 count); diff --git a/src/item.c b/src/item.c index 7519060287..5bfc59c68f 100644 --- a/src/item.c +++ b/src/item.c @@ -411,6 +411,13 @@ bool32 RemoveBagItem(u16 itemId, u16 count) return BagPocket_RemoveItem(&gBagPockets[GetItemPocket(itemId)], itemId, count); } +// Unsafe function: Only use with functions that already check the slot and count are valid +void RemoveBagItemFromSlot(struct BagPocket *pocket, u16 slotId, u16 count) +{ + struct ItemSlot itemSlot = BagPocket_GetSlotData(pocket, slotId); + BagPocket_SetSlotItemIdAndCount(pocket, slotId, itemSlot.itemId, itemSlot.quantity - count); +} + static u8 NONNULL BagPocket_CountUsedItemSlots(struct BagPocket *pocket) { u8 usedSlots = 0; diff --git a/src/item_menu.c b/src/item_menu.c index f19cad0cdc..e63758b3ac 100755 --- a/src/item_menu.c +++ b/src/item_menu.c @@ -170,6 +170,7 @@ static void PrintThereIsNoPokemon(u8); static void Task_ChooseHowManyToToss(u8); static void AskTossItems(u8); static void Task_RemoveItemFromBag(u8); +static void Task_TossItemFromBag(u8 taskId); static void ItemMenu_Cancel(u8); static void HandleErrorMessage(u8); static void PrintItemCantBeHeld(u8); @@ -1958,11 +1959,34 @@ static void ConfirmToss(u8 taskId) StringExpandPlaceholders(gStringVar4, gText_ThrewAwayVar2Var1s); FillWindowPixelBuffer(WIN_DESCRIPTION, PIXEL_FILL(0)); BagMenu_Print(WIN_DESCRIPTION, FONT_NORMAL, gStringVar4, 3, 1, 0, 0, 0, COLORID_NORMAL); - gTasks[taskId].func = Task_RemoveItemFromBag; + if (CurrentBattlePyramidLocation() != PYRAMID_LOCATION_NONE || FlagGet(FLAG_STORING_ITEMS_IN_PYRAMID_BAG) == TRUE) + gTasks[taskId].func = Task_RemoveItemFromBag; + else + gTasks[taskId].func = Task_TossItemFromBag; +} + +static void Task_TossItemFromBag(u8 taskId) +{ + s16 *data = gTasks[taskId].data; + u16 *scrollPos = &gBagPosition.scrollPosition[gBagPosition.pocket]; + u16 *cursorPos = &gBagPosition.cursorPosition[gBagPosition.pocket]; + + if (JOY_NEW(A_BUTTON | B_BUTTON)) + { + PlaySE(SE_SELECT); + RemoveBagItemFromSlot(&gBagPockets[gBagPosition.pocket], *scrollPos + *cursorPos, tItemCount); + DestroyListMenuTask(tListTaskId, scrollPos, cursorPos); + UpdatePocketItemList(gBagPosition.pocket); + UpdatePocketListPosition(gBagPosition.pocket); + LoadBagItemListBuffers(gBagPosition.pocket); + tListTaskId = ListMenuInit(&gMultiuseListMenuTemplate, *scrollPos, *cursorPos); + ScheduleBgCopyTilemapToVram(0); + ReturnToItemList(taskId); + } } // Remove selected item(s) from the bag and update list -// For when items are tossed or deposited +// For when items are deposited static void Task_RemoveItemFromBag(u8 taskId) { s16 *data = gTasks[taskId].data;