Archivo de la categoría Aventuras - Parsers

Programadores de parsers anónimos

Viernes, 25 de Enero de 2008

Pues sí, amigos, cada vez somos más los que hacemos un parser, ¿y por qué? He aquí la respuesta:

vineta1-3-6e0c1.jpg

Bueno, no puedo quedarme más, tengo una cita con unos amigos…

(minutos más tarde..)

- Hola, me llamo Alberto Vilches y yo también estoy desarrollando un parser.
- Hola Alberto -dicen todos al unísono-, no estás solo, te apoyamos!

Vive una aventura

Miércoles, 14 de Marzo de 2007

¿Quieres saber qué es una aventura conversacional?


Más información, en el Club de Aventuras AD

Diccionarios de objetos

Martes, 30 de Enero de 2007

Una de las partes más importantes de un aventura conversacional pura (de las que hay que teclear las ordenes) es la gramática que acepta el juego. Por un lado están los verbos, preposiciones, determinantes, que son los que forman las estructuras de las frases y por otro lado están los nombres de los objetos (ya sean personajes animados, decorado u objetos manipulables por el jugador).
Ya desde los primeros parsers se utilizan sinónimos para los objetos, de manera que el jugador pueda referirse a un objeto concreto usando varios nombres.
Por ejemplo Inform/Informate utiliza varios nombres para un mismo objeto que pueden utilizarse a la vez. De manera que el jugador puede utilizar cualquiera de ellos e incluso varios a la vez para referirse a un objeto. Por ejemplo, un objeto definido en Inform como

nombre 'tomate' 'verde' 'frito'

Podrá ser referido como “tomate verde”, “verde frito” y “frito tomate”.
El parser que estoy desarrollando esta basado plenamente en Inform, de manera que cualquier programador que conozca este lenguaje tan solo tenga que aprenderse las correspondencias de un lenguaje al otro. Sin embargo, hay algunas cosas que he cambiado, como el tratamiento de nombres y sinónimos.
Quería que el jugador pudiera referirse a los objetos con muchos nombres y combinaciones, pero no quería que pudiese teclear cosas que pueden ser absurdas. Así que utilicé la siguiente nomenclatura.

  • Si una palabra aparece aislada, es obligatoria.
  • Si una palabra aparece con una interrogación al final “?”, es opcional.
  • Si varias palabras aparecen separadas por una barra, es obligatorio utilizar una de ellas.
  • Si varias palabras aparecen separadas por una barra y con una interrogación al final, es opcional utilizar solo una de ellas.

Así, un ejemplo básico sería:

palabra1 palabra2? palabra21|palabra21 palabra3|palabra4?

De manera que la palabras 1 es obligatoria; la palabra2 es opcional; con las palabra21 y 22 es obligatorio utilizar una de ellas; y las palabras 3 y 4 son opcionales, pero sólo se puede utilizar una a la vez.
Así, se pueden crear nombres compuestos de una manera fácil:

nombre tomate verde? frito?

Nos dará como resultado todos los siguientes nombres válidos: “tomate”, “tomate verde”, “tomate frito” y “tomate verde frito”, pero no aceptará “verde” o “frito tomate” como nombre válido.
Podemos ir más allá, y utilizar nombres más complejos:

nombre estatua|estatuilla|figura de? color? azul|azulado?
nombre zapato|zapatos? deportivo|deportivos para correr

Si este sistema te parece interesante, te diré que en Java es muy fácil de programar. Más que nada porque el código que te trata una definición de nombre de este estilo y te devuelve un conjunto (Set) con todos los posibles nombres que coinciden con el objeto de la definición te lo adjunto aquí.
Si alguien lo consigue mejorar u optimizar, que me lo envíe y lo publico.

private static Set multiply(String wordName) throws AdvParserException {
    Set oldSet = new LinkedHashSet();
    boolean first = true;
    boolean allOptional = true;
    for (StringTokenizer stringTokenizer = new StringTokenizer(wordName); stringTokenizer.hasMoreTokens();) {
        String v = stringTokenizer.nextToken();
        boolean optional = false;
        if (v.endsWith("?")) {
            optional = true;
            v = v.substring(0, v.length() - 1);
            if (first) {
                oldSet.add("");
            }
        } else {
            allOptional = false;
        }
        if (!first) {
            oldSet.remove("");
        }

        Set newSet = new LinkedHashSet();
        for (StringTokenizer stv = new StringTokenizer(v, "|"); stv.hasMoreTokens();) {
            String part = stv.nextToken();
            // Si tenemos conjunto anterior, le añadimos a cada una de las partes el token actual
            if (!oldSet.isEmpty()) {
                for (Iterator i = oldSet.iterator(); i.hasNext();) {
                    String oldPhrase = (String) i.next();
                    newSet.add((oldPhrase + " " + part).trim());
                }
            } else {
                newSet.add(part);
            }
        }
        if (optional) {
            newSet.addAll(oldSet);
        }
        oldSet = newSet;
        first = false;
    }
    if (allOptional) {
        throw new AdvParserException("Todas las palabras no pueden ser opcionales [" + wordName + "]");
    }
    return oldSet;
}

Espero que a alguien le sirva de utilidad para el desarrollo de una aventura o para cualquier otra cosa.

Aventuras online

Viernes, 26 de Enero de 2007

En un post anterior, comento que en Septiembre de 2006 inicio un nuevo proyecto de parser online para realizar aventuras conversacionales. Sin embargo, se me olvidó mencionar que la inspiración (o la idea inicial) vino al ver esta aventura online: Yasmina’s quest. Pese a que se creó en el 2005, yo no la conocí hasta Septiembre de 2006, cuando apareció en Vida extra, de ahí que comenzara este desarrollo. Desde aquí quiero agradecer al autor Juan Alba Maldonado por haber sido inspiración en este proyecto mio que tengo entre manos.
Sin embargo, no mencioné esta aventura porque no la consideraba un parser, sino un juego desarrollado en php. El propio autor me comenta que en su segunda versión de este motor (con el que se hizo La Villa del Seis) si que se pueden desarrollar nuevas aventuras. Sin embargo, requiere codificación en php para definir objetos, localidades y, supongo (dado que no tiene documentación) los puzzles también. Por esta razón no mencioné ni a Yasmina’s Quest ni a la Villa del seis como parsers del tipo Paws, Inform, TADs o Hugo. Sin embargo, no deja de ser una herramienta con la que crear juegos ¿qué más da que no acepte una gramática configurable de frases de entrada (parser) o que para desarrollar requiera conocer php? ¿por eso va a ser menos? al fin y al cabo cumple estupendamente su función: crear aventuras online. Y por eso se merece una mención especial siempre que hable de mi proyecto: porque Yasmina’s Quest fue la primera aventura conversacional online y porque si no lo hubiera visto en septiembre de 2006, ahora mismo no estaría hablando de esto, sino de cualquier otra cosa. De nuevo: gracias Juan. :-)
(Creo que no hay más juegos desarrollados con este motor salvo los que el propio autor ha creado. Si alguien conoce alguno o desarrolla algo que me lo envíe. Ahora amiguitos, ¡a jugar!)

Cómo hacer un parser de aventuras conversacionales (I)

Miércoles, 24 de Enero de 2007

Introducción
Desde hace ya algunos meses llevo metido en un proyecto personal creo que bastante interesante. Se trata de un parser de aventuras conversacionales. Si, esos juegos que solo tienen texto y que para jugar, es necesario introducir órdenes del tipo “examinar caja, este, coger linterna, oeste, abrir puerta, norte, bajar escalera, encender linterna, comer manzana”. Si todavía no sabes lo que es, puedes ver una reseña sobre “La aventura Original” aquí. Y ya para rematar sobre cómo se juega, la guia paso a paso y solución completa al Don Quijote aquí.

Y es que estos tipo de juegos son muy entrañables. Al no poseer gráficos (al menos, no como parte fundamental del juego, sino a modo anecdótico como decoración), su potencial se basa en la parte narrativa.

aven-ad1.gif

Al igual que un libro crea personajes y situaciones en nuestra imaginación, la literatura de la aventura conversacional nos transporta más allá de las letras para meternos en el papel del protagonista que interpretamos.

El género de la aventura conversacional
Jugar a una aventura conversacional no te deja indiferente: o las odias (no tienen gráficos, hay que teclear y te aburres) o las amas (en el sentido en el que alguien puede amar algún tipo de juegos).
Hubo un tiempo hace años, muchos años, en el que los ordenadores de 8 bits reinaban. Estos ordenadores tenían muy pocos recursos (en comparación con los de ahora) y las compañías de videojuegos creaban este tipo de aventuras. Pero hoy en día, ya no es negocio. Nadie paga por una aventura conversacional, ni nadie cobra. Los jugadores de antes son los autores de ahora, que con los nuevos parsers pueden crear más y mejores aventuras que las de entonces.
No es un genero muerto, pero si en peligro (al menos en el mundo de habla hispana, ya que la aventura de habla inglesa es realmente potente). No de extinción, ya que los que ya pertenecen a algún tipo de club de amantes de la aventura no van a dejar de serlo, pero es necesario que la gente conozca y juegue estas aventuras para asegurarnos que siempre permanezcan. Pero, ¿cómo hacerlo si las grandes compañías hace tiempo que ya no desarrollan estos juegos? ¿tiene el genero suficiente potencial como para subsistir por sí mismo sin necesidad de grandes producciones? Yo creo que sí, pero ¿cómo? pues jugando aventuras, creando aventuras, creando competiciones de aventuras y, claro está, creando parsers.

Parsers
Muchos parsers han nacido desde entonces y otros muchos han muerto también. Algunos todavía duran en su versión de 8 bits, que algunos autores utilizan en emuladores de Spectrum, como Paws. Otros, como Inform, Adrift, TADS, presentan nuevas formas de crear aventuras más modernas. Aunque todas en ingles, por suerte tenemos dos buenas traducciones de Inform (el parser a mi entender más potente y más extendido) al castellano llamadas InformATE e INFSP

Entonces, crear un nuevo parser para realizar este tipo de aventuras ¿va a ayudar a la aventura conversacional hispana? No lo sé con exactitud, pero el enfoque de parser que estoy desarrollando así lo pretende. Llevo desde septiembre del 2006 programándolo y puedo decir que está bastante avanzado. No he querido hablar de ello antes por miedo a abandonarlo antes de acabarlo, como ha ocurrido con otros (por ejemplo, la programación de un juego de estrategia online basado en turnos, que en la actualidad está abandonado).
¿Y cual es este enfoque? La divulgación masiva de la aventura conversacional. Hasta ahora, las aventuras se crean en un ordenador, se compilan, se distribuyen y se juegan en el ordenador de cada jugador. Si son autónomas, se ejecutarán directamente, sino, deben utilizar una máquina virtual, intérprete, kit de jugador o similar para arrancarlas. Demasiados pasos para una persona que nunca ha jugado una aventura.
Sin embargo, ¿qué pasaría si con hacer click en una dirección te llevara a una página donde pudieras jugar a una aventura? No lo sé, pero voy a intentar comprobarlo.

Parte técnica
El parser que estoy desarrollando (lo siento, todavía no le he puesto un nombre ¿alguna sugerencia?) es completamente online: tanto para crear como para jugar las aventuras, tan sólo hace falta un navegador con Javascript.
Sí, ya sé lo que estáis pensando: existen intérpretes de máquina Z en formato Applet Java, lo que permite jugar aventuras hechas con Inform en una página web. Pero no es lo mismo, yo pretendo ir más allá: el interfaz es html puro con todo lo que ello conlleva: css, texto, imágenes, javascript, flash, lo que sea. La actualización se hace directamente en el DOM de la página con Ajax por detrás (en concreto, usando Prototype). El servidor guarda las aventuras y las partidas. Ejecuta cada juego, recibiendo las ordenes enviada por todos los jugadores a la vez y enviandole a cada uno el resultado de su acción. Con la creación de aventuras sucede lo mismo: no hay compilador, el código se edita directamente en una página y lo compila el servidor. Como veis, un enfoque bastante distinto al del applet de la máquina Z.
Esta desarrollado en Java (servlets y JSP) y por ahora no utiliza base de datos, pero creo que será necesario utilizar una para guardar los usuarios (hasta ahora todo se guarda en ficheros en disco). Dado que el parser esta realmente avanzado, en sucesivos posts iré comentando como lo he desarrollado, que problemas he tenido y como he enfocado todo el desarrollo.

Espero que a los amantes de la aventura les guste y les motive incluso a crear sus propios parsers. Y si no te gusta la aventura, pero te gusta programar, también te gustará. Hablaré de parseo de frases, diccionarios de palabras, ejecución de eventos, mundos virtuales con objetos contenedores donde meter o poner encima otros objetos, conversación con personajess, desarrollo de puzzles, interacción Ajax con Json para el envío de peticiones sin refrescar el navegador, software de Wikis para acometer la monolítica tarea de documentar el parser y, como no, sobre los problemas al crear tu propio lenguaje.
Espero que os guste mi aventura sobre cómo crear un parser de aventuras. Dentro de muy poco, mucho más.

Más información: