summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvil Eye <malusluminis@hotmail.com>2024-02-24 14:03:24 +0100
committerEvil Eye <malusluminis@hotmail.com>2024-02-24 14:03:24 +0100
commitec1c6ee1715be1aceb8498d2f7cc881b0472e19d (patch)
treead7e29c245f2c8fcce708f40eeaa3d63cd57d2a8
parent595e42ae43944bed3fd2ee91d35345cc0f40f923 (diff)
Use ESM::decompose to handle ENAMstruct
-rw-r--r--apps/openmw_test_suite/esm3/testsaveload.cpp29
-rw-r--r--components/esm3/aipackage.cpp12
-rw-r--r--components/esm3/effectlist.cpp13
-rw-r--r--components/esm3/effectlist.hpp4
-rw-r--r--components/esm3/esmreader.hpp11
-rw-r--r--components/esm3/loadcrea.cpp3
-rw-r--r--components/esm3/loadnpc.cpp3
7 files changed, 56 insertions, 19 deletions
diff --git a/apps/openmw_test_suite/esm3/testsaveload.cpp b/apps/openmw_test_suite/esm3/testsaveload.cpp
index eda1fa963e..8c7896b08a 100644
--- a/apps/openmw_test_suite/esm3/testsaveload.cpp
+++ b/apps/openmw_test_suite/esm3/testsaveload.cpp
@@ -1,6 +1,7 @@
#include <components/esm/fourcc.hpp>
#include <components/esm3/aipackage.hpp>
#include <components/esm3/aisequence.hpp>
+#include <components/esm3/effectlist.hpp>
#include <components/esm3/esmreader.hpp>
#include <components/esm3/esmwriter.hpp>
#include <components/esm3/loadcont.hpp>
@@ -525,6 +526,34 @@ namespace ESM
EXPECT_EQ(result.mServices, record.mServices);
}
+ TEST_P(Esm3SaveLoadRecordTest, enamShouldNotChange)
+ {
+ EffectList record;
+ record.mList.emplace_back(ENAMstruct{
+ .mEffectID = 1,
+ .mSkill = 2,
+ .mAttribute = 3,
+ .mRange = 4,
+ .mArea = 5,
+ .mDuration = 6,
+ .mMagnMin = 7,
+ .mMagnMax = 8,
+ });
+
+ EffectList result;
+ saveAndLoadRecord(record, GetParam(), result);
+
+ EXPECT_EQ(result.mList.size(), record.mList.size());
+ EXPECT_EQ(result.mList[0].mEffectID, record.mList[0].mEffectID);
+ EXPECT_EQ(result.mList[0].mSkill, record.mList[0].mSkill);
+ EXPECT_EQ(result.mList[0].mAttribute, record.mList[0].mAttribute);
+ EXPECT_EQ(result.mList[0].mRange, record.mList[0].mRange);
+ EXPECT_EQ(result.mList[0].mArea, record.mList[0].mArea);
+ EXPECT_EQ(result.mList[0].mDuration, record.mList[0].mDuration);
+ EXPECT_EQ(result.mList[0].mMagnMin, record.mList[0].mMagnMin);
+ EXPECT_EQ(result.mList[0].mMagnMax, record.mList[0].mMagnMax);
+ }
+
INSTANTIATE_TEST_SUITE_P(FormatVersions, Esm3SaveLoadRecordTest, ValuesIn(getFormats()));
}
}
diff --git a/components/esm3/aipackage.cpp b/components/esm3/aipackage.cpp
index 2cadb9fb22..33b8a0bca2 100644
--- a/components/esm3/aipackage.cpp
+++ b/components/esm3/aipackage.cpp
@@ -54,29 +54,25 @@ namespace ESM
else if (esm.retSubName() == AI_Wander)
{
pack.mType = AI_Wander;
- esm.getSubHeader();
- esm.getComposite(pack.mWander);
+ esm.getSubComposite(pack.mWander);
mList.push_back(pack);
}
else if (esm.retSubName() == AI_Travel)
{
pack.mType = AI_Travel;
- esm.getSubHeader();
- esm.getComposite(pack.mTravel);
+ esm.getSubComposite(pack.mTravel);
mList.push_back(pack);
}
else if (esm.retSubName() == AI_Escort || esm.retSubName() == AI_Follow)
{
pack.mType = (esm.retSubName() == AI_Escort) ? AI_Escort : AI_Follow;
- esm.getSubHeader();
- esm.getComposite(pack.mTarget);
+ esm.getSubComposite(pack.mTarget);
mList.push_back(pack);
}
else if (esm.retSubName() == AI_Activate)
{
pack.mType = AI_Activate;
- esm.getSubHeader();
- esm.getComposite(pack.mActivate);
+ esm.getSubComposite(pack.mActivate);
mList.push_back(pack);
}
}
diff --git a/components/esm3/effectlist.cpp b/components/esm3/effectlist.cpp
index 701552b312..4f21f47fa2 100644
--- a/components/esm3/effectlist.cpp
+++ b/components/esm3/effectlist.cpp
@@ -3,8 +3,15 @@
#include "esmreader.hpp"
#include "esmwriter.hpp"
+#include <components/misc/concepts.hpp>
+
namespace ESM
{
+ template <Misc::SameAsWithoutCvref<ENAMstruct> T>
+ void decompose(T&& v, const auto& f)
+ {
+ f(v.mEffectID, v.mSkill, v.mAttribute, v.mRange, v.mArea, v.mDuration, v.mMagnMin, v.mMagnMax);
+ }
void EffectList::load(ESMReader& esm)
{
@@ -18,15 +25,15 @@ namespace ESM
void EffectList::add(ESMReader& esm)
{
ENAMstruct s;
- esm.getHT(s.mEffectID, s.mSkill, s.mAttribute, s.mRange, s.mArea, s.mDuration, s.mMagnMin, s.mMagnMax);
+ esm.getSubComposite(s);
mList.push_back(s);
}
void EffectList::save(ESMWriter& esm) const
{
- for (std::vector<ENAMstruct>::const_iterator it = mList.begin(); it != mList.end(); ++it)
+ for (const ENAMstruct& enam : mList)
{
- esm.writeHNT<ENAMstruct>("ENAM", *it, 24);
+ esm.writeNamedComposite("ENAM", enam);
}
}
diff --git a/components/esm3/effectlist.hpp b/components/esm3/effectlist.hpp
index 8f2cb959d6..de13797496 100644
--- a/components/esm3/effectlist.hpp
+++ b/components/esm3/effectlist.hpp
@@ -9,9 +9,6 @@ namespace ESM
class ESMReader;
class ESMWriter;
-#pragma pack(push)
-#pragma pack(1)
-
/** Defines a spell effect. Shared between SPEL (Spells), ALCH
(Potions) and ENCH (Item enchantments) records
*/
@@ -28,7 +25,6 @@ namespace ESM
int32_t mRange; // 0 - self, 1 - touch, 2 - target (RangeType enum)
int32_t mArea, mDuration, mMagnMin, mMagnMax;
};
-#pragma pack(pop)
/// EffectList, ENAM subrecord
struct EffectList
diff --git a/components/esm3/esmreader.hpp b/components/esm3/esmreader.hpp
index 276adf749c..ca9f191a5d 100644
--- a/components/esm3/esmreader.hpp
+++ b/components/esm3/esmreader.hpp
@@ -189,6 +189,17 @@ namespace ESM
decompose(value, [&](auto&... args) { (getT(args), ...); });
}
+ void getSubComposite(auto& value)
+ {
+ decompose(value, [&](auto&... args) {
+ constexpr size_t size = (0 + ... + sizeof(decltype(args)));
+ getSubHeader();
+ if (mCtx.leftSub != size)
+ reportSubSizeMismatch(size, mCtx.leftSub);
+ (getT(args), ...);
+ });
+ }
+
template <typename T, typename = std::enable_if_t<IsReadable<T>>>
void skipHT()
{
diff --git a/components/esm3/loadcrea.cpp b/components/esm3/loadcrea.cpp
index 1db79e8e76..5a0d8048bc 100644
--- a/components/esm3/loadcrea.cpp
+++ b/components/esm3/loadcrea.cpp
@@ -69,8 +69,7 @@ namespace ESM
mSpells.add(esm);
break;
case fourCC("AIDT"):
- esm.getSubHeader();
- esm.getComposite(mAiData);
+ esm.getSubComposite(mAiData);
break;
case fourCC("DODT"):
case fourCC("DNAM"):
diff --git a/components/esm3/loadnpc.cpp b/components/esm3/loadnpc.cpp
index 92b16638c2..58a8bfa55e 100644
--- a/components/esm3/loadnpc.cpp
+++ b/components/esm3/loadnpc.cpp
@@ -102,8 +102,7 @@ namespace ESM
mInventory.add(esm);
break;
case fourCC("AIDT"):
- esm.getSubHeader();
- esm.getComposite(mAiData);
+ esm.getSubComposite(mAiData);
break;
case fourCC("DODT"):
case fourCC("DNAM"):