From 61ea678a96ebd376c358bb0fc349c08f5260abb0 Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Sat, 16 Apr 2022 16:28:39 +0200 Subject: [PATCH 1/2] Implement ignored records --- CHANGELOG.md | 1 + apps/openmw/mwworld/esmloader.cpp | 3 ++- apps/openmw/mwworld/esmloader.hpp | 2 ++ apps/openmw/mwworld/esmstore.cpp | 9 ++++++--- apps/openmw/mwworld/esmstore.hpp | 2 +- components/esm/esmcommon.hpp | 3 +++ 6 files changed, 15 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 525cd5807b..30f02bed33 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -145,6 +145,7 @@ Feature #6592: Missing support for NiTriShape particle emitters Feature #6600: Support NiSortAdjustNode Feature #6684: Support NiFltAnimationNode + Feature #6699: Ignored flag Task #6201: Remove the "Note: No relevant classes found. No output generated" warnings Task #6264: Remove the old classes in animation.cpp Task #6553: Simplify interpreter instruction registration diff --git a/apps/openmw/mwworld/esmloader.cpp b/apps/openmw/mwworld/esmloader.cpp index 41a8dc478c..d9c7d1389f 100644 --- a/apps/openmw/mwworld/esmloader.cpp +++ b/apps/openmw/mwworld/esmloader.cpp @@ -11,6 +11,7 @@ EsmLoader::EsmLoader(MWWorld::ESMStore& store, std::vector& read : mEsm(readers) , mStore(store) , mEncoder(encoder) + , mDialogue(nullptr) // A content file containing INFO records without a DIAL record appends them to the previous file's dialogue { } @@ -22,7 +23,7 @@ void EsmLoader::load(const boost::filesystem::path& filepath, int& index, Loadin lEsm.open(filepath.string()); lEsm.resolveParentFileIndices(mEsm); mEsm[index] = std::move(lEsm); - mStore.load(mEsm[index], listener); + mStore.load(mEsm[index], listener, mDialogue); } } /* namespace MWWorld */ diff --git a/apps/openmw/mwworld/esmloader.hpp b/apps/openmw/mwworld/esmloader.hpp index db50d44146..4dfb48c2d1 100644 --- a/apps/openmw/mwworld/esmloader.hpp +++ b/apps/openmw/mwworld/esmloader.hpp @@ -13,6 +13,7 @@ namespace ToUTF8 namespace ESM { class ESMReader; + struct Dialogue; } namespace MWWorld @@ -31,6 +32,7 @@ struct EsmLoader : public ContentLoader std::vector& mEsm; MWWorld::ESMStore& mStore; ToUTF8::Utf8Encoder* mEncoder; + ESM::Dialogue* mDialogue; }; } /* namespace MWWorld */ diff --git a/apps/openmw/mwworld/esmstore.cpp b/apps/openmw/mwworld/esmstore.cpp index c670bead9c..bad5685a7f 100644 --- a/apps/openmw/mwworld/esmstore.cpp +++ b/apps/openmw/mwworld/esmstore.cpp @@ -143,12 +143,10 @@ static bool isCacheableRecord(int id) return false; } -void ESMStore::load(ESM::ESMReader &esm, Loading::Listener* listener) +void ESMStore::load(ESM::ESMReader &esm, Loading::Listener* listener, ESM::Dialogue*& dialogue) { listener->setProgressRange(1000); - ESM::Dialogue *dialogue = nullptr; - // Land texture loading needs to use a separate internal store for each plugin. // We set the number of plugins here so we can properly verify if valid plugin // indices are being passed to the LandTexture Store retrieval methods. @@ -159,6 +157,11 @@ void ESMStore::load(ESM::ESMReader &esm, Loading::Listener* listener) { ESM::NAME n = esm.getRecName(); esm.getRecHeader(); + if (esm.getRecordFlags() & ESM::FLAG_Ignored) + { + esm.skipRecord(); + continue; + } // Look up the record type. std::map::iterator it = mStores.find(n.toInt()); diff --git a/apps/openmw/mwworld/esmstore.hpp b/apps/openmw/mwworld/esmstore.hpp index 07f860e6de..8ad374350e 100644 --- a/apps/openmw/mwworld/esmstore.hpp +++ b/apps/openmw/mwworld/esmstore.hpp @@ -196,7 +196,7 @@ namespace MWWorld /// Validate entries in store after loading a save void validateDynamic(); - void load(ESM::ESMReader &esm, Loading::Listener* listener); + void load(ESM::ESMReader &esm, Loading::Listener* listener, ESM::Dialogue*& dialogue); template const Store &get() const { diff --git a/components/esm/esmcommon.hpp b/components/esm/esmcommon.hpp index 7ca059020f..2685371ec0 100644 --- a/components/esm/esmcommon.hpp +++ b/components/esm/esmcommon.hpp @@ -19,7 +19,10 @@ enum Version enum RecordFlag { + // This flag exists, but is not used to determine if a record has been deleted while loading + FLAG_Deleted = 0x00000020, FLAG_Persistent = 0x00000400, + FLAG_Ignored = 0x00001000, FLAG_Blocked = 0x00002000 }; From 86d7f5a9885732e019939c351a46107a953aa650 Mon Sep 17 00:00:00 2001 From: Evil Eye Date: Sat, 16 Apr 2022 22:58:08 +0200 Subject: [PATCH 2/2] Fix tests --- apps/openmw_test_suite/mwworld/test_store.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/apps/openmw_test_suite/mwworld/test_store.cpp b/apps/openmw_test_suite/mwworld/test_store.cpp index a789e05a5d..c15e238c9b 100644 --- a/apps/openmw_test_suite/mwworld/test_store.cpp +++ b/apps/openmw_test_suite/mwworld/test_store.cpp @@ -29,13 +29,14 @@ struct ContentFileTest : public ::testing::Test // load the content files int index=0; + ESM::Dialogue* dialogue = nullptr; for (const auto & mContentFile : mContentFiles) { ESM::ESMReader lEsm; lEsm.setEncoder(nullptr); lEsm.setIndex(index); lEsm.open(mContentFile.string()); - mEsmStore.load(lEsm, &dummyListener); + mEsmStore.load(lEsm, &dummyListener, dialogue); ++index; } @@ -249,17 +250,18 @@ TEST_F(StoreTest, delete_test) record.mId = recordId; ESM::ESMReader reader; + ESM::Dialogue* dialogue = nullptr; // master file inserts a record reader.open(getEsmFile(record, false), "filename"); - mEsmStore.load(reader, &dummyListener); + mEsmStore.load(reader, &dummyListener, dialogue); mEsmStore.setUp(); ASSERT_TRUE (mEsmStore.get().getSize() == 1); // now a plugin deletes it reader.open(getEsmFile(record, true), "filename"); - mEsmStore.load(reader, &dummyListener); + mEsmStore.load(reader, &dummyListener, dialogue); mEsmStore.setUp(); ASSERT_TRUE (mEsmStore.get().getSize() == 0); @@ -267,7 +269,7 @@ TEST_F(StoreTest, delete_test) // now another plugin inserts it again // expected behaviour is the record to reappear rather than staying deleted reader.open(getEsmFile(record, false), "filename"); - mEsmStore.load(reader, &dummyListener); + mEsmStore.load(reader, &dummyListener, dialogue); mEsmStore.setUp(); ASSERT_TRUE (mEsmStore.get().getSize() == 1); @@ -286,17 +288,18 @@ TEST_F(StoreTest, overwrite_test) record.mId = recordId; ESM::ESMReader reader; + ESM::Dialogue* dialogue = nullptr; // master file inserts a record reader.open(getEsmFile(record, false), "filename"); - mEsmStore.load(reader, &dummyListener); + mEsmStore.load(reader, &dummyListener, dialogue); mEsmStore.setUp(); // now a plugin overwrites it with changed data record.mId = recordIdUpper; // change id to uppercase, to test case smashing while we're at it record.mModel = "the_new_model"; reader.open(getEsmFile(record, false), "filename"); - mEsmStore.load(reader, &dummyListener); + mEsmStore.load(reader, &dummyListener, dialogue); mEsmStore.setUp(); // verify that changes were actually applied