G.E.C.K. Tutorial - Einführung in das Skripten
Einführung in das Skripten
Hallo und wilkommen in die Einführung für Skripten im G.E.C.K.
Erst einmal vorab:
Wozu braucht man eigentlich Skripte?
Skripte sind im G.E.C.K. kleine Hilfswerkzeuge, die uns eine ganze Reihe weiterer Möglichkeiten offenbaren und für viele Ereignisse "hinter den Kulissen" verantwortlich sind. Sie sind es, die meist die Quests steuern und es zum Beispiel ermöglichen, dass das Betätigen eines Schalters die verlinkte Tür öffnet. Sie sind es, die bei Aktivieren eines Gegenstands Dialogboxen erscheinen lassen oder einfach nur die Erfüllung einer bestimmten Voraussetzung überprüfen.
Die Skripte sind also recht mächtige Werkzeuge, mit denen sich viele interessante Dinge anstellen lassen.
Generell ist es von Nutzen, wenn ihr bereits Kenntnisse mit Programmiersprachen verschiedener mitbringt, da somit der Einstieg in die verschiedenen Kontrollstrukturen wegfällt. Dieses Tutorial soll sich aber auch an die Einsteiger richten, die noch nie mit einer Programmier- oder ähnlichen Sprache gearbeitet haben.
Der Einsatz von Skripten
Bevor wir mit der Syntax beginnen, sehen wir uns zuerst noch einmal an, wo Skripte überhaupt angewandt werden.
Skripte können in verschiedenen Formen angewandt werden. So unterscheiden sich diese in 3 Typen: Quest-Skripte, Object-Skripte und Effect-Skripte.
Quest-Skripte werden, wie schon der Name verrät, bei Quests angewendet und steuern diese. Die Object-Skripte können auf die meisten interagierbaren Objekte angewandt werden, wie etwa NPCs, Doors, Items, Activators und viele weitere. Die Effect-Skripte sind für die sogenannten Game Effects, also diverse Zustände und Enchantments, die Kreaturen oder Characters betreffen, zuständig.
Die Syntax
Der Skriptname
Jedes Skript beginnt zunächst mit einer einfachen Kennzeichnung, die sich aus folgendem Code zusammensetzt:
Code:
scn MeinSkriptName
;oder auch: SriptName MeinSkriptName
Groß- und Kleinschreibung spielt hier keine Rolle, es kann als genauso "SCN" oder auch "scriptname" geschrieben werden. Wie man sieht, bieten Funktionen meist sowohl eine Kurzschreibweise, als auch eine lange Schreibweise an. Welche davon angewandt wird, bleibt jedem selbst überlassen.
Die Kommentare
Der mit dem ;-Zeichen gekennzeichnete Eintrag ist ein Kommentar. Kommentare können mit einem ";" begonnen werden und gelten dann für die fortlaufende Zeile. Sie sind dazu da, das geschriebene Skript durch Erklärungen lesbarer zu machen, also damit man auch später noch weiß, was das Skript nun eigentlich machen soll.
Die Variablenzuweisung
Unter dem Skriptnamen folgen die Variablenzuweisungen. Variablen sind ganz einfach kleine Datenspeicher, die mit einem Wert (hier sind nur numerische Zahlen als Werte möglich) ausgestattet und modifiziert werden können. Im G.E.C.K.-Scripting gibt es 4 Variablentypen: short, long, float und ref.
Code:
short variablenname1
long variablenname2
float variablenname3
ref variablenname4
Die short-Variable kann Zahlen von -32768 bis 32767 speichern, während long und float höhere Grenzwerte besitzen. Da wir jedoch im G.E.C.K.-Scripting meist in einem sehr niedrigen Zahlenbereich arbeiten und wir wohl nie über größere Zahlenwerte hinauskommen werden, ist nur die short-Variable relevant.
Die ref-Variable ist eine Referenzvariable. Sie speichert statt Zahlenwerten eine Objektreferenz. Mit diesen können wir also richtige Objektreferenzen aus der Spielwelt ansprechen.
Der Beginblock
Nach den Variablendeklarationen folgt immer der Begin-Block. Dieser sorget dafür, dass der weiterstehende Code nur dann ausgeführt wird, wenn die Begin-Bedingung erfüllt wurde. Der Begin-Block "Begin OnActivate" wird beispielsweise nur dann ausgeführt, wenn das betreffende Objekt, auf dem das Skript liegt, vom Spieler aktiviert wird. Begin-Blöcke MÜSSEN nach ihrem darin enthaltenen Code mit "End" abgeschlossen werden.
Code:
scn Skriptnamen
short i
Begin OnActivate
set i to 1 ;Tritt nur dann ein, wenn das Objekt „aktiviert“ wird.
End
Begin GameMode
set i to 1 ;Tritt immer ein, wenn sich das Spiel im Gamemodus befindet, als immer dann, wenn gerade kein Menü läuft.
End
Eine Auflistung aller im G.E.C.K. möglichen Begin-Bedingungen, sowie deren Erklärung, findet ihr im Offiziellen GECK-Wiki: Begin - GECK.
Anmerkung: Die Einrückung des im Begin-Block stehenden Codes ist nicht zwingend erforderlich. Es gehört jedoch zum guten Ton, in Blöcken stehend Codesegmente mit dem Tabulator einzurücken, was auch die Lesbarkeit von umfassenderen Skripten deutlich vereinfacht.
Variablen modifizieren
Wird eine Variable neu deklariert, ist ihr Anfangswert zunächst "0". Eine Wertzuweisung geschieht mit der Set-Funktion:
Code:
set variablenname to 1
Hier wird also der zuvor auf 0 deklarierten Variable der Wert 1 zugewiesen. Variablenname können natürlich auch einfach inkrementiert werden:
Code:
scn InkrementierSkript
short i
Begin OnActivate
set i to 1 ; i bekommt seine erste Zuweisung
set i to i + 2 ; i wird um den Wert 2 inkrementiert: Die Variable hat nun den Wert 3
End
Die if-Bedingungen
Die if-Bedingungen sind WENN-Bedingungen, welche für gewöhnlich einen Wert auf ZUTREFFEND oder NICHT ZUTREFFEND abprüfen und nach diesem entscheiden, ob der Code im ersten Block (falls zutreffend), oder der zweite im else-Block (ANDERNFALLS) stehende Code (falls nicht zutreffend), ausgeführt werden soll.
if-Bedingungen verwenden für Überprüfen verschiedene Operatoren. Diese wären:
---
if i == 1
Prüft ab, ob die zu überprüfenden Elemente die selben Werte besitzen.
if i > 1
Prüft ab, ob das linke Element größer als das rechte ist.
if i < 1
Prüft ab, ob das linke Element kleiner als das rechte ist.
if i != 1
Prüft ab, ob die zu überprüfenden Elemente nicht die selben Werte besitzen.
if i >= 1
Prüft ab, ob das linke Element größer oder gleich das rechte ist.
if i <= 1
Prüft ab, ob das linke Element kleiner oder gleich das rechte ist.
---
Außerdem lassen sich noch mehrere if-Bedingungen miteinander verknüpfen. Bei if-Bedingungen, die mit dem logischen Operator && (UND) verknüpft sind, müssen beide Bedingungen zutreffen. Bei if-Bedingungen, die mit dem logischen Operator || (ODER) verknüpft sind, muss mindestens eine der beiden Bedingungen zutreffen.
Ein if-Block muss mit einem endif abgeschlossen werden. else-Zweige sind möglich, müssen jedoch nicht unbedingt angewandt werden. Um auf einen else-Block direkt eine weitere if-Bedingung folgen zu lassen, kann dieser auch mit endif geschrieben und daraufhin wie ein gewöhnliches if behandelt werden.
Erläutern wir das durch ein Beispiel:
Code:
scn InkrementierSkript
short i
short x
Begin OnActivate
set i to 2
if i >= 2 ; Wenn i größer oder gleich 2 ist, tritt der erste Block ein. Andernfalls wird der Else-Block ausgeführt.
set x to 1
else ; Tritt ein, wenn i NICHT größer oder gleich 2 ist.
set x to 2
;...
endif
if i != 2 ;Tritt ein, wenn i NICHT 2 ist.
set x to 1
;...
elseif i > 1 ; Eine direkt darauf folgende if-Bedingung, die eintritt, wenn i NICHT 2 ist.
set x to 2
else
set x to 3
endif
End
Die Funktionen
Funktionen sind Programmroutinen, die eine bestimmte Aufgabe ausführen und daraufhin einen Wert zurücklierfern, der den Status des Ergebnisses ausgibt. Der Funktion vorangestellt wird eine Referenz, an der diese angewendet werden soll. Referenz und Funktion werden durch einen Punkt getrennt, also: referenz.Funktion
- Als Beispiel: Die Funktion "myRef.GetDead" überprüft, ob unsere angegebene Referenz (bei der es sich in diesem Fall um einen NPC handelt) noch lebt. Ist der NPC tot, wird der Wert "1" zurückgegeben. Lebt sie hingegen noch, wird der Wert "0" zurückgegeben.
Funktionen lassen sich selbstverständlich auch in if-Bedingungen anwenden. So ist z.B. folgendes Skript möglich, um den Tod eines NPC's festzustellen:
Code:
scn TodfeststellungsSkript
ref myNPC
Begin OnGameMode
set myNPC to GetReference
if myNPC.GetDead == 1
; Der NPC ist tot, entsprechender Code wird ausgeführt.
else
; Der NPC lebt noch, entsprechender Code wird hier ausgeführt.
endif
End
Mit diesem Skript lässt sich ohne weiteres feststellen, ob der NPC tot ist, oder noch lebt, um entsprechend darauf zu reagieren. Anstatt des "GetReference" können wir auch ohne weiteres einen Referenznamen wählen, den wir zuvor einer NPC-Referenz zugewiesen haben.
Es gibt irrsinnig viele Funktionen, die alle ihren eigenen Zweck haben. Hier alle aufzuzählen wäre nicht möglich, ohne das Thema hier zu sprengen.
Eine ausführliche Auflistung alle Funktionen und deren Zweck finden sich im Offiziellen GECK-Wiki.
Schlusssatz
Das war es auch bereits mit unserer "Einführung" in das Skripten. Ich wünsche euch gutes Gelingen mit euren ersten Skripten und hoffentlich hat dieses Tutorial euch weitergeholfen.
Example Script von GECK WIKI
ScriptName LightSwitchScript
ref light ;der name "light" hat der eine bedeutung oder ist er frei erfunden?
Begin OnActivate
if light == 0 ;wenn die Variable light 0 ist? was ist damit gemeint, unten steht doch schon enable oder disable, ist das der Anfangswert? also wenn das Licht = 0? dann ensteht erst der Bezug zu dem Lichteffekt?
set light to GetLinkedRef
endif
if light.GetDisabled ;also, wenn das light ausgeschaltet wird (ist "light" immer noch die Variable?), dann wird das "light" eingeschaltet, sonst wird es ausgeschaltet?
light.Enable
else
light.Disable
endif
Activate
End