Programación de aventuras con inPAWS

Recientemente ha sido editada una aplicación que puede hacer las delicias de aficionados al Spectrum que gusten de crear aventuras conversacionales. Esta pequeña maravilla ha sido bautizada por su creador con el nombre de InPAWS (muy probablemente en contraposición a la herramienta UNPAWS, que hace una tarea más o menos contraria a la que hace InPAWs).

Para entender InPAWS primero tendremos que entender PAWS. Para aquellos que no lo conozcan, PAWS (Professional Adventure Writing System) es un sistema de creación de aventuras para Spectrum, Amstrad y PC, creado por Graeme Yeandle y Tim Gilberts, distribuido por la empresa Gilsoft. Sin duda la más famosa y usada de todas las versiones es la de Spectrum, con la que se han realizado joyas como “Jack the Ripper” , la española “Abracadabra” o las más recientes aventuras, también españolas, de la saga del Dr. VanHallen..

PAWS permite programar una aventura sin tener conocimientos de programación, implementando un lenguaje sencillo basado en condactos (condiciones y actos).

Portada del PAWS

Portada del PAWS, de www.wikicad.net


Crear aventuras hoy en día con PAWS se había vuelto más sencillo, al usar emuladores y permitir así grabar la aventuras según la avanzábamos con un simple snapshot. Sin embargo, con InPAWS, la facilidad es aún mayor, mucho mayor, al permitirnos escribir la aventura en nuestro PC, con un editor de textos cualquiera.

InPAWs toma un fichero de texto en el que se especifican todos los datos de una aventura, y genera con ello un fichero en formato .tap, que contiene la base de datos de la aventura tal y como la graba el PAW de Spectrum, permitiendo así que la aventura se cargue en el PAW de Spectrum como si lo hubiéramos hecho allí mismo.

Uno de los engorros de PAWS fue siempre el sistema numérico: en PAWS, cada localidad, cada objeto, cada mensaje, etc. estaban en una lista numerada, y cuando teníamos que hacer referencia al mismo, debíamos recordar el número que le correspondía. Esto hacía que todo usuario de PAWS tuviera a su lado su cuaderno, o su hoja, con estas listas, para ser capaz de acordarse. Con la llegada de InPAWS sin embargo esto ya no es necesario, puesto que permite ponerle un nombre a una localidad al estilo “Cocina” o “Precipicio”, y el propio InPAWS se encargará de ponerle un numero cuando exporte para PAWS. Obviamente lo mismo se puede hacer con objetos o mensajes, de tal modo que es mas fácil recordar el objeto barra por el nombre “barra” que por el número “7”.

Adicionalmente, otro problema de PAWS ha sido siempre la total separación de cada tipo de datos en su editor: teníamos por un lado los mensajes, por otro las localidades, por otro las conexiones entre localidades, etc. Esto hacía que determinar todas las cosas relacionadas con un lugar, con un puzzle concreto, pudiera ser complicado. InPAWS sin embargo no marca prácticamente orden alguno, por lo que es perfectamente factible tener los mensajes relacionados con una localidad, o con un puzzle, incluso las condiciones o acciones a realizar en ese puzzle, juntos en el código.

Veamos algunas porciones de “código” tomadas de la Demo que acompaña a la primera release de INPAWS (no se muestra el fichero completo, tan sólo porciones de código que muestran cómo se programa con esta herramienta). Nótese que algunas líneas (largas) se han partido para facilitar la lectura del mismo:

//--- Declaración de Flags: --------------------------------------------------

// Flags usados en la aventura
FLAG portalonAbierto; // Portalon de la entrada 
FLAG aldabonQuitado; // Si el jugador ha quitado el aldabón de la puerta
FLAG visitadoRecibidor; // SET la primera vez que se visita 
                        // para que de un bonito mensaje


//--- Declaración de localidades: ---------------------------------------------

// -- Presentación y asignación de variables globales

LOCATION Inicio 0 // La localidad de inicio debe ser siempre la cero
{
   " De vuelta a casa, tras tu último trabajo en un prestigioso despacho de
abogados tomado por una horda de horribles vampiros chupasangres...es decir, 
por \"otra\" horda de horribles vampiros chupasangres, recibes una llamada del
alcalde de XXX, un pueblo de los alrededores, para un nuevo trabajo.^^ Se
trata de investigar una serie de extraños sucesos y desapariciones en los
alredores de la vieja mansión junto al cementerio. Sin dudarlo aceptas el
trabajo, un nuevo reto para:^^{16}{2}        LIMPIEZAS FACUNDO^  EXORCISMO
Y DESVAMPIRIZACION^   SERVICIO EN TODO EL MUNDO";


//-------- Localidad de inicio del jugador 
Location Verja

{
	" Te encuentras frente a la verja de entrada a la vieja mansión,
un imponente edificio de vetustos tejados ennegrecidos por el tiempo y
siniestros gabletes acechantes. La verja está abierta.";
	CONNECTIONS { N to Entrada ENTRA to Entrada };
}

   // Vocabulario y respuestas a comandos en esta localidad:
  VOCABULARY { Noun: "VERJA"; Noun: "MANSI", "EDIFI"; Noun: "GABLE"; }
  RESPONSE { EX VERJA: AT Verja MESSAGE "Oxidada." DONE;
             ABRE VERJA: AT Verja MES "Ya está abierta, además 
                     e" MESSAGE "stá demasiado oxidada para moverla." DONE;
             CIERR VERJA: AT Verja MES "E" MESSAGE "stá demasiado oxidada 
                         para moverla." DONE;
             EX MANSI: AT Verja MESSAGE "Tendrás que adentrarte para 
                         conocer sus secretos..." DONE;
             EX GABLE: AT Verja MESSAGE "Puntiagudas formaciones que 
                         te producen escalofríos." DONE;
             SALIR _: AT Verja MESSAGE "Un Robledillo jamás abandona un 
                         trabajo sin acabar." DONE;
	}


//--- Localidades sencillas (descripciones y conexiones): ---------------------

Location PasilloSuperior
{
 " Un estrecho pasillo comunica las habitaciones y 
la escalera principal que baja al salón.";
  CONNECTIONS { BAJAR to Salon SUR to PuertaPasillo Norte to FinPasillo};
}

Location FinPasillo
{
  " Te encuentras al final del pasillo, frente a un enorme ventanal que 
te indica el final del camino.";
  CONNECTIONS { S to PasilloSuperior };
}

Location PuertaPasillo
{
  " Estás frente a la puerta de una habitación al final del pasillo. 
  A diferencia de las otras puertas, esta parece que se conserva en 
  un estado aceptable, sus goznes engrasados, su madera cuidada, el
  pomo intacto. La posibilidad de que alguien pueda habitar aún esta 
  casa te produce cierto escalofrío.";
  CONNECTIONS { N to PasilloSuperior };
}


// La localidad 0 se presenta y tras esperar una tecla, saltamos a la
// localidad de nombre "Verja":
PROCESS 1
{
	* _: AT Inicio PROMPT 2 ANYKEY GOTO Verja DESC;
	_ _: NEWLINE PROCESS Salidas;
}


//--- Ejemplo de objetos: -----------------------------------------------------
Object abrigo
{
	"Un abrigo";
	INITIALLYAT WORN;
	WORDS ABRIG _;
	WEIGHT 1;
	PROPERTY CLOTHING;
} 

VOCABULARY { NOUN: "abrig"; }

Otra ventaja de InPAWS es que mejora la compresión: para permitir la inclusión de más texto en los 48K del Spectrum, PAWS tenía un sistema de compresión basado en sustituir los códigos ASCII superiores a 127 y correspondientes a los tokens del Spectrum, con grupos de letras muy utilizados en la aventura. Para eso PAWS tenía su opción “Compress” que realizaba el análisis de los textos tratando de encontrar textos repetidos y substituía, por ejemplo “la” por un token, ocupando 1 byte en lugar de 2, y así con otras coincidencias, a veces de mas letras). InPAWS por su parte se aprovecha de la potencia de un PC para hacer lo mismo, pero consiguiendo mejoras en la compresión en la mayoría de los casos (probablemente dado que un PC puede hacer muchísimas mas “pasadas” en el mismo tiempo que un Spectrum, aunque esto, al no ser aún los fuentes públicos, es básicamente una conjetura del que escribe estas lineas).

Como todo no podía ser perfecto, InPAWS adolece de un problema: es incapaz de definir los gráficos de la aventura de una manera natural. Sin embargo, el propio InPAWS permite que tras generar dichos gráficos en el PAW, se puedan importar para ser usados desde InPAWS y así poder seguir usando InPAWS tranquilamente con esos gráficos.

La última versión de InPAWS conocida cuando escribo este artículo es la RC2, que además cuenta con una interesante capacidad: puede generar, además del fichero .tap para Spectrum, los ficheros fuente que usa el PAW de Amstrad (para CPM en realidad) y el PAW de PC, con lo cual es en teoría posible hacer con un solo fuente tres versiones del mismo juego.

El autor de InPAWS, Francisco Javier López, alias Mastodon, era hasta el momento desconocido en el mundillo tanto de las conversacionales como del Spectrum, pero eso va a acabar porque ha accedido a realizar una entrevista para MagazineZX, que podéis leer a continuación.


Tenemos hoy con nosotros a Mastodon, autor de la herramienta InPAWS, algo que promete resucitar el viejo PAWS con aventuras para Spectrum (y Amstrad) hechas en nuestros PCs y sin saber programar.


MZX> Hola Mastodon

Muy buenas.


MZX> Bueno, antes de entrar en nada más, nos gustaría que te presentaras un poco para que te conozcan. ¿Quien es Mastodon? ¿De donde es? ¿Estudias o trabajas? ¿En que?

Pues para empezar te diría que Mastodon es un personaje de una saga de aventuras creada por Steve Meretzky, del que me considero un admirador, y que simplemente me pareció gracioso como nick al darme de alta en algún foro. Si te refieres así en plan personal, pues para ser conciso y que luego no me recorten la entrevista te diré que tengo 37 años, que actualmente vivo en un pueblo de la provincia de Madrid y que trabajo en el sector de las telecomunicaciones (soy informático, PIM dicen algunos, je je), aunque mi labor profesional actual no guarda relación con la programación.


MZX> Cuéntanos… ¿cuando conociste el PAWS? ¿Has realizado alguna aventura con él en otro tiempo?

Mi primer contacto con PAW fue bastante precoz. Antes siquiera de que Samudio nos hiciera soñar con su peculiar estilo en Microhobby (que tiempos), llegó un día mi hermano por casa con una cinta pirata y unas fotocopias borrosas en inglés (siempre traía cosas raras, el muy cabrón). En la cinta había una versión del PAW en inglés. Yo por aquel entonces, aunque conocía las aventuras, no sabía que existían herramientas para crearlas ni que diablos era un “parser”. Cuando lo vi funcionando recuerdo que me quedé bastante impactado, era sencillamente una maravilla. Estamos hablando posiblemente del año 1986 o el 87. Tiempo después hice una aventura con temática Western, que sinceramente espero que nunca vea la luz, además de algún proyecto de ciencia ficción inacabado.


MZX> ¿Y el Spectrum?¿Como llegaste al mundo del Spectrum?

Curiosamente el primer ordenador que pasó por mis manos fue un ZX81, de esos de un K y teclado pintado, que nos había prestado un amiguete. Luego se empezó a poner de moda el Spectrum así que terminamos pidiendo uno a los reyes. Finalmente nos trajeron un plus, de los que tenían teclado “profesional”. En aquel momento casi todos nuestros amigos ya tenían Spectrum así que en ese sentido fuimos de los rezagados.


MZX> ¿Conservas aquel Spectrum u otro? ¿Tienes algún entorno real funcionando o sólo emuladores?

Lo conservo todo, incluso las cintas, aunque por razones prácticas sólo utilizo un emulador.


MZX> ¿Ademas de programador has sido alguna vez jugador de aventuras?¿Tienes una favorita? ¿Como conociste las ACs?

Sí, bueno, en el tema de las AC me considero más jugador que otra cosa. Mi primer contacto con las aventuras vino con juegos como Yenght, La princesa, o El hobbit, aunque por aquel entonces sólo era un granuliento “jugón” y para mi las aventuras eran simplemente un género más. Luego vino el PAW y la serie de artículos de Samudio, y entonces sí que empecé a interesarme más en serio por las aventuras, y menos por otro tipo de juegos. Con el advenimiento de Internet tuve la oportunidad de recuperar la afición, y desde ese momento vengo jugando con más o menos frecuencia a alguna que otra. Tengo muchas favoritas, aunque todas de la escena inglesa, ya que la española no la conozco mucho: Curses, Anchorhead, Sorcerer, Planetfall, Leather Goddesses of Phobos… en el Spectrum me gustaban las de Melbourne (Hobbit, El Señor de los Anillos) y sobre todo Level 9.


¿Que te parecen los interpretes de Melbourne o Level 9? ¿Hay algo en ellos que creas que el de PAW adolece?

El más completo era el de Melbourne, aunque a mí siempre me han parecido más divertidos los juegos de Level 9. El principal problema de PAW era la falta de memoria, que obligaba en la mayoría de los casos a trocear los juegos en varias cargas.


MZX> En cuanto a InPAWS, ¿como se te ocurrió hacer esta herramienta?

Pues tenía (y tengo) un proyecto en mente, una especie de homenaje a Level 9, de hacer una aventura para Spectrum estilo Red Moon. Mi idea, no sé si es una locura, era que explotando las posibilidades de PAW haciendo uso intensivo de procesos, descripciones cortas y efectivas y puzzles sencillos de implementar, sería posible meter en 48k una aventura de unas 200 localidades con sus objetos, descripciones, personajes, e incluso gráficos. Lo de los gráficos no lo tenía tan claro, aunque quien haya visto los gráficos minimalistas de Level 9 comprenderá a que me refiero.

El caso es que incluso comencé el proyecto, tecleando la aventura en el PAW original, haciendo apuntes en un excel con los objetos, flags, etc. Cuando empecé a crear procesos, me vi apuntándolos también en el excel con cada uno de los condactos comentados. Total, no es difícil imaginar que me desanimé al cabo de poco tiempo.

Así que se me ocurrió que quizá podría hacer un programilla para convertir un fichero de texto con comentarios a una aventura de PAW. Se trataba, como planteamiento inicial, simplemente de poder comentar las líneas de PAW, nada más. Así empezó todo.


MZX> Cuéntanos un poco el desarrollo de InPAWS… ¿fue mucho tiempo?¿Empezaste alguna vez y lo dejaste o una vez que te pusiste fue todo de tirón? ¿has utilizado alguna herramienta aparte del compilador?

Pues el desarrollo me ha llevado un par de meses aproximadamente. Varias veces estuve tentado de hacer una pausa, pero como me conozco demasiado bien sabía que esa pausa sería definitiva, así que me obligué a terminarlo. En algunos momentos me sentí un poco como Sísifo. Por ejemplo, cuando cargué la primera prueba en un emulador, no funcionaba. Todo estaba como en UNPAWS, estaba seguro, pero no funcionaba. Así que tuve que hacer mi propia labor arqueológica comparando byte por byte los tap de InPAWS con las originales para ver las diferencias. Algunos de los datos que se vuelcan a la memoria del tap no sé ni para qué valen, solo sé que están en todas las aventuras y que si no los pongo no funcionan. En otros casos tengo que volcar el número de localidades, o de objetos en cierta dirección de memoria además de en la que dice UNPAWS que están. Al final conseguí que las aventuras generadas por InPAWS fueran idénticas, byte a byte a las originales.

Otro tema gracioso fue el de la compresión. Con mi moderno PC sin limitaciones de memoria me pareció que me iba a comer literalmente al algoritmo compresor de PAW en 48k, y las aventuras de InPAWS serían infinitamente más cortas que las de PAW. Cuando compilé mi primera aventura con el nuevo algoritmo: ¡plof! Superada la memoria de PAW. Joder, que golpe a la soberbia. Así que tuve que afinar mucho, y digo mucho, para que las viejas aventuras siguieran entrando en la versión para la que fueron creadas, tras recompilarlas con InPAWS. Sabía que si InPAWS comprimía menos que PAW, aparte de decir muy poco de la utilidad de la herramienta, no animaría a la gente a utilizarla. Al final InPAWS comprime un poco más que PAW. También es de justicia dar un reconocimiento al buen hacer de Graeme Yeandle. Es un monstruo el tío.

Sobre las herramientas utilizadas, solamente he utilizado el compilador. Tampoco he tirado de ninguna librería aparte de la estándar de C++. Está todo hecho desde cero.


MZX> ¿Que te ha parecido como se ha recibido tu herramienta en los distintos sitios donde la has presentado?

Pues creo que es algo pronto para opinar sobre eso. Me he anunciado en los foros donde pienso que puede haber interés, y la respuesta ha sido bastante positiva, aunque algo tímida. Soy consciente de que una herramienta de este tipo puede ser algo no muy demandado. Sin embargo,pienso que a los que todavía se interesan por sacar cosas retro les va a ayudar mucho. El caso es que existiendo cosas como Pasmo, BASIN, etc., está claro que InPAWS tiene su lugar dentro del mundillo retro-informático. Hay que darle tiempo.


MZX> ¿Tienes algún plan para el futuro con InPAWS? ¿Crees que hay más cosas que hacer?

Sí, hay bastantes cosas. Lo primero es que permita crear aventuras de 128k para completar su funcionalidad. También hay que mejorar el algoritmo de compresión y dar más flexibilidad al lenguaje. Otra línea de trabajo interesante es hacer un intérprete de aventuras PAW, al estilo del de Level 9 escrito por Glen Summers, pero con capacidades de depuración más allá de las que ofrece PAWS: me refiero a ejecución paso a paso, breakpoints, observación de flags (watches), etc. Lo que está claro es que para que merezca la pena meterse en estos proyectos tiene que haber interés, y cuando digo interés me refiero a algo más que considerar que la herramienta es útil. Me refiero a interés real en hacer cosas con ella.


MZX> ¿Quieres decir hacer otro intérprete para Spectrum o para PC? Si es lo primero… ¿No crees que sería más sencillo, u otra opción, modificar la última versión de PAWS para darle más capacidades? ¿Quizá algunas capacidades que tienen los parsers herederos de PAWS como Superglus o SINTAC? ¿O a que te refieres exactamente con hacer un intérprete de aventuras al estilo del de Level9?

No, no, tocar el PAW de Spectrum descartado, no sabría ni por donde empezar. Estaba pensando en “Level9”, que es el nombre dado a un intérprete para PC escrito por Glen Summers y David Kinder a finales de los 90. Actualmente va por la versión 4, corre en varias plataformas y es capaz de ejecutar todas las aventuras de level9, incluyendo las de gráficos del Spectrum, aparte de otras posibilidades.


MZX> ¿Piensas utilizar tu mismo InPAWS para crear una aventura?

Sí, quiero retomar el proyecto de Red Moon 2 (o como se termine llamando), y también hacer alguna aventura con temática algo alejada de lo que habitualmente estamos acostumbrados a ver en PAWS. Algo más en la línea de la moderna ficción interactiva sin puzzles.


MZX> ¿Tienes algún otro proyecto en mente? (relacionado o no relacionado con PAWS/Spectrum)?

Montones de directorios huérfanos en mi disco duro, je je. Y varias aventuras empezadas con Inform.


MZX> ¿Como ves el mundillo del Spectrum a día de hoy?

Pues estoy bastante sorprendido. 25 años después de la aparición del Spectrum, y más de 15 años después de su “muerte”, no sólo hay hay una labor de preservación monumental con páginas como WOS o SPA2, sino que la gente sigue sacando juegos para el Spectrum y hay aplicaciones de desarrollo realmente sorprendentes y complejas.


MZX> ¿Y el de los conversacionales?

Creo que goza de muy buena salud, aunque a veces sufra pequeños trastornos mentales como Inform 7, que con suerte se curarán pronto. Únicamente me da la impresión (y digo la impresión por que no conozco demasiado el tema) que en España estamos algo rezagados en cuanto a cantidad, de calidad seguro que no hay nada que envidiar. Es una pena, aunque también es verdad que si tipos como yo sacaran alguna cosilla en vez de quejarse, contribuiríamos a equilibrar la balanza.


MZX> Para terminar, si quieres añadir algo, estas líneas son tuyas:

Simplemente animar a la gente a que siga haciendo cosas para el Spectrum (sea con InPAWS o no),para preservar la memoria de ese cacharro que tantos buenos recuerdos nos trae a algunos.



Carlos Sanchez
Marzo 2009
MagazineZX #17