mirror of
https://github.com/minetest-mods/mesecons.git
synced 2025-11-22 21:05:40 +01:00
mesecons: Unify duplicated code
The new comments should help understanding what is going on to ease maintenance in the long-run. Co-authored-by: Jude Melton-Houghton <jwmhjwmh@gmail.com>
This commit is contained in:
@@ -90,6 +90,16 @@ function mesecon.get_any_rules(node)
|
|||||||
mesecon.get_any_outputrules(node))
|
mesecon.get_any_outputrules(node))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function get_rules_from_ndef(ndef, node)
|
||||||
|
local rules = ndef and ndef.rules
|
||||||
|
if type(rules) == 'function' then
|
||||||
|
return rules(node)
|
||||||
|
elseif rules then
|
||||||
|
return rules
|
||||||
|
end
|
||||||
|
return mesecon.rules.default
|
||||||
|
end
|
||||||
|
|
||||||
-- Receptors
|
-- Receptors
|
||||||
-- Nodes that can power mesecons
|
-- Nodes that can power mesecons
|
||||||
function mesecon.is_receptor_on(nodename)
|
function mesecon.is_receptor_on(nodename)
|
||||||
@@ -117,17 +127,7 @@ function mesecon.is_receptor(nodename)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function mesecon.receptor_get_rules(node)
|
function mesecon.receptor_get_rules(node)
|
||||||
local receptor = mesecon.get_receptor(node.name)
|
return get_rules_from_ndef(mesecon.get_receptor(node.name), node)
|
||||||
if receptor then
|
|
||||||
local rules = receptor.rules
|
|
||||||
if type(rules) == 'function' then
|
|
||||||
return rules(node)
|
|
||||||
elseif rules then
|
|
||||||
return rules
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return mesecon.rules.default
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Effectors
|
-- Effectors
|
||||||
@@ -157,16 +157,7 @@ function mesecon.is_effector(nodename)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function mesecon.effector_get_rules(node)
|
function mesecon.effector_get_rules(node)
|
||||||
local effector = mesecon.get_effector(node.name)
|
return get_rules_from_ndef(mesecon.get_effector(node.name), node)
|
||||||
if effector then
|
|
||||||
local rules = effector.rules
|
|
||||||
if type(rules) == 'function' then
|
|
||||||
return rules(node)
|
|
||||||
elseif rules then
|
|
||||||
return rules
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return mesecon.rules.default
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- #######################
|
-- #######################
|
||||||
@@ -330,16 +321,7 @@ function mesecon.get_conductor_off(node_on, rulename)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function mesecon.conductor_get_rules(node)
|
function mesecon.conductor_get_rules(node)
|
||||||
local conductor = mesecon.get_conductor(node.name)
|
return get_rules_from_ndef(mesecon.get_conductor(node.name), node)
|
||||||
if conductor then
|
|
||||||
local rules = conductor.rules
|
|
||||||
if type(rules) == 'function' then
|
|
||||||
return rules(node)
|
|
||||||
elseif rules then
|
|
||||||
return rules
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return mesecon.rules.default
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- some more general high-level stuff
|
-- some more general high-level stuff
|
||||||
@@ -545,46 +527,42 @@ function mesecon.turnoff(pos, link)
|
|||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- @param getter_function Function that returns nested rules (vectors)
|
||||||
|
-- @return The matching rule or `nil`
|
||||||
|
local function find_rule_in_rules(pos, rule, getter_function)
|
||||||
|
local r_pos = vector.add(pos, rule)
|
||||||
|
local r_node = mesecon.get_node_force(r_pos)
|
||||||
|
local r_rules = getter_function(r_node)
|
||||||
|
if not r_rules then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local dir = vector.subtract(pos, r_pos)
|
||||||
|
for _, r_rule in ipairs(mesecon.flattenrules(r_rules)) do
|
||||||
|
if vector.equals(dir, r_rule) then
|
||||||
|
-- Other matches are duplicates
|
||||||
|
return r_rule
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- Get all linking inputrules of inputnode (effector or conductor) that is connected to
|
-- Get all linking inputrules of inputnode (effector or conductor) that is connected to
|
||||||
-- outputnode (receptor or conductor) at position `output` and has an output in direction `rule`
|
-- outputnode (receptor or conductor) at position `output` and has an output in direction `rule`
|
||||||
function mesecon.rules_link_rule_all(output, rule)
|
function mesecon.rules_link_rule_all(output, rule)
|
||||||
local input = vector.add(output, rule)
|
local match = find_rule_in_rules(output, rule, mesecon.get_any_inputrules)
|
||||||
local inputnode = mesecon.get_node_force(input)
|
return { match }
|
||||||
local inputrules = mesecon.get_any_inputrules(inputnode)
|
|
||||||
if not inputrules then
|
|
||||||
return {}
|
|
||||||
end
|
|
||||||
local rules = {}
|
|
||||||
|
|
||||||
for _, inputrule in ipairs(mesecon.flattenrules(inputrules)) do
|
|
||||||
-- Check if input accepts from output
|
|
||||||
if vector.equals(vector.add(input, inputrule), output) then
|
|
||||||
table.insert(rules, inputrule)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return rules
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Get all linking outputnodes of outputnode (receptor or conductor) that is connected to
|
-- Get all linking outputnodes of outputnode (receptor or conductor) that is connected to
|
||||||
-- inputnode (effector or conductor) at position `input` and has an input in direction `rule`
|
-- inputnode (effector or conductor) at position `input` and has an input in direction `rule`
|
||||||
function mesecon.rules_link_rule_all_inverted(input, rule)
|
function mesecon.rules_link_rule_all_inverted(input, rule)
|
||||||
local output = vector.add(input, rule)
|
local match = find_rule_in_rules(input, rule, mesecon.get_any_outputrules)
|
||||||
local outputnode = mesecon.get_node_force(output)
|
return { match and mesecon.invertRule(match) }
|
||||||
local outputrules = mesecon.get_any_outputrules(outputnode)
|
|
||||||
if not outputrules then
|
|
||||||
return {}
|
|
||||||
end
|
|
||||||
local rules = {}
|
|
||||||
|
|
||||||
for _, outputrule in ipairs(mesecon.flattenrules(outputrules)) do
|
|
||||||
if vector.equals(vector.add(output, outputrule), input) then
|
|
||||||
table.insert(rules, mesecon.invertRule(outputrule))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
return rules
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- @param pos Node position (a vector) to check
|
||||||
|
-- @param rule Optional. Specific rule (i.e. node side) to check.
|
||||||
|
-- @return Returns a list of vectors that power `pos`, or `false` if unpowered.
|
||||||
function mesecon.is_powered(pos, rule)
|
function mesecon.is_powered(pos, rule)
|
||||||
local node = mesecon.get_node_force(pos)
|
local node = mesecon.get_node_force(pos)
|
||||||
local rules = mesecon.get_any_inputrules(node)
|
local rules = mesecon.get_any_inputrules(node)
|
||||||
@@ -593,8 +571,8 @@ function mesecon.is_powered(pos, rule)
|
|||||||
-- List of nodes that send out power to pos
|
-- List of nodes that send out power to pos
|
||||||
local sourcepos = {}
|
local sourcepos = {}
|
||||||
|
|
||||||
if not rule then
|
local rules_flat = rule and { rule } or mesecon.flattenrules(rules)
|
||||||
for _, rule in ipairs(mesecon.flattenrules(rules)) do
|
for _, rule in ipairs(rules_flat) do
|
||||||
local rulenames = mesecon.rules_link_rule_all_inverted(pos, rule)
|
local rulenames = mesecon.rules_link_rule_all_inverted(pos, rule)
|
||||||
for _, rname in ipairs(rulenames) do
|
for _, rname in ipairs(rulenames) do
|
||||||
local np = vector.add(pos, rname)
|
local np = vector.add(pos, rname)
|
||||||
@@ -606,17 +584,6 @@ function mesecon.is_powered(pos, rule)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
|
||||||
local rulenames = mesecon.rules_link_rule_all_inverted(pos, rule)
|
|
||||||
for _, rname in ipairs(rulenames) do
|
|
||||||
local np = vector.add(pos, rname)
|
|
||||||
local nn = mesecon.get_node_force(np)
|
|
||||||
if (mesecon.is_conductor_on (nn, mesecon.invertRule(rname))
|
|
||||||
or mesecon.is_receptor_on (nn.name)) then
|
|
||||||
table.insert(sourcepos, np)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Return FALSE if not powered, return list of sources if is powered
|
-- Return FALSE if not powered, return list of sources if is powered
|
||||||
if (#sourcepos == 0) then return false
|
if (#sourcepos == 0) then return false
|
||||||
|
|||||||
Reference in New Issue
Block a user