From 97eedd6f443c93406b1b43f4b3239a94c61ef9f1 Mon Sep 17 00:00:00 2001 From: Giuseppe Bilotta Date: Tue, 29 Dec 2020 12:28:33 +0100 Subject: [PATCH] Introduce auxiliary functions to change craft amount In the next commits these will be used in place of the hardcoded overrides. --- redefinitions.lua | 67 ++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) diff --git a/redefinitions.lua b/redefinitions.lua index 1856c98..f758ffe 100644 --- a/redefinitions.lua +++ b/redefinitions.lua @@ -5,7 +5,72 @@ Copyright © 2011-2020 Hugo Locurcio and contributors. Licensed under the zlib license. See LICENSE.md for more information. --]] --- Redefinitions of some default crafting recipes: +-- Redefine some of the default crafting recipes to be more productive + +-- Auxiliary function: take a recipe as returned by get_all_craft_recipes +-- and turn it into a table that can be used to clear a craft or declare a new one +local reconstruct_internal_craft = function(recipe) + local recp = { + { "", "", "" }, + { "", "", "" }, + { "", "", "" }, + } + for idx, item in pairs(recipe.items) do + local row = math.ceil(idx / recipe.width) + local col = idx - (row-1)*recipe.width + recp[row][col] = item + end + return recp +end + +-- Change the amount produced by recipe by apply func to the old amount +local change_recipe_amount = function(product, recipe, func) + local recp = reconstruct_internal_craft(recipe) + + local oldamount = tonumber(recipe.output:match(" [0-9]+$") or "1") + + local newamount = func(oldamount) + + -- remove old crafting recipe + local redo = { recipe = recp } + minetest.clear_craft(redo) + + -- new output + redo.output = ("%s %d"):format(product, newamount) + minetest.register_craft(redo) + + minetest.log(("moreblocks recipe for %s production: %d => %d"):format(product, oldamount, newamount)) +end + +local increase_craft_production = function(product, func) + local recipes = minetest.get_all_craft_recipes(product) + for _, r in pairs(recipes) do + if r.type == "normal" or r.method == "normal" then + minetest.log(dump(r)) + change_recipe_amount(product, r, func) + end + end +end + +-- Increase the crafting production according to the rules from the table, which is in the form: +-- { +-- { detector, amount changing function } +-- { detector, amount changing function } +-- } +-- TODO: consider exporting this function to other mods +local increase_craft_production_table = function(map_table) + for product, _ in pairs(minetest.registered_items) do + for _, tab in pairs(map_table) do + local detector = tab[1] + local func = tab[2] + if detector(product) then + increase_craft_production(product, func) + -- only apply one boost + break + end + end + end +end -- Signs: +1 minetest.clear_craft({