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.
This commit is contained in:
Zefram 2014-07-15 18:29:36 +01:00
parent 84cf6504c5
commit dd65a68ce9
17 changed files with 108 additions and 20 deletions

View File

@ -64,6 +64,7 @@ Controlled by Mesecon Signal =
%s Battery Box = %s Battery Box =
%s Cable = %s Cable =
%s CNC Machine = %s CNC Machine =
%s Centrifuge =
%s Compressor = %s Compressor =
%s Extractor = %s Extractor =
%s Forcefield Emitter = %s Forcefield Emitter =
@ -190,3 +191,4 @@ Alloy cooking =
Grinding = Grinding =
Compressing = Compressing =
Extracting = Extracting =
Separating =

View 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,
})

View File

@ -20,6 +20,7 @@ dofile(path.."/electric_furnace.lua")
dofile(path.."/grinder.lua") dofile(path.."/grinder.lua")
dofile(path.."/extractor.lua") dofile(path.."/extractor.lua")
dofile(path.."/compressor.lua") dofile(path.."/compressor.lua")
dofile(path.."/centrifuge.lua")
dofile(path.."/tool_workshop.lua") dofile(path.."/tool_workshop.lua")

View File

@ -1,7 +1,10 @@
local S = technic.getter 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) function technic.register_alloy_recipe(data)
data.time = data.time or 6 data.time = data.time or 6

View 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

View 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

View File

@ -1,7 +1,7 @@
local S = technic.getter 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) function technic.register_compressor_recipe(data)
data.time = data.time or 4 data.time = data.time or 4

View File

@ -1,7 +1,7 @@
local S = technic.getter 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) function technic.register_extractor_recipe(data)
data.time = data.time or 4 data.time = data.time or 4

View File

@ -1,7 +1,7 @@
local S = technic.getter 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) function technic.register_grinder_recipe(data)
data.time = data.time or 3 data.time = data.time or 3

View File

@ -19,6 +19,7 @@ dofile(path.."/alloy_recipes.lua")
dofile(path.."/grinder_recipes.lua") dofile(path.."/grinder_recipes.lua")
dofile(path.."/extractor_recipes.lua") dofile(path.."/extractor_recipes.lua")
dofile(path.."/compressor_recipes.lua") dofile(path.."/compressor_recipes.lua")
dofile(path.."/centrifuge_recipes.lua")
-- Machines -- Machines
dofile(path.."/alloy_furnace.lua") dofile(path.."/alloy_furnace.lua")
@ -26,4 +27,4 @@ dofile(path.."/electric_furnace.lua")
dofile(path.."/grinder.lua") dofile(path.."/grinder.lua")
dofile(path.."/extractor.lua") dofile(path.."/extractor.lua")
dofile(path.."/compressor.lua") dofile(path.."/compressor.lua")
dofile(path.."/centrifuge.lua")

View File

@ -17,7 +17,7 @@ local tube = {
function technic.register_base_machine(data) function technic.register_base_machine(data)
local typename = data.typename 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_name = data.machine_name
local machine_desc = data.machine_desc local machine_desc = data.machine_desc
local tier = data.tier local tier = data.tier
@ -35,7 +35,7 @@ function technic.register_base_machine(data)
local formspec = local formspec =
"invsize[8,9;]".. "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_name;dst;5,1;2,2;]"..
"list[current_player;main;0,5;8,4;]".. "list[current_player;main;0,5;8,4;]"..
"label[0,0;"..machine_desc:format(tier).."]" "label[0,0;"..machine_desc:format(tier).."]"
@ -91,10 +91,26 @@ function technic.register_base_machine(data)
meta:set_int("src_time", meta:get_int("src_time") + 1) meta:set_int("src_time", meta:get_int("src_time") + 1)
if meta:get_int("src_time") >= result.time / data.speed then if meta:get_int("src_time") >= result.time / data.speed then
meta:set_int("src_time", 0) meta:set_int("src_time", 0)
local result_stack = ItemStack(result.output) local output = result.output
if inv:room_for_item("dst", result_stack) then 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: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 end
end end
@ -121,7 +137,7 @@ function technic.register_base_machine(data)
meta:set_int("tube_time", 0) meta:set_int("tube_time", 0)
meta:set_string("formspec", formspec) meta:set_string("formspec", formspec)
local inv = meta:get_inventory() local inv = meta:get_inventory()
inv:set_size("src", numitems) inv:set_size("src", input_size)
inv:set_size("dst", 4) inv:set_size("dst", 4)
inv:set_size("upgrade1", 1) inv:set_size("upgrade1", 1)
inv:set_size("upgrade2", 1) inv:set_size("upgrade2", 1)

View File

@ -1,15 +1,19 @@
technic.recipes = {cooking = {numitems = 1}} technic.recipes = { cooking = { input_size = 1, output_size = 1 } }
function technic.register_recipe_type(typename, desc, numitems) function technic.register_recipe_type(typename, origdata)
numitems = numitems or 1 local data = {}
if unified_inventory and unified_inventory.register_craft_type then 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, { unified_inventory.register_craft_type(typename, {
description = desc, description = data.description,
height = numitems, height = data.input_size,
width = 1, width = 1,
}) })
end end
technic.recipes[typename] = {numitems = numitems, recipes = {}} data.recipes = {}
technic.recipes[typename] = data
end end
local function get_recipe_index(items) local function get_recipe_index(items)
@ -26,7 +30,13 @@ local function register_recipe(typename, data)
for i, stack in ipairs(data.input) do for i, stack in ipairs(data.input) do
data.input[i] = ItemStack(stack):to_string() data.input[i] = ItemStack(stack):to_string()
end end
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() data.output = ItemStack(data.output):to_string()
end
local recipe = {time = data.time, input = {}, output = data.output} local recipe = {time = data.time, input = {}, output = data.output}
local index = get_recipe_index(data.input) local index = get_recipe_index(data.input)
@ -35,7 +45,7 @@ local function register_recipe(typename, data)
end end
technic.recipes[typename].recipes[index] = recipe 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({ unified_inventory.register_craft({
type = typename, type = typename,
output = data.output, output = data.output,

Binary file not shown.

After

Width:  |  Height:  |  Size: 674 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 686 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 686 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 636 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 814 B