From 95cd85bcda943f42807ec38cb1075da659ad7e15 Mon Sep 17 00:00:00 2001 From: Eric Robinson Date: Fri, 20 Sep 2024 23:19:59 -0400 Subject: [PATCH] Fix broken sell --- Source/stores.cpp | 72 +++++++++++++++++++++++++++++++---------------- Source/stores.h | 3 +- 2 files changed, 50 insertions(+), 25 deletions(-) diff --git a/Source/stores.cpp b/Source/stores.cpp index 257fc9a12b9f..277180876326 100644 --- a/Source/stores.cpp +++ b/Source/stores.cpp @@ -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 }); } } @@ -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 &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) @@ -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); @@ -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(items.size()) - BuyLineSpace, 0); + } + } +} + +void StoreSession::SetupItemList(TalkID talkId, std::vector &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(items.size()) - BuyLineSpace, 0); } } void StoreSession::SetupTownerItemList(TalkID talkId, int idx, bool selling /*= true*/) { - Item *items = nullptr; - size_t storeLimit = 0; + std::vector 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() @@ -781,7 +805,7 @@ void StoreSession::SetupTownerSellScreen(TalkID talkId) } scrollPos = 0; - numTextLines = MyPlayer->_pNumInv; + numTextLines = playerItems.size(); renderGold = true; SetLineText(20, 1, _("Which item is for sale?"), UiFlags::ColorWhitegold, false); SetLineAsDivider(BuySellMenuDividerLine); diff --git a/Source/stores.h b/Source/stores.h index be89df9ebe86..b8a069c857bd 100644 --- a/Source/stores.h +++ b/Source/stores.h @@ -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 &items, int idx, bool selling /*= true*/); + void SetupItemList(TalkID talkId, std::vector &items, int idx, bool selling /*= true*/); void SetupTownerItemList(TalkID talkId, int idx, bool selling = true); /* Main Menu */