From 9d61d76e928d146f9c1ad76ab6152fdcda58c711 Mon Sep 17 00:00:00 2001 From: Atahualpa Date: Wed, 20 Jun 2018 00:20:03 +0200 Subject: [PATCH] Adds the option to ignore "Base" records when running the verifier. (fixes #4466) Adds a boolean setting to the user preferences. This setting is locally saved to all OpenMW-CS check stages. When a verification is done, the setting is updated on setup for each check stage. If set to true, the boolean value is then used to skip the verification process for every base record - minus some special cases where, e.g., counters are to be set first. Related issue: - Fixes #4466: Editor: Add option to ignore base records when running verifier (https://gitlab.com/OpenMW/openmw/issues/4466) Tests: The changes were successfully tested in OpenMW-CS by creating faulty "Base" and "Modified" records for every record type (if possible) and, then, running the verifier with and without the option respectively. --- CHANGELOG.md | 3 +- apps/opencs/model/prefs/state.cpp | 1 + apps/opencs/model/tools/birthsigncheck.cpp | 11 ++- apps/opencs/model/tools/birthsigncheck.hpp | 1 + apps/opencs/model/tools/bodypartcheck.cpp | 11 ++- apps/opencs/model/tools/bodypartcheck.hpp | 1 + apps/opencs/model/tools/classcheck.cpp | 11 ++- apps/opencs/model/tools/classcheck.hpp | 1 + apps/opencs/model/tools/factioncheck.cpp | 11 ++- apps/opencs/model/tools/factioncheck.hpp | 1 + apps/opencs/model/tools/gmstcheck.cpp | 11 ++- apps/opencs/model/tools/gmstcheck.hpp | 1 + apps/opencs/model/tools/journalcheck.cpp | 15 +++- apps/opencs/model/tools/journalcheck.hpp | 1 + apps/opencs/model/tools/magiceffectcheck.cpp | 16 +++- apps/opencs/model/tools/magiceffectcheck.hpp | 1 + apps/opencs/model/tools/pathgridcheck.cpp | 11 ++- apps/opencs/model/tools/pathgridcheck.hpp | 1 + apps/opencs/model/tools/racecheck.cpp | 20 +++-- apps/opencs/model/tools/racecheck.hpp | 1 + .../opencs/model/tools/referenceablecheck.cpp | 78 ++++++++++++------- .../opencs/model/tools/referenceablecheck.hpp | 1 + apps/opencs/model/tools/referencecheck.cpp | 8 +- apps/opencs/model/tools/referencecheck.hpp | 1 + apps/opencs/model/tools/regioncheck.cpp | 11 ++- apps/opencs/model/tools/regioncheck.hpp | 1 + apps/opencs/model/tools/scriptcheck.cpp | 16 +++- apps/opencs/model/tools/scriptcheck.hpp | 1 + apps/opencs/model/tools/skillcheck.cpp | 11 ++- apps/opencs/model/tools/skillcheck.hpp | 1 + apps/opencs/model/tools/soundcheck.cpp | 11 ++- apps/opencs/model/tools/soundcheck.hpp | 1 + apps/opencs/model/tools/soundgencheck.cpp | 14 +++- apps/opencs/model/tools/soundgencheck.hpp | 1 + apps/opencs/model/tools/spellcheck.cpp | 11 ++- apps/opencs/model/tools/spellcheck.hpp | 1 + apps/opencs/model/tools/startscriptcheck.cpp | 11 ++- apps/opencs/model/tools/startscriptcheck.hpp | 1 + apps/opencs/model/tools/topicinfocheck.cpp | 11 ++- apps/opencs/model/tools/topicinfocheck.hpp | 2 + apps/opencs/model/world/record.cpp | 5 ++ apps/opencs/model/world/record.hpp | 2 + 42 files changed, 260 insertions(+), 70 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fc150f344..33ba3e461 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,12 +44,13 @@ Bug #4457: Item without CanCarry flag prevents shield autoequipping in dark areas Bug #4458: AiWander console command handles idle chances incorrectly Bug #4459: NotCell dialogue condition doesn't support partial matches - Feature #4256: Implement ToggleBorders (TB) console command Feature #3276: Editor: Search- Show number of (remaining) search results and indicate a search without any results Feature #4222: 360° screenshots + Feature #4256: Implement ToggleBorders (TB) console command Feature #4324: Add CFBundleIdentifier in Info.plist to allow for macOS function key shortcuts Feature #4345: Add equivalents for the command line commands to Launcher Feature #4444: Per-group KF-animation files support + Feature #4466: (OpenMW-CS) Add option to ignore "Base" records when running verifier 0.44.0 ------ diff --git a/apps/opencs/model/prefs/state.cpp b/apps/opencs/model/prefs/state.cpp index 6f64da72e..e1236a0e4 100644 --- a/apps/opencs/model/prefs/state.cpp +++ b/apps/opencs/model/prefs/state.cpp @@ -123,6 +123,7 @@ void CSMPrefs::State::declare() declareEnum ("double-s", "Shift Double Click", actionRemove).addValues (reportValues); declareEnum ("double-c", "Control Double Click", actionEditAndRemove).addValues (reportValues); declareEnum ("double-sc", "Shift Control Double Click", actionNone).addValues (reportValues); + declareBool("ignore-base-records", "Ignore base records in verifier", false); declareCategory ("Search & Replace"); declareInt ("char-before", "Characters before search string", 10). diff --git a/apps/opencs/model/tools/birthsigncheck.cpp b/apps/opencs/model/tools/birthsigncheck.cpp index 9898352f1..5fe2479cd 100644 --- a/apps/opencs/model/tools/birthsigncheck.cpp +++ b/apps/opencs/model/tools/birthsigncheck.cpp @@ -5,14 +5,20 @@ #include +#include "../prefs/state.hpp" + #include "../world/universalid.hpp" CSMTools::BirthsignCheckStage::BirthsignCheckStage (const CSMWorld::IdCollection& birthsigns) : mBirthsigns (birthsigns) -{} +{ + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); +} int CSMTools::BirthsignCheckStage::setup() { + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); + return mBirthsigns.getSize(); } @@ -20,7 +26,8 @@ void CSMTools::BirthsignCheckStage::perform (int stage, CSMDoc::Messages& messag { const CSMWorld::Record& record = mBirthsigns.getRecord (stage); - if (record.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && record.isBaseOnly()) || record.isDeleted()) return; const ESM::BirthSign& birthsign = record.get(); diff --git a/apps/opencs/model/tools/birthsigncheck.hpp b/apps/opencs/model/tools/birthsigncheck.hpp index 16d4c666f..a8a7a2c14 100644 --- a/apps/opencs/model/tools/birthsigncheck.hpp +++ b/apps/opencs/model/tools/birthsigncheck.hpp @@ -13,6 +13,7 @@ namespace CSMTools class BirthsignCheckStage : public CSMDoc::Stage { const CSMWorld::IdCollection& mBirthsigns; + bool mIgnoreBaseRecords; public: diff --git a/apps/opencs/model/tools/bodypartcheck.cpp b/apps/opencs/model/tools/bodypartcheck.cpp index 68a09485f..8d19ef489 100644 --- a/apps/opencs/model/tools/bodypartcheck.cpp +++ b/apps/opencs/model/tools/bodypartcheck.cpp @@ -1,5 +1,7 @@ #include "bodypartcheck.hpp" +#include "../prefs/state.hpp" + CSMTools::BodyPartCheckStage::BodyPartCheckStage( const CSMWorld::IdCollection &bodyParts, const CSMWorld::Resources &meshes, @@ -7,10 +9,14 @@ CSMTools::BodyPartCheckStage::BodyPartCheckStage( mBodyParts(bodyParts), mMeshes(meshes), mRaces(races) -{ } +{ + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); +} int CSMTools::BodyPartCheckStage::setup() { + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); + return mBodyParts.getSize(); } @@ -18,7 +24,8 @@ void CSMTools::BodyPartCheckStage::perform (int stage, CSMDoc::Messages &message { const CSMWorld::Record &record = mBodyParts.getRecord(stage); - if ( record.isDeleted() ) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && record.isBaseOnly()) || record.isDeleted()) return; const ESM::BodyPart &bodyPart = record.get(); diff --git a/apps/opencs/model/tools/bodypartcheck.hpp b/apps/opencs/model/tools/bodypartcheck.hpp index dbab5f5c6..5c8ae2929 100644 --- a/apps/opencs/model/tools/bodypartcheck.hpp +++ b/apps/opencs/model/tools/bodypartcheck.hpp @@ -17,6 +17,7 @@ namespace CSMTools const CSMWorld::IdCollection &mBodyParts; const CSMWorld::Resources &mMeshes; const CSMWorld::IdCollection &mRaces; + bool mIgnoreBaseRecords; public: BodyPartCheckStage( diff --git a/apps/opencs/model/tools/classcheck.cpp b/apps/opencs/model/tools/classcheck.cpp index 79cb704bf..82007c860 100644 --- a/apps/opencs/model/tools/classcheck.cpp +++ b/apps/opencs/model/tools/classcheck.cpp @@ -6,14 +6,20 @@ #include #include +#include "../prefs/state.hpp" + #include "../world/universalid.hpp" CSMTools::ClassCheckStage::ClassCheckStage (const CSMWorld::IdCollection& classes) : mClasses (classes) -{} +{ + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); +} int CSMTools::ClassCheckStage::setup() { + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); + return mClasses.getSize(); } @@ -21,7 +27,8 @@ void CSMTools::ClassCheckStage::perform (int stage, CSMDoc::Messages& messages) { const CSMWorld::Record& record = mClasses.getRecord (stage); - if (record.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && record.isBaseOnly()) || record.isDeleted()) return; const ESM::Class& class_ = record.get(); diff --git a/apps/opencs/model/tools/classcheck.hpp b/apps/opencs/model/tools/classcheck.hpp index b76da3f13..ba0a07047 100644 --- a/apps/opencs/model/tools/classcheck.hpp +++ b/apps/opencs/model/tools/classcheck.hpp @@ -13,6 +13,7 @@ namespace CSMTools class ClassCheckStage : public CSMDoc::Stage { const CSMWorld::IdCollection& mClasses; + bool mIgnoreBaseRecords; public: diff --git a/apps/opencs/model/tools/factioncheck.cpp b/apps/opencs/model/tools/factioncheck.cpp index 621b28070..2cf88fc0e 100644 --- a/apps/opencs/model/tools/factioncheck.cpp +++ b/apps/opencs/model/tools/factioncheck.cpp @@ -6,14 +6,20 @@ #include #include +#include "../prefs/state.hpp" + #include "../world/universalid.hpp" CSMTools::FactionCheckStage::FactionCheckStage (const CSMWorld::IdCollection& factions) : mFactions (factions) -{} +{ + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); +} int CSMTools::FactionCheckStage::setup() { + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); + return mFactions.getSize(); } @@ -21,7 +27,8 @@ void CSMTools::FactionCheckStage::perform (int stage, CSMDoc::Messages& messages { const CSMWorld::Record& record = mFactions.getRecord (stage); - if (record.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && record.isBaseOnly()) || record.isDeleted()) return; const ESM::Faction& faction = record.get(); diff --git a/apps/opencs/model/tools/factioncheck.hpp b/apps/opencs/model/tools/factioncheck.hpp index 321a4d6d8..b26d19717 100644 --- a/apps/opencs/model/tools/factioncheck.hpp +++ b/apps/opencs/model/tools/factioncheck.hpp @@ -13,6 +13,7 @@ namespace CSMTools class FactionCheckStage : public CSMDoc::Stage { const CSMWorld::IdCollection& mFactions; + bool mIgnoreBaseRecords; public: diff --git a/apps/opencs/model/tools/gmstcheck.cpp b/apps/opencs/model/tools/gmstcheck.cpp index 0c32c0056..e3b4777bf 100644 --- a/apps/opencs/model/tools/gmstcheck.cpp +++ b/apps/opencs/model/tools/gmstcheck.cpp @@ -2,14 +2,20 @@ #include +#include "../prefs/state.hpp" + #include "../world/defaultgmsts.hpp" CSMTools::GmstCheckStage::GmstCheckStage(const CSMWorld::IdCollection& gameSettings) : mGameSettings(gameSettings) -{} +{ + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); +} int CSMTools::GmstCheckStage::setup() { + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); + return mGameSettings.getSize(); } @@ -17,7 +23,8 @@ void CSMTools::GmstCheckStage::perform(int stage, CSMDoc::Messages& messages) { const CSMWorld::Record& record = mGameSettings.getRecord (stage); - if (record.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && record.isBaseOnly()) || record.isDeleted()) return; const ESM::GameSetting& gmst = record.get(); diff --git a/apps/opencs/model/tools/gmstcheck.hpp b/apps/opencs/model/tools/gmstcheck.hpp index 0d4f7f204..27bd61317 100644 --- a/apps/opencs/model/tools/gmstcheck.hpp +++ b/apps/opencs/model/tools/gmstcheck.hpp @@ -25,6 +25,7 @@ namespace CSMTools private: const CSMWorld::IdCollection& mGameSettings; + bool mIgnoreBaseRecords; std::string varTypeToString(ESM::VarType); diff --git a/apps/opencs/model/tools/journalcheck.cpp b/apps/opencs/model/tools/journalcheck.cpp index bdd14ddf0..a565f3786 100644 --- a/apps/opencs/model/tools/journalcheck.cpp +++ b/apps/opencs/model/tools/journalcheck.cpp @@ -3,13 +3,19 @@ #include #include +#include "../prefs/state.hpp" + CSMTools::JournalCheckStage::JournalCheckStage(const CSMWorld::IdCollection &journals, const CSMWorld::InfoCollection& journalInfos) : mJournals(journals), mJournalInfos(journalInfos) -{} +{ + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); +} int CSMTools::JournalCheckStage::setup() { + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); + return mJournals.getSize(); } @@ -17,7 +23,8 @@ void CSMTools::JournalCheckStage::perform(int stage, CSMDoc::Messages& messages) { const CSMWorld::Record &journalRecord = mJournals.getRecord(stage); - if (journalRecord.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && journalRecord.isBaseOnly()) || journalRecord.isDeleted()) return; const ESM::Dialogue &journal = journalRecord.get(); @@ -43,6 +50,10 @@ void CSMTools::JournalCheckStage::perform(int stage, CSMDoc::Messages& messages) statusNamedCount += 1; } + // Skip "Base" records (setting!) + if (mIgnoreBaseRecords && infoRecord.isBaseOnly()) + continue; + if (journalInfo.mResponse.empty()) { CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_JournalInfo, journalInfo.mId); diff --git a/apps/opencs/model/tools/journalcheck.hpp b/apps/opencs/model/tools/journalcheck.hpp index c9f619698..661edcaef 100644 --- a/apps/opencs/model/tools/journalcheck.hpp +++ b/apps/opencs/model/tools/journalcheck.hpp @@ -28,6 +28,7 @@ namespace CSMTools const CSMWorld::IdCollection& mJournals; const CSMWorld::InfoCollection& mJournalInfos; + bool mIgnoreBaseRecords; }; } diff --git a/apps/opencs/model/tools/magiceffectcheck.cpp b/apps/opencs/model/tools/magiceffectcheck.cpp index ab8b3b68b..f9e83aa23 100644 --- a/apps/opencs/model/tools/magiceffectcheck.cpp +++ b/apps/opencs/model/tools/magiceffectcheck.cpp @@ -2,6 +2,8 @@ #include +#include "../prefs/state.hpp" + #include "../world/resources.hpp" #include "../world/data.hpp" @@ -77,16 +79,26 @@ CSMTools::MagicEffectCheckStage::MagicEffectCheckStage(const CSMWorld::IdCollect mReferenceables(referenceables), mIcons(icons), mTextures(textures) -{} +{ + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); +} int CSMTools::MagicEffectCheckStage::setup() { + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); + return mMagicEffects.getSize(); } void CSMTools::MagicEffectCheckStage::perform(int stage, CSMDoc::Messages &messages) { - ESM::MagicEffect effect = mMagicEffects.getRecord(stage).get(); + const CSMWorld::Record &record = mMagicEffects.getRecord(stage); + + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && record.isBaseOnly()) || record.isDeleted()) + return; + + ESM::MagicEffect effect = record.get(); CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_MagicEffect, effect.mId); if (effect.mData.mBaseCost < 0.0f) diff --git a/apps/opencs/model/tools/magiceffectcheck.hpp b/apps/opencs/model/tools/magiceffectcheck.hpp index 0ad6760d3..28a406283 100644 --- a/apps/opencs/model/tools/magiceffectcheck.hpp +++ b/apps/opencs/model/tools/magiceffectcheck.hpp @@ -24,6 +24,7 @@ namespace CSMTools const CSMWorld::RefIdCollection &mReferenceables; const CSMWorld::Resources &mIcons; const CSMWorld::Resources &mTextures; + bool mIgnoreBaseRecords; private: bool isTextureExists(const std::string &texture, bool isIcon) const; diff --git a/apps/opencs/model/tools/pathgridcheck.cpp b/apps/opencs/model/tools/pathgridcheck.cpp index be4d37792..53293fa79 100644 --- a/apps/opencs/model/tools/pathgridcheck.cpp +++ b/apps/opencs/model/tools/pathgridcheck.cpp @@ -3,6 +3,8 @@ #include #include +#include "../prefs/state.hpp" + #include "../world/universalid.hpp" #include "../world/idcollection.hpp" #include "../world/subcellcollection.hpp" @@ -10,10 +12,14 @@ CSMTools::PathgridCheckStage::PathgridCheckStage (const CSMWorld::SubCellCollection& pathgrids) : mPathgrids (pathgrids) -{} +{ + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); +} int CSMTools::PathgridCheckStage::setup() { + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); + return mPathgrids.getSize(); } @@ -21,7 +27,8 @@ void CSMTools::PathgridCheckStage::perform (int stage, CSMDoc::Messages& message { const CSMWorld::Record& record = mPathgrids.getRecord (stage); - if (record.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && record.isBaseOnly()) || record.isDeleted()) return; const CSMWorld::Pathgrid& pathgrid = record.get(); diff --git a/apps/opencs/model/tools/pathgridcheck.hpp b/apps/opencs/model/tools/pathgridcheck.hpp index f45b5bc93..3e2fdd0ab 100644 --- a/apps/opencs/model/tools/pathgridcheck.hpp +++ b/apps/opencs/model/tools/pathgridcheck.hpp @@ -25,6 +25,7 @@ namespace CSMTools { const CSMWorld::SubCellCollection >& mPathgrids; + bool mIgnoreBaseRecords; public: diff --git a/apps/opencs/model/tools/racecheck.cpp b/apps/opencs/model/tools/racecheck.cpp index b30088620..c7fd83224 100644 --- a/apps/opencs/model/tools/racecheck.cpp +++ b/apps/opencs/model/tools/racecheck.cpp @@ -4,6 +4,8 @@ #include +#include "../prefs/state.hpp" + #include "../world/universalid.hpp" void CSMTools::RaceCheckStage::performPerRecord (int stage, CSMDoc::Messages& messages) @@ -15,6 +17,14 @@ void CSMTools::RaceCheckStage::performPerRecord (int stage, CSMDoc::Messages& me const ESM::Race& race = record.get(); + // Consider mPlayable flag even when "Base" records are ignored + if (race.mData.mFlags & 0x1) + mPlayable = true; + + // Skip "Base" records (setting!) + if (mIgnoreBaseRecords && record.isBaseOnly()) + return; + CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Race, race.mId); // test for empty name and description @@ -38,10 +48,6 @@ void CSMTools::RaceCheckStage::performPerRecord (int stage, CSMDoc::Messages& me if (race.mData.mWeight.mFemale<0) messages.push_back (std::make_pair (id, "female " + race.mId + " has negative weight")); - // remember playable flag - if (race.mData.mFlags & 0x1) - mPlayable = true; - /// \todo check data members that can't be edited in the table view } @@ -55,11 +61,15 @@ void CSMTools::RaceCheckStage::performFinal (CSMDoc::Messages& messages) CSMTools::RaceCheckStage::RaceCheckStage (const CSMWorld::IdCollection& races) : mRaces (races), mPlayable (false) -{} +{ + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); +} int CSMTools::RaceCheckStage::setup() { mPlayable = false; + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); + return mRaces.getSize()+1; } diff --git a/apps/opencs/model/tools/racecheck.hpp b/apps/opencs/model/tools/racecheck.hpp index 3e67b7577..55c283611 100644 --- a/apps/opencs/model/tools/racecheck.hpp +++ b/apps/opencs/model/tools/racecheck.hpp @@ -14,6 +14,7 @@ namespace CSMTools { const CSMWorld::IdCollection& mRaces; bool mPlayable; + bool mIgnoreBaseRecords; void performPerRecord (int stage, CSMDoc::Messages& messages); diff --git a/apps/opencs/model/tools/referenceablecheck.cpp b/apps/opencs/model/tools/referenceablecheck.cpp index 1e86dfe37..0c9a32b5c 100644 --- a/apps/opencs/model/tools/referenceablecheck.cpp +++ b/apps/opencs/model/tools/referenceablecheck.cpp @@ -2,6 +2,8 @@ #include +#include "../prefs/state.hpp" + #include "../world/record.hpp" #include "../world/universalid.hpp" @@ -18,6 +20,7 @@ CSMTools::ReferenceableCheckStage::ReferenceableCheckStage( mScripts(scripts), mPlayerPresent(false) { + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); } void CSMTools::ReferenceableCheckStage::perform (int stage, CSMDoc::Messages& messages) @@ -228,6 +231,8 @@ void CSMTools::ReferenceableCheckStage::perform (int stage, CSMDoc::Messages& me int CSMTools::ReferenceableCheckStage::setup() { mPlayerPresent = false; + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); + return mReferencables.getSize() + 1; } @@ -238,7 +243,8 @@ void CSMTools::ReferenceableCheckStage::bookCheck( { const CSMWorld::RecordBase& baseRecord = records.getRecord(stage); - if (baseRecord.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && baseRecord.isBaseOnly()) || baseRecord.isDeleted()) return; const ESM::Book& book = (dynamic_cast& >(baseRecord)).get(); @@ -257,7 +263,8 @@ void CSMTools::ReferenceableCheckStage::activatorCheck( { const CSMWorld::RecordBase& baseRecord = records.getRecord(stage); - if (baseRecord.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && baseRecord.isBaseOnly()) || baseRecord.isDeleted()) return; const ESM::Activator& activator = (dynamic_cast& >(baseRecord)).get(); @@ -278,7 +285,8 @@ void CSMTools::ReferenceableCheckStage::potionCheck( { const CSMWorld::RecordBase& baseRecord = records.getRecord(stage); - if (baseRecord.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && baseRecord.isBaseOnly()) || baseRecord.isDeleted()) return; const ESM::Potion& potion = (dynamic_cast& >(baseRecord)).get(); @@ -299,7 +307,8 @@ void CSMTools::ReferenceableCheckStage::apparatusCheck( { const CSMWorld::RecordBase& baseRecord = records.getRecord(stage); - if (baseRecord.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && baseRecord.isBaseOnly()) || baseRecord.isDeleted()) return; const ESM::Apparatus& apparatus = (dynamic_cast& >(baseRecord)).get(); @@ -320,7 +329,8 @@ void CSMTools::ReferenceableCheckStage::armorCheck( { const CSMWorld::RecordBase& baseRecord = records.getRecord(stage); - if (baseRecord.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && baseRecord.isBaseOnly()) || baseRecord.isDeleted()) return; const ESM::Armor& armor = (dynamic_cast& >(baseRecord)).get(); @@ -347,7 +357,8 @@ void CSMTools::ReferenceableCheckStage::clothingCheck( { const CSMWorld::RecordBase& baseRecord = records.getRecord(stage); - if (baseRecord.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && baseRecord.isBaseOnly()) || baseRecord.isDeleted()) return; const ESM::Clothing& clothing = (dynamic_cast& >(baseRecord)).get(); @@ -365,7 +376,8 @@ void CSMTools::ReferenceableCheckStage::containerCheck( { const CSMWorld::RecordBase& baseRecord = records.getRecord(stage); - if (baseRecord.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && baseRecord.isBaseOnly()) || baseRecord.isDeleted()) return; const ESM::Container& container = (dynamic_cast& >(baseRecord)).get(); @@ -397,7 +409,8 @@ void CSMTools::ReferenceableCheckStage::creatureCheck ( { const CSMWorld::RecordBase& baseRecord = records.getRecord(stage); - if (baseRecord.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && baseRecord.isBaseOnly()) || baseRecord.isDeleted()) return; const ESM::Creature& creature = (dynamic_cast&>(baseRecord)).get(); @@ -473,7 +486,8 @@ void CSMTools::ReferenceableCheckStage::doorCheck( { const CSMWorld::RecordBase& baseRecord = records.getRecord(stage); - if (baseRecord.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && baseRecord.isBaseOnly()) || baseRecord.isDeleted()) return; const ESM::Door& door = (dynamic_cast&>(baseRecord)).get(); @@ -497,7 +511,8 @@ void CSMTools::ReferenceableCheckStage::ingredientCheck( { const CSMWorld::RecordBase& baseRecord = records.getRecord(stage); - if (baseRecord.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && baseRecord.isBaseOnly()) || baseRecord.isDeleted()) return; const ESM::Ingredient& ingredient = (dynamic_cast& >(baseRecord)).get(); @@ -516,10 +531,9 @@ void CSMTools::ReferenceableCheckStage::creaturesLevListCheck( { const CSMWorld::RecordBase& baseRecord = records.getRecord(stage); - if (baseRecord.isDeleted()) - { + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && baseRecord.isBaseOnly()) || baseRecord.isDeleted()) return; - } const ESM::CreatureLevList& CreatureLevList = (dynamic_cast& >(baseRecord)).get(); CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_CreatureLevelledList, CreatureLevList.mId); //CreatureLevList but Type_CreatureLevelledList :/ @@ -534,10 +548,9 @@ void CSMTools::ReferenceableCheckStage::itemLevelledListCheck( { const CSMWorld::RecordBase& baseRecord = records.getRecord(stage); - if (baseRecord.isDeleted()) - { + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && baseRecord.isBaseOnly()) || baseRecord.isDeleted()) return; - } const ESM::ItemLevList& ItemLevList = (dynamic_cast& >(baseRecord)).get(); CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_ItemLevelledList, ItemLevList.mId); @@ -551,7 +564,8 @@ void CSMTools::ReferenceableCheckStage::lightCheck( { const CSMWorld::RecordBase& baseRecord = records.getRecord(stage); - if (baseRecord.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && baseRecord.isBaseOnly()) || baseRecord.isDeleted()) return; const ESM::Light& light = (dynamic_cast& >(baseRecord)).get(); @@ -574,7 +588,8 @@ void CSMTools::ReferenceableCheckStage::lockpickCheck( { const CSMWorld::RecordBase& baseRecord = records.getRecord(stage); - if (baseRecord.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && baseRecord.isBaseOnly()) || baseRecord.isDeleted()) return; const ESM::Lockpick& lockpick = (dynamic_cast& >(baseRecord)).get(); @@ -595,7 +610,8 @@ void CSMTools::ReferenceableCheckStage::miscCheck( { const CSMWorld::RecordBase& baseRecord = records.getRecord(stage); - if (baseRecord.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && baseRecord.isBaseOnly()) || baseRecord.isDeleted()) return; const ESM::Miscellaneous& miscellaneous = (dynamic_cast& >(baseRecord)).get(); @@ -619,6 +635,14 @@ void CSMTools::ReferenceableCheckStage::npcCheck ( const ESM::NPC& npc = (dynamic_cast& >(baseRecord)).get(); CSMWorld::UniversalId id (CSMWorld::UniversalId::Type_Npc, npc.mId); + //Detect if player is present + if (Misc::StringUtils::ciEqual(npc.mId, "player")) //Happy now, scrawl? + mPlayerPresent = true; + + // Skip "Base" records (setting!) + if (mIgnoreBaseRecords && baseRecord.isBaseOnly()) + return; + short level(npc.mNpdt.mLevel); char disposition(npc.mNpdt.mDisposition); char reputation(npc.mNpdt.mReputation); @@ -626,10 +650,6 @@ void CSMTools::ReferenceableCheckStage::npcCheck ( //Don't know what unknown is for int gold(npc.mNpdt.mGold); - //Detect if player is present - if (Misc::StringUtils::ciEqual(npc.mId, "player")) //Happy now, scrawl? - mPlayerPresent = true; - if (npc.mNpdtType == ESM::NPC::NPC_WITH_AUTOCALCULATED_STATS) //12 = autocalculated { if ((npc.mFlags & ESM::NPC::Autocalc) == 0) //0x0010 = autocalculated flag @@ -728,7 +748,8 @@ void CSMTools::ReferenceableCheckStage::weaponCheck( { const CSMWorld::RecordBase& baseRecord = records.getRecord (stage); - if (baseRecord.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && baseRecord.isBaseOnly()) || baseRecord.isDeleted()) return; const ESM::Weapon& weapon = (dynamic_cast& >(baseRecord)).get(); @@ -808,7 +829,8 @@ void CSMTools::ReferenceableCheckStage::probeCheck( { const CSMWorld::RecordBase& baseRecord = records.getRecord(stage); - if (baseRecord.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && baseRecord.isBaseOnly()) || baseRecord.isDeleted()) return; const ESM::Probe& probe = (dynamic_cast& >(baseRecord)).get(); @@ -827,7 +849,8 @@ void CSMTools::ReferenceableCheckStage::repairCheck ( { const CSMWorld::RecordBase& baseRecord = records.getRecord (stage); - if (baseRecord.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && baseRecord.isBaseOnly()) || baseRecord.isDeleted()) return; const ESM::Repair& repair = (dynamic_cast& >(baseRecord)).get(); @@ -846,7 +869,8 @@ void CSMTools::ReferenceableCheckStage::staticCheck ( { const CSMWorld::RecordBase& baseRecord = records.getRecord (stage); - if (baseRecord.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && baseRecord.isBaseOnly()) || baseRecord.isDeleted()) return; const ESM::Static& staticElement = (dynamic_cast& >(baseRecord)).get(); diff --git a/apps/opencs/model/tools/referenceablecheck.hpp b/apps/opencs/model/tools/referenceablecheck.hpp index 4356e50b2..f9341bd9c 100644 --- a/apps/opencs/model/tools/referenceablecheck.hpp +++ b/apps/opencs/model/tools/referenceablecheck.hpp @@ -82,6 +82,7 @@ namespace CSMTools const CSMWorld::IdCollection& mFactions; const CSMWorld::IdCollection& mScripts; bool mPlayerPresent; + bool mIgnoreBaseRecords; }; } #endif // REFERENCEABLECHECKSTAGE_H diff --git a/apps/opencs/model/tools/referencecheck.cpp b/apps/opencs/model/tools/referencecheck.cpp index 7f247741c..347a8a399 100644 --- a/apps/opencs/model/tools/referencecheck.cpp +++ b/apps/opencs/model/tools/referencecheck.cpp @@ -1,5 +1,7 @@ #include "referencecheck.hpp" +#include "../prefs/state.hpp" + CSMTools::ReferenceCheckStage::ReferenceCheckStage( const CSMWorld::RefCollection& references, const CSMWorld::RefIdCollection& referencables, @@ -12,13 +14,15 @@ CSMTools::ReferenceCheckStage::ReferenceCheckStage( mCells(cells), mFactions(factions) { + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); } void CSMTools::ReferenceCheckStage::perform(int stage, CSMDoc::Messages &messages) { const CSMWorld::Record& record = mReferences.getRecord(stage); - if (record.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && record.isBaseOnly()) || record.isDeleted()) return; const CSMWorld::CellRef& cellRef = record.get(); @@ -100,5 +104,7 @@ void CSMTools::ReferenceCheckStage::perform(int stage, CSMDoc::Messages &message int CSMTools::ReferenceCheckStage::setup() { + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); + return mReferences.getSize(); } diff --git a/apps/opencs/model/tools/referencecheck.hpp b/apps/opencs/model/tools/referencecheck.hpp index 70ef02916..5e25924f3 100644 --- a/apps/opencs/model/tools/referencecheck.hpp +++ b/apps/opencs/model/tools/referencecheck.hpp @@ -23,6 +23,7 @@ namespace CSMTools const CSMWorld::RefIdData& mDataSet; const CSMWorld::IdCollection& mCells; const CSMWorld::IdCollection& mFactions; + bool mIgnoreBaseRecords; }; } diff --git a/apps/opencs/model/tools/regioncheck.cpp b/apps/opencs/model/tools/regioncheck.cpp index 734861080..45b311414 100644 --- a/apps/opencs/model/tools/regioncheck.cpp +++ b/apps/opencs/model/tools/regioncheck.cpp @@ -5,14 +5,20 @@ #include +#include "../prefs/state.hpp" + #include "../world/universalid.hpp" CSMTools::RegionCheckStage::RegionCheckStage (const CSMWorld::IdCollection& regions) : mRegions (regions) -{} +{ + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); +} int CSMTools::RegionCheckStage::setup() { + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); + return mRegions.getSize(); } @@ -20,7 +26,8 @@ void CSMTools::RegionCheckStage::perform (int stage, CSMDoc::Messages& messages) { const CSMWorld::Record& record = mRegions.getRecord (stage); - if (record.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && record.isBaseOnly()) || record.isDeleted()) return; const ESM::Region& region = record.get(); diff --git a/apps/opencs/model/tools/regioncheck.hpp b/apps/opencs/model/tools/regioncheck.hpp index 8ba32e137..4c12727f0 100644 --- a/apps/opencs/model/tools/regioncheck.hpp +++ b/apps/opencs/model/tools/regioncheck.hpp @@ -13,6 +13,7 @@ namespace CSMTools class RegionCheckStage : public CSMDoc::Stage { const CSMWorld::IdCollection& mRegions; + bool mIgnoreBaseRecords; public: diff --git a/apps/opencs/model/tools/scriptcheck.cpp b/apps/opencs/model/tools/scriptcheck.cpp index 268aea379..bf5d48f65 100644 --- a/apps/opencs/model/tools/scriptcheck.cpp +++ b/apps/opencs/model/tools/scriptcheck.cpp @@ -60,6 +60,8 @@ CSMTools::ScriptCheckStage::ScriptCheckStage (const CSMDoc::Document& document) Compiler::registerExtensions (mExtensions); mContext.setExtensions (&mExtensions); + + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); } int CSMTools::ScriptCheckStage::setup() @@ -78,17 +80,25 @@ int CSMTools::ScriptCheckStage::setup() mId.clear(); Compiler::ErrorHandler::reset(); + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); + return mDocument.getData().getScripts().getSize(); } void CSMTools::ScriptCheckStage::perform (int stage, CSMDoc::Messages& messages) { + const CSMWorld::Record &record = mDocument.getData().getScripts().getRecord(stage); + mId = mDocument.getData().getScripts().getId (stage); if (mDocument.isBlacklisted ( CSMWorld::UniversalId (CSMWorld::UniversalId::Type_Script, mId))) return; + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && record.isBaseOnly()) || record.isDeleted()) + return; + mMessages = &messages; switch (mWarningMode) @@ -100,10 +110,8 @@ void CSMTools::ScriptCheckStage::perform (int stage, CSMDoc::Messages& messages) try { - const CSMWorld::Data& data = mDocument.getData(); - - mFile = data.getScripts().getRecord (stage).get().mId; - std::istringstream input (data.getScripts().getRecord (stage).get().mScriptText); + mFile = record.get().mId; + std::istringstream input (record.get().mScriptText); Compiler::Scanner scanner (*this, input, mContext.getExtensions()); diff --git a/apps/opencs/model/tools/scriptcheck.hpp b/apps/opencs/model/tools/scriptcheck.hpp index f58215800..8f4ac9763 100644 --- a/apps/opencs/model/tools/scriptcheck.hpp +++ b/apps/opencs/model/tools/scriptcheck.hpp @@ -32,6 +32,7 @@ namespace CSMTools std::string mFile; CSMDoc::Messages *mMessages; WarningMode mWarningMode; + bool mIgnoreBaseRecords; CSMDoc::Message::Severity getSeverity (Type type); diff --git a/apps/opencs/model/tools/skillcheck.cpp b/apps/opencs/model/tools/skillcheck.cpp index 77ba8d4a2..2214ec11a 100644 --- a/apps/opencs/model/tools/skillcheck.cpp +++ b/apps/opencs/model/tools/skillcheck.cpp @@ -4,14 +4,20 @@ #include +#include "../prefs/state.hpp" + #include "../world/universalid.hpp" CSMTools::SkillCheckStage::SkillCheckStage (const CSMWorld::IdCollection& skills) : mSkills (skills) -{} +{ + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); +} int CSMTools::SkillCheckStage::setup() { + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); + return mSkills.getSize(); } @@ -19,7 +25,8 @@ void CSMTools::SkillCheckStage::perform (int stage, CSMDoc::Messages& messages) { const CSMWorld::Record& record = mSkills.getRecord (stage); - if (record.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && record.isBaseOnly()) || record.isDeleted()) return; const ESM::Skill& skill = record.get(); diff --git a/apps/opencs/model/tools/skillcheck.hpp b/apps/opencs/model/tools/skillcheck.hpp index 93b06fe71..edd6b79a0 100644 --- a/apps/opencs/model/tools/skillcheck.hpp +++ b/apps/opencs/model/tools/skillcheck.hpp @@ -13,6 +13,7 @@ namespace CSMTools class SkillCheckStage : public CSMDoc::Stage { const CSMWorld::IdCollection& mSkills; + bool mIgnoreBaseRecords; public: diff --git a/apps/opencs/model/tools/soundcheck.cpp b/apps/opencs/model/tools/soundcheck.cpp index 3dbd3ef11..b21341333 100644 --- a/apps/opencs/model/tools/soundcheck.cpp +++ b/apps/opencs/model/tools/soundcheck.cpp @@ -4,14 +4,20 @@ #include +#include "../prefs/state.hpp" + #include "../world/universalid.hpp" CSMTools::SoundCheckStage::SoundCheckStage (const CSMWorld::IdCollection& sounds) : mSounds (sounds) -{} +{ + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); +} int CSMTools::SoundCheckStage::setup() { + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); + return mSounds.getSize(); } @@ -19,7 +25,8 @@ void CSMTools::SoundCheckStage::perform (int stage, CSMDoc::Messages& messages) { const CSMWorld::Record& record = mSounds.getRecord (stage); - if (record.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && record.isBaseOnly()) || record.isDeleted()) return; const ESM::Sound& sound = record.get(); diff --git a/apps/opencs/model/tools/soundcheck.hpp b/apps/opencs/model/tools/soundcheck.hpp index 52f2d3714..d6fff5263 100644 --- a/apps/opencs/model/tools/soundcheck.hpp +++ b/apps/opencs/model/tools/soundcheck.hpp @@ -13,6 +13,7 @@ namespace CSMTools class SoundCheckStage : public CSMDoc::Stage { const CSMWorld::IdCollection& mSounds; + bool mIgnoreBaseRecords; public: diff --git a/apps/opencs/model/tools/soundgencheck.cpp b/apps/opencs/model/tools/soundgencheck.cpp index a36c494a1..acd245016 100644 --- a/apps/opencs/model/tools/soundgencheck.cpp +++ b/apps/opencs/model/tools/soundgencheck.cpp @@ -2,6 +2,8 @@ #include +#include "../prefs/state.hpp" + #include "../world/refiddata.hpp" #include "../world/universalid.hpp" @@ -11,20 +13,24 @@ CSMTools::SoundGenCheckStage::SoundGenCheckStage(const CSMWorld::IdCollection &record = mSoundGens.getRecord(stage); - if (record.isDeleted()) - { + + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && record.isBaseOnly()) || record.isDeleted()) return; - } const ESM::SoundGenerator& soundGen = record.get(); CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_SoundGen, soundGen.mId); diff --git a/apps/opencs/model/tools/soundgencheck.hpp b/apps/opencs/model/tools/soundgencheck.hpp index 91b08f979..19388cb91 100644 --- a/apps/opencs/model/tools/soundgencheck.hpp +++ b/apps/opencs/model/tools/soundgencheck.hpp @@ -13,6 +13,7 @@ namespace CSMTools const CSMWorld::IdCollection &mSoundGens; const CSMWorld::IdCollection &mSounds; const CSMWorld::RefIdCollection &mReferenceables; + bool mIgnoreBaseRecords; public: SoundGenCheckStage(const CSMWorld::IdCollection &soundGens, diff --git a/apps/opencs/model/tools/spellcheck.cpp b/apps/opencs/model/tools/spellcheck.cpp index 91aed37ed..6fb38138b 100644 --- a/apps/opencs/model/tools/spellcheck.cpp +++ b/apps/opencs/model/tools/spellcheck.cpp @@ -5,14 +5,20 @@ #include +#include "../prefs/state.hpp" + #include "../world/universalid.hpp" CSMTools::SpellCheckStage::SpellCheckStage (const CSMWorld::IdCollection& spells) : mSpells (spells) -{} +{ + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); +} int CSMTools::SpellCheckStage::setup() { + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); + return mSpells.getSize(); } @@ -20,7 +26,8 @@ void CSMTools::SpellCheckStage::perform (int stage, CSMDoc::Messages& messages) { const CSMWorld::Record& record = mSpells.getRecord (stage); - if (record.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && record.isBaseOnly()) || record.isDeleted()) return; const ESM::Spell& spell = record.get(); diff --git a/apps/opencs/model/tools/spellcheck.hpp b/apps/opencs/model/tools/spellcheck.hpp index 9c3ea8885..03513adc3 100644 --- a/apps/opencs/model/tools/spellcheck.hpp +++ b/apps/opencs/model/tools/spellcheck.hpp @@ -13,6 +13,7 @@ namespace CSMTools class SpellCheckStage : public CSMDoc::Stage { const CSMWorld::IdCollection& mSpells; + bool mIgnoreBaseRecords; public: diff --git a/apps/opencs/model/tools/startscriptcheck.cpp b/apps/opencs/model/tools/startscriptcheck.cpp index 220751797..64c1c9209 100644 --- a/apps/opencs/model/tools/startscriptcheck.cpp +++ b/apps/opencs/model/tools/startscriptcheck.cpp @@ -1,18 +1,23 @@ #include "startscriptcheck.hpp" +#include "../prefs/state.hpp" + #include CSMTools::StartScriptCheckStage::StartScriptCheckStage ( const CSMWorld::IdCollection& startScripts, const CSMWorld::IdCollection& scripts) : mStartScripts (startScripts), mScripts (scripts) -{} +{ + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); +} void CSMTools::StartScriptCheckStage::perform(int stage, CSMDoc::Messages& messages) { const CSMWorld::Record& record = mStartScripts.getRecord (stage); - if (record.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && record.isBaseOnly()) || record.isDeleted()) return; std::string scriptId = record.get().mId; @@ -26,5 +31,7 @@ void CSMTools::StartScriptCheckStage::perform(int stage, CSMDoc::Messages& messa int CSMTools::StartScriptCheckStage::setup() { + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); + return mStartScripts.getSize(); } diff --git a/apps/opencs/model/tools/startscriptcheck.hpp b/apps/opencs/model/tools/startscriptcheck.hpp index cb82cbae7..a7d70ee5a 100644 --- a/apps/opencs/model/tools/startscriptcheck.hpp +++ b/apps/opencs/model/tools/startscriptcheck.hpp @@ -14,6 +14,7 @@ namespace CSMTools { const CSMWorld::IdCollection& mStartScripts; const CSMWorld::IdCollection& mScripts; + bool mIgnoreBaseRecords; public: diff --git a/apps/opencs/model/tools/topicinfocheck.cpp b/apps/opencs/model/tools/topicinfocheck.cpp index 05f02c763..69ebec96b 100644 --- a/apps/opencs/model/tools/topicinfocheck.cpp +++ b/apps/opencs/model/tools/topicinfocheck.cpp @@ -2,6 +2,8 @@ #include +#include "../prefs/state.hpp" + #include "../world/infoselectwrapper.hpp" CSMTools::TopicInfoCheckStage::TopicInfoCheckStage( @@ -29,7 +31,9 @@ CSMTools::TopicInfoCheckStage::TopicInfoCheckStage( mTopics(topics), mReferencables(referencables), mSoundFiles(soundFiles) -{} +{ + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); +} int CSMTools::TopicInfoCheckStage::setup() { @@ -67,6 +71,8 @@ int CSMTools::TopicInfoCheckStage::setup() } } + mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); + return mTopicInfos.getSize(); } @@ -74,7 +80,8 @@ void CSMTools::TopicInfoCheckStage::perform(int stage, CSMDoc::Messages& message { const CSMWorld::Record& infoRecord = mTopicInfos.getRecord(stage); - if (infoRecord.isDeleted()) + // Skip "Base" records (setting!) and "Deleted" records + if ((mIgnoreBaseRecords && infoRecord.isBaseOnly()) || infoRecord.isDeleted()) return; const CSMWorld::Info& topicInfo = infoRecord.get(); diff --git a/apps/opencs/model/tools/topicinfocheck.hpp b/apps/opencs/model/tools/topicinfocheck.hpp index 510901dac..dbd5fe1c5 100644 --- a/apps/opencs/model/tools/topicinfocheck.hpp +++ b/apps/opencs/model/tools/topicinfocheck.hpp @@ -65,6 +65,8 @@ namespace CSMTools std::set mCellNames; + bool mIgnoreBaseRecords; + // These return false when not successful and write an error bool verifyActor(const std::string& name, const CSMWorld::UniversalId& id, CSMDoc::Messages& messages); bool verifyCell(const std::string& name, const CSMWorld::UniversalId& id, CSMDoc::Messages& messages); diff --git a/apps/opencs/model/world/record.cpp b/apps/opencs/model/world/record.cpp index f13a36afc..3291b0462 100644 --- a/apps/opencs/model/world/record.cpp +++ b/apps/opencs/model/world/record.cpp @@ -2,6 +2,11 @@ CSMWorld::RecordBase::~RecordBase() {} +bool CSMWorld::RecordBase::isBaseOnly() const +{ + return mState == State_BaseOnly; +} + bool CSMWorld::RecordBase::isDeleted() const { return mState==State_Deleted || mState==State_Erased; diff --git a/apps/opencs/model/world/record.hpp b/apps/opencs/model/world/record.hpp index 3362f9f96..0468bf8e7 100644 --- a/apps/opencs/model/world/record.hpp +++ b/apps/opencs/model/world/record.hpp @@ -27,6 +27,8 @@ namespace CSMWorld virtual void assign (const RecordBase& record) = 0; ///< Will throw an exception if the types don't match. + bool isBaseOnly() const; + bool isDeleted() const; bool isErased() const;