Autor Thema: [Fallout2] Scripting (Deutsch)  (Gelesen 7079 mal)

Vault 0 Bewohner

  • Gast
[Fallout2] Scripting (Deutsch)
« am: 11. März 2009, 17:09:21 Uhr »
Fallout scripting language tutorial

Die Syntax der Fallout Scriptsprache ist ein Mix aus C und Pascal, aber eine sehr allgemein gehaltene Sprache, daher musst du nichts weiteres wissen, um Scripte schreiben zu können. Ein Mindestmaß an Erfahrung mit jeder Programmiersprache wird einige Dinge viel einfacher machen, ist aber nicht voraussgesetzt, fakt ist dieses Tutorial wird einige Informationen enhalten, die viele Programmierer bereits wissen. Während dieses Tutorials werde ich immer davon ausgehen, dass ihr euch gleichzeitig das Manusskript des Mappers und das von existierenden Scripts durchlest, um an Hinweise zu gelangen, wie etwas funktioniert.

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"



Befehle/ Kommandos

Alle im Spiel spezifischen Befehle, die in der Scriptsprache verwendet werden können im Fallout 2 mapper Manusskript gefunden werden, beginnend auf Seite 9. Das Manusskript ist durchaus klar organisiert, aber hier ein kurzer Überblick, wie es zu lesen ist:

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:

   command(arg1,arg2) ;
Die Argumente müssen die korrekte Anzahl, die korrekte Anweisung und den korrekten Typ besitzen (wenn der Befehl einen Integer erwartet, kannst du nicht was anderes zulassen, ausser einem Integer).

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:

   command1 (command2 (args) , command3 (args)) ;
Als Zusatz zu diesen Spiele spezifischen Befehlen gibt es noch mehrere allgemeine Befehle:

      #define name (value)
      #define macroname body

Der #define Befehl wird verwendet, um ein Makro zu schreiben. Du kannst dir ein Makro als ein Pseudonym denken. In dem Beispiel wäre name ein Pseudonym für value. Mehr über Makros in der Makro Abteilung (Merke: Für gewöhnlich definieren die beiden Oben genannten Befehle Makros).

   #include header
Die Header Datei ist in dem Skript einbezogen und das Makro in der Datei kann nun verwendet werden. Die Header Dateien befinden sich in dem Ordner scripts\headers , in dem Verzeichnis, indem du deinen Mapper installiert hast. Du kannst nun auch deine eigene Header Dateien machen. Fast alle Skripts werden define.h und command.h beinhalten (Merke: Wenn du mehr über #include und #define wissen möchtest, solltest du dir den C Sprachen Hinweis durchlesen, der sich wahrscheinlich bei deinem C-Compiler befindet).

   procedure name begin
       body
        end

Eine Prozedur Definition. Mehr über Prozeduren in der Prozeduren Abteilung.

   call procedure_name;
Verwendet, um eine Prozedur aus einer anderen Prozedur aufzurufen. Muss mit einem Semikolon beendet werden ( ; ).

   variable name;
Erstellt kurzeitig eine lokale Variable mit einem spezifierten Namen. Werte sind an die Variablen mit := gebunden. Ex. Variable killcount:=0. Diese Art von Variablen wird nicht bei Mapwechseln gespeichert.



If-then-else

Der if-then-else Ausdruck ist wichtig genug, um sich ein eigenes Kapitel zu verdienen. Es ist ein standard Ausdruck, um den fluß eines Skriptes kontrollieren zu können. Es stehen einige verscheidene Wege zur Verfügung, um diesen Ausdruck in der Sprache zu schreiben.

   if () then begin
       do something;
        end

Das ist die standard Form eines simplen if. Die runden Klammern nach dem if, müssen einen Ausdruck enthalten, der zu einem booleanischen Wert übersetzt. Ein booleanischer Wert kann nur zwei Werte annehmen: true oder false. Wenn der booleanische Wert zwischen den runden Klammern ein true enthält, dann wird der Ausdruck zwischen begin und end ausgeführt. Wenn jedoch ein false darin stehen sollte, dann springt das Programm zum nächsten Ausdruck direkt nach dem 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.

   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) )

Das standard if kann erweitert warden, um einen else Teil zu enthalten, welcher if ausführt, wenn der if Test fehlschlägt:

   if () then begin
      do something;
   end
   else begin
       do something else;
   end

Der if-then-else Ausdruck kann auch verkettet sein:

   if () then begin
      do something;
   end
   else if () then begin
      do something else;
   end
   else begin
      do something else;
   end



   
Looping

Die Scriptsprache unterstüzt auch loops (Schleifen), obwohl diese eigentlich nicht wirklich hilfreich sind., seitedem Skripts selten loops brauchen. Aber falls du sie mal benötigst, ist die Syntax folgende:
   
        while (conditions) do begin
      body;
   end

Wo Konditionen für booleanische Werte stehen, so wie in dem if Ausdruck. Das erste Mal, während ein loop eingegeben ist, ist die Kondition gechecked. Wenn sie true ist, dann wird der body ausgefürht. Jetzt ist die Kondition erneut gechecked, wenn sie true ist, wird der body wieder ausgeführt. Das wird so oft wiederholt, bis die Kondition false ist.

       Procedures
   procedure name begin
      body
       end

Der body zwischen begin und end besteht aus dem Ausdruck, welchen die Prozedur ausführen wird. Um dies zu tun, muss die Prozedur folgendermaßen genannt werden:

       call procedure_name;
Die meisten Prozedurenaufrufe werden bei der Fallout enginge gemacht, daher musst du dir kaum Sorgen um das Aufrufen von Prozeduren machen. Die Prozedurenaufrufe, die von der Enginge genutzt werden, sind im Mapper Manusskript auf Seite 25 aufgelistet. Zusätzlich zu dieser Auflistung im Manusskript, gibt es eine ganze Menge neuer Prozeduren, die wahrscheinlich zu Fallout 2 hinzugefügt wurden. Ich fand nur soweit nur push. Wenn jemand was anderes findet, lasst es mich wissen. Ein Beispiel einer Prozedur, die von der Engine aufgerufen wird:

/* 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. */

   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

Zusätzlich zu den Prozeduren, die von der Enginge verwendet warden, kannst du deine eigenen Prozeduren schreiben, die du dann manuell aufrufen musst. Grundsätzlich ist es eine gute Idee neue Prozeduren zu schreiben, wenn man findet, dass man zuviel doppelten Code in seinem Skript hat. Zum Beispiel:

   procedure given_items begin
      given_pid_qty (dude_obj , 475 , 3)
      given_pid_qty (dude_obj , 159 , 1)
   end

Jedes Mal wenn du diese Prozedur aufrufst, wird der Charakter drei Items des Itemstypen 475 erhalten und ein Item des Itemtypes 159. Du kannst es so oft aufrufen, wie du es benötigst:

   call give_items;
   call give_items;

Das Obendrüber würde den Ausdruck in der give_items Prozedur zwei Mal wiederholen.
Alle Prozeduren, die das Skript verwendet, müssen im Kopf der Skript Datei aufgelistet sein.
   
        procedure start;
   procedure critter_p_proc;
   procedure pickup_p_proc;
   procedure talk_p_proc;
   procedure destroy_p_proc;
   procedure give_items;

In technischen Bedingungen bedeutet das, dass du deine Prozeduren angeben musst, bevor du sie definieren kannst.



Macros

Macros sind definiert #define zu verwenden. Ex:

   #define Noption (x,y,z)      qiQ_Option(z,NAME,x,y,NEUTRAL_REACTION)
Grundsätzlich heisst das, dass du Noption (x,y,z) schreiben kannst, anstatt das beträchtlich längere qiQ_Option(z,NAME,x,y,NEUTRAL_REACTION). Beide Befehle werden jedoch das gleiche machen. Es ist weise Macros zu definieren, die lange Befehlketten beinhalten und die oft verwendet werden. Das Oben genannte ist ein gewöhnlicher Dialog Befehl.

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.



Bits and Pieces

Hier ist ein kleines Dokument, welches beim Mapper beiliegt, dass den Skriptern eine Hilfe sein kann. Bitte folge den Anweisungen in dem Dokument, um deine Skripts verständlicher für andere Leute zu machen (einige der Infos sind vielleicht nicht mehr aktuell, aber immerhin ein guter Startpunkt). Es heisst SCRIPTS.TXT und man findet es im scripts\docs Verzeichnis im Mapper Installation Verzeichnis.
Kommentare:

   /* Das ist ein mehrzeiliges Kommentar.*/
   call /* Das ist ein in-line Kommentar */ function
   // Das ist ein one-line Kommentar.

Wie du sehen kannst, müssen Kommentare in Klammern stehen, während one-line Kommentare zwei Schrägstriche vorangestellt haben. In-line Kommentare müssen in Schrägstrichen stehen.

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:

    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

Um deine Skripts im Spiel verwenden zu können, must du scripts.1st updaten, welche im Spielverzeichnis data\scripts gefunden warden kann und scrname.msg welche man unter data\text\english\game gefunden warden kann.

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 .



Fazit

Ich hoffe, dass es für Jemanden da Draußen eine Hilfe sein konnte. Ich weiss viele werden enttäuscht sein, weil Ich nicht eure Hand halte und euch nicht zeige, wie man Schrittweise ein Skript schreibt.  Wie ich schon am Anfang erwähnte. Ich glaube nicht an solche Lernmethoden. Ich glaube an einen ganzheitlichen Ansatz.

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.

________________________________________________________________________________________________________________________________________


***UPDATE***
Folgende Fehler wurden behoben:

* 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.
« Letzte Änderung: 29. November 2012, 21:36:39 Uhr von Vault 0 Bewohner »

Offline Mr.Wolna

  • Moderator
  • Heilige Granate
  • Beiträge: 7.049
  • >>>FALLOUT4EVER<<<
Re: [Fallout2] Scripting Teil3 (Deutsch)
« Antwort #1 am: 11. März 2009, 19:12:42 Uhr »
Sehr, sehr schön! danke dafür!

edit: aber wo sind die anderen 2 teile?  8)  ;)
RPÜ/German Restoration Project Tanslation
Ich habe ein Gewehr, eine Schaufel und 5 Hektar Land hinter dem Haus. Man wird dich nie finden - leg dich also nicht mit mir an!  
P.s. Nein es ist nicht die Gewalt was mich an der Fallout Reihe gereizt hat,aber sie war immer die Kirsche auf der Sahnetorte ( Und ich will verdammt nochmal ne Kirsche oben drauf haben)

Vault 0 Bewohner

  • Gast
Re: [Fallout2] Scripting Teil3 (Deutsch)
« Antwort #2 am: 11. März 2009, 19:36:53 Uhr »
Kein Problem aber was für andere zwei Teile? ^^
Gebt mir sie, damit Ich sie auch noch übersetzen kann.

Offline Mr.Wolna

  • Moderator
  • Heilige Granate
  • Beiträge: 7.049
  • >>>FALLOUT4EVER<<<
Re: [Fallout2] Scripting Teil3 (Deutsch)
« Antwort #3 am: 11. März 2009, 20:37:59 Uhr »
ahso^^

ahm kein ding vergiss es wider, guter job!  #thumbup
RPÜ/German Restoration Project Tanslation
Ich habe ein Gewehr, eine Schaufel und 5 Hektar Land hinter dem Haus. Man wird dich nie finden - leg dich also nicht mit mir an!  
P.s. Nein es ist nicht die Gewalt was mich an der Fallout Reihe gereizt hat,aber sie war immer die Kirsche auf der Sahnetorte ( Und ich will verdammt nochmal ne Kirsche oben drauf haben)

Offline Mr.Wolna

  • Moderator
  • Heilige Granate
  • Beiträge: 7.049
  • >>>FALLOUT4EVER<<<
Re: [Fallout2] Scripting Teil3 (Deutsch)
« Antwort #4 am: 21. März 2009, 07:40:00 Uhr »
Edeltiere doch mal auch in deinen ersten post, und ein bisschen Textformation würde nicht schaden ;) für die Codesnippets z.B: hast du oben neben Zitat den Codebutton, kommt dann um einiges übersichtiger, siehe Lex oder eins meiner Tuts.  ;) Ansonsten, danke!
RPÜ/German Restoration Project Tanslation
Ich habe ein Gewehr, eine Schaufel und 5 Hektar Land hinter dem Haus. Man wird dich nie finden - leg dich also nicht mit mir an!  
P.s. Nein es ist nicht die Gewalt was mich an der Fallout Reihe gereizt hat,aber sie war immer die Kirsche auf der Sahnetorte ( Und ich will verdammt nochmal ne Kirsche oben drauf haben)