diff options
| author | thetaepsilon-gamedev <thetaepsilon-gamedev@noreply.users.github.com> | 2017-10-08 14:27:40 +0100 | 
|---|---|---|
| committer | thetaepsilon-gamedev <thetaepsilon-gamedev@noreply.users.github.com> | 2017-10-08 14:27:40 +0100 | 
| commit | e98e4e268b5faf898a0b8f580d7da2b46ead05c4 (patch) | |
| tree | f4620750b4520fbde990025b18962caf919b6c6c | |
| parent | 7e09da50c2896e8a4bcfc6f666d5a63694e682bd (diff) | |
new flow logic: flowable node registry: add initial support for transition triggers
| -rw-r--r-- | new_flow_logic/flowable_node_registry.lua | 6 | ||||
| -rw-r--r-- | new_flow_logic/flowable_node_registry_install.lua | 50 | 
2 files changed, 56 insertions, 0 deletions
| diff --git a/new_flow_logic/flowable_node_registry.lua b/new_flow_logic/flowable_node_registry.lua index b0634d0..7651928 100644 --- a/new_flow_logic/flowable_node_registry.lua +++ b/new_flow_logic/flowable_node_registry.lua @@ -27,6 +27,12 @@ pipeworks.flowables.outputs = {}  pipeworks.flowables.outputs.list = {}  -- not currently any nodenames arraylist for this one as it's not currently needed. +-- nodes with registered node transitions +-- nodes will be switched depending on pressure level +pipeworks.flowables.transitions = {} +pipeworks.flowables.transitions.list = {}	-- master list +pipeworks.flowables.transitions.simple = {}	-- nodes that change based purely on pressure +  -- checks if a given node can flow in a given direction. diff --git a/new_flow_logic/flowable_node_registry_install.lua b/new_flow_logic/flowable_node_registry_install.lua index 0be9fc0..63151f0 100644 --- a/new_flow_logic/flowable_node_registry_install.lua +++ b/new_flow_logic/flowable_node_registry_install.lua @@ -120,3 +120,53 @@ register.output_simple = function(nodename, upper, lower, neighbours)  	local cleanupfn = pipeworks.flowlogic.helpers.make_neighbour_cleanup_fixed(neighbours)  	register.output(nodename, upper, lower, outputfn, cleanupfn)  end + + + +-- common base checking for transition nodes +-- ensures the node has only been registered once as a transition. +local transition_list = pipeworks.flowables.transitions.list +local insert_transition_base = function(nodename) +	checkbase(nodename) +	if transition_list[nodename] then duplicateerr("base transition", nodename) end +	transition_list[nodename] = true +end + + + +-- register a simple transition set. +-- expects a table with nodenames as keys and threshold pressures as values. +-- internally, the table is sorted by value, and when one of these nodes needs to transition, +-- the table is searched starting from the lowest (even if it's value is non-zero), +-- until a value is found which is higher than or equal to the current node pressure. +-- ex. nodeset = { ["mod:level_0"] = 0, ["mod:level_1"] = 1, --[[ ... ]] } +local simpleseterror = function(msg) +	error("register.transition_simple_set(): "..msg) +end +local simple_transitions = pipeworks.flowables.transitions.simple + +register.transition_simple_set = function(nodeset) +	local set = {} +	for nodename, value in pairs(nodeset) do +		if type(nodename) ~= "string" then simpleseterror("nodename key "..tostring(nodename).."was not a string!") end +		if type(value) ~= "number" then simpleseterror("pressure value "..tostring(value).."was not a number!") end +		insert_transition_base(nodename) +		if simple_transitions[nodename] then duplicateerr("simple transition set", nodename) end +		-- assigning set to table is done separately below + +		table.insert(set, { nodename=nodename, threshold=value }) +	end + +	-- sort pressure values, smallest first +	local smallest_first = function(a, b) +		return a.value < b.value +	end +	table.sort(set, smallest_first) + +	-- individual registration of each node, all sharing this set, +	-- so each node in the set will transition to the correct target node. +	for _, element in ipairs(set) do +		--pipeworks.logger("register.transition_simple_set() after sort: nodename "..element.nodename.." value "..tostring(element.threshold)) +		simple_transitions[element.nodename] = set +	end +end | 
