aboutsummaryrefslogtreecommitdiff
path: root/src/craftdef.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/craftdef.cpp')
-rw-r--r--src/craftdef.cpp368
1 files changed, 180 insertions, 188 deletions
diff --git a/src/craftdef.cpp b/src/craftdef.cpp
index e821a4620..210605198 100644
--- a/src/craftdef.cpp
+++ b/src/craftdef.cpp
@@ -55,26 +55,24 @@ inline u64 getHashForString(const std::string &recipe_str)
static u64 getHashForGrid(CraftHashType type, const std::vector<std::string> &grid_names)
{
switch (type) {
- case CRAFT_HASH_TYPE_ITEM_NAMES: {
- std::ostringstream os;
- bool is_first = true;
- for (const std::string &grid_name : grid_names) {
- if (!grid_name.empty()) {
- os << (is_first ? "" : "\n") << grid_name;
- is_first = false;
+ case CRAFT_HASH_TYPE_ITEM_NAMES: {
+ std::ostringstream os;
+ bool is_first = true;
+ for (const std::string &grid_name : grid_names) {
+ if (!grid_name.empty()) {
+ os << (is_first ? "" : "\n") << grid_name;
+ is_first = false;
+ }
}
- }
- return getHashForString(os.str());
- }
- case CRAFT_HASH_TYPE_COUNT: {
- u64 cnt = 0;
- for (const std::string &grid_name : grid_names)
- if (!grid_name.empty())
- cnt++;
- return cnt;
- }
- case CRAFT_HASH_TYPE_UNHASHED:
- return 0;
+ return getHashForString(os.str());
+ } case CRAFT_HASH_TYPE_COUNT: {
+ u64 cnt = 0;
+ for (const std::string &grid_name : grid_names)
+ if (!grid_name.empty())
+ cnt++;
+ return cnt;
+ } case CRAFT_HASH_TYPE_UNHASHED:
+ return 0;
}
// invalid CraftHashType
assert(false);
@@ -149,8 +147,8 @@ static std::vector<ItemStack> craftGetItems(
std::vector<ItemStack> result;
result.reserve(items.size());
for (const auto &item : items) {
- result.emplace_back(std::string(item), (u16)1, (u16)0,
- gamedef->getItemDefManager());
+ result.emplace_back(std::string(item), (u16)1,
+ (u16)0, gamedef->getItemDefManager());
}
return result;
}
@@ -158,8 +156,8 @@ static std::vector<ItemStack> craftGetItems(
// Compute bounding rectangle given a matrix of items
// Returns false if every item is ""
static bool craftGetBounds(const std::vector<std::string> &items, unsigned int width,
- unsigned int &min_x, unsigned int &max_x, unsigned int &min_y,
- unsigned int &max_y)
+ unsigned int &min_x, unsigned int &max_x,
+ unsigned int &min_y, unsigned int &max_y)
{
bool success = false;
unsigned int x = 0;
@@ -173,14 +171,10 @@ static bool craftGetBounds(const std::vector<std::string> &items, unsigned int w
min_y = max_y = y;
success = true;
} else {
- if (x < min_x)
- min_x = x;
- if (x > max_x)
- max_x = x;
- if (y < min_y)
- min_y = y;
- if (y > max_y)
- max_y = y;
+ if (x < min_x) min_x = x;
+ if (x > max_x) max_x = x;
+ if (y < min_y) min_y = y;
+ if (y > max_y) max_y = y;
}
}
@@ -204,12 +198,12 @@ static void craftDecrementInput(CraftInput &input, IGameDef *gamedef)
}
// Removes 1 from each item stack with replacement support
-// Example: if replacements contains the pair ("bucket:bucket_water",
-// "bucket:bucket_empty"),
+// Example: if replacements contains the pair ("bucket:bucket_water", "bucket:bucket_empty"),
// a water bucket will not be removed but replaced by an empty bucket.
static void craftDecrementOrReplaceInput(CraftInput &input,
std::vector<ItemStack> &output_replacements,
- const CraftReplacements &replacements, IGameDef *gamedef)
+ const CraftReplacements &replacements,
+ IGameDef *gamedef)
{
if (replacements.pairs.empty()) {
craftDecrementInput(input, gamedef);
@@ -217,14 +211,13 @@ static void craftDecrementOrReplaceInput(CraftInput &input,
}
// Make a copy of the replacements pair list
- std::vector<std::pair<std::string, std::string>> pairs = replacements.pairs;
+ std::vector<std::pair<std::string, std::string> > pairs = replacements.pairs;
for (auto &item : input.items) {
// Find an appropriate replacement
bool found_replacement = false;
for (auto j = pairs.begin(); j != pairs.end(); ++j) {
- if (inputItemMatchesRecipe(
- item.name, j->first, gamedef->idef())) {
+ if (inputItemMatchesRecipe(item.name, j->first, gamedef->idef())) {
if (item.count == 1) {
item.deSerialize(j->second, gamedef->idef());
found_replacement = true;
@@ -238,6 +231,7 @@ static void craftDecrementOrReplaceInput(CraftInput &input,
found_replacement = true;
output_replacements.push_back(rep);
break;
+
}
}
// No replacement was found, simply decrement count by one
@@ -247,13 +241,14 @@ static void craftDecrementOrReplaceInput(CraftInput &input,
}
// Dump an itemstring matrix
-static std::string craftDumpMatrix(
- const std::vector<std::string> &items, unsigned int width)
+static std::string craftDumpMatrix(const std::vector<std::string> &items,
+ unsigned int width)
{
std::ostringstream os(std::ios::binary);
os << "{ ";
unsigned int x = 0;
- for (std::vector<std::string>::size_type i = 0; i < items.size(); i++, x++) {
+ for(std::vector<std::string>::size_type i = 0;
+ i < items.size(); i++, x++) {
if (x == width) {
os << "; ";
x = 0;
@@ -267,12 +262,14 @@ static std::string craftDumpMatrix(
}
// Dump an item matrix
-std::string craftDumpMatrix(const std::vector<ItemStack> &items, unsigned int width)
+std::string craftDumpMatrix(const std::vector<ItemStack> &items,
+ unsigned int width)
{
std::ostringstream os(std::ios::binary);
os << "{ ";
unsigned int x = 0;
- for (std::vector<ItemStack>::size_type i = 0; i < items.size(); i++, x++) {
+ for (std::vector<ItemStack>::size_type i = 0;
+ i < items.size(); i++, x++) {
if (x == width) {
os << "; ";
x = 0;
@@ -285,6 +282,7 @@ std::string craftDumpMatrix(const std::vector<ItemStack> &items, unsigned int wi
return os.str();
}
+
/*
CraftInput
*/
@@ -301,8 +299,8 @@ bool CraftInput::empty() const
std::string CraftInput::dump() const
{
std::ostringstream os(std::ios::binary);
- os << "(method=" << ((int)method) << ", items=" << craftDumpMatrix(items, width)
- << ")";
+ os << "(method=" << ((int)method) << ", items="
+ << craftDumpMatrix(items, width) << ")";
return os.str();
}
@@ -324,10 +322,12 @@ std::string CraftOutput::dump() const
std::string CraftReplacements::dump() const
{
std::ostringstream os(std::ios::binary);
- os << "{";
+ os<<"{";
const char *sep = "";
for (const auto &repl_p : pairs) {
- os << sep << '"' << (repl_p.first) << "\"=>\"" << (repl_p.second) << '"';
+ os << sep
+ << '"' << (repl_p.first)
+ << "\"=>\"" << (repl_p.second) << '"';
sep = ",";
}
os << "}";
@@ -338,11 +338,12 @@ std::string CraftReplacements::dump() const
CraftDefinitionShaped
*/
-CraftDefinitionShaped::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_)
+CraftDefinitionShaped::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_)
{
if (hasGroupItem(recipe))
priority = PRIORITY_SHAPED_AND_GROUPS;
@@ -370,9 +371,9 @@ bool CraftDefinitionShaped::check(const CraftInput &input, IGameDef *gamedef) co
// Get input bounds
unsigned int inp_min_x = 0, inp_max_x = 0, inp_min_y = 0, inp_max_y = 0;
- if (!craftGetBounds(inp_names, inp_width, inp_min_x, inp_max_x, inp_min_y,
- inp_max_y))
- return false; // it was empty
+ if (!craftGetBounds(inp_names, inp_width, inp_min_x, inp_max_x,
+ inp_min_y, inp_max_y))
+ return false; // it was empty
std::vector<std::string> rec_names;
if (hash_inited)
@@ -388,10 +389,10 @@ bool CraftDefinitionShaped::check(const CraftInput &input, IGameDef *gamedef) co
rec_names.emplace_back("");
// Get recipe bounds
- unsigned int rec_min_x = 0, rec_max_x = 0, rec_min_y = 0, rec_max_y = 0;
- if (!craftGetBounds(rec_names, rec_width, rec_min_x, rec_max_x, rec_min_y,
- rec_max_y))
- return false; // it was empty
+ unsigned int rec_min_x=0, rec_max_x=0, rec_min_y=0, rec_max_y=0;
+ if (!craftGetBounds(rec_names, rec_width, rec_min_x, rec_max_x,
+ rec_min_y, rec_max_y))
+ return false; // it was empty
// Different sizes?
if (inp_max_x - inp_min_x != rec_max_x - rec_min_x ||
@@ -402,16 +403,17 @@ bool CraftDefinitionShaped::check(const CraftInput &input, IGameDef *gamedef) co
unsigned int w = inp_max_x - inp_min_x + 1;
unsigned int h = inp_max_y - inp_min_y + 1;
- for (unsigned int y = 0; y < h; y++) {
+ for (unsigned int y=0; y < h; y++) {
unsigned int inp_y = (inp_min_y + y) * inp_width;
unsigned int rec_y = (rec_min_y + y) * rec_width;
- for (unsigned int x = 0; x < w; x++) {
+ for (unsigned int x=0; x < w; x++) {
unsigned int inp_x = inp_min_x + x;
unsigned int rec_x = rec_min_x + x;
- if (!inputItemMatchesRecipe(inp_names[inp_y + inp_x],
- rec_names[rec_y + rec_x], gamedef->idef())) {
+ if (!inputItemMatchesRecipe(
+ inp_names[inp_y + inp_x],
+ rec_names[rec_y + rec_x], gamedef->idef())) {
return false;
}
}
@@ -420,20 +422,18 @@ bool CraftDefinitionShaped::check(const CraftInput &input, IGameDef *gamedef) co
return true;
}
-CraftOutput CraftDefinitionShaped::getOutput(
- const CraftInput &input, IGameDef *gamedef) const
+CraftOutput CraftDefinitionShaped::getOutput(const CraftInput &input, IGameDef *gamedef) const
{
return CraftOutput(output, 0);
}
-CraftInput CraftDefinitionShaped::getInput(
- const CraftOutput &output, IGameDef *gamedef) const
+CraftInput CraftDefinitionShaped::getInput(const CraftOutput &output, IGameDef *gamedef) const
{
- return CraftInput(CRAFT_METHOD_NORMAL, width, craftGetItems(recipe, gamedef));
+ return CraftInput(CRAFT_METHOD_NORMAL,width,craftGetItems(recipe,gamedef));
}
-void CraftDefinitionShaped::decrementInput(CraftInput &input,
- std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const
+void CraftDefinitionShaped::decrementInput(CraftInput &input, std::vector<ItemStack> &output_replacements,
+ IGameDef *gamedef) const
{
craftDecrementOrReplaceInput(input, output_replacements, replacements, gamedef);
}
@@ -441,8 +441,8 @@ void CraftDefinitionShaped::decrementInput(CraftInput &input,
u64 CraftDefinitionShaped::getHash(CraftHashType type) const
{
assert(hash_inited); // Pre-condition
- assert((type == CRAFT_HASH_TYPE_ITEM_NAMES) ||
- (type == CRAFT_HASH_TYPE_COUNT)); // Pre-condition
+ assert((type == CRAFT_HASH_TYPE_ITEM_NAMES)
+ || (type == CRAFT_HASH_TYPE_COUNT)); // Pre-condition
std::vector<std::string> rec_names = recipe_names;
std::sort(rec_names.begin(), rec_names.end());
@@ -466,8 +466,8 @@ std::string CraftDefinitionShaped::dump() const
{
std::ostringstream os(std::ios::binary);
os << "(shaped, output=\"" << output
- << "\", recipe=" << craftDumpMatrix(recipe, width)
- << ", replacements=" << replacements.dump() << ")";
+ << "\", recipe=" << craftDumpMatrix(recipe, width)
+ << ", replacements=" << replacements.dump() << ")";
return os.str();
}
@@ -475,11 +475,11 @@ std::string CraftDefinitionShaped::dump() const
CraftDefinitionShapeless
*/
-CraftDefinitionShapeless::CraftDefinitionShapeless(const std::string &output_,
+CraftDefinitionShapeless::CraftDefinitionShapeless(
+ const std::string &output_,
const std::vector<std::string> &recipe_,
- const CraftReplacements &replacements_) :
- output(output_),
- recipe(recipe_), replacements(replacements_)
+ const CraftReplacements &replacements_):
+ output(output_), recipe(recipe_), replacements(replacements_)
{
if (hasGroupItem(recipe))
priority = PRIORITY_SHAPELESS_AND_GROUPS;
@@ -526,16 +526,16 @@ bool CraftDefinitionShapeless::check(const CraftInput &input, IGameDef *gamedef)
do {
// If all items match, the recipe matches
bool all_match = true;
- // dstream<<"Testing recipe (output="<<output<<"):";
- for (size_t i = 0; i < recipe.size(); i++) {
- // dstream<<" ("<<input_filtered[i]<<" == "<<recipe_copy[i]<<")";
+ //dstream<<"Testing recipe (output="<<output<<"):";
+ for (size_t i=0; i<recipe.size(); i++) {
+ //dstream<<" ("<<input_filtered[i]<<" == "<<recipe_copy[i]<<")";
if (!inputItemMatchesRecipe(input_filtered[i], recipe_copy[i],
- gamedef->idef())) {
+ gamedef->idef())) {
all_match = false;
break;
}
}
- // dstream<<" -> match="<<all_match<<std::endl;
+ //dstream<<" -> match="<<all_match<<std::endl;
if (all_match)
return true;
} while (std::next_permutation(recipe_copy.begin(), recipe_copy.end()));
@@ -543,20 +543,18 @@ bool CraftDefinitionShapeless::check(const CraftInput &input, IGameDef *gamedef)
return false;
}
-CraftOutput CraftDefinitionShapeless::getOutput(
- const CraftInput &input, IGameDef *gamedef) const
+CraftOutput CraftDefinitionShapeless::getOutput(const CraftInput &input, IGameDef *gamedef) const
{
return CraftOutput(output, 0);
}
-CraftInput CraftDefinitionShapeless::getInput(
- const CraftOutput &output, IGameDef *gamedef) const
+CraftInput CraftDefinitionShapeless::getInput(const CraftOutput &output, IGameDef *gamedef) const
{
return CraftInput(CRAFT_METHOD_NORMAL, 0, craftGetItems(recipe, gamedef));
}
-void CraftDefinitionShapeless::decrementInput(CraftInput &input,
- std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const
+void CraftDefinitionShapeless::decrementInput(CraftInput &input, std::vector<ItemStack> &output_replacements,
+ IGameDef *gamedef) const
{
craftDecrementOrReplaceInput(input, output_replacements, replacements, gamedef);
}
@@ -564,8 +562,8 @@ void CraftDefinitionShapeless::decrementInput(CraftInput &input,
u64 CraftDefinitionShapeless::getHash(CraftHashType type) const
{
assert(hash_inited); // Pre-condition
- assert(type == CRAFT_HASH_TYPE_ITEM_NAMES ||
- type == CRAFT_HASH_TYPE_COUNT); // Pre-condition
+ assert(type == CRAFT_HASH_TYPE_ITEM_NAMES
+ || type == CRAFT_HASH_TYPE_COUNT); // Pre-condition
return getHashForGrid(type, recipe_names);
}
@@ -587,8 +585,8 @@ std::string CraftDefinitionShapeless::dump() const
{
std::ostringstream os(std::ios::binary);
os << "(shapeless, output=\"" << output
- << "\", recipe=" << craftDumpMatrix(recipe, recipe.size())
- << ", replacements=" << replacements.dump() << ")";
+ << "\", recipe=" << craftDumpMatrix(recipe, recipe.size())
+ << ", replacements=" << replacements.dump() << ")";
return os.str();
}
@@ -596,26 +594,28 @@ std::string CraftDefinitionShapeless::dump() const
CraftDefinitionToolRepair
*/
-CraftDefinitionToolRepair::CraftDefinitionToolRepair(float additional_wear_) :
- additional_wear(additional_wear_)
+CraftDefinitionToolRepair::CraftDefinitionToolRepair(float additional_wear_):
+ additional_wear(additional_wear_)
{
priority = PRIORITY_TOOLREPAIR;
}
-static ItemStack craftToolRepair(const ItemStack &item1, const ItemStack &item2,
- float additional_wear, IGameDef *gamedef)
+static ItemStack craftToolRepair(
+ const ItemStack &item1,
+ const ItemStack &item2,
+ float additional_wear,
+ IGameDef *gamedef)
{
IItemDefManager *idef = gamedef->idef();
- if (item1.count != 1 || item2.count != 1 || item1.name != item2.name ||
- idef->get(item1.name).type != ITEM_TOOL ||
- itemgroup_get(idef->get(item1.name).groups, "disable_repair") ==
- 1) {
+ if (item1.count != 1 || item2.count != 1 || item1.name != item2.name
+ || idef->get(item1.name).type != ITEM_TOOL
+ || itemgroup_get(idef->get(item1.name).groups, "disable_repair") == 1) {
// Failure
return ItemStack();
}
- s32 item1_uses = 65536 - (u32)item1.wear;
- s32 item2_uses = 65536 - (u32)item2.wear;
+ s32 item1_uses = 65536 - (u32) item1.wear;
+ s32 item2_uses = 65536 - (u32) item2.wear;
s32 new_uses = item1_uses + item2_uses;
s32 new_wear = 65536 - new_uses + floor(additional_wear * 65536 + 0.5);
if (new_wear >= 65536)
@@ -654,8 +654,7 @@ bool CraftDefinitionToolRepair::check(const CraftInput &input, IGameDef *gamedef
return !repaired.empty();
}
-CraftOutput CraftDefinitionToolRepair::getOutput(
- const CraftInput &input, IGameDef *gamedef) const
+CraftOutput CraftDefinitionToolRepair::getOutput(const CraftInput &input, IGameDef *gamedef) const
{
ItemStack item1;
ItemStack item2;
@@ -671,16 +670,15 @@ CraftOutput CraftDefinitionToolRepair::getOutput(
return CraftOutput(repaired.getItemString(), 0);
}
-CraftInput CraftDefinitionToolRepair::getInput(
- const CraftOutput &output, IGameDef *gamedef) const
+CraftInput CraftDefinitionToolRepair::getInput(const CraftOutput &output, IGameDef *gamedef) const
{
std::vector<ItemStack> stack;
stack.emplace_back();
return CraftInput(CRAFT_METHOD_COOKING, additional_wear, stack);
}
-void CraftDefinitionToolRepair::decrementInput(CraftInput &input,
- std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const
+void CraftDefinitionToolRepair::decrementInput(CraftInput &input, std::vector<ItemStack> &output_replacements,
+ IGameDef *gamedef) const
{
craftDecrementInput(input, gamedef);
}
@@ -696,11 +694,12 @@ std::string CraftDefinitionToolRepair::dump() const
CraftDefinitionCooking
*/
-CraftDefinitionCooking::CraftDefinitionCooking(const std::string &output_,
- const std::string &recipe_, float cooktime_,
- const CraftReplacements &replacements_) :
- output(output_),
- recipe(recipe_), cooktime(cooktime_), replacements(replacements_)
+CraftDefinitionCooking::CraftDefinitionCooking(
+ const std::string &output_,
+ const std::string &recipe_,
+ float cooktime_,
+ const CraftReplacements &replacements_):
+ output(output_), recipe(recipe_), cooktime(cooktime_), replacements(replacements_)
{
if (isGroupRecipeStr(recipe))
priority = PRIORITY_SHAPELESS_AND_GROUPS;
@@ -738,22 +737,20 @@ bool CraftDefinitionCooking::check(const CraftInput &input, IGameDef *gamedef) c
return inputItemMatchesRecipe(input_filtered[0], recipe, gamedef->idef());
}
-CraftOutput CraftDefinitionCooking::getOutput(
- const CraftInput &input, IGameDef *gamedef) const
+CraftOutput CraftDefinitionCooking::getOutput(const CraftInput &input, IGameDef *gamedef) const
{
return CraftOutput(output, cooktime);
}
-CraftInput CraftDefinitionCooking::getInput(
- const CraftOutput &output, IGameDef *gamedef) const
+CraftInput CraftDefinitionCooking::getInput(const CraftOutput &output, IGameDef *gamedef) const
{
std::vector<std::string> rec;
rec.push_back(recipe);
- return CraftInput(CRAFT_METHOD_COOKING, cooktime, craftGetItems(rec, gamedef));
+ return CraftInput(CRAFT_METHOD_COOKING,cooktime,craftGetItems(rec,gamedef));
}
-void CraftDefinitionCooking::decrementInput(CraftInput &input,
- std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const
+void CraftDefinitionCooking::decrementInput(CraftInput &input, std::vector<ItemStack> &output_replacements,
+ IGameDef *gamedef) const
{
craftDecrementOrReplaceInput(input, output_replacements, replacements, gamedef);
}
@@ -789,9 +786,10 @@ void CraftDefinitionCooking::initHash(IGameDef *gamedef)
std::string CraftDefinitionCooking::dump() const
{
std::ostringstream os(std::ios::binary);
- os << "(cooking, output=\"" << output << "\", recipe=\"" << recipe
- << "\", cooktime=" << cooktime << ")"
- << ", replacements=" << replacements.dump() << ")";
+ os << "(cooking, output=\"" << output
+ << "\", recipe=\"" << recipe
+ << "\", cooktime=" << cooktime << ")"
+ << ", replacements=" << replacements.dump() << ")";
return os.str();
}
@@ -799,10 +797,11 @@ std::string CraftDefinitionCooking::dump() const
CraftDefinitionFuel
*/
-CraftDefinitionFuel::CraftDefinitionFuel(const std::string &recipe_, float burntime_,
- const CraftReplacements &replacements_) :
- recipe(recipe_),
- burntime(burntime_), replacements(replacements_)
+CraftDefinitionFuel::CraftDefinitionFuel(
+ const std::string &recipe_,
+ float burntime_,
+ const CraftReplacements &replacements_):
+ recipe(recipe_), burntime(burntime_), replacements(replacements_)
{
if (isGroupRecipeStr(recipe_name))
priority = PRIORITY_SHAPELESS_AND_GROUPS;
@@ -840,23 +839,20 @@ bool CraftDefinitionFuel::check(const CraftInput &input, IGameDef *gamedef) cons
return inputItemMatchesRecipe(input_filtered[0], recipe, gamedef->idef());
}
-CraftOutput CraftDefinitionFuel::getOutput(
- const CraftInput &input, IGameDef *gamedef) const
+CraftOutput CraftDefinitionFuel::getOutput(const CraftInput &input, IGameDef *gamedef) const
{
return CraftOutput("", burntime);
}
-CraftInput CraftDefinitionFuel::getInput(
- const CraftOutput &output, IGameDef *gamedef) const
+CraftInput CraftDefinitionFuel::getInput(const CraftOutput &output, IGameDef *gamedef) const
{
std::vector<std::string> rec;
rec.push_back(recipe);
- return CraftInput(
- CRAFT_METHOD_COOKING, (int)burntime, craftGetItems(rec, gamedef));
+ return CraftInput(CRAFT_METHOD_COOKING,(int)burntime,craftGetItems(rec,gamedef));
}
-void CraftDefinitionFuel::decrementInput(CraftInput &input,
- std::vector<ItemStack> &output_replacements, IGameDef *gamedef) const
+void CraftDefinitionFuel::decrementInput(CraftInput &input, std::vector<ItemStack> &output_replacements,
+ IGameDef *gamedef) const
{
craftDecrementOrReplaceInput(input, output_replacements, replacements, gamedef);
}
@@ -892,8 +888,9 @@ void CraftDefinitionFuel::initHash(IGameDef *gamedef)
std::string CraftDefinitionFuel::dump() const
{
std::ostringstream os(std::ios::binary);
- os << "(fuel, recipe=\"" << recipe << "\", burntime=" << burntime << ")"
- << ", replacements=" << replacements.dump() << ")";
+ os << "(fuel, recipe=\"" << recipe
+ << "\", burntime=" << burntime << ")"
+ << ", replacements=" << replacements.dump() << ")";
return os.str();
}
@@ -901,12 +898,18 @@ std::string CraftDefinitionFuel::dump() const
Craft definition manager
*/
-class CCraftDefManager : public IWritableCraftDefManager
+class CCraftDefManager: public IWritableCraftDefManager
{
public:
- CCraftDefManager() { m_craft_defs.resize(craft_hash_type_max + 1); }
+ CCraftDefManager()
+ {
+ m_craft_defs.resize(craft_hash_type_max + 1);
+ }
- virtual ~CCraftDefManager() { clear(); }
+ virtual ~CCraftDefManager()
+ {
+ clear();
+ }
virtual bool getCraftResult(CraftInput &input, CraftOutput &output,
std::vector<ItemStack> &output_replacement, bool decrementInput,
@@ -922,48 +925,40 @@ public:
// Try hash types with increasing collision rate
// while remembering the latest, highest priority recipe.
CraftDefinition::RecipePriority priority_best =
- CraftDefinition::PRIORITY_NO_RECIPE;
+ CraftDefinition::PRIORITY_NO_RECIPE;
CraftDefinition *def_best = nullptr;
for (int type = 0; type <= craft_hash_type_max; type++) {
- u64 hash = getHashForGrid((CraftHashType)type, input_names);
+ u64 hash = getHashForGrid((CraftHashType) type, input_names);
- /*errorstream << "Checking type " << type << " with hash " << hash
- * << std::endl;*/
+ /*errorstream << "Checking type " << type << " with hash " << hash << std::endl;*/
- // We'd like to do "const [...] hash_collisions =
- // m_craft_defs[type][hash];" but that doesn't compile for some
- // reason. This does.
+ // We'd like to do "const [...] hash_collisions = m_craft_defs[type][hash];"
+ // but that doesn't compile for some reason. This does.
auto col_iter = (m_craft_defs[type]).find(hash);
if (col_iter == (m_craft_defs[type]).end())
continue;
- const std::vector<CraftDefinition *> &hash_collisions =
- col_iter->second;
+ const std::vector<CraftDefinition*> &hash_collisions = col_iter->second;
// Walk crafting definitions from back to front, so that later
// definitions can override earlier ones.
- for (std::vector<CraftDefinition *>::size_type i =
- hash_collisions.size();
- i > 0; i--) {
+ for (std::vector<CraftDefinition*>::size_type
+ i = hash_collisions.size(); i > 0; i--) {
CraftDefinition *def = hash_collisions[i - 1];
/*errorstream << "Checking " << input.dump() << std::endl
<< " against " << def->dump() << std::endl;*/
- CraftDefinition::RecipePriority priority =
- def->getPriority();
- if (priority > priority_best &&
- def->check(input, gamedef)) {
+ CraftDefinition::RecipePriority priority = def->getPriority();
+ if (priority > priority_best
+ && def->check(input, gamedef)) {
// Check if the crafted node/item exists
CraftOutput out = def->getOutput(input, gamedef);
ItemStack is;
is.deSerialize(out.item, gamedef->idef());
if (!is.isKnown(gamedef->idef())) {
- infostream << "trying to craft "
- "non-existent "
- << out.item
- << ", ignoring recipe"
- << std::endl;
+ infostream << "trying to craft non-existent "
+ << out.item << ", ignoring recipe" << std::endl;
continue;
}
@@ -980,22 +975,22 @@ public:
return true;
}
- virtual std::vector<CraftDefinition *> getCraftRecipes(
- CraftOutput &output, IGameDef *gamedef, unsigned limit = 0) const
+ virtual std::vector<CraftDefinition*> getCraftRecipes(CraftOutput &output,
+ IGameDef *gamedef, unsigned limit=0) const
{
- std::vector<CraftDefinition *> recipes;
+ std::vector<CraftDefinition*> recipes;
auto vec_iter = m_output_craft_definitions.find(output.item);
if (vec_iter == m_output_craft_definitions.end())
return recipes;
- const std::vector<CraftDefinition *> &vec = vec_iter->second;
+ const std::vector<CraftDefinition*> &vec = vec_iter->second;
recipes.reserve(limit ? MYMIN(limit, vec.size()) : vec.size());
- for (std::vector<CraftDefinition *>::size_type i = vec.size(); i > 0;
- i--) {
+ for (std::vector<CraftDefinition*>::size_type i = vec.size();
+ i > 0; i--) {
CraftDefinition *def = vec[i - 1];
if (limit && recipes.size() >= limit)
break;
@@ -1014,10 +1009,8 @@ public:
for (auto def : to_clear->second) {
// Recipes are not yet hashed at this point
- std::vector<CraftDefinition *> &defs =
- m_craft_defs[(int)CRAFT_HASH_TYPE_UNHASHED][0];
- defs.erase(std::remove(defs.begin(), defs.end(), def),
- defs.end());
+ std::vector<CraftDefinition *> &defs = m_craft_defs[(int)CRAFT_HASH_TYPE_UNHASHED][0];
+ defs.erase(std::remove(defs.begin(), defs.end(), def), defs.end());
delete def;
}
m_output_craft_definitions.erase(to_clear);
@@ -1030,8 +1023,7 @@ public:
return false;
// Recipes are not yet hashed at this point
- std::vector<CraftDefinition *> &defs =
- m_craft_defs[(int)CRAFT_HASH_TYPE_UNHASHED][0];
+ std::vector<CraftDefinition *> &defs = m_craft_defs[(int)CRAFT_HASH_TYPE_UNHASHED][0];
std::vector<CraftDefinition *> new_defs;
bool got_hit = false;
for (auto def : defs) {
@@ -1042,13 +1034,11 @@ public:
got_hit = true;
std::string output = def->getOutput(input, gamedef).item;
delete def;
- auto it = m_output_craft_definitions.find(
- craftGetItemName(output, gamedef));
+ auto it = m_output_craft_definitions.find(craftGetItemName(output, gamedef));
if (it == m_output_craft_definitions.end())
continue;
std::vector<CraftDefinition *> &outdefs = it->second;
- outdefs.erase(std::remove(outdefs.begin(), outdefs.end(), def),
- outdefs.end());
+ outdefs.erase(std::remove(outdefs.begin(), outdefs.end(), def), outdefs.end());
}
if (got_hit)
defs.swap(new_defs);
@@ -1063,10 +1053,12 @@ public:
for (int type = 0; type <= craft_hash_type_max; ++type) {
for (auto it = m_craft_defs[type].begin();
it != m_craft_defs[type].end(); ++it) {
- for (std::vector<CraftDefinition *>::size_type i = 0;
+ for (std::vector<CraftDefinition*>::size_type i = 0;
i < it->second.size(); i++) {
- os << "type " << type << " hash " << it->first
- << " def " << it->second[i]->dump() << "\n";
+ os << "type " << type
+ << " hash " << it->first
+ << " def " << it->second[i]->dump()
+ << "\n";
}
}
}
@@ -1075,8 +1067,8 @@ public:
virtual void registerCraft(CraftDefinition *def, IGameDef *gamedef)
{
TRACESTREAM(<< "registerCraft: registering craft definition: "
- << def->dump() << std::endl);
- m_craft_defs[(int)CRAFT_HASH_TYPE_UNHASHED][0].push_back(def);
+ << def->dump() << std::endl);
+ m_craft_defs[(int) CRAFT_HASH_TYPE_UNHASHED][0].push_back(def);
CraftInput input;
std::string output_name = craftGetItemName(
@@ -1100,7 +1092,7 @@ public:
{
// Move the CraftDefs from the unhashed layer into layers higher up.
std::vector<CraftDefinition *> &unhashed =
- m_craft_defs[(int)CRAFT_HASH_TYPE_UNHASHED][0];
+ m_craft_defs[(int) CRAFT_HASH_TYPE_UNHASHED][0];
for (auto def : unhashed) {
// Initialize and get the definition's hash
def->initHash(gamedef);
@@ -1112,14 +1104,14 @@ public:
}
unhashed.clear();
}
-
private:
- std::vector<std::unordered_map<u64, std::vector<CraftDefinition *>>> m_craft_defs;
- std::unordered_map<std::string, std::vector<CraftDefinition *>>
- m_output_craft_definitions;
+ std::vector<std::unordered_map<u64, std::vector<CraftDefinition*> > >
+ m_craft_defs;
+ std::unordered_map<std::string, std::vector<CraftDefinition*> >
+ m_output_craft_definitions;
};
-IWritableCraftDefManager *createCraftDefManager()
+IWritableCraftDefManager* createCraftDefManager()
{
return new CCraftDefManager();
}