~gpcf/advtrains-devel

[LuaATC] Add get_fc() and set_fc() commands v1 APPLIED

Maverick2797: 1
 [LuaATC] Add get_fc() and set_fc() commands

 2 files changed, 50 insertions(+), 7 deletions(-)
Export patchset (mbox)
How do I use this?

Copy & paste the following snippet into your terminal to import this patchset into git:

curl -s https://lists.sr.ht/~gpcf/advtrains-devel/patches/36906/mbox | git am -3
Learn more about email & git

[PATCH 1/1] [LuaATC] Add get_fc() and set_fc() commands Export this patch

get_fc: returns a table of each wagon's FC codes
set_fc: set a table to overwrite the FC codes of a train's wagons
---
 advtrains_luaautomation/README.md    | 25 ++++++++++++++++------
 advtrains_luaautomation/atc_rail.lua | 32 ++++++++++++++++++++++++++++
 2 files changed, 50 insertions(+), 7 deletions(-)
 mode change 100644 => 100755 advtrains_luaautomation/atc_rail.lua

diff --git a/advtrains_luaautomation/README.md b/advtrains_luaautomation/README.md
index 67a4b80..a885075 100755
--- a/advtrains_luaautomation/README.md
+++ b/advtrains_luaautomation/README.md
@@ -255,7 +255,10 @@ In addition to the above environment functions, the following functions are avai
	The interlocking system uses this property for Automatic Routesetting.

#### Shunting Functions and Variables
There are several functions available especially for shunting operations. Some of these functions make use of Freight Codes (FC) set in the Wagon Properties of each wagon and/or locomotive:
There are several functions available especially for shunting operations.
Some of these functions make use of Freight Codes (FC) set in the Wagon Properties of each wagon and/or locomotive.
FCs are composed of codes separated by exclamation marks (`!`), for instance `"foo!bar!baz"`.
Each wagon has a current FC, indicating its next destination.

 - `split_at_index(index, atc_command)`
	Splits the train at the specified index, into a train with index-1 wagons and a second train starting with the index-th wagon. The `atc_command` specified is sent to the second train after decoupling. `"S0"` or `"B0"` is common to ensure any locomotives in the remaining train don't continue to move.
@@ -266,6 +269,18 @@ There are several functions available especially for shunting operations. Some o
	Command: `split_at_index(4,"S0")`  
	Result: first train (continues at previous speed): `"foo","foo","foo"`, second train (slows at S0): `"bar","bar","bar"`

 - `get_fc()`
	Returns a table with the entire FC list for each wagon in the train.  
	Command: `get_fc()`  
	Result: `{"", "foo!bar", "testing", "fc_1!fc_2!fc_3!?", "hello_world"}`
	
 - `set_fc(fc_list)`
	Overwrites the FC list according to a table `fc_list`. A false or nil entry will leave the wagon unaffected, however all others will be overwritten.
	Useful for mass-programming freight trains that use FC-shunting instead of walking to each wagon individually.  
	Example: train has FC lists: `"", "foo!bar", "testing", "fc_1!fc_2!fc_3!?", "hello_world"`  
	Command: `set_fc({"", "foo!turtle", nil, "4tehlulz", false})`  
	Result: `""` `"foo!turtle"` `"testing"` `"4tehlulz"` `"hello_world"`

 - `split_at_fc(atc_command, len)`
	Splits the train in such a way that all cars with non-empty current FC of the first part of the train have the same FC. The
	`atc_command` specified is sent to the rear part, as with	split_at_index. It returns the fc of the cars of the first part.
@@ -289,15 +304,11 @@ There are several functions available especially for shunting operations. Some o
	first part of the train as above.

 - `step_fc()`
	Steps the FCs of all train cars forward. FCs are composed of codes
	separated by exclamation marks (`!`), for instance
	`"foo!bar!baz"`. Each wagon has a current FC, indicating its next
	destination. Stepping the freight code forward, selects the next
	code after the !. If the end of the string is reached, then the
	Steps the FCs of all train cars forward, selecting the next
	code after the `!`. If the end of the string is reached, then the
	first code is selected, except if the string ends with a question
	mark (`?`), then the order is reversed.


 - `train_length()`
	returns the number of cars the train is composed of.

diff --git a/advtrains_luaautomation/atc_rail.lua b/advtrains_luaautomation/atc_rail.lua
old mode 100644
new mode 100755
index 5dde99c..aac11f0
--- a/advtrains_luaautomation/atc_rail.lua
+++ b/advtrains_luaautomation/atc_rail.lua
@@ -91,6 +91,38 @@ function r.fire_event(pos, evtdata, appr_internal)
			if not train_id then return false end
			advtrains.train_step_fc(train)
		end,
		get_fc = function()
			if not train_id then return end
			local fc_list = {}
			for index,wagon_id in ipairs(train.trainparts) do
				fc_list[index] = table.concat(advtrains.wagons[wagon_id].fc,"!") or ""
			end
			return fc_list
		end,
		set_fc = function(fc_list)
			assertt(fc_list, "table")
			if not train_id then return false end
			-- safety type-check for entered values
			for _,v in ipairs(fc_list) do
				if v and type(v) ~= "string" then
					error("FC entries must be a string")
					return
				end
			end
			for index,wagon_id in ipairs(train.trainparts) do
				if fc_list[index] then -- has FC to enter to this wagon
					local data = advtrains.wagons[wagon_id]
					if data then -- wagon actually exists
						for _,wagon in pairs(minetest.luaentities) do -- find wagon entity
							if wagon.is_wagon and wagon.initialized and wagon.id==wagon_id then
								wagon.set_fc(data,fc_list[index]) -- overwrite to new FC
								break -- no point cycling through every other entity. we found our wagon
							end
						end
					end
				end
			end
		end,
		set_shunt = function()
			-- enable shunting mode
			if not train_id then return false end
-- 
2.38.0