diff --git a/apps/esmtool/tes4.cpp b/apps/esmtool/tes4.cpp index ecc80eded6..904040428d 100644 --- a/apps/esmtool/tes4.cpp +++ b/apps/esmtool/tes4.cpp @@ -116,13 +116,18 @@ namespace EsmTool std::cout << "\n Record: " << ESM::NAME(reader.hdr().record.typeId).toStringView(); if constexpr (ESM4::hasFormId) - std::cout << "\n FormId: " << value.mFormId; + std::cout << "\n FormId: 0x" << ESM4::formIdToString(value.mFormId); if constexpr (ESM::hasId) - std::cout << "\n Id: " << value.mId; + { + if constexpr (std::is_same_v) + std::cout << "\n FormId: 0x" << ESM4::formIdToString(value.mId); + else + std::cout << "\n Id: " << value.mId; + } if constexpr (ESM4::hasFlags) std::cout << "\n Record flags: " << recordFlags(value.mFlags); if constexpr (ESM4::hasParentFormId) - std::cout << "\n ParentFormId: " << value.mParentFormId; + std::cout << "\n ParentFormId: 0x" << ESM4::formIdToString(value.mParentFormId); if constexpr (ESM4::hasParent) std::cout << "\n Parent: " << value.mParent; if constexpr (ESM4::hasEditorId) diff --git a/components/esm4/loadachr.cpp b/components/esm4/loadachr.cpp index d947b7c4d8..5c7e57a618 100644 --- a/components/esm4/loadachr.cpp +++ b/components/esm4/loadachr.cpp @@ -60,7 +60,7 @@ void ESM4::ActorCharacter::load(ESM4::Reader& reader) reader.get(mScale); break; case ESM4::SUB_XOWN: - reader.get(mOwner); + reader.getFormId(mOwner); break; case ESM4::SUB_XESP: { diff --git a/components/esm4/loadacre.cpp b/components/esm4/loadacre.cpp index e152376757..1f8a369e8d 100644 --- a/components/esm4/loadacre.cpp +++ b/components/esm4/loadacre.cpp @@ -65,8 +65,8 @@ void ESM4::ActorCreature::load(ESM4::Reader& reader) reader.getFormId(mOwner); break; case ESM4::SUB_XGLB: - reader.get(mGlobal); - break; // FIXME: formId? + reader.getFormId(mGlobal); + break; case ESM4::SUB_XRNK: reader.get(mFactionRank); break; diff --git a/components/esm4/loadcrea.cpp b/components/esm4/loadcrea.cpp index 86bf3d2f78..953b1e9a6c 100644 --- a/components/esm4/loadcrea.cpp +++ b/components/esm4/loadcrea.cpp @@ -177,12 +177,12 @@ void ESM4::Creature::load(ESM4::Reader& reader) break; } case ESM4::SUB_TPLT: - reader.get(mBaseTemplate); + reader.getFormId(mBaseTemplate); break; // FO3 case ESM4::SUB_PNAM: // FO3/FONV/TES5 { FormId bodyPart; - reader.get(bodyPart); + reader.getFormId(bodyPart); mBodyParts.push_back(bodyPart); break; diff --git a/components/esm4/loadgmst.cpp b/components/esm4/loadgmst.cpp index e2e4694922..7b0d940636 100644 --- a/components/esm4/loadgmst.cpp +++ b/components/esm4/loadgmst.cpp @@ -15,6 +15,12 @@ namespace ESM4 const char type = editorId[0]; switch (type) { + case 'b': + { + std::uint32_t value = 0; + reader.get(value); + return value != 0; + } case 'i': { std::int32_t value = 0; diff --git a/components/esm4/loadgmst.hpp b/components/esm4/loadgmst.hpp index 62a5071eb3..552e8e6395 100644 --- a/components/esm4/loadgmst.hpp +++ b/components/esm4/loadgmst.hpp @@ -13,7 +13,7 @@ namespace ESM4 struct GameSetting { - using Data = std::variant; + using Data = std::variant; FormId mFormId; // from the header std::uint32_t mFlags; // from the header, see enum type RecordFlag for details diff --git a/components/esm4/loadidle.cpp b/components/esm4/loadidle.cpp index 1b12b220d0..fe167a62e2 100644 --- a/components/esm4/loadidle.cpp +++ b/components/esm4/loadidle.cpp @@ -53,8 +53,8 @@ void ESM4::IdleAnimation::load(ESM4::Reader& reader) break; case ESM4::SUB_ANAM: { - reader.get(mParent); - reader.get(mPrevious); + reader.getFormId(mParent); + reader.getFormId(mPrevious); break; } case ESM4::SUB_CTDA: // formId @@ -64,8 +64,15 @@ void ESM4::IdleAnimation::load(ESM4::Reader& reader) reader.skipSubRecordData(); break; } + case ESM4::SUB_MODL: + reader.getZString(mModel); + break; + case ESM4::SUB_MODB: + reader.get(mBoundRadius); + break; default: - throw std::runtime_error("ESM4::IDLE::load - Unknown subrecord " + ESM::printName(subHdr.typeId)); + throw std::runtime_error("ESM4::IDLE::load - Unknown subrecord " + std::to_string(subHdr.typeId) + " " + + ESM::printName(subHdr.typeId)); } } } diff --git a/components/esm4/loadidle.hpp b/components/esm4/loadidle.hpp index a3cfd414a0..7ca0528ee9 100644 --- a/components/esm4/loadidle.hpp +++ b/components/esm4/loadidle.hpp @@ -45,10 +45,13 @@ namespace ESM4 std::string mEditorId; std::string mCollision; std::string mEvent; + std::string mModel; FormId mParent; // IDLE or AACT FormId mPrevious; + float mBoundRadius; + void load(ESM4::Reader& reader); // void save(ESM4::Writer& writer) const; diff --git a/components/esm4/loadidlm.cpp b/components/esm4/loadidlm.cpp index 571c9c8a85..d76776329d 100644 --- a/components/esm4/loadidlm.cpp +++ b/components/esm4/loadidlm.cpp @@ -75,8 +75,8 @@ void ESM4::IdleMarker::load(ESM4::Reader& reader) } mIdleAnim.resize(mIdleCount); - for (unsigned int i = 0; i < static_cast(mIdleCount); ++i) - reader.get(mIdleAnim.at(i)); + for (FormId& value : mIdleAnim) + reader.getFormId(value); break; } case ESM4::SUB_OBND: // object bounds diff --git a/components/esm4/loadmstt.cpp b/components/esm4/loadmstt.cpp index 73782f70d8..110c1cc718 100644 --- a/components/esm4/loadmstt.cpp +++ b/components/esm4/loadmstt.cpp @@ -53,7 +53,7 @@ void ESM4::MovableStatic::load(ESM4::Reader& reader) reader.get(mData); break; case ESM4::SUB_SNAM: - reader.get(mLoopingSound); + reader.getFormId(mLoopingSound); break; case ESM4::SUB_DEST: // destruction data case ESM4::SUB_OBND: // object bounds diff --git a/components/esm4/loadnavi.cpp b/components/esm4/loadnavi.cpp index 3a0d630abe..95e6a730c8 100644 --- a/components/esm4/loadnavi.cpp +++ b/components/esm4/loadnavi.cpp @@ -80,7 +80,7 @@ void ESM4::Navigation::NavMeshInfo::load(ESM4::Reader& reader) { std::uint32_t count; - reader.get(formId); + reader.getFormId(formId); reader.get(flags); reader.get(x); reader.get(y); @@ -107,10 +107,8 @@ void ESM4::Navigation::NavMeshInfo::load(ESM4::Reader& reader) { // std::cout << "NVMI countMerged " << std::dec << count << std::endl; formIdMerged.resize(count); - for (std::vector::iterator it = formIdMerged.begin(); it != formIdMerged.end(); ++it) - { - reader.get(*it); - } + for (FormId& value : formIdMerged) + reader.getFormId(value); } reader.get(count); // countPrefMerged; @@ -118,10 +116,8 @@ void ESM4::Navigation::NavMeshInfo::load(ESM4::Reader& reader) { // std::cout << "NVMI countPrefMerged " << std::dec << count << std::endl; formIdPrefMerged.resize(count); - for (std::vector::iterator it = formIdPrefMerged.begin(); it != formIdPrefMerged.end(); ++it) - { - reader.get(*it); - } + for (FormId& value : formIdPrefMerged) + reader.getFormId(value); } reader.get(count); // countLinkedDoors; @@ -148,7 +144,7 @@ void ESM4::Navigation::NavMeshInfo::load(ESM4::Reader& reader) reader.get(locationMarker); - reader.get(worldSpaceId); + reader.getFormId(worldSpaceId); // FLG_Tamriel = 0x0000003c, // grid info follows, possibly Tamriel? // FLG_Morrowind = 0x01380000, // grid info follows, probably Skywind if (worldSpaceId == FormId{ 0x3c, 0 } || worldSpaceId == FormId{ 0x380000, 1 }) @@ -170,7 +166,7 @@ void ESM4::Navigation::NavMeshInfo::load(ESM4::Reader& reader) else { FormId cellId; - reader.get(cellId); + reader.getFormId(cellId); cellGrid = cellId; #if 0 @@ -279,14 +275,11 @@ void ESM4::Navigation::load(ESM4::Reader& reader) reader.get(node); reader.get(count); } - if (count) + if (count > 0) { preferredPaths.resize(count); - for (std::vector::iterator it = preferredPaths.begin(); it != preferredPaths.end(); - ++it) - { - reader.get(*it); - } + for (FormId& value : preferredPaths) + reader.getFormId(value); } mPreferredPaths.push_back(std::make_pair(node, preferredPaths)); #if 0 diff --git a/components/esm4/loadnavm.cpp b/components/esm4/loadnavm.cpp index 0c9b0f5dc6..2cbd45a588 100644 --- a/components/esm4/loadnavm.cpp +++ b/components/esm4/loadnavm.cpp @@ -44,7 +44,7 @@ void ESM4::NavMesh::NVNMstruct::load(ESM4::Reader& reader) reader.get(unknownNVER); reader.get(unknownLCTN); - reader.get(worldSpaceId); + reader.getFormId(worldSpaceId); // FLG_Tamriel = 0x0000003c, // grid info follows, possibly Tamriel? // FLG_Morrowind = 0x01380000, // grid info follows, probably Skywind if (worldSpaceId == FormId{ 0x3c, 0 } || worldSpaceId == FormId{ 380000, 1 }) @@ -82,7 +82,7 @@ void ESM4::NavMesh::NVNMstruct::load(ESM4::Reader& reader) else { FormId cellId; - reader.get(cellId); + reader.getFormId(cellId); cellGrid = cellId; #if 0 diff --git a/components/esm4/loadnpc.cpp b/components/esm4/loadnpc.cpp index c6428177c9..5ad8bf320a 100644 --- a/components/esm4/loadnpc.cpp +++ b/components/esm4/loadnpc.cpp @@ -161,7 +161,7 @@ void ESM4::Npc::load(ESM4::Reader& reader) case ESM4::SUB_WNAM: { if (reader.esmVersion() == ESM::VER_094 || reader.esmVersion() == ESM::VER_170) - reader.get(mWornArmor); + reader.getFormId(mWornArmor); else reader.get(mFootWeight); break; @@ -192,7 +192,7 @@ void ESM4::Npc::load(ESM4::Reader& reader) break; } case ESM4::SUB_TPLT: - reader.get(mBaseTemplate); + reader.getFormId(mBaseTemplate); break; case ESM4::SUB_FGGS: { diff --git a/components/esm4/reader.hpp b/components/esm4/reader.hpp index c24319be0d..86a52115e4 100644 --- a/components/esm4/reader.hpp +++ b/components/esm4/reader.hpp @@ -226,6 +226,9 @@ namespace ESM4 mStream->read((char*)&t, sizeof(T)); } + // Use getFormId instead + void get(FormId& value) = delete; + template bool getExact(T& t) {