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.
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 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.
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
Además del
##define msc salon.aif 1
##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 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 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.
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.
[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.