Desarrollando aventuras con txtPAWS y Paguaglús

Introducción

Existe todavía mucha gente que recuerda con cierta añoranza los tiempos de PAWS. Pese a que hoy en día existen posibilidades mucho más atractivas, como Visual Sintac -similar a Adrift, ese sencillo generador de aventuras inglés, que quizás alguien traduzca al español-, o sobre todo, según la modesta opinión del autor [1], InformATE!, mucha gente ve estas posibilidades como una complicación innecesaria. Con Paguaglús, ayudado por txtPAWS, es posible mantener la posibilidad de desarrollar aventuras al estilo de PAWS.

Reuniendo las herramientas necesarias.

En la web del CAAD [4] podrás obtener todas las herramientas que se mencionan aquí, sin embargo, debes asegurarte de conseguir las últimas versiones, en las páginas de las autores. txtPAWS es una creación del autor de este artículo [2] -que actúa a nivel del código fuente-, mientras Yokiyoki [3] es el creador de Paguaglús, el sistema básico que permite convertir una aventura PAWS en una aventura ejecutable desde Glulx.
Las herramientas necesarias son las siguientes:
a) txtPAWS. txtPAWS actúa al nivel del código fuente, permitiendo referirse a los objeto, las localidades y las banderas por su propio nombre, en lugar de por un número. Además, permite dividir el típico archivo enorme de un juego PAWS en varios archivos más pequeños.
b) Paguaglús. Convierte SCE PAWS a ejecutable Glulx (.ulx), pasando por ensamblador Glulx (.ula).
Quizás te preguntes qué narices es Glulx. Puedes encontrar amplia información sobre Glulx (FAQ, páginas hablando de Glulx ...) en CAAD [4]. En la página de Yokiyoki también encontrarás mucha información [3]. En pocas palabras, no es más que un intérprete que permite ejecutar cierto tipo de juegos que siguen un formato especial (.ulx).
En cuanto a SCE PAWS, aún siendo forofo de PAWS te preguntes qué narices es eso de "SCE". Si vienes de Spectrum quizás te sorprenda saber que sólo en este ordenador el entorno de desarrollo seguía una estructura de menú: en el resto de sistemas, se trataba de escribir un fichero de texto con una estructura especial, dividido en secciones, que definía el juego concreto. Éste es el tipo de fichero que utiliza Paguaglús. Las secciones se indican con la barra inclinada a la derecha, y un nombre código:

/VOC ;vocabulario
/STX ;mensajes de sistema
/MTX ;mensajes del usuario
/OTX ;texto de descripción corta de los objetos
/OBJ ;descripción de características de objetos
/LOC ;descripción de localidades
/CON ;conexiones entre localidades
/PRO ;tablas de respuestas y procesos

La historia

La historia es muy simple. El protagonista se levanta una mañana, con ganas de comerse una anchoa. Y allí está, encima de la mesa, preparada para él.
La única, pequeña dificultad, que encontrará el protagonista es que, si se la come sola, entonces se atragantará y se morirá. Para evitarlo, lo que tendrá que hacer es echar aceite en primer lugar sobre la anchoa.

Creando la aventura

En primer lugar, es necesario crear el vocabulario y los objetos necesarios para jugar la aventura. El fichero SCE PAWS está divido en secciones, como vocabulario, mensajes ... etc., que es necesario respetar. Para ello, contamos con la ayuda de skelesp.txp, que contiene una miniaventura sin localidades con todas las secciones, lo que simplifica mucho el desarrollo de la aventura. Así, se trata de ir rellenando huecos.
Una de las primeras secciones es la de vocabulario:
/VOC
;
;
##include minvocesp.txp
anchoa 15 noun
linterna 16 noun
aceite 17 noun
come 33 verb
comer 33 verb
comet 33 verb
traga 33 verb
echa 34 verb
echar 34 verb

Incluímos el vocabulario mínimo español y definimos los nuevos nombres. A continuación, los objetos que utilizaremos:

/OTX ;Descripciones de objetos
/0
una linterna encendida...
/1
a una anchoa...
/2
y un poco de aceite.
; - - - - - - - - -

... y ahora, las localidades a utilizar. En este apartado, pueden especificarse fácilmente los gráficos que desearemos se incluyan en la aventura, cada vez que se entre en la localidad, así como la música de fondo. Para ésto, se utilizaría:

##define pic salon.jpg 1
##define msc salon.aif 1

Además del ##define necesario para definir el salón como localidad, que se ve en el ejemplo a continuación.
Excepto la inicial, sólo necesitaremos una:

/LTX ;Descripciones de lugares
/0 ; Introducción
Aquel día te despertaste con un extraño deseo ... un antojo ...
un capricho ... deseabas algo salado, algo rico ...
como respondiendo
al mismo, te levantaste y encontraste encima de la mesa ...

Por cierto ... ¿por qué se habrá ido la luz?


/1 ; el salón de tu casa
##define loc salon 1
El austero salón de tu casa. En el centro, puedes ver la mesa ...
; - - - - - - - - -
/CON ;Conexiones
;/0 ; Inicio del juego. No hay conexiones
; - - - - - - - - -

##define loc es necesario para asignar un nombre a una localidad.

Supongamos por un momento que desaramos asignarle un gráfico y una música ambiental, tal y como se indicó más arriba. Nótese que en este caso los identificadores deben coincidir con el nombre del fichero del recurso (gráfico, sonido) que se va a utilizar.


/1 ; el salón de tu casa
##define loc salon 1
##define msc salon.aif 1
##define pic salon.jpg 1
El austero salón de tu casa. En el centro, puedes ver la mesa ...

Es necesario indicar las características de cada objeto:

/OBJ ;Definiciones de objetos
;num empieza peso conte- poner/ susta adjetivo
;obj en nedor quitar ntivo
; - - - - - - - - -
/0
CARRIED 1 _ _ linterna _
##define obj linterna 0
/1
&&salon 1 _ _ anchoa _
##define obj anchoa 1
/2
&&salon 1 _ _ aceite _
##define obj aceite 2

Aprovechamos para asignar un nombre a cada objeto con la directiva ##define obj.

Los 4 o 5 mensajes que necesitaremos. Los mensajes engordan mucho el fichero de la aventura, y por eso suele ser buena idea colocarlos en un fichero aparte. Con ##define msg, asignamos un mombre a cada mensaje. Es necesario repetir el número de mensaje (así como el de localidad y objeto) para que txtPAWS pueda realizar comprobaciones acerca de si la numeración es la correcta -aunque no serían necesarias ninguna de ambas cosas, ayudan al programador-.

/MTX ;Mensajes
/0
##define msg anchoa_desc 0
Es una anchoa salada, como todas las anchoas.
/1
##define msg ganaste_desc 1
¡Qué maravilla! Has cumplido el antojo de comerte una anchoa hoy ...

/2
##define msg perdiste_desc 2
¡aghhh! Qué horror .. qué seco, qué salado, ... mueres entre horribles espasmos ...

/3
##define msg coge_la_anchoa_desc 3
... la anchoa está todavía sobre la mesa ...
/4
##define msg aceite_desc 4
Es un poco de aceite en un envase de plástico.

/5
##define msg condimentas_desc 5
Condimentas la anchoa con un poco de aceite ...

/6
##define msg ingredientes_desc 6
Te faltan ingredientes ... cógelos antes ...

La tabla de respuestas es lo último a realizar. En ella definimos el comportamiento de la aventura. Fíjate que utilizo una pequeña nomenclatura: los nombres acabados en _desc son mensajes. Los nombres acabados en _sw son banderas, y los objetos no tienen terminación.
Se utiliza una sola bandera, condimentada_sw, para controlar si el jugador ha echado el aceite sobre la anchoa.
En primer lugar, se permite examinar los objetos del juego.

/PRO 0 ;es decir, Tabla de Respuestas

##include accesp.txp ; acciones mínimas en español

##define flg condimentada_sw 100 ; ¿está la anchoa condimentada?

exami anchoa PRESENT &&anchoa
MESSAGE &&anchoa_desc
DONE

exami aceite PRESENT &&aceite
MESSAGE &&aceite_desc
DONE

Ahora, controlamos que el jugador puede echar aceite sobre la anchoa. Para ello, controlamos que el segundo nombre de la frase sea 'anchoa', y que llevemos ambos objetos. Entonces, ponemos la "condimentación" a 1. Y visualizamos un mensaje.

echa aceite NOUN2 anchoa
CARRIED &&anchoa ; ¿lleva la anchoa?
CARRIED &&aceite
LET &&condimentada_sw 1 ; asigna 1 a condimentada_sw
MESSAGE &&condimentas_desc
DONE

La entrada siguiente es necesaria para controlar si el jugador quiere echar el aceite sobre la anchoa, pero no lleva alguna de las dos cosas. Fíjate que esta es la única -y torpe- forma de hacer condiciones complejas en PAWS. Si el juego llega a ejecutar esta entrada, es que la anterior no ha tenido éxito, y eso quiere decir que no se llevaba la anchoa o el aceite. Así, el orden de las entradas importa.

echa aceite NOUN2 anchoa
MESSAGE &&ingredientes_desc
DONE

Ahora, el final: comer la anchoa. Si no la tiene el jugador, le decimos que la coja. Si la tiene, y la ha condimentado, le indicamos que ha ganado y terminamos el juego (END) después de decirle cuántos turnos (TURNS) ha jugado. Si no la ha condimentado, hacemos lo mismo pero le decimos que ha perdido.

comer anchoa NOTCARR &&anchoa
MESSAGE &&coge_la_anchoa_desc
DONE

comer anchoa CARRIED &&anchoa
EQ &&condimentada_sw 1 ;; ¿condimentada_sw = 1?
MESSAGE &&ganaste_desc
TURNS
END

comer anchoa CARRIED &&anchoa
ZERO &&condimentada_sw ;; ¿condimentada_sw = 0?
MESSAGE &&perdiste_desc
TURNS
END

La aventura completa

La aventura completa se presenta a continuación. txtPAWS permite, además de sustituir nombres, dividir la aventura -que completa ocuparía muchas pantallas, impidiendo ver su estructura- en ficheros. Por defecto, se ofrecen sysmsgesp.txp, los mensajes en español, accesp.txp, las acciones mínimas accesp.txp -coger, dejar ... etc. -, y minvocesp.txp, el vocabulario mínimo en español. De esta forma, no es necesario tener un archivo inmanejable por su longitud, cuando en realidad el vocabulario mínimo, los mensajes del sistema y las acciones mínimas no nos importan en nuestra aventura. De la misma manera, podemos crear nuestros propios archivos aparte del código principal de la aventura. Algo típico - como en El Legado, legmens.txp-, es tener un fichero aparte con los mensajes de la aventura.
A continuación, el código completo. Los restantes archivos txp puedes bajártelos con txtPAWS de mi web [2]. Para compilar la aventura, puedes utilizar el .bat suministrado:

c:\> cc lanchoa

En caso contrario:

c:\> txtpaws lanchoa.txp
c:\> pgc lanchoa.sce
c:\> glulxa -i lanchoa.ula -o lanchoa.ulx
c:\> blc lanchoa.blc lanchoa.blb
Para ejecutarla (si tienes asociada la extensión .ulx a WinGlulxe o cualquier otro intérprete):

c:\> start lanchoa.ulx

Si no tienes hecha la asociación, abre el intérprete WinGlulxe y después abre lanchoa.ulx en el directorio donde la hayas compilado.

/CTL
_ ;El carácter de palabra nula es el subrayado; - - - - - - - - -
/VOC
;
;
##include minvocesp.txp
anchoa 15 noun
linterna 16 noun
aceite 17 noun
come 33 verb
comer 33 verb
comet 33 verb
traga 33 verb
echa 34 verb
echar 34 verb
;
; - - - - - - - - -
/STX ;Mensajes del sistema
;
;
##include sysmsgesp.txp
;
; - - - - - - - - -
/MTX ;Mensajes
/0
##define msg anchoa_desc 0
Es una anchoa salada, como todas las anchoas.
/1
##define msg ganaste_desc 1
¡Qué maravilla! Has cumplido el antojo de comerte una anchoa hoy ...

/2
##define msg perdiste_desc 2
¡aghhh! Qué horror .. qué seco, qué salado, ... mueres entre horribles espasmos ...

/3
##define msg coge_la_anchoa_desc 3
... la anchoa está todavía sobre la mesa ...
/4
##define msg aceite_desc 4
Es un poco de aceite en un envase de plástico.

/5
##define msg condimentas_desc 5
Condimentas la anchoa con un poco de aceite ...

/6
##define msg ingredientes_desc 6
Te faltan ingredientes ... cógelos antes ...

;
; - - - - - - - - -
/OTX ;Descripciones de objetos
/0
una linterna encendida...
/1
a una anchoa...
/2
y un poco de aceite.
; - - - - - - - - -
/LTX ;Descripciones de lugares
/0 ; Introducción
Aquel día te despertaste con un extraño deseo ... un antojo ...
un capricho ... deseabas algo salado, algo rico ...
como respondiendo
al mismo, te levantaste y encontraste encima de la mesa ...

Por cierto ... ¿por qué se habrá ido la luz?


/1 ; el salón de tu casa
##define loc salon 1
El austero salón de tu casa. En el centro, puedes ver la mesa ...
; - - - - - - - - -
/CON ;Conexiones
;/0 ; Inicio del juego
; - - - - - - - - -
/OBJ ;Definiciones de objetos
;num empieza peso conte- poner/ susta adjetivo
;obj en nedor quitar ntivo
; - - - - - - - - -
/0
CARRIED 1 _ _ linterna _
##define obj linterna 0
/1
&&salon 1 _ _ anchoa _
##define obj anchoa 1
/2
&&salon 1 _ _ aceite _
##define obj aceite 2

/PRO 0 ;es decir, Tabla de Respuestas

##include accesp.txp ; acciones mínimas en español

##define flg condimentada_sw 100 ; ¿está la anchoa condimentada?

exami anchoa PRESENT &&anchoa
MESSAGE &&anchoa_desc
DONE

exami aceite PRESENT &&aceite
MESSAGE &&aceite_desc
DONE

echa aceite NOUN2 anchoa
CARRIED &&anchoa
CARRIED &&aceite
LET &&condimentada_sw 1
MESSAGE &&condimentas_desc
DONE

echa aceite NOUN2 anchoa
MESSAGE &&ingredientes_desc
DONE

comer anchoa NOTCARR &&anchoa
MESSAGE &&coge_la_anchoa_desc
DONE

comer anchoa CARRIED &&anchoa
EQ &&condimentada_sw 1
MESSAGE &&ganaste_desc
TURNS
END

comer anchoa CARRIED &&anchoa
ZERO &&condimentada_sw
MESSAGE &&perdiste_desc
TURNS
END

; - - - - - - - - -
/PRO 1 ;Despues de describir la localidad

; inicio
_ _ AT 0
ANYKEY
GOTO 1
DESC

_ _ NEWLINE
ZERO 0 ;Si hay luz...
ABSENT 0 ;y no esta la fuente de luz...
LISTOBJ ;Listar los objetos

_ _ PRESENT 0 ;Si esta la fuente de luz...
LISTOBJ ;Listar los objetos

; - - - - - - - - -

Los problemas de PAWS

Los problemas de PAWS son bien conocidos. Para empezar, sólo reconoce en realidad las cinco primeras letras de lo que escribas (no es capaz de distinguir 'ENROJecer' de 'ENROJecido'). Además, como pudimos comprobar, tiene dificultades para representar condiciones complejas. Así, incluso el orden en el que colocas las entradas en la tabla de respuestas influye en el juego final. Sin embargo, hay que reconocer que es una herramienta muy directa y muy sencilla que permite crear aventuras razonablemente buenas, aunque probablemente haya que realizar un esfuerzo extra en cuanto a interactividad.

Los problemas de Paguaglús

Hoy por hoy, paguaglús no permite gráficos, ni permite cambiar la letra a cursiva o negrita, pese a que todas esas cosas son directamente implementables en Glulx. Ya sabéis, hay que presionar a Yokiyoki ;-)

Ejercicios

Tal y como está, la aventura es muy poco interactiva. No podemos examinar la mesa del salón, ni el sofá, ni nada de nada. Serían objetos de decorado, es decir, no son objetos como tal, sino que sólo existe la palabra que los identifica en el vocabulario y una entrada en la tabla de respuestas que permite examinarlos. Adelante, experimenta.

Referencias

[1] baltasarq@yahoo.es
[2] http://usuarios.lycos.es/elarquero/
[3] http://pagina.de/yokiyoki/
[4] http://paginal.de/caad/

Baltasar El Arquero

NOTA: Una versión de este tutorial se publicó en el SPAC nº 23.