<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>http://wiki.omnibussimulator.de/omsiwikineu.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Busfanat</id>
	<title>OMSIWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.omnibussimulator.de/omsiwikineu.de/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Busfanat"/>
	<link rel="alternate" type="text/html" href="http://wiki.omnibussimulator.de/omsiwikineu.de/index.php?title=Spezial:Beitr%C3%A4ge/Busfanat"/>
	<updated>2026-04-12T22:30:32Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>http://wiki.omnibussimulator.de/omsiwikineu.de/index.php?title=Fahrtzielanzeiger_an_Bussen&amp;diff=997</id>
		<title>Fahrtzielanzeiger an Bussen</title>
		<link rel="alternate" type="text/html" href="http://wiki.omnibussimulator.de/omsiwikineu.de/index.php?title=Fahrtzielanzeiger_an_Bussen&amp;diff=997"/>
		<updated>2014-05-18T20:33:25Z</updated>

		<summary type="html">&lt;p&gt;Busfanat: Die Seite wurde neu angelegt: „=Fahrtzielanzeiger des Vorbilds in OMSI=  Prinzipiell lassen sich alle Fahrtziel-Anzeigesysteme mittels Scripts in OMSI darstellen. Die Schwierigkeiten liegen im …“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;=Fahrtzielanzeiger des Vorbilds in OMSI=&lt;br /&gt;
&lt;br /&gt;
Prinzipiell lassen sich alle Fahrtziel-Anzeigesysteme mittels Scripts in OMSI darstellen. Die Schwierigkeiten liegen im Aufwand der Umsetzung und der Performance.&lt;br /&gt;
Im folgenden Artikel geht es lediglich um die scriptseitige Darstellung, nicht um das Erstellen im 3D-Programm oder das Einbinden in der *.cfg-Datei.&lt;br /&gt;
&lt;br /&gt;
==Steckschilder==&lt;br /&gt;
* Fahrtzieldarstellung:&lt;br /&gt;
Die wahrscheinlich einfachste Möglichkeit eines Zielanzeigers. Auf einer Tafel steht das Ziel geschrieben.&lt;br /&gt;
Der Dateiname der aktuellen Ziel-tga kann aus der *.hof-Datei ausgewertet werden.&lt;br /&gt;
* Bedienung/Umsetzungsvorschlag:&lt;br /&gt;
Das Entfernen des Schildes kann recht einfach realisiert werden. Ein Klick auf das Schild und über eine Visible-Variable wird das Schild ausgeblendet.&lt;br /&gt;
Komplexer ist das Einstecken des richtigen Schilds. Lässt sich theoretisch über das Alt-Menü lösen, allerdings ist diese Variante eher unschön.&lt;br /&gt;
In der Realität wurden bei Schichtbeginn genau jene Schilder, die man während des Diensts brauchen würde, im Bus verstaut und mitgeführt.&lt;br /&gt;
Als Alternative zur Umsetzung würde sich ein Blick in eine Fahrermappe, in der man die nächste Route bzw. das nächste Ziel auswählt, anbieten.&lt;br /&gt;
Ein Klick auf den Zielschildhalter könnte das Schild dann platzieren/über die Visible-Variable wieder einblenden.&lt;br /&gt;
&lt;br /&gt;
==Rollbänder==&lt;br /&gt;
* Fahrtzieldarstellung:&lt;br /&gt;
Bei diesem Fahrtziel-Anzeigen-Typ befinden sich alle Zielschilder des aktuellen Hofs auf einem Rollband. Je nach Fahrtrichtung wird dieses Rollband in die entsprechende Position gedreht, sodass das aktuelle Fahrtziel&lt;br /&gt;
von außen sichtbar ist.&lt;br /&gt;
* Bedienung/Umsetzungsvorschlag:&lt;br /&gt;
In der Realität werden (bzw. wurden) Rollbänder entweder von Hand gekurbelt oder über Stellmotore eingestellt.&lt;br /&gt;
Bei einer Einstellung über Stellmotore erfolgt die Steuerung kann tastend, schrittweise oder zielbasiert erfolgen. Bei der tastenden und schrittweisen Steuerung besitzt das Steuergerät pro Motor zwei Taster, einen für jede Drehrichtung.&lt;br /&gt;
Der Motor dreht sich so lange in die gewählte Richtung, wie der Taster betätigt wird. Bei einer tastenden Steuerung bleibt das Rollband nach dem Auslassen in der aktuellen (Zwischen-)Position stehen, währdend es sich bei einer schrittweisen Steurung bis zur nächsten Rastposition weiterdreht.&lt;br /&gt;
Bei einer zielbasierten Rollbandsteuerung kann die Zieleingabe entweder über das IBIS oder ein separates Steuerpanel erfolgen. Sobald das Ziel eingegeben und bestätigt wurde, dreht sich das Rollband selbsttätig zur gewählten Position.&lt;br /&gt;
Es können wie in den SDs die Dateinamen der Rollband-tgas aus der *.hof-Datei ausgelesen werden.&lt;br /&gt;
&lt;br /&gt;
==ANNAX==&lt;br /&gt;
* Fahrtzieldarstellung:&lt;br /&gt;
Die von M&amp;amp;R bereits in OMSI1 inkludierte ANNAX-Matrix bietet eine gerasterte Ziel-Anzeige für zwei Zeilen á 16 Zeichen sowie eine Linienanzeige für 3 Zeichen. Dabei wird jedes Zeichen nacheinander, erst die obere Zeile von links nach rechts, dann die untere Zeile von links nach rechts umgeschaltet.&lt;br /&gt;
* Bedienung/Umsetzungsvorschlag:&lt;br /&gt;
Da die ANNAX-Matrix starr gerastert ist, kann die Wechsel-Animation soweit vereinfacht werden, dass immer ein ganzes Zeichen aktualisiert wird.&lt;br /&gt;
Die Bedienung erfolgt über das IBIS oder ein separates Matrix-Steuergerät. Nach der Eingabe der neuen Informationen schildert die Anzeige diese selbsttätig.&lt;br /&gt;
&lt;br /&gt;
==FlipDots==&lt;br /&gt;
* Fahrtzieldarstellung:&lt;br /&gt;
Die namengebenden FlipDots sind kleine Plättchen, die auf der einer Seite schwarz und auf der anderen Seite in einer dazu kontrastreichen Farbe (beispielsweise weiß oder neongrün) ausgeführt sind. Die Matrix besteht, um das Schriftbild darzustellen, aus entsprechend vielen dieser Plättchen. Um die Plättchen zu drehen, ist jedes einzelne mit einem kleinen Elektromotor ausgestattet. Um Verkabelungs-Aufwand zu sparen werden die Elemente über eine Matrixschaltung Spalten- oder Zeilenweise geschaltet.&lt;br /&gt;
* Bedienung/Umsetzungsvorschlag: Aufgrund der schrittweisen Aktualisierung der Fahrtzielanzeige und möglichen zufälligen Fehldarstellungen muss der Inhalt vom Script aufgrund der Informationen in der Hof-Datei dynamisch generiert werden. Grundsätzlich kann man bei FlipDot-Zielanzeigen zwei Typen unterscheiden:&lt;br /&gt;
** Aktualisierung von oben nach unten: Hier lassen sich verschiedene Methoden andenken. Da die Anzahl der Zeilen überschaubar ist, kann man hier mehr mehr Varianten andenken als bei der Aktualisierung von links nach rechts.&lt;br /&gt;
# Abwandlung des &amp;quot;BUSE-Matrix-Script&amp;quot;, sodass nicht Punkt- sondern Zeilenweise aktualisiert wird.&lt;br /&gt;
# Abwandlung der &amp;quot;Busfanat-Vollmatrix&amp;quot;, sodass nicht Spalten- sondern Zeilenweise aktualisiert wird.&lt;br /&gt;
# Das Matrix-Script aus dem O405N aus dem kommerziellen Hamburg-Addon, deren Funktionsweise nicht öffentlich bekannt ist.&lt;br /&gt;
** Aktualisierung von links nach rechts: Für OMSI 1 ist hier bislang nur die &amp;quot;Busfanat-Vollmatrix&amp;quot; bekannt. Ab OMSI 2 gibt es als Alternative die Krüger-Matrix, die von M&amp;amp;R im EN92 bzw. GN92 mitgeliefert wurde.&lt;br /&gt;
Die Bedienung erfolgt über das IBIS oder ein separates Matrix-Steuergerät. Nach der Eingabe der neuen Informationen schildert die Anzeige diese selbsttätig.&lt;br /&gt;
&lt;br /&gt;
==LED/LCD-Display==&lt;br /&gt;
* Fahrtzieldarstellung:&lt;br /&gt;
Bei LED-Matrizen werden die namengebenden Leuchtdioden über eine Matrixschaltung gesteuert. Dabei werden die LEDs für ein scheinbares Dauerleuchten (meist zeilenweise) gemultiplext. Das hat neben einem wesentlich geringeren&lt;br /&gt;
Verkabelungsaufwand auch den Vorteil eines geringeren Stromverbrauchs, weil nicht alle &amp;quot;angeschalteten&amp;quot; Dioden gleichzeitig mit Strom versorgt werden müssen. Zudem erfolgt der Zielwechsel scheinbar augenblicklich.&lt;br /&gt;
LCD-Displays arbeiten nach einem anderen Funktionsprinzip, einer der größten offensichtlichen Unterschiede ist, dass nicht die Bildpunkte selbst leuchten, sondern von hinten beleuchtet werden müssen und zur Darstellung&lt;br /&gt;
des Matrixbilds die Bildpunkte einen Teil der Hintergrundbeleuchtung absorbieren, beziehungsweise nicht durchscheinen lassen.&lt;br /&gt;
Die Bedienung erfolgt über das IBIS oder ein separates Matrix-Steuergerät. Nach der Eingabe der neuen Informationen schildert die Anzeige diese selbsttätig.&lt;br /&gt;
* Bedienung/Umsetzungsvorschlag: Da alle Punkte zeitgleich aktualisiert werden, bieten sich mehrere Möglichkeiten an:&lt;br /&gt;
** Die &amp;quot;Busfanat-Vollmatrix&amp;quot; im LED-Modus (in der Const-Datei einstellbar)&lt;br /&gt;
** (ab OMSI2) Abwandlung des Krüger-Matrix-Scripts von M&amp;amp;R, sodass nicht spaltenweise sondern alles auf einmal aktualisiert wird.&lt;br /&gt;
** Abwandlung des &amp;quot;BUSE-Matrix-Script&amp;quot;, sodass nicht Punktweise sondern alles auf einmal aktualisiert wird..&lt;br /&gt;
** Man nutzt die &amp;quot;Rollband-tga&amp;quot; als Wechseltextur, wie es von Thiago im Volvo 9900 umgesetzt wurde.&lt;br /&gt;
Bei den beiden letzten Varianten wird eine bessere Performance durch eine aufwändigere Erstellung der Hof-Informationen erkauft. Ob sich das auszahlt, muss jeder selbst entscheiden.&lt;br /&gt;
&lt;br /&gt;
Die Bedienung erfolgt über das IBIS oder ein separates Matrix-Steuergerät. Nach der Eingabe der neuen Informationen schildert die Anzeige diese selbsttätig.&lt;br /&gt;
&lt;br /&gt;
=Beschreibung bekannter Scripts=&lt;br /&gt;
Es folgt eine Ablaufbeschreibung der bekannten Scripts.&lt;br /&gt;
==ANNAX==&lt;br /&gt;
=== Zusammenfassung ===&lt;br /&gt;
Die ANNAX fragt vom IBIS/Matrix-Steuergerät/whatever drei Variablen ab: Liniennummer, Kursnummer (Liniensuffix) und Ziel-Index. In der M&amp;amp;R-Standard-Konfiguration heißen die Variablen: IBIS_LinieKurs, IBIS_Linie_suffix und &lt;br /&gt;
&lt;br /&gt;
IBIS_TerminusIndex.&lt;br /&gt;
Die Liniennummer wird im Script in einen String umgewandelt, evtl. durch die Kursnummer noch manipuliert und kann dann angezeigt werden.&lt;br /&gt;
Beim Ziel ist es ähnlich, mit dem abgerufenen Zielindex werden aus der Hof-Datei die relevanten Strings geladen. Diese werden kurz für die Texttextur vorverarbeitet und können ebenfalls angezeigt werden.&lt;br /&gt;
Da bei der ANNAX jedes Zeichen in seinem eigenen Raster angezeigt wird und jedes Rasterkästchen (für sich betrachtet) ohne Übergangsanimation auf einmal aktualisiert wird, ist die Übergangsanimation relativ simpel.&lt;br /&gt;
Abhängig vom Fortschritt wird der aktuell angezeigte String vom neuen String stückweise überschrieben.&lt;br /&gt;
=== Funktionsablauf ===&lt;br /&gt;
* Auslösen des Wechselzyklus'&lt;br /&gt;
Der Anzeigenwechsel wird bei der Zielmatrix von einer Änderung des Zielindex', bei der Linienmatrix entsprechend durch eine Änderung der Liniennummer oder des Kurses ausgelöst.&lt;br /&gt;
* Auswertung Liniennummer und Kursnummer&lt;br /&gt;
Die Liniennummer ist in der Variable IBIS_LinieKurs gespeichert. Der Name ist verwirrend, denn die Variable enthält nur die Liniennummer. Die Kursnummer ist in der Variable IBIS_Linie_suffix gespeichert.&lt;br /&gt;
Zunächst wird die Liniennummer mittels $IntToStr in einen String umgewandelt. Ist die Kursnummer eine Linienbeeinflussende, wird der erhaltene Linienstring noch entsprechend modifiziert&lt;br /&gt;
* Beschaffung der Information aus der Hofdatei&lt;br /&gt;
Bei dieser Matrix werden bis zu drei Strings aus der Hofdatei ausgelesen: Frontanzeige oben, Frontanzeige unten und Seitenanzeige. Da mit dem Systemmacro (M.V.GetTerminusString) nur ein String zum Index in der Hofdatei und nicht zur &lt;br /&gt;
&lt;br /&gt;
Zielnummer, die im IBIS eingegeben wird, gesucht werden kann, muss dieser Index zur vom IBIS übergebenen Variable IBIS_TerminusIndex mit dem Systemmacro (M.V.GetTerminusIndex) entsprechend gesucht werden. Nachdem mit dem nun bekannten &lt;br /&gt;
&lt;br /&gt;
Index die benötigten Strings aus der Hofdatei geladen wurden, werden die herausgelesenen Strings nur noch ins entsprechende Format gebracht und können auf die Matrix geschrieben werden.&lt;br /&gt;
* Wechselanimation&lt;br /&gt;
Aufgrund des fixen Buchstabenrasters kann man hier mit einer Wechsel-Fortschrittsvariable einfach die ersten x Zeichen der neu ermittelten Zielanzeige nutzen, gleich viele Zeichen von der bereits geschilderten Anzeige &amp;quot;wegschneiden&amp;quot;, die &lt;br /&gt;
&lt;br /&gt;
beiden Zwischenstrings zusammenfügen und dann in den Texturstring, der dann mit der Texttextur angezeigt wird, speichern.&lt;br /&gt;
=== Vor- und Nachteile ===&lt;br /&gt;
 + performancefreundlich durch geringen Berechnungsaufwand&lt;br /&gt;
 + unterstützt M&amp;amp;R-Standard-Hofdatei&lt;br /&gt;
 + Linien- und Zielanzeige voneinander unabhängig&lt;br /&gt;
 - fixe Zeichenanzahl pro Zeile (sonst wäre Zentrierung falsch)&lt;br /&gt;
==BUSE-Matrix-Script==&lt;br /&gt;
=== Zusammenfassung ===&lt;br /&gt;
Beim BUSE-Matrix-Script handelt es sich um die erste bekannte Möglichkeit, eine Vollmatrix in OMSI darzustellen. Technisch ist es ein modifiziertes ANNAX-Script, wie es aus den SD- und D-Bussen von OMSI1 bekannt ist.&lt;br /&gt;
Als Unterschied zu diesem werden in der Hof-Datei nicht die Zeileninhalte gespeichert, sondern die &amp;quot;vorgerenderten&amp;quot; Punkte der Matrix. Beim Wechsel des Ziels wird dieses Punkt für Punkt aktualisiert und das neue Zeil erscheint&lt;br /&gt;
von oben nach unten. Die Linienmatrix unterscheidet sich kaum vom M&amp;amp;R-ANNAX-Script.&lt;br /&gt;
Der erste Veröffentlicher dieses Scripts ist der User &amp;quot;Kosak&amp;quot;, der diese Variante mit seinem Bus &amp;quot;Renault Karosa Citybus&amp;quot; veröffentlicht hat.&lt;br /&gt;
=== Funktionsablauf ===&lt;br /&gt;
* Auslösen des Wechselzyklus'&lt;br /&gt;
Der Anzeigenwechsel wird bei der Zielmatrix von einer Änderung des Zielindex', bei der Linienmatrix entsprechend durch eine Änderung der Liniennummer oder des Kurses ausgelöst.&lt;br /&gt;
* Auswertung Liniennummer und Kursnummer&lt;br /&gt;
Die Liniennummer ist in der Variable IBIS_LinieKurs gespeichert. Der Name ist verwirrend, denn die Variable enthält nur die Liniennummer. Die Kursnummer ist in der Variable IBIS_Linie_suffix gespeichert.&lt;br /&gt;
Zunächst wird die Liniennummer mittels $IntToStr in einen String umgewandelt. Ist die Kursnummer eine Linienbeeinflussende, wird der erhaltene Linienstring noch entsprechend modifiziert&lt;br /&gt;
* Beschaffung der Information aus der Hofdatei&lt;br /&gt;
Bei dieser Matrix wird nur ein String, die vorgerenderte Frontanzeige, aus der Hof-Datei ausgelesen. Da mit dem Systemmacro (M.V.GetTerminusString) nur ein String zum Index in der Hofdatei und nicht zur Zielnummer, die im IBIS eingegeben &lt;br /&gt;
&lt;br /&gt;
wird, gesucht werden kann, muss dieser Index zur vom IBIS übergebenen Variable IBIS_TerminusIndex mit dem Systemmacro (M.V.GetTerminusIndex) entsprechend gesucht werden. Nachdem mit dem nun bekannten Index der benötigte String aus der &lt;br /&gt;
&lt;br /&gt;
Hofdatei geladen wurde, kann der ausgelesene String auf die Matrix geschrieben werden.&lt;br /&gt;
* Wechselanimation&lt;br /&gt;
Da der anzuzeigende String ein vorgerendertes Punktemuster ist, kann man hier mit einer Wechsel-Fortschrittsvariable einfach die ersten x Zeichen der neu ermittelten Zielanzeige nutzen, gleich viele Zeichen von der bereits geschilderten &lt;br /&gt;
&lt;br /&gt;
Anzeige &amp;quot;wegschneiden&amp;quot;, die beiden Zwischenstrings zusammenfügen und dann in den Texturstring, der dann mit der Texttextur angezeigt wird, speichern.&lt;br /&gt;
=== Vor- und Nachteile ===&lt;br /&gt;
 + erstes Script dieser Art&lt;br /&gt;
 + performancefreundlich durch geringen Berechnungsaufwand&lt;br /&gt;
 - spezielle Hof-Datei erforderlich&lt;br /&gt;
 - Liniennummer wird mit den Zieltext-Punkten in der Hofdatei gespeichert -&amp;gt; AI-Fahrzeuge schildern möglicherweise falsche Liniennummer, wenn sie das Ziel schildern&lt;br /&gt;
 - Jede Anzeige mit diesem Script hat die gleiche Auflösung (ließe sich zwar ändern, aber dann wäre das Hof-Dateien-Chaos perfekt)&lt;br /&gt;
==Busfanat-Vollmatrix==&lt;br /&gt;
=== Zusammenfassung ===&lt;br /&gt;
Bei der &amp;quot;Busfanat-Vollmatrix&amp;quot; handelt es sich um die erste bekannte Möglichkeit, eine Vollmatrix in OMSI darzustellen, die mit den M&amp;amp;R-Standard-Hofdateien arbeiten kann.&lt;br /&gt;
Die erste Version dieser Matrix wurde mit dem Bus &amp;quot;Mercedes-Benz O405N2&amp;quot; von TramDüsseldorf veröffentlicht, in der am 02.06.2013 veröffentlichten Version unterstützt das Script drei Anzeigetypen:&lt;br /&gt;
Liniennummer, Zielschild ohne Liniennummer und Zielschild mit Liniennummer.&lt;br /&gt;
=== Funktionsablauf ===&lt;br /&gt;
* Auslösen des Wechselzyklus'&lt;br /&gt;
Der Anzeigenwechsel wird durch eine Änderung des Zielindex, der zu schildernden Linie oder der Kursnummer ausgelöst. Vor dem Wechsel wartet das Script dann noch, bis der Wechselziel-Timer abgelaufen und die letzte Anzeige vollständig &lt;br /&gt;
&lt;br /&gt;
geschildert ist.&lt;br /&gt;
* Auswertung Liniennummer und Kursnummer&lt;br /&gt;
Die Liniennummer ist in der Variable IBIS_LinieKurs gespeichert. Der Name ist verwirrend, denn die Variable enthält nur die Liniennummer. Die Kursnummer ist in der Variable IBIS_Linie_suffix gespeichert.&lt;br /&gt;
Abhängig von der Kursnummer wird die Liniennummer direkt mittels $IntToStr in einen String umgewandelt oder zusätzlich noch mit Buchstaben/Sonderzeichen ergänzt oder auch durch diese ersetzt.&lt;br /&gt;
* Beschaffung der Informationen aus der Hofdatei&lt;br /&gt;
Bei dieser Matrix werden zwei Strings aus der Hofdatei ausgelesen: Frontanzeige oben und Frontanzeige unten. Da mit dem Systemmacro (M.V.GetTerminusString) nur ein String zum Index in der Hofdatei und nicht zur Zielnummer, die im IBIS &lt;br /&gt;
&lt;br /&gt;
eingegeben wird, gesucht werden kann, muss dieser Index zur vom IBIS übergebenen Variable IBIS_TerminusIndex mit dem Systemmacro (M.V.GetTerminusIndex) entsprechend gesucht werden. Nachdem mit dem nun bekannten Index die benötigten &lt;br /&gt;
&lt;br /&gt;
Strings aus der Hofdatei geladen wurden, werden die herausgelesenen Strings zunächst auf Steuerzeichen abgeprüft. Nachdem die Steuerzeichen abgearbeitet wurden, wird aus den verbleibenden Strings mittels des Fontfile-Scripts in ein &lt;br /&gt;
&lt;br /&gt;
Punktemuster &amp;quot;gerendert&amp;quot;, das dann auf den Matrixflächen angezeigt werden kann. Dieses Punktemuster wird, um die FlipDot-Animation zu ermöglichen, in 19 Strings, die jeweils eine Punkte-Zeile der Matrix enthalten, gespeichert.&lt;br /&gt;
* Wechselanimation&lt;br /&gt;
Sowohl von der derzeit geschilderten, als auch von der zu schildernden Anzeige sind die gerenderten Punktemuster in jeweils 19 Zeilen-Strings vorhanden. Anhand einer Wechsel-Fortschritt-Variable werden die entsprechenden ersten x Zeichen &lt;br /&gt;
&lt;br /&gt;
jeden zu schildernden Zeilenstrings mit den bereits geschilderten Zeilenstrings, die um die gleiche Anzahl an Zeichen am Anfang des Strings gekürzt wurden, zusammengefügt. Anschließend werden die fertigen Zeilenstrings, die bereits die &lt;br /&gt;
&lt;br /&gt;
Wechsel-Animation enthalten, durch &amp;quot;@&amp;quot;-Zeichen verbunden, die auf der Texttextur zu Zeilenumbrüchen werden, und in die Strings, die zur Erstellung der Texttexturen dienen, gespeichert.&lt;br /&gt;
=== Vor- und Nachteile ===&lt;br /&gt;
 + unterstützt M&amp;amp;R-Standard-Hofdatei (in OMSI1 lässt sich eine für die Busfanat-Vollmatrix formatierte Hofdatei auch vollständig ANNAX-kompatibel gestalten)&lt;br /&gt;
 + einzige bekannte Möglichkeit in OMSI1, eine FlipDot-Matrix, die von links nach rechts aktualisiert, darzustellen&lt;br /&gt;
 + durch Befehlszeichen in Hofdatei äußerst flexibel einsetzbar&lt;br /&gt;
 + durch zahlreiche Optionen in Const-File an verschiedenste Anforderungen anpassbar, unter anderem variable Breiten der Anzeigen&lt;br /&gt;
 + Sonderanzeigen möglich&lt;br /&gt;
 - durch erheblichen Berechnungsaufwand performanceunfreundlich&lt;br /&gt;
 - nicht für OMSI2 optimiert&lt;br /&gt;
 - Schriftart muss textbasiert geändert werden&lt;br /&gt;
 - Zeichenanzahl Zieltext auf 25 Zeichen pro Zeile begrenzt (bedingt durch das Fehlen des $CutSpaces-Befehls in OMSI1)&lt;br /&gt;
 - benötigt je nach Ausführung bis zu 5 Texttexturen&lt;br /&gt;
==Krüger-Vollmatrix==&lt;br /&gt;
=== Zusammenfassung ===&lt;br /&gt;
Das ab OMSI2 verfügbare Krüger-Matrix-Script von M&amp;amp;R.&lt;br /&gt;
=== Funktionsablauf ===&lt;br /&gt;
* Auslösen des Wechselzyklus'&lt;br /&gt;
Der Anzeigenwechsel wird von einer Änderung des Zielindex', der Liniennummer oder des Kurses ausgelöst.&lt;br /&gt;
* Auswertung Liniennummer und Kursnummer&lt;br /&gt;
Die Liniennummer ist in der Variable IBIS_LinieKurs gespeichert. Der Name ist verwirrend, denn die Variable enthält nur die Liniennummer. Die Kursnummer ist in der Variable IBIS_Linie_suffix gespeichert.&lt;br /&gt;
Zunächst wird die Liniennummer mittels $IntToStr in einen String umgewandelt. Ist die Kursnummer eine Linienbeeinflussende, wird der erhaltene Linienstring noch entsprechend modifiziert&lt;br /&gt;
* Beschaffung der Information aus der Hofdatei&lt;br /&gt;
Bei dieser Matrix werden zwei Strings aus der Hofdatei ausgelesen: Frontanzeige oben und Frontanzeige unten. Da mit dem Systemmacro (M.V.GetTerminusString) nur ein String zum Index in der Hofdatei und nicht zur Zielnummer, die im IBIS &lt;br /&gt;
&lt;br /&gt;
eingegeben wird, gesucht werden kann, muss dieser Index zur vom IBIS übergebenen Variable IBIS_TerminusIndex mit dem Systemmacro (M.V.GetTerminusIndex) entsprechend gesucht werden. Nachdem mit dem nun bekannten Index die benötigten &lt;br /&gt;
&lt;br /&gt;
Strings aus der Hofdatei geladen wurden, kann die Matrix-Textur bearbeitet werden. Zunächst wird aufgrund der Breite der anzuzeigenden Strings (Also die Breite des Textes auf der Textur, nicht die Anzahl der Zeichen) die passendste &lt;br /&gt;
&lt;br /&gt;
Schriftart ausgewählt. Danach werden die Texte auf eine temporäre Textur geschrieben.&lt;br /&gt;
* Wechselanimation&lt;br /&gt;
Die temporäre Zwischentextur wird pixelweise ausgelesen und von links nach rechts auf die anzuzeigende Scripttextur aufgemalt.&lt;br /&gt;
=== Vor- und Nachteile ===&lt;br /&gt;
 + zusammen mit OMSI2 entwickelt&lt;br /&gt;
 + durch neue OMSI2-Script-Funktionen relativ performancefreundlich&lt;br /&gt;
 + unterstützt M&amp;amp;R-Standard-Hofdatei&lt;br /&gt;
 + Sonderanzeigen möglich&lt;br /&gt;
 - nicht mit OMSI1 kompatibel&lt;br /&gt;
 - Jede Anzeige mit diesem Script hat die gleiche Auflösung (ließe sich zwar ändern, aber dann wären die Sonderanzeigen-Texturen nicht einheitlich)&lt;br /&gt;
==Mobitec-Matrix-Script==&lt;br /&gt;
=== Zusammenfassung ===&lt;br /&gt;
Diese Variante wurde als erstes im &amp;quot;Volvo 9900&amp;quot; von Toastmeister als &amp;quot;Mobitec-Matrix-Script&amp;quot; veröffentlicht und von Thiago entwickelt.&lt;br /&gt;
=== Funktionsweise ===&lt;br /&gt;
Im Prinzip ist dieses Script ein Rollbandscript ohne Rollanimation. Am Steuergerät wird direkt der Ziel-Index in der Hofdatei, nicht wie beim IBIS eine Zielnummer, ausgewählt und das entsprechende Bild über einen Texturtausch auf die &lt;br /&gt;
&lt;br /&gt;
Anzeige gebracht.&lt;br /&gt;
=== Vor- und Nachteile ===&lt;br /&gt;
 + performancefreundlich, da nur fertige Bilder auf eine Fläche geladen werden&lt;br /&gt;
 - kleine Änderung der Hof-Dateien erforderlich, wenn das Steuergerät aus dem Volvo 9900 verwendet wird.&lt;br /&gt;
==Rollbänder==&lt;br /&gt;
Bei OMSI muss man bei den Rollbändern zunächst zwischen Rollbändern mit einer fixen und Rollbändern mit einer script-gesteuerten Abfolge der eingerollten Bilder unterscheiden.&lt;br /&gt;
Ein Beispiel für eine fixe Abfolge sind die Linienrollbänder der M&amp;amp;R-Standardbusse. Scriptseitig wird hier nur der Index des anzuzeigenden Bildteils angegeben.&lt;br /&gt;
Ein Beispiel für eine script-gesteuerten Abfolge sind die Zielrollbänder der M&amp;amp;R-Standardbusse. Der Dateipfad der anzuzeigenden Bilder wird aus der Hof-Datei ermittelt.&lt;br /&gt;
Um den Roll-Effekt zu erziehlen, müssen zwei aufeinanderfolgende Zielbilder gleichzeitig auf zwei verschiedene Faces geladen werden, die sich aber in der 3D-Datei an der exakt gleichen Stelle befinden.&lt;br /&gt;
Im Anschluss entsteht der Roll-Effekt durch eine Verschiebung der Textur über eine Animationsvariable.&lt;br /&gt;
===Darstellung der Liniennummer===&lt;br /&gt;
==== Zusammenfassung ====&lt;br /&gt;
Scriptseitig läuft hier nur eine Variable auf und ab, die den Index der anzuzeigenden Textur angibt.&lt;br /&gt;
==== Vor- und Nachteile ====&lt;br /&gt;
 + nur eine 3D-Fläche pro Band benötigt&lt;br /&gt;
 - Reihenfolge der angezeigten Bilder in cfg vordefiniert&lt;br /&gt;
===Darstellung des Fahrtziels===&lt;br /&gt;
==== Zusammenfassung ====&lt;br /&gt;
Für die beiden Texturverschiebungen läuft hier jeweils eine Variable. Zusätzlich zur Texturverschiebung erfolgt noch ein Texturtausch, damit nicht immer das selbe Ziel durch die Fläche scrollt.&lt;br /&gt;
==== Vor- und Nachteile ====&lt;br /&gt;
 + Reihenfolge der angezeigten Bilder durch Script steuerbar&lt;br /&gt;
 - zwei 3D-Flächen pro Band benötigt&lt;/div&gt;</summary>
		<author><name>Busfanat</name></author>
		
	</entry>
	<entry>
		<id>http://wiki.omnibussimulator.de/omsiwikineu.de/index.php?title=Scriptsystem&amp;diff=829</id>
		<title>Scriptsystem</title>
		<link rel="alternate" type="text/html" href="http://wiki.omnibussimulator.de/omsiwikineu.de/index.php?title=Scriptsystem&amp;diff=829"/>
		<updated>2013-07-05T20:21:47Z</updated>

		<summary type="html">&lt;p&gt;Busfanat: /* String-Operationen */ Hinweis, dass $SetLength(L/R) einen kleinen Bug beim Float-Stack haben, hinzugefügt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;''Hinweis: Dieser Artikel wurde noch nicht ins Englische übersetzt!''&lt;br /&gt;
&lt;br /&gt;
Das Scriptsystem in OMSI ermöglicht es, dass Szenerieobjekte und vor allem Fahrzeuge mit individuellen Systemen ausgestattet werden können, die über Variablen und Funktionsaufrufe mit dem Hauptprogramm und der Grafik- und Soundengine kommunizieren.&lt;br /&gt;
&lt;br /&gt;
Der hier beschriebene Stand des Scriptsystems entspricht OMSI Version 1.01.&lt;br /&gt;
&lt;br /&gt;
== Dateien des Scriptsystems ==&lt;br /&gt;
&lt;br /&gt;
Das Scriptsystem umfasst folgende Dateien:&lt;br /&gt;
&lt;br /&gt;
* Scriptdateien mit ausführbarem Code (*.osc)&lt;br /&gt;
* Varlist- und Stringvarlist-Dateien im OMSI\program-Verzeichnis zur Definition von Systemvariablen&lt;br /&gt;
* Varlist- und Stringvarlist-Dateien zur Definition von Uservariablen&lt;br /&gt;
* Constfile-Dateien zur Definition von Userkonstanten und Funktionstabellen&lt;br /&gt;
&lt;br /&gt;
Abgesehen von den Dateien zur Definition von Systemvariablen müssen alle benötigten Dateien für jedes Fahrzeug/Szenerieobjekt (im folgenden kurz: Objekt) in dessen [[Konfigurationsdatei]] angemeldet werden.&lt;br /&gt;
&lt;br /&gt;
Hierfür gibt es die Befehle ''[script]'', ''[varnamelist]'', ''[stringvarnamelist]'' und ''[constfile]''. Der erste Eintrag jedes Befehls ist die Anzahl der Dateien, darauf folgen die entsprechenden Dateinamen (inkl. Pfad relativ zur Konfigurationsdatei. Die Namen der Dateien sind nicht relevant, solange sie korrekt in die Listen eingetragen werden.&lt;br /&gt;
&lt;br /&gt;
Auf die Funktion der jeweiligen Dateien wird im Laufe der Beschreibung der Scriptsprache eingegangen.&lt;br /&gt;
&lt;br /&gt;
== Grundlagen der Scriptsprache ==&lt;br /&gt;
&lt;br /&gt;
Das OMSI-Scriptsystem arbeitet mit der [http://de.wikipedia.org/wiki/Umgekehrte_Polnische_Notation umgekehrten Polnischen Notation]. Hierbei steht der Operator hinter den beiden Operanden; vereinfacht gesagt bedeutet es, dass die Operation &amp;quot; 1 + 2 &amp;quot; stattdessen folgendermaßen notiert wird: &amp;quot; 1 2 + &amp;quot;. Ein komplizierteres Beispiel: &amp;quot; (1 + 2) * (4 + 5) &amp;quot; entspricht &amp;quot; 1 2 + 4 5 + * &amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Ganz wichtig ist die Tatsache, dass die OMSI-Textdateien und insbesondere die Scriptsprache [http://de.wikipedia.org/wiki/Case_sensitivity Case-Sensitive] ist! D.h. es ist immer auf die Groß- und Kleinschreibung zu achten!&lt;br /&gt;
&lt;br /&gt;
=== Stack und Register ===&lt;br /&gt;
&lt;br /&gt;
Bei der Verarbeitung der Scripts verfügt OMSI über einen String-Stack und einen [http://de.wikipedia.org/wiki/Stapelspeicher Stack] für [http://de.wikipedia.org/wiki/Gleitkommazahl Gleitkommazahlen]. Im folgenden ist mit &amp;quot;Stack&amp;quot; immer der Stack für Gleitkommazahlen gemeint, andernfalls wird von &amp;quot;String-Stack&amp;quot; gesprochen.&lt;br /&gt;
&lt;br /&gt;
Beide Stacks enthält 8 Speicherplätze, welche von 0 bis 7 durchnumeriert sind. Jede Script-Operation kann nun einen oder mehrere neue Werte in einen der Stacks einfügen (push), wobei der neue Wert auf die Position 0 gesetzt wird und alle folgenden Werte &amp;quot;einen Platz aufrücken&amp;quot;, oder sie kann einen oder mehrere Werte aus dem Stack herausziehen (pop/pull) oder lediglich auslesen (peek).&lt;br /&gt;
&lt;br /&gt;
Fürs temporäre Ablegen von Zahlen gibt es zusätzlich acht indizierte Speicherplätze, welche direkt geschrieben oder gelesen werden können, die sich im sogenannten Register befinden - hier gibt es jedoch nur einen Register für die Gleitkommazahlen.&lt;br /&gt;
&lt;br /&gt;
=== Beispiel-Operationen ===&lt;br /&gt;
&lt;br /&gt;
Beispiel: Die Operation 1 + 4. Der Code hierfür lautet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 4 +&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In der folgenden Tabelle wird demonstriert, wie sich hierbei der Stack verhält:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Operation:	Stack:	0	1	2	3	4 ...&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
vorher:			0	0	0	0	0&lt;br /&gt;
&amp;quot;1&amp;quot;			1	0	0	0	0&lt;br /&gt;
&amp;quot;4&amp;quot;			4	1	0	0	0&lt;br /&gt;
&amp;quot;+&amp;quot;			5	0	0	0	0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Ausgangszustand ist der Stack nur mit Nullen (oder unbekannten/zufälligen Werten) gefüllt. Der Befehl &amp;quot;1&amp;quot; schiebt die Eins in den obersten Stackplatz und schiebt alle weiteren Werte (Nullen) nach hinten. Der Befehl &amp;quot;4&amp;quot; schiebt die Vier auf den 0. Platz und alle folgenden Werte, also insbesondere die Eins auf den jeweils nächsten Platz. Im nächsten Schritt &amp;quot;+&amp;quot; werden die obersten beiden Werte aus dem Stack herausgezogen - also 4 und 1 - und summiert. Das Ergebnis (5) wird wiederum in den Stack geschoben. Die beiden ursprünglichen Zahlen sind im Stack nicht mehr vorhanden.&lt;br /&gt;
&lt;br /&gt;
Ein zweites Beispiel:&lt;br /&gt;
&lt;br /&gt;
(1 + 2) * (4 + 5) muss wie bereits erwähnt folgendermaßen notiert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 2 + 4 5 + *&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Stack verhält sich somit folgendermaßen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Operation:	Stack:	0	1	2	3	4 ...&lt;br /&gt;
-----------------------------------------------------------------------------&lt;br /&gt;
vorher:			0	0	0	0	0&lt;br /&gt;
&amp;quot;1&amp;quot;			1	0	0	0	0&lt;br /&gt;
&amp;quot;2&amp;quot;			2	1	0	0	0&lt;br /&gt;
&amp;quot;+&amp;quot;			3	0	0	0	0&lt;br /&gt;
&amp;quot;4&amp;quot;			4	3	0	0	0&lt;br /&gt;
&amp;quot;5&amp;quot;			5	4	3	0	0&lt;br /&gt;
&amp;quot;+&amp;quot;			9	3	0	0	0&lt;br /&gt;
&amp;quot;*&amp;quot;			27	0	0	0	0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Am Ende befindet sich also das korrekte Ergebnis auf Stackplatz 0!&lt;br /&gt;
&lt;br /&gt;
=== Gleitkommazahlen und Strings ===&lt;br /&gt;
&lt;br /&gt;
Das OMSI-Skriptsystem arbeitet ausschließlich mit den Datentypen Gleitkommazahl (einfache Präzision mit Vorzeichen) und String. Beide Datentypen haben getrennte Stacks. Deshalb laufen die Verarbeitung von Gleitkommazahlen und Strings im Allgemeinen unabhängig nebeneinander. Jedoch kann es natürlich vorkommen, dass bestimmte Funktionen z.B. Zahlen in Strings umwandeln und somit gleichzeitig auf beide Teilbereiche zugreifen.&lt;br /&gt;
&lt;br /&gt;
Auf boolische Variablen wurde verzichtet. Für boolische Werte werden im Allgemeinen die Zahlenwerte 0 und 1 verwendet.&lt;br /&gt;
&lt;br /&gt;
== Script-Schlüsselwörter ==&lt;br /&gt;
&lt;br /&gt;
=== Kommentare ===&lt;br /&gt;
&lt;br /&gt;
Kommentierungen sind nur möglich, indem in der auszukommentierenden Zeile ganz vorne ein Apostroph ['] gesetzt wird:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'Ich bin eine Kommentarzeile&lt;br /&gt;
   'Ich bin KEINE Kommentarzeile!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Einstiegs- und Ausstiegspunkte, Makros und Trigger ===&lt;br /&gt;
&lt;br /&gt;
Alle Befehle müssen zwischen einem Einstiegs- und einem Ausstiegspunkt liegen.&lt;br /&gt;
&lt;br /&gt;
Der Einstiegspunkt wird durch eins der folgenden Schlüsselwörter gekennzeichnet:&lt;br /&gt;
&lt;br /&gt;
* {frame} Im Laufe jedes Frames ruft OMSI über diesen Einstiegspunkt die frameweise Scriptverarbeitung auf, sofern er vorhanden ist.&lt;br /&gt;
* {init} Bei der Initialisierung ruft OMSI über diesen Einstiegspunkt die Script-Initialisierung auf.&lt;br /&gt;
* {frame_ai} Hierbei handelt es sich um eine Variante des {frame}-Einstiegspunktes, welcher bei Fahrzeugen dann aufgerufen wird, wenn diese nicht im Fokus des Benutzers stehen, z.B. wenn sie als KI-Fahrzeug unterwegs sind. Ist dieser Einstiegspunkt jedoch nicht vorhanden sondern nur {frame}, dann wird dieser alternativ aufgerufen. Bei Szenerieobjekten kommt dieser Eintrittspunkt nicht zur Anwendung.&lt;br /&gt;
* {macro:''name''} Dieser Einstiegspunkt ruft ein Subsektion (Makro) auf, welche '''stets nach dem Aufruf''' definiert werden muss.&lt;br /&gt;
* {trigger:''name''} Dieser Einstiegspunkt wird vom Hauptprogramm aufgerufen, wenn der Benutzer die Tastenkombination oder das Maus-Event mit der Bezeichnung ''name'' aufruft - es gibt auch bestimmte Trigger, die direkt vom Hauptprogramm aufgerufen werden, z.B. wenn OMSI bei KI-Bussen die Anzeige wechselt u.Ä.&lt;br /&gt;
&lt;br /&gt;
{end} ist der universelle Ausstiegspunkt. Er muss stets den Block abschließen, der mit einem der obigen Befehle eröffnet wird.&lt;br /&gt;
&lt;br /&gt;
==== Makroaufruf ====&lt;br /&gt;
&lt;br /&gt;
Der Aufruf eines Makros erfolgt über (M.L.''name''). Der Aufruf des Makros muss ''immer'' vor dessen Definition erfolgen. Andernfalls meldet OMSI, dass das Makro nicht gefunden wurde.&lt;br /&gt;
&lt;br /&gt;
==== Aufteilung des Scripts in mehrere Dateien ====&lt;br /&gt;
&lt;br /&gt;
Bei einfachen Scripts (z.B. bei reinen KI-Fahrzeugen oder Szenerieobjekten) reicht es im Allgemeinen eine *.sco-Datei zu erstellen, welche über einen {frame}...{end}- und ggf. einen {init}...{end}-Block verfügt.&lt;br /&gt;
&lt;br /&gt;
Handelt es sich jedoch um ein komplettes Fahrzeugscript, dann empfiehlt es sich für die verschiedenen Subsysteme getrennte Dateien anzulegen. Hierbei sollte folgendermaßen vorgegangen werden:&lt;br /&gt;
&lt;br /&gt;
* Es gibt ein Hauptscript und die nötigen Subsystemdateien. Die Hauptdatei enthält dabei die {frame}- und {init}-Blöcke, die jedoch nur Makros aufrufen, welche in den Subsystemdateien definiert sind.&lt;br /&gt;
* Für jedes Subsystem gibt es eine *.sco-Datei und je nach Bedarf eine eigene Varlist und Constfile mit den zum System gehörenden Variablen. Außerdem werden auch hier die Trigger für die Tastenbefehle einsortiert.&lt;br /&gt;
* Die Makros sollten sinnvollerweise folgendermaßen benannt werden: {macro:''subsystem''_frame} und {macro:''subsystem''_init}.&lt;br /&gt;
* Damit die Makros vom Hauptscript aufgerufen werden, muss dieses in der Liste der Scripts in der Objekt-Konfigurationsdatei als erstes aufgerufen werden. Die Reihenfolge der Scripts untereinander muss ebenfalls so gewählt werden, dass alle dateiübergreifenden Makroaufrufe stets vor der jeweiligen Makrodefinition stehen.&lt;br /&gt;
&lt;br /&gt;
Die Einschränkung, dass Makros immer hinter dem Aufruf definiert werden müssen, kann zwar bisweilen hinderlich sein, ist aber ein sehr wirksamer Schutz gegen Zirkelschlüsse und Endlosschleifen.&lt;br /&gt;
&lt;br /&gt;
==== Trigger ====&lt;br /&gt;
&lt;br /&gt;
Wie schon geschrieben wurde, kann ein {trigger:''name''}...{end}-Abschnitt durch verschiedene Möglichkeiten aus dem Hauptprogramm heraus aufgerufen werden. Hierzu zählen:&lt;br /&gt;
&lt;br /&gt;
* Auslösung per Tastatur. Wurde die Tastenkombination mit dem Namen ''tastkomb'' bezeichnet, wird {trigger:tastkomb} aufgerufen, wenn die Taste gedrückt wird und {trigger:tastkomb_off}, wenn die Taste losgelassen wird.&lt;br /&gt;
* Auslösung per Maus. Wurde ein Mesh angeklickt mit der [mouseevent]-Bezeichnung ''mouse_ev'', so wird {trigger:mouse_ev} aufgerufen, wenn die Maustaste gedrückt wird, {trigger:mouse_ev_drag}, während die Maustaste gehalten wird und {trigger:mouse_ev_off}, wenn die Maustaste losgelassen wird.&lt;br /&gt;
* Außerdem gibt es noch eine Reihe von [[System-Trigger|System-Triggern]].&lt;br /&gt;
&lt;br /&gt;
=== Operationen ===&lt;br /&gt;
&lt;br /&gt;
==== Stack-Operationen ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size:95%;&amp;quot;  &lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |%stackdump%&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Gibt eine Dialogbox mit dem Gleitkomma-Stackinhalt aus. Sollte deshalb natürlich nur zu Debug-Zwecken eingesetzt werden.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |s0, s1, ..., s7&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Speichern des aktuellen Stackwertes im durch die Ziffer angegebenen Register. Der Wert verbleibt hierbei im Stack&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |l0, l1, ..., l7&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Laden des entsprechenden Registerwertes und Verschiebung in den Stack. Registerwert bleibt erhalten.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |d&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Dubliziert den obersten Stackwert; alle weiteren Stackwerte rücken nach hinten.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |$msg&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Schreibt den obersten String-Stack-Wert in die Debug-Zeile von OMSI - egal, ob es sich um ein User-, KI-Fahrzeug oder Szenerieobjekt handelt.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |$d&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Dubliziert den Stringstack-Wert analog zu &amp;quot;d&amp;quot;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Logische Operationen ====&lt;br /&gt;
&lt;br /&gt;
Die logischen Operationen arbeiten nach dem Prinzip 0 = FALSE, alles andere ist TRUE.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size:95%;&amp;quot;  &lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&amp;amp;&amp;amp;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |UND, d.h. wenn einer der beiden obersten Stackwerte gleich 0 ist, ist das Ergbnis 0, sonst 1.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |ODER&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&amp;lt;nowiki&amp;gt;!&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Verneinung&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Vergleichsoperationen ====&lt;br /&gt;
&lt;br /&gt;
Die Vergleichsoperationen vergleichen die Werte in den beiden jeweils obersten Stackplätzen und fügen dann je nach Ergebnis eine &amp;quot;1&amp;quot; oder &amp;quot;0&amp;quot; im obersten Stackplatz ein. Die Größer-/Kleinerzeichen stehen dabei entsprechend für der Reihenfolge, in der die Werte zuvor angegeben wurden. Das bedeutet:&lt;br /&gt;
&lt;br /&gt;
4 2 &amp;gt; ist wahr, weil die intern durchgeführte Operation in diesem Fall &amp;quot;4 &amp;gt; 2&amp;quot; ist.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size:95%;&amp;quot;  &lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |=&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&amp;quot;1&amp;quot;, falls die obersten Stackwerte identisch sind, sonst &amp;quot;0&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&amp;lt;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&amp;quot;1&amp;quot;, falls Stackwert 1 kleiner ist als Stackwert 0, sonst &amp;quot;0&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&amp;gt;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |... größer ist ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&amp;lt;=&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |... kleiner als oder gleich ist ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&amp;gt;=&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |... größer als oder gleich ist ...&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |$=&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Wie &amp;quot;=&amp;quot; nur für die obersten beiden Stringstack-Plätze.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |$&amp;lt;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Kleiner als (String). Die Ungleich-Operationen bei Strings prüfen auf alphabetische Reihenfolge. &amp;quot;A&amp;quot; ist also kleiner als &amp;quot;B&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |$&amp;gt;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Größer als (String).&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |$&amp;lt;=&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Kleiner oder gleich (String).&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |$&amp;gt;=&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Größer oder gleich (String).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Mathematische Operationen ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size:95%;&amp;quot;  &lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |+&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Plus&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Minus (Stackplatz 1 - Stackplatz 0, also vom Prinzip her wie bei den Größer/Kleiner-Operationen)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |*&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Mal&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |/&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |geteilt (Stackplatz 1 / Stackplatz 0)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |%&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Rest der Division (folgendermaßen erweitert für Gleitkommazahlen: Stack0 - trunc(Stack1 / Stack0) * Stack1 )&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |/-/&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Vorzeichenwechsel&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |sin&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Sinus&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |min&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Wahl des kleineren der beiden obersten Stackwerte&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |max&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Wahl des größeren der beiden obersten Stackwerte&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |exp&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Exponentialfunktion zur Basis e (e^Stack0)&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |sqrt&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Quadratwurzel&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |sqr&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Quadrat&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |sgn&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Rückgabe des Vorzeichens; je nachdem entweder -1, 0 oder 1&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |pi&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Kreiszahl pi&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |random&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |ganzzahlige Zufallszahl 0 &amp;lt;= x &amp;lt; Stack0&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |abs&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Rückgabe des Absolutwertes&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |trunc&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Abrunden auf nächste ganze Zahl&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== String-Operationen ====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size:95%;&amp;quot;  &lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |&amp;quot;''bla''&amp;quot;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Einfügen des Strings ''bla'' auf dem obersten String-Stack-Platz&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |$+&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Zusammenfügen zweier Strings. &amp;quot;Omnibus&amp;quot; &amp;quot;simulator&amp;quot; $+ ergibt &amp;quot;Omnibussimulator&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |$*&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Der oberste Stack-String wird sooft wiederholt, bis die resultierende Zeichenlänger gerade noch kleiner oder gleich des obersten Stackwertes ist. Beispiel: &amp;quot;nu&amp;quot; 6 $* ergibt &amp;quot;nununu&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |$length&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Gibt die Anzahl der Zeichen des obersten Stack-String zurück in den Stack. &lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |$cutBegin&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Schneidet ''stack0'' Zeichen vorne vom obersten Stack-String ab.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |$cutEnd&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Schneidet ''stack0'' Zeichen hinten vom obersten Stack-String ab.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |$SetLengthR&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Passt die Länge des obersten Stack-Strings auf ''stack0'' rechtsbündig an, indem am Anfang Zeichen entfernt oder Leerzeichen ergänzt werden.&lt;br /&gt;
VORSICHT Bug! Der Befehl entfernt den Float-Operator nicht vom Stack. Der Wert, auf dessen Länge der String gekürzt wurde, verbleibt also auf Stack0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |$SetLengthL&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Passt die Länge des obersten Stack-Strings auf ''stack0'' linksbündig an, indem am Ende Zeichen entfernt oder Leerzeichen ergänzt werden.&lt;br /&gt;
VORSICHT Bug! Der Befehl entfernt den Float-Operator nicht vom Stack. Der Wert, auf dessen Länge der String gekürzt wurde, verbleibt also auf Stack0.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |$IntToStr&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Rundet ''stack0'' ab und wandelt die resultierende Ganzzahl um in einen String.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |$IntToStrEnh&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Die erweiterte Version von IntToStr. Hierbei wird der oberste Stack-String verwendet, um das Format der String-Umwandlung zu bestimmen: Das erste Zeichen im String wird zum Auffüllen der fehlenden Zeichen verwendet, die folgenden Zeichen müssen eine Zahl ergeben, die die Stellen angibt. Beispiel: 35 &amp;quot; 5&amp;quot; $IntToStrEnh führt zu &amp;quot;   35&amp;quot; und 123456789 &amp;quot;011&amp;quot; $IntToStrEnh führt zu &amp;quot;00123456789&amp;quot;. Falls ein Fehler vorliegt, wird &amp;quot;ERROR&amp;quot; ausgegeben.&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |$StrToFloat&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Wandelt den obersten Stack-String in eine Gleitkommazahl um, falls möglich. Andernfalls wird eine -1 geschrieben.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Variablenzugriff ===&lt;br /&gt;
&lt;br /&gt;
Es wird unterschieden in Systemvariablen und in lokale Variablen. Die Systemvariablen gelten OMSI-weit, die lokalen Variablen werden zum Fahrzeug/Objekt zugehörig gespeichert.&lt;br /&gt;
&lt;br /&gt;
Bei den lokalen Variablen gibt es stets einen Grundstamm an Variablen, welcher von OMSI vordefiniert werden. Darüber hinaus können beliebig viele Variablen mit Hilfe der Varlist-Dateien ergänzt werden. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;font-size:95%;&amp;quot;  &lt;br /&gt;
|- class=&amp;quot;hintergrundfarbe5&amp;quot;&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |(L.S.''varname'')&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Lädt die Systemvariable ''varname'' in den obersten Stackplatz&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |(L.L.''varname'')&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Lädt die lokale Variable ''varname'' in den obersten Stackplatz&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |(L.$.''varname'')&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Lädt die lokale String-Variable ''varname'' in den obersten String-Stackplatz&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |(S.L.''varname'')&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Speichert den obersten Stackplatz in die lokale Variable ''varname''&lt;br /&gt;
|-&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |(S.$.''varname'')&lt;br /&gt;
| align=&amp;quot;left&amp;quot; |Speichert den obersten String-Stackplatz in die lokale String-Variable ''varname''&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Eine detaillierte Beschreibung der einzelnen Systemvariablen und der vordefinierten lokalen Variablen finden Sie hier: [[System- und vordefinierte lokalen Variablen]]&lt;br /&gt;
&lt;br /&gt;
=== Konstanten und Funktionen ===&lt;br /&gt;
&lt;br /&gt;
Lokale Konstanten und [http://de.wikipedia.org/w/index.php?title=Datei:Linear_interpolation.svg&amp;amp;filetimestamp=20080226155013 stückweise definierte lineare Funktionen] können in den Konstantendateien (''constfiles'', ''~_constfile.txt'') definiert werden. Der Aufbau jeder Konstantendatei entspricht der der [[Konfigurationsdateien|Konfigurationsdatei]]. Es gibt lediglich drei Schlüsselwörter. Zu beachten ist: Bisher können keine Strings, sondern nur Fließkommazahlen als Konstanten definiert werden.&lt;br /&gt;
&lt;br /&gt;
[const] definiert eine neue Konstante und gibt ihren Wert an:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[const]&lt;br /&gt;
name&lt;br /&gt;
wert&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[const]&lt;br /&gt;
leistung&lt;br /&gt;
200&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[newcurve] leitet die Definition einer neuen (stückweise linearen) Funktion ein:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[newcurve]&lt;br /&gt;
name&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[pnt] fügt der zuvor mit [newcurve] definierten Funktion ein neues x-y-Paar hinzu. Jede Funktion sollte normalerweise über mindestens zwei Paare verfügen. Die Reihenfolge der Paare ''muss'' in x-Richtung aufsteigend sein!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[pnt]&lt;br /&gt;
x&lt;br /&gt;
y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[newcurve]&lt;br /&gt;
Drehzahl_Drehmoment_Kennlinie&lt;br /&gt;
&lt;br /&gt;
[pnt]&lt;br /&gt;
50&lt;br /&gt;
0&lt;br /&gt;
&lt;br /&gt;
[pnt]&lt;br /&gt;
300&lt;br /&gt;
400&lt;br /&gt;
&lt;br /&gt;
[pnt]&lt;br /&gt;
1000&lt;br /&gt;
600&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Konstanten werden über den Befehl (C.L.''konstantenname'') in den Stack geladen.&lt;br /&gt;
&lt;br /&gt;
Funktionen werden über den Befehl (F.L.''funktionsname'') aufgerufen. Dabei wird stets der zuvor auf oberster Stackposition befindliche Wert als x-Parameter übergaben und der resultierende y-Wert der Funktion stattdessen auf dem obersten Stackplatz gespeichert. Bewegt sich der x-Wert außerhalb der Grenzen der durch die [pnt]-Einträge definierten Eckpunkte, wird stets der y-Wert des nächstliegenden Eckpunktes verwendet. Die Funktion wird also vor dem ersten und hinter dem letzten Eckpunkt ins Unendliche waagerecht verlängert.&lt;br /&gt;
&lt;br /&gt;
=== Sound-Trigger ===&lt;br /&gt;
&lt;br /&gt;
Soundtrigger sind nicht mit den weiter oben erwähnten Triggern zu verwechseln!&lt;br /&gt;
&lt;br /&gt;
Sie stellen vielmehr eine Möglichkeit dar, direkt einen gewünschten Sound abzuspielen. Hierbei gibt es zwei Möglichkeiten:&lt;br /&gt;
&lt;br /&gt;
(T.L.''soundtriggername'') ist ein einfacher Soundtrigger. Der so markierte Sound wird (einmalig) abgespielt.&lt;br /&gt;
&lt;br /&gt;
(T.F.''soundtriggername'') ist ein Soundtrigger mit Dateiwechselfunktion. Hierbei wird der oberste Stackstring ausgelesen und als Dateiname verwendet, wobei der Dateipfad relativ zum Sound-Ordner des Objektes interpretiert wird.&lt;br /&gt;
&lt;br /&gt;
Beispiel:&lt;br /&gt;
&lt;br /&gt;
Angenommen, die Sounddatei lautet &amp;quot;diese.wav&amp;quot; und ist mit dem Trigger ''MeinTrigger'' verknüpft, dann spielt&lt;br /&gt;
&lt;br /&gt;
 (T.L.MeinTrigger)&lt;br /&gt;
&lt;br /&gt;
die Datei &amp;quot;diese.wav&amp;quot; ab und&lt;br /&gt;
&lt;br /&gt;
 &amp;quot;andere.wav&amp;quot; (T.F.MeinTrigger)&lt;br /&gt;
&lt;br /&gt;
die Datei &amp;quot;andere.wav&amp;quot;. Alternativ zu (T.L.''soundtriggername'') kann beim Befehl (T.F.''soundtriggername'') auch ein &amp;quot;Nullstring&amp;quot; im Stack liegen (also der String: &amp;quot;&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
=== System-Makros ===&lt;br /&gt;
&lt;br /&gt;
Die bisherigen Methoden erlauben dem Script folgende Kommunikationsmöglichkeiten mit OMSI:&lt;br /&gt;
&lt;br /&gt;
* Lesen von Werten über System- und vordefinierte lokale Variablen&lt;br /&gt;
* Schreiben von Werten über ebendiese&lt;br /&gt;
* Empfangen von Tastatur-, Maus- oder Systemtriggern&lt;br /&gt;
&lt;br /&gt;
Schließlich gibt es noch eine weitere Methode, um mit dem Hauptprogramm zu kommunizieren, die sogenannten System-Makros, gelegentlich auch unpräzise als &amp;quot;Callback-Funktionen&amp;quot; bezeichnet.&lt;br /&gt;
&lt;br /&gt;
In bestimmten Situationen ist es nötig, dass das Script Werte von OMSI bekommt, die in größeren Datenbanken vorliegen und daher nicht über vordefinierte Variablen übermittelt werden können, z.B. die Inhalte der Hofdatei. Hier kommen nun die System-Makros ins Spiel.&lt;br /&gt;
&lt;br /&gt;
Diese arbeiten scriptseitig sehr ähnlich wie die lokalen, selbstdefinierten Makros: Der Aufruf (M.V.''macroname'') ruft das System-Makro auf (&amp;quot;V&amp;quot; stand ursprünglich für &amp;quot;Vehicle-Macro&amp;quot;, gilt aber genauso auch in Szenerieobjekten), das sich während der Ausführung Werte aus den beiden Stacks holt und/oder in diese schreibt. Eine Aufstellung aller System-Makros findet sich hier: [[System-Makros]]&lt;br /&gt;
&lt;br /&gt;
=== Bedingungen und Schleifen ===&lt;br /&gt;
&lt;br /&gt;
Die einzige Steuerung des Programmablaufs ist zur Zeit nur mit der IF-Bedingung möglich.&lt;br /&gt;
&lt;br /&gt;
==== IF-Bedingung ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'Hier muss eine Bedingung stehen, z.B.:&lt;br /&gt;
    (L.L.bla) 1 =&lt;br /&gt;
    {if}&lt;br /&gt;
'Dieser Abschnitt wird ausgeführt, wenn bla = 1 ist:&lt;br /&gt;
        2 3 +&lt;br /&gt;
    {else}&lt;br /&gt;
'Dieser Abschnitt wird andernfalls ausgeführt:&lt;br /&gt;
        3 4 +&lt;br /&gt;
    {endif}&lt;br /&gt;
    (S.L.blub)&lt;br /&gt;
{end}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dass erst die Bedingung formuliert wird und dann erst das Schlüsselwort {if} folgt, sollte einleuchten: Zunächst muss an oberster Stelle des Stacks der Wert abgelegt werden und erst dann folgt das Schlüsselwort {if}, welches diesen Wert prüft. Hierbei bedeutet ähnlich wie bei &amp;amp;&amp;amp; und || Gleichheit mit Null gleichbedeutend mit ''False'', alle anderen Werte bedeuten ''True''.&lt;br /&gt;
&lt;br /&gt;
Wenn also im obigen Beispiel ''bla'' den Wert 1 hat, wird ''blub'' auf den Wert 5 gesetzt, andernfalls auf den Wert 7.&lt;br /&gt;
&lt;br /&gt;
Verschachtelungen der IF-Bedingung dienen als Ersatz für die (nicht vorhandenen) &amp;quot;Else-If&amp;quot;-Konstruktionen:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
'Hier muss eine Bedingung stehen, z.B.:&lt;br /&gt;
    (L.L.bla) 1 =&lt;br /&gt;
    {if}&lt;br /&gt;
'Dieser Abschnitt wird ausgeführt, wenn bla = 1 ist:&lt;br /&gt;
        2 3 +&lt;br /&gt;
    {else}&lt;br /&gt;
    (L.L.bla) 5 =&lt;br /&gt;
    {if}&lt;br /&gt;
'Dieser Abschnitt wird ausgeführt, wenn bla = 5 ist:&lt;br /&gt;
        3 4 +&lt;br /&gt;
    {else}&lt;br /&gt;
'Dieser Abschnitt wird andernfalls ausgeführt:&lt;br /&gt;
        13&lt;br /&gt;
    {endif}&lt;br /&gt;
    {endif}&lt;br /&gt;
    (S.L.blub)&lt;br /&gt;
{end}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Hierbei ist insbesondere auf das doppelte {endif} zu achten! Hier gilt:&lt;br /&gt;
&lt;br /&gt;
* bla = 1 ==&amp;gt; blub = 5&lt;br /&gt;
* bla = 5 ==&amp;gt; blub = 7&lt;br /&gt;
* sonst   ==&amp;gt; blub = 13&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Nachschlagewerk für Addon-Entwickler]]&lt;/div&gt;</summary>
		<author><name>Busfanat</name></author>
		
	</entry>
</feed>