INDIRECCION

La indirección es una característica de Superglús por la cual un parámetro de un 
condacto, en lugar de tener un valor fijo, pasa a tener el valor del flag que se indica.

La in dirección se indica en Superglús anteponiendo el carácter ‘@’ (arroba) al parámetro en cuestión.

Todo esto se verá mejor con un ejemplo: 

Sabemos que 

PLACE 4 12

Coloca el objeto 4 en la localidad 12

Sin embargo, el condacto

PLACE 4 @38

Coloca el objeto 4 en la localidad cuyo numero esta contenido en el flag 38 (lo cual viene a ser en la localidad actual).

Lo que hace Superglús es que cuando se encuentra con una arroba, inmediatamente substituye dicho parámetro por el valor del flag indicado, y después ejecuta el condacto.

Así, si el flag 38 vale 1 al encontrarse con PLACE 4 @38 Superglús substituye @38 por 1, y ejecuta PLACE 4 1, pero si  el flag 38 contiene 12 al encontrárselo Superglús ejecutaría PLACE 4 12.

Esto mismo puede utilizarse para cualquier parámetro que deseemos cuyo valor deba ser un numero (ya sea flagno, locno, objno, etc.).

Indirecciones dobles o mas allá NO están permitidas, es decir, no es válido

PLACE 4 @@10 (Que supuestamente sería colocar el objeto 4 en la localidad cuyo numero esta incluido en el flag cuyo número esta en el flag 10)

--------------------------------------------------------------------------------------------------------------

PLUGINS

Superglus tiene la posibilidad de conectar plugins, pudiendo estos plugins ser librerias de uso general o nuevos condactos. En principio no se va a describir aquí como programar nuevos plugins porque requiere conocer el ensamblador de glulx, pero si que debéis saber que si se echa de menos cualquier condacto se puede pedir, si es factible yo lo hago,  y añadirlo simplemente con poner un fichero en una carpeta, sin modificar el compilador ni nada.

Para activarlos basta con poner los ficheros .plu en la carpeta pgl (cuidado, no en la carpeta plugin).

-----------------------------------------------------------------------------------------------------------

EL DEBUGGER DE SUPERGLUS

Superglús incluye un condacto adicional llamado DEBUG, que puede tomar un valor de cero o cualquier otro distinto de cero. Si toma el valor de cero el sistema de debug queda desactivado, en caso contrario esta activado. Por defecto esta desactivado.

Así, si queremos tener habilitada la posibilidad de debug en una aventura deberemos incluir en cualquier sitio que seguro vaya a ejecutarse el condacto DEBUG 1, y a partir de ahí podrá accederse al debugger.

Es importante recordar quitar la orden DEBUG 1 de aquellas aventuras que vayan a ser preparadas para distribuirse al publico, para que los jugadores no puedan hacer debug.

Como usar el debugger

Una vez activado el debugger su uso es bastante sencillo, permitiendo ver y cambiar los flags de Superglús. Si desde la línea de comandos ponemos:

@flag		(substituyendo la palabra flag por un numero de flag)

Superglús nos devolverá el valor actual de dicho flag, y no correrá turno.

Si ponemos:

@=valor (substituyendo valor por un numero)

Superglús asignará al último flag que hemos consultado dicho valor. Si no se hubiera consultado ningún flag anteriormente se tomará por defecto el flag 0.

Así, esta es una secuencia normal en un debug:

>@100
Flag 100 = 0
>@=20
Asignado valor.
>@100
Flag 100 = 20
----------------------------------------------------------------------------------------------------------------
TRANSCRIPT

Se denomina transcript al copiado de una partida a un fichero de texto (es decir, lo mismo que aparece en pantalla, incluidas las órdenes del jugador, es grabado en un fichero). 

       Suele usarse para enviar informes sobre errores en el juego al programador, indicándole el ejemplo de cuando y donde ocurre.
       
       Para activar dicha capacidad Superglús tiene el condacto TRANSCRIPT, que de tener como parámetro 0 deshabilitará el transcript, y de tener cualquier otro valor lo habilitará).
------------------------------------------------------------------------------------------------------       
EL CONDACTO WRITE

WRITE “texto”

El condacto write se limita a escribir en pantalla el texto que se incluye entre comillas en el código, escribiendo así de manera más cómoda los mensajes de la aventura. Write soporta todas las secuencias de escape de los mensajes, como todos los textos de Superglús. La única limitación es la de incluir el texto en una sola línea, y entrecomillado.
----------------------------------------------------------------------------------------
SECUENCIAS DE ESCAPE

Se denomina secuencia de escape a un carácter especial que, al ser incluido en un texto en Superglús, es substituido por algo antes de ser escrito. La secuencia de escape por defecto de Superglús, heredada de Paguaglús, es el guión bajo o subrayado (_), que es substituido por la descripción del objeto referenciado por la orden actual.

Además, Superglús incluye los siguientes:

* * --> Es substituido por el mensaje cuyo número está en el flag 11.
* | --> Es substituido por el mensaje del sistema cuyo número está en el flag 11.
* # --> Es substituido por la descripción del objeto cuyo número  está en el flag 11.
* @ --> Es substituido por la descripción de la localidad cuyo número está en el flag 11.
* ^ --> en su lugar se ejecuta el proceso correspondiente al valor del flag 11. Esto da una enorme potencia dado que dentro de de dicho proceso podríamos perfectamente escribir otras cosas, permitiendo así mensajes complejos montados en tiempo de ejecucion. Por ejemplo podriamos poner “Coges ^”, y en el proceso correpondiente comprobar si es masculino o femenino para poner el articulo correcto del objeto, o poner descripciones aleatorias del objeto (“Coges rapidamente el pez”, “Coges el pez”, “Coges el escurridizo pez”, “Coges el dichoso pez”). En fin, multiples posibilidades aun por descubrir
------------------------------------------------------------------------------------------

ATRIBUTOS DE OBJETO

Los objetos en Superglús tienen una serie de valores llamados atributos. Dichos atributos están numerados del 0 al 63, pueden tener un valor de 0 o de 1 y algunos de ellos tienen un valor prefijado.

¿Y para que vale un atributo?

Pues la idea de los atributos es precisamente, asignar atributos a los objetos, pudiendo así darles características especiales.

En concreto los atributos 0, 1 y 2 están respectivamente asignados a objetos con luz, prenda y contenedor en ese orden. Es decir: si un objeto tiene activado el atributo 0 quiere decir que puede dar luz, si un objeto tiene activado el atributo 1 quiere decir que es una prenda y si tiene el 2 quiere decir que es un contenedor (nótese que por tanto no sólo el objeto 0 es una fuente de luz, como en Paguaglús). Nada impide que un objeto tenga activados dos o mas atributos (por ejemplo una mochila es una prenda y un contenedor al tiempo, y un casco de minero es una prenda que da luz).

A partir del atributo 3 están libres para el uso del autor. Por ejemplo podríamos usar el atributo 60 para indicar que un objeto se puede doblar, y el 61 para guardar si el objeto esta doblado. Así podríamos tener por ejemplo lo siguientes objetos:

Una barra de hierro (no se puede doblar)
Un clip (se puede doblar y por defecto esta doblado)
Un folio (se puede doblar y por defecto no esta doblado).

Y luego haríamos:

DOBLAR _ 	OZERO @51 60
	         	WRITE “No puedes doblar _”
		DONE

DOBLAR _	ONOTZERO @51 60
		ONOTZERO @51 61
		WRITE “Me temo que _ ya está doblado.”
		DONE

DOBLAR _ 	ONOTZERO @51 60
		OZERO @51 61
		WRITE “Doblas _.”
		OSET @51 61
		DONE

DESDOB _ 	OZERO @51 60
	         	WRITE “No puedes desdoblar _”
		DONE

DESDOB _	ONOTZERO @51 60
		ONOTZERO @51 61
		WRITE “Desdoblas _.”
		DONE

DESDOB _ 	ONOTZERO @51 60
		OZERO @51 61
		WRITE “Me temo que  _ ya esta desdoblado.”
		OSET @51 61
		DONE

Explicación de los condactos de manejo de atributos:

OZERO objno atrno

Condición cierta si el objeto referenciado tiene a cero (sin activar) el atributo indicado por atrno. Si el atributo indicado está fuera de rango (0-63) OZERO no se cumple en ningún caso.

ONOTZERO objno atrno

Condición cierta si el objeto referenciado tiene a uno (activado) el atributo indicado por atrno. Si el atributo indicado está fuera de rango (0-63) ONOTZERO no se cumple en ningún caso.

OSET objno atrno
Activa el atributo indicado en el objeto indicado, independientemente de su valor anterior. Si el número de atributo está fuera de rango la orden es ignorada.

OCLEAR objno atrno
Desactiva el atributo indicado en el objeto indicado, independientemente de su valor anterior. Si el número de atributo está fuera de rango la orden es ignorada.
Aunque en principio los indicadores 3 en adelante están libres para el usuario se ha llegado a la convención de que los indicadores hasta el 31 no deben ser usado más que por las posibles librerías bases, permitiendo así que existan librerías base con soporte de otros atributos ‘estándar’ a nivel de librería base. Los atributos 32 a 63 son los que deberéis usar en vuestras aventuras. 

En principio usar los atributos 3 a 31 no debe ser un problema, pero es posible que vuestro programa no funcione bien en futuras versiones de la librería base. En caso de extrema necesidad y de que se necesite usar uno de esos atributos por tener ocupados los demás

En la definicion de objetos del fichero .SCE o .TXP se definen los atributos en dos bloques de 32 caracteres 1 o 0. El primero es el atributo 0, el ultimo el 63, así:

/0        CARRIED 1        ANTORCHA   _ 10000000000000000000000000000000 00000000000000000000000000000000

En este ejemplo la antorcha tiene el atributo 0 a 1, y el resto a 0, lo cual quiere decir que es un objeto fuente de luz, que no es prenda y que no es contenedor.

En realidad se podria haber decidido que se pusieran los 64 caracteres juntos, pero se ha partido en dos bloques para mas claridad.
----------------------------------------------------------------------------------------------------------

CONDACTOS ADICIONALES DE LUZ

Superglús incluye dos condactos adicionales para el control de la luz, dada la complejidad que supone dicho control ante la posible presencia de varios objetos fuente de luz.

ISLIGHT

Condición que se cumple en cualquier caso que haya luz presente, bien porque haya luz en la habitación (flag 0 = 0), bien porque haya algún objeto fuente de luz presente (objetos con el atributo 0 activado).

ISNOTLIGHT

Condición que se cumple en caso contrario (flag 0 > 0) y no hay ningun objeto fuente de luz presente.


--------------------------------------------------------------------------------------------------

* CONDACTOS ADICIONALES DE CONEXIONES (plugin exitlib)

SETEXIT dirno locno

Asigna un nuevo valor a determinada conexión. Dirno indica el numero de la dirección correspondiente y locno a la localidad a la que se accederá a partir de ahora en dicha dirección desde la localidad actual. No es necesario que existiera una conexión en determinado sentido para cambiarle el valor, si se hace con una conexión que no existía lo que ocurrirá es que existirá una nueva salida.

No hará nada si el valor de dirno no es válido.  Si la localidad de destino no existe tampoco hace nada.

	
CLEAREXIT dirno

Borra una conexión determinada, aquella cuyo verbo de dirección tenga el valor dirno. No hará nada si el valor de dirno no es válido.


GETEXIT dirno flagno

Copia en el flag indicado el numero de localidad al que lleva la direccion indicada por dirno, o bien 255 si dicha conexión no existe.

Nota: En principio tanto SETEXIT como CLEAREXIT como GETEXIT trabajan sólo con la localidad actual, aunque desde luego es posible engañarlas cambiando el valor del flag 38 antes de ejecutarlas y volviendo despues a dejarlo como estaba. Por ejemplo, si queremos destruir la entrada a una cueva cuando alguien toca un cuerno que produce un alud, pongamos que el verbo ENTRAR es el 6, que la localidad donde tocamos es la 12 y que la que tiene la conexión ‘ENTRAR’ es la 23:

- TOCAR CUERNO 	AT 12
GOTO 23
CLEAREXIT 6
GOTO 12
WRITE “El cuerno provoca un terrible alud del otro lado de la montaña”
DONE

EXITS locno mesno

La orden exits es una órden bastante compleja en su preparación. EXITS genera la lista de salidas de la localidad indicada. Para ello es necesario que se creeen una serie de mensajes en la tabla de mensajes:

El mensaje mesno debe ser un texto similar a "Salidas:", el mesno+1 algo como "No veo salidas" y a partir del mesno+2 los mensajes correspondientes al verbo 0 de direccion, luego el verbo 1, etc. Por ejemplo si el verbo 'norte' es el nº 7 en el vocabulario deberá ponerse en el mensaje mesno+2+7 el texto "al norte" y si 'subir' es el nº 3 debera ponerse en el mensaje mesno+2+3 el texto "arriba". Exits usa los mensajes del sistema 46, 47 y 48 para construir una frase valida del tipo: "Salidas visibles: al norte y arriba."

----------------------------------------------------------------------------------------------

* ONEG

ONEG objno atrno

ONEG es un condacto plugin que se ha añadido como tal dado que se olvidó añadirlo como condacto interno, lo que hace es invertir el valor de un atributo dado de un objeto dado. Es decir, si vale 1 lo pone a 0 y viceversa.


-----------------------------------------------------------------------------------------------


* BSET, BCLEAR, BNEG, BZERO y BNOTZERO

Otro grupo de condactos plugin, que manejan los flags a nivel de bit, la sintaxis de todos es 

CONDACTO flagno bitno

BSET activa el bit
BCLEAR lo pone a 0
BNEG lo invierte
BZERO es una condicion que se cumple si el bit esta a 0
BNOTZERO es una condicion que se cumple si el bit esta a 1

En cualquier caso si el nº de bit no esta en el rango 0-31 las acciones son ignoradas y las condiciones no se cumplen.

------------------------------------------------------------------------------------------------------

* CARACTERES POR PALABRA

Superglus soporta 10 caracteres por palabra de vocabulario, en lugar de 5. Esto evitará que palabras que empiecen igual no puedan crearse en el vocabulario. Cuidado con aventuras que estén ya hechas para Paguaglus porque lo mismo se ha definido ‘ANTOR’ en lugar de ‘ANTORCHA’ y deja de funcionar (por poner un ejemplo).

------------------------------------------------------------------------------------------------------------------------

* En caso de escribir un mensaje no existente mediante indireccion se avisa de ello

------------------------------------------------------------------------------------------------------------------------
