#ifndef GAME_MWWORLD_MANUALREF_H #define GAME_MWWORLD_MANUALREF_H #include #include "esmstore.hpp" #include "ptr.hpp" #include "cellstore.hpp" namespace MWWorld { /// \brief Manually constructed live cell ref class ManualRef { boost::any mRef; Ptr mPtr; ManualRef (const ManualRef&); ManualRef& operator= (const ManualRef&); template void create (const MWWorld::Store& list, const std::string& name) { const T* base = list.find(name); ESM::CellRef cellRef; cellRef.mRefNum.mIndex = 0; cellRef.mRefNum.mContentFile = -1; cellRef.mRefID = name; cellRef.mScale = 1; cellRef.mFactionRank = 0; cellRef.mCharge = -1; cellRef.mGoldValue = 1; cellRef.mEnchantmentCharge = -1; cellRef.mTeleport = false; cellRef.mLockLevel = 0; cellRef.mReferenceBlocked = 0; LiveCellRef ref(cellRef, base); mRef = ref; mPtr = Ptr (&boost::any_cast&> (mRef), 0); } public: ManualRef (const MWWorld::ESMStore& store, const std::string& name, const int count=1) { std::string lowerName = Misc::StringUtils::lowerCase (name); switch (store.find (lowerName)) { case ESM::REC_ACTI: create (store.get(), lowerName); break; case ESM::REC_ALCH: create (store.get(), lowerName); break; case ESM::REC_APPA: create (store.get(), lowerName); break; case ESM::REC_ARMO: create (store.get(), lowerName); break; case ESM::REC_BOOK: create (store.get(), lowerName); break; case ESM::REC_CLOT: create (store.get(), lowerName); break; case ESM::REC_CONT: create (store.get(), lowerName); break; case ESM::REC_CREA: create (store.get(), lowerName); break; case ESM::REC_DOOR: create (store.get(), lowerName); break; case ESM::REC_INGR: create (store.get(), lowerName); break; case ESM::REC_LEVC: create (store.get(), lowerName); break; case ESM::REC_LEVI: create (store.get(), lowerName); break; case ESM::REC_LIGH: create (store.get(), lowerName); break; case ESM::REC_LOCK: create (store.get(), lowerName); break; case ESM::REC_MISC: create (store.get(), lowerName); break; case ESM::REC_NPC_: create (store.get(), lowerName); break; case ESM::REC_PROB: create (store.get(), lowerName); break; case ESM::REC_REPA: create (store.get(), lowerName); break; case ESM::REC_STAT: create (store.get(), lowerName); break; case ESM::REC_WEAP: create (store.get(), lowerName); break; case 0: throw std::logic_error ("failed to create manual cell ref for " + lowerName + " (unknown ID)"); default: throw std::logic_error ("failed to create manual cell ref for " + lowerName + " (unknown type)"); } mPtr.getRefData().setCount(count); } const Ptr& getPtr() const { return mPtr; } }; } #endif