Moin,
Wir alle kennen ja das Problem, dass für kleinste Unterschiede immer separate .bus-Dateien erstellt werden müssen.
Zwar gibt es die Constfiles, in denen auch Anfänger relativ einfach Werte ändern können, aber auch diese müssen über eine extra .bus-Datei geladen werden.
Ich habe mir hierzu Gedanken gemacht und bin auf eine Lösung gekommen, die ich euch hier präsentieren möchte: HOF-abhängige Konstanten.
Natürlich gibt es offiziell keine Möglichkeit, Konstanten über die HOF-Datei zu definieren, sonst wüsstet ihr davon.
Stattdessen definiere ich die Konstanten als Busstop-Einträge.
Die Konstanten meines Türskriptes sehen z.B. so aus (Rheinhausen.hof):
Der Name der Konstanten ist als Busstop-Ident definiert, der Wert als String #0, getrennt durch ein Tab, mehr ist nicht erforderlich.
Im Gegensatz zur constfile wären hier sogar Strings oder mehrere Werte pro Konstante möglich.
In Spandau möchte man nun ein anderes Verhalten der Türsteuerung als in Rheinhausen und würde z.B. den folgenden Abschnitt in die Spandau.hof kopieren:
Schon hätte man zwei verschiedene Türsteuerungen im selben Bus, ohne umständliches Anlegen einer neuen .bus-Datei.
Diese "Konstantenblöcke" lassen sich übrigens mühelos in jede .hof einfügen.
Es ist kein Eingliedern in die bestehende Busstop-Liste nötig und es funktioniert auch in Zusammenspiel mit dem alten .hof-Format.
Sowas hier ginge also auch:
- [addbusstop]
- Einsteindorf Marktpl
- E.DORF MARKTPL.
- Einsteindorf
- Marktplatz
- E.-dorf Marktplatz
- ....................
- ................
- [addbusstop]
- Krankenhaus
- E.DORF KRK.HAUS
- Einsteindorf
- Krankenhaus
- E.-dorf Krkhaus
- ....................
- ................
- ***** Konstanten: *****
- [addbusstop_list]
- frontdoor_needs_stopbrake 1
- backdoor_needs_stopbrake 1
- frontdoor_sets_stopbrake 0
- backdoor_sets_stopbrake 0
- frontdoor_locks_stopbrake 1
- backdoor_locks_stopbrake 1
- backdoor_automatic 1
- stopbrake_persistent 0
- AI_always_open_frontdoor 0
- [end]
Das Auslesen ist ganz einfach über die Busstop-Funktionen möglich (GetBusstopIndex sowie GetBusstopString).
Der Wert in Stringform wird dann noch per $StrToFloat in eine Gleitkommazahl umgewandelt, damit wir ihn in if-Abfragen verwenden können.
Zur Vereinfachung kann man sich eine kleine Funktion schreiben, etwa so:
Über diese Funktion kann der Wert dann während der Laufzeit ausgelesen, oder (was ich persönlich bevorzuge), beim Laden des Busses einmalig in Variablen gespeichert werden:
- {trigger:bus_doorfront1}
- "backdoor_automatic" (M.L.GetSettingsValue) !
- {if}
- (M.L.trg_bus_dooraft23)
- {endif}
- {end}
- {macro:Door_Init}
- (...)
- ' Konstanten zuweisen:
- "frontdoor_needs_stopbrake" (M.L.GetSettingsValue) (S.L.CONST_frontdoor_needs_stopbrake)
- "backdoor_needs_stopbrake" (M.L.GetSettingsValue) (S.L.CONST_backdoor_needs_stopbrake)
- "frontdoor_sets_stopbrake" (M.L.GetSettingsValue) (S.L.CONST_frontdoor_sets_stopbrake)
- "backdoor_sets_stopbrake" (M.L.GetSettingsValue) (S.L.CONST_backdoor_sets_stopbrake)
- "frontdoor_locks_stopbrake" (M.L.GetSettingsValue) (S.L.CONST_frontdoor_locks_stopbrake)
- "backdoor_locks_stopbrake" (M.L.GetSettingsValue) (S.L.CONST_backdoor_locks_stopbrake)
- "frontdoor_separated" (M.L.GetSettingsValue) (S.L.CONST_frontdoor_separated)
- "backdoor_automatic" (M.L.GetSettingsValue) (S.L.CONST_backdoor_automatic)
- "stopbrake_persistent" (M.L.GetSettingsValue) (S.L.CONST_stopbrake_persistent)
- "AI_always_open_frontdoor" (M.L.GetSettingsValue) (S.L.CONST_AI_always_open_frontdoor)
- {end}
Ich habe hier zwecks Übersichtlichkeit den Variablen das Präfix "CONST_" gegeben, aber das muss man natürlich nicht.
Die Verwendung der Konstanten im Skript funktioniert dann wie bisher, nur werden sie anstatt über (C.L.xxxxx) mit (L.L.CONST_xxxxx) abgerufen.
Zu beachten ist noch, dass bei nicht definierten Konstanten der Wert immer -1, also negativ ist.
Zur Lösung dieses "Problems" (wenn man es denn als solches ansieht) nutze ich den folgenden Code:
- "frontdoor_needs_stopbrake" (M.L.GetSettingsValue) s0 -1 = {if} 1 {else} l0 {endif} (S.L.CONST_frontdoor_needs_stopbrake)
- "backdoor_needs_stopbrake" (M.L.GetSettingsValue) s0 -1 = {if} 1 {else} l0 {endif} (S.L.CONST_backdoor_needs_stopbrake)
- "frontdoor_sets_stopbrake" (M.L.GetSettingsValue) s0 -1 = {if} 0 {else} l0 {endif} (S.L.CONST_frontdoor_sets_stopbrake)
- "backdoor_sets_stopbrake" (M.L.GetSettingsValue) s0 -1 = {if} 0 {else} l0 {endif} (S.L.CONST_backdoor_sets_stopbrake)
- "frontdoor_locks_stopbrake" (M.L.GetSettingsValue) s0 -1 = {if} 0 {else} l0 {endif} (S.L.CONST_frontdoor_locks_stopbrake)
- "backdoor_locks_stopbrake" (M.L.GetSettingsValue) s0 -1 = {if} 1 {else} l0 {endif} (S.L.CONST_backdoor_locks_stopbrake)
- "frontdoor_separated" (M.L.GetSettingsValue) s0 -1 = {if} 1 {else} l0 {endif} (S.L.CONST_frontdoor_separated)
- "backdoor_automatic" (M.L.GetSettingsValue) s0 -1 = {if} 1 {else} l0 {endif} (S.L.CONST_backdoor_automatic)
- "stopbrake_persistent" (M.L.GetSettingsValue) s0 -1 = {if} 0 {else} l0 {endif} (S.L.CONST_stopbrake_persistent)
- "AI_always_open_frontdoor" (M.L.GetSettingsValue) s0 -1 = {if} 1 {else} l0 {endif} (S.L.CONST_AI_always_open_frontdoor)
Dieser weist bei nicht definierten Konstanten (-1) automatisch einen Standardwert zu, so ist frontdoor_needs_stopbrake z.B. standardmäßig aktiviert (1).
Vielleicht kann ja jemand mit meinen Erkenntnissen bzw. Ideen etwas anfangen.
Am Besten wäre natürlich eine offizielle Unterstützung von Konstanten in der HOF-Datei in kommenden OMSI-Versionen.
Bis dahin fährt man mit meiner Lösung aber ganz gut, denke ich.
Wer mal ein bisschen damit rumexperimentieren möchte, kann sich hier mein gemoddetes door-Script für NL202 / NG272 laden.
Hinweis: Die Konstante frontdoor_separated ist zurzeit funktionslos, die habe ich noch nicht eingebaut. Auch ansonsten erhebt das Skript keinen Anspruch auf Vollständigkeit.
Freue mich auf Kritik & Anregungen.
Gruß,
SchulterSack