Gedanken zu Dialogen

Ok, ich gebe zu, der Titel ist blöd. In Englisch klingt er besser: Thoughts on Dialogue Systems. Aber das ist halt ein deutscher (und in letzter Zeit ein wenig vernachlässigter) Blog, also gibst blöde, deutsche Titel 😉

Aber nun zum eigentlichen Thema dieses Post: Wie macht ein gutes Dialogsystem? Fangen wir mit den Anforderungen an:

  • Der Spieler muss verschiedene Optionen haben. Es gibt keinen festen Ablauf.
  • Der Dialog wird zwischen dem Spieler und einem oder mehr NPCs geführt. Technisch gesehen ist der Spieler aber auch ein NPC.
  • Zu bestimmten Zeitpunkten sollen Scripte ausgeführt werden können. Möglichst, wenn eine Dialogzeile zu Ende ist.
  • Es soll durch Scripte möglich sein, zu bestimmen, ob eine Dialogzeile angezeigt wird, bzw. den Verlauf des Dialogs zu bestimmen.
  • Es muss einen Editor geben, in dem man die Dialoge erstellt.
  • Die Dialoge sollen über die Content Pipeline geladen werden können.

Ich habe jetzt angefangen, ein eigenes System zu schreiben. Dieses funktioniert auch relativ gut, und es hatte auch eine Integration der Content Pipeline. Nun bin ich aber auf ein Problem gestoßen: Die Auswahl durch den Spieler.

Das Problem: Wenn eine Dialogzeile (d.h. ein Text ohne Unterbrechung durch Scripte o.ä.) angezeigt wurde, hat das Dialogsystem die möglichen nächsten Zeilen ausgelesen, und solange das ActiveScript (das angibt, ob eine Zeile verfügbar ist) ausgeführt, bis es eine Zeile gefunden hatte, die es anzeigen konnte. Wenn es keine mehr gab, war die Dialog zu Ende. Ganz einfach. Zu diesem System habe ich auch schon einen Editor geschrieben, der zwar noch nicht ganz fertig ist, aber schon relativ gute Ansätze zeigt.

Doch wie oben schon angesprochen war das Problem, den Dialog fortzuführen wenn der Spieler eine Option auswählen sollte. Im ActiveScript kann man das nicht machen, weil erst wenn das Script beendet ist wieder ein Update ausgeführt wird, also auf Eingaben reagiert wird. Mögliche Lösung: Multithreading. Ist aber auch mit viel Aufwand verbunden. Andere Möglichkeit: Zeilen die vom Spieler gesprochen werden sind besonders gekennzeichnet (z.B.: Speaker = „[Player]“) und statt dem ActiveScript wird einen Auswahlbox angezeigt. Problem: Fast das gleich wie oben: Was soll man der Textbox sagen, wenn sie nach der nächsten Zeile fragt, aber die noch bestimmt werden muss. Momentane Lösung: Spezieller Returncode, der sie anweist beim nächsten Update nochmal nachzufragen, welches erst auftritt, wenn das Auswahl Fenster wieder zu ist. Das ganze driftet leider momentan in eine extrem unsaubere Lösung ab, und ist auch nur schwer „richtig“ zu machen. Wie man es machen kann sieht man in Neverwinter Nights, bzw. dessen Aurora Engine: Hier ist eine Dokumentation des Dateiformats, und hier eine Erklärung des Editors um sich vom Konzept ein Bild zu machen. (Mit fällt grade auf: Genau wie MassEffect ist NWN auch von Bioware… die haben echt was auf dem Kasten, was RPGs angeht…)

Es muss also eine andere Lösung her! Einen Ansatz gibt es hier: Der Autor hinter diesem Blog hat versucht das Dialogsystem von MassEffect zu reproduzieren. Leider habe ich nie MassEffect gespielt (auch wenn ich das wirklich mal machen sollte… gibst das auch für den PC?), ich kann also nicht sagen, wie gut das das Original trifft, aber es sieht gut aus. Er verfolgt einen etwas andern Ansatz: Verschiedene Zeilen werden zu einem Branch (dt. Ableger) zusammengefasst. Jeder dieser Branches führt zu einem Hub (muss ich jetzt nicht übersetzen, oder? Ich sag nur USB-Hub), das dann eine Auswahl von bis zu 6 weiteren Branches hat. Ein relativ gutes System, das auch sehr gut implementiert ist, inkl. Content Pipeline und Editor. Statt der runden Hubs könnte man eine Auswahlbox nehmen, wie ich sie schon gecodet habe, und jeder Branch hat auch Voraussetzungen, das könnte man zum ActiveScript umarbeiten. Doch der Ansatz mit den Braches gefällt mir nicht… Bei mir würde das zu vielen Ein-Zeilen-Branches führen, denn man muss ja schon einen neuen Branch anfangen, wenn man in der Mitte ein Script ausführen will (wenn es. z.B. anfängt zu regnen, währen man darüber redet).

Wäre ich das hier jetzt schreibe glaube ich eine relativ gute Idee gefunden zu haben: Zeilen, bei denen die folgende Zeile noch nicht feststeht (weil der Spieler sie festlegt) wird der TextboxScreen selber einen SelectionBox anzeigen, und erst dann fortfahren. Das ist eine saubere Lösung, evtl. sind die DialogLines, bei denen man etwas auswählen muss sogar eine abgeleitete Klasse? Damit kann ich mein Code behalten, habe alle Vorteile davon, und trotzdem eine saubere Lösung.

Bei meinem Editor werde ich mich überrings nicht an die Baumstruktur von Bioware halten: Dort muss man Dialoge nämlich kopieren, wenn sie wieder zum Anfang führen sollten. Ich will da keine Sache á Willst du? – Nein – Ach komm schon –  Willst du? – Nein – Ach komm schon – Willst du? – Ja. (Das nennt man dann große Entscheidungsfreiheit ;))

So. Das wars. Ich habe eine Lösung und auch genug geschrieben. Ich hoffe, ich habe euch nicht zu sehr gelangweilt (wenns überhaupt einer gelesen hat…), und kann euch schon verraten, dass ich noch einen, wenn nicht zwei tolle Artikel auf Lager habe, die es in zwei Tagen gibt 😉

11 Gedanken zu „Gedanken zu Dialogen

  1. Hallo Niklas,

    ich habe durch Zufall deine Seite gefunden und muss sagen, interessant. Ich fange gerade mit dem Spieleprogrammieren an und habe mir dazu ein Buch gekauft. Ich werde jetzt regelmäßig auf deinen Blog schauen da ich soetwas gerne lese und mir sicher weiterhilft.

    mfG daniel

  2. Ich habe gerade mit XNA begonnen. C# programmiere ich jetzt schon fast ein Jahr. Ich habe mir ein Buch zu XNA gekauft, leider ist es veraltet. Ich habe schon auf Seite 40 leichte Probleme, da ich AlphaBlendEnable und DepthBufferEnable in XNA 4.0 nicht finde.
    Wie lange arbeitest du schon mit XNA?

  3. Ja ich weiß, aber ich möchte für Windows Phone 7 Spiele schreiben. Es wurde ja einiges geändert.
    Warum funktionieren die Bilder- und Videoseite von tKoD nicht?
    Hätte mich mal interessiert wie das alles aussieht.

    1. tKoD ist schon seit ich mit XNA angefangen hab in Entwicklung, also so seit 2 Jahren. Ich arbeite aber auch nur ab und zu daran, und nicht besonders diszipliniert 😉
      Andere Spiele hab ich noch nicht geschrieben, aber zwei Programme: FastView und SimpleScreenshot, sind beide oben im Projekte Tab. Für XNA kann ich dir auch noch xnamag.de empfehlen, das ist ein großer Forum zu diesem Thema.

  4. Hast du keine Deadline für dein Spiel?
    Ja die Programme habe ich schon gesehen, gefallen mir beide gut.
    xnamag.de muss ich mich noch anmelden, war schon ein, zwei mal auf der Seite.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.