OpenMW
|
00001 #ifndef GAME_MWWORLD_CONTAINERSTORE_H 00002 #define GAME_MWWORLD_CONTAINERSTORE_H 00003 00004 #include <iterator> 00005 00006 #include "ptr.hpp" 00007 00008 namespace ESM 00009 { 00010 struct InventoryList; 00011 } 00012 00013 namespace MWWorld 00014 { 00015 class ContainerStoreIterator; 00016 00017 class ContainerStore 00018 { 00019 public: 00020 00021 static const int Type_Potion = 0x0001; 00022 static const int Type_Apparatus = 0x0002; 00023 static const int Type_Armor = 0x0004; 00024 static const int Type_Book = 0x0008; 00025 static const int Type_Clothing = 0x0010; 00026 static const int Type_Ingredient = 0x0020; 00027 static const int Type_Light = 0x0040; 00028 static const int Type_Lockpick = 0x0080; 00029 static const int Type_Miscellaneous = 0x0100; 00030 static const int Type_Probe = 0x0200; 00031 static const int Type_Repair = 0x0400; 00032 static const int Type_Weapon = 0x0800; 00033 00034 static const int Type_Last = Type_Weapon; 00035 00036 static const int Type_All = 0xffff; 00037 00038 private: 00039 00040 MWWorld::CellRefList<ESM::Potion> potions; 00041 MWWorld::CellRefList<ESM::Apparatus> appas; 00042 MWWorld::CellRefList<ESM::Armor> armors; 00043 MWWorld::CellRefList<ESM::Book> books; 00044 MWWorld::CellRefList<ESM::Clothing> clothes; 00045 MWWorld::CellRefList<ESM::Ingredient> ingreds; 00046 MWWorld::CellRefList<ESM::Light> lights; 00047 MWWorld::CellRefList<ESM::Lockpick> lockpicks; 00048 MWWorld::CellRefList<ESM::Miscellaneous> miscItems; 00049 MWWorld::CellRefList<ESM::Probe> probes; 00050 MWWorld::CellRefList<ESM::Repair> repairs; 00051 MWWorld::CellRefList<ESM::Weapon> weapons; 00052 mutable float mCachedWeight; 00053 mutable bool mWeightUpToDate; 00054 ContainerStoreIterator addImp (const Ptr& ptr); 00055 void addInitialItem (const std::string& id, const std::string& owner, int count, unsigned char failChance=0, bool topLevel=true); 00056 00057 public: 00058 00059 ContainerStore(); 00060 00061 virtual ~ContainerStore(); 00062 00063 ContainerStoreIterator begin (int mask = Type_All); 00064 00065 ContainerStoreIterator end(); 00066 00067 virtual ContainerStoreIterator add (const Ptr& itemPtr, const Ptr& actorPtr); 00076 00077 ContainerStoreIterator add(const std::string& id, int count, const Ptr& actorPtr); 00079 00080 int remove(const std::string& itemId, int count, const Ptr& actor); 00084 00085 virtual int remove(const Ptr& item, int count, const Ptr& actor); 00089 00090 void unstack (const Ptr& ptr, const Ptr& container); 00092 00093 protected: 00094 ContainerStoreIterator addNewStack (const Ptr& ptr); 00096 00097 virtual void flagAsModified(); 00098 00099 public: 00100 00101 virtual bool stacks (const Ptr& ptr1, const Ptr& ptr2); 00103 00104 void fill (const ESM::InventoryList& items, const std::string& owner, const MWWorld::ESMStore& store); 00106 00107 void clear(); 00109 00110 float getWeight() const; 00112 00113 static int getType (const Ptr& ptr); 00116 00117 Ptr search (const std::string& id); 00118 00119 friend class ContainerStoreIterator; 00120 }; 00121 00125 class ContainerStoreIterator 00126 : public std::iterator<std::forward_iterator_tag, Ptr, std::ptrdiff_t, Ptr *, Ptr&> 00127 { 00128 int mType; 00129 int mMask; 00130 ContainerStore *mContainer; 00131 mutable Ptr mPtr; 00132 00133 MWWorld::CellRefList<ESM::Potion>::List::iterator mPotion; 00134 MWWorld::CellRefList<ESM::Apparatus>::List::iterator mApparatus; 00135 MWWorld::CellRefList<ESM::Armor>::List::iterator mArmor; 00136 MWWorld::CellRefList<ESM::Book>::List::iterator mBook; 00137 MWWorld::CellRefList<ESM::Clothing>::List::iterator mClothing; 00138 MWWorld::CellRefList<ESM::Ingredient>::List::iterator mIngredient; 00139 MWWorld::CellRefList<ESM::Light>::List::iterator mLight; 00140 MWWorld::CellRefList<ESM::Lockpick>::List::iterator mLockpick; 00141 MWWorld::CellRefList<ESM::Miscellaneous>::List::iterator mMiscellaneous; 00142 MWWorld::CellRefList<ESM::Probe>::List::iterator mProbe; 00143 MWWorld::CellRefList<ESM::Repair>::List::iterator mRepair; 00144 MWWorld::CellRefList<ESM::Weapon>::List::iterator mWeapon; 00145 00146 private: 00147 00148 ContainerStoreIterator (ContainerStore *container); 00150 00151 ContainerStoreIterator (int mask, ContainerStore *container); 00153 00154 // construct iterator using a CellRefList iterator 00155 ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList<ESM::Potion>::List::iterator); 00156 ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList<ESM::Apparatus>::List::iterator); 00157 ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList<ESM::Armor>::List::iterator); 00158 ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList<ESM::Book>::List::iterator); 00159 ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList<ESM::Clothing>::List::iterator); 00160 ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList<ESM::Ingredient>::List::iterator); 00161 ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList<ESM::Light>::List::iterator); 00162 ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList<ESM::Lockpick>::List::iterator); 00163 ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList<ESM::Miscellaneous>::List::iterator); 00164 ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList<ESM::Probe>::List::iterator); 00165 ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList<ESM::Repair>::List::iterator); 00166 ContainerStoreIterator (ContainerStore *container, MWWorld::CellRefList<ESM::Weapon>::List::iterator); 00167 00168 void incType(); 00169 00170 void nextType(); 00171 00172 bool resetIterator(); 00176 00177 bool incIterator(); 00181 00182 public: 00183 00184 Ptr *operator->() const; 00185 00186 Ptr operator*() const; 00187 00188 ContainerStoreIterator& operator++(); 00189 00190 ContainerStoreIterator operator++ (int); 00191 00192 bool isEqual (const ContainerStoreIterator& iter) const; 00193 00194 int getType() const; 00195 00196 const ContainerStore *getContainerStore() const; 00197 00198 friend class ContainerStore; 00199 }; 00200 00201 bool operator== (const ContainerStoreIterator& left, const ContainerStoreIterator& right); 00202 bool operator!= (const ContainerStoreIterator& left, const ContainerStoreIterator& right); 00203 } 00204 00205 #endif