forked from mirror/openmw-tes3mp
various bits of cleanup
This commit is contained in:
parent
83ded18af0
commit
bfcd768078
4 changed files with 162 additions and 142 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
#ifndef GAME_MWWORLD_CELLSTORE_H
|
||||
#define GAME_MWWORLD_CELLSTORE_H
|
||||
|
||||
#include <deque>
|
||||
#include <algorithm>
|
||||
#include <stdexcept>
|
||||
|
||||
|
@ -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<std::string> mIds;
|
||||
float mWaterLevel;
|
||||
|
||||
CellRefList<ESM::Activator> mActivators;
|
||||
CellRefList<ESM::Potion> mPotions;
|
||||
CellRefList<ESM::Apparatus> mAppas;
|
||||
CellRefList<ESM::Armor> mArmors;
|
||||
CellRefList<ESM::Book> mBooks;
|
||||
CellRefList<ESM::Clothing> mClothes;
|
||||
CellRefList<ESM::Container> mContainers;
|
||||
CellRefList<ESM::Creature> mCreatures;
|
||||
CellRefList<ESM::Door> mDoors;
|
||||
CellRefList<ESM::Ingredient> mIngreds;
|
||||
CellRefList<ESM::CreatureLevList> mCreatureLists;
|
||||
CellRefList<ESM::ItemLevList> mItemLists;
|
||||
CellRefList<ESM::Light> mLights;
|
||||
CellRefList<ESM::Lockpick> mLockpicks;
|
||||
CellRefList<ESM::Miscellaneous> mMiscItems;
|
||||
CellRefList<ESM::NPC> mNpcs;
|
||||
CellRefList<ESM::Probe> mProbes;
|
||||
CellRefList<ESM::Repair> mRepairs;
|
||||
CellRefList<ESM::Static> mStatics;
|
||||
CellRefList<ESM::Weapon> 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::ESMReader> &esm);
|
||||
|
||||
void preload (const MWWorld::ESMStore &store, std::vector<ESM::ESMReader> &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<class Functor>
|
||||
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);
|
||||
}
|
||||
public:
|
||||
|
||||
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;
|
||||
}
|
||||
enum State
|
||||
{
|
||||
State_Unloaded, State_Preloaded, State_Loaded
|
||||
};
|
||||
|
||||
bool operator!=(const CellStore &cell) {
|
||||
return !(*this == cell);
|
||||
}
|
||||
private:
|
||||
|
||||
bool isExterior() const {
|
||||
return mCell->isExterior();
|
||||
}
|
||||
const ESM::Cell *mCell;
|
||||
State mState;
|
||||
std::vector<std::string> mIds;
|
||||
float mWaterLevel;
|
||||
|
||||
Ptr searchInContainer (const std::string& id);
|
||||
CellRefList<ESM::Activator> mActivators;
|
||||
CellRefList<ESM::Potion> mPotions;
|
||||
CellRefList<ESM::Apparatus> mAppas;
|
||||
CellRefList<ESM::Armor> mArmors;
|
||||
CellRefList<ESM::Book> mBooks;
|
||||
CellRefList<ESM::Clothing> mClothes;
|
||||
CellRefList<ESM::Container> mContainers;
|
||||
CellRefList<ESM::Creature> mCreatures;
|
||||
CellRefList<ESM::Door> mDoors;
|
||||
CellRefList<ESM::Ingredient> mIngreds;
|
||||
CellRefList<ESM::CreatureLevList> mCreatureLists;
|
||||
CellRefList<ESM::ItemLevList> mItemLists;
|
||||
CellRefList<ESM::Light> mLights;
|
||||
CellRefList<ESM::Lockpick> mLockpicks;
|
||||
CellRefList<ESM::Miscellaneous> mMiscItems;
|
||||
CellRefList<ESM::NPC> mNpcs;
|
||||
CellRefList<ESM::Probe> mProbes;
|
||||
CellRefList<ESM::Repair> mRepairs;
|
||||
CellRefList<ESM::Static> mStatics;
|
||||
CellRefList<ESM::Weapon> mWeapons;
|
||||
|
||||
void loadState (const ESM::CellState& state);
|
||||
public:
|
||||
|
||||
void saveState (ESM::CellState& state) const;
|
||||
CellStore (const ESM::Cell *cell_);
|
||||
|
||||
void writeReferences (ESM::ESMWriter& writer) const;
|
||||
const ESM::Cell *getCell() const;
|
||||
|
||||
void readReferences (ESM::ESMReader& reader, const std::map<int, int>& contentFileMap);
|
||||
State getState() const;
|
||||
|
||||
template <class T>
|
||||
CellRefList<T>& get() {
|
||||
throw std::runtime_error ("Storage for this type not exist in cells");
|
||||
}
|
||||
bool hasId (const std::string& id) const;
|
||||
///< May return true for deleted IDs when in preload state. Will return false, if cell is
|
||||
/// unloaded.
|
||||
|
||||
private:
|
||||
Ptr search (const std::string& id);
|
||||
///< Will return an empty Ptr if cell is not loaded. Does not check references in
|
||||
/// containers.
|
||||
|
||||
template<class Functor, class List>
|
||||
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;
|
||||
}
|
||||
Ptr searchViaHandle (const std::string& handle);
|
||||
///< Will return an empty Ptr if cell is not loaded.
|
||||
|
||||
/// Run through references and store IDs
|
||||
void listRefs(const MWWorld::ESMStore &store, std::vector<ESM::ESMReader> &esm);
|
||||
float getWaterLevel() const;
|
||||
|
||||
void loadRefs(const MWWorld::ESMStore &store, std::vector<ESM::ESMReader> &esm);
|
||||
void setWaterLevel (float level);
|
||||
|
||||
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.
|
||||
};
|
||||
int count() const;
|
||||
///< Return total number of references, including deleted ones.
|
||||
|
||||
void load (const MWWorld::ESMStore &store, std::vector<ESM::ESMReader> &esm);
|
||||
///< Load references from content file.
|
||||
|
||||
void preload (const MWWorld::ESMStore &store, std::vector<ESM::ESMReader> &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<class Functor>
|
||||
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<int, int>& contentFileMap);
|
||||
|
||||
template <class T>
|
||||
CellRefList<T>& get() {
|
||||
throw std::runtime_error ("Storage for this type not exist in cells");
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
template<class Functor, class List>
|
||||
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::ESMReader> &esm);
|
||||
|
||||
void loadRefs(const MWWorld::ESMStore &store, std::vector<ESM::ESMReader> &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<ESM::Activator>& CellStore::get<ESM::Activator>()
|
||||
|
@ -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
|
||||
|
|
|
@ -23,4 +23,15 @@ void ESM::CellId::save (ESMWriter &esm) const
|
|||
|
||||
if (mPaged)
|
||||
esm.writeHNT ("CIDX", mIndex, 8);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
|
|
@ -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
|
Loading…
Reference in a new issue