diff --git a/Source/loadsave.cpp b/Source/loadsave.cpp index 37e4f5009..cb5253683 100644 --- a/Source/loadsave.cpp +++ b/Source/loadsave.cpp @@ -70,7 +70,7 @@ T SwapBE(T in) class LoadHelper { std::unique_ptr m_buffer_; - uint32_t m_cur_ = 0; + size_t m_cur_ = 0; size_t m_size_; template @@ -93,13 +93,19 @@ public: m_buffer_ = pfile_read(szFileName, &m_size_); } - bool IsValid(uint32_t size = 1) + bool IsValid(size_t size = 1) { return m_buffer_ != nullptr && m_size_ >= (m_cur_ + size); } - void Skip(uint32_t size) + template + constexpr void Skip() + { + Skip(sizeof(T)); + } + + void Skip(size_t size) { m_cur_ += size; } @@ -139,8 +145,8 @@ public: class SaveHelper { const char *m_szFileName_; std::unique_ptr m_buffer_; - uint32_t m_cur_ = 0; - uint32_t m_capacity_; + size_t m_cur_ = 0; + size_t m_capacity_; public: SaveHelper(const char *szFileName, size_t bufferLen) @@ -150,13 +156,19 @@ public: { } - bool IsValid(uint32_t len = 1) + bool IsValid(size_t len = 1) { return m_buffer_ != nullptr && m_capacity_ >= (m_cur_ + len); } - void Skip(uint32_t len) + template + constexpr void Skip() + { + Skip(sizeof(T)); + } + + void Skip(size_t len) { std::memset(&m_buffer_[m_cur_], 0, len); m_cur_ += len; @@ -360,13 +372,13 @@ static void LoadPlayer(LoadHelper *file, int p) player._pSplFrom = file->NextLE(); file->Skip(2); // Alignment player._pTSpell = static_cast(file->NextLE()); - file->Skip(sizeof(int8_t)); // Skip _pTSplType + 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(sizeof(int8_t)); // Skip _pSBkSplType + file->Skip(); // Skip _pSBkSplType for (int8_t &spellLevel : player._pSplLvl) spellLevel = file->NextLE(); file->Skip(7); // Alignment @@ -1298,7 +1310,7 @@ static void SaveItem(SaveHelper *file, ItemStruct *pItem) file->WriteLE(ItemAnimWidth); // write _iAnimWidth2 for vanilla compatibility file->WriteLE(CalculateWidth2(ItemAnimWidth)); - file->Skip(4); // Unused since 1.02 + file->Skip(); // _delFlag, unused since 1.02 file->WriteLE(pItem->_iSelFlag); file->Skip(3); // Alignment file->WriteLE(pItem->_iPostDraw ? 1 : 0); @@ -1417,7 +1429,7 @@ static void SavePlayer(SaveHelper *file, int p) file->WriteLE(animWidth); // write _pAnimWidth2 for vanilla compatibility file->WriteLE(CalculateWidth2(animWidth)); - file->Skip(4); // Skip _peflag + file->Skip(); // Skip _peflag file->WriteLE(player._plid); file->WriteLE(player._pvid); @@ -1426,13 +1438,13 @@ static void SavePlayer(SaveHelper *file, int p) file->WriteLE(player._pSplFrom); file->Skip(2); // Alignment file->WriteLE(player._pTSpell); - file->Skip(sizeof(int8_t)); // Skip _pTSplType - file->Skip(3); // Alignment + 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(sizeof(int8_t)); // Skip _pSBkSplType + file->Skip(); // Skip _pSBkSplType for (int8_t spellLevel : player._pSplLvl) file->WriteLE(spellLevel); file->Skip(7); // Alignment @@ -1471,12 +1483,12 @@ static void SavePlayer(SaveHelper *file, int p) file->WriteLE(player._pMaxHPBase); file->WriteLE(player._pHitPoints); file->WriteLE(player._pMaxHP); - file->Skip(sizeof(int32_t)); // Skip _pHPPer + file->Skip(); // Skip _pHPPer file->WriteLE(player._pManaBase); file->WriteLE(player._pMaxManaBase); file->WriteLE(player._pMana); file->WriteLE(player._pMaxMana); - file->Skip(sizeof(int32_t)); // Skip _pManaPer + file->Skip(); // Skip _pManaPer file->WriteLE(player._pLevel); file->WriteLE(player._pMaxLvl); file->Skip(2); // Alignment @@ -1497,8 +1509,7 @@ static void SavePlayer(SaveHelper *file, int p) file->WriteLE(player._pVar5); file->WriteLE(player.position.offset2.deltaX); file->WriteLE(player.position.offset2.deltaY); - // Write actionFrame for vanilla compatibility - file->WriteLE(0); + file->Skip(); // Skip _pVar8 for (uint8_t i = 0; i < giNumberOfLevels; i++) file->WriteLE(player._pLvlVisited[i] ? 1 : 0); for (uint8_t i = 0; i < giNumberOfLevels; i++) @@ -1506,8 +1517,7 @@ static void SavePlayer(SaveHelper *file, int p) file->Skip(2); // Alignment - // Write _pGFXLoad for vanilla compatibility - file->WriteLE(0); + file->Skip(); // Skip _pGFXLoad file->Skip(4 * 8); // Skip pointers _pNAnim file->WriteLE(player._pNFrames); file->Skip(4); // Skip _pNWidth @@ -1556,7 +1566,7 @@ static void SavePlayer(SaveHelper *file, int p) file->WriteLE(player._pIGetHit); file->WriteLE(player._pISplLvlAdd); - file->Skip(1); // Unused + file->Skip(); // Skip _pISplCost file->Skip(2); // Alignment file->WriteLE(player._pISplDur); file->WriteLE(player._pIEnAc); @@ -1630,7 +1640,7 @@ static void SaveMonster(SaveHelper *file, int i) file->WriteLE(pMonster->AnimInfo.TickCounterOfCurrentFrame); file->WriteLE(pMonster->AnimInfo.NumberOfFrames); file->WriteLE(pMonster->AnimInfo.CurrentFrame); - file->Skip(4); // Skip _meflag + file->Skip(); // Skip _meflag file->WriteLE(pMonster->_mDelFlag ? 1 : 0); file->WriteLE(pMonster->_mVar1); file->WriteLE(pMonster->_mVar2); @@ -1639,8 +1649,7 @@ static void SaveMonster(SaveHelper *file, int i) file->WriteLE(pMonster->position.temp.y); file->WriteLE(pMonster->position.offset2.deltaX); file->WriteLE(pMonster->position.offset2.deltaY); - // Write actionFrame for vanilla compatibility - file->WriteLE(0); + file->Skip(); // Skip _mVar8 file->WriteLE(pMonster->_mmaxhp); file->WriteLE(pMonster->_mhitpoints); @@ -1666,10 +1675,10 @@ static void SaveMonster(SaveHelper *file, int i) file->Skip(1); // Alignment file->WriteLE(pMonster->mExp); - file->WriteLE(pMonster->mHit < UINT8_MAX ? pMonster->mHit : UINT8_MAX); // For backwards compatibility + file->WriteLE(std::min(pMonster->mHit, std::numeric_limits::max())); // For backwards compatibility file->WriteLE(pMonster->mMinDamage); file->WriteLE(pMonster->mMaxDamage); - file->WriteLE(pMonster->mHit2 < UINT8_MAX ? pMonster->mHit2 : UINT8_MAX); // For backwards compatibility + file->WriteLE(std::min(pMonster->mHit2, std::numeric_limits::max())); // For backwards compatibility file->WriteLE(pMonster->mMinDamage2); file->WriteLE(pMonster->mMaxDamage2); file->WriteLE(pMonster->mArmorClass); @@ -1754,8 +1763,7 @@ static void SaveObject(SaveHelper *file, int i) file->WriteLE(pObject->_oAnimLen); file->WriteLE(pObject->_oAnimFrame); file->WriteLE(pObject->_oAnimWidth); - file->WriteLE(CalculateWidth2(pObject->_oAnimWidth)); - // Write _oAnimWidth2 for vanilla compatibility + file->WriteLE(CalculateWidth2(pObject->_oAnimWidth)); // Write _oAnimWidth2 for vanilla compatibility file->WriteLE(pObject->_oDelFlag ? 1 : 0); file->WriteLE(pObject->_oBreak); file->Skip(3); // Alignment