Skip to content
Uto edited this page Nov 5, 2021 · 2 revisions

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.

¿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 

== 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 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.

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
Clone this wiki locally