elepower/elepower_nuclear/machines/heat_exchanger.lua

144 lines
3.7 KiB
Lua
Raw Permalink Normal View History

2018-07-28 14:29:56 +00:00
-- see elepower_papi >> external_nodes_items.lua for explanation
-- shorten table ref
local epr = ele.external.ref
local epg = ele.external.graphic
2018-07-28 14:29:56 +00:00
local function get_formspec(heat, cold, water, steam)
return "size[8,8.5]"..
epr.gui_bg..
epr.gui_bg_img..
epr.gui_slots..
2018-07-28 14:29:56 +00:00
ele.formspec.fluid_bar(0, 0, heat)..
ele.formspec.fluid_bar(1, 0, cold)..
"image[3.5,1;1,1;"..epg.gui_furnace_arrow_bg.."^[transformR270]"..
2018-07-28 14:29:56 +00:00
ele.formspec.fluid_bar(6, 0, water)..
ele.formspec.fluid_bar(7, 0, steam)..
"list[current_player;main;0,4.25;8,1;]"..
"list[current_player;main;0,5.5;8,3;8]"..
"listring[current_player;main]"..
epr.get_hotbar_bg(0, 4.25)
2018-07-28 14:29:56 +00:00
end
2018-09-16 10:41:29 +00:00
local heat_recipes = {
["elepower_nuclear:hot_coolant_source"] = {
out = "elepower_nuclear:coolant_source",
factor = 8,
2018-09-16 10:41:29 +00:00
},
["elepower_nuclear:helium_plasma"] = {
out = "elepower_nuclear:helium",
factor = 32,
2018-09-16 10:41:29 +00:00
},
}
2018-07-28 14:29:56 +00:00
local function heat_exchanger_timer(pos)
local meta = minetest.get_meta(pos)
local change = false
local heat = fluid_lib.get_buffer_data(pos, "heat")
local cold = fluid_lib.get_buffer_data(pos, "cold")
local water = fluid_lib.get_buffer_data(pos, "water")
local steam = fluid_lib.get_buffer_data(pos, "steam")
2018-09-16 10:41:29 +00:00
while true do
2019-02-09 09:20:31 +00:00
if heat.fluid == "" or not heat_recipes[heat.fluid] then
2018-09-16 10:41:29 +00:00
break
2018-07-28 14:29:56 +00:00
end
2019-02-09 09:20:31 +00:00
-- Convert a maximum of 1000 buckets of hot fluid per second
local heatper = 1000
if heat.amount < 1000 then
heatper = heat.amount
end
2018-09-16 10:41:29 +00:00
-- See if we have enough hot coolant
2019-02-09 09:20:31 +00:00
if heatper > 0 and heat.fluid ~= "" then
2018-09-16 10:41:29 +00:00
local damnt = heat_recipes[heat.fluid]
2019-02-09 09:20:31 +00:00
local water_convert = math.min(water.amount, heatper * damnt.factor)
2018-09-16 10:41:29 +00:00
if cold.fluid ~= damnt.out and cold.fluid ~= "" then
2018-09-16 10:41:29 +00:00
break
end
if steam.amount + water_convert > steam.capacity then
water_convert = steam.capacity - steam.amount
end
2019-02-09 09:20:31 +00:00
if water_convert > 0 and cold.amount + heatper <= cold.capacity then
2018-07-28 14:29:56 +00:00
-- Conversion
2019-02-09 09:20:31 +00:00
heat.amount = heat.amount - heatper
cold.amount = cold.amount + heatper
2018-07-28 14:29:56 +00:00
water.amount = water.amount - water_convert
steam.amount = steam.amount + water_convert
2018-09-16 10:41:29 +00:00
cold.fluid = damnt.out
2018-07-28 14:29:56 +00:00
change = true
end
end
2018-09-16 10:41:29 +00:00
if heat.fluid ~= "" and heat.amount == 0 then
heat.fluid = ""
change = true
end
if cold.fluid ~= "" and cold.amount == 0 then
cold.fluid = ""
change = true
end
2018-09-16 10:41:29 +00:00
break
2018-07-28 14:29:56 +00:00
end
if change then
meta:set_string("heat_fluid", heat.fluid)
2018-09-16 10:41:29 +00:00
meta:set_string("cold_fluid", cold.fluid)
2018-07-28 14:29:56 +00:00
meta:set_string("steam_fluid", "elepower_dynamics:steam")
meta:set_int("heat_fluid_storage", heat.amount)
meta:set_int("cold_fluid_storage", cold.amount)
meta:set_int("water_fluid_storage", water.amount)
meta:set_int("steam_fluid_storage", steam.amount)
end
meta:set_string("formspec", get_formspec(heat, cold, water, steam))
2018-09-16 10:41:29 +00:00
return change
2018-07-28 14:29:56 +00:00
end
ele.register_machine("elepower_nuclear:heat_exchanger", {
description = "Shielded Heat Exchanger\nFor use in nuclear power plants",
tiles = {
"elenuclear_machine_top.png", "elepower_lead_block.png", "elenuclear_machine_side.png",
"elenuclear_machine_side.png", "elenuclear_machine_side.png", "elenuclear_heat_exchanger.png",
},
groups = {cracky = 3, fluid_container = 1},
fluid_buffers = {
heat = {
capacity = 16000,
2018-09-16 10:41:29 +00:00
accepts = {"elepower_nuclear:hot_coolant_source", "elepower_nuclear:helium_plasma"},
2018-07-28 14:29:56 +00:00
drainable = false,
},
cold = {
capacity = 16000,
2018-09-16 10:41:29 +00:00
accepts = {"elepower_nuclear:coolant_source", "elepower_nuclear:helium"},
2018-07-28 14:29:56 +00:00
drainable = true,
},
water = {
capacity = 64000,
accepts = {epr.water_source},
2018-07-28 14:29:56 +00:00
drainable = false,
},
steam = {
capacity = 64000,
2018-07-28 14:29:56 +00:00
drainable = true,
},
},
on_construct = function (pos)
local meta = minetest.get_meta(pos)
meta:set_string("formspec", get_formspec())
end,
on_timer = heat_exchanger_timer,
})