Was ist der beste Weg, um ein Dialogbaumsystem in mein Spiel zu implementieren? Ich möchte, dass ein NPC dem Spieler verschiedene Antworten gibt. Einige werden möglicherweise nur angezeigt, wenn der Spieler einen Gegenstand hat oder ein vorheriges Ereignis aufgetreten ist.
51
Antworten:
Dialogbäume sollten mit XML erstellt werden. Sie speichern die Bedingungen für die Antworten und die Antwort in verschachtelten Bäumen mit einem Verweis auf eine Skriptdatei, wenn Sie etwas Komplexeres tun müssen.
Sie sollten die Skripte und Dialoge getrennt halten, insbesondere wenn Sie ein Rollenspiel zusammenstellen, das eine Menge Konversationen enthält. Sie können dann eine Bibliothek wie simpleXML verwenden, um die XML-Datei zu lesen.
Es gibt eine ähnliche Frage zu SO mit einem Beispiel: https://stackoverflow.com/questions/372915/game-logic-in-xml-files
quelle
Ich würde eine Einbettung einer Skriptsprache wie Lua oder Ruby und die Codierung von Dialoginteraktionen untersuchen.
So könnte ein Dialogskript aussehen:
Dies funktioniert auch gut für die Codierung von KI und anderen einfachen Dingen, die zur Laufzeit optimiert werden können. Sie können sogar einen in Ihre Anwendung integrierten Editor hinzufügen, der beim Ausführen von Debug (oder als Osterei) aufgerufen werden kann.
quelle
Im Spiel Stendhal verwenden wir eine Finite-State-Maschine, um NPCs zu implementieren.
Das folgende Diagramm zeigt ein kleines Beispiel aus dem Tutorial zum Schreiben von Quests .
Zu Beginn befindet sich der NPC im Leerlauf und kann herumlaufen. Ein Spieler kann ein Gespräch beginnen, indem er "Hallo" sagt. Der NPC wechselt in den Status "Teilnahme". In diesem Zustand beantwortet es Fragen zu seinem "Job" und bietet etwas Spiel "Hilfe" an. Der Spieler kann nach einer Quest fragen und der NPC geht zu QUEST_OFFERED und wartet darauf, dass der Spieler diese akzeptiert ("ja") oder ablehnt ("nein").
Wir haben eine Reihe von Bedingungen definiert , die Übergängen zugeordnet werden können. Zum Beispiel ist das Abschließen einer Quest möglicherweise nur möglich, wenn eine PlayerHasItemWithHimCondition erfüllt ist.
Nachdem ein Übergang ausgeführt wurde, kann der NPC Text sagen und / oder eine Aktion ausführen. Ähnlich wie bei den Bedingungen haben wir eine Reihe wiederverwendbarer Aktionen wie EquipItemAction definiert, mit denen ein Spieler eine Questbelohnung erhält.
Mit AndCondition , OrCondition und NotCondition können mehrere Bedingungen kombiniert werden . Normalerweise gibt es eine Reihe von Aktionen, die nach Abschluss der Quest ausgeführt werden müssen, daher gibt es auch eine MultipleActions- Klasse.
Während die eigentliche Implementierung in Stendhal unter der Schwierigkeit leidet, nicht ohne weiteres in andere (menschliche) Sprachen übersetzbar zu sein, finde ich das allgemeine Konzept gut.
quelle
Sie können einen Blick auf das Dlgedit- Tool der Open Source-RPG-Engine Adonthell werfen . Es ist sehr fortgeschritten und sollte alles enthalten, was Sie brauchen (einschließlich Quellen;))
quelle
Ich denke, für das Hinzufügen von Übersetzungen könnten Sie immer noch XML für die Logik verwenden, wie oben angegeben . Wenn Sie in diese Art von Komplexität geraten, sollten Sie Ihr eigenes Dialogwerkzeug schreiben. Ihr Dialogtext wird als Schlüssel zu einer Datenbank gespeichert, die Sie je nach der Sprache, die Sie anzeigen möchten, austauschen können.
Zum Beispiel könnten Sie haben:
Dann müsste der Quest-Text-Renderer "Localize.FixMyCar" durch den entsprechend übersetzten Text ersetzen.
Ihr Tool zeigt das, was der Player sehen würde, in einer auswählbaren Sprache neben dem bearbeitbaren unformatierten XML an.
In ähnlicher Weise könnten Sie so etwas aus dem Beispiel verwenden, auf das Sie verwiesen haben :
Wenn Ihre Schlüssel aussagekräftig genug sind, sollte es kein Problem sein, nicht den vollständigen Text zu haben.
So etwas könnte auch nützlich sein:
quelle
Daten treiben Ihre Charaktere mit LUA-Skripten oder sogar XML-Dateien an. Wenn Sie mit einem NPC interagieren, greifen Sie auf die angehängte Datei zu, lesen Sie sie ein, passen Sie sie auf eventuell ausgelöste Spielvariablen an und erstellen Sie die gültige Antwort.
Der größte Vorteil dieser Vorgehensweise besteht darin, dass Sie den Dialog problemlos bearbeiten, neue Zeichen hinzufügen usw. Sie vermeiden außerdem, Ihre Codebasis mit einer speziellen Logik bei der Behandlung jedes einzelnen Falls durcheinander zu bringen.
quelle
Wenn Sie XML verwenden, stellen Sie sicher, dass Sie ein kleines Tool zum Bearbeiten der XML-Datei erstellen. Sonst wirst du verrückt.
quelle
Verwenden Sie ChatMapper, wenn Sie über einen ziemlich umfangreichen Satz von Dialogfeldern verfügen . Sie haben eine kostenlose Vollversion und das Tool ermöglicht es Ihnen, Ihre Dialogbäume in XML zu exportieren. Ich benutze es und es ist eine hervorragende Möglichkeit, komplexe Dialogbäume zu visualisieren und zu organisieren.
quelle
Wenn Ihre Dialoge komplex sind, ist das Wichtigste, was Sie für die Implementierung von Dialogen benötigen, eine Möglichkeit, die Komplexität Ihrer Interaktion zu verstehen. Ich empfehle einen Node-Editor, um dies zu visualisieren, obwohl ich keine guten offenen Systeme zu empfehlen habe.
quelle
Ich denke, dass Sie Ihre eigene Skriptsprache verwenden, um diese Art von Spiel zu steuern (wenn nicht, sollten Sie dies tun). Erweitern Sie dann Ihr Skript auch für die Handhabung von Dialogen.
Sie können während der Erstellung der Dialoglogik mit anderen Spielvariablen arbeiten. Game Engines sind wie Lego. Sie haben nur Bausteine programmiert und Skript verwendet sie. Es spielt keine Rolle, ob Sie einen Skriptinterpreter oder Compiler erstellen. Aber ein Skript ist immer nützlich.
quelle
Einfacher Automat könnte tun:
Es könnte ungefähr so aussehen:
Im Spiel finden Sie ID und versuchen, ID und die Bedingung abzugleichen.
Sie müssen die Bedingungen und Aktionen modellieren. Durch Objekte, Funktionszeiger, XML ...
Guter Dialogeditor wird auch nützlich sein.
quelle