Allow groups in crafting recipes
authorPerttu Ahola <celeron55@gmail.com>
Wed, 6 Jun 2012 20:39:17 +0000 (23:39 +0300)
committerPerttu Ahola <celeron55@gmail.com>
Wed, 6 Jun 2012 20:39:17 +0000 (23:39 +0300)
doc/lua_api.txt
games/minimal/mods/experimental/init.lua
src/craftdef.cpp

index 5ec8ef79ba55145f599cf0d4a039b813563fa89b..16587144d4c48d8b3c5f3714f9d9984a9713ca1d 100644 (file)
@@ -363,8 +363,7 @@ effective towards.
 
 Groups in crafting recipes
 ---------------------------
-- Not implemented yet. (TODO)
-- Will probably look like this:
+An example:
 {
     output = 'food:meat_soup_raw',
     recipe = {
@@ -372,7 +371,7 @@ Groups in crafting recipes
         {'group:water'},
         {'group:bowl'},
     },
-    preserve = {'group:bowl'},
+    preserve = {'group:bowl'}, -- Not implemented yet (TODO)
 }
 
 Special groups
@@ -1210,19 +1209,19 @@ Node definition (register_node)
     ^ default: minetest.node_metadata_inventory_take_allow_all
 }
 
-Recipe: (register_craft)
+Recipe for register_craft: (shaped)
 {
     output = 'default:pick_stone',
     recipe = {
         {'default:cobble', 'default:cobble', 'default:cobble'},
         {'', 'default:stick', ''},
-        {'', 'default:stick', ''},
+        {'', 'default:stick', ''}, -- Also groups; eg. 'group:crumbly'
     },
     replacements = <optional list of item pairs,
                     replace one input item with another item on crafting>
 }
 
-Recipe (shapeless):
+Recipe for register_craft (shapeless)
 {
     type = "shapeless",
     output = 'mushrooms:mushroom_stew',
@@ -1235,13 +1234,13 @@ Recipe (shapeless):
                     replace one input item with another item on crafting>
 }
 
-Recipe (tool repair):
+Recipe for register_craft (tool repair)
 {
     type = "toolrepair",
     additional_wear = -0.02,
 }
 
-Recipe (cooking):
+Recipe for register_craft (cooking)
 {
     type = "cooking",
     output = "default:glass",
@@ -1249,7 +1248,7 @@ Recipe (cooking):
     cooktime = 3,
 }
 
-Recipe (furnace fuel):
+Recipe for register_craft (furnace fuel)
 {
     type = "fuel",
     recipe = "default:leaves",
index c8ffb25de36254d937b49f93b17b4ad151f98160..e8551034f629e1c0252a91c1b4caabbfcd73953c 100644 (file)
@@ -496,6 +496,14 @@ minetest.register_craftitem("experimental:tester_tool_1", {
        end,
 })
 
+minetest.register_craft({
+       output = 'experimental:tester_tool_1',
+       recipe = {
+               {'group:crumbly'},
+               {'group:crumbly'},
+       }
+})
+
 minetest.log("experimental modname="..dump(minetest.get_current_modname()))
 minetest.log("experimental modpath="..dump(minetest.get_modpath("experimental")))
 minetest.log("experimental worldpath="..dump(minetest.get_worldpath()))
index 57a1851af044775d7441970c95a92ffb97d1b2b6..37fa63a005ecade3b82e5c6606e3a6e80986b576 100644 (file)
@@ -27,6 +27,26 @@ with this program; if not, write to the Free Software Foundation, Inc.,
 #include "gamedef.h"
 #include "inventory.h"
 
+// Check if input matches recipe
+// Takes recipe groups into account
+static bool inputItemMatchesRecipe(const std::string &inp_name,
+               const std::string &rec_name, IItemDefManager *idef)
+{
+       // Exact name
+       if(inp_name == rec_name)
+               return true;
+       
+       // Group
+       if(rec_name.substr(0,6) == "group:" && idef->isKnown(inp_name)){
+               std::string rec_group = rec_name.substr(6);
+               const struct ItemDefinition &def = idef->get(inp_name);
+               if(itemgroup_get(def.groups, rec_group) != 0)
+                       return true;
+       }
+       
+       // Didn't match
+       return false;
+}
 
 // Deserialize an itemstring then return the name of the item
 static std::string craftGetItemName(const std::string &itemstring, IGameDef *gamedef)
@@ -403,9 +423,9 @@ bool CraftDefinitionShaped::check(const CraftInput &input, IGameDef *gamedef) co
                unsigned int rec_x = rec_min_x + x;
                unsigned int rec_y = rec_min_y + y;
 
-               if(
-                       inp_names[inp_y * inp_width + inp_x] !=
-                       rec_names[rec_y * rec_width + rec_x]
+               if(!inputItemMatchesRecipe(
+                               inp_names[inp_y * inp_width + inp_x],
+                               rec_names[rec_y * rec_width + rec_x], gamedef->idef())
                ){
                        return false;
                }