From cdf2db1d949ce954a3957c2216ee8338ee4edd6f Mon Sep 17 00:00:00 2001 From: ephphatha Date: Sun, 5 Sep 2021 22:25:13 +1000 Subject: [PATCH] SaveItem by reference --- Source/loadsave.cpp | 562 ++++++++++++++++++++++---------------------- 1 file changed, 278 insertions(+), 284 deletions(-) diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index d34f1ab48..df3114686 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -863,313 +863,309 @@ void RemoveEmptyLevelItems() } } -void SaveItem(SaveHelper *file, Item *pItem) +void SaveItem(SaveHelper &file, const Item &item) { - auto idx = pItem->IDidx; + auto idx = item.IDidx; if (!gbIsHellfire) idx = RemapItemIdxToDiablo(idx); if (gbIsSpawn) idx = RemapItemIdxToSpawn(idx); - int iType = pItem->_itype; + int iType = item._itype; if (idx == -1) { idx = _item_indexes::IDI_GOLD; iType = ITYPE_NONE; } - file->WriteLE(pItem->_iSeed); - file->WriteLE(pItem->_iCreateInfo); - file->Skip(2); // Alignment - file->WriteLE(iType); - file->WriteLE(pItem->position.x); - file->WriteLE(pItem->position.y); - file->WriteLE(pItem->_iAnimFlag ? 1 : 0); - file->Skip(4); // Skip pointer _iAnimData - file->WriteLE(pItem->AnimInfo.NumberOfFrames); - file->WriteLE(pItem->AnimInfo.CurrentFrame); + file.WriteLE(item._iSeed); + file.WriteLE(item._iCreateInfo); + file.Skip(2); // Alignment + file.WriteLE(iType); + file.WriteLE(item.position.x); + file.WriteLE(item.position.y); + file.WriteLE(item._iAnimFlag ? 1 : 0); + file.Skip(4); // Skip pointer _iAnimData + file.WriteLE(item.AnimInfo.NumberOfFrames); + file.WriteLE(item.AnimInfo.CurrentFrame); // write _iAnimWidth for vanilla compatibility - file->WriteLE(ItemAnimWidth); + file.WriteLE(ItemAnimWidth); // write _iAnimWidth2 for vanilla compatibility - file->WriteLE(CalculateWidth2(ItemAnimWidth)); - file->Skip(); // _delFlag, unused since 1.02 - file->WriteLE(pItem->_iSelFlag); - file->Skip(3); // Alignment - file->WriteLE(pItem->_iPostDraw ? 1 : 0); - file->WriteLE(pItem->_iIdentified ? 1 : 0); - file->WriteLE(pItem->_iMagical); - file->WriteBytes(pItem->_iName, 64); - file->WriteBytes(pItem->_iIName, 64); - file->WriteLE(pItem->_iLoc); - file->WriteLE(pItem->_iClass); - file->Skip(1); // Alignment - file->WriteLE(pItem->_iCurs); - file->WriteLE(pItem->_ivalue); - file->WriteLE(pItem->_iIvalue); - file->WriteLE(pItem->_iMinDam); - file->WriteLE(pItem->_iMaxDam); - file->WriteLE(pItem->_iAC); - file->WriteLE(pItem->_iFlags); - file->WriteLE(pItem->_iMiscId); - file->WriteLE(pItem->_iSpell); - file->WriteLE(pItem->_iCharges); - file->WriteLE(pItem->_iMaxCharges); - file->WriteLE(pItem->_iDurability); - file->WriteLE(pItem->_iMaxDur); - file->WriteLE(pItem->_iPLDam); - file->WriteLE(pItem->_iPLToHit); - file->WriteLE(pItem->_iPLAC); - file->WriteLE(pItem->_iPLStr); - file->WriteLE(pItem->_iPLMag); - file->WriteLE(pItem->_iPLDex); - file->WriteLE(pItem->_iPLVit); - file->WriteLE(pItem->_iPLFR); - file->WriteLE(pItem->_iPLLR); - file->WriteLE(pItem->_iPLMR); - file->WriteLE(pItem->_iPLMana); - file->WriteLE(pItem->_iPLHP); - file->WriteLE(pItem->_iPLDamMod); - file->WriteLE(pItem->_iPLGetHit); - file->WriteLE(pItem->_iPLLight); - file->WriteLE(pItem->_iSplLvlAdd); - file->WriteLE(pItem->_iRequest ? 1 : 0); - file->Skip(2); // Alignment - file->WriteLE(pItem->_iUid); - file->WriteLE(pItem->_iFMinDam); - file->WriteLE(pItem->_iFMaxDam); - file->WriteLE(pItem->_iLMinDam); - file->WriteLE(pItem->_iLMaxDam); - file->WriteLE(pItem->_iPLEnAc); - file->WriteLE(pItem->_iPrePower); - file->WriteLE(pItem->_iSufPower); - file->Skip(2); // Alignment - file->WriteLE(pItem->_iVAdd1); - file->WriteLE(pItem->_iVMult1); - file->WriteLE(pItem->_iVAdd2); - file->WriteLE(pItem->_iVMult2); - file->WriteLE(pItem->_iMinStr); - file->WriteLE(pItem->_iMinMag); - file->WriteLE(pItem->_iMinDex); - file->Skip(1); // Alignment - file->WriteLE(pItem->_iStatFlag ? 1 : 0); - file->WriteLE(idx); - file->WriteLE(pItem->dwBuff); + file.WriteLE(CalculateWidth2(ItemAnimWidth)); + file.Skip(); // _delFlag, unused since 1.02 + file.WriteLE(item._iSelFlag); + file.Skip(3); // Alignment + file.WriteLE(item._iPostDraw ? 1 : 0); + file.WriteLE(item._iIdentified ? 1 : 0); + file.WriteLE(item._iMagical); + file.WriteBytes(item._iName, 64); + file.WriteBytes(item._iIName, 64); + file.WriteLE(item._iLoc); + file.WriteLE(item._iClass); + file.Skip(1); // Alignment + file.WriteLE(item._iCurs); + file.WriteLE(item._ivalue); + file.WriteLE(item._iIvalue); + file.WriteLE(item._iMinDam); + file.WriteLE(item._iMaxDam); + file.WriteLE(item._iAC); + file.WriteLE(item._iFlags); + file.WriteLE(item._iMiscId); + file.WriteLE(item._iSpell); + file.WriteLE(item._iCharges); + file.WriteLE(item._iMaxCharges); + file.WriteLE(item._iDurability); + file.WriteLE(item._iMaxDur); + file.WriteLE(item._iPLDam); + file.WriteLE(item._iPLToHit); + file.WriteLE(item._iPLAC); + file.WriteLE(item._iPLStr); + file.WriteLE(item._iPLMag); + file.WriteLE(item._iPLDex); + file.WriteLE(item._iPLVit); + file.WriteLE(item._iPLFR); + file.WriteLE(item._iPLLR); + file.WriteLE(item._iPLMR); + file.WriteLE(item._iPLMana); + file.WriteLE(item._iPLHP); + file.WriteLE(item._iPLDamMod); + file.WriteLE(item._iPLGetHit); + file.WriteLE(item._iPLLight); + file.WriteLE(item._iSplLvlAdd); + file.WriteLE(item._iRequest ? 1 : 0); + file.Skip(2); // Alignment + file.WriteLE(item._iUid); + file.WriteLE(item._iFMinDam); + file.WriteLE(item._iFMaxDam); + file.WriteLE(item._iLMinDam); + file.WriteLE(item._iLMaxDam); + file.WriteLE(item._iPLEnAc); + file.WriteLE(item._iPrePower); + file.WriteLE(item._iSufPower); + file.Skip(2); // Alignment + file.WriteLE(item._iVAdd1); + file.WriteLE(item._iVMult1); + file.WriteLE(item._iVAdd2); + file.WriteLE(item._iVMult2); + file.WriteLE(item._iMinStr); + file.WriteLE(item._iMinMag); + file.WriteLE(item._iMinDex); + file.Skip(1); // Alignment + file.WriteLE(item._iStatFlag ? 1 : 0); + file.WriteLE(idx); + file.WriteLE(item.dwBuff); if (gbIsHellfire) - file->WriteLE(pItem->_iDamAcFlags); -} - -void SaveItems(SaveHelper *file, Item *pItem, const int n) -{ - for (int i = 0; i < n; i++) { - SaveItem(file, &pItem[i]); - } + file.WriteLE(item._iDamAcFlags); } -void SavePlayer(SaveHelper *file, Player &player) +void SavePlayer(SaveHelper &file, const Player &player) { - file->WriteLE(player._pmode); + file.WriteLE(player._pmode); for (int8_t step : player.walkpath) - file->WriteLE(step); - file->WriteLE(player.plractive ? 1 : 0); - file->Skip(2); // Alignment - file->WriteLE(player.destAction); - file->WriteLE(player.destParam1); - file->WriteLE(player.destParam2); - file->WriteLE(player.destParam3); - file->WriteLE(player.destParam4); - file->WriteLE(player.plrlevel); - file->WriteLE(player.position.tile.x); - file->WriteLE(player.position.tile.y); - file->WriteLE(player.position.future.x); - file->WriteLE(player.position.future.y); + file.WriteLE(step); + file.WriteLE(player.plractive ? 1 : 0); + file.Skip(2); // Alignment + file.WriteLE(player.destAction); + file.WriteLE(player.destParam1); + file.WriteLE(player.destParam2); + file.WriteLE(player.destParam3); + file.WriteLE(player.destParam4); + file.WriteLE(player.plrlevel); + file.WriteLE(player.position.tile.x); + file.WriteLE(player.position.tile.y); + file.WriteLE(player.position.future.x); + file.WriteLE(player.position.future.y); // For backwards compatibility const Point target = player.GetTargetPosition(); - file->WriteLE(target.x); - file->WriteLE(target.y); - - file->WriteLE(player.position.last.x); - file->WriteLE(player.position.last.y); - file->WriteLE(player.position.old.x); - file->WriteLE(player.position.old.y); - file->WriteLE(player.position.offset.deltaX); - file->WriteLE(player.position.offset.deltaY); - file->WriteLE(player.position.velocity.deltaX); - file->WriteLE(player.position.velocity.deltaY); - file->WriteLE(player._pdir); - file->Skip(4); // Unused - file->WriteLE(player._pgfxnum); - file->Skip(4); // Skip pointer _pAnimData - file->WriteLE(std::max(0, player.AnimInfo.TicksPerFrame - 1)); - file->WriteLE(player.AnimInfo.TickCounterOfCurrentFrame); - file->WriteLE(player.AnimInfo.NumberOfFrames); - file->WriteLE(player.AnimInfo.CurrentFrame); + file.WriteLE(target.x); + file.WriteLE(target.y); + + file.WriteLE(player.position.last.x); + file.WriteLE(player.position.last.y); + file.WriteLE(player.position.old.x); + file.WriteLE(player.position.old.y); + file.WriteLE(player.position.offset.deltaX); + file.WriteLE(player.position.offset.deltaY); + file.WriteLE(player.position.velocity.deltaX); + file.WriteLE(player.position.velocity.deltaY); + file.WriteLE(player._pdir); + file.Skip(4); // Unused + file.WriteLE(player._pgfxnum); + file.Skip(4); // Skip pointer _pAnimData + file.WriteLE(std::max(0, player.AnimInfo.TicksPerFrame - 1)); + file.WriteLE(player.AnimInfo.TickCounterOfCurrentFrame); + file.WriteLE(player.AnimInfo.NumberOfFrames); + file.WriteLE(player.AnimInfo.CurrentFrame); // write _pAnimWidth for vanilla compatibility int animWidth = player.AnimInfo.pCelSprite == nullptr ? 96 : player.AnimInfo.pCelSprite->Width(); - file->WriteLE(animWidth); + file.WriteLE(animWidth); // write _pAnimWidth2 for vanilla compatibility - file->WriteLE(CalculateWidth2(animWidth)); - file->Skip(); // Skip _peflag - file->WriteLE(player._plid); - file->WriteLE(player._pvid); - - file->WriteLE(player._pSpell); - file->WriteLE(player._pSplType); - file->WriteLE(player._pSplFrom); - file->Skip(2); // Alignment - file->WriteLE(player._pTSpell); - file->Skip(); // Skip _pTSplType - file->Skip(3); // Alignment - file->WriteLE(player._pRSpell); - file->WriteLE(player._pRSplType); - file->Skip(3); // Alignment - file->WriteLE(player._pSBkSpell); - file->Skip(); // Skip _pSBkSplType + file.WriteLE(CalculateWidth2(animWidth)); + file.Skip(); // Skip _peflag + file.WriteLE(player._plid); + file.WriteLE(player._pvid); + + file.WriteLE(player._pSpell); + file.WriteLE(player._pSplType); + file.WriteLE(player._pSplFrom); + file.Skip(2); // Alignment + file.WriteLE(player._pTSpell); + file.Skip(); // Skip _pTSplType + file.Skip(3); // Alignment + file.WriteLE(player._pRSpell); + file.WriteLE(player._pRSplType); + file.Skip(3); // Alignment + file.WriteLE(player._pSBkSpell); + file.Skip(); // Skip _pSBkSplType for (int8_t spellLevel : player._pSplLvl) - file->WriteLE(spellLevel); - file->Skip(7); // Alignment - file->WriteLE(player._pMemSpells); - file->WriteLE(player._pAblSpells); - file->WriteLE(player._pScrlSpells); - file->WriteLE(player._pSpellFlags); - file->Skip(3); // Alignment + file.WriteLE(spellLevel); + file.Skip(7); // Alignment + file.WriteLE(player._pMemSpells); + file.WriteLE(player._pAblSpells); + file.WriteLE(player._pScrlSpells); + file.WriteLE(player._pSpellFlags); + file.Skip(3); // Alignment for (auto &spellId : player._pSplHotKey) - file->WriteLE(spellId); + file.WriteLE(spellId); for (auto &spellType : player._pSplTHotKey) - file->WriteLE(spellType); + file.WriteLE(spellType); - file->WriteLE(player.UsesRangedWeapon() ? 1 : 0); - file->WriteLE(player._pBlockFlag ? 1 : 0); - file->WriteLE(player._pInvincible ? 1 : 0); - file->WriteLE(player._pLightRad); - file->WriteLE(player._pLvlChanging ? 1 : 0); + file.WriteLE(player.UsesRangedWeapon() ? 1 : 0); + file.WriteLE(player._pBlockFlag ? 1 : 0); + file.WriteLE(player._pInvincible ? 1 : 0); + file.WriteLE(player._pLightRad); + file.WriteLE(player._pLvlChanging ? 1 : 0); - file->WriteBytes(player._pName, PLR_NAME_LEN); - file->WriteLE(static_cast(player._pClass)); - file->Skip(3); // Alignment - file->WriteLE(player._pStrength); - file->WriteLE(player._pBaseStr); - file->WriteLE(player._pMagic); - file->WriteLE(player._pBaseMag); - file->WriteLE(player._pDexterity); - file->WriteLE(player._pBaseDex); - file->WriteLE(player._pVitality); - file->WriteLE(player._pBaseVit); - file->WriteLE(player._pStatPts); - file->WriteLE(player._pDamageMod); - - file->WriteLE(player._pBaseToBlk); - file->WriteLE(player._pHPBase); - file->WriteLE(player._pMaxHPBase); - file->WriteLE(player._pHitPoints); - file->WriteLE(player._pMaxHP); - file->Skip(); // Skip _pHPPer - file->WriteLE(player._pManaBase); - file->WriteLE(player._pMaxManaBase); - file->WriteLE(player._pMana); - file->WriteLE(player._pMaxMana); - file->Skip(); // Skip _pManaPer - file->WriteLE(player._pLevel); - file->WriteLE(player._pMaxLvl); - file->Skip(2); // Alignment - file->WriteLE(player._pExperience); - file->Skip(); // Skip _pMaxExp - file->WriteLE(player._pNextExper); - file->WriteLE(player._pArmorClass); - file->WriteLE(player._pMagResist); - file->WriteLE(player._pFireResist); - file->WriteLE(player._pLghtResist); - file->WriteLE(player._pGold); - - file->WriteLE(player._pInfraFlag ? 1 : 0); - file->WriteLE(player.position.temp.x); - file->WriteLE(player.position.temp.y); - file->WriteLE(player.tempDirection); - file->WriteLE(player._pVar4); - file->WriteLE(player._pVar5); - file->WriteLE(player.position.offset2.deltaX); - file->WriteLE(player.position.offset2.deltaY); - file->Skip(); // Skip _pVar8 + file.WriteBytes(player._pName, PLR_NAME_LEN); + file.WriteLE(static_cast(player._pClass)); + file.Skip(3); // Alignment + file.WriteLE(player._pStrength); + file.WriteLE(player._pBaseStr); + file.WriteLE(player._pMagic); + file.WriteLE(player._pBaseMag); + file.WriteLE(player._pDexterity); + file.WriteLE(player._pBaseDex); + file.WriteLE(player._pVitality); + file.WriteLE(player._pBaseVit); + file.WriteLE(player._pStatPts); + file.WriteLE(player._pDamageMod); + + file.WriteLE(player._pBaseToBlk); + file.WriteLE(player._pHPBase); + file.WriteLE(player._pMaxHPBase); + file.WriteLE(player._pHitPoints); + file.WriteLE(player._pMaxHP); + file.Skip(); // Skip _pHPPer + file.WriteLE(player._pManaBase); + file.WriteLE(player._pMaxManaBase); + file.WriteLE(player._pMana); + file.WriteLE(player._pMaxMana); + file.Skip(); // Skip _pManaPer + file.WriteLE(player._pLevel); + file.WriteLE(player._pMaxLvl); + file.Skip(2); // Alignment + file.WriteLE(player._pExperience); + file.Skip(); // Skip _pMaxExp + file.WriteLE(player._pNextExper); + file.WriteLE(player._pArmorClass); + file.WriteLE(player._pMagResist); + file.WriteLE(player._pFireResist); + file.WriteLE(player._pLghtResist); + file.WriteLE(player._pGold); + + file.WriteLE(player._pInfraFlag ? 1 : 0); + file.WriteLE(player.position.temp.x); + file.WriteLE(player.position.temp.y); + file.WriteLE(player.tempDirection); + file.WriteLE(player._pVar4); + file.WriteLE(player._pVar5); + file.WriteLE(player.position.offset2.deltaX); + file.WriteLE(player.position.offset2.deltaY); + file.Skip(); // Skip _pVar8 for (uint8_t i = 0; i < giNumberOfLevels; i++) - file->WriteLE(player._pLvlVisited[i] ? 1 : 0); + file.WriteLE(player._pLvlVisited[i] ? 1 : 0); for (uint8_t i = 0; i < giNumberOfLevels; i++) - file->WriteLE(player._pSLvlVisited[i] ? 1 : 0); // only 10 used + file.WriteLE(player._pSLvlVisited[i] ? 1 : 0); // only 10 used - file->Skip(2); // Alignment + file.Skip(2); // Alignment - file->Skip(); // Skip _pGFXLoad - file->Skip(4 * 8); // Skip pointers _pNAnim - file->WriteLE(player._pNFrames); - file->Skip(4); // Skip _pNWidth - file->Skip(4 * 8); // Skip pointers _pWAnim - file->WriteLE(player._pWFrames); - file->Skip(4); // Skip _pWWidth - file->Skip(4 * 8); // Skip pointers _pAAnim - file->WriteLE(player._pAFrames); - file->Skip(4); // Skip _pAWidth - file->WriteLE(player._pAFNum); - file->Skip(4 * 8); // Skip pointers _pLAnim - file->Skip(4 * 8); // Skip pointers _pFAnim - file->Skip(4 * 8); // Skip pointers _pTAnim - file->WriteLE(player._pSFrames); - file->Skip(4); // Skip _pSWidth - file->WriteLE(player._pSFNum); - file->Skip(4 * 8); // Skip pointers _pHAnim - file->WriteLE(player._pHFrames); - file->Skip(4); // Skip _pHWidth - file->Skip(4 * 8); // Skip pointers _pDAnim - file->WriteLE(player._pDFrames); - file->Skip(4); // Skip _pDWidth - file->Skip(4 * 8); // Skip pointers _pBAnim - file->WriteLE(player._pBFrames); - file->Skip(4); // Skip _pBWidth - - SaveItems(file, player.InvBody, NUM_INVLOC); - SaveItems(file, player.InvList, NUM_INV_GRID_ELEM); - file->WriteLE(player._pNumInv); + file.Skip(); // Skip _pGFXLoad + file.Skip(4 * 8); // Skip pointers _pNAnim + file.WriteLE(player._pNFrames); + file.Skip(4); // Skip _pNWidth + file.Skip(4 * 8); // Skip pointers _pWAnim + file.WriteLE(player._pWFrames); + file.Skip(4); // Skip _pWWidth + file.Skip(4 * 8); // Skip pointers _pAAnim + file.WriteLE(player._pAFrames); + file.Skip(4); // Skip _pAWidth + file.WriteLE(player._pAFNum); + file.Skip(4 * 8); // Skip pointers _pLAnim + file.Skip(4 * 8); // Skip pointers _pFAnim + file.Skip(4 * 8); // Skip pointers _pTAnim + file.WriteLE(player._pSFrames); + file.Skip(4); // Skip _pSWidth + file.WriteLE(player._pSFNum); + file.Skip(4 * 8); // Skip pointers _pHAnim + file.WriteLE(player._pHFrames); + file.Skip(4); // Skip _pHWidth + file.Skip(4 * 8); // Skip pointers _pDAnim + file.WriteLE(player._pDFrames); + file.Skip(4); // Skip _pDWidth + file.Skip(4 * 8); // Skip pointers _pBAnim + file.WriteLE(player._pBFrames); + file.Skip(4); // Skip _pBWidth + + for (const Item &item : player.InvBody) + SaveItem(file, item); + for (const Item &item : player.InvList) + SaveItem(file, item); + file.WriteLE(player._pNumInv); for (int8_t cell : player.InvGrid) - file->WriteLE(cell); - SaveItems(file, player.SpdList, MAXBELTITEMS); - SaveItem(file, &player.HoldItem); - - file->WriteLE(player._pIMinDam); - file->WriteLE(player._pIMaxDam); - file->WriteLE(player._pIAC); - file->WriteLE(player._pIBonusDam); - file->WriteLE(player._pIBonusToHit); - file->WriteLE(player._pIBonusAC); - file->WriteLE(player._pIBonusDamMod); - file->Skip(4); // Alignment - - file->WriteLE(player._pISpells); - file->WriteLE(player._pIFlags); - file->WriteLE(player._pIGetHit); - - file->WriteLE(player._pISplLvlAdd); - file->Skip(); // Skip _pISplCost - file->Skip(2); // Alignment - file->WriteLE(player._pISplDur); - file->WriteLE(player._pIEnAc); - file->WriteLE(player._pIFMinDam); - file->WriteLE(player._pIFMaxDam); - file->WriteLE(player._pILMinDam); - file->WriteLE(player._pILMaxDam); - file->WriteLE(player._pOilType); - file->WriteLE(player.pTownWarps); - file->WriteLE(player.pDungMsgs); - file->WriteLE(player.pLvlLoad); + file.WriteLE(cell); + for (const Item &item : player.SpdList) + SaveItem(file, item); + SaveItem(file, player.HoldItem); + + file.WriteLE(player._pIMinDam); + file.WriteLE(player._pIMaxDam); + file.WriteLE(player._pIAC); + file.WriteLE(player._pIBonusDam); + file.WriteLE(player._pIBonusToHit); + file.WriteLE(player._pIBonusAC); + file.WriteLE(player._pIBonusDamMod); + file.Skip(4); // Alignment + + file.WriteLE(player._pISpells); + file.WriteLE(player._pIFlags); + file.WriteLE(player._pIGetHit); + + file.WriteLE(player._pISplLvlAdd); + file.Skip(); // Skip _pISplCost + file.Skip(2); // Alignment + file.WriteLE(player._pISplDur); + file.WriteLE(player._pIEnAc); + file.WriteLE(player._pIFMinDam); + file.WriteLE(player._pIFMaxDam); + file.WriteLE(player._pILMinDam); + file.WriteLE(player._pILMaxDam); + file.WriteLE(player._pOilType); + file.WriteLE(player.pTownWarps); + file.WriteLE(player.pDungMsgs); + file.WriteLE(player.pLvlLoad); if (gbIsHellfire) - file->WriteLE(player.pDungMsgs2); + file.WriteLE(player.pDungMsgs2); else - file->WriteLE(player.pBattleNet ? 1 : 0); - file->WriteLE(player.pManaShield ? 1 : 0); - file->WriteLE(player.pOriginalCathedral ? 1 : 0); - file->Skip(2); // Available bytes - file->WriteLE(player.wReflections); - file->Skip(14); // Available bytes - - file->WriteLE(player.pDiabloKillLevel); - file->WriteLE(player.pDifficulty); - file->WriteLE(player.pDamAcFlags); - file->Skip(20); // Available bytes + file.WriteLE(player.pBattleNet ? 1 : 0); + file.WriteLE(player.pManaShield ? 1 : 0); + file.WriteLE(player.pOriginalCathedral ? 1 : 0); + file.Skip(2); // Available bytes + file.WriteLE(player.wReflections); + file.Skip(14); // Available bytes + + file.WriteLE(player.pDiabloKillLevel); + file.WriteLE(player.pDifficulty); + file.WriteLE(player.pDamAcFlags); + file.Skip(20); // Available bytes // Omit pointer _pNData // Omit pointer _pWData @@ -1359,11 +1355,6 @@ void SaveObject(SaveHelper &file, const Object &object) file.WriteLE(object._oVar8); } -void SavePremium(SaveHelper *file, int i) -{ - SaveItem(file, &premiumitems[i]); -} - void SaveQuest(SaveHelper *file, int i) { auto &quest = Quests[i]; @@ -1851,9 +1842,12 @@ void SaveHeroItems(Player &player) file.WriteLE(gbIsHellfire ? 1 : 0); - SaveItems(&file, player.InvBody, NUM_INVLOC); - SaveItems(&file, player.InvList, NUM_INV_GRID_ELEM); - SaveItems(&file, player.SpdList, MAXBELTITEMS); + for (const Item &item : player.InvBody) + SaveItem(file, item); + for (const Item &item : player.InvList) + SaveItem(file, item); + for (const Item &item : player.SpdList) + SaveItem(file, item); } // 256 kilobytes + 3 bytes (demo leftover) for file magic (262147) @@ -1905,7 +1899,7 @@ void SaveGameData() auto &myPlayer = Players[MyPlayerId]; myPlayer.pDifficulty = sgGameInitInfo.nDifficulty; - SavePlayer(&file, myPlayer); + SavePlayer(file, myPlayer); for (int i = 0; i < giNumberQuests; i++) SaveQuest(&file, i); @@ -1951,7 +1945,7 @@ void SaveGameData() for (int itemId : AvailableItems) file.WriteLE(itemId); for (int i = 0; i < ActiveItemCount; i++) - SaveItem(&file, &Items[ActiveItems[i]]); + SaveItem(file, Items[ActiveItems[i]]); for (bool uniqueItemFlag : UniqueItemFlags) file.WriteLE(uniqueItemFlag ? 1 : 0); @@ -2007,7 +2001,7 @@ void SaveGameData() file.WriteBE(premiumlevel); for (int i = 0; i < giNumberOfSmithPremiumItems; i++) - SavePremium(&file, i); + SaveItem(file, premiumitems[i]); file.WriteLE(AutomapActive ? 1 : 0); file.WriteBE(AutoMapScale); @@ -2064,7 +2058,7 @@ void SaveLevel() file.WriteLE(itemId); for (int i = 0; i < ActiveItemCount; i++) - SaveItem(&file, &Items[ActiveItems[i]]); + SaveItem(file, Items[ActiveItems[i]]); for (int j = 0; j < MAXDUNY; j++) { for (int i = 0; i < MAXDUNX; i++) // NOLINT(modernize-loop-convert)