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.
51
Réponses:
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
la source
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 à:
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).
la source
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 .
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.
la source
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;))
la source
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:
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é :
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:
la source
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.
la source
Si vous utilisez XML, assurez-vous de créer un petit outil pour éditer le fichier XML. Vous allez devenir fou autrement.
la source
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
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.
la source
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.
la source
Un automate simple pourrait faire:
Cela pourrait ressembler à quelque chose comme ça:
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.
la source