Sistemas de conversación en Inform 6

Uno de los principales retos a la hora de añadir personajes no jugadores (PNJs o NPCs, por sus siglas en inglés) en una ficción interactiva es la implementación de las conversaciones entre ellos y el personaje controlado por el jugador (PJ o PC). Existen múltiples maneras de crear un sistema de conversación, cada uno con sus ventajas e inconvenientes. Una buena práctica antes de decidirse por la utilización de uno u otro es analizar las particularidades de cada sistema y las necesidades de la propia obra a fin de seleccionar aquel que pueda adecuarse mejor a ella —para hacerse una imagen bastante completa de las diferentes opciones con las que cuenta un autor, el Manual Técnico de TADS 3 [1] incluye una sección dedicada a analizar con cierta exhaustividad algunos de los sistemas de conversación más utilizados—.

En líneas generales, estos sistemas de conversación pueden adoptar tres formas de interfaz: 1) "VERBO [PREPOSICIÓN] <PNJ>", algo en el estilo "habla con Fran"; 2) "VERBO [PREP.] <PNJ> [PREP.] <asunto>", estilo "pregunta a Fran sobre los sistemas de conversación"; 3) Entrada libre de texto, como en "me gustaría saber qué sistemas de conversación existen". A continuación se ofrece una relación rápida de las particularidades de cada uno de ellos junto con ejemplos de obras que los utilizan, así como herramientas para facilitar su implementación en el sistema de autoría Inform 6:

1) Interfaz "VERBO [PREP.] <PNJ>"


La interfaz más simple, utilizando comandos del tipo "HABLA CON <nombre_de_PNJ>" (y sinónimos). A priori facilita evitar situaciones de sordera que se pueden manifestar en las otras dos interfaces que analizamos —llamamos "sordera" a situaciones en las que el usuario no es capaz de hacerse entender por la obra, bien porque el analizador no haya podido comprendender correctamente la entrada o, en ocasiones, porque aún habiéndola entendido no ofrece después una respuesta adecuada para esta entrada. Algo que, por supuesto, conviene en lo posible evitar—. Con cada entrada del usuario se retorna un intercambio de conversación entre PJ y PNJ. Este intercambio puede ser contextual y variar, lo que permite cosas como que tras haber hablado ya con un personaje éste deje de estar interesado en volver a hablar y, así, subsiguientes intentos de introducir el mismo comando devuelvan una respuesta adecuada del PNJ. O, en conversaciones largas, éstas se pueden dividir en varios fragmentos e ir retornándolos secuencialmente con entradas sucesivas del comando "HABLA CON <nombre_de_PNJ>" hasta agotar la conversación por completo.

Ejemplos de uso: Ariadne in Aeaea (2016) y 1958: Dancing With Fear (2017), ambas de Víctor Ojuel.

El principal inconveniente de las interfaces de este estilo es que, en su forma más básica, limitan la agencia del usuario puesto que se le priva de formas con las que guiar la conversación —no puede escoger las respuestas del PJ, ni los temas sobre los que se habla—. Al final del artículo se discuten brevemente ciertos mecanismos que pueden ayudar a solucionar este último punto.

La forma más rápida de implementarlo en Inform 6 posiblemente sea reescribir las respuestas por defecto de la librería a las acciones ##Answer, ##Ask y ##Tell —en general será conveniente reescribir también las acciones ##AskFor, con la que los PJ pueden pedir objetos a los PNJs; y ##Order, con la que pueden introducir comandos e intentar que sean ejecutados por el PNJ en lugar del PJ— a través del objeto "LibraryMessages":

Object LibraryMessages
  with before [;
    Answer, Ask, Tell, AskFor, Order:
      "Para iniciar una conversación usa simplemente la acción HABLA (a/con) PERSONAJE.";
      [ ... ]
];

Y redefinir la gramática asociada al verbo 'habla' para que invoque a una nueva acción ##TalkTo:

Extend 'habla' replace
  * noun -> TalkTo
  * 'a'/'con' noun -> TalkTo
  * creature -> TalkTo
  * 'a'/'con' creature -> TalkTo
;

[ TalkToSub;
  ! Mensaje por defecto tipo:
  ! "No parece estar interesado en hablar ahora."
  [...]
];

De este modo cada uno de los PNJs del modelo de mundo pueden capturar la nueva acción ##TalkTo en sus rutinas before() y ofrecer respuestas adecuadas. (Advertir que los ejemplos de código propuestos más arriba son sólo un esbozo incompleto. Queda en manos de los autores añadir nuevas líneas de gramática para que, por ejemplo, términos como "conversa" funcionen como sinónimos de "habla", o que la lógica de la rutina TalkToSub() retorne mensajes por defecto adecuados y diferentes cuando el usuario intente lanzar la acción sobre objetos animados o inanimados o sobre sí mismo).

2) Interfaz "VERBO [PREP.] <PNJ> [PREP.] <asunto>"


Una de los sistemas de conversación más ampliamente utilizados a lo largo de los años. Consiste en el uso de comandos del tipo "PREGUNTA A <nombre_de_PNJ> ACERCA DE <asunto>" (habitualmente, además de "pregunta" se contemplan otros verbos como "responde", "di", "cuenta", etc.) o, también, "<nombre_de_PNJ>, <asunto>". Al permitir especificar un asunto sobre el que tratar presenta la ventaja de ofrecer una mayor libertad al usuario, algo que nos impedía el primer sistema analizado. Por contra, esta mayor libertad redunda en un mayor riesgo de provocar situaciones de sordera; cualquier intento por parte del usuario de tratar un asunto que no haya sido contemplado por el autor retornará algún mensaje genérico del tipo "No sé nada sobre ese tema.", lo que puede deteriorar la experiencia y llegar a generar frustraciones con la interfaz. O puede dar lugar a escenarios más indeseables aún: algunas obras requieren conseguir cierta información de un PNJ para avanzar en la historia, de manera que el usuario puede encontrarse en situaciones de bloqueo del tipo "adivina el asunto" en las que debe dar con las palabras adecuadas sobre las que hablar con ese personaje determiando para conseguir dicha información. Estas situaciones de bloqueo suelen revelar un grave problema de diseño y a menudo resultan más frustrantes para el usuario que los bloqueos motivados por situaciones del tipo "adivina el comando" —una de las principales barreras de accesibilidad en obras de ficción interactiva mal implementadas. Varios autores, como Andrew Plotkin (2011), han abordado ya en el pasado este tipo de problemas con más detalle [2]—. Al igual que con el primer ejempo de interfaz, al final del artículo se discuten mecanismos que pueden aliviar estos inconvenientes.

Dado que se trata del sistema más utilizado y se considera prácticamente estándar en el medio, la librería Inform 6 ofrece de partida toda la infraestructura necesaria (gramáticas, definición de acciones, modelo de mundo...) para implementarla.

Ejemplos de uso: Alien: La aventura (Alpha Aventuras, 2008−2018) o Anchorhead (Gentry, M. 1998−2018), entre muchas otras.

3) NLP aplicado sobre entrada libre del teclado


Esta interfaz plantea permitir la entrada de texto completamente libre por parte del usuario y que, a través de procesamiento de lenguaje natural, la obra pueda interpretar esta entrada y ofrecer respuestas de los PNJs acordes a ella. En la práctica no hay ficciones interactivas con analizador de comandos que hayan utilizado realmente sistemas de este estilo con éxito —sí versiones del sistema (2) que pueden parecer imitarlo al utilizar análisis no estricto para reconocer patrones entre la entrada de usuario y las palabras clave asociadas a cada tema de conversación—. No existen tampoco herramientas ideadas específicamente para implementar conversaciones así en Inform 6, por lo que sería tarea del autor crear el sistema por su cuenta —lo que no se antoja en absoluto sencillo—.

En cambio, algunas otras obras englobadas en clases distintas de narrativa electrónica si han experimentado con acercamientos de este tipo para establecer conversaciones con PNJs, como por ejemplo Starship Titanic (The Digital Village, 1998), Façade (Mateas, M. y Stern, A., 2005) o el reciente Restless (Short, E. 2018), presentado en la edición de 2018 de la ECTOCOMP y que hace uso, entre otros, de las capacidades procedimentales de generación de texto automático del MiddleWare Character Engine [3], desarrollado por la compañía Spirit AI.

Mecanismos para mitigar las desventajas de (1): menús


Los menús representan una posible forma de añadir capacidad de decisión por parte del usuario aún utilizando formas de interfaz simples como las vistas en el punto (1) para iniciar las conversaciones. Estos menús se presentan de forma similar a la que puede observarse en videojuegos como las aventuras gráficas —por ejemplo en The Curse of Monkey Island (LucasArts, 1997)— o los RPG occidentales —ej: Torment: Tides of Numenera (inXile Entertainment, 2017)—: al iniciar la conversación se presenta un conjunto de opciones al usuario (normalmente etiquetadas con números); el usuario selecciona una opción (su número asociado); el PNJ da la respuesta adecuada a esa opción; y se vuelve a repetir el mismo flujo hasta que se agote la conversación.

Algunas de las ficciones interactivas mejor valoradas por la comunidad [4] utilizan este tipo de sistema de conversación: Photopia (Cadre, A. 1998) , Rameses (Bond, S. 2000) o De Baron (Gijsbers, V. 2006), entre otras.

Existen diferentes extensiones para implementar un sistema de conversación basado en menús en Inform 6. Probablemente la más popular, la más robusta y la mejor documentada sea gtalk.h creada por Boettcher, G.; Fundin, K. y Tilford, M. J.:
El sistema basado en menús presenta, por su parte, ciertos inconvenientes —como con el resto de sistemas, para encontrar una descripción detallada del funcionamiento de cada uno junto con sus ventajas y sus inconvenientes, se emplaza de nuevo al lector a consultar el Manual de TADS 3[1]—, el más importante probablemente sea la ruptura de coherencia de la interfaz; durante todo el flujo de la conversación la entrada del usuario deja de consistir en un comando de entre el conjunto de comandos de texto definidos por la obra para convertirse en una selección de opciones del menú (habitualmente, la selección de un número asociado a cada opción). Roberts, M. J. et al. (2008) destacan cómo esta ruptura llama la atención sobre la interfaz de usuario y, por tanto, degrada la experiencia de estar interactuando con el narrador de la obra: «Una enumeración de opciones no encaja bien con el aspecto y comportamiento de un juego de texto. La interfaz de usuario de una ficción interactiva reivindica una salida que pueda ser interpretada como voz del narrador y simular, al menos, [un espacio de posibilidades abierto]».

Mecanismos para mitigar las desventajas de (2): inventario de temas


Con la pretensión de evitar las situaciones de bloqueo de tipo "adivina la palabra" de los sistemas de conversación basados en las interfaces de tipo (2), así como los inconvenientes de los sistemas basados en menús, surgen los inventarios de temas. Estos sistemas consisten en ofrecer directamente una lista de asuntos (un inventario) sobre los que se puede hablar con un PNJ, y que el usuario puede consultar en cualquier momento.

Esta lista de temas no tiene por qué ser completa. Es decir, el usuario potencialmente podría todavía intentar tocar asuntos no listados por el inventario, consciente de la posibilidad de que el PNJ retorne alguna respuesta genérica indicando que no sabe nada sobre ese tema. Al ser consciente de partida de esta posibilidad, se mitiga la frustración y, a cambio, se deja abierta la puerta a la exploración libre y a experimentar la sensación de recompensa y gratificación por descubrir temas y fragmentos de conversación secundarios ocultos o no evidentes. El grueso de la conversación, sin embargo, junto con toda la información que pueda resultar importante para la historia, debería incluirse dentro de los temas sugeridos por el inventario a fin de evitar los temidos bloqueos de "adivina la palabra".

Son numerosos los ejemplos de obras que han adoptado este sistema de conversación en la última década. Por citar algunos: Aotearoa (Wigdahl, M. 2010), Shelter from the storm (Eve, E. 2009) o Make It Good (Ingold, J. 2009).

Para facilitar a los autores la implementación de este tipo de sistema de conversación en Inform 6 he creado una extensión llamada choiceSet (basada en otra extensión previa: NPC_conversation [5]):
  • choiceSet.h (la parte final del código incluye un ejemplo de uso)
  • El Chico (pequeña obra con un ejemplo de uso de la extensión más completo)

Relación de obras citadas:

[1] Roberts, M. J.; Breslin, S; Eve, E.; Nizette, M. y Sewe, A. (2008). TADS 3 Technical Manual: Choosing a Conversation System [Online]. Disponible en: http://tads.org/t3doc/doc/techman/convbkg.htm (Consultado el 2019/02/08).
[2] Plotkin, A. (2011). 'Characterizing, If Not Defining, Interactive Fiction'. En Jackson-Mead, K. y Wheeler, J. R. (ed), IF Theory Reader. 1st ed. Boston, MA: Transcript On Press. pp.(59-66).
[3] Short, E. (2019) Conversation as Gameplay (Talk) [Online]. Transcripción de coloquio en la Oxford/London IF Meetup. Disponible en: https://emshort.blog/2019/01/20/conversation-as-gameplay-talk/ (Consultado el 2019/02/08).
[4] IFDB (2015). Interactive Fiction Top 50 of all time (2015 edition) [Online]. Gijsbers, V. (ed.). Disponible en: https://ifdb.tads.org/viewcomp?id=p6s9uem6td8rfihv (Consultado el 2019/02/10).
[5] Mastodon (2011). Ahora que me acuerdo... [Online]. Disponible en: https://lanemastodon.wordpress.com/2011/04/02/ahora-que-me-acuerdo/ (Consultado el 2019/02/10).

Comentarios