Hi,
Would it be possible to add a custom name pattern field for dynamic train stop names?
Right now the mod uses the detected signal and adds the pickup/dropoff arrow. That works, but for larger rail networks it would be very useful if we could define the final station name ourselves.
Example patterns:
{signal} 1-4 Receiver
{signal} 1-4 Provider
{signal} In 1-1-1
{signal} Out 2-4-0
Where {signal} would be replaced by the detected item/fluid/signal rich text icon.
Reason/use case:
I use Cybersyn. Cybersyn itself does not need the train stop name for routing, but I still use clear station names for readability. My naming scheme is normally:
<Item> <Train length> <Provider/Requester>
For example:
Iron Plate 1-4 Receiver
Copper Plate 2-4 Provider
A custom pattern field would allow the dynamic name to stay readable while also supporting different train lengths per station.
Possible simple UI idea:
In the Dynamic Name section, add a text field called “Name pattern” with a default like:
{signal}{arrow}
That would keep current behavior as the default, but allow users to change it per station to something like:
{signal} 1-4 Receiver
Optional extra tokens could be:
{signal} = detected signal icon
{arrow} = current up/down arrow
{direction} = pickup/dropoff text
Very rough code idea, not tested, but something like this:
function storageHelper.get_name_pattern(train_stop)
if not train_stop or not train_stop.valid then
return "{signal}{arrow}"
end
local data = storage.train_stop_data[train_stop.unit_number]
if data and data.name_pattern and data.name_pattern ~= "" then
return data.name_pattern
end
-- Default keeps current behavior
return "{signal}{arrow}"
end
Then in signalProcessing.create_new_name_from_signal():
function signalProcessing.create_new_name_from_signal(signal, train_stop)
if not signal or not signal.signal or not signal.signal.signal or not signal.signal.signal.name then
return nil
end
local signal_name = signal.signal.signal.name
local signalType = signalProcessing.get_signal_type(signal_name)
if not signalType then
return nil
end
local signal_icon = "[" .. signalType .. "=" .. signal_name .. "]"
local dropoff_setting = storageHelper.is_dropoff_set(train_stop)
local arrow = dropoff_setting and "[virtual-signal=down-arrow]" or "[virtual-signal=up-arrow]"
local direction = dropoff_setting and "Receiver" or "Provider"
local pattern = storageHelper.get_name_pattern(train_stop)
pattern = string.gsub(pattern, "{signal}", signal_icon)
pattern = string.gsub(pattern, "{arrow}", arrow)
pattern = string.gsub(pattern, "{direction}", direction)
return pattern
end
And in the GUI, maybe something like:
settings_frame.add {
type = "textfield",
name = "dynamic_name_pattern_textfield",
caption = "Name pattern",
text = storageHelper.get_name_pattern(train_stop)
}
Then store it when the text changes:
if event.element.name == "dynamic_name_pattern_textfield" then
local player = game.players[event.player_index]
local train_stop = player.opened
if train_stop and train_stop.valid and train_stop.type == "train-stop" then
if not storage.train_stop_data[train_stop.unit_number] then
storage.train_stop_data[train_stop.unit_number] = {}
end
storage.train_stop_data[train_stop.unit_number].name_pattern = event.element.text
end
end
This would make the mod much more flexible for Cybersyn/LTN-style multi-item stations and for bases using multiple train lengths.