Dieses Tutorial ist kein Schritt-für-Schritt tutorial, indem Ich euch erzähle was zutun ist und ihr mich einfach kopiert. Es ist eher als eine Einführung in die Sprache, untersuchend, was man tun kann und was nicht. Das ist aus zweierlei Gründen so: 1) Schritt-für-Schritt Tutorials sind langweilig und 2) Schritt-für-Schritt Tutorials sind grundsätzlich nutzlos, nachdem du diese einmal gelesen hast. Dieses Tutorial wird keine Ratschläge beinhalten, wie ihr eure Scripts zu compilieren habt, wie man sie zu crittern ( oder maps, oder hexes) im Spiel, hinzufügt, oder wie bestimmte Software zu installieren/ benutzen ist ( welche compiler, diverse modding Werkzeuge etc. und ungepackte .dat Dateien beinhalten). Falls du Hilfe bei den Oben genannten Problemen benötigst, versuche die relevanten Manusskripte und readmes zu lesen. Wenn das nicht hilft, versuche in die „Fallout modding Foren“ zu posten:
"No Mutants Allowed"
Die Box auf der rechten Seite ist die Beschreibung des jeweiligen Befehls. Lies es dir genaustens durch!
Fetter Text auf der linken Seite: der Name des Befehls. Um einen Befehl in einem Skript zu verwenden, tippst du es einfach so ein, wie es im Manusskript steht. Ziemlich offensichtlich.
Kursiver Text unter dem Namen: der Rücktyp des Befehls. Ein Befehl kann entweder nichts zurückbringen oder ein Objekt eines bestimmten Types. Die gängisten Typen sind int, eine Ganzzahl und ein ungültig Macher, was bedeutet, dass der Befehl nichts zurück gibt. Typisch, Befehle die nichts zurück geben machen irgendetwas mit dem Zustand des Spiels und Befehle, die etwas zurück geben, möchten den Zustand von Etwas im Spiel wissen.
Normaler Text auf der linken Seite, unter Rücktyp: welche Argumente der Befehl passiert haben muss. Viele Befehle nehmen Argumente. Argumente sind für gewöhnlich gut in der Beschreibungs Box beschrieben. Argumente sind in die runden Klammern geschrieben, nach den Namen des Befehls und multiple Argumente sind durch Kommata getrennt, wie folgt:
Code: Select all
command(arg1,arg2) ;
Wenn ein Befehl mit einem Semikolon gefolgt ist ( ; ) setzt dieser einen Ausdruck ein. Alle Befehle müssen ein Teil eines Ausdruckes oder einer Äußerung sein. Merke, dass du den Rückwert eines Befehls eines Arguments für einen anderen Befehl verwenden kannst:
Code: Select all
command1 (command2 (args) , command3 (args)) ;
Code: Select all
#define name (value)
#define macroname body
Code: Select all
#include header
Code: Select all
procedure name begin
body
end
Code: Select all
call procedure_name;
Code: Select all
variable name;
Code: Select all
if () then begin
do something;
end
(Merke über booleanische Werte: Es gibt keine realen booleanischen Werte in der Scriptsprache. Wie in C. Ein Integer representiert true oder false. 0 ist false, alles andere ist true.)
Der Ausdruck innerhalb der runden Klammern muss vorher bestimmt werden, übersetzt entweder zu true oder false. Es kann entweder ein booleanischer Wert sein, ein Befehl, der einen booleanischen Wert zurück gibt, oder einen booleanischen Wert enthält, zwei Werte vergleichend. Folgende sind legale Komparatoren.
> (größer als)
< (kleiner als)
>= (größer als oder gleich)
<= (kleiner als oder gleich)
== (gleich)
!= (ist nicht gleich)
Der Test für true und false kann auch multiple Bedingungen checken, wenn man and und or verwendet. Wenn du den Codeblock zwischen begin und end erneut starten möchtest, wenn der Test ein false anstatt ein true ausgegeben hat, leitest du den Test mit einem Ausrufezeichen (!) ein.
Beispiele für gültige ture/false Tests.
Code: Select all
If (dude_is_male)
If (is_success (repair_check) )
If (skill_used == SKILL_REPAIR)
If ( (is_success (repair_check) ) and (skill_used == SKILL_REPAIR) )
If (!is_success (repair_check) )
Code: Select all
if () then begin
do something;
end
else begin
do something else;
end
Code: Select all
if () then begin
do something;
end
else if () then begin
do something else;
end
else begin
do something else;
end
Code: Select all
while (conditions) do begin
body;
end
Code: Select all
Procedures
procedure name begin
body
end
Code: Select all
call procedure_name;
/* Diese Prozedur wird jedes Mal aufgerufen, wenn eine Map zum ersten Mal betreten wird. Es wird die Team Nummer und das AI Packet für diesen Critter aufsetzen. Das wird die default Einstellungen des Protoypen überschreiben und müssen im Skript gesetzt werden. */
Code: Select all
procedure map_enter_p_proc begin
Only_Once :=0;
critter_add_trait (self_obj , TRAIT_OBJECT , OBJECT_TEAM_NUM , TEAM_KLAMATH) ;
critter_add_trait (self_obj, TRAIT_OBJECT , OBJECT_AI_PACKET , AI_TOUGH_CITIZEN)
end
Code: Select all
procedure given_items begin
given_pid_qty (dude_obj , 475 , 3)
given_pid_qty (dude_obj , 159 , 1)
end
Code: Select all
call give_items;
call give_items;
Alle Prozeduren, die das Skript verwendet, müssen im Kopf der Skript Datei aufgelistet sein.
Code: Select all
procedure start;
procedure critter_p_proc;
procedure pickup_p_proc;
procedure talk_p_proc;
procedure destroy_p_proc;
procedure give_items;
Code: Select all
#define Noption (x,y,z) qiQ_Option(z,NAME,x,y,NEUTRAL_REACTION)
Wenn du dich durch die Skripte durchgelesen hast, die beim Mapper beibeiliegen, wirst du dich bestimmt gewundert haben, wieso du einige Befehle im Mapper Manusskript nicht finden kannst. Gut, das sind Macros. Die meisten Macros können in der command.h header Datei gefunden werden. Es ist also wünschenswert, dass du deine eigenen Macros in diese Datei hinzufügst. Um ein Macro in deinem Skript zu verwenden, musst du es entweder #define in deinem Skript, oder es in der header Datei definieren und dann #include diesen header in dein Skript.
Macros scheinen Prozeduren ähnlich zu sehen, es sind aber zwei unterschiedlich Dinge. Sie verhalten sich unterschiedlich aus der Sicht des Compilers und des Computers. Prozeduren müssen aufgerufen werden, Macros ersetzen grundsätzlich ein Stück des Textes durch einen anderen. Zum Beispiel, während der Kompilation, der Vorrechner wird alle Umstände ersetzen von Noption(x,y,z) mit giQ-Option(z,NAME,x,y,NEUTRAL_REACTION). Ein Prozedurenaufruf auf der anderen Hand wird eine Aktivierungs Aufzeichnung für die Prozedur an der Spitze des Stapels auslösen und wird zu dieser Routine springen (während der Laufzeit). In Laiensprache heisst das, dass Makros schneller aufgerufen werden als Prozeduren, aber Prozeduren nehmen weniger Platz in Anspruch. Falls der letzte Paragraph keinen Sinn ergeben sollte, nicht schlimm. Denke einfach daran, dass macros != procedures.
Kommentare:
Code: Select all
/* Das ist ein mehrzeiliges Kommentar.*/
call /* Das ist ein in-line Kommentar */ function
// Das ist ein one-line Kommentar.
Es ist wichtig, dass dein Code richtig eingerückt ist. Nicht eingerückter Code ist einfach zu schreiben, aber fast unmöglich zu lesen. Code innerhalb von Prozeduren und if-blocks sollten zwei Mal mithilfe der Leertaste eingerückt werden. Jeder Code, der nacheinander abgerufen werden soll, sollte in der selben Zeile stehen. Das Ausbreiten sollte durch die Einrückung von mindestens zwei Räumen nach rechts angezeigt werden. Ein Beispiel:
Code: Select all
procedure name begin
if () then begin
do something;
if () then begin
do something within the other if-block;
end
end
do something;
do something;
end
Jegliche globale Variable, die du #define (definierst) und verwendest, muss in eine Datei geschreiben werden, die sich VAULT13.gam nennt. Diese Datei kann man unter data\data finden. Map Variablen müssen in eine Datei geschrieben werden, die den Namen mapName.gam trägt. Du findest die Datei unter data\maps.
Um Skripte zu schreiben benutzt du besser andere Editoren als wordpad. Ich kann jedem nur NoteTabLight empfehlen. Es ist wirklich mächtig, leicht zu benutzen und es ist kostenlos. Wenn du denkst du bist sowas wie ein Hacker, dann kann ich Emacs empfehlen, welches noch mehr Power hat. Aber zu lernen wie Emacs funktioniert ist härter als Skripten zu lernen, daher kann ich das einem Anfänger gar Fortgeschrittenen Skripter nicht empfehlen. Es gibt also im Endeffekt zwei Ediotren, um Skripte für Fallout zu machen. Eines ist mein eigenes Dscript (Link leider tot ) und das anderes ist Jargo’s FSE .
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Bringe ihm das Fischen bei und du ernährst ihn sein Leben lang.
©2003-2004 Daniel Sjöblom
mail me! dsjoblom@mbnet.fi
____________________________________________________________________________________________________________________________________________
Dieses Tutorial wurde von Daniel Sjöblom geschrieben und kann unter folgender Adresse eingesehen werden.
Quelle: "Fallout scripting language tutorial" (Link leider tot ). Ich habe den Text lediglich übersetzt.
________________________________________________________________________________________________________________________________________
* Der Quellcode wurde eingerückt.
* Die Verlinkungen wurden verkürzt und eingefärbt.
* Einige Rechtschreibfehler wurden korrigiert.
Folgende Fehler wurden behoben -Teil2-:
* Der Quellcode wurde mit dem Quellcode - Button editiert.
* Links wurden auf ihre Aktualität geprüft.
* Links wurden hinzugefügt, andere als "tot" markiert.
* Überschriften wurden editiert.
* Fehler aus dem Quellcode beseitigt.