KINI: Kini Interactive Novel Interpreter

KINI es un software que estoy desarrollando para ejecutar juegos de aventuras basados en texto, también llamados novelas interactivas.

Este tipo de juegos era bastante habitual durante la década de los 70 y de los 80, cuando los recursos y la capacidad de cómputo de las máquinas era muy reducida comparada con la que tenemos hoy en día.
No obstante, de vez en cuando han ido apareciendo pequeñas joyas del género por aquí y por allá en los años posteriores.
La última que recuerdo: el juego de texto de Interstellar, que narra las aventuras de uno de los pioneros de las misiones Lazarus, que abandonó la Tierra junto con su robot PLEX para encontrar un planeta habitable para el futuro de la humanidad.

El objetivo de KINI es revivir este género, que se centra más en dotar al juego de una buena línea argumental e inmersiva que en hacer un despliegue de capacidades técnicas impresionante.

Diseño

Desde el principio tenía muy claro que quería separar lo que sería el intérprete (el software que se encarga de proporcionar la jugabilidad) de lo que sería la lógica y la historia del juego. De forma que el mismo programa sirviese para ejecutar de manera genérica uno y otro juego simplemente indicándole el archivo en el que se encontrase dicho juego.

Los juegos pasan a ser, de esta manera, simples ficheros XML de los cuales el interprete obtiene la información necesaria para presentar la historia al jugador, y para permitirle interactuar con ella.

La estructura de un juego KINI es la siguiente: Básicamente están formados por un conjunto de escenas (o escenarios), dentro de los cuales se encuentran una serie de objetos interactivos, que a su vez, cuentan con una serie de acciones que se pueden realizar sobre ellos.

Las acciones pueden ejecutar comandos internos, como por ejemplo modificar el valor de variables globales del juego, añadir o eliminar objetos del inventario, realizar un cambio de escenario, etc. Y a su vez, tanto objetos como acciones son considerados como válidos o inválidos dependiendo de ciertas condiciones, como por ejemplo el hecho de que una determinada variable tenga cierto valor o que un objeto en concreto se encuentre presente en el inventario.

Al iniciar el juego se le presentará una historia al jugador, una situación. El jugador, a través del personaje, puede interactuar con los diferentes elementos presentes en la escena mediante órdenes de texto.

La introducción de órdenes por parte del jugador se realiza en lenguaje natural: “Abrir la puerta”, “Desconectar la fuente de energía”, “Pegar una patada a la mesa”, “Introducir la llave en la cerradura”, etc.
Estas órdenes son parseadas por el intérprete en busca de palabras clave que referencien a objetos válidos de la escena en la que nos encontremos, y en caso de detectar una coincidencia positiva, se buscarán palabras clave que coincidan con alguna de las acciones válidas del objeto detectado en el paso anterior.

Una vez identificada la acción a la que el jugador está haciendo referencia, se mostrará en pantalla el texto asociado a dicha acción y se ejecutarán de manera transparente los comandos que vayan ligados a ella, y que nos permiten modificar el estado interno del juego y de esa manera avanzar en la historia.

Desarrollo

Comencé creando un prototipo en Python, que generase en memoria la estructura de clases del juego, es decir, una lista de escenas que a su vez contienen objetos, que a su vez contienen acciones, cada una de ellas con sus respectivas listas de condiciones y comandos.

Así mismo, doté a dichas clases de los métodos necesarios para su correcto funcionamiento: comprobar condiciones, comprobar valores de variables, ejecutar comandos, salvar y cargar el estado de las variables en un fichero, etc.

Una vez hecho esto, el trabajo del intérprete es sencillo. Simplemente tiene que cargar el juego en esa estructura en memoria y ejecutar el bucle principal para contarle al jugador la situación en la que se encuentra el personaje y dar respuesta a sus acciones mediante el parseo de órdenes de usuario.

Como medida de seguridad para impedir que el jugador pueda acceder al XML del juego y obtener directamente sus secretos desde el fichero, añadí un pequeño sistema de cifrado, de forma que los XML se proporcionan en un formato binario que he llamado .kin y que impiden la lectura directa del fichero en texto plano.

Futuro

Aunque la versión actual es jugable, no deja de ser un prototipo. En un futuro tengo pensado portar el intérprete a dispositivos móviles y añadir nuevas funcionalidades, como mostrar imágenes de los lugares o elementos descritos por la historia, o la reproducción de pequeños sonidos ambientales en determinados momentos para mejorar la inmersión del jugador.

Así mismo, pretendo crear un editor gráfico que nos permita escribir historias interactivas en formato KINI de manera sencilla, sin tener que adentrarnos en los entresijos de escribir un fichero XML a mano, evitando de esa manera los problemas típicos de una etiqueta mal cerrada o un atributo incorrecto.

Written by: