Skip to content

Commit 753b566

Browse files
authored
Use StaticVector for all vendors
1 parent 91dd3bf commit 753b566

5 files changed

Lines changed: 213 additions & 319 deletions

File tree

Source/items.cpp

Lines changed: 51 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1901,13 +1901,13 @@ _item_indexes RndSmithItem(const Player &player, int lvl)
19011901
return RndVendorItem<SmithItemOk, true>(player, 0, lvl);
19021902
}
19031903

1904-
void SortVendor(Item *itemList, size_t count)
1904+
void SortVendor(std::span<Item> itemList, size_t PinnedItemCount)
19051905
{
19061906
auto cmp = [](const Item &a, const Item &b) {
19071907
return a.IDidx < b.IDidx;
19081908
};
19091909

1910-
std::sort(itemList, itemList + count, cmp);
1910+
std::sort(itemList.begin() + PinnedItemCount, itemList.end(), cmp);
19111911
}
19121912

19131913
bool PremiumItemOk(const Player & /*player*/, const ItemData &item)
@@ -4388,10 +4388,11 @@ void SpawnSmith(int lvl)
43884388
maxItems = NumSmithBasicItemsHf;
43894389
}
43904390

4391-
const int iCnt = RandomIntBetween(10, maxItems);
4392-
for (int i = 0; i < iCnt; i++) {
4393-
Item &newItem = SmithItems[i];
4391+
const size_t iCnt = RandomIntBetween(10, maxItems);
4392+
SmithItems.clear();
43944393

4394+
while (SmithItems.size() < iCnt) {
4395+
Item newItem;
43954396
do {
43964397
newItem = {};
43974398
newItem._iSeed = AdvanceRndSeed();
@@ -4402,41 +4403,46 @@ void SpawnSmith(int lvl)
44024403

44034404
newItem._iCreateInfo = lvl | CF_SMITH;
44044405
newItem._iIdentified = true;
4406+
4407+
SmithItems.push_back(newItem);
44054408
}
4406-
for (int i = iCnt; i < NumSmithBasicItemsHf; i++)
4407-
SmithItems[i].clear();
44084409

4409-
SortVendor(SmithItems + PinnedItemCount, iCnt - PinnedItemCount);
4410+
SortVendor(SmithItems, PinnedItemCount);
4411+
}
4412+
4413+
void ReplacePremium(const Player &player, int idx)
4414+
{
4415+
int plvl = gbIsHellfire ? itemLevelAddHf[idx] : itemLevelAdd[idx];
4416+
plvl += player.getCharacterLevel();
4417+
SpawnOnePremium(PremiumItems[idx], plvl, player);
44104418
}
44114419

44124420
void SpawnPremium(const Player &player)
44134421
{
44144422
const int lvl = player.getCharacterLevel();
4415-
const int maxItems = gbIsHellfire ? NumSmithItemsHf : NumSmithItems;
4416-
if (PremiumItemCount < maxItems) {
4417-
for (int i = 0; i < maxItems; i++) {
4418-
if (PremiumItems[i].isEmpty()) {
4419-
const int plvl = PremiumItemLevel + (gbIsHellfire ? itemLevelAddHf[i] : itemLevelAdd[i]);
4420-
SpawnOnePremium(PremiumItems[i], plvl, player);
4421-
}
4422-
}
4423-
PremiumItemCount = maxItems;
4423+
const size_t maxItems = gbIsHellfire ? NumSmithItemsHf : NumSmithItems;
4424+
4425+
while (PremiumItems.size() < maxItems) {
4426+
int plvl = PremiumItemLevel + (gbIsHellfire ? itemLevelAddHf[PremiumItems.size()] : itemLevelAdd[PremiumItems.size()]);
4427+
Item item = {};
4428+
SpawnOnePremium(item, plvl, player);
4429+
PremiumItems.push_back(item);
44244430
}
4431+
44254432
while (PremiumItemLevel < lvl) {
44264433
PremiumItemLevel++;
4434+
Item *ptr = PremiumItems.begin();
44274435
if (gbIsHellfire) {
4428-
// Discard first 3 items and shift next 10
4429-
std::move(&PremiumItems[3], &PremiumItems[12] + 1, &PremiumItems[0]);
4430-
SpawnOnePremium(PremiumItems[10], PremiumItemLevel + itemLevelAddHf[10], player);
4436+
std::move(ptr + 3, ptr + 13, ptr);
44314437
PremiumItems[11] = PremiumItems[13];
4432-
SpawnOnePremium(PremiumItems[12], PremiumItemLevel + itemLevelAddHf[12], player);
44334438
PremiumItems[13] = PremiumItems[14];
4439+
SpawnOnePremium(PremiumItems[10], PremiumItemLevel + itemLevelAddHf[10], player);
4440+
SpawnOnePremium(PremiumItems[12], PremiumItemLevel + itemLevelAddHf[12], player);
44344441
SpawnOnePremium(PremiumItems[14], PremiumItemLevel + itemLevelAddHf[14], player);
44354442
} else {
4436-
// Discard first 2 items and shift next 3
4437-
std::move(&PremiumItems[2], &PremiumItems[4] + 1, &PremiumItems[0]);
4438-
SpawnOnePremium(PremiumItems[3], PremiumItemLevel + itemLevelAdd[3], player);
4443+
std::move(ptr + 2, ptr + 5, ptr);
44394444
PremiumItems[4] = PremiumItems[5];
4445+
SpawnOnePremium(PremiumItems[3], PremiumItemLevel + itemLevelAdd[3], player);
44404446
SpawnOnePremium(PremiumItems[5], PremiumItemLevel + itemLevelAdd[5], player);
44414447
}
44424448
}
@@ -4453,16 +4459,17 @@ void SpawnWitch(int lvl)
44534459
const int pinnedBookCount = gbIsHellfire ? RandomIntLessThan(MaxPinnedBookCount) : 0;
44544460
const int itemCount = RandomIntBetween(10, gbIsHellfire ? NumWitchItemsHf : NumWitchItems);
44554461
const int maxValue = gbIsHellfire ? MaxVendorValueHf : MaxVendorValue;
4462+
WitchItems.clear();
44564463

4457-
for (int i = 0; i < NumWitchItemsHf; i++) {
4458-
Item &item = WitchItems[i];
4459-
item = {};
4464+
for (int i = 0; i < itemCount; i++) {
4465+
Item item = {};
44604466

44614467
if (i < PinnedItemCount) {
44624468
item._iSeed = AdvanceRndSeed();
44634469
GetItemAttrs(item, PinnedItemTypes[i], 1);
44644470
item._iCreateInfo = lvl;
44654471
item._iStatFlag = true;
4472+
WitchItems.push_back(item);
44664473
continue;
44674474
}
44684475

@@ -4477,16 +4484,12 @@ void SpawnWitch(int lvl)
44774484
item._iCreateInfo = lvl | CF_WITCH;
44784485
item._iIdentified = true;
44794486
bookCount++;
4487+
WitchItems.push_back(item);
44804488
continue;
44814489
}
44824490
}
44834491
}
44844492

4485-
if (i >= itemCount) {
4486-
item.clear();
4487-
continue;
4488-
}
4489-
44904493
do {
44914494
item = {};
44924495
item._iSeed = AdvanceRndSeed();
@@ -4504,9 +4507,11 @@ void SpawnWitch(int lvl)
45044507

45054508
item._iCreateInfo = lvl | CF_WITCH;
45064509
item._iIdentified = true;
4510+
4511+
WitchItems.push_back(item);
45074512
}
45084513

4509-
SortVendor(WitchItems + PinnedItemCount, itemCount - PinnedItemCount);
4514+
SortVendor(WitchItems, PinnedItemCount);
45104515
}
45114516

45124517
void SpawnBoy(int lvl)
@@ -4629,34 +4634,30 @@ void SpawnHealer(int lvl)
46294634
{
46304635
constexpr size_t PinnedItemCount = NumHealerPinnedItems;
46314636
constexpr std::array<_item_indexes, PinnedItemCount + 1> PinnedItemTypes = { IDI_HEAL, IDI_FULLHEAL, IDI_RESURRECT };
4632-
const auto itemCount = static_cast<size_t>(RandomIntBetween(10, gbIsHellfire ? NumHealerItemsHf : NumHealerItems));
4637+
const size_t itemCount = static_cast<size_t>(RandomIntBetween(10, gbIsHellfire ? NumHealerItemsHf : NumHealerItems));
4638+
HealerItems.clear();
46334639

4634-
for (size_t i = 0; i < sizeof(HealerItems) / sizeof(HealerItems[0]); ++i) {
4635-
Item &item = HealerItems[i];
4636-
item = {};
4640+
for (size_t i = 0; i < itemCount; i++) {
4641+
Item item = {};
46374642

46384643
if (i < PinnedItemCount || (gbIsMultiplayer && i < NumHealerPinnedItemsMp)) {
46394644
item._iSeed = AdvanceRndSeed();
46404645
GetItemAttrs(item, PinnedItemTypes[i], 1);
46414646
item._iCreateInfo = lvl;
46424647
item._iStatFlag = true;
4643-
continue;
4644-
}
4645-
4646-
if (i >= itemCount) {
4647-
item.clear();
4648-
continue;
4648+
} else {
4649+
item._iSeed = AdvanceRndSeed();
4650+
SetRndSeed(item._iSeed);
4651+
const _item_indexes itype = RndHealerItem(*MyPlayer, lvl);
4652+
GetItemAttrs(item, itype, lvl);
4653+
item._iCreateInfo = lvl | CF_HEALER;
4654+
item._iIdentified = true;
46494655
}
46504656

4651-
item._iSeed = AdvanceRndSeed();
4652-
SetRndSeed(item._iSeed);
4653-
const _item_indexes itype = RndHealerItem(*MyPlayer, lvl);
4654-
GetItemAttrs(item, itype, lvl);
4655-
item._iCreateInfo = lvl | CF_HEALER;
4656-
item._iIdentified = true;
4657+
HealerItems.push_back(item);
46574658
}
46584659

4659-
SortVendor(HealerItems + PinnedItemCount, itemCount - PinnedItemCount);
4660+
SortVendor(HealerItems, PinnedItemCount);
46604661
}
46614662

46624663
void MakeGoldStack(Item &goldItem, int value)

Source/items.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -557,6 +557,7 @@ void UseItem(Player &player, item_misc_id Mid, SpellID spellID, int spellFrom);
557557
bool UseItemOpensHive(const Item &item, Point position);
558558
bool UseItemOpensGrave(const Item &item, Point position);
559559
void SpawnSmith(int lvl);
560+
void ReplacePremium(const Player &player, int idx);
560561
void SpawnPremium(const Player &player);
561562
void SpawnWitch(int lvl);
562563
void SpawnBoy(int lvl);

0 commit comments

Comments
 (0)