Autor Thema: [Fallout2] Scripting Teil3 - Befehle, Makros, Prozeduren, Variablen, Ops, Header  (Gelesen 11887 mal)

Offline Lexx

  • Administrator
  • Auserwähltes Wesen
  • Beiträge: 17.726
Das Originaltutorial wurde von Lisac2k geschrieben. Und kann hier gefunden werden. Ich habe mir lediglich die Freiheit genommen, dass ganze ins deutsche zu übersetzen.



Scripting Tutorial - Befehle, Makros, Prozeduren, Variablen, Operatoren, Header.

Ich empfehle euch, sich zuerst diese Tutorial reinzuziehen. Währe jedenfalls angebracht... falls ich Lust und Laune hab, übersetz ich das auch noch. Oder ich versuch es zumindest...


Grundlagen der Fallout Scripte:

1. Befehle

Wie schonmal erwähnt, kann eine Liste aller Befehle in der "Fallout_Editor.doc" gefunden werden. Diese Datei sollte sich normalerweise im FO2 Mapper Verzeichnis befinden. Es währe angebracht, wenn ihr euch etwas Zeit nehmen würdet und euch das Ding mal durchlest. Einige der Befehle sind leicht zu verstehen, andere wirken Chaotisch. "Was macht das?" wirst du dich wohl während dem Lesen fragen... aber nicht vergessen! Wir haben einen haufen FO2 Original Scripte, von denen wir lernen können.

Eines wirst du wohl dann wohl schon festgestellt haben. Manche Befehle sind recht lang und auch nicht einfach zu schreiben oder zu verstehen. Die Lösung für das Problem heißt "Makros erstellen"!

2. Makros

Ich denke, wir brauchen keine eigenen Makros erstellen, da das die BIS Jungs für uns getan haben. MAKRO ist eine kurze Version eines Befehls. Schauen wir uns mal an, wie´s denn funktioniert...

Beispiel: Entsprechend der "Fallout_Editor.doc" liest bzw. checkt dieser Befehl den Status eines Critters.

get_critter_stat
   int Critter
   who (ObjectPtr)
   stat (int)

So... stellen wir uns vor, wir wollen die aktuellen Hit Points eines Critters überprüfen.
Dieser Befehl sollte wie folgt aussehen:

(get_critter_stat(self_obj,STAT_current_hp))

(Befehl(Critter(Variable "self_obj" Punkte zu einem spezifischen Critter),Status selbst(Integer Nummer!!))

Jetzt wette ich, dass das vollständig verwirrend aussieht. Ich erkläre das später, aber als erstes sehen wir uns an, wie wir diesen Befehl kürzer machen können.

Es gibt EINE LISTE aller VORGEFERTIGTEN MAKROS von BIS. Zu finden in der "command.h" im Mapper Verzeichnis \scripts\HEADERS\command.h - Als Makro ist fast jeder Befehle oder jede Abwandlung in dieser Datei zu finden.

Wenn du über die Datei fliegst, kannst du folgende Zeile finden:

#define self_cur_hits (get_critter_stat(self_obj,STAT_current_hp))

DEFINE wird dafür gebraucht, ein Objekt zu definieren. (Nur wenn es noch nicht definiert wurde!), damit die Engine auch etwas damit anfangen kann. (Sonst ist das Objekt unbekannt)
Dies wird in den Scripten öfters benutz, also merkt euch, was hier drinn steht.

Dieses Makro erlaubt uns, einfache Befehle anstelle von sehr langen und komplizierte zu schreiben. Nett, huh?

Die meisten Makros können in den Header-Dateien gefunden werden. (siehe am Ende des Tutorials)

3. Prozdeduren

Die Makros würden in deinem Script verloren gehen, wenn es keine kontrollierte und organisierte Struktur geben würde. Dafür gibt es die Prozeduren.

Prozeduren sind kleine Abschnitte in den Scripten, die jeweils eine Aufgabe haben. Jede Prozedur muss einen Namen haben, zum Beispiel: procedure Kick_ass
Einige Namen sind auch RESERVIERT, wie diese:

procedure start;
procedure critter_p_proc;
procedure pickup_p_proc;
procedure talk_p_proc;
procedure destroy_p_proc;
procedure look_at_p_proc;
procedure description_p_proc;
procedure use_skill_on_p_proc;
procedure damage_p_proc;
procedure map_enter_p_proc;
procedure map_exit_p_proc;
procedure timed_event_p_proc;


Diese Prozeduren haben alle eine spezielle Aufgabe im Spiel. Beispiel: "procedure talk_p_proc" startet IMMER einen Dialog. In anderen Worten, es wird NUR immer für Dialogzwecke benutzt.

Prozeduren werden auch für Dialog-Strukturen benutzt!
Diese haben Namen wie:

procedure Node001;
procedure Node002;
procedure Node003;
...
procedure NodeXYZ;


Diese Prozeduren werden von anderen Prozeduren abgefragt und repräsentieren "Nodes" in Dialog-Bäumen.
Beispiel (Eldridge, Waffendealer in New Reno):

procedure talk_p_proc begin
   if (eldridge_bed_time) then begin    //If Eldridge sleeps, go to Node 30!
      call Node030;
   end else begin    //In any other case, go this way
      prev_node := 0;   //Simple variable, forget it for now
      give_eldridge_box(new_reno_eldridge_box)   //Gives Eldridge inventory from his box
         start_gdialog(NAME,self_obj,4,-1,-1);   //NAME == Eldridge, self_obj == object whom this script belongs
                                                //(Eldridge), mood, head art, background picture
         gSay_Start;   //Starts a new dialog sequence.

Und so weiter...

Ich denke, du hast bereits bemerkt, dass alle Befehle mit einem ";" Zeichen enden. Merk dir das! Ansonsten gibt´s ne Menge Probleme (Fehler) beim Compilieren.

Noch was: Kommentare werden "// Test" oder "/* Test */" geschrieben. Du solltest am besten jeden deiner Schritte kommentieren. Das macht die Sache später für dich und - viel wichtiger - anderen sehr viel einfacher und übersichtlicher!

Jede Prozedur sollte am Script Anfang deklariert werden! Siehe in den original FO2 Scripten
Prozeduren starten mit "CALL"! Siehe in den original FO2 Scripten.
Prozeduren müssen mit "BEGIN" anfang und mit "END" aufhören! Beispiel:

procedure look_at_p_proc begin
script_overrides;
display_mstr(100);
end

Das Arbeiten mit Prozeduren und das Debuggen (Fehlerbeheben) sollte gründlich sein.
Es gibt ein ganzes Bündel an Prozeduren in den original Scripten. Sieh sie dir gut an und lerne! Natürlich ist einfaches copy&paste immer willkommen und wenn du etwas editieren willst, erstellst du ein Script in kürzester Zeit... vielleicht noch nicht jetzt gleich, aber wenn man in der Sache erstmal drinn ist...

4. Variablen

Variable sind Datentypen, die einen bestimmten Wert "tragen" können und irgendwo anders wieder ablegen (ausgeben) können. Ein Beispiel:

lisacs_inventory;
temp;
prev_node;
und so weiter...

Wir können der Variable einige Werte zuweisen. So  z.B.:
temp := 8;

Oder so:
temp := lisacs_inventory;

(Mehr über Operatoren später)

Wie auch immer, dies sind nur temporäre Variablen (kurz: var) für ein Script. Sie werden vom Script beachtet, aber nicht gespeichert. Andere, wichtigere Variablen, welche auch gespeichert werden (z.B. in einem Spielstand) sind:

a) GVARs (Globale VARiable) - werden im GESAMTEN SPIEL von der Engine erkannt werden.
b) LVARs (Locale VARiable) - werden NUR in speziellen Scripten erkannt werden.
c) MVARs (Map VARiable) - werden nur in speziellen Maps erkannt bzw. beachtet.

Alle Vars (kurzform für Variablen) können eine Integer Nummer oder einen String als Wert tragen. (man sollte zu Integer tendieren, da wir damit alles machen können, was wir brauchen.)
Alle Vars sind in folgenden Dateien aufgeführt: GLOBAL.H (für GVARs) und MAPNAME.H (für MVARs). Manname = Neme der speziellen Map, z.B. "ARBRIDGE" für "ARBRIDGE.H".
Die Localen Variablen sind in den Scripten definiert. GVARs und MVARs sind in den oben erwähnten Dateien, manchmal auch in anderen "*.H" (Header) Dateien. (Hausaufgabe = findet es selbst heraus!).

Alle Variablen müssen am Anfang des Scripts DEFINIERT werden, damit das Spiel weis, dass diese existieren! Ein Beispiel:

#define LVAR_Herebefore (4)
Definition of temp vars is even simpler, example:
variable starttile := 0;

5. Operatoren

Das ist jetzt nicht wirklich schwer :>

> (größer als)
< (kleiner als)
>= (größer oder gleich)
<= (kleiner oder gleich)
== (gleich)
!= (ungleich)

Manchmal siehst du den Operator ":=". Dieser wird von temporären Variablen als Gleichungszeichen verwendet.

6. Header

HEADERS sind Dateien mit einem *.H am Ende. Siehe in deinem "FO2 Mapper\scripts\HEADERS" Verzeichnis. Sie enthalten eine ganze Reihe nützlicher Informationen und Raffinessen für das Spiel selber und(!) für uns Modder. Beispiel:

AIPACKET.H beinhaltet Informationen über die künstliche Intelligenz der Critters im Spiel. CARAVAN.H über die Karavanen GVARs und ITEMPID.H über die persönlichen ID´s der Items. (es ist aber einfacher mit den Namen zu arbeiten, als mit den Nummern.

Es wird sehr empfohlen, alle Header Dateien mindestens einmal zu checken, was wo, wie und warum ist.

Wenn du einige Inhalte von den Header Dateien benutzen willst, musst du sie in dein Script "includen". Das macht man mit einem "#include" Befehl, folgendermaßen:

#include "..\headers\define.h"
#include "..\headers\v15ent.h"

Typische Header die in den original Scripten included wurden, sind "command.h" und "define.h". Das sind die wichtigsten. Compiler Fehler können auch dadurch entstehen, dass ein bestimmter Header nicht "included" wurde. Also sei dir wirklich sicher, dass du alles "includest", was du für dein Script brauchst.

--------------------------------------------------------------------------------------------

Dies beinhaltet jetzt die meisten Dinge, die du für das editieren von bereits existierender Scripts benötigst. (oder für das schreiben neuer Scripte, wenn du talentiert bist.) :>


Tipp: Sieh dir alle Dateien in deinem FO2 Verzeichnis tausendmal an und sieh nach, wo du welche Dateien finden kannst. Zu wissen, wo man welche Dateien finden kann, sollte für einen Modder pflicht sein.


Und wie immer: Bei Fragen, Problemen oder sonstigem, ich bin da. :>
« Letzte Änderung: 28. Januar 2006, 23:39:59 Uhr von Projekt »
only when you no-life you can exist forever, because what does not live cannot die