Introducción
En los viejos tiempos de los ordenadores de 8 bits, época de nacimiento de los parsers del tipo de Superglús (PAW, QUILL), el programador se veía obligado a recordar con demasiada frecuencia determinados números (números de flag, números de objeto, números de mensaje, etc.). En la práctica los programadores de dichos sistemas mantenían a su lado, escrito sobre papel, dicha información.
Con la llegada de los PCs y los sistemas de 16 y 32 bits al menos el parser NMP (y quizá otros como SKC y SINTAC, pero no puedo asegurarlo) trataron de evitar dicha lista permitiendo utilizar lo que llamaríamos ‘etiquetas’. Dichas etiquetas consistían en una serie de letras (habitualmente formando una palabra o acrónimo) que, al ser encontrados , eran substituidos por un número previamente definido.
Así por ejemplo en NMP, si en la sección denominada ‘constantes’ se definia:
LINTERNA=0
Posteriormente en el código podía perfectamente ponerse “CARRIED LINTERNA” en lugar de “CARRIED 0”, porque para el parser era lo mismo.
Evidentemente la capacidad de referirnos a los objetos, localidades, mensajes, por un nombre, facilitaba sobre manera la programación, al no tener que recordar decenas de números.
El compilador de Superglús sin embargo no incluye esa posibilidad, soportando sólo números, pero he aquí que txtPAWs viene en ayuda de Superglús para dotarle de dicha posibilidad.
¿Qué es txtPAWs?
txtPAWs es lo que se denomina un preprocesador: toma un fichero que contiene un código en un determinado lenguaje de programación y da como salida un texto en otro lenguaje parecido.
En nuestro caso txtPAWs tomará un fichero con extensión TXP en el que podremos ver cosas como:
CARRIED oLinterna
Y dará como salida un fichero con extensión SCE para Superglús con cosas como:
CARRIED 0
Definiendo etiquetas
La definición de etiquetas indicará que textos son substituidos por qué números en concreto, y en general dichas definiciones deben ser colocada dentro del fichero SCE antes de la sección de control /CTL (o en la solapa ‘Definiciones’ si usamos el editor de Superglús).
Pongamos un ejemplo:
##define obj oLinterna 0
Esto hace que ‘linterna’ sea equivalente a ‘0’ allí donde aparezca, y además se le define como una relación relativa a un objeto (por lo de obj).
La lista completa de tipos de relación existentes es la siguiente:
Tipo | Entidad |
---|---|
obj | Objeto |
flg | Flag, bandera |
loc | Localidad |
msg | Mensaje de usuario |
snd | Efecto de sonido |
msc | Musica ambiental ligada a localidad |
grf | Gráfico |
pic | Gráfico ligado a localidad |
const | General, no va ligado a nada y se puede usar en cualquier sitio (como objeto, flag, valor, etc.) |
Usando etiquetas
Para usar una etiqueta basta con poner el texto que hacia referencia. Es decir:
Si hicimos
##define flg fNumero_monedas 100
Luego lo usamos así:
CONTAR MONEDAS WRITE “Tienes “ PRINT fNumero_monedas WRITE “ monedas.” DONE
Identificadores :Convención
A lo largo de nuestro juego tendremos que crear muchos identificadores, y quizá llegue un momento en que se pueda hacer lioso si “la_llave” se refiere al objeto llave o a la localidad donde se usa la llave. Por eso hay una convención que es nombrar los identificadores empezando con una letra minúscula, que indica de que tipo es, y seguido del texto que de verdad identifica empezando por una letra mayúscula, y poniendo en mayúscula cada letra que comience otra palabra, sin espacios ni guiones bajos.
Por ejemplo
Elemento del juego | Identificador |
---|---|
Objeto llave | oLlave |
Localidad de la fuente | lFuente |
Flag que contiene nuestro dinero | fDinero |
Mensaje que indica que hemos muerto | mHasMuerto |
Mensaje del sistema de turnos | smTurnos |
Objeto abrigo verde | oAbrigoVerde |
Atributo de objeto “grande” | aGrande |
Adicionalmente, txtpaws nos facilita ya unos identificadores 'de serie', es decir, van a existir aunque no los creemos nosotros. Estos identificadores corresponden al vocabulario. Toda palabra existente en el vocabulario puede ser referenciada de la siguiente manera:
_voc_PALABRA
Obviamente esto es una convección, pero si nosotros preferimos otro sistema de nombrar nuestros identificadores somos totalmente libres de hacerlo.
Uso detallado
Se describe ahora un ejemplo para cada uno de los tipos, para más claridad.
obj = objeto
Permite referirse a un objeto (un número de 0 a 255) mediante un identificador.
##define obj oCandelabro 0
Más tarde, puede reemplazarse con:
ENCIENDE CANDELABRO PRESENT oCandelabro WRITE "ENCIENDES EL CANDELABRO" DONE
flg = bandera
Permite referirse a un bandera/flag (un número de 0 a 255) mediante un identificador.
##define flg fPuerta_abierta_sw 80
Más tarde, puede reemplazarse con:
ABRE PUERTA AT lBiblio PRESENT oLlave EQ fPuerta_abierta_sw 1 MESSAGE 100 DONE
loc = localidad
Permite referirse a una localidad (un número de 0 a 255) mediante un identificador.
##define loc lBiblio 1
Más tarde, puede reemplazarse con:
La biblioteca de esta gran casa. ABRE PUERTA AT lBiblio PRESENT oLlave EQ Puerta_abierta_sw 1 MESSAGE &&mPuerta_abierta_desc DONE </code>
msg = mensaje
Permite referirse a un mensaje (un número de 0 a 2^31) mediante un identificador. Hoy en día en Superglús no se usan demasiado los mensajes de la tabla de mensajes, puesto que en su lugar se usa WRITE y WRITELN, pero aún así esto está disponible:
##define msg mPuerta_abierta_desc 1
Más tarde, puede reemplazarse con:
ABRE PUERTA AT oBiblio PRESENT oLlave EQ fPuerta_abierta_sw 1 MESSAGE mPuerta_abierta_desc DONE
snd = sonido
Define un sonido que puede ser reproducido en cualquier momento.
##define snd puerta_abriendose.mod 0
Más tarde, puede reemplazarse con:
ABRE PUERTA AT lBiblio PRESENT oLlave EQ fPuerta_abierta_sw 1 MESSAGE mPuerta_abierta_desc BEEP puerta_abriendose.mod 0 0 DONE
msc = música ambiental
Define sonidos que se ligan automáticamente a una localidad, reproduciéndose al entrar en la misma.
##define msc biblio.ogg 1
La música será reproducida al entrar en la habitación 1. Nótese que el identificador debe coincidir con el nombre del fichero.
pic = gráfico
Permite referirse a un gráfico para una localidad (un número de 0 a 255) mediante un identificador.
##define pic biblio.jpg 1
El gráfico será pintado al entrar en la habitación 1. Nótese que el identificador debe coincidir con el nombre del fichero.
grf = gráfico
Un gráfico no relacionado con una localidad.
##define grf puerta_abierta.jpg 1
Más tarde, puede reemplazarse con:
ABRE PUERTA AT lBiblio PRESENT ollave EQ fPuerta_abierta_sw 1 MESSAGE mPuerta_abierta_desc PICTURE puerta_abierta.jpg BEEP puerta_abriendose.aif 0 0 ANYKEY DESC
Nota: el código 0 se refiere siempre al gráfico que se pinta cuando el jugador está a oscuras (de existir).
const = constante
No guarda relación con objetos, localidades … simplemente guarda un valor fijo.
##define const NUM_MAX_OBJETOS 5
Más tarde, puede reemplazarse con:
COGE _ LT fNum_objetos_en_jugador NUM_MAX_OBJETOS AUTOG DONE
Graficos y sonidos en Superglús
Una aventura generada por Superglús, o por cualquier otro sistema cuyo destino sea la máquina Glulx, puede presentarse en dos formatos:
ULX: Consistente en la aventura compilada lista para ejecutarse. BLB: Consistente en la aventura compilada lista para ejecutarse, más los recursos gráficos y de sonido necesarios para la misma.
Para obtener un fichero BLB necesitamos el compilador de ficheros blorb, mas conocido como BLC, e indicarle que ficheros queremos que se metan en el fichero BLB.
Afortunadamente txtPAWs también es de gran ayuda para esto, dado que él mismo, según se van definiendo graficos y musicas va creando el fichero que le dice a BLC como hacer el fichero BLB.
Por ejemplo:
##define msc biblio.aif 1
Además de definir la musica para la localidad 1, pone el biblio.aif en dicho fichero, que siempre será de igual nombre que el fichero .TXP de entrada pero con extension.blc.
Al final de la compilación, tras pasar txtPAWs, SCE y Glulxa, si ejecutamos blc tendremos también el fichero .blb adecuado.
Afortunadamente el editor de Superglús se encarga de todo eso y no tendrémos que pensar en como usarlo a no ser que no usemos el editor.
Atributos de objeto
Hasta la versión 1.0 e Superglús los atributos de objeto se definía mediante una larga fila de ceros y unos:
/0 CARRIED 1 ANTORCHA _ 10000000000000000000000000000000 00000000000000000000000000000000
Sin embargo desde la versión 1.1 y gracias a txtpaws puede definirse únicamente aquellos que estan “activos”:
/0 CARRIED 1 ANTORCHA _ ATTR 0
O usando las constantes txtpaws que incluye la librería base:
/0 CARRIED 1 GORRO MINERO ATTR aLight aWear