Falling sand and gravel
[oweals/minetest.git] / src / inventory.h
index 29b97ccad95b6e2be7dc5ddf343b03846e728069..d6049f52fd9ca0fb943da77b8fd0c5453413dfeb 100644 (file)
@@ -51,11 +51,11 @@ public:
        virtual std::string getImageBasename() const { return ""; }
 #ifndef SERVER
        // Shall return an image of the item (or NULL)
-       virtual video::ITexture * getImage(ITextureSource *tsrc) const
+       virtual video::ITexture * getImage() const
                { return NULL; }
        // Shall return an image of the item without embellishments (or NULL)
-       virtual video::ITexture * getImageRaw(ITextureSource *tsrc) const
-               { return getImage(tsrc); }
+       virtual video::ITexture * getImageRaw() const
+               { return getImage(); }
 #endif
        // Shall return a text to show in the GUI
        virtual std::string getText() { return ""; }
@@ -70,25 +70,26 @@ public:
                Quantity methods
        */
 
-       // Shall return true if the item can be add()ed to the other
+       // Return true if the item can be add()ed to the other
        virtual bool addableTo(const InventoryItem *other) const
-       {
-               return false;
-       }
+       { return false; }
+       // Return true if the other item contains this item
+       virtual bool isSubsetOf(const InventoryItem *other) const
+       { return false; }
+       // Remove the other item from this one if possible and return true
+       // Return false if not possible
+       virtual bool removeOther(const InventoryItem *other)
+       { return false; }
        
        u16 getCount() const
-       {
-               return m_count;
-       }
+       { return m_count; }
        void setCount(u16 count)
-       {
-               m_count = count;
-       }
+       { m_count = count; }
+
        // This should return something else for stackable items
        virtual u16 freeSpace() const
-       {
-               return 0;
-       }
+       { return 0; }
+
        void add(u16 count)
        {
                assert(m_count + count <= QUANTITY_ITEM_MAX_COUNT);
@@ -106,10 +107,12 @@ public:
 
        // Whether it can be cooked
        virtual bool isCookable() const {return false;}
-       // Time of cooking
-       virtual float getCookTime(){return 3.0;}
        // Result of cooking (can randomize)
        virtual InventoryItem *createCookResult() const {return NULL;}
+       // Time of cooking
+       virtual float getCookTime() const {return 3.0;}
+       // Whether it can be burned (<0 = cannot be burned)
+       virtual float getBurnTime() const {return -1;}
        
        // Eat, press, activate, whatever.
        // Called when item is right-clicked when lying on ground.
@@ -125,11 +128,9 @@ protected:
 class MaterialItem : public InventoryItem
 {
 public:
-       MaterialItem(IGameDef *gamedef, content_t content, u16 count):
-               InventoryItem(gamedef, count)
-       {
-               m_content = content;
-       }
+       MaterialItem(IGameDef *gamedef, std::string nodename, u16 count);
+       // Legacy constructor
+       MaterialItem(IGameDef *gamedef, content_t content, u16 count);
        /*
                Implementation interface
        */
@@ -139,19 +140,18 @@ public:
        }
        virtual void serialize(std::ostream &os) const
        {
-               //os.imbue(std::locale("C"));
-               os<<"MaterialItem2";
-               os<<" ";
-               os<<(unsigned int)m_content;
-               os<<" ";
+               os<<"NodeItem";
+               os<<" \"";
+               os<<m_nodename;
+               os<<"\" ";
                os<<m_count;
        }
        virtual InventoryItem* clone()
        {
-               return new MaterialItem(m_gamedef, m_content, m_count);
+               return new MaterialItem(m_gamedef, m_nodename, m_count);
        }
 #ifndef SERVER
-       video::ITexture * getImage(ITextureSource *tsrc) const;
+       video::ITexture * getImage() const;
 #endif
        std::string getText()
        {
@@ -165,10 +165,28 @@ public:
                if(std::string(other->getName()) != "MaterialItem")
                        return false;
                MaterialItem *m = (MaterialItem*)other;
-               if(m->getMaterial() != m_content)
+               if(m->m_nodename != m_nodename)
+                       return false;
+               return true;
+       }
+       virtual bool isSubsetOf(const InventoryItem *other) const
+       {
+               if(std::string(other->getName()) != "MaterialItem")
+                       return false;
+               MaterialItem *m = (MaterialItem*)other;
+               if(m->m_nodename != m_nodename)
                        return false;
+               return m_count <= m->m_count;
+       }
+       virtual bool removeOther(const InventoryItem *other)
+       {
+               if(!other->isSubsetOf(this))
+                       return false;
+               MaterialItem *m = (MaterialItem*)other;
+               m_count += m->m_count;
                return true;
        }
+
        u16 freeSpace() const
        {
                if(m_count > QUANTITY_ITEM_MAX_COUNT)
@@ -180,15 +198,16 @@ public:
        */
        bool isCookable() const;
        InventoryItem *createCookResult() const;
+       float getCookTime() const;
+       float getBurnTime() const;
        /*
-               Special methods
+               Special properties (not part of virtual interface)
        */
-       content_t getMaterial()
-       {
-               return m_content;
-       }
+       std::string getNodeName() const
+       { return m_nodename; }
+       content_t getMaterial() const;
 private:
-       content_t m_content;
+       std::string m_nodename;
 };
 
 /*
@@ -214,9 +233,9 @@ public:
        virtual void serialize(std::ostream &os) const
        {
                os<<getName();
-               os<<" ";
+               os<<" \"";
                os<<m_subname;
-               os<<" ";
+               os<<"\" ";
                os<<m_count;
        }
        virtual InventoryItem* clone()
@@ -224,7 +243,7 @@ public:
                return new CraftItem(m_gamedef, m_subname, m_count);
        }
 #ifndef SERVER
-       video::ITexture * getImage(ITextureSource *tsrc) const;
+       video::ITexture * getImage() const;
 #endif
        std::string getText()
        {
@@ -245,6 +264,24 @@ public:
                        return false;
                return true;
        }
+       virtual bool isSubsetOf(const InventoryItem *other) const
+       {
+               if(std::string(other->getName()) != "CraftItem")
+                       return false;
+               CraftItem *m = (CraftItem*)other;
+               if(m->m_subname != m_subname)
+                       return false;
+               return m_count <= m->m_count;
+       }
+       virtual bool removeOther(const InventoryItem *other)
+       {
+               if(!other->isSubsetOf(this))
+                       return false;
+               CraftItem *m = (CraftItem*)other;
+               m_count += m->m_count;
+               return true;
+       }
+
        u16 freeSpace() const
        {
                if(m_count > QUANTITY_ITEM_MAX_COUNT)
@@ -258,6 +295,8 @@ public:
 
        bool isCookable() const;
        InventoryItem *createCookResult() const;
+       float getCookTime() const;
+       float getBurnTime() const;
 
        bool use(ServerEnvironment *env, ServerActiveObject *user);
        
@@ -291,9 +330,9 @@ public:
        virtual void serialize(std::ostream &os) const
        {
                os<<getName();
-               os<<" ";
+               os<<" \"";
                os<<m_toolname;
-               os<<" ";
+               os<<"\" ";
                os<<m_wear;
        }
        virtual InventoryItem* clone()
@@ -303,30 +342,33 @@ public:
 
        std::string getImageBasename() const;
 #ifndef SERVER
-       video::ITexture * getImage(ITextureSource *tsrc) const;
-       video::ITexture * getImageRaw(ITextureSource *tsrc) const;
+       video::ITexture * getImage() const;
+       video::ITexture * getImageRaw() const;
 #endif
 
        std::string getText()
        {
                return "";
-               
-               /*std::ostringstream os;
-               u16 f = 4;
-               u16 d = 65535/f;
-               u16 i;
-               for(i=0; i<(65535-m_wear)/d; i++)
-                       os<<'X';
-               for(; i<f; i++)
-                       os<<'-';
-               return os.str();*/
-               
-               /*std::ostringstream os;
-               os<<m_toolname;
-               os<<" ";
-               os<<(m_wear/655);
-               return os.str();*/
        }
+
+       virtual bool isSubsetOf(const InventoryItem *other) const
+       {
+               if(std::string(other->getName()) != "ToolItem")
+                       return false;
+               ToolItem *m = (ToolItem*)other;
+               if(m->m_toolname != m_toolname)
+                       return false;
+               return m_wear <= m->m_wear;
+       }
+       virtual bool removeOther(const InventoryItem *other)
+       {
+               if(!other->isSubsetOf(this))
+                       return false;
+               ToolItem *m = (ToolItem*)other;
+               m_wear -= m->m_wear;
+               return true;
+       }
+
        /*
                Special methods
        */
@@ -520,27 +562,8 @@ struct IMoveAction : public InventoryAction
                from_i = -1;
                to_i = -1;
        }
-       IMoveAction(std::istream &is)
-       {
-               std::string ts;
-
-               std::getline(is, ts, ' ');
-               count = stoi(ts);
-
-               std::getline(is, from_inv, ' ');
-
-               std::getline(is, from_list, ' ');
-
-               std::getline(is, ts, ' ');
-               from_i = stoi(ts);
-
-               std::getline(is, to_inv, ' ');
-
-               std::getline(is, to_list, ' ');
-
-               std::getline(is, ts, ' ');
-               to_i = stoi(ts);
-       }
+       
+       IMoveAction(std::istream &is);
 
        u16 getType() const
        {
@@ -608,5 +631,12 @@ struct ItemSpec
 */
 bool checkItemCombination(const InventoryItem * const*items, const ItemSpec *specs);
 
+/*
+       items: a pointer to an array of 9 pointers to items
+       specs: a pointer to an array of 9 pointers to items
+*/
+bool checkItemCombination(const InventoryItem * const * items,
+               const InventoryItem * const * specs);
+
 #endif