diff options
Diffstat (limited to 'mesecons_gates')
| -rw-r--r-- | mesecons_gates/init.lua | 97 | 
1 files changed, 70 insertions, 27 deletions
diff --git a/mesecons_gates/init.lua b/mesecons_gates/init.lua index 92f0d9a..b7eae45 100644 --- a/mesecons_gates/init.lua +++ b/mesecons_gates/init.lua @@ -1,13 +1,38 @@  outrules = {  	{x=1, y=0, z=0},  } +oneinput = { +	{x=-1, y=0, z=0}, +	{x=1, y=0, z=0}, +} +twoinputs = { +	{x=0, y=0, z=1}, +	{x=0, y=0, z=-1}, +	{x=1, y=0, z=0}, +} +function get_gate_rules(param2, onlyout, singleinput) +	if onlyout then +		rules = outrules +	else +		if singleinput then +			rules = oneinput +		else +			rules = twoinputs +		end +	end +	for rotations=0, param2-1 do +		rules = mesecon:rotate_rules_left(rules) +	end +	return rules +end + +function get_gate_rules_one(param2) return get_gate_rules(param2, false, true) end +function get_gate_rules_two(param2) return get_gate_rules(param2, false, false) end +function get_gate_rules_out(param2) return get_gate_rules(param2, true) end  gates = {"diode", "not", "nand", "and", "xor"}  for g in ipairs(gates) do gate = gates[g]  	if g < 3 then -		rules = { -			{x=-1, y=0, z=0}, -			{x=1, y=0, z=0}, -		} +		get_rules = get_gate_rules_one  		node_box = {  			type = "fixed",  			fixed = { @@ -17,11 +42,7 @@ for g in ipairs(gates) do gate = gates[g]  			},  		}  	else -		rules = { -			{x=0, y=0, z=1}, -			{x=0, y=0, z=-1}, -			{x=1, y=0, z=0}, -		} +		get_rules = get_gate_rules_two  		node_box = {  			type = "fixed",  			fixed = { @@ -37,16 +58,17 @@ for g in ipairs(gates) do gate = gates[g]  		if on == 1 then  			onoff = "on"  			drop = nodename.."_off" -			groups = {dig_immediate=2, not_in_creative_inventory=1, mesecon = 3} -			description = "You hacker you!"  			nodename = nodename.."_"..onoff -			mesecon:add_receptor_node(nodename, outrules) +			description = "You hacker you!" +			groups = {dig_immediate=2, not_in_creative_inventory=1, mesecon = 3} +			mesecon:add_receptor_node(nodename, get_rules, get_gate_rules_out) +			--mesecon:add_receptor_node(nodename, mesecon:get_rules("insulated_all"))  		else  			onoff = "off" -			groups = {dig_immediate=2, mesecon = 3} -			description = gate.." Gate"  			nodename = nodename.."_"..onoff -			--mesecon:add_receptor_node_off(nodename, rules) +			description = gate.." Gate" +			groups = {dig_immediate=2, mesecon = 3} +			--mesecon:add_receptor_node_off(nodename, get_gate_rules_out)  		end  		tiles = "jeija_microcontroller_bottom.png^".. @@ -56,6 +78,7 @@ for g in ipairs(gates) do gate = gates[g]  		minetest.register_node(nodename, {  			description = description,  			paramtype = "light", +			paramtype2 = "facedir",  			drawtype = "nodebox",  			tiles = {tiles},  			inventory_image = tiles, @@ -72,22 +95,24 @@ for g in ipairs(gates) do gate = gates[g]  		}) -		mesecon:register_effector(nodename, nodename, rules) +		mesecon:register_effector(nodename, nodename, mesecon:get_rules("insulated_all"), get_rules)  	end  end  function get_gate(pos) -	string = minetest.env:get_node(pos).name -	string = string.gsub(string, "mesecons_gates:", "") -	--gate -	string = string.gsub(string, "_on", "") -	string = string.gsub(string, "_off", "") -	return string +	return +	string.gsub(  +	string.gsub( +	string.gsub( +	minetest.env:get_node(pos).name +	, "mesecons_gates:", "") --gate +	,"_on", "") +	,"_off", "")  end  function gate_state(pos)  	name = minetest.env:get_node(pos).name -	return string.find(name, "off") == nil +	return string.find(name, "_on") ~= nil  end  function pop_gate(pos) @@ -112,21 +137,39 @@ function set_gate(pos, on)  			else  				onoff = "_off"  			end -			minetest.env:add_node(pos, {name="mesecons_gates:"..gate..onoff}) +			param2 = minetest.env:get_node(pos).param2 +			minetest.env:add_node(pos, { +				name = "mesecons_gates:"..gate..onoff, +				param2 = param2, +			})  			local meta2 = minetest.env:get_meta(pos)  			meta2:set_int("heat", heat)  			if on then -				mesecon:receptor_on(pos, outrules) +				mesecon:receptor_on(pos, get_gate_rules(param2, true))  			else -				mesecon:receptor_off(pos, outrules) +				mesecon:receptor_off(pos, mesecon:get_rules("insulated_all"))  			end  		end  	end  end +function rotate_ports(L, param2) +	for rotations=0, param2-1 do +		port = L.a +		L.a = L.b +		L.b = L.c +		L.c = L.d +		L.d = port +	end +	return L +end +  function update_gate(pos)  	gate = get_gate(pos) -	L = yc_get_real_portstates(pos) +	L = rotate_ports( +		yc_get_real_portstates(pos), +		minetest.env:get_node(pos).param2 +	)  	if gate == "diode" then  		set_gate(pos, L.a)	  	elseif gate == "not" then  | 
