Railway/Train path finding
Bevor ein Zug ein Ziel (in diesem Fall eine Zughaltestelle) ansteuert, berechnet er die beste Route auf der Grundlage des zu diesem Zeitpunkt vorhandenen Eisenbahnnetzes.
Routenfindung Kosten
Zur Berechnung verwendet er einen einfachen A*-Algorithmus[1]: Der Routenfinder erstellt zunächst eine Liste von nicht gesperrten Haltestellen, die mit dem Namen im Fahrplan übereinstimmen, und sucht dann von beiden Enden des Zuges aus gleichzeitig, ggf. in Segmenten, nach außen. Ein Segment ist eine ununterbrochene Folge von Schienen, ohne Kreuzungen, Haltestellen oder Signale (die alle die Segmentgrenzen definieren). Die Kosten (Entfernung) werden anhand der folgenden Gewichtungsregeln berechnet:
- Die Basiskosten für einen Block/Segment sind die Länge des Segments (lineare Rasterlänge entlang der Mitte der Schiene).
- Wenn der Block von einem Zug besetzt ist → Füge einen Malus von 2 * Länge des Blocks geteilt durch die Blockdistanz vom Startpunkt hinzu, so dass die weit entfernten besetzten Routen keine große Rolle spielen.
- Wenn der Block von einem vom Schaltungsnetz auf rot gesetzten Zugsignal begrenzt wird → Füge einen Malus von 1000 hinzu.
- Wenn die Route eine Haltestelle enthält, die nicht das Ziel ist → Füge einen Malus von 2000 hinzu.
- Wenn die Route eine Haltestelle enthält, in dem ein Zug angehalten hat → Füge einen Malus von 500 hinzu.
- Wenn die Route eine Haltestelle enthält, in dem ein Zug angehalten hat, der keine andere gültige Haltestelle im Fahrplan hat → Füge einen Malus von 1000 hinzu.
- Wenn die Route einen manuell gesteuerten angehaltenen Zug enthält → Füge einen Malus von 2000 hinzu.
- Wenn die Route einen manuell gesteuerten angehaltenen Zug ohne Fahrgast enthält → Füge einen Malus von 7000 hinzu.
- Wenn die Route einen automatisch gesteuerten Zug ohne Fahrplan enthält → Füge einen Malus von 7000 hinzu.
- Wenn die Route einen Zug enthält, der gerade an einer Haltestelle ankommt → Füge einen Malus von 100 hinzu.
- Wenn die Route einen Zug enthält, der gerade an einem Schienensignal eintrifft → Füge ein Malus von 100 hinzu.
- Wenn die Route einen Zug enthält, der gerade an einem Schienensignal wartet → Füge einen Malus von 100 + 0,1 für jeden Tick hinzu, den der Zug bereits gewartet hat.
- Wenn die Route einen Zug enthält, der keine Route hat → Füge einen Malus von 1000 hinzu.
Routen-Revalidierung
Eine Route wird neu validiert, wenn ein Ereignis eintritt, das die Route dieses Zuges ungültig machen könnte. Wenn die Route für ungültig befunden wird, wird das Spiel die Route des Zugs neu berechnen. Die Routenrevalidierung bestätigt nur, dass die aktuelle Route noch gültig ist, nicht aber, dass sie noch die beste ist. Die folgenden Ereignisse führen zu einer Routenrevalidierung:
- Eine Schiene wird zerstört (alle Züge werden revalidiert).
- Eine Schiene wird erstellt und macht ein Signal ungültig (alle Züge werden revalidiert).
- Ein Signal (Kettensignal oder regulär) wird erstellt oder zerstört (alle Züge werden revalidiert).
- Ein Schienenblock ändert sich und macht ein Signal (Kettensignal oder regulär) ungültig (alle Züge werden revalidiert).
- LuaTrain::recalculate_path() wird von einem Skript für den Zug aufgerufen.
- Der Fahrplan des Zuges wird geändert.
- Die Bremskraft des Zuges wird geändert und der Zug fährt gerade normal, kommt an einem Signal (Kettensignal oder regulär) an oder fährt in eine Haltestelle ein.
- Der Zug hat an einem Zug-Kettensignal für ein Vielfaches von 5 Sekunden gewartet.
Ereignisse für Neuberechnungen
Es gibt eine Reihe von Ereignissen, die einen Zug veranlassen können, die Route neu zu berechnen. Wenn eine der unten angegebenen Bedingungen erfüllt ist, prüft das Spiel mögliche Wege vom aktuellen Standort des Zuges zu seiner Zielhaltestelle und wählt den Weg mit der niedrigsten Punktzahl gemäß den oben aufgeführten Malussen.
Benutzer-/Skript-generierte Ereignisse
- Eine Lokomotive, die Teil des Zuges ist, wird gedreht.
- LuaTrain::recalculate_path(true) wird von einem Skript auf dem Zug aufgerufen.
- Der Zug wird auf automatische Steuerung umgeschaltet, wenn er zuvor manuell gesteuert wurde.
- Dem Zug wird über die Schaltfläche "Fahre zu Haltestelle" in der GUI des Zuges befohlen, zu einer Haltestelle zu fahren.
- Ein Wegpunkt (Haltestelle ohne Wartebedingung) wird aus dem Fahrplan des Zuges entfernt.
Neuberechnung von Routen, die im Rahmen des normalen Zugbetriebs stattfindet
- Für den Zug schlägt die Revalidierung seiner Route fehl.
- Die Haltestelle, die ein Zug ansteuert, wird umbenannt oder zerstört.
- Der Zug ist dabei gleich an einem Signal (Kettensignal oder regulär) zu halten, aber das Signal ändert sich so, dass der Zug nun weiterfahren kann.
- Der Zug bremst vor einem Signal (Kettensignal oder regulär), das er nicht reservieren kann.
- Der Zug fährt in einen neuen Gleisblock ein und kann das nächste benötigte Signal (Kettensignal oder regulär) nicht reservieren.
- Der Zug hat an einem Kettensignal ein Vielfaches von 5 Sekunden gewartet und es gibt mehrere Zughalte mit demselben Namen wie das Ziel.
- Der Zug hat an einem Kettensignal ein Vielfaches von 30 Sekunden gewartet und es gibt nur einen einzigen Haltepunkt mit demselben Namen wie das Ziel.
- Der Zug möchte von einem Signal (Kettensignal oder regulär) abfahren, an dem er angehalten hat.
- Der Zug möchte von einer Haltestelle abfahren.
- Die Haltestelle, die der Zug anfährt, wird gesperrt.
Ziel ist voll / Kein Pfad
- Eine neue Schiene wird verlegt.
- Eine Haltestelle, die Teil des Fahrplans des Zuges ist, wird aktiviert, umbenannt oder angelegt.
- Das Zuglimit einer Haltestelle, die Teil des Fahrplans des Zuges ist, ist nicht mehr voll.
- Die Haltestelle, die der Zug derzeit nicht erreichen kann, wird deaktiviert oder zerstört.
Sonstiges
- Der Zug kollidiert mit etwas, das kein Zug ist (wie beispielsweise ein Spieler).