]> git.lizzy.rs Git - minetest.git/blobdiff - src/craftdef.h
Set acceleration only once in falling node
[minetest.git] / src / craftdef.h
index 57f26f049ce4fd3e995ce6da9233335deb53ca07..cebb2d7ae2d82771b1d174f8704c757ed7f44763 100644 (file)
@@ -1,18 +1,18 @@
 /*
-Minetest-c55
-Copyright (C) 2011 celeron55, Perttu Ahola <celeron55@gmail.com>
+Minetest
+Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
 
 This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or
 (at your option) any later version.
 
 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
+GNU Lesser General Public License for more details.
 
-You should have received a copy of the GNU General Public License along
+You should have received a copy of the GNU Lesser General Public License along
 with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
@@ -43,6 +43,28 @@ enum CraftMethod
        CRAFT_METHOD_FUEL,
 };
 
+/*
+       The type a hash can be. The earlier a type is mentioned in this enum,
+       the earlier it is tried at crafting, and the less likely is a collision.
+       Changing order causes changes in behaviour, so know what you do.
+ */
+enum CraftHashType
+{
+       // Hashes the normalized names of the recipe's elements.
+       // Only recipes without group usage can be found here,
+       // because groups can't be guessed efficiently.
+       CRAFT_HASH_TYPE_ITEM_NAMES,
+
+       // Counts the non-empty slots.
+       CRAFT_HASH_TYPE_COUNT,
+
+       // This layer both spares an extra variable, and helps to retain (albeit rarely used) functionality. Maps to 0.
+       // Before hashes are "initialized", all hashes reside here, after initialisation, none are.
+       CRAFT_HASH_TYPE_UNHASHED
+
+};
+const int craft_hash_type_max = (int) CRAFT_HASH_TYPE_UNHASHED;
+
 /*
        Input: The contents of the crafting slots, arranged in matrix form
 */
@@ -117,9 +139,6 @@ class CraftDefinition
        CraftDefinition(){}
        virtual ~CraftDefinition(){}
 
-       void serialize(std::ostream &os) const;
-       static CraftDefinition* deSerialize(std::istream &is);
-
        // Returns type of crafting definition
        virtual std::string getName() const=0;
 
@@ -128,14 +147,19 @@ class CraftDefinition
        // Returns the output structure, meaning depends on crafting method
        // The implementation can assume that check(input) returns true
        virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const=0;
+       // the inverse of the above
+       virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const=0;
        // Decreases count of every input item
-       virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const=0;
+       virtual void decrementInput(CraftInput &input,
+               std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const=0;
 
-       virtual std::string dump() const=0;
+       virtual CraftHashType getHashType() const = 0;
+       virtual u64 getHash(CraftHashType type) const = 0;
 
-protected:
-       virtual void serializeBody(std::ostream &os) const=0;
-       virtual void deSerializeBody(std::istream &is, int version)=0;
+       // to be called after all mods are loaded, so that we catch all aliases
+       virtual void initHash(IGameDef *gamedef) = 0;
+
+       virtual std::string dump() const=0;
 };
 
 /*
@@ -148,27 +172,31 @@ class CraftDefinitionShaped: public CraftDefinition
 {
 public:
        CraftDefinitionShaped():
-               output(""), width(1), recipe(), replacements()
+               output(""), width(1), recipe(), hash_inited(false), replacements()
        {}
        CraftDefinitionShaped(
                        const std::string &output_,
                        unsigned int width_,
                        const std::vector<std::string> &recipe_,
                        const CraftReplacements &replacements_):
-               output(output_), width(width_), recipe(recipe_), replacements(replacements_)
+               output(output_), width(width_), recipe(recipe_),
+               hash_inited(false), replacements(replacements_)
        {}
        virtual ~CraftDefinitionShaped(){}
 
        virtual std::string getName() const;
        virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
        virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
-       virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const;
+       virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
+       virtual void decrementInput(CraftInput &input,
+               std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const;
 
-       virtual std::string dump() const;
+       virtual CraftHashType getHashType() const;
+       virtual u64 getHash(CraftHashType type) const;
 
-protected:
-       virtual void serializeBody(std::ostream &os) const;
-       virtual void deSerializeBody(std::istream &is, int version);
+       virtual void initHash(IGameDef *gamedef);
+
+       virtual std::string dump() const;
 
 private:
        // Output itemstring
@@ -177,6 +205,10 @@ class CraftDefinitionShaped: public CraftDefinition
        unsigned int width;
        // Recipe matrix (itemstrings)
        std::vector<std::string> recipe;
+       // Recipe matrix (item names)
+       std::vector<std::string> recipe_names;
+       // bool indicating if initHash has been called already
+       bool hash_inited;
        // Replacement items for decrementInput()
        CraftReplacements replacements;
 };
@@ -190,32 +222,40 @@ class CraftDefinitionShapeless: public CraftDefinition
 {
 public:
        CraftDefinitionShapeless():
-               output(""), recipe(), replacements()
+               output(""), recipe(), hash_inited(false), replacements()
        {}
        CraftDefinitionShapeless(
                        const std::string &output_,
                        const std::vector<std::string> &recipe_,
                        const CraftReplacements &replacements_):
-               output(output_), recipe(recipe_), replacements(replacements_)
+               output(output_), recipe(recipe_),
+               hash_inited(false), replacements(replacements_)
        {}
        virtual ~CraftDefinitionShapeless(){}
 
        virtual std::string getName() const;
        virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
        virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
-       virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const;
+       virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
+       virtual void decrementInput(CraftInput &input,
+               std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const;
 
-       virtual std::string dump() const;
+       virtual CraftHashType getHashType() const;
+       virtual u64 getHash(CraftHashType type) const;
+
+       virtual void initHash(IGameDef *gamedef);
 
-protected:
-       virtual void serializeBody(std::ostream &os) const;
-       virtual void deSerializeBody(std::istream &is, int version);
+       virtual std::string dump() const;
 
 private:
        // Output itemstring
        std::string output;
        // Recipe list (itemstrings)
        std::vector<std::string> recipe;
+       // Recipe list (item names)
+       std::vector<std::string> recipe_names;
+       // bool indicating if initHash has been called already
+       bool hash_inited;
        // Replacement items for decrementInput()
        CraftReplacements replacements;
 };
@@ -240,13 +280,16 @@ class CraftDefinitionToolRepair: public CraftDefinition
        virtual std::string getName() const;
        virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
        virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
-       virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const;
+       virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
+       virtual void decrementInput(CraftInput &input,
+               std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const;
 
-       virtual std::string dump() const;
+       virtual CraftHashType getHashType() const { return CRAFT_HASH_TYPE_COUNT; }
+       virtual u64 getHash(CraftHashType type) const { return 2; }
 
-protected:
-       virtual void serializeBody(std::ostream &os) const;
-       virtual void deSerializeBody(std::istream &is, int version);
+       virtual void initHash(IGameDef *gamedef) {}
+
+       virtual std::string dump() const;
 
 private:
        // This is a constant that is added to the wear of the result.
@@ -265,34 +308,45 @@ class CraftDefinitionCooking: public CraftDefinition
 {
 public:
        CraftDefinitionCooking():
-               output(""), recipe(""), cooktime()
+               output(""), recipe(""), hash_inited(false), cooktime()
        {}
        CraftDefinitionCooking(
                        const std::string &output_,
                        const std::string &recipe_,
-                       float cooktime_):
-               output(output_), recipe(recipe_), cooktime(cooktime_)
+                       float cooktime_,
+                       const CraftReplacements &replacements_):
+               output(output_), recipe(recipe_), hash_inited(false),
+               cooktime(cooktime_), replacements(replacements_)
        {}
        virtual ~CraftDefinitionCooking(){}
 
        virtual std::string getName() const;
        virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
        virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
-       virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const;
+       virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
+       virtual void decrementInput(CraftInput &input,
+               std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const;
 
-       virtual std::string dump() const;
+       virtual CraftHashType getHashType() const;
+       virtual u64 getHash(CraftHashType type) const;
 
-protected:
-       virtual void serializeBody(std::ostream &os) const;
-       virtual void deSerializeBody(std::istream &is, int version);
+       virtual void initHash(IGameDef *gamedef);
+
+       virtual std::string dump() const;
 
 private:
        // Output itemstring
        std::string output;
        // Recipe itemstring
        std::string recipe;
+       // Recipe item name
+       std::string recipe_name;
+       // bool indicating if initHash has been called already
+       bool hash_inited;
        // Time in seconds
        float cooktime;
+       // Replacement items for decrementInput()
+       CraftReplacements replacements;
 };
 
 /*
@@ -303,29 +357,40 @@ class CraftDefinitionFuel: public CraftDefinition
 {
 public:
        CraftDefinitionFuel():
-               recipe(""), burntime()
+               recipe(""), hash_inited(false), burntime()
        {}
-       CraftDefinitionFuel(std::string recipe_, float burntime_):
-               recipe(recipe_), burntime(burntime_)
+       CraftDefinitionFuel(std::string recipe_,
+                       float burntime_,
+                       const CraftReplacements &replacements_):
+               recipe(recipe_), hash_inited(false), burntime(burntime_), replacements(replacements_)
        {}
        virtual ~CraftDefinitionFuel(){}
 
        virtual std::string getName() const;
        virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
        virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
-       virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const;
+       virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
+       virtual void decrementInput(CraftInput &input,
+               std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const;
 
-       virtual std::string dump() const;
+       virtual CraftHashType getHashType() const;
+       virtual u64 getHash(CraftHashType type) const;
+
+       virtual void initHash(IGameDef *gamedef);
 
-protected:
-       virtual void serializeBody(std::ostream &os) const;
-       virtual void deSerializeBody(std::istream &is, int version);
+       virtual std::string dump() const;
 
 private:
        // Recipe itemstring
        std::string recipe;
+       // Recipe item name
+       std::string recipe_name;
+       // bool indicating if initHash has been called already
+       bool hash_inited;
        // Time in seconds
        float burntime;
+       // Replacement items for decrementInput()
+       CraftReplacements replacements;
 };
 
 /*
@@ -339,12 +404,13 @@ class ICraftDefManager
 
        // The main crafting function
        virtual bool getCraftResult(CraftInput &input, CraftOutput &output,
+                       std::vector<ItemStack> &output_replacements,
                        bool decrementInput, IGameDef *gamedef) const=0;
-       
+       virtual std::vector<CraftDefinition*> getCraftRecipes(CraftOutput &output,
+                       IGameDef *gamedef, unsigned limit=0) const=0;
+
        // Print crafting recipes for debugging
        virtual std::string dump() const=0;
-
-       virtual void serialize(std::ostream &os) const=0;
 };
 
 class IWritableCraftDefManager : public ICraftDefManager
@@ -355,19 +421,23 @@ class IWritableCraftDefManager : public ICraftDefManager
 
        // The main crafting function
        virtual bool getCraftResult(CraftInput &input, CraftOutput &output,
+                       std::vector<ItemStack> &output_replacements,
                        bool decrementInput, IGameDef *gamedef) const=0;
+       virtual std::vector<CraftDefinition*> getCraftRecipes(CraftOutput &output,
+                       IGameDef *gamedef, unsigned limit=0) const=0;
 
        // Print crafting recipes for debugging
        virtual std::string dump() const=0;
 
        // Add a crafting definition.
        // After calling this, the pointer belongs to the manager.
-       virtual void registerCraft(CraftDefinition *def)=0;
+       virtual void registerCraft(CraftDefinition *def, IGameDef *gamedef) = 0;
+
        // Delete all crafting definitions
        virtual void clear()=0;
 
-       virtual void serialize(std::ostream &os) const=0;
-       virtual void deSerialize(std::istream &is)=0;
+       // To be called after all mods are loaded, so that we catch all aliases
+       virtual void initHashes(IGameDef *gamedef) = 0;
 };
 
 IWritableCraftDefManager* createCraftDefManager();