@@ -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
19131913bool 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
44124420void 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
45124517void 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
46624663void MakeGoldStack (Item &goldItem, int value)
0 commit comments