mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-01-15 22:49:48 +00:00
Use ESM::decompose to handle ENAMstruct
This commit is contained in:
parent
595e42ae43
commit
ec1c6ee171
@ -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()));
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
|
@ -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()
|
||||
{
|
||||
|
@ -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"):
|
||||
|
@ -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"):
|
||||
|
Loading…
Reference in New Issue
Block a user