Dialogue scripting tutorial
Durchaus haben einige Leute aus diversen Fallout modding Foren nach Hilfe beim Scripten gefragt. Ich schrieb bereits eine Übersicht über das Hauptkonzept des Scriptens, welches hier (Link leider tot 
Um einen Dialog für einen Charakter zu schreiben, benötigst Du zwei Dateien. Eine wird die Text Datei sein, die den gesamten Dialogtext beinhalten wird, die andere wird das Charakter Script sein, welche entscheidet, wann der Char wann was sagt. Sie werden beiden den selben Namen tragen, die Textdatei wird aber mit der Endung .msg und die Scriptdatei mit .int enden. Die Textdatei wird im Pfad data\text\english\dialog im Fallout Hauptverzeichnis zu finden sein. Die Scriptdatei hingegen wird unter data\scripts zu finden sein.
Die Textdatei wird folgendermaßen aussehen:
Code: Select all
{100}{}{A line of dialogue}
{101}{}{Another line of dialogue}
und so weiter. Es ist egal in welcher Reihenfolge die Dialoge stehen, wichtig ist, dass die Zeilennummern einmalig sind. Das ist der leichte Teil. Das Script entscheidet, welche Dialogzeilen wann angezeigt werden. Das ist der schwierige Teil.
Das erste was Du in dem Script brauchst ist eine talk_p_proc procedure. Die Prozedur wird abgerufen, wenn der Spieler versucht eine Konversation mit einem Critter zu starten. Die Grund Prozedur sieht wie folgt aus:
Code: Select all
procedure talk_p_proc begin
start_gdialog(NAME,self_obj,4,-1,-1);
gSay_Start;
call Node001;
gSay_End;
end_dialogue;
end
Du kannst im Mapper Handbuch nachschauen, was die einzelnen Befehle machen, das wichtigste aber, ist die Zeile
Code: Select all
call Node001
Das hier wird die Prozedur aufrufen, die den Dialog starten wird. Also schreiben wir eine Prozedur, die call Node001 heisst.
Code: Select all
procedure Node001 begin
Reply(100);
NOption(101,Node999,004);
end
Die Ziele Replay(100) sagt aus, dass der NPC die Zeile 100 aus der Textdatei sprechen wird. NOption(101, Node999, 004) bedeutet, dass der Spieler die Option besitzt die Zeile 101 zu wählen, wenn seine Intelligenz größer als 4 (004)ist, nach dem wird die Prozedur Node999 aufgerufen. Prozedur Node999 ist immer die Prozedur, welche den Dialog beendet. Wir haben nun einen kompletten (obgleich sehr kurzen) Dialog! Lass uns nun eine weitere Prozedur schreiben:
Code: Select all
procedure Node002 begin
Reply(103);
NOption(104, Node999, 004);
end
Code: Select all
procedure Node001
Code: Select all
procedure Node001 begin
Reply(100);
NOption(102,Node002,006);
NOption(101,Node999,004);
end
In Node001 hat der Spieler nun die Möglichkeit Zeile 102 zu wählen, wenn seine Intelligenz größer als 6 (006)ist. Wenn er sich für diese Option entscheidet, dann wird Node002 aufgerufen, worauf der NPC mit Zeile 103 antwortet, darauf kann der Spieler nur mit Zeile 104 antworten. Das ist im Grunde alles, was es da zu sagen gibt. Dialoge schreiben ist eigentlich nur Nodes im Dialogbaum miteinander zu verbinden.
Hingegen, Noption und eine Anzahl von Dialog verwandten Befehlen sind Befehle der gSay/giQ Familie. Hier ist eine komplette Beschreibung der wichtigsten gSay Befehle:
Code: Select all
Name: gSay_Message
Returns: void Dialog
Arguments:
msg_list (int)
msg_num (int)
reaction (int)
Setzt eine sayMessage auf, welche eine Anwort mit einer [Done] Option ist. Die msg_list entscheidet, in welche Nachrichten Datei geschaut werden soll und msg_num entscheidet welche Zeile in dieser Datei verwendet werden soll.
Code: Select all
Name: gSay_Option
Returns: void Dialog
Arguments:
msg_list (int)
msg_num (int)
target (procedure)
reaction (int)
Setzt eine Optionen-Wahl für einen Antworten-Block. Wenn man den string (Schnur/Faden) von der Nachrichten Datei (msg_list) und Nachrichten Nummer (msg_num) erhält, verursacht es eine gegebene Reaktion (reaction) und, wenn Ausgewählt springt es zu der Prozedur (target).
Code: Select all
Name: gSay_Reply
Returns: void Dialog
Arguments:
msg_list (int)
msg_num (int)
Setzt einen Antworten-Block (Was der *CRITTER* sagt).
Code: Select all
Name: giQ_Option
Returns: void Dialog
Arguments:
iq_test (int)
msg_list (int)
msg_num (int)
target (procedure)
reaction (int)
Setzt eine Option-Wahl für einen Antworten-Block, wenn der Intelligenzquotient des Spielers gleich zu oder größer als ein gegebenen Wert ist (iq_test). Wenn man den string (Schnur/Faden) von der Nachrichten Datei (msg_list) und Nachrichten Nummer (msg_num) erhält, verursacht es eine gegebene Reaktion (reaction) und, wenn Ausgewählt springt es zu der Prozedur (target).
___________________________________________________________________________________________________________________________________________________
©2003-2004 Daniel Sjöblom
mail me! dsjoblom@mbnet.fi
Dies ist lediglich die Übersetzung ins Deutsche. Der Originaltext kann hier (Link leider tot

Viel Spass und Glück beim Dialoge schreiben.

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