+/*
+ Crafting definition base class
+*/
+class CraftDefinition
+{
+public:
+ 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;
+
+ // Checks whether the recipe is applicable
+ virtual bool check(const CraftInput &input, IGameDef *gamedef) const=0;
+ // 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 std::string dump() const=0;
+
+protected:
+ virtual void serializeBody(std::ostream &os) const=0;
+ virtual void deSerializeBody(std::istream &is, int version)=0;
+};
+
+/*
+ A plain-jane (shaped) crafting definition
+
+ Supported crafting method: CRAFT_METHOD_NORMAL.
+ Requires the input items to be arranged exactly like in the recipe.
+*/
+class CraftDefinitionShaped: public CraftDefinition
+{
+public:
+ CraftDefinitionShaped():
+ output(""), width(1), recipe(), 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_)
+ {}
+ 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 CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
+ virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const;
+
+ virtual std::string dump() const;
+
+protected:
+ virtual void serializeBody(std::ostream &os) const;
+ virtual void deSerializeBody(std::istream &is, int version);
+
+private:
+ // Output itemstring
+ std::string output;
+ // Width of recipe
+ unsigned int width;
+ // Recipe matrix (itemstrings)
+ std::vector<std::string> recipe;
+ // Replacement items for decrementInput()
+ CraftReplacements replacements;
+};
+
+/*
+ A shapeless crafting definition
+ Supported crafting method: CRAFT_METHOD_NORMAL.
+ Input items can arranged in any way.
+*/
+class CraftDefinitionShapeless: public CraftDefinition
+{
+public:
+ CraftDefinitionShapeless():
+ output(""), recipe(), replacements()
+ {}
+ CraftDefinitionShapeless(
+ const std::string &output_,
+ const std::vector<std::string> &recipe_,
+ const CraftReplacements &replacements_):
+ output(output_), recipe(recipe_), 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 CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
+ virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const;
+
+ virtual std::string dump() const;
+
+protected:
+ virtual void serializeBody(std::ostream &os) const;
+ virtual void deSerializeBody(std::istream &is, int version);
+
+private:
+ // Output itemstring
+ std::string output;
+ // Recipe list (itemstrings)
+ std::vector<std::string> recipe;
+ // Replacement items for decrementInput()
+ CraftReplacements replacements;
+};
+
+/*
+ Tool repair crafting definition
+ Supported crafting method: CRAFT_METHOD_NORMAL.
+ Put two damaged tools into the crafting grid, get one tool back.
+ There should only be one crafting definition of this type.
+*/
+class CraftDefinitionToolRepair: public CraftDefinition
+{
+public:
+ CraftDefinitionToolRepair():
+ additional_wear(0)
+ {}
+ CraftDefinitionToolRepair(float additional_wear_):
+ additional_wear(additional_wear_)
+ {}
+ virtual ~CraftDefinitionToolRepair(){}
+
+ 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 std::string dump() const;
+
+protected:
+ virtual void serializeBody(std::ostream &os) const;
+ virtual void deSerializeBody(std::istream &is, int version);
+
+private:
+ // This is a constant that is added to the wear of the result.
+ // May be positive or negative, allowed range [-1,1].
+ // 1 = new tool is completely broken
+ // 0 = simply add remaining uses of both input tools
+ // -1 = new tool is completely pristine
+ float additional_wear;
+};
+
+/*
+ A cooking (in furnace) definition
+ Supported crafting method: CRAFT_METHOD_COOKING.
+*/
+class CraftDefinitionCooking: public CraftDefinition
+{
+public:
+ CraftDefinitionCooking():
+ output(""), recipe(""), cooktime()
+ {}
+ CraftDefinitionCooking(
+ const std::string &output_,
+ const std::string &recipe_,
+ float cooktime_,
+ const CraftReplacements &replacements_):
+ output(output_), recipe(recipe_), 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 CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
+ virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const;
+
+ virtual std::string dump() const;
+
+protected:
+ virtual void serializeBody(std::ostream &os) const;
+ virtual void deSerializeBody(std::istream &is, int version);
+
+private:
+ // Output itemstring
+ std::string output;
+ // Recipe itemstring
+ std::string recipe;
+ // Time in seconds
+ float cooktime;
+ // Replacement items for decrementInput()
+ CraftReplacements replacements;
+};
+
+/*
+ A fuel (for furnace) definition
+ Supported crafting method: CRAFT_METHOD_FUEL.
+*/
+class CraftDefinitionFuel: public CraftDefinition
+{
+public:
+ CraftDefinitionFuel():
+ recipe(""), burntime()
+ {}
+ CraftDefinitionFuel(std::string recipe_,
+ float burntime_,
+ const CraftReplacements &replacements_):
+ recipe(recipe_), 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 CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
+ virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const;
+
+ virtual std::string dump() const;
+
+protected:
+ virtual void serializeBody(std::ostream &os) const;
+ virtual void deSerializeBody(std::istream &is, int version);
+
+private:
+ // Recipe itemstring
+ std::string recipe;
+ // Time in seconds
+ float burntime;
+ // Replacement items for decrementInput()
+ CraftReplacements replacements;
+};
+
+/*
+ Crafting definition manager
+*/