# Dialog in RPG



## leibimatZe (26. Mai 2009)

Hallo ihr alle 

ich stöber schon lange hier im Forum herum und les mir den einen oder anderen Beitrag durch und endlich habe ich es geschafft mich anzumelden 

Ich sitze zur Zeit an einem kleinen RPG Versuch in 2D. Habe bereits einiges in 2D gemacht und auch Viergewinnt im 3D übers Netzwerk programmiert.

Mir fehlen jetzt jedoch die Grundideen wie ich an die Dialoge zwischen Charakter und NPC rangehe.

Codetechnisch liegt bei mir nochnichts vor, was ich präsentieren kann, da ich viel mit Theoriearbeit und Zettel und Stift beschäftigt bin.

Ich dachte mir dass ich die Dialoge in der NPC Klasse speicher, da es Dialoge sind die speziell an bestimmte vordefinierte Charaktere im Spiel angepasst sind.

Also..

Charakter kommt zu NPC, per Klick wird die Interaktion gestartet und ein Thread beim NPC kommt zu Gange. 
Ist es dann sinvoll in dem Thread den Dialog komplett abzuarbeiten mit painten auf die GUI.
Ob ich es so gestalte dass der Charakter Antwortmöglichkeiten zur Verfügung hat oder es als Monolog gedacht ist weis ich nochnet. Evtl einfach nur mit kleiner Einleitung und Questbeschreibung z.B.


Bitte gebt doch mal kurz sinvolle Statements dazu ab ob ich das so weiter bearbeiten sollte 

Danke, Grüße matze


----------



## Noctarius (26. Mai 2009)

Hallo,

grundsätzlich erstmal: Hallo *gg*

Wie stellst du dir denn den internen Aufbau der Dialoge vor? Sollen diese fest definiert sein oder können Konstellationen auftreten wo sich das Ergebnis eines Satzes mit einem Anderem überschneidet oder das selbe Ergebnis ervorbringen.


----------



## leibimatZe (26. Mai 2009)

Ich dachte eigtl an fest definierte Dialoge, bin grad bei nem anderen Projekt für die DHBW bereits auf XML gestoßen, allerdings arbeiten wir dort mit wpf+c#.

Vorerst dachte ich sind die Dialoge + evtl Antwortmöglichkeiten FEST in der NPC Klasse gespeichert. 
Es sollte erstmal wirklcih ein kleines RPG werden 
2-3 NPCs mit vlt 5 quests und ein paar tierchen, also einfach nur um die grundidee rpg mal umzusetzen dann auszubaun.
Für größere rpgs ist XML denke ich sinvoll aber erstmal für mic die in der NPC Klasse speichern ist denke ICH sinvoller.


Bevorzugt erstmal Monologe, heist ich quatsch einen NPC an, der sagt dann seine 2-3 Sätze, dann erhält man ne Quest oder kommt zum shop.

Ausbaufähig wären dann Fragen, die man auswählen kann auf die der npc dann speziell antwortet, da hätte ich dann auch nen festen dialog ablauf bzw fest definierte antworten des NPCs also nichts was den verlauf beeinflussen kann. übertreiben will ichs nun auch nochnicht^^

ich schreibe grad vlt ein bisschen wirr, hoffe es kommt verständlich rüber 

danke


----------



## Noctarius (26. Mai 2009)

Ja ok verstanden 

GUI-Technisch kann ich dir leider auch nicht weiterhelfen ^^ Bei Fragen zu sowas kannst aber ruhig ankommen *gg*


----------



## leibimatZe (26. Mai 2009)

mir ging es *vorerst* auch nochnicht um die GUI, da steht eigtl nur das erste Grundgerüst aus Tilemaps ohne kollision und objekte 

Ich beschäftige mich grad mehr mit dem Klassenaufbau und den Zusammenhängen und da ging es mir darum ob es da was einfacheres bzw sinvolleres gibt als den vorgefertigten Dialog in der NPC Klasse zu speichern und wie ich das den am besten angehe, will eigtl keine Codes, nur Ideen


----------



## Noctarius (26. Mai 2009)

Ich würde ein ganz simples Schema in Richtung sowas hier machen:


```
public class Dialog {
	/** DialogEntry to start with on show */
	private DialogEntry startDialogEntry;
}

private class DialogEntry {
	/** text to display */
	private String text;
	/** 
	 * instance of DialogEntry to move forward to, 
	 * if null use questions, if no questions -> dialog ends
	 */
	private DialogEntry transition;
	/** questions to be shown */
	private List<DialogQuestion> questions;
}

private class DialogQuestion {
	/** text to display */
	String text;
	/** instance of DialogEntry to move forward to, if null dialog ends */
	private DialogEntry transition;
}
```

Lässt sich selbstverständlich später beliebig aufblähen, z.B. um Conditions die mit Quests gesetzt werden und erfordern, dass Dialog anhand dessen aus einer Liste von DialogEntries und Conditions den richtigen Startwert raussucht usw...


----------



## leibimatZe (26. Mai 2009)

Ja gut in der Hinsicht. Aber ich brauch ja eigtl keine Question Klasse da ich nur mit Aussagen arbeite.

-> dialog start
"Hallo bei meinem tollen RPG. Hier deine Startquest"
-> dialog ende

so sehn eigtl alle aus dachte is soo das simpelste überhaupt 

Wenn ich nun nen Objekt (NPC) erstellt habe weise ich ihm über nen setter den Dialogtext zu (dumm gedacht????)
Die Dialogtexte könnte ich in ner xml speichern oder in ner extra klasse... wobei ok  damit wäre ich quasi bei deiner methode gelandet...

Ach alles iwie kacke RPG is echt heftig  
Aber hab mittlerweile ne kleine Klassenstruktur entworfen. 

grüße..

weiter meinungen? xD


----------



## Noctarius (26. Mai 2009)

Auch reine Dialoge kannst du doch mit dem Modell oben abhandeln indem du einfach immer als transition einen weiteren DialogEntry setzt. Wäre der gleiche Weg wie bei einem XML:

[xml]<dialog>
    <entry> <!-- startDialogEntry -->
        <text>some text</text> <!-- text -->
        <entry> <!-- transition -->
            <text>some more text</text>
            <entry>
                <!-- no text -->
                <questions>
                    <entry>
                        <text>some more text</text>
                        <answers>
                            <entry>
                                ...
                            </entry>
                        </answers>
                    </entry>
                </questions>
            </entry>
        </entry>
    </entry>
</dialog>[/xml]


----------



## leibimatZe (26. Mai 2009)

Ich muss also jedem NPC so nen Dialog hinzufügen, der dann die DialogEntrys beinhaltet, versteh ich dich richtig?


----------



## Noctarius (26. Mai 2009)

Wenn jeder NPC nur einen Dialog kann, dann ja... ansonsten eben eine Liste von Dialogen wobei dann das Beispiel mit den Conditions entscheiden würde welcher aufgerufen wird.

hab oben noch ein wenig mehr xml reineditiert


----------



## leibimatZe (26. Mai 2009)

Ja habs grad gesehen, danke.. werd das erstmal ohne XML versuchen.
Ich will einfach jedem erstmal EINEN dialog geben, bzw ok... eigtl sollte einer schon merh können 

also ich komm quasi zu einem hin dann tritt die condition "first time" (name soll nur aussagekräftig sein xD) in kraft, dann palabert der seinen text runter, dann bekomm i ne quest, die erledig ich dann geh ich wieder hin dann tritt die  condition "quest done" in kraft, aber ich seh bei dir jetzt nirgends wie ich da dann bedingungsabhängig nen anderen dialogteil nutze x/

EDIT:

grad hab ich mich verlesen, ich muss in der liste quasi bedingungen mitspeichern über die ich dann dialoge abfrage?


----------



## Noctarius (26. Mai 2009)

Map<Condition, Dialog> conditionalDialogs


----------



## leibimatZe (26. Mai 2009)

ob Map oder liste 
Wie würdest du so ne Condition am ehesten abspeichern? aah bin da grad totally auf neuland 

thx!!

.... API schaun xD i know^^


----------



## Noctarius (26. Mai 2009)

Nein egal ist es nicht.

Bei einer Map hast du immer eine Verknüpfung zwischen aktueller Condition (die erfüllt ist) und dem Dialog, bei einer Liste kannst du nur eins speichern. Hier gäbe es dann die Möglichkeit den Dialog fest in die Condition-Instanz zu speichern.

Ich würde bei der Map bleiben und die Condition folgendermaßen aufbauen (immer mit dem Hintergrund, alles nur Vorschläge und nicht die Aussage, dass es der einzige oder beste Weg ist):


```
public interface Condition {
	public boolean isPassed(Player player, String questname);
}

public class SimpleFirstTalkCondition implements Condition {

	public boolean isPassed(Player player, String questname) {
		return player.getQuestState(questname) == QuestState.Firsttalk;
	}
}

public class Player {
	private Map<String, QuestState> queststates = ...;
	
	public QuestState getQuestState(String questname) {
		if (queststates.contains(questname))
			return queststates.get(questname);
		
		return QuestState.Firsttalk;
	}
}

public class NonPlayerCharacter {
	Map<Condition, Dialog> conditionalDialogs = ...;
	
	public Dialog onTalk(Player player) {
		for (Condition condition : conditionalDialogs.keySet()) {
			if (condition.isPassed(player, "myquest"))
				return conditionalDialogs.get(condition);
		}
	}
}
```


----------



## leibimatZe (26. Mai 2009)

Okaay danke erstmal.. sitze noch beim Arbeiten aber werd das wenn ich heute Aben noch Zeit finde mal versuchen ein wenig zu implementieren getestet wird eh nochnet , bin ja grad noch absolut nicht so weit 
aber jetzt kann ich die klassenerstellung weiterführen udn weis ungefähr wie ich den dialog einbauen könnte.

Ich glaube es gibt NIE eine perfekte lösung. Immer nur verschieden funktionierende 

danke!


----------

