Comment puis-je implémenter des arbres de dialogue dans mon jeu?

51

Quel est le meilleur moyen d'implémenter un système d'arborescence de dialogue dans mon jeu? Je veux qu'un PNJ donne au joueur différents ensembles de réponses, dont certaines peuvent apparaître uniquement lorsque le joueur a un objet ou qu'un événement précédent s'est produit.

Bryan Denny
la source
2
BOUNTY est spécialement conçu pour les bonnes idées sur la gestion des traductions de phrases de déclenchement et de texte de PNJ. Pour que le PNJ puisse comprendre et parler différentes langues, cela dépend du joueur qui a lancé la conversation. Même avec l'approche par blocs de construction de gamedev.stackexchange.com/questions/31/…, il ne semble pas être une bonne idée d'intégrer la logique dans les référentiels de texte. Mais leur division rend beaucoup plus difficile la compréhension du code.
Hendrik Brummermann le

Réponses:

17

Les arbres de dialogue doivent être créés avec XML. Vous stockez les conditions pour les réponses et la réponse dans des arbres imbriqués avec une référence à un fichier de script si vous devez effectuer quelque chose de plus complexe.

Vous devez séparer les scripts et la boîte de dialogue, en particulier si vous créez un RPG qui a une valeur de tonnes de conversations. Vous pouvez ensuite utiliser une bibliothèque telle que simpleXML pour lire le fichier XML.

Il y a une question similaire sur SO avec un exemple: https://stackoverflow.com/questions/372915/game-logic-in-xml-files

Renard
la source
+1 pour XML. Beaucoup mieux que l’incorporation dans le code lui-même, permet des modifications sans recompiler le code et constitue un format standard lisible par certains éditeurs puissants.
AttaquerHobo le
34
XML est juste un format (et, IMO, un mauvais). En réalité, la réponse à cette question est la suivante: "Créez un langage de domaine contenant une logique et des flux de base, mais principalement votre dialogue, puis analysez-le." De manière générale, je suis d’accord avec cette réponse.
Ipsquiggle
5
Exactement, XML est juste le conteneur, vous pouvez aussi bien (et certainement plus lisible par l'homme et éditable par l'homme) l'implémenter en utilisant Lua ou d'autres langages de script.
LearnCocos2D
4
XML est cher à analyser et prend beaucoup de mémoire. C'est bien de l'utiliser comme format de stockage, mais j'écrirais un utilitaire qui convertit les arbres de dialogue en un format binaire utilisé au moment de l'exécution. Si vous utilisez un ordinateur et ne vous souciez pas de votre utilisation de la mémoire, cela pourrait bien fonctionner, mais sur n'importe quelle plate-forme, le coût de la mémoire vous ralentira.
BigSandwich
1
-1 pour XML. Je suis d'accord avec @Ipsquiggle et @BigSandwich
'.
20

Je chercherais à intégrer un langage de script comme Lua ou Ruby et à coder des interactions de dialogue dans cela.

Ainsi, un script de dialogue pourrait ressembler à:

switch showDialog "Why don't you just leave me along!", "Okay", "But I found your dog!"
    case 1:
        showDialog "And stay gone!"
    case 2:
        if playerHasObject "dog"
            showDialog "Thank you!"
        else
            showDialog "Liar!"

Cela fonctionne également bien pour coder l'IA et d'autres choses simples qu'il est utile de peaufiner pendant le temps d'exécution. Vous pouvez même ajouter un éditeur intégré à votre application pouvant être appelé lors de l'exécution en mode débogage (ou en tant qu'œuf de Pâques).

BarrettJ
la source
1
Je préfère ceci au format XML car vous pouvez ajouter une logique. Mais je dirais que le texte lui-même devrait probablement être en XML plutôt que dans le code. (plus facile à modifier, à localiser dans d'autres langues, etc.).
Iain
si vous avez besoin de localisation / édition facile, vous pouvez envelopper le texte dans une fonction qui enregistre le texte inclus dans un fichier séparé, comme la fonction / macro tr (QString) dans Qt. pepper.troll.no/s60prereleases/doc/linguist-hellotr.html
cloueuse
quoi de vous empêcher d'utiliser des attributs ou des balises supplémentaires dans le XML pour simuler la logique ici?
lathomas64
16

Dans le jeu Stendhal, nous utilisons une machine à états finis pour implémenter les PNJ.

Le diagramme suivant montre un petit exemple tiré du tutoriel sur la rédaction de quêtes .

FSM avec les états IDLE, ATTENDING et QUEST_OFFERED

Au début, le PNJ est dans un état IDLE et peut se promener. Un joueur peut commencer une conversation en disant "bonjour" et le PNJ ira à l'état ATTENDING. Dans cet état, il répond aux questions sur son "travail" et propose un jeu "aide". Le joueur peut demander une quête et le NPC ira à l'état QUEST_OFFERED en attendant que le joueur l'accepte ("oui") ou le décline ("non").

Nous avons défini un ensemble de conditions pouvant être associées aux transitions. Par exemple, remplir une quête ne sera possible que si une PlayerHasItemWithHimCondition est remplie.

Une fois la transition effectuée, le PNJ peut dire du texte et / ou exécuter une action. De manière similaire aux conditions, nous avons défini un ensemble d'actions réutilisables , comme EquipItemAction, qui est utilisé pour donner une récompense de quête à un joueur.

Plusieurs conditions peuvent être combinées à l'aide de AndCondition , OrCondition et NotCondition . Habituellement, un certain nombre d'actions doivent être effectuées à la fin de la quête. Il existe donc également un cours MultipleActions .

Bien que l'implémentation réelle de Stendhal souffre de ne pas pouvoir être traduite facilement dans d'autres langues (humaines), je pense que le concept général est bon.

Hendrik Brummermann
la source
5

Vous pouvez jeter un coup d'oeil à l' outil Dlgedit du moteur Open Source RPG Adonthell . Il est très avancé et devrait contenir tout ce dont vous avez besoin (y compris les sources;))

Koonsolo
la source
5

Je pense que pour ajouter des traductions, vous pouvez toujours utiliser XML pour la logique décrite ci-dessus . Lorsque vous entrez dans ce type de complexité, vous devez écrire votre propre outil de dialogue. Votre texte de dialogue serait stocké en tant que clé d'une base de données que vous pourriez permuter en fonction de la langue que vous souhaitez afficher.

Par exemple, vous pourriez avoir:

<dialogue id="101" condition="!npc.carsFixed">
  <message>Localize.FixMyCar</message>
  <choices>
    <choice condition="hero.carFixingSkill > 5" priority="7" id="Localize.Sure">
      <command>hero.carFixingSkills += 1</command>
      <command>npc.carFixed = true</command>
      <command>hero.playSmokeAnimation()</command>
      <command>nextDialogue = 104</command>
    </choice>
    <choice condition="hero.carFixingSkill <= 5" id="Localize.CantFix">
      <command>nextDialogue = 105</command>
    </choice>
    <choice id="Localize.FixYourself">
      <command>npc.likesHero -= 1</command>
    </choice>
  </choices>
</dialogue>

Vous auriez alors le moteur de rendu de la quête remplacer "Localize.FixMyCar" par le texte traduit de manière appropriée.

Votre outil afficherait ce que le lecteur verrait dans une langue sélectionnable à côté du XML brut éditable.

De même, vous pouvez utiliser quelque chose comme ceci à partir de l' exemple que vous avez cité :

npc.add(ConversationStates.ATTENDING,
        ConversationPhrases.QUEST_MESSAGES, 
        null,
        ConversationStates.QUEST_OFFERED, 
        Localization[ "BringMeABeer" ],
        null);

Si vos clés sont suffisamment descriptives, ne pas avoir le texte complet ne devrait pas être un problème.

Quelque chose comme ça pourrait être utile aussi:

Localization[ "<Location>.<NPC_name>.<Dialogue_text_key>" ];
toddw
la source
4

Les données pilotent vos personnages avec des scripts LUA ou même des fichiers XML. Lorsque vous interagissez avec un PNJ, saisissez le fichier qui y est attaché, lisez-le, ajustez-le en fonction des variables de jeu éventuellement déclenchées et produisez la réponse valide.

Le principal avantage de cette façon de procéder est que vous pouvez facilement manipuler le dialogue, ajouter de nouveaux caractères, etc.

David McGraw
la source
1
C'est Lua, pas LUA. :)
RCIX
2
Je l'ai fait juste pour toi, mec. ;)
David McGraw
4

Si vous utilisez XML, assurez-vous de créer un petit outil pour éditer le fichier XML. Vous allez devenir fou autrement.

zooropa
la source
S'il n'y a pas déjà un outil pour l'éditer, il est inutile de l'utiliser: commencez par créer votre propre format!
o0 '.
3

Si vous avez un assez grand nombre d’arbres de dialogue, utilisez ChatMapper . Ils ont une version gratuite complète et l'outil vous permet d'exporter vos arbres de dialogue en XML. Je l'utilise et c'est un excellent moyen de visualiser et d'organiser des arbres de dialogue complexes.


la source
1

Si vos dialogues sont d'une complexité quelconque, la chose la plus importante dont vous aurez besoin pour l'implémenter est un moyen de comprendre la complexité de votre interaction. Je recommande un éditeur de nœud pour visualiser ceci, bien que je n’ai aucun bon système ouvert à recommander.

Aaron Brady
la source
1

Je pense que vous utilisez votre propre langage de script pour diriger ce type de jeu (sinon, vous devriez le faire). Ensuite, développez votre script pour la gestion des dialogues.
Vous pouvez utiliser d'autres variables de jeu lors de la création de la logique de dialogue. Les moteurs de jeu sont comme Lego. Vous avez uniquement programmé des briques et les scripts les utilisent. Peu importe si vous faites un interpréteur ou un compilateur de script. Mais le script est toujours utile.

samboush
la source
0

Un automate simple pourrait faire:

(dialogueline_id, condition) -> (next_id, response)

Cela pourrait ressembler à quelque chose comme ça:

(1, troll is hungry?) -> (2, say "troll be hungry")
(2, player has bananas?) -> (3, say "hey, you have bananas!")
(3, ) -> (-1, (say "i like bananas, i take them and eat, you may pass, bye", remove bananas, feed the troll))
(2, player does not have bananas?) -> (-1, say "go away!!!")

Dans le jeu, vous trouvez un identifiant et essayez de faire correspondre l'identifiant et la condition.

Vous devez modéliser les conditions et les actions. Par objets, pointeurs de fonction, XML ...

Un bon éditeur de dialogue sera également utile.

utilisateur712092
la source