summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mesecons/init.lua10
-rw-r--r--mesecons/internal.lua43
-rw-r--r--mesecons_microcontroller/init.lua10
3 files changed, 33 insertions, 30 deletions
diff --git a/mesecons/init.lua b/mesecons/init.lua
index 900d4bb..6378946 100644
--- a/mesecons/init.lua
+++ b/mesecons/init.lua
@@ -80,8 +80,9 @@ function mesecon:receptor_on(pos, rules)
for _, rule in ipairs(rules) do
local np = mesecon:addPosRule(pos, rule)
- if mesecon:rules_link(pos, np, rules) then
- mesecon:turnon(np, pos)
+ local link, rulename = mesecon:rules_link(pos, np, rules)
+ if link then
+ mesecon:turnon(np, rulename)
end
end
end
@@ -91,8 +92,9 @@ function mesecon:receptor_off(pos, rules)
for _, rule in ipairs(rules) do
local np = mesecon:addPosRule(pos, rule)
- if mesecon:rules_link(pos, np, rules) and not mesecon:connected_to_receptor(np) then
- mesecon:turnoff(np, pos)
+ local link, rulename = mesecon:rules_link(pos, np, rules)
+ if link then
+ mesecon:turnoff(np, rulename)
end
end
end
diff --git a/mesecons/internal.lua b/mesecons/internal.lua
index e9cde2d..96e407e 100644
--- a/mesecons/internal.lua
+++ b/mesecons/internal.lua
@@ -41,8 +41,8 @@
-- HIGH-LEVEL Internals
-- mesecon:is_power_on(pos) --> Returns true if pos emits power in any way
-- mesecon:is_power_off(pos) --> Returns true if pos does not emit power in any way
--- mesecon:turnon(pos) --> Returns true whatever there is at pos. Calls itself for connected nodes (if pos is a conductor) --> recursive
--- mesecon:turnoff(pos) --> Turns off whatever there is at pos. Calls itself for connected nodes (if pos is a conductor) --> recursive
+-- mesecon:turnon(pos, rulename) --> Returns true whatever there is at pos. Calls itself for connected nodes (if pos is a conductor) --> recursive, the rulename is the name of the input rule that caused calling turnon
+-- mesecon:turnoff(pos, rulename) --> Turns off whatever there is at pos. Calls itself for connected nodes (if pos is a conductor) --> recursive, the rulename is the name of the input rule that caused calling turnoff
-- mesecon:connected_to_receptor(pos) --> Returns true if pos is connected to a receptor directly or via conductors; calls itself if pos is a conductor --> recursive
-- mesecon:rules_link(output, input, dug_outputrules) --> Returns true if outputposition + outputrules = inputposition and inputposition + inputrules = outputposition (if the two positions connect)
-- mesecon:rules_link_anydir(outp., inp., d_outpr.) --> Same as rules mesecon:rules_link but also returns true if output and input are swapped
@@ -178,24 +178,24 @@ end
--Signals
-function mesecon:activate(pos, node)
+function mesecon:activate(pos, node, rulename)
local effector = mesecon:get_effector(node.name)
if effector and effector.action_on then
- effector.action_on (pos, node)
+ effector.action_on (pos, node, rulename)
end
end
-function mesecon:deactivate(pos, node)
+function mesecon:deactivate(pos, node, rulename)
local effector = mesecon:get_effector(node.name)
if effector and effector.action_off then
- effector.action_off (pos, node)
+ effector.action_off (pos, node, rulename)
end
end
-function mesecon:changesignal(pos, node)
+function mesecon:changesignal(pos, node, rulename)
local effector = mesecon:get_effector(node.name)
if effector and effector.action_change then
- effector.action_change (pos, node)
+ effector.action_change (pos, node, rulename)
end
end
@@ -282,7 +282,7 @@ function mesecon:is_power_off(pos)
return false
end
-function mesecon:turnon(pos)
+function mesecon:turnon(pos, rulename)
local node = minetest.env:get_node(pos)
if mesecon:is_conductor_off(node.name) then
@@ -291,20 +291,21 @@ function mesecon:turnon(pos)
for _, rule in ipairs(rules) do
local np = mesecon:addPosRule(pos, rule)
+ local link, rulename = mesecon:rules_link(pos, np)
- if mesecon:rules_link(pos, np) then
- mesecon:turnon(np)
+ if link then
+ mesecon:turnon(np, rulename)
end
end
elseif mesecon:is_effector(node.name) then
- mesecon:changesignal(pos, node)
+ mesecon:changesignal(pos, node, rulename)
if mesecon:is_effector_off(node.name) then
- mesecon:activate(pos, node)
+ mesecon:activate(pos, node, rulename)
end
end
end
-function mesecon:turnoff(pos)
+function mesecon:turnoff(pos, rulename)
local node = minetest.env:get_node(pos)
if mesecon:is_conductor_on(node.name) then
@@ -313,16 +314,17 @@ function mesecon:turnoff(pos)
for _, rule in ipairs(rules) do
local np = mesecon:addPosRule(pos, rule)
+ local link, rulename = mesecon:rules_link(pos, np)
- if mesecon:rules_link(pos, np) then
- mesecon:turnoff(np)
+ if link then
+ mesecon:turnoff(np, rulename)
end
end
elseif mesecon:is_effector(node.name) then
- mesecon:changesignal(pos, node)
+ mesecon:changesignal(pos, node, rulename)
if mesecon:is_effector_on(node.name)
and not mesecon:is_powered(pos) then
- mesecon:deactivate(pos, node)
+ mesecon:deactivate(pos, node, rulename)
end
end
end
@@ -363,12 +365,11 @@ function mesecon:connected_to_receptor(pos, checked)
return false, checked
end
-function mesecon:rules_link(output, input, dug_outputrules) --output/input are positions (outputrules optional, used if node has been dug)
+function mesecon:rules_link(output, input, dug_outputrules) --output/input are positions (outputrules optional, used if node has been dug), second return value: the name of the affected input rule
local outputnode = minetest.env:get_node(output)
local inputnode = minetest.env:get_node(input)
local outputrules = dug_outputrules or mesecon:get_any_outputrules (outputnode)
local inputrules = mesecon:get_any_inputrules (inputnode)
-
if not outputrules or not inputrules then
return
end
@@ -379,7 +380,7 @@ function mesecon:rules_link(output, input, dug_outputrules) --output/input are p
for _, inputrule in ipairs(inputrules) do
-- Check if input accepts from output
if mesecon:cmpPos(mesecon:addPosRule(input, inputrule), output) then
- return true
+ return true, inputrule.name
end
end
end
diff --git a/mesecons_microcontroller/init.lua b/mesecons_microcontroller/init.lua
index 3117880..6120ade 100644
--- a/mesecons_microcontroller/init.lua
+++ b/mesecons_microcontroller/init.lua
@@ -30,16 +30,16 @@ if (c == 1) then table.insert(rules, {x = 1, y = 0, z = 0}) end
if (d == 1) then table.insert(rules, {x = 0, y = 0, z = -1}) end
local input_rules={}
-if (a == 0) then table.insert(input_rules, {x = -1, y = 0, z = 0}) end
-if (b == 0) then table.insert(input_rules, {x = 0, y = 0, z = 1}) end
-if (c == 0) then table.insert(input_rules, {x = 1, y = 0, z = 0}) end
-if (d == 0) then table.insert(input_rules, {x = 0, y = 0, z = -1}) end
+if (a == 0) then table.insert(input_rules, {x = -1, y = 0, z = 0, name = "A"}) end
+if (b == 0) then table.insert(input_rules, {x = 0, y = 0, z = 1, name = "B"}) end
+if (c == 0) then table.insert(input_rules, {x = 1, y = 0, z = 0, name = "C"}) end
+if (d == 0) then table.insert(input_rules, {x = 0, y = 0, z = -1, name = "D"}) end
mesecon:add_rules(nodename, rules)
local mesecons = {effector =
{
rules = input_rules,
- action_change = function (pos, node)
+ action_change = function (pos, node, rulename)
update_yc(pos)
end
}}