mirror of
https://github.com/OpenMW/openmw.git
synced 2025-02-06 15:45:34 +00:00
Merge branch 'dont_look_at_me_im_hideous' into 'master'
Implement ignored records Closes #6699 See merge request OpenMW/openmw!1779
This commit is contained in:
commit
e66008c4e2
7 changed files with 24 additions and 11 deletions
|
@ -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
|
||||
|
|
|
@ -11,6 +11,7 @@ EsmLoader::EsmLoader(MWWorld::ESMStore& store, std::vector<ESM::ESMReader>& 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 */
|
||||
|
|
|
@ -13,6 +13,7 @@ namespace ToUTF8
|
|||
namespace ESM
|
||||
{
|
||||
class ESMReader;
|
||||
struct Dialogue;
|
||||
}
|
||||
|
||||
namespace MWWorld
|
||||
|
@ -31,6 +32,7 @@ struct EsmLoader : public ContentLoader
|
|||
std::vector<ESM::ESMReader>& mEsm;
|
||||
MWWorld::ESMStore& mStore;
|
||||
ToUTF8::Utf8Encoder* mEncoder;
|
||||
ESM::Dialogue* mDialogue;
|
||||
};
|
||||
|
||||
} /* namespace MWWorld */
|
||||
|
|
|
@ -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<int, StoreBase *>::iterator it = mStores.find(n.toInt());
|
||||
|
|
|
@ -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 <class T>
|
||||
const Store<T> &get() const {
|
||||
|
|
|
@ -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<RecordType>().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<RecordType>().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<RecordType>().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
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue