From 85661da2879651c7c4888e2a4b053d7484311c75 Mon Sep 17 00:00:00 2001 From: Joachim Stolberg Date: Sun, 16 Jun 2019 21:06:16 +0200 Subject: [PATCH] power distribution changed --- basic_machines/autocrafter.lua | 15 +- basic_machines/distributor.lua | 15 +- basic_machines/electronic_fab.lua | 15 +- basic_machines/gravelrinser.lua | 15 +- basic_machines/gravelsieve.lua | 15 +- basic_machines/grinder.lua | 19 +- basic_machines/pusher.lua | 14 -- basic_machines/source.lua | 70 ++----- basis/command.lua | 10 - basis/consumer.lua | 140 +++++-------- basis/firebox_lib.lua | 8 - basis/node_states.lua | 178 +++++------------ coal_power_station/akkubox.lua | 135 ++++++------- coal_power_station/boiler_base.lua | 2 + coal_power_station/boiler_top.lua | 42 ++-- coal_power_station/cooler.lua | 25 ++- coal_power_station/firebox.lua | 9 +- coal_power_station/generator.lua | 92 ++++----- coal_power_station/turbine.lua | 39 ++-- furnace/booster.lua | 78 +++----- furnace/furnace_top.lua | 15 +- init.lua | 11 +- lamps/lib.lua | 44 +++-- oil/drillbox.lua | 15 +- oil/pumpjack.lua | 14 -- power/power.lua | 248 ++++++++++++++++++------ power/power2.lua | 1 + steam_engine/boiler.lua | 25 +-- steam_engine/cylinder.lua | 42 ++-- steam_engine/firebox.lua | 7 +- steam_engine/flywheel.lua | 145 ++++++-------- steam_engine/gearbox.lua | 41 ++-- textures/techage_appl_switch_off.png | Bin 1274 -> 555 bytes textures/techage_appl_switch_on.png | Bin 1254 -> 446 bytes textures/techage_electric_cable_inv.png | Bin 201 -> 198 bytes textures/techage_electric_switch.png | Bin 548 -> 229 bytes textures/techage_industriallamp3.png | Bin 262 -> 192 bytes textures/techage_industriallamp3_on.png | Bin 283 -> 191 bytes tools/repairkit.lua | 49 +++-- tools/trowel.lua | 7 +- 40 files changed, 685 insertions(+), 915 deletions(-) diff --git a/basic_machines/autocrafter.lua b/basic_machines/autocrafter.lua index b0722b6..301462a 100644 --- a/basic_machines/autocrafter.lua +++ b/basic_machines/autocrafter.lua @@ -328,15 +328,6 @@ tiles.act = { }, }, } -tiles.def = { - -- up, down, right, left, back, front - "techage_filling_ta#.png^techage_appl_autocrafter.png^techage_frame_ta#_top.png", - "techage_filling_ta#.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_outp.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_inp.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_appl_autocrafter.png^techage_frame_ta#.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_appl_autocrafter.png^techage_frame_ta#.png^techage_appl_defect.png", -} local tubing = { on_pull_item = function(pos, in_dir, num) @@ -350,6 +341,7 @@ local tubing = { local meta = minetest.get_meta(pos) if meta:get_int("push_dir") == in_dir or in_dir == 5 then local inv = M(pos):get_inventory() + CRD(pos).State:start_if_standby(pos) return techage.put_items(inv, "src", stack) end end, @@ -371,9 +363,6 @@ local tubing = { on_node_load = function(pos) CRD(pos).State:on_node_load(pos) end, - on_node_repair = function(pos) - return CRD(pos).State:on_node_repair(pos) - end, } local node_name_ta2, node_name_ta3, node_name_ta4 = @@ -381,8 +370,6 @@ local node_name_ta2, node_name_ta3, node_name_ta4 = drawtype = "normal", cycle_time = CYCLE_TIME, standby_ticks = STANDBY_TICKS, - has_item_meter = true, - aging_factor = 10, formspec = formspec, tubing = tubing, after_place_node = function(pos, placer) diff --git a/basic_machines/distributor.lua b/basic_machines/distributor.lua index 4d1c51a..88c5911 100644 --- a/basic_machines/distributor.lua +++ b/basic_machines/distributor.lua @@ -312,15 +312,6 @@ tiles.act = { "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_distri_red.png", "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_distri_blue.png", } -tiles.def = { - -- up, down, right, left, back, front - "techage_filling_ta#.png^techage_appl_distri.png^techage_frame_ta#_top.png", - "techage_filling_ta#.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_distri_yellow.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_distri_green.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_distri_red.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_distri_blue.png^techage_appl_defect.png", -} local tubing = { on_pull_item = function(pos, in_dir, num) @@ -329,6 +320,7 @@ local tubing = { end, on_push_item = function(pos, in_dir, stack) local inv = M(pos):get_inventory() + CRD(pos).State:start_if_standby(pos) return techage.put_items(inv, "src", stack) end, on_unpull_item = function(pos, in_dir, stack) @@ -358,17 +350,12 @@ local tubing = { on_node_load = function(pos) CRD(pos).State:on_node_load(pos) end, - on_node_repair = function(pos) - return CRD(pos).State:on_node_repair(pos) - end, } local node_name_ta2, node_name_ta3, node_name_ta4 = techage.register_consumer("distributor", I("Distributor"), tiles, { cycle_time = CYCLE_TIME, standby_ticks = STANDBY_TICKS, - has_item_meter = true, - aging_factor = 10, formspec = formspec, tubing = tubing, after_place_node = function(pos, placer) diff --git a/basic_machines/electronic_fab.lua b/basic_machines/electronic_fab.lua index 139cf72..5c81c1c 100644 --- a/basic_machines/electronic_fab.lua +++ b/basic_machines/electronic_fab.lua @@ -197,15 +197,6 @@ tiles.act = { }, }, } -tiles.def = { - -- up, down, right, left, back, front - "techage_filling_ta#.png^techage_frame_ta#_top.png", - "techage_filling_ta#.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_outp.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_inp.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_appl_electronic_fab.png^techage_frame_ta#.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_appl_electronic_fab.png^techage_frame_ta#.png^techage_appl_defect.png", -} local tubing = { on_pull_item = function(pos, in_dir, num) @@ -219,6 +210,7 @@ local tubing = { local meta = minetest.get_meta(pos) if meta:get_int("push_dir") == in_dir or in_dir == 5 then local inv = M(pos):get_inventory() + CRD(pos).State:start_if_standby(pos) return techage.put_items(inv, "src", stack) end end, @@ -240,9 +232,6 @@ local tubing = { on_node_load = function(pos) CRD(pos).State:on_node_load(pos) end, - on_node_repair = function(pos) - return CRD(pos).State:on_node_repair(pos) - end, } local node_name_ta2, node_name_ta3, node_name_ta4 = @@ -250,8 +239,6 @@ local node_name_ta2, node_name_ta3, node_name_ta4 = drawtype = "normal", cycle_time = CYCLE_TIME, standby_ticks = STANDBY_TICKS, - has_item_meter = true, - aging_factor = 10, formspec = formspec, tubing = tubing, after_place_node = function(pos, placer) diff --git a/basic_machines/gravelrinser.lua b/basic_machines/gravelrinser.lua index 0a80692..028e127 100644 --- a/basic_machines/gravelrinser.lua +++ b/basic_machines/gravelrinser.lua @@ -212,15 +212,6 @@ tiles.act = { "techage_filling_ta#.png^techage_appl_rinser.png^techage_frame_ta#.png", "techage_filling_ta#.png^techage_appl_rinser.png^techage_frame_ta#.png", } -tiles.def = { - -- up, down, right, left, back, front - "techage_appl_rinser_top.png^techage_frame_ta#_top.png", - "techage_filling_ta#.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_outp.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_inp.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_appl_rinser.png^techage_frame_ta#.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_appl_rinser.png^techage_frame_ta#.png^techage_appl_defect.png", -} local tubing = { on_pull_item = function(pos, in_dir, num) @@ -234,6 +225,7 @@ local tubing = { local meta = minetest.get_meta(pos) if meta:get_int("push_dir") == in_dir or in_dir == 5 then local inv = M(pos):get_inventory() + CRD(pos).State:start_if_standby(pos) return techage.put_items(inv, "src", stack) end end, @@ -255,9 +247,6 @@ local tubing = { on_node_load = function(pos) CRD(pos).State:on_node_load(pos) end, - on_node_repair = function(pos) - return CRD(pos).State:on_node_repair(pos) - end, } local node_name_ta2, node_name_ta3, node_name_ta4 = @@ -281,8 +270,6 @@ local node_name_ta2, node_name_ta3, node_name_ta4 = }, cycle_time = CYCLE_TIME, standby_ticks = STANDBY_TICKS, - has_item_meter = true, - aging_factor = 10, formspec = formspec, tubing = tubing, after_place_node = function(pos, placer) diff --git a/basic_machines/gravelsieve.lua b/basic_machines/gravelsieve.lua index c7936a6..ed874e7 100644 --- a/basic_machines/gravelsieve.lua +++ b/basic_machines/gravelsieve.lua @@ -151,15 +151,6 @@ tiles.act = { "techage_filling_ta#.png^techage_appl_sieve.png^techage_frame_ta#.png", "techage_filling_ta#.png^techage_appl_sieve.png^techage_frame_ta#.png", } -tiles.def = { - -- up, down, right, left, back, front - "techage_appl_sieve_top.png^techage_frame_ta#_top.png", - "techage_filling_ta#.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_outp.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_inp.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_appl_sieve.png^techage_frame_ta#.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_appl_sieve.png^techage_frame_ta#.png^techage_appl_defect.png", -} local tubing = { on_pull_item = function(pos, in_dir, num) @@ -173,6 +164,7 @@ local tubing = { local meta = minetest.get_meta(pos) if meta:get_int("push_dir") == in_dir or in_dir == 5 then local inv = M(pos):get_inventory() + CRD(pos).State:start_if_standby(pos) return techage.put_items(inv, "src", stack) end end, @@ -194,9 +186,6 @@ local tubing = { on_node_load = function(pos) CRD(pos).State:on_node_load(pos) end, - on_node_repair = function(pos) - return CRD(pos).State:on_node_repair(pos) - end, } local node_name_ta2, node_name_ta3, node_name_ta4 = @@ -218,8 +207,6 @@ local node_name_ta2, node_name_ta3, node_name_ta4 = }, cycle_time = CYCLE_TIME, standby_ticks = STANDBY_TICKS, - has_item_meter = true, - aging_factor = 10, formspec = formspec, tubing = tubing, after_place_node = function(pos, placer) diff --git a/basic_machines/grinder.lua b/basic_machines/grinder.lua index 5470c95..7135a93 100644 --- a/basic_machines/grinder.lua +++ b/basic_machines/grinder.lua @@ -23,8 +23,8 @@ local CRD = function(pos) return (minetest.registered_nodes[minetest.get_node(po local MP = minetest.get_modpath("techage") local I,_ = dofile(MP.."/intllib.lua") -local STANDBY_TICKS = 10 -local COUNTDOWN_TICKS = 10 +local STANDBY_TICKS = 6 +local COUNTDOWN_TICKS = 4 local CYCLE_TIME = 4 @@ -163,15 +163,6 @@ tiles.act = { "techage_filling_ta#.png^techage_appl_grinder2.png^techage_frame_ta#.png", "techage_filling_ta#.png^techage_appl_grinder2.png^techage_frame_ta#.png", } -tiles.def = { - -- up, down, right, left, back, front - "techage_appl_grinder.png^techage_frame_ta#_top.png", - "techage_filling_ta#.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_outp.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_inp.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_appl_grinder2.png^techage_frame_ta#.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_appl_grinder2.png^techage_frame_ta#.png^techage_appl_defect.png", -} local tubing = { on_pull_item = function(pos, in_dir, num) @@ -185,6 +176,7 @@ local tubing = { local meta = minetest.get_meta(pos) if meta:get_int("push_dir") == in_dir or in_dir == 5 then local inv = M(pos):get_inventory() + CRD(pos).State:start_if_standby(pos) return techage.put_items(inv, "src", stack) end end, @@ -206,9 +198,6 @@ local tubing = { on_node_load = function(pos) CRD(pos).State:on_node_load(pos) end, - on_node_repair = function(pos) - return CRD(pos).State:on_node_repair(pos) - end, } local node_name_ta2, node_name_ta3, node_name_ta4 = @@ -230,8 +219,6 @@ local node_name_ta2, node_name_ta3, node_name_ta4 = }, cycle_time = CYCLE_TIME, standby_ticks = STANDBY_TICKS, - has_item_meter = true, - aging_factor = 10, formspec = formspec, tubing = tubing, after_place_node = function(pos, placer) diff --git a/basic_machines/pusher.lua b/basic_machines/pusher.lua index f2d00ab..337850c 100644 --- a/basic_machines/pusher.lua +++ b/basic_machines/pusher.lua @@ -110,15 +110,6 @@ tiles.act = { }, }, } -tiles.def = { - -- up, down, right, left, back, front - "techage_filling_ta#.png^techage_frame_ta#_top.png^techage_appl_arrow.png", - "techage_filling_ta#.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_outp.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_inp.png^techage_appl_defect.png", - "techage_appl_pusher.png^[transformR180]^techage_frame_ta#.png^techage_appl_defect.png", - "techage_appl_pusher.png^techage_frame_ta#.png^techage_appl_defect.png", -} local tubing = { is_pusher = true, -- is a pulling/pushing node @@ -134,17 +125,12 @@ local tubing = { on_node_load = function(pos) CRD(pos).State:on_node_load(pos) end, - on_node_repair = function(pos) - return CRD(pos).State:on_node_repair(pos) - end, } local node_name_ta2, node_name_ta3, node_name_ta4 = techage.register_consumer("pusher", I("Pusher"), tiles, { cycle_time = CYCLE_TIME, standby_ticks = STANDBY_TICKS, - has_item_meter = true, - aging_factor = 10, tubing = tubing, after_place_node = function(pos, placer) local mem = tubelib2.get_mem(pos) diff --git a/basic_machines/source.lua b/basic_machines/source.lua index ba382aa..083578a 100644 --- a/basic_machines/source.lua +++ b/basic_machines/source.lua @@ -24,18 +24,20 @@ local I,_ = dofile(MP.."/intllib.lua") local TA2_Power = techage.Axle local TA3_Power = techage.SteamPipe local TA4_Power = techage.ElectricCable +local provide_power = techage.power.provide_power +local power_switched = techage.power.power_switched local STANDBY_TICKS = 4 local COUNTDOWN_TICKS = 4 -local CYCLE_TIME = 16 -local POWER_CAPACITY = 50 +local CYCLE_TIME = 2 +local PWR_CAPA = 20 local function formspec(self, pos, mem) return "size[8,7]".. default.gui_bg.. default.gui_bg_img.. default.gui_slots.. - "image[6,0.5;1,2;"..techage.power.formspec_power_bar(POWER_CAPACITY, mem.power_result).."]".. + "image[6,0.5;1,2;"..techage.power.formspec_power_bar(PWR_CAPA, mem.provided).."]".. "image_button[5,1;1,1;".. self:get_state_button_image(mem) ..";state_button;]".. "button[2.5,1;1.8,1;update;"..I("Update").."]".. "list[current_player;main;0,3;8,4;]".. @@ -43,11 +45,16 @@ local function formspec(self, pos, mem) end local function start_node(pos, mem, state) - techage.power.power_distribution(pos) + mem.generating = true + power_switched(pos) + techage.switch_axles(pos, true) end local function stop_node(pos, mem, state) - techage.power.power_distribution(pos) + mem.generating = false + mem.provided = 0 + power_switched(pos) + techage.switch_axles(pos, false) end local State2 = techage.NodeStates:new({ @@ -77,33 +84,19 @@ local State4 = techage.NodeStates:new({ stop_node = stop_node, }) -local tStates = {0, State2, State3, State4} - --- Pass1: Power balance calculation -local function on_power_pass1(pos, mem) - local state = tStates[mem.state_num or 2] - if state:is_active(mem) then - return -POWER_CAPACITY - end - return 0 -end - --- Pass2: Power balance adjustment -local function on_power_pass2(pos, mem, sum) - return 0 -end - --- Pass3: Power balance result -local function on_power_pass3(pos, mem, sum) - mem.power_result = sum -end - local function node_timer(pos, elapsed) local mem = tubelib2.get_mem(pos) - local state = tStates[mem.state_num or 2] - return state:is_active(mem) + if mem.generating then + mem.provided = provide_power(pos, PWR_CAPA) + return true + else + mem.provided = 0 + end + return false end +local tStates = {0, State2, State3, State4} + local function on_receive_fields(pos, formname, fields, player) if minetest.is_protected(pos, player:get_player_name()) then return @@ -147,10 +140,6 @@ minetest.register_node("techage:t2_source", { on_rightclick(pos) end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - State2:after_dig_node(pos, oldnode, oldmetadata, digger) - end, - on_receive_fields = on_receive_fields, on_rightclick = on_rightclick, on_timer = node_timer, @@ -180,10 +169,6 @@ minetest.register_node("techage:t3_source", { on_rightclick(pos) end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - State3:after_dig_node(pos, oldnode, oldmetadata, digger) - end, - on_receive_fields = on_receive_fields, on_rightclick = on_rightclick, on_timer = node_timer, @@ -213,35 +198,22 @@ minetest.register_node("techage:t4_source", { on_rightclick(pos) end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - State4:after_dig_node(pos, oldnode, oldmetadata, digger) - end, - on_receive_fields = on_receive_fields, on_rightclick = on_rightclick, on_timer = node_timer, }) techage.power.register_node({"techage:t2_source"}, { - on_power_pass1 = on_power_pass1, - on_power_pass2 = on_power_pass2, - on_power_pass3 = on_power_pass3, conn_sides = {"R"}, power_network = TA2_Power, }) techage.power.register_node({"techage:t3_source"}, { - on_power_pass1 = on_power_pass1, - on_power_pass2 = on_power_pass2, - on_power_pass3 = on_power_pass3, conn_sides = {"R"}, power_network = TA3_Power, }) techage.power.register_node({"techage:t4_source"}, { - on_power_pass1 = on_power_pass1, - on_power_pass2 = on_power_pass2, - on_power_pass3 = on_power_pass3, conn_sides = {"R"}, power_network = TA4_Power, }) diff --git a/basis/command.lua b/basis/command.lua index 92ed345..13dff01 100644 --- a/basis/command.lua +++ b/basis/command.lua @@ -256,7 +256,6 @@ end -- on_unpull_item = func(pos, in_dir, item), -- on_recv_message = func(pos, topic, payload), -- on_node_load = func(pos), -- LBM function --- on_node_repair = func(pos), -- repair defect (feature!) nodes -- on_transfer = func(pos, in_dir, topic, payload), -- } function techage.register_node(names, node_definition) @@ -339,15 +338,6 @@ function techage.transfer(pos, outdir, topic, payload, network, nodenames) return false end --- for defect nodes -function techage.repair_node(pos) - local node = minetest.get_node(pos) - if NodeDef[node.name] and NodeDef[node.name].on_node_repair then - return NodeDef[node.name].on_node_repair(pos) - end - return false -end - ------------------------------------------------------------------- -- Client side Push/Pull item functions ------------------------------------------------------------------- diff --git a/basis/consumer.lua b/basis/consumer.lua index 99ebbe8..05c4d0e 100644 --- a/basis/consumer.lua +++ b/basis/consumer.lua @@ -13,7 +13,7 @@ - up to 3 stages of nodes (TA2/TA3/TA4) - power consumption - node state handling - - registration of passive, active and defect nodes + - registration of passive and active nodes - Tube connections are on left and right side (from left to right) - Power connection are on front and back side (front or back) ]]-- @@ -26,40 +26,52 @@ local M = minetest.get_meta local CRD = function(pos) return (minetest.registered_nodes[minetest.get_node(pos).name] or {}).consumer end local CRDN = function(node) return (minetest.registered_nodes[node.name] or {}).consumer end +local CYCLE_TIME = 2 -- required from power + local ValidPowerConsumingStates = { [techage.RUNNING] = true, [techage.BLOCKED] = true, - [techage.FAULT] = true, + [techage.NOPOWER] = true, } +local consume_power = techage.power.consume_power +local power_available = techage.power.power_available + +local function can_start(pos, mem, state) + return power_available(pos) +end + local function start_node(pos, mem, state) - -- First finish the start process, than check power and - -- if needed, switch to "nopower" - minetest.after(0.5, techage.power.power_distribution, pos) + mem.conn_next_call = 0 + mem.conn_cycle_timer = 0 end local function stop_node(pos, mem, state) - techage.power.power_distribution(pos) end -local function on_power_pass1(pos, mem) - local crd = CRD(pos) - if ValidPowerConsumingStates[crd.State:get_state(mem)] then - return crd.power_consumption - end - return 0 -end - -local function on_power_pass2(pos, mem, sum) +local function node_timer(pos, elapsed) + --print("node_timer") local crd = CRD(pos) + local mem = tubelib2.get_mem(pos) local state = crd.State:get_state(mem) - if sum > 0 and state == techage.NOPOWER then - crd.State:start(pos, mem) - return 0 - elseif sum <= 0 and ValidPowerConsumingStates[state] or state == techage.STANDBY then - crd.State:nopower(pos, mem) - return -crd.power_consumption + if ValidPowerConsumingStates[state] then + local got = consume_power(pos, crd.power_consumption) + if state == techage.NOPOWER and got == crd.power_consumption then + crd.State:start(pos, mem) + elseif state ~= techage.NOPOWER and got < crd.power_consumption then + crd.State:nopower(pos, mem) + end end + -- call the secondary timer routine with the requested frequency + local res + mem.conn_next_call = mem.conn_next_call or 0 + mem.conn_cycle_timer = (mem.conn_cycle_timer or 0) + CYCLE_TIME + --print(mem.conn_next_call, mem.conn_cycle_timer) + if mem.conn_cycle_timer >= mem.conn_next_call then + crd.node_timer(pos, crd.cycle_time) + mem.conn_next_call = mem.conn_next_call + crd.cycle_time + end + return ValidPowerConsumingStates[state] or state == techage.STANDBY end local function prepare_tiles(tiles, stage, power_png) @@ -75,7 +87,7 @@ local function prepare_tiles(tiles, stage, power_png) end return tbl end - + -- 'validStates' is optional and can be used to e.g. enable -- only one TA2 node {false, true, false, false} function techage.register_consumer(base_name, inv_name, tiles, tNode, validStates) @@ -84,10 +96,9 @@ function techage.register_consumer(base_name, inv_name, tiles, tNode, validState for stage = 2,4 do local name_pas = "techage:ta"..stage.."_"..base_name.."_pas" local name_act = "techage:ta"..stage.."_"..base_name.."_act" - local name_def = "techage:ta"..stage.."_"..base_name.."_def" local name_inv = "TA"..stage.." "..inv_name names[#names+1] = name_pas - + if validStates[stage] then local on_recv_message = tNode.tubing.on_recv_message if stage > 2 then @@ -95,7 +106,7 @@ function techage.register_consumer(base_name, inv_name, tiles, tNode, validState return "unsupported" end end - + local power_network local power_png = 'techage_axle_clutch.png' local power_used = tNode.power_consumption ~= nil @@ -110,31 +121,31 @@ function techage.register_consumer(base_name, inv_name, tiles, tNode, validState end power_network:add_secondary_node_names({name_pas, name_act}) end - + local tState = techage.NodeStates:new({ node_name_passive = name_pas, node_name_active = name_act, - node_name_defect = name_def, infotext_name = name_inv, - cycle_time = tNode.cycle_time, + cycle_time = CYCLE_TIME, standby_ticks = tNode.standby_ticks, - has_item_meter = tNode.has_item_meter, - aging_factor = tNode.aging_factor * (stage-1) * 2, formspec_func = tNode.formspec, on_state_change = tNode.on_state_change, + can_start = power_used and can_start or nil, start_node = power_used and start_node or nil, stop_node = power_used and stop_node or nil, }) - + local tConsumer = { stage = stage, State = tState, -- number of items to be processed per cycle num_items = tNode.num_items[stage], power_consumption = power_used and - tNode.power_consumption[stage] or {0,0,0,0}, + tNode.power_consumption[stage] or 0, + node_timer = tNode.node_timer, + cycle_time = tNode.cycle_time, } - + tNode.groups.not_in_creative_inventory = 0 minetest.register_node(name_pas, { @@ -144,9 +155,9 @@ function techage.register_consumer(base_name, inv_name, tiles, tNode, validState drawtype = tNode.drawtype, node_box = tNode.node_box, selection_box = tNode.selection_box, - + on_construct = tubelib2.init_mem, - + after_place_node = function(pos, placer, itemstack, pointed_thing) local meta = M(pos) local mem = tubelib2.get_mem(pos) @@ -168,13 +179,11 @@ function techage.register_consumer(base_name, inv_name, tiles, tNode, validState tNode.after_dig_node(pos, oldnode, oldmetadata, digger) end techage.remove_node(pos) - CRDN(oldnode).State:after_dig_node(pos, oldnode, - oldmetadata, digger) end, - + can_dig = tNode.can_dig, on_rotate = screwdriver.disallow, - on_timer = tNode.node_timer, + on_timer = node_timer, on_receive_fields = tNode.on_receive_fields, on_rightclick = tNode.on_rightclick, allow_metadata_inventory_put = tNode.allow_metadata_inventory_put, @@ -202,7 +211,7 @@ function techage.register_consumer(base_name, inv_name, tiles, tNode, validState selection_box = tNode.selection_box, on_rotate = screwdriver.disallow, - on_timer = tNode.node_timer, + on_timer = node_timer, on_receive_fields = tNode.on_receive_fields, on_rightclick = tNode.on_rightclick, allow_metadata_inventory_put = tNode.allow_metadata_inventory_put, @@ -219,62 +228,13 @@ function techage.register_consumer(base_name, inv_name, tiles, tNode, validState sounds = tNode.sounds, }) - minetest.register_node(name_def, { - description = name_inv, - tiles = prepare_tiles(tiles.def, stage, power_png), - consumer = tConsumer, - drawtype = tNode.drawtype, - node_box = tNode.node_box, - selection_box = tNode.selection_box, - - after_place_node = function(pos, placer, itemstack, pointed_thing) - local meta = M(pos) - local mem = tubelib2.get_mem(pos) - local node = minetest.get_node(pos) - meta:set_int("push_dir", techage.side_to_indir("L", node.param2)) - meta:set_int("pull_dir", techage.side_to_indir("R", node.param2)) - local number = "-" - if stage > 2 then - number = techage.add_node(pos, name_pas) - end - if tNode.after_place_node then - tNode.after_place_node(pos, placer, itemstack, pointed_thing) - end - CRD(pos).State:defect(pos, mem) - end, - - on_rotate = screwdriver.disallow, - on_receive_fields = tNode.on_receive_fields, - on_rightclick = tNode.on_rightclick, - allow_metadata_inventory_put = tNode.allow_metadata_inventory_put, - allow_metadata_inventory_move = tNode.allow_metadata_inventory_move, - allow_metadata_inventory_take = tNode.allow_metadata_inventory_take, - on_metadata_inventory_move = tNode.on_metadata_inventory_move, - on_metadata_inventory_put = tNode.on_metadata_inventory_put, - on_metadata_inventory_take = tNode.on_metadata_inventory_take, - - after_dig_node = function(pos, oldnode, oldmetadata, digger) - if tNode.after_dig_node then - tNode.after_dig_node(pos, oldnode, oldmetadata, digger) - end - techage.remove_node(pos) - end, - - paramtype2 = "facedir", - groups = tNode.groups, - is_ground_content = false, - sounds = tNode.sounds, - }) - if power_used then techage.power.register_node({name_pas, name_act}, { - on_power_pass1 = on_power_pass1, - on_power_pass2 = on_power_pass2, conn_sides = {"F", "B"}, power_network = power_network, }) end - techage.register_node({name_pas, name_act, name_def}, tNode.tubing) + techage.register_node({name_pas, name_act}, tNode.tubing) end end return names[1], names[2], names[3] diff --git a/basis/firebox_lib.lua b/basis/firebox_lib.lua index 4c33e66..a6556f4 100644 --- a/basis/firebox_lib.lua +++ b/basis/firebox_lib.lua @@ -108,14 +108,6 @@ function techage.firebox.on_receive_fields(pos, formname, fields, player) if fields.power_level then local mem = tubelib2.get_mem(pos) mem.power_level = PowerLevel[fields.power_level] - techage.transfer( - {x=pos.x, y=pos.y+2, z=pos.z}, - nil, -- outdir - "power_level", -- topic - mem.power_level, -- payload - nil, -- network - {"techage:coalboiler_top"} -- nodenames - ) end end diff --git a/basis/node_states.lua b/basis/node_states.lua index ebf4024..167dd77 100644 --- a/basis/node_states.lua +++ b/basis/node_states.lua @@ -26,18 +26,18 @@ Node states: | | | | | | button | +---------+ | | | ^ | - repair | V | button | + button | V | button | | +---------+ | | button - | | |---------+ | - | | RUNNING | | - | +--------| |---------+ | - | | +---------+ | | - | | ^ | | | - | | | | | | - | V | V V | + | +--------->| |---------+ | + | | power | RUNNING | | + | | +------| |---------+ | + | | | +---------+ | | + | | | ^ | | | + | | | | | | | + | | V | V V | | +---------+ +----------+ +---------+ | | | | | NOPOWER/ | | | | - +---| DEFECT | | STANDBY/ | | FAULT |----------+ + +---| NOPOWER | | STANDBY/ | | FAULT |----------+ | | | BLOCKED | | | +---------+ +----------+ +---------+ @@ -45,7 +45,6 @@ Node mem data: "techage_state" - node state, like "RUNNING" "techage_item_meter" - node item/runtime counter "techage_countdown" - countdown to stadby mode - "techage_aging" - aging counter ]]-- -- for lazy programmers @@ -64,7 +63,6 @@ techage.STANDBY = 3 -- nothing to do (e.g. no input items), or blocked anyhow (o techage.NOPOWER = 4 -- only for power consuming nodes techage.FAULT = 5 -- any fault state (e.g. wrong source items), which can be fixed by the player techage.BLOCKED = 6 -- a pushing node is blocked due to a full destination inventory -techage.DEFECT = 7 -- a defect (broken), which has to be repaired by the player techage.StatesImg = { "techage_inv_button_off.png", @@ -73,7 +71,6 @@ techage.StatesImg = { "techage_inv_button_nopower.png", "techage_inv_button_error.png", "techage_inv_button_warning.png", - "techage_inv_button_off.png", } -- Return state button image for the node inventory @@ -94,7 +91,7 @@ function techage.get_power_image(pos, mem) end -- State string based on button states -techage.StateStrings = {"stopped", "running", "standby", "nopower", "fault", "blocked", "defect"} +techage.StateStrings = {"stopped", "running", "standby", "nopower", "fault", "blocked"} -- -- Local States @@ -105,11 +102,8 @@ local STANDBY = techage.STANDBY local NOPOWER = techage.NOPOWER local FAULT = techage.FAULT local BLOCKED = techage.BLOCKED -local DEFECT = techage.DEFECT -local AGING_FACTOR = 4 -- defect random factor - -- -- NodeStates Class Functions -- @@ -134,11 +128,9 @@ function NodeStates:new(attr) -- mandatory cycle_time = attr.cycle_time, -- for running state standby_ticks = attr.standby_ticks, -- for standby state - has_item_meter = attr.has_item_meter, -- true/false -- optional node_name_passive = attr.node_name_passive, node_name_active = attr.node_name_active, - node_name_defect = attr.node_name_defect, infotext_name = attr.infotext_name, can_start = attr.can_start or can_start, start_node = attr.start_node, @@ -146,10 +138,6 @@ function NodeStates:new(attr) formspec_func = attr.formspec_func, on_state_change = attr.on_state_change, } - if attr.aging_factor then - o.aging_level1 = attr.aging_factor * techage.machine_aging_value - o.aging_level2 = attr.aging_factor * techage.machine_aging_value * AGING_FACTOR - end setmetatable(o, self) self.__index = self return o @@ -161,12 +149,7 @@ function NodeStates:node_init(pos, mem, number) if self.infotext_name then M(pos):set_string("infotext", self.infotext_name.." "..number..": stopped") end - if self.has_item_meter then - mem.techage_item_meter = 0 - end - if self.aging_level1 then - mem.techage_aging = 0 - end + mem.techage_item_meter = 0 if self.formspec_func then M(pos):set_string("formspec", self.formspec_func(self, pos, mem)) end @@ -174,30 +157,27 @@ end function NodeStates:stop(pos, mem) local state = mem.techage_state or STOPPED - if state ~= DEFECT then - mem.techage_state = STOPPED - if self.stop_node then - self.stop_node(pos, mem, state) - end - if self.node_name_passive then - swap_node(pos, self.node_name_passive) - end - if self.infotext_name then - local number = M(pos):get_string("node_number") - M(pos):set_string("infotext", self.infotext_name.." "..number..": stopped") - end - if self.formspec_func then - M(pos):set_string("formspec", self.formspec_func(self, pos, mem)) - end - if self.on_state_change then - self.on_state_change(pos, state, STOPPED) - end - if minetest.get_node_timer(pos):is_started() then - minetest.get_node_timer(pos):stop() - end - return true + mem.techage_state = STOPPED + if self.stop_node then + self.stop_node(pos, mem, state) end - return false + if self.node_name_passive then + swap_node(pos, self.node_name_passive) + end + if self.infotext_name then + local number = M(pos):get_string("node_number") + M(pos):set_string("infotext", self.infotext_name.." "..number..": stopped") + end + if self.formspec_func then + M(pos):set_string("formspec", self.formspec_func(self, pos, mem)) + end + if self.on_state_change then + self.on_state_change(pos, state, STOPPED) + end + if minetest.get_node_timer(pos):is_started() then + minetest.get_node_timer(pos):stop() + end + return true end function NodeStates:start(pos, mem, called_from_on_timer) @@ -297,7 +277,7 @@ end function NodeStates:nopower(pos, mem) local state = mem.techage_state or RUNNING - if state ~= STOPPED and state ~= DEFECT then + if state ~= STOPPED then mem.techage_state = NOPOWER if self.node_name_passive then swap_node(pos, self.node_name_passive) @@ -341,26 +321,6 @@ function NodeStates:fault(pos, mem) return false end -function NodeStates:defect(pos, mem) - local state = mem.techage_state or STOPPED - mem.techage_state = DEFECT - if self.node_name_defect then - swap_node(pos, self.node_name_defect) - end - if self.infotext_name then - local number = M(pos):get_string("node_number") - M(pos):set_string("infotext", self.infotext_name.." "..number..": defect") - end - if self.formspec_func then - M(pos):set_string("formspec", self.formspec_func(self, pos, mem)) - end - if self.on_state_change then - self.on_state_change(pos, state, DEFECT) - end - minetest.get_node_timer(pos):stop() - return true -end - function NodeStates:get_state(mem) return mem.techage_state or techage.STOPPED end @@ -397,21 +357,11 @@ end -- To be called after successful node action to raise the timer -- and keep the node in state RUNNING -function NodeStates:keep_running(pos, mem, val) +function NodeStates:keep_running(pos, mem, val, num_items) -- set to RUNNING if not already done self:start(pos, mem, true) - mem.techage_countdown = val - if self.has_item_meter then - mem.techage_item_meter = (mem.techage_item_meter or 999999) + 1 - end - if self.aging_level1 then - local cnt = mem.techage_aging + 1 - mem.techage_aging = cnt - if (cnt > (self.aging_level1) and math.random(self.aging_level2) == 1) - or cnt >= 999999 then - self:defect(pos, mem) - end - end + mem.techage_countdown = val or 4 + mem.techage_item_meter = (mem.techage_item_meter or 0) + (num_items or 1) end -- Start/stop node based on button events. @@ -449,13 +399,11 @@ function NodeStates:on_receive_message(pos, topic, payload) return "blocked" end return self:get_state_string(tubelib2.get_mem(pos)) - elseif self.has_item_meter and topic == "counter" then + elseif topic == "counter" then return mem.techage_item_meter or 1 - elseif self.has_item_meter and topic == "clear_counter" then + elseif topic == "clear_counter" then mem.techage_item_meter = 0 return true - elseif self.aging_level1 and topic == "aging" then - return mem.techage_aging or 1 end end @@ -466,6 +414,7 @@ function NodeStates:on_node_load(pos, not_start_timer) -- Meta data corrupt? local number = M(pos):get_string("node_number") if number == "" then + minetest.log("warning", "[TA] Node at "..S(pos).." has no node_number") swap_node(pos, "techage:defect_dummy") return end @@ -474,6 +423,13 @@ function NodeStates:on_node_load(pos, not_start_timer) if number ~= "-" then local info = techage.get_node_info(number) if not info or not info.pos or not vector.equals(pos, info.pos) then + if not info then + minetest.log("warning", "[TA] Node at "..S(pos).." has no info") + elseif not info.pos then + minetest.log("warning", "[TA] Node at "..S(pos).." has no info.pos") + elseif not vector.equals(pos, info.pos) then + minetest.log("warning", "[TA] Node at "..S(pos).." is pos ~= info.pos") + end swap_node(pos, "techage:defect_dummy") return end @@ -500,50 +456,6 @@ function NodeStates:on_node_load(pos, not_start_timer) end end --- Repair of defect (feature!) nodes -function NodeStates:on_node_repair(pos) - local mem = tubelib2.get_mem(pos) - if mem.techage_state == DEFECT then - mem.techage_state = STOPPED - if self.node_name_passive then - swap_node(pos, self.node_name_passive) - end - if self.aging_level1 then - mem.techage_aging = 0 - end - if self.infotext_name then - local number = M(pos):get_string("node_number") - M(pos):set_string("infotext", self.infotext_name.." "..number..": stopped") - end - if self.formspec_func then - M(pos):set_string("formspec", self.formspec_func(self, pos, mem)) - end - return true - end - return false -end - --- Return working or defect machine, depending on machine lifetime -function NodeStates:after_dig_node(pos, oldnode, oldmetadata, digger) - local mem = tubelib2.get_mem(pos) - local inv = minetest.get_inventory({type="player", name=digger:get_player_name()}) - local cnt = math.max(mem.techage_aging or 1, 1) - local left_over - if self.aging_level1 then - local is_defect = cnt > self.aging_level1 and math.random(self.aging_level2 / cnt) == 1 - if self.node_name_defect and is_defect then - left_over = inv:add_item("main", ItemStack(self.node_name_defect)) - else - left_over = inv:add_item("main", ItemStack(self.node_name_passive)) - end - else - left_over = inv:add_item("main", ItemStack(self.node_name_passive)) - end - if left_over and left_over:get_count() > 0 then - minetest.add_item(pos, left_over) - end -end - minetest.register_node("techage:defect_dummy", { description = "Corrupted Node (to be replaced)", tiles = { diff --git a/coal_power_station/akkubox.lua b/coal_power_station/akkubox.lua index f73fea9..fcc6aa5 100644 --- a/coal_power_station/akkubox.lua +++ b/coal_power_station/akkubox.lua @@ -21,108 +21,73 @@ local M = minetest.get_meta local MP = minetest.get_modpath("techage") local I,_ = dofile(MP.."/intllib.lua") -local STANDBY_TICKS = 4 local CYCLE_TIME = 2 -local POWER_CONSUMPTION = 10 -local POWER_MAX_LOAD = 300 -local POWER_HYSTERESIS = 10 +local PWR_PERF = 10 +local PWR_CAPA = 3000 + local Power = techage.ElectricCable +local secondary_power = techage.power.secondary_power +local power_switched = techage.power.power_switched + +local function in_range(val, min, max) + if val < min then return min end + if val > max then return max end + return val +end local function formspec(self, pos, mem) return "size[5,3]".. default.gui_bg.. default.gui_bg_img.. default.gui_slots.. - "image[0,0.5;1,2;"..techage.power.formspec_power_bar(POWER_MAX_LOAD, mem.capa).."]".. + "image[0,0.5;1,2;"..techage.power.formspec_power_bar(PWR_CAPA, mem.capa).."]".. "label[0.2,2.5;Load]".. "button[1.1,1;1.8,1;update;"..I("Update").."]".. "image_button[3,1;1,1;".. self:get_state_button_image(mem) ..";state_button;]".. - "image[4,0.5;1,2;"..techage.power.formspec_load_bar(mem.charging).."]".. + "image[4,0.5;1,2;"..techage.power.formspec_load_bar(-(mem.delivered or 0), PWR_PERF).."]".. "label[4.2,2.5;Flow]" end local function start_node(pos, mem, state) - techage.power.power_distribution(pos) + mem.generating = true + mem.delivered = 0 + power_switched(pos) end local function stop_node(pos, mem, state) - mem.charging = nil - techage.power.power_distribution(pos) + mem.generating = false + mem.delivered = 0 + power_switched(pos) end local State = techage.NodeStates:new({ node_name_passive = "techage:ta3_akku", cycle_time = CYCLE_TIME, - standby_ticks = STANDBY_TICKS, + standby_ticks = 0, formspec_func = formspec, start_node = start_node, stop_node = stop_node, }) --- --- Power network callbacks --- - --- Pass1: Power balance calculation -local function on_power_pass1(pos, mem) - if State:is_active(mem) and mem.capa > POWER_HYSTERESIS then - mem.correction = POWER_CONSUMPTION -- uncharging - else - mem.correction = 0 - end - return -mem.correction -end - --- Pass2: Power balance adjustment -local function on_power_pass2(pos, mem, sum) - if State:is_active(mem) then - if sum > mem.correction + POWER_CONSUMPTION and - mem.capa < POWER_MAX_LOAD - POWER_HYSTERESIS then - mem.charging = true - return mem.correction + POWER_CONSUMPTION - elseif sum > mem.correction then - mem.charging = nil -- turn off - return mem.correction - elseif sum > -POWER_CONSUMPTION and mem.capa > POWER_HYSTERESIS then - mem.charging = false -- uncharging - return 0 - else - mem.charging = nil -- turn off - return mem.correction - end - else - return 0 - end -end - --- Pass3: Power balance result -local function on_power_pass3(pos, mem, sum) - mem.power_result = sum -end - - local function node_timer(pos, elapsed) local mem = tubelib2.get_mem(pos) - if State:is_active(mem) then - mem.capa = mem.capa or 0 - if mem.charging == true then - if mem.capa < POWER_MAX_LOAD then - mem.capa = mem.capa + 1 - else - mem.charging = nil -- turn off - techage.power.power_distribution(pos) - end - elseif mem.charging == false then -- uncharging - if mem.capa > 0 then - mem.capa = mem.capa - 1 - else - mem.charging = nil -- turn off - techage.power.power_distribution(pos) - end + mem.capa = mem.capa or 0 + if mem.generating then + local delivered + if mem.capa >= PWR_CAPA then + mem.delivered = secondary_power(pos, PWR_PERF, 0) + elseif mem.capa <= 0 then + mem.delivered = secondary_power(pos, 0, PWR_PERF) + else + mem.delivered = secondary_power(pos, PWR_PERF, PWR_PERF) end + mem.capa = mem.capa - mem.delivered + mem.capa = in_range(mem.capa, 0, PWR_CAPA) + return true end - return State:is_active(mem) + mem.delivered = 0 + return false end @@ -147,7 +112,7 @@ end local function get_capa(itemstack) local meta = itemstack:get_meta() if meta then - return meta:get_int("capa") + return in_range(meta:get_int("capa") * (PWR_CAPA/100), 0, 100) end return 0 end @@ -155,8 +120,10 @@ end local function set_capa(pos, oldnode, digger, capa) local node = ItemStack(oldnode.name) local meta = node:get_meta() - meta:set_int("capa", capa or 0) - local text = I("TA3 Akku Box").." ("..techage.power.percent(POWER_MAX_LOAD, capa).." %)" + capa = techage.power.percent(PWR_CAPA, capa) + capa = (math.floor((capa or 0) / 5)) * 5 + meta:set_int("capa", capa) + local text = I("TA3 Akku Box").." ("..capa.." %)" meta:set_string("description", text) local inv = minetest.get_inventory({type="player", name=digger:get_player_name()}) local left_over = inv:add_item("main", node) @@ -182,13 +149,13 @@ minetest.register_node("techage:ta3_akku", { after_place_node = function(pos, placer, itemstack) local mem = tubelib2.get_mem(pos) State:node_init(pos, mem, "") - mem.capa = get_capa(itemstack) + --mem.capa = get_capa(itemstack) + mem.capa = 300 on_rightclick(pos) end, after_dig_node = function(pos, oldnode, oldmetadata, digger) local mem = tubelib2.get_mem(pos) - --State:after_dig_node(pos, oldnode, oldmetadata, digger) set_capa(pos, oldnode, digger, mem.capa) end, @@ -196,7 +163,7 @@ minetest.register_node("techage:ta3_akku", { on_rightclick = on_rightclick, on_timer = node_timer, - drop = "", + drop = "", -- don't remove, item will be added via 'set_capa' paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, on_rotate = screwdriver.disallow, @@ -205,9 +172,6 @@ minetest.register_node("techage:ta3_akku", { }) techage.power.register_node({"techage:ta3_akku"}, { - on_power_pass1 = on_power_pass1, - on_power_pass2 = on_power_pass2, - on_power_pass3 = on_power_pass3, conn_sides = {"R"}, power_network = Power, }) @@ -226,3 +190,18 @@ minetest.register_craft({ {"techage:iron_ingot", "techage:iron_ingot", "default:wood"}, }, }) + +minetest.register_lbm({ + label = "[techage] Akku conversion", + name = "techage:akku_conversion", + nodenames = {"techage:ta3_akku"}, + run_at_every_load = true, + action = function(pos, node) + local mem = tubelib2.get_mem(pos) + if mem.power_result then -- old node? + mem.power_result = nil + mem.capa = in_range((mem.capa or 0) * 10, 0, PWR_CAPA) + end + end +}) + diff --git a/coal_power_station/boiler_base.lua b/coal_power_station/boiler_base.lua index 0e2f8e6..9f62619 100644 --- a/coal_power_station/boiler_base.lua +++ b/coal_power_station/boiler_base.lua @@ -54,6 +54,8 @@ techage.register_node({"techage:coalboiler_base"}, { return true elseif topic == "stop" then return true + elseif topic == "running" then + return true end end }) diff --git a/coal_power_station/boiler_top.lua b/coal_power_station/boiler_top.lua index 0bb7908..3a5b6b7 100644 --- a/coal_power_station/boiler_top.lua +++ b/coal_power_station/boiler_top.lua @@ -30,6 +30,11 @@ local MAX_WATER = 10 local Pipe = techage.SteamPipe +local function transfer(pos, topic, payload) + return techage.transfer(pos, "F", topic, payload, Pipe, + {"techage:turbine", "techage:turbine_on"}) +end + local Water = { ["bucket:bucket_river_water"] = true, ["bucket:bucket_water"] = true, @@ -38,7 +43,7 @@ local Water = { local function formspec(self, pos, mem) local temp = mem.temperature or 20 - local bar = mem.running and 3 or 0 + local ratio = mem.power_ratio or 0 return "size[8,7]".. default.gui_bg.. default.gui_bg_img.. @@ -51,7 +56,7 @@ local function formspec(self, pos, mem) "image[1,1.6;1,1;techage_form_mask.png]".. "image[2,0.5;1,2;techage_form_temp_bg.png^[lowpart:".. temp..":techage_form_temp_fg.png]".. - "image[7,0.5;1,2;"..techage.power.formspec_power_bar(10, bar).."]".. + "image[7,0.5;1,2;"..techage.power.formspec_power_bar(1, ratio).."]".. "image_button[6,1;1,1;".. self:get_state_button_image(mem) ..";state_button;]".. "button[3,1.5;2,1;update;"..I("Update").."]".. "list[current_player;main;0,3;8,4;]".. @@ -65,14 +70,11 @@ local function can_start(pos, mem, state) end local function start_node(pos, mem, state) - print("start_node", S(pos)) - mem.running = techage.transfer(pos, "F", "start", nil, Pipe, {"techage:turbine"}) - techage.transfer(pos, "F", "power_level", mem.power_level, Pipe, {"techage:turbine"}) + mem.running = transfer(pos, "start", nil) end local function stop_node(pos, mem, state) - print("stop_node", S(pos)) - techage.transfer(pos, "F", "stop", nil, Pipe, {"techage:turbine_on"}) + transfer(pos, "stop", nil) mem.running = false end @@ -118,7 +120,9 @@ local function water_temperature(pos, mem) end local function steaming(pos, mem, temp) - mem.water_level = math.max((mem.water_level or 0) - WATER_CONSUMPTION, 0) + local wc = WATER_CONSUMPTION * (mem.power_ratio or 1) + mem.water_level = math.max((mem.water_level or 0) - wc, 0) + mem.running = transfer(pos, "running", nil) if temp >= 80 then if mem.running then State:keep_running(pos, mem, COUNTDOWN_TICKS) @@ -145,6 +149,7 @@ local function on_receive_fields(pos, formname, fields, player) return end local mem = tubelib2.get_mem(pos) + mem.temperature = mem.temperature or 20 State:state_button_event(pos, mem, fields) if fields.update then @@ -159,12 +164,15 @@ end local function on_rightclick(pos) local mem = tubelib2.get_mem(pos) M(pos):set_string("formspec", formspec(State, pos, mem)) + if not minetest.get_node_timer(pos):is_started() then + minetest.get_node_timer(pos):start(CYCLE_TIME) + end end local function can_dig(pos, player) local inv = M(pos):get_inventory() local mem = tubelib2.get_mem(pos) - return inv:is_empty("water") and inv:is_empty("input") and not mem.running + return inv:is_empty("input") and not mem.running end local function move_to_water(pos) @@ -247,15 +255,10 @@ minetest.register_node("techage:coalboiler_top", { end end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - State:after_dig_node(pos, oldnode, oldmetadata, digger) - end, - on_metadata_inventory_put = function(pos) minetest.after(0.5, move_to_water, pos) end, - drop = "", paramtype2 = "facedir", groups = {cracky=1}, on_rotate = screwdriver.disallow, @@ -273,15 +276,8 @@ techage.register_node({"techage:coalboiler_top"}, { if topic == "trigger" then local mem = tubelib2.get_mem(pos) mem.fire_trigger = true - if not minetest.get_node_timer(pos):is_started() then - minetest.get_node_timer(pos):start(CYCLE_TIME) - end - elseif topic == "power_level" then - local mem = tubelib2.get_mem(pos) - mem.power_level = payload - print("coalboiler_top power_level", payload) - techage.transfer(pos, "F", topic, payload, Pipe, - {"techage:turbine", "techage:turbine_on"}) + mem.power_ratio = transfer(pos, topic, payload) + return mem.power_ratio end end }) diff --git a/coal_power_station/cooler.lua b/coal_power_station/cooler.lua index 21c20c6..52606ff 100644 --- a/coal_power_station/cooler.lua +++ b/coal_power_station/cooler.lua @@ -23,6 +23,11 @@ local I,_ = dofile(MP.."/intllib.lua") local Pipe = techage.SteamPipe +local function transfer(pos, in_dir, topic, payload) + return techage.transfer(pos, in_dir, topic, payload, Pipe, + {"techage:coalboiler_base"}) +end + local function swap_node(pos, name) local node = minetest.get_node(pos) if node.name == name then @@ -32,6 +37,11 @@ local function swap_node(pos, name) minetest.swap_node(pos, node) end +-- called with any pipe change +local function after_tube_update(node, pos, out_dir, peer_pos, peer_in_dir) + swap_node(pos, "techage:cooler") +end + minetest.register_node("techage:cooler", { description = I("TA3 Cooler"), tiles = { @@ -83,6 +93,7 @@ minetest.register_node("techage:cooler_on", { "techage_filling_ta3.png^techage_frame_ta3.png^techage_cooler.png", }, + after_tube_update = after_tube_update, paramtype2 = "facedir", groups = {not_in_creative_inventory=1}, diggable = false, @@ -101,16 +112,20 @@ techage.power.register_node({"techage:cooler", "techage:cooler_on"}, { techage.register_node({"techage:cooler", "techage:cooler_on"}, { on_transfer = function(pos, in_dir, topic, payload) if topic == "start" then - local on = techage.transfer(pos, in_dir, "start", nil, Pipe, {"techage:coalboiler_base"}) - if on then + if transfer(pos, in_dir, topic, nil) then swap_node(pos, "techage:cooler_on") + return true end - return on elseif topic == "stop" then - techage.transfer(pos, in_dir, "stop", nil, Pipe, {"techage:coalboiler_base"}) swap_node(pos, "techage:cooler") - return false + return transfer(pos, in_dir, topic, nil) + elseif topic == "running" then + if transfer(pos, in_dir, topic, nil) then + return true + end + swap_node(pos, "techage:cooler") end + return false end }) diff --git a/coal_power_station/firebox.lua b/coal_power_station/firebox.lua index 593aac1..68e8cf5 100644 --- a/coal_power_station/firebox.lua +++ b/coal_power_station/firebox.lua @@ -39,21 +39,22 @@ end local function node_timer(pos, elapsed) local mem = tubelib2.get_mem(pos) + print("firebox burn_cycles = "..(mem.burn_cycles or 0)) if mem.running then - techage.transfer( + -- trigger generator and provide power ratio 0..1 + local ratio = techage.transfer( {x=pos.x, y=pos.y+2, z=pos.z}, nil, -- outdir "trigger", -- topic - nil, -- payload + mem.power_level/4.0, -- payload nil, -- network {"techage:coalboiler_top"} -- nodenames ) - mem.burn_cycles = (mem.burn_cycles or 0) - 1 + mem.burn_cycles = (mem.burn_cycles or 0) - math.max((ratio or 0.1), 0.1) if mem.burn_cycles <= 0 then local taken = firebox.get_fuel(pos) if taken then mem.burn_cycles = firebox.Burntime[taken:get_name()] / CYCLE_TIME - mem.burn_cycles = mem.burn_cycles * 4 / (mem.power_level or 4) mem.burn_cycles_total = mem.burn_cycles else mem.running = false diff --git a/coal_power_station/generator.lua b/coal_power_station/generator.lua index 549a48c..967c078 100644 --- a/coal_power_station/generator.lua +++ b/coal_power_station/generator.lua @@ -23,38 +23,40 @@ local I,_ = dofile(MP.."/intllib.lua") local STANDBY_TICKS = 4 local COUNTDOWN_TICKS = 4 -local CYCLE_TIME = 8 -local POWER_CAPACITY = 80 +local CYCLE_TIME = 2 +local PWR_CAPA = 80 local Cable = techage.ElectricCable +local provide_power = techage.power.provide_power +local power_switched = techage.power.power_switched local function formspec(self, pos, mem) return "size[8,7]".. default.gui_bg.. default.gui_bg_img.. default.gui_slots.. - "image[6,0.5;1,2;"..techage.power.formspec_power_bar(POWER_CAPACITY, mem.power_result).."]".. + "image[6,0.5;1,2;"..techage.power.formspec_power_bar(PWR_CAPA, mem.provided).."]".. "image_button[5,1;1,1;".. self:get_state_button_image(mem) ..";state_button;]".. "button[2,1.5;2,1;update;"..I("Update").."]".. "list[current_player;main;0,3;8,4;]".. default.get_hotbar_bg(0, 3) end -local function turbine_running(pos) - local pos1 = techage.get_pos(pos, 'L') - local node = minetest.get_node(pos1) - if node.name == "techage:turbine_on" then - return true - end - return false +local function can_start(pos, mem, state) + return (mem.triggered or 0) > 0 -- by means of firebox end local function start_node(pos, mem, state) - techage.power.power_distribution(pos) + mem.generating = true -- needed for power distribution + minetest.get_node_timer(pos):start(CYCLE_TIME) + power_switched(pos) end local function stop_node(pos, mem, state) - techage.power.power_distribution(pos) + mem.generating = false + minetest.get_node_timer(pos):stop() + power_switched(pos) + mem.provided = 0 end local State = techage.NodeStates:new({ @@ -63,45 +65,25 @@ local State = techage.NodeStates:new({ cycle_time = CYCLE_TIME, standby_ticks = STANDBY_TICKS, formspec_func = formspec, - can_start = turbine_running, + can_start = can_start, start_node = start_node, stop_node = stop_node, }) --- Pass1: Power balance calculation -local function on_power_pass1(pos, mem) - if State:is_active(mem) then - return -POWER_CAPACITY * (mem.power_level or 4) / 4 - end - return 0 -end - --- Pass2: Power balance adjustment -local function on_power_pass2(pos, mem, sum) - return 0 -end - --- Pass3: Power balance result -local function on_power_pass3(pos, mem, sum) - mem.power_result = sum -end - -local function distibuting(pos, mem) - if mem.power_result > 0 then - State:keep_running(pos, mem, COUNTDOWN_TICKS) - else - State:fault(pos, mem) - techage.power.power_distribution(pos) - end -end - local function node_timer(pos, elapsed) local mem = tubelib2.get_mem(pos) - if turbine_running(pos) then - distibuting(pos, mem) + --print("generator", mem.triggered, mem.generating, PWR_CAPA * (mem.power_level or 0)) + mem.triggered = mem.triggered or 0 + if mem.triggered > 0 and mem.generating then + mem.provided = provide_power(pos, PWR_CAPA * (mem.power_level or 0)) + mem.triggered = mem.triggered - 1 + State:keep_running(pos, mem, COUNTDOWN_TICKS) + elseif mem.generating then -- trigger missing + State:stop(pos, mem) + mem.generating = 0 + mem.provided = 0 else - State:fault(pos, mem) - techage.power.power_distribution(pos) + mem.provided = 0 end return State:is_active(mem) end @@ -120,8 +102,10 @@ end local function on_rightclick(pos) local mem = tubelib2.get_mem(pos) - techage.power.power_distribution(pos) M(pos):set_string("formspec", formspec(State, pos, mem)) + if mem.generating then + minetest.get_node_timer(pos):start(CYCLE_TIME) + end end minetest.register_node("techage:generator", { @@ -144,15 +128,10 @@ minetest.register_node("techage:generator", { on_rightclick(pos) end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - State:after_dig_node(pos, oldnode, oldmetadata, digger) - end, - on_receive_fields = on_receive_fields, on_rightclick = on_rightclick, on_timer = node_timer, - drop = "", paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, on_rotate = screwdriver.disallow, @@ -213,9 +192,6 @@ minetest.register_craft({ }) techage.power.register_node({"techage:generator", "techage:generator_on"}, { - on_power_pass1 = on_power_pass1, - on_power_pass2 = on_power_pass2, - on_power_pass3 = on_power_pass3, conn_sides = {"R"}, power_network = Cable, }) @@ -223,11 +199,19 @@ techage.power.register_node({"techage:generator", "techage:generator_on"}, { -- for logical communication techage.register_node({"techage:generator", "techage:generator_on"}, { on_transfer = function(pos, in_dir, topic, payload) - print("generator", topic, payload) + --print("generator", topic, payload) local mem = tubelib2.get_mem(pos) if topic == "power_level" then local mem = tubelib2.get_mem(pos) mem.power_level = payload + elseif topic == "trigger" then + mem.triggered = 2 + mem.power_level = payload + if mem.generating then + return math.max((mem.provided or PWR_CAPA) / PWR_CAPA, 0.1) + else + return 0 + end end end }) diff --git a/coal_power_station/turbine.lua b/coal_power_station/turbine.lua index 0e437f2..b428356 100644 --- a/coal_power_station/turbine.lua +++ b/coal_power_station/turbine.lua @@ -23,6 +23,16 @@ local I,_ = dofile(MP.."/intllib.lua") local Pipe = techage.SteamPipe +local function transfer_cooler(pos, topic, payload) + return techage.transfer(pos, 6, topic, payload, Pipe, + {"techage:cooler", "techage:cooler_on"}) +end + +local function transfer_generator(pos, topic, payload) + return techage.transfer(pos, "R", topic, payload, nil, + {"techage:generator", "techage:generator_on"}) +end + local function swap_node(pos, name) local node = minetest.get_node(pos) if node.name == name then @@ -54,7 +64,7 @@ end -- called with any pipe change local function after_tube_update(node, pos, out_dir, peer_pos, peer_in_dir) local mem = tubelib2.get_mem(pos) - techage.transfer(pos, 6, "stop", nil, Pipe, {"techage:cooler_on"}) + transfer_cooler(pos, "stop", nil) swap_node(pos, "techage:turbine") mem.running = false stop_sound(pos) @@ -127,27 +137,32 @@ techage.power.register_node({"techage:turbine", "techage:turbine_on"}, { -- for logical communication techage.register_node({"techage:turbine", "techage:turbine_on"}, { on_transfer = function(pos, in_dir, topic, payload) - print("turbine", topic, payload) + --print("turbine", topic, payload) local mem = tubelib2.get_mem(pos) - if topic == "power_level" then - local mem = tubelib2.get_mem(pos) - mem.power_level = payload - techage.transfer(pos, "R", topic, payload, nil, - {"techage:generator", "techage:generator_on"}) + if topic == "trigger" then + return transfer_generator(pos, topic, payload) elseif topic == "start" then - local on = techage.transfer(pos, 6, "start", nil, Pipe, {"techage:cooler"}) - if on then + if transfer_cooler(pos, topic, payload) then swap_node(pos, "techage:turbine_on") mem.running = true play_sound(pos) + return true end - return on + return false + elseif topic == "running" then + if not transfer_cooler(pos, topic, payload) then + swap_node(pos, "techage:turbine") + mem.running = false + stop_sound(pos) + return false + end + return true elseif topic == "stop" then - techage.transfer(pos, 6, "stop", nil, Pipe, {"techage:cooler_on"}) + transfer_cooler(pos, topic, payload) swap_node(pos, "techage:turbine") mem.running = false stop_sound(pos) - return false + return true end end }) diff --git a/furnace/booster.lua b/furnace/booster.lua index 32d570b..83e2e91 100644 --- a/furnace/booster.lua +++ b/furnace/booster.lua @@ -21,9 +21,12 @@ local M = minetest.get_meta local MP = minetest.get_modpath("techage") local I,_ = dofile(MP.."/intllib.lua") -local POWER_CONSUMPTION = 3 +local PWR_NEEDED = 3 +local CYCLE_TIME = 2 local Power = techage.ElectricCable +local consume_power = techage.power.consume_power +local power_available = techage.power.power_available local function infotext(pos, state) M(pos):set_string("infotext", I("TA3 Booster")..": "..state) @@ -38,43 +41,24 @@ local function swap_node(pos, name) minetest.swap_node(pos, node) end -local function play_sound(pos) +local function node_timer(pos, elapsed) + --print("node_timer sink "..S(pos)) local mem = tubelib2.get_mem(pos) if mem.running then - mem.handle = minetest.sound_play("techage_booster", { - pos = pos, - gain = 1, - max_hear_distance = 7}) - minetest.after(2, play_sound, pos) - end -end - -local function stop_sound(pos) - local mem = tubelib2.get_mem(pos) - if mem.handle then - minetest.sound_stop(mem.handle) - mem.handle = nil - end -end - -local function on_power_pass1(pos, mem) - --print("on_power_pass1") - if mem.running then - mem.correction = POWER_CONSUMPTION - else - mem.correction = 0 - end - return mem.correction -end - -local function on_power_pass2(pos, mem, sum) - if sum > 0 then - mem.has_power = true - return 0 - else - mem.has_power = false - return -mem.correction + local got = consume_power(pos, PWR_NEEDED) + if got < PWR_NEEDED then + swap_node(pos, "techage:ta3_booster") + else + swap_node(pos, "techage:ta3_booster_on") + minetest.sound_play("techage_booster", { + pos = pos, + gain = 1, + max_hear_distance = 7}) + end + return true end + swap_node(pos, "techage:ta3_booster") + return false end minetest.register_node("techage:ta3_booster", { @@ -90,13 +74,13 @@ minetest.register_node("techage:ta3_booster", { }, on_construct = tubelib2.init_mem, - after_place_node = function(pos, placer) local node = minetest.get_node(pos) local indir = techage.side_to_indir("R", node.param2) M(pos):set_int("indir", indir) infotext(pos, "stopped") end, + on_time = node_timer, paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, @@ -135,6 +119,7 @@ minetest.register_node("techage:ta3_booster_on", { }, }, + on_time = node_timer, paramtype2 = "facedir", groups = {not_in_creative_inventory = 1}, diggable = false, @@ -144,8 +129,6 @@ minetest.register_node("techage:ta3_booster_on", { }) techage.power.register_node({"techage:ta3_booster", "techage:ta3_booster_on"}, { - on_power_pass1 = on_power_pass1, - on_power_pass2 = on_power_pass2, power_network = Power, conn_sides = {"F", "B", "U", "D"}, }) @@ -157,27 +140,23 @@ techage.register_node({"techage:ta3_booster", "techage:ta3_booster_on"}, { if M(pos):get_int("indir") == in_dir then local mem = tubelib2.get_mem(pos) if topic == "power" then - return mem.has_power + return power_available(pos) elseif topic == "start" then - if mem.has_power then + if power_available(pos) then mem.running = true - play_sound(pos) swap_node(pos, "techage:ta3_booster_on") infotext(pos, "running") - techage.power.power_distribution(pos) else infotext(pos, "no power") end elseif topic == "stop" then mem.running = false - stop_sound(pos) swap_node(pos, "techage:ta3_booster") if mem.has_power then infotext(pos, "stopped") else infotext(pos, "no power") end - techage.power.power_distribution(pos) end end end @@ -196,14 +175,3 @@ techage.register_help_page(I("TA3 Booster"), I([[Part of the TA3 Industrial Furnace and further machines. Used to increase the air/gas pressure.]]), "techage:ta3_booster") - - -minetest.register_lbm({ - label = "[techage] Booster sound", - name = "techage:booster", - nodenames = {"techage:ta3_booster_on"}, - run_at_every_load = true, - action = function(pos, node) - play_sound(pos) - end -}) diff --git a/furnace/furnace_top.lua b/furnace/furnace_top.lua index 895950d..6eb7a2c 100644 --- a/furnace/furnace_top.lua +++ b/furnace/furnace_top.lua @@ -172,15 +172,6 @@ tiles.pas = { "techage_concrete.png^techage_appl_furnace.png^techage_frame_ta#.png", } tiles.act = tiles.pas -tiles.def = { - -- up, down, right, left, back, front - "techage_concrete.png^techage_frame_ta#_top.png", - "techage_concrete.png^techage_frame_ta#_top.png", - "techage_concrete.png^techage_frame_ta#.png^techage_appl_defect.png", - "techage_concrete.png^techage_frame_ta#.png^techage_appl_defect.png", - "techage_concrete.png^techage_frame_ta#.png^techage_appl_defect.png", - "techage_concrete.png^techage_appl_furnace.png^techage_frame_ta#.png^techage_appl_defect.png", -} local tubing = { on_pull_item = function(pos, in_dir, num) @@ -194,6 +185,7 @@ local tubing = { local meta = minetest.get_meta(pos) if meta:get_int("push_dir") == in_dir or in_dir == 5 then local inv = M(pos):get_inventory() + CRD(pos).State:start_if_standby(pos) return techage.put_items(inv, "src", stack) end end, @@ -215,9 +207,6 @@ local tubing = { on_node_load = function(pos) CRD(pos).State:on_node_load(pos) end, - on_node_repair = function(pos) - return CRD(pos).State:on_node_repair(pos) - end, } local _, node_name_ta3, _ = @@ -225,8 +214,6 @@ local _, node_name_ta3, _ = drawtype = "normal", cycle_time = CYCLE_TIME, standby_ticks = STANDBY_TICKS, - has_item_meter = true, - aging_factor = 10, formspec = formspec, tubing = tubing, on_state_change = on_node_state_change, diff --git a/init.lua b/init.lua index 44934ca..2ea1736 100644 --- a/init.lua +++ b/init.lua @@ -13,7 +13,6 @@ elseif minetest.global_exists("tubelib2") and tubelib2.version < 1.4 then else techage.max_num_forceload_blocks = tonumber(minetest.setting_get("techage_max_num_forceload_blocks")) or 12 techage.basalt_stone_enabled = minetest.setting_get("techage_basalt_stone_enabled") == "true" - techage.machine_aging_value = tonumber(minetest.setting_get("techage_machine_aging_value")) or 100 techage.ore_rarity = tonumber(minetest.setting_get("techage_ore_rarity")) or 1 techage.modified_recipes_enabled = minetest.setting_get("techage_modified_recipes_enabled") == "true" @@ -29,7 +28,6 @@ else dofile(MP.."/basis/node_states.lua") -- state model dofile(MP.."/basis/tubes.lua") -- tubelib replacement dofile(MP.."/basis/command.lua") -- tubelib replacement - dofile(MP.."/basis/consumer.lua") -- consumer base model dofile(MP.."/basis/firebox_lib.lua") -- common firebox functions dofile(MP.."/basis/mark.lua") dofile(MP.."/basis/assemble.lua") @@ -82,6 +80,7 @@ else dofile(MP.."/steam_engine/gearbox.lua") -- Basic Machines + dofile(MP.."/basis/consumer.lua") -- consumer base model dofile(MP.."/basic_machines/source.lua") dofile(MP.."/basic_machines/pusher.lua") dofile(MP.."/basic_machines/blackhole.lua") @@ -136,8 +135,8 @@ else -- Test dofile(MP.."/recipe_checker.lua") - dofile(MP.."/test/sink.lua") - dofile(MP.."/test/source.lua") - dofile(MP.."/test/akku.lua") - dofile(MP.."/test/switch.lua") + --dofile(MP.."/.test/sink.lua") + --dofile(MP.."/.test/source.lua") + --dofile(MP.."/.test/akku.lua") + --dofile(MP.."/.test/switch.lua") end \ No newline at end of file diff --git a/lamps/lib.lua b/lamps/lib.lua index 6ad6f0b..faea531 100644 --- a/lamps/lib.lua +++ b/lamps/lib.lua @@ -3,9 +3,11 @@ local S = function(pos) if pos then return minetest.pos_to_string(pos) end end local P = minetest.string_to_pos local M = minetest.get_meta -local POWER_CONSUMPTION = 0.5 +local PWR_NEEDED = 0.5 +local CYCLE_TIME = 2 -local Power = techage.ElectricCable +local Cable = techage.ElectricCable +local consume_power = techage.power.consume_power local function swap_node(pos, postfix) local node = techage.get_node_lvm(pos) @@ -17,23 +19,20 @@ local function swap_node(pos, postfix) minetest.swap_node(pos, node) end -local function on_power_pass1(pos, mem) +local function node_timer(pos, elapsed) + --print("node_timer lamp "..S(pos)) + local mem = tubelib2.get_mem(pos) if mem.running then - mem.correction = POWER_CONSUMPTION - else - mem.correction = 0 - end - return mem.correction -end - -local function on_power_pass2(pos, mem, sum) - if sum > 0 and mem.running then - swap_node(pos, "on") - return 0 - else - swap_node(pos, "off") - return -mem.correction + local got = consume_power(pos, PWR_NEEDED) + if got < PWR_NEEDED then + swap_node(pos, "off") + else + swap_node(pos, "on") + end + return true end + swap_node(pos, "off") + return false end local function lamp_on_rightclick(pos, node, clicker) @@ -43,10 +42,13 @@ local function lamp_on_rightclick(pos, node, clicker) local mem = tubelib2.get_mem(pos) if not mem.running then mem.running = true + node_timer(pos, 2) + minetest.get_node_timer(pos):start(CYCLE_TIME) else mem.running = false + minetest.get_node_timer(pos):stop() + swap_node(pos, "off") end - techage.power.power_distribution(pos) end local function on_rotate(pos, node, user, mode, new_param2) @@ -73,6 +75,7 @@ function techage.register_lamp(basename, ndef_off, ndef_on) ndef_off.on_construct = tubelib2.init_mem ndef_off.on_rightclick = lamp_on_rightclick ndef_off.on_rotate = on_rotate + ndef_off.on_timer = node_timer ndef_off.on_place = on_place ndef_off.paramtype = "light" ndef_off.light_source = 0 @@ -85,6 +88,7 @@ function techage.register_lamp(basename, ndef_off, ndef_on) ndef_on.on_construct = tubelib2.init_mem ndef_on.on_rightclick = lamp_on_rightclick ndef_on.on_rotate = on_rotate + ndef_on.on_timer = node_timer ndef_on.paramtype = "light" ndef_on.light_source = minetest.LIGHT_MAX ndef_on.sunlight_propagates = true @@ -98,9 +102,7 @@ function techage.register_lamp(basename, ndef_off, ndef_on) minetest.register_node(basename.."_on", ndef_on) techage.power.register_node({basename.."_off", basename.."_on"}, { - on_power_pass1 = on_power_pass1, - on_power_pass2 = on_power_pass2, - power_network = Power, + power_network = Cable, conn_sides = ndef_off.conn_sides or determine_power_side, -- will be handled by clbk function }) end diff --git a/oil/drillbox.lua b/oil/drillbox.lua index b95b8d8..265c743 100644 --- a/oil/drillbox.lua +++ b/oil/drillbox.lua @@ -212,15 +212,6 @@ tiles.pas = { "techage_filling_ta#.png^techage_appl_oildrill.png^techage_frame_ta#.png", } tiles.act = tiles.pas -tiles.def = { - -- up, down, right, left, back, front - "techage_filling_ta#.png^techage_frame_ta#_top.png", - "techage_filling_ta#.png^techage_frame_ta#.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_outp.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_inp.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_appl_oildrill.png^techage_frame_ta#.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_appl_oildrill.png^techage_frame_ta#.png^techage_appl_defect.png", -} local tubing = { on_pull_item = function(pos, in_dir, num) @@ -234,6 +225,7 @@ local tubing = { local meta = minetest.get_meta(pos) if meta:get_int("push_dir") == in_dir or in_dir == 5 then local inv = M(pos):get_inventory() + CRD(pos).State:start_if_standby(pos) return techage.put_items(inv, "src", stack) end end, @@ -255,9 +247,6 @@ local tubing = { on_node_load = function(pos) CRD(pos).State:on_node_load(pos) end, - on_node_repair = function(pos) - return CRD(pos).State:on_node_repair(pos) - end, } local _, node_name_ta3, _ = @@ -265,8 +254,6 @@ local _, node_name_ta3, _ = drawtype = "normal", cycle_time = CYCLE_TIME, standby_ticks = STANDBY_TICKS, - has_item_meter = true, - aging_factor = 10, formspec = formspec, tubing = tubing, on_state_change = on_node_state_change, diff --git a/oil/pumpjack.lua b/oil/pumpjack.lua index 7e2f0af..f46667c 100644 --- a/oil/pumpjack.lua +++ b/oil/pumpjack.lua @@ -138,15 +138,6 @@ tiles.act = { "techage_filling_ta#.png^techage_frame_ta#_top.png^techage_appl_arrow.png^[transformR90]", "techage_filling_ta#.png^techage_frame_ta#_top.png^techage_appl_arrow.png^[transformR90]", } -tiles.def = { - -- up, down, right, left, back, front - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_outp.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_inp.png", - "techage_appl_pumpjack.png^techage_frame_ta#.png^techage_appl_defect.png", - "techage_appl_pumpjack.png^techage_frame_ta#.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_defect.png", - "techage_filling_ta#.png^techage_frame_ta#.png^techage_appl_defect.png", -} local tubing = { is_pusher = true, -- is a pulling/pushing node @@ -162,17 +153,12 @@ local tubing = { on_node_load = function(pos) CRD(pos).State:on_node_load(pos) end, - on_node_repair = function(pos) - return CRD(pos).State:on_node_repair(pos) - end, } local _, node_name_ta3, _ = techage.register_consumer("pumpjack", I("TA3 Oil Pumpjack"), tiles, { cycle_time = CYCLE_TIME, standby_ticks = STANDBY_TICKS, - has_item_meter = true, - aging_factor = 10, formspec = formspec, tubing = tubing, after_place_node = function(pos, placer) diff --git a/power/power.lua b/power/power.lua index 8596058..a9a854f 100644 --- a/power/power.lua +++ b/power/power.lua @@ -24,6 +24,12 @@ local PWRN = function(node) return (minetest.registered_nodes[node.name] or {}). -- Used to determine the already passed nodes while power distribution local Route = {} +local function in_range(val, min, max) + if val < min then return min end + if val > max then return max end + return val +end + local function pos_already_reached(pos) local key = minetest.hash_node_position(pos) if not Route[key] then @@ -32,7 +38,7 @@ local function pos_already_reached(pos) end return true end - + local SideToDir = {B=1, R=2, F=3, L=4, D=5, U=6} local function side_to_dir(param2, side) @@ -94,58 +100,101 @@ local function matching_nodes(pos, peer_pos) return not tube_type1 or not tube_type2 or tube_type1 == tube_type2 end -local function get_clbk(pos, clbk_name) - local pwr = PWR(pos) - return pwr and pwr[clbk_name] -end - -local function connection_walk(pos, clbk_name, sum) +local function connection_walk(pos, clbk) local mem = tubelib2.get_mem(pos) mem.interrupted_dirs = mem.interrupted_dirs or {} - local clbk = get_clbk(pos, clbk_name) - --print("connection_walk", S(pos), sum, clbk) if clbk then - sum = sum - (clbk(pos, mem, sum) or 0) + clbk(pos, mem) end for out_dir,item in pairs(mem.connections or {}) do if item.pos and not pos_already_reached(item.pos) and not mem.interrupted_dirs[out_dir] then - sum = connection_walk(item.pos, clbk_name, sum) + connection_walk(item.pos, clbk) end end - return sum end --- Start the overall power consumption and depending on that --- turn nodes on/off -local function power_distribution(pos) - local sum = 0 - Route = {} - pos_already_reached(pos) - sum = connection_walk(pos, "on_power_pass1", sum) - Route = {} - pos_already_reached(pos) - sum = connection_walk(pos, "on_power_pass2", sum) - Route = {} - pos_already_reached(pos) - sum = connection_walk(pos, "on_power_pass3", sum) - --print("power sum = "..sum) -end -local function register_lbm(name) - minetest.register_lbm({ - label = "[TechAge] Node update", - nodenames = {name}, - name = name.."_update", - run_at_every_load = true, - action = function(pos, node) - local pwr = PWRN(node) - -- repair power_dirs - if pwr and pwr.conn_sides and M(pos):get_string("power_dirs") == "" then - set_conn_dirs(pos, pwr.conn_sides) +-- determine one "generating" node as master (largest hash number) +local function determine_master(pos) + Route = {} + pos_already_reached(pos) + local hash = 0 + local master = nil + connection_walk(pos, function(pos, mem) + if mem.generating then + local new = minetest.hash_node_position(pos) + if hash <= new then + hash = new + master = pos + end end - end - }) + end) + return master +end + +-- store master position on all network nodes +local function store_master(pos, master_pos) + Route = {} + pos_already_reached(pos) + connection_walk(pos, function(pos, mem) + mem.master_pos = master_pos + mem.is_master = false + end) +end + + +-- called from any generator +local function on_power_switch(pos) + print("on_power_change"..S(pos)) + local mem = tubelib2.get_mem(pos) + mem.master_pos = nil + mem.is_master = nil + + local mpos = determine_master(pos) + store_master(pos, mpos) + if mpos then + print("master = "..S(mpos)) + local mem = tubelib2.get_mem(mpos) + mem.is_master = true + return mem + end +end + +local function min(val, max) + if val < 0 then return 0 end + if val > max then return max end + return val +end + +-- called from master every 2 seconds +local function accounting(mem) + -- defensive programming + mem.needed1 = mem.needed1 or 0 + mem.needed2 = mem.needed2 or 0 + mem.available1 = mem.available1 or 0 + mem.available2 = mem.available2 or 0 + -- calculate the primary and secondary supply and demand + mem.supply1 = min(mem.needed1 + mem.needed2, mem.available1) + mem.demand1 = min(mem.needed1, mem.available1 + mem.available2) + mem.supply2 = min(mem.demand1 - mem.supply1, mem.available2) + mem.demand2 = min(mem.supply1 - mem.demand1, mem.available1) + mem.reserve = (mem.available1 + mem.available1) > mem.needed1 + print("needed = "..mem.needed1.."/"..mem.needed2..", available = "..mem.available1.."/"..mem.available2) + print("supply = "..mem.supply1.."/"..mem.supply2..", demand = "..mem.demand1.."/"..mem.demand2..", reserve = "..dump(mem.reserve)) + -- reset values for nect cycle + mem.needed1 = 0 + mem.needed2 = 0 + mem.available1 = 0 + mem.available2 = 0 +end + +-- called from tubelib2.after_tube_update +local function on_network_change(pos) + local mem = on_power_switch(pos) + if mem then + accounting(mem) + end end -- @@ -153,7 +202,8 @@ end -- techage.power = {} -techage.power.power_distribution = power_distribution +techage.power.power_switched = on_power_switch +techage.power.on_network_change = on_network_change -- Used to turn on/off the power by means of a power switch function techage.power.power_cut(pos, dir, cable, cut) @@ -172,12 +222,12 @@ function techage.power.power_cut(pos, dir, cable, cut) mem.interrupted_dirs = {true, true, true, true, true, true} for dir,_ in pairs(mem.connections) do mem.interrupted_dirs[dir] = false - power_distribution(npos) + on_power_switch(npos) mem.interrupted_dirs[dir] = true end else mem.interrupted_dirs = {} - power_distribution(npos) + on_power_switch(npos) end end @@ -187,9 +237,6 @@ function techage.power.register_node(names, pwr_def) if ndef then minetest.override_item(name, { power = { - on_power_pass1 = pwr_def.on_power_pass1, - on_power_pass2 = pwr_def.on_power_pass2, - on_power_pass3 = pwr_def.on_power_pass3, conn_sides = pwr_def.conn_sides or {"L", "R", "U", "D", "F", "B"}, power_network = pwr_def.power_network, after_place_node = ndef.after_place_node, @@ -227,38 +274,121 @@ function techage.power.register_node(names, pwr_def) mem.connections[out_dir] = {pos = peer_pos, in_dir = peer_in_dir} end -- To be called delayed, so that all network connections have been established - minetest.after(0.2, power_distribution, pos) + minetest.after(0.2, on_network_change, pos) if pwr.after_tube_update then return pwr.after_tube_update(node, pos, out_dir, peer_pos, peer_in_dir) end end, }) pwr_def.power_network:add_secondary_node_names({name}) - register_lbm(name) end end end +function techage.power.consume_power(pos, needed) + local master_pos = tubelib2.get_mem(pos).master_pos + if master_pos then + local mem = tubelib2.get_mem(master_pos) + -- for next cycle + mem.needed1 = (mem.needed1 or 0) + needed + -- current cycle + mem.demand1 = mem.demand1 or 0 + local val = math.min(needed, mem.demand1) + mem.demand1 = mem.demand1 - val + return val + end + return 0 +end + +function techage.power.provide_power(pos, provide) + local mem = tubelib2.get_mem(pos) + if mem.is_master then + accounting(mem) + elseif mem.master_pos then + mem = tubelib2.get_mem(mem.master_pos) + else + return 0 + end + -- for next cycle + mem.available1 = (mem.available1 or 0) + provide + -- current cycle + mem.supply1 = mem.supply1 or 0 + local val = math.min(provide, mem.supply1) + mem.supply1 = mem.supply1 - val + return val +end + +function techage.power.secondary_power(pos, provide, needed) + local mem = tubelib2.get_mem(pos) + if mem.is_master then + accounting(mem) + elseif mem.master_pos then + mem = tubelib2.get_mem(mem.master_pos) + else + return 0 + end + -- for next cycle + mem.available2 = (mem.available2 or 0) + provide + mem.needed2 = (mem.needed2 or 0) + needed + + -- defensive programming + mem.supply2 = mem.supply2 or 0 + mem.demand2 = mem.demand2 or 0 + + -- check as generator + if mem.supply2 > 0 then + local val = math.min(provide, mem.supply2) + mem.supply2 = mem.supply2 - val + return val + end + -- check as consumer + if mem.demand2 > 0 then + local val = math.min(needed, mem.demand2) + mem.demand2 = mem.demand2 - val + return -val + end + return 0 +end + +function techage.power.power_available(pos) + local mem = tubelib2.get_mem(pos) + if mem.is_master then + return mem.reserve + elseif mem.master_pos then + mem = tubelib2.get_mem(mem.master_pos) + return mem.reserve + else + return false + end + +end + function techage.power.percent(max_val, curr_val) return math.min(math.ceil(((curr_val or 0) * 100.0) / (max_val or 1.0)), 100) end +function techage.power.formspec_load_bar(charging, max_val) + local percent + charging = charging or 0 + max_val = max_val or 1 + if charging ~= 0 then + percent = 50 + math.ceil((charging * 50.0) / max_val) + end + + if charging > 0 then + return "techage_form_level_off.png^[lowpart:"..percent..":techage_form_level_charge.png" + elseif charging < 0 then + return "techage_form_level_unload.png^[lowpart:"..percent..":techage_form_level_off.png" + else + return "techage_form_level_off.png" + end +end + function techage.power.formspec_power_bar(max_power, current_power) local percent = techage.power.percent(max_power, current_power) return "techage_form_level_bg.png^[lowpart:"..percent..":techage_form_level_fg.png" end --- charging is true, false, or nil if turned off -function techage.power.formspec_load_bar(charging) - if charging ~= nil then - if charging then - return "techage_form_level_charge.png" - else - return "techage_form_level_unload.png" - end - end - return "techage_form_level_off.png" -end function techage.power.side_to_outdir(pos, side) local node = minetest.get_node(pos) diff --git a/power/power2.lua b/power/power2.lua index 54e58a3..13359fd 100644 --- a/power/power2.lua +++ b/power/power2.lua @@ -176,6 +176,7 @@ local function on_network_change(pos) end end + -- -- Generic API functions -- diff --git a/steam_engine/boiler.lua b/steam_engine/boiler.lua index 3e988d6..4d0adcd 100644 --- a/steam_engine/boiler.lua +++ b/steam_engine/boiler.lua @@ -38,7 +38,7 @@ local Water = { local function formspec(self, pos, mem) local temp = mem.temperature or 20 - local bar = mem.running and 3 or 0 + local ratio = mem.power_ratio or 0 return "size[8,7]".. default.gui_bg.. default.gui_bg_img.. @@ -51,7 +51,7 @@ local function formspec(self, pos, mem) "image[1,1.6;1,1;techage_form_mask.png]".. "image[2,0.5;1,2;techage_form_temp_bg.png^[lowpart:".. temp..":techage_form_temp_fg.png]".. - "image[7,0.5;1,2;"..techage.power.formspec_power_bar(10, bar).."]".. + "image[7,0.5;1,2;"..techage.power.formspec_power_bar(1, ratio).."]".. "image_button[6,1;1,1;".. self:get_state_button_image(mem) ..";state_button;]".. "button[3,1.5;2,1;update;"..I("Update").."]".. "list[current_player;main;0,3;8,4;]".. @@ -65,11 +65,10 @@ local function can_start(pos, mem, state) end local function start_node(pos, mem, state) - mem.running = techage.transfer(pos, 6, "start", nil, Pipe, {"techage:cylinder"}) + mem.running = true end local function stop_node(pos, mem, state) - techage.transfer(pos, 6, "stop", nil, Pipe, {"techage:cylinder_on"}) mem.running = false end @@ -115,7 +114,8 @@ local function water_temperature(pos, mem) end local function steaming(pos, mem, temp) - mem.water_level = math.max((mem.water_level or 0) - WATER_CONSUMPTION, 0) + local wc = WATER_CONSUMPTION * (mem.power_ratio or 1) + mem.water_level = math.max((mem.water_level or 0) - wc, 0) if temp >= 80 then if mem.running then State:keep_running(pos, mem, COUNTDOWN_TICKS) @@ -142,6 +142,7 @@ local function on_receive_fields(pos, formname, fields, player) return end local mem = tubelib2.get_mem(pos) + mem.temperature = mem.temperature or 20 State:state_button_event(pos, mem, fields) if fields.update then @@ -161,7 +162,7 @@ end local function can_dig(pos, player) local inv = M(pos):get_inventory() local mem = tubelib2.get_mem(pos) - return inv:is_empty("water") and inv:is_empty("input") and not mem.running + return inv:is_empty("input") and not mem.running end local function move_to_water(pos) @@ -261,15 +262,10 @@ minetest.register_node("techage:boiler2", { end end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - State:after_dig_node(pos, oldnode, oldmetadata, digger) - end, - on_metadata_inventory_put = function(pos) minetest.after(0.5, move_to_water, pos) end, - drop = "", groups = {cracky=1}, on_rotate = screwdriver.disallow, is_ground_content = false, @@ -289,6 +285,13 @@ techage.register_node({"techage:boiler2"}, { if not minetest.get_node_timer(pos):is_started() then minetest.get_node_timer(pos):start(CYCLE_TIME) end + if mem.running then + mem.power_ratio = techage.transfer(pos, 6, "trigger", nil, Pipe, { + "techage:cylinder", "techage:cylinder_on"}) or 0 + return mem.power_ratio + else + return 0 + end end end }) diff --git a/steam_engine/cylinder.lua b/steam_engine/cylinder.lua index 5731acb..79e2239 100644 --- a/steam_engine/cylinder.lua +++ b/steam_engine/cylinder.lua @@ -32,24 +32,11 @@ local function swap_node(pos, name) minetest.swap_node(pos, node) end --- called from flywheel -local function start_cylinder(pos, on) - local mem = tubelib2.get_mem(pos) - if on and mem.running then - swap_node(pos, "techage:cylinder_on") - techage.power.power_distribution(pos) - return true - else - swap_node(pos, "techage:cylinder") - techage.power.power_distribution(pos) - return false - end -end - -- called with any pipe change local function after_tube_update(node, pos, out_dir, peer_pos, peer_in_dir) local mem = tubelib2.get_mem(pos) mem.running = false + swap_node(pos, "techage:cylinder") end minetest.register_node("techage:cylinder", { @@ -65,8 +52,6 @@ minetest.register_node("techage:cylinder", { }, on_construct = tubelib2.init_mem, - start_cylinder = start_cylinder, - paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, on_rotate = screwdriver.disallow, @@ -104,9 +89,7 @@ minetest.register_node("techage:cylinder_on", { }, }, - start_cylinder = start_cylinder, after_tube_update = after_tube_update, - paramtype2 = "facedir", groups = {not_in_creative_inventory=1}, diggable = false, @@ -124,12 +107,27 @@ techage.power.register_node({"techage:cylinder", "techage:cylinder_on"}, { techage.register_node({"techage:cylinder", "techage:cylinder_on"}, { on_transfer = function(pos, in_dir, topic, payload) local mem = tubelib2.get_mem(pos) - if topic == "start" then - mem.running = true - return true + if topic == "trigger" then + local power = techage.transfer(pos, "R", "trigger", nil, nil, { + "techage:flywheel", "techage:flywheel_on"}) or 0 + print("trigger", power, mem.running) + + if not power then + return 0 + elseif power > 0 and not mem.running then + swap_node(pos, "techage:cylinder_on") + mem.running = true + return power + elseif power <= 0 and mem.running then + swap_node(pos, "techage:cylinder") + mem.running = false + return 0 + else + return power + end elseif topic == "stop" then + swap_node(pos, "techage:cylinder") mem.running = false - return false end end }) diff --git a/steam_engine/firebox.lua b/steam_engine/firebox.lua index 38e4d36..c6f4e2c 100644 --- a/steam_engine/firebox.lua +++ b/steam_engine/firebox.lua @@ -27,8 +27,9 @@ local CYCLE_TIME = 2 local function node_timer(pos, elapsed) local mem = tubelib2.get_mem(pos) + print("firebox burn_cycles = "..(mem.burn_cycles or 0)) if mem.running then - techage.transfer( + local power = techage.transfer( {x=pos.x, y=pos.y+2, z=pos.z}, nil, -- outdir "trigger", -- topic @@ -36,7 +37,7 @@ local function node_timer(pos, elapsed) nil, -- network {"techage:boiler2"} -- nodenames ) - mem.burn_cycles = (mem.burn_cycles or 0) - 1 + mem.burn_cycles = (mem.burn_cycles or 0) - math.max((power or 0.1), 0.1) if mem.burn_cycles <= 0 then local taken = firebox.get_fuel(pos) if taken then @@ -167,6 +168,8 @@ minetest.register_lbm({ run_at_every_load = true, action = function(pos, node) minetest.get_node_timer(pos):start(CYCLE_TIME) + local mem = tubelib2.get_mem(pos) + mem.power_level = nil end }) diff --git a/steam_engine/flywheel.lua b/steam_engine/flywheel.lua index 5f37fdf..8f28e15 100644 --- a/steam_engine/flywheel.lua +++ b/steam_engine/flywheel.lua @@ -23,65 +23,50 @@ local I,_ = dofile(MP.."/intllib.lua") local STANDBY_TICKS = 4 local COUNTDOWN_TICKS = 4 -local CYCLE_TIME = 8 -local POWER_CAPACITY = 25 +local CYCLE_TIME = 2 +local PWR_CAPA = 25 local Axle = techage.Axle +local provide_power = techage.power.provide_power +local power_switched = techage.power.power_switched local function formspec(self, pos, mem) return "size[8,7]".. default.gui_bg.. default.gui_bg_img.. default.gui_slots.. - "image[6,0.5;1,2;"..techage.power.formspec_power_bar(POWER_CAPACITY, mem.power_result).."]".. + "image[6,0.5;1,2;"..techage.power.formspec_power_bar(PWR_CAPA, mem.provided).."]".. "image_button[5,1;1,1;".. self:get_state_button_image(mem) ..";state_button;]".. "button[2,1.5;2,1;update;"..I("Update").."]".. "list[current_player;main;0,3;8,4;]".. default.get_hotbar_bg(0, 3) end -local function start_cylinder(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 ndef = minetest.registered_nodes[minetest.get_node(pos2).name] - if ndef and ndef.start_cylinder then - return ndef.start_cylinder(pos2, on) - end - return false -end - local function can_start(pos, mem, state) - return start_cylinder(pos, true, mem) -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_steamengine", { - pos = pos, - gain = 0.5, - max_hear_distance = 10}) - minetest.after(2, play_sound, pos) - end + return (mem.triggered or 0) > 0 -- by means of firebox end local function start_node(pos, mem, state) - techage.power.power_distribution(pos) - if mem.power_result > 0 then - techage.switch_axles(pos, true) - play_sound(pos) - end + mem.generating = true -- needed for power distribution + techage.switch_axles(pos, true) + minetest.get_node_timer(pos):start(CYCLE_TIME) + mem.handle = minetest.sound_play("techage_steamengine", { + pos = pos, + gain = 0.5, + max_hear_distance = 10}) + power_switched(pos) end local function stop_node(pos, mem, state) - start_cylinder(pos, false, mem) - techage.power.power_distribution(pos) + mem.generating = false techage.switch_axles(pos, false) + minetest.get_node_timer(pos):stop() + if mem.handle then + minetest.sound_stop(mem.handle) + mem.handle = nil + end + power_switched(pos) + mem.provided = 0 end local State = techage.NodeStates:new({ @@ -95,43 +80,25 @@ local State = techage.NodeStates:new({ stop_node = stop_node, }) --- Pass1: Power balance calculation -local function on_power_pass1(pos, mem) - if State:is_active(mem) then - return -POWER_CAPACITY - end - return 0 -end - --- Pass2: Power balance adjustment -local function on_power_pass2(pos, mem, sum) - return 0 -end - --- Pass3: Power balance result -local function on_power_pass3(pos, mem, sum) - mem.power_result = sum -end - -local function distibuting(pos, mem) - if mem.power_result > 0 then - State:keep_running(pos, mem, COUNTDOWN_TICKS) - else - State:fault(pos, mem) - start_cylinder(pos, false, mem) - techage.power.power_distribution(pos) - end -end - local function node_timer(pos, elapsed) local mem = tubelib2.get_mem(pos) - local pos2 = techage.get_pos(pos, 'L') - if minetest.get_node(pos2).name == "techage:cylinder_on" and tubelib2.get_mem(pos2).running then - distibuting(pos, mem) + mem.triggered = mem.triggered or 0 + if mem.triggered > 0 and mem.generating then + mem.provided = provide_power(pos, PWR_CAPA) + mem.triggered = mem.triggered - 1 + State:keep_running(pos, mem, COUNTDOWN_TICKS) + mem.handle = minetest.sound_play("techage_steamengine", { + pos = pos, + gain = 0.5, + max_hear_distance = 10}) + elseif mem.generating then -- trigger missing + State:stop(pos, mem) + mem.generating = 0 + mem.provided = 0 + techage.transfer(pos, "L", "stop", nil, nil, { + "techage:cylinder_on"}) else - State:fault(pos, mem) - start_cylinder(pos, false, mem) - techage.power.power_distribution(pos) + mem.provided = 0 end return State:is_active(mem) end @@ -151,6 +118,9 @@ end local function on_rightclick(pos) local mem = tubelib2.get_mem(pos) M(pos):set_string("formspec", formspec(State, pos, mem)) + if mem.generating then + minetest.get_node_timer(pos):start(CYCLE_TIME) + end end minetest.register_node("techage:flywheel", { @@ -173,15 +143,10 @@ minetest.register_node("techage:flywheel", { on_rightclick(pos) end, - after_dig_node = function(pos, oldnode, oldmetadata, digger) - State:after_dig_node(pos, oldnode, oldmetadata, digger) - end, - on_receive_fields = on_receive_fields, on_rightclick = on_rightclick, on_timer = node_timer, - drop = "", paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, on_rotate = screwdriver.disallow, @@ -242,13 +207,24 @@ minetest.register_node("techage:flywheel_on", { }) techage.power.register_node({"techage:flywheel", "techage:flywheel_on"}, { - on_power_pass1 = on_power_pass1, - on_power_pass2 = on_power_pass2, - on_power_pass3 = on_power_pass3, conn_sides = {"R"}, power_network = Axle, }) +techage.register_node({"techage:flywheel", "techage:flywheel_on"}, { + on_transfer = function(pos, in_dir, topic, payload) + local mem = tubelib2.get_mem(pos) + if topic == "trigger" then + mem.triggered = 2 + if mem.generating then + return math.max((mem.provided or PWR_CAPA) / PWR_CAPA, 0.1) + else + return 0 + end + end + end +}) + minetest.register_craft({ output = "techage:flywheel", recipe = { @@ -258,17 +234,6 @@ minetest.register_craft({ }, }) -minetest.register_lbm({ - label = "[techage] Steam engine sound", - name = "techage:steam_engine", - nodenames = {"techage:flywheel_on"}, - run_at_every_load = true, - action = function(pos, node) - play_sound(pos) - minetest.get_node_timer(pos):start(CYCLE_TIME) - end -}) - techage.register_help_page(I("TA2 Flywheel"), I([[Part of the steam engine. Has to be placed side by side diff --git a/steam_engine/gearbox.lua b/steam_engine/gearbox.lua index 8a884e4..7c2d730 100644 --- a/steam_engine/gearbox.lua +++ b/steam_engine/gearbox.lua @@ -21,9 +21,11 @@ local M = minetest.get_meta local MP = minetest.get_modpath("techage") local I,_ = dofile(MP.."/intllib.lua") -local POWER_CONSUMPTION = 1 +local PWR_NEEDED = 1 +local CYCLE_TIME = 2 local Axle = techage.Axle +local consume_power = techage.power.consume_power local function swap_node(pos, name) local node = minetest.get_node(pos) @@ -34,18 +36,27 @@ local function swap_node(pos, name) minetest.swap_node(pos, node) end -local function on_power_pass1(pos, mem) - return POWER_CONSUMPTION -end - -local function on_power_pass2(pos, mem, sum) - if sum > 0 then - swap_node(pos, "techage:gearbox_on") - techage.switch_axles(pos, true) - else +local function node_timer(pos, elapsed) + local mem = tubelib2.get_mem(pos) + local got = consume_power(pos, PWR_NEEDED) + if mem.running and got < PWR_NEEDED then swap_node(pos, "techage:gearbox") techage.switch_axles(pos, false) + mem.running = false + elseif not mem.running and got == PWR_NEEDED then + swap_node(pos, "techage:gearbox_on") + techage.switch_axles(pos, true) + mem.running = true end + return true +end + +local function on_rightclick(pos, node, clicker) + minetest.get_node_timer(pos):start(CYCLE_TIME) +end + +local function after_place_node(pos, placer, itemstack, pointed_thing) + minetest.get_node_timer(pos):start(CYCLE_TIME) end minetest.register_node("techage:gearbox", { @@ -53,7 +64,9 @@ minetest.register_node("techage:gearbox", { tiles = {"techage_filling_ta2.png^techage_axle_gearbox.png^techage_frame_ta2.png"}, on_construct = tubelib2.init_mem, - + after_place_node = after_place_node, + on_rightclick = on_rightclick, + on_timer = node_timer, paramtype2 = "facedir", groups = {cracky=2, crumbly=2, choppy=2}, on_rotate = screwdriver.disallow, @@ -77,17 +90,19 @@ minetest.register_node("techage:gearbox_on", { }, }, + after_place_node = after_place_node, + on_rightclick = on_rightclick, + on_timer = node_timer, paramtype2 = "facedir", groups = {not_in_creative_inventory=1}, diggable = false, + drop = "", on_rotate = screwdriver.disallow, is_ground_content = false, sounds = default.node_sound_wood_defaults(), }) techage.power.register_node({"techage:gearbox", "techage:gearbox_on"}, { - on_power_pass1 = on_power_pass1, - on_power_pass2 = on_power_pass2, power_network = Axle, }) diff --git a/textures/techage_appl_switch_off.png b/textures/techage_appl_switch_off.png index 76bd2faeea92ec349e9c0cb8ee3319cbbfc1fa91..d08fda32c15797f8f9f076e1ef43d7cc356f0155 100644 GIT binary patch delta 502 zcmVpgJqp!8M|K3vJ!$|*CE9O%s z{^y91nVi0*J-$LH2L=MAhdomRF;D;i00DGTPE!Ct=GbNc00CD?L_t(Y$L-d;PQx%1 z2H*$=X17a52n!?B5H205gqV?+u9h+*6)9qWG%S7q7Q~3UWX&tEAmyQO&aqQFwu2N= z#K6Bea=#omzNAe)7MO>HlN;UMCf5|RqE60rd-^-zIDzbB2ZTsLR3_Oz_U-mT3ZIjw z7{L2e8Lfc#r(^&~IS7bO3>@JIVtj=k0m27mc@Nj6n@8x}E6c8eUaWbI?WH$_2KC&3 z2eYhAA3*2f2+)0p7%;KHN&EN`LB3vc1km|xfC_-TVyxmCs7y7G1{7r~F000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Re1`iE17%REnh><=ke*|7hL_t(|+U;7ukJLsK{$|FW zU2g9rejleu6xT($CISg5T?7)KRJnrxfQlN?*sd*94>-uLE_=5H6|xs7AUDvj04=(O*l z2+7-bf2-Ytb#CJr&VI9$-HK(76V_5808FEAibF0H0EZm_OZAYfH;H}|&EeIbTYt&X zH}Br>jeYIx@58ojFv|j^6pXQnJ)AjpGIIa(PghC2Zyk|4n^FsaSxFECusKJ)UXKD! z2&9yWI&+@^(-hD1KmbrmK^a4>R*Q~`lputpf9jMP07wZQ8}U)8*J==97#-;eI;8?2 zzQ%pegXekRoP$}GmQJYwpftMC@LCN#whSiely)2ReSf&V>oKQC@1>Lo!w~&`KUJr6 zGk`HRbjJ0($h*P43`5wq4a>6NdLD!ji8`eNfKm#O@sNTXY<-kc1ONgd5D1Z~Q_3Yk ze-a##075Ad2r;(*lQ}wHNGR+bO!I-`VHhg^3-c1P_wOBf;wXxdBYxe!;2a(%OyIUL^ zBap!A5dlhigr8|097U@==WjS z_86D8%bgFBs-JR?#f+22mv7k7-Q(Ut`gZ=0n}B=hkQSmok{>W=MX}GQaaYCb#S61 zgow&8*_#p@v4}h>FZe5*%SWV~G7tW@@^%)eCDOyW!6b*o#I%2uVaGavSpgIqp!8M|K3vJ!$|*CE9O%s z|LBLlr9HkvCWu&Z00DGTPE!Ct=GbNc008PqL_t(Y$79&y0s%){ zP=F7V_F!-}hJa#Y6kraeP3WV*fB_7cloSPjp+HDU0V2jcs(^|Lj+YmJ+2yF90xZa0 zUIRA)8d+A0A+!aC6;K6>tuPfBDS-gG0p7NXDrkEe&o2b_Fw`0IPz^si80snQXimuY%CYgcJm$DGr~F000JJOGiWi{{a60|De66lK=n!32;bRa{vGf z6951U69E94oEQKA00(qQO+^Re1`iE33hFk^LXkcze*{WNL_t(|+U;7skK9BQ|IK)8 zZ*K3D?>kNr6i0<}4N8HOHYbIMiYw?TQl(DIKae67qCkj(eyL6BE|-tYO5);FK1E4ycrSDIVb(d*np z8Dctif4egPyRv&0A6#0?Z^gQU^K7jY08V0TiWQd{fK>;8McpJjEt35et?92H4}Ma! z|2+HeXzuCmt5>jX8x~`rl)|#C)Dhmhcp-58`DZssc_@56Q+G#ZT{ z;DkUa6{}Nt1e~OB&OrcBNn4FHsa6Poc^X}B(gl);%!(Ww*w z;Wh4Y4$e6o$AQIICY?$HKxy!xaaua#1eQere3CF)cz z0xZj#Iy2-v@ZaQGNeSDw!5G7ka|j_~bt(q{r4%6ZDFqoHeUwu80DK|f3z4W($t6Hy ze;iQ&q*CyOm^=STfzFqb3iEN8PaKz0M(ztm2|4=ft~!6l3Eteim3bOe_jiTvK`D9s zgNKiC?Ta6>+xqn^-_xp!_OHG)iSjfBN<90(ymDV+-`HvXa`ga~l? zMS_qdrnbiB0hVQ9W4(#d$Pa{7f8v)KDgjwMy~t&2+9pUTMfY_tu#RTG)(}DpDPP@x z(ZycMCTL=7BmiZ9t(kTH@|ol@O>K4ILTs|?E143r!mz@jb0YT^4rRM@sj-6yde`FzCV0-hT zh6#TcvLs^PrDdzeCb%k61F-4)`&jAIs%$o*MW5>bUXXU z$_Ec0Ykj5d9x3#XDTd&Xas;c^mvGRaP@+2rYppXzhO8DqFY8E_~YSR@u5$Hgja^rT4keBVeR}n)PY%;7>@m<-LKhT4ZzCR1KOQ|(F>Ye9(tXADaM(0r%1ade7d_r7(G7GOYh7ML) dkBJEq0_-K8zOL+#*|-ITtS`hpoI9~J5CG1V87Ke% diff --git a/textures/techage_electric_switch.png b/textures/techage_electric_switch.png index 9b7b130f22313203d8799902067efe6e1acdb1d5..a5f84789fc223c4f7741c66bf53739c470e73a0b 100644 GIT binary patch delta 192 zcmZ3&@|1Ccgf|m20|Nt}$fR^2#ggvm>&U>cv7h@-A}f&3SRCZ;#IWw1%u67LC%`Af z)hDxX+WbWuwryXqeATj;LJp9kk|4ie28U-i(k9-O$O`pzaSV~ToSd*gC}L~f)m5RZ zLZeS{Rh9h|gSFo|HXJKY$Muy~sLeYh`GOdN88B!f*4a7ae qbwkdEcg(uFI_xd;&gQ6lObk2N%uW>l?9>KY$KdJe=d#Wzp$PyndqLv> delta 535 zcmaFLxP)bbL_G&H0|SH0lCEPwYFdC#h%1opnl!a%>Wp3>nl`h4`mFvLvnK%2%sCT* zXx7|Gv*%3)qB--Y%v~@Qh~_Pv21N50O$VX{i)R4Q!X-0-XwlMHiVe)Y!9Yc>JVmbII=uG<1c+tzOdqU{^D?bx(q z*Opzox9;9^`sfV>W&sF?r#&={7(;?4B-;Ar`0K1~!HrGT^Dd<8pUb-qtIxyB2NI zI@Hkh;lF+QWFv_>=I?Q{&GyF3QaPQMAj7;cdYze~%pu7qH(aaFFs++l?~&^E-9X@0 z$}D%Y_gh|C$#YCKa?x;ItACN(;ehc$FP&!>Lt|7wHz>9869x}I(6eiDHzqb6+hHD}a5Tbd{YtJ6^KI;>ZR{6wyF1(E#iFKiu~5^j4c=}i zi>|!-V)wrylYMRd<^#*+zkkq?$hZ@K|F2og-_#So=U>SGeRb2~!utn)Fkd>OH&>t` S+MWd%Pz;`~elF{r5}E+6UjY{Y diff --git a/textures/techage_industriallamp3.png b/textures/techage_industriallamp3.png index d2dd29774ac1f83069bc5c87b1147f879b4f3281..765d8ca4865aecd77255e7c5cb9a774d71a65b4d 100644 GIT binary patch delta 176 zcmZo;I>0zVqMnJFfq{WfWKueiVo7)Ob!1@J*w6hZkrl{iEDmyaVpw-h<|UBBS>O>_ z%)r1c48n{Iv*t(u1$hE|LR@_^3ol)~Xl-Tn{P{CQMf3k4oh3nj!3+-1ZlnP@2A(dC zArhC96A~UoZOvk2<~Sg^CipPZ0iJt5?`v{NoM10_TfqD=qOskvr)<@3fkO-o<_RjS UVzu|D0W~vty85}Sb4q9e0JHQqH2?qr delta 226 zcmV<803H9p0fqvQ7#j!%0001UdV2H#000JJOGiWi{{a60|De66laW3ce+P6)O+^Re z1`P=;DOG$XyZ`_IlSxEDR9M69maz?mFbqU5U#tLQ{Pba>Oq7YBcZMJm3}M=U5HepM zrMV}iu+FmF+&KZC1%MbMQc9OSwf6PiG`q7d&<{Pfbvx8G zcN!t&FO;%q7SS;T%_3ULJaTwv%{ted1GUeuYOD5h625f{7{$%6As3(xX+uH?e?-lr cxcN2Q0j-*-Uai=F2LJ#707*qoM6N<$f;6&QbpQYW diff --git a/textures/techage_industriallamp3_on.png b/textures/techage_industriallamp3_on.png index 6c3bf6435a731c53f2086074296eb0e86150a414..abbc27765ee2726951430697cf45732123c8bbd1 100644 GIT binary patch delta 175 zcmbQuw4ZT;L_HHT0|Nt}$fR^2#ggvm>&U>cv7h@-A}f&3SRCZ;#IWw1%u67Lv%n*= zn1O*?7=#%aX3dcR3i1T_gt+=-76O_74GsS@Fzk_#(g*1*3GxeOaCmkj4am{=ba4!k zxSX7jkig5!o4~+m(X5^Ql*yo3|NnChHnvZUG1hk+Y{DKS3M`)cO0UI$;i`w?%#Y6| R`2zJac)I$ztaD0e0syANFtY#v delta 247 zcmV?1PjRrJ8}DFjX3y zd@2!_&?ZI}EjU?^aQkMjwn|ygKU&^+EM@FY1xRK>Jqp;D^M*br9|C>}1f3t%=^4lk zr2Zz}Rnr*y>$^b&51$_}QChtqh!_Pw8{Y+T_vXp6`Ji!^@6gD#eyi xG7unyb>wzcJ-xljQGA=f<0l&rwyE`B-cA4j002ovPDHLkV1h;9WSsy2 diff --git a/tools/repairkit.lua b/tools/repairkit.lua index ab4e904..149a3a5 100644 --- a/tools/repairkit.lua +++ b/tools/repairkit.lua @@ -16,27 +16,27 @@ local S = function(pos) if pos then return minetest.pos_to_string(pos) end end local P = minetest.string_to_pos local M = minetest.get_meta -local function destroy_node(itemstack, placer, pointed_thing) - if pointed_thing.type == "node" then - local pos = pointed_thing.under - if not minetest.is_protected(pos, placer:get_player_name()) then - local mem = tubelib2.get_mem(pos) - mem.techage_aging = 999999 - end - end -end +--local function destroy_node(itemstack, placer, pointed_thing) +-- if pointed_thing.type == "node" then +-- local pos = pointed_thing.under +-- if not minetest.is_protected(pos, placer:get_player_name()) then +-- local mem = tubelib2.get_mem(pos) +-- mem.techage_aging = 999999 +-- end +-- end +--end -local function repair_node(itemstack, user, pointed_thing) - local pos = pointed_thing.under - if pos then - if techage.repair_node(pos) then - minetest.chat_send_player(user:get_player_name(), "[TechAge] Node repaired") - itemstack:add_wear(13108) - return itemstack - end - end - return -end +--local function repair_node(itemstack, user, pointed_thing) +-- local pos = pointed_thing.under +-- if pos then +-- if techage.repair_node(pos) then +-- minetest.chat_send_player(user:get_player_name(), "[TechAge] Node repaired") +-- itemstack:add_wear(13108) +-- return itemstack +-- end +-- end +-- return +--end local function read_state(itemstack, user, pointed_thing) local pos = pointed_thing.under @@ -45,10 +45,9 @@ local function read_state(itemstack, user, pointed_thing) if number then local state = techage.send_single(number, "state", nil) local counter = techage.send_single(number, "counter", nil) - local aging = techage.send_single(number, "aging", nil) - if state and counter and aging then + if state and counter then if type(counter) ~= "number" then counter = "unknown" end - minetest.chat_send_player(user:get_player_name(), "[TechAge] state ="..state..", counter = "..counter..", aging = "..aging) + minetest.chat_send_player(user:get_player_name(), "[TechAge] state ="..state..", counter = "..counter) end end end @@ -59,7 +58,7 @@ minetest.register_tool("techage:repairkit", { inventory_image = "techage_repairkit.png", wield_image = "techage_repairkit.png^[transformR270", groups = {cracky=1, book=1}, - on_use = repair_node, + on_use = read_state, node_placement_prediction = "", }) @@ -70,7 +69,7 @@ minetest.register_node("techage:end_wrench", { wield_image = "techage_end_wrench.png", groups = {cracky=1, book=1}, on_use = read_state, - on_place = destroy_node, + on_place = read_state, node_placement_prediction = "", }) diff --git a/tools/trowel.lua b/tools/trowel.lua index 35cfb2a..c7f48bb 100644 --- a/tools/trowel.lua +++ b/tools/trowel.lua @@ -38,11 +38,12 @@ local function hide_node(pos, node, meta, placer) local inv = placer:get_inventory() local stack = inv:get_stack("main", 1) local taken = stack:take_item(1) + local ndef = minetest.registered_nodes[taken:get_name()] -- test if it is a simple node without logic if taken:get_count() == 1 - and minetest.registered_nodes[taken:get_name()] - and not minetest.registered_nodes[taken:get_name()].after_place_node - and not minetest.registered_nodes[taken:get_name()].on_construct then + and not ndef.groups.soil + and not ndef.after_place_node + and not ndef.on_construct then meta:set_string("techage_hidden_nodename", node.name) meta:set_string("techage_hidden_param2", node.param2) local param2 = minetest.dir_to_facedir(placer:get_look_dir(), true)