From b2b29a1737c4bd86e397bb496d06aebd8129def7 Mon Sep 17 00:00:00 2001 From: thetaepsilon-gamedev Date: Thu, 19 Oct 2017 13:35:31 +0100 Subject: pressure logic: rewrite callbacks for horizontal rotation flowables to support singular and double-ended devices --- devices.lua | 12 +++--- pressure_logic/flowable_node_registry_install.lua | 51 +++++++++++++---------- 2 files changed, 34 insertions(+), 29 deletions(-) diff --git a/devices.lua b/devices.lua index 093137e..cb1a6d1 100644 --- a/devices.lua +++ b/devices.lua @@ -215,7 +215,7 @@ for s in ipairs(states) do -- only register flow logic for the "on" ABM. -- this means that the off state automatically blocks flow by not participating in the balancing operation. if states[s] ~= "off" then - new_flow_logic_register.directional_horizonal_rotate(nodename_valve_empty) + new_flow_logic_register.directional_horizonal_rotate(nodename_valve_empty, true) end end @@ -263,7 +263,7 @@ minetest.register_node(nodename_valve_loaded, { -- right-clicking a "loaded" valve (becoming an off valve) then turning it on again will yield a on-but-empty valve, -- but the flow logic will still function. -- thus under new_flow_logic this serves as a kind of migration. -new_flow_logic_register.directional_horizonal_rotate(nodename_valve_loaded) +new_flow_logic_register.directional_horizonal_rotate(nodename_valve_loaded, true) -- grating @@ -438,8 +438,8 @@ minetest.register_node(nodename_panel_loaded, { on_rotate = pipeworks.fix_after_rotation }) -- TODO: AFAIK the two panels have no visual difference, so are redundant under new flow logic - alias? -new_flow_logic_register.directional_horizonal_rotate(nodename_panel_empty) -new_flow_logic_register.directional_horizonal_rotate(nodename_panel_loaded) +new_flow_logic_register.directional_horizonal_rotate(nodename_panel_empty, true) +new_flow_logic_register.directional_horizonal_rotate(nodename_panel_loaded, true) @@ -521,8 +521,8 @@ minetest.register_node(nodename_sensor_loaded, { mesecons = pipereceptor_on, on_rotate = pipeworks.fix_after_rotation }) -new_flow_logic_register.directional_horizonal_rotate(nodename_sensor_empty) -new_flow_logic_register.directional_horizonal_rotate(nodename_sensor_loaded) +new_flow_logic_register.directional_horizonal_rotate(nodename_sensor_empty, true) +new_flow_logic_register.directional_horizonal_rotate(nodename_sensor_loaded, true) -- activate flow sensor at roughly half the pressure pumps drive pipes local sensor_pressure_set = { { nodename_sensor_empty, 0.0 }, { nodename_sensor_loaded, 1.0 } } new_flow_logic_register.transition_simple_set(sensor_pressure_set, { mesecons=pipeworks.mesecons_rules }) diff --git a/pressure_logic/flowable_node_registry_install.lua b/pressure_logic/flowable_node_registry_install.lua index 7b14fd3..9bb9e9a 100644 --- a/pressure_logic/flowable_node_registry_install.lua +++ b/pressure_logic/flowable_node_registry_install.lua @@ -69,34 +69,39 @@ end -- register a node as a directional flowable whose accepting sides depends upon param2 rotation. -- used for entry panels, valves, flow sensors and spigots, -- whose facing axis is always upwards and can only rotate horizontally. -local iseastwest = function(node) - local data = node.param2 - local rotation = data % 4 - -- rotation 0 and 2 is the same axis, as is 1 and 3. - -- 0-3 starts at north and proceeds clockwise. - local axis = rotation % 2 - --pipeworks.logger("iseastwest() rotation="..tostring(rotation).." axis="..tostring(axis)) - return (axis == 1) -end -register.directional_horizonal_rotate = function(nodename) - local north = {x= 0,y= 0,z= 1} - local south = {x= 0,y= 0,z=-1} - local east = {x= 1,y= 0,z= 0} - local west = {x=-1,y= 0,z= 0} - local neighbourfn = function(node) - if iseastwest(node) then - return { east, west } +register.directional_horizonal_rotate = function(nodename, doubleended) + local rotations = { + {x= 0,y= 0,z= 1}, + {x= 1,y= 0,z= 0}, + {x= 0,y= 0,z=-1}, + {x=-1,y= 0,z= 0}, + } + local getends = function(node) + --local dname = "horizontal rotate getends() " + local param2 = node.param2 + -- the sole end of the spigot points in the direction the rotation bits suggest + -- also note to self: lua arrays start at one... + local mainend = (param2 % 4) + 1 + -- use modulus wrap-around to find other end for straight-run devices like the valve + local otherend = ((param2 + 2) % 4) + 1 + local mainrot = rotations[mainend] + --pipeworks.logger(dname.."mainrot: "..dump(mainrot)) + local result + if doubleended then + result = { mainrot, rotations[otherend] } else - return { north, south } + result = { mainrot } end + --pipeworks.logger(dname.."result: "..dump(result)) + return result + end + local neighbourfn = function(node) + return getends(node) end local directionfn = function(node, direction) local result = false - if iseastwest(node) then - --pipeworks.logger("horizontal rotate directionfn() eastwest=true") - result = vector.equals(direction, east) or vector.equals(direction, west) - else - result = vector.equals(direction, north) or vector.equals(direction, south) + for index, endvec in ipairs(getends(node)) do + if vector.equals(direction, endvec) then result = true end end return result end -- cgit v1.2.3