aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--advtrains_luaautomation/README.md25
-rwxr-xr-x[-rw-r--r--]advtrains_luaautomation/atc_rail.lua32
2 files changed, 50 insertions, 7 deletions
diff --git a/advtrains_luaautomation/README.md b/advtrains_luaautomation/README.md
index 67a4b80..a885075 100644
--- 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
index 5dde99c..aac11f0 100644..100755
--- 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