Vorlage:Dialog
| |
Achtung: Du befindest dich in der RPG-Dev-Basis, diese Seite ist Teil der Kategorie RPG-Dev-Wiki:Basis. Änderungen an dieser Seite werden in viele RPG-Dev-Clients nach einem Update ebenfalls übernommen! |
| |
Diese Vorlage zeichnet sich durch ihre hohe Komplexität aus. Wenn du die Auswirkungen genau kennst, kannst du sie bearbeiten. Danach sollte die Vorlage ausführlich getestet werden. |
Ein Dialog ist eine zwischen zwei oder mehreren Personen geführte Unterhaltung. Dem gegenüber steht der Monolog, das Gespräch einer Person mit sich selbst. Diese Vorlage ermöglicht es Monologe und Dialoge mit bis zu zehn Personen zu definieren.
| ToDo: |
|
Variablen die NPCs 1,2,3,4... zwischenspeichern zurücksetzen, da sonst die vorherigen gecachten NPCs angezeigt werden! Könnte am besten auf Array umgestellt werden. Außerdem könnten die im Text einfügbaren NPC-Namen auf dieses array zugreifen um ständiges ausführen von regex zu ersparen. foreachnamedarg kann auch verwendet werden! |
Inhaltsverzeichnis |
Anwendung
Dialoge finden immer dann Anwendung, wenn eine Konversation beschrieben werden soll. Meistens ist dies der Fall auf Seiten die eine Quest oder einen NPC repräsentieren. Ob ein Dialog auf einer Quest- oder NPC-Seite definiert werden sollte ist davon abhängig, ob der Dialog im Bezug zur Quest steht und damit auch der NPC der eine Sprecher-Rolle im Dialog hat austauschbar sein sollte (siehe Hilfe: Arbeiten mit Rollen).
RPG-Dev-Wiki stellt dabei nicht den Anspruch an die Vorlage für jede erdenkliche Dialog-Situation eine semantisch perfekte Lösung parat zu haben. Dialoge können so komplexe Abhängigkeiten haben, dass es oft einfacher ist diese zu umschreiben und es dem Programmierer zu überlassen, einen komplexen Dialog korrekt zu implementieren. Theoretisch wäre jedoch auch ein Skript-Output für die meisten Dialoge möglich wenn die Grund-Semantik eingehalten wird. Ein solcher Skript-Output existiert jedoch nicht nicht und müsste für jedes Spiel individuell angepasst werden.
Kopiervorlage
| Auf Quest-Seiten: | Auf NPC-Seiten: |
|---|---|
Syntax
Das Dialog-System führt eine eigene Syntax ein. Die bekannte MediaWiki-Syntax funktioniert zwar weiterhin auch innerhalb von Dialogen weitgehend, wird jedoch um die Dialog-Befehle erweitert. Dialoge sollten zudem nicht über diese Vorlage implementiert werden, sondern über den <dialog></dialog> Tag.
Dialog und Teilnehmer definieren
Ein Dialog kann theoretisch auf jeder beliebigen Seite definiert werden. Als erster Gesprächsteilnehmer stehen standardmäßig immer der Spieler-Charakter (PC) und ein Platzhalter-NPC (NPC) zur Verfügung. Konkrete Teilnehmer in Form von NPCs können dem Dialog-Tag zusätzlich über die Attribute npc1 bis npc10 zugewiesen werden. NPCs können hier in einer Quest bevorzugt über ihren Rollen-Namen zugewiesen werden. Alternativ kann auch ein Artikel der einen NPC repräsentiert angegeben werden oder irgendein Name oder Ausdruck.
<dialog npc1="R:Bauer" npc2="R:Knecht"> 2: Guten Morgen mein Bauer! 1: Guten Morgen Knecht. </dialog>
In Spielen mit mehr als einem Spiele-Charakter kann über das Attribut pc der Spiele-Charakter definiert werden, der in dem Dialog vom Spieler übernommen werden soll.
Dialogzeilen
Die Syntax für Dialoge funktioniert zeilenweise. Am Anfang jeder Zeile können bestimmte vordefinierte Zeichen(-kombinationen) bestimmte Dialog-Funktionen für eine Zeile aktivieren.
Gesprächszeilen
Gesprächszeilen sind die wichtigsten Dialogzeilen. In einer Gesprächszeile sagt ein Dialogteilnehmer etwas. Es kann sich dabei auch um eine Dialogoption handeln, die dem Spieler zur Auswahl steht. Eine normale Gesprächszeile ist wie folgt aufgebaut:
[Important][Dialogoption][Dialogebene]Person[(Abhängigkeiten)]:
Dialogtext
| Person | ! | # + |
--- | 1 PC NPC |
(#2 A10 B5) | : | Text | Mit das wichtigste an einer Gesprächszeile, die Person die etwas sagen soll. Anstelle hier den Namen oder die Rolle einer Person erneut ausschreiben zu müssen, werden hier für die oben deklarierten Gesprächsteilnehmer npc1 bis npc10 einfach die äquivalenten Zahlen 1 bis 10 verwendet. Soll der Spieler-Charakter etwas sagen, so wird PC verwendet. Ist der Dialog auf einer NPC-Seite deklariert kann einfach NPC verwendet werden ohne vorher einen NPC deklarieren zu müssen. |
| Dialogoption | ! | # + |
--- | 1 PC NPC |
(#2 A10 B5) | : | Text | Wird noch vor der Person # oder + angegeben, so gilt die Dialogzeile als Dialogoption. Es wird unterschieden zwischen permanenten (#) und flüchtigen (+) Dialogoptionen. Permanente Dialogoptionen können immer wieder ausgewählt werden so lange es keine Abhängigkeiten verbieten. Eine flüchtige Dialogoption hingegen kann nur einmal ausgewählt werden. |
| Important | ! | # + |
--- | 1 PC NPC |
(#2 A10 B5) | : | Text | Durch Hinzufügen des Important-Modifikators (!) als erstes Zeichen einer Gesprächszeilendeklaration gilt der Dialog als Important. Das bedeutet dass die Person von der der Dialog ausgeht bei Sichtkontakt mit dem Gesprächspartner den Dialog startet. Zusätzlich gilt die Zeile als flüchtige Dialogoption (+) wenn die Zeile nicht zusätzlich explizit als permanente Dialogoption (#) deklariert wird. |
| Dialogtext | ! | # + |
--- | 1 PC NPC |
(#2 A10 B5) | : | Text | Gibt an was die Person sagt. Als Besonderheit sind hier innerhalb Eckiger Klammern besondere Aktionen möglich:
Außerdem ist es möglich Informationen über die am Dialog teilnehmenden Personen auszugeben, beispielsweise den Namen von npc1 durch |
| Dialogebene | ! | # + |
--- | 1 PC NPC |
(#2 A10 B5) | : | Text | Jedes Minus vor der Person sorgt dafür, dass die Dialogzeile eine Ebene tiefer rutscht. Ohne Dialogebenen-Modifikator ist die Dialogebene Ebene 1. Durch jedes Minus wird 1 dazu addiert. Die Ebene wird visuell dargestellt, zudem ist es durch Ebenen möglich Dialogoptionen unterzuordnen und ineinander zu verschachteln.
Dialogoptionen und -zeilen der ersten Ebene werden ganz ohne |
| Abhängigkeiten | ! | # + |
--- | 1 PC NPC |
(#2 A10 B5) | : | Text | Abhängigkeiten werden hinter der Person in Klammern deklariert. Hier kann optional definiert werden, welche Informationen durch diese Dialogzeile verfügbar werden, welche Informationen für die Verfügbarkeit der Zeile verantwortlich sind und welche ID die Zeile hat. |
Außerdem gibt es die Möglichkeit eine Gesprächszeile mit einer ID zu referenzieren und somit an einer anderen Stelle im Dialog genau so auszugeben. Diese Methode erlaubt auch Dialogoptionen mit ID zu kopieren. In diesem Fall wird der komplette der Dialogoption untergeordnete Dialogbaum mit referenziert. Voraussetzung ist allerdings dass die Zeile als Dialogoption (# bzw. +) markiert wird und die Zeile der referenzierte ID ebenfalls eine Dialogoption ist:
[Important][Dialogoption][Dialogebene][#ID] Zusätzlicher Text
| Referenz | ! | # + |
--- | [#10] | Zusätzlicher Text | Die ID der Dialogzeile die hier referenziert werden soll. |
| Text | ! | # + |
--- | [#10] | Zusätzlicher Text | Steht hier zusätzlicher Text, so wird dieser Direkt an den referenzierten Text angehängt. Für diesen Text gelten die gleichen Möglichkeiten die für den normalen Dialogtext gelten. |
Kommentarzeilen
Kommentarzeilen dienen dazu Anmerkungen zum Gesprächsverlauf zu machen. Sie können erweiterte Informatioenn oder Anweisungen enthalten die beispielsweise speziell für Programmierer gedacht sind. So können besonders komplexe Anweisungen anstelle über Dialog-Syntax implementiert zu werden einfach über eine Anmerkung vorgemerkt werden. Eine Kommentarzeile wird über > Kommentar Text definiert.
Kommentarzeilen beziehen sich standardmäßig auf die nachfolgende Dialogzeile. Das ist wichtig wenn die nachfolgende Zeile eine Dialogoption ist die optisch von den darüber liegenden Zeilen abgetrennt sein kann. Ein Kommentar über einer solchen Option wird optisch korrekt in dem Abschnitt der Dialogoption angezeigt. Wird nach einer Kommentarzeile hingegen eine Leerzeile eingefügt, so bezieht sich der Kommentar auf die vorhergehende Dialogzeile. Vor das > kann außerdem eine Ebenen-Einrückung wie --- gesetzt werden. Zeilen mit Ebenen-Einrückung beziehen sich immer auf die vorhergehende Zeile.
Kommentarzeilen die sich auf eine vorhergehende Zeile beziehen und eine darauf folgende Leerzeile haben werden immer zurück in die erste Ebene gesetzt.
Es bietet sich auch an Kommentarzeilen zu nutzen um dort die Vorlage Vorlage:ToDo einzusetzen um zu beschreiben was an einem Dialog noch fehlt.
Gegenstände übergeben
Um als Spieler einem NPC etwas zu übergeben oder etwas von ihm zu erhalten gibt es normalerweise die Vorlagen Vorlage:Geben und Vorlage:Nehmen. Innerhalb von Dialogen existiert hierfür eine Kurzschreibweise, eine Art syntaktisch erweiterter Kommentar:
- Geben:
-
>NPC> 3x Item, 2*Item 2bzw.>1> Itemum NPC bzw. dem unter npc1 definierten NPC etwas zu übergeben. Die Auflistung der zu übergebenden Gegenstände funktioniert wie in Vorlage:Geben. -
>NPC>NPC> 3x Itembzw.>1>2> Itemermöglicht dass der erste Charakter dem Zweiten etwas übergibt. -
>>PC> Items,>>NPC> Itemsbzw.>>1> Itemswenn ein Charakter etwas aus dem Nichts heraus erhalten soll. Z.B. nützlich für Erfahrungspunkte.
-
- Nehmen:
-
<NPC< 3x Item, 10*Item 2bzw.<2< 3x Itemum von NPC bzw. dem unter npc2 definierten NPC etwas zu erhalten. Die Auflistung der zu übergebenden Gegenstände funktioniert wie in Vorlage:Nehmen. -
>PC> Itemist die alternative Syntax um dem Spieler etwas durch einen NPC zukommen zu lassen. Der NPC der etwas übergibt ist in diesem Fall automatisch npc1 bzw. wenn dieser nicht definiert ist NPC.
-
Natürlich muss die Syntax nicht zwingend verwendet werden, wie fast bei allen Syntax-Feinheiten kann man anstelle dessen auch ein aussagekräftiges Kommentar setzen. Bei Code-Generierung sind Kommentare natürlich nicht interpretierbar.
@-Definitionen
Bei @-Definitionen handelt es sich um einen Dialog-Block dem ein Name zugewiesen wird. Über diesen Namen kann der nachfolgende Dialog an anderer Stelle aufgerufen und angezeigt werden. solche eine Definition kann durch eine Dialogzeile @DEFINITIONSNAME im Code gestartet werden. der gesamte Nachfolgende Dialog inklusive aller Dialogoptionen gehört zu dieser Definition. Erst wenn eine weitere @-Definition eingeleitet wird endet die erste Definition. Somit ist es nur möglich diese Definitionen am Ende, nach allen normalen Dialogoptionen zu definieren.
Eine Sonderfunktion nehmen die @-Definitionen @ENDE und @START ein.
-
@ENDEdient dazu zu definieren, was passiert wenn in einer Gesprächszeile durch[ENDE]der Dialog eigentlich beendet werden soll. Über diese Definition ist es also möglich anstelle das Gespräch zu beenden einen weiteren Dialog zu starten der vor dem tatsächlichen Beenden des Dialogs ausgeführt wird. -
@STARTdient dazu einen Dialog anzuzeigen, der beim Ansprechen eines NPCs zuerst geladen wird. Dies ist auch ohne @-Definition möglich indem anstelle einer Dialogoption zuerst normale Gesprächszeilen definiert werden oder eine Important-Option (!).
In einem Dialog innerhalb einer @-Definition können durchaus auch andere @-Definitionen aufgerufen werden.
Tagebucheinträge Kurzform
Da in Dialogen häufig Tagebucheinträge gemacht werden existiert hierfür eine Kurzform alternativ zur Vorlage Vorlage:Tagebucheintrag. In Dialogen sollte nur die Kurzform verwendet werden. Syntax der Kurzform ist:
[Dialogebene][[%Kategorie] %Topic] %Eintrag
| Eintrag | --- | %Kategorie | %Topic | %Eintrag | Der eigentliche Eintrag den der Spieler sehen soll, wenn er in seinem Tagebuch blättert u. die entsprechende Überschrift (Topic) ausgewählt hat. Handelt es sich um einen Tagebucheintrag für eine Quest, so kann hier auch ein state nach dem Muster [STATE] angegeben werden. Gültige States sind:
|
| Topic | --- | %Kategorie | %Topic | %Eintrag | Der Name des eigentlichen Eintrags. Z.B. Name der Quest wenn in Kategorie Quest eingeordnet. Wird kein Name angegeben wird der Objekt-Name bzw. Seitentitel dafür hergenommen, meist sinnvoll innerhalb von Questseiten. Bei Quests wird automatisch der Quest-Name ermittelt, übergeben werden sollte ein Seitentitel, nicht der Name der Quest selbst. |
| Kategorie | --- | %Kategorie | %Topic | %Eintrag | Gibt an in was für eine Kategorie der neue Tagebucheintrag eingeordnet werden muss. Z.B. Quests für Quest-Updates oder Allgemein für Tagebucheinträge zu allgemeinen Infos wie gefundene Händler oder Trainer die zur Info u. Erinnerung für den Spieler dienen. Wird keine Kategorie so ist Quests die Standardkategorie. Die Verwendung folgende Abkürzungen ist möglich:
|
| Dialogebene | --- | %Kategorie | %Topic | %Eintrag | Die Dialogebenen funktionieren hier genau so wie in Gesprächszeilen. Sie sind nur notwendig wenn ein Tagebucheintrag nach einer Dialogzeile einer tieferen Ebene als 1 eingetragen werden soll. |
Abhängigkeiten im Detail
Abhängigkeiten sind Teil der Gesprächszeilen-Syntax. Hinter dem Konzept der Abhängigkeiten steht jedoch mehr als die dort beschriebene Syntax. Dieses Konzept zu verstehen ist wichtig um umfangreiche Dialoge beschreiben zu können.
A und B Abhängigkeitssystem
Das Grundprinzip ist, dass es Auslöser und Abhängigkeiten gibt. Der Auslöser 10 kann durch A10 z.B. in einer Dialogzeile +PC(A10): Hallo! definiert werden. Man kann sich diesen Auslöser als eine Information vorstellen die durch die Dialogzeile verfügbar wird. Eine andere Dialogoption soll erst verfügbar werden, wenn diese Information A10 bekannt ist. Hierzu wird eine Abhängigkeit B10 z.B. in einer Dialogzeile +1(B10): Guten Tag! verlangt. Die Dialogoption ist in diesem Fall erst Verfügbar sobald eine Dialogzeile durchlaufen wurde die A10 bekannt macht.
Ebenfalls häufig benötigt ist die Möglichkeit eine Gesprächszeile nur dann anzuzeigen, wenn ein bestimmter Auslöser noch nicht bekannt ist. Das funktioniert durch das Negieren der Abhängigkeitsanforderung (!B10).
Wichtig ist, dass alle definierten Auslöser nur pro Wiki-Artikel gelten. Sie sind also nur innerhalb einer Quest- oder NPC-Seite bekannt und nicht Wikiweit. Hierfür gibt es das Prinzip der Inputs & Outputs das durch Vorlage:INPUT und Vorlage:OUTPUT realisiert wird.
IDs
Den Auslösern ähnlich sind die IDs. Jede Gesprächszeile kann durch eine eindeutige ID ausgezeichnet werden, z.B. PC(#5): Text.. Eine ID darf immer nur einer Gesprächszeile zugeordnet werden. Sie kann wie normale A-Auslöser auch als Abhängigkeit verwendet werden, z.B. PC(B#5): Text.. IDs dienen aber in erster Linie dazu, Gesprächszeilen insbesondere Dialogoptionen zu referenzieren und an anderer Stelle einzufügen (z.B.: +--[#5]).
Anwendung
Im Abhängigkeiten-Feld können beliebig viele Auslöser definiert, Abhängigkeiten gefordert und gleichzeitig IDs definiert werden. So wäre theoretisch die Gesprächszeile +--2(#20 A1 A5 B3 !B5): Text ohne weiteres möglich. Existieren Abhängigkeiten unter Gesprächszeilen von Dialogen einer Seite so werden diese Abhängigkeiten auch Visuell unterstützt. Voraussetzung dafür ist aktiviertes JavaScript im Browser. Wenn sich der Mauszeiger über einer Gesprächszeile mit Abhängigkeit befindet wird diese farblich hervorgehoben und alle abhängigen Dialogzeilen so wie alle auslösenden Zeilen werden ebenfalls farblich markiert. Außerdem werden durch das gedrückt halten von Shift ⇧ alle Dialogzeilen mit Abhängigkeiten hervorgehoben. Durch zusätzliches Drücken der Eingabetaste ↵ wird die Hervorhebung eingerastert bis erneut shift gedrückt wird.
Beispiele
Da die Anwendung des Dialog-Systems durch praktische Beispiele wohl am schnellsten verständlich wird folgen hier einige ausgewählte Beispiele für mögliche Dialoge.
Dialog-Ebenen
Für weniger komplexe Verschachtelungen von Dialogen bietet es sich an, diese einfach visuell einrücken zu können, wie in folgendem Beispiel:
<dialog npc1="R:Bauer"> +PC: Was kosten diese Äpfel? 1: Nichts, du kannst einen haben wenn du willst. +-PC: Immer her damit! -1: Hier, bitteschön. <1< Apfel -PC: Danke! +-PC: Und wo ist der Wurm dabei? -1: Kein Wurm. Wunderbare Äpfel. +--PC: Na gut, dann nehme ich doch einen. --1: Da, das ist der schönste von allen! <1< Wunderschöner Apfel --PC: Danke! +--PC: Das kannst du wem anders aufbinden, ich gehe. --1: Wer nicht Will, der hat schon... >Gleicher Dialog mit Birnen statt Äpfeln: +PC: Was kosten diese Birnen? +PC: Was kosten diese Bananen? 1(A10): Die stehen nicht zum Verkauf! +PC(B10): Ich geb dir 50 Gold für eine Banane. 1: Ok, hier. <1< Banane >1> 50x Gold </dialog> |
|
Stinkiger Bauer
Dieses Beispiel bietet einige Abhängigkeiten und Sprungmarken, außerdem ist hier zu sehen dass nicht alles über Syntax gemacht werden muss, auch Kommentare haben ihre Berechtigung. Das Beispiel besteht aus zwei Dialogen mit der gleichen Person, die an zwei Stellen in der Spielwelt instanziert ist.
<dialog npc1="R:Bauer"> > Sobald sich der Spieler <1> nähert... !1 (A10): Hey, was machst du auf meinem Acker? +-PC: Keine Ahnung, muss mich wohl verlaufen haben. -1 (A20): Hast du ein Glück, dass die Ernte schon futsch is! -> A20 exklusiv durch diese Auswahl! +-PC: Siehst du doch, ich trample die Ernte platt! 1: Wie auch immer, schau dass du weiter kommst! [ENDE] > Wenn <1> erneut angesprochen wird: #1 (B10): Verschwinde hier! @Ende: 1: Und lass dich hier bloß nicht mehr blicken! </dialog> |
|
Wenn man den Bauern auf seinem Hof trifft:
<dialog npc1="R:Bauer"> #1 (!B10): Wer immer du bist, zieh Leine! [ENDE] !#1 (A30, B10, !B40): Du schon wieder! Was willst du hier? +-PC: Nur mal sehen was hier los ist. -1: Nichts ist hier los. [zurück] +-PC (A40): Hast du was zu verkaufen? -1: [HANDELN], [ENDE] +-PC (B20): Nehme an du bist schlecht drauf wegen der Ernte? -1: Mein Trottel-Knecht hat im Frühjahr die Saat vertauscht. -1: Ungenießbares Spinn-Kraut. Mach damit was du willst. % <1> hat ein Feld voller Spinn-Kraut das er nicht braucht. > Bauer-Instanz vom Feld entfernen #PC (B40): Zeig mir deine Ware! [HANDELN] #PC (B40): Alles ok? 1: Könnte besser sein. @HANDELN: > Handelsinventar öffnen. > Wenn etwas gekauft wurde: #1: War mit ein Vergnügen Geschäfte mit dir zu machen. > Ansonsten: #1: Verschwende nicht meine Zeit! [ENDE] </dialog> |
|
| |
|