|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Interaktive Dialoge |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Beispiele und Anregungen was gemacht werden kann. Es empfielt sich größere Projekte auf Papier zu bringen und sie dann in den Editor einzutragen. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
1. eine Dialogschleife |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Angenommen du hast 3 Dialoge für die Entity Nr. 001 (ent001.dat) geschrieben. Nun wird im dritten Dialog bei "another Entity" unter Input '1' und unter Entity auch '1' eingetragen. Übrigens, der Begriff "another Entity" (eine andere Entity) ist schlecht von mir gewählt. Es kann natürlich auch die gerade zu bearbeitende Entity verändert werden. Wie in diesem Beispiel. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Was passiert? Dialog Nr.1 wird abgespielt. Danach Dialog Nr. 2. Beim dritten Zusammentreffen von Player und NPC läuft der dritte Dialog. Dabei wird der Input der Entity Nr. 001 zurück auf '1' gestellt. Zu sehen in der letzten Zeile der oben stehenden Tabelle. Eine Schleife ist entstanden. Kommt der Player ein viertes Mal zur Entity beginnt wieder Dialog 1. u.s.w. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Wäre in diesem Beispiel nichts in "another Entity" eingtragen worden hätte die Entity nach Dialog eins und zwei den dritten ständig wiederholt. Das wäre dann ein linearer Dialog gewesen. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
2. ein NPC ändert den Dialog durch Ereignis mit einem anderen NPC |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Du hast zwei Entitys. NPC Nr. 001 (ent001.dat) wurde mehrmals besucht. Zuerst erzählt er das ihm etwas verloren gegangen sei. Es wäre toll wenn du es ihm bringen könntest. Beim nächsten Besuch fragt er noch mal kurz ob es was neues gäbe und du was gefunden hast. Leider noch nichts. Beim dritten Besuch murmelt er nur noch enttäuscht vor sich hin. Du besuchst einen andern NPC Nr. 099 (ent099.dat) und dieser verrät dir das er genau diesen Gegenstand gefunden hat. Er gibt ihn dir. Toll!. Zurück zur ersten Entity und ihm das verlorene wiedergebracht. Er bedankt sich, es gibt eine fette Belohnung. Du besuchst ihn noch ein fünftes mal (noch ne Belohnung abholen, vielleicht hat ja der Programmierer des Games geschlafen) aber nun wird nur noch "Hallo wie gehts" gesagt. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
So sieht das Schema für die beiden Entitys aus. Entity Nr.001 hat etwas verloren und jammert 3 Dialoge darum es zu finden. Nach dem dritten Dialog darf es nicht zum nächsten Dialog gehen, denn der enthält ja den Belohnungstext. Deshalb wird im dritten Dialog der ANOTHER ENTITY Input von Entity Nr.001 auf '3' gestellt.Beeinflusst werden soll die gleiche gerade aktive Entity, also wieder Entity Nr. 1. (Das steht alles in der dritten Zeile der Tabelle für Entity Nr. 001.) Da der NPC das bei jedem neuen Dialogversuch macht wird nun ständig Dialog Nr. 3 gezeigt. Endlich ist NPC Nr.099 gefunden. Dieser erzählt im ersten Dialog vom Fund und gibt ihn dir. Gleichzeitig wird unter ANOTHER ENTITY der Input von Entity Nr. 1 auf den vierten Dialog gesetzt. (zweite Zeile der Tabelle für Entity Nr.099) Besucht man Nr.099 ein zweites mal sagt sie noch was anderes in Dialog 2 und das wird dann ständig wiederholt. Also ab zur ersten Entity. Hier ist ja nun der Dialog 4 angewählt. Die Dankesrede folgt. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
3. ein NPC ändert den Dialog wegen anderer Ereignisse im Game |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Eins ist klar. Es ist unmöglich alles in einen Editor zu packen und per Knopfdruck zu programieren. Deshalb ist es möglich die Dialogreihenfolge auch außerhalb des Editors zu ändern. Mit deinen eigenen Scripts kannst du jeden beliebigen Dialog einer/mehrerer oder aller deiner NPC's anzeigen lassen. Du kannst Text nach Zeit anzeigen oder bei betreten von Gebäuden u.v.m., das hängt von dir ab. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Das Prinzip ist einfach. In einem Array ist die nächste zu spielende Dialognummer eines jeden NPC/Entity abgespeichert. Das ist alles. Wenn man auf das Array zugreifen kann ist alles manipulierbar. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Was passiert wenn der Player auf einen NPC trifft? |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
1. Der Player scannt eine Entity. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
2. Die der Entity zugehörige ENTITY Nummer wird aus einem der 48 Entityskills gelesen. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
3. Diese ENTITY Nummer ist gleich dem Namen der zugehörigen "entXXX.dat" Datei. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
4. Soll ein Dialog gestartet werden wird diese Datei vollständig eingelesen. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
5. Auch ENTITY Nummer und Arrayposition des nächsten zu spielenden Dialoges ist gleich. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
6. Die nächste Dialogzahl wird aus dieser Arrayposition ausgelesen. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
7. Der Dialog mit dieser Nummer wird vollständig abgespielt. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
8. Die nächste Dialognummer wird in das Array geschrieben. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Ein Array kann bei 3DGS A6 mit maximal 500 Startwerten gefüllt sein. Da ich aber rund 1000 Entitys verwalten will benötige ich zwei Arrays. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
dia1_array managt die nächste Dialognummer für Entity Nr.1- 499, dia2_array managt die nächste Dialognummer für Entity Nr. 500- 998. Du kannst beide Arrays in der "dialog.wdl" Datei sehen. Sie sind gefüllt mit '1' an jeder Position. Das heißt, zu Beginn des Games startet jeder NPC mit Dialog 1. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Ein Beispiel: Der Player läuft über einen Gegenstand und hebt ihn auf. Ein NPC soll das erkennen und ihn gezielt darauf ansprechen. Die Funktion des Gegenstand findens müßt ihr natürlich selbst scripten. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Der NPC hat die ENTITY Nummer 321 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
In der Funktion die durch das finden und aufheben des Gegenstandes ausgelöst wurde könnte dann folgender Dialogcode stehen. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
//"filenumber", "dia1_array" und "dia2_array" sind vordefiniert durch die "dialog.wdl" |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
var next_dialog; //nächste Dialognummer, nur ein Beispiel |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
filenumber = 321; //die ENTITY Nummer des gewünschten NPC Models, in einem von 48 SKILL im WED |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
next_dialog = 6; // der 6. Dialog kommt als nächster |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
if(filenumber < 500) { |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
dia1_array[filenumber] = next_dialog; |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
} |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
if(filenumber >= 500) { |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
dia2_array[filenumber - 500] = next_dialog; |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
} |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Das wars. Sobald der Player NPC Nummer 321 trifft wird dessen Dialog Nr.6 abgespielt und darin vom Fund berichtet. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Diese drei Beispiele zeigen das doch einiges möglich ist. Allerdings bei komplexen Geschichten kann es echt kompliziert werden bei all den Inputs. Um den Überblick nicht zu verlieren empfiehlt sich eine Aufstellung in Tabellenform. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Datenformat einer Dialogdatei |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Mit Hilfe des Editors können die kompletten Dialoge eines Games erstellt werden. Für jeden NPC wird eine separate Datei erzeugt mit folgendem Format. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
entXXX.dat XXX = 001-996 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Die Extension "dat" ist nur willkürlich gewählt. Es sind reine Textdateien. Es findet also keine Verschlüsselng der Dialoge statt. Du kannst die Extension nach Abschluß des Projektes ändern. Natürlich müßen dann die entsprechenden Zeilen der beiliegenden Scriptdatei auch geändert werden. Der Editor jedoch läuft nur mit der "dat" Extension. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Aufbau einer Dialogdatei |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
( 000 255 000 entityname) [ 1 002 014 008 02 ] |-------- |--------- | --------- [ 1 003 000 000 03 ] ................... |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Du kannst diese Dateien auch mit einem normalen Texteditor ändern oder komplett neu schreiben. Wichtig ist dann, das die Zeilenzahl eines jeden Dialogparts teilbar sein muß durch die Anzahl der Zeilen der Textbox (LINES). Hat ein Dialogpart weniger Zeilen muß die Differenz mit einem Zeichen für Zeilenumbruch ausgeglichen werden. Besteht die Textbox im NPC Editor z.B. aus 7 Zeilen dann hat jeder damit erstellte Dialogpart 7 Zeilen oder ein vielfaches davon. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Aufbau der "diabasic.wdl" |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Innerhalb des Editors können verschiedene globale Einstellungen geändert werden, die nach Beenden des Programmes in einer "diabasic.wdl" abgespeichert werden. ACHTUNG !!! Die Datei darf nicht von ausserhalb verändert werden, mit Ausnahme der Werte hinter den Defines. Alle anderen Zeichen, Kommentare e.t.c. nicht verändern, da diese Datei nach NPC Editorstart intern editiert wird. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
mehrere Projekte verwalten |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Das ist einfach. Schneide die "diabasic.wdl" und sämtliche erstellte entXXX.dat Dateien aus dem Verzeichnis des Dialogeditors aus und kopiere sie in ein Verzeichnis deiner Wahl zur Zwischenlagerung. Wird der Editor nun gestartet befindet er sich wieder in der Ausgangsstellung und ein neues Projekt kann gestartet werden. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Mirek Thier (Lolek) August 2003 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|