Fixed TM and Berries disappearing when sorting (#7168)

This commit is contained in:
Eduardo Quezada 2025-06-22 14:39:13 -04:00 committed by GitHub
parent cf7f15faac
commit 1f8455c769
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 107 additions and 2 deletions

View File

@ -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;

105
test/bag.c Normal file
View File

@ -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);
}