| # BANDERAS AL VIENTO

## ¡Ser o no ser! ¡He aquí el dilema! Y en una aventura las banderas son las que hacen que las cosas sean de una o de otra manera. Son nuestros analizadores del estado de cada contingencia, y son, en definitiva, las que nos permiten saber dónde está el dilema.

En las aventuras se usa el término Bandera muy ampliamente, englobando dos conceptos diferentes para el entendido: los marcadores y las verdaderas banderas.

Un marcador es en realidad una "variable de memoria" que imita a una bandera. Esto puede confundir a algunos, pero si pensamos en el número que contiene la bandera como una variable, vemos que LET 10 5 es como el BASIC LET J=5; lo mismo que PLUS 9 5 es como LET J=J+1; éstas podrían llamarse "acciones de variables de memoria".

En una verdadera bandera las acciones son solo CLEAR y SET, lo que sería lo mismo que LET 10 0 y LET 10 255.

Por lo que respecta a las condiciones; si usamos una verdadera bandera, sólo podríamos comprobar si está a cero (CLEAR) o no (SET); y ello sólo usando los comandos ZERO y NOTZERO.

Si la usamos como una variable de memoria le podemos asignar cualquier número, recordando que ZERO 9 es lo mismo que EQ 9 0, y que NOTZERO 9 es lo mismo que GI 9 0.

Los comandos usados anteriormente son del PAW, pero la teoría es la misma para todos los parsers y el BASIC. Sólo el método que se aplica y las órdenes variarán según el caso.

Una bandera o marcador por sí solo no sirve para nada, sólo indica un estado; pero si se usa junto con otras condiciones o acciones se transforma en el arma más poderosa del arsenal de un escritor de aventuras; con él controlamos las puertas, los objetos, los personajes y en general todas las demás condiciones.

Veamos un ejemplo simple:

El aventurero ha llegado a esa tenebrosa habitación y se encuentra con un viejo arcón. Está cerrado, pero merece ser explorado. Lo primero que hay que hacer es abrirlo y ver qué contiene.

Condición 1: Si ["abre el arcón", trae el tesoro a la habitación actual, ponlo en el arcón e informa al jugador de que está aquí.

Muy simple y obvio, pero si lo dejamos así tiene importantes fallos estructurales.

¿Qué pasa si el jugador coge el tesoro y luego trata de abrir el arcón otra vez?

Que la condición se ejecutará como antes y entonces al jugador le desaparecerá el tesoro de las manos, puesto que el sistema volverá a poner el tesoro en el arcón abierto.

Por lo tanto necesitamos "algo" que le diga al sistema que no abra el arcón si ya está abierto. Y ese algo es... una bandera.

Condición 2: Si ["abre el arcón" (y el arcón no ha sido abierto)], trae el tesoro a la habitación actual, ponlo en el arcón "setea una bandera para indicar que el arcón ya ha sido abierto" e informa al jugador de que el tesoro está aquí.

Ahora el jugador encontrará el tesoro la primera vez que abra el arcón, pero si lo coge y trata de abrir otra vez el arcón, no se cumplirá la condición 2, luego no se ejecuta la acción.

La condición 2 traducida al GAC sería:

IF (VERB "abrir" AND NOUM "Arcón" AND RES? "bandera x") BRIN "tesoro" SET "bandera x" MESS "Contiene un fabuloso tesoro" WAIT END.

Y su equivalente en el PAW:

OPEN CHEST condiciones: ZERO FLAGNO acciones CREATE "TESORO" SET FLAGNO MESSAGE "Contiene un fabuloso tesoro" DONE

Lo anterior es un ejemplo muy simple y sin ningún refinamiento. Es necesario tener también una entrada que le diga al jugador que el arcón ya está abierto si el marcador está seteado o no es cero; así como poner la bandera a cero si el arcón está cerrado, en cuyo caso el tesoro no se podrá ver. Pero eso esperamos que lo hagas tú.

Cuando se han entendido los principios básicos del uso de las banderas, las podemos usar para controlar cualquier situación: si una puerta está abierta o cerrada; el que el jugador se ahogue al quedarse sin aire; el dinero que lleva; el poder lanzar hechizos sólo si los ha aprendido previamente; y un largo etcétera.

Tener siempre en cuenta que, aparte del ambiente, descripciones y los dibujos, las banderas son las que dan la diferencia entre una aventura bien hecha y un destartalado engendrillo, porque son ellas las que informan al sistema del estado actual de todas las variables del juego.

Tomemos otro ejemplo frecuentísimo: es casi de rigor que una aventura tenga una zona oscura por la cual no se puede pasar sin una fuente de luz. Supongamos que, en nuestro caso, es una antorcha.

El control de esa antorcha, es decir, lo que nos informa si está encendida o no, es una bandera.

Decidimos arbitrariamente que cuando la antorcha está apagada la bandera será igual a cero; cuando esté encendida, la bandera será igual a 1.

Ahora queremos encender la antorcha. Al teclear "encender antorcha" (y suponiendo que haya algo con lo cual se pueda encender) el programa debe chequear el valor de nuestra bandera.

Si su valor es 1, entonces podemos imprimir el mensaje "ya está encendida, pon más atención".

Pero si su valor es 0, pasan dos cosas:

a) Se imprime el mensaje que confirma el resultado de la acción: "ya tienes la antorcha encendida"

b) El paso de la bandera de 0 a 1.

Este punto (b) es muy importante, puesto que le dice al programa que la antorcha está ahora encendida, y por lo tanto no puede encenderse otra vez.

Claro que si queremos APAGAR la antorcha la bandera debe volver a valer 0.

Como ves, es todo muy simple, sin embargo demasiadas aventuras, incluso algunas producidas comercialmente, sufren del SÍNDROME DE LA BANDERA DESCONTROLADA. Por eso, en ellas se puede abrir puertas sin llaves, matar monstruos sin llevar el arma adecuada, abrir arcones hasta el infinito para producir cada vez otro tesoro, ver en la oscuridad, etc. En fin, un desastre ecológico completo.

Aparte de entender el uso de las banderas, también es conveniente mantener una relación de todas las usadas y para qué ha sido usada cada una, así como hacer siempre, antes de entregar el juego, un completo chequeo de TODAS las condiciones donde hay banderas.

Y es que las cosas se pueden complicar cuando se entrelazan varias situaciones, controladas por diferentes banderas, en una sola acción simultánea.

Esto llega a su máxima complejidad en la creación de personajes PSI o pseudointeligentes, donde cada una de sus características estará controlada por una bandera y se te montan unos verdaderos crucigramas. Si no llevas un estricto control, pronto tu personaje empezará a comportarse de un modo muy extraño.

### Una puerta problemática

Veamos un ejemplo, no tan complicado, pues ello escapa de esta inicial exposición, sobre el uso de banderas mezcladas.

Tenemos una puerta. Puede estar abierta o cerrada. Cerrada con pestillo o cerrada sin pestillo.

Si asumimos que el Parser reconoce el uso de todas las palabras, y nos olvidamos de las demás condiciones y sólo nos concentramos en el estado de la puerta, vemos que puede estar:

Con pestillo (y por tanto cerrada)

Cerrada sin pestillo.

Abierta (y por lo tanto sin pestillo).

Trasladamos esto a la bandera:

Si está a 0 = puerta cerrada y con pestillo.

Si está a 1 = puerta cerrada sin pestillo.

Si está a 2 = puerta abierta.

Entonces el programa reaccionará de la siguiente forma:

ABRIR PUERTA

Bandera=0, mensaje "quitas el pestillo y abres la puerta"; paso de bandera a 2 o bien, mensaje "no puedes abrir la puerta, algo te lo impide"; bandera permanece en 0.

Bandera=1, mensaje "abres la puerta"; paso de bandera a 2.

Bandera=2, mensaje "¡pero si ya está abierta, tarao!"; la bandera permanece en 2.

CERRAR PUERTA

Bandera=0, mensaje "ya está cerrada, cegato"; bandera permanece en 0.

Bandera=1, mensaje "ya está cerrada, cegato"; bandera permanece en 1.

Bandera=2, mensaje "Cierras la puerta"; paso de bandera a 1.

PONER PESTILLO (APESTILLAR si lo prefieres)

Bandera=0, mensaje "¿no te parece que ya está bastante cerrada?"; bandera permanece a 0.

Bandera=1, mensaje "Vale, le pones el pestillo, ahora estás más seguro"; paso de bandera a 0.

Bandera=2, mensaje "Cierras la puerta y le pones el pestillo" paso de bandera a 0, o bien, mensaje "pasas el pestillo a la puerta abiertilla, listillo" bandera permanece en 2.

(si estás antento verás que aquí aparece una interesantísima variante. Se puede poner la bandera en otro valor que indique "abierta con el pestillo pasado" y en este estado no se podría cerrar la puerta, y eso es lo que hace una aventura divertida.)

RETIRAR PESTILLO (¿DESAPESTILLAR?)

Bandera=0, mensaje "Vale tio"; paso de bandera a 1.

Bandera=1, mensaje "muy agudo, pero ya lo está"; bandera permanece a 1.

Bandera=2, mensaje "te diviertes jugando con el pestillo de la puerta abierta; para Segismundo Freud eso tendría su significado"; bandera permanece a 2.

Esto es un breve ejemplo de la importancia de las banderas y de por qúé se debe llevar su control. Piensa que sólo teníamos una puerta que se podía abrir o cerrar y un miserable pestillo; ¡imagínate cómo puede llegar a complicarse la cosa al tratar de imitar la vida real en sus múltiples variantes!

### Banderas en el GAC

Hay 128 "Contadores" que pueden tener cualquier número entre 0 y 255. El contador 0 se encarga de la puntuación y los 126 y 127 llevan la cuenta de las movidas hechas durante el juego. Los demás están libres para escritor.

A esto hay que añadir 256 "Marcadores" que sólo pueden ser seteados o reseteados.

Hay 4 que usa el sistema:

El 0 controla la descripción de las habitaciones.

El 1 si la habitación está iluminada o no.

El 2 si el jugador lleva o no una fuente de luz.

El 3 decide si en el juego va a haber puntuación o no.

Los otros 252 quedan libres para el usuario.

Las órdenes que controlan el estado de los marcadores son:

SET m, evidentemente setea el marcador m.

RESET m, lo resetea.

SET? m, comprueba si el marcador m está seteado.

RES? m, compruena si el marcador m esta reseteado.

Los contadores se manejan con los siguientes comandos:

x CSET c, le da un valor (x) al contador c.

INCR c, aumenta el contador c en uno, hasta 255.

DECR c, disminuye el contador c en uno, hasta 0.

CTR c, disminuye el contador c en uno, hasta 0.

x EQU? C, compara los valores entre x y c.

TURN, nos da el número llevado por los contadores 126 y 127.

### Las banderas del PAW

Hay 256 y son las siguientes:

0: control de la luz

1: objetos llevado.

2: disminuye automáticamente al describirse una localidad.

3: disminuye automáticamente al describirse una localidad y está oscuro.

4: disminuye automáticamente al describirse una localidad y está oscuro y el objeto 0 (fuente de luz) no está presente.

5 a 8: disminuye automáticamente con cada turno del juego.

9: disminuye automáticamente con cada turno si está oscuro.

10: disminuye automáticamente con cada turno si está oscuro y el objeto 0 (fuente de luz) no está presente.

11 a 28 LIBRES PARA USAR.

29: lleva el control de los gráficos.

30: lleva la puntuación.

31 y 32: los turnos del jugador.

33: lleva el verbo de la frase actual.

34: lleva el primer nombre de la frase actual.

35: lleva el adjetivo del primer nombre de la frase actual.

36: lleva el adverbio de la frase actual.

37: lleva el máximo número de objetos transportables.

38: es la actual localidad.

39: lleva donde debe imprimirse la línea del texto.

40: controla de siete formas diferentes el display de pantalla.

41: lleva el número de línea donde se divide la pantalla entre el dibujo y el texto.

42: contiene el mensaje con que se desea contestar el input del jugador.

43: lleva la preposición de la frase actual.

44: lleva el segundo nombre de la frase actual.

45: lleva el adjetivo del segundo nombre de la frase actual.

46: lleva el pronombre del nombre actual.

47: lleva el pronombre del adjetivo actual.

48: lleva la duración del timeout o tiempo muerto permitido.

49: con ella se controlan todas las formas posibles de timeout o tiempo muerto. De ocho formas diferentes según el BIT usado.

50: lleva el número del objeto para un bucle de DOALL.

51: lleva el número del último objeto referido.

52: controla la fuerza que se le supone al jugador.

53: controla la forma de impresión de un INVENTARIO en la pantalla.

54: lleva el número de la localidad del objeto actualmente referido.

55: lleva el peso del objeto actualmente referido.

56: controla si el objeto actualmente referido es un contenedor de otros objetos.

57: controla si el objeto actualmente referido se puede llevar puesto encima.

58 y 59: NO DEBEN USARSE, PUES SE UTILIZARÁN EN FUTURAS VERSIONES DEL PAW.

60 a 255: LIBRES PARA EL USUARIO.

Las condiciones para controlar en esta multitud de banderas son: (flagno, significa cualquier bandera)

ZERO flagno; válida si la bandera es 0.

NOTZERO flagno; evidente.

EQ flagno,valor; comprueba el valor de la bandera.

NOTEQ flagno,valor; evidente.

GT flagno,valor; válida si la variable contenida es mayor que valor.

LT flagno,valor; válida si es menor.

SAME flagno1,flagno2; válida si ambas banderas tienen el mismo valor.

NOTSAME flagno1,flagno2; válida si lo contrario.

Y las acciones producidas en las banderas serán:

SET flagno

CLEAR flagno

LET flagno valor; le da el valor a la bandera.

PLUS flagno valor; le suma el valor a la bandera, hasta 255.

MINUS flagno valor; le resta el valor a la bandera, hasta 0.

ADD flagno1 flagno2; añade el contenido de la 1 a la 2.

SUB flagno1 flagno2; resta el contenido de la 1 a la 2.

COPYFF flagno1 flagno2, copia el contenido de la 1 a la 2.

RANDOM flagno; poderoso comando para manipular PSI. Se explicará cuando tratemos de ellos.

MOVE flagno; poderoso comando para manipular PSI. Se explicará cuando tratemos de ellos.

GOTO locno; cambia el valor de la bandera 38 al valor de locno. En realidad lo que hace es mover el jugador a esa localidad.

WEIGHT flagno; calcula el peso de todos los objetos llevados por el jugador y lo pone en la bandera.

ABILITY valor1 valor2; setea la bandera 37 al valor1 y la bandera 52 al valor2, es decir, permite modificar tanto el número de objetos llevables, como su peso.

PRINT flagno; imprime el contenido, en decimales, en la pantalla.

TURNS; imprime el valor de la banderas 31+256*32.

SCORE; imprime el valor de la bandera 30.

Como resumen final de estos cuatro últimos capítulos diremos que el GAC es una buena utilidad, de fácil manejo, pero con algunas limitaciones; pero si quieres producir trabajos realmente competitivos tendrás que aprender el PAW, más difícil, pero más completo y elegante.

En la próxima entrega estudiaremos cómo se plantea una aventura, desde sus comienzos como sólo una idea, hasta su entrega final a esa productora que nos va a hacer famosos y millonarios.

Andrés R. Samudio.

>