Luanti 5.15.0-dev
 
Loading...
Searching...
No Matches
craftdef.h
Go to the documentation of this file.
1// Luanti
2// SPDX-License-Identifier: LGPL-2.1-or-later
3// Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4
5#pragma once
6
7#include "gamedef.h"
8
9#include <string>
10#include <vector>
11
12struct ItemStack;
13
14/*
15 Crafting methods.
16
17 The crafting method depends on the inventory list
18 that the crafting input comes from.
19*/
21{
22 // Crafting grid
24 // Cooking something in a furnace
26 // Using something as fuel for a furnace
28};
29
30/*
31 The type a hash can be. The earlier a type is mentioned in this enum,
32 the earlier it is tried at crafting, and the less likely is a collision.
33 Changing order causes changes in behavior, so know what you do.
34 */
36{
37 // Hashes the normalized names of the recipe's elements.
38 // Only recipes without group usage can be found here,
39 // because groups can't be guessed efficiently.
41
42 // Counts the non-empty slots.
44
45 // This layer both spares an extra variable, and helps to retain (albeit rarely used) functionality. Maps to 0.
46 // Before hashes are "initialized", all hashes reside here, after initialisation, none are.
48
49};
51
52/*
53 Input: The contents of the crafting slots, arranged in matrix form
54*/
56{
58 unsigned int width = 0;
59 std::vector<ItemStack> items;
60
61 CraftInput() = default;
62
63 CraftInput(CraftMethod method_, unsigned int width_,
64 const std::vector<ItemStack> &items_);
65
66 // Returns true if all items are empty.
67 bool empty() const;
68
69 std::string dump() const;
70};
71
72/*
73 Output: Result of crafting operation
74*/
76{
77 // Used for normal crafting and cooking, itemstring
78 std::string item = "";
79 // Used for cooking (cook time) and fuel (burn time), seconds
80 float time = 0.0f;
81
82 CraftOutput() = default;
83
84 CraftOutput(const std::string &item_, float time_):
85 item(item_), time(time_)
86 {}
87 std::string dump() const;
88};
89
90/*
91 A list of replacements. A replacement indicates that a specific
92 input item should not be deleted (when crafting) but replaced with
93 a different item. Each replacements is a pair (itemstring to remove,
94 itemstring to replace with)
95
96 Example: If ("bucket:bucket_water", "bucket:bucket_empty") is a
97 replacement pair, the crafting input slot that contained a water
98 bucket will contain an empty bucket after crafting.
99*/
101{
102 // List of replacements
103 std::vector<std::pair<std::string, std::string> > pairs;
104
105 CraftReplacements() = default;
106 CraftReplacements(const std::vector<std::pair<std::string, std::string> > &pairs_):
107 pairs(pairs_)
108 {}
109 std::string dump() const;
110};
111
112/*
113 Crafting definition base class
114*/
116{
117public:
118 /*
119 Craft recipe priorities, from low to high
120
121 Recipes are searched from latest to first.
122 If a recipe with higher priority than a previous found one is
123 encountered, it is selected instead.
124 */
134
135 CraftDefinition() = default;
136 virtual ~CraftDefinition() = default;
137
138 // Returns type of crafting definition
139 virtual std::string getName() const=0;
140
141 // Checks whether the recipe is applicable
142 virtual bool check(const CraftInput &input, IGameDef *gamedef) const=0;
144 {
145 return priority;
146 }
147 // Returns the output structure, meaning depends on crafting method
148 // The implementation can assume that check(input) returns true
149 virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const=0;
150 // the inverse of the above
151 virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const=0;
152 // Decreases count of every input item
153 virtual void decrementInput(CraftInput &input,
154 std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const=0;
155
157 {
158 return hash_type;
159 }
160 virtual u64 getHash(CraftHashType type) const = 0;
161
162 // to be called after all mods are loaded, so that we catch all aliases
163 virtual void initHash(IGameDef *gamedef) = 0;
164
165 virtual std::string dump() const=0;
166
167protected:
170};
171
172/*
173 A plain-jane (shaped) crafting definition
174
175 Supported crafting method: CRAFT_METHOD_NORMAL.
176 Requires the input items to be arranged exactly like in the recipe.
177*/
179{
180public:
183 const std::string &output_,
184 unsigned int width_,
185 const std::vector<std::string> &recipe_,
186 const CraftReplacements &replacements_);
187
188 virtual ~CraftDefinitionShaped() = default;
189
190 virtual std::string getName() const;
191 virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
192 virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
193 virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
194 virtual void decrementInput(CraftInput &input,
195 std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const;
196
197 virtual u64 getHash(CraftHashType type) const;
198
199 virtual void initHash(IGameDef *gamedef);
200
201 virtual std::string dump() const;
202
203private:
204 // Output itemstring
205 std::string output = "";
206 // Width of recipe
207 unsigned int width = 1;
208 // Recipe matrix (itemstrings)
209 std::vector<std::string> recipe;
210 // Recipe matrix (item names)
211 std::vector<std::string> recipe_names;
212 // bool indicating if initHash has been called already
213 bool hash_inited = false;
214 // Replacement items for decrementInput()
216};
217
218/*
219 A shapeless crafting definition
220 Supported crafting method: CRAFT_METHOD_NORMAL.
221 Input items can arranged in any way.
222*/
224{
225public:
228 const std::string &output_,
229 const std::vector<std::string> &recipe_,
230 const CraftReplacements &replacements_);
231
232 virtual ~CraftDefinitionShapeless() = default;
233
234 virtual std::string getName() const;
235 virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
236 virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
237 virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
238 virtual void decrementInput(CraftInput &input,
239 std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const;
240
241 virtual u64 getHash(CraftHashType type) const;
242
243 virtual void initHash(IGameDef *gamedef);
244
245 virtual std::string dump() const;
246
247private:
248 // Output itemstring
249 std::string output;
250 // Recipe list (itemstrings)
251 std::vector<std::string> recipe;
252 // Recipe list (item names), sorted
253 std::vector<std::string> recipe_names;
254 // bool indicating if initHash has been called already
255 bool hash_inited = false;
256 // Replacement items for decrementInput()
258};
259
260/*
261 Tool repair crafting definition
262 Supported crafting method: CRAFT_METHOD_NORMAL.
263 Put two damaged tools into the crafting grid, get one tool back.
264 There should only be one crafting definition of this type.
265*/
267{
268public:
270 CraftDefinitionToolRepair(float additional_wear_);
271
272 virtual ~CraftDefinitionToolRepair() = default;
273
274 virtual std::string getName() const;
275 virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
276 virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
277 virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
278 virtual void decrementInput(CraftInput &input,
279 std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const;
280
281 virtual u64 getHash(CraftHashType type) const { return 2; }
282
283 virtual void initHash(IGameDef *gamedef)
284 {
286 }
287
288 virtual std::string dump() const;
289
290private:
291 // This is a constant that is added to the wear of the result.
292 // May be positive or negative, allowed range [-1,1].
293 // 1 = new tool is completely broken
294 // 0 = simply add remaining uses of both input tools
295 // -1 = new tool is completely pristine
296 float additional_wear = 0.0f;
297};
298
299/*
300 A cooking (in furnace) definition
301 Supported crafting method: CRAFT_METHOD_COOKING.
302*/
304{
305public:
308 const std::string &output_,
309 const std::string &recipe_,
310 float cooktime_,
311 const CraftReplacements &replacements_);
312
313 virtual ~CraftDefinitionCooking() = default;
314
315 virtual std::string getName() const;
316 virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
317 virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
318 virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
319 virtual void decrementInput(CraftInput &input,
320 std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const;
321
322 virtual u64 getHash(CraftHashType type) const;
323
324 virtual void initHash(IGameDef *gamedef);
325
326 virtual std::string dump() const;
327
328private:
329 // Output itemstring
330 std::string output;
331 // Recipe itemstring
332 std::string recipe;
333 // Recipe item name
334 std::string recipe_name;
335 // bool indicating if initHash has been called already
336 bool hash_inited = false;
337 // Time in seconds
338 float cooktime;
339 // Replacement items for decrementInput()
341};
342
343/*
344 A fuel (for furnace) definition
345 Supported crafting method: CRAFT_METHOD_FUEL.
346*/
348{
349public:
352 const std::string &recipe_,
353 float burntime_,
354 const CraftReplacements &replacements_);
355
356 virtual ~CraftDefinitionFuel() = default;
357
358 virtual std::string getName() const;
359 virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
360 virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
361 virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
362 virtual void decrementInput(CraftInput &input,
363 std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const;
364
365 virtual u64 getHash(CraftHashType type) const;
366
367 virtual void initHash(IGameDef *gamedef);
368
369 virtual std::string dump() const;
370
371private:
372 // Recipe itemstring
373 std::string recipe;
374 // Recipe item name
375 std::string recipe_name;
376 // bool indicating if initHash has been called already
377 bool hash_inited = false;
378 // Time in seconds
379 float burntime;
380 // Replacement items for decrementInput()
382};
383
384/*
385 Crafting definition manager
386*/
388{
389public:
390 ICraftDefManager() = default;
391 virtual ~ICraftDefManager() = default;
392
405 virtual bool getCraftResult(CraftInput &input, CraftOutput &output,
406 std::vector<ItemStack> &output_replacements,
407 bool decrementInput, IGameDef *gamedef) const=0;
408
409 virtual std::vector<CraftDefinition*> getCraftRecipes(CraftOutput &output,
410 IGameDef *gamedef, unsigned limit=0) const=0;
411
412 // Print crafting recipes for debugging
413 virtual std::string dump() const=0;
414};
415
417{
418public:
420 virtual ~IWritableCraftDefManager() = default;
421
422 // The main crafting function
423 virtual bool getCraftResult(CraftInput &input, CraftOutput &output,
424 std::vector<ItemStack> &output_replacements,
425 bool decrementInput, IGameDef *gamedef) const=0;
426 virtual std::vector<CraftDefinition*> getCraftRecipes(CraftOutput &output,
427 IGameDef *gamedef, unsigned limit=0) const=0;
428
429 virtual bool clearCraftsByOutput(const CraftOutput &output, IGameDef *gamedef) = 0;
430 virtual bool clearCraftsByInput(const CraftInput &input, IGameDef *gamedef) = 0;
431
432 // Print crafting recipes for debugging
433 virtual std::string dump() const=0;
434
435 // Add a crafting definition.
436 // After calling this, the pointer belongs to the manager.
437 virtual void registerCraft(CraftDefinition *def, IGameDef *gamedef) = 0;
438
439 // Delete all crafting definitions
440 virtual void clear()=0;
441
442 // To be called after all mods are loaded, so that we catch all aliases
443 virtual void initHashes(IGameDef *gamedef) = 0;
444};
445
Definition craftdef.h:304
CraftDefinitionCooking()=delete
std::string recipe
Definition craftdef.h:332
virtual ~CraftDefinitionCooking()=default
virtual std::string dump() const
Definition craftdef.cpp:912
std::string recipe_name
Definition craftdef.h:334
std::string output
Definition craftdef.h:330
virtual void initHash(IGameDef *gamedef)
Definition craftdef.cpp:899
virtual u64 getHash(CraftHashType type) const
Definition craftdef.cpp:884
virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const
Definition craftdef.cpp:871
float cooktime
Definition craftdef.h:338
virtual bool check(const CraftInput &input, IGameDef *gamedef) const
Definition craftdef.cpp:840
CraftReplacements replacements
Definition craftdef.h:340
virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const
Definition craftdef.cpp:866
bool hash_inited
Definition craftdef.h:336
virtual std::string getName() const
Definition craftdef.cpp:835
virtual void decrementInput(CraftInput &input, std::vector< ItemStack > &output_replacements, IGameDef *gamedef) const
Definition craftdef.cpp:878
Definition craftdef.h:348
virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const
Definition craftdef.cpp:969
virtual void decrementInput(CraftInput &input, std::vector< ItemStack > &output_replacements, IGameDef *gamedef) const
Definition craftdef.cpp:981
std::string recipe
Definition craftdef.h:373
virtual ~CraftDefinitionFuel()=default
std::string recipe_name
Definition craftdef.h:375
virtual u64 getHash(CraftHashType type) const
Definition craftdef.cpp:987
virtual void initHash(IGameDef *gamedef)
Definition craftdef.cpp:1002
CraftReplacements replacements
Definition craftdef.h:381
virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const
Definition craftdef.cpp:974
virtual std::string dump() const
Definition craftdef.cpp:1015
virtual bool check(const CraftInput &input, IGameDef *gamedef) const
Definition craftdef.cpp:943
float burntime
Definition craftdef.h:379
CraftDefinitionFuel()=delete
virtual std::string getName() const
Definition craftdef.cpp:938
bool hash_inited
Definition craftdef.h:377
Definition craftdef.h:179
unsigned int width
Definition craftdef.h:207
CraftReplacements replacements
Definition craftdef.h:215
bool hash_inited
Definition craftdef.h:213
virtual std::string dump() const
Definition craftdef.cpp:457
virtual void initHash(IGameDef *gamedef)
Definition craftdef.cpp:444
std::vector< std::string > recipe_names
Definition craftdef.h:211
std::vector< std::string > recipe
Definition craftdef.h:209
virtual std::string getName() const
Definition craftdef.cpp:346
virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const
Definition craftdef.cpp:422
virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const
Definition craftdef.cpp:417
std::string output
Definition craftdef.h:205
CraftDefinitionShaped()=delete
virtual u64 getHash(CraftHashType type) const
Definition craftdef.cpp:433
virtual bool check(const CraftInput &input, IGameDef *gamedef) const
Definition craftdef.cpp:351
virtual void decrementInput(CraftInput &input, std::vector< ItemStack > &output_replacements, IGameDef *gamedef) const
Definition craftdef.cpp:427
virtual ~CraftDefinitionShaped()=default
Definition craftdef.h:224
virtual ~CraftDefinitionShapeless()=default
virtual bool check(const CraftInput &input, IGameDef *gamedef) const
Definition craftdef.cpp:594
std::vector< std::string > recipe_names
Definition craftdef.h:253
virtual std::string getName() const
Definition craftdef.cpp:482
virtual void initHash(IGameDef *gamedef)
Definition craftdef.cpp:695
virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const
Definition craftdef.cpp:676
bool hash_inited
Definition craftdef.h:255
virtual std::string dump() const
Definition craftdef.cpp:709
virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const
Definition craftdef.cpp:671
virtual void decrementInput(CraftInput &input, std::vector< ItemStack > &output_replacements, IGameDef *gamedef) const
Definition craftdef.cpp:681
std::vector< std::string > recipe
Definition craftdef.h:251
CraftReplacements replacements
Definition craftdef.h:257
virtual u64 getHash(CraftHashType type) const
Definition craftdef.cpp:687
std::string output
Definition craftdef.h:249
Definition craftdef.h:267
virtual u64 getHash(CraftHashType type) const
Definition craftdef.h:281
virtual ~CraftDefinitionToolRepair()=default
virtual std::string getName() const
Definition craftdef.cpp:756
float additional_wear
Definition craftdef.h:296
virtual void decrementInput(CraftInput &input, std::vector< ItemStack > &output_replacements, IGameDef *gamedef) const
Definition craftdef.cpp:805
virtual void initHash(IGameDef *gamedef)
Definition craftdef.h:283
virtual std::string dump() const
Definition craftdef.cpp:811
virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const
Definition craftdef.cpp:782
virtual bool check(const CraftInput &input, IGameDef *gamedef) const
Definition craftdef.cpp:761
virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const
Definition craftdef.cpp:798
Definition craftdef.h:116
RecipePriority
Definition craftdef.h:126
@ PRIORITY_TOOLREPAIR
Definition craftdef.h:128
@ PRIORITY_SHAPELESS
Definition craftdef.h:130
@ PRIORITY_NO_RECIPE
Definition craftdef.h:127
@ PRIORITY_SHAPED_AND_GROUPS
Definition craftdef.h:131
@ PRIORITY_SHAPELESS_AND_GROUPS
Definition craftdef.h:129
@ PRIORITY_SHAPED
Definition craftdef.h:132
RecipePriority getPriority() const
Definition craftdef.h:143
virtual bool check(const CraftInput &input, IGameDef *gamedef) const =0
CraftHashType hash_type
Definition craftdef.h:168
CraftDefinition()=default
CraftHashType getHashType() const
Definition craftdef.h:156
virtual std::string dump() const =0
virtual void initHash(IGameDef *gamedef)=0
virtual ~CraftDefinition()=default
virtual u64 getHash(CraftHashType type) const =0
virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const =0
virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const =0
virtual std::string getName() const =0
RecipePriority priority
Definition craftdef.h:169
virtual void decrementInput(CraftInput &input, std::vector< ItemStack > &output_replacements, IGameDef *gamedef) const =0
Definition craftdef.h:388
virtual bool getCraftResult(CraftInput &input, CraftOutput &output, std::vector< ItemStack > &output_replacements, bool decrementInput, IGameDef *gamedef) const =0
The main crafting function.
virtual std::vector< CraftDefinition * > getCraftRecipes(CraftOutput &output, IGameDef *gamedef, unsigned limit=0) const =0
virtual ~ICraftDefManager()=default
ICraftDefManager()=default
virtual std::string dump() const =0
Definition gamedef.h:26
Definition craftdef.h:417
virtual bool clearCraftsByOutput(const CraftOutput &output, IGameDef *gamedef)=0
virtual ~IWritableCraftDefManager()=default
virtual void registerCraft(CraftDefinition *def, IGameDef *gamedef)=0
virtual std::string dump() const =0
virtual void initHashes(IGameDef *gamedef)=0
IWritableCraftDefManager()=default
virtual bool clearCraftsByInput(const CraftInput &input, IGameDef *gamedef)=0
virtual bool getCraftResult(CraftInput &input, CraftOutput &output, std::vector< ItemStack > &output_replacements, bool decrementInput, IGameDef *gamedef) const =0
The main crafting function.
virtual std::vector< CraftDefinition * > getCraftRecipes(CraftOutput &output, IGameDef *gamedef, unsigned limit=0) const =0
virtual void clear()=0
CraftHashType
Definition craftdef.h:36
@ CRAFT_HASH_TYPE_ITEM_NAMES
Definition craftdef.h:40
@ CRAFT_HASH_TYPE_UNHASHED
Definition craftdef.h:47
@ CRAFT_HASH_TYPE_COUNT
Definition craftdef.h:43
IWritableCraftDefManager * createCraftDefManager()
Definition craftdef.cpp:1246
CraftMethod
Definition craftdef.h:21
@ CRAFT_METHOD_NORMAL
Definition craftdef.h:23
@ CRAFT_METHOD_COOKING
Definition craftdef.h:25
@ CRAFT_METHOD_FUEL
Definition craftdef.h:27
const int craft_hash_type_max
Definition craftdef.h:50
Definition craftdef.h:56
unsigned int width
Definition craftdef.h:58
CraftInput()=default
bool empty() const
Definition craftdef.cpp:282
CraftMethod method
Definition craftdef.h:57
std::string dump() const
Definition craftdef.cpp:291
std::vector< ItemStack > items
Definition craftdef.h:59
Definition craftdef.h:76
CraftOutput(const std::string &item_, float time_)
Definition craftdef.h:84
std::string dump() const
Definition craftdef.cpp:303
CraftOutput()=default
std::string item
Definition craftdef.h:78
float time
Definition craftdef.h:80
Definition craftdef.h:101
std::string dump() const
Definition craftdef.cpp:314
CraftReplacements(const std::vector< std::pair< std::string, std::string > > &pairs_)
Definition craftdef.h:106
CraftReplacements()=default
std::vector< std::pair< std::string, std::string > > pairs
Definition craftdef.h:103
Definition inventory.h:21