Skip to content

Commit

Permalink
Fix broken sell
Browse files Browse the repository at this point in the history
  • Loading branch information
kphoenix137 committed Sep 21, 2024
1 parent e62ad8a commit 95cd85b
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 25 deletions.
72 changes: 48 additions & 24 deletions Source/stores.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -515,16 +515,22 @@ void StoreSession::BuildPlayerItemsVector()

// Add inventory items
for (int8_t i = 0; i < MyPlayer->_pNumInv; i++) {
if (MyPlayer->InvList[i].isEmpty())
continue;
playerItems.push_back({ &MyPlayer->InvList[i], ItemLocation::Inventory, i, MyPlayer->InvList[i]._iIvalue });
}

// Add belt items
for (int i = 0; i < MaxBeltItems; i++) {
if (MyPlayer->SpdList[i].isEmpty())
continue;
playerItems.push_back({ &MyPlayer->SpdList[i], ItemLocation::Belt, i, MyPlayer->SpdList[i]._iIvalue });
}

// Add body items
for (int i = 0; i < NUM_INVLOC; i++) {
if (MyPlayer->InvBody[i].isEmpty())
continue;
playerItems.push_back({ &MyPlayer->InvBody[i], ItemLocation::Body, i, MyPlayer->InvBody[i]._iIvalue });
}
}
Expand Down Expand Up @@ -558,13 +564,13 @@ void StoreSession::FilterPlayerItemsForAction(TalkID talkId)
}
}

void StoreSession::SetupItemList(TalkID talkId, Item *itemData, int storeLimit, int idx, bool selling /*= true*/)
void StoreSession::SetupItemList(TalkID talkId, std::vector<Item> &items, int idx, bool selling /*= true*/)
{
ClearTextLines(5, 21);
previousScrollPos = 5;

if (talkId == TalkID::BoyBuy) {
const Item &item = itemData[idx];
const Item &item = items[idx];
UiFlags itemColor = item.getTextColorWithStatCheck();
SetLineText(20, 10, item.getName(), itemColor, true, item._iCurs, true);
if (gbIsHellfire)
Expand All @@ -573,8 +579,8 @@ void StoreSession::SetupItemList(TalkID talkId, Item *itemData, int storeLimit,
SetLineValue(10, item._iIvalue + (item._iIvalue / 2));
PrintStoreItem(item, 11, itemColor, true);
} else {
for (int l = 5; l < 20 && idx < storeLimit; l += 4) {
const Item &item = itemData[idx];
for (int l = 5; l < 20 && idx < items.size(); l += 4) {
const Item &item = items[idx];
if (!item.isEmpty()) {
UiFlags itemColor = item.getTextColorWithStatCheck();
SetLineText(20, l, item.getName(), itemColor, true, item._iCurs, true);
Expand All @@ -591,51 +597,69 @@ void StoreSession::SetupItemList(TalkID talkId, Item *itemData, int storeLimit,
if (currentTextLine != -1 && !textLine[currentTextLine].isSelectable() && currentTextLine != BackButtonLine())
currentTextLine = nextScrollPos;
} else {
numTextLines = std::max(storeLimit - BuyLineSpace, 0);
numTextLines = std::max(static_cast<int>(items.size()) - BuyLineSpace, 0);
}
}
}

void StoreSession::SetupItemList(TalkID talkId, std::vector<IndexedItem> &items, int idx, bool selling /*= true*/)
{
ClearTextLines(5, 21);
previousScrollPos = 5;

for (int l = 5; l < 20 && idx < items.size(); l += 4) {
const Item &item = *items[idx].itemPtr;
if (!item.isEmpty()) {
UiFlags itemColor = item.getTextColorWithStatCheck();
SetLineText(20, l, item.getName(), itemColor, true, item._iCurs, true);
SetLineValue(l, items[idx].displayValue);
PrintStoreItem(item, l + 1, itemColor, true);
nextScrollPos = l;
} else {
l -= 4;
}
idx++;
}

if (selling) {
if (currentTextLine != -1 && !textLine[currentTextLine].isSelectable() && currentTextLine != BackButtonLine())
currentTextLine = nextScrollPos;
} else {
numTextLines = std::max(static_cast<int>(items.size()) - BuyLineSpace, 0);
}
}

void StoreSession::SetupTownerItemList(TalkID talkId, int idx, bool selling /*= true*/)
{
Item *items = nullptr;
size_t storeLimit = 0;
std::vector<Item> boyItems = { boyItem };

switch (talkId) {
case TalkID::SmithBuy:
items = smithItems.data();
storeLimit = smithItems.size();
SetupItemList(talkId, smithItems, idx, selling);
break;
case TalkID::SmithPremiumBuy:
items = premiumItems.data();
storeLimit = premiumItems.size();
SetupItemList(talkId, premiumItems, idx, selling);
break;
case TalkID::HealerBuy:
items = healerItems.data();
storeLimit = healerItems.size();
SetupItemList(talkId, healerItems, idx, selling);
break;
case TalkID::WitchBuy:
items = witchItems.data();
storeLimit = witchItems.size();
SetupItemList(talkId, witchItems, idx, selling);
break;
case TalkID::BoyBuy:
// Special case for Boy's single item
SetupItemList(talkId, &boyItem, 1, idx, selling);
return; // Exit early since we handle Boy separately
SetupItemList(talkId, boyItems, idx, selling);
break;
case TalkID::SmithSell:
case TalkID::SmithRepair:
case TalkID::WitchSell:
case TalkID::WitchRecharge:
case TalkID::StorytellerIdentify:
SetupItemList(talkId, playerItems.data()->itemPtr, playerItems.size(), idx, selling);
return; // Exit early since we handle player items separately
SetupItemList(talkId, playerItems, idx, selling);
break;
default:
return; // Invalid TalkID, do nothing
}

if (items != nullptr) {
SetupItemList(talkId, items, storeLimit, idx, selling);
}
}

void StoreSession::SetBuyScreenHeader()
Expand Down Expand Up @@ -781,7 +805,7 @@ void StoreSession::SetupTownerSellScreen(TalkID talkId)
}

scrollPos = 0;
numTextLines = MyPlayer->_pNumInv;
numTextLines = playerItems.size();

Check warning on line 808 in Source/stores.cpp

View workflow job for this annotation

GitHub Actions / build

'=': conversion from 'size_t' to 'int', possible loss of data
renderGold = true;
SetLineText(20, 1, _("Which item is for sale?"), UiFlags::ColorWhitegold, false);
SetLineAsDivider(BuySellMenuDividerLine);
Expand Down
3 changes: 2 additions & 1 deletion Source/stores.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,7 +182,8 @@ class StoreSession {
void SetupConfirmScreen(Item &item);
void BuildPlayerItemsVector();
void FilterPlayerItemsForAction(TalkID talkId);
void SetupItemList(TalkID talkId, Item *itemData, int storeLimit, int idx, bool selling = true);
void SetupItemList(TalkID talkId, std::vector<Item> &items, int idx, bool selling /*= true*/);
void SetupItemList(TalkID talkId, std::vector<IndexedItem> &items, int idx, bool selling /*= true*/);
void SetupTownerItemList(TalkID talkId, int idx, bool selling = true);

/* Main Menu */
Expand Down

0 comments on commit 95cd85b

Please sign in to comment.