====== Daedalus ====== Daedalus ist die Skriptsprache die in Gothic verwendet wird, um die Welt mit Leben zu füllen. Diese Dokumentation soll einen kurzen Überblick über die bei Gothic verwendeten Skripte liefern, mit Augenmerk auf die Gothic-MOD-Erstellung. Die Grundfunktionalitäten werden kurz erläutert und auf Besonderheiten der Skriptsprache hingewiesen. Diese Dokumentation soll allerdings nicht den kompletten Umfang und alle Möglichkeiten der Skriptsprache umfassen, sondern den Einstieg erleichtern und auf einige Kniffe hinweisen. Viele Kleinigkeiten, die hier nicht erklärt werden, sind in den veröffentlichten Skripten aus dem "Gothic-MOD-Kit" ersichtlich. Siehe auch die Dokumentation zur Syntax der Skriptsprache ===== Wofür wird die Skriptsprache verwendet? ===== Die Skriptsprache in Gothic hat diverse Aufgaben. Die wichtigsten sind: *Eigenschaften von Gegenständen und Nichtspielercharakteren (NSCs) festlegen. *Festlegen der NSC - AI. Das Verhalten bei bestimmten Spieleraktionen (durch Wahrnehmungen werden Skripte ausgeführt). *Definieren der NSC - Tagesabläufe. *Dialoge mit NSCs steuern. *Auswirkungen von Magie definieren. *Kameraverhalten in bestimmten Situationen. *Aussehen der Partikeleffekte festlegen. *Eigenschaften von Soundeffekten festelegen. *Menüdarstellung *etc... Die einzelnen Skriptfiles besitzen die Endung ".d" (D-File). Dies sind normale Textfiles und enthalten den Skriptsource, der dann von einem Parser übersetzt wird und als File mit der Endung ".DAT" im compilierten Format auf der Festplatte gespeichert wird. Welche Skriptfiles übersetzt werden sollen, teilt man Gothic in einem File mit der Endung ".SRC" mit. Dies ist wiederum ein normales Textfile, in dem die zu parsenden Files aufgelistet werden. Hier sind Unterverzeichnisse und Wildcards erlaubt. Auch die Reihenfolge der dort angegebenen Files kann wichtig werden, da einige Symbole vor anderen definiert werden müssen. Als erstes sollten immer die Klassendefinitionen und globalen Konstanten geparst werden, da die meisten anderen Skriptfiles darauf Bezug nehmen. ===== Aufbau der Skriptsprache ===== Die Skriptsprache benutzt sogenannte "Klassen", die festlegen, welche Eigenschaften der Spielobjekte in den Skripten abfragbar oder veränderbar sind. Solche Klassen beginnen mit dem Schlüsselwort CLASS und dürfen nicht verändert werden. Sie bilden die Schnittstelle zwischen dem Skript und dem eigentlichen Programm (Gothic) und müssen deshalb exakt übereinstimmen. Sollten trotzdem die Variablentypen oder die Reihenfolge der Variablen verändert werden, wird sich Gothic unverhersehbar verhalten oder im schlimmsten Fall abstürzen, da Gothic die benötigten Werte an die falsche Stelle schreibt... Die einzelnen Klassen sind im "content\_intern"-Order im File "classes.d" zu finden. Dort findet Ihr auch eine kurze Beschreibung der einzelnen Variablen (na ja, zumindest bei einigen). Wichtige Klassen sind: *C_NPC (Welche Eigenschaften eines NSCs kann man in den Skripten verändern) *C_ITEM (Welche Eigenschaften von Gegenständen kann man in den Skripten verändern) *C_INFO (Eine Information, die während eines Dialoges ausgegeben werden kann) Klassen sind natürlich wertlos ohne die Instanzen der jeweiligen Klassen. Instanzen sind im Spiel vorkommende Objekte dieser Klasse, z.B. ist ein NSC im Spiel eine Instanz der Klasse "C_NPC". Instanzen werden mit den Schlüsselwort INSTANCE eingeleitet. Hier werden dann die Eigenschaften des Objektes festgelegt, indem die einzelnen Variablen, die in der Klasse festgelegt wurden, mit Werten initialisiert werden. Jedes D-File im Ordner "story/npc/" initialisiert auf diese Weise einen im Spiel vorkommenden NSC. ===== Einschränkungen der Skriptsprache ===== Die Gothic Skriptsprache besitzt einige Einschränkungen und Besonderheiten, die besonders für programmiererfahrene Nutzer interessant sein dürften: *Es gibt keine FOR- oder WHILE- Schleifen, man kann aber Rekursion verwenden. *Die Operatorenpriorität stimmt mit der von C++ überein. *Einige Zuweisungsoperatoren für Integer-Typen sind nicht vorhanden (+=, -=,..). *Auf einzelne Arrayelemente kann nur mit einer Konstante als Index zugegriffen werden : erlaubt ist "ArrayName[10] = 1234", Fehlermeldung bei "ArrayName[VarName] = 1234". Arrays können nicht als Funktionensparameter übergeben werden. *Es gibt nur den Zuweisungsoperator bei den Fliesskommazahlen (keine Rechnungen mit FLOATs möglich). *Alle globalen Variablen oder in den Funktionen definierten lokalen Variablen sind automatisch mit Null initialisiert. Dies gilt auch für nichtbelegte Variablen bei den meisten Instanzen. *Lokale Variablen in Funktionen werden wie globale Variablen behandelt und behalten ihren Wert bei Verlassen der Funktion. Sie werden also nicht temporär erzeugt und anschliessend wieder gelöscht, wie es bei C++ der Fall ist. ===== Die Externals ===== Die "Externals" oder auch "BuildIn" - Funktionen liefern Funktionalitäten, die nur schwer im Skript zu implementieren wären. Hier liefert Gothic einen Satz von Funktionen, die aus der Skriptsprache heraus aufgerufen werden können. Eine vollständige Liste dieser Funktionen mit einer kurzen Beschreibung befindet sich [[http://www.worldofgothic.de/modifikation/index.php?go=g2functions|hier]].