]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - src/craftdef.h
Fix --color command line parameter ignorance (#7173)
[dragonfireclient.git] / src / craftdef.h
index eb3cd7e391486e8a9530d2043ed1c5bf270ba5ce..46ee2164e6057f9bc7fffe527ea548ff92fc9156 100644 (file)
@@ -17,8 +17,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 */
 
-#ifndef CRAFTDEF_HEADER
-#define CRAFTDEF_HEADER
+#pragma once
 
 #include <string>
 #include <iostream>
@@ -43,22 +42,44 @@ 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
 */
 struct CraftInput
 {
-       CraftMethod method;
-       unsigned int width;
+       CraftMethod method = CRAFT_METHOD_NORMAL;
+       unsigned int width = 0;
        std::vector<ItemStack> items;
 
-       CraftInput():
-               method(CRAFT_METHOD_NORMAL), width(0), items()
-       {}
+       CraftInput() = default;
+
        CraftInput(CraftMethod method_, unsigned int width_,
                        const std::vector<ItemStack> &items_):
                method(method_), width(width_), items(items_)
        {}
+
        std::string dump() const;
 };
 
@@ -68,14 +89,13 @@ struct CraftInput
 struct CraftOutput
 {
        // Used for normal crafting and cooking, itemstring
-       std::string item;
+       std::string item = "";
        // Used for cooking (cook time) and fuel (burn time), seconds
-       float time;
+       float time = 0.0f;
 
-       CraftOutput():
-               item(""), time(0)
-       {}
-       CraftOutput(std::string item_, float time_):
+       CraftOutput() = default;
+
+       CraftOutput(const std::string &item_, float time_):
                item(item_), time(time_)
        {}
        std::string dump() const;
@@ -99,15 +119,11 @@ struct CraftReplacements
        // List of replacements
        std::vector<std::pair<std::string, std::string> > pairs;
 
-       CraftReplacements():
-               pairs()
-       {}
-       CraftReplacements(std::vector<std::pair<std::string, std::string> > pairs_):
+       CraftReplacements() = default;
+       CraftReplacements(const std::vector<std::pair<std::string, std::string> > &pairs_):
                pairs(pairs_)
        {}
        std::string dump() const;
-       void serialize(std::ostream &os) const;
-       void deSerialize(std::istream &is);
 };
 
 /*
@@ -116,11 +132,8 @@ struct CraftReplacements
 class CraftDefinition
 {
 public:
-       CraftDefinition(){}
-       virtual ~CraftDefinition(){}
-
-       void serialize(std::ostream &os) const;
-       static CraftDefinition* deSerialize(std::istream &is);
+       CraftDefinition() = default;
+       virtual ~CraftDefinition() = default;
 
        // Returns type of crafting definition
        virtual std::string getName() const=0;
@@ -133,13 +146,16 @@ class CraftDefinition
        // 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;
 };
 
 /*
@@ -151,37 +167,43 @@ class CraftDefinition
 class CraftDefinitionShaped: public CraftDefinition
 {
 public:
-       CraftDefinitionShaped():
-               output(""), width(1), recipe(), replacements()
-       {}
+       CraftDefinitionShaped() = delete;
+
        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_),
+               replacements(replacements_)
        {}
-       virtual ~CraftDefinitionShaped(){}
+       virtual ~CraftDefinitionShaped() = default;
 
        virtual std::string getName() const;
        virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
        virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
        virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
-       virtual void decrementInput(CraftInput &input, 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;
+       std::string output = "";
        // Width of recipe
-       unsigned int width;
+       unsigned int width = 1;
        // 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 = false;
        // Replacement items for decrementInput()
        CraftReplacements replacements;
 };
@@ -194,34 +216,38 @@ class CraftDefinitionShaped: public CraftDefinition
 class CraftDefinitionShapeless: public CraftDefinition
 {
 public:
-       CraftDefinitionShapeless():
-               output(""), recipe(), replacements()
-       {}
+       CraftDefinitionShapeless() = delete;
        CraftDefinitionShapeless(
                        const std::string &output_,
                        const std::vector<std::string> &recipe_,
                        const CraftReplacements &replacements_):
                output(output_), recipe(recipe_), replacements(replacements_)
        {}
-       virtual ~CraftDefinitionShapeless(){}
+       virtual ~CraftDefinitionShapeless() = default;
 
        virtual std::string getName() const;
        virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
        virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
        virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
-       virtual void decrementInput(CraftInput &input, 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 = false;
        // Replacement items for decrementInput()
        CraftReplacements replacements;
 };
@@ -235,25 +261,25 @@ class CraftDefinitionShapeless: public CraftDefinition
 class CraftDefinitionToolRepair: public CraftDefinition
 {
 public:
-       CraftDefinitionToolRepair():
-               additional_wear(0)
-       {}
+       CraftDefinitionToolRepair() = delete;
        CraftDefinitionToolRepair(float additional_wear_):
                additional_wear(additional_wear_)
        {}
-       virtual ~CraftDefinitionToolRepair(){}
+       virtual ~CraftDefinitionToolRepair() = default;
 
        virtual std::string getName() const;
        virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
        virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
        virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
-       virtual void decrementInput(CraftInput &input, 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.
@@ -261,7 +287,7 @@ class CraftDefinitionToolRepair: public CraftDefinition
        // 1 = new tool is completely broken
        // 0 = simply add remaining uses of both input tools
        // -1 = new tool is completely pristine
-       float additional_wear;
+       float additional_wear = 0.0f;
 };
 
 /*
@@ -271,9 +297,7 @@ class CraftDefinitionToolRepair: public CraftDefinition
 class CraftDefinitionCooking: public CraftDefinition
 {
 public:
-       CraftDefinitionCooking():
-               output(""), recipe(""), cooktime()
-       {}
+       CraftDefinitionCooking() = delete;
        CraftDefinitionCooking(
                        const std::string &output_,
                        const std::string &recipe_,
@@ -281,25 +305,31 @@ class CraftDefinitionCooking: public CraftDefinition
                        const CraftReplacements &replacements_):
                output(output_), recipe(recipe_), cooktime(cooktime_), replacements(replacements_)
        {}
-       virtual ~CraftDefinitionCooking(){}
+       virtual ~CraftDefinitionCooking() = default;
 
        virtual std::string getName() const;
        virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
        virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
        virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
-       virtual void decrementInput(CraftInput &input, 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 itemstring
        std::string recipe;
+       // Recipe item name
+       std::string recipe_name;
+       // bool indicating if initHash has been called already
+       bool hash_inited = false;
        // Time in seconds
        float cooktime;
        // Replacement items for decrementInput()
@@ -313,31 +343,35 @@ class CraftDefinitionCooking: public CraftDefinition
 class CraftDefinitionFuel: public CraftDefinition
 {
 public:
-       CraftDefinitionFuel():
-               recipe(""), burntime()
-       {}
-       CraftDefinitionFuel(std::string recipe_,
+       CraftDefinitionFuel() = delete;
+       CraftDefinitionFuel(const std::string &recipe_,
                        float burntime_,
                        const CraftReplacements &replacements_):
                recipe(recipe_), burntime(burntime_), replacements(replacements_)
        {}
-       virtual ~CraftDefinitionFuel(){}
+       virtual ~CraftDefinitionFuel() = default;
 
        virtual std::string getName() const;
        virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
        virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
        virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
-       virtual void decrementInput(CraftInput &input, 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:
        // Recipe itemstring
        std::string recipe;
+       // Recipe item name
+       std::string recipe_name;
+       // bool indicating if initHash has been called already
+       bool hash_inited = false;
        // Time in seconds
        float burntime;
        // Replacement items for decrementInput()
@@ -350,47 +384,49 @@ class CraftDefinitionFuel: public CraftDefinition
 class ICraftDefManager
 {
 public:
-       ICraftDefManager(){}
-       virtual ~ICraftDefManager(){}
+       ICraftDefManager() = default;
+       virtual ~ICraftDefManager() = default;
 
        // The main crafting function
        virtual bool getCraftResult(CraftInput &input, CraftOutput &output,
+                       std::vector<ItemStack> &output_replacements,
                        bool decrementInput, IGameDef *gamedef) const=0;
-       virtual bool getCraftRecipe(CraftInput &input, CraftOutput &output,
-                       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
 {
 public:
-       IWritableCraftDefManager(){}
-       virtual ~IWritableCraftDefManager(){}
+       IWritableCraftDefManager() = default;
+       virtual ~IWritableCraftDefManager() = default;
 
        // The main crafting function
        virtual bool getCraftResult(CraftInput &input, CraftOutput &output,
+                       std::vector<ItemStack> &output_replacements,
                        bool decrementInput, IGameDef *gamedef) const=0;
-       virtual bool getCraftRecipe(CraftInput &input, CraftOutput &output,
-                       IGameDef *gamedef) const=0;
+       virtual std::vector<CraftDefinition*> getCraftRecipes(CraftOutput &output,
+                       IGameDef *gamedef, unsigned limit=0) const=0;
+
+       virtual bool clearCraftRecipesByOutput(const CraftOutput &output, IGameDef *gamedef) = 0;
+       virtual bool clearCraftRecipesByInput(CraftMethod craft_method,
+                       unsigned int craft_grid_width, const std::vector<std::string> &recipe, IGameDef *gamedef) = 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();
-
-#endif
-