Browse Source

🐛 Clear item before reusing it in all cases

This will undoubtly also fix some issues with original items contaning
garbage data that could lead to morphing
pull/1095/head
Anders Jenbo 5 years ago
parent
commit
ee3cbdc6ee
  1. 11
      Source/inv.cpp
  2. 16
      Source/items.cpp
  3. 1
      Source/pack.cpp

11
Source/inv.cpp

@ -615,11 +615,10 @@ bool FitsInBeltSlot(const ItemStruct &item)
*/
bool CanBePlacedOnBelt(const ItemStruct &item)
{
return
FitsInBeltSlot(item) &&
item._itype != ITYPE_GOLD &&
item._iStatFlag &&
AllItemsList[item.IDidx].iUsable;
return FitsInBeltSlot(item)
&& item._itype != ITYPE_GOLD
&& item._iStatFlag
&& AllItemsList[item.IDidx].iUsable;
}
/**
@ -1237,6 +1236,7 @@ void CheckInvSwap(int pnum, BYTE bLoc, int idx, WORD wCI, int seed, BOOL bId)
{
PlayerStruct *p;
memset(&item[MAXITEMS], 0, sizeof(*item));
RecreateItem(MAXITEMS, idx, wCI, seed, 0);
p = &plr[pnum];
@ -1691,6 +1691,7 @@ void CheckQuestItem(int pnum)
}
item_num = itemactive[0];
tmp = item[item_num];
memset(&item[item_num], 0, sizeof(*item));
GetItemAttrs(item_num, IDI_FULLNOTE, 16);
SetupItem(item_num);
plr[pnum].HoldItem = item[item_num];

16
Source/items.cpp

@ -624,6 +624,7 @@ void InitItems()
{
int i;
memset(&item[0], 0, sizeof(*item));
GetItemAttrs(0, IDI_GOLD, 1);
golditem = item[0];
golditem._iStatFlag = TRUE;
@ -1579,7 +1580,7 @@ int AllocateItem()
return inum;
}
static void GetSuperItemSpace(int x, int y, int inum)
static void GetSuperItemSpace(int x, int y, char inum)
{
if (!GetItemSpace(x, y, inum)) {
for (int k = 2; k < 50; k++) {
@ -4529,6 +4530,7 @@ void SpawnSmith(int lvl)
iCnt = random_(50, maxItems - 10) + 10;
for (i = 0; i < iCnt; i++) {
do {
memset(&item[0], 0, sizeof(*item));
item[0]._iSeed = AdvanceRndSeed();
SetRndSeed(item[0]._iSeed);
idata = RndSmithItem(lvl) - 1;
@ -4630,6 +4632,7 @@ static void SpawnOnePremium(int i, int plvl, int myplr)
plvl = 1;
do {
memset(&item[0], 0, sizeof(*item));
item[0]._iSeed = AdvanceRndSeed();
SetRndSeed(item[0]._iSeed);
itype = RndPremiumItem(plvl >> 2, plvl) - 1;
@ -4835,14 +4838,17 @@ void SpawnWitch(int lvl)
j = 3;
memset(&item[0], 0, sizeof(*item));
GetItemAttrs(0, IDI_MANA, 1);
witchitem[0] = item[0];
witchitem[0]._iCreateInfo = lvl;
witchitem[0]._iStatFlag = TRUE;
memset(&item[0], 0, sizeof(*item));
GetItemAttrs(0, IDI_FULLMANA, 1);
witchitem[1] = item[0];
witchitem[1]._iCreateInfo = lvl;
witchitem[1]._iStatFlag = TRUE;
memset(&item[0], 0, sizeof(*item));
GetItemAttrs(0, IDI_PORTAL, 1);
witchitem[2] = item[0];
witchitem[2]._iCreateInfo = lvl;
@ -4857,6 +4863,7 @@ void SpawnWitch(int lvl)
for (i = 114, bCnt = 0; i <= 117 && bCnt < books; ++i) {
if (WitchItemOk(i)
&& lvl >= AllItemsList[i].iMinMLvl) {
memset(&item[0], 0, sizeof(*item));
item[0]._iSeed = AdvanceRndSeed();
SetRndSeed(item[0]._iSeed);
random_(0, 1);
@ -4878,6 +4885,7 @@ void SpawnWitch(int lvl)
for (i = j; i < iCnt; i++) {
do {
memset(&item[0], 0, sizeof(*item));
item[0]._iSeed = AdvanceRndSeed();
SetRndSeed(item[0]._iSeed);
idata = RndWitchItem(lvl) - 1;
@ -4952,6 +4960,7 @@ void SpawnBoy(int lvl)
if (boylevel < (lvl >> 1) || boyitem._itype == ITYPE_NONE) {
do {
memset(&item[0], 0, sizeof(*item));
item[0]._iSeed = AdvanceRndSeed();
SetRndSeed(item[0]._iSeed);
itype = RndBoyItem(lvl) - 1;
@ -5124,17 +5133,20 @@ void SpawnHealer(int lvl)
{
int i, nsi, srnd, itype;
memset(&item[0], 0, sizeof(*item));
GetItemAttrs(0, IDI_HEAL, 1);
healitem[0] = item[0];
healitem[0]._iCreateInfo = lvl;
healitem[0]._iStatFlag = TRUE;
memset(&item[0], 0, sizeof(*item));
GetItemAttrs(0, IDI_FULLHEAL, 1);
healitem[1] = item[0];
healitem[1]._iCreateInfo = lvl;
healitem[1]._iStatFlag = TRUE;
if (gbIsMultiplayer) {
memset(&item[0], 0, sizeof(*item));
GetItemAttrs(0, IDI_RESURRECT, 1);
healitem[2] = item[0];
healitem[2]._iCreateInfo = lvl;
@ -5146,6 +5158,7 @@ void SpawnHealer(int lvl)
}
nsi = random_(50, gbIsHellfire ? 10 : 8) + 10;
for (i = srnd; i < nsi; i++) {
memset(&item[0], 0, sizeof(*item));
item[0]._iSeed = AdvanceRndSeed();
SetRndSeed(item[0]._iSeed);
itype = RndHealerItem(lvl) - 1;
@ -5163,6 +5176,7 @@ void SpawnHealer(int lvl)
void SpawnStoreGold()
{
memset(&item[0], 0, sizeof(*item));
GetItemAttrs(0, IDI_GOLD, 1);
golditem = item[0];
golditem._iStatFlag = TRUE;

1
Source/pack.cpp

@ -160,6 +160,7 @@ void UnPackItem(PkItemStruct *is, ItemStruct *id)
SwapLE16(is->wValue),
SwapLE32(is->dwBuff));
} else {
memset(&item[MAXITEMS], 0, sizeof(*item));
RecreateItem(MAXITEMS, idx, SwapLE16(is->iCreateInfo), SwapLE32(is->iSeed), SwapLE16(is->wValue));
item[MAXITEMS]._iMagical = is->bId >> 1;
item[MAXITEMS]._iIdentified = is->bId & 1;

Loading…
Cancel
Save