Browse Source

Use _item_indexes type where appropriate

pull/4599/head
ephphatha 4 years ago committed by Anders Jenbo
parent
commit
ea3ecbd619
  1. 4
      Source/inv.cpp
  2. 4
      Source/inv.h
  3. 194
      Source/items.cpp
  4. 10
      Source/items.h
  5. 2
      Source/missiles.cpp
  6. 6
      Source/objects.cpp
  7. 2
      Source/objects.h

4
Source/inv.cpp

@ -1808,7 +1808,7 @@ int InvPutItem(const Player &player, Point position, const Item &item)
return ii; return ii;
} }
int SyncPutItem(const Player &player, Point position, int idx, uint16_t icreateinfo, int iseed, int id, int dur, int mdur, int ch, int mch, int ivalue, uint32_t ibuff, int toHit, int maxDam, int minStr, int minMag, int minDex, int ac) int SyncPutItem(const Player &player, Point position, _item_indexes idx, uint16_t icreateinfo, int iseed, int id, int dur, int mdur, int ch, int mch, int ivalue, uint32_t ibuff, int toHit, int maxDam, int minStr, int minMag, int minDex, int ac)
{ {
if (player.isOnLevel(0)) { if (player.isOnLevel(0)) {
if (idx == IDI_RUNEBOMB && OpensHive(position)) if (idx == IDI_RUNEBOMB && OpensHive(position))
@ -1824,7 +1824,7 @@ int SyncPutItem(const Player &player, Point position, int idx, uint16_t icreatei
return SyncDropItem(*itemTile, idx, icreateinfo, iseed, id, dur, mdur, ch, mch, ivalue, ibuff, toHit, maxDam, minStr, minMag, minDex, ac); return SyncDropItem(*itemTile, idx, icreateinfo, iseed, id, dur, mdur, ch, mch, ivalue, ibuff, toHit, maxDam, minStr, minMag, minDex, ac);
} }
int SyncDropItem(Point position, int idx, uint16_t icreateinfo, int iseed, int id, int dur, int mdur, int ch, int mch, int ivalue, uint32_t ibuff, int toHit, int maxDam, int minStr, int minMag, int minDex, int ac) int SyncDropItem(Point position, _item_indexes idx, uint16_t icreateinfo, int iseed, int id, int dur, int mdur, int ch, int mch, int ivalue, uint32_t ibuff, int toHit, int maxDam, int minStr, int minMag, int minDex, int ac)
{ {
int ii = AllocateItem(); int ii = AllocateItem();
auto &item = Items[ii]; auto &item = Items[ii];

4
Source/inv.h

@ -224,8 +224,8 @@ void SyncGetItem(Point position, int32_t iseed, _item_indexes idx, uint16_t ci);
bool CanPut(Point position); bool CanPut(Point position);
int InvPutItem(const Player &player, Point position, const Item &item); int InvPutItem(const Player &player, Point position, const Item &item);
int SyncPutItem(const Player &player, Point position, int idx, uint16_t icreateinfo, int iseed, int Id, int dur, int mdur, int ch, int mch, int ivalue, uint32_t ibuff, int toHit, int maxDam, int minStr, int minMag, int minDex, int ac); int SyncPutItem(const Player &player, Point position, _item_indexes idx, uint16_t icreateinfo, int iseed, int Id, int dur, int mdur, int ch, int mch, int ivalue, uint32_t ibuff, int toHit, int maxDam, int minStr, int minMag, int minDex, int ac);
int SyncDropItem(Point position, int idx, uint16_t icreateinfo, int iseed, int id, int dur, int mdur, int ch, int mch, int ivalue, uint32_t ibuff, int toHit, int maxDam, int minStr, int minMag, int minDex, int ac); int SyncDropItem(Point position, _item_indexes idx, uint16_t icreateinfo, int iseed, int id, int dur, int mdur, int ch, int mch, int ivalue, uint32_t ibuff, int toHit, int maxDam, int minStr, int minMag, int minDex, int ac);
int SyncPutEar(const Player &player, Point position, uint16_t icreateinfo, int iseed, uint8_t cursval, string_view heroname); int SyncPutEar(const Player &player, Point position, uint16_t icreateinfo, int iseed, uint8_t cursval, string_view heroname);
int SyncDropEar(Point position, uint16_t icreateinfo, int iseed, uint8_t cursval, string_view heroname); int SyncDropEar(Point position, uint16_t icreateinfo, int iseed, uint8_t cursval, string_view heroname);
int8_t CheckInvHLight(); int8_t CheckInvHLight();

194
Source/items.cpp

@ -452,7 +452,7 @@ void AddInitItems()
void SpawnNote() void SpawnNote()
{ {
int id; _item_indexes id;
switch (currlevel) { switch (currlevel) {
case 22: case 22:
@ -1306,16 +1306,16 @@ void GetItemBonus(const Player &player, Item &item, int minlvl, int maxlvl, bool
} }
} }
int RndUItem(Monster *monster) _item_indexes RndUItem(Monster *monster)
{ {
if (monster != nullptr && (monster->data().treasure & T_UNIQ) != 0 && !gbIsMultiplayer) if (monster != nullptr && (monster->data().treasure & T_UNIQ) != 0 && !gbIsMultiplayer)
return -((monster->data().treasure & T_MASK) + 1); return static_cast<_item_indexes>(-((monster->data().treasure & T_MASK) + 1));
static std::array<int, 512> ril; static std::array<_item_indexes, 512> ril;
int curlv = ItemsGetCurrlevel(); int curlv = ItemsGetCurrlevel();
size_t ri = 0; size_t ri = 0;
for (int i = 0; AllItemsList[i].iLoc != ILOC_INVALID; i++) { for (std::underlying_type_t<_item_indexes> i = IDI_GOLD; i <= IDI_LAST; i++) {
if (!IsItemAvailable(i)) if (!IsItemAvailable(i))
continue; continue;
@ -1340,7 +1340,7 @@ int RndUItem(Monster *monster)
if (AllItemsList[i].iSpell == SPL_HEALOTHER && !gbIsMultiplayer) if (AllItemsList[i].iSpell == SPL_HEALOTHER && !gbIsMultiplayer)
okflag = false; okflag = false;
if (okflag && ri < ril.size()) { if (okflag && ri < ril.size()) {
ril[ri] = i; ril[ri] = static_cast<_item_indexes>(i);
ri++; ri++;
} }
} }
@ -1348,23 +1348,23 @@ int RndUItem(Monster *monster)
return ril[GenerateRnd(static_cast<int>(ri))]; return ril[GenerateRnd(static_cast<int>(ri))];
} }
int RndAllItems() _item_indexes RndAllItems()
{ {
if (GenerateRnd(100) > 25) if (GenerateRnd(100) > 25)
return IDI_GOLD; return IDI_GOLD;
static std::array<int, 512> ril; static std::array<_item_indexes, 512> ril;
int curlv = ItemsGetCurrlevel(); int curlv = ItemsGetCurrlevel();
size_t ri = 0; size_t ri = 0;
for (int i = 0; AllItemsList[i].iLoc != ILOC_INVALID; i++) { for (std::underlying_type_t<_item_indexes> i = IDI_GOLD; i <= IDI_LAST; i++) {
if (!IsItemAvailable(i)) if (!IsItemAvailable(i))
continue; continue;
if (IsAnyOf(AllItemsList[i].iSpell, SPL_RESURRECT, SPL_HEALOTHER) && !gbIsMultiplayer) if (IsAnyOf(AllItemsList[i].iSpell, SPL_RESURRECT, SPL_HEALOTHER) && !gbIsMultiplayer)
continue; continue;
if (AllItemsList[i].iRnd != IDROP_NEVER && 2 * curlv >= AllItemsList[i].iMinMLvl && ri < ril.size()) { if (AllItemsList[i].iRnd != IDROP_NEVER && 2 * curlv >= AllItemsList[i].iMinMLvl && ri < ril.size()) {
ril[ri] = i; ril[ri] = static_cast<_item_indexes>(i);
ri++; ri++;
} }
} }
@ -1372,12 +1372,12 @@ int RndAllItems()
return ril[GenerateRnd(static_cast<int>(ri))]; return ril[GenerateRnd(static_cast<int>(ri))];
} }
int RndTypeItems(ItemType itemType, int imid, int lvl) _item_indexes RndTypeItems(ItemType itemType, int imid, int lvl)
{ {
static std::array<int, 512> ril; static std::array<_item_indexes, 512> ril;
size_t ri = 0; size_t ri = 0;
for (int i = 0; AllItemsList[i].iLoc != ILOC_INVALID; i++) { for (std::underlying_type_t<_item_indexes> i = IDI_GOLD; i <= IDI_LAST; i++) {
if (!IsItemAvailable(i)) if (!IsItemAvailable(i))
continue; continue;
@ -1391,7 +1391,7 @@ int RndTypeItems(ItemType itemType, int imid, int lvl)
if (imid != -1 && AllItemsList[i].iMiscId != imid) if (imid != -1 && AllItemsList[i].iMiscId != imid)
okflag = false; okflag = false;
if (okflag && ri < ril.size()) { if (okflag && ri < ril.size()) {
ril[ri] = i; ril[ri] = static_cast<_item_indexes>(i);
ri++; ri++;
} }
} }
@ -1460,7 +1460,7 @@ void ItemRndDur(Item &item)
item._iDurability = GenerateRnd(item._iMaxDur / 2) + (item._iMaxDur / 4) + 1; item._iDurability = GenerateRnd(item._iMaxDur / 2) + (item._iMaxDur / 4) + 1;
} }
void SetupAllItems(const Player &player, Item &item, int idx, int iseed, int lvl, int uper, bool onlygood, bool recreate, bool pregen) void SetupAllItems(const Player &player, Item &item, _item_indexes idx, int iseed, int lvl, int uper, bool onlygood, bool recreate, bool pregen)
{ {
item._iSeed = iseed; item._iSeed = iseed;
SetRndSeed(iseed); SetRndSeed(iseed);
@ -1513,7 +1513,7 @@ void SetupAllItems(const Player &player, Item &item, int idx, int iseed, int lvl
SetupItem(item); SetupItem(item);
} }
void SetupBaseItem(Point position, int idx, bool onlygood, bool sendmsg, bool delta) void SetupBaseItem(Point position, _item_indexes idx, bool onlygood, bool sendmsg, bool delta)
{ {
if (ActiveItemCount >= MAXITEMS) if (ActiveItemCount >= MAXITEMS)
return; return;
@ -1533,14 +1533,13 @@ void SetupBaseItem(Point position, int idx, bool onlygood, bool sendmsg, bool de
void SetupAllUseful(Item &item, int iseed, int lvl) void SetupAllUseful(Item &item, int iseed, int lvl)
{ {
int idx;
item._iSeed = iseed; item._iSeed = iseed;
SetRndSeed(iseed); SetRndSeed(iseed);
_item_indexes idx;
if (gbIsHellfire) { if (gbIsHellfire) {
idx = GenerateRnd(7); switch (GenerateRnd(7)) {
switch (idx) {
case 0: case 0:
idx = IDI_PORTAL; idx = IDI_PORTAL;
if (lvl <= 1) if (lvl <= 1)
@ -1871,12 +1870,12 @@ bool SmithItemOk(const Player &player, int i)
} }
template <bool (*Ok)(const Player &, int), bool ConsiderDropRate = false> template <bool (*Ok)(const Player &, int), bool ConsiderDropRate = false>
int RndVendorItem(const Player &player, int minlvl, int maxlvl) _item_indexes RndVendorItem(const Player &player, int minlvl, int maxlvl)
{ {
static std::array<int, 512> ril; static std::array<_item_indexes, 512> ril;
size_t ri = 0; size_t ri = 0;
for (int i = 1; AllItemsList[i].iLoc != ILOC_INVALID; i++) { for (std::underlying_type_t<_item_indexes> i = IDI_WARRIOR; i <= IDI_LAST && AllItemsList[i].iLoc != ILOC_INVALID; i++) {
if (!IsItemAvailable(i)) if (!IsItemAvailable(i))
continue; continue;
if (AllItemsList[i].iRnd == IDROP_NEVER) if (AllItemsList[i].iRnd == IDROP_NEVER)
@ -1886,7 +1885,7 @@ int RndVendorItem(const Player &player, int minlvl, int maxlvl)
if (AllItemsList[i].iMinMLvl < minlvl || AllItemsList[i].iMinMLvl > maxlvl) if (AllItemsList[i].iMinMLvl < minlvl || AllItemsList[i].iMinMLvl > maxlvl)
continue; continue;
ril[ri] = i; ril[ri] = static_cast<_item_indexes>(i);
ri++; ri++;
if (ri >= ril.size()) if (ri >= ril.size())
break; break;
@ -1894,7 +1893,7 @@ int RndVendorItem(const Player &player, int minlvl, int maxlvl)
if (!ConsiderDropRate || AllItemsList[i].iRnd != IDROP_DOUBLE) if (!ConsiderDropRate || AllItemsList[i].iRnd != IDROP_DOUBLE)
continue; continue;
ril[ri] = i; ril[ri] = static_cast<_item_indexes>(i);
ri++; ri++;
if (ri >= ril.size()) if (ri >= ril.size())
break; break;
@ -1903,7 +1902,7 @@ int RndVendorItem(const Player &player, int minlvl, int maxlvl)
return ril[GenerateRnd(static_cast<int>(ri))]; return ril[GenerateRnd(static_cast<int>(ri))];
} }
int RndSmithItem(const Player &player, int lvl) _item_indexes RndSmithItem(const Player &player, int lvl)
{ {
return RndVendorItem<SmithItemOk, true>(player, 0, lvl); return RndVendorItem<SmithItemOk, true>(player, 0, lvl);
} }
@ -1942,7 +1941,7 @@ bool PremiumItemOk(const Player &player, int i)
return true; return true;
} }
int RndPremiumItem(const Player &player, int minlvl, int maxlvl) _item_indexes RndPremiumItem(const Player &player, int minlvl, int maxlvl)
{ {
return RndVendorItem<PremiumItemOk>(player, minlvl, maxlvl); return RndVendorItem<PremiumItemOk>(player, minlvl, maxlvl);
} }
@ -1968,7 +1967,7 @@ void SpawnOnePremium(Item &premiumItem, int plvl, const Player &player)
premiumItem = {}; premiumItem = {};
premiumItem._iSeed = AdvanceRndSeed(); premiumItem._iSeed = AdvanceRndSeed();
SetRndSeed(premiumItem._iSeed); SetRndSeed(premiumItem._iSeed);
int itemType = RndPremiumItem(player, plvl / 4, plvl); _item_indexes itemType = RndPremiumItem(player, plvl / 4, plvl);
GetItemAttrs(premiumItem, itemType, plvl); GetItemAttrs(premiumItem, itemType, plvl);
GetItemBonus(player, premiumItem, plvl / 2, plvl, true, !gbIsHellfire); GetItemBonus(player, premiumItem, plvl / 2, plvl, true, !gbIsHellfire);
@ -2051,12 +2050,12 @@ bool WitchItemOk(const Player &player, int i)
return true; return true;
} }
int RndWitchItem(const Player &player, int lvl) _item_indexes RndWitchItem(const Player &player, int lvl)
{ {
return RndVendorItem<WitchItemOk>(player, 0, lvl); return RndVendorItem<WitchItemOk>(player, 0, lvl);
} }
int RndBoyItem(const Player &player, int lvl) _item_indexes RndBoyItem(const Player &player, int lvl)
{ {
return RndVendorItem<PremiumItemOk>(player, 0, lvl); return RndVendorItem<PremiumItemOk>(player, 0, lvl);
} }
@ -2090,7 +2089,7 @@ bool HealerItemOk(const Player &player, int i)
return false; return false;
} }
int RndHealerItem(const Player &player, int lvl) _item_indexes RndHealerItem(const Player &player, int lvl)
{ {
return RndVendorItem<HealerItemOk>(player, 0, lvl); return RndVendorItem<HealerItemOk>(player, 0, lvl);
} }
@ -2098,7 +2097,7 @@ int RndHealerItem(const Player &player, int lvl)
void RecreateSmithItem(const Player &player, Item &item, int lvl, int iseed) void RecreateSmithItem(const Player &player, Item &item, int lvl, int iseed)
{ {
SetRndSeed(iseed); SetRndSeed(iseed);
int itype = RndSmithItem(player, lvl); _item_indexes itype = RndSmithItem(player, lvl);
GetItemAttrs(item, itype, lvl); GetItemAttrs(item, itype, lvl);
item._iSeed = iseed; item._iSeed = iseed;
@ -2109,7 +2108,7 @@ void RecreateSmithItem(const Player &player, Item &item, int lvl, int iseed)
void RecreatePremiumItem(const Player &player, Item &item, int plvl, int iseed) void RecreatePremiumItem(const Player &player, Item &item, int plvl, int iseed)
{ {
SetRndSeed(iseed); SetRndSeed(iseed);
int itype = RndPremiumItem(player, plvl / 4, plvl); _item_indexes itype = RndPremiumItem(player, plvl / 4, plvl);
GetItemAttrs(item, itype, plvl); GetItemAttrs(item, itype, plvl);
GetItemBonus(player, item, plvl / 2, plvl, true, !gbIsHellfire); GetItemBonus(player, item, plvl / 2, plvl, true, !gbIsHellfire);
@ -2121,7 +2120,7 @@ void RecreatePremiumItem(const Player &player, Item &item, int plvl, int iseed)
void RecreateBoyItem(const Player &player, Item &item, int lvl, int iseed) void RecreateBoyItem(const Player &player, Item &item, int lvl, int iseed)
{ {
SetRndSeed(iseed); SetRndSeed(iseed);
int itype = RndBoyItem(player, lvl); _item_indexes itype = RndBoyItem(player, lvl);
GetItemAttrs(item, itype, lvl); GetItemAttrs(item, itype, lvl);
GetItemBonus(player, item, lvl, 2 * lvl, true, true); GetItemBonus(player, item, lvl, 2 * lvl, true, true);
@ -2130,7 +2129,7 @@ void RecreateBoyItem(const Player &player, Item &item, int lvl, int iseed)
item._iIdentified = true; item._iIdentified = true;
} }
void RecreateWitchItem(const Player &player, Item &item, int idx, int lvl, int iseed) void RecreateWitchItem(const Player &player, Item &item, _item_indexes idx, int lvl, int iseed)
{ {
if (IsAnyOf(idx, IDI_MANA, IDI_FULLMANA, IDI_PORTAL)) { if (IsAnyOf(idx, IDI_MANA, IDI_FULLMANA, IDI_PORTAL)) {
GetItemAttrs(item, idx, lvl); GetItemAttrs(item, idx, lvl);
@ -2140,7 +2139,7 @@ void RecreateWitchItem(const Player &player, Item &item, int idx, int lvl, int i
GetItemAttrs(item, idx, lvl); GetItemAttrs(item, idx, lvl);
} else { } else {
SetRndSeed(iseed); SetRndSeed(iseed);
int itype = RndWitchItem(player, lvl); _item_indexes itype = RndWitchItem(player, lvl);
GetItemAttrs(item, itype, lvl); GetItemAttrs(item, itype, lvl);
int iblvl = -1; int iblvl = -1;
if (GenerateRnd(100) <= 5) if (GenerateRnd(100) <= 5)
@ -2156,13 +2155,13 @@ void RecreateWitchItem(const Player &player, Item &item, int idx, int lvl, int i
item._iIdentified = true; item._iIdentified = true;
} }
void RecreateHealerItem(const Player &player, Item &item, int idx, int lvl, int iseed) void RecreateHealerItem(const Player &player, Item &item, _item_indexes idx, int lvl, int iseed)
{ {
if (IsAnyOf(idx, IDI_HEAL, IDI_FULLHEAL, IDI_RESURRECT)) { if (IsAnyOf(idx, IDI_HEAL, IDI_FULLHEAL, IDI_RESURRECT)) {
GetItemAttrs(item, idx, lvl); GetItemAttrs(item, idx, lvl);
} else { } else {
SetRndSeed(iseed); SetRndSeed(iseed);
int itype = RndHealerItem(player, lvl); _item_indexes itype = RndHealerItem(player, lvl);
GetItemAttrs(item, itype, lvl); GetItemAttrs(item, itype, lvl);
} }
@ -2171,7 +2170,7 @@ void RecreateHealerItem(const Player &player, Item &item, int idx, int lvl, int
item._iIdentified = true; item._iIdentified = true;
} }
void RecreateTownItem(const Player &player, Item &item, int idx, uint16_t icreateinfo, int iseed) void RecreateTownItem(const Player &player, Item &item, _item_indexes idx, uint16_t icreateinfo, int iseed)
{ {
if ((icreateinfo & CF_SMITH) != 0) if ((icreateinfo & CF_SMITH) != 0)
RecreateSmithItem(player, item, icreateinfo & CF_LEVEL, iseed); RecreateSmithItem(player, item, icreateinfo & CF_LEVEL, iseed);
@ -2192,7 +2191,7 @@ void CreateMagicItem(Point position, int lvl, ItemType itemType, int imid, int i
int ii = AllocateItem(); int ii = AllocateItem();
auto &item = Items[ii]; auto &item = Items[ii];
int idx = RndTypeItems(itemType, imid, lvl); _item_indexes idx = RndTypeItems(itemType, imid, lvl);
while (true) { while (true) {
item = {}; item = {};
@ -2224,7 +2223,7 @@ void NextItemRecord(int i)
itemrecord[i].nIndex = itemrecord[gnNumGetRecords].nIndex; itemrecord[i].nIndex = itemrecord[gnNumGetRecords].nIndex;
} }
int RndItemForMonsterLevel(int8_t monsterLevel) _item_indexes RndItemForMonsterLevel(int8_t monsterLevel)
{ {
if (GenerateRnd(100) > 40) if (GenerateRnd(100) > 40)
return IDI_NONE; return IDI_NONE;
@ -2232,21 +2231,21 @@ int RndItemForMonsterLevel(int8_t monsterLevel)
if (GenerateRnd(100) > 25) if (GenerateRnd(100) > 25)
return IDI_GOLD; return IDI_GOLD;
static std::array<int, 512> ril; static std::array<_item_indexes, 512> ril;
size_t ri = 0; size_t ri = 0;
for (int i = 0; AllItemsList[i].iLoc != ILOC_INVALID; i++) { for (std::underlying_type_t<_item_indexes> i = IDI_GOLD; i <= IDI_LAST; i++) {
if (!IsItemAvailable(i)) if (!IsItemAvailable(i))
continue; continue;
if (AllItemsList[i].iRnd == IDROP_DOUBLE && monsterLevel >= AllItemsList[i].iMinMLvl if (AllItemsList[i].iRnd == IDROP_DOUBLE && monsterLevel >= AllItemsList[i].iMinMLvl
&& ri < ril.size()) { && ri < ril.size()) {
ril[ri] = i; ril[ri] = static_cast<_item_indexes>(i);
ri++; ri++;
} }
if (AllItemsList[i].iRnd != IDROP_NEVER && monsterLevel >= AllItemsList[i].iMinMLvl if (AllItemsList[i].iRnd != IDROP_NEVER && monsterLevel >= AllItemsList[i].iMinMLvl
&& ri < ril.size()) { && ri < ril.size()) {
ril[ri] = i; ril[ri] = static_cast<_item_indexes>(i);
ri++; ri++;
} }
if (AllItemsList[i].iSpell == SPL_RESURRECT && !gbIsMultiplayer) if (AllItemsList[i].iSpell == SPL_RESURRECT && !gbIsMultiplayer)
@ -2747,9 +2746,9 @@ void CalcPlrInv(Player &player, bool loadgfx)
} }
} }
void InitializeItem(Item &item, int itemData) void InitializeItem(Item &item, _item_indexes itemData)
{ {
auto &pAllItem = AllItemsList[itemData]; auto &pAllItem = AllItemsList[static_cast<size_t>(itemData)];
// zero-initialize struct // zero-initialize struct
item = {}; item = {};
@ -2963,29 +2962,30 @@ Point GetSuperItemLoc(Point position)
return itemPosition.value_or(Point { 0, 0 }); // TODO handle no space for dropping items return itemPosition.value_or(Point { 0, 0 }); // TODO handle no space for dropping items
} }
void GetItemAttrs(Item &item, int itemData, int lvl) void GetItemAttrs(Item &item, _item_indexes itemData, int lvl)
{ {
item._itype = AllItemsList[itemData].itype; auto &baseItemData = AllItemsList[static_cast<size_t>(itemData)];
item._iCurs = AllItemsList[itemData].iCurs; item._itype = baseItemData.itype;
CopyUtf8(item._iName, _(AllItemsList[itemData].iName), sizeof(item._iName)); item._iCurs = baseItemData.iCurs;
CopyUtf8(item._iIName, _(AllItemsList[itemData].iName), sizeof(item._iIName)); CopyUtf8(item._iName, _(baseItemData.iName), sizeof(item._iName));
item._iLoc = AllItemsList[itemData].iLoc; CopyUtf8(item._iIName, _(baseItemData.iName), sizeof(item._iIName));
item._iClass = AllItemsList[itemData].iClass; item._iLoc = baseItemData.iLoc;
item._iMinDam = AllItemsList[itemData].iMinDam; item._iClass = baseItemData.iClass;
item._iMaxDam = AllItemsList[itemData].iMaxDam; item._iMinDam = baseItemData.iMinDam;
item._iAC = AllItemsList[itemData].iMinAC + GenerateRnd(AllItemsList[itemData].iMaxAC - AllItemsList[itemData].iMinAC + 1); item._iMaxDam = baseItemData.iMaxDam;
item._iFlags = AllItemsList[itemData].iFlags; item._iAC = baseItemData.iMinAC + GenerateRnd(baseItemData.iMaxAC - baseItemData.iMinAC + 1);
item._iMiscId = AllItemsList[itemData].iMiscId; item._iFlags = baseItemData.iFlags;
item._iSpell = AllItemsList[itemData].iSpell; item._iMiscId = baseItemData.iMiscId;
item._iSpell = baseItemData.iSpell;
item._iMagical = ITEM_QUALITY_NORMAL; item._iMagical = ITEM_QUALITY_NORMAL;
item._ivalue = AllItemsList[itemData].iValue; item._ivalue = baseItemData.iValue;
item._iIvalue = AllItemsList[itemData].iValue; item._iIvalue = baseItemData.iValue;
item._iDurability = AllItemsList[itemData].iDurability; item._iDurability = baseItemData.iDurability;
item._iMaxDur = AllItemsList[itemData].iDurability; item._iMaxDur = baseItemData.iDurability;
item._iMinStr = AllItemsList[itemData].iMinStr; item._iMinStr = baseItemData.iMinStr;
item._iMinMag = AllItemsList[itemData].iMinMag; item._iMinMag = baseItemData.iMinMag;
item._iMinDex = AllItemsList[itemData].iMinDex; item._iMinDex = baseItemData.iMinDex;
item.IDidx = static_cast<_item_indexes>(itemData); item.IDidx = itemData;
if (gbIsHellfire) if (gbIsHellfire)
item.dwBuff |= CF_HELLFIRE; item.dwBuff |= CF_HELLFIRE;
item._iPrePower = IPL_INVALID; item._iPrePower = IPL_INVALID;
@ -3049,36 +3049,36 @@ void SpawnUnique(_unique_items uid, Point position)
GetSuperItemSpace(position, ii); GetSuperItemSpace(position, ii);
int curlv = ItemsGetCurrlevel(); int curlv = ItemsGetCurrlevel();
int idx = 0; std::underlying_type_t<_item_indexes> idx = 0;
while (AllItemsList[idx].iItemId != UniqueItems[uid].UIItemId) while (AllItemsList[idx].iItemId != UniqueItems[uid].UIItemId)
idx++; idx++;
GetItemAttrs(item, idx, curlv); GetItemAttrs(item, static_cast<_item_indexes>(idx), curlv);
GetUniqueItem(*MyPlayer, item, uid); GetUniqueItem(*MyPlayer, item, uid);
SetupItem(item); SetupItem(item);
} }
void SpawnItem(Monster &monster, Point position, bool sendmsg) void SpawnItem(Monster &monster, Point position, bool sendmsg)
{ {
int idx; _item_indexes idx;
bool onlygood = true; bool onlygood = true;
if (monster.isUnique() || ((monster.data().treasure & T_UNIQ) != 0 && gbIsMultiplayer)) { if (monster.isUnique() || ((monster.data().treasure & T_UNIQ) != 0 && gbIsMultiplayer)) {
idx = RndUItem(&monster); idx = RndUItem(&monster);
if (idx < 0) { if (idx < IDI_GOLD) {
SpawnUnique(static_cast<_unique_items>(-(idx + 1)), position); SpawnUnique(static_cast<_unique_items>(-(idx + 1)), position);
return; return;
} }
onlygood = true; onlygood = true;
} else if (Quests[Q_MUSHROOM]._qactive != QUEST_ACTIVE || Quests[Q_MUSHROOM]._qvar1 != QS_MUSHGIVEN) { } else if (Quests[Q_MUSHROOM]._qactive != QUEST_ACTIVE || Quests[Q_MUSHROOM]._qvar1 != QS_MUSHGIVEN) {
idx = RndItem(monster); int optionalIndexOrUniqueIndex = RndItem(monster);
if (idx == 0) if (optionalIndexOrUniqueIndex == 0) // No drop
return; return;
if (idx > 0) { if (optionalIndexOrUniqueIndex > 0) { // Item index
idx--; idx = static_cast<_item_indexes>(optionalIndexOrUniqueIndex - 1);
onlygood = false; onlygood = false;
} else { } else { // Unique item index
SpawnUnique(static_cast<_unique_items>(-(idx + 1)), position); SpawnUnique(static_cast<_unique_items>(-(optionalIndexOrUniqueIndex + 1)), position);
return; return;
} }
} else { } else {
@ -3106,7 +3106,7 @@ void SpawnItem(Monster &monster, Point position, bool sendmsg)
void CreateRndItem(Point position, bool onlygood, bool sendmsg, bool delta) void CreateRndItem(Point position, bool onlygood, bool sendmsg, bool delta)
{ {
int idx = onlygood ? RndUItem(nullptr) : RndAllItems(); _item_indexes idx = onlygood ? RndUItem(nullptr) : RndAllItems();
SetupBaseItem(position, idx, onlygood, sendmsg, delta); SetupBaseItem(position, idx, onlygood, sendmsg, delta);
} }
@ -3128,7 +3128,7 @@ void CreateRndUseful(Point position, bool sendmsg)
void CreateTypeItem(Point position, bool onlygood, ItemType itemType, int imisc, bool sendmsg, bool delta) void CreateTypeItem(Point position, bool onlygood, ItemType itemType, int imisc, bool sendmsg, bool delta)
{ {
int idx; _item_indexes idx;
int curlv = ItemsGetCurrlevel(); int curlv = ItemsGetCurrlevel();
if (itemType != ItemType::Gold) if (itemType != ItemType::Gold)
@ -3139,7 +3139,7 @@ void CreateTypeItem(Point position, bool onlygood, ItemType itemType, int imisc,
SetupBaseItem(position, idx, onlygood, sendmsg, delta); SetupBaseItem(position, idx, onlygood, sendmsg, delta);
} }
void RecreateItem(const Player &player, Item &item, int idx, uint16_t icreateinfo, int iseed, int ivalue, bool isHellfire) void RecreateItem(const Player &player, Item &item, _item_indexes idx, uint16_t icreateinfo, int iseed, int ivalue, bool isHellfire)
{ {
bool tmpIsHellfire = gbIsHellfire; bool tmpIsHellfire = gbIsHellfire;
gbIsHellfire = isHellfire; gbIsHellfire = isHellfire;
@ -3260,7 +3260,7 @@ void CornerstoneLoad(Point position)
CornerStone.item = item; CornerStone.item = item;
} }
void SpawnQuestItem(int itemid, Point position, int randarea, int selflag) void SpawnQuestItem(_item_indexes itemid, Point position, int randarea, int selflag)
{ {
if (randarea > 0) { if (randarea > 0) {
int tries = 0; int tries = 0;
@ -3307,7 +3307,7 @@ void SpawnQuestItem(int itemid, Point position, int randarea, int selflag)
} }
} }
void SpawnRewardItem(int itemid, Point position, bool sendmsg) void SpawnRewardItem(_item_indexes itemid, Point position, bool sendmsg)
{ {
if (ActiveItemCount >= MAXITEMS) if (ActiveItemCount >= MAXITEMS)
return; return;
@ -4016,7 +4016,7 @@ void SpawnSmith(int lvl)
newItem = {}; newItem = {};
newItem._iSeed = AdvanceRndSeed(); newItem._iSeed = AdvanceRndSeed();
SetRndSeed(newItem._iSeed); SetRndSeed(newItem._iSeed);
int itemData = RndSmithItem(*MyPlayer, lvl); _item_indexes itemData = RndSmithItem(*MyPlayer, lvl);
GetItemAttrs(newItem, itemData, lvl); GetItemAttrs(newItem, itemData, lvl);
} while (newItem._iIvalue > maxValue); } while (newItem._iIvalue > maxValue);
@ -4065,9 +4065,9 @@ void SpawnPremium(const Player &player)
void SpawnWitch(int lvl) void SpawnWitch(int lvl)
{ {
constexpr int PinnedItemCount = 3; constexpr int PinnedItemCount = 3;
constexpr std::array<int, PinnedItemCount> PinnedItemTypes = { IDI_MANA, IDI_FULLMANA, IDI_PORTAL }; constexpr std::array<_item_indexes, PinnedItemCount> PinnedItemTypes = { IDI_MANA, IDI_FULLMANA, IDI_PORTAL };
constexpr int MaxPinnedBookCount = 4; constexpr int MaxPinnedBookCount = 4;
constexpr std::array<int, MaxPinnedBookCount> PinnedBookTypes = { IDI_BOOK1, IDI_BOOK2, IDI_BOOK3, IDI_BOOK4 }; constexpr std::array<_item_indexes, MaxPinnedBookCount> PinnedBookTypes = { IDI_BOOK1, IDI_BOOK2, IDI_BOOK3, IDI_BOOK4 };
int bookCount = 0; int bookCount = 0;
const int pinnedBookCount = gbIsHellfire ? GenerateRnd(MaxPinnedBookCount) : 0; const int pinnedBookCount = gbIsHellfire ? GenerateRnd(MaxPinnedBookCount) : 0;
@ -4089,7 +4089,7 @@ void SpawnWitch(int lvl)
if (gbIsHellfire) { if (gbIsHellfire) {
if (i < PinnedItemCount + MaxPinnedBookCount && bookCount < pinnedBookCount) { if (i < PinnedItemCount + MaxPinnedBookCount && bookCount < pinnedBookCount) {
int bookType = PinnedBookTypes[i - PinnedItemCount]; _item_indexes bookType = PinnedBookTypes[i - PinnedItemCount];
if (lvl >= AllItemsList[bookType].iMinMLvl) { if (lvl >= AllItemsList[bookType].iMinMLvl) {
item._iSeed = AdvanceRndSeed(); item._iSeed = AdvanceRndSeed();
SetRndSeed(item._iSeed); SetRndSeed(item._iSeed);
@ -4111,7 +4111,7 @@ void SpawnWitch(int lvl)
item = {}; item = {};
item._iSeed = AdvanceRndSeed(); item._iSeed = AdvanceRndSeed();
SetRndSeed(item._iSeed); SetRndSeed(item._iSeed);
int itemData = RndWitchItem(*MyPlayer, lvl); _item_indexes itemData = RndWitchItem(*MyPlayer, lvl);
GetItemAttrs(item, itemData, lvl); GetItemAttrs(item, itemData, lvl);
int maxlvl = -1; int maxlvl = -1;
if (GenerateRnd(100) <= 5) if (GenerateRnd(100) <= 5)
@ -4152,7 +4152,7 @@ void SpawnBoy(int lvl)
boyitem = {}; boyitem = {};
boyitem._iSeed = AdvanceRndSeed(); boyitem._iSeed = AdvanceRndSeed();
SetRndSeed(boyitem._iSeed); SetRndSeed(boyitem._iSeed);
int itype = RndBoyItem(*MyPlayer, lvl); _item_indexes itype = RndBoyItem(*MyPlayer, lvl);
GetItemAttrs(boyitem, itype, lvl); GetItemAttrs(boyitem, itype, lvl);
GetItemBonus(*MyPlayer, boyitem, lvl, 2 * lvl, true, true); GetItemBonus(*MyPlayer, boyitem, lvl, 2 * lvl, true, true);
@ -4246,7 +4246,7 @@ void SpawnBoy(int lvl)
void SpawnHealer(int lvl) void SpawnHealer(int lvl)
{ {
constexpr int PinnedItemCount = 2; constexpr int PinnedItemCount = 2;
constexpr std::array<int, PinnedItemCount + 1> PinnedItemTypes = { IDI_HEAL, IDI_FULLHEAL, IDI_RESURRECT }; constexpr std::array<_item_indexes, PinnedItemCount + 1> PinnedItemTypes = { IDI_HEAL, IDI_FULLHEAL, IDI_RESURRECT };
const int itemCount = GenerateRnd(gbIsHellfire ? 10 : 8) + 10; const int itemCount = GenerateRnd(gbIsHellfire ? 10 : 8) + 10;
for (int i = 0; i < 20; i++) { for (int i = 0; i < 20; i++) {
@ -4268,7 +4268,7 @@ void SpawnHealer(int lvl)
item._iSeed = AdvanceRndSeed(); item._iSeed = AdvanceRndSeed();
SetRndSeed(item._iSeed); SetRndSeed(item._iSeed);
int itype = RndHealerItem(*MyPlayer, lvl); _item_indexes itype = RndHealerItem(*MyPlayer, lvl);
GetItemAttrs(item, itype, lvl); GetItemAttrs(item, itype, lvl);
item._iCreateInfo = lvl | CF_HEALER; item._iCreateInfo = lvl | CF_HEALER;
item._iIdentified = true; item._iIdentified = true;
@ -4307,7 +4307,7 @@ void CreateSpellBook(Point position, spell_id ispell, bool sendmsg, bool delta)
} }
} }
int idx = RndTypeItems(ItemType::Misc, IMISC_BOOK, lvl); _item_indexes idx = RndTypeItems(ItemType::Misc, IMISC_BOOK, lvl);
if (ActiveItemCount >= MAXITEMS) if (ActiveItemCount >= MAXITEMS)
return; return;
@ -4427,7 +4427,7 @@ std::string DebugSpawnItem(std::string itemName)
return StrCat("Item not found in ", max_iter, " tries!"); return StrCat("Item not found in ", max_iter, " tries!");
const int8_t monsterLevel = dist(BetterRng) % CF_LEVEL + 1; const int8_t monsterLevel = dist(BetterRng) % CF_LEVEL + 1;
int idx = RndItemForMonsterLevel(monsterLevel); _item_indexes idx = RndItemForMonsterLevel(monsterLevel);
if (IsAnyOf(idx, IDI_NONE, IDI_GOLD)) if (IsAnyOf(idx, IDI_NONE, IDI_GOLD))
continue; continue;
@ -4455,7 +4455,6 @@ std::string DebugSpawnUniqueItem(std::string itemName)
std::transform(itemName.begin(), itemName.end(), itemName.begin(), [](unsigned char c) { return std::tolower(c); }); std::transform(itemName.begin(), itemName.end(), itemName.begin(), [](unsigned char c) { return std::tolower(c); });
UniqueItem uniqueItem; UniqueItem uniqueItem;
bool foundUnique = false; bool foundUnique = false;
int uniqueBaseIndex = 0;
int uniqueIndex = 0; int uniqueIndex = 0;
for (int j = 0; UniqueItems[j].UIItemId != UITYPE_INVALID; j++) { for (int j = 0; UniqueItems[j].UIItemId != UITYPE_INVALID; j++) {
if (!IsUniqueAvailable(j)) if (!IsUniqueAvailable(j))
@ -4474,11 +4473,12 @@ std::string DebugSpawnUniqueItem(std::string itemName)
if (!foundUnique) if (!foundUnique)
return "No unique found!"; return "No unique found!";
for (int j = 0; AllItemsList[j].iLoc != ILOC_INVALID; j++) { _item_indexes uniqueBaseIndex = IDI_GOLD;
for (std::underlying_type_t<_item_indexes> j = IDI_GOLD; j <= IDI_LAST; j++) {
if (!IsItemAvailable(j)) if (!IsItemAvailable(j))
continue; continue;
if (AllItemsList[j].iItemId == uniqueItem.UIItemId) if (AllItemsList[j].iItemId == uniqueItem.UIItemId)
uniqueBaseIndex = j; uniqueBaseIndex = static_cast<_item_indexes>(j);
} }
int ii = AllocateItem(); int ii = AllocateItem();

10
Source/items.h

@ -481,7 +481,7 @@ void InitItemGFX();
void InitItems(); void InitItems();
void CalcPlrItemVals(Player &player, bool Loadgfx); void CalcPlrItemVals(Player &player, bool Loadgfx);
void CalcPlrInv(Player &player, bool Loadgfx); void CalcPlrInv(Player &player, bool Loadgfx);
void InitializeItem(Item &item, int itemData); void InitializeItem(Item &item, _item_indexes itemData);
void GenerateNewSeed(Item &h); void GenerateNewSeed(Item &h);
int GetGoldCursor(int value); int GetGoldCursor(int value);
@ -494,7 +494,7 @@ void CreatePlrItems(Player &player);
bool ItemSpaceOk(Point position); bool ItemSpaceOk(Point position);
int AllocateItem(); int AllocateItem();
Point GetSuperItemLoc(Point position); Point GetSuperItemLoc(Point position);
void GetItemAttrs(Item &item, int itemData, int lvl); void GetItemAttrs(Item &item, _item_indexes itemData, int lvl);
void SetupItem(Item &item); void SetupItem(Item &item);
int RndItem(const Monster &monster); int RndItem(const Monster &monster);
void SpawnUnique(_unique_items uid, Point position); void SpawnUnique(_unique_items uid, Point position);
@ -502,12 +502,12 @@ void SpawnItem(Monster &monster, Point position, bool sendmsg);
void CreateRndItem(Point position, bool onlygood, bool sendmsg, bool delta); void CreateRndItem(Point position, bool onlygood, bool sendmsg, bool delta);
void CreateRndUseful(Point position, bool sendmsg); void CreateRndUseful(Point position, bool sendmsg);
void CreateTypeItem(Point position, bool onlygood, ItemType itemType, int imisc, bool sendmsg, bool delta); void CreateTypeItem(Point position, bool onlygood, ItemType itemType, int imisc, bool sendmsg, bool delta);
void RecreateItem(const Player &player, Item &item, int idx, uint16_t icreateinfo, int iseed, int ivalue, bool isHellfire); void RecreateItem(const Player &player, Item &item, _item_indexes idx, uint16_t icreateinfo, int iseed, int ivalue, bool isHellfire);
void RecreateEar(Item &item, uint16_t ic, int iseed, uint8_t bCursval, string_view heroName); void RecreateEar(Item &item, uint16_t ic, int iseed, uint8_t bCursval, string_view heroName);
void CornerstoneSave(); void CornerstoneSave();
void CornerstoneLoad(Point position); void CornerstoneLoad(Point position);
void SpawnQuestItem(int itemid, Point position, int randarea, int selflag); void SpawnQuestItem(_item_indexes itemid, Point position, int randarea, int selflag);
void SpawnRewardItem(int itemid, Point position, bool sendmsg); void SpawnRewardItem(_item_indexes itemid, Point position, bool sendmsg);
void SpawnMapOfDoom(Point position, bool sendmsg); void SpawnMapOfDoom(Point position, bool sendmsg);
void SpawnRuneBomb(Point position, bool sendmsg); void SpawnRuneBomb(Point position, bool sendmsg);
void SpawnTheodore(Point position, bool sendmsg); void SpawnTheodore(Point position, bool sendmsg);

2
Source/missiles.cpp

@ -1280,7 +1280,7 @@ void AddStealPotions(Missile &missile, const AddMissileParameter & /*parameter*/
bool hasPlayedSFX = false; bool hasPlayedSFX = false;
for (int si = 0; si < MaxBeltItems; si++) { for (int si = 0; si < MaxBeltItems; si++) {
Item &beltItem = player.SpdList[si]; Item &beltItem = player.SpdList[si];
int ii = IDI_NONE; _item_indexes ii = IDI_NONE;
if (beltItem._itype == ItemType::Misc) { if (beltItem._itype == ItemType::Misc) {
if (FlipCoin()) if (FlipCoin())
continue; continue;

6
Source/objects.cpp

@ -4317,14 +4317,14 @@ void ObjChangeMapResync(int x1, int y1, int x2, int y2)
} }
} }
int ItemMiscIdIdx(item_misc_id imiscid) _item_indexes ItemMiscIdIdx(item_misc_id imiscid)
{ {
int i = IDI_GOLD; std::underlying_type_t<_item_indexes> i = IDI_GOLD;
while (AllItemsList[i].iRnd == IDROP_NEVER || AllItemsList[i].iMiscId != imiscid) { while (AllItemsList[i].iRnd == IDROP_NEVER || AllItemsList[i].iMiscId != imiscid) {
i++; i++;
} }
return i; return static_cast<_item_indexes>(i);
} }
void OperateObject(Player &player, Object &object) void OperateObject(Player &player, Object &object)

2
Source/objects.h

@ -315,7 +315,7 @@ void RedoPlayerVision();
void MonstCheckDoors(const Monster &monster); void MonstCheckDoors(const Monster &monster);
void ObjChangeMap(int x1, int y1, int x2, int y2); void ObjChangeMap(int x1, int y1, int x2, int y2);
void ObjChangeMapResync(int x1, int y1, int x2, int y2); void ObjChangeMapResync(int x1, int y1, int x2, int y2);
int ItemMiscIdIdx(item_misc_id imiscid); _item_indexes ItemMiscIdIdx(item_misc_id imiscid);
void OperateObject(Player &player, Object &object); void OperateObject(Player &player, Object &object);
void SyncOpObject(Player &player, int cmd, Object &object); void SyncOpObject(Player &player, int cmd, Object &object);
void BreakObjectMissile(Object &object); void BreakObjectMissile(Object &object);

Loading…
Cancel
Save