diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index ea317bb8b..d34f1ab48 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -207,313 +207,309 @@ public: } }; -void LoadItemData(LoadHelper *file, Item *pItem) +void LoadItemData(LoadHelper &file, Item &item) { - pItem->_iSeed = file->NextLE(); - pItem->_iCreateInfo = file->NextLE(); - file->Skip(2); // Alignment - pItem->_itype = static_cast(file->NextLE()); - pItem->position.x = file->NextLE(); - pItem->position.y = file->NextLE(); - pItem->_iAnimFlag = file->NextBool32(); - file->Skip(4); // Skip pointer _iAnimData - pItem->AnimInfo = {}; - pItem->AnimInfo.NumberOfFrames = file->NextLE(); - pItem->AnimInfo.CurrentFrame = file->NextLE(); - file->Skip(8); // Skip _iAnimWidth and _iAnimWidth2 - file->Skip(4); // Unused since 1.02 - pItem->_iSelFlag = file->NextLE(); - file->Skip(3); // Alignment - pItem->_iPostDraw = file->NextBool32(); - pItem->_iIdentified = file->NextBool32(); - pItem->_iMagical = static_cast(file->NextLE()); - file->NextBytes(pItem->_iName, 64); - file->NextBytes(pItem->_iIName, 64); - pItem->_iLoc = static_cast(file->NextLE()); - pItem->_iClass = static_cast(file->NextLE()); - file->Skip(1); // Alignment - pItem->_iCurs = file->NextLE(); - pItem->_ivalue = file->NextLE(); - pItem->_iIvalue = file->NextLE(); - pItem->_iMinDam = file->NextLE(); - pItem->_iMaxDam = file->NextLE(); - pItem->_iAC = file->NextLE(); - pItem->_iFlags = file->NextLE(); - pItem->_iMiscId = static_cast(file->NextLE()); - pItem->_iSpell = static_cast(file->NextLE()); - pItem->_iCharges = file->NextLE(); - pItem->_iMaxCharges = file->NextLE(); - pItem->_iDurability = file->NextLE(); - pItem->_iMaxDur = file->NextLE(); - pItem->_iPLDam = file->NextLE(); - pItem->_iPLToHit = file->NextLE(); - pItem->_iPLAC = file->NextLE(); - pItem->_iPLStr = file->NextLE(); - pItem->_iPLMag = file->NextLE(); - pItem->_iPLDex = file->NextLE(); - pItem->_iPLVit = file->NextLE(); - pItem->_iPLFR = file->NextLE(); - pItem->_iPLLR = file->NextLE(); - pItem->_iPLMR = file->NextLE(); - pItem->_iPLMana = file->NextLE(); - pItem->_iPLHP = file->NextLE(); - pItem->_iPLDamMod = file->NextLE(); - pItem->_iPLGetHit = file->NextLE(); - pItem->_iPLLight = file->NextLE(); - pItem->_iSplLvlAdd = file->NextLE(); - pItem->_iRequest = file->NextBool8(); - file->Skip(2); // Alignment - pItem->_iUid = file->NextLE(); - pItem->_iFMinDam = file->NextLE(); - pItem->_iFMaxDam = file->NextLE(); - pItem->_iLMinDam = file->NextLE(); - pItem->_iLMaxDam = file->NextLE(); - pItem->_iPLEnAc = file->NextLE(); - pItem->_iPrePower = static_cast(file->NextLE()); - pItem->_iSufPower = static_cast(file->NextLE()); - file->Skip(2); // Alignment - pItem->_iVAdd1 = file->NextLE(); - pItem->_iVMult1 = file->NextLE(); - pItem->_iVAdd2 = file->NextLE(); - pItem->_iVMult2 = file->NextLE(); - pItem->_iMinStr = file->NextLE(); - pItem->_iMinMag = file->NextLE(); - pItem->_iMinDex = file->NextLE(); - file->Skip(1); // Alignment - pItem->_iStatFlag = file->NextBool32(); - pItem->IDidx = static_cast<_item_indexes>(file->NextLE()); + item._iSeed = file.NextLE(); + item._iCreateInfo = file.NextLE(); + file.Skip(2); // Alignment + item._itype = static_cast(file.NextLE()); + item.position.x = file.NextLE(); + item.position.y = file.NextLE(); + item._iAnimFlag = file.NextBool32(); + file.Skip(4); // Skip pointer _iAnimData + item.AnimInfo = {}; + item.AnimInfo.NumberOfFrames = file.NextLE(); + item.AnimInfo.CurrentFrame = file.NextLE(); + file.Skip(8); // Skip _iAnimWidth and _iAnimWidth2 + file.Skip(4); // Unused since 1.02 + item._iSelFlag = file.NextLE(); + file.Skip(3); // Alignment + item._iPostDraw = file.NextBool32(); + item._iIdentified = file.NextBool32(); + item._iMagical = static_cast(file.NextLE()); + file.NextBytes(item._iName, 64); + file.NextBytes(item._iIName, 64); + item._iLoc = static_cast(file.NextLE()); + item._iClass = static_cast(file.NextLE()); + file.Skip(1); // Alignment + item._iCurs = file.NextLE(); + item._ivalue = file.NextLE(); + item._iIvalue = file.NextLE(); + item._iMinDam = file.NextLE(); + item._iMaxDam = file.NextLE(); + item._iAC = file.NextLE(); + item._iFlags = file.NextLE(); + item._iMiscId = static_cast(file.NextLE()); + item._iSpell = static_cast(file.NextLE()); + item._iCharges = file.NextLE(); + item._iMaxCharges = file.NextLE(); + item._iDurability = file.NextLE(); + item._iMaxDur = file.NextLE(); + item._iPLDam = file.NextLE(); + item._iPLToHit = file.NextLE(); + item._iPLAC = file.NextLE(); + item._iPLStr = file.NextLE(); + item._iPLMag = file.NextLE(); + item._iPLDex = file.NextLE(); + item._iPLVit = file.NextLE(); + item._iPLFR = file.NextLE(); + item._iPLLR = file.NextLE(); + item._iPLMR = file.NextLE(); + item._iPLMana = file.NextLE(); + item._iPLHP = file.NextLE(); + item._iPLDamMod = file.NextLE(); + item._iPLGetHit = file.NextLE(); + item._iPLLight = file.NextLE(); + item._iSplLvlAdd = file.NextLE(); + item._iRequest = file.NextBool8(); + file.Skip(2); // Alignment + item._iUid = file.NextLE(); + item._iFMinDam = file.NextLE(); + item._iFMaxDam = file.NextLE(); + item._iLMinDam = file.NextLE(); + item._iLMaxDam = file.NextLE(); + item._iPLEnAc = file.NextLE(); + item._iPrePower = static_cast(file.NextLE()); + item._iSufPower = static_cast(file.NextLE()); + file.Skip(2); // Alignment + item._iVAdd1 = file.NextLE(); + item._iVMult1 = file.NextLE(); + item._iVAdd2 = file.NextLE(); + item._iVMult2 = file.NextLE(); + item._iMinStr = file.NextLE(); + item._iMinMag = file.NextLE(); + item._iMinDex = file.NextLE(); + file.Skip(1); // Alignment + item._iStatFlag = file.NextBool32(); + item.IDidx = static_cast<_item_indexes>(file.NextLE()); if (gbIsSpawn) { - pItem->IDidx = RemapItemIdxFromSpawn(pItem->IDidx); + item.IDidx = RemapItemIdxFromSpawn(item.IDidx); } if (!gbIsHellfireSaveGame) { - pItem->IDidx = RemapItemIdxFromDiablo(pItem->IDidx); + item.IDidx = RemapItemIdxFromDiablo(item.IDidx); } - pItem->dwBuff = file->NextLE(); + item.dwBuff = file.NextLE(); if (gbIsHellfireSaveGame) - pItem->_iDamAcFlags = file->NextLE(); + item._iDamAcFlags = file.NextLE(); else - pItem->_iDamAcFlags = 0; + item._iDamAcFlags = 0; - RemoveInvalidItem(pItem); + RemoveInvalidItem(item); } -void LoadItems(LoadHelper *file, const int n, Item *pItem) +void LoadPlayer(LoadHelper &file, Player &player) { - for (int i = 0; i < n; i++) { - LoadItemData(file, &pItem[i]); - } -} - -void LoadPlayer(LoadHelper *file, Player &player) -{ - player._pmode = static_cast(file->NextLE()); + player._pmode = static_cast(file.NextLE()); for (int8_t &step : player.walkpath) { - step = file->NextLE(); - } - player.plractive = file->NextBool8(); - file->Skip(2); // Alignment - player.destAction = static_cast(file->NextLE()); - player.destParam1 = file->NextLE(); - player.destParam2 = file->NextLE(); - player.destParam3 = static_cast(file->NextLE()); - player.destParam4 = file->NextLE(); - player.plrlevel = file->NextLE(); - player.position.tile.x = file->NextLE(); - player.position.tile.y = file->NextLE(); - player.position.future.x = file->NextLE(); - player.position.future.y = file->NextLE(); - file->Skip(8); // Skip _ptargx and _ptargy - player.position.last.x = file->NextLE(); - player.position.last.y = file->NextLE(); - player.position.old.x = file->NextLE(); - player.position.old.y = file->NextLE(); - player.position.offset.deltaX = file->NextLE(); - player.position.offset.deltaY = file->NextLE(); - player.position.velocity.deltaX = file->NextLE(); - player.position.velocity.deltaY = file->NextLE(); - player._pdir = static_cast(file->NextLE()); - file->Skip(4); // Unused - player._pgfxnum = file->NextLE(); - file->Skip(4); // Skip pointer pData + step = file.NextLE(); + } + player.plractive = file.NextBool8(); + file.Skip(2); // Alignment + player.destAction = static_cast(file.NextLE()); + player.destParam1 = file.NextLE(); + player.destParam2 = file.NextLE(); + player.destParam3 = static_cast(file.NextLE()); + player.destParam4 = file.NextLE(); + player.plrlevel = file.NextLE(); + player.position.tile.x = file.NextLE(); + player.position.tile.y = file.NextLE(); + player.position.future.x = file.NextLE(); + player.position.future.y = file.NextLE(); + file.Skip(8); // Skip _ptargx and _ptargy + player.position.last.x = file.NextLE(); + player.position.last.y = file.NextLE(); + player.position.old.x = file.NextLE(); + player.position.old.y = file.NextLE(); + player.position.offset.deltaX = file.NextLE(); + player.position.offset.deltaY = file.NextLE(); + player.position.velocity.deltaX = file.NextLE(); + player.position.velocity.deltaY = file.NextLE(); + player._pdir = static_cast(file.NextLE()); + file.Skip(4); // Unused + player._pgfxnum = file.NextLE(); + file.Skip(4); // Skip pointer pData player.AnimInfo = {}; - player.AnimInfo.TicksPerFrame = file->NextLE() + 1; - player.AnimInfo.TickCounterOfCurrentFrame = file->NextLE(); - player.AnimInfo.NumberOfFrames = file->NextLE(); - player.AnimInfo.CurrentFrame = file->NextLE(); - file->Skip(4); // Skip _pAnimWidth - file->Skip(4); // Skip _pAnimWidth2 - file->Skip(4); // Skip _peflag - player._plid = file->NextLE(); - player._pvid = file->NextLE(); - - player._pSpell = static_cast(file->NextLE()); - player._pSplType = static_cast(file->NextLE()); - player._pSplFrom = file->NextLE(); - file->Skip(2); // Alignment - player._pTSpell = static_cast(file->NextLE()); - file->Skip(); // Skip _pTSplType - file->Skip(3); // Alignment - player._pRSpell = static_cast(file->NextLE()); - player._pRSplType = static_cast(file->NextLE()); - file->Skip(3); // Alignment - player._pSBkSpell = static_cast(file->NextLE()); - file->Skip(); // Skip _pSBkSplType + player.AnimInfo.TicksPerFrame = file.NextLE() + 1; + player.AnimInfo.TickCounterOfCurrentFrame = file.NextLE(); + player.AnimInfo.NumberOfFrames = file.NextLE(); + player.AnimInfo.CurrentFrame = file.NextLE(); + file.Skip(4); // Skip _pAnimWidth + file.Skip(4); // Skip _pAnimWidth2 + file.Skip(4); // Skip _peflag + player._plid = file.NextLE(); + player._pvid = file.NextLE(); + + player._pSpell = static_cast(file.NextLE()); + player._pSplType = static_cast(file.NextLE()); + player._pSplFrom = file.NextLE(); + file.Skip(2); // Alignment + player._pTSpell = static_cast(file.NextLE()); + file.Skip(); // Skip _pTSplType + file.Skip(3); // Alignment + player._pRSpell = static_cast(file.NextLE()); + player._pRSplType = static_cast(file.NextLE()); + file.Skip(3); // Alignment + player._pSBkSpell = static_cast(file.NextLE()); + file.Skip(); // Skip _pSBkSplType for (int8_t &spellLevel : player._pSplLvl) - spellLevel = file->NextLE(); - file->Skip(7); // Alignment - player._pMemSpells = file->NextLE(); - player._pAblSpells = file->NextLE(); - player._pScrlSpells = file->NextLE(); - player._pSpellFlags = file->NextLE(); - file->Skip(3); // Alignment + spellLevel = file.NextLE(); + file.Skip(7); // Alignment + player._pMemSpells = file.NextLE(); + player._pAblSpells = file.NextLE(); + player._pScrlSpells = file.NextLE(); + player._pSpellFlags = file.NextLE(); + file.Skip(3); // Alignment for (auto &spell : player._pSplHotKey) - spell = static_cast(file->NextLE()); + spell = static_cast(file.NextLE()); for (auto &spellType : player._pSplTHotKey) - spellType = static_cast(file->NextLE()); + spellType = static_cast(file.NextLE()); - file->Skip(); // Skip _pwtype - player._pBlockFlag = file->NextBool8(); - player._pInvincible = file->NextBool8(); - player._pLightRad = file->NextLE(); - player._pLvlChanging = file->NextBool8(); + file.Skip(); // Skip _pwtype + player._pBlockFlag = file.NextBool8(); + player._pInvincible = file.NextBool8(); + player._pLightRad = file.NextLE(); + player._pLvlChanging = file.NextBool8(); - file->NextBytes(player._pName, PLR_NAME_LEN); - player._pClass = static_cast(file->NextLE()); - file->Skip(3); // Alignment - player._pStrength = file->NextLE(); - player._pBaseStr = file->NextLE(); - player._pMagic = file->NextLE(); - player._pBaseMag = file->NextLE(); - player._pDexterity = file->NextLE(); - player._pBaseDex = file->NextLE(); - player._pVitality = file->NextLE(); - player._pBaseVit = file->NextLE(); - player._pStatPts = file->NextLE(); - player._pDamageMod = file->NextLE(); - player._pBaseToBlk = file->NextLE(); + file.NextBytes(player._pName, PLR_NAME_LEN); + player._pClass = static_cast(file.NextLE()); + file.Skip(3); // Alignment + player._pStrength = file.NextLE(); + player._pBaseStr = file.NextLE(); + player._pMagic = file.NextLE(); + player._pBaseMag = file.NextLE(); + player._pDexterity = file.NextLE(); + player._pBaseDex = file.NextLE(); + player._pVitality = file.NextLE(); + player._pBaseVit = file.NextLE(); + player._pStatPts = file.NextLE(); + player._pDamageMod = file.NextLE(); + player._pBaseToBlk = file.NextLE(); if (player._pBaseToBlk == 0) player._pBaseToBlk = BlockBonuses[static_cast(player._pClass)]; - player._pHPBase = file->NextLE(); - player._pMaxHPBase = file->NextLE(); - player._pHitPoints = file->NextLE(); - player._pMaxHP = file->NextLE(); - file->Skip(sizeof(int32_t)); // Skip _pHPPer - always derived from hp and maxHP. - player._pManaBase = file->NextLE(); - player._pMaxManaBase = file->NextLE(); - player._pMana = file->NextLE(); - player._pMaxMana = file->NextLE(); - file->Skip(sizeof(int32_t)); // Skip _pManaPer - always derived from mana and maxMana - player._pLevel = file->NextLE(); - player._pMaxLvl = file->NextLE(); - file->Skip(2); // Alignment - player._pExperience = file->NextLE(); - file->Skip(); // Skip _pMaxExp - unused - player._pNextExper = file->NextLE(); // This can be calculated based on pLevel (which in turn could be calculated based on pExperience) - player._pArmorClass = file->NextLE(); - player._pMagResist = file->NextLE(); - player._pFireResist = file->NextLE(); - player._pLghtResist = file->NextLE(); - player._pGold = file->NextLE(); - - player._pInfraFlag = file->NextBool32(); - player.position.temp.x = file->NextLE(); - player.position.temp.y = file->NextLE(); - player.tempDirection = static_cast(file->NextLE()); - player._pVar4 = file->NextLE(); - player._pVar5 = file->NextLE(); - player.position.offset2.deltaX = file->NextLE(); - player.position.offset2.deltaY = file->NextLE(); - file->Skip(4); // Skip actionFrame + player._pHPBase = file.NextLE(); + player._pMaxHPBase = file.NextLE(); + player._pHitPoints = file.NextLE(); + player._pMaxHP = file.NextLE(); + file.Skip(sizeof(int32_t)); // Skip _pHPPer - always derived from hp and maxHP. + player._pManaBase = file.NextLE(); + player._pMaxManaBase = file.NextLE(); + player._pMana = file.NextLE(); + player._pMaxMana = file.NextLE(); + file.Skip(sizeof(int32_t)); // Skip _pManaPer - always derived from mana and maxMana + player._pLevel = file.NextLE(); + player._pMaxLvl = file.NextLE(); + file.Skip(2); // Alignment + player._pExperience = file.NextLE(); + file.Skip(); // Skip _pMaxExp - unused + player._pNextExper = file.NextLE(); // This can be calculated based on pLevel (which in turn could be calculated based on pExperience) + player._pArmorClass = file.NextLE(); + player._pMagResist = file.NextLE(); + player._pFireResist = file.NextLE(); + player._pLghtResist = file.NextLE(); + player._pGold = file.NextLE(); + + player._pInfraFlag = file.NextBool32(); + player.position.temp.x = file.NextLE(); + player.position.temp.y = file.NextLE(); + player.tempDirection = static_cast(file.NextLE()); + player._pVar4 = file.NextLE(); + player._pVar5 = file.NextLE(); + player.position.offset2.deltaX = file.NextLE(); + player.position.offset2.deltaY = file.NextLE(); + file.Skip(4); // Skip actionFrame for (uint8_t i = 0; i < giNumberOfLevels; i++) - player._pLvlVisited[i] = file->NextBool8(); + player._pLvlVisited[i] = file.NextBool8(); for (uint8_t i = 0; i < giNumberOfLevels; i++) - player._pSLvlVisited[i] = file->NextBool8(); - - file->Skip(2); // Alignment - file->Skip(4); // skip _pGFXLoad - file->Skip(4 * 8); // Skip pointers _pNAnim - player._pNFrames = file->NextLE(); - file->Skip(4); // skip _pNWidth - file->Skip(4 * 8); // Skip pointers _pWAnim - player._pWFrames = file->NextLE(); - file->Skip(4); // skip _pWWidth - file->Skip(4 * 8); // Skip pointers _pAAnim - player._pAFrames = file->NextLE(); - file->Skip(4); // skip _pAWidth - player._pAFNum = file->NextLE(); - file->Skip(4 * 8); // Skip pointers _pLAnim - file->Skip(4 * 8); // Skip pointers _pFAnim - file->Skip(4 * 8); // Skip pointers _pTAnim - player._pSFrames = file->NextLE(); - file->Skip(4); // skip _pSWidth - player._pSFNum = file->NextLE(); - file->Skip(4 * 8); // Skip pointers _pHAnim - player._pHFrames = file->NextLE(); - file->Skip(4); // skip _pHWidth - file->Skip(4 * 8); // Skip pointers _pDAnim - player._pDFrames = file->NextLE(); - file->Skip(4); // skip _pDWidth - file->Skip(4 * 8); // Skip pointers _pBAnim - player._pBFrames = file->NextLE(); - file->Skip(4); // skip _pBWidth - - LoadItems(file, NUM_INVLOC, player.InvBody); - LoadItems(file, NUM_INV_GRID_ELEM, player.InvList); - player._pNumInv = file->NextLE(); + player._pSLvlVisited[i] = file.NextBool8(); + + file.Skip(2); // Alignment + file.Skip(4); // skip _pGFXLoad + file.Skip(4 * 8); // Skip pointers _pNAnim + player._pNFrames = file.NextLE(); + file.Skip(4); // skip _pNWidth + file.Skip(4 * 8); // Skip pointers _pWAnim + player._pWFrames = file.NextLE(); + file.Skip(4); // skip _pWWidth + file.Skip(4 * 8); // Skip pointers _pAAnim + player._pAFrames = file.NextLE(); + file.Skip(4); // skip _pAWidth + player._pAFNum = file.NextLE(); + file.Skip(4 * 8); // Skip pointers _pLAnim + file.Skip(4 * 8); // Skip pointers _pFAnim + file.Skip(4 * 8); // Skip pointers _pTAnim + player._pSFrames = file.NextLE(); + file.Skip(4); // skip _pSWidth + player._pSFNum = file.NextLE(); + file.Skip(4 * 8); // Skip pointers _pHAnim + player._pHFrames = file.NextLE(); + file.Skip(4); // skip _pHWidth + file.Skip(4 * 8); // Skip pointers _pDAnim + player._pDFrames = file.NextLE(); + file.Skip(4); // skip _pDWidth + file.Skip(4 * 8); // Skip pointers _pBAnim + player._pBFrames = file.NextLE(); + file.Skip(4); // skip _pBWidth + + for (Item &item : player.InvBody) + LoadItemData(file, item); + for (Item &item : player.InvList) + LoadItemData(file, item); + player._pNumInv = file.NextLE(); for (int8_t &cell : player.InvGrid) - cell = file->NextLE(); - LoadItems(file, MAXBELTITEMS, player.SpdList); - LoadItemData(file, &player.HoldItem); - - player._pIMinDam = file->NextLE(); - player._pIMaxDam = file->NextLE(); - player._pIAC = file->NextLE(); - player._pIBonusDam = file->NextLE(); - player._pIBonusToHit = file->NextLE(); - player._pIBonusAC = file->NextLE(); - player._pIBonusDamMod = file->NextLE(); - file->Skip(4); // Alignment - - player._pISpells = file->NextLE(); - player._pIFlags = file->NextLE(); - player._pIGetHit = file->NextLE(); - player._pISplLvlAdd = file->NextLE(); - file->Skip(1); // Unused - file->Skip(2); // Alignment - player._pISplDur = file->NextLE(); - player._pIEnAc = file->NextLE(); - player._pIFMinDam = file->NextLE(); - player._pIFMaxDam = file->NextLE(); - player._pILMinDam = file->NextLE(); - player._pILMaxDam = file->NextLE(); - player._pOilType = static_cast(file->NextLE()); - player.pTownWarps = file->NextLE(); - player.pDungMsgs = file->NextLE(); - player.pLvlLoad = file->NextLE(); + cell = file.NextLE(); + for (Item &item : player.SpdList) + LoadItemData(file, item); + LoadItemData(file, player.HoldItem); + + player._pIMinDam = file.NextLE(); + player._pIMaxDam = file.NextLE(); + player._pIAC = file.NextLE(); + player._pIBonusDam = file.NextLE(); + player._pIBonusToHit = file.NextLE(); + player._pIBonusAC = file.NextLE(); + player._pIBonusDamMod = file.NextLE(); + file.Skip(4); // Alignment + + player._pISpells = file.NextLE(); + player._pIFlags = file.NextLE(); + player._pIGetHit = file.NextLE(); + player._pISplLvlAdd = file.NextLE(); + file.Skip(1); // Unused + file.Skip(2); // Alignment + player._pISplDur = file.NextLE(); + player._pIEnAc = file.NextLE(); + player._pIFMinDam = file.NextLE(); + player._pIFMaxDam = file.NextLE(); + player._pILMinDam = file.NextLE(); + player._pILMaxDam = file.NextLE(); + player._pOilType = static_cast(file.NextLE()); + player.pTownWarps = file.NextLE(); + player.pDungMsgs = file.NextLE(); + player.pLvlLoad = file.NextLE(); if (gbIsHellfireSaveGame) { - player.pDungMsgs2 = file->NextLE(); + player.pDungMsgs2 = file.NextLE(); player.pBattleNet = false; } else { player.pDungMsgs2 = 0; - player.pBattleNet = file->NextBool8(); + player.pBattleNet = file.NextBool8(); } - player.pManaShield = file->NextBool8(); + player.pManaShield = file.NextBool8(); if (gbIsHellfireSaveGame) { - player.pOriginalCathedral = file->NextBool8(); + player.pOriginalCathedral = file.NextBool8(); } else { - file->Skip(1); + file.Skip(1); player.pOriginalCathedral = true; } - file->Skip(2); // Available bytes - player.wReflections = file->NextLE(); - file->Skip(14); // Available bytes + file.Skip(2); // Available bytes + player.wReflections = file.NextLE(); + file.Skip(14); // Available bytes - player.pDiabloKillLevel = file->NextLE(); - player.pDifficulty = static_cast<_difficulty>(file->NextLE()); - player.pDamAcFlags = file->NextLE(); - file->Skip(20); // Available bytes + player.pDiabloKillLevel = file.NextLE(); + player.pDifficulty = static_cast<_difficulty>(file.NextLE()); + player.pDamAcFlags = file.NextLE(); + file.Skip(20); // Available bytes CalcPlrItemVals(player, false); // Omit pointer _pNData @@ -719,15 +715,15 @@ void LoadObject(LoadHelper &file, Object &object) object._oVar8 = file.NextLE(); } -void LoadItem(LoadHelper *file, int i) +void LoadItem(LoadHelper &file, Item &item) { - LoadItemData(file, &Items[i]); - GetItemFrm(Items[i]); + LoadItemData(file, item); + GetItemFrm(item); } -void LoadPremium(LoadHelper *file, int i) +void LoadPremium(LoadHelper &file, int i) { - LoadItemData(file, &premiumitems[i]); + LoadItemData(file, premiumitems[i]); } void LoadQuest(LoadHelper *file, int i) @@ -841,12 +837,12 @@ void ConvertLevels() leveltype = tmpLeveltype; } -void LoadMatchingItems(LoadHelper *file, const int n, Item *pItem) +void LoadMatchingItems(LoadHelper &file, const int n, Item *pItem) { Item tempItem; for (int i = 0; i < n; i++) { - LoadItemData(file, &tempItem); + LoadItemData(file, tempItem); if (pItem[i].isEmpty() || tempItem.isEmpty()) continue; if (pItem[i]._iSeed != tempItem._iSeed) @@ -1434,20 +1430,20 @@ const int HellfireItemSaveSize = 372; } // namespace -void RemoveInvalidItem(Item *pItem) +void RemoveInvalidItem(Item &item) { - bool isInvalid = !IsItemAvailable(pItem->IDidx) || !IsUniqueAvailable(pItem->_iUid); + bool isInvalid = !IsItemAvailable(item.IDidx) || !IsUniqueAvailable(item._iUid); if (!gbIsHellfire) { - isInvalid = isInvalid || (pItem->_itype == ITYPE_STAFF && GetSpellStaffLevel(pItem->_iSpell) == -1); - isInvalid = isInvalid || (pItem->_iMiscId == IMISC_BOOK && GetSpellBookLevel(pItem->_iSpell) == -1); - isInvalid = isInvalid || pItem->_iDamAcFlags != 0; - isInvalid = isInvalid || pItem->_iPrePower > IDI_LASTDIABLO; - isInvalid = isInvalid || pItem->_iSufPower > IDI_LASTDIABLO; + isInvalid = isInvalid || (item._itype == ITYPE_STAFF && GetSpellStaffLevel(item._iSpell) == -1); + isInvalid = isInvalid || (item._iMiscId == IMISC_BOOK && GetSpellBookLevel(item._iSpell) == -1); + isInvalid = isInvalid || item._iDamAcFlags != 0; + isInvalid = isInvalid || item._iPrePower > IDI_LASTDIABLO; + isInvalid = isInvalid || item._iSufPower > IDI_LASTDIABLO; } if (isInvalid) { - pItem->_itype = ITYPE_NONE; + item._itype = ITYPE_NONE; } } @@ -1623,9 +1619,9 @@ void LoadHeroItems(Player &player) gbIsHellfireSaveGame = file.NextBool8(); - LoadMatchingItems(&file, NUM_INVLOC, player.InvBody); - LoadMatchingItems(&file, NUM_INV_GRID_ELEM, player.InvList); - LoadMatchingItems(&file, MAXBELTITEMS, player.SpdList); + LoadMatchingItems(file, NUM_INVLOC, player.InvBody); + LoadMatchingItems(file, NUM_INV_GRID_ELEM, player.InvList); + LoadMatchingItems(file, MAXBELTITEMS, player.SpdList); gbIsHellfireSaveGame = gbIsHellfire; } @@ -1692,7 +1688,7 @@ void LoadGame(bool firstflag) auto &myPlayer = Players[MyPlayerId]; - LoadPlayer(&file, myPlayer); + LoadPlayer(file, myPlayer); sgGameInitInfo.nDifficulty = myPlayer.pDifficulty; if (sgGameInitInfo.nDifficulty < DIFF_NORMAL || sgGameInitInfo.nDifficulty > DIFF_HELL) @@ -1760,7 +1756,7 @@ void LoadGame(bool firstflag) for (int &itemId : AvailableItems) itemId = file.NextLE(); for (int i = 0; i < ActiveItemCount; i++) - LoadItem(&file, ActiveItems[i]); + LoadItem(file, Items[ActiveItems[i]]); for (bool &uniqueItemFlag : UniqueItemFlags) uniqueItemFlag = file.NextBool8(); @@ -1813,7 +1809,7 @@ void LoadGame(bool firstflag) premiumlevel = file.NextBE(); for (int i = 0; i < giNumberOfSmithPremiumItems; i++) - LoadPremium(&file, i); + LoadPremium(file, i); if (gbIsHellfire && !gbIsHellfireSaveGame) SpawnPremium(MyPlayerId); @@ -2150,7 +2146,7 @@ void LoadLevel() for (int &itemId : AvailableItems) itemId = file.NextLE(); for (int i = 0; i < ActiveItemCount; i++) - LoadItem(&file, ActiveItems[i]); + LoadItem(file, Items[ActiveItems[i]]); for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert) diff --git a/Source/loadsave.h b/Source/loadsave.h index 05c0a7d99..11c3966d2 100644 --- a/Source/loadsave.h +++ b/Source/loadsave.h @@ -12,7 +12,7 @@ namespace devilution { extern bool gbIsHellfireSaveGame; extern uint8_t giNumberOfLevels; -void RemoveInvalidItem(Item *pItem); +void RemoveInvalidItem(Item &pItem); _item_indexes RemapItemIdxFromDiablo(_item_indexes i); _item_indexes RemapItemIdxToDiablo(_item_indexes i); _item_indexes RemapItemIdxFromSpawn(_item_indexes i); diff --git a/Source/pack.cpp b/Source/pack.cpp index badc66086..94dfe2eef 100644 --- a/Source/pack.cpp +++ b/Source/pack.cpp @@ -187,7 +187,7 @@ void UnPackItem(const ItemPack *is, Item *id, bool isHellfire) item._iCharges = is->bCh; item._iMaxCharges = is->bMCh; - RemoveInvalidItem(&item); + RemoveInvalidItem(item); if (isHellfire) item.dwBuff |= CF_HELLFIRE;