Skip to content

Commit 913e355

Browse files
committedAug 28, 2013
Merge pull request #112 from khonkhortisan/multi_rules
Multi rules Merged for near-future textures to be merged cleanly.
2 parents 96011bc + 885899c commit 913e355

File tree

9 files changed

+408
-96
lines changed

9 files changed

+408
-96
lines changed
 

‎mesecons/init.lua

+3-3
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ dofile(minetest.get_modpath("mesecons").."/legacy.lua");
104104
function mesecon:receptor_on_i(pos, rules)
105105
rules = rules or mesecon.rules.default
106106

107-
for _, rule in ipairs(rules) do
107+
for _, rule in ipairs(mesecon:flattenrules(rules)) do
108108
local np = mesecon:addPosRule(pos, rule)
109109
local link, rulename = mesecon:rules_link(pos, np, rules)
110110
if link then
@@ -125,11 +125,11 @@ end
125125
function mesecon:receptor_off_i(pos, rules)
126126
rules = rules or mesecon.rules.default
127127

128-
for _, rule in ipairs(rules) do
128+
for _, rule in ipairs(mesecon:flattenrules(rules)) do
129129
local np = mesecon:addPosRule(pos, rule)
130130
local link, rulename = mesecon:rules_link(pos, np, rules)
131131
if link then
132-
if not mesecon:connected_to_receptor(np) then
132+
if not mesecon:connected_to_receptor(np, mesecon:invertRule(rule)) then
133133
mesecon:turnoff(np, rulename)
134134
else
135135
mesecon:changesignal(np, minetest.env:get_node(np), rulename, mesecon.state.off)

‎mesecons/internal.lua

+99-33
Original file line numberDiff line numberDiff line change
@@ -303,18 +303,38 @@ end
303303

304304
-- Conductors
305305

306-
function mesecon:is_conductor_on(nodename)
306+
function mesecon:is_conductor_on(nodename, rulename)
307307
local conductor = mesecon:get_conductor(nodename)
308-
if conductor and conductor.state == mesecon.state.on then
309-
return true
308+
if conductor then
309+
if conductor.state then
310+
return conductor.state == mesecon.state.on
311+
end
312+
if conductor.states then
313+
if not rulename then
314+
return mesecon:getstate(nodename, conductor.states) ~= 1
315+
end
316+
local bit = mesecon:rule2bit(rulename, mesecon:conductor_get_rules(minetest.registered_nodes[nodename]))
317+
local binstate = mesecon:getbinstate(nodename, conductor.states)
318+
return mesecon:get_bit(binstate, bit)
319+
end
310320
end
311321
return false
312322
end
313323

314-
function mesecon:is_conductor_off(nodename)
324+
function mesecon:is_conductor_off(nodename, rulename)
315325
local conductor = mesecon:get_conductor(nodename)
316-
if conductor and conductor.state == mesecon.state.off then
317-
return true
326+
if conductor then
327+
if conductor.state then
328+
return conductor.state == mesecon.state.off
329+
end
330+
if conductor.states then
331+
if not rulename then
332+
return mesecon:getstate(nodename, conductor.states) == 1
333+
end
334+
local bit = mesecon:rule2bit(rulename, mesecon:conductor_get_rules(minetest.registered_nodes[nodename]))
335+
local binstate = mesecon:getbinstate(nodename, conductor.states)
336+
return not mesecon:get_bit(binstate, bit)
337+
end
318338
end
319339
return false
320340
end
@@ -327,20 +347,36 @@ function mesecon:is_conductor(nodename)
327347
return false
328348
end
329349

330-
function mesecon:get_conductor_on(offstate)
350+
function mesecon:get_conductor_on(offstate, rulename)
331351
local conductor = mesecon:get_conductor(offstate)
332352
if conductor then
333-
return conductor.onstate
353+
if conductor.onstate then
354+
return conductor.onstate
355+
end
356+
if conductor.states then
357+
local bit = mesecon:rule2bit(rulename, mesecon:conductor_get_rules(minetest.registered_nodes[offstate]))
358+
local binstate = mesecon:getbinstate(offstate, conductor.states)
359+
binstate = mesecon:set_bit(binstate, bit, "1")
360+
return conductor.states[tonumber(binstate,2)+1]
361+
end
334362
end
335-
return false
363+
return offstate
336364
end
337365

338-
function mesecon:get_conductor_off(onstate)
366+
function mesecon:get_conductor_off(onstate, rulename)
339367
local conductor = mesecon:get_conductor(onstate)
340368
if conductor then
341-
return conductor.offstate
369+
if conductor.offstate then
370+
return conductor.offstate
371+
end
372+
if conductor.states then
373+
local bit = mesecon:rule2bit(rulename, mesecon:conductor_get_rules(minetest.registered_nodes[onstate]))
374+
local binstate = mesecon:getbinstate(onstate, conductor.states)
375+
binstate = mesecon:set_bit(binstate, bit, "0")
376+
return conductor.states[tonumber(binstate,2)+1]
377+
end
342378
end
343-
return false
379+
return onstate
344380
end
345381

346382
function mesecon:conductor_get_rules(node)
@@ -358,17 +394,17 @@ end
358394

359395
-- some more general high-level stuff
360396

361-
function mesecon:is_power_on(pos)
397+
function mesecon:is_power_on(pos, rulename)
362398
local node = minetest.env:get_node(pos)
363-
if mesecon:is_conductor_on(node.name) or mesecon:is_receptor_on(node.name) then
399+
if mesecon:is_conductor_on(node.name, rulename) or mesecon:is_receptor_on(node.name) then
364400
return true
365401
end
366402
return false
367403
end
368404

369-
function mesecon:is_power_off(pos)
405+
function mesecon:is_power_off(pos, rulename)
370406
local node = minetest.env:get_node(pos)
371-
if mesecon:is_conductor_off(node.name) or mesecon:is_receptor_off(node.name) then
407+
if mesecon:is_conductor_off(node.name, rulename) or mesecon:is_receptor_off(node.name) then
372408
return true
373409
end
374410
return false
@@ -377,11 +413,21 @@ end
377413
function mesecon:turnon(pos, rulename)
378414
local node = minetest.env:get_node(pos)
379415

380-
if mesecon:is_conductor_off(node.name) then
416+
if mesecon:is_conductor_off(node.name, rulename) then
381417
local rules = mesecon:conductor_get_rules(node)
382-
minetest.env:add_node(pos, {name = mesecon:get_conductor_on(node.name), param2 = node.param2})
383418

384-
for _, rule in ipairs(rules) do
419+
if not rulename then
420+
for _, rule in ipairs(mesecon:flattenrules(rules)) do
421+
if mesecon:connected_to_receptor(pos, rule) then
422+
mesecon:turnon(pos, rule)
423+
end
424+
end
425+
return
426+
end
427+
428+
minetest.env:add_node(pos, {name = mesecon:get_conductor_on(node.name, rulename), param2 = node.param2})
429+
430+
for _, rule in ipairs(mesecon:rule2meta(rulename, rules)) do
385431
local np = mesecon:addPosRule(pos, rule)
386432
local link, rulename = mesecon:rules_link(pos, np)
387433

@@ -400,11 +446,21 @@ end
400446
function mesecon:turnoff(pos, rulename)
401447
local node = minetest.env:get_node(pos)
402448

403-
if mesecon:is_conductor_on(node.name) then
449+
if mesecon:is_conductor_on(node.name, rulename) then
404450
local rules = mesecon:conductor_get_rules(node)
405-
minetest.env:add_node(pos, {name = mesecon:get_conductor_off(node.name), param2 = node.param2})
451+
--[[
452+
if not rulename then
453+
for _, rule in ipairs(mesecon:flattenrules(rules)) do
454+
if mesecon:is_powered(pos, rule) then
455+
mesecon:turnoff(pos, rule)
456+
end
457+
end
458+
return
459+
end
460+
--]]
461+
minetest.env:add_node(pos, {name = mesecon:get_conductor_off(node.name, rulename), param2 = node.param2})
406462

407-
for _, rule in ipairs(rules) do
463+
for _, rule in ipairs(mesecon:rule2meta(rulename, rules)) do
408464
local np = mesecon:addPosRule(pos, rule)
409465
local link, rulename = mesecon:rules_link(pos, np)
410466

@@ -422,17 +478,17 @@ function mesecon:turnoff(pos, rulename)
422478
end
423479

424480

425-
function mesecon:connected_to_receptor(pos)
481+
function mesecon:connected_to_receptor(pos, rulename)
426482
local node = minetest.env:get_node(pos)
427483

428484
-- Check if conductors around are connected
429485
local rules = mesecon:get_any_inputrules(node)
430486
if not rules then return false end
431487

432-
for _, rule in ipairs(rules) do
488+
for _, rule in ipairs(mesecon:rule2meta(rulename, rules)) do
433489
local np = mesecon:addPosRule(pos, rule)
434490
if mesecon:rules_link(np, pos) then
435-
if mesecon:find_receptor_on(np, {}) then
491+
if mesecon:find_receptor_on(np, {}, mesecon:invertRule(rule)) then
436492
return true
437493
end
438494
end
@@ -441,7 +497,7 @@ function mesecon:connected_to_receptor(pos)
441497
return false
442498
end
443499

444-
function mesecon:find_receptor_on(pos, checked)
500+
function mesecon:find_receptor_on(pos, checked, rulename)
445501
-- find out if node has already been checked (to prevent from endless loop)
446502
for _, cp in ipairs(checked) do
447503
if mesecon:cmpPos(cp, pos) then
@@ -459,10 +515,10 @@ function mesecon:find_receptor_on(pos, checked)
459515

460516
if mesecon:is_conductor(node.name) then
461517
local rules = mesecon:conductor_get_rules(node)
462-
for _, rule in ipairs(rules) do
518+
for _, rule in ipairs(mesecon:rule2meta(rulename, rules)) do
463519
local np = mesecon:addPosRule(pos, rule)
464520
if mesecon:rules_link(np, pos) then
465-
if mesecon:find_receptor_on(np, checked) then
521+
if mesecon:find_receptor_on(np, checked, mesecon:invertRule(rule)) then
466522
return true
467523
end
468524
end
@@ -481,10 +537,10 @@ function mesecon:rules_link(output, input, dug_outputrules) --output/input are p
481537
return
482538
end
483539

484-
for _, outputrule in ipairs(outputrules) do
540+
for _, outputrule in ipairs(mesecon:flattenrules(outputrules)) do
485541
-- Check if output sends to input
486542
if mesecon:cmpPos(mesecon:addPosRule(output, outputrule), input) then
487-
for _, inputrule in ipairs(inputrules) do
543+
for _, inputrule in ipairs(mesecon:flattenrules(inputrules)) do
488544
-- Check if input accepts from output
489545
if mesecon:cmpPos(mesecon:addPosRule(input, inputrule), output) then
490546
return true, inputrule
@@ -499,16 +555,26 @@ function mesecon:rules_link_anydir(pos1, pos2)
499555
return mesecon:rules_link(pos1, pos2) or mesecon:rules_link(pos2, pos1)
500556
end
501557

502-
function mesecon:is_powered(pos)
558+
function mesecon:is_powered(pos, rule)
503559
local node = minetest.env:get_node(pos)
504560
local rules = mesecon:get_any_inputrules(node)
505561
if not rules then return false end
506562

507-
for _, rule in ipairs(rules) do
563+
if not rule then
564+
for _, rule in ipairs(mesecon:flattenrules(rules)) do
565+
local np = mesecon:addPosRule(pos, rule)
566+
local nn = minetest.env:get_node(np)
567+
568+
if (mesecon:is_conductor_on (nn.name, mesecon:invertRule(rule)) or mesecon:is_receptor_on (nn.name))
569+
and mesecon:rules_link(np, pos) then
570+
return true
571+
end
572+
end
573+
else
508574
local np = mesecon:addPosRule(pos, rule)
509575
local nn = minetest.env:get_node(np)
510576

511-
if (mesecon:is_conductor_on (nn.name) or mesecon:is_receptor_on (nn.name))
577+
if (mesecon:is_conductor_on (nn.name, mesecon:invertRule(rule)) or mesecon:is_receptor_on (nn.name))
512578
and mesecon:rules_link(np, pos) then
513579
return true
514580
end

‎mesecons/services.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ mesecon.on_placenode = function (pos, node)
44
elseif mesecon:is_powered(pos) then
55
if mesecon:is_conductor(node.name) then
66
mesecon:turnon (pos)
7-
mesecon:receptor_on (pos, mesecon:conductor_get_rules(node))
7+
--mesecon:receptor_on (pos, mesecon:conductor_get_rules(node))
Has a conversation. Original line has a conversation.
88
else
99
mesecon:changesignal(pos, node, mesecon:effector_get_rules(node), "on")
1010
mesecon:activate(pos, node)

0 commit comments

Comments
 (0)
Please sign in to comment.