¿Cuál es la mejor manera de implementar un sistema de árbol de diálogo en mi juego? Quiero que un NPC le dé al jugador diferentes conjuntos de respuestas, algunas de las cuales solo pueden aparecer cuando el jugador tiene un elemento o se ha producido un evento anterior.
51
Respuestas:
Los árboles de diálogo deben hacerse usando XML. Almacena las condiciones para las respuestas y la respuesta en árboles anidados con una referencia a un archivo de script si necesita hacer algo más complejo.
Debe mantener los scripts y el diálogo separados, especialmente si está armando un juego de rol que tiene una tonelada métrica de conversaciones. Luego puede usar una biblioteca como simpleXML para leer el archivo XML.
Hay una pregunta similar sobre SO con un ejemplo: https://stackoverflow.com/questions/372915/game-logic-in-xml-files
fuente
Me gustaría ver un lenguaje de scripts incrustado como lua o ruby y codificar interacciones de diálogo en eso.
Por lo tanto, un script de diálogo podría verse así:
Esto también funciona bien para codificar IA y otras cosas simples que son útiles para ajustar durante el tiempo de ejecución. Incluso puede agregar un editor integrado en su aplicación que se puede invocar cuando se ejecuta en depuración (o como un huevo de Pascua).
fuente
En el juego Stendhal usamos una máquina de estados finitos para implementar NPC.
El siguiente diagrama muestra un pequeño ejemplo del tutorial sobre cómo escribir misiones .
Al principio, el NPC está en un estado inactivo y puede estar caminando. Un jugador puede iniciar una conversación diciendo "hola" y el NPC pasará al estado ASISTENTE. En este estado, responde a preguntas sobre su "trabajo" y ofrece algunos juegos de "ayuda". El jugador puede solicitar una misión y el NPC pasará al estado QUEST_OFFERED esperando que el jugador lo acepte ("sí") o lo rechace ("no").
Hemos definido un conjunto de condiciones que se pueden adjuntar a las transiciones. Por ejemplo, completar una misión solo puede ser posible si se cumple un PlayerHasItemWithHimCondition .
Después de ejecutar una transición, el NPC puede decir algo de texto y / o ejecutar una acción. De manera similar a las condiciones, hemos definido un conjunto reutilizable de acciones como EquipItemAction que se utiliza para otorgar una recompensa de misión a un jugador.
Se pueden combinar múltiples condiciones usando AndCondition , OrCondition y NotCondition . Por lo general, hay una serie de acciones que se deben realizar al completar la misión, por lo que también hay una clase MultipleActions .
Si bien la implementación real en Stendhal adolece de no ser traducible en otros idiomas (humanos) fácilmente, creo que el concepto general es bueno.
fuente
Puede echar un vistazo a la herramienta Dlgedit del motor de RPG de código abierto Adonthell . Es muy avanzado y debe contener todo lo que necesita (incluidas las fuentes;))
fuente
Creo que para agregar traducciones, aún podría usar XML para la lógica como se indicó anteriormente . Cuando te encuentres con ese tipo de complejidad, debes escribir tu propia herramienta de diálogo. Su texto de diálogo se almacenaría como una clave para una base de datos que podría intercambiar según el idioma que desea mostrar.
Por ejemplo, podrías tener:
Luego, el renderizador de texto de búsqueda reemplazará "Localize.FixMyCar" por el texto traducido adecuadamente.
Su herramienta mostraría lo que el jugador vería en un idioma seleccionable junto con el XML sin editar editable.
Del mismo modo, podría usar algo como esto en el ejemplo al que hizo referencia :
Si sus claves son lo suficientemente descriptivas, no tener el texto completo no debería ser un problema.
Algo como esto también podría ser útil:
fuente
Los datos conducen a tus personajes con scripts LUA o incluso archivos XML. Cuando interactúas con un NPC, toma el archivo que está adjunto, léelo, ajústalo a las variables del juego que puedan haberse activado y crea la respuesta válida.
La mayor ganancia de hacerlo de esta manera es que puede ingresar y manipular fácilmente el diálogo, agregar nuevos caracteres, etc. También evita el desorden de su base de código con una lógica especial en el manejo de cada caso.
fuente
Si usa XML, asegúrese de crear una pequeña herramienta para editar el archivo XML. Te volverás loco de lo contrario.
fuente
Si tiene un conjunto bastante profundo de árboles de diálogo, use ChatMapper . Tienen una versión gratuita con todas las funciones y la herramienta le permite exportar sus árboles de diálogo a XML. Lo he estado usando y es una excelente manera de visualizar y organizar complejos árboles de diálogo.
fuente
Si sus diálogos son de alguna complejidad, lo más importante que necesitará para la implementación del diálogo es una forma de comprender la complejidad de su interacción. Recomiendo un editor de nodos de algún tipo para visualizar esto, aunque no tengo ningún buen sistema abierto para recomendar.
fuente
Creo que usas tu propio lenguaje de script para dirigir este tipo de juego (si no, deberías). Luego expande tu script para el manejo de diálogos también.
Puedes trabajar con otras variables del juego durante la creación de la lógica de los diálogos. Los motores de juego son como Lego. Usted programó solo ladrillos y el script los usa. No importa si crea algún intérprete de guiones o compilador. Pero el guión siempre es útil.
fuente
El autómata simple podría hacer:
Podría verse más o menos así:
En el juego, encuentra la identificación e intenta hacer coincidir la identificación y la condición.
Necesita modelar las condiciones y acciones. Por objetos, punteros de función, XML ...
Un buen editor de diálogo también será útil.
fuente