TECNICAS AVANZADAS DE PROGRAMACION DE AVENTURAS Programación con el sistema SINTAC T2

Por: Javier San José

En esta entrega intentaré explicar el uso de las banderas de objeto definibles por el usuario y además, como ejemplo de su uso veremos como podemos crear contenedores. Este es un concepto nuevo para los que estáis acostumbrados a programar con el PAW.

En el PAW las únicas características de un objeto que se podían variar eran su peso, si era prenda o no y si era un contenedor.

El SINTAC no admite definición de peso ni de contenedor para los objetos. Esto que parece una seria limitación no lo es tanto, aunque hay que reconocer que requerirá un poco más de esfuerzo al programar la aventura, ya que el SINTAC admite la definición de hasta 16 banderas por objeto.

Estas banderas pueden usarse para indicar si un objeto es contenedor, lo que ocurre es que, al contrario que en el PAW, el SINTAC no proporciona condactos de manejo automático de contenedores y, por tanto, habrá que programarlos.

Vamos a ver como. Reservaremos la bandera de usuario 0 para indicar si el objeto es o no un contenedor, así el objeto:

     @5   SACO      _    1    XOOOOOOOOOOOOOOO
     un viejo saco

será un contenedor ya que hemos activado su bandera de usuario número 0. Aquí he de aclarar que las banderas de usuario se definen en la creación de un objeto y no pueden ser modificadas posteriormente, al menos en la actual versión del sistema. Es posible que en nuevas versiones se incluya esta interesante posibilidad.

Sigamos. Crearemos ahora un sencillo proceso que permita introducir objetos dentro de los contenedores:

     \PRO 10
     ; Este proceso introduce el objeto cuyo nombre y adjetivo
     ; son los primeros de la frase (variables 3 y 4) en el
     ; objeto cuyo nombre y adjetivo van en segundo lugar en
     ; la frase tecleada (variables 5 y 6), si este último es
     ; un contenedor. La localidad usada para "contener" los
     ; objetos es la de igual número que la del objeto
     ; contenedor así que esta debe quedar libre.
     ; VARIABLES USADAS: 253, 254 y 255
     ; SALIDA: si el objeto se pudo colocar en el
     ; contenedor se ejecutará el siguiente condacto al
     ; PROCESS de llamada, si no se saltará a la siguiente
     ; entrada

     ; guardamos las variables 3 y 4
     _         _    LET  254  [3]
                    LET  255  [4]

     ; copiamos nombre2 y adjetivo2 en variables 3 y 4 para
     ; usar WHATO
     _         _    LET  3    [5]
                    LET  4    [6]

     ; con WHATO cogemos el número de objeto contenedor y lo
     ; guardamos para usarlo posteriormente
     _         _    WHATO
                    LET  253  [8]

     ; si no es contenedor salimos
     _         _    HASNAT    0
                    LET  3    [254]
                    LET  4    [255]
                    WHATO
                    MESSAGE   "No puedes meter _ ahí."
                    NOTDONE

     ; si es contenedor recuperamos las variables 3 y 4 y
     ; ponemos el objeto en la localidad del contenedor
     _         _    LET  3    [254]
                    LET  4    [255]
                    WHATO
                    PUTO [253]
                    MESSAGE   "Metes _."
                    DONE

     \END

Me saltaré la explicación de este proceso ya que está ampliamente comentado. Para usar este proceso debemos colocar en nuestra "tabla de respuestas" una entrada como la que sigue:

     METER     _         PROCESS   10
                         DONE
     SACAR     _         ...

Es importante que comprendáis, en el proceso 10, el uso de DONE y NOTDONE. Si salimos de un proceso con DONE se ejecutará la entrada siguiente al condacto PROCESS que ejecutó la llamada, en el ejemplo anterior se ejecutará el DONE que hay tras PROCESS 10, en cambio si salimos con NOTDONE se saltará a la siguiente entrada, en el ejemplo se saltaría a la entrada SACAR _.

Como veis con un proceso de unas 20 líneas, sin contar los comentarios, emulamos de una manera sencilla el condacto PUTIN del PAW.

Dejaré que penséis la forma de realizar la función inversa, es decir, sacar objetos de un contenedor. Realmente es muy parecido al anterior proceso así que si comprendéis su funcionamiento no deberíais tener ningún problema.

CONDACTOS RESP Y NORESP

TO RESP, OR NOT TO RESP; THAT'S THE QUESTION... Permitidme empezar este epígrafe de esta forma tan (ejem) literaria. Los de mente más aguda habréis adivinado ya de que hablaré hoy. Si señores, de los condactos RESP y NORESP.

¿Y por qué estos dos condactos?. Bueno, la razón no es otra que VERSATILIDAD. Cuando diseñé el SINTAC, aunque me basé en el PAW, pensé en añadirle ciertas mejoras que no estaban presentes en el PAW y que a mí, más de una vez, me hubiesen resultado de lo más útiles.

Pensé que sería bueno disponer de la capacidad de poder activar y desactivar la comprobación verbo-nombre cuando al programador le viniese en gana.

La comprobación verbo-nombre no es otra que la que el PAW realiza SIEMPRE en las entradas de la tabla de Respuestas; es decir, el PAW sólo ejecuta una entrada de la tabla de Respuestas si su verbo-nombre se corresponden con en verbo- nombre de la última sentencia lógica.

Si en el PAW tecleamos SALTA BARRANCO, en la tabla de Respuestas sólo se ejecutará(n) la(s) entrada(s) de la forma:

     SALTA     BARRANCO  AT   1
                         ....

Adicionalmente esto mismo ocurre en los Procesos que ejecutamos llamándolos desde la tabla de Respuestas.

Pues bien, el SINTAC cambia esto de la siguiente manera. Sólo hay dos posibilidades, que la comprobación verbo-nombre esté activada (se ejecutó un condacto RESP) o que esté desactivada (se ejecutó un NORESP).

Si la comprobación verbo-nombre está activada se ejecutarán solamente aquellas entradas cuyo verbo-nombre coincida con el verbo-nombre de la sentencia lógica actual (es decir el verbo- nombre contenidos en las variables del sistema 2 y 3 respectivamente).

Esto ocurrirá en TODOS los Procesos a los que se llame; y es que en el SINTAC no hay tabla de Respuestas propiamente dicha, sólo hay Procesos.

En cambio si la comprobación verbo-nombre se desactivó con NORESP se ejecutarán TODAS las entradas de TODOS los Procesos a los que se llame.

Entonces, si en el SINTAC no hay tabla de Respuestas, ¿cómo atendemos a las frases que teclee el jugador?. Muy fácil, creándonos nuestra tabla de Respuestas. Para ello usaremos un Proceso, en la base de datos de inicio he elegido el Proceso 2, arbitrariamente, como tabla de Respuestas.

En este Proceso escribiremos las entradas como lo haríamos en la tabla de Respuestas del PAW:

     COGER     _    ...
                    DONE
     DEJAR     _    ...
                    DONE
     ...
     EXAMINAR  _    ...
                    DONE
     ...

Al principio de esta tabla colocaríamos las líneas siguientes:

     _         _    PARSE
                    NOTDONE
     _         _    RESP

Las dos primeras se encargan de analizar la frase del jugador y si no queda más por analizar (o no tecleó nada) se sale del Proceso con un NOTDONE.

Una vez que hemos analizado la frase del jugador ya tenemos construida la sentencia lógica por lo que en la tercera línea activamos la comprobación verbo-nombre con el condacto RESP. En algún otro lugar, después de que este Proceso 2 (tabla de Respuestas) se haya ejecutado colocaremos un NORESP. Os invito a que miréis la base de datos de inicio suministrada junto al SINTAC para que os deis cuenta de como se lleva a cabo esto.

Por cierto que en el SINTAC el condacto PARSE se usa tanto para analizar la frase del jugador como para analizar los diálogos con PSIs. Digamos que el PARSE del SINTAC es un analizador de propósito general. Se limita a analizar una frase entre dos delimitadores (signos de puntuación, comillas,...).

Además en el PAW el condacto PARSE TAMBIEN activaba la comprobación verbo-nombre en el Proceso en que fuese ejecutado.

En el SINTAC no ocurre así; por tanto no olvidéis de ejecutar un RESP en un Proceso que destinéis a diálogo con un PSI.

Esto es todo por el momento, no olvidéis que estoy abierto a vuestras dudas o sugerencias sobre el SINTAC, quiero que este sistema de creación de aventuras satisfaga lo máximo posible a todos los que lleguéis a usarlo.