Zefram
2014-07-15 dd65a68ce9f494717faffc98c45814f9a9d67fa4
Add centrifuge

The centrifuge, currently only existing in an MV variety, is a machine
that separates a mixed substance into its constituents. Currently the
main use is to reverse alloying of metals. The alloy separation recipes
intentionally only operate on the dust form of metals, making this less
convenient than the original alloying. It also only recovers metal
constituents, not the carbon that went into cast iron or carbon steel.

This change incidentally generalises the technic recipe and
machine infrastructure to handle recipes with multiple outputs.
As unified_inventory's craft guide can't yet handle that, these recipes
are not registered there.
8 files added
9 files modified
128 ■■■■ changed files
technic/locale/template.txt 2 ●●●●● patch | view | raw | blame | history
technic/machines/MV/centrifuge.lua 16 ●●●●● patch | view | raw | blame | history
technic/machines/MV/init.lua 1 ●●●● patch | view | raw | blame | history
technic/machines/register/alloy_recipes.lua 5 ●●●● patch | view | raw | blame | history
technic/machines/register/centrifuge.lua 8 ●●●●● patch | view | raw | blame | history
technic/machines/register/centrifuge_recipes.lua 31 ●●●●● patch | view | raw | blame | history
technic/machines/register/compressor_recipes.lua 2 ●●● patch | view | raw | blame | history
technic/machines/register/extractor_recipes.lua 2 ●●● patch | view | raw | blame | history
technic/machines/register/grinder_recipes.lua 2 ●●● patch | view | raw | blame | history
technic/machines/register/init.lua 3 ●●●● patch | view | raw | blame | history
technic/machines/register/machine_base.lua 28 ●●●● patch | view | raw | blame | history
technic/machines/register/recipes.lua 28 ●●●●● patch | view | raw | blame | history
technic/textures/technic_mv_centrifuge_bottom.png patch | view | raw | blame | history
technic/textures/technic_mv_centrifuge_front.png patch | view | raw | blame | history
technic/textures/technic_mv_centrifuge_front_active.png patch | view | raw | blame | history
technic/textures/technic_mv_centrifuge_side.png patch | view | raw | blame | history
technic/textures/technic_mv_centrifuge_top.png patch | view | raw | blame | history
technic/locale/template.txt
@@ -64,6 +64,7 @@
%s Battery Box = 
%s Cable =
%s CNC Machine =
%s Centrifuge =
%s Compressor =
%s Extractor =
%s Forcefield Emitter =
@@ -190,3 +191,4 @@
Grinding =
Compressing =
Extracting =
Separating =
technic/machines/MV/centrifuge.lua
New file
@@ -0,0 +1,16 @@
minetest.register_craft({
    output = "technic:mv_centrifuge",
    recipe = {
        { "technic:motor",          "technic:copper_plate",   "technic:diamond_drill_head" },
        { "technic:copper_plate",   "technic:machine_casing", "technic:copper_plate"       },
        { "pipeworks:one_way_tube", "technic:mv_cable0",      "pipeworks:mese_filter"      },
    }
})
technic.register_centrifuge({
    tier = "MV",
    demand = { 8000, 7000, 6000 },
    speed = 2,
    upgrade = 1,
    tube = 1,
})
technic/machines/MV/init.lua
@@ -20,6 +20,7 @@
dofile(path.."/grinder.lua")
dofile(path.."/extractor.lua")
dofile(path.."/compressor.lua")
dofile(path.."/centrifuge.lua")
dofile(path.."/tool_workshop.lua")
technic/machines/register/alloy_recipes.lua
@@ -1,7 +1,10 @@
local S = technic.getter
technic.register_recipe_type("alloy", S("Alloy cooking"), 2)
technic.register_recipe_type("alloy", {
    description = S("Alloy cooking"),
    input_size = 2,
})
function technic.register_alloy_recipe(data)
    data.time = data.time or 6
technic/machines/register/centrifuge.lua
New file
@@ -0,0 +1,8 @@
local S = technic.getter
function technic.register_centrifuge(data)
    data.typename = "separating"
    data.machine_name = "centrifuge"
    data.machine_desc = S("%s Centrifuge")
    technic.register_base_machine(data)
end
technic/machines/register/centrifuge_recipes.lua
New file
@@ -0,0 +1,31 @@
local S = technic.getter
technic.register_recipe_type("separating", {
    description = S("Separating"),
    output_size = 2,
})
function technic.register_separating_recipe(data)
    data.time = data.time or 10
    technic.register_recipe("separating", data)
end
local rubber_tree_planks = minetest.get_modpath("moretrees") and "moretrees:rubber_tree_planks" or "default:wood"
local recipes = {
    { "technic:bronze_dust 4",             "technic:copper_dust 3",       "technic:tin_dust"      },
    { "technic:stainless_steel_dust 4",    "technic:wrought_iron_dust 3", "technic:chromium_dust" },
    { "technic:brass_dust 3",              "technic:copper_dust 2",       "technic:zinc_dust"     },
    { "moretrees:rubber_tree_trunk_empty", rubber_tree_planks.." 4",      "technic:raw_latex"     },
    { "moretrees:rubber_tree_trunk",       rubber_tree_planks.." 4",      "technic:raw_latex"     },
}
if minetest.get_modpath("bushes_classic") then
    for _, berry in ipairs({ "blackberry", "blueberry", "gooseberry", "raspberry", "strawberry" }) do
        table.insert(recipes, { "bushes:"..berry.."_bush", "default:stick 20", "bushes:"..berry.." 4" })
    end
end
for _, data in pairs(recipes) do
    technic.register_separating_recipe({ input = { data[1] }, output = { data[2], data[3] } })
end
technic/machines/register/compressor_recipes.lua
@@ -1,7 +1,7 @@
local S = technic.getter
technic.register_recipe_type("compressing", S("Compressing"))
technic.register_recipe_type("compressing", { description = S("Compressing") })
function technic.register_compressor_recipe(data)
    data.time = data.time or 4
technic/machines/register/extractor_recipes.lua
@@ -1,7 +1,7 @@
local S = technic.getter
technic.register_recipe_type("extracting", S("Extracting"))
technic.register_recipe_type("extracting", { description = S("Extracting") })
function technic.register_extractor_recipe(data)
    data.time = data.time or 4
technic/machines/register/grinder_recipes.lua
@@ -1,7 +1,7 @@
local S = technic.getter
technic.register_recipe_type("grinding", S("Grinding"))
technic.register_recipe_type("grinding", { description = S("Grinding") })
function technic.register_grinder_recipe(data)
    data.time = data.time or 3
technic/machines/register/init.lua
@@ -19,6 +19,7 @@
dofile(path.."/grinder_recipes.lua")
dofile(path.."/extractor_recipes.lua")
dofile(path.."/compressor_recipes.lua")
dofile(path.."/centrifuge_recipes.lua")
-- Machines
dofile(path.."/alloy_furnace.lua")
@@ -26,4 +27,4 @@
dofile(path.."/grinder.lua")
dofile(path.."/extractor.lua")
dofile(path.."/compressor.lua")
dofile(path.."/centrifuge.lua")
technic/machines/register/machine_base.lua
@@ -17,7 +17,7 @@
function technic.register_base_machine(data)
    local typename = data.typename
    local numitems = technic.recipes[typename].numitems
    local input_size = technic.recipes[typename].input_size
    local machine_name = data.machine_name
    local machine_desc = data.machine_desc
    local tier = data.tier
@@ -35,7 +35,7 @@
    local formspec =
        "invsize[8,9;]"..
        "list[current_name;src;"..(4-numitems)..",1;"..numitems..",1;]"..
        "list[current_name;src;"..(4-input_size)..",1;"..input_size..",1;]"..
        "list[current_name;dst;5,1;2,2;]"..
        "list[current_player;main;0,5;8,4;]"..
        "label[0,0;"..machine_desc:format(tier).."]"
@@ -91,10 +91,26 @@
            meta:set_int("src_time", meta:get_int("src_time") + 1)
            if meta:get_int("src_time") >= result.time / data.speed then
                meta:set_int("src_time", 0)
                local result_stack = ItemStack(result.output)
                if inv:room_for_item("dst", result_stack) then
                local output = result.output
                if type(output) ~= "table" then output = { output } end
                local output_stacks = {}
                for _, o in ipairs(output) do
                    table.insert(output_stacks, ItemStack(o))
                end
                local room_for_output = true
                inv:set_size("dst_tmp", inv:get_size("dst"))
                inv:set_list("dst_tmp", inv:get_list("dst"))
                for _, o in ipairs(output_stacks) do
                    if not inv:room_for_item("dst_tmp", o) then
                        room_for_output = false
                        break
                    end
                    inv:add_item("dst_tmp", o)
                end
                if room_for_output then
                    inv:set_list("src", result.new_input)
                    inv:add_item("dst", result_stack)
                    inv:set_list("dst", inv:get_list("dst_tmp"))
                else
                end
            end
        end
@@ -121,7 +137,7 @@
            meta:set_int("tube_time",  0)
            meta:set_string("formspec", formspec)
            local inv = meta:get_inventory()
            inv:set_size("src", numitems)
            inv:set_size("src", input_size)
            inv:set_size("dst", 4)
            inv:set_size("upgrade1", 1)
            inv:set_size("upgrade2", 1)
technic/machines/register/recipes.lua
@@ -1,15 +1,19 @@
technic.recipes = {cooking = {numitems = 1}}
function technic.register_recipe_type(typename, desc, numitems)
    numitems = numitems or 1
    if unified_inventory and unified_inventory.register_craft_type then
technic.recipes = { cooking = { input_size = 1, output_size = 1 } }
function technic.register_recipe_type(typename, origdata)
    local data = {}
    for k, v in pairs(origdata) do data[k] = v end
    data.input_size = data.input_size or 1
    data.output_size = data.output_size or 1
    if unified_inventory and unified_inventory.register_craft_type and data.output_size == 1 then
        unified_inventory.register_craft_type(typename, {
            description = desc,
            height = numitems,
            description = data.description,
            height = data.input_size,
            width = 1,
        })
    end
    technic.recipes[typename] = {numitems = numitems, recipes = {}}
    data.recipes = {}
    technic.recipes[typename] = data
end
local function get_recipe_index(items)
@@ -26,7 +30,13 @@
    for i, stack in ipairs(data.input) do
        data.input[i] = ItemStack(stack):to_string()
    end
    data.output = ItemStack(data.output):to_string()
    if type(data.output) == "table" then
        for i, v in ipairs(data.output) do
            data.output[i] = ItemStack(data.output[i]):to_string()
        end
    else
        data.output = ItemStack(data.output):to_string()
    end
    
    local recipe = {time = data.time, input = {}, output = data.output}
    local index = get_recipe_index(data.input)
@@ -35,7 +45,7 @@
    end
    
    technic.recipes[typename].recipes[index] = recipe
    if unified_inventory then
    if unified_inventory and technic.recipes[typename].output_size == 1 then
        unified_inventory.register_craft({
            type = typename,
            output = data.output,
technic/textures/technic_mv_centrifuge_bottom.png
technic/textures/technic_mv_centrifuge_front.png
technic/textures/technic_mv_centrifuge_front_active.png
technic/textures/technic_mv_centrifuge_side.png
technic/textures/technic_mv_centrifuge_top.png