aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.build.yml27
-rw-r--r--advtrains/couple.lua24
-rw-r--r--advtrains/crafting.lua17
-rw-r--r--advtrains/init.lua18
-rw-r--r--advtrains/occupation.lua12
-rw-r--r--advtrains/po/advtrains.pot325
-rw-r--r--advtrains/po/de.po731
-rw-r--r--advtrains/po/fr.po790
-rwxr-xr-xadvtrains/po/update-translations.sh1
-rw-r--r--advtrains/po/zh_CN.po705
-rw-r--r--advtrains/po/zh_TW.po705
-rw-r--r--advtrains/poconvert.lua2
-rw-r--r--advtrains/settingtypes.txt3
-rw-r--r--advtrains/sounds/advtrains_crossing_bell.oggbin47722 -> 24656 bytes
-rw-r--r--advtrains/spec/poconvert_spec.lua6
-rw-r--r--advtrains/spec/texture_spec.lua19
-rw-r--r--advtrains/spec/wagons_spec.lua40
-rw-r--r--advtrains/texture.lua228
-rw-r--r--advtrains/textures/advtrains_wagon_prop_tool.pngbin0 -> 779 bytes
-rw-r--r--advtrains/trackplacer.lua21
-rw-r--r--advtrains/trainhud.lua157
-rw-r--r--advtrains/trainlogic.lua47
-rw-r--r--advtrains/wagonprop_tool.lua43
-rw-r--r--advtrains/wagons.lua180
-rw-r--r--advtrains_interlocking/database.lua9
-rw-r--r--advtrains_interlocking/route_prog.lua27
-rw-r--r--advtrains_interlocking/route_ui.lua15
-rw-r--r--advtrains_interlocking/routesetting.lua9
-rw-r--r--advtrains_interlocking/signal_api.lua69
-rwxr-xr-xadvtrains_interlocking/tcb_ts_ui.lua35
-rw-r--r--advtrains_luaautomation/README.md24
-rw-r--r--advtrains_luaautomation/active_common.lua4
-rw-r--r--[-rwxr-xr-x]advtrains_luaautomation/atc_rail.lua23
-rw-r--r--advtrains_luaautomation/environment.lua10
-rw-r--r--[-rwxr-xr-x]advtrains_luaautomation/operation_panel.lua0
-rw-r--r--advtrains_luaautomation/pcnaming.lua15
-rwxr-xr-xadvtrains_signals_ks/init.lua8
37 files changed, 2530 insertions, 1819 deletions
diff --git a/.build.yml b/.build.yml
index c4c697f..c2332f2 100644
--- a/.build.yml
+++ b/.build.yml
@@ -1,6 +1,10 @@
image: debian/stable
packages:
- git
+- curl
+- minetest-server
+- unzip
+- wget
- lua-busted
- luajit
sources :
@@ -8,6 +12,17 @@ sources :
tasks:
+- install_mt_game : |
+ curl -L https://github.com/minetest/minetest_game/archive/master.zip -o master.zip
+ mkdir -p .minetest/games/
+ cd .minetest/games
+ unzip ../../master.zip
+ mv minetest_game-master minetest_game
+- install_test_world: |
+ mkdir -p .minetest/worlds/
+ curl https://lifomaps.de/advtrains-test/testworld.tar.gz -o ~/testworld.tar.gz
+ cd .minetest/worlds/
+ tar xf ../../testworld.tar.gz
- run_unit_tests : |
cd advtrains/advtrains
busted
@@ -15,7 +30,17 @@ tasks:
busted
cd ../serialize_lib
busted
-
+- activate_test_env: |
+ cd advtrains
+ git merge --no-commit origin/luaatcdebug
+- install_advtrains : |
+ mkdir .minetest/mods
+ cp -r advtrains .minetest/mods
+ cd .minetest/mods
+ git clone https://git.bananach.space/basic_trains.git/
+- run_test_world: |
+ echo "bind_address = 127.0.0.1" > minetest.conf
+ minetestserver --port 31111 --gameid minetest_game --config ~/minetest.conf --world ~/.minetest/worlds/advtrains_testworld --logfile ~/minetest.log
- test_po_files : |
cd advtrains/advtrains
for f in po/*.po; do
diff --git a/advtrains/couple.lua b/advtrains/couple.lua
index 9474dcf..4933dd8 100644
--- a/advtrains/couple.lua
+++ b/advtrains/couple.lua
@@ -28,6 +28,20 @@ end
advtrains.register_coupler_type("chain", attrans("Buffer and Chain Coupler"))
advtrains.register_coupler_type("scharfenberg", attrans("Scharfenberg Coupler"))
+for _, name in pairs {"couple", "decouple"} do
+ local t = {}
+ local function reg(f)
+ table.insert(t, f)
+ end
+ local function cb(...)
+ for _, f in ipairs(t) do
+ f(...)
+ end
+ end
+ advtrains["te_registered_on_" .. name] = t
+ advtrains["te_register_on_" .. name] = reg
+ advtrains["te_run_callbacks_on_" .. name] = cb
+end
local function create_couple_entity(pos, train1, t1_is_front, train2, t2_is_front)
local id1 = train1.id
@@ -235,6 +249,8 @@ function advtrains.couple_trains(init_train, invert_init_train, stat_train, stat
return
end
+ advtrains.te_run_callbacks_on_couple(init_train, stat_train)
+
if stat_train_opposite then
-- insert wagons in inverse order and set their wagon_flipped state
for i=1,stat_wagoncnt do
@@ -319,7 +335,7 @@ function advtrains.check_matching_coupler_types(t1, t1_front, t2, t2_front)
--atdebug("CMCT: t1",t1_cplt,"t2",t2_cplt,"")
-- if at least one of the trains has no couplers table, it always couples (fallback behavior and mode for universal shunters)
- if not t1_cplt or not t2_cplt then
+ if minetest.settings:get_bool("advtrains_universal_couplers", false) or not t1_cplt or not t2_cplt then
return true
end
@@ -437,7 +453,7 @@ minetest.register_entity("advtrains:discouple", {
self.object:remove()
return
end
- --getyaw seems to be a reliable method to check if an object is loaded...if it returns nil, it is not.
+ --get_yaw seems to be a reliable method to check if an object is loaded...if it returns nil, it is not.
if not self.wagon.object:get_yaw() then
self.object:remove()
return
@@ -484,7 +500,7 @@ minetest.register_entity("advtrains:couple", {
self.object:remove()
end,
on_step=function(self, dtime)
- if advtrains.wagon_outside_range(self.object:getpos()) then
+ if advtrains.wagon_outside_range(self.object:get_pos()) then
--atdebug("Couple Removing outside range")
self.object:remove()
return
@@ -523,7 +539,7 @@ minetest.register_entity("advtrains:couple", {
tp2=advtrains.path_get_interpolated(train2, train2.end_index)
end
local pos_median=advtrains.pos_median(tp1, tp2)
- if not vector.equals(pos_median, self.object:getpos()) then
+ if not vector.equals(pos_median, self.object:get_pos()) then
self.object:set_pos(pos_median)
end
self.position_set=true
diff --git a/advtrains/crafting.lua b/advtrains/crafting.lua
index 7626d55..9f80456 100644
--- a/advtrains/crafting.lua
+++ b/advtrains/crafting.lua
@@ -22,6 +22,14 @@ minetest.register_craft({
})
--Wallmounted Signal
minetest.register_craft({
+ output = 'advtrains:signal_wall_l_off 2',
+ recipe = {
+ {'default:steel_ingot', 'default:steel_ingot', 'dye:red'},
+ {'', 'default:steel_ingot', ''},
+ {'default:steel_ingot', 'default:steel_ingot', 'dye:dark_green'},
+ },
+})
+minetest.register_craft({
output = 'advtrains:signal_wall_r_off 2',
recipe = {
{'dye:red', 'default:steel_ingot', 'default:steel_ingot'},
@@ -29,6 +37,15 @@ minetest.register_craft({
{'dye:dark_green', 'default:steel_ingot', 'default:steel_ingot'},
},
})
+minetest.register_craft({
+ output = 'advtrains:signal_wall_t_off 2',
+ recipe = {
+ {'default:steel_ingot', '', 'default:steel_ingot'},
+ {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
+ {'dye:dark_green', '', 'dye:red'},
+ },
+})
+
--Wallmounted Signals can be converted into every orientation by shapeless crafting
minetest.register_craft({
diff --git a/advtrains/init.lua b/advtrains/init.lua
index a7fbc3f..4a0b928 100644
--- a/advtrains/init.lua
+++ b/advtrains/init.lua
@@ -203,12 +203,14 @@ advtrains.poconvert.from_flat("advtrains")
attrans = minetest.get_translator("advtrains")
advtrains.speed = dofile(advtrains.modpath.."/speed.lua")
+advtrains.texture = dofile(advtrains.modpath.."/texture.lua")
dofile(advtrains.modpath.."/path.lua")
dofile(advtrains.modpath.."/trainlogic.lua")
dofile(advtrains.modpath.."/trainhud.lua")
dofile(advtrains.modpath.."/trackplacer.lua")
dofile(advtrains.modpath.."/copytool.lua")
+dofile(advtrains.modpath.."/wagonprop_tool.lua")
dofile(advtrains.modpath.."/tracks.lua")
dofile(advtrains.modpath.."/occupation.lua")
dofile(advtrains.modpath.."/atc.lua")
@@ -474,6 +476,7 @@ advtrains.avt_save = function(remove_players_from_wagons)
"text_outside", "text_inside", "line", "routingcode",
"il_sections", "speed_restriction", "speed_restrictions_t", "is_shunt",
"points_split", "autocouple", "atc_wait_autocouple", "ars_disable",
+ "staticdata",
})
--then save it
tmp_trains[id]=v
@@ -737,6 +740,21 @@ minetest.register_chatcommand("at_whereis",
end
end,
})
+minetest.register_chatcommand("at_tp",
+ {
+ params = "<train id>",
+ description = "Teleports you to the position of the train with the given id",
+ privs = {train_operator = true, teleport = true},
+ func = function(name,param)
+ local train = advtrains.trains[param]
+ if not train or not train.last_pos then
+ return false, "Train "..param.." does not exist or is invalid"
+ else
+ minetest.get_player_by_name(name):set_pos(train.last_pos)
+ return true, "Teleporting to train "..param
+ end
+ end,
+})
minetest.register_chatcommand("at_disable_step",
{
params = "<yes/no>",
diff --git a/advtrains/occupation.lua b/advtrains/occupation.lua
index 6852dfa..26e1f79 100644
--- a/advtrains/occupation.lua
+++ b/advtrains/occupation.lua
@@ -159,10 +159,8 @@ function o.reverse_lookup(ppos)
local r = {}
local i = 1
while t[i] do
- if t[i]~=train_id then
- if not r[t[i]] then r[t[i]] = {} end
- table.insert(r[t[i]], t[i+1])
- end
+ if not r[t[i]] then r[t[i]] = {} end
+ table.insert(r[t[i]], t[i+1])
i = i + 2
end
return r
@@ -188,6 +186,7 @@ local OCC_CLOSE_PROXIMITY = 3
-- Gets a mapping of train id's to index of trains that have a path item at this position. Selects at most one index based on a given heuristic, or even none if it does not match the heuristic criterion
-- returns (table with train_id->index), position
-- "in_train": first index that lies between train index and end index
+-- "train_at_node": first index where the train is standing on that node (like in_train but with +-0.5 added to index)
-- "first_ahead": smallest index that is > current index
-- "before_end"(default): smallest index that is > end index
-- "close_proximity": within 3 indices close to the train index and end_index
@@ -214,6 +213,9 @@ function o.reverse_lookup_sel(pos, heuristic)
if heuristic == "in_train" and idx < otrn.index and idx > otrn.end_index then
h_value = idx
end
+ if heuristic == "train_at_node" and idx < (otrn.index+0.5) and idx > (otrn.end_index-0.5) then
+ h_value = idx
+ end
if heuristic == "close_proximity" and idx < (otrn.index + OCC_CLOSE_PROXIMITY) and idx > (otrn.end_index - OCC_CLOSE_PROXIMITY) then
h_value = idx
end
@@ -228,7 +230,7 @@ end
-- returns (table with train_id->index)
function o.get_trains_at(ppos)
local pos = advtrains.round_vector_floor_y(ppos)
- return o.reverse_lookup_sel(pos, "in_train")
+ return o.reverse_lookup_sel(pos, "train_at_node")
end
advtrains.occ = o
diff --git a/advtrains/po/advtrains.pot b/advtrains/po/advtrains.pot
index 6fda1d7..ae7fb32 100644
--- a/advtrains/po/advtrains.pot
+++ b/advtrains/po/advtrains.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: advtrains\n"
"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
-"POT-Creation-Date: 2023-10-09 11:02+0200\n"
+"POT-Creation-Date: 2024-12-06 21:17+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,54 +17,54 @@ msgstr ""
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
-#: advtrains/atc.lua:109
+#: advtrains/atc.lua
msgid "Unconfigured ATC controller"
msgstr ""
-#: advtrains/atc.lua:150
+#: advtrains/atc.lua
msgid ""
"ATC controller, mode @1\n"
"Command: @2"
msgstr ""
-#: advtrains/atc.lua:180
+#: advtrains/atc.lua
msgid "Command"
msgstr ""
-#: advtrains/atc.lua:184
+#: advtrains/atc.lua
msgid "Command (on)"
msgstr ""
-#: advtrains/atc.lua:187
+#: advtrains/atc.lua
msgid "Digiline channel"
msgstr ""
-#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65
-#: advtrains_luaautomation/active_common.lua:48
+#: advtrains/atc.lua advtrains_line_automation/stoprail.lua
+#: advtrains_luaautomation/active_common.lua
msgid "Save"
msgstr ""
-#: advtrains/atc.lua:236
+#: advtrains/atc.lua
msgid "ATC Reverse command warning: didn't reverse train, train moving."
msgstr ""
-#: advtrains/atc.lua:248
+#: advtrains/atc.lua
msgid "ATC Kick command warning: doors are closed."
msgstr ""
-#: advtrains/atc.lua:252
+#: advtrains/atc.lua
msgid "ATC Kick command warning: train moving."
msgstr ""
-#: advtrains/atc.lua:322
+#: advtrains/atc.lua
msgid "ATC command syntax error: I statement not closed: @1"
msgstr ""
-#: advtrains/atc.lua:385
+#: advtrains/atc.lua
msgid "ATC command parse error: Unknown command: @1"
msgstr ""
-#: advtrains/copytool.lua:8
+#: advtrains/copytool.lua
msgid ""
"Train copy/paste tool\n"
"\n"
@@ -72,166 +72,166 @@ msgid ""
"Right-click: paste train"
msgstr ""
-#: advtrains/copytool.lua:29
+#: advtrains/copytool.lua
msgid "You do not have the @1 privilege."
msgstr ""
-#: advtrains/copytool.lua:41
+#: advtrains/copytool.lua
msgid "The track you are trying to place the wagon on is not long enough."
msgstr ""
-#: advtrains/copytool.lua:47
+#: advtrains/copytool.lua
msgid "The clipboard couldn't access the metadata. Paste failed."
msgstr ""
-#: advtrains/copytool.lua:52 advtrains/copytool.lua:57
+#: advtrains/copytool.lua
msgid "The clipboard is empty."
msgstr ""
-#: advtrains/copytool.lua:74
+#: advtrains/copytool.lua
msgid "Back of train would end up off track, cancelling."
msgstr ""
-#: advtrains/copytool.lua:92
+#: advtrains/copytool.lua
msgid "No such lua entity."
msgstr ""
-#: advtrains/copytool.lua:98
+#: advtrains/copytool.lua
msgid "No such wagon: @1."
msgstr ""
-#: advtrains/copytool.lua:104
+#: advtrains/copytool.lua
msgid "No such train: @1."
msgstr ""
-#: advtrains/copytool.lua:176
+#: advtrains/copytool.lua
msgid "The clipboard couldn't access the metadata. Copy failed."
msgstr ""
-#: advtrains/copytool.lua:180
+#: advtrains/copytool.lua
msgid "Train copied."
msgstr ""
-#: advtrains/couple.lua:28
+#: advtrains/couple.lua
msgid "Buffer and Chain Coupler"
msgstr ""
-#: advtrains/couple.lua:29
+#: advtrains/couple.lua
msgid "Scharfenberg Coupler"
msgstr ""
-#: advtrains/couple.lua:185
+#: advtrains/couple.lua
msgid ""
"You are not allowed to couple trains without the train_operator privilege."
msgstr ""
-#: advtrains/couple.lua:329 advtrains/couple.lua:333
+#: advtrains/couple.lua
msgid "<No coupler>"
msgstr ""
-#: advtrains/couple.lua:334
+#: advtrains/couple.lua
msgid "Can not couple: The couplers of the trains do not match (@1 and @2)."
msgstr ""
-#: advtrains/craft_items.lua:3
+#: advtrains/craft_items.lua
msgid "Boiler"
msgstr ""
-#: advtrains/craft_items.lua:9
+#: advtrains/craft_items.lua
msgid "Driver's cab"
msgstr ""
-#: advtrains/craft_items.lua:15
+#: advtrains/craft_items.lua
msgid "Wheel"
msgstr ""
-#: advtrains/craft_items.lua:21
+#: advtrains/craft_items.lua
msgid "Chimney"
msgstr ""
-#: advtrains/misc_nodes.lua:16
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (low)"
msgstr ""
-#: advtrains/misc_nodes.lua:33
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (high)"
msgstr ""
-#: advtrains/misc_nodes.lua:59
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (45 degree)"
msgstr ""
-#: advtrains/misc_nodes.lua:81
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (low, 45 degree)"
msgstr ""
-#: advtrains/protection.lua:7
+#: advtrains/protection.lua
msgid "Can place, remove and operate trains"
msgstr ""
-#: advtrains/protection.lua:12
+#: advtrains/protection.lua
msgid ""
"Can place, remove and operate any train, regardless of owner, whitelist, or "
"protection"
msgstr ""
-#: advtrains/protection.lua:18
+#: advtrains/protection.lua
msgid "Can place and dig tracks in unprotected areas"
msgstr ""
-#: advtrains/protection.lua:24
+#: advtrains/protection.lua
msgid "Can operate turnouts and signals in unprotected areas"
msgstr ""
-#: advtrains/protection.lua:148
+#: advtrains/protection.lua
msgid ""
"You are not allowed to build near tracks without the track_builder privilege."
msgstr ""
-#: advtrains/protection.lua:148
+#: advtrains/protection.lua
msgid ""
"You are not allowed to build tracks without the track_builder privilege."
msgstr ""
-#: advtrains/protection.lua:153
+#: advtrains/protection.lua
msgid "You are not allowed to build near tracks at this protected position."
msgstr ""
-#: advtrains/protection.lua:153
+#: advtrains/protection.lua
msgid "You are not allowed to build tracks at this protected position."
msgstr ""
-#: advtrains/protection.lua:184
+#: advtrains/protection.lua
msgid ""
"You are not allowed to operate turnouts and signals without the "
"railway_operator privilege."
msgstr ""
-#: advtrains/signals.lua:63
+#: advtrains/signals.lua
msgid "Lampless Signal"
msgstr ""
-#: advtrains/signals.lua:127
+#: advtrains/signals.lua
msgid "Signal"
msgstr ""
-#: advtrains/signals.lua:191
+#: advtrains/signals.lua
msgid "Wallmounted Signal (left)"
msgstr ""
-#: advtrains/signals.lua:192
+#: advtrains/signals.lua
msgid "Wallmounted Signal (right)"
msgstr ""
-#: advtrains/signals.lua:193
+#: advtrains/signals.lua
msgid "Wallmounted Signal (top)"
msgstr ""
-#: advtrains/signals.lua:281 advtrains/signals.lua:322
+#: advtrains/signals.lua
msgid "Andrew's Cross"
msgstr ""
-#: advtrains/trackplacer.lua:313
+#: advtrains/trackplacer.lua
msgid ""
"Track Worker Tool\n"
"\n"
@@ -239,394 +239,413 @@ msgid ""
"Right-click: rotate object"
msgstr ""
-#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377
+#: advtrains/trackplacer.lua
msgid "This node can't be rotated using the trackworker."
msgstr ""
-#: advtrains/trackplacer.lua:350
+#: advtrains/trackplacer.lua
msgid "This track can not be rotated."
msgstr ""
-#: advtrains/trackplacer.lua:404
+#: advtrains/trackplacer.lua
msgid "This node can't be changed using the trackworker."
msgstr ""
-#: advtrains/trackplacer.lua:414
+#: advtrains/trackplacer.lua
msgid "This track can not be changed."
msgstr ""
-#: advtrains/tracks.lua:449
+#: advtrains/tracks.lua
msgid "This track can not be removed."
msgstr ""
-#: advtrains/tracks.lua:616
+#: advtrains/tracks.lua
msgid "Position is occupied by a train."
msgstr ""
-#: advtrains/tracks.lua:622
+#: advtrains/tracks.lua
msgid "There's a Track Circuit Break here."
msgstr ""
-#: advtrains/tracks.lua:626
+#: advtrains/tracks.lua
msgid "There's a Signal Influence Point here."
msgstr ""
-#: advtrains/tracks.lua:637
+#: advtrains/tracks.lua
msgid "@1 Slope"
msgstr ""
-#: advtrains/tracks.lua:648 advtrains/tracks.lua:653
+#: advtrains/tracks.lua
msgid "Can't place slope: not pointing at node."
msgstr ""
-#: advtrains/tracks.lua:658
+#: advtrains/tracks.lua
msgid "Can't place slope: space occupied."
msgstr ""
-#: advtrains/tracks.lua:711
+#: advtrains/tracks.lua
msgid "Can't place slope: Not enough slope items left (@1 required)."
msgstr ""
-#: advtrains/tracks.lua:714
+#: advtrains/tracks.lua
msgid "Can't place slope: There's no slope of length @1."
msgstr ""
-#: advtrains/tracks.lua:721
+#: advtrains/tracks.lua
msgid "Can't place slope: no supporting node at upper end."
msgstr ""
-#: advtrains/trainhud.lua:305
+#: advtrains/trainhud.lua
msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
msgstr ""
-#: advtrains/wagons.lua:179
+#: advtrains/wagonprop_tool.lua
+msgid ""
+"Wagon Properties Tool\n"
+"Punch a wagon to view and edit the Wagon Properties"
+msgstr ""
+
+#: advtrains/wagonprop_tool.lua
+msgid "Wagon Properties Tool"
+msgstr ""
+
+#: advtrains/wagonprop_tool.lua
+msgid "Insufficient privileges to use this!"
+msgstr ""
+
+#: advtrains/wagons.lua
msgid "This wagon is owned by @1, you can't destroy it."
msgstr ""
-#: advtrains/wagons.lua:203
+#: advtrains/wagons.lua
msgid "The wagon's inventory is not empty."
msgstr ""
-#: advtrains/wagons.lua:210
+#: advtrains/wagons.lua
msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
msgstr ""
-#: advtrains/wagons.lua:216
+#: advtrains/wagons.lua
msgid ""
"Warning: If you destroy this wagon, you only get some steel back! If you are "
"sure, hold Sneak and left-click the wagon."
msgstr ""
-#: advtrains/wagons.lua:649 advtrains/wagons.lua:850
+#: advtrains/wagons.lua
msgid "Show Inventory"
msgstr ""
-#: advtrains/wagons.lua:652
+#: advtrains/wagons.lua
msgid "Onboard Computer"
msgstr ""
-#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328
+#: advtrains/wagons.lua
msgid "Wagon properties"
msgstr ""
-#: advtrains/wagons.lua:658
+#: advtrains/wagons.lua
msgid "Get off"
msgstr ""
-#: advtrains/wagons.lua:661
+#: advtrains/wagons.lua
msgid "Get off (forced)"
msgstr ""
-#: advtrains/wagons.lua:663
+#: advtrains/wagons.lua
msgid "(Doors closed)"
msgstr ""
-#: advtrains/wagons.lua:692
+#: advtrains/wagons.lua
msgid "This wagon has no seats."
msgstr ""
-#: advtrains/wagons.lua:703
+#: advtrains/wagons.lua
msgid "This wagon is full."
msgstr ""
-#: advtrains/wagons.lua:706
+#: advtrains/wagons.lua
msgid "Doors are closed! (Try holding sneak key!)"
msgstr ""
-#: advtrains/wagons.lua:712
+#: advtrains/wagons.lua
msgid "You can't get on this wagon."
msgstr ""
-#: advtrains/wagons.lua:838
+#: advtrains/wagons.lua
msgid "Select seat:"
msgstr ""
-#: advtrains/wagons.lua:880
+#: advtrains/wagons.lua
+msgid "This Wagon ID"
+msgstr ""
+
+#: advtrains/wagons.lua
msgid "Save wagon properties"
msgstr ""
-#: advtrains/wagons.lua:965
+#: advtrains/wagons.lua
+msgid "Train ID"
+msgstr ""
+
+#: advtrains/wagons.lua
msgid "Text displayed outside on train"
msgstr ""
-#: advtrains/wagons.lua:966
+#: advtrains/wagons.lua
msgid "Text displayed inside train"
msgstr ""
-#: advtrains/wagons.lua:967
+#: advtrains/wagons.lua
msgid "Line"
msgstr ""
-#: advtrains/wagons.lua:968
+#: advtrains/wagons.lua
msgid "Routingcode"
msgstr ""
-#: advtrains/wagons.lua:1241
+#: advtrains/wagons.lua
msgid ""
"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
"off."
msgstr ""
-#: advtrains/wagons.lua:1250
+#: advtrains/wagons.lua
msgid "You are not allowed to access the driver stand."
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:13
+#: advtrains_interlocking/routesetting.lua
+msgid "Route state changed."
+msgstr ""
+
+#: advtrains_interlocking/tsr_rail.lua
msgid "Point speed restriction: @1"
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:14
+#: advtrains_interlocking/tsr_rail.lua
msgid "Set point speed restriction:"
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:30
+#: advtrains_interlocking/tsr_rail.lua
msgid "You are not allowed to configure this track without the @1 privilege."
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:34
-#: advtrains_line_automation/stoprail.lua:31
-#: advtrains_line_automation/stoprail.lua:76
+#: advtrains_interlocking/tsr_rail.lua advtrains_line_automation/stoprail.lua
msgid "You are not allowed to configure this track."
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:64
+#: advtrains_interlocking/tsr_rail.lua
msgid "Point Speed Restriction Track"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:54
+#: advtrains_line_automation/stoprail.lua
msgid "Station Code"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:55
+#: advtrains_line_automation/stoprail.lua
msgid "Station Name"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:56
+#: advtrains_line_automation/stoprail.lua
msgid "Door Delay"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:57
+#: advtrains_line_automation/stoprail.lua
msgid "Dep. Speed"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11
-#: advtrains_train_track/init.lua:156
+#: advtrains_line_automation/stoprail.lua advtrains_train_track/init.lua
msgid "Track"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:59
+#: advtrains_line_automation/stoprail.lua
msgid "Stop Time"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:60
+#: advtrains_line_automation/stoprail.lua
msgid "Door Side"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:62
+#: advtrains_line_automation/stoprail.lua
msgid "Reverse train"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:63
+#: advtrains_line_automation/stoprail.lua
msgid "Kick out passengers"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:97
+#: advtrains_line_automation/stoprail.lua
msgid "Station code \"@1\" already exists and is owned by @2."
msgstr ""
-#: advtrains_line_automation/stoprail.lua:111
+#: advtrains_line_automation/stoprail.lua
msgid "This station is owned by @1. You are not allowed to edit its name."
msgstr ""
-#: advtrains_line_automation/stoprail.lua:221
+#: advtrains_line_automation/stoprail.lua
msgid "Station/Stop Track"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:17
+#: advtrains_luaautomation/active_common.lua
msgid "Unconfigured LuaATC component"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:46
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC Environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:49
+#: advtrains_luaautomation/active_common.lua
msgid "Clear Local Environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:50
+#: advtrains_luaautomation/active_common.lua
msgid "Code"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:64
+#: advtrains_luaautomation/active_common.lua
msgid ""
"You are not allowed to configure this LuaATC component without the @1 "
"privilege."
msgstr ""
-#: advtrains_luaautomation/active_common.lua:94
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC component assigned to environment '@1'"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:96
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC component assigned to an invalid environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:171
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC component with error: @1"
msgstr ""
-#: advtrains_luaautomation/init.lua:13
+#: advtrains_luaautomation/init.lua
msgid ""
"Can place and configure LuaATC components, including execute potentially "
"harmful Lua code"
msgstr ""
-#: advtrains_luaautomation/mesecon_controller.lua:211
+#: advtrains_luaautomation/mesecon_controller.lua
msgid "LuaATC Mesecon Controller"
msgstr ""
-#: advtrains_luaautomation/operation_panel.lua:11
+#: advtrains_luaautomation/operation_panel.lua
msgid "LuaATC Operation Panel"
msgstr ""
-#: advtrains_luaautomation/pcnaming.lua:28
+#: advtrains_luaautomation/pcnaming.lua
msgid ""
"Passive Component Naming Tool\n"
"\n"
"Right-click to name a passive component."
msgstr ""
-#: advtrains_luaautomation/pcnaming.lua:39
+#: advtrains_luaautomation/pcnaming.lua
msgid ""
"You are not allowed to name LuaATC passive components without the @1 "
"privilege."
msgstr ""
-#: advtrains_luaautomation/pcnaming.lua:62
+#: advtrains_luaautomation/pcnaming.lua
msgid "Set name of component (empty to clear)"
msgstr ""
-#: advtrains_train_industrial/init.lua:10
-#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20
-#: advtrains_train_steam/init.lua:91
+#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
msgid "Driver Stand (right)"
msgstr ""
-#: advtrains_train_industrial/init.lua:17
-#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14
-#: advtrains_train_steam/init.lua:85
+#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
msgid "Driver Stand (left)"
msgstr ""
-#: advtrains_train_industrial/init.lua:40
+#: advtrains_train_industrial/init.lua
msgid "Industrial Train Engine"
msgstr ""
-#: advtrains_train_industrial/init.lua:79
+#: advtrains_train_industrial/init.lua
msgid "Big Industrial Train Engine"
msgstr ""
-#: advtrains_train_industrial/init.lua:98
+#: advtrains_train_industrial/init.lua
msgid "Industrial tank wagon"
msgstr ""
-#: advtrains_train_industrial/init.lua:116
+#: advtrains_train_industrial/init.lua
msgid "Industrial wood wagon"
msgstr ""
-#: advtrains_train_japan/init.lua:4
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Inter-Wagon Connection"
msgstr ""
-#: advtrains_train_japan/init.lua:37
+#: advtrains_train_japan/init.lua
msgid "Driver stand"
msgstr ""
-#: advtrains_train_japan/init.lua:101
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Engine"
msgstr ""
-#: advtrains_train_japan/init.lua:176
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Wagon"
msgstr ""
-#: advtrains_train_steam/init.lua:75
+#: advtrains_train_steam/init.lua
msgid "Steam Engine"
msgstr ""
-#: advtrains_train_steam/init.lua:159
+#: advtrains_train_steam/init.lua
msgid "Detailed Steam Engine"
msgstr ""
-#: advtrains_train_steam/init.lua:206
+#: advtrains_train_steam/init.lua
msgid "Passenger Wagon"
msgstr ""
-#: advtrains_train_steam/init.lua:226
+#: advtrains_train_steam/init.lua
msgid "Box Wagon"
msgstr ""
-#: advtrains_train_subway/init.lua:144
+#: advtrains_train_subway/init.lua
msgid "Subway Passenger Wagon"
msgstr ""
-#: advtrains_train_track/init.lua:31
+#: advtrains_train_track/init.lua
msgid "Y-turnout"
msgstr ""
-#: advtrains_train_track/init.lua:49
+#: advtrains_train_track/init.lua
msgid "3-way turnout"
msgstr ""
-#: advtrains_train_track/init.lua:69
+#: advtrains_train_track/init.lua
msgid "Perpendicular Diamond Crossing Track"
msgstr ""
-#: advtrains_train_track/init.lua:91
+#: advtrains_train_track/init.lua
msgid "90+Angle Diamond Crossing Track"
msgstr ""
-#: advtrains_train_track/init.lua:132
+#: advtrains_train_track/init.lua
msgid "Diagonal Diamond Crossing Track"
msgstr ""
-#: advtrains_train_track/init.lua:179
+#: advtrains_train_track/init.lua
msgid "Bumper"
msgstr ""
-#: advtrains_train_track/init.lua:201
+#: advtrains_train_track/init.lua
msgid "ATC controller"
msgstr ""
-#: advtrains_train_track/init.lua:317
+#: advtrains_train_track/init.lua
msgid "Unloading Track"
msgstr ""
-#: advtrains_train_track/init.lua:342
+#: advtrains_train_track/init.lua
msgid "Loading Track"
msgstr ""
-#: advtrains_train_track/init.lua:406
+#: advtrains_train_track/init.lua
msgid "Detector Rail"
msgstr ""
diff --git a/advtrains/po/de.po b/advtrains/po/de.po
index 8821fe3..2d43078 100644
--- a/advtrains/po/de.po
+++ b/advtrains/po/de.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: advtrains\n"
"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
-"POT-Creation-Date: 2023-10-09 11:02+0200\n"
+"POT-Creation-Date: 2024-12-06 21:17+0100\n"
"PO-Revision-Date: 2023-10-09 11:18+0200\n"
"Last-Translator: Y. Wang <yw05@forksworld.de>\n"
"Language-Team: German\n"
@@ -12,11 +12,33 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.3.2\n"
-#: advtrains/atc.lua:109
-msgid "Unconfigured ATC controller"
-msgstr "Nicht konfiguiertes Zugbeeinflussungsgleis"
+#: advtrains/atc.lua
+msgid "ATC Kick command warning: doors are closed."
+msgstr ""
+"Zugbeeinflussung: Wegen geschlossener Türen werden Fahrgäste nicht zum "
+"Ausstieg gezwungen."
+
+#: advtrains/atc.lua
+msgid "ATC Kick command warning: train moving."
+msgstr ""
+"Zugbeeinflussung: Der Zug befindet sich in Bewegung, Fahrgäste werden nicht "
+"zum Ausstieg gezwungen."
-#: advtrains/atc.lua:150
+#: advtrains/atc.lua
+msgid "ATC Reverse command warning: didn't reverse train, train moving."
+msgstr ""
+"Zugbeeinflussung: Der Zug befindet sich in Bewegung und kann nicht umgekehrt "
+"werden."
+
+#: advtrains/atc.lua
+msgid "ATC command parse error: Unknown command: @1"
+msgstr "Zugbeeinflussung: Unbekannter Befehl: @1"
+
+#: advtrains/atc.lua
+msgid "ATC command syntax error: I statement not closed: @1"
+msgstr "Zugbeeinflussung: Unvollständiger I-Befehl: @1"
+
+#: advtrains/atc.lua
msgid ""
"ATC controller, mode @1\n"
"Command: @2"
@@ -24,50 +46,70 @@ msgstr ""
"Zugbeeinflussungsgleis in Betriebsart „@1“\n"
"Befehl: @2"
-#: advtrains/atc.lua:180
+#: advtrains/atc.lua
msgid "Command"
msgstr "Befehl"
-#: advtrains/atc.lua:184
+#: advtrains/atc.lua
msgid "Command (on)"
msgstr "Befehl (wenn aktiviert)"
-#: advtrains/atc.lua:187
+#: advtrains/atc.lua
msgid "Digiline channel"
msgstr "Digiline-Kanal"
-#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65
-#: advtrains_luaautomation/active_common.lua:48
+#: advtrains/atc.lua advtrains_line_automation/stoprail.lua
+#: advtrains_luaautomation/active_common.lua
msgid "Save"
msgstr "Speichern"
-#: advtrains/atc.lua:236
-msgid "ATC Reverse command warning: didn't reverse train, train moving."
+#: advtrains/atc.lua
+msgid "Unconfigured ATC controller"
+msgstr "Nicht konfiguiertes Zugbeeinflussungsgleis"
+
+#: advtrains/copytool.lua
+msgid "Back of train would end up off track, cancelling."
+msgstr "Der hinterer Teil dez Zuges wäre nicht auf dem Gleis."
+
+#: advtrains/copytool.lua
+msgid "No such lua entity."
msgstr ""
-"Zugbeeinflussung: Der Zug befindet sich in Bewegung und kann nicht umgekehrt "
-"werden."
+"Sie zeigen nicht auf einem Objekt, das mit diesem Werkzeug kopiert werden "
+"kann."
-#: advtrains/atc.lua:248
-msgid "ATC Kick command warning: doors are closed."
+#: advtrains/copytool.lua
+msgid "No such train: @1."
+msgstr "Es gibt keinen mit „@1“ identifizierbaren Zug."
+
+#: advtrains/copytool.lua
+msgid "No such wagon: @1."
+msgstr "Es gibt keinen mit „@1“ identifizierbaren Waggon."
+
+#: advtrains/copytool.lua
+msgid "The clipboard couldn't access the metadata. Copy failed."
msgstr ""
-"Zugbeeinflussung: Wegen geschlossener Türen werden Fahrgäste nicht zum "
-"Ausstieg gezwungen."
+"Wegen des fehlgeschlagenen Zugriffs auf die Metadaten konnte der Zug nicht "
+"kopiert werden."
-#: advtrains/atc.lua:252
-msgid "ATC Kick command warning: train moving."
+#: advtrains/copytool.lua
+msgid "The clipboard couldn't access the metadata. Paste failed."
msgstr ""
-"Zugbeeinflussung: Der Zug befindet sich in Bewegung, Fahrgäste werden nicht "
-"zum Ausstieg gezwungen."
+"Wegen des fehlgeschlagenen Zugriffs auf die Metadaten konnte eine Kopie des "
+"Zuges nicht eingefügt werden."
-#: advtrains/atc.lua:322
-msgid "ATC command syntax error: I statement not closed: @1"
-msgstr "Zugbeeinflussung: Unvollständiger I-Befehl: @1"
+#: advtrains/copytool.lua
+msgid "The clipboard is empty."
+msgstr "Das Clipboard ist leer."
-#: advtrains/atc.lua:385
-msgid "ATC command parse error: Unknown command: @1"
-msgstr "Zugbeeinflussung: Unbekannter Befehl: @1"
+#: advtrains/copytool.lua
+msgid "The track you are trying to place the wagon on is not long enough."
+msgstr "Das Gleis, auf dem der Waggon platziert werden woll, ist zu kurz."
-#: advtrains/copytool.lua:8
+#: advtrains/copytool.lua
+msgid "Train copied."
+msgstr "Der Zug wurde Kopiert."
+
+#: advtrains/copytool.lua
msgid ""
"Train copy/paste tool\n"
"\n"
@@ -79,175 +121,149 @@ msgstr ""
"Linksklick: Zug ins Clipboard kopieren\n"
"Right-click: Kopierten Zug einfügen"
-#: advtrains/copytool.lua:29
+#: advtrains/copytool.lua
msgid "You do not have the @1 privilege."
msgstr "Ihnen fehlt das „@1“-Privileg."
-#: advtrains/copytool.lua:41
-msgid "The track you are trying to place the wagon on is not long enough."
-msgstr "Das Gleis, auf dem der Waggon platziert werden woll, ist zu kurz."
-
-#: advtrains/copytool.lua:47
-msgid "The clipboard couldn't access the metadata. Paste failed."
-msgstr ""
-"Wegen des fehlgeschlagenen Zugriffs auf die Metadaten konnte eine Kopie des "
-"Zuges nicht eingefügt werden."
-
-#: advtrains/copytool.lua:52 advtrains/copytool.lua:57
-msgid "The clipboard is empty."
-msgstr "Das Clipboard ist leer."
-
-#: advtrains/copytool.lua:74
-msgid "Back of train would end up off track, cancelling."
-msgstr "Der hinterer Teil dez Zuges wäre nicht auf dem Gleis."
-
-#: advtrains/copytool.lua:92
-msgid "No such lua entity."
-msgstr ""
-"Sie zeigen nicht auf einem Objekt, das mit diesem Werkzeug kopiert werden "
-"kann."
-
-#: advtrains/copytool.lua:98
-msgid "No such wagon: @1."
-msgstr "Es gibt keinen mit „@1“ identifizierbaren Waggon."
-
-#: advtrains/copytool.lua:104
-msgid "No such train: @1."
-msgstr "Es gibt keinen mit „@1“ identifizierbaren Zug."
-
-#: advtrains/copytool.lua:176
-msgid "The clipboard couldn't access the metadata. Copy failed."
-msgstr ""
-"Wegen des fehlgeschlagenen Zugriffs auf die Metadaten konnte der Zug nicht "
-"kopiert werden."
-
-#: advtrains/copytool.lua:180
-msgid "Train copied."
-msgstr "Der Zug wurde Kopiert."
+#: advtrains/couple.lua
+msgid "<No coupler>"
+msgstr "<Keine Kupplung vorhanden>"
-#: advtrains/couple.lua:28
+#: advtrains/couple.lua
msgid "Buffer and Chain Coupler"
msgstr "Schraubenkupplung"
-#: advtrains/couple.lua:29
+#: advtrains/couple.lua
+msgid "Can not couple: The couplers of the trains do not match (@1 and @2)."
+msgstr "Die Kupplungen der Züge passen nicht zueinander (@1 und @2)."
+
+#: advtrains/couple.lua
msgid "Scharfenberg Coupler"
msgstr "Scharfenbergkupplung"
-#: advtrains/couple.lua:185
+#: advtrains/couple.lua
msgid ""
"You are not allowed to couple trains without the train_operator privilege."
msgstr "Sie dürfen ohne das „train_operator“-Privileg keine Züge ankuppeln."
-#: advtrains/couple.lua:329 advtrains/couple.lua:333
-msgid "<No coupler>"
-msgstr "<Keine Kupplung vorhanden>"
-
-#: advtrains/couple.lua:334
-msgid "Can not couple: The couplers of the trains do not match (@1 and @2)."
-msgstr "Die Kupplungen der Züge passen nicht zueinander (@1 und @2)."
-
-#: advtrains/craft_items.lua:3
+#: advtrains/craft_items.lua
msgid "Boiler"
msgstr ""
-#: advtrains/craft_items.lua:9
+#: advtrains/craft_items.lua
+msgid "Chimney"
+msgstr ""
+
+#: advtrains/craft_items.lua
msgid "Driver's cab"
msgstr "Führerstand"
-#: advtrains/craft_items.lua:15
+#: advtrains/craft_items.lua
msgid "Wheel"
msgstr ""
-#: advtrains/craft_items.lua:21
-msgid "Chimney"
-msgstr ""
-
-#: advtrains/misc_nodes.lua:16
-msgid "@1 Platform (low)"
-msgstr "Niedriger @1-Bahnsteig"
+#: advtrains/misc_nodes.lua
+msgid "@1 Platform (45 degree)"
+msgstr "Hoher @1-Bahnsteig (45°)"
-#: advtrains/misc_nodes.lua:33
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (high)"
msgstr "Hoher @1-Bahnsteig"
-#: advtrains/misc_nodes.lua:59
-msgid "@1 Platform (45 degree)"
-msgstr "Hoher @1-Bahnsteig (45°)"
+#: advtrains/misc_nodes.lua
+msgid "@1 Platform (low)"
+msgstr "Niedriger @1-Bahnsteig"
-#: advtrains/misc_nodes.lua:81
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (low, 45 degree)"
msgstr "Niedriger @1-Bahnsteig (45°)"
-#: advtrains/protection.lua:7
-msgid "Can place, remove and operate trains"
+#: advtrains/protection.lua
+msgid "Can operate turnouts and signals in unprotected areas"
msgstr ""
-#: advtrains/protection.lua:12
+#: advtrains/protection.lua
+msgid "Can place and dig tracks in unprotected areas"
+msgstr ""
+
+#: advtrains/protection.lua
msgid ""
"Can place, remove and operate any train, regardless of owner, whitelist, or "
"protection"
msgstr ""
-#: advtrains/protection.lua:18
-msgid "Can place and dig tracks in unprotected areas"
+#: advtrains/protection.lua
+msgid "Can place, remove and operate trains"
msgstr ""
-#: advtrains/protection.lua:24
-msgid "Can operate turnouts and signals in unprotected areas"
-msgstr ""
+#: advtrains/protection.lua
+msgid "You are not allowed to build near tracks at this protected position."
+msgstr "Sie dürfen an geschützten Stellen nicht in der Nähe von Gleisen bauen."
-#: advtrains/protection.lua:148
+#: advtrains/protection.lua
msgid ""
"You are not allowed to build near tracks without the track_builder privilege."
msgstr ""
"Sie dürfen ohne das „track_builder“-Privileg nicht in der Nähe von Gleisen "
"bauen."
-#: advtrains/protection.lua:148
+#: advtrains/protection.lua
+msgid "You are not allowed to build tracks at this protected position."
+msgstr "Sie dürfen an geschützten Stellen kein Gleis bauen."
+
+#: advtrains/protection.lua
msgid ""
"You are not allowed to build tracks without the track_builder privilege."
msgstr "Sie dürfen ohne das „track_builder“-Privileg kein Gleis bauen."
-#: advtrains/protection.lua:153
-msgid "You are not allowed to build near tracks at this protected position."
-msgstr "Sie dürfen an geschützten Stellen nicht in der Nähe von Gleisen bauen."
-
-#: advtrains/protection.lua:153
-msgid "You are not allowed to build tracks at this protected position."
-msgstr "Sie dürfen an geschützten Stellen kein Gleis bauen."
-
-#: advtrains/protection.lua:184
+#: advtrains/protection.lua
msgid ""
"You are not allowed to operate turnouts and signals without the "
"railway_operator privilege."
msgstr ""
"Sie dürfen ohne das „railway_operator“-Privileg keine Bahnanlage operieren."
-#: advtrains/signals.lua:63
+#: advtrains/signals.lua
+msgid "Andrew's Cross"
+msgstr "Andreaskreuz"
+
+#: advtrains/signals.lua
msgid "Lampless Signal"
msgstr "Mechanisches Signal"
-#: advtrains/signals.lua:127
+#: advtrains/signals.lua
msgid "Signal"
msgstr "Lichtsignal"
-#: advtrains/signals.lua:191
+#: advtrains/signals.lua
msgid "Wallmounted Signal (left)"
msgstr "An der linken Seite montiertes Signal"
-#: advtrains/signals.lua:192
+#: advtrains/signals.lua
msgid "Wallmounted Signal (right)"
msgstr "An der rechten Seite montiertes Signal"
-#: advtrains/signals.lua:193
+#: advtrains/signals.lua
msgid "Wallmounted Signal (top)"
msgstr "An der Decke montiertes Signal"
-#: advtrains/signals.lua:281 advtrains/signals.lua:322
-msgid "Andrew's Cross"
-msgstr "Andreaskreuz"
+#: advtrains/trackplacer.lua
+msgid "This node can't be changed using the trackworker."
+msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug bearbeitet werden."
-#: advtrains/trackplacer.lua:313
+#: advtrains/trackplacer.lua
+msgid "This node can't be rotated using the trackworker."
+msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug gedreht werden."
+
+#: advtrains/trackplacer.lua
+msgid "This track can not be changed."
+msgstr "Dieses Gleis kann nicht geändert werden."
+
+#: advtrains/trackplacer.lua
+msgid "This track can not be rotated."
+msgstr "Dieses Gleis kann nicht gedreht werden."
+
+#: advtrains/trackplacer.lua
msgid ""
"Track Worker Tool\n"
"\n"
@@ -259,278 +275,287 @@ msgstr ""
"Linksklick: Gleistyp ändern\n"
"Rechtsklick: Objekt drehen"
-#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377
-msgid "This node can't be rotated using the trackworker."
-msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug gedreht werden."
-
-#: advtrains/trackplacer.lua:350
-msgid "This track can not be rotated."
-msgstr "Dieses Gleis kann nicht gedreht werden."
-
-#: advtrains/trackplacer.lua:404
-msgid "This node can't be changed using the trackworker."
-msgstr "Dieser Block kann nicht mit dem Gleiswerkzeug bearbeitet werden."
-
-#: advtrains/trackplacer.lua:414
-msgid "This track can not be changed."
-msgstr "Dieses Gleis kann nicht geändert werden."
-
-#: advtrains/tracks.lua:449
-msgid "This track can not be removed."
-msgstr "Dieses Gleis kann nicht entfernt werden."
-
-#: advtrains/tracks.lua:616
-msgid "Position is occupied by a train."
-msgstr "Ein Zug steht an dieser Position."
-
-#: advtrains/tracks.lua:622
-msgid "There's a Track Circuit Break here."
-msgstr "Hier ist eine Gleisabschnittsgrenze (TCB)."
-
-#: advtrains/tracks.lua:626
-msgid "There's a Signal Influence Point here."
-msgstr "Hier ist ein Signal-Beeinflussungspunkt."
-
-#: advtrains/tracks.lua:637
+#: advtrains/tracks.lua
msgid "@1 Slope"
msgstr "@1 Steigung"
-#: advtrains/tracks.lua:648 advtrains/tracks.lua:653
-msgid "Can't place slope: not pointing at node."
-msgstr "Es kann nicht platziert werden: Sie zeigen nicht auf einem Block."
-
-#: advtrains/tracks.lua:658
-msgid "Can't place slope: space occupied."
-msgstr "Es kann nicht platziert werden: Diese Position ist besetzt."
-
-#: advtrains/tracks.lua:711
+#: advtrains/tracks.lua
msgid "Can't place slope: Not enough slope items left (@1 required)."
msgstr ""
"Es kann nicht platziert werden: Sie haben nicht genug Steigungsblöcke, es "
"werden insgesamt @1 benötigt."
-#: advtrains/tracks.lua:714
+#: advtrains/tracks.lua
msgid "Can't place slope: There's no slope of length @1."
msgstr ""
"Es kann nicht platziert werden: die Steigung der Länge @1 ist nicht "
"definiert."
-#: advtrains/tracks.lua:721
+#: advtrains/tracks.lua
msgid "Can't place slope: no supporting node at upper end."
msgstr ""
"Es kann nicht platziert werden: es gibt keinen unterstützenden Block am Ende "
"der Steigung."
-#: advtrains/trainhud.lua:305
+#: advtrains/tracks.lua
+msgid "Can't place slope: not pointing at node."
+msgstr "Es kann nicht platziert werden: Sie zeigen nicht auf einem Block."
+
+#: advtrains/tracks.lua
+msgid "Can't place slope: space occupied."
+msgstr "Es kann nicht platziert werden: Diese Position ist besetzt."
+
+#: advtrains/tracks.lua
+msgid "Position is occupied by a train."
+msgstr "Ein Zug steht an dieser Position."
+
+#: advtrains/tracks.lua
+msgid "There's a Signal Influence Point here."
+msgstr "Hier ist ein Signal-Beeinflussungspunkt."
+
+#: advtrains/tracks.lua
+msgid "There's a Track Circuit Break here."
+msgstr "Hier ist eine Gleisabschnittsgrenze (TCB)."
+
+#: advtrains/tracks.lua
+msgid "This track can not be removed."
+msgstr "Dieses Gleis kann nicht entfernt werden."
+
+#: advtrains/trainhud.lua
msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
msgstr ""
-#: advtrains/wagons.lua:179
-msgid "This wagon is owned by @1, you can't destroy it."
-msgstr "Dieser Waggon gehört @1, Sie dürfen ihn nicht abbauen."
-
-#: advtrains/wagons.lua:203
-msgid "The wagon's inventory is not empty."
-msgstr "Das Inventar dieses Waggons ist nicht leer."
+#: advtrains/wagonprop_tool.lua
+msgid "Insufficient privileges to use this!"
+msgstr ""
-#: advtrains/wagons.lua:210
-msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
-msgstr "Der Waggon muss abgekoppelt sein, damit Sie ihn abbauen können."
+#: advtrains/wagonprop_tool.lua
+#, fuzzy
+msgid "Wagon Properties Tool"
+msgstr "Waggon-Einstellungen"
-#: advtrains/wagons.lua:216
+#: advtrains/wagonprop_tool.lua
msgid ""
-"Warning: If you destroy this wagon, you only get some steel back! If you are "
-"sure, hold Sneak and left-click the wagon."
+"Wagon Properties Tool\n"
+"Punch a wagon to view and edit the Wagon Properties"
msgstr ""
-"Warnung: Durch den Abbau des Waggons erhalten Sie nur etwas Stahl zurück. "
-"Nutzen Sie Schleichen+Linksklick, um dem Waggon abzubauen."
-#: advtrains/wagons.lua:649 advtrains/wagons.lua:850
-msgid "Show Inventory"
-msgstr "Inventar Zeigen"
+#: advtrains/wagons.lua
+msgid "(Doors closed)"
+msgstr "(Türen geschlossen)"
-#: advtrains/wagons.lua:652
-msgid "Onboard Computer"
-msgstr ""
+#: advtrains/wagons.lua
+msgid "Doors are closed! (Try holding sneak key!)"
+msgstr "Die Türen sind geschlossen."
-#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328
-msgid "Wagon properties"
-msgstr "Waggon-Einstellungen"
+#: advtrains/wagons.lua
+msgid ""
+"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
+"off."
+msgstr ""
+"Die Türen sind geschlossen. Nutzen Sie Schleichen+Rechtsklick, um trotz "
+"geschlossener Türen auszusteigen."
-#: advtrains/wagons.lua:658
+#: advtrains/wagons.lua
msgid "Get off"
msgstr "Aussteigen"
-#: advtrains/wagons.lua:661
+#: advtrains/wagons.lua
msgid "Get off (forced)"
msgstr "Ausstieg zwingen"
-#: advtrains/wagons.lua:663
-msgid "(Doors closed)"
-msgstr "(Türen geschlossen)"
-
-#: advtrains/wagons.lua:692
-msgid "This wagon has no seats."
-msgstr "In diesem Waggon ist kein Sitzplatz vorhanden."
+#: advtrains/wagons.lua
+msgid "Line"
+msgstr "Linie"
-#: advtrains/wagons.lua:703
-msgid "This wagon is full."
-msgstr "Der Waggon ist voll."
+#: advtrains/wagons.lua
+msgid "Onboard Computer"
+msgstr ""
-#: advtrains/wagons.lua:706
-msgid "Doors are closed! (Try holding sneak key!)"
-msgstr "Die Türen sind geschlossen."
+#: advtrains/wagons.lua
+msgid "Routingcode"
+msgstr ""
-#: advtrains/wagons.lua:712
-msgid "You can't get on this wagon."
-msgstr "Sie können nicht in diesen Waggon einsteigen."
+#: advtrains/wagons.lua
+msgid "Save wagon properties"
+msgstr "Waggon-Einstellungen speichern"
-#: advtrains/wagons.lua:838
+#: advtrains/wagons.lua
msgid "Select seat:"
msgstr "Wählen Sie einen Sitzplatz aus:"
-#: advtrains/wagons.lua:880
-msgid "Save wagon properties"
-msgstr "Waggon-Einstellungen speichern"
+#: advtrains/wagons.lua
+msgid "Show Inventory"
+msgstr "Inventar Zeigen"
-#: advtrains/wagons.lua:965
+#: advtrains/wagons.lua
+msgid "Text displayed inside train"
+msgstr "Innere Anzeige"
+
+#: advtrains/wagons.lua
msgid "Text displayed outside on train"
msgstr "Äußere Anzeige"
-#: advtrains/wagons.lua:966
-msgid "Text displayed inside train"
-msgstr "Innere Anzeige"
+#: advtrains/wagons.lua
+msgid "The wagon's inventory is not empty."
+msgstr "Das Inventar dieses Waggons ist nicht leer."
-#: advtrains/wagons.lua:967
-msgid "Line"
-msgstr "Linie"
+#: advtrains/wagons.lua
+#, fuzzy
+msgid "This Wagon ID"
+msgstr "Der Waggon ist voll."
-#: advtrains/wagons.lua:968
-msgid "Routingcode"
+#: advtrains/wagons.lua
+msgid "This wagon has no seats."
+msgstr "In diesem Waggon ist kein Sitzplatz vorhanden."
+
+#: advtrains/wagons.lua
+msgid "This wagon is full."
+msgstr "Der Waggon ist voll."
+
+#: advtrains/wagons.lua
+msgid "This wagon is owned by @1, you can't destroy it."
+msgstr "Dieser Waggon gehört @1, Sie dürfen ihn nicht abbauen."
+
+#: advtrains/wagons.lua
+msgid "Train ID"
msgstr ""
-#: advtrains/wagons.lua:1241
+#: advtrains/wagons.lua
+msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
+msgstr "Der Waggon muss abgekoppelt sein, damit Sie ihn abbauen können."
+
+#: advtrains/wagons.lua
+msgid "Wagon properties"
+msgstr "Waggon-Einstellungen"
+
+#: advtrains/wagons.lua
msgid ""
-"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
-"off."
+"Warning: If you destroy this wagon, you only get some steel back! If you are "
+"sure, hold Sneak and left-click the wagon."
msgstr ""
-"Die Türen sind geschlossen. Nutzen Sie Schleichen+Rechtsklick, um trotz "
-"geschlossener Türen auszusteigen."
+"Warnung: Durch den Abbau des Waggons erhalten Sie nur etwas Stahl zurück. "
+"Nutzen Sie Schleichen+Linksklick, um dem Waggon abzubauen."
-#: advtrains/wagons.lua:1250
+#: advtrains/wagons.lua
msgid "You are not allowed to access the driver stand."
msgstr "Sie haben keinen Zugang zum Führerstand."
-#: advtrains_interlocking/tsr_rail.lua:13
+#: advtrains/wagons.lua
+msgid "You can't get on this wagon."
+msgstr "Sie können nicht in diesen Waggon einsteigen."
+
+#: advtrains_interlocking/routesetting.lua
+msgid "Route state changed."
+msgstr ""
+
+#: advtrains_interlocking/tsr_rail.lua
+msgid "Point Speed Restriction Track"
+msgstr "Geschwindigkeitskontrollgleis"
+
+#: advtrains_interlocking/tsr_rail.lua
msgid "Point speed restriction: @1"
msgstr "Geschwindigkeitskontrolle: @1"
-#: advtrains_interlocking/tsr_rail.lua:14
+#: advtrains_interlocking/tsr_rail.lua
msgid "Set point speed restriction:"
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:30
+#: advtrains_interlocking/tsr_rail.lua
msgid "You are not allowed to configure this track without the @1 privilege."
msgstr "Sie dürfen ohne das „@1“-Privileg dieses Gleis nicht konfigurieren."
-#: advtrains_interlocking/tsr_rail.lua:34
-#: advtrains_line_automation/stoprail.lua:31
-#: advtrains_line_automation/stoprail.lua:76
+#: advtrains_interlocking/tsr_rail.lua advtrains_line_automation/stoprail.lua
msgid "You are not allowed to configure this track."
msgstr "Sie dürfen dieses Gleis nicht konfigurieren."
-#: advtrains_interlocking/tsr_rail.lua:64
-msgid "Point Speed Restriction Track"
-msgstr "Geschwindigkeitskontrollgleis"
-
-#: advtrains_line_automation/stoprail.lua:54
-msgid "Station Code"
-msgstr "Kennzeichen der Haltestelle"
-
-#: advtrains_line_automation/stoprail.lua:55
-msgid "Station Name"
-msgstr "Name der Haltestelle"
-
-#: advtrains_line_automation/stoprail.lua:56
-msgid "Door Delay"
-msgstr "Zeit für die Türschließung"
-
-#: advtrains_line_automation/stoprail.lua:57
+#: advtrains_line_automation/stoprail.lua
msgid "Dep. Speed"
msgstr "Zielgeschwindigkeit bei Abfahrt"
-#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11
-#: advtrains_train_track/init.lua:156
-msgid "Track"
-msgstr "Gleis"
-
-#: advtrains_line_automation/stoprail.lua:59
-msgid "Stop Time"
-msgstr "Wartezeit"
+#: advtrains_line_automation/stoprail.lua
+msgid "Door Delay"
+msgstr "Zeit für die Türschließung"
-#: advtrains_line_automation/stoprail.lua:60
+#: advtrains_line_automation/stoprail.lua
msgid "Door Side"
msgstr "Türseite"
-#: advtrains_line_automation/stoprail.lua:62
+#: advtrains_line_automation/stoprail.lua
+msgid "Kick out passengers"
+msgstr "Fahrgäste zum Ausstieg zwingen"
+
+#: advtrains_line_automation/stoprail.lua
msgid "Reverse train"
msgstr "Zug Umkehren"
-#: advtrains_line_automation/stoprail.lua:63
-msgid "Kick out passengers"
-msgstr "Fahrgäste zum Ausstieg zwingen"
+#: advtrains_line_automation/stoprail.lua
+msgid "Station Code"
+msgstr "Kennzeichen der Haltestelle"
+
+#: advtrains_line_automation/stoprail.lua
+msgid "Station Name"
+msgstr "Name der Haltestelle"
-#: advtrains_line_automation/stoprail.lua:97
+#: advtrains_line_automation/stoprail.lua
msgid "Station code \"@1\" already exists and is owned by @2."
msgstr ""
"Die Haltestelle mit dem Kennzeichen „@1“ ist bereits vorhanden und wird von "
"@2 verwaltet."
-#: advtrains_line_automation/stoprail.lua:111
-msgid "This station is owned by @1. You are not allowed to edit its name."
-msgstr ""
-"Diese Haltestelle wird von @1 verwaltet. Sie dürfen sie nicht umbenennen."
-
-#: advtrains_line_automation/stoprail.lua:221
+#: advtrains_line_automation/stoprail.lua
msgid "Station/Stop Track"
msgstr "Gleis zur Kennzeichnung einer Haltestelle"
-#: advtrains_luaautomation/active_common.lua:17
-msgid "Unconfigured LuaATC component"
-msgstr "Nicht konfiguierter LuaATC-Bauteil"
+#: advtrains_line_automation/stoprail.lua
+msgid "Stop Time"
+msgstr "Wartezeit"
-#: advtrains_luaautomation/active_common.lua:46
-msgid "LuaATC Environment"
+#: advtrains_line_automation/stoprail.lua
+msgid "This station is owned by @1. You are not allowed to edit its name."
msgstr ""
+"Diese Haltestelle wird von @1 verwaltet. Sie dürfen sie nicht umbenennen."
+
+#: advtrains_line_automation/stoprail.lua advtrains_train_track/init.lua
+msgid "Track"
+msgstr "Gleis"
-#: advtrains_luaautomation/active_common.lua:49
+#: advtrains_luaautomation/active_common.lua
msgid "Clear Local Environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:50
+#: advtrains_luaautomation/active_common.lua
msgid "Code"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:64
-msgid ""
-"You are not allowed to configure this LuaATC component without the @1 "
-"privilege."
+#: advtrains_luaautomation/active_common.lua
+msgid "LuaATC Environment"
msgstr ""
-"Sie dürfen ohne das „@1“-Privileg diesen LuaATC-Bauteil nicht konfigurieren."
-#: advtrains_luaautomation/active_common.lua:94
-msgid "LuaATC component assigned to environment '@1'"
+#: advtrains_luaautomation/active_common.lua
+msgid "LuaATC component assigned to an invalid environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:96
-msgid "LuaATC component assigned to an invalid environment"
+#: advtrains_luaautomation/active_common.lua
+msgid "LuaATC component assigned to environment '@1'"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:171
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC component with error: @1"
msgstr "LuaATC-Bauteil mit Fehlermeldung: @1"
-#: advtrains_luaautomation/init.lua:13
+#: advtrains_luaautomation/active_common.lua
+msgid "Unconfigured LuaATC component"
+msgstr "Nicht konfiguierter LuaATC-Bauteil"
+
+#: advtrains_luaautomation/active_common.lua
+msgid ""
+"You are not allowed to configure this LuaATC component without the @1 "
+"privilege."
+msgstr ""
+"Sie dürfen ohne das „@1“-Privileg diesen LuaATC-Bauteil nicht konfigurieren."
+
+#: advtrains_luaautomation/init.lua
msgid ""
"Can place and configure LuaATC components, including execute potentially "
"harmful Lua code"
@@ -538,15 +563,15 @@ msgstr ""
"Kann LuaATC-Bauteile platzieren und konfigurieren (auch evtl. schädliche "
"Programme ausführen)"
-#: advtrains_luaautomation/mesecon_controller.lua:211
+#: advtrains_luaautomation/mesecon_controller.lua
msgid "LuaATC Mesecon Controller"
msgstr ""
-#: advtrains_luaautomation/operation_panel.lua:11
+#: advtrains_luaautomation/operation_panel.lua
msgid "LuaATC Operation Panel"
msgstr ""
-#: advtrains_luaautomation/pcnaming.lua:28
+#: advtrains_luaautomation/pcnaming.lua
msgid ""
"Passive Component Naming Tool\n"
"\n"
@@ -556,119 +581,115 @@ msgstr ""
"\n"
"Rechtsklick zur Benennung der passiven Komponente."
-#: advtrains_luaautomation/pcnaming.lua:39
+#: advtrains_luaautomation/pcnaming.lua
+msgid "Set name of component (empty to clear)"
+msgstr ""
+
+#: advtrains_luaautomation/pcnaming.lua
msgid ""
"You are not allowed to name LuaATC passive components without the @1 "
"privilege."
msgstr "Sie dürfen ohne das „@1“ keinen passiven LuaATC-Bauteil benennen."
-#: advtrains_luaautomation/pcnaming.lua:62
-msgid "Set name of component (empty to clear)"
-msgstr ""
-
-#: advtrains_train_industrial/init.lua:10
-#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20
-#: advtrains_train_steam/init.lua:91
-msgid "Driver Stand (right)"
-msgstr "Führerstand Rechts"
+#: advtrains_train_industrial/init.lua
+msgid "Big Industrial Train Engine"
+msgstr "Große Industrielle Lokomotive"
-#: advtrains_train_industrial/init.lua:17
-#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14
-#: advtrains_train_steam/init.lua:85
+#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
msgid "Driver Stand (left)"
msgstr "Führerstand Links"
-#: advtrains_train_industrial/init.lua:40
+#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
+msgid "Driver Stand (right)"
+msgstr "Führerstand Rechts"
+
+#: advtrains_train_industrial/init.lua
msgid "Industrial Train Engine"
msgstr "Industrielle Lokomotive"
-#: advtrains_train_industrial/init.lua:79
-msgid "Big Industrial Train Engine"
-msgstr "Große Industrielle Lokomotive"
-
-#: advtrains_train_industrial/init.lua:98
+#: advtrains_train_industrial/init.lua
msgid "Industrial tank wagon"
msgstr "Tankwaggon"
-#: advtrains_train_industrial/init.lua:116
+#: advtrains_train_industrial/init.lua
msgid "Industrial wood wagon"
msgstr "Holztransportwaggon"
-#: advtrains_train_japan/init.lua:4
-msgid "Japanese Train Inter-Wagon Connection"
-msgstr "Waggonzwischenverbindung Japanischer Personenzüge"
-
-#: advtrains_train_japan/init.lua:37
+#: advtrains_train_japan/init.lua
msgid "Driver stand"
msgstr "Führerstand"
-#: advtrains_train_japan/init.lua:101
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Engine"
msgstr "Japanische Personenzug-Lokomotive"
-#: advtrains_train_japan/init.lua:176
+#: advtrains_train_japan/init.lua
+msgid "Japanese Train Inter-Wagon Connection"
+msgstr "Waggonzwischenverbindung Japanischer Personenzüge"
+
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Wagon"
msgstr "Japanischer Personenzug-Passagierwaggon"
-#: advtrains_train_steam/init.lua:75
-msgid "Steam Engine"
-msgstr "Dampflokomotive"
+#: advtrains_train_steam/init.lua
+msgid "Box Wagon"
+msgstr "Güterwaggon"
-#: advtrains_train_steam/init.lua:159
+#: advtrains_train_steam/init.lua
msgid "Detailed Steam Engine"
msgstr "Detaillierte Dampflokomotive"
-#: advtrains_train_steam/init.lua:206
+#: advtrains_train_steam/init.lua
msgid "Passenger Wagon"
msgstr "Passagierwaggon"
-#: advtrains_train_steam/init.lua:226
-msgid "Box Wagon"
-msgstr "Güterwaggon"
+#: advtrains_train_steam/init.lua
+msgid "Steam Engine"
+msgstr "Dampflokomotive"
-#: advtrains_train_subway/init.lua:144
+#: advtrains_train_subway/init.lua
msgid "Subway Passenger Wagon"
msgstr "U-Bahn-Waggon"
-#: advtrains_train_track/init.lua:31
-msgid "Y-turnout"
-msgstr "Y-Weiche"
-
-#: advtrains_train_track/init.lua:49
+#: advtrains_train_track/init.lua
msgid "3-way turnout"
msgstr "Dreiwegweiche"
-#: advtrains_train_track/init.lua:69
-msgid "Perpendicular Diamond Crossing Track"
-msgstr "Kreuzung mit zueinander orthogonalen Gleisen"
-
-#: advtrains_train_track/init.lua:91
+#: advtrains_train_track/init.lua
msgid "90+Angle Diamond Crossing Track"
msgstr "Kreuzung mit einem achsenparallelen Gleis"
-#: advtrains_train_track/init.lua:132
-msgid "Diagonal Diamond Crossing Track"
-msgstr "Diagonale Gleiskreuzung"
+#: advtrains_train_track/init.lua
+msgid "ATC controller"
+msgstr "Zugbeeinflussungsgleis"
-#: advtrains_train_track/init.lua:179
+#: advtrains_train_track/init.lua
msgid "Bumper"
msgstr "Prellbock"
-#: advtrains_train_track/init.lua:201
-msgid "ATC controller"
-msgstr "Zugbeeinflussungsgleis"
+#: advtrains_train_track/init.lua
+msgid "Detector Rail"
+msgstr "Detektorgleis"
-#: advtrains_train_track/init.lua:317
-msgid "Unloading Track"
-msgstr "Abladungsgleis"
+#: advtrains_train_track/init.lua
+msgid "Diagonal Diamond Crossing Track"
+msgstr "Diagonale Gleiskreuzung"
-#: advtrains_train_track/init.lua:342
+#: advtrains_train_track/init.lua
msgid "Loading Track"
msgstr "Beladungsgleis"
-#: advtrains_train_track/init.lua:406
-msgid "Detector Rail"
-msgstr "Detektorgleis"
+#: advtrains_train_track/init.lua
+msgid "Perpendicular Diamond Crossing Track"
+msgstr "Kreuzung mit zueinander orthogonalen Gleisen"
+
+#: advtrains_train_track/init.lua
+msgid "Unloading Track"
+msgstr "Abladungsgleis"
+
+#: advtrains_train_track/init.lua
+msgid "Y-turnout"
+msgstr "Y-Weiche"
#~ msgid ""
#~ "ATC controller, mode @1\n"
diff --git a/advtrains/po/fr.po b/advtrains/po/fr.po
index 3cb68b0..6404583 100644
--- a/advtrains/po/fr.po
+++ b/advtrains/po/fr.po
@@ -2,20 +2,38 @@ msgid ""
msgstr ""
"Project-Id-Version: advtrains\n"
"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
-"POT-Creation-Date: 2023-10-09 11:02+0200\n"
-"PO-Revision-Date: 2022-07-05 10:11+0200\n"
+"POT-Creation-Date: 2024-12-06 21:17+0100\n"
+"PO-Revision-Date: 2024-11-02 21:31+0100\n"
"Last-Translator: Tanavit <tanavit@posto.ovh>\n"
"Language-Team: French\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 2.4.2\n"
-#: advtrains/atc.lua:109
-msgid "Unconfigured ATC controller"
-msgstr "Controlleur ATC, non-configuré "
+#: advtrains/atc.lua
+msgid "ATC Kick command warning: doors are closed."
+msgstr "Avertissement commande ATC Éjecter : portes closes."
+
+#: advtrains/atc.lua
+msgid "ATC Kick command warning: train moving."
+msgstr "Avertissement commande ATC Éjecter : train en mouvement."
+
+#: advtrains/atc.lua
+msgid "ATC Reverse command warning: didn't reverse train, train moving."
+msgstr ""
+"Attention : Commande ATC de renversement impossible car le train se déplace."
+
+#: advtrains/atc.lua
+msgid "ATC command parse error: Unknown command: @1"
+msgstr "Erreur d'analyse de commande ATC : Commande inconnue : @1"
+
+#: advtrains/atc.lua
+msgid "ATC command syntax error: I statement not closed: @1"
+msgstr "Erreur de syntaxe de commande ATC : instruction \"I\" incomplète : @1"
-#: advtrains/atc.lua:150
+#: advtrains/atc.lua
msgid ""
"ATC controller, mode @1\n"
"Command: @2"
@@ -23,46 +41,64 @@ msgstr ""
"Controlleur ATC, mode @1\n"
"Commande : @2"
-#: advtrains/atc.lua:180
+#: advtrains/atc.lua
msgid "Command"
msgstr "Commande"
-#: advtrains/atc.lua:184
+#: advtrains/atc.lua
msgid "Command (on)"
-msgstr "Commande (marche) "
+msgstr "Commande (marche)"
-#: advtrains/atc.lua:187
+#: advtrains/atc.lua
msgid "Digiline channel"
msgstr "Canal Digiline"
-#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65
-#: advtrains_luaautomation/active_common.lua:48
+#: advtrains/atc.lua advtrains_line_automation/stoprail.lua
+#: advtrains_luaautomation/active_common.lua
msgid "Save"
msgstr "Sauvegarder"
-#: advtrains/atc.lua:236
-#, fuzzy
-msgid "ATC Reverse command warning: didn't reverse train, train moving."
-msgstr ""
-"Attention : Commande ATC de renversement impossible car le train se déplace !"
+#: advtrains/atc.lua
+msgid "Unconfigured ATC controller"
+msgstr "Controlleur ATC, non-configuré"
-#: advtrains/atc.lua:248
-msgid "ATC Kick command warning: doors are closed."
-msgstr ""
+#: advtrains/copytool.lua
+msgid "Back of train would end up off track, cancelling."
+msgstr "La fin du train serait hors voie : annulation."
-#: advtrains/atc.lua:252
-msgid "ATC Kick command warning: train moving."
-msgstr ""
+#: advtrains/copytool.lua
+msgid "No such lua entity."
+msgstr "Pas de telle entité lua."
-#: advtrains/atc.lua:322
-msgid "ATC command syntax error: I statement not closed: @1"
-msgstr "Erreur de syntaxe de commande ATC : instruction \"I\" incomplète : @1"
+#: advtrains/copytool.lua
+msgid "No such train: @1."
+msgstr "Pas de tel train : @1."
-#: advtrains/atc.lua:385
-msgid "ATC command parse error: Unknown command: @1"
-msgstr "Erreur d'analyse de commande ATC : Commande inconnue : @1"
+#: advtrains/copytool.lua
+msgid "No such wagon: @1."
+msgstr "Pas de tel wagon : @1."
+
+#: advtrains/copytool.lua
+msgid "The clipboard couldn't access the metadata. Copy failed."
+msgstr "Le presse-papier ne peut accéder aux métadonnées. Échec de la copie."
+
+#: advtrains/copytool.lua
+msgid "The clipboard couldn't access the metadata. Paste failed."
+msgstr "Le presse-papier ne peut accéder aux métadonnées. Échec du collage."
+
+#: advtrains/copytool.lua
+msgid "The clipboard is empty."
+msgstr "Le presse-papier est vide."
+
+#: advtrains/copytool.lua
+msgid "The track you are trying to place the wagon on is not long enough."
+msgstr "La voie sur laquelle vous tentez de placer le wagon est trop courte."
+
+#: advtrains/copytool.lua
+msgid "Train copied."
+msgstr "Train copié."
-#: advtrains/copytool.lua:8
+#: advtrains/copytool.lua
msgid ""
"Train copy/paste tool\n"
"\n"
@@ -75,144 +111,113 @@ msgstr ""
"\n"
"Clic-Droit : collage"
-#: advtrains/copytool.lua:29
+#: advtrains/copytool.lua
msgid "You do not have the @1 privilege."
msgstr "Vous ne possédez pas le privilège \"@1\"."
-#: advtrains/copytool.lua:41
-#, fuzzy
-msgid "The track you are trying to place the wagon on is not long enough."
-msgstr "La voie sur laquelle vous tentez de placer le wagon est trop courte !"
-
-#: advtrains/copytool.lua:47
-msgid "The clipboard couldn't access the metadata. Paste failed."
-msgstr "Le presse-papier ne peut accéder aux métadonnées. Échec du collage."
-
-#: advtrains/copytool.lua:52 advtrains/copytool.lua:57
-msgid "The clipboard is empty."
-msgstr "Le presse-papier est vide."
-
-#: advtrains/copytool.lua:74
-msgid "Back of train would end up off track, cancelling."
-msgstr "La fin du train serait hors voie : annulation."
-
-#: advtrains/copytool.lua:92
-msgid "No such lua entity."
-msgstr "Pas de telle entité lua."
-
-#: advtrains/copytool.lua:98
-msgid "No such wagon: @1."
-msgstr "Pas de tel wagon : @1."
-
-#: advtrains/copytool.lua:104
-msgid "No such train: @1."
-msgstr "Pas de tel train : @1."
-
-#: advtrains/copytool.lua:176
-msgid "The clipboard couldn't access the metadata. Copy failed."
-msgstr "Le presse-papier ne peut accéder aux métadonnées. Échec de la copie."
-
-#: advtrains/copytool.lua:180
-msgid "Train copied."
-msgstr "Train copié."
+#: advtrains/couple.lua
+msgid "<No coupler>"
+msgstr "<Pas de coupleur>"
-#: advtrains/couple.lua:28
+#: advtrains/couple.lua
msgid "Buffer and Chain Coupler"
msgstr "Attelage à tampon et vis"
-#: advtrains/couple.lua:29
+#: advtrains/couple.lua
+msgid "Can not couple: The couplers of the trains do not match (@1 and @2)."
+msgstr ""
+"Accouplement impossible: les attelages des trains ne concordent pas (@1 et "
+"@2)."
+
+#: advtrains/couple.lua
msgid "Scharfenberg Coupler"
msgstr "Attelage Scharfenberg"
-#: advtrains/couple.lua:185
+#: advtrains/couple.lua
msgid ""
"You are not allowed to couple trains without the train_operator privilege."
msgstr ""
+"Vous n'êtes pas autorisé à coupler des trains sans le privilège "
+"\"train_operator\"."
-#: advtrains/couple.lua:329 advtrains/couple.lua:333
-msgid "<No coupler>"
-msgstr ""
-
-#: advtrains/couple.lua:334
-msgid "Can not couple: The couplers of the trains do not match (@1 and @2)."
-msgstr ""
-"Accouplement impossible: les attelages des trains ne concordent pas (@1 et "
-"@2)."
-
-#: advtrains/craft_items.lua:3
+#: advtrains/craft_items.lua
msgid "Boiler"
msgstr "Chaudière à vapeur"
-#: advtrains/craft_items.lua:9
+#: advtrains/craft_items.lua
+msgid "Chimney"
+msgstr "Cheminée"
+
+#: advtrains/craft_items.lua
msgid "Driver's cab"
msgstr "Cabine de pilotage"
-#: advtrains/craft_items.lua:15
+#: advtrains/craft_items.lua
msgid "Wheel"
msgstr "Roue"
-#: advtrains/craft_items.lua:21
-msgid "Chimney"
-msgstr "Cheminée"
-
-#: advtrains/misc_nodes.lua:16
-msgid "@1 Platform (low)"
-msgstr "Quai @1 (bas)"
+#: advtrains/misc_nodes.lua
+msgid "@1 Platform (45 degree)"
+msgstr "Quai @1 (haut, 45°)"
-#: advtrains/misc_nodes.lua:33
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (high)"
msgstr "Quai @1 (haut)"
-#: advtrains/misc_nodes.lua:59
-msgid "@1 Platform (45 degree)"
-msgstr "Quai @1 (haut, 45°)"
+#: advtrains/misc_nodes.lua
+msgid "@1 Platform (low)"
+msgstr "Quai @1 (bas)"
-#: advtrains/misc_nodes.lua:81
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (low, 45 degree)"
msgstr "Quai @1 (bas, 45°)"
-#: advtrains/protection.lua:7
-msgid "Can place, remove and operate trains"
+#: advtrains/protection.lua
+msgid "Can operate turnouts and signals in unprotected areas"
msgstr ""
+"Possibilité d'opérer des embranchements et signaux dans les zones non "
+"protégées"
+
+#: advtrains/protection.lua
+msgid "Can place and dig tracks in unprotected areas"
+msgstr "Possibilité de poser ou retirer des voies dans les zones non protégées"
-#: advtrains/protection.lua:12
+#: advtrains/protection.lua
msgid ""
"Can place, remove and operate any train, regardless of owner, whitelist, or "
"protection"
msgstr ""
+"Possibilité de poser, retirer ou opérer un quelconque train, indépendamment "
+"du propriétaire, de la liste blanche ou de protection"
-#: advtrains/protection.lua:18
-msgid "Can place and dig tracks in unprotected areas"
-msgstr ""
+#: advtrains/protection.lua
+msgid "Can place, remove and operate trains"
+msgstr "Possibilité de poser, retirer ou opérer les trains"
-#: advtrains/protection.lua:24
-msgid "Can operate turnouts and signals in unprotected areas"
+#: advtrains/protection.lua
+msgid "You are not allowed to build near tracks at this protected position."
msgstr ""
+"Vous ne pouvez pas construire à proximité d'une voie à cet emplacement "
+"protégé."
-#: advtrains/protection.lua:148
+#: advtrains/protection.lua
msgid ""
"You are not allowed to build near tracks without the track_builder privilege."
msgstr ""
"Vous ne pouvez pas construire à proximité d'une voie sans le privilège "
"\"track_builder\" (?)"
-#: advtrains/protection.lua:148
+#: advtrains/protection.lua
+msgid "You are not allowed to build tracks at this protected position."
+msgstr "Vous ne pouvez pas construire une voie à cet emplacement protégé."
+
+#: advtrains/protection.lua
msgid ""
"You are not allowed to build tracks without the track_builder privilege."
msgstr ""
-"Vous ne pouvez pas construire une voie sans le privilège \"track_builder\""
-
-#: advtrains/protection.lua:153
-msgid "You are not allowed to build near tracks at this protected position."
-msgstr ""
-"Vous ne pouvez pas construire à proximité d'une voie à cet emplacement "
-"protégé"
+"Vous ne pouvez pas construire une voie sans le privilège \"track_builder\"."
-#: advtrains/protection.lua:153
-msgid "You are not allowed to build tracks at this protected position."
-msgstr "Vous ne pouvez pas construire une voie à cet emplacement protégé"
-
-#: advtrains/protection.lua:184
+#: advtrains/protection.lua
msgid ""
"You are not allowed to operate turnouts and signals without the "
"railway_operator privilege."
@@ -220,32 +225,47 @@ msgstr ""
"Vous ne pouvez pas actionner les aiguillages ou les signaux (privilège "
"\"railway_operator\" manquant)"
-#: advtrains/signals.lua:63
+#: advtrains/signals.lua
+msgid "Andrew's Cross"
+msgstr "Croix de Saint André"
+
+#: advtrains/signals.lua
msgid "Lampless Signal"
msgstr "Sémaphore"
-#: advtrains/signals.lua:127
+#: advtrains/signals.lua
msgid "Signal"
-msgstr ""
+msgstr "Signal"
-#: advtrains/signals.lua:191
+#: advtrains/signals.lua
msgid "Wallmounted Signal (left)"
msgstr "Signal mural (gauche)"
-#: advtrains/signals.lua:192
+#: advtrains/signals.lua
msgid "Wallmounted Signal (right)"
msgstr "Signal mural (droit)"
-#: advtrains/signals.lua:193
+#: advtrains/signals.lua
msgid "Wallmounted Signal (top)"
msgstr "Signal mural (plafond)"
-#: advtrains/signals.lua:281 advtrains/signals.lua:322
-msgid "Andrew's Cross"
-msgstr "Croix de Saint André"
+#: advtrains/trackplacer.lua
+msgid "This node can't be changed using the trackworker."
+msgstr "Ce nœud ne peut être modifié avec l'outil \"Trackworker\"."
-#: advtrains/trackplacer.lua:313
-#, fuzzy
+#: advtrains/trackplacer.lua
+msgid "This node can't be rotated using the trackworker."
+msgstr "Ce nœud ne peut être tourné avec l'outil \"Trackworker\"."
+
+#: advtrains/trackplacer.lua
+msgid "This track can not be changed."
+msgstr "Cette voie ne peut pas être modifiée."
+
+#: advtrains/trackplacer.lua
+msgid "This track can not be rotated."
+msgstr "Cette voie ne peut pas être tournée."
+
+#: advtrains/trackplacer.lua
msgid ""
"Track Worker Tool\n"
"\n"
@@ -256,294 +276,302 @@ msgstr ""
"\n"
"Clic-Gauche : change le type de rail (droit/courbé/aiguillage)\n"
"\n"
-"Clic-Droit : tourne le rail/butoir/signal/etc..."
+"Clic-Droit : tourne l'objet"
-#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377
-#, fuzzy
-msgid "This node can't be rotated using the trackworker."
-msgstr "Ce nœud ne peut être tourné avec l'outil \"Trackworker\" !"
+#: advtrains/tracks.lua
+msgid "@1 Slope"
+msgstr "Pente @1"
-#: advtrains/trackplacer.lua:350
-msgid "This track can not be rotated."
-msgstr "Cette voie ne peut pas être tournée."
+#: advtrains/tracks.lua
+msgid "Can't place slope: Not enough slope items left (@1 required)."
+msgstr ""
+"Placement impossible : quantité insuffisante de voie pentue (@1 manquant)."
-#: advtrains/trackplacer.lua:404
-#, fuzzy
-msgid "This node can't be changed using the trackworker."
-msgstr "Ce nœud ne peut être modifié avec l'outil \"Trackworker\" !"
+#: advtrains/tracks.lua
+msgid "Can't place slope: There's no slope of length @1."
+msgstr "Placement impossible : il n'y a pas de voie pentue de longueur @1."
-#: advtrains/trackplacer.lua:414
-msgid "This track can not be changed."
-msgstr "Cette voie ne peut pas être modifiée."
+#: advtrains/tracks.lua
+msgid "Can't place slope: no supporting node at upper end."
+msgstr "Placement impossible : pas de nœud d'appui à l'extrémité supérieure."
-#: advtrains/tracks.lua:449
-msgid "This track can not be removed."
-msgstr "Cette voie ne peut pas être enlevée."
+#: advtrains/tracks.lua
+msgid "Can't place slope: not pointing at node."
+msgstr "Placement impossible : ne pointe pas un nœud."
+
+#: advtrains/tracks.lua
+msgid "Can't place slope: space occupied."
+msgstr "Placement impossible : espace occupé."
-#: advtrains/tracks.lua:616
+#: advtrains/tracks.lua
msgid "Position is occupied by a train."
msgstr "Cet emplacement est occupé par un train."
-#: advtrains/tracks.lua:622
-msgid "There's a Track Circuit Break here."
-msgstr "Il y a un \"Track Circuit Break\" ici."
-
-#: advtrains/tracks.lua:626
+#: advtrains/tracks.lua
msgid "There's a Signal Influence Point here."
msgstr "Il y a un \"Signal Influence Point\" ici."
-#: advtrains/tracks.lua:637
-msgid "@1 Slope"
-msgstr "Pente @1"
-
-#: advtrains/tracks.lua:648 advtrains/tracks.lua:653
-#, fuzzy
-msgid "Can't place slope: not pointing at node."
-msgstr "Placement impossible : ne pointe pas un nœud"
+#: advtrains/tracks.lua
+msgid "There's a Track Circuit Break here."
+msgstr "Il y a un \"Track Circuit Break\" ici."
-#: advtrains/tracks.lua:658
-#, fuzzy
-msgid "Can't place slope: space occupied."
-msgstr "Placement impossible : espace occupé"
+#: advtrains/tracks.lua
+msgid "This track can not be removed."
+msgstr "Cette voie ne peut pas être enlevée."
-#: advtrains/tracks.lua:711
-#, fuzzy
-msgid "Can't place slope: Not enough slope items left (@1 required)."
+#: advtrains/trainhud.lua
+msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
msgstr ""
-"Placement impossible : quantité insuffisante de voie pentue (@1 manquant)"
+"Franchissement de signal rouge : examinez la situation et inversez le sens "
+"de marche du train."
-#: advtrains/tracks.lua:714
-#, fuzzy
-msgid "Can't place slope: There's no slope of length @1."
-msgstr "Placement impossible : il n'y a pas de voie pentue de longueur @1"
+#: advtrains/wagonprop_tool.lua
+msgid "Insufficient privileges to use this!"
+msgstr ""
-#: advtrains/tracks.lua:721
+#: advtrains/wagonprop_tool.lua
#, fuzzy
-msgid "Can't place slope: no supporting node at upper end."
-msgstr "Placement impossible : pas de nœud d'appui à l'extrémité supérieure"
+msgid "Wagon Properties Tool"
+msgstr "Propriétés du wagon"
-#: advtrains/trainhud.lua:305
-msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
+#: advtrains/wagonprop_tool.lua
+msgid ""
+"Wagon Properties Tool\n"
+"Punch a wagon to view and edit the Wagon Properties"
msgstr ""
-#: advtrains/wagons.lua:179
-msgid "This wagon is owned by @1, you can't destroy it."
-msgstr "Ce wagon est la propriété de @1, vous ne pouvez pas le détruire."
-
-#: advtrains/wagons.lua:203
-msgid "The wagon's inventory is not empty."
-msgstr "Le stock de ce wagon n'est pas vide."
+#: advtrains/wagons.lua
+msgid "(Doors closed)"
+msgstr "(Portes closes)"
-#: advtrains/wagons.lua:210
-msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
-msgstr ""
+#: advtrains/wagons.lua
+msgid "Doors are closed! (Try holding sneak key!)"
+msgstr "Portes closes : (Essayez la \"sneak key\"!\")"
-#: advtrains/wagons.lua:216
+#: advtrains/wagons.lua
msgid ""
-"Warning: If you destroy this wagon, you only get some steel back! If you are "
-"sure, hold Sneak and left-click the wagon."
-msgstr ""
-"Attention: Si vous détruisez ce wagon, vous ne récupérerez que de la "
-"ferraille ! Si vous êtes sûr de vous, appuyez la touche \"Marcher lentement "
-"(Sneak)\" et Clic-Gauche."
-
-#: advtrains/wagons.lua:649 advtrains/wagons.lua:850
-msgid "Show Inventory"
-msgstr "Montrer le stock"
-
-#: advtrains/wagons.lua:652
-msgid "Onboard Computer"
+"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
+"off."
msgstr ""
+"Portes closes ! Utilisez \"Marcher lentement (Sneak)\" et Clic-Droit pour "
+"franchir les portes et débarquer."
-#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328
-msgid "Wagon properties"
-msgstr "Propriétés du wagon"
-
-#: advtrains/wagons.lua:658
+#: advtrains/wagons.lua
msgid "Get off"
msgstr "Débarquer"
-#: advtrains/wagons.lua:661
+#: advtrains/wagons.lua
msgid "Get off (forced)"
msgstr "Débarquer (de force)"
-#: advtrains/wagons.lua:663
-msgid "(Doors closed)"
-msgstr "(Portes closes)"
-
-#: advtrains/wagons.lua:692
-msgid "This wagon has no seats."
-msgstr ""
-
-#: advtrains/wagons.lua:703
-msgid "This wagon is full."
-msgstr ""
-
-#: advtrains/wagons.lua:706
-msgid "Doors are closed! (Try holding sneak key!)"
-msgstr ""
+#: advtrains/wagons.lua
+msgid "Line"
+msgstr "Ligne"
-#: advtrains/wagons.lua:712
-msgid "You can't get on this wagon."
-msgstr ""
+#: advtrains/wagons.lua
+msgid "Onboard Computer"
+msgstr "Ordinateur embarqué"
-#: advtrains/wagons.lua:838
-msgid "Select seat:"
-msgstr "Choisir le siège"
+#: advtrains/wagons.lua
+msgid "Routingcode"
+msgstr "Code de routage"
-#: advtrains/wagons.lua:880
+#: advtrains/wagons.lua
msgid "Save wagon properties"
msgstr "Sauvegarder les propriétés du wagon"
-#: advtrains/wagons.lua:965
-msgid "Text displayed outside on train"
-msgstr "Texte affiché à l'extérieur du train"
+#: advtrains/wagons.lua
+msgid "Select seat:"
+msgstr "Choisir le siège :"
-#: advtrains/wagons.lua:966
+#: advtrains/wagons.lua
+msgid "Show Inventory"
+msgstr "Montrer le stock"
+
+#: advtrains/wagons.lua
msgid "Text displayed inside train"
msgstr "Texte affiché à l'intérieur du train"
-#: advtrains/wagons.lua:967
-msgid "Line"
-msgstr "Ligne "
+#: advtrains/wagons.lua
+msgid "Text displayed outside on train"
+msgstr "Texte affiché à l'extérieur du train"
-#: advtrains/wagons.lua:968
-msgid "Routingcode"
-msgstr "Code de routage"
+#: advtrains/wagons.lua
+msgid "The wagon's inventory is not empty."
+msgstr "Le stock de ce wagon n'est pas vide."
-#: advtrains/wagons.lua:1241
+#: advtrains/wagons.lua
#, fuzzy
-msgid ""
-"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
-"off."
-msgstr ""
-"Portes closes ! Utilisez \"Marcher lentement (Sneak)\" et Clic-Droit pour "
-"franchir les portes et débarquer !"
+msgid "This Wagon ID"
+msgstr "Ce wagon est plein."
-#: advtrains/wagons.lua:1250
-msgid "You are not allowed to access the driver stand."
-msgstr ""
+#: advtrains/wagons.lua
+msgid "This wagon has no seats."
+msgstr "Ce wagon n'a pas de siège."
-#: advtrains_interlocking/tsr_rail.lua:13
-msgid "Point speed restriction: @1"
+#: advtrains/wagons.lua
+msgid "This wagon is full."
+msgstr "Ce wagon est plein."
+
+#: advtrains/wagons.lua
+msgid "This wagon is owned by @1, you can't destroy it."
+msgstr "Ce wagon est la propriété de @1, vous ne pouvez pas le détruire."
+
+#: advtrains/wagons.lua
+msgid "Train ID"
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:14
-msgid "Set point speed restriction:"
+#: advtrains/wagons.lua
+msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
msgstr ""
+"Les wagons doivent être désaccouplés des autres pour pouvoir être détruits."
-#: advtrains_interlocking/tsr_rail.lua:30
-msgid "You are not allowed to configure this track without the @1 privilege."
+#: advtrains/wagons.lua
+msgid "Wagon properties"
+msgstr "Propriétés du wagon"
+
+#: advtrains/wagons.lua
+msgid ""
+"Warning: If you destroy this wagon, you only get some steel back! If you are "
+"sure, hold Sneak and left-click the wagon."
msgstr ""
+"Attention: Si vous détruisez ce wagon, vous ne récupérerez que de la "
+"ferraille ! Si vous êtes sûr de vous, appuyez la touche \"Marcher lentement "
+"(Sneak)\" et Clic-Gauche."
-#: advtrains_interlocking/tsr_rail.lua:34
-#: advtrains_line_automation/stoprail.lua:31
-#: advtrains_line_automation/stoprail.lua:76
-msgid "You are not allowed to configure this track."
+#: advtrains/wagons.lua
+msgid "You are not allowed to access the driver stand."
+msgstr "Accès interdit au poste de pilotage."
+
+#: advtrains/wagons.lua
+msgid "You can't get on this wagon."
+msgstr "Montée impossible dans ce wagon."
+
+#: advtrains_interlocking/routesetting.lua
+msgid "Route state changed."
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:64
+#: advtrains_interlocking/tsr_rail.lua
msgid "Point Speed Restriction Track"
-msgstr ""
+msgstr "Voie de point de limitation de vitesse"
-#: advtrains_line_automation/stoprail.lua:54
-msgid "Station Code"
-msgstr "Code de Station"
+#: advtrains_interlocking/tsr_rail.lua
+msgid "Point speed restriction: @1"
+msgstr "Point de limitation de vitesse : @1"
-#: advtrains_line_automation/stoprail.lua:55
-msgid "Station Name"
-msgstr "Nom de Station"
+#: advtrains_interlocking/tsr_rail.lua
+msgid "Set point speed restriction:"
+msgstr "Placez un point de limitation de vitesse :"
-#: advtrains_line_automation/stoprail.lua:56
-msgid "Door Delay"
-msgstr "Durée d'ouverture des portes"
+#: advtrains_interlocking/tsr_rail.lua
+msgid "You are not allowed to configure this track without the @1 privilege."
+msgstr "Vous n'êtes pas autorisé à configurer cette voie sans le privilège @1."
-#: advtrains_line_automation/stoprail.lua:57
+#: advtrains_interlocking/tsr_rail.lua advtrains_line_automation/stoprail.lua
+msgid "You are not allowed to configure this track."
+msgstr "Vous n'êtes pas autorisé à configurer cette voie."
+
+#: advtrains_line_automation/stoprail.lua
msgid "Dep. Speed"
msgstr "Vitesse de départ"
-#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11
-#: advtrains_train_track/init.lua:156
-msgid "Track"
-msgstr "Voie"
-
-#: advtrains_line_automation/stoprail.lua:59
-msgid "Stop Time"
-msgstr "Durée d'arrêt"
+#: advtrains_line_automation/stoprail.lua
+msgid "Door Delay"
+msgstr "Durée d'ouverture des portes"
-#: advtrains_line_automation/stoprail.lua:60
+#: advtrains_line_automation/stoprail.lua
msgid "Door Side"
-msgstr ""
+msgstr "Coté d'ouvertures des portes"
+
+#: advtrains_line_automation/stoprail.lua
+msgid "Kick out passengers"
+msgstr "Éjecter les passagers"
-#: advtrains_line_automation/stoprail.lua:62
+#: advtrains_line_automation/stoprail.lua
msgid "Reverse train"
-msgstr ""
+msgstr "Inversion du sens de marche"
-#: advtrains_line_automation/stoprail.lua:63
-msgid "Kick out passengers"
-msgstr ""
+#: advtrains_line_automation/stoprail.lua
+msgid "Station Code"
+msgstr "Code de Station"
-#: advtrains_line_automation/stoprail.lua:97
-msgid "Station code \"@1\" already exists and is owned by @2."
-msgstr ""
+#: advtrains_line_automation/stoprail.lua
+msgid "Station Name"
+msgstr "Nom de Station"
-#: advtrains_line_automation/stoprail.lua:111
-msgid "This station is owned by @1. You are not allowed to edit its name."
-msgstr ""
+#: advtrains_line_automation/stoprail.lua
+msgid "Station code \"@1\" already exists and is owned by @2."
+msgstr "Le code de station \"@1\" existe et est possédé par @2."
-#: advtrains_line_automation/stoprail.lua:221
+#: advtrains_line_automation/stoprail.lua
msgid "Station/Stop Track"
-msgstr ""
+msgstr "Voie d'arrêt en station"
-#: advtrains_luaautomation/active_common.lua:17
-msgid "Unconfigured LuaATC component"
-msgstr ""
+#: advtrains_line_automation/stoprail.lua
+msgid "Stop Time"
+msgstr "Durée d'arrêt"
-#: advtrains_luaautomation/active_common.lua:46
-msgid "LuaATC Environment"
+#: advtrains_line_automation/stoprail.lua
+msgid "This station is owned by @1. You are not allowed to edit its name."
msgstr ""
+"Cette station est la propriété de @1. Vous n'êtes pas autorisé à modifier "
+"son nom."
+
+#: advtrains_line_automation/stoprail.lua advtrains_train_track/init.lua
+msgid "Track"
+msgstr "Voie"
-#: advtrains_luaautomation/active_common.lua:49
+#: advtrains_luaautomation/active_common.lua
msgid "Clear Local Environment"
-msgstr ""
+msgstr "Effacer l'environnement LuaATC"
-#: advtrains_luaautomation/active_common.lua:50
+#: advtrains_luaautomation/active_common.lua
msgid "Code"
-msgstr ""
+msgstr "Code"
-#: advtrains_luaautomation/active_common.lua:64
-msgid ""
-"You are not allowed to configure this LuaATC component without the @1 "
-"privilege."
-msgstr ""
-
-#: advtrains_luaautomation/active_common.lua:94
-msgid "LuaATC component assigned to environment '@1'"
-msgstr ""
+#: advtrains_luaautomation/active_common.lua
+msgid "LuaATC Environment"
+msgstr "Environnement LuaATC"
-#: advtrains_luaautomation/active_common.lua:96
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC component assigned to an invalid environment"
-msgstr ""
+msgstr "Composant LuaATC assigné à un environnement invalide"
+
+#: advtrains_luaautomation/active_common.lua
+msgid "LuaATC component assigned to environment '@1'"
+msgstr "Composant LuaATC assigné à l'environnement '@1'"
-#: advtrains_luaautomation/active_common.lua:171
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC component with error: @1"
-msgstr ""
+msgstr "Erreur @1 du composant LuaATC"
+
+#: advtrains_luaautomation/active_common.lua
+msgid "Unconfigured LuaATC component"
+msgstr "Composant LuaATC non configuré"
+
+#: advtrains_luaautomation/active_common.lua
+msgid ""
+"You are not allowed to configure this LuaATC component without the @1 "
+"privilege."
+msgstr "Vous ne pouvez configurer ce composant LuaATC sans le privilege @1."
-#: advtrains_luaautomation/init.lua:13
+#: advtrains_luaautomation/init.lua
msgid ""
"Can place and configure LuaATC components, including execute potentially "
"harmful Lua code"
msgstr ""
+"Permet le placement et la configuration de composants LuaATC avec risque "
+"d'exécution de code Lua dangereux"
-#: advtrains_luaautomation/mesecon_controller.lua:211
+#: advtrains_luaautomation/mesecon_controller.lua
msgid "LuaATC Mesecon Controller"
-msgstr ""
+msgstr "Commande Mesecon de LuaATC"
-#: advtrains_luaautomation/operation_panel.lua:11
+#: advtrains_luaautomation/operation_panel.lua
msgid "LuaATC Operation Panel"
-msgstr ""
+msgstr "Panneau de commande de LuaATC"
-#: advtrains_luaautomation/pcnaming.lua:28
+#: advtrains_luaautomation/pcnaming.lua
msgid ""
"Passive Component Naming Tool\n"
"\n"
@@ -553,119 +581,115 @@ msgstr ""
"\n"
"Clic-Droit pour nommer un composant passif."
-#: advtrains_luaautomation/pcnaming.lua:39
+#: advtrains_luaautomation/pcnaming.lua
+msgid "Set name of component (empty to clear)"
+msgstr "Nommer le composant (chaîne vide pour effacer)"
+
+#: advtrains_luaautomation/pcnaming.lua
msgid ""
"You are not allowed to name LuaATC passive components without the @1 "
"privilege."
-msgstr ""
-
-#: advtrains_luaautomation/pcnaming.lua:62
-msgid "Set name of component (empty to clear)"
-msgstr ""
+msgstr "Vous ne pouvez nommer un composant LuaATC passif sans le privilege @1."
-#: advtrains_train_industrial/init.lua:10
-#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20
-#: advtrains_train_steam/init.lua:91
-msgid "Driver Stand (right)"
-msgstr "Poste de pilotage (droit)"
+#: advtrains_train_industrial/init.lua
+msgid "Big Industrial Train Engine"
+msgstr "Grosse locomotive industrielle"
-#: advtrains_train_industrial/init.lua:17
-#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14
-#: advtrains_train_steam/init.lua:85
+#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
msgid "Driver Stand (left)"
msgstr "Poste de pilotage (gauche)"
-#: advtrains_train_industrial/init.lua:40
+#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
+msgid "Driver Stand (right)"
+msgstr "Poste de pilotage (droit)"
+
+#: advtrains_train_industrial/init.lua
msgid "Industrial Train Engine"
msgstr "Locomotive industrielle"
-#: advtrains_train_industrial/init.lua:79
-msgid "Big Industrial Train Engine"
-msgstr "Grosse locomotive industrielle "
-
-#: advtrains_train_industrial/init.lua:98
+#: advtrains_train_industrial/init.lua
msgid "Industrial tank wagon"
msgstr "Wagon-citerne industriel"
-#: advtrains_train_industrial/init.lua:116
+#: advtrains_train_industrial/init.lua
msgid "Industrial wood wagon"
msgstr "Wagon grumier industriel"
-#: advtrains_train_japan/init.lua:4
-msgid "Japanese Train Inter-Wagon Connection"
-msgstr "Passage inter-voiture de train Japonais"
-
-#: advtrains_train_japan/init.lua:37
+#: advtrains_train_japan/init.lua
msgid "Driver stand"
msgstr "Poste de pilotage"
-#: advtrains_train_japan/init.lua:101
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Engine"
msgstr "Motrice Japonaise"
-#: advtrains_train_japan/init.lua:176
+#: advtrains_train_japan/init.lua
+msgid "Japanese Train Inter-Wagon Connection"
+msgstr "Passage inter-voiture de train Japonais"
+
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Wagon"
msgstr "Voiture Japonaise"
-#: advtrains_train_steam/init.lua:75
-msgid "Steam Engine"
-msgstr "Locomotive à vapeur"
+#: advtrains_train_steam/init.lua
+msgid "Box Wagon"
+msgstr "Wagon de frêt"
-#: advtrains_train_steam/init.lua:159
+#: advtrains_train_steam/init.lua
msgid "Detailed Steam Engine"
msgstr "Locomotive à vapeur complexe"
-#: advtrains_train_steam/init.lua:206
+#: advtrains_train_steam/init.lua
msgid "Passenger Wagon"
msgstr "Voiture passager"
-#: advtrains_train_steam/init.lua:226
-msgid "Box Wagon"
-msgstr "Wagon de frêt"
+#: advtrains_train_steam/init.lua
+msgid "Steam Engine"
+msgstr "Locomotive à vapeur"
-#: advtrains_train_subway/init.lua:144
+#: advtrains_train_subway/init.lua
msgid "Subway Passenger Wagon"
msgstr "Voiture de Métropolitain"
-#: advtrains_train_track/init.lua:31
-msgid "Y-turnout"
-msgstr "Embranchement en Y"
-
-#: advtrains_train_track/init.lua:49
+#: advtrains_train_track/init.lua
msgid "3-way turnout"
msgstr "Embranchement triple"
-#: advtrains_train_track/init.lua:69
-msgid "Perpendicular Diamond Crossing Track"
-msgstr "Croisement perpendiculaire"
-
-#: advtrains_train_track/init.lua:91
+#: advtrains_train_track/init.lua
msgid "90+Angle Diamond Crossing Track"
msgstr "Croisement perpendiculo-diagonal"
-#: advtrains_train_track/init.lua:132
-msgid "Diagonal Diamond Crossing Track"
-msgstr "Croisement diagonal"
+#: advtrains_train_track/init.lua
+msgid "ATC controller"
+msgstr "Controlleur ATC"
-#: advtrains_train_track/init.lua:179
+#: advtrains_train_track/init.lua
msgid "Bumper"
msgstr "Heurtoir"
-#: advtrains_train_track/init.lua:201
-msgid "ATC controller"
-msgstr "Controlleur ATC"
+#: advtrains_train_track/init.lua
+msgid "Detector Rail"
+msgstr "Voie détectrice"
-#: advtrains_train_track/init.lua:317
-msgid "Unloading Track"
-msgstr "Voie de Déchargement"
+#: advtrains_train_track/init.lua
+msgid "Diagonal Diamond Crossing Track"
+msgstr "Croisement diagonal"
-#: advtrains_train_track/init.lua:342
+#: advtrains_train_track/init.lua
msgid "Loading Track"
msgstr "Voie de Chargement"
-#: advtrains_train_track/init.lua:406
-msgid "Detector Rail"
-msgstr "Voie détectrice"
+#: advtrains_train_track/init.lua
+msgid "Perpendicular Diamond Crossing Track"
+msgstr "Croisement perpendiculaire"
+
+#: advtrains_train_track/init.lua
+msgid "Unloading Track"
+msgstr "Voie de Déchargement"
+
+#: advtrains_train_track/init.lua
+msgid "Y-turnout"
+msgstr "Embranchement en Y"
#~ msgid ""
#~ "ATC controller, mode @1\n"
diff --git a/advtrains/po/update-translations.sh b/advtrains/po/update-translations.sh
index 3a56c7c..4c22c85 100755
--- a/advtrains/po/update-translations.sh
+++ b/advtrains/po/update-translations.sh
@@ -13,6 +13,7 @@ xgettext \
-o "$POTFILE" \
-p . \
-L lua \
+ --add-location=file \
--from-code=UTF-8 \
--sort-by-file \
--keyword='attrans' \
diff --git a/advtrains/po/zh_CN.po b/advtrains/po/zh_CN.po
index 5bcc316..9f5f84f 100644
--- a/advtrains/po/zh_CN.po
+++ b/advtrains/po/zh_CN.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: advtrains\n"
"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
-"POT-Creation-Date: 2023-10-09 11:02+0200\n"
+"POT-Creation-Date: 2024-12-06 21:17+0100\n"
"PO-Revision-Date: 2023-10-09 11:24+0200\n"
"Last-Translator: Y. Wang <yw05@forksworld.de>\n"
"Language-Team: Chinese (Simplified)\n"
@@ -12,11 +12,27 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.3.2\n"
-#: advtrains/atc.lua:109
-msgid "Unconfigured ATC controller"
-msgstr "ATC 控制器 (未配置)"
+#: advtrains/atc.lua
+msgid "ATC Kick command warning: doors are closed."
+msgstr "ATC 警告:车门已关闭,无法踢出乘客。"
+
+#: advtrains/atc.lua
+msgid "ATC Kick command warning: train moving."
+msgstr "ATC 警告:火车正在移动,无法踢出乘客。"
+
+#: advtrains/atc.lua
+msgid "ATC Reverse command warning: didn't reverse train, train moving."
+msgstr "ATC 警告:火车正在移动,无法改变行车方向。"
+
+#: advtrains/atc.lua
+msgid "ATC command parse error: Unknown command: @1"
+msgstr "ATC 语法错误:未知命令:@1"
-#: advtrains/atc.lua:150
+#: advtrains/atc.lua
+msgid "ATC command syntax error: I statement not closed: @1"
+msgstr "ATC 语法错误:“I”命令不完整:@1"
+
+#: advtrains/atc.lua
msgid ""
"ATC controller, mode @1\n"
"Command: @2"
@@ -25,44 +41,64 @@ msgstr ""
"模式:@1\n"
"命令:@2"
-#: advtrains/atc.lua:180
+#: advtrains/atc.lua
msgid "Command"
msgstr "命令"
-#: advtrains/atc.lua:184
+#: advtrains/atc.lua
msgid "Command (on)"
msgstr "命令 (激活时)"
-#: advtrains/atc.lua:187
+#: advtrains/atc.lua
msgid "Digiline channel"
msgstr "Digiline 频道"
-#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65
-#: advtrains_luaautomation/active_common.lua:48
+#: advtrains/atc.lua advtrains_line_automation/stoprail.lua
+#: advtrains_luaautomation/active_common.lua
msgid "Save"
msgstr "保存"
-#: advtrains/atc.lua:236
-msgid "ATC Reverse command warning: didn't reverse train, train moving."
-msgstr "ATC 警告:火车正在移动,无法改变行车方向。"
+#: advtrains/atc.lua
+msgid "Unconfigured ATC controller"
+msgstr "ATC 控制器 (未配置)"
-#: advtrains/atc.lua:248
-msgid "ATC Kick command warning: doors are closed."
-msgstr "ATC 警告:车门已关闭,无法踢出乘客。"
+#: advtrains/copytool.lua
+msgid "Back of train would end up off track, cancelling."
+msgstr "火车后部不在轨道上。"
-#: advtrains/atc.lua:252
-msgid "ATC Kick command warning: train moving."
-msgstr "ATC 警告:火车正在移动,无法踢出乘客。"
+#: advtrains/copytool.lua
+msgid "No such lua entity."
+msgstr "您没有指向一个可以用火车复制工具复制的物体。"
-#: advtrains/atc.lua:322
-msgid "ATC command syntax error: I statement not closed: @1"
-msgstr "ATC 语法错误:“I”命令不完整:@1"
+#: advtrains/copytool.lua
+msgid "No such train: @1."
+msgstr "ID 为“@1”的列车不存在。"
-#: advtrains/atc.lua:385
-msgid "ATC command parse error: Unknown command: @1"
-msgstr "ATC 语法错误:未知命令:@1"
+#: advtrains/copytool.lua
+msgid "No such wagon: @1."
+msgstr "ID 为“@1”的车厢不存在。"
-#: advtrains/copytool.lua:8
+#: advtrains/copytool.lua
+msgid "The clipboard couldn't access the metadata. Copy failed."
+msgstr "无法复制:剪贴板无法访问元数据。"
+
+#: advtrains/copytool.lua
+msgid "The clipboard couldn't access the metadata. Paste failed."
+msgstr "无法粘贴:剪贴板无法访问元数据。"
+
+#: advtrains/copytool.lua
+msgid "The clipboard is empty."
+msgstr "剪贴板是空的。"
+
+#: advtrains/copytool.lua
+msgid "The track you are trying to place the wagon on is not long enough."
+msgstr "轨道太短。"
+
+#: advtrains/copytool.lua
+msgid "Train copied."
+msgstr "已复制列车。"
+
+#: advtrains/copytool.lua
msgid ""
"Train copy/paste tool\n"
"\n"
@@ -74,166 +110,146 @@ msgstr ""
"左键单击:复制\n"
"右键单击:粘帖"
-#: advtrains/copytool.lua:29
+#: advtrains/copytool.lua
msgid "You do not have the @1 privilege."
msgstr "您没有“@1”权限。"
-#: advtrains/copytool.lua:41
-msgid "The track you are trying to place the wagon on is not long enough."
-msgstr "轨道太短。"
-
-#: advtrains/copytool.lua:47
-msgid "The clipboard couldn't access the metadata. Paste failed."
-msgstr "无法粘贴:剪贴板无法访问元数据。"
-
-#: advtrains/copytool.lua:52 advtrains/copytool.lua:57
-msgid "The clipboard is empty."
-msgstr "剪贴板是空的。"
-
-#: advtrains/copytool.lua:74
-msgid "Back of train would end up off track, cancelling."
-msgstr "火车后部不在轨道上。"
-
-#: advtrains/copytool.lua:92
-msgid "No such lua entity."
-msgstr "您没有指向一个可以用火车复制工具复制的物体。"
-
-#: advtrains/copytool.lua:98
-msgid "No such wagon: @1."
-msgstr "ID 为“@1”的车厢不存在。"
-
-#: advtrains/copytool.lua:104
-msgid "No such train: @1."
-msgstr "ID 为“@1”的列车不存在。"
-
-#: advtrains/copytool.lua:176
-msgid "The clipboard couldn't access the metadata. Copy failed."
-msgstr "无法复制:剪贴板无法访问元数据。"
-
-#: advtrains/copytool.lua:180
-msgid "Train copied."
-msgstr "已复制列车。"
+#: advtrains/couple.lua
+msgid "<No coupler>"
+msgstr "<没有车钩>"
-#: advtrains/couple.lua:28
+#: advtrains/couple.lua
msgid "Buffer and Chain Coupler"
msgstr "链式车钩"
-#: advtrains/couple.lua:29
+#: advtrains/couple.lua
+msgid "Can not couple: The couplers of the trains do not match (@1 and @2)."
+msgstr "您无法连接这两节车厢:这两节车厢使用不同的车钩 (@1和@2)。"
+
+#: advtrains/couple.lua
msgid "Scharfenberg Coupler"
msgstr "Scharfenberg 式车钩"
-#: advtrains/couple.lua:185
+#: advtrains/couple.lua
msgid ""
"You are not allowed to couple trains without the train_operator privilege."
msgstr "您没有“train_operator”权限,不能连接这两节车厢。"
-#: advtrains/couple.lua:329 advtrains/couple.lua:333
-msgid "<No coupler>"
-msgstr "<没有车钩>"
-
-#: advtrains/couple.lua:334
-msgid "Can not couple: The couplers of the trains do not match (@1 and @2)."
-msgstr "您无法连接这两节车厢:这两节车厢使用不同的车钩 (@1和@2)。"
-
-#: advtrains/craft_items.lua:3
+#: advtrains/craft_items.lua
msgid "Boiler"
msgstr "锅炉"
-#: advtrains/craft_items.lua:9
+#: advtrains/craft_items.lua
+msgid "Chimney"
+msgstr "烟囱"
+
+#: advtrains/craft_items.lua
msgid "Driver's cab"
msgstr "驾驶室"
-#: advtrains/craft_items.lua:15
+#: advtrains/craft_items.lua
msgid "Wheel"
msgstr "车轮"
-#: advtrains/craft_items.lua:21
-msgid "Chimney"
-msgstr "烟囱"
-
-#: advtrains/misc_nodes.lua:16
-msgid "@1 Platform (low)"
-msgstr "较低的@1站台"
+#: advtrains/misc_nodes.lua
+msgid "@1 Platform (45 degree)"
+msgstr "较高的@1站台 (45°)"
-#: advtrains/misc_nodes.lua:33
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (high)"
msgstr "较高的@1站台"
-#: advtrains/misc_nodes.lua:59
-msgid "@1 Platform (45 degree)"
-msgstr "较高的@1站台 (45°)"
+#: advtrains/misc_nodes.lua
+msgid "@1 Platform (low)"
+msgstr "较低的@1站台"
-#: advtrains/misc_nodes.lua:81
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (low, 45 degree)"
msgstr "较低的@1站台 (45°)"
-#: advtrains/protection.lua:7
-msgid "Can place, remove and operate trains"
+#: advtrains/protection.lua
+msgid "Can operate turnouts and signals in unprotected areas"
msgstr ""
-#: advtrains/protection.lua:12
+#: advtrains/protection.lua
+msgid "Can place and dig tracks in unprotected areas"
+msgstr ""
+
+#: advtrains/protection.lua
msgid ""
"Can place, remove and operate any train, regardless of owner, whitelist, or "
"protection"
msgstr ""
-#: advtrains/protection.lua:18
-msgid "Can place and dig tracks in unprotected areas"
+#: advtrains/protection.lua
+msgid "Can place, remove and operate trains"
msgstr ""
-#: advtrains/protection.lua:24
-msgid "Can operate turnouts and signals in unprotected areas"
-msgstr ""
+#: advtrains/protection.lua
+msgid "You are not allowed to build near tracks at this protected position."
+msgstr "这里已被保护,您不能在这里的铁路附近建任何东西。"
-#: advtrains/protection.lua:148
+#: advtrains/protection.lua
msgid ""
"You are not allowed to build near tracks without the track_builder privilege."
msgstr "您没有“train_operator”权限,不能在铁路附近建任何东西。"
-#: advtrains/protection.lua:148
+#: advtrains/protection.lua
+msgid "You are not allowed to build tracks at this protected position."
+msgstr "这里已被保护,您不能在这里建造铁路。"
+
+#: advtrains/protection.lua
msgid ""
"You are not allowed to build tracks without the track_builder privilege."
msgstr "您没有“train_operator”权限,不能在这里建造铁路。"
-#: advtrains/protection.lua:153
-msgid "You are not allowed to build near tracks at this protected position."
-msgstr "这里已被保护,您不能在这里的铁路附近建任何东西。"
-
-#: advtrains/protection.lua:153
-msgid "You are not allowed to build tracks at this protected position."
-msgstr "这里已被保护,您不能在这里建造铁路。"
-
-#: advtrains/protection.lua:184
+#: advtrains/protection.lua
msgid ""
"You are not allowed to operate turnouts and signals without the "
"railway_operator privilege."
msgstr "您没有“railway_operator”权限,不能控制铁路设施。"
-#: advtrains/signals.lua:63
+#: advtrains/signals.lua
+msgid "Andrew's Cross"
+msgstr "铁路道口信号灯"
+
+#: advtrains/signals.lua
msgid "Lampless Signal"
msgstr "臂板信号机"
-#: advtrains/signals.lua:127
+#: advtrains/signals.lua
msgid "Signal"
msgstr "信号灯"
-#: advtrains/signals.lua:191
+#: advtrains/signals.lua
msgid "Wallmounted Signal (left)"
msgstr "壁挂式信号灯 (左侧)"
-#: advtrains/signals.lua:192
+#: advtrains/signals.lua
msgid "Wallmounted Signal (right)"
msgstr "壁挂式信号灯 (右侧)"
-#: advtrains/signals.lua:193
+#: advtrains/signals.lua
msgid "Wallmounted Signal (top)"
msgstr "悬挂式信号灯"
-#: advtrains/signals.lua:281 advtrains/signals.lua:322
-msgid "Andrew's Cross"
-msgstr "铁路道口信号灯"
+#: advtrains/trackplacer.lua
+msgid "This node can't be changed using the trackworker."
+msgstr "您不能使用铁路调整工具调整这个方块。"
+
+#: advtrains/trackplacer.lua
+msgid "This node can't be rotated using the trackworker."
+msgstr "您不能使用铁路调整工具旋转这个方块。"
+
+#: advtrains/trackplacer.lua
+msgid "This track can not be changed."
+msgstr "您不能调整这段轨道。"
+
+#: advtrains/trackplacer.lua
+msgid "This track can not be rotated."
+msgstr "您不能旋转这段轨道。"
-#: advtrains/trackplacer.lua:313
+#: advtrains/trackplacer.lua
msgid ""
"Track Worker Tool\n"
"\n"
@@ -245,280 +261,289 @@ msgstr ""
"左键单击:切换轨道类型\n"
"右键单击:旋转方块"
-#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377
-msgid "This node can't be rotated using the trackworker."
-msgstr "您不能使用铁路调整工具旋转这个方块。"
-
-#: advtrains/trackplacer.lua:350
-msgid "This track can not be rotated."
-msgstr "您不能旋转这段轨道。"
-
-#: advtrains/trackplacer.lua:404
-msgid "This node can't be changed using the trackworker."
-msgstr "您不能使用铁路调整工具调整这个方块。"
-
-#: advtrains/trackplacer.lua:414
-msgid "This track can not be changed."
-msgstr "您不能调整这段轨道。"
-
-#: advtrains/tracks.lua:449
-msgid "This track can not be removed."
-msgstr "您不能移除这段轨道。"
-
-#: advtrains/tracks.lua:616
-msgid "Position is occupied by a train."
-msgstr ""
-
-#: advtrains/tracks.lua:622
-msgid "There's a Track Circuit Break here."
-msgstr ""
-
-#: advtrains/tracks.lua:626
-msgid "There's a Signal Influence Point here."
-msgstr ""
-
-#: advtrains/tracks.lua:637
+#: advtrains/tracks.lua
msgid "@1 Slope"
msgstr "@1斜坡"
-#: advtrains/tracks.lua:648 advtrains/tracks.lua:653
-msgid "Can't place slope: not pointing at node."
-msgstr "无法放置斜坡:您没有选择任何方块。"
-
-#: advtrains/tracks.lua:658
-msgid "Can't place slope: space occupied."
-msgstr "无法放置斜坡:此区域已被占用。"
-
-#: advtrains/tracks.lua:711
+#: advtrains/tracks.lua
msgid "Can't place slope: Not enough slope items left (@1 required)."
msgstr "无法放置斜坡:您没有足够的铁路斜坡放置工具 (您总共需要@1个)"
-#: advtrains/tracks.lua:714
+#: advtrains/tracks.lua
msgid "Can't place slope: There's no slope of length @1."
msgstr "无法放置斜坡:advtrains 不支持长度为@1米的斜坡。"
-#: advtrains/tracks.lua:721
+#: advtrains/tracks.lua
msgid "Can't place slope: no supporting node at upper end."
msgstr "无法放置斜坡:较高端没有支撑方块。"
-#: advtrains/trainhud.lua:305
-msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
+#: advtrains/tracks.lua
+msgid "Can't place slope: not pointing at node."
+msgstr "无法放置斜坡:您没有选择任何方块。"
+
+#: advtrains/tracks.lua
+msgid "Can't place slope: space occupied."
+msgstr "无法放置斜坡:此区域已被占用。"
+
+#: advtrains/tracks.lua
+msgid "Position is occupied by a train."
msgstr ""
-#: advtrains/wagons.lua:179
-msgid "This wagon is owned by @1, you can't destroy it."
-msgstr "这是 @1 的车厢,您不能摧毁它。"
+#: advtrains/tracks.lua
+msgid "There's a Signal Influence Point here."
+msgstr ""
-#: advtrains/wagons.lua:203
-msgid "The wagon's inventory is not empty."
+#: advtrains/tracks.lua
+msgid "There's a Track Circuit Break here."
msgstr ""
-#: advtrains/wagons.lua:210
-msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
+#: advtrains/tracks.lua
+msgid "This track can not be removed."
+msgstr "您不能移除这段轨道。"
+
+#: advtrains/trainhud.lua
+msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
+msgstr ""
+
+#: advtrains/wagonprop_tool.lua
+msgid "Insufficient privileges to use this!"
msgstr ""
-#: advtrains/wagons.lua:216
+#: advtrains/wagonprop_tool.lua
+#, fuzzy
+msgid "Wagon Properties Tool"
+msgstr "车厢属性"
+
+#: advtrains/wagonprop_tool.lua
msgid ""
-"Warning: If you destroy this wagon, you only get some steel back! If you are "
-"sure, hold Sneak and left-click the wagon."
+"Wagon Properties Tool\n"
+"Punch a wagon to view and edit the Wagon Properties"
msgstr ""
-"警告:如果您摧毁此车厢,您只能拿到一些钢方块。如果您确定要摧毁这节车厢,请按"
-"潜行键并左键单击此车厢。"
-#: advtrains/wagons.lua:649 advtrains/wagons.lua:850
-msgid "Show Inventory"
-msgstr "显示物品栏"
+#: advtrains/wagons.lua
+msgid "(Doors closed)"
+msgstr "(车门已关闭)"
-#: advtrains/wagons.lua:652
-msgid "Onboard Computer"
+#: advtrains/wagons.lua
+msgid "Doors are closed! (Try holding sneak key!)"
msgstr ""
-#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328
-msgid "Wagon properties"
-msgstr "车厢属性"
+#: advtrains/wagons.lua
+msgid ""
+"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
+"off."
+msgstr "车门已关闭,请使用潜行+右键单击下车。"
-#: advtrains/wagons.lua:658
+#: advtrains/wagons.lua
msgid "Get off"
msgstr "下车"
-#: advtrains/wagons.lua:661
+#: advtrains/wagons.lua
msgid "Get off (forced)"
msgstr "强制下车"
-#: advtrains/wagons.lua:663
-msgid "(Doors closed)"
-msgstr "(车门已关闭)"
-
-#: advtrains/wagons.lua:692
-msgid "This wagon has no seats."
-msgstr "这节车厢没有座位。"
-
-#: advtrains/wagons.lua:703
-msgid "This wagon is full."
-msgstr "车厢已满。"
+#: advtrains/wagons.lua
+msgid "Line"
+msgstr "火车线路"
-#: advtrains/wagons.lua:706
-msgid "Doors are closed! (Try holding sneak key!)"
+#: advtrains/wagons.lua
+msgid "Onboard Computer"
msgstr ""
-#: advtrains/wagons.lua:712
-msgid "You can't get on this wagon."
-msgstr ""
+#: advtrains/wagons.lua
+msgid "Routingcode"
+msgstr "路由码"
+
+#: advtrains/wagons.lua
+msgid "Save wagon properties"
+msgstr "保存车厢属性"
-#: advtrains/wagons.lua:838
+#: advtrains/wagons.lua
msgid "Select seat:"
msgstr "请选择座位:"
-#: advtrains/wagons.lua:880
-msgid "Save wagon properties"
-msgstr "保存车厢属性"
+#: advtrains/wagons.lua
+msgid "Show Inventory"
+msgstr "显示物品栏"
+
+#: advtrains/wagons.lua
+msgid "Text displayed inside train"
+msgstr "车厢内部显示"
-#: advtrains/wagons.lua:965
+#: advtrains/wagons.lua
msgid "Text displayed outside on train"
msgstr "车厢外部显示"
-#: advtrains/wagons.lua:966
-msgid "Text displayed inside train"
-msgstr "车厢内部显示"
+#: advtrains/wagons.lua
+msgid "The wagon's inventory is not empty."
+msgstr ""
-#: advtrains/wagons.lua:967
-msgid "Line"
-msgstr "火车线路"
+#: advtrains/wagons.lua
+#, fuzzy
+msgid "This Wagon ID"
+msgstr "车厢已满。"
-#: advtrains/wagons.lua:968
-msgid "Routingcode"
-msgstr "路由码"
+#: advtrains/wagons.lua
+msgid "This wagon has no seats."
+msgstr "这节车厢没有座位。"
-#: advtrains/wagons.lua:1241
+#: advtrains/wagons.lua
+msgid "This wagon is full."
+msgstr "车厢已满。"
+
+#: advtrains/wagons.lua
+msgid "This wagon is owned by @1, you can't destroy it."
+msgstr "这是 @1 的车厢,您不能摧毁它。"
+
+#: advtrains/wagons.lua
+msgid "Train ID"
+msgstr ""
+
+#: advtrains/wagons.lua
+msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
+msgstr ""
+
+#: advtrains/wagons.lua
+msgid "Wagon properties"
+msgstr "车厢属性"
+
+#: advtrains/wagons.lua
msgid ""
-"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
-"off."
-msgstr "车门已关闭,请使用潜行+右键单击下车。"
+"Warning: If you destroy this wagon, you only get some steel back! If you are "
+"sure, hold Sneak and left-click the wagon."
+msgstr ""
+"警告:如果您摧毁此车厢,您只能拿到一些钢方块。如果您确定要摧毁这节车厢,请按"
+"潜行键并左键单击此车厢。"
-#: advtrains/wagons.lua:1250
+#: advtrains/wagons.lua
msgid "You are not allowed to access the driver stand."
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:13
+#: advtrains/wagons.lua
+msgid "You can't get on this wagon."
+msgstr ""
+
+#: advtrains_interlocking/routesetting.lua
+msgid "Route state changed."
+msgstr ""
+
+#: advtrains_interlocking/tsr_rail.lua
+msgid "Point Speed Restriction Track"
+msgstr ""
+
+#: advtrains_interlocking/tsr_rail.lua
msgid "Point speed restriction: @1"
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:14
+#: advtrains_interlocking/tsr_rail.lua
msgid "Set point speed restriction:"
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:30
+#: advtrains_interlocking/tsr_rail.lua
msgid "You are not allowed to configure this track without the @1 privilege."
msgstr "您没有“@1”权限,不能调整这段轨道。"
-#: advtrains_interlocking/tsr_rail.lua:34
-#: advtrains_line_automation/stoprail.lua:31
-#: advtrains_line_automation/stoprail.lua:76
+#: advtrains_interlocking/tsr_rail.lua advtrains_line_automation/stoprail.lua
msgid "You are not allowed to configure this track."
msgstr "您不能调整这段轨道。"
-#: advtrains_interlocking/tsr_rail.lua:64
-msgid "Point Speed Restriction Track"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua:54
-msgid "Station Code"
-msgstr "车站代码"
-
-#: advtrains_line_automation/stoprail.lua:55
-msgid "Station Name"
-msgstr "车站名称"
-
-#: advtrains_line_automation/stoprail.lua:56
-msgid "Door Delay"
-msgstr "车门关闭时间"
-
-#: advtrains_line_automation/stoprail.lua:57
+#: advtrains_line_automation/stoprail.lua
msgid "Dep. Speed"
msgstr "出发速度"
-#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11
-#: advtrains_train_track/init.lua:156
-msgid "Track"
-msgstr "轨道"
-
-#: advtrains_line_automation/stoprail.lua:59
-msgid "Stop Time"
-msgstr "停站时间"
+#: advtrains_line_automation/stoprail.lua
+msgid "Door Delay"
+msgstr "车门关闭时间"
-#: advtrains_line_automation/stoprail.lua:60
+#: advtrains_line_automation/stoprail.lua
msgid "Door Side"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:62
+#: advtrains_line_automation/stoprail.lua
+msgid "Kick out passengers"
+msgstr "踢出乘客"
+
+#: advtrains_line_automation/stoprail.lua
msgid "Reverse train"
msgstr "改变行车方向"
-#: advtrains_line_automation/stoprail.lua:63
-msgid "Kick out passengers"
-msgstr "踢出乘客"
+#: advtrains_line_automation/stoprail.lua
+msgid "Station Code"
+msgstr "车站代码"
-#: advtrains_line_automation/stoprail.lua:97
-msgid "Station code \"@1\" already exists and is owned by @2."
-msgstr ""
+#: advtrains_line_automation/stoprail.lua
+msgid "Station Name"
+msgstr "车站名称"
-#: advtrains_line_automation/stoprail.lua:111
-msgid "This station is owned by @1. You are not allowed to edit its name."
+#: advtrains_line_automation/stoprail.lua
+msgid "Station code \"@1\" already exists and is owned by @2."
msgstr ""
-#: advtrains_line_automation/stoprail.lua:221
+#: advtrains_line_automation/stoprail.lua
msgid "Station/Stop Track"
msgstr "车站轨道"
-#: advtrains_luaautomation/active_common.lua:17
-msgid "Unconfigured LuaATC component"
-msgstr "LuaATC 部件 (未配置)"
+#: advtrains_line_automation/stoprail.lua
+msgid "Stop Time"
+msgstr "停站时间"
-#: advtrains_luaautomation/active_common.lua:46
-msgid "LuaATC Environment"
+#: advtrains_line_automation/stoprail.lua
+msgid "This station is owned by @1. You are not allowed to edit its name."
msgstr ""
-#: advtrains_luaautomation/active_common.lua:49
+#: advtrains_line_automation/stoprail.lua advtrains_train_track/init.lua
+msgid "Track"
+msgstr "轨道"
+
+#: advtrains_luaautomation/active_common.lua
msgid "Clear Local Environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:50
+#: advtrains_luaautomation/active_common.lua
msgid "Code"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:64
-msgid ""
-"You are not allowed to configure this LuaATC component without the @1 "
-"privilege."
-msgstr "您没有“@1”权限,不能配置这个 LuaATC 部件。"
-
-#: advtrains_luaautomation/active_common.lua:94
-msgid "LuaATC component assigned to environment '@1'"
+#: advtrains_luaautomation/active_common.lua
+msgid "LuaATC Environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:96
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC component assigned to an invalid environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:171
+#: advtrains_luaautomation/active_common.lua
+msgid "LuaATC component assigned to environment '@1'"
+msgstr ""
+
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC component with error: @1"
msgstr ""
-#: advtrains_luaautomation/init.lua:13
+#: advtrains_luaautomation/active_common.lua
+msgid "Unconfigured LuaATC component"
+msgstr "LuaATC 部件 (未配置)"
+
+#: advtrains_luaautomation/active_common.lua
+msgid ""
+"You are not allowed to configure this LuaATC component without the @1 "
+"privilege."
+msgstr "您没有“@1”权限,不能配置这个 LuaATC 部件。"
+
+#: advtrains_luaautomation/init.lua
msgid ""
"Can place and configure LuaATC components, including execute potentially "
"harmful Lua code"
msgstr ""
-#: advtrains_luaautomation/mesecon_controller.lua:211
+#: advtrains_luaautomation/mesecon_controller.lua
msgid "LuaATC Mesecon Controller"
msgstr ""
-#: advtrains_luaautomation/operation_panel.lua:11
+#: advtrains_luaautomation/operation_panel.lua
msgid "LuaATC Operation Panel"
msgstr ""
-#: advtrains_luaautomation/pcnaming.lua:28
+#: advtrains_luaautomation/pcnaming.lua
msgid ""
"Passive Component Naming Tool\n"
"\n"
@@ -528,119 +553,115 @@ msgstr ""
"\n"
"右键单击命名所选元件。"
-#: advtrains_luaautomation/pcnaming.lua:39
+#: advtrains_luaautomation/pcnaming.lua
+msgid "Set name of component (empty to clear)"
+msgstr ""
+
+#: advtrains_luaautomation/pcnaming.lua
msgid ""
"You are not allowed to name LuaATC passive components without the @1 "
"privilege."
msgstr "您没有“@1”权限,不能命名被动元件。"
-#: advtrains_luaautomation/pcnaming.lua:62
-msgid "Set name of component (empty to clear)"
-msgstr ""
-
-#: advtrains_train_industrial/init.lua:10
-#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20
-#: advtrains_train_steam/init.lua:91
-msgid "Driver Stand (right)"
-msgstr "右侧司机座位"
+#: advtrains_train_industrial/init.lua
+msgid "Big Industrial Train Engine"
+msgstr "大型工业用火车头"
-#: advtrains_train_industrial/init.lua:17
-#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14
-#: advtrains_train_steam/init.lua:85
+#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
msgid "Driver Stand (left)"
msgstr "左侧司机座位"
-#: advtrains_train_industrial/init.lua:40
+#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
+msgid "Driver Stand (right)"
+msgstr "右侧司机座位"
+
+#: advtrains_train_industrial/init.lua
msgid "Industrial Train Engine"
msgstr "工业用火车头"
-#: advtrains_train_industrial/init.lua:79
-msgid "Big Industrial Train Engine"
-msgstr "大型工业用火车头"
-
-#: advtrains_train_industrial/init.lua:98
+#: advtrains_train_industrial/init.lua
msgid "Industrial tank wagon"
msgstr "液体运输车厢"
-#: advtrains_train_industrial/init.lua:116
+#: advtrains_train_industrial/init.lua
msgid "Industrial wood wagon"
msgstr "木材运输车厢"
-#: advtrains_train_japan/init.lua:4
-msgid "Japanese Train Inter-Wagon Connection"
-msgstr "日本火车车钩"
-
-#: advtrains_train_japan/init.lua:37
+#: advtrains_train_japan/init.lua
msgid "Driver stand"
msgstr "司机座位"
-#: advtrains_train_japan/init.lua:101
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Engine"
msgstr "高速列车车头"
-#: advtrains_train_japan/init.lua:176
+#: advtrains_train_japan/init.lua
+msgid "Japanese Train Inter-Wagon Connection"
+msgstr "日本火车车钩"
+
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Wagon"
msgstr "高速列车车厢"
-#: advtrains_train_steam/init.lua:75
-msgid "Steam Engine"
-msgstr "蒸汽机车"
+#: advtrains_train_steam/init.lua
+msgid "Box Wagon"
+msgstr "货运车厢"
-#: advtrains_train_steam/init.lua:159
+#: advtrains_train_steam/init.lua
msgid "Detailed Steam Engine"
msgstr "精细的蒸汽机车"
-#: advtrains_train_steam/init.lua:206
+#: advtrains_train_steam/init.lua
msgid "Passenger Wagon"
msgstr "客车"
-#: advtrains_train_steam/init.lua:226
-msgid "Box Wagon"
-msgstr "货运车厢"
+#: advtrains_train_steam/init.lua
+msgid "Steam Engine"
+msgstr "蒸汽机车"
-#: advtrains_train_subway/init.lua:144
+#: advtrains_train_subway/init.lua
msgid "Subway Passenger Wagon"
msgstr "地铁车厢"
-#: advtrains_train_track/init.lua:31
-msgid "Y-turnout"
-msgstr "对称道岔"
-
-#: advtrains_train_track/init.lua:49
+#: advtrains_train_track/init.lua
msgid "3-way turnout"
msgstr "三开道岔"
-#: advtrains_train_track/init.lua:69
-msgid "Perpendicular Diamond Crossing Track"
-msgstr "垂直交叉轨道"
-
-#: advtrains_train_track/init.lua:91
+#: advtrains_train_track/init.lua
msgid "90+Angle Diamond Crossing Track"
msgstr "交叉轨道 (其中一条轨道与坐标轴平行)"
-#: advtrains_train_track/init.lua:132
-msgid "Diagonal Diamond Crossing Track"
-msgstr "交叉轨道"
+#: advtrains_train_track/init.lua
+msgid "ATC controller"
+msgstr "ATC 控制器"
-#: advtrains_train_track/init.lua:179
+#: advtrains_train_track/init.lua
msgid "Bumper"
msgstr "保险杠"
-#: advtrains_train_track/init.lua:201
-msgid "ATC controller"
-msgstr "ATC 控制器"
+#: advtrains_train_track/init.lua
+msgid "Detector Rail"
+msgstr "探测轨道"
-#: advtrains_train_track/init.lua:317
-msgid "Unloading Track"
-msgstr "卸货轨道"
+#: advtrains_train_track/init.lua
+msgid "Diagonal Diamond Crossing Track"
+msgstr "交叉轨道"
-#: advtrains_train_track/init.lua:342
+#: advtrains_train_track/init.lua
msgid "Loading Track"
msgstr "装货轨道"
-#: advtrains_train_track/init.lua:406
-msgid "Detector Rail"
-msgstr "探测轨道"
+#: advtrains_train_track/init.lua
+msgid "Perpendicular Diamond Crossing Track"
+msgstr "垂直交叉轨道"
+
+#: advtrains_train_track/init.lua
+msgid "Unloading Track"
+msgstr "卸货轨道"
+
+#: advtrains_train_track/init.lua
+msgid "Y-turnout"
+msgstr "对称道岔"
#~ msgid ""
#~ "ATC controller, mode @1\n"
diff --git a/advtrains/po/zh_TW.po b/advtrains/po/zh_TW.po
index ece82c3..97dab1b 100644
--- a/advtrains/po/zh_TW.po
+++ b/advtrains/po/zh_TW.po
@@ -2,7 +2,7 @@ msgid ""
msgstr ""
"Project-Id-Version: advtrains\n"
"Report-Msgid-Bugs-To: advtrains-discuss@lists.sr.ht\n"
-"POT-Creation-Date: 2023-10-09 11:02+0200\n"
+"POT-Creation-Date: 2024-12-06 21:17+0100\n"
"PO-Revision-Date: 2023-10-09 11:31+0200\n"
"Last-Translator: Y. Wang <yw05@forksworld.de>\n"
"Language-Team: Chinese (Traditional)\n"
@@ -12,11 +12,27 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 3.3.2\n"
-#: advtrains/atc.lua:109
-msgid "Unconfigured ATC controller"
-msgstr "ATC 控制器 (未配置)"
+#: advtrains/atc.lua
+msgid "ATC Kick command warning: doors are closed."
+msgstr "ATC 警告:車門已關閉,無法踢出乘客。"
+
+#: advtrains/atc.lua
+msgid "ATC Kick command warning: train moving."
+msgstr "ATC 警告:火車正在移動,無法踢出乘客。"
+
+#: advtrains/atc.lua
+msgid "ATC Reverse command warning: didn't reverse train, train moving."
+msgstr "ATC 警告:火車正在移動,無法改變行車方向。"
+
+#: advtrains/atc.lua
+msgid "ATC command parse error: Unknown command: @1"
+msgstr "ATC 語法錯誤:未知命令:@1"
-#: advtrains/atc.lua:150
+#: advtrains/atc.lua
+msgid "ATC command syntax error: I statement not closed: @1"
+msgstr "ATC 語法錯誤:「I」命令不完整:@1"
+
+#: advtrains/atc.lua
msgid ""
"ATC controller, mode @1\n"
"Command: @2"
@@ -25,44 +41,64 @@ msgstr ""
"模式:@1\n"
"命令:@2"
-#: advtrains/atc.lua:180
+#: advtrains/atc.lua
msgid "Command"
msgstr "命令"
-#: advtrains/atc.lua:184
+#: advtrains/atc.lua
msgid "Command (on)"
msgstr "命令 (啟用時)"
-#: advtrains/atc.lua:187
+#: advtrains/atc.lua
msgid "Digiline channel"
msgstr "Digiline 頻道"
-#: advtrains/atc.lua:189 advtrains_line_automation/stoprail.lua:65
-#: advtrains_luaautomation/active_common.lua:48
+#: advtrains/atc.lua advtrains_line_automation/stoprail.lua
+#: advtrains_luaautomation/active_common.lua
msgid "Save"
msgstr "儲存"
-#: advtrains/atc.lua:236
-msgid "ATC Reverse command warning: didn't reverse train, train moving."
-msgstr "ATC 警告:火車正在移動,無法改變行車方向。"
+#: advtrains/atc.lua
+msgid "Unconfigured ATC controller"
+msgstr "ATC 控制器 (未配置)"
-#: advtrains/atc.lua:248
-msgid "ATC Kick command warning: doors are closed."
-msgstr "ATC 警告:車門已關閉,無法踢出乘客。"
+#: advtrains/copytool.lua
+msgid "Back of train would end up off track, cancelling."
+msgstr "火車後部不在軌道上。"
-#: advtrains/atc.lua:252
-msgid "ATC Kick command warning: train moving."
-msgstr "ATC 警告:火車正在移動,無法踢出乘客。"
+#: advtrains/copytool.lua
+msgid "No such lua entity."
+msgstr "您沒有指向一個可以用火車複製工具複製的物體。"
-#: advtrains/atc.lua:322
-msgid "ATC command syntax error: I statement not closed: @1"
-msgstr "ATC 語法錯誤:「I」命令不完整:@1"
+#: advtrains/copytool.lua
+msgid "No such train: @1."
+msgstr "ID 為「@1」的列車不存在。"
-#: advtrains/atc.lua:385
-msgid "ATC command parse error: Unknown command: @1"
-msgstr "ATC 語法錯誤:未知命令:@1"
+#: advtrains/copytool.lua
+msgid "No such wagon: @1."
+msgstr "ID 為「@1」的車廂不存在。"
-#: advtrains/copytool.lua:8
+#: advtrains/copytool.lua
+msgid "The clipboard couldn't access the metadata. Copy failed."
+msgstr "無法複製:剪貼簿無法訪問元資料。"
+
+#: advtrains/copytool.lua
+msgid "The clipboard couldn't access the metadata. Paste failed."
+msgstr "無法貼上:剪貼簿無法訪問元資料。"
+
+#: advtrains/copytool.lua
+msgid "The clipboard is empty."
+msgstr "剪貼簿是空的。"
+
+#: advtrains/copytool.lua
+msgid "The track you are trying to place the wagon on is not long enough."
+msgstr "軌道太短。"
+
+#: advtrains/copytool.lua
+msgid "Train copied."
+msgstr "已複製火車。"
+
+#: advtrains/copytool.lua
msgid ""
"Train copy/paste tool\n"
"\n"
@@ -74,166 +110,146 @@ msgstr ""
"左鍵單擊:複製\n"
"右鍵單擊:粘帖"
-#: advtrains/copytool.lua:29
+#: advtrains/copytool.lua
msgid "You do not have the @1 privilege."
msgstr "您沒有「@1」許可權。"
-#: advtrains/copytool.lua:41
-msgid "The track you are trying to place the wagon on is not long enough."
-msgstr "軌道太短。"
-
-#: advtrains/copytool.lua:47
-msgid "The clipboard couldn't access the metadata. Paste failed."
-msgstr "無法貼上:剪貼簿無法訪問元資料。"
-
-#: advtrains/copytool.lua:52 advtrains/copytool.lua:57
-msgid "The clipboard is empty."
-msgstr "剪貼簿是空的。"
-
-#: advtrains/copytool.lua:74
-msgid "Back of train would end up off track, cancelling."
-msgstr "火車後部不在軌道上。"
-
-#: advtrains/copytool.lua:92
-msgid "No such lua entity."
-msgstr "您沒有指向一個可以用火車複製工具複製的物體。"
-
-#: advtrains/copytool.lua:98
-msgid "No such wagon: @1."
-msgstr "ID 為「@1」的車廂不存在。"
-
-#: advtrains/copytool.lua:104
-msgid "No such train: @1."
-msgstr "ID 為「@1」的列車不存在。"
-
-#: advtrains/copytool.lua:176
-msgid "The clipboard couldn't access the metadata. Copy failed."
-msgstr "無法複製:剪貼簿無法訪問元資料。"
-
-#: advtrains/copytool.lua:180
-msgid "Train copied."
-msgstr "已複製火車。"
+#: advtrains/couple.lua
+msgid "<No coupler>"
+msgstr "<無連結器>"
-#: advtrains/couple.lua:28
+#: advtrains/couple.lua
msgid "Buffer and Chain Coupler"
msgstr "鏈式連結器"
-#: advtrains/couple.lua:29
+#: advtrains/couple.lua
+msgid "Can not couple: The couplers of the trains do not match (@1 and @2)."
+msgstr "您無法連結這兩節車廂:這兩節車廂使用不同的連結器 (@1和@2)。"
+
+#: advtrains/couple.lua
msgid "Scharfenberg Coupler"
msgstr "Scharfenberg 式連結器"
-#: advtrains/couple.lua:185
+#: advtrains/couple.lua
msgid ""
"You are not allowed to couple trains without the train_operator privilege."
msgstr "您沒有「train_operator」許可權,不能連結這兩節車廂。"
-#: advtrains/couple.lua:329 advtrains/couple.lua:333
-msgid "<No coupler>"
-msgstr "<無連結器>"
-
-#: advtrains/couple.lua:334
-msgid "Can not couple: The couplers of the trains do not match (@1 and @2)."
-msgstr "您無法連結這兩節車廂:這兩節車廂使用不同的連結器 (@1和@2)。"
-
-#: advtrains/craft_items.lua:3
+#: advtrains/craft_items.lua
msgid "Boiler"
msgstr "鍋爐"
-#: advtrains/craft_items.lua:9
+#: advtrains/craft_items.lua
+msgid "Chimney"
+msgstr "煙囪"
+
+#: advtrains/craft_items.lua
msgid "Driver's cab"
msgstr "駕駛室"
-#: advtrains/craft_items.lua:15
+#: advtrains/craft_items.lua
msgid "Wheel"
msgstr "車輪"
-#: advtrains/craft_items.lua:21
-msgid "Chimney"
-msgstr "煙囪"
-
-#: advtrains/misc_nodes.lua:16
-msgid "@1 Platform (low)"
-msgstr "較低的@1月臺"
+#: advtrains/misc_nodes.lua
+msgid "@1 Platform (45 degree)"
+msgstr "較高的@1月臺 (45°)"
-#: advtrains/misc_nodes.lua:33
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (high)"
msgstr "較高的@1月臺"
-#: advtrains/misc_nodes.lua:59
-msgid "@1 Platform (45 degree)"
-msgstr "較高的@1月臺 (45°)"
+#: advtrains/misc_nodes.lua
+msgid "@1 Platform (low)"
+msgstr "較低的@1月臺"
-#: advtrains/misc_nodes.lua:81
+#: advtrains/misc_nodes.lua
msgid "@1 Platform (low, 45 degree)"
msgstr "較低的@1月臺 (45°)"
-#: advtrains/protection.lua:7
-msgid "Can place, remove and operate trains"
+#: advtrains/protection.lua
+msgid "Can operate turnouts and signals in unprotected areas"
msgstr ""
-#: advtrains/protection.lua:12
+#: advtrains/protection.lua
+msgid "Can place and dig tracks in unprotected areas"
+msgstr ""
+
+#: advtrains/protection.lua
msgid ""
"Can place, remove and operate any train, regardless of owner, whitelist, or "
"protection"
msgstr ""
-#: advtrains/protection.lua:18
-msgid "Can place and dig tracks in unprotected areas"
+#: advtrains/protection.lua
+msgid "Can place, remove and operate trains"
msgstr ""
-#: advtrains/protection.lua:24
-msgid "Can operate turnouts and signals in unprotected areas"
-msgstr ""
+#: advtrains/protection.lua
+msgid "You are not allowed to build near tracks at this protected position."
+msgstr "這裡已被保護,您不能在這裡的鐵路附近建任何東西。"
-#: advtrains/protection.lua:148
+#: advtrains/protection.lua
msgid ""
"You are not allowed to build near tracks without the track_builder privilege."
msgstr "您沒有「train_operator」許可權,不能在鐵路附近建任何東西。"
-#: advtrains/protection.lua:148
+#: advtrains/protection.lua
+msgid "You are not allowed to build tracks at this protected position."
+msgstr "這裡已被保護,您不能在這裡建造鐵路。"
+
+#: advtrains/protection.lua
msgid ""
"You are not allowed to build tracks without the track_builder privilege."
msgstr "您沒有「train_operator」許可權,不能在這裡建造鐵路。"
-#: advtrains/protection.lua:153
-msgid "You are not allowed to build near tracks at this protected position."
-msgstr "這裡已被保護,您不能在這裡的鐵路附近建任何東西。"
-
-#: advtrains/protection.lua:153
-msgid "You are not allowed to build tracks at this protected position."
-msgstr "這裡已被保護,您不能在這裡建造鐵路。"
-
-#: advtrains/protection.lua:184
+#: advtrains/protection.lua
msgid ""
"You are not allowed to operate turnouts and signals without the "
"railway_operator privilege."
msgstr "您沒有「railway_operator」許可權,不能控制鐵路設施。"
-#: advtrains/signals.lua:63
+#: advtrains/signals.lua
+msgid "Andrew's Cross"
+msgstr "平交道號誌燈"
+
+#: advtrains/signals.lua
msgid "Lampless Signal"
msgstr "臂木式號誌機"
-#: advtrains/signals.lua:127
+#: advtrains/signals.lua
msgid "Signal"
msgstr "色燈號誌機"
-#: advtrains/signals.lua:191
+#: advtrains/signals.lua
msgid "Wallmounted Signal (left)"
msgstr "壁掛式色燈號誌機 (左側)"
-#: advtrains/signals.lua:192
+#: advtrains/signals.lua
msgid "Wallmounted Signal (right)"
msgstr "壁掛式色燈號誌機 (右側)"
-#: advtrains/signals.lua:193
+#: advtrains/signals.lua
msgid "Wallmounted Signal (top)"
msgstr "懸掛式色燈號誌機"
-#: advtrains/signals.lua:281 advtrains/signals.lua:322
-msgid "Andrew's Cross"
-msgstr "平交道號誌燈"
+#: advtrains/trackplacer.lua
+msgid "This node can't be changed using the trackworker."
+msgstr "您不能使用鐵路調整工具調整這個方塊。"
+
+#: advtrains/trackplacer.lua
+msgid "This node can't be rotated using the trackworker."
+msgstr "您不能使用鐵路調整工具旋轉這個方塊。"
+
+#: advtrains/trackplacer.lua
+msgid "This track can not be changed."
+msgstr "您不能調整這段軌道。"
+
+#: advtrains/trackplacer.lua
+msgid "This track can not be rotated."
+msgstr "您不能旋轉這段軌道。"
-#: advtrains/trackplacer.lua:313
+#: advtrains/trackplacer.lua
msgid ""
"Track Worker Tool\n"
"\n"
@@ -245,280 +261,289 @@ msgstr ""
"左鍵單擊:切換軌道型別\n"
"右鍵單擊:旋轉方塊"
-#: advtrains/trackplacer.lua:340 advtrains/trackplacer.lua:377
-msgid "This node can't be rotated using the trackworker."
-msgstr "您不能使用鐵路調整工具旋轉這個方塊。"
-
-#: advtrains/trackplacer.lua:350
-msgid "This track can not be rotated."
-msgstr "您不能旋轉這段軌道。"
-
-#: advtrains/trackplacer.lua:404
-msgid "This node can't be changed using the trackworker."
-msgstr "您不能使用鐵路調整工具調整這個方塊。"
-
-#: advtrains/trackplacer.lua:414
-msgid "This track can not be changed."
-msgstr "您不能調整這段軌道。"
-
-#: advtrains/tracks.lua:449
-msgid "This track can not be removed."
-msgstr "您不能移除這段軌道。"
-
-#: advtrains/tracks.lua:616
-msgid "Position is occupied by a train."
-msgstr ""
-
-#: advtrains/tracks.lua:622
-msgid "There's a Track Circuit Break here."
-msgstr ""
-
-#: advtrains/tracks.lua:626
-msgid "There's a Signal Influence Point here."
-msgstr ""
-
-#: advtrains/tracks.lua:637
+#: advtrains/tracks.lua
msgid "@1 Slope"
msgstr "@1斜坡"
-#: advtrains/tracks.lua:648 advtrains/tracks.lua:653
-msgid "Can't place slope: not pointing at node."
-msgstr "無法放置斜坡:您沒有選擇任何方塊。"
-
-#: advtrains/tracks.lua:658
-msgid "Can't place slope: space occupied."
-msgstr "無法放置斜坡:此區域已被佔用。"
-
-#: advtrains/tracks.lua:711
+#: advtrains/tracks.lua
msgid "Can't place slope: Not enough slope items left (@1 required)."
msgstr "無法放置斜坡:您沒有足夠的鐵路斜坡放置工具 (您總共需要@1個)"
-#: advtrains/tracks.lua:714
+#: advtrains/tracks.lua
msgid "Can't place slope: There's no slope of length @1."
msgstr "無法放置斜坡:advtrains 不支援長度為@1米的斜坡。"
-#: advtrains/tracks.lua:721
+#: advtrains/tracks.lua
msgid "Can't place slope: no supporting node at upper end."
msgstr "無法放置斜坡:較高階沒有支撐方塊。"
-#: advtrains/trainhud.lua:305
-msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
+#: advtrains/tracks.lua
+msgid "Can't place slope: not pointing at node."
+msgstr "無法放置斜坡:您沒有選擇任何方塊。"
+
+#: advtrains/tracks.lua
+msgid "Can't place slope: space occupied."
+msgstr "無法放置斜坡:此區域已被佔用。"
+
+#: advtrains/tracks.lua
+msgid "Position is occupied by a train."
msgstr ""
-#: advtrains/wagons.lua:179
-msgid "This wagon is owned by @1, you can't destroy it."
-msgstr "這是 @1 的車廂,您不能摧毀它。"
+#: advtrains/tracks.lua
+msgid "There's a Signal Influence Point here."
+msgstr ""
-#: advtrains/wagons.lua:203
-msgid "The wagon's inventory is not empty."
+#: advtrains/tracks.lua
+msgid "There's a Track Circuit Break here."
msgstr ""
-#: advtrains/wagons.lua:210
-msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
+#: advtrains/tracks.lua
+msgid "This track can not be removed."
+msgstr "您不能移除這段軌道。"
+
+#: advtrains/trainhud.lua
+msgid "OVERRUN RED SIGNAL! Examine situation and reverse train to move again."
+msgstr ""
+
+#: advtrains/wagonprop_tool.lua
+msgid "Insufficient privileges to use this!"
msgstr ""
-#: advtrains/wagons.lua:216
+#: advtrains/wagonprop_tool.lua
+#, fuzzy
+msgid "Wagon Properties Tool"
+msgstr "車廂屬性"
+
+#: advtrains/wagonprop_tool.lua
msgid ""
-"Warning: If you destroy this wagon, you only get some steel back! If you are "
-"sure, hold Sneak and left-click the wagon."
+"Wagon Properties Tool\n"
+"Punch a wagon to view and edit the Wagon Properties"
msgstr ""
-"警告:如果您摧毀此車廂,您只能拿到一些鋼方塊。如果您確定要摧毀這節車廂,請按"
-"潛行鍵並左鍵單擊此車廂。"
-#: advtrains/wagons.lua:649 advtrains/wagons.lua:850
-msgid "Show Inventory"
-msgstr "顯示物品欄"
+#: advtrains/wagons.lua
+msgid "(Doors closed)"
+msgstr "(車門已關閉)"
-#: advtrains/wagons.lua:652
-msgid "Onboard Computer"
+#: advtrains/wagons.lua
+msgid "Doors are closed! (Try holding sneak key!)"
msgstr ""
-#: advtrains/wagons.lua:655 advtrains/wagons.lua:1328
-msgid "Wagon properties"
-msgstr "車廂屬性"
+#: advtrains/wagons.lua
+msgid ""
+"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
+"off."
+msgstr "車門已關閉,請使用潛行+右鍵單擊下車。"
-#: advtrains/wagons.lua:658
+#: advtrains/wagons.lua
msgid "Get off"
msgstr "下車"
-#: advtrains/wagons.lua:661
+#: advtrains/wagons.lua
msgid "Get off (forced)"
msgstr "強制下車"
-#: advtrains/wagons.lua:663
-msgid "(Doors closed)"
-msgstr "(車門已關閉)"
-
-#: advtrains/wagons.lua:692
-msgid "This wagon has no seats."
-msgstr "這節車廂沒有座位。"
-
-#: advtrains/wagons.lua:703
-msgid "This wagon is full."
-msgstr "車廂已滿。"
+#: advtrains/wagons.lua
+msgid "Line"
+msgstr "火車線路"
-#: advtrains/wagons.lua:706
-msgid "Doors are closed! (Try holding sneak key!)"
+#: advtrains/wagons.lua
+msgid "Onboard Computer"
msgstr ""
-#: advtrains/wagons.lua:712
-msgid "You can't get on this wagon."
-msgstr ""
+#: advtrains/wagons.lua
+msgid "Routingcode"
+msgstr "路由碼"
+
+#: advtrains/wagons.lua
+msgid "Save wagon properties"
+msgstr "儲存車廂屬性"
-#: advtrains/wagons.lua:838
+#: advtrains/wagons.lua
msgid "Select seat:"
msgstr "請選擇座位:"
-#: advtrains/wagons.lua:880
-msgid "Save wagon properties"
-msgstr "儲存車廂屬性"
+#: advtrains/wagons.lua
+msgid "Show Inventory"
+msgstr "顯示物品欄"
+
+#: advtrains/wagons.lua
+msgid "Text displayed inside train"
+msgstr "車廂內部顯示"
-#: advtrains/wagons.lua:965
+#: advtrains/wagons.lua
msgid "Text displayed outside on train"
msgstr "車廂外部顯示"
-#: advtrains/wagons.lua:966
-msgid "Text displayed inside train"
-msgstr "車廂內部顯示"
+#: advtrains/wagons.lua
+msgid "The wagon's inventory is not empty."
+msgstr ""
-#: advtrains/wagons.lua:967
-msgid "Line"
-msgstr "火車線路"
+#: advtrains/wagons.lua
+#, fuzzy
+msgid "This Wagon ID"
+msgstr "車廂已滿。"
-#: advtrains/wagons.lua:968
-msgid "Routingcode"
-msgstr "路由碼"
+#: advtrains/wagons.lua
+msgid "This wagon has no seats."
+msgstr "這節車廂沒有座位。"
-#: advtrains/wagons.lua:1241
+#: advtrains/wagons.lua
+msgid "This wagon is full."
+msgstr "車廂已滿。"
+
+#: advtrains/wagons.lua
+msgid "This wagon is owned by @1, you can't destroy it."
+msgstr "這是 @1 的車廂,您不能摧毀它。"
+
+#: advtrains/wagons.lua
+msgid "Train ID"
+msgstr ""
+
+#: advtrains/wagons.lua
+msgid "Wagon needs to be decoupled from other wagons in order to destroy it."
+msgstr ""
+
+#: advtrains/wagons.lua
+msgid "Wagon properties"
+msgstr "車廂屬性"
+
+#: advtrains/wagons.lua
msgid ""
-"Doors are closed. Use Sneak+rightclick to ignore the closed doors and get "
-"off."
-msgstr "車門已關閉,請使用潛行+右鍵單擊下車。"
+"Warning: If you destroy this wagon, you only get some steel back! If you are "
+"sure, hold Sneak and left-click the wagon."
+msgstr ""
+"警告:如果您摧毀此車廂,您只能拿到一些鋼方塊。如果您確定要摧毀這節車廂,請按"
+"潛行鍵並左鍵單擊此車廂。"
-#: advtrains/wagons.lua:1250
+#: advtrains/wagons.lua
msgid "You are not allowed to access the driver stand."
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:13
+#: advtrains/wagons.lua
+msgid "You can't get on this wagon."
+msgstr ""
+
+#: advtrains_interlocking/routesetting.lua
+msgid "Route state changed."
+msgstr ""
+
+#: advtrains_interlocking/tsr_rail.lua
+msgid "Point Speed Restriction Track"
+msgstr ""
+
+#: advtrains_interlocking/tsr_rail.lua
msgid "Point speed restriction: @1"
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:14
+#: advtrains_interlocking/tsr_rail.lua
msgid "Set point speed restriction:"
msgstr ""
-#: advtrains_interlocking/tsr_rail.lua:30
+#: advtrains_interlocking/tsr_rail.lua
msgid "You are not allowed to configure this track without the @1 privilege."
msgstr "您沒有「@1」許可權,不能調整這段軌道。"
-#: advtrains_interlocking/tsr_rail.lua:34
-#: advtrains_line_automation/stoprail.lua:31
-#: advtrains_line_automation/stoprail.lua:76
+#: advtrains_interlocking/tsr_rail.lua advtrains_line_automation/stoprail.lua
msgid "You are not allowed to configure this track."
msgstr "您不能調整這段軌道。"
-#: advtrains_interlocking/tsr_rail.lua:64
-msgid "Point Speed Restriction Track"
-msgstr ""
-
-#: advtrains_line_automation/stoprail.lua:54
-msgid "Station Code"
-msgstr "車站碼"
-
-#: advtrains_line_automation/stoprail.lua:55
-msgid "Station Name"
-msgstr "車站名稱"
-
-#: advtrains_line_automation/stoprail.lua:56
-msgid "Door Delay"
-msgstr "車門關閉時間"
-
-#: advtrains_line_automation/stoprail.lua:57
+#: advtrains_line_automation/stoprail.lua
msgid "Dep. Speed"
msgstr "出發速度"
-#: advtrains_line_automation/stoprail.lua:58 advtrains_train_track/init.lua:11
-#: advtrains_train_track/init.lua:156
-msgid "Track"
-msgstr "軌道"
-
-#: advtrains_line_automation/stoprail.lua:59
-msgid "Stop Time"
-msgstr "停站時間"
+#: advtrains_line_automation/stoprail.lua
+msgid "Door Delay"
+msgstr "車門關閉時間"
-#: advtrains_line_automation/stoprail.lua:60
+#: advtrains_line_automation/stoprail.lua
msgid "Door Side"
msgstr ""
-#: advtrains_line_automation/stoprail.lua:62
+#: advtrains_line_automation/stoprail.lua
+msgid "Kick out passengers"
+msgstr "踢出乘客"
+
+#: advtrains_line_automation/stoprail.lua
msgid "Reverse train"
msgstr "改變行車方向"
-#: advtrains_line_automation/stoprail.lua:63
-msgid "Kick out passengers"
-msgstr "踢出乘客"
+#: advtrains_line_automation/stoprail.lua
+msgid "Station Code"
+msgstr "車站碼"
-#: advtrains_line_automation/stoprail.lua:97
-msgid "Station code \"@1\" already exists and is owned by @2."
-msgstr ""
+#: advtrains_line_automation/stoprail.lua
+msgid "Station Name"
+msgstr "車站名稱"
-#: advtrains_line_automation/stoprail.lua:111
-msgid "This station is owned by @1. You are not allowed to edit its name."
+#: advtrains_line_automation/stoprail.lua
+msgid "Station code \"@1\" already exists and is owned by @2."
msgstr ""
-#: advtrains_line_automation/stoprail.lua:221
+#: advtrains_line_automation/stoprail.lua
msgid "Station/Stop Track"
msgstr "車站軌道"
-#: advtrains_luaautomation/active_common.lua:17
-msgid "Unconfigured LuaATC component"
-msgstr "LuaATC 元件 (未配置)"
+#: advtrains_line_automation/stoprail.lua
+msgid "Stop Time"
+msgstr "停站時間"
-#: advtrains_luaautomation/active_common.lua:46
-msgid "LuaATC Environment"
+#: advtrains_line_automation/stoprail.lua
+msgid "This station is owned by @1. You are not allowed to edit its name."
msgstr ""
-#: advtrains_luaautomation/active_common.lua:49
+#: advtrains_line_automation/stoprail.lua advtrains_train_track/init.lua
+msgid "Track"
+msgstr "軌道"
+
+#: advtrains_luaautomation/active_common.lua
msgid "Clear Local Environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:50
+#: advtrains_luaautomation/active_common.lua
msgid "Code"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:64
-msgid ""
-"You are not allowed to configure this LuaATC component without the @1 "
-"privilege."
-msgstr "您沒有「@1」許可權,不能配置這個 LuaATC 元件。"
-
-#: advtrains_luaautomation/active_common.lua:94
-msgid "LuaATC component assigned to environment '@1'"
+#: advtrains_luaautomation/active_common.lua
+msgid "LuaATC Environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:96
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC component assigned to an invalid environment"
msgstr ""
-#: advtrains_luaautomation/active_common.lua:171
+#: advtrains_luaautomation/active_common.lua
+msgid "LuaATC component assigned to environment '@1'"
+msgstr ""
+
+#: advtrains_luaautomation/active_common.lua
msgid "LuaATC component with error: @1"
msgstr ""
-#: advtrains_luaautomation/init.lua:13
+#: advtrains_luaautomation/active_common.lua
+msgid "Unconfigured LuaATC component"
+msgstr "LuaATC 元件 (未配置)"
+
+#: advtrains_luaautomation/active_common.lua
+msgid ""
+"You are not allowed to configure this LuaATC component without the @1 "
+"privilege."
+msgstr "您沒有「@1」許可權,不能配置這個 LuaATC 元件。"
+
+#: advtrains_luaautomation/init.lua
msgid ""
"Can place and configure LuaATC components, including execute potentially "
"harmful Lua code"
msgstr ""
-#: advtrains_luaautomation/mesecon_controller.lua:211
+#: advtrains_luaautomation/mesecon_controller.lua
msgid "LuaATC Mesecon Controller"
msgstr ""
-#: advtrains_luaautomation/operation_panel.lua:11
+#: advtrains_luaautomation/operation_panel.lua
msgid "LuaATC Operation Panel"
msgstr ""
-#: advtrains_luaautomation/pcnaming.lua:28
+#: advtrains_luaautomation/pcnaming.lua
msgid ""
"Passive Component Naming Tool\n"
"\n"
@@ -528,119 +553,115 @@ msgstr ""
"\n"
"右鍵單擊命名所選元件。"
-#: advtrains_luaautomation/pcnaming.lua:39
+#: advtrains_luaautomation/pcnaming.lua
+msgid "Set name of component (empty to clear)"
+msgstr ""
+
+#: advtrains_luaautomation/pcnaming.lua
msgid ""
"You are not allowed to name LuaATC passive components without the @1 "
"privilege."
msgstr "您沒有「@1」許可權,不能命名這個元件。"
-#: advtrains_luaautomation/pcnaming.lua:62
-msgid "Set name of component (empty to clear)"
-msgstr ""
-
-#: advtrains_train_industrial/init.lua:10
-#: advtrains_train_industrial/init.lua:49 advtrains_train_steam/init.lua:20
-#: advtrains_train_steam/init.lua:91
-msgid "Driver Stand (right)"
-msgstr "右側司機座位"
+#: advtrains_train_industrial/init.lua
+msgid "Big Industrial Train Engine"
+msgstr "大型工業用火車頭"
-#: advtrains_train_industrial/init.lua:17
-#: advtrains_train_industrial/init.lua:56 advtrains_train_steam/init.lua:14
-#: advtrains_train_steam/init.lua:85
+#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
msgid "Driver Stand (left)"
msgstr "左側司機座位"
-#: advtrains_train_industrial/init.lua:40
+#: advtrains_train_industrial/init.lua advtrains_train_steam/init.lua
+msgid "Driver Stand (right)"
+msgstr "右側司機座位"
+
+#: advtrains_train_industrial/init.lua
msgid "Industrial Train Engine"
msgstr "工業用火車頭"
-#: advtrains_train_industrial/init.lua:79
-msgid "Big Industrial Train Engine"
-msgstr "大型工業用火車頭"
-
-#: advtrains_train_industrial/init.lua:98
+#: advtrains_train_industrial/init.lua
msgid "Industrial tank wagon"
msgstr "液體運輸車廂"
-#: advtrains_train_industrial/init.lua:116
+#: advtrains_train_industrial/init.lua
msgid "Industrial wood wagon"
msgstr "木材運輸車廂"
-#: advtrains_train_japan/init.lua:4
-msgid "Japanese Train Inter-Wagon Connection"
-msgstr "日本火車連結器"
-
-#: advtrains_train_japan/init.lua:37
+#: advtrains_train_japan/init.lua
msgid "Driver stand"
msgstr "司機座位"
-#: advtrains_train_japan/init.lua:101
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Engine"
msgstr "高速列車車頭"
-#: advtrains_train_japan/init.lua:176
+#: advtrains_train_japan/init.lua
+msgid "Japanese Train Inter-Wagon Connection"
+msgstr "日本火車連結器"
+
+#: advtrains_train_japan/init.lua
msgid "Japanese Train Wagon"
msgstr "高速列車車廂"
-#: advtrains_train_steam/init.lua:75
-msgid "Steam Engine"
-msgstr "蒸汽機車"
+#: advtrains_train_steam/init.lua
+msgid "Box Wagon"
+msgstr "貨運車廂"
-#: advtrains_train_steam/init.lua:159
+#: advtrains_train_steam/init.lua
msgid "Detailed Steam Engine"
msgstr "精細的蒸汽機車"
-#: advtrains_train_steam/init.lua:206
+#: advtrains_train_steam/init.lua
msgid "Passenger Wagon"
msgstr "客車"
-#: advtrains_train_steam/init.lua:226
-msgid "Box Wagon"
-msgstr "貨運車廂"
+#: advtrains_train_steam/init.lua
+msgid "Steam Engine"
+msgstr "蒸汽機車"
-#: advtrains_train_subway/init.lua:144
+#: advtrains_train_subway/init.lua
msgid "Subway Passenger Wagon"
msgstr "地鐵車廂"
-#: advtrains_train_track/init.lua:31
-msgid "Y-turnout"
-msgstr "對稱道岔"
-
-#: advtrains_train_track/init.lua:49
+#: advtrains_train_track/init.lua
msgid "3-way turnout"
msgstr "三開道岔"
-#: advtrains_train_track/init.lua:69
-msgid "Perpendicular Diamond Crossing Track"
-msgstr "垂直交叉軌道"
-
-#: advtrains_train_track/init.lua:91
+#: advtrains_train_track/init.lua
msgid "90+Angle Diamond Crossing Track"
msgstr "交叉軌道 (其中一條軌道與座標軸平行)"
-#: advtrains_train_track/init.lua:132
-msgid "Diagonal Diamond Crossing Track"
-msgstr "交叉軌道"
+#: advtrains_train_track/init.lua
+msgid "ATC controller"
+msgstr "ATC 控制器"
-#: advtrains_train_track/init.lua:179
+#: advtrains_train_track/init.lua
msgid "Bumper"
msgstr "保險槓"
-#: advtrains_train_track/init.lua:201
-msgid "ATC controller"
-msgstr "ATC 控制器"
+#: advtrains_train_track/init.lua
+msgid "Detector Rail"
+msgstr "探測軌道"
-#: advtrains_train_track/init.lua:317
-msgid "Unloading Track"
-msgstr "卸貨軌道"
+#: advtrains_train_track/init.lua
+msgid "Diagonal Diamond Crossing Track"
+msgstr "交叉軌道"
-#: advtrains_train_track/init.lua:342
+#: advtrains_train_track/init.lua
msgid "Loading Track"
msgstr "裝貨軌道"
-#: advtrains_train_track/init.lua:406
-msgid "Detector Rail"
-msgstr "探測軌道"
+#: advtrains_train_track/init.lua
+msgid "Perpendicular Diamond Crossing Track"
+msgstr "垂直交叉軌道"
+
+#: advtrains_train_track/init.lua
+msgid "Unloading Track"
+msgstr "卸貨軌道"
+
+#: advtrains_train_track/init.lua
+msgid "Y-turnout"
+msgstr "對稱道岔"
#~ msgid ""
#~ "ATC controller, mode @1\n"
diff --git a/advtrains/poconvert.lua b/advtrains/poconvert.lua
index 3075282..74f962e 100644
--- a/advtrains/poconvert.lua
+++ b/advtrains/poconvert.lua
@@ -13,7 +13,7 @@ do
local function replace_single(pfx, c)
local pl = #pfx
if pl % 2 == 0 then
- return pfx:sub(1, pl/2) .. c
+ return string.sub(pfx, 1, pl/2) .. c
end
return string.sub(pfx, 1, math.floor(pl/2)) .. (schartbl[c] or c)
end
diff --git a/advtrains/settingtypes.txt b/advtrains/settingtypes.txt
index 2b627cb..a495d1e 100644
--- a/advtrains/settingtypes.txt
+++ b/advtrains/settingtypes.txt
@@ -61,3 +61,6 @@ advtrains_save_interval (Save Interval) int 60 20 3600
# If enabled, trains only collide with nodes with "normal" drawtype.
advtrains_forgiving_collision (Forgiving Collision mode) bool false
+# Enable universal couplers for wagons
+# If enabled, wagons will bypass the checks that compare the coupler types when coupling.
+advtrains_universal_couplers (Universal Couplers) bool false \ No newline at end of file
diff --git a/advtrains/sounds/advtrains_crossing_bell.ogg b/advtrains/sounds/advtrains_crossing_bell.ogg
index 74df669..2b441ae 100644
--- a/advtrains/sounds/advtrains_crossing_bell.ogg
+++ b/advtrains/sounds/advtrains_crossing_bell.ogg
Binary files differ
diff --git a/advtrains/spec/poconvert_spec.lua b/advtrains/spec/poconvert_spec.lua
index 7b2ceea..51f33e7 100644
--- a/advtrains/spec/poconvert_spec.lua
+++ b/advtrains/spec/poconvert_spec.lua
@@ -10,7 +10,7 @@ describe("PO file converter", function()
foo=bar
baz=
#@=wh\at\\@n=@=w\as\\@n
-multiline@nstrings=
+multiline@nstrings=multiline@nresult
with context?=oder doch nicht]], poconvert.from_string("foo", [[
msgid ""
msgstr "whatever metadata"
@@ -28,7 +28,9 @@ msgstr "=w\\as\\\\\n"
msgid "multi"
"line\n"
"strings"
-msgstr ""
+msgstr "multi"
+"line\n"
+"result"
msgctxt "i18n context"
msgid "with context?"
diff --git a/advtrains/spec/texture_spec.lua b/advtrains/spec/texture_spec.lua
new file mode 100644
index 0000000..2e3bd5d
--- /dev/null
+++ b/advtrains/spec/texture_spec.lua
@@ -0,0 +1,19 @@
+package.path = "../?.lua;" .. package.path
+local T = require "texture"
+
+describe("Texture creation", function()
+ it("works", function()
+ assert.same("^.png", tostring(T.raw"^.png"))
+ assert.same("foo\\:bar.png", tostring(T"foo:bar.png"))
+ end)
+end)
+
+describe("Texture modifiers", function()
+ it("work", function()
+ assert.same("x^[colorize:c", tostring(T"x":colorize"c"))
+ assert.same("x^[colorize:c:alpha", tostring(T"x":colorize("c", "alpha")))
+ assert.same("x^[multiply:c", tostring(T"x":multiply"c"))
+ assert.same("x^[resize:2x3", tostring(T"x":resize(2, 3)))
+ assert.same("x^[transformI", tostring(T"x":transform"I"))
+ end)
+end)
diff --git a/advtrains/spec/wagons_spec.lua b/advtrains/spec/wagons_spec.lua
new file mode 100644
index 0000000..df0687b
--- /dev/null
+++ b/advtrains/spec/wagons_spec.lua
@@ -0,0 +1,40 @@
+require "mineunit"
+mineunit "core"
+
+_G.advtrains = {
+ wagon_load_range = 32
+}
+sourcefile "wagons"
+
+local myproto = {_test = true}
+advtrains.register_wagon(":mywagon", myproto, "My wagon", "", false)
+advtrains.register_wagon_alias(":myalias", ":mywagon")
+advtrains.register_wagon_alias(":myotheralias", ":myalias")
+
+local myotherproto = {_other = true}
+advtrains.register_wagon(":noalias", myotherproto, "Not aliased wagon", "", false)
+advtrains.register_wagon_alias(":noalias", ":mywagon")
+
+advtrains.register_wagon_alias(":nilalias", ":nil")
+
+advtrains.register_wagon_alias(":R1", ":R2")
+advtrains.register_wagon_alias(":R2", ":R3")
+advtrains.register_wagon_alias(":R3", ":R1")
+
+describe("wagon alias system", function()
+ it("should work", function()
+ assert.same({":mywagon", myproto}, {advtrains.resolve_wagon_alias(":myalias")})
+ assert.equal(myproto, advtrains.wagon_prototypes[":myalias"])
+ assert.same({":mywagon", myproto}, {advtrains.resolve_wagon_alias(":myotheralias")})
+ end)
+ it("should respect wagon registration", function()
+ assert.same({":noalias", myotherproto}, {advtrains.resolve_wagon_alias(":noalias")})
+ end)
+ it("should handle recursive loops", function()
+ assert.same({}, {advtrains.resolve_wagon_alias(":R1")})
+ end)
+ it("should return nil for missing entries", function()
+ assert.same({}, {advtrains.resolve_wagon_alias(":what")})
+ assert.same({}, {advtrains.resolve_wagon_alias(":nilalias")})
+ end)
+end)
diff --git a/advtrains/texture.lua b/advtrains/texture.lua
new file mode 100644
index 0000000..e6d83b0
--- /dev/null
+++ b/advtrains/texture.lua
@@ -0,0 +1,228 @@
+local tx = {}
+setmetatable(tx, {__call = function(_, ...) return tx.base(...) end})
+
+function tx.escape(str)
+ return (string.gsub(tostring(str), [[([%^:\])]], [[\%1]]))
+end
+
+local function getargs(...)
+ return select("#", ...), {...}
+end
+
+local function curry(f, x)
+ return function(...)
+ return f(x, ...)
+ end
+end
+
+local function xmkmodifier(func)
+ return function(self, ...)
+ table.insert(self, (func(...)))
+ return self
+ end
+end
+
+local function mkmodifier(fmt, spec)
+ return xmkmodifier(function(...)
+ local count = select("#", ...)
+ local args = {...}
+ for k, f in pairs(spec) do
+ args[k] = f(args[k])
+ end
+ return string.format(fmt, unpack(args, 1, count))
+ end)
+end
+
+-- Texture object
+local tx_lib = {}
+local tx_mt = {
+ __index = tx_lib,
+ __tostring = function(self)
+ return table.concat(self, "^")
+ end,
+ __concat = function(a, b)
+ return tx.raw(("%s^%s"):format(tostring(a), tostring(b)))
+ end,
+}
+
+function tx.raw(str)
+ return setmetatable({str}, tx_mt)
+end
+function tx.base(str)
+ return tx.raw(tx.escape(str))
+end
+-- TODO: use [fill when 5.8.0 becomes widely used client-side
+function tx.fill(w, h, color)
+ return tx"advtrains_hud_bg.png":resize(w, h):colorize(color)
+end
+
+-- Most texture modifiers
+tx_lib.colorize = xmkmodifier(function(c, a)
+ local str = ("[colorize:%s"):format(tx.escape(c))
+ if a then
+ str = str .. ":" .. a
+ end
+ return str
+end)
+tx_lib.multiply = mkmodifier("[multiply:%s", {tx.escape})
+tx_lib.resize = mkmodifier("[resize:%dx%d", {})
+tx_lib.transform = mkmodifier("[transform%s", {tx.escape})
+
+-- [combine
+
+local combine = {}
+
+function combine:add(x, y, ent)
+ table.insert(self.st, ([[%d,%d=%s]]):format(x, y, tx.escape(tostring(ent))))
+ return self
+end
+
+local combine_mt = {
+ __index = combine,
+ __tostring = function(self)
+ return table.concat(self.st, ":")
+ end,
+}
+
+function tx.combine(w, h, bg)
+ local base = ("[combine:%dx%d"):format(w, h)
+ local obj = setmetatable({width = w, height = h, st = {base}}, combine_mt)
+ if bg then
+ obj:add_fill(0, 0, w, h, bg)
+ end
+ return obj
+end
+
+function combine:add_fill(x, y, ...)
+ return self:add(x, y, tx.fill(...))
+end
+
+local function add_multicolor_fill(n, self, x, y, w, h, ...)
+ local argc, argv = getargs(...)
+ local t = 0
+ for k = 1, argc, 2 do
+ t = t + argv[k]
+ end
+ local newargs = {x, y, w, h}
+ local sk, wk = n, n+2
+ local s = newargs[wk]/t
+ for k = 1, argc, 2 do
+ local v = argv[k] * s
+ newargs[wk] = v
+ newargs[5] = argv[k+1]
+ self:add_fill(unpack(newargs))
+ newargs[sk] = newargs[sk] + v
+ end
+ return self
+end
+combine.add_multicolor_fill_topdown = curry(add_multicolor_fill, 2)
+combine.add_multicolor_fill_leftright = curry(add_multicolor_fill, 1)
+
+local function add_segmentbar(n, self, x, y, w, h, m, c, ...)
+ local argc, argv = getargs(...)
+ local baseargs = {x, y, w, h}
+ local ss = (baseargs[n+2]+m)/c
+ local bs = ss - m
+ for k = 1, argc, 3 do
+ local lower, upper, fill = argv[k], argv[k+1], argv[k+2]
+ lower = math.max(0, math.floor(lower))+1
+ upper = math.min(c, math.floor(upper))
+ if lower <= upper then
+ local args = {x, y, w, h, fill}
+ args[n+2] = bs
+ args[n] = args[n] + ss*(lower-1)
+ for i = lower, upper do
+ self:add_fill(unpack(args))
+ args[n] = args[n] + ss
+ end
+ end
+ end
+ return self
+end
+combine.add_segmentbar_topdown = curry(add_segmentbar, 2)
+combine.add_segmentbar_leftright = curry(add_segmentbar, 1)
+
+local function add_lever(n, self, x, y, w, h, hs, ss, val, hf, sf)
+ local baseargs = {x, y, w, h}
+ local sargs = {x, y, w, h, sf}
+ sargs[5-n] = ss
+ sargs[n+2] = baseargs[n+2] + ss - hs
+ for k = 1, 2 do
+ sargs[k] = baseargs[k] + (baseargs[k+2] - sargs[k+2])/2
+ end
+ self:add_fill(unpack(sargs))
+ local hargs = {x, y, w, h, hf}
+ hargs[n+2] = hs
+ hargs[n] = baseargs[n] + (baseargs[n+2]-hs)*val
+ self:add_fill(unpack(hargs))
+ return self
+end
+combine.add_lever_topdown = curry(add_lever, 2)
+combine.add_lever_leftright = curry(add_lever, 1)
+
+--[[ Seven-segment display
+ -1-
+6 2
+ -7-
+5 3
+ -4-
+--]]
+local sevenseg_digits = {
+ ["0"] = {1, 2, 3, 4, 5, 6},
+ ["1"] = {2, 3},
+ ["2"] = {1, 2, 4, 5, 7},
+ ["3"] = {1, 2, 3, 4, 7},
+ ["4"] = {2, 3, 6, 7},
+ ["5"] = {1, 3, 4, 6, 7},
+ ["6"] = {1, 3, 4, 5, 6, 7},
+ ["7"] = {1, 2, 3},
+ ["8"] = {1, 2, 3, 4, 5, 6, 7},
+ ["9"] = {1, 2, 3, 4, 6, 7},
+}
+
+function combine:add_str7seg(x0, y0, tw, th, str, fill)
+ --[[ w and h (as width/height of individual (horizontal) segments) have the following properties:
+ tw = n(w+3h)-h
+ th = 2w+3h
+ --]]
+ local len = #str
+ local h = (2*tw-len*th)/(3*len-2)
+ local w = (th-3*h)/2
+ local ws = w+3*h
+ local segs = {
+ {h, 0, w, h},
+ {w+h, h, h, w},
+ {w+h, w+2*h, h, w},
+ {h, 2*(w+h), w, h},
+ {0, w+2*h, h, w},
+ {0, h, h, w},
+ {h, w+h, w, h},
+ }
+ for i = 1, len do
+ for _, k in pairs(sevenseg_digits[string.sub(str, i, i)] or {}) do
+ local s = segs[k]
+ self:add_fill(s[1]+x0, s[2]+y0, s[3], s[4], fill)
+ end
+ x0 = x0 + ws
+ end
+ return self
+end
+
+function combine:add_n7seg(x, y, w, h, n, prec, ...)
+ if not (type(n) == "number" and type(prec) == "number") then
+ error("passed non-numeric value or precision to numeric display")
+ elseif prec < 0 then
+ error("negative length")
+ end
+ local pfx = ""
+ if n >= 0 then
+ n = math.min(10^prec-1, n)
+ else
+ n = math.min(10^(prec-1)-1, -n)
+ pfx = "-"
+ end
+ local str = ("%d"):format(n)
+ return self:add_str7seg(x, y, w, h, pfx .. ("0"):rep(prec-#str-#pfx) .. str, ...)
+end
+
+return tx
diff --git a/advtrains/textures/advtrains_wagon_prop_tool.png b/advtrains/textures/advtrains_wagon_prop_tool.png
new file mode 100644
index 0000000..6352c55
--- /dev/null
+++ b/advtrains/textures/advtrains_wagon_prop_tool.png
Binary files differ
diff --git a/advtrains/trackplacer.lua b/advtrains/trackplacer.lua
index 9f97171..2588088 100644
--- a/advtrains/trackplacer.lua
+++ b/advtrains/trackplacer.lua
@@ -275,11 +275,24 @@ function tp.register_track_placer(nnprefix, imgprefix, dispname, def)
groups={advtrains_trackplacer=1, digtron_on_place=1},
liquids_pointable = def.liquids_pointable,
on_place = function(itemstack, placer, pointed_thing)
- local name = placer:get_player_name()
- if not name then
- return itemstack, false
- end
if pointed_thing.type=="node" then
+ do
+ local pointed_pos = pointed_thing.under
+ local pointed_node = minetest.get_node(pointed_pos)
+ local pointed_def = minetest.registered_nodes[pointed_node.name]
+ if pointed_def and pointed_def.on_rightclick then
+ local controls = placer:get_player_control()
+ if not controls.sneak then
+ return pointed_def.on_rightclick(pointed_pos, pointed_node, placer, itemstack, pointed_thing)
+ end
+ end
+ end
+
+ local name = placer:get_player_name()
+ if not name then
+ return itemstack, false
+ end
+
local pos=pointed_thing.above
local upos=vector.subtract(pointed_thing.above, {x=0, y=1, z=0})
if not advtrains.check_track_protection(pos, name) then
diff --git a/advtrains/trainhud.lua b/advtrains/trainhud.lua
index 22aa6cf..ce4b913 100644
--- a/advtrains/trainhud.lua
+++ b/advtrains/trainhud.lua
@@ -1,5 +1,7 @@
--trainhud.lua: holds all the code for train controlling
+local T = advtrains.texture
+
advtrains.hud = {}
advtrains.hhud = {}
@@ -8,6 +10,8 @@ advtrains.hud[player:get_player_name()] = nil
advtrains.hhud[player:get_player_name()] = nil
end)
+local hud_type_key = minetest.features.hud_def_type_field and "type" or "hud_elem_type"
+
local mletter={[1]="F", [-1]="R", [0]="N"}
function advtrains.on_control_change(pc, train, flip)
@@ -101,19 +105,21 @@ function advtrains.set_trainhud(name, text, driver)
if not player then
return
end
+ local drivertext = driver or ""
local driverhud = {
- hud_elem_type = "image",
+ [hud_type_key] = "image",
name = "ADVTRAINS_DRIVER",
position = {x=0.5, y=1},
offset = {x=0,y=-170},
- text = driver or "",
+ text = drivertext,
alignment = {x=0,y=-1},
- scale = {x=1,y=1},}
+ scale = {x=1,y=1},
+ }
if not hud then
- hud = {["driver"]={}}
+ hud = {}
advtrains.hud[name] = hud
hud.id = player:hud_add({
- hud_elem_type = "text",
+ [hud_type_key] = "text",
name = "ADVTRAINS",
number = 0xFFFFFF,
position = {x=0.5, y=1},
@@ -122,17 +128,22 @@ function advtrains.set_trainhud(name, text, driver)
scale = {x=200, y=60},
alignment = {x=0, y=-1},
})
- hud.oldText=text
hud.driver = player:hud_add(driverhud)
+ hud.oldText = text
+ hud.oldDriver = drivertext
else
if hud.oldText ~= text then
player:hud_change(hud.id, "text", text)
hud.oldText=text
end
if hud.driver then
- player:hud_change(hud.driver, "text", driver or "")
+ if hud.oldDriver ~= drivertext then
+ player:hud_change(hud.driver, "text", drivertext)
+ hud.oldDriver = drivertext
+ end
elseif driver then
hud.driver = player:hud_add(driverhud)
+ hud.oldDriver = drivertext
end
end
end
@@ -147,7 +158,7 @@ function advtrains.set_help_hud(name, text)
hud = {}
advtrains.hhud[name] = hud
hud.id = player:hud_add({
- hud_elem_type = "text",
+ [hud_type_key] = "text",
name = "ADVTRAINS_HELP",
number = 0xFFFFFF,
position = {x=1, y=0.3},
@@ -184,138 +195,94 @@ function advtrains.hud_train_format(train, flip)
local vel = advtrains.abs_ceil(train.velocity)
local vel_kmh=advtrains.abs_ceil(advtrains.ms_to_kmh(train.velocity))
- local tlev=train.lever or 1
+ local tlev=train.lever or 3
if train.velocity==0 and not train.active_control then tlev=1 end
if train.hud_lzb_effect_tmr then
tlev=1
end
- local ht = {"[combine:440x110:0,0=(advtrains_hud_bg.png^[resize\\:440x110)"}
+ local hud = T.combine(440, 110, "black")
local st = {}
if train.debug then st = {train.debug} end
- -- seven-segment display
- local function sevenseg(digit, x, y, w, h, m)
- --[[
- -1-
- 2 3
- -4-
- 5 6
- -7-
- ]]
- local segs = {
- {h, 0, w, h},
- {0, h, h, w},
- {w+h, h, h, w},
- {h, w+h, w, h},
- {0, w+2*h, h, w},
- {w+h, w+2*h, h, w},
- {h, 2*(w+h), w, h}}
- local trans = {
- [0] = {true, true, true, false, true, true, true},
- [1] = {false, false, true, false, false, true, false},
- [2] = {true, false, true, true, true, false, true},
- [3] = {true, false, true, true, false, true, true},
- [4] = {false, true, true, true, false, true, false},
- [5] = {true, true, false, true, false, true, true},
- [6] = {true, true, false, true, true, true, true},
- [7] = {true, false, true, false, false, true, false},
- [8] = {true, true, true, true, true, true, true},
- [9] = {true, true, true, true, false, true, true}}
- local ent = trans[digit or 10]
- if not ent then return end
- for i = 1, 7, 1 do
- if ent[i] then
- local s = segs[i]
- ht[#ht+1] = sformat("%d,%d=(advtrains_hud_bg.png^[resize\\:%dx%d^%s)",x+s[1], y+s[2], s[3], s[4], m)
- end
- end
- end
-
-- lever
- ht[#ht+1] = "275,10=(advtrains_hud_bg.png^[colorize\\:cyan^[resize\\:5x18)"
- ht[#ht+1] = "275,28=(advtrains_hud_bg.png^[colorize\\:white^[resize\\:5x18)"
- ht[#ht+1] = "275,46=(advtrains_hud_bg.png^[colorize\\:orange^[resize\\:5x36)"
- ht[#ht+1] = "275,82=(advtrains_hud_bg.png^[colorize\\:red^[resize\\:5x18)"
- ht[#ht+1] = "292,16=(advtrains_hud_bg.png^[colorize\\:darkslategray^[resize\\:6x78)"
- ht[#ht+1] = sformat("280,%s=(advtrains_hud_bg.png^[colorize\\:gray^[resize\\:30x18)",18*(4-tlev)+10)
+ hud:add_multicolor_fill_topdown(275, 10, 5, 90, 1, "cyan", 1, "white", 2, "orange", 1, "red")
+ hud:add_lever_topdown(280, 10, 30, 90, 18, 6, (4-tlev)/4, "gray", "darkslategray")
-- reverser
- ht[#ht+1] = sformat("245,10=(advtrains_hud_arrow.png^[transformFY%s)", flip and "" or "^[multiply\\:cyan")
- ht[#ht+1] = sformat("245,85=(advtrains_hud_arrow.png%s)", flip and "^[multiply\\:orange" or "")
- ht[#ht+1] = "250,35=(advtrains_hud_bg.png^[colorize\\:darkslategray^[resize\\:5x40)"
- ht[#ht+1] = sformat("240,%s=(advtrains_hud_bg.png^[resize\\:25x15^[colorize\\:gray)", flip and 65 or 30)
+ hud:add(245, 10, T"advtrains_hud_arrow.png":transform"FY":multiply(flip and "gray" or "cyan"))
+ hud:add(245, 85, T"advtrains_hud_arrow.png":multiply(flip and "orange" or "gray"))
+ hud:add_lever_topdown(240, 30, 25, 50, 15, 5, flip and 1 or 0, "gray", "darkslategray")
-- train control/safety indication
- if train.tarvelocity or train.atc_command then
- ht[#ht+1] = "10,10=(advtrains_hud_atc.png^[resize\\:30x30^[multiply\\:cyan)"
- end
- if train.hud_lzb_effect_tmr then
- ht[#ht+1] = "50,10=(advtrains_hud_lzb.png^[resize\\:30x30^[multiply\\:red)"
- end
- if train.is_shunt then
- ht[#ht+1] = "90,10=(advtrains_hud_shunt.png^[resize\\:30x30^[multiply\\:orange)"
- end
+ hud:add(10, 10, T"advtrains_hud_atc.png":resize(30, 30):multiply((train.tarvelocity or train.atc_command) and "cyan" or "darkslategray"))
+ hud:add(50, 10, T"advtrains_hud_lzb.png":resize(30, 30):multiply(train.hud_lzb_effect_tmr and "red" or "darkslategray"))
+ hud:add(90, 10, T"advtrains_hud_shunt.png":resize(30, 30):multiply(train.is_shunt and "orange" or "darkslategray"))
-- door
- ht[#ht+1] = "187,10=(advtrains_hud_bg.png^[resize\\:26x30^[colorize\\:white)"
- ht[#ht+1] = "189,12=(advtrains_hud_bg.png^[resize\\:22x11)"
- ht[#ht+1] = sformat("170,10=(advtrains_hud_bg.png^[resize\\:15x30^[colorize\\:%s)", train.door_open==-1 and "white" or "darkslategray")
- ht[#ht+1] = "172,12=(advtrains_hud_bg.png^[resize\\:11x11)"
- ht[#ht+1] = sformat("215,10=(advtrains_hud_bg.png^[resize\\:15x30^[colorize\\:%s)", train.door_open==1 and "white" or "darkslategray")
- ht[#ht+1] = "217,12=(advtrains_hud_bg.png^[resize\\:11x11)"
+ hud:add_fill(187, 10, 26, 30, "white"):add_fill(189, 12, 22, 11, "black")
+ hud:add_fill(170, 10, 15, 30, train.door_open==-1 and "white" or "darkslategray"):add_fill(172, 12, 11, 11, "black")
+ hud:add_fill(215, 10, 15, 30, train.door_open==1 and "white" or "darkslategray"):add_fill(217, 12, 11, 11, "black")
-- speed indication(s)
- sevenseg(math.floor(vel/10), 320, 10, 30, 10, "[colorize\\:red\\:255")
- sevenseg(vel%10, 380, 10, 30, 10, "[colorize\\:red\\:255")
- for i = 1, vel, 1 do
- ht[#ht+1] = sformat("%d,65=(advtrains_hud_bg.png^[resize\\:8x20^[colorize\\:white)", i*11-1)
- end
- for i = max+1, 20, 1 do
- ht[#ht+1] = sformat("%d,65=(advtrains_hud_bg.png^[resize\\:8x20^[colorize\\:darkslategray)", i*11-1)
- end
+ hud:add_n7seg(320, 10, 110, 90, vel, 2, "red")
+ hud:add_segmentbar_leftright(10, 65, 217, 20, 3, 20, max, 20, "darkslategray", 0, vel, "white")
if res and res > 0 then
- ht[#ht+1] = sformat("%d,60=(advtrains_hud_bg.png^[resize\\:3x30^[colorize\\:red\\:255)", 7+res*11)
+ hud:add_fill(7+res*11, 60, 3, 30, "red")
end
if train.tarvelocity then
- ht[#ht+1] = sformat("%d,85=(advtrains_hud_arrow.png^[multiply\\:cyan^[transformFY^[makealpha\\:#000000)", 1+train.tarvelocity*11)
+ hud:add(1+train.tarvelocity*11, 85, T"advtrains_hud_arrow.png":transform"FY":multiply"cyan")
end
+ local lzbdisp
local lzb = train.lzb
if lzb and lzb.checkpoints then
local oc = lzb.checkpoints
for i = 1, #oc do
+ if advtrains.interlocking then
+ local udata = oc[i].udata
+ if udata and udata.signal_pos then
+ local sigd = advtrains.interlocking.db.get_sigd_for_signal(udata.signal_pos)
+ if sigd then
+ local tcbs = advtrains.interlocking.db.get_tcbs(sigd) or {}
+ if tcbs.route_rsn then
+ table.insert(st, ("%s: %s"):format(minetest.pos_to_string(sigd.p), tcbs.route_rsn))
+ end
+ end
+ end
+ end
local spd = oc[i].speed
spd = advtrains.speed.min(spd, train.speed_restriction)
if spd == -1 then spd = nil end
local c = not spd and "lime" or (type(spd) == "number" and (spd == 0) and "red" or "orange") or nil
if c then
- ht[#ht+1] = sformat("130,10=(advtrains_hud_bg.png^[resize\\:30x5^[colorize\\:%s)",c)
- ht[#ht+1] = sformat("130,35=(advtrains_hud_bg.png^[resize\\:30x5^[colorize\\:%s)",c)
if spd and spd~=0 then
- ht[#ht+1] = sformat("%d,50=(advtrains_hud_arrow.png^[multiply\\:red^[makealpha\\:#000000)", 1+spd*11)
+ hud:add(1+spd*11, 50, T"advtrains_hud_arrow.png":multiply"red")
end
- local floor = math.floor
- local dist = floor(((oc[i].index or train.index)-train.index))
+ local dist = math.floor(((oc[i].index or train.index)-train.index))
dist = math.max(0, math.min(999, dist))
- for j = 1, 3, 1 do
- sevenseg(floor((dist/10^(3-j))%10), 119+j*11, 18, 4, 2, "[colorize\\:"..c)
- end
+ lzbdisp = {c = c, d = dist}
break
end
end
end
+ if not lzbdisp then
+ lzbdisp = {c = "darkslategray", d = 888}
+ end
+ hud:add_fill(130, 10, 30, 5, lzbdisp.c)
+ hud:add_fill(130, 35, 30, 5, lzbdisp.c)
+ hud:add_n7seg(131, 18, 28, 14, lzbdisp.d, 3, lzbdisp.c)
if res and res == 0 then
- st[#st+1] = attrans("OVERRUN RED SIGNAL! Examine situation and reverse train to move again.")
+ table.insert(st, attrans("OVERRUN RED SIGNAL! Examine situation and reverse train to move again."))
end
if train.atc_command then
- st[#st+1] = sformat("ATC: %s%s", train.atc_delay and advtrains.abs_ceil(train.atc_delay).."s " or "", train.atc_command or "")
+ table.insert(st, ("ATC: %s%s"):format(train.atc_delay and advtrains.abs_ceil(train.atc_delay).."s " or "", train.atc_command or ""))
end
- return table.concat(st,"\n"), table.concat(ht,":")
+ return table.concat(st,"\n"), tostring(hud)
end
local _, texture = advtrains.hud_train_format { -- dummy train object to demonstrate the train hud
max_speed = 15, speed_restriction = 15, velocity = 15, tarvelocity = 12,
active_control = true, lever = 3, ctrl = {lzb = true}, is_shunt = true,
- door_open = 1, lzb = {oncoming = {{spd=6, idx=125.7}}}, index = 0,
+ door_open = 1, lzb = {checkpoints = {{speed=6, index=125.7}}}, index = 100,
}
minetest.register_node("advtrains:hud_demo",{
diff --git a/advtrains/trainlogic.lua b/advtrains/trainlogic.lua
index f136577..ed49a4c 100644
--- a/advtrains/trainlogic.lua
+++ b/advtrains/trainlogic.lua
@@ -142,13 +142,8 @@ minetest.register_on_joinplayer(function(player)
local pname = player:get_player_name()
local id=advtrains.player_to_train_mapping[pname]
if id then
- for _,wagon in pairs(minetest.luaentities) do
- if wagon.is_wagon and wagon.initialized and wagon.id then
- local wdata = advtrains.wagons[wagon.id]
- if wdata and wdata.train_id == id then
- wagon:reattach_all()
- end
- end
+ for _, wagon in advtrains.wagon_entity_pairs_in_train(id) do
+ wagon:reattach_all()
end
end
end)
@@ -160,12 +155,10 @@ minetest.register_on_dieplayer(function(player)
if id then
local train=advtrains.trains[id]
if not train then advtrains.player_to_train_mapping[pname]=nil return end
- for _,wagon in pairs(minetest.luaentities) do
- if wagon.is_wagon and wagon.initialized and wagon.train_id==id then
- --when player dies, detach him from the train
- --call get_off_plr on every wagon since we don't know which one he's on.
- wagon:get_off_plr(pname)
- end
+ for _, wagon in advtrains.wagon_entity_pairs_in_train(id) do
+ --when player dies, detach him from the train
+ --call get_off_plr on every wagon since we don't know which one he's on.
+ wagon:get_off_plr(pname)
end
-- just in case no wagon felt responsible for this player: clear train mapping
advtrains.player_to_train_mapping[pname] = nil
@@ -270,6 +263,10 @@ function advtrains.train_ensure_init(id, train)
atwarn(debug.traceback())
return nil
end
+
+ if not train.staticdata then
+ train.staticdata = {}
+ end
train.dirty = true
if train.no_step then
@@ -803,9 +800,12 @@ function advtrains.train_step_c(id, train, dtime)
if is_loaded_area then
local objs = minetest.get_objects_inside_radius(rcollpos, 2)
for _,obj in ipairs(objs) do
- if not obj:is_player() and obj:get_armor_groups().fleshy and obj:get_armor_groups().fleshy > 0
- and obj:get_luaentity() and obj:get_luaentity().name~="signs_lib:text" then
- obj:punch(obj, 1, { full_punch_interval = 1.0, damage_groups = {fleshy = 1000}, }, nil)
+ if not obj:is_player() then
+ local armor = obj:get_armor_groups()
+ local luaentity = obj:get_luaentity()
+ if armor.fleshy and armor.fleshy > 0 and luaentity and luaentity.name ~= "signs_lib:text" then
+ obj:punch(obj, 1, { full_punch_interval = 1.0, damage_groups = {fleshy = 1000}, }, nil)
+ end
end
end
end
@@ -1117,8 +1117,17 @@ function advtrains.spawn_wagons(train_id)
if advtrains.position_in_range(pos, ablkrng) then
--atdebug("wagon",w_id,"spawning")
local wt = advtrains.get_wagon_prototype(data)
- local wagon = minetest.add_entity(pos, wt):get_luaentity()
- wagon:set_id(w_id)
+ local wobj = minetest.add_entity(pos, wt)
+ if not wobj then
+ atwarn("Failed to spawn wagon", w_id, "of type", wt)
+ else
+ local wagon = wobj:get_luaentity()
+ if not wagon then
+ atwarn("Wagon", w_id, "of type", wt, "spawned with nil luaentity")
+ else
+ wagon:set_id(w_id)
+ end
+ end
end
end
else
@@ -1185,6 +1194,8 @@ function advtrains.split_train_at_index(train, index)
newtrain.points_split = advtrains.merge_tables(train.points_split)
newtrain.autocouple = train.autocouple
+ advtrains.te_run_callbacks_on_decouple(train, newtrain, index)
+
return newtrain_id -- return new train ID, so new train can be manipulated
end
diff --git a/advtrains/wagonprop_tool.lua b/advtrains/wagonprop_tool.lua
new file mode 100644
index 0000000..2a4a9e2
--- /dev/null
+++ b/advtrains/wagonprop_tool.lua
@@ -0,0 +1,43 @@
+minetest.register_craftitem("advtrains:wagon_prop_tool",{ --craftitem because it does nothing on its own
+ description = attrans("Wagon Properties Tool\nPunch a wagon to view and edit the Wagon Properties"),
+ short_description = attrans("Wagon Properties Tool"),
+ groups = {},
+ inventory_image = "advtrains_wagon_prop_tool.png",
+ wield_image = "advtrains_wagon_prop_tool.png",
+ stack_max = 1,
+ on_use = function(itemstack, user, pointed_thing)
+ local pname = user:get_player_name()
+ if not pname or pname == "" then
+ return
+ end
+
+ --sanity checks in case of clicking the wrong entity/node/nothing
+ if pointed_thing.type ~= "object" then return end --not an entity
+ local object = pointed_thing.ref:get_luaentity()
+ if not object.id then return end --entity doesn't have an id field
+
+ local wagon = advtrains.wagons[object.id] --check if wagon exists in advtrains
+ if not wagon then --not a wagon
+ return
+ end --end sanity checks
+
+ --whitelist protection check
+ if not advtrains.check_driving_couple_protection(pname,wagon.owner,wagon.whitelist) then
+ minetest.chat_send_player(pname, attrans("Insufficient privileges to use this!"))
+ return
+ end
+ object:show_wagon_properties(pname)
+ return itemstack
+ end,
+})
+
+if minetest.get_modpath("default") then --register recipe
+ minetest.register_craft({
+ output = "advtrains:wagon_prop_tool",
+ recipe = {
+ {"advtrains:dtrack_placer","dye:black","default:paper"},
+ {"screwdriver:screwdriver","default:paper","default:paper"},
+ {"","","group:wood"},
+ }
+ })
+end \ No newline at end of file
diff --git a/advtrains/wagons.lua b/advtrains/wagons.lua
index f9b29bb..cf15871 100644
--- a/advtrains/wagons.lua
+++ b/advtrains/wagons.lua
@@ -13,7 +13,13 @@ local GETOFF_TP_DELAY = 0.5
local IGNORE_WORLD = advtrains.IGNORE_WORLD
advtrains.wagons = {}
-advtrains.wagon_prototypes = {}
+advtrains.wagon_alias = {}
+advtrains.wagon_prototypes = setmetatable({}, {
+ __index = function(t, k)
+ local _, proto = advtrains.resolve_wagon_alias(k)
+ return proto
+ end
+})
advtrains.wagon_objects = {}
local unload_wgn_range = advtrains.wagon_load_range + 32
@@ -280,7 +286,7 @@ function wagon:on_step(dtime)
local data = advtrains.wagons[self.id]
if not pos then
- --atdebug("["..self.id.."][fatal] missing position (object:getpos() returned nil)")
+ --atdebug("["..self.id.."][fatal] missing position (object:get_pos() returned nil)")
return
end
@@ -814,8 +820,8 @@ function wagon:get_off(seatno)
end
--if not door_entry, or paths missing, fall back to old method
--atdebug("using fallback")
- local objpos=advtrains.round_vector_floor_y(self.object:getpos())
- local yaw=self.object:getyaw()
+ local objpos=advtrains.round_vector_floor_y(self.object:get_pos())
+ local yaw=self.object:get_yaw()
local isx=(yaw < math.pi/4) or (yaw > 3*math.pi/4 and yaw < 5*math.pi/4) or (yaw > 7*math.pi/4)
local offp
--abuse helper function
@@ -868,6 +874,7 @@ function wagon:show_wagon_properties(pname)
]]
local data = advtrains.wagons[self.id]
local form="size[5,5]"
+ form=form.."label[0.2,0;"..attrans("This Wagon ID")..": "..self.id.."]"
form = form .. "field[0.5,1;4.5,1;whitelist;Allow these players to access your wagon:;"..minetest.formspec_escape(data.whitelist or "").."]"
form = form .. "field[0.5,2;4.5,1;roadnumber;Wagon road number:;"..minetest.formspec_escape(data.roadnumber or "").."]"
local fc = ""
@@ -892,7 +899,7 @@ end
--BordCom
local function checkcouple(ent)
- if not ent or not ent:getyaw() then
+ if not ent or not ent:get_yaw() then
return nil
end
local le = ent:get_luaentity()
@@ -971,6 +978,7 @@ function wagon:show_bordcom(pname)
local linhei
local form = "size[11,9]label[0.5,0;AdvTrains Boardcom v0.1]"
+ form=form.."textarea[7.5,0.05;10,1;;"..attrans("Train ID")..": "..(minetest.formspec_escape(train.id or ""))..";]"
form=form.."textarea[0.5,1.5;7,1;text_outside;"..attrans("Text displayed outside on train")..";"..(minetest.formspec_escape(train.text_outside or "")).."]"
form=form.."textarea[0.5,3;7,1;text_inside;"..attrans("Text displayed inside train")..";"..(minetest.formspec_escape(train.text_inside or "")).."]"
form=form.."field[7.5,1.75;3,1;line;"..attrans("Line")..";"..(minetest.formspec_escape(train.line or "")).."]"
@@ -1088,12 +1096,11 @@ function wagon:handle_bordcom_fields(pname, formname, fields)
for i, tpid in ipairs(train.trainparts) do
if fields["dcpl_"..i] then
advtrains.safe_decouple_wagon(tpid, pname)
- elseif fields["wgprp"..i] then
- for _,wagon in pairs(minetest.luaentities) do
- if wagon.is_wagon and wagon.initialized and wagon.id==tpid and data.owner==pname then
- wagon:show_wagon_properties(pname)
- return
- end
+ elseif fields["wgprp"..i] and data.owner==pname then
+ local wagon = advtrains.get_wagon_entity(tpid)
+ if wagon then
+ wagon:show_wagon_properties(pname)
+ return
end
end
end
@@ -1139,44 +1146,48 @@ end
minetest.register_on_player_receive_fields(function(player, formname, fields)
local uid=string.match(formname, "^advtrains_geton_(.+)$")
if uid then
- for _,wagon in pairs(minetest.luaentities) do
- if wagon.is_wagon and wagon.initialized and wagon.id==uid then
- local data = advtrains.wagons[wagon.id]
- if fields.inv then
- if wagon.has_inventory and wagon.get_inventory_formspec then
- minetest.show_formspec(player:get_player_name(), "advtrains_inv_"..uid, wagon:get_inventory_formspec(player:get_player_name(), make_inv_name(uid)))
- end
- elseif fields.seat then
- local val=minetest.explode_textlist_event(fields.seat)
- if val and val.type~="INV" and not data.seatp[player:get_player_name()] then
- --get on
- wagon:get_on(player, val.index)
- --will work with the new close_formspec functionality. close exactly this formspec.
- minetest.show_formspec(player:get_player_name(), formname, "")
- end
+ local wagon = advtrains.get_wagon_entity(uid)
+ if wagon then
+ local data = advtrains.wagons[wagon.id]
+ if fields.inv then
+ if wagon.has_inventory and wagon.get_inventory_formspec then
+ minetest.show_formspec(player:get_player_name(), "advtrains_inv_"..uid, wagon:get_inventory_formspec(player:get_player_name(), make_inv_name(uid)))
+ end
+ elseif fields.seat then
+ local val=minetest.explode_textlist_event(fields.seat)
+ if val and val.type~="INV" and not data.seatp[player:get_player_name()] then
+ --get on
+ wagon:get_on(player, val.index)
+ --will work with the new close_formspec functionality. close exactly this formspec.
+ minetest.show_formspec(player:get_player_name(), formname, "")
end
end
end
+ return true
end
+
uid=string.match(formname, "^advtrains_seating_(.+)$")
if uid then
- for _,wagon in pairs(minetest.luaentities) do
- if wagon.is_wagon and wagon.initialized and wagon.id==uid then
- local pname=player:get_player_name()
- local no=wagon:get_seatno(pname)
- if no then
- if wagon.seat_groups then
- wagon:seating_from_key_helper(pname, fields, no)
- end
+ local wagon = advtrains.get_wagon_entity(uid)
+ if wagon then
+ local pname=player:get_player_name()
+ local no=wagon:get_seatno(pname)
+ if no then
+ if wagon.seat_groups then
+ wagon:seating_from_key_helper(pname, fields, no)
end
end
end
+ return true
end
+
uid=string.match(formname, "^advtrains_prop_(.+)$")
if uid then
local pname=player:get_player_name()
local data = advtrains.wagons[uid]
- if pname~=data.owner and not minetest.check_player_privs(pname, {train_admin = true}) then
+ if not data then
+ return true
+ elseif pname~=data.owner and not minetest.check_player_privs(pname, {train_admin = true}) then
return true
end
if fields.save or not fields.quit then
@@ -1198,29 +1209,32 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
wagon.show_wagon_properties({id=uid}, pname)
end
end
+ return true
end
uid=string.match(formname, "^advtrains_bordcom_(.+)$")
if uid then
- for _,wagon in pairs(minetest.luaentities) do
- if wagon.is_wagon and wagon.initialized and wagon.id==uid then
- wagon:handle_bordcom_fields(player:get_player_name(), formname, fields)
- end
+ local wagon = advtrains.get_wagon_entity(uid)
+ if wagon then
+ wagon:handle_bordcom_fields(player:get_player_name(), formname, fields)
end
+ return true
end
+
uid=string.match(formname, "^advtrains_inv_(.+)$")
if uid then
local pname=player:get_player_name()
local data = advtrains.wagons[uid]
if fields.prop and data.owner==pname then
- for _,wagon in pairs(minetest.luaentities) do
- if wagon.is_wagon and wagon.initialized and wagon.id==uid and data.owner==pname then
- wagon:show_wagon_properties(pname)
- --wagon:handle_bordcom_fields(player:get_player_name(), formname, fields)
- end
+ local wagon = advtrains.get_wagon_entity(uid)
+ if wagon then
+ wagon:show_wagon_properties(pname)
+ --wagon:handle_bordcom_fields(player:get_player_name(), formname, fields)
end
end
+ return true
end
end)
+
function wagon:seating_from_key_helper(pname, fields, no)
local data = advtrains.wagons[self.id]
local sgr=self.seats[no].group
@@ -1259,7 +1273,7 @@ function wagon:check_seat_group_access(pname, sgr)
return false, attrans("You are not allowed to access the driver stand.")
end
if self.seat_groups[sgr].driving_ctrl_access then
- advtrains.log("Drive", pname, self.object:getpos(), self:train().text_outside)
+ advtrains.log("Drive", pname, self.object:get_pos(), self:train().text_outside)
end
return true
end
@@ -1317,11 +1331,33 @@ function advtrains.get_wagon_prototype(data)
data.type = data.entity_name
data.entity_name = nil
end
- if not wt or not advtrains.wagon_prototypes[wt] then
+ local rt, proto = advtrains.resolve_wagon_alias(wt)
+ if not rt then
atwarn("Unable to load wagon type",wt,", using placeholder")
- wt="advtrains:wagon_placeholder"
+ rt = "advtrains:wagon_placeholder"
+ proto = advtrains.wagon_prototypes[rt]
end
- return wt, advtrains.wagon_prototypes[wt]
+ return rt, proto
+end
+
+function advtrains.register_wagon_alias(src, dst)
+ advtrains.wagon_alias[src] = dst
+end
+
+local function recursive_resolve_alias(name, seen)
+ local prototype = rawget(advtrains.wagon_prototypes, name)
+ if prototype then
+ return name, prototype
+ end
+ local resolved = advtrains.wagon_alias[name]
+ if resolved and not seen[resolved] then
+ seen[name] = true
+ return recursive_resolve_alias(resolved, seen)
+ end
+end
+
+function advtrains.resolve_wagon_alias(name)
+ return recursive_resolve_alias(name, {})
end
function advtrains.standard_inventory_formspec(self, pname, invname)
@@ -1368,13 +1404,23 @@ function advtrains.register_wagon(sysname_p, prototype, desc, inv_img, nincreati
groups = wagon_groups,
on_place = function(itemstack, placer, pointed_thing)
- if not pointed_thing.type == "node" then
+ if pointed_thing.type ~= "node" then
return
end
+
+ local pos = pointed_thing.under
+ local node = minetest.get_node(pos)
+ local pointed_def = minetest.registered_nodes[node.name]
+ if pointed_def and pointed_def.on_rightclick then
+ local controls = placer:get_player_control()
+ if not controls.sneak then
+ return pointed_def.on_rightclick(pos, node, placer, itemstack, pointed_thing)
+ end
+ end
+
local pname = placer:get_player_name()
- local node=minetest.get_node_or_nil(pointed_thing.under)
- if not node then atprint("[advtrains]Ignore at placer position") return itemstack end
+ if node.name == "ignore" then atprint("[advtrains]Ignore at placer position") return itemstack end
local nodename=node.name
if(not advtrains.is_track_and_drives_on(nodename, prototype.drives_on)) then
atprint("no track here, not placing.")
@@ -1384,14 +1430,14 @@ function advtrains.register_wagon(sysname_p, prototype, desc, inv_img, nincreati
minetest.chat_send_player(pname, "You don't have the train_operator privilege.")
return itemstack
end
- if not minetest.check_player_privs(placer, {train_admin = true }) and minetest.is_protected(pointed_thing.under, placer:get_player_name()) then
+ if not minetest.check_player_privs(placer, {train_admin = true }) and minetest.is_protected(pos, placer:get_player_name()) then
return itemstack
end
local tconns=advtrains.get_track_connections(node.name, node.param2)
local yaw = placer:get_look_horizontal()
local plconnid = advtrains.yawToClosestConn(yaw, tconns)
- local prevpos = advtrains.get_adjacent_rail(pointed_thing.under, tconns, plconnid, prototype.drives_on)
+ local prevpos = advtrains.get_adjacent_rail(pos, tconns, plconnid, prototype.drives_on)
if not prevpos then
minetest.chat_send_player(pname, "The track you are trying to place the wagon on is not long enough!")
return
@@ -1399,7 +1445,7 @@ function advtrains.register_wagon(sysname_p, prototype, desc, inv_img, nincreati
local wid = advtrains.create_wagon(sysname, pname)
- local id=advtrains.create_new_train_at(pointed_thing.under, plconnid, 0, {wid})
+ local id=advtrains.create_new_train_at(pos, plconnid, 0, {wid})
if not advtrains.is_creative(pname) then
itemstack:take_item()
@@ -1487,4 +1533,28 @@ function advtrains.get_wagon_at_index(train_id, w_index)
end
-- nothing found, dist must be further back
return nil
-end \ No newline at end of file
+end
+
+function advtrains.get_wagon_entity(wagon_id)
+ if not advtrains.wagons[wagon_id] then return end
+ local object = advtrains.wagon_objects[wagon_id]
+ if object then
+ return object:get_luaentity()
+ end
+end
+
+function advtrains.next_wagon_entity_in_train(train, i)
+ local wagon_id = train.trainparts[i + 1]
+ if wagon_id then
+ local wagon = advtrains.get_wagon_entity(wagon_id)
+ if wagon then
+ return i + 1, wagon
+ end
+ end
+end
+
+function advtrains.wagon_entity_pairs_in_train(train_id)
+ local train = advtrains.trains[train_id]
+ if not train then return function() end end
+ return advtrains.next_wagon_entity_in_train, train, 0
+end
diff --git a/advtrains_interlocking/database.lua b/advtrains_interlocking/database.lua
index 6787c50..5096d48 100644
--- a/advtrains_interlocking/database.lua
+++ b/advtrains_interlocking/database.lua
@@ -425,7 +425,7 @@ function ildb.link_track_sections(merge_id, root_id)
merge_ts(root_id, merge_id)
end
-function ildb.remove_from_interlocking(sigd)
+function ildb.remove_from_interlocking(sigd, no_tcb_marker)
local tcbs = ildb.get_tcbs(sigd)
if not ildb.may_modify_tcbs(tcbs) then return false end
@@ -455,7 +455,9 @@ function ildb.remove_from_interlocking(sigd)
track_sections[tsid] = nil
end
end
- advtrains.interlocking.show_tcb_marker(sigd.p)
+ if not no_tcb_marker then
+ advtrains.interlocking.show_tcb_marker(sigd.p)
+ end
if tcbs.signal then
return false
end
@@ -468,10 +470,11 @@ function ildb.remove_tcb(pos)
return true --FIX: not an error, because tcb is already removed
end
for connid=1,2 do
- if not ildb.remove_from_interlocking({p=pos, s=connid}) then
+ if not ildb.remove_from_interlocking({p=pos, s=connid}, true) then
return false
end
end
+ advtrains.interlocking.remove_tcb_marker_pts(pts)
track_circuit_breaks[pts] = nil
return true
end
diff --git a/advtrains_interlocking/route_prog.lua b/advtrains_interlocking/route_prog.lua
index 6abe431..e8f5e8e 100644
--- a/advtrains_interlocking/route_prog.lua
+++ b/advtrains_interlocking/route_prog.lua
@@ -214,19 +214,32 @@ end
local player_rte_prog = {}
-function advtrains.interlocking.init_route_prog(pname, sigd)
+function advtrains.interlocking.init_route_prog(pname, sigd, default_route)
if not minetest.check_player_privs(pname, "interlocking") then
minetest.chat_send_player(pname, "Insufficient privileges to use this!")
return
end
- player_rte_prog[pname] = {
+ local rp = {
origin = sigd,
- route = {
- name = "PROG["..pname.."]",
- },
- tmp_lcks = {},
}
- advtrains.interlocking.visualize_route(sigd, player_rte_prog[pname].route, "prog_"..pname, player_rte_prog[pname].tmp_lcks, pname)
+ if default_route then
+ rp.route = table.copy(default_route)
+
+ -- "Step back one section", but keeping turnouts
+ local last_route = rp.route[#rp.route]
+ if last_route then
+ rp.tmp_lcks = last_route.locks
+ rp.route[#rp.route] = nil
+ end
+ rp.route.name = "PROG["..pname.."]"
+ else
+ rp.route = {
+ name = "PROG["..pname.."]"
+ }
+ rp.tmp_lcks = {}
+ end
+ player_rte_prog[pname] = rp
+ advtrains.interlocking.visualize_route(sigd, rp.route, "prog_"..pname, rp.tmp_lcks, pname)
minetest.chat_send_player(pname, "Route programming mode active. Punch TCBs to add route segments, punch turnouts to lock them.")
end
diff --git a/advtrains_interlocking/route_ui.lua b/advtrains_interlocking/route_ui.lua
index 1999941..a8fee83 100644
--- a/advtrains_interlocking/route_ui.lua
+++ b/advtrains_interlocking/route_ui.lua
@@ -24,7 +24,7 @@ function atil.show_route_edit_form(pname, sigd, routeid)
local route = tcbs.routes[routeid]
if not route then return end
- local form = "size[9,10]label[0.5,0.2;Route overview]"
+ local form = "size[9,11]label[0.5,0.2;Route overview]"
form = form.."field[0.8,1.2;6.5,1;name;Route name;"..minetest.formspec_escape(route.name).."]"
form = form.."button[7.0,0.9;1.5,1;setname;Set]"
@@ -85,11 +85,13 @@ function atil.show_route_edit_form(pname, sigd, routeid)
form = form.."button[0.5,6;3,1;back;<<< Back to signal]"
form = form.."button[4.5,6;2,1;aspect;Signal Aspect]"
form = form.."button[6.5,6;2,1;delete;Delete Route]"
+
+ form = form.."button[5.5,7;3,1;newfrom;New From Route]"
--atdebug(route.ars)
form = form.."style[ars;font=mono]"
- form = form.."textarea[0.8,7.3;5,3;ars;ARS Rule List;"..atil.ars_to_text(route.ars).."]"
- form = form.."button[5.5,7.23;3,1;savears;Save ARS List]"
+ form = form.."textarea[0.8,8.3;5,3;ars;ARS Rule List;"..atil.ars_to_text(route.ars).."]"
+ form = form.."button[5.5,8.23;3,1;savears;Save ARS List]"
minetest.show_formspec(pname, "at_il_routeedit_"..minetest.pos_to_string(sigd.p).."_"..sigd.s.."_"..routeid, form)
@@ -139,6 +141,13 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
table.remove(tcbs.routes, routeid)
advtrains.interlocking.show_signalling_form(sigd, pname)
end
+
+ if fields.newfrom then
+ advtrains.interlocking.init_route_prog(pname, sigd, route)
+ minetest.close_formspec(pname, formname)
+ tcbs.ars_ignore_next = nil
+ return
+ end
if fields.ars and fields.savears then
route.ars = atil.text_to_ars(fields.ars)
diff --git a/advtrains_interlocking/routesetting.lua b/advtrains_interlocking/routesetting.lua
index 67efaea..fd6d595 100644
--- a/advtrains_interlocking/routesetting.lua
+++ b/advtrains_interlocking/routesetting.lua
@@ -113,6 +113,7 @@ function ilrs.set_route(signal, route, try)
if c_tcbs.signal then
c_tcbs.route_committed = true
c_tcbs.aspect = route.aspect or advtrains.interlocking.GENERIC_FREE
+ c_tcbs.route_rsn = nil
c_tcbs.route_origin = signal
advtrains.interlocking.update_signal_aspect(c_tcbs)
end
@@ -291,7 +292,13 @@ function ilrs.update_route(sigd, tcbs, newrte, cancel)
end
if newrte then tcbs.routeset = newrte end
--atdebug("Setting:",tcbs.routeset)
- local succ, rsn, cbts, cblk = ilrs.set_route(sigd, tcbs.routes[tcbs.routeset])
+ local succ, rsn, cbts, cblk
+ if tcbs.routes[tcbs.routeset] then
+ succ, rsn, cbts, cblk = ilrs.set_route(sigd, tcbs.routes[tcbs.routeset])
+ else
+ succ = false
+ rsn = attrans("Route state changed.")
+ end
if not succ then
tcbs.route_rsn = rsn
--atdebug("Routesetting failed:",rsn)
diff --git a/advtrains_interlocking/signal_api.lua b/advtrains_interlocking/signal_api.lua
index 83fae4a..c70366b 100644
--- a/advtrains_interlocking/signal_api.lua
+++ b/advtrains_interlocking/signal_api.lua
@@ -165,6 +165,55 @@ This function will query get_aspect to retrieve the new aspect.
]]--
+minetest.register_entity("advtrains_interlocking:ipmarker", {
+ visual = "mesh",
+ mesh = "trackplane.b3d",
+ textures = {"at_il_signal_ip.png"},
+ collisionbox = {-1,-0.5,-1, 1,-0.4,1},
+ visual_size = {x=10, y=10},
+ on_punch = function(self)
+ self.object:remove()
+ end,
+ on_rightclick = function(self, player)
+ if self.signalpos and player and player:is_player() then
+ local node = minetest.get_node(self.signalpos)
+ if minetest.get_item_group(node.name, "advtrains_signal") ~= 0 then
+ advtrains.interlocking.show_ip_form(self.signalpos, player:get_player_name())
+ end
+ end
+ end,
+ get_staticdata = function() return "STATIC" end,
+ on_activate = function(self, sdata) if sdata=="STATIC" then self.object:remove() end end,
+ static_save = false,
+})
+
+local function clean_ipmarker(spos)
+ for _, luaentity in pairs(minetest.luaentities) do
+ if luaentity.name == "advtrains_interlocking:ipmarker"
+ and luaentity.signalpos
+ and vector.equals(luaentity.signalpos, spos) then
+ luaentity.object:remove()
+ end
+ end
+end
+
+local function ipmarker(ipos, connid, spos)
+ if spos then
+ clean_ipmarker(spos)
+ end
+
+ local node_ok, conns, rhe = advtrains.get_rail_info_at(ipos, advtrains.all_tracktypes)
+ if not node_ok then return end
+
+ local obj = minetest.add_entity(vector.offset(ipos, 0, 0.2, 0), "advtrains_interlocking:ipmarker")
+ if not obj then return end
+ obj:set_yaw(advtrains.dir_to_angle(conns[connid].c))
+ local luaentity = obj:get_luaentity()
+ if luaentity then
+ luaentity.signalpos = spos
+ end
+end
+
local DANGER = {
main = 0,
dst = false,
@@ -213,6 +262,7 @@ end
function advtrains.interlocking.signal_after_dig(pos)
-- clear influence point
advtrains.interlocking.db.clear_ip_by_signalpos(pos)
+ clean_ipmarker(pos)
end
function advtrains.interlocking.signal_set_aspect(pos, asp)
@@ -305,20 +355,6 @@ end
local players_assign_ip = {}
-local function ipmarker(ipos, connid)
- local node_ok, conns, rhe = advtrains.get_rail_info_at(ipos, advtrains.all_tracktypes)
- if not node_ok then return end
- local yaw = advtrains.dir_to_angle(conns[connid].c)
-
- -- using tcbmarker here
- local obj = minetest.add_entity(vector.add(ipos, {x=0, y=0.2, z=0}), "advtrains_interlocking:tcbmarker")
- if not obj then return end
- obj:set_yaw(yaw)
- obj:set_properties({
- textures = { "at_il_signal_ip.png" },
- })
-end
-
-- shows small info form for signal IP state/assignment
-- only_notset: show only if it is not set yet (used by signal tcb assignment)
function advtrains.interlocking.show_ip_form(pos, pname, only_notset)
@@ -333,7 +369,7 @@ function advtrains.interlocking.show_ip_form(pos, pname, only_notset)
form = form.."button_exit[0.5,2.5; 5,1;set;Move]"
form = form.."button_exit[0.5,3.5; 5,1;clear;Clear]"
local ipos = minetest.string_to_pos(pts)
- ipmarker(ipos, connid)
+ ipmarker(ipos, connid, pos)
else
form = form.."label[0.5,1.5;Influence point is not set.]"
form = form.."label[0.5,2.0;It is recommended to set an influence point.]"
@@ -361,6 +397,7 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
advtrains.interlocking.signal_init_ip_assign(pos, pname)
elseif fields.clear then
advtrains.interlocking.db.clear_ip_by_signalpos(pos)
+ clean_ipmarker(pos)
end
end
end)
@@ -397,7 +434,7 @@ minetest.register_on_punchnode(function(pos, node, player, pointed_thing)
local pts = advtrains.roundfloorpts(pos)
if not advtrains.interlocking.db.get_ip_signal_asp(pts, plconnid) then
advtrains.interlocking.db.set_ip_signal(pts, plconnid, signalpos)
- ipmarker(pos, plconnid)
+ ipmarker(pos, plconnid, signalpos)
minetest.chat_send_player(pname, "Configuring Signal: Successfully set influence point")
else
minetest.chat_send_player(pname, "Configuring Signal: Influence point of another signal is already present!")
diff --git a/advtrains_interlocking/tcb_ts_ui.lua b/advtrains_interlocking/tcb_ts_ui.lua
index 0cc10da..264834c 100755
--- a/advtrains_interlocking/tcb_ts_ui.lua
+++ b/advtrains_interlocking/tcb_ts_ui.lua
@@ -550,6 +550,13 @@ minetest.register_entity("advtrains_interlocking:tcbmarker", {
static_save = false,
})
+function advtrains.interlocking.remove_tcb_marker_pts(pts)
+ if markerent[pts] then
+ markerent[pts]:remove()
+ markerent[pts] = nil
+ end
+end
+
function advtrains.interlocking.show_tcb_marker(pos)
--atdebug("showing tcb marker",pos)
local tcb = ildb.get_tcb(pos)
@@ -573,9 +580,7 @@ function advtrains.interlocking.show_tcb_marker(pos)
end
local pts = advtrains.roundfloorpts(pos)
- if markerent[pts] then
- markerent[pts]:remove()
- end
+ advtrains.interlocking.remove_tcb_marker_pts(pts)
local obj = minetest.add_entity(pos, "advtrains_interlocking:tcbmarker")
if not obj then return end
@@ -652,14 +657,22 @@ function advtrains.interlocking.show_signalling_form(sigd, pname, sel_rte, calle
strtab[#strtab+1] = clr .. minetest.formspec_escape(route.name)
end
form = form.."label[0.5,2.5;Routes:]"
- form = form.."textlist[0.5,3;5,3;rtelist;"..table.concat(strtab, ",").."]"
+ form = form.."textlist[0.5,3;5,3;rtelist;"..table.concat(strtab, ",")
if sel_rte then
+ form = form .. ";" .. sel_rte .."]"
form = form.."button[0.5,6; 5,1;setroute;Set Route]"
form = form.."button[0.5,7;2,1;dsproute;Show]"
if hasprivs then
form = form.."button[3.5,7;2,1;editroute;Edit]"
+ if sel_rte > 1 then
+ form = form .. "button[5.5,4;0.5,0.3;moveup;↑]"
+ end
+ if sel_rte < #strtab then
+ form = form .. "button[5.5,4.7;0.5,0.3;movedown;↓]"
+ end
end
else
+ form = form .. "]"
if tcbs.ars_disabled then
form = form.."label[0.5,6 ;NOTE: ARS is disabled.]"
form = form.."label[0.5,6.5;Routes are not automatically set.]"
@@ -810,6 +823,20 @@ minetest.register_on_player_receive_fields(function(player, formname, fields)
if fields.noauto then
tcbs.route_auto = false
end
+
+ if sel_rte and tcbs.routes[sel_rte]and not tcbs.routeset then
+ if fields.moveup then
+ if tcbs.routes[sel_rte - 1] then
+ tcbs.routes[sel_rte - 1], tcbs.routes[sel_rte] = tcbs.routes[sel_rte], tcbs.routes[sel_rte - 1]
+ sel_rte = sel_rte - 1
+ end
+ elseif fields.movedown then
+ if tcbs.routes[sel_rte + 1] then
+ tcbs.routes[sel_rte + 1], tcbs.routes[sel_rte] = tcbs.routes[sel_rte], tcbs.routes[sel_rte + 1]
+ sel_rte = sel_rte + 1
+ end
+ end
+ end
advtrains.interlocking.show_signalling_form(sigd, pname, sel_rte, true)
return
diff --git a/advtrains_luaautomation/README.md b/advtrains_luaautomation/README.md
index a885075..275653c 100644
--- a/advtrains_luaautomation/README.md
+++ b/advtrains_luaautomation/README.md
@@ -93,6 +93,9 @@ Removes any pending interrupts of this node.
Make this active component send a digiline message on the specified channel.
Not available in init code.
+ - `trainparts(train_id)`
+ returns a table with the ids of the cars the train is composed of, or false if `train_id` is invalid. `train_id` can be replaced with `atc_id` when used in LuaATC Rails.
+
- `atc_send_to_train(<train_id>, <atc_command>)`
Sends the specified ATC command to the train specified by its train id. This happens regardless of where the train is in the world, and can be used to remote-control trains. Returns true on success. If the train ID does not exist, returns false and does nothing. See [atc_command.txt](../atc_command.txt) for the ATC command syntax.
@@ -142,22 +145,16 @@ asp = {
-- the character of call_on and dead_end is purely informative
call_on = <boolean>, -- Call-on route, expect train in track ahead (not implemented yet)
dead_end = <boolean>, -- Route ends on a dead end (e.g. bumper) (not implemented yet)
-
- w_speed = <integer>,
- -- "Warning speed restriction". Supposed for short-term speed
- -- restrictions which always override any other restrictions
- -- imposed by "speed" fields, until lifted by a value of -1
- -- (Example: german Langsamfahrstellen-Signale)
}
```
-As of January 2020, the 'dst', 'call_on' and 'dead_end' fields are not used.
+As of September 2024, the 'dst', 'call_on' and 'dead_end' fields are not used.
#### Lines
The advtrains_line_automation component adds a few contraptions that should make creating timeable systems easier.
Part of its functionality is also available in LuaATC:
-- `rwt.*` - all Railway Time functions are included as documented in [the wiki](https://advtrains.de/wiki/doku.php?id=dev:lines:rwt)
+- `rwt.*` - all Railway Time functions are included as documented in [the wiki](https://advtrains.de/wiki/doku.php?id=dev:api:railway_time_api)
- `schedule(rw_time, msg)`, `schedule_in(rw_dtime, msg)`
Schedules an event of type {type="schedule", schedule=true, msg=msg} at (resp. after) the specified railway time (which can be in any format). You can only schedule one event this way. (uses the new lines-internal scheduler)
@@ -273,10 +270,17 @@ Each wagon has a current FC, indicating its next destination.
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"}`
+
+ - `get_fc_index()`
+ Returns a table with the current FC index for each wagon in the train. Use in conjunction with the result from `get_fc()` to find a the current FC for a wagon.
+ Command: `get_fc_index()`
+ Result: `{1, 1, 1, 2, 1}`
- - `set_fc(fc_list)`
+ - `set_fc(fc_list, reset_index)`
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.
+ Useful for mass-programming freight trains that use FC-shunting instead of walking to each wagon individually. If the new FC entry for a wagon is shorter than the old entry, the index will clip to the last FC in the new entry.
+ If `reset_index` is true, all Current FC values will reset to the first entry in the list, instead of remaining at the current index.
+
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"`
diff --git a/advtrains_luaautomation/active_common.lua b/advtrains_luaautomation/active_common.lua
index 1a7009f..074d3b3 100644
--- a/advtrains_luaautomation/active_common.lua
+++ b/advtrains_luaautomation/active_common.lua
@@ -55,6 +55,10 @@ end
function ac.after_dig_node(pos, node, player)
advtrains.invalidate_all_paths(pos)
advtrains.ndb.clear(pos)
+ atlatc.interrupt.clear_ints_at_pos(pos)
+ if advtrains.lines and advtrains.lines.sched then
+ advtrains.lines.sched.discard_all(advtrains.encode_pos(pos))
+ end
local ph=minetest.pos_to_string(pos)
ac.nodes[ph]=nil
end
diff --git a/advtrains_luaautomation/atc_rail.lua b/advtrains_luaautomation/atc_rail.lua
index f069600..dd26f51 100755..100644
--- a/advtrains_luaautomation/atc_rail.lua
+++ b/advtrains_luaautomation/atc_rail.lua
@@ -95,11 +95,19 @@ function r.fire_event(pos, evtdata, appr_internal)
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 ""
+ fc_list[index] = table.concat(advtrains.wagons[wagon_id].fc or {},"!")
end
return fc_list
end,
- set_fc = function(fc_list)
+ get_fc_index = function()
+ if not train_id then return end
+ local fc_index_list = {}
+ for widx, wagon_id in ipars(train.trainparts) do
+ fc_index_list[widx] = advtrains.wagons[wagon_id].fcind or 1
+ end
+ return fc_index_list
+ end,
+ set_fc = function(fc_list,reset_index)
assertt(fc_list, "table")
if not train_id then return false end
-- safety type-check for entered values
@@ -113,11 +121,12 @@ function r.fire_event(pos, evtdata, appr_internal)
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
+ --effectively copyied from wagons.lua, allowing for the :split function and reset_index
+ data.fc = fc_list[index]:split("!")
+ if reset_index or not data.fcind then
+ data.fcind = 1
+ elseif data.fcind > #data.fc then
+ data.fcind = #data.fc
end
end
end
diff --git a/advtrains_luaautomation/environment.lua b/advtrains_luaautomation/environment.lua
index 6df5248..b54d45c 100644
--- a/advtrains_luaautomation/environment.lua
+++ b/advtrains_luaautomation/environment.lua
@@ -153,6 +153,12 @@ local static_env = {
local pos=atlatc.pcnaming.resolve_pos(parpos, "interrupt_pos")
atlatc.interrupt.add(0, pos, {type="ext_int", ext_int=true, message=imesg})
end,
+ train_parts = function(train_id)
+ if not train_id then return false end
+ local train = advtrains.trains[train_id]
+ if not train then return false end
+ return table.copy(train.trainparts or {})
+ end,
-- sends an atc command to train regardless of where it is in the world
atc_send_to_train = function(train_id, command)
assertt(command, "string")
@@ -224,7 +230,7 @@ if advtrains.interlocking then
end
static_env.set_aspect = function(signal, asp)
local pos = atlatc.pcnaming.resolve_pos(signal)
- return advtrains.interlocking.signal_set_aspect(pos)
+ return advtrains.interlocking.signal_set_aspect(pos,asp)
end
--section_occupancy()
@@ -233,7 +239,7 @@ if advtrains.interlocking then
ts_id = tostring(ts_id)
local response = advtrains.interlocking.db.get_ts(ts_id)
if not response then return false end
- return table.copy(response.trains)
+ return (response.trains and table.copy(response.trains)) or {}
end
end
diff --git a/advtrains_luaautomation/operation_panel.lua b/advtrains_luaautomation/operation_panel.lua
index 8e12651..8e12651 100755..100644
--- a/advtrains_luaautomation/operation_panel.lua
+++ b/advtrains_luaautomation/operation_panel.lua
diff --git a/advtrains_luaautomation/pcnaming.lua b/advtrains_luaautomation/pcnaming.lua
index 60983a6..0089ae7 100644
--- a/advtrains_luaautomation/pcnaming.lua
+++ b/advtrains_luaautomation/pcnaming.lua
@@ -24,6 +24,9 @@ function atlatc.pcnaming.resolve_pos(pos, func_name)
error("Invalid position supplied to " .. (func_name or "???")..": " .. dump(pos))
end
+
+local pcrename = {}
+
minetest.register_craftitem("advtrains_luaautomation:pcnaming",{
description = S("Passive Component Naming Tool\n\nRight-click to name a passive component."),
groups = {cracky=1}, -- key=name, value=rating; rating=1..3.
@@ -45,6 +48,7 @@ minetest.register_craftitem("advtrains_luaautomation:pcnaming",{
minetest.record_protection_violation(pos, pname)
return
end
+
local node = advtrains.ndb.get_node(pos)
local ndef = minetest.registered_nodes[node.name]
if node.name and (
@@ -59,16 +63,17 @@ minetest.register_craftitem("advtrains_luaautomation:pcnaming",{
pn=name
end
end
- minetest.show_formspec(pname, "atlatc_naming_"..minetest.pos_to_string(pos), "field[pn;"..S("Set name of component (empty to clear)")..";"..minetest.formspec_escape(pn).."]")
+ pcrename[pname] = pos
+ minetest.show_formspec(pname, "atlatc_naming", "field[pn;"..S("Set name of component (empty to clear)")..";"..minetest.formspec_escape(pn).."]")
end
end
end,
})
minetest.register_on_player_receive_fields(function(player, formname, fields)
- local pts=string.match(formname, "^atlatc_naming_(.+)")
- if pts then
- local pos=minetest.string_to_pos(pts)
- if fields.pn then
+ if formname == "atlatc_naming" then
+ local pname = player:get_player_name()
+ local pos=pcrename[pname]
+ if fields.pn and pos then
--first remove all occurences
for name, npos in pairs(atlatc.pcnaming.name_map) do
if vector.equals(npos, pos) then
diff --git a/advtrains_signals_ks/init.lua b/advtrains_signals_ks/init.lua
index bdbd50d..258b868 100755
--- a/advtrains_signals_ks/init.lua
+++ b/advtrains_signals_ks/init.lua
@@ -210,6 +210,8 @@ for _, rtab in ipairs({
danger = {asp = { main = false, shunt = false }, n = "shuntd", ici=true},
shuntd = {asp = { main = false, shunt = true } , n = "danger"},
}) do
+ local sbox = table.copy(rtab.sbox)
+ sbox[5] = 0
minetest.register_node("advtrains_signals_ks:ra_"..typ.."_"..rot, {
description = "Ks Shunting Signal",
drawtype = "mesh",
@@ -223,7 +225,11 @@ for _, rtab in ipairs({
paramtype2 = "facedir",
selection_box = {
type = "fixed",
- fixed = {-1/4, -1/2, -1/4, 1/4, 0, 1/4}
+ fixed = {sbox, rotation_sbox}
+ },
+ collision_box = {
+ type = "fixed",
+ fixed = sbox,
},
groups = {
cracky = 2,