3 Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU Lesser General Public License as published by
7 the Free Software Foundation; either version 2.1 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU Lesser General Public License for more details.
15 You should have received a copy of the GNU Lesser General Public License along
16 with this program; if not, write to the Free Software Foundation, Inc.,
17 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #ifndef CRAFTDEF_HEADER
21 #define CRAFTDEF_HEADER
28 #include "inventory.h"
33 The crafting method depends on the inventory list
34 that the crafting input comes from.
40 // Cooking something in a furnace
42 // Using something as fuel for a furnace
47 Input: The contents of the crafting slots, arranged in matrix form
53 std::vector<ItemStack> items;
56 method(CRAFT_METHOD_NORMAL), width(0), items()
58 CraftInput(CraftMethod method_, unsigned int width_,
59 const std::vector<ItemStack> &items_):
60 method(method_), width(width_), items(items_)
62 std::string dump() const;
66 Output: Result of crafting operation
70 // Used for normal crafting and cooking, itemstring
72 // Used for cooking (cook time) and fuel (burn time), seconds
78 CraftOutput(std::string item_, float time_):
79 item(item_), time(time_)
81 std::string dump() const;
85 A list of replacements. A replacement indicates that a specific
86 input item should not be deleted (when crafting) but replaced with
87 a different item. Each replacements is a pair (itemstring to remove,
88 itemstring to replace with)
90 Example: If ("bucket:bucket_water", "bucket:bucket_empty") is a
91 replacement pair, the crafting input slot that contained a water
92 bucket will contain an empty bucket after crafting.
94 Note: replacements only work correctly when stack_max of the item
95 to be replaced is 1. It is up to the mod writer to ensure this.
97 struct CraftReplacements
99 // List of replacements
100 std::vector<std::pair<std::string, std::string> > pairs;
105 CraftReplacements(std::vector<std::pair<std::string, std::string> > pairs_):
108 std::string dump() const;
109 void serialize(std::ostream &os) const;
110 void deSerialize(std::istream &is);
114 Crafting definition base class
116 class CraftDefinition
120 virtual ~CraftDefinition(){}
122 void serialize(std::ostream &os) const;
123 static CraftDefinition* deSerialize(std::istream &is);
125 // Returns type of crafting definition
126 virtual std::string getName() const=0;
128 // Checks whether the recipe is applicable
129 virtual bool check(const CraftInput &input, IGameDef *gamedef) const=0;
130 // Returns the output structure, meaning depends on crafting method
131 // The implementation can assume that check(input) returns true
132 virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const=0;
133 // the inverse of the above
134 virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const=0;
135 // Decreases count of every input item
136 virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const=0;
138 virtual std::string dump() const=0;
141 virtual void serializeBody(std::ostream &os) const=0;
142 virtual void deSerializeBody(std::istream &is, int version)=0;
146 A plain-jane (shaped) crafting definition
148 Supported crafting method: CRAFT_METHOD_NORMAL.
149 Requires the input items to be arranged exactly like in the recipe.
151 class CraftDefinitionShaped: public CraftDefinition
154 CraftDefinitionShaped():
155 output(""), width(1), recipe(), replacements()
157 CraftDefinitionShaped(
158 const std::string &output_,
160 const std::vector<std::string> &recipe_,
161 const CraftReplacements &replacements_):
162 output(output_), width(width_), recipe(recipe_), replacements(replacements_)
164 virtual ~CraftDefinitionShaped(){}
166 virtual std::string getName() const;
167 virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
168 virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
169 virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
170 virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const;
172 virtual std::string dump() const;
175 virtual void serializeBody(std::ostream &os) const;
176 virtual void deSerializeBody(std::istream &is, int version);
183 // Recipe matrix (itemstrings)
184 std::vector<std::string> recipe;
185 // Replacement items for decrementInput()
186 CraftReplacements replacements;
190 A shapeless crafting definition
191 Supported crafting method: CRAFT_METHOD_NORMAL.
192 Input items can arranged in any way.
194 class CraftDefinitionShapeless: public CraftDefinition
197 CraftDefinitionShapeless():
198 output(""), recipe(), replacements()
200 CraftDefinitionShapeless(
201 const std::string &output_,
202 const std::vector<std::string> &recipe_,
203 const CraftReplacements &replacements_):
204 output(output_), recipe(recipe_), replacements(replacements_)
206 virtual ~CraftDefinitionShapeless(){}
208 virtual std::string getName() const;
209 virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
210 virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
211 virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
212 virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const;
214 virtual std::string dump() const;
217 virtual void serializeBody(std::ostream &os) const;
218 virtual void deSerializeBody(std::istream &is, int version);
223 // Recipe list (itemstrings)
224 std::vector<std::string> recipe;
225 // Replacement items for decrementInput()
226 CraftReplacements replacements;
230 Tool repair crafting definition
231 Supported crafting method: CRAFT_METHOD_NORMAL.
232 Put two damaged tools into the crafting grid, get one tool back.
233 There should only be one crafting definition of this type.
235 class CraftDefinitionToolRepair: public CraftDefinition
238 CraftDefinitionToolRepair():
241 CraftDefinitionToolRepair(float additional_wear_):
242 additional_wear(additional_wear_)
244 virtual ~CraftDefinitionToolRepair(){}
246 virtual std::string getName() const;
247 virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
248 virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
249 virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
250 virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const;
252 virtual std::string dump() const;
255 virtual void serializeBody(std::ostream &os) const;
256 virtual void deSerializeBody(std::istream &is, int version);
259 // This is a constant that is added to the wear of the result.
260 // May be positive or negative, allowed range [-1,1].
261 // 1 = new tool is completely broken
262 // 0 = simply add remaining uses of both input tools
263 // -1 = new tool is completely pristine
264 float additional_wear;
268 A cooking (in furnace) definition
269 Supported crafting method: CRAFT_METHOD_COOKING.
271 class CraftDefinitionCooking: public CraftDefinition
274 CraftDefinitionCooking():
275 output(""), recipe(""), cooktime()
277 CraftDefinitionCooking(
278 const std::string &output_,
279 const std::string &recipe_,
281 const CraftReplacements &replacements_):
282 output(output_), recipe(recipe_), cooktime(cooktime_), replacements(replacements_)
284 virtual ~CraftDefinitionCooking(){}
286 virtual std::string getName() const;
287 virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
288 virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
289 virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
290 virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const;
292 virtual std::string dump() const;
295 virtual void serializeBody(std::ostream &os) const;
296 virtual void deSerializeBody(std::istream &is, int version);
305 // Replacement items for decrementInput()
306 CraftReplacements replacements;
310 A fuel (for furnace) definition
311 Supported crafting method: CRAFT_METHOD_FUEL.
313 class CraftDefinitionFuel: public CraftDefinition
316 CraftDefinitionFuel():
317 recipe(""), burntime()
319 CraftDefinitionFuel(std::string recipe_,
321 const CraftReplacements &replacements_):
322 recipe(recipe_), burntime(burntime_), replacements(replacements_)
324 virtual ~CraftDefinitionFuel(){}
326 virtual std::string getName() const;
327 virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
328 virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
329 virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
330 virtual void decrementInput(CraftInput &input, IGameDef *gamedef) const;
332 virtual std::string dump() const;
335 virtual void serializeBody(std::ostream &os) const;
336 virtual void deSerializeBody(std::istream &is, int version);
343 // Replacement items for decrementInput()
344 CraftReplacements replacements;
348 Crafting definition manager
350 class ICraftDefManager
354 virtual ~ICraftDefManager(){}
356 // The main crafting function
357 virtual bool getCraftResult(CraftInput &input, CraftOutput &output,
358 bool decrementInput, IGameDef *gamedef) const=0;
359 virtual bool getCraftRecipe(CraftInput &input, CraftOutput &output,
360 IGameDef *gamedef) const=0;
361 virtual std::vector<CraftDefinition*> getCraftRecipes(CraftOutput &output,
362 IGameDef *gamedef) const=0;
364 // Print crafting recipes for debugging
365 virtual std::string dump() const=0;
367 virtual void serialize(std::ostream &os) const=0;
370 class IWritableCraftDefManager : public ICraftDefManager
373 IWritableCraftDefManager(){}
374 virtual ~IWritableCraftDefManager(){}
376 // The main crafting function
377 virtual bool getCraftResult(CraftInput &input, CraftOutput &output,
378 bool decrementInput, IGameDef *gamedef) const=0;
379 virtual bool getCraftRecipe(CraftInput &input, CraftOutput &output,
380 IGameDef *gamedef) const=0;
381 virtual std::vector<CraftDefinition*> getCraftRecipes(CraftOutput &output,
382 IGameDef *gamedef) const=0;
384 // Print crafting recipes for debugging
385 virtual std::string dump() const=0;
387 // Add a crafting definition.
388 // After calling this, the pointer belongs to the manager.
389 virtual void registerCraft(CraftDefinition *def)=0;
390 // Delete all crafting definitions
391 virtual void clear()=0;
393 virtual void serialize(std::ostream &os) const=0;
394 virtual void deSerialize(std::istream &is)=0;
397 IWritableCraftDefManager* createCraftDefManager();