diff options
| author | thetaepsilon-gamedev <thetaepsilon-gamedev@noreply.users.github.com> | 2017-10-08 16:19:51 +0100 | 
|---|---|---|
| committer | thetaepsilon-gamedev <thetaepsilon-gamedev@noreply.users.github.com> | 2017-10-08 16:19:51 +0100 | 
| commit | eaf6c33bae0912e15ac190df203b9b250545052b (patch) | |
| tree | 8d21a2847c5c6957d9eafd579601693df9b04374 | |
| parent | 32a24730f1ab8cd596ed2f4cf6eda1a58c877ecb (diff) | |
new flow logic: abms.lua: implement node transitions
| -rw-r--r-- | new_flow_logic/abms.lua | 51 | 
1 files changed, 50 insertions, 1 deletions
| diff --git a/new_flow_logic/abms.lua b/new_flow_logic/abms.lua index e83d50e..6abdd42 100644 --- a/new_flow_logic/abms.lua +++ b/new_flow_logic/abms.lua @@ -29,7 +29,7 @@ end ---local formatvec = function(vec) local sep="," return "("..tostring(vec.x)..sep..tostring(vec.y)..sep..tostring(vec.z)..")" end +local formatvec = function(vec) local sep="," return "("..tostring(vec.x)..sep..tostring(vec.y)..sep..tostring(vec.z)..")" end  -- new version of liquid check  -- accepts a limit parameter to only delete water blocks that the receptacle can accept, @@ -106,6 +106,13 @@ flowlogic.run = function(pos, node)  			finitemode)  	end +	-- if node has pressure transitions: determine new node +	if pipeworks.flowables.transitions.list[nodename] then +		local newnode = flowlogic.run_transition(node, currentpressure) +		--pipeworks.logger("flowlogic.run()@"..formatvec(pos).." transition, new node name = "..dump(newnode).." pressure "..tostring(currentpressure)) +		minetest.swap_node(pos, newnode) +	end +  	-- set the new pressure  	nodepressure.set(currentpressure)  end @@ -240,3 +247,45 @@ flowlogic.run_output = function(pos, node, currentpressure, oldpressure, outputd  	end  	return result  end + + + +-- determine which node to switch to based on current pressure +flowlogic.run_transition = function(node, currentpressure) +	local simplesetdef = pipeworks.flowables.transitions.simple[node.name] +	local result = node +	local found = false + +	-- simple transition sets: assumes all nodes in the set share param values. +	if simplesetdef then +		-- assumes that the set has been checked to contain at least one element... +		local nodename_prev = simplesetdef[1].nodename +		local result_nodename = node.name + +		for index, element in ipairs(simplesetdef) do +			-- find the highest element that is below the current pressure. +			local threshold = element.threshold +			if threshold > currentpressure then +				result_nodename = nodename_prev +				found = true +				break +			end +			nodename_prev = element.nodename +		end + +		-- use last element if no threshold is greater than current pressure +		if not found then +			result_nodename = nodename_prev +			found = true +		end + +		-- preserve param1/param2 values +		result = { name=result_nodename, param1=node.param1, param2=node.param2 } +	end + +	if not found then +		pipeworks.logger("flowlogic.run_transition() BUG no transition definitions found! nodename="..nodename.." currentpressure="..tostring(currentpressure)) +	end + +	return result +end | 
