Haltezeit der KI an Halstestellen beeinflussen, Motorabschaltung unterbinden

Das Forum befindet sich im reduzierten Betrieb. Die Addon- und Supportforen bleiben weiterhin verfügbar.
Bitte beachte, dass OMSI nicht mehr weiterentwickelt wird. Ein Teil der Entwickler widmet sich inzwischen der Entwicklung eines neuen Simulators. Weitere Informationen zum LOTUS-Simulator findest Du hier.
  • Moin!


    Ich hatte hier schon in Beitrag 30 gepostet dass mich das Handling der KI an den Haltestellen ein wenig nervt:
    EDITOR: Neuerungen im Überblick


    Zum einen wie beschrieben dass die KI den Motor abschaltet wenn sie bei Verfrühungen an Haltestellen mit dem Befehl "wait for departure" im Profil wartet. Zum anderen finde ich den Aufenthalt an Haltestellen der KI sowieso ein wenig zu kurz, da sie sich ja nicht mit Fahrscheinverkauf etc plagen muss. Daher würde ich gerne die Aufenthaltsdauer ein wenig strecken, inklusive einem Zufallsfaktor.


    Ich bin mir nicht sicher, kann mir aber vorstellen dass beides nicht rein hardcoded ist sondern per Script gesteuert wird, vor allem das zweite. Ich habe meherere Skripte durchgeguckt und denke die Lösung könnte in einer Modifikation der AI-Passage im door.osc Script liegen. Ich wüsste aber leider nicht was man genau dort abändern müsste.


    Zur Motorabschaltung beim Warten:
    Hier suche ich nicht nach einer Möglichkeit das Motorabschalten generell zu unterbinden (z.B. bei Endhaltestellen), sondern dann zu unterbinden wenn der Aufenthalt unterwegs bei Verwendung von "wait for departure" relativ kurz ist, zum Beispiel bei Verfrühungen von unter 2-3 Minuten.


    Hat sich jemand vielleicht bereits damit auseinandergesetzt oder hat jemand Ideen?

  • Es gibt für Omsi 1 einen Mod, der die Busse an der Haltestellen warten lässt. Das war sozusagen eine if-Anweisung. (Erklärung: Türen erst zumachen, wenn Zeit erreicht ist)
    In diesem Fall könnnte es ähnlich gehen.
    Du müsstest die entsprechende Stelle im Script suchen, wo festgelegt wird, wann der Motor ausgeschaltet wird. Dann könntest du eine if-Anweisung hinzufügen. (Wie im Thread zum warten)
    Ich kenn mich damit aber nicht so wirklich aus, war nur eine Anregung

    ;)
  • Hallo Wurstbrot,


    Ich [...] kann mir aber vorstellen dass beides nicht rein hardcoded ist sondern per Script gesteuert wird


    Mit dieser Vermutung liegst du richtig. Sowohl der Motor als auch die Abfahrt von einer Haltestelle werden vom Script gesteuert.
    Zumindest war es in OMSI1 so. Da ich OMSI2 nicht habe, kann ich es nicht 100%ig sagen, aber ich vermute es einfach mal.


    Da ja von den neuen Möglichkeiten in OMSI2 ja noch nicht so viel nach außen gedrungen ist, schlage ich hier Dinge vor, wie sie in OMSI1 funktionieren würden. Ob das dann funktioniert, musst du selber rausfinden.


    Also, 1.: Kein Motor aus, wenn die Haltestelle nicht die Endhaltestelle ist:
    Im AI-Modus ist kein IBIS aktiviert, also müssen wir mit den System-Variablen und System-Makros zum Thema Fahrplan auskommen.
    Im OMSI-Wiki (http://omnibussimulator.de/oms…e=System-Makros#Fahrzeuge) siehst du, dass es ein paar System-Makros gibt, die ohne Input-Werte auskommen, darunter GetTTBusstopCount und GetTTBusstopIndex. Wenn der Index dem Count-1 (wie in der Informatik üblich beginnt der Zähler bei 0) entspricht, hat der Bus die Endhaltestelle erreicht und darf den Motor abschalten. Hier ist aber in Gothenberg Vorsicht geboten, die Nachtbusse schalten den Motor dann am Kreuzplatz trotzdem ab!


    Umsetzung im Script:
    Was du suchst, befindet sich bei den SDs und Ds im Script "ai.osc". Du erweiterst einfach die Bedingung bei 'Engine off:

    Code
    1. ...
    2. (L.L.AI_Engine) -0.5 < (L.L.engine_on) 0.5 > &&
    3. (M.V.GetTTBusstopCount) (M.V.GetTTBusstopIndex) 1 - = &&
    4. {if}
    5. ...


    Zum anderen finde ich den Aufenthalt an Haltestellen der KI sowieso ein wenig zu kurz, da sie sich ja nicht mit Fahrscheinverkauf etc plagen muss. Daher würde ich gerne die Aufenthaltsdauer ein wenig strecken, inklusive einem Zufallsfaktor.

    Das ist "etwas" aufwändiger.
    Zunächst musst du dich zuerst damit beschäftigen, wie du das umsetzen willst. Je nach deinen Script-Kenntnissen hast du unterschiedliche Möglichkeiten. Das einfachste wäre ein schlichter Timer, der die Mindest-Haltezeit bestimmt.
    Die Umsetzung versteckt sich bei den SDs und Ds wieder im "ai.osc"-Script.
    Hier kommst du nicht um eine zusätzliche Variable herum.
    Diese definierst du in einer der _varlist-Dateien, am besten in der "AI_varlist.txt"
    Am besten benennst du sie sinnvoll, zum Bleistift "AI_Haltedauer_Timer".
    Dann schaust du wieder ins Script. Im Abschnitt, der mit "'Wenn Türen geöffnet werden sollen:" beginnt, siehst du den Aufruf des Macros "trg_bus_dooraft". Hier kannst du deinen Timer initialisieren.

    Code
    1. ...
    2. 'Taster jeweils nur betätigen, falls noch nicht an
    3. (L.L.bremse_halte_sw) !
    4. {if}
    5. (M.L.trg_bus_dooraft)
    6. 10 random (S.L.AI_Haltedauer_Timer)
    7. {endif}
    8. ...

    Damit setzt du in dem Moment, in dem die Haltestellenbremse eingelegt wird, die Mindesthaltedauer auf einen Zufallswert zwischen 0 und 9 Sekunden. Als nächstes musst du dafür sorgen, dass der Timer auch runterzählt.

    Code
    1. ...
    2. (L.L.door_AI_timer) (L.S.Timegap) + (S.L.door_AI_timer)
    3. ...


    Ist bereits ein einfacher Timer. Du setzt deinen einfach darunter:

    Code
    1. ...
    2. (L.L.door_AI_timer) (L.S.Timegap) + (S.L.door_AI_timer)
    3. (L.L.AI_Haltedauer_Timer) (L.S.Timegap) - 0 max (S.L.AI_Haltedauer_Timer)
    4. ...

    Damit wird dein Timer immer um die abgelaufene Zeit des aktuellen Frames verringert. "0 max" ist der Begrenzer, dass der Timer nicht unnötig kleiner als 0 wird.
    Jetzt musst du nur noch dafür sorgen, dass der Bus wirklich nicht früher abfährt.

    Hier ergänzt du die Passage auf


    Dadurch fährt der Bus erst ab, wenn die Türen zu sind UND der Timer abgelaufen ist.


    Ich empfehle dir, wenn du weitere Scripts basteln möchtest, dir das OMSI-Wiki durchzulesen und dann einfach rumzuprobieren. So hab' ich's auch geschafft. Einigermaßen erfolgreich, wenn ich das mal so behaupten darf...


    MfG,


    Busfanat

  • Vielen Dank Euch beiden für die wirklich sehr hilfreichen Antworten!


    Ich werde mich mal ransetzen und das ausprobieren.


    Beim Scripten selbst bin ich bisher noch nicht über die absoluten Basics hinausgekommen, und das seit OMSI 1. So einfache Sachen wie Schlüssel- oder Wischerhebel drehen per Tatstatur hab ich hingekriegt, bei komplizierteren Geschichten steh ich aber meist wie ein Ochse vor dem Berg;-) Wenn das jetzt hinhaut versuche ich es mal endlich hinzukriegen, dass Rollband-KI an den Endstellen auch schön brav vor Abfahrt das Ziel kurbelt und nicht per Zauberhand wechselt, am Besten mit Verzögerung der Abfahrt damit die Beförderungsfälle noch eine Chance bekommen einzusteigen wenn es keien extra Betriebshaltestellen gibt. Da gehts aber schon los: was ist wenn ein ziel mehrfach in der Hof-Datei vorhanden ist... Nun ja, eins nach dem anderen...


    Edit:
    Hab mich nun am ersten Teil versucht, leider mit unbefriedigendem Ergebnis. Wenn ich den Code


    Code
    1. 'Wenn der Motor aus sein soll, dann nimm 0 als Sollwert:
    2. (L.L.AI_Engine) -0.5 < (L.L.engine_on) 0.5 > &&
    3. (M.V.GetTTBusstopCount) (M.V.GetTTBusstopIndex) 1 - = &&
    4. {if}
    5. 0 (S.L.AI_engine_n_soll)
    6. 'Sonst isser an:


    verwende, wird der Motor zwar Unterwegs bei Verfrühung nicht ausgemacht, allerdings auch nicht an Endstellen. Dort schalten alle bearbeiteten Busse nur von Abblendlicht auf Standlicht, lassen den Motor aber an. Wenn ich die Zeile 4 entferne, Zeile 3 aber belasse habe ich das gleiche Ergebnis. Ebenfalls wenn ich (L.L.engine_on) 0.5 > && entferne, Zeile 4 aber belasse. Irgendwie scheint die Terminus-Erkennung nicht zu funktionieren, auch wenn Sie richtig zu sein scheint.