From f69465d7e0ca6a24f445825d6e0768463699fc1f Mon Sep 17 00:00:00 2001 From: Marek Kochanowicz Date: Fri, 20 Dec 2013 22:31:17 +0100 Subject: [PATCH] Added aditional checks for books. Activator check. --- .../opencs/model/tools/referenceablecheck.cpp | 72 +++++++++++++++++-- .../opencs/model/tools/referenceablecheck.hpp | 2 + apps/opencs/model/world/refiddata.cpp | 5 ++ apps/opencs/model/world/refiddata.hpp | 1 + 4 files changed, 74 insertions(+), 6 deletions(-) diff --git a/apps/opencs/model/tools/referenceablecheck.cpp b/apps/opencs/model/tools/referenceablecheck.cpp index 01c8d30a7..f8dcd86a4 100644 --- a/apps/opencs/model/tools/referenceablecheck.cpp +++ b/apps/opencs/model/tools/referenceablecheck.cpp @@ -4,26 +4,27 @@ #include #include -#include #include "../world/record.hpp" #include "../world/universalid.hpp" CSMTools::ReferenceableCheckStage::ReferenceableCheckStage(const CSMWorld::RefIdData& referenceable) : mReferencables(referenceable), - mBooksSize(0) + mBooksSize(0), + mActivatorsSize(0) { setSizeVariables(); } void CSMTools::ReferenceableCheckStage::perform(int stage, std::vector< std::string >& messages) { - //Checks for books, than, when stage is above mBooksSize goes to other checks, with stage - minus prev sizes as stage. + //Checks for books, than, when stage is above mBooksSize goes to other checks, with (stage - PrevSum) as stage. bool CheckPerformed = false; - + int PrevSum(0); + if (stage <= mBooksSize) - { - bookCheck(stage, mReferencables.getBooks(), messages); + { + bookCheck(stage, mReferencables.getBooks(), messages); CheckPerformed = true; } @@ -31,6 +32,21 @@ void CSMTools::ReferenceableCheckStage::perform(int stage, std::vector< std::str { return; } + + PrevSum += mBooksSize; + + if ((stage - PrevSum) <= mActivatorsSize) + { + activatorCheck(stage - PrevSum, mReferencables.getActivator(), messages); + CheckPerformed = true; + } + + if (CheckPerformed) + { + return; + } + + PrevSum += mActivatorsSize; } int CSMTools::ReferenceableCheckStage::setup() @@ -55,9 +71,53 @@ void CSMTools::ReferenceableCheckStage::bookCheck(int stage, const CSMWorld::Ref { messages.push_back(id.toString() + "|" + Book.mId + " has an empty name"); } + + //Checking for weight + if (Book.mData.mWeight < 0) + { + messages.push_back(id.toString() + "|" + Book.mId + " has a negative weight"); + } + + //Checking for value + if (Book.mData.mValue < 0) + { + messages.push_back(id.toString() + "|" + Book.mId + " has a negative value"); + } + +//checking for model + if (Book.mModel.empty()) + { + messages.push_back(id.toString() + "|" + Book.mId + " has no model"); + } + + //checking for icon + if (Book.mIcon.empty()) + { + messages.push_back(id.toString() + "|" + Book.mId + " has no icon"); + } +} + +void CSMTools::ReferenceableCheckStage::activatorCheck(int stage, const CSMWorld::RefIdDataContainer< ESM::Activator >& records, std::vector< std::string >& messages) +{ + const CSMWorld::RecordBase& baserecord = records.getRecord(stage); + + if (baserecord.isDeleted()) + { + return; + } + + const ESM::Activator& Activator = (static_cast& >(baserecord)).get(); + CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_Activator, Activator.mId); + + //Checking for model, IIRC all activators should have a model + if (Activator.mModel.empty()) + { + messages.push_back(id.toString() + "|" + Activator.mId + " has no model"); + } } void CSMTools::ReferenceableCheckStage::setSizeVariables() { mBooksSize = mReferencables.getBooks().getSize(); + mActivatorsSize = mReferencables.getActivator().getSize(); } diff --git a/apps/opencs/model/tools/referenceablecheck.hpp b/apps/opencs/model/tools/referenceablecheck.hpp index 509e8d8c0..dc2913c22 100644 --- a/apps/opencs/model/tools/referenceablecheck.hpp +++ b/apps/opencs/model/tools/referenceablecheck.hpp @@ -17,10 +17,12 @@ namespace CSMTools private: void bookCheck(int stage, const CSMWorld::RefIdDataContainer< ESM::Book >& records, std::vector< std::string >& messages); + void activatorCheck(int stage, const CSMWorld::RefIdDataContainer< ESM::Activator >& records, std::vector< std::string >& messages); void setSizeVariables(); const CSMWorld::RefIdData mReferencables; int mBooksSize; + int mActivatorsSize; }; } #endif // REFERENCEABLECHECKSTAGE_H diff --git a/apps/opencs/model/world/refiddata.cpp b/apps/opencs/model/world/refiddata.cpp index 0fbfef4f1..2285790be 100644 --- a/apps/opencs/model/world/refiddata.cpp +++ b/apps/opencs/model/world/refiddata.cpp @@ -236,3 +236,8 @@ const CSMWorld::RefIdDataContainer< ESM::Book >& CSMWorld::RefIdData::getBooks() { return mBooks; } + +const CSMWorld::RefIdDataContainer< ESM::Activator >& CSMWorld::RefIdData::getActivator() const +{ + return mActivators; +} diff --git a/apps/opencs/model/world/refiddata.hpp b/apps/opencs/model/world/refiddata.hpp index 1590b58df..4a8e1e6f5 100644 --- a/apps/opencs/model/world/refiddata.hpp +++ b/apps/opencs/model/world/refiddata.hpp @@ -222,6 +222,7 @@ namespace CSMWorld //RECORD CONTAINERS ACCESS METHODS const RefIdDataContainer& getBooks() const; + const RefIdDataContainer& getActivator() const; }; }