Browse Source

refactor Items[ii] (#2655)

pull/2646/head
BC Ko 5 years ago committed by GitHub
parent
commit
1b91194f0f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 433
      Source/items.cpp
  2. 5
      Source/loadsave.cpp

433
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: <Prefix> <Item> of <Suffix>. 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: <Prefix> <Item> of <Suffix>. 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<char>((ic >> 8) & 0x7F);
tempstr[1] = static_cast<char>(ic & 0x7F);
tempstr[2] = static_cast<char>((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<char>((ibuff >> 8) & 0x7F);
tempstr[15] = static_cast<char>(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<uint8_t *>(&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);

5
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);
}
}

Loading…
Cancel
Save