-
Notifications
You must be signed in to change notification settings - Fork 2
txtpaws
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 definía:
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.
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
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.) |
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
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.
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
== 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
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 música 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.
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