diff --git a/apps/openmw/mwworld/esmstore.cpp b/apps/openmw/mwworld/esmstore.cpp index 05f7509b60..37d40c3c9d 100644 --- a/apps/openmw/mwworld/esmstore.cpp +++ b/apps/openmw/mwworld/esmstore.cpp @@ -130,6 +130,109 @@ namespace namespace MWWorld { + struct ESMStoreImp + { + Store mActivators; + Store mPotions; + Store mAppas; + Store mArmors; + Store mBodyParts; + Store mBooks; + Store mBirthSigns; + Store mClasses; + Store mClothes; + Store mContainers; + Store mCreatures; + Store mDialogs; + Store mDoors; + Store mEnchants; + Store mFactions; + Store mGlobals; + Store mIngreds; + Store mCreatureLists; + Store mItemLists; + Store mLights; + Store mLockpicks; + Store mMiscItems; + Store mNpcs; + Store mProbes; + Store mRaces; + Store mRegions; + Store mRepairs; + Store mSoundGens; + Store mSounds; + Store mSpells; + Store mStartScripts; + Store mStatics; + Store mWeapons; + + Store mGameSettings; + Store mScripts; + + // Lists that need special rules + Store mCells; + Store mLands; + Store mLandTextures; + Store mPathgrids; + + Store mMagicEffects; + Store mSkills; + + // Special entry which is hardcoded and not loaded from an ESM + Store mAttributes; + }; + + ESMStore::ESMStore() + { + mStoreImp = std::make_unique(); + mDynamicCount = 0; + mStores[ESM::REC_ACTI] = &mStoreImp->mActivators; + mStores[ESM::REC_ALCH] = &mStoreImp->mPotions; + mStores[ESM::REC_APPA] = &mStoreImp->mAppas; + mStores[ESM::REC_ARMO] = &mStoreImp->mArmors; + mStores[ESM::REC_BODY] = &mStoreImp->mBodyParts; + mStores[ESM::REC_BOOK] = &mStoreImp->mBooks; + mStores[ESM::REC_BSGN] = &mStoreImp->mBirthSigns; + mStores[ESM::REC_CELL] = &mStoreImp->mCells; + mStores[ESM::REC_CLAS] = &mStoreImp->mClasses; + mStores[ESM::REC_CLOT] = &mStoreImp->mClothes; + mStores[ESM::REC_CONT] = &mStoreImp->mContainers; + mStores[ESM::REC_CREA] = &mStoreImp->mCreatures; + mStores[ESM::REC_DIAL] = &mStoreImp->mDialogs; + mStores[ESM::REC_DOOR] = &mStoreImp->mDoors; + mStores[ESM::REC_ENCH] = &mStoreImp->mEnchants; + mStores[ESM::REC_FACT] = &mStoreImp->mFactions; + mStores[ESM::REC_GLOB] = &mStoreImp->mGlobals; + mStores[ESM::REC_GMST] = &mStoreImp->mGameSettings; + mStores[ESM::REC_INGR] = &mStoreImp->mIngreds; + mStores[ESM::REC_LAND] = &mStoreImp->mLands; + mStores[ESM::REC_LEVC] = &mStoreImp->mCreatureLists; + mStores[ESM::REC_LEVI] = &mStoreImp->mItemLists; + mStores[ESM::REC_LIGH] = &mStoreImp->mLights; + mStores[ESM::REC_LOCK] = &mStoreImp->mLockpicks; + mStores[ESM::REC_LTEX] = &mStoreImp->mLandTextures; + mStores[ESM::REC_MISC] = &mStoreImp->mMiscItems; + mStores[ESM::REC_NPC_] = &mStoreImp->mNpcs; + mStores[ESM::REC_PGRD] = &mStoreImp->mPathgrids; + mStores[ESM::REC_PROB] = &mStoreImp->mProbes; + mStores[ESM::REC_RACE] = &mStoreImp->mRaces; + mStores[ESM::REC_REGN] = &mStoreImp->mRegions; + mStores[ESM::REC_REPA] = &mStoreImp->mRepairs; + mStores[ESM::REC_SCPT] = &mStoreImp->mScripts; + mStores[ESM::REC_SNDG] = &mStoreImp->mSoundGens; + mStores[ESM::REC_SOUN] = &mStoreImp->mSounds; + mStores[ESM::REC_SPEL] = &mStoreImp->mSpells; + mStores[ESM::REC_SSCR] = &mStoreImp->mStartScripts; + mStores[ESM::REC_STAT] = &mStoreImp->mStatics; + mStores[ESM::REC_WEAP] = &mStoreImp->mWeapons; + + mStoreImp->mPathgrids.setCells(mStoreImp->mCells); + } + + ESMStore::~ESMStore() + { + } + static bool isCacheableRecord(int id) { if (id == ESM::REC_ACTI || id == ESM::REC_ALCH || id == ESM::REC_APPA || id == ESM::REC_ARMO || @@ -152,7 +255,7 @@ void ESMStore::load(ESM::ESMReader &esm, Loading::Listener* listener, ESM::Dialo // 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. - mLandTextures.resize(esm.getIndex()+1); + mStoreImp->mLandTextures.resize(esm.getIndex()+1); // Loop through all records while(esm.hasMoreRecs()) @@ -180,9 +283,9 @@ void ESMStore::load(ESM::ESMReader &esm, Loading::Listener* listener, ESM::Dialo esm.skipRecord(); } } else if (n.toInt() == ESM::REC_MGEF) { - mMagicEffects.load (esm); + mStoreImp->mMagicEffects.load (esm); } else if (n.toInt() == ESM::REC_SKIL) { - mSkills.load (esm); + mStoreImp->mSkills.load (esm); } else if (n.toInt() == ESM::REC_FILT || n.toInt() == ESM::REC_DBGP) { @@ -208,7 +311,7 @@ void ESMStore::load(ESM::ESMReader &esm, Loading::Listener* listener, ESM::Dialo } if (n.toInt() == ESM::REC_DIAL) { - dialogue = const_cast(mDialogs.find(id.mId)); + dialogue = const_cast(mStoreImp->mDialogs.find(id.mId)); } else { dialogue = nullptr; } @@ -266,10 +369,10 @@ void ESMStore::setUp() for (const auto& [k, v] : mIds) mStaticIds.emplace(Misc::StringUtils::lowerCase(k), v); - mSkills.setUp(); - mMagicEffects.setUp(); - mAttributes.setUp(); - mDialogs.setUp(); + mStoreImp->mSkills.setUp(); + mStoreImp->mMagicEffects.setUp(); + mStoreImp->mAttributes.setUp(); + mStoreImp->mDialogs.setUp(); } void ESMStore::validateRecords(ESM::ReadersCache& readers) @@ -286,9 +389,9 @@ void ESMStore::countAllCellRefs(ESM::ReadersCache& readers) return; std::vector refs; std::vector refIDs; - for(auto it = mCells.intBegin(); it != mCells.intEnd(); ++it) + for(auto it = mStoreImp->mCells.intBegin(); it != mStoreImp->mCells.intEnd(); ++it) readRefs(*it, refs, refIDs, readers); - for(auto it = mCells.extBegin(); it != mCells.extEnd(); ++it) + for(auto it = mStoreImp->mCells.extBegin(); it != mStoreImp->mCells.extEnd(); ++it) readRefs(*it, refs, refIDs, readers); const auto lessByRefNum = [] (const Ref& l, const Ref& r) { return l.mRefNum < r.mRefNum; }; std::stable_sort(refs.begin(), refs.end(), lessByRefNum); @@ -317,17 +420,17 @@ int ESMStore::getRefCount(std::string_view id) const void ESMStore::validate() { - std::vector npcsToReplace = getNPCsToReplace(mFactions, mClasses, mNpcs.mStatic); + std::vector npcsToReplace = getNPCsToReplace(mStoreImp->mFactions, mStoreImp->mClasses, mStoreImp->mNpcs.mStatic); for (const ESM::NPC &npc : npcsToReplace) { - mNpcs.eraseStatic(npc.mId); - mNpcs.insertStatic(npc); + mStoreImp->mNpcs.eraseStatic(npc.mId); + mStoreImp->mNpcs.insertStatic(npc); } // Validate spell effects for invalid arguments std::vector spellsToReplace; - for (ESM::Spell spell : mSpells) + for (ESM::Spell spell : mStoreImp->mSpells) { if (spell.mEffects.mList.empty()) continue; @@ -336,7 +439,7 @@ void ESMStore::validate() auto iter = spell.mEffects.mList.begin(); while (iter != spell.mEffects.mList.end()) { - const ESM::MagicEffect* mgef = mMagicEffects.search(iter->mEffectID); + const ESM::MagicEffect* mgef = mStoreImp->mMagicEffects.search(iter->mEffectID); if (!mgef) { Log(Debug::Verbose) << "Spell '" << spell.mId << "' has an invalid effect (index " << iter->mEffectID << ") present. Dropping the effect."; @@ -383,25 +486,31 @@ void ESMStore::validate() for (const ESM::Spell &spell : spellsToReplace) { - mSpells.eraseStatic(spell.mId); - mSpells.insertStatic(spell); + mStoreImp->mSpells.eraseStatic(spell.mId); + mStoreImp->mSpells.insertStatic(spell); } } +void ESMStore::movePlayerRecord() +{ + auto player = mStoreImp->mNpcs.find("player"); + mStoreImp->mNpcs.insert(*player); +} + void ESMStore::validateDynamic() { - std::vector npcsToReplace = getNPCsToReplace(mFactions, mClasses, mNpcs.mDynamic); + std::vector npcsToReplace = getNPCsToReplace(mStoreImp->mFactions, mStoreImp->mClasses, mStoreImp->mNpcs.mDynamic); for (const ESM::NPC &npc : npcsToReplace) - mNpcs.insert(npc); + mStoreImp->mNpcs.insert(npc); - removeMissingScripts(mScripts, mArmors.mDynamic); - removeMissingScripts(mScripts, mBooks.mDynamic); - removeMissingScripts(mScripts, mClothes.mDynamic); - removeMissingScripts(mScripts, mWeapons.mDynamic); + removeMissingScripts(mStoreImp->mScripts, mStoreImp->mArmors.mDynamic); + removeMissingScripts(mStoreImp->mScripts, mStoreImp->mBooks.mDynamic); + removeMissingScripts(mStoreImp->mScripts, mStoreImp->mClothes.mDynamic); + removeMissingScripts(mStoreImp->mScripts, mStoreImp->mWeapons.mDynamic); - removeMissingObjects(mCreatureLists); - removeMissingObjects(mItemLists); + removeMissingObjects(mStoreImp->mCreatureLists); + removeMissingObjects(mStoreImp->mItemLists); } // Leveled lists can be modified by scripts. This removes items that no longer exist (presumably because the plugin was removed) from modified lists @@ -426,19 +535,19 @@ void ESMStore::removeMissingObjects(Store& store) int ESMStore::countSavedGameRecords() const { return 1 // DYNA (dynamic name counter) - +mPotions.getDynamicSize() - +mArmors.getDynamicSize() - +mBooks.getDynamicSize() - +mClasses.getDynamicSize() - +mClothes.getDynamicSize() - +mEnchants.getDynamicSize() - +mNpcs.getDynamicSize() - +mSpells.getDynamicSize() - +mWeapons.getDynamicSize() - +mCreatureLists.getDynamicSize() - +mItemLists.getDynamicSize() - +mCreatures.getDynamicSize() - +mContainers.getDynamicSize(); + +mStoreImp->mPotions.getDynamicSize() + +mStoreImp->mArmors.getDynamicSize() + +mStoreImp->mBooks.getDynamicSize() + +mStoreImp->mClasses.getDynamicSize() + +mStoreImp->mClothes.getDynamicSize() + +mStoreImp->mEnchants.getDynamicSize() + +mStoreImp->mNpcs.getDynamicSize() + +mStoreImp->mSpells.getDynamicSize() + +mStoreImp->mWeapons.getDynamicSize() + +mStoreImp->mCreatureLists.getDynamicSize() + +mStoreImp->mItemLists.getDynamicSize() + +mStoreImp->mCreatures.getDynamicSize() + +mStoreImp->mContainers.getDynamicSize(); } void ESMStore::write (ESM::ESMWriter& writer, Loading::Listener& progress) const @@ -449,19 +558,19 @@ void ESMStore::removeMissingObjects(Store& store) writer.endRecord("COUN"); writer.endRecord(ESM::REC_DYNA); - mPotions.write (writer, progress); - mArmors.write (writer, progress); - mBooks.write (writer, progress); - mClasses.write (writer, progress); - mClothes.write (writer, progress); - mEnchants.write (writer, progress); - mSpells.write (writer, progress); - mWeapons.write (writer, progress); - mNpcs.write (writer, progress); - mItemLists.write (writer, progress); - mCreatureLists.write (writer, progress); - mCreatures.write (writer, progress); - mContainers.write (writer, progress); + mStoreImp->mPotions.write (writer, progress); + mStoreImp->mArmors.write (writer, progress); + mStoreImp->mBooks.write (writer, progress); + mStoreImp->mClasses.write (writer, progress); + mStoreImp->mClothes.write (writer, progress); + mStoreImp->mEnchants.write (writer, progress); + mStoreImp->mSpells.write (writer, progress); + mStoreImp->mWeapons.write (writer, progress); + mStoreImp->mNpcs.write (writer, progress); + mStoreImp->mItemLists.write (writer, progress); + mStoreImp->mCreatureLists.write (writer, progress); + mStoreImp->mCreatures.write (writer, progress); + mStoreImp->mContainers.write (writer, progress); } bool ESMStore::readRecord (ESM::ESMReader& reader, uint32_t type) @@ -501,10 +610,10 @@ void ESMStore::removeMissingObjects(Store& store) { setUp(); - const ESM::NPC *player = mNpcs.find ("player"); + const ESM::NPC *player = mStoreImp->mNpcs.find ("player"); - if (!mRaces.find (player->mRace) || - !mClasses.find (player->mClass)) + if (!mStoreImp->mRaces.find (player->mRace) || + !mStoreImp->mClasses.find (player->mClass)) throw std::runtime_error ("Invalid player record (race or class unavailable"); } @@ -526,4 +635,242 @@ void ESMStore::removeMissingObjects(Store& store) } return {ptr, true}; } + + template <> + const ESM::Cell *ESMStore::insert(const ESM::Cell &cell) { + return mStoreImp->mCells.insert(cell); + } + + template <> + const ESM::NPC *ESMStore::insert(const ESM::NPC &npc) + { + const std::string id = "$dynamic" + std::to_string(mDynamicCount++); + + if (Misc::StringUtils::ciEqual(npc.mId, "player")) + { + return mStoreImp->mNpcs.insert(npc); + } + else if (mStoreImp->mNpcs.search(id) != nullptr) + { + const std::string msg = "Try to override existing record '" + id + "'"; + throw std::runtime_error(msg); + } + ESM::NPC record = npc; + + record.mId = id; + + ESM::NPC *ptr = mStoreImp->mNpcs.insert(record); + mIds[ptr->mId] = ESM::REC_NPC_; + return ptr; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mActivators; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mPotions; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mAppas; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mArmors; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mBodyParts; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mBooks; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mBirthSigns; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mClasses; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mClothes; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mContainers; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mCreatures; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mDialogs; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mDoors; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mEnchants; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mFactions; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mGlobals; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mIngreds; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mCreatureLists; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mItemLists; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mLights; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mLockpicks; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mMiscItems; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mNpcs; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mProbes; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mRaces; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mRegions; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mRepairs; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mSoundGens; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mSounds; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mSpells; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mStartScripts; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mStatics; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mWeapons; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mGameSettings; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mScripts; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mCells; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mLands; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mLandTextures; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mPathgrids; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mMagicEffects; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mSkills; + } + + template <> + const Store &ESMStore::get() const { + return mStoreImp->mAttributes; + } } // end namespace diff --git a/apps/openmw/mwworld/esmstore.hpp b/apps/openmw/mwworld/esmstore.hpp index b4df837936..0c36bc17a1 100644 --- a/apps/openmw/mwworld/esmstore.hpp +++ b/apps/openmw/mwworld/esmstore.hpp @@ -6,7 +6,6 @@ #include #include -#include #include "store.hpp" namespace Loading @@ -26,56 +25,12 @@ namespace ESM namespace MWWorld { + struct ESMStoreImp; + class ESMStore { - Store mActivators; - Store mPotions; - Store mAppas; - Store mArmors; - Store mBodyParts; - Store mBooks; - Store mBirthSigns; - Store mClasses; - Store mClothes; - Store mContainers; - Store mCreatures; - Store mDialogs; - Store mDoors; - Store mEnchants; - Store mFactions; - Store mGlobals; - Store mIngreds; - Store mCreatureLists; - Store mItemLists; - Store mLights; - Store mLockpicks; - Store mMiscItems; - Store mNpcs; - Store mProbes; - Store mRaces; - Store mRegions; - Store mRepairs; - Store mSoundGens; - Store mSounds; - Store mSpells; - Store mStartScripts; - Store mStatics; - Store mWeapons; + std::unique_ptr mStoreImp; - Store mGameSettings; - Store mScripts; - - // Lists that need special rules - Store mCells; - Store mLands; - Store mLandTextures; - Store mPathgrids; - - Store mMagicEffects; - Store mSkills; - - // Special entry which is hardcoded and not loaded from an ESM - Store mAttributes; // Lookup of all IDs. Makes looking up references faster. Just // maps the id name to the record type. @@ -137,51 +92,8 @@ namespace MWWorld return it->second; } - ESMStore() - : mDynamicCount(0) - { - mStores[ESM::REC_ACTI] = &mActivators; - mStores[ESM::REC_ALCH] = &mPotions; - mStores[ESM::REC_APPA] = &mAppas; - mStores[ESM::REC_ARMO] = &mArmors; - mStores[ESM::REC_BODY] = &mBodyParts; - mStores[ESM::REC_BOOK] = &mBooks; - mStores[ESM::REC_BSGN] = &mBirthSigns; - mStores[ESM::REC_CELL] = &mCells; - mStores[ESM::REC_CLAS] = &mClasses; - mStores[ESM::REC_CLOT] = &mClothes; - mStores[ESM::REC_CONT] = &mContainers; - mStores[ESM::REC_CREA] = &mCreatures; - mStores[ESM::REC_DIAL] = &mDialogs; - mStores[ESM::REC_DOOR] = &mDoors; - mStores[ESM::REC_ENCH] = &mEnchants; - mStores[ESM::REC_FACT] = &mFactions; - mStores[ESM::REC_GLOB] = &mGlobals; - mStores[ESM::REC_GMST] = &mGameSettings; - mStores[ESM::REC_INGR] = &mIngreds; - mStores[ESM::REC_LAND] = &mLands; - mStores[ESM::REC_LEVC] = &mCreatureLists; - mStores[ESM::REC_LEVI] = &mItemLists; - mStores[ESM::REC_LIGH] = &mLights; - mStores[ESM::REC_LOCK] = &mLockpicks; - mStores[ESM::REC_LTEX] = &mLandTextures; - mStores[ESM::REC_MISC] = &mMiscItems; - mStores[ESM::REC_NPC_] = &mNpcs; - mStores[ESM::REC_PGRD] = &mPathgrids; - mStores[ESM::REC_PROB] = &mProbes; - mStores[ESM::REC_RACE] = &mRaces; - mStores[ESM::REC_REGN] = &mRegions; - mStores[ESM::REC_REPA] = &mRepairs; - mStores[ESM::REC_SCPT] = &mScripts; - mStores[ESM::REC_SNDG] = &mSoundGens; - mStores[ESM::REC_SOUN] = &mSounds; - mStores[ESM::REC_SPEL] = &mSpells; - mStores[ESM::REC_SSCR] = &mStartScripts; - mStores[ESM::REC_STAT] = &mStatics; - mStores[ESM::REC_WEAP] = &mWeapons; - - mPathgrids.setCells(mCells); - } + ESMStore(); + ~ESMStore(); void clearDynamic () { @@ -191,11 +103,7 @@ namespace MWWorld movePlayerRecord(); } - void movePlayerRecord () - { - auto player = mNpcs.find("player"); - mNpcs.insert(*player); - } + void movePlayerRecord(); /// Validate entries in store after loading a save void validateDynamic(); @@ -289,242 +197,136 @@ namespace MWWorld }; template <> - inline const ESM::Cell *ESMStore::insert(const ESM::Cell &cell) { - return mCells.insert(cell); - } + const ESM::Cell* ESMStore::insert(const ESM::Cell& cell); template <> - inline const ESM::NPC *ESMStore::insert(const ESM::NPC &npc) - { - if (Misc::StringUtils::ciEqual(npc.mId, "player")) - { - return mNpcs.insert(npc); - } - - const std::string id = "$dynamic" + std::to_string(mDynamicCount++); - if (mNpcs.search(id) != nullptr) - { - const std::string msg = "Try to override existing record '" + id + "'"; - throw std::runtime_error(msg); - } - ESM::NPC record = npc; - - record.mId = id; - - ESM::NPC *ptr = mNpcs.insert(record); - mIds[ptr->mId] = ESM::REC_NPC_; - return ptr; - } + const ESM::NPC* ESMStore::insert(const ESM::NPC& npc); template <> - inline const Store &ESMStore::get() const { - return mActivators; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mPotions; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mAppas; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mArmors; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mBodyParts; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mBooks; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mBirthSigns; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mClasses; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mClothes; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mContainers; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mCreatures; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mDialogs; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mDoors; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mEnchants; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mFactions; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mGlobals; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mIngreds; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mCreatureLists; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mItemLists; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mLights; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mLockpicks; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mMiscItems; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mNpcs; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mProbes; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mRaces; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mRegions; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mRepairs; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mSoundGens; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mSounds; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mSpells; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mStartScripts; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mStatics; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mWeapons; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mGameSettings; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mScripts; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mCells; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mLands; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mLandTextures; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mPathgrids; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mMagicEffects; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mSkills; - } + const Store& ESMStore::get() const; template <> - inline const Store &ESMStore::get() const { - return mAttributes; - } + const Store& ESMStore::get() const; } #endif