Luanti 5.17.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; //< used only for shaped recipes
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 A list of replacements. A replacement indicates that a specific
74 input item should not be deleted (when crafting) but replaced with
75 a different item. Each replacements is a pair (itemstring to remove,
76 itemstring to replace with)
77
78 Example: If ("bucket:bucket_water", "bucket:bucket_empty") is a
79 replacement pair, the crafting input slot that contained a water
80 bucket will contain an empty bucket after crafting.
81*/
83{
84 // List of replacements
85 std::vector<std::pair<std::string, std::string> > pairs;
86
87 CraftReplacements() = default;
88 CraftReplacements(const std::vector<std::pair<std::string, std::string> > &pairs_):
89 pairs(pairs_)
90 {}
91 std::string dump() const;
92};
93
94/*
95 Output: Result of crafting operation
96*/
98{
99 // Used for normal crafting and cooking, itemstring
100 std::string item;
101 // Used for cooking (cook time) and fuel (burn time), seconds
102 float time = 0.0f;
103
105
106 CraftOutput() = default;
107
108 CraftOutput(const std::string &item_, float time_):
109 item(item_), time(time_)
110 {}
111
112 CraftOutput(const std::string &item_, float time_, CraftReplacements replacements):
113 item(item_), time(time_), replacements(replacements)
114 {}
115 std::string dump() const;
116};
117
118/*
119 Crafting definition base class
120*/
122{
123public:
124 /*
125 Craft recipe priorities, from low to high
126
127 Recipes are searched from latest to first.
128 If a recipe with higher priority than a previous found one is
129 encountered, it is selected instead.
130 */
140
141 CraftDefinition() = default;
142 virtual ~CraftDefinition() = default;
143
144 // Returns type of crafting definition
145 virtual std::string getName() const=0;
146
147 // Checks whether the recipe is applicable
148 virtual bool check(const CraftInput &input, IGameDef *gamedef) const=0;
150 {
151 return priority;
152 }
153 // Returns the output structure, meaning depends on crafting method
154 // The implementation can assume that check(input) returns true
155 virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const=0;
156 // the inverse of the above
157 virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const=0;
158 // Decreases count of every input item
159 virtual void decrementInput(CraftInput &input,
160 std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const=0;
161
163 {
164 return hash_type;
165 }
166 virtual u64 getHash(CraftHashType type) const = 0;
167
168 // to be called after all mods are loaded, so that we catch all aliases
169 virtual void initHash(IGameDef *gamedef) = 0;
170
171 virtual std::string dump() const=0;
172
173protected:
176};
177
178/*
179 A plain-jane (shaped) crafting definition
180
181 Supported crafting method: CRAFT_METHOD_NORMAL.
182 Requires the input items to be arranged exactly like in the recipe.
183*/
185{
186public:
189 const std::string &output_,
190 unsigned int width_,
191 const std::vector<std::string> &recipe_,
192 const CraftReplacements &replacements_);
193
194 virtual ~CraftDefinitionShaped() = default;
195
196 virtual std::string getName() const;
197 virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
198 virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
199 virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
200 virtual void decrementInput(CraftInput &input,
201 std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const;
202
203 virtual u64 getHash(CraftHashType type) const;
204
205 virtual void initHash(IGameDef *gamedef);
206
207 virtual std::string dump() const;
208
209private:
210 // Output itemstring
211 std::string output = "";
212 // Width of recipe
213 unsigned int width = 1;
214 // Recipe matrix (itemstrings)
215 std::vector<std::string> recipe;
216 // Recipe matrix (item names)
217 std::vector<std::string> recipe_names;
218 // bool indicating if initHash has been called already
219 bool hash_inited = false;
220 // Replacement items for decrementInput()
222};
223
224/*
225 A shapeless crafting definition
226 Supported crafting method: CRAFT_METHOD_NORMAL.
227 Input items can arranged in any way.
228*/
230{
231public:
234 const std::string &output_,
235 const std::vector<std::string> &recipe_,
236 const CraftReplacements &replacements_);
237
238 virtual ~CraftDefinitionShapeless() = default;
239
240 virtual std::string getName() const;
241 virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
242 virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
243 virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
244 virtual void decrementInput(CraftInput &input,
245 std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const;
246
247 virtual u64 getHash(CraftHashType type) const;
248
249 virtual void initHash(IGameDef *gamedef);
250
251 virtual std::string dump() const;
252
253private:
254 // Output itemstring
255 std::string output;
256 // Recipe list (itemstrings)
257 std::vector<std::string> recipe;
258 // Recipe list (item names), sorted
259 std::vector<std::string> recipe_names;
260 // bool indicating if initHash has been called already
261 bool hash_inited = false;
262 // Replacement items for decrementInput()
264};
265
266/*
267 Tool repair crafting definition
268 Supported crafting method: CRAFT_METHOD_NORMAL.
269 Put two damaged tools into the crafting grid, get one tool back.
270 There should only be one crafting definition of this type.
271*/
273{
274public:
276 CraftDefinitionToolRepair(float additional_wear_);
277
278 virtual ~CraftDefinitionToolRepair() = default;
279
280 virtual std::string getName() const;
281 virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
282 virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
283 virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
284 virtual void decrementInput(CraftInput &input,
285 std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const;
286
287 virtual u64 getHash(CraftHashType type) const { return 2; }
288
289 virtual void initHash(IGameDef *gamedef)
290 {
292 }
293
294 virtual std::string dump() const;
295
296private:
297 // This is a constant that is added to the wear of the result.
298 // May be positive or negative, allowed range [-1,1].
299 // 1 = new tool is completely broken
300 // 0 = simply add remaining uses of both input tools
301 // -1 = new tool is completely pristine
302 float additional_wear = 0.0f;
303};
304
305/*
306 A cooking (in furnace) definition
307 Supported crafting method: CRAFT_METHOD_COOKING.
308*/
310{
311public:
314 const std::string &output_,
315 const std::string &recipe_,
316 float cooktime_,
317 const CraftReplacements &replacements_);
318
319 virtual ~CraftDefinitionCooking() = default;
320
321 virtual std::string getName() const;
322 virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
323 virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
324 virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
325 virtual void decrementInput(CraftInput &input,
326 std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const;
327
328 virtual u64 getHash(CraftHashType type) const;
329
330 virtual void initHash(IGameDef *gamedef);
331
332 virtual std::string dump() const;
333
334private:
335 // Output itemstring
336 std::string output;
337 // Recipe itemstring
338 std::string recipe;
339 // Recipe item name
340 std::string recipe_name;
341 // bool indicating if initHash has been called already
342 bool hash_inited = false;
343 // Time in seconds
344 float cooktime;
345 // Replacement items for decrementInput()
347};
348
349/*
350 A fuel (for furnace) definition
351 Supported crafting method: CRAFT_METHOD_FUEL.
352*/
354{
355public:
358 const std::string &recipe_,
359 float burntime_,
360 const CraftReplacements &replacements_);
361
362 virtual ~CraftDefinitionFuel() = default;
363
364 virtual std::string getName() const;
365 virtual bool check(const CraftInput &input, IGameDef *gamedef) const;
366 virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const;
367 virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const;
368 virtual void decrementInput(CraftInput &input,
369 std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const;
370
371 virtual u64 getHash(CraftHashType type) const;
372
373 virtual void initHash(IGameDef *gamedef);
374
375 virtual std::string dump() const;
376
377private:
378 // Recipe itemstring
379 std::string recipe;
380 // Recipe item name
381 std::string recipe_name;
382 // bool indicating if initHash has been called already
383 bool hash_inited = false;
384 // Time in seconds
385 float burntime;
386 // Replacement items for decrementInput()
388};
389
390/*
391 Crafting definition manager
392*/
394{
395public:
396 ICraftDefManager() = default;
397 virtual ~ICraftDefManager() = default;
398
411 virtual bool getCraftResult(CraftInput &input, CraftOutput &output,
412 std::vector<ItemStack> &output_replacements,
413 bool decrementInput, IGameDef *gamedef) const=0;
414
415 virtual std::vector<CraftDefinition*> getCraftRecipes(CraftOutput &output,
416 IGameDef *gamedef, unsigned limit=0) const=0;
417
418 // Print crafting recipes for debugging
419 virtual std::string dump() const=0;
420};
421
423{
424public:
426 virtual ~IWritableCraftDefManager() = default;
427
428 // The main crafting function
429 virtual bool getCraftResult(CraftInput &input, CraftOutput &output,
430 std::vector<ItemStack> &output_replacements,
431 bool decrementInput, IGameDef *gamedef) const=0;
432 virtual std::vector<CraftDefinition*> getCraftRecipes(CraftOutput &output,
433 IGameDef *gamedef, unsigned limit=0) const=0;
434
435 virtual bool clearCraftsByOutput(const CraftOutput &output, IGameDef *gamedef) = 0;
436 virtual bool clearCraftsByInput(const CraftInput &input, IGameDef *gamedef) = 0;
437
438 // Print crafting recipes for debugging
439 virtual std::string dump() const=0;
440
441 // Add a crafting definition.
442 // After calling this, the pointer belongs to the manager.
443 virtual void registerCraft(CraftDefinition *def, IGameDef *gamedef) = 0;
444
445 // Delete all crafting definitions
446 virtual void clear()=0;
447
448 // To be called after all mods are loaded, so that we catch all aliases
449 virtual void initHashes(IGameDef *gamedef) = 0;
450};
451
CraftDefinitionCooking()=delete
std::string recipe
Definition craftdef.h:338
virtual ~CraftDefinitionCooking()=default
virtual std::string dump() const
Definition craftdef.cpp:913
std::string recipe_name
Definition craftdef.h:340
std::string output
Definition craftdef.h:336
virtual void initHash(IGameDef *gamedef)
Definition craftdef.cpp:900
virtual u64 getHash(CraftHashType type) const
Definition craftdef.cpp:885
virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const
Definition craftdef.cpp:872
float cooktime
Definition craftdef.h:344
virtual bool check(const CraftInput &input, IGameDef *gamedef) const
Definition craftdef.cpp:841
CraftReplacements replacements
Definition craftdef.h:346
virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const
Definition craftdef.cpp:867
bool hash_inited
Definition craftdef.h:342
virtual std::string getName() const
Definition craftdef.cpp:836
virtual void decrementInput(CraftInput &input, std::vector< ItemStack > &output_replacements, IGameDef *gamedef) const
Definition craftdef.cpp:879
virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const
Definition craftdef.cpp:970
virtual void decrementInput(CraftInput &input, std::vector< ItemStack > &output_replacements, IGameDef *gamedef) const
Definition craftdef.cpp:982
std::string recipe
Definition craftdef.h:379
virtual ~CraftDefinitionFuel()=default
std::string recipe_name
Definition craftdef.h:381
virtual u64 getHash(CraftHashType type) const
Definition craftdef.cpp:988
virtual void initHash(IGameDef *gamedef)
Definition craftdef.cpp:1003
CraftReplacements replacements
Definition craftdef.h:387
virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const
Definition craftdef.cpp:975
virtual std::string dump() const
Definition craftdef.cpp:1016
virtual bool check(const CraftInput &input, IGameDef *gamedef) const
Definition craftdef.cpp:944
float burntime
Definition craftdef.h:385
CraftDefinitionFuel()=delete
virtual std::string getName() const
Definition craftdef.cpp:939
bool hash_inited
Definition craftdef.h:383
unsigned int width
Definition craftdef.h:213
CraftReplacements replacements
Definition craftdef.h:221
bool hash_inited
Definition craftdef.h:219
virtual std::string dump() const
Definition craftdef.cpp:458
virtual void initHash(IGameDef *gamedef)
Definition craftdef.cpp:445
std::vector< std::string > recipe_names
Definition craftdef.h:217
std::vector< std::string > recipe
Definition craftdef.h:215
virtual std::string getName() const
Definition craftdef.cpp:347
virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const
Definition craftdef.cpp:423
virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const
Definition craftdef.cpp:418
std::string output
Definition craftdef.h:211
CraftDefinitionShaped()=delete
virtual u64 getHash(CraftHashType type) const
Definition craftdef.cpp:434
virtual bool check(const CraftInput &input, IGameDef *gamedef) const
Definition craftdef.cpp:352
virtual void decrementInput(CraftInput &input, std::vector< ItemStack > &output_replacements, IGameDef *gamedef) const
Definition craftdef.cpp:428
virtual ~CraftDefinitionShaped()=default
virtual ~CraftDefinitionShapeless()=default
virtual bool check(const CraftInput &input, IGameDef *gamedef) const
Definition craftdef.cpp:595
std::vector< std::string > recipe_names
Definition craftdef.h:259
virtual std::string getName() const
Definition craftdef.cpp:483
virtual void initHash(IGameDef *gamedef)
Definition craftdef.cpp:696
virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const
Definition craftdef.cpp:677
bool hash_inited
Definition craftdef.h:261
virtual std::string dump() const
Definition craftdef.cpp:710
virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const
Definition craftdef.cpp:672
virtual void decrementInput(CraftInput &input, std::vector< ItemStack > &output_replacements, IGameDef *gamedef) const
Definition craftdef.cpp:682
std::vector< std::string > recipe
Definition craftdef.h:257
CraftReplacements replacements
Definition craftdef.h:263
virtual u64 getHash(CraftHashType type) const
Definition craftdef.cpp:688
std::string output
Definition craftdef.h:255
virtual u64 getHash(CraftHashType type) const
Definition craftdef.h:287
virtual ~CraftDefinitionToolRepair()=default
virtual std::string getName() const
Definition craftdef.cpp:757
float additional_wear
Definition craftdef.h:302
virtual void decrementInput(CraftInput &input, std::vector< ItemStack > &output_replacements, IGameDef *gamedef) const
Definition craftdef.cpp:806
virtual void initHash(IGameDef *gamedef)
Definition craftdef.h:289
virtual std::string dump() const
Definition craftdef.cpp:812
virtual CraftOutput getOutput(const CraftInput &input, IGameDef *gamedef) const
Definition craftdef.cpp:783
virtual bool check(const CraftInput &input, IGameDef *gamedef) const
Definition craftdef.cpp:762
virtual CraftInput getInput(const CraftOutput &output, IGameDef *gamedef) const
Definition craftdef.cpp:799
Definition craftdef.h:122
RecipePriority
Definition craftdef.h:132
@ PRIORITY_TOOLREPAIR
Definition craftdef.h:134
@ PRIORITY_SHAPELESS
Definition craftdef.h:136
@ PRIORITY_NO_RECIPE
Definition craftdef.h:133
@ PRIORITY_SHAPED_AND_GROUPS
Definition craftdef.h:137
@ PRIORITY_SHAPELESS_AND_GROUPS
Definition craftdef.h:135
@ PRIORITY_SHAPED
Definition craftdef.h:138
RecipePriority getPriority() const
Definition craftdef.h:149
virtual bool check(const CraftInput &input, IGameDef *gamedef) const =0
CraftHashType hash_type
Definition craftdef.h:174
CraftDefinition()=default
CraftHashType getHashType() const
Definition craftdef.h:162
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:175
virtual void decrementInput(CraftInput &input, std::vector< ItemStack > &output_replacements, IGameDef *gamedef) const =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 ~ICraftDefManager()=default
ICraftDefManager()=default
virtual std::string dump() const =0
Definition gamedef.h:26
Definition craftdef.h:423
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:1247
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:98
CraftOutput(const std::string &item_, float time_)
Definition craftdef.h:108
std::string dump() const
Definition craftdef.cpp:303
CraftOutput()=default
CraftOutput(const std::string &item_, float time_, CraftReplacements replacements)
Definition craftdef.h:112
CraftReplacements replacements
Definition craftdef.h:104
std::string item
Definition craftdef.h:100
float time
Definition craftdef.h:102
Definition craftdef.h:83
std::string dump() const
Definition craftdef.cpp:315
CraftReplacements(const std::vector< std::pair< std::string, std::string > > &pairs_)
Definition craftdef.h:88
CraftReplacements()=default
std::vector< std::pair< std::string, std::string > > pairs
Definition craftdef.h:85
Definition inventory.h:21