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/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 >>