From ee3cbdc6eebf000330afc299599c431995f8b8cd Mon Sep 17 00:00:00 2001 From: Anders Jenbo Date: Wed, 3 Mar 2021 01:43:04 +0100 Subject: [PATCH] :bug: 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 --- Source/inv.cpp | 11 ++++++----- Source/items.cpp | 16 +++++++++++++++- Source/pack.cpp | 1 + 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/Source/inv.cpp b/Source/inv.cpp index 3850b3776..1c45e10a8 100644 --- a/Source/inv.cpp +++ b/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]; diff --git a/Source/items.cpp b/Source/items.cpp index 82ad478f8..3e50d2857 100644 --- a/Source/items.cpp +++ b/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; diff --git a/Source/pack.cpp b/Source/pack.cpp index 34512dd47..fc952ab54 100644 --- a/Source/pack.cpp +++ b/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;