From 1b91194f0fda088ea2708ad2784ddfb6d4db665d Mon Sep 17 00:00:00 2001 From: BC Ko Date: Fri, 20 Aug 2021 18:30:39 -0700 Subject: [PATCH] refactor Items[ii] (#2655) --- Source/items.cpp | 433 ++++++++++++++++++++++++-------------------- Source/loadsave.cpp | 5 +- 2 files changed, 236 insertions(+), 202 deletions(-) diff --git a/Source/items.cpp b/Source/items.cpp index 094cf369d..86b98ff70 100644 --- a/Source/items.cpp +++ b/Source/items.cpp @@ -408,25 +408,26 @@ void AddInitItems() int rnd = GenerateRnd(3) + 3; for (int j = 0; j < rnd; j++) { int ii = AllocateItem(); + auto &item = Items[ii]; Point position = GetRandomAvailableItemPosition(); - Items[ii].position = position; + item.position = position; dItem[position.x][position.y] = ii + 1; - Items[ii]._iSeed = AdvanceRndSeed(); - SetRndSeed(Items[ii]._iSeed); + item._iSeed = AdvanceRndSeed(); + SetRndSeed(item._iSeed); if (GenerateRnd(2) != 0) GetItemAttrs(ii, IDI_HEAL, curlv); else GetItemAttrs(ii, IDI_MANA, curlv); - Items[ii]._iCreateInfo = curlv | CF_PREGEN; + item._iCreateInfo = curlv | CF_PREGEN; SetupItem(ii); - Items[ii].AnimInfo.CurrentFrame = Items[ii].AnimInfo.NumberOfFrames; - Items[ii]._iAnimFlag = false; - Items[ii]._iSelFlag = 1; + item.AnimInfo.CurrentFrame = item.AnimInfo.NumberOfFrames; + item._iAnimFlag = false; + item._iSelFlag = 1; DeltaAddItem(ii); } } @@ -657,19 +658,21 @@ void GetSuperItemSpace(Point position, int8_t inum) void CalcItemValue(int i) { - int v = Items[i]._iVMult1 + Items[i]._iVMult2; + auto &item = Items[i]; + int v = item._iVMult1 + item._iVMult2; if (v > 0) { - v *= Items[i]._ivalue; + v *= item._ivalue; } if (v < 0) { - v = Items[i]._ivalue / v; + v = item._ivalue / v; } - v = Items[i]._iVAdd1 + Items[i]._iVAdd2 + v; - Items[i]._iIvalue = std::max(v, 1); + v = item._iVAdd1 + item._iVAdd2 + v; + item._iIvalue = std::max(v, 1); } void GetBookSpell(int i, int lvl) { + auto &item = Items[i]; int rv; if (lvl == 0) @@ -702,18 +705,18 @@ void GetBookSpell(int i, int lvl) if (s == maxSpells) s = 1; } - strcat(Items[i]._iName, _(spelldata[bs].sNameText)); - strcat(Items[i]._iIName, _(spelldata[bs].sNameText)); - Items[i]._iSpell = bs; - Items[i]._iMinMag = spelldata[bs].sMinInt; - Items[i]._ivalue += spelldata[bs].sBookCost; - Items[i]._iIvalue += spelldata[bs].sBookCost; + strcat(item._iName, _(spelldata[bs].sNameText)); + strcat(item._iIName, _(spelldata[bs].sNameText)); + item._iSpell = bs; + item._iMinMag = spelldata[bs].sMinInt; + item._ivalue += spelldata[bs].sBookCost; + item._iIvalue += spelldata[bs].sBookCost; if (spelldata[bs].sType == STYPE_FIRE) - Items[i]._iCurs = ICURS_BOOK_RED; + item._iCurs = ICURS_BOOK_RED; else if (spelldata[bs].sType == STYPE_LIGHTNING) - Items[i]._iCurs = ICURS_BOOK_BLUE; + item._iCurs = ICURS_BOOK_BLUE; else if (spelldata[bs].sType == STYPE_MAGIC) - Items[i]._iCurs = ICURS_BOOK_GREY; + item._iCurs = ICURS_BOOK_GREY; } int RndPL(int param1, int param2) @@ -1147,6 +1150,7 @@ void SaveItemAffix(ItemStruct &item, const PLStruct &affix) void GetStaffPower(int i, int lvl, int bs, bool onlygood) { + auto &item = Items[i]; int preidx = -1; if (GenerateRnd(10) == 0 || onlygood) { int nl = 0; @@ -1166,30 +1170,31 @@ void GetStaffPower(int i, int lvl, int bs, bool onlygood) if (nl != 0) { preidx = l[GenerateRnd(nl)]; char istr[128]; - sprintf(istr, "%s %s", _(ItemPrefixes[preidx].PLName), Items[i]._iIName); - strcpy(Items[i]._iIName, istr); - Items[i]._iMagical = ITEM_QUALITY_MAGIC; - SaveItemAffix(Items[i], ItemPrefixes[preidx]); - Items[i]._iPrePower = ItemPrefixes[preidx].power.type; + sprintf(istr, "%s %s", _(ItemPrefixes[preidx].PLName), item._iIName); + strcpy(item._iIName, istr); + item._iMagical = ITEM_QUALITY_MAGIC; + SaveItemAffix(item, ItemPrefixes[preidx]); + item._iPrePower = ItemPrefixes[preidx].power.type; } } - if (!StringInPanel(Items[i]._iIName)) { - strcpy(Items[i]._iIName, _(AllItemsList[Items[i].IDidx].iSName)); + if (!StringInPanel(item._iIName)) { + strcpy(item._iIName, _(AllItemsList[item.IDidx].iSName)); char istr[128]; if (preidx != -1) { - sprintf(istr, "%s %s", _(ItemPrefixes[preidx].PLName), Items[i]._iIName); - strcpy(Items[i]._iIName, istr); + sprintf(istr, "%s %s", _(ItemPrefixes[preidx].PLName), item._iIName); + strcpy(item._iIName, istr); } - strcpy(istr, fmt::format(_(/* TRANSLATORS: Constructs item names. Format: of . Example: King's Long Sword of the Whale */ "{:s} of {:s}"), Items[i]._iIName, _(spelldata[bs].sNameText)).c_str()); - strcpy(Items[i]._iIName, istr); - if (Items[i]._iMagical == ITEM_QUALITY_NORMAL) - strcpy(Items[i]._iName, Items[i]._iIName); + strcpy(istr, fmt::format(_(/* TRANSLATORS: Constructs item names. Format: of . Example: King's Long Sword of the Whale */ "{:s} of {:s}"), item._iIName, _(spelldata[bs].sNameText)).c_str()); + strcpy(item._iIName, istr); + if (item._iMagical == ITEM_QUALITY_NORMAL) + strcpy(item._iName, item._iIName); } CalcItemValue(i); } void GetItemPower(int i, int minlvl, int maxlvl, affix_item_type flgs, bool onlygood) { + auto &item = Items[i]; int l[256]; char istr[128]; goodorevil goe; @@ -1227,11 +1232,11 @@ void GetItemPower(int i, int minlvl, int maxlvl, affix_item_type flgs, bool only } if (nt != 0) { preidx = l[GenerateRnd(nt)]; - sprintf(istr, "%s %s", _(ItemPrefixes[preidx].PLName), Items[i]._iIName); - strcpy(Items[i]._iIName, istr); - Items[i]._iMagical = ITEM_QUALITY_MAGIC; - SaveItemAffix(Items[i], ItemPrefixes[preidx]); - Items[i]._iPrePower = ItemPrefixes[preidx].power.type; + sprintf(istr, "%s %s", _(ItemPrefixes[preidx].PLName), item._iIName); + strcpy(item._iIName, istr); + item._iMagical = ITEM_QUALITY_MAGIC; + SaveItemAffix(item, ItemPrefixes[preidx]); + item._iPrePower = ItemPrefixes[preidx].power.type; goe = ItemPrefixes[preidx].PLGOE; } } @@ -1248,27 +1253,27 @@ void GetItemPower(int i, int minlvl, int maxlvl, affix_item_type flgs, bool only } if (nl != 0) { sufidx = l[GenerateRnd(nl)]; - strcpy(istr, fmt::format(_("{:s} of {:s}"), Items[i]._iIName, _(ItemSuffixes[sufidx].PLName)).c_str()); - strcpy(Items[i]._iIName, istr); - Items[i]._iMagical = ITEM_QUALITY_MAGIC; - SaveItemAffix(Items[i], ItemSuffixes[sufidx]); - Items[i]._iSufPower = ItemSuffixes[sufidx].power.type; + strcpy(istr, fmt::format(_("{:s} of {:s}"), item._iIName, _(ItemSuffixes[sufidx].PLName)).c_str()); + strcpy(item._iIName, istr); + item._iMagical = ITEM_QUALITY_MAGIC; + SaveItemAffix(item, ItemSuffixes[sufidx]); + item._iSufPower = ItemSuffixes[sufidx].power.type; } } - if (!StringInPanel(Items[i]._iIName)) { - int aii = Items[i].IDidx; + if (!StringInPanel(item._iIName)) { + int aii = item.IDidx; if (AllItemsList[aii].iSName != nullptr) - strcpy(Items[i]._iIName, _(AllItemsList[aii].iSName)); + strcpy(item._iIName, _(AllItemsList[aii].iSName)); else - Items[i]._iName[0] = 0; + item._iName[0] = 0; if (preidx != -1) { - sprintf(istr, "%s %s", _(ItemPrefixes[preidx].PLName), Items[i]._iIName); - strcpy(Items[i]._iIName, istr); + sprintf(istr, "%s %s", _(ItemPrefixes[preidx].PLName), item._iIName); + strcpy(item._iIName, istr); } if (sufidx != -1) { - strcpy(istr, fmt::format(_("{:s} of {:s}"), Items[i]._iIName, _(ItemSuffixes[sufidx].PLName)).c_str()); - strcpy(Items[i]._iIName, istr); + strcpy(istr, fmt::format(_("{:s} of {:s}"), item._iIName, _(ItemSuffixes[sufidx].PLName)).c_str()); + strcpy(item._iIName, istr); } } if (preidx != -1 || sufidx != -1) @@ -1277,6 +1282,7 @@ void GetItemPower(int i, int minlvl, int maxlvl, affix_item_type flgs, bool only void GetStaffSpell(int i, int lvl, bool onlygood) { + auto &item = Items[i]; if (!gbIsHellfire && GenerateRnd(4) == 0) { GetItemPower(i, lvl / 2, lvl, PLT_STAFF, onlygood); return; @@ -1310,26 +1316,27 @@ void GetStaffSpell(int i, int lvl, bool onlygood) char istr[68]; if (!StringInPanel(istr)) - strcpy(istr, fmt::format(_("{:s} of {:s}"), Items[i]._iName, _(spelldata[bs].sNameText)).c_str()); + strcpy(istr, fmt::format(_("{:s} of {:s}"), item._iName, _(spelldata[bs].sNameText)).c_str()); strcpy(istr, fmt::format(_("Staff of {:s}"), _(spelldata[bs].sNameText)).c_str()); - strcpy(Items[i]._iName, istr); - strcpy(Items[i]._iIName, istr); + strcpy(item._iName, istr); + strcpy(item._iIName, istr); int minc = spelldata[bs].sStaffMin; int maxc = spelldata[bs].sStaffMax - minc + 1; - Items[i]._iSpell = bs; - Items[i]._iCharges = minc + GenerateRnd(maxc); - Items[i]._iMaxCharges = Items[i]._iCharges; - - Items[i]._iMinMag = spelldata[bs].sMinInt; - int v = Items[i]._iCharges * spelldata[bs].sStaffCost / 5; - Items[i]._ivalue += v; - Items[i]._iIvalue += v; + item._iSpell = bs; + item._iCharges = minc + GenerateRnd(maxc); + item._iMaxCharges = item._iCharges; + + item._iMinMag = spelldata[bs].sMinInt; + int v = item._iCharges * spelldata[bs].sStaffCost / 5; + item._ivalue += v; + item._iIvalue += v; GetStaffPower(i, lvl, bs, onlygood); } void GetOilType(int i, int maxLvl) { + auto &item = Items[i]; int cnt = 2; int8_t rnd[32] = { 5, 6 }; @@ -1348,19 +1355,20 @@ void GetOilType(int i, int maxLvl) int8_t t = rnd[GenerateRnd(cnt)]; - strcpy(Items[i]._iName, _(OilNames[t])); - strcpy(Items[i]._iIName, _(OilNames[t])); - Items[i]._iMiscId = OilMagic[t]; - Items[i]._ivalue = OilValues[t]; - Items[i]._iIvalue = OilValues[t]; + strcpy(item._iName, _(OilNames[t])); + strcpy(item._iIName, _(OilNames[t])); + item._iMiscId = OilMagic[t]; + item._ivalue = OilValues[t]; + item._iIvalue = OilValues[t]; } void GetItemBonus(int i, int minlvl, int maxlvl, bool onlygood, bool allowspells) { + auto &item = Items[i]; if (minlvl > 25) minlvl = 25; - switch (Items[i]._itype) { + switch (item._itype) { case ITYPE_SWORD: case ITYPE_AXE: case ITYPE_MACE: @@ -1492,6 +1500,7 @@ int RndTypeItems(int itype, int imid, int lvl) _unique_items CheckUnique(int i, int lvl, int uper, bool recreate) { + auto &item = Items[i]; std::bitset<128> uok = {}; if (GenerateRnd(100) > uper) @@ -1501,7 +1510,7 @@ _unique_items CheckUnique(int i, int lvl, int uper, bool recreate) for (int j = 0; UniqueItemList[j].UIItemId != UITYPE_INVALID; j++) { if (!IsUniqueAvailable(j)) break; - if (UniqueItemList[j].UIItemId == AllItemsList[Items[i].IDidx].iItemId + if (UniqueItemList[j].UIItemId == AllItemsList[item.IDidx].iItemId && lvl >= UniqueItemList[j].UIMinLvl && (recreate || !UniqueItemFlags[j] || gbIsMultiplayer)) { uok[j] = true; @@ -1547,41 +1556,43 @@ void GetUniqueItem(ItemStruct &item, _unique_items uid) void ItemRndDur(int ii) { - if (Items[ii]._iDurability > 0 && Items[ii]._iDurability != DUR_INDESTRUCTIBLE) - Items[ii]._iDurability = GenerateRnd(Items[ii]._iMaxDur / 2) + (Items[ii]._iMaxDur / 4) + 1; + auto &item = Items[ii]; + if (item._iDurability > 0 && item._iDurability != DUR_INDESTRUCTIBLE) + item._iDurability = GenerateRnd(item._iMaxDur / 2) + (item._iMaxDur / 4) + 1; } void SetupAllItems(int ii, int idx, int iseed, int lvl, int uper, bool onlygood, bool recreate, bool pregen) { + auto &item = Items[ii]; int iblvl; - Items[ii]._iSeed = iseed; + item._iSeed = iseed; SetRndSeed(iseed); GetItemAttrs(ii, idx, lvl / 2); - Items[ii]._iCreateInfo = lvl; + item._iCreateInfo = lvl; if (pregen) - Items[ii]._iCreateInfo |= CF_PREGEN; + item._iCreateInfo |= CF_PREGEN; if (onlygood) - Items[ii]._iCreateInfo |= CF_ONLYGOOD; + item._iCreateInfo |= CF_ONLYGOOD; if (uper == 15) - Items[ii]._iCreateInfo |= CF_UPER15; + item._iCreateInfo |= CF_UPER15; else if (uper == 1) - Items[ii]._iCreateInfo |= CF_UPER1; + item._iCreateInfo |= CF_UPER1; - if (Items[ii]._iMiscId != IMISC_UNIQUE) { + if (item._iMiscId != IMISC_UNIQUE) { iblvl = -1; if (GenerateRnd(100) <= 10 || GenerateRnd(100) <= lvl) { iblvl = lvl; } - if (iblvl == -1 && Items[ii]._iMiscId == IMISC_STAFF) { + if (iblvl == -1 && item._iMiscId == IMISC_STAFF) { iblvl = lvl; } - if (iblvl == -1 && Items[ii]._iMiscId == IMISC_RING) { + if (iblvl == -1 && item._iMiscId == IMISC_RING) { iblvl = lvl; } - if (iblvl == -1 && Items[ii]._iMiscId == IMISC_AMULET) { + if (iblvl == -1 && item._iMiscId == IMISC_AMULET) { iblvl = lvl; } if (onlygood) @@ -1593,14 +1604,14 @@ void SetupAllItems(int ii, int idx, int iseed, int lvl, int uper, bool onlygood, if (uid == UITEM_INVALID) { GetItemBonus(ii, iblvl / 2, iblvl, onlygood, true); } else { - GetUniqueItem(Items[ii], uid); + GetUniqueItem(item, uid); } } - if (Items[ii]._iMagical != ITEM_QUALITY_UNIQUE) + if (item._iMagical != ITEM_QUALITY_UNIQUE) ItemRndDur(ii); } else { - if (Items[ii]._iLoc != ILOC_UNEQUIPABLE) { - GetUniqueItem(Items[ii], (_unique_items)iseed); // uid is stored in iseed for uniques + if (item._iLoc != ILOC_UNEQUIPABLE) { + GetUniqueItem(item, (_unique_items)iseed); // uid is stored in iseed for uniques } } SetupItem(ii); @@ -1625,9 +1636,10 @@ void SetupBaseItem(Point position, int idx, bool onlygood, bool sendmsg, bool de void SetupAllUseful(int ii, int iseed, int lvl) { + auto &item = Items[ii]; int idx; - Items[ii]._iSeed = iseed; + item._iSeed = iseed; SetRndSeed(iseed); if (gbIsHellfire) { @@ -1666,7 +1678,7 @@ void SetupAllUseful(int ii, int iseed, int lvl) } GetItemAttrs(ii, idx, lvl); - Items[ii]._iCreateInfo = lvl | CF_USEFUL; + item._iCreateInfo = lvl | CF_USEFUL; SetupItem(ii); } @@ -1702,15 +1714,16 @@ void SpawnRock() return; int ii = AllocateItem(); + auto &item = Items[ii]; - Items[ii].position = Objects[oi].position; + item.position = Objects[oi].position; dItem[Objects[oi].position.x][Objects[oi].position.y] = ii + 1; int curlv = ItemsGetCurrlevel(); GetItemAttrs(ii, IDI_ROCK, curlv); SetupItem(ii); - Items[ii]._iSelFlag = 2; - Items[ii]._iPostDraw = true; - Items[ii].AnimInfo.CurrentFrame = 11; + item._iSelFlag = 2; + item._iPostDraw = true; + item.AnimInfo.CurrentFrame = 11; } void ItemDoppel() @@ -2358,41 +2371,45 @@ int RndHealerItem(int lvl) void RecreateSmithItem(int ii, int lvl, int iseed) { + auto &item = Items[ii]; SetRndSeed(iseed); int itype = RndSmithItem(lvl) - 1; GetItemAttrs(ii, itype, lvl); - Items[ii]._iSeed = iseed; - Items[ii]._iCreateInfo = lvl | CF_SMITH; - Items[ii]._iIdentified = true; + item._iSeed = iseed; + item._iCreateInfo = lvl | CF_SMITH; + item._iIdentified = true; } void RecreatePremiumItem(int ii, int plvl, int iseed) { + auto &item = Items[ii]; SetRndSeed(iseed); int itype = RndPremiumItem(plvl / 4, plvl) - 1; GetItemAttrs(ii, itype, plvl); GetItemBonus(ii, plvl / 2, plvl, true, !gbIsHellfire); - Items[ii]._iSeed = iseed; - Items[ii]._iCreateInfo = plvl | CF_SMITHPREMIUM; - Items[ii]._iIdentified = true; + item._iSeed = iseed; + item._iCreateInfo = plvl | CF_SMITHPREMIUM; + item._iIdentified = true; } void RecreateBoyItem(int ii, int lvl, int iseed) { + auto &item = Items[ii]; SetRndSeed(iseed); int itype = RndBoyItem(lvl) - 1; GetItemAttrs(ii, itype, lvl); GetItemBonus(ii, lvl, 2 * lvl, true, true); - Items[ii]._iSeed = iseed; - Items[ii]._iCreateInfo = lvl | CF_BOY; - Items[ii]._iIdentified = true; + item._iSeed = iseed; + item._iCreateInfo = lvl | CF_BOY; + item._iIdentified = true; } void RecreateWitchItem(int ii, int idx, int lvl, int iseed) { + auto &item = Items[ii]; if (idx == IDI_MANA || idx == IDI_FULLMANA || idx == IDI_PORTAL) { GetItemAttrs(ii, idx, lvl); } else if (gbIsHellfire && idx >= 114 && idx <= 117) { @@ -2406,19 +2423,20 @@ void RecreateWitchItem(int ii, int idx, int lvl, int iseed) int iblvl = -1; if (GenerateRnd(100) <= 5) iblvl = 2 * lvl; - if (iblvl == -1 && Items[ii]._iMiscId == IMISC_STAFF) + if (iblvl == -1 && item._iMiscId == IMISC_STAFF) iblvl = 2 * lvl; if (iblvl != -1) GetItemBonus(ii, iblvl / 2, iblvl, true, true); } - Items[ii]._iSeed = iseed; - Items[ii]._iCreateInfo = lvl | CF_WITCH; - Items[ii]._iIdentified = true; + item._iSeed = iseed; + item._iCreateInfo = lvl | CF_WITCH; + item._iIdentified = true; } void RecreateHealerItem(int ii, int idx, int lvl, int iseed) { + auto &item = Items[ii]; if (idx == IDI_HEAL || idx == IDI_FULLHEAL || idx == IDI_RESURRECT) { GetItemAttrs(ii, idx, lvl); } else { @@ -2427,9 +2445,9 @@ void RecreateHealerItem(int ii, int idx, int lvl, int iseed) GetItemAttrs(ii, itype, lvl); } - Items[ii]._iSeed = iseed; - Items[ii]._iCreateInfo = lvl | CF_HEALER; - Items[ii]._iIdentified = true; + item._iSeed = iseed; + item._iCreateInfo = lvl | CF_HEALER; + item._iIdentified = true; } void RecreateTownItem(int ii, int idx, uint16_t icreateinfo, int iseed) @@ -2477,12 +2495,13 @@ void CreateMagicItem(Point position, int lvl, int imisc, int imid, int icurs, bo return; int ii = AllocateItem(); + auto &item = Items[ii]; int idx = RndTypeItems(imisc, imid, lvl); while (true) { - memset(&Items[ii], 0, sizeof(*Items)); + memset(&item, 0, sizeof(item)); SetupAllItems(ii, idx, AdvanceRndSeed(), 2 * lvl, 1, true, false, delta); - if (Items[ii]._iCurs == icurs) + if (item._iCurs == icurs) break; idx = RndTypeItems(imisc, imid, lvl); @@ -2578,12 +2597,13 @@ void InitItems() ActiveItemCount = 0; for (int i = 0; i < MAXITEMS; i++) { - Items[i]._itype = ITYPE_NONE; - Items[i].position = { 0, 0 }; - Items[i]._iAnimFlag = false; - Items[i]._iSelFlag = 0; - Items[i]._iIdentified = false; - Items[i]._iPostDraw = false; + auto &item = Items[i]; + item._itype = ITYPE_NONE; + item.position = { 0, 0 }; + item._iAnimFlag = false; + item._iSelFlag = 0; + item._iIdentified = false; + item._iPostDraw = false; } for (int i = 0; i < MAXITEMS; i++) { @@ -3051,7 +3071,8 @@ void GetGoldSeed(int pnum, ItemStruct *h) s = AdvanceRndSeed(); for (int i = 0; i < ActiveItemCount; i++) { int ii = ActiveItems[i]; - if (Items[ii]._iSeed == s) + auto &item = Items[ii]; + if (item._iSeed == s) doneflag = false; } if (pnum == MyPlayerId) { @@ -3263,39 +3284,40 @@ Point GetSuperItemLoc(Point position) void GetItemAttrs(int i, int idata, int lvl) { - Items[i]._itype = AllItemsList[idata].itype; - Items[i]._iCurs = AllItemsList[idata].iCurs; - strcpy(Items[i]._iName, _(AllItemsList[idata].iName)); - strcpy(Items[i]._iIName, _(AllItemsList[idata].iName)); - Items[i]._iLoc = AllItemsList[idata].iLoc; - Items[i]._iClass = AllItemsList[idata].iClass; - Items[i]._iMinDam = AllItemsList[idata].iMinDam; - Items[i]._iMaxDam = AllItemsList[idata].iMaxDam; - Items[i]._iAC = AllItemsList[idata].iMinAC + GenerateRnd(AllItemsList[idata].iMaxAC - AllItemsList[idata].iMinAC + 1); - Items[i]._iFlags = AllItemsList[idata].iFlags; - Items[i]._iMiscId = AllItemsList[idata].iMiscId; - Items[i]._iSpell = AllItemsList[idata].iSpell; - Items[i]._iMagical = ITEM_QUALITY_NORMAL; - Items[i]._ivalue = AllItemsList[idata].iValue; - Items[i]._iIvalue = AllItemsList[idata].iValue; - Items[i]._iDurability = AllItemsList[idata].iDurability; - Items[i]._iMaxDur = AllItemsList[idata].iDurability; - Items[i]._iMinStr = AllItemsList[idata].iMinStr; - Items[i]._iMinMag = AllItemsList[idata].iMinMag; - Items[i]._iMinDex = AllItemsList[idata].iMinDex; - Items[i].IDidx = static_cast<_item_indexes>(idata); + auto &item = Items[i]; + item._itype = AllItemsList[idata].itype; + item._iCurs = AllItemsList[idata].iCurs; + strcpy(item._iName, _(AllItemsList[idata].iName)); + strcpy(item._iIName, _(AllItemsList[idata].iName)); + item._iLoc = AllItemsList[idata].iLoc; + item._iClass = AllItemsList[idata].iClass; + item._iMinDam = AllItemsList[idata].iMinDam; + item._iMaxDam = AllItemsList[idata].iMaxDam; + item._iAC = AllItemsList[idata].iMinAC + GenerateRnd(AllItemsList[idata].iMaxAC - AllItemsList[idata].iMinAC + 1); + item._iFlags = AllItemsList[idata].iFlags; + item._iMiscId = AllItemsList[idata].iMiscId; + item._iSpell = AllItemsList[idata].iSpell; + item._iMagical = ITEM_QUALITY_NORMAL; + item._ivalue = AllItemsList[idata].iValue; + item._iIvalue = AllItemsList[idata].iValue; + item._iDurability = AllItemsList[idata].iDurability; + item._iMaxDur = AllItemsList[idata].iDurability; + item._iMinStr = AllItemsList[idata].iMinStr; + item._iMinMag = AllItemsList[idata].iMinMag; + item._iMinDex = AllItemsList[idata].iMinDex; + item.IDidx = static_cast<_item_indexes>(idata); if (gbIsHellfire) - Items[i].dwBuff |= CF_HELLFIRE; - Items[i]._iPrePower = IPL_INVALID; - Items[i]._iSufPower = IPL_INVALID; + item.dwBuff |= CF_HELLFIRE; + item._iPrePower = IPL_INVALID; + item._iSufPower = IPL_INVALID; - if (Items[i]._iMiscId == IMISC_BOOK) + if (item._iMiscId == IMISC_BOOK) GetBookSpell(i, lvl); - if (gbIsHellfire && Items[i]._iMiscId == IMISC_OILOF) + if (gbIsHellfire && item._iMiscId == IMISC_OILOF) GetOilType(i, lvl); - if (Items[i]._itype != ITYPE_GOLD) + if (item._itype != ITYPE_GOLD) return; int rndv; @@ -3314,14 +3336,15 @@ void GetItemAttrs(int i, int idata, int lvl) if (leveltype == DTYPE_HELL) rndv += rndv / 8; - Items[i]._ivalue = std::min(rndv, GOLD_MAX_LIMIT); - SetPlrHandGoldCurs(&Items[i]); + item._ivalue = std::min(rndv, GOLD_MAX_LIMIT); + SetPlrHandGoldCurs(&item); } void SetupItem(int i) { - Items[i].SetNewAnimation(Players[MyPlayerId].pLvlLoad == 0); - Items[i]._iIdentified = false; + auto &item = Items[i]; + item.SetNewAnimation(Players[MyPlayerId].pLvlLoad == 0); + item._iIdentified = false; } int RndItem(const MonsterStruct &monster) @@ -3371,6 +3394,7 @@ void SpawnUnique(_unique_items uid, Point position) return; int ii = AllocateItem(); + auto &item = Items[ii]; GetSuperItemSpace(position, ii); int curlv = ItemsGetCurrlevel(); @@ -3379,7 +3403,7 @@ void SpawnUnique(_unique_items uid, Point position) idx++; GetItemAttrs(ii, idx, curlv); - GetUniqueItem(Items[ii], uid); + GetUniqueItem(item, uid); SetupItem(ii); } @@ -3464,22 +3488,23 @@ void CreateTypeItem(Point position, bool onlygood, int itype, int imisc, bool se void RecreateItem(int ii, int idx, uint16_t icreateinfo, int iseed, int ivalue, bool isHellfire) { + auto &item = Items[ii]; bool tmpIsHellfire = gbIsHellfire; gbIsHellfire = isHellfire; if (idx == IDI_GOLD) { - SetPlrHandItem(&Items[ii], IDI_GOLD); - Items[ii]._iSeed = iseed; - Items[ii]._iCreateInfo = icreateinfo; - Items[ii]._ivalue = ivalue; - SetPlrHandGoldCurs(&Items[ii]); + SetPlrHandItem(&item, IDI_GOLD); + item._iSeed = iseed; + item._iCreateInfo = icreateinfo; + item._ivalue = ivalue; + SetPlrHandGoldCurs(&item); gbIsHellfire = tmpIsHellfire; return; } if (icreateinfo == 0) { - SetPlrHandItem(&Items[ii], idx); - SetPlrHandSeed(&Items[ii], iseed); + SetPlrHandItem(&item, idx); + SetPlrHandSeed(&item, iseed); gbIsHellfire = tmpIsHellfire; return; } @@ -3516,7 +3541,8 @@ void RecreateItem(int ii, int idx, uint16_t icreateinfo, int iseed, int ivalue, void RecreateEar(int ii, uint16_t ic, int iseed, int id, int dur, int mdur, int ch, int mch, int ivalue, int ibuff) { - SetPlrHandItem(&Items[ii], IDI_EAR); + auto &item = Items[ii]; + SetPlrHandItem(&item, IDI_EAR); tempstr[0] = static_cast((ic >> 8) & 0x7F); tempstr[1] = static_cast(ic & 0x7F); tempstr[2] = static_cast((iseed >> 24) & 0x7F); @@ -3534,11 +3560,11 @@ void RecreateEar(int ii, uint16_t ic, int iseed, int id, int dur, int mdur, int tempstr[14] = static_cast((ibuff >> 8) & 0x7F); tempstr[15] = static_cast(ibuff & 0x7F); tempstr[16] = '\0'; - strcpy(Items[ii]._iName, fmt::format(_(/* TRANSLATORS: {:s} will be a Character Name */ "Ear of {:s}"), tempstr).c_str()); - Items[ii]._iCurs = ((ivalue >> 6) & 3) + ICURS_EAR_SORCERER; - Items[ii]._ivalue = ivalue & 0x3F; - Items[ii]._iCreateInfo = ic; - Items[ii]._iSeed = iseed; + strcpy(item._iName, fmt::format(_(/* TRANSLATORS: {:s} will be a Character Name */ "Ear of {:s}"), tempstr).c_str()); + item._iCurs = ((ivalue >> 6) & 3) + ICURS_EAR_SORCERER; + item._ivalue = ivalue & 0x3F; + item._iCreateInfo = ic; + item._iSeed = iseed; } void CornerstoneSave() @@ -3584,13 +3610,14 @@ void CornerstoneLoad(Point position) Hex2bin(sgOptions.Hellfire.szItem, sizeof(PkItemStruct), reinterpret_cast(&pkSItem)); int ii = AllocateItem(); + auto &item = Items[ii]; dItem[position.x][position.y] = ii + 1; - UnPackItem(&pkSItem, &Items[ii], (pkSItem.dwBuff & CF_HELLFIRE) != 0); - Items[ii].position = position; - RespawnItem(&Items[ii], false); - CornerStone.item = Items[ii]; + UnPackItem(&pkSItem, &item, (pkSItem.dwBuff & CF_HELLFIRE) != 0); + item.position = position; + RespawnItem(&item, false); + CornerStone.item = item; } void SpawnQuestItem(int itemid, Point position, int randarea, int selflag) @@ -3620,8 +3647,9 @@ void SpawnQuestItem(int itemid, Point position, int randarea, int selflag) return; int ii = AllocateItem(); + auto &item = Items[ii]; - Items[ii].position = position; + item.position = position; dItem[position.x][position.y] = ii + 1; @@ -3629,13 +3657,13 @@ void SpawnQuestItem(int itemid, Point position, int randarea, int selflag) GetItemAttrs(ii, itemid, curlv); SetupItem(ii); - Items[ii]._iSeed = AdvanceRndSeed(); - SetRndSeed(Items[ii]._iSeed); - Items[ii]._iPostDraw = true; + item._iSeed = AdvanceRndSeed(); + SetRndSeed(item._iSeed); + item._iPostDraw = true; if (selflag != 0) { - Items[ii]._iSelFlag = selflag; - Items[ii].AnimInfo.CurrentFrame = Items[ii].AnimInfo.NumberOfFrames; - Items[ii]._iAnimFlag = false; + item._iSelFlag = selflag; + item.AnimInfo.CurrentFrame = item.AnimInfo.NumberOfFrames; + item._iAnimFlag = false; } } @@ -3645,15 +3673,16 @@ void SpawnRewardItem(int itemid, Point position) return; int ii = AllocateItem(); + auto &item = Items[ii]; - Items[ii].position = position; + item.position = position; dItem[position.x][position.y] = ii + 1; int curlv = ItemsGetCurrlevel(); GetItemAttrs(ii, itemid, curlv); - Items[ii].SetNewAnimation(true); - Items[ii]._iSelFlag = 2; - Items[ii]._iPostDraw = true; - Items[ii]._iIdentified = true; + item.SetNewAnimation(true); + item._iSelFlag = 2; + item._iPostDraw = true; + item._iIdentified = true; } void SpawnMapOfDoom(Point position) @@ -3701,22 +3730,23 @@ void ProcessItems() { for (int i = 0; i < ActiveItemCount; i++) { int ii = ActiveItems[i]; - if (!Items[ii]._iAnimFlag) + auto &item = Items[ii]; + if (!item._iAnimFlag) continue; - Items[ii].AnimInfo.ProcessAnimation(); - if (Items[ii]._iCurs == ICURS_MAGIC_ROCK) { - if (Items[ii]._iSelFlag == 1 && Items[ii].AnimInfo.CurrentFrame == 11) - Items[ii].AnimInfo.CurrentFrame = 1; - if (Items[ii]._iSelFlag == 2 && Items[ii].AnimInfo.CurrentFrame == 21) - Items[ii].AnimInfo.CurrentFrame = 11; + item.AnimInfo.ProcessAnimation(); + if (item._iCurs == ICURS_MAGIC_ROCK) { + if (item._iSelFlag == 1 && item.AnimInfo.CurrentFrame == 11) + item.AnimInfo.CurrentFrame = 1; + if (item._iSelFlag == 2 && item.AnimInfo.CurrentFrame == 21) + item.AnimInfo.CurrentFrame = 11; } else { - if (Items[ii].AnimInfo.CurrentFrame == Items[ii].AnimInfo.NumberOfFrames / 2) - PlaySfxLoc(ItemDropSnds[ItemCAnimTbl[Items[ii]._iCurs]], Items[ii].position); + if (item.AnimInfo.CurrentFrame == item.AnimInfo.NumberOfFrames / 2) + PlaySfxLoc(ItemDropSnds[ItemCAnimTbl[item._iCurs]], item.position); - if (Items[ii].AnimInfo.CurrentFrame >= Items[ii].AnimInfo.NumberOfFrames) { - Items[ii].AnimInfo.CurrentFrame = Items[ii].AnimInfo.NumberOfFrames; - Items[ii]._iAnimFlag = false; - Items[ii]._iSelFlag = 1; + if (item.AnimInfo.CurrentFrame >= item.AnimInfo.NumberOfFrames) { + item.AnimInfo.CurrentFrame = item.AnimInfo.NumberOfFrames; + item._iAnimFlag = false; + item._iSelFlag = 1; } } } @@ -3732,20 +3762,22 @@ void FreeItemGFX() void GetItemFrm(int i) { - Items[i].AnimInfo.pCelSprite = &*itemanims[ItemCAnimTbl[Items[i]._iCurs]]; + auto &item = Items[i]; + item.AnimInfo.pCelSprite = &*itemanims[ItemCAnimTbl[item._iCurs]]; } void GetItemStr(int i) { - if (Items[i]._itype != ITYPE_GOLD) { - if (Items[i]._iIdentified) - strcpy(infostr, Items[i]._iIName); + auto &item = Items[i]; + if (item._itype != ITYPE_GOLD) { + if (item._iIdentified) + strcpy(infostr, item._iIName); else - strcpy(infostr, Items[i]._iName); + strcpy(infostr, item._iName); - InfoColor = Items[i].getTextColor(); + InfoColor = item.getTextColor(); } else { - int nGold = Items[i]._ivalue; + int nGold = item._ivalue; strcpy(infostr, fmt::format(ngettext("{:d} gold piece", "{:d} gold pieces", nGold), nGold).c_str()); } } @@ -4770,11 +4802,12 @@ void CreateSpellBook(Point position, spell_id ispell, bool sendmsg, bool delta) return; int ii = AllocateItem(); + auto &item = Items[ii]; while (true) { - memset(&Items[ii], 0, sizeof(*Items)); + memset(&item, 0, sizeof(*Items)); SetupAllItems(ii, idx, AdvanceRndSeed(), 2 * lvl, 1, true, false, delta); - if (Items[ii]._iMiscId == IMISC_BOOK && Items[ii]._iSpell == ispell) + if (item._iMiscId == IMISC_BOOK && item._iSpell == ispell) break; } GetSuperItemSpace(position, ii); diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index 840328f85..d75e094de 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -865,8 +865,9 @@ void RemoveEmptyLevelItems() { for (int i = ActiveItemCount; i > 0; i--) { int ii = ActiveItems[i]; - if (Items[ii].isEmpty()) { - dItem[Items[ii].position.x][Items[ii].position.y] = 0; + auto &item = Items[ii]; + if (item.isEmpty()) { + dItem[item.position.x][item.position.y] = 0; DeleteItem(ii, i); } }