diff --git a/apps/openmw/mwworld/cellstore.cpp b/apps/openmw/mwworld/cellstore.cpp index 8b0740d3b..f84b35b58 100644 --- a/apps/openmw/mwworld/cellstore.cpp +++ b/apps/openmw/mwworld/cellstore.cpp @@ -430,6 +430,11 @@ namespace MWWorld } } + bool CellStore::isExterior() const + { + return mCell->isExterior(); + } + Ptr CellStore::searchInContainer (const std::string& id) { if (Ptr ptr = searchInContainerList (mContainers, id)) @@ -637,4 +642,14 @@ namespace MWWorld } } } + + bool operator== (const CellStore& left, const CellStore& right) + { + return left.getCell()->getCellId()==right.getCell()->getCellId(); + } + + bool operator!= (const CellStore& left, const CellStore& right) + { + return !(left==right); + } } diff --git a/apps/openmw/mwworld/cellstore.hpp b/apps/openmw/mwworld/cellstore.hpp index 5ff63c582..6c18d1ce1 100644 --- a/apps/openmw/mwworld/cellstore.hpp +++ b/apps/openmw/mwworld/cellstore.hpp @@ -1,7 +1,6 @@ #ifndef GAME_MWWORLD_CELLSTORE_H #define GAME_MWWORLD_CELLSTORE_H -#include #include #include @@ -18,161 +17,150 @@ namespace MWWorld { class Ptr; - /// \brief Mutable state of a cell - class CellStore - { - public: - - enum State - { - State_Unloaded, State_Preloaded, State_Loaded - }; - - private: - - const ESM::Cell *mCell; - State mState; - std::vector mIds; - float mWaterLevel; - - CellRefList mActivators; - CellRefList mPotions; - CellRefList mAppas; - CellRefList mArmors; - CellRefList mBooks; - CellRefList mClothes; - CellRefList mContainers; - CellRefList mCreatures; - CellRefList mDoors; - CellRefList mIngreds; - CellRefList mCreatureLists; - CellRefList mItemLists; - CellRefList mLights; - CellRefList mLockpicks; - CellRefList mMiscItems; - CellRefList mNpcs; - CellRefList mProbes; - CellRefList mRepairs; - CellRefList mStatics; - CellRefList mWeapons; - - public: - - CellStore (const ESM::Cell *cell_); - - const ESM::Cell *getCell() const; - - State getState() const; - - bool hasId (const std::string& id) const; - ///< May return true for deleted IDs when in preload state. Will return false, if cell is - /// unloaded. - - Ptr search (const std::string& id); - ///< Will return an empty Ptr if cell is not loaded. Does not check references in - /// containers. - - Ptr searchViaHandle (const std::string& handle); - ///< Will return an empty Ptr if cell is not loaded. - - float getWaterLevel() const; - - void setWaterLevel (float level); - - int count() const; - ///< Return total number of references, including deleted ones. - - - void load (const MWWorld::ESMStore &store, std::vector &esm); - - void preload (const MWWorld::ESMStore &store, std::vector &esm); - - /// Call functor (ref) for each reference. functor must return a bool. Returning - /// false will abort the iteration. - /// \return Iteration completed? - /// - /// \note Creatures and NPCs are handled last. - template - bool forEach (Functor& functor) + /// \brief Mutable state of a cell + class CellStore { - return - forEachImp (functor, mActivators) && - forEachImp (functor, mPotions) && - forEachImp (functor, mAppas) && - forEachImp (functor, mArmors) && - forEachImp (functor, mBooks) && - forEachImp (functor, mClothes) && - forEachImp (functor, mContainers) && - forEachImp (functor, mDoors) && - forEachImp (functor, mIngreds) && - forEachImp (functor, mItemLists) && - forEachImp (functor, mLights) && - forEachImp (functor, mLockpicks) && - forEachImp (functor, mMiscItems) && - forEachImp (functor, mProbes) && - forEachImp (functor, mRepairs) && - forEachImp (functor, mStatics) && - forEachImp (functor, mWeapons) && - forEachImp (functor, mCreatures) && - forEachImp (functor, mNpcs) && - forEachImp (functor, mCreatureLists); - } - - bool operator==(const CellStore &cell) { - return mCell->mName == cell.mCell->mName && - mCell->mData.mX == cell.mCell->mData.mX && - mCell->mData.mY == cell.mCell->mData.mY; - } - - bool operator!=(const CellStore &cell) { - return !(*this == cell); - } - - bool isExterior() const { - return mCell->isExterior(); - } - - Ptr searchInContainer (const std::string& id); - - void loadState (const ESM::CellState& state); - - void saveState (ESM::CellState& state) const; - - void writeReferences (ESM::ESMWriter& writer) const; - - void readReferences (ESM::ESMReader& reader, const std::map& contentFileMap); - - template - CellRefList& get() { - throw std::runtime_error ("Storage for this type not exist in cells"); - } - - private: - - template - bool forEachImp (Functor& functor, List& list) - { - for (typename List::List::iterator iter (list.mList.begin()); iter!=list.mList.end(); - ++iter) - { - if (!iter->mData.getCount()) - continue; - if (!functor (MWWorld::Ptr(&*iter, this))) - return false; - } - return true; - } - - /// Run through references and store IDs - void listRefs(const MWWorld::ESMStore &store, std::vector &esm); - - void loadRefs(const MWWorld::ESMStore &store, std::vector &esm); - - void loadRef (ESM::CellRef& ref, bool deleted, const ESMStore& store); - ///< Make case-adjustments to \a ref and insert it into the respective container. - /// - /// Invalid \a ref objects are silently dropped. - }; + public: + + enum State + { + State_Unloaded, State_Preloaded, State_Loaded + }; + + private: + + const ESM::Cell *mCell; + State mState; + std::vector mIds; + float mWaterLevel; + + CellRefList mActivators; + CellRefList mPotions; + CellRefList mAppas; + CellRefList mArmors; + CellRefList mBooks; + CellRefList mClothes; + CellRefList mContainers; + CellRefList mCreatures; + CellRefList mDoors; + CellRefList mIngreds; + CellRefList mCreatureLists; + CellRefList mItemLists; + CellRefList mLights; + CellRefList mLockpicks; + CellRefList mMiscItems; + CellRefList mNpcs; + CellRefList mProbes; + CellRefList mRepairs; + CellRefList mStatics; + CellRefList mWeapons; + + public: + + CellStore (const ESM::Cell *cell_); + + const ESM::Cell *getCell() const; + + State getState() const; + + bool hasId (const std::string& id) const; + ///< May return true for deleted IDs when in preload state. Will return false, if cell is + /// unloaded. + + Ptr search (const std::string& id); + ///< Will return an empty Ptr if cell is not loaded. Does not check references in + /// containers. + + Ptr searchViaHandle (const std::string& handle); + ///< Will return an empty Ptr if cell is not loaded. + + float getWaterLevel() const; + + void setWaterLevel (float level); + + int count() const; + ///< Return total number of references, including deleted ones. + + void load (const MWWorld::ESMStore &store, std::vector &esm); + ///< Load references from content file. + + void preload (const MWWorld::ESMStore &store, std::vector &esm); + ///< Build ID list from content file. + + /// Call functor (ref) for each reference. functor must return a bool. Returning + /// false will abort the iteration. + /// \return Iteration completed? + /// + /// \note Creatures and NPCs are handled last. + template + bool forEach (Functor& functor) + { + return + forEachImp (functor, mActivators) && + forEachImp (functor, mPotions) && + forEachImp (functor, mAppas) && + forEachImp (functor, mArmors) && + forEachImp (functor, mBooks) && + forEachImp (functor, mClothes) && + forEachImp (functor, mContainers) && + forEachImp (functor, mDoors) && + forEachImp (functor, mIngreds) && + forEachImp (functor, mItemLists) && + forEachImp (functor, mLights) && + forEachImp (functor, mLockpicks) && + forEachImp (functor, mMiscItems) && + forEachImp (functor, mProbes) && + forEachImp (functor, mRepairs) && + forEachImp (functor, mStatics) && + forEachImp (functor, mWeapons) && + forEachImp (functor, mCreatures) && + forEachImp (functor, mNpcs) && + forEachImp (functor, mCreatureLists); + } + + bool isExterior() const; + + Ptr searchInContainer (const std::string& id); + + void loadState (const ESM::CellState& state); + + void saveState (ESM::CellState& state) const; + + void writeReferences (ESM::ESMWriter& writer) const; + + void readReferences (ESM::ESMReader& reader, const std::map& contentFileMap); + + template + CellRefList& get() { + throw std::runtime_error ("Storage for this type not exist in cells"); + } + + private: + + template + bool forEachImp (Functor& functor, List& list) + { + for (typename List::List::iterator iter (list.mList.begin()); iter!=list.mList.end(); + ++iter) + { + if (!iter->mData.getCount()) + continue; + if (!functor (MWWorld::Ptr(&*iter, this))) + return false; + } + return true; + } + + /// Run through references and store IDs + void listRefs(const MWWorld::ESMStore &store, std::vector &esm); + + void loadRefs(const MWWorld::ESMStore &store, std::vector &esm); + + void loadRef (ESM::CellRef& ref, bool deleted, const ESMStore& store); + ///< Make case-adjustments to \a ref and insert it into the respective container. + /// + /// Invalid \a ref objects are silently dropped. + }; template<> inline CellRefList& CellStore::get() @@ -293,6 +281,9 @@ namespace MWWorld { return mWeapons; } + + bool operator== (const CellStore& left, const CellStore& right); + bool operator!= (const CellStore& left, const CellStore& right); } #endif diff --git a/components/esm/cellid.cpp b/components/esm/cellid.cpp index 5bc8b7aef..3c6e23ffd 100644 --- a/components/esm/cellid.cpp +++ b/components/esm/cellid.cpp @@ -23,4 +23,15 @@ void ESM::CellId::save (ESMWriter &esm) const if (mPaged) esm.writeHNT ("CIDX", mIndex, 8); -} \ No newline at end of file +} + +bool ESM::operator== (const CellId& left, const CellId& right) +{ + return left.mWorldspace==right.mWorldspace && left.mPaged==right.mPaged && + (!left.mPaged || (left.mIndex.mX==right.mIndex.mX && left.mIndex.mY==right.mIndex.mY)); +} + +bool ESM::operator!= (const CellId& left, const CellId& right) +{ + return !(left==right); +} diff --git a/components/esm/cellid.hpp b/components/esm/cellid.hpp index 54dbdae78..40bc552e0 100644 --- a/components/esm/cellid.hpp +++ b/components/esm/cellid.hpp @@ -23,6 +23,9 @@ namespace ESM void load (ESMReader &esm); void save (ESMWriter &esm) const; }; + + bool operator== (const CellId& left, const CellId& right); + bool operator!= (const CellId& left, const CellId& right); } #endif \ No newline at end of file