cooler and turbine as consumer

This commit is contained in:
Joachim Stolberg 2019-05-07 19:55:07 +02:00
parent d733fab61e
commit 32856ba10b
7 changed files with 111 additions and 94 deletions

View File

@ -135,6 +135,30 @@ local function start_network_power_consumption(pos, in_dir)
Route = {} Route = {}
turn_on(pos, in_dir, sum) turn_on(pos, in_dir, sum)
end end
--
-- Generic API functions
--
techage.power = {}
-- Function uses the standard consumer "turn_on" callback
-- Returns true, if node could be started/stopped
function techage.power.start_dedicated_node(pos, out_dir, node_name, sum)
local mem = tubelib2.get_mem(pos)
local conn = mem.connections and mem.connections[out_dir]
if conn then
local node = minetest.get_node(conn.pos)
if node.name == node_name then
local trd = TRD(conn.pos)
if trd and (not trd.valid_power_dir or
trd.valid_power_dir(conn.pos, get_power_dir(conn.pos), conn.in_dir)) then
if trd.turn_on then
return trd.turn_on(pos, conn.in_dir, sum)
end
end
end
end
return false
end
-- --
-- Generator functions for nodes with one power side (view from the outside) -- Generator functions for nodes with one power side (view from the outside)
@ -193,8 +217,7 @@ end
-- --
-- Distributor functions for nodes with 6 power sides (per defautl) or -- Distributor functions for nodes with 6 power sides (view from the outside)
-- optionally two or more sides via valid_power_dir (view from the outside)
-- --
techage.distributor = {} techage.distributor = {}
@ -206,12 +229,6 @@ end
function techage.distributor.after_tube_update(node, pos, out_dir, peer_pos, peer_in_dir) function techage.distributor.after_tube_update(node, pos, out_dir, peer_pos, peer_in_dir)
local mem = tubelib2.get_mem(pos) local mem = tubelib2.get_mem(pos)
-- Check direction
local trd = TRD(pos)
if trd.valid_power_dir then
local pwr_dir = get_power_dir(pos)
if not trd.valid_power_dir(pos, pwr_dir, tubelib2.Turn180Deg[out_dir]) then return end
end
mem.connections = mem.connections or {} mem.connections = mem.connections or {}
if not peer_in_dir then if not peer_in_dir then
mem.connections[out_dir] = nil -- del connection mem.connections[out_dir] = nil -- del connection
@ -224,12 +241,7 @@ end
-- Needed if the junction consumes power in addition -- Needed if the junction consumes power in addition
function techage.distributor.read_power_consumption(pos, in_dir) function techage.distributor.read_power_consumption(pos, in_dir)
-- Check direction return power_consumption(pos, in_dir) - TRD(pos).power_consumption or 0
local trd = TRD(pos)
if trd.valid_power_dir then
if not trd(pos).valid_power_dir(pos, get_power_dir(pos), in_dir) then return 0 end
end
return power_consumption(pos, in_dir) - trd.power_consumption or 0
end end
function techage.distributor.after_dig_node(pos, oldnode) function techage.distributor.after_dig_node(pos, oldnode)
@ -254,15 +266,13 @@ function techage.consumer.after_tube_update(node, pos, out_dir, peer_pos, peer_i
local mem = tubelib2.get_mem(pos) local mem = tubelib2.get_mem(pos)
local pwr_dir = get_power_dir(pos) local pwr_dir = get_power_dir(pos)
mem.connections = mem.connections or {} mem.connections = mem.connections or {}
local trd = TRD(pos)
-- Check direction -- Check direction
if not TRD(pos).valid_power_dir(pos, pwr_dir, tubelib2.Turn180Deg[out_dir]) then return end if not trd.valid_power_dir(pos, pwr_dir, tubelib2.Turn180Deg[out_dir]) then return end
-- Only one connection is allowed, which can be overwritten, if necessary.
if not peer_pos or not next(mem.connections) or mem.connections[out_dir] then
if not peer_in_dir then if not peer_in_dir then
mem.connections = {} -- del connection mem.connections[out_dir] = nil -- del connection
else else
mem.connections = {[out_dir] = {pos = peer_pos, in_dir = peer_in_dir}} mem.connections[out_dir] = {pos = peer_pos, in_dir = peer_in_dir}
end
end end
-- To be called delayed, so that all network connections have been established -- To be called delayed, so that all network connections have been established
minetest.after(0.2, start_network_power_consumption, pos, pwr_dir) minetest.after(0.2, start_network_power_consumption, pos, pwr_dir)

View File

@ -27,7 +27,7 @@ local COUNTDOWN_TICKS = 2
local HEAT_STEP = 10 local HEAT_STEP = 10
local WATER_CONSUMPTION = 0.5 local WATER_CONSUMPTION = 0.5
local MAX_WATER = 10 local MAX_WATER = 10
local POWER_CAPACITY = 10 local POWER_CAPACITY = 30
local Pipe = techage.SteamPipe local Pipe = techage.SteamPipe
local generator = techage.generator local generator = techage.generator

View File

@ -21,10 +21,12 @@ local M = minetest.get_meta
local MP = minetest.get_modpath("techage") local MP = minetest.get_modpath("techage")
local I,_ = dofile(MP.."/intllib.lua") local I,_ = dofile(MP.."/intllib.lua")
local POWER_CONSUMPTION = 1 local POWER_CONSUMPTION = 2
local STANDBY_TICKS = 4
local CYCLE_TIME = 4
local Power = techage.SteamPipe local Power = techage.SteamPipe
local distributor = techage.distributor local consumer = techage.consumer
local function swap_node(pos, name) local function swap_node(pos, name)
local node = minetest.get_node(pos) local node = minetest.get_node(pos)
@ -35,6 +37,12 @@ local function swap_node(pos, name)
minetest.swap_node(pos, node) minetest.swap_node(pos, node)
end end
-- called from pipe network
local function valid_power_dir(pos, power_dir, in_dir)
return power_dir == in_dir or power_dir == tubelib2.Turn180Deg[in_dir]
end
-- called from pipe network
local function turn_on(pos, dir, sum) local function turn_on(pos, dir, sum)
if sum > 0 then if sum > 0 then
swap_node(pos, "techage:cooler_on") swap_node(pos, "techage:cooler_on")
@ -56,15 +64,19 @@ minetest.register_node("techage:cooler", {
}, },
techage = { techage = {
turn_on = turn_on, turn_on = turn_on,
read_power_consumption = distributor.read_power_consumption, read_power_consumption = consumer.read_power_consumption,
power_network = Power, power_network = Power,
power_consumption = POWER_CONSUMPTION, power_side = "L",
--animated_power_network = true, valid_power_dir = valid_power_dir,
}, },
after_place_node = distributor.after_place_node, after_place_node = function(pos, placer)
after_tube_update = distributor.after_tube_update, local mem = consumer.after_place_node(pos, placer)
after_dig_node = distributor.after_dig_node, mem.power_consumption = POWER_CONSUMPTION
end,
after_tube_update = consumer.after_tube_update,
after_dig_node = consumer.after_dig_node,
paramtype2 = "facedir", paramtype2 = "facedir",
groups = {cracky=2, crumbly=2, choppy=2}, groups = {cracky=2, crumbly=2, choppy=2},
@ -104,14 +116,14 @@ minetest.register_node("techage:cooler_on", {
}, },
techage = { techage = {
turn_on = turn_on, turn_on = turn_on,
read_power_consumption = distributor.read_power_consumption, read_power_consumption = consumer.read_power_consumption,
power_network = Power, power_network = Power,
power_consumption = POWER_CONSUMPTION, power_side = "L",
--animated_power_network = true, valid_power_dir = valid_power_dir,
}, },
after_tube_update = distributor.after_tube_update, after_tube_update = consumer.after_tube_update,
after_dig_node = distributor.after_dig_node, after_dig_node = consumer.after_dig_node,
paramtype2 = "facedir", paramtype2 = "facedir",
groups = {not_in_creative_inventory=1}, groups = {not_in_creative_inventory=1},

View File

@ -44,12 +44,6 @@ local function formspec(self, pos, mem)
end end
local function start_turbine(pos, on, mem) local function start_turbine(pos, on, mem)
if not on then
if mem.handle then
minetest.sound_stop(mem.handle)
mem.handle = nil
end
end
local pos2 = techage.get_pos(pos, 'L') local pos2 = techage.get_pos(pos, 'L')
local trd = TRD(pos2) local trd = TRD(pos2)
if trd and trd.start_turbine then if trd and trd.start_turbine then
@ -62,16 +56,6 @@ local function can_start(pos, mem, state)
return start_turbine(pos, true, mem) return start_turbine(pos, true, mem)
end end
local function play_sound(pos)
local mem = tubelib2.get_mem(pos)
if mem.techage_state == techage.RUNNING then
mem.handle = minetest.sound_play("techage_turbine", {
pos = pos,
gain = 1,
max_hear_distance = 15})
minetest.after(2, play_sound, pos)
end
end
local function start_node(pos, mem, state) local function start_node(pos, mem, state)
generator.turn_power_on(pos, POWER_CAPACITY) generator.turn_power_on(pos, POWER_CAPACITY)
@ -260,15 +244,6 @@ minetest.register_craft({
}, },
}) })
minetest.register_lbm({
label = "[techage] Generator sound",
name = "techage:power_station",
nodenames = {"techage:generator_on"},
run_at_every_load = true,
action = function(pos, node)
play_sound(pos)
end
})
techage.register_help_page(I("TA3 Generator"), techage.register_help_page(I("TA3 Generator"),
I([[Part of the Coal Power Station. I([[Part of the Coal Power Station.

View File

@ -21,9 +21,9 @@ local M = minetest.get_meta
local MP = minetest.get_modpath("techage") local MP = minetest.get_modpath("techage")
local I,_ = dofile(MP.."/intllib.lua") local I,_ = dofile(MP.."/intllib.lua")
local POWER_CONSUMPTION = 8 local POWER_CONSUMPTION = 15
local Pipe = techage.SteamPipe local Power = techage.SteamPipe
local consumer = techage.consumer local consumer = techage.consumer
local function swap_node(pos, name) local function swap_node(pos, name)
@ -37,28 +37,41 @@ end
-- called from pipe network -- called from pipe network
local function valid_power_dir(pos, power_dir, in_dir) local function valid_power_dir(pos, power_dir, in_dir)
return power_dir == in_dir return power_dir == in_dir or in_dir == 5
end
local function play_sound(pos)
local mem = tubelib2.get_mem(pos)
if mem.running then
mem.handle = minetest.sound_play("techage_turbine", {
pos = pos,
gain = 1,
max_hear_distance = 15})
minetest.after(2, play_sound, pos)
end
end
local function stop_sound(pos)
local mem = tubelib2.get_mem(pos)
if mem.running and mem.handle then
minetest.sound_stop(mem.handle)
mem.handle = nil
end
end end
-- called from pipe network -- called from pipe network
local function turn_power_on_clbk(pos, in_dir, sum) local function turn_on(pos, dir, sum)
local mem = tubelib2.get_mem(pos) local mem = tubelib2.get_mem(pos)
-- Simply store state to be prepared, when flywheel wants to start. local res = techage.power.start_dedicated_node(pos, 6, "techage:cooler", sum)
mem.running = sum > 0 if sum > 0 and res then
end
-- called from generator
local function start_turbine(pos, on)
local mem = tubelib2.get_mem(pos)
if on and mem.running then
consumer.turn_power_on(pos, POWER_CONSUMPTION)
swap_node(pos, "techage:turbine_on") swap_node(pos, "techage:turbine_on")
return true mem.running = true
play_sound(pos)
else else
consumer.turn_power_on(pos, 0)
swap_node(pos, "techage:turbine") swap_node(pos, "techage:turbine")
mem.running = false
stop_sound(pos)
end end
return false
end end
@ -74,18 +87,17 @@ minetest.register_node("techage:turbine", {
"techage_filling_ta3.png^techage_appl_turbine.png^techage_frame_ta3.png", "techage_filling_ta3.png^techage_appl_turbine.png^techage_frame_ta3.png",
}, },
techage = { techage = {
turn_on = turn_power_on_clbk, turn_on = turn_on,
read_power_consumption = consumer.read_power_consumption, read_power_consumption = consumer.read_power_consumption,
power_network = Pipe, power_network = Power,
power_side = "L", power_side = "L",
valid_power_dir = valid_power_dir, valid_power_dir = valid_power_dir,
start_turbine = start_turbine,
}, },
after_place_node = function(pos, placer) after_place_node = function(pos, placer)
local mem = consumer.after_place_node(pos, placer) local mem = consumer.after_place_node(pos, placer)
mem.power_consume = 0 -- needed power to run mem.power_consumption = POWER_CONSUMPTION
mem.power_supply = false -- power available? mem.running = false
end, end,
after_tube_update = consumer.after_tube_update, after_tube_update = consumer.after_tube_update,
@ -99,7 +111,6 @@ minetest.register_node("techage:turbine", {
}) })
minetest.register_node("techage:turbine_on", { minetest.register_node("techage:turbine_on", {
description = I("TA3 Turbine"),
tiles = { tiles = {
-- up, down, right, left, back, front -- up, down, right, left, back, front
"techage_filling_ta3.png^techage_frame_ta3.png^techage_steam_hole.png", "techage_filling_ta3.png^techage_frame_ta3.png^techage_steam_hole.png",
@ -128,12 +139,11 @@ minetest.register_node("techage:turbine_on", {
}, },
}, },
techage = { techage = {
turn_on = turn_power_on_clbk, turn_on = turn_on,
read_power_consumption = consumer.read_power_consumption, read_power_consumption = consumer.read_power_consumption,
power_network = Pipe, power_network = Power,
power_side = "L", power_side = "L",
valid_power_dir = valid_power_dir, valid_power_dir = valid_power_dir,
start_turbine = start_turbine,
}, },
after_tube_update = consumer.after_tube_update, after_tube_update = consumer.after_tube_update,
@ -162,4 +172,14 @@ Has to be placed side by side
with the TA3 Generator. with the TA3 Generator.
(see TA3 Coal Power Station)]]), "techage:turbine") (see TA3 Coal Power Station)]]), "techage:turbine")
Pipe:add_secondary_node_names({"techage:turbine", "techage:turbine_on"}) Power:add_secondary_node_names({"techage:turbine", "techage:turbine_on"})
minetest.register_lbm({
label = "[techage] Turbine sound",
name = "techage:power_station",
nodenames = {"techage:turbine_on"},
run_at_every_load = true,
action = function(pos, node)
play_sound(pos)
end
})

View File

@ -97,7 +97,7 @@ else
--dofile(MP.."/test/battery.lua") --dofile(MP.."/test/battery.lua")
--dofile(MP.."/test/test.lua") --dofile(MP.."/test/test.lua")
--dofile(MP.."/test/generator.lua") dofile(MP.."/test/generator.lua")
--dofile(MP.."/test/consumer.lua") --dofile(MP.."/test/consumer.lua")
--dofile(MP.."/test/consumer2.lua") --dofile(MP.."/test/consumer2.lua")

View File

@ -10,7 +10,7 @@ local I,_ = dofile(MP.."/intllib.lua")
local STANDBY_TICKS = 4 local STANDBY_TICKS = 4
local COUNTDOWN_TICKS = 4 local COUNTDOWN_TICKS = 4
local CYCLE_TIME = 16 local CYCLE_TIME = 16
local POWER_CAPACITY = 8 local POWER_CAPACITY = 30
--local Power = techage.ElectricCable --local Power = techage.ElectricCable
local Power = techage.SteamPipe local Power = techage.SteamPipe
@ -37,7 +37,7 @@ local function stop_node(pos, mem, state)
end end
local State = techage.NodeStates:new({ local State = techage.NodeStates:new({
node_name_passive = "techage:generator", node_name_passive = "techage:test_generator",
cycle_time = CYCLE_TIME, cycle_time = CYCLE_TIME,
standby_ticks = STANDBY_TICKS, standby_ticks = STANDBY_TICKS,
formspec_func = formspec, formspec_func = formspec,
@ -81,8 +81,8 @@ local function on_rightclick(pos)
M(pos):set_string("formspec", formspec(State, pos, mem)) M(pos):set_string("formspec", formspec(State, pos, mem))
end end
minetest.register_node("techage:generator", { minetest.register_node("techage:test_generator", {
description = "TechAge Generator", description = "TechAge Test Generator",
tiles = { tiles = {
-- up, down, right, left, back, front -- up, down, right, left, back, front
'techage_electric_button.png^techage_electric_power.png', 'techage_electric_button.png^techage_electric_power.png',
@ -121,4 +121,4 @@ minetest.register_node("techage:generator", {
on_timer = node_timer, on_timer = node_timer,
}) })
Power:add_secondary_node_names({"techage:generator"}) Power:add_secondary_node_names({"techage:test_generator"})