Scripting - III. Variablen
Kommen wir zu Variablen. Sie sind eine Art Container für Werte. Stranded II Script kann nur Integer-Werte, also Ganzzahlen in Variablen speichern. Variablen werden durch ein Dollarzeichen ($) als solche gekennzeichnet.
Nehmen wir mal unseren Code von eben, und bauen eine Variable ein:
on:start {
	$meinwert=5;
	msg "Hello World! $meinwert";
}


Wenn wir das Script nun testen, stellen wir fest, dass "Hello World! 5" ausgegeben wird. Was haben wir gemacht?
Ganz einfach: Großen Schwachsinn, denn diese Script ist einfach nur sinnlos. Aber das ist nun belanglos. Über $meinwert=5; haben wir eine neue Variable angelegt und ihr über das Gleichheitszeichen den Wert 5 zugeteilt. Diese Zuweisung wird, wie Befehle, durch ein Semikolon abgeschlossen. Nun haben wir die Variable $meinwert in den Parameter des Befehls "msg" gehängt. Stranded II erkennt anhand des Dollarzeichens, dass es sich hier um eine Variable handelt und ersetzt den Variablennamen automatisch durch den Wert, welcher in der Variable gespeichert ist. Das ist, sehr stark vereinfacht, das Prinzip von Variablen.
Verändern wir unseren Code mal weiter:

on:start {
	$meinwert=5;
	msg "Vorher: $meinwert";
	$meinwert=$meinwert*2;
	msg "Nachher: $meinwert";
}

Wir stellen fest: Auch rechnen ist mit Variablen möglich. Da der Variablenname durch den Wert ersetzt wird, rechnet Stranded II 5*2 und speichert das Ergebnis, welches 10 lautet, anschließend wieder in der Variable.
Neben der normalen Zuweisung über = kann eine Variable auch direkt erhöht oder vermindert werden (wenn sie noch nicht existiert wird sie auf 0 gesetzt und anschließend erhöht oder vermindert):
++ - erhöht den Wert um 1
+= - erhöht den Wert um einen angegebenen Wert
-- - vermindert den Wert um 1
-= - vermindert den Wert um einen angegebenen Wert
Hier ein kleiner Code dazu:
on:start {
	//Variable auf 10 setzen (-> 10)
	$var=10;
	//Variable um 3 verringern (-> 7)
	$var-=3;
	//Variable um 1 erhöhen (-> 8)
	$var++;
	//Variable um sich selbst erhöhen (-> 16)
	$var+=$var;
	//Ausgabe
	msg $var;
}

Bei dem "//" handelt es sich um Kommentare. Alles in einer Zeile hinter einem "//" wird ignoriert. Es ist empfehlenswert ab und zu Kommentare in die Scripts zu schreiben, damit man sich besser zurechtfindet und sofort weiss, was das Script da überhaupt tut. Es ist auch möglich Kommentare über mehrere Zeilen einzubauen. Diese werden mit "/*" eingeleitet und "*/" beendet.
Ein weiterer Unterschied gegenüber unseren vorherigen Scripts ist, dass wir dem msg-Befehl nun einfach nur die Variable ohne zusätzlichen Text übergeben.
Natürlich wäre es auch möglich z.B. eine Variable mit einer anderen zu eröhen ($bla+=$blubb;) und vieles mehr. Aber das alles hier zu zeigen würde den Rahmen dieser Anleitung sprengen - und es ist auch garnicht notwendig. Probiere einfach etwas herum.

Lokal und Global

Bisher haben wir unsere Variablen einfach nach dem Prinzip $x=y erstellt. Auf diese Weise erstellte Variablen sind automatisch global. Das heisst: Wir können von jedem Script aus auf sie zugreifen. Egal wo es ausgeführt wird. Das kann unter Umständen aber unerwünscht sein. Beispielsweise wenn man für jedes Objekt einzeln zählen möchte, wie oft es vom Spieler getroffen wurde. Ein kleines "Experiment" soll das verdeutlichen:
• Öffne die Datei "objects_palms.inf" im Ordner "mods\Stranded II\sys"
• Füge das folgende Script direkt unter der Zeile "script=start" ein:
on:hit {
	$hits++;
	msg "Palmen Treffer: $hits";
}

• Speichere die Datei (wir haben somit gerade ein Definitionsscript geändert bzw. angelegt!)
• Starte Stranded II (wenn es bereits läuft musst du es beenden und nochmal starten!)
• Erstelle eine Map mit mehreren Palmen (natürlich Palmen vom Typ 1!) und teste sie
Wenn du nun auf eine Palme schlägst (draufzeigen und klicken) wird "Palmen Treffer: X" ausgegeben, wobei sich X mit jedem Schlag erhöht. Gehst du nun zu einer anderen Palme, wird X einfach weiter erhöht und beginnt nicht für diese Palme nochmal bei 0. Das ist in diesem Fall nicht erwünscht. Wir wollen für jede Palme einen eigenen Zähler für die Anzahl der Treffer.
Die Lösung sind lokale Variablen. Im Gegensatz zu globalen Variablen kann auf sie nur in Scripts des Objekts auf sie zugegriffen werden, wo sie als lokal definiert wurden (es sei denn man nutzt setlocal oder getlocal).

• Der Befehl "local" in der Befehlsreferenz

• Öffne erneut die Datei "objects_palms.inf" im Ordner "mods\Stranded II\sys"
• Füge folgende Zeile unter der Zeile on:hit {, die wir eben geschrieben haben, ein:
local $hits;

• Wiederhole die Schritte von eben (Speichern, Karte erstellen, testen)
Und schon klappt es. Für jede Palme gibt es einen eigenen Zähler. Lokalen Variablen sei Dank.
Wichtig: Die Änderungen in der "objects_palms.inf" nach den Tests wieder rückgängig machen, also das Script entfernen!
Das ist eigentlich auch schon alles bezüglich lokalen und globalen Variablen. Alle Variablen werden übrigens auch mit Spielständen abgespeichert. Es sei denn...

Temporäre Variablen

...ja, es sei denn, man markiert sie als temporäre Variable. Eine weitere kleine Besonderheit von Stranded II Script.
Über den Befehl "temp" wird eine Variable als temporäre Variable behandelt. Sie verhält sich dann wie eine ganz normale Variable, aber mit dem Unterschied, dass sie vor dem Speichern der Map automatisch gelöscht wird. Mit "tempall" werden alle Variablen gleichzeitig zu temporären Variablen. Natürlich können sowohl globale als auch lokale Variablen temporär sein.

• Der Befehl "temp" in der Befehlsreferenz
• Der Befehl "tempall" in der Befehlsreferenz


Befehle mit Rückgabewert

Dieses Thema gehört eigentlich nicht wirklich zu Variablen, wird hier aber auch noch angeschnitten, da sich Befehle mit Rückgabewert wie Variablen verhalten.
Wenn man in Stranded II Script einen Befehl aufruft, der etwas zurückgibt, muss man beachten, dass es hier einen kleinen Unterschied zu normalen Befehlsaufrufen gibt: Die Parameter müssen in runde Klammern gesetzt werden. Falls keine Parameter angegeben werden, wird einfach ein leeres Paar runder Klammern angehangen. Der Befehl mit Rückgabewert wird dann vom Script durch seinen Rückgabewert ersetzt. Genau wie ein Variablenname durch den Wert der Variable ersetzt wird.
Hier ein Beispiel:
on:start {
	msg gt();
	msg random(100);
}

Alle Befehle mit Rückgabewerten sind in einer extra Kategorie in der Befehlsreferenz eingeordnet:

• Return-Befehle in der Befehlsreferenz

Zusammenfassung

Stranded II Script verfügt über lokale und globale Variablen welche über ein Dollarzeichen gekennzeichnet werden. Die Variablen werden mit Spielständen abgespeichert, es sei denn sie werden als temporär markiert.
Befehle die etwas zurückgeben sollen werden mit eingeklammerten Parametern aufgerufen, oder mit einem paar runder Klammern hinter dem Befehl, falls sie keine Parameter haben.

• IV. Bedingungen
Stranded I, Stranded II & Stranded III are games by Unreal Software 2003-2017 | Contact | Disclaimer