diff --git a/components/esm3/aisequence.cpp b/components/esm3/aisequence.cpp index 1c1d3bf6ce..668b36c871 100644 --- a/components/esm3/aisequence.cpp +++ b/components/esm3/aisequence.cpp @@ -13,13 +13,13 @@ namespace ESM void AiWander::load(ESMReader& esm) { - esm.getHNTSized<14>(mData, "DATA"); - esm.getHNTSized<8>(mDurationData, "STAR"); // was mStartTime + esm.getHNT("DATA", mData.mDistance, mData.mDuration, mData.mTimeOfDay, mData.mIdle, mData.mShouldRepeat); + esm.getHNT("STAR", mDurationData.mRemainingDuration, mDurationData.unused); // was mStartTime mStoredInitialActorPosition = false; if (esm.isNextSub("POS_")) { mStoredInitialActorPosition = true; - esm.getHTSized<12>(mInitialActorPosition); + esm.getHT(mInitialActorPosition.mValues); } } @@ -33,7 +33,7 @@ namespace ESM void AiTravel::load(ESMReader& esm) { - esm.getHNTSized<12>(mData, "DATA"); + esm.getHNT("DATA", mData.mX, mData.mY, mData.mZ); esm.getHNOT(mHidden, "HIDD"); mRepeat = false; esm.getHNOT(mRepeat, "REPT"); @@ -49,7 +49,7 @@ namespace ESM void AiEscort::load(ESMReader& esm) { - esm.getHNTSized<14>(mData, "DATA"); + esm.getHNT("DATA", mData.mX, mData.mY, mData.mZ, mData.mDuration); mTargetId = esm.getHNRefId("TARG"); mTargetActorId = -1; esm.getHNOT(mTargetActorId, "TAID"); @@ -81,7 +81,7 @@ namespace ESM void AiFollow::load(ESMReader& esm) { - esm.getHNTSized<14>(mData, "DATA"); + esm.getHNT("DATA", mData.mX, mData.mY, mData.mZ, mData.mDuration); mTargetId = esm.getHNRefId("TARG"); mTargetActorId = -1; esm.getHNOT(mTargetActorId, "TAID"); diff --git a/components/esm3/aisequence.hpp b/components/esm3/aisequence.hpp index 1e27a0afdd..107fdf3bdb 100644 --- a/components/esm3/aisequence.hpp +++ b/components/esm3/aisequence.hpp @@ -1,6 +1,7 @@ #ifndef OPENMW_COMPONENTS_ESM_AISEQUENCE_H #define OPENMW_COMPONENTS_ESM_AISEQUENCE_H +#include #include #include #include @@ -38,8 +39,8 @@ namespace ESM #pragma pack(push, 1) struct AiWanderData { - short mDistance; - short mDuration; + int16_t mDistance; + int16_t mDuration; unsigned char mTimeOfDay; unsigned char mIdle[8]; unsigned char mShouldRepeat; @@ -47,7 +48,7 @@ namespace ESM struct AiWanderDuration { float mRemainingDuration; - int unused; + int32_t unused; }; struct AiTravelData { @@ -56,7 +57,7 @@ namespace ESM struct AiEscortData { float mX, mY, mZ; - short mDuration; + int16_t mDuration; }; #pragma pack(pop) @@ -89,7 +90,7 @@ namespace ESM { AiEscortData mData; - int mTargetActorId; + int32_t mTargetActorId; ESM::RefId mTargetId; std::string mCellId; float mRemainingDuration; @@ -103,7 +104,7 @@ namespace ESM { AiEscortData mData; - int mTargetActorId; + int32_t mTargetActorId; ESM::RefId mTargetId; std::string mCellId; float mRemainingDuration; @@ -129,7 +130,7 @@ namespace ESM struct AiCombat : AiPackage { - int mTargetActorId; + int32_t mTargetActorId; void load(ESMReader& esm); void save(ESMWriter& esm) const; @@ -137,7 +138,7 @@ namespace ESM struct AiPursue : AiPackage { - int mTargetActorId; + int32_t mTargetActorId; void load(ESMReader& esm); void save(ESMWriter& esm) const; @@ -145,7 +146,7 @@ namespace ESM struct AiPackageContainer { - int mType; + int32_t mType; std::unique_ptr mPackage; }; @@ -155,7 +156,7 @@ namespace ESM AiSequence() { mLastAiPackage = -1; } std::vector mPackages; - int mLastAiPackage; + int32_t mLastAiPackage; void load(ESMReader& esm); void save(ESMWriter& esm) const; diff --git a/components/esm3/cellid.cpp b/components/esm3/cellid.cpp index 1c9382f546..3df1336c6c 100644 --- a/components/esm3/cellid.cpp +++ b/components/esm3/cellid.cpp @@ -13,7 +13,7 @@ namespace ESM if (esm.isNextSub("CIDX")) { - esm.getHTSized<8>(mIndex); + esm.getHT(mIndex.mX, mIndex.mY); mPaged = true; } else diff --git a/components/esm3/cellid.hpp b/components/esm3/cellid.hpp index eeedc5f554..3efb49b58e 100644 --- a/components/esm3/cellid.hpp +++ b/components/esm3/cellid.hpp @@ -2,6 +2,7 @@ #define OPENMW_ESM_CELLID_H #include +#include #include namespace ESM @@ -13,8 +14,8 @@ namespace ESM { struct CellIndex { - int mX; - int mY; + int32_t mX; + int32_t mY; }; std::string mWorldspace; diff --git a/components/esm3/cellref.cpp b/components/esm3/cellref.cpp index 2944a17db4..c4c2fca986 100644 --- a/components/esm3/cellref.cpp +++ b/components/esm3/cellref.cpp @@ -112,7 +112,7 @@ namespace ESM case fourCC("DODT"): if constexpr (load) { - esm.getHTSized<24>(cellRef.mDoorDest); + esm.getHT(cellRef.mDoorDest.pos, cellRef.mDoorDest.rot); cellRef.mTeleport = true; } else @@ -132,7 +132,7 @@ namespace ESM break; case fourCC("DATA"): if constexpr (load) - esm.getHTSized<24>(cellRef.mPos); + esm.getHT(cellRef.mPos.pos, cellRef.mPos.rot); else esm.skipHTSized<24, decltype(cellRef.mPos)>(); break; diff --git a/components/esm3/cellref.hpp b/components/esm3/cellref.hpp index 53f40ffab7..10ab4505ce 100644 --- a/components/esm3/cellref.hpp +++ b/components/esm3/cellref.hpp @@ -1,6 +1,7 @@ #ifndef OPENMW_ESM_CELLREF_H #define OPENMW_ESM_CELLREF_H +#include #include #include "components/esm/defs.hpp" @@ -48,7 +49,7 @@ namespace ESM ESM::RefId mFaction; // PC faction rank required to use the item. Sometimes is -1, which means "any rank". - int mFactionRank; + int32_t mFactionRank; // For weapon or armor, this is the remaining item health. // For tools (lockpicks, probes, repair hammer) it is the remaining uses. @@ -56,7 +57,7 @@ namespace ESM // This could be -1 if the charge was not touched yet (i.e. full). union { - int mChargeInt; // Used by everything except lights + int32_t mChargeInt; // Used by everything except lights float mChargeFloat; // Used only by lights }; float mChargeIntRemainder; // Stores amount of charge not subtracted from mChargeInt @@ -65,7 +66,7 @@ namespace ESM float mEnchantmentCharge; // This is 5 for Gold_005 references, 100 for Gold_100 and so on. - int mGoldValue; + int32_t mGoldValue; // For doors - true if this door teleports to somewhere else, false // if it should open through animation. @@ -78,7 +79,7 @@ namespace ESM std::string mDestCell; // Lock level for doors and containers - int mLockLevel; + int32_t mLockLevel; bool mIsLocked{}; ESM::RefId mKey, mTrap; // Key and trap ID names, if any diff --git a/components/esm3/esmreader.hpp b/components/esm3/esmreader.hpp index 1a783d56bd..5ccd526dd4 100644 --- a/components/esm3/esmreader.hpp +++ b/components/esm3/esmreader.hpp @@ -172,10 +172,14 @@ namespace ESM } // Get data of a given type/size, including subrecord header - template >> - void getHT(X& x) + template + void getHT(Args&... args) { - getHTSized(x); + constexpr size_t size = (0 + ... + sizeof(Args)); + getSubHeader(); + if (mCtx.leftSub != size) + reportSubSizeMismatch(size, mCtx.leftSub); + (getT(args), ...); } template >>