From 1f8455c769da4df8f126c350c7e017fc0a425b33 Mon Sep 17 00:00:00 2001 From: Eduardo Quezada Date: Sun, 22 Jun 2025 14:39:13 -0400 Subject: [PATCH] Fixed TM and Berries disappearing when sorting (#7168) --- src/item.c | 4 +- test/bag.c | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 test/bag.c diff --git a/src/item.c b/src/item.c index 5696b38111..e9bbfeaad9 100644 --- a/src/item.c +++ b/src/item.c @@ -588,9 +588,9 @@ void SortBerriesOrTMHMs(enum Pocket pocketId) { for (j = i + 1; j < gBagPockets[pocketId].capacity; j++) { - if (GetBagItemQuantity(pocketId, i) != 0) + if (GetBagItemQuantity(pocketId, i) != 0 || GetBagItemId(pocketId, i) != ITEM_NONE) { - if (GetBagItemQuantity(pocketId, j) == 0) + if (GetBagItemQuantity(pocketId, j) == 0 || GetBagItemId(pocketId, j) == ITEM_NONE) continue; if (GetBagItemId(pocketId, i) <= GetBagItemId(pocketId, j)) continue; diff --git a/test/bag.c b/test/bag.c new file mode 100644 index 0000000000..67e9a42442 --- /dev/null +++ b/test/bag.c @@ -0,0 +1,105 @@ +#include "global.h" +#include "battle.h" +#include "event_data.h" +#include "item.h" +#include "pokemon.h" +#include "test/overworld_script.h" +#include "test/test.h" + +TEST("TMs and HMs are sorted correctly in the bag") +{ + struct BagPocket *pocket = &gBagPockets[POCKET_TM_HM]; + + RUN_OVERWORLD_SCRIPT( + additem ITEM_HM07; + additem ITEM_TM25; + additem ITEM_TM14; + additem ITEM_TM42; + additem ITEM_HM05; + additem ITEM_TM05; + additem ITEM_TM01; + additem ITEM_HM02; + ); + + SortBerriesOrTMHMs(POCKET_TM_HM); + + EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_TM01); + EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_TM05); + EXPECT_EQ(pocket->itemSlots[2].itemId, ITEM_TM14); + EXPECT_EQ(pocket->itemSlots[3].itemId, ITEM_TM25); + EXPECT_EQ(pocket->itemSlots[4].itemId, ITEM_TM42); + EXPECT_EQ(pocket->itemSlots[5].itemId, ITEM_HM02); + EXPECT_EQ(pocket->itemSlots[6].itemId, ITEM_HM05); + EXPECT_EQ(pocket->itemSlots[7].itemId, ITEM_HM07); + EXPECT_EQ(pocket->itemSlots[8].itemId, ITEM_NONE); +} + +TEST("Berries are sorted correctly in the bag") +{ + struct BagPocket *pocket = &gBagPockets[POCKET_BERRIES]; + + RUN_OVERWORLD_SCRIPT( + additem ITEM_POMEG_BERRY; + additem ITEM_MAGOST_BERRY; + additem ITEM_KELPSY_BERRY; + additem ITEM_MICLE_BERRY; + additem ITEM_CHARTI_BERRY; + additem ITEM_GANLON_BERRY; + additem ITEM_ORAN_BERRY; + additem ITEM_CHERI_BERRY; + ); + + SortBerriesOrTMHMs(POCKET_BERRIES); + + EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_CHERI_BERRY); + EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_ORAN_BERRY); + EXPECT_EQ(pocket->itemSlots[2].itemId, ITEM_POMEG_BERRY); + EXPECT_EQ(pocket->itemSlots[3].itemId, ITEM_KELPSY_BERRY); + EXPECT_EQ(pocket->itemSlots[4].itemId, ITEM_MAGOST_BERRY); + EXPECT_EQ(pocket->itemSlots[5].itemId, ITEM_CHARTI_BERRY); + EXPECT_EQ(pocket->itemSlots[6].itemId, ITEM_GANLON_BERRY); + EXPECT_EQ(pocket->itemSlots[7].itemId, ITEM_MICLE_BERRY); + EXPECT_EQ(pocket->itemSlots[8].itemId, ITEM_NONE); +} + +TEST("Items are correctly compacted in the bag") +{ + struct BagPocket *pocket = &gBagPockets[POCKET_ITEMS]; + memset(pocket->itemSlots, 0, sizeof(gSaveBlock1Ptr->bag.items)); + + RUN_OVERWORLD_SCRIPT( + additem ITEM_NUGGET; + additem ITEM_BIG_NUGGET; + additem ITEM_TINY_MUSHROOM; + additem ITEM_BIG_MUSHROOM; + additem ITEM_PEARL; + additem ITEM_BIG_PEARL; + ); + + EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_NUGGET); + EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_BIG_NUGGET); + EXPECT_EQ(pocket->itemSlots[2].itemId, ITEM_TINY_MUSHROOM); + EXPECT_EQ(pocket->itemSlots[3].itemId, ITEM_BIG_MUSHROOM); + EXPECT_EQ(pocket->itemSlots[4].itemId, ITEM_PEARL); + EXPECT_EQ(pocket->itemSlots[5].itemId, ITEM_BIG_PEARL); + EXPECT_EQ(pocket->itemSlots[6].itemId, ITEM_NONE); + + // Try removing the small items, check that everything is compacted correctly + + RUN_OVERWORLD_SCRIPT( + removeitem ITEM_NUGGET; + removeitem ITEM_TINY_MUSHROOM; + removeitem ITEM_PEARL; + ); + + CompactItemsInBagPocket(POCKET_ITEMS); + + EXPECT_EQ(pocket->itemSlots[0].itemId, ITEM_BIG_NUGGET); + EXPECT_EQ(pocket->itemSlots[1].itemId, ITEM_BIG_MUSHROOM); + EXPECT_EQ(pocket->itemSlots[2].itemId, ITEM_BIG_PEARL); + EXPECT_EQ(pocket->itemSlots[3].itemId, ITEM_NONE); + EXPECT_EQ(pocket->itemSlots[4].itemId, ITEM_NONE); + EXPECT_EQ(pocket->itemSlots[5].itemId, ITEM_NONE); + EXPECT_EQ(pocket->itemSlots[6].itemId, ITEM_NONE); + +}