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 Cable =
%s CNC Machine =
%s Centrifuge =
%s Compressor =
%s Extractor =
%s Forcefield Emitter =
@ -190,3 +191,4 @@ Alloy cooking =
Grinding =
Compressing =
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.."/extractor.lua")
dofile(path.."/compressor.lua")
dofile(path.."/centrifuge.lua")
dofile(path.."/tool_workshop.lua")

View File

@ -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

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
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

View File

@ -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

View File

@ -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

View File

@ -19,6 +19,7 @@ dofile(path.."/alloy_recipes.lua")
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.."/electric_furnace.lua")
dofile(path.."/grinder.lua")
dofile(path.."/extractor.lua")
dofile(path.."/compressor.lua")
dofile(path.."/centrifuge.lua")

View File

@ -17,7 +17,7 @@ local tube = {
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 @@ function technic.register_base_machine(data)
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 @@ function technic.register_base_machine(data)
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 @@ function technic.register_base_machine(data)
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)

View File

@ -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 @@ local function register_recipe(typename, data)
for i, stack in ipairs(data.input) do
data.input[i] = ItemStack(stack):to_string()
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()
end
local recipe = {time = data.time, input = {}, output = data.output}
local index = get_recipe_index(data.input)
@ -35,7 +45,7 @@ local function register_recipe(typename, data)
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,

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