OpenMW
apps/openmw/mwworld/containerstore.hpp
Go to the documentation of this file.
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