Dieser Artikel beschreibt die Funktionsweise von Dialogen, sowie die Vorgehensweise zum Anlegen dieser.
Dialoge bestehen aus mehreren einzelnen Dialogblöcken. Die Syntax dieser Dialogblöcke ist wie folgt aufgebaut:
<key> { name=<Charaktername> print=<Dialogtext> short=<Dialogtext> sound=<Sounddatei> next=<key> forb_item=<Itemname> req_item=<Itemname> take=<Itemname> give=<Itemname> <Textur> quest=<Questname> req_quest=<Questname> forb_quest=<Questname> level_min=<Levelnummer> level_max=<Levelnummer> levelup }
Keine Angst vor den vielen Einträgen, zum Funktionieren benötigt man lediglich key, print und name. Der Rest steht für zusätzliche Informationen und Bedingungen.
Die Keys dienen der Benennung der einzelnen Dialogblöcke. Ein Key mit Namen begin definiert den Start-Dialogblock, welcher zu erst abgearbeitet wird. Die geschweiften Klammern definieren Anfang und Ende des Dialogblocks. name= weist dem Charakter den Namen zu, print= seinen Text, den er sprechen soll. sound= gibt die Sound-Datei an, die abgespielt werden soll. next= gibt den Key des Dialogblocks an, der als nächstes abgearbeitet werden soll. Lässt man next= weg, so ist der Dialog im aktuellen Dialogblock zu ende.
Der Sound-Eintrag ist, wie bereits beschrieben, optional. Ist er vorhanden, so wird erst nach Abspielen des Sounds zum nächsten Dialog gewechselt. Ist er nicht vorhanden, so wird eine bestimmte Zeit (abhängig von der Länge des Dialoges) gewartet, so dass der Dialog zu ende gelesen werden kann. Die einzelnen Sound-Dateien befinden sich standardmäßig im Verzeichnis sound/dialog/.
Beispiel:
sound=blarg_name.ogg
Die folgenden Formate werden unterstützt: WAVE, AIFF, RIFF, OGG, VOC. Empfohlen wird Ogg Vorbis, mono, 22050 Hz, 64 kbps (zu erstellen beispielsweise mit oggenc: oggenc --downmix -b 64 -q -1 datei.wav
). OGG Vorbis ist frei, besitzt eine geringe Dateigröße und bietet selbst bei diesen Einstellungen eine ausreichende Klangqualität. Ausnahmen bestätigen mein schlechtes Gehör.
Dialoge können verschiedene Bedingungen enthalten, welche darüber entscheiden, ob der entsprechende Dialogabschnitt angezeigt wird oder nicht.
Das Tragen von bestimmten Items kann sowohl vorausgesetzt wie auch untersagt werden. Zum Spezifizieren von mehreren Items wird das entsprechende Schlüsselwort einfach mehrfach angegeben. Auch ist es möglich, dem Spieler bestimmte Items zu geben (give), oder zu nehmen (take).
Beispiel:
req_item=Nugget req_item=Knochen forb_item=Black Hand
Hier werden die Items Nugget und Knochen benötigt, Black Hand darf jedoch nicht im Inventar vorhanden sein.
Mit dem Schlüsselwort req_item ist es möglich, Itemnamen anzugeben, die der Spieler zum Anzeigen des Dialogs bei sich tragen muss.
fob_item gibt den Namen eines Items an, welches der Spieler nicht besitzen darf.
Zum Geben muss man den Namen des Items angeben, sowie durch ein Leerzeichen getrennt den Pfad zur Textur.
give=Knochenrest items/bone.png
Hier gibt man einfach den Namen des Items an, welches dem Spieler genommen werden soll.
take=Black Hand
Die Schlüsselwörter der Quests funktionieren genauso wie die der Items. Mit dem Schlüssel quest weist man einem Dialogabschnitt den Namen eines Quests zu. req_quest gibt den Namen eines Quests an, das bereits abgeschlossen sein muss. forb_quest gibt ein Quest an, welches noch nicht erfüllt sein darf.
Beispiel:
alphas_quest { name=Alpha print=Hallo Choerbaert! quest=Finde_meinen_Klappspaten quest_req=Kaufe_mir_ein_Eis quest_forb=Alternatives_Quest }
Sobald diese Stelle des Dialoges aufgerufen wird, ist das Quest Finde_meinen_Klappspaten erfüllt. Jedoch kommt man nur an diese Stelle, wenn bereits Kaufe_mir_ein_Eis erfüllt, jedoch Alternatives_Quest noch nicht erledigt ist.
Das Level des Spielers kann eine weitere Bedingung für das Anzeigen eines Dialoges sein. Hierfür gibt es die Schlüsselwörter level_min und level_max. Levelaufstiege erfolgen durch das Setzen des Schlüssels levelup.
Beispiel:
{ ... level_max=0 levelup }
Bei Aufruf dieses Dialogabschnitts wird das Level des Spielers um eins erhöht. Man sollte jedoch immer eine Bedingung mit einführen (hier: das Level des Spielers darf nicht größer 0 sein), da dieser Teil sonst mehrfach aufgerufen werden kann.
Dialoge können verzweigt werden. Dazu gibt man einfach mehrere next=-Zeilen an:
<key> { name=<Charaktername> print=<Dialogtext> next=<key> next=<key> }
Für jeden next-Key überprüft das Programm, ob der referenzierte Dialog Bedingungen enthält und diese erfüllt sind. Andernfalls wird der next-Key einfach ignoriert, beispielsweise wenn ein benötigtes Item nicht vorhanden ist.
Das darauf erscheinende Auswahlmenü zeigt den Text an, der bei den next-Keys mittels print gesetzt wird. Möchte man einen alternativen oder verkürzten Text zur Auswahl anzeigen lassen, so nutzt man das Schlüsselwort short im referenzierten Dialog. Zur besseren Verständlichkeit soll das folgende Beispiel dienen.
begin { name=Alpha print=Hallo Choerbaert! sound=alpha_hallo_bert.ogg next=bert_response } bert_response { name=Bert print=Was? Wer bist du denn? Kennen wir uns etwa? next=alpha_response } alpha_response { name=Alpha print=Sag bloss du kennst mich nicht mehr? next=bert_choice_yes next=bert_choice_no } bert_choice_yes { name=Bert print=Ach, Alpha! Na klar kennen wir uns. short=Doch. } bert_choice_no { name=Bert print=Dich kennen? Nein. Woher denn? short=Noe. }
In der Dialogauswahl, welche bei Teilabschnitt alpha_response angezeigt wird, stehen nun die Optionen „Doch.“ und „Noe.“ zur Auswahl, definiert durch das Schlüsselwort short. Ohne dieses würde der ganze Text des referenzierten Dialoges angezeigt werden (zB „Ach, Alpha! Na klar kennen wir uns.“ statt „Doch.“).