#include "classcheck.hpp" #include #include #include #include #include #include #include #include #include #include #include #include "../prefs/state.hpp" CSMTools::ClassCheckStage::ClassCheckStage(const CSMWorld::IdCollection& classes) : mClasses(classes) { mIgnoreBaseRecords = false; } int CSMTools::ClassCheckStage::setup() { mIgnoreBaseRecords = CSMPrefs::get()["Reports"]["ignore-base-records"].isTrue(); return mClasses.getSize(); } void CSMTools::ClassCheckStage::perform(int stage, CSMDoc::Messages& messages) { const CSMWorld::Record& record = mClasses.getRecord(stage); // Skip "Base" records (setting!) and "Deleted" records if ((mIgnoreBaseRecords && record.mState == CSMWorld::RecordBase::State_BaseOnly) || record.isDeleted()) return; const ESM::Class& class_ = record.get(); CSMWorld::UniversalId id(CSMWorld::UniversalId::Type_Class, class_.mId); // A class should have a name if (class_.mName.empty()) messages.add(id, "Name is missing", "", CSMDoc::Message::Severity_Error); // A playable class should have a description if (class_.mData.mIsPlayable != 0 && class_.mDescription.empty()) messages.add(id, "Description of a playable class is missing", "", CSMDoc::Message::Severity_Warning); // test for invalid attributes std::map attributeCount; for (size_t i = 0; i < class_.mData.mAttribute.size(); ++i) { int attribute = class_.mData.mAttribute[i]; if (attribute == -1) messages.add(id, "Attribute #" + std::to_string(i) + " is not set", {}, CSMDoc::Message::Severity_Error); else { auto it = attributeCount.find(attribute); if (it == attributeCount.end()) attributeCount.emplace(attribute, 1); else { if (it->second == 1) messages.add(id, "Same attribute is listed twice", {}, CSMDoc::Message::Severity_Error); ++it->second; } } } // test for non-unique skill std::map skills; // ID, number of occurrences for (const auto& s : class_.mData.mSkills) for (int skill : s) ++skills[skill]; for (auto& skill : skills) if (skill.second > 1) { messages.add(id, "Skill " + ESM::Skill::indexToRefId(skill.first).toString() + " is listed more than once", "", CSMDoc::Message::Severity_Error); } }