Ich habe nochmal über das Thema nachgedacht und ich halte die Idee Dynamische Signale schon für machbar... allerdings anders als ich zuerst vorgeschlagen habe. Entsprechend deinem Ansatz (1) könnte man den Fahrtweg von Zügen abfragen und prüfen in welchen Abzweig dieser hinter einem Signal wäre. Intern lässt sich das in TPF2 via MOVE_PATH abfragen. Dieser Ansatz hätte den Vorteil, dass man keine manuelle Zuordnung machen muss und daher ohne GUI auskommt!
Man bräuchte extra Konstruktionen, die man neben das Gleis platziert, während auf dem Gleis selbst ein unsichtbares Signal ist. So vermeidet man Eingriffe in das Gleisnetz und die Definition als Konstruktion ermöglicht Parameter (an/aus, Hp2, dynamische Geschwindigkeit, Geschwindigkeitsvoranzeiger, Gegengleis...). Also praktisch eine Fake Signalkonstruktion, die man nicht funktional aufs Gleis setzen kann, aber mit einem Script verbunden ist. Die müsste man entweder aus den bisherigen Signalmods speisen oder sauber neu programmieren mit allen Kombinationen und Teilmodellen.
Hier ein grobes Code Konzept.
1. Wenn ein neues Dynamisches Signal platziert wird, wird es in eine Liste aufgenommen zur Zuordnung.
2. Es braucht eine Funktion (udpateRailNetworkInfo) um regelmäßig die Gleisinfrastruktur durchzugehen und dabei die Abzweige hinter den Signalen analysiert. Mit den api Funktionen sollte das möglich sein, den Nodes und Edges zu folgen. Dabei wird die tatsächliche Höchstgeschwindigkeit ermittelt, sodass automatisch die richtige Nummer am Signal gezeigt wird!
3. Kontinuierlich muss dann geprüft werden ob ein Signal angeschaltet werden muss, weil ein Zug sich einen Pfad reserviert (checkSignalStates). Dazu muss der Move Path von allen Zügen analysiert werden, da sich nur hier die Informationen finden. Dann weiß man wo der Zug hinwill und kann das richtige Signalbild bestimmen. Die Konstruktion kann entsprechend geupgradet werden.
function udpateRailNetworkInfo()
-- for all dynamic signals:
-- echtes signal am Gleis finden
signals = game.interface.getEntities({radius=5,pos={x,y}}, { type = "SIGNAL" })
assert (#signals==1)
signal_edge = api.engine.system.streetSystem.getEdgeForEdgeObject(signals[1])
n2e = api.engine.system.streetSystem.getNode2TrackEdgeMap() -- Gleis Graph
-- folge in Signalrichtung über alle Weichen/Abzweigungen bis zum nächsten Signal
-- ermittle dabei jeweilige Richtungen und Maximalgeschwindigkeiten
end
function checkSignalStates()
trains = {}
api.engine.system.trainMoveSystem.forEach(function (a) table.insert(trains, a) end)
-- for all trains
move_path.path.edges[move_path.dyn.pathPos.edgeIndex]
... bis
move_path.path.edges[move_path.dyn.pathPos.edgeIndex+move_path.path.endOffset] -- geht manchmal immer noch übers Signal hinaus
-- checken ob einer der pfade über eines der Signale läuft und in welchen Abzweig (und ob das Signal an ist)
Alles anzeigen
Analog diesem Ansatz wäre es auch einfach möglich, von Vorsignalen (auch als extra Fake-Konstruktion) den Pfad zum nächsten Hauptsignal zu ermitteln und dann abzuändern, wenn das Signal umschaltet. Hier sollten sich aber keine Abzweige bis zum Hauptsignal befinden.
Soweit das Konzept. Ich lasse das einfach mal hier liegen. Ich werde da nämlich in absehbarer Zeit nicht selbst daran arbeiten können. Wenn sich jemand der Sache annehmen will, werde ich aber gerne unterstützen!
Sowieso wäre es hier notwendig, dass ein Signal Modder von der Modwerkstatt entgegenkommt.