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

Por: Javier San José

En esta entrega aclararé conceptos que, aunque vienen explicados en el manual, no está de más dejar bien claros. Estos son la indirección y el uso de las constantes simbólicas.

En primer lugar ¿por qué la indirección?. Tengo que decir que he sido uno de los pocos afortunados que pudo, en su día, obtener una copia del DAAD. El DAAD es algo así como un pariente rico del PAW. Tiene lo que tiene el PAW y más. Una de las cosas que más me llamó la atención cuando leí la documentación del DAAD es que en ella se hablaba de algo llamado indirección, en realidad "indirection" en inglés que yo traduzco afortunada o desafortunadamente como indirección.

La indirección permite, en resumen, usar el valor contenido en una variable como parámetro de un condacto. Lo primero que pensé es que, ¡vaya! cuanto hubiese deseado yo tener algo así en el PAW para hacer bucles, mover PSIs,... La indirección en el DAAD sólo estaba permitida en el primer parámetro de cada condacto. Cuando me propuse crear el SINTAC, después de decidir que seguiría la estructura de condactos del PAW, decidí incluir la posibilidad de indirección en los condactos pero, es más, decidí que sería posible aplicarla a los dos primeros parámetros de cada condacto. Esto que puede parecer una limitación no lo es tanto ya que la mayoría de los condactos del PAW (y del SINTAC) sólo admiten uno o dos parámetros.

Otra de las cosas que me llamó la atención en la lectura de la documentación del DAAD es que ¡era posible ejecutar saltos incondicionales (GOTOs) dentro de los Procesos!. El condacto que permitía esto era SKIP, condacto que yo adopté enseguida para el SINTAC. La limitación en el condacto SKIP del DAAD era que el desplazamiento máximo del salto era de 128 bytes adelante o atrás, una limitación que no existe en el SINTAC.

En fin, basta ya de historias y pasemos a explicar un poco eso de la indirección. Más que explicar pondré ejemplos que aclaren los posibles usos de esta propiedad del SINTAC.

En primer lugar la indirección permite la creación de "condactos personalizados":

     _    _    LET       100  0
     $bucle
     _    _    CARRIED   [100]
               DROP      [100]
     _    _    LT        100  50
               INC       100
               SKIP      $bucle

Este fragmento de código comprueba todos los objetos del 0 al 49 y, si el jugador lleva alguno (CARRIED [100]), lo deja (DROP [100]). Es algo así como el DROPALL del PAW sólo que aquí podemos trabajar con un rango de objetos específico. La clave del funcionamiento de esta rutina está en la variable 100. Primero la inicializamos a 0 (LET 100 0) ya que comprobaremos los objetos del 0 en adelante. Luego entramos en un bucle en el que miramos si el jugador lleva el objeto cuyo número está en la variable 100 y si lo lleva lo dejamos. Esta comprobación "...si el jugador lleva el objeto cuyo número está en la variable 100" es claramente un caso de indirección.

Por último comprobamos si hemos alcanzado el número del último objeto que queremos comprobar, en este caso el 49 (LT 100 50), si no incrementamos la variable 100 para pasar al siguiente objeto de la lista y volvemos al principio del bucle. Este ejemplo creo que aclara dos conceptos "nuevos" para los que estéis acostumbrados al PAW, la indirección por una lado y la creación de bucles con en condacto SKIP por otro.

Las circunstancias en las que claramente es necesario el uso de indirección incluyen aquellas en las que queramos que alguno de los parámetros de un condacto sea variable. Valga como ejemplo la rutina siguiente:

     _    _    RANDOM    100       16
               ISAT      [100]     252
               CREATE    [100]
               MESSAGE   "Ves aparecer _."

Esta rutina hará aparecer, siempre que sea ejecutada, un objeto aleatorio entre 0 y 15 ante el asombrado jugador. Pensad por un momento la forma de hacer esto en el PAW... La primera parte de la rutina se encarga de generar un número aleatorio entre 0 y 15 y lo almacena en la variable 100 (RANDOM 100 16). Luego comprueba si el objeto cuyo número acabamos de generar está "no creado" (ISAT [100] 252) y si es así lo crea haciéndolo aparecer ante las narices del jugador (CREATE [100]).

Podría poner muchos más ejemplos de indirección pero creo que estos dos dan una idea clara de los posibles usos de la misma.

Constantes simbólicas, ¿que será eso?, ¿realmente son necesarias?; quizá sean estas dos preguntas las que se os hayan pasado por la cabeza a aquellos que hayáis leído el manual del SINTAC T2.

Estrictamente hablando las constantes simbólicas no son realmente necesarias; todo aquello que se puede hacer con ellas se puede hacer sin ellas, la prueba está en que el PAW no las tenía y ello no ha impedido que muchos de vosotros programéis estupendas aventuras con él. Esto parece una contradicción, ¿no es así?. Ocurre que el uso de constantes simbólicas facilita en cierta manera la programación. Imaginemos que empezamos a escribir una aventura y, como suele ser habitual, no hemos hecho un esquema en papel antes de sentarnos frente al ordenador (es lo que yo hago y no pienso cambiar por mucho que digan los puristas de la programación...).

Empezamos metiendo unas cuantas localidades, unos cuantos objetos algún que otro mensaje y finalmente empezamos a programar los Procesos. En esta hipotética aventura queremos dar información del progreso a base de porcentaje completo de aventura. Empezamos a codificar los Procesos y ¡tenemos que decidir cuantos puntos damos por abrir esa puerta, o por hablar con ese PSI que tiene esa información tan importante, o por...! y así en multitud de entradas en los Procesos.

Pero ¿por que no usar las constantes simbólicas?. Al principio del programa pondremos algo así:

\\P_ABRIR 1 ; puntos por abrir puerta de casa vieja \\P_HABLAR_PSI 1 ; puntos por hablar con PSI \\P_ENCONTRAR 1 ; puntos por encontrar libro ...

Luego cuando la aventura esté acabada ya nos encargaremos de ajustar estos valores para que sumen el 100%. Imaginad el hacer esto sin constantes, tendríamos que ir buscando uno por uno los lugares donde incrementamos el porcentaje y cambiarlos para que al final la suma total sea 100.

En este caso las constantes simbólicas nos ahorran una gran cantidad de trabajo. Así nuestras entradas en los procesos quedarían de la siguiente forma:

     ABRIR     PUERTA    ZERO 50
                         ADD  100  P_ABRIR
                         SET  50
                         DONE
     ...
     HABLAR    PSI       ZERO 51
                         ADD  100  P_HABLAR_PSI
                         SET  51
                         PROCESS   10
                         DONE
     ...
     BUSCAR    LIBRO     ZERO 52
                         ADD  100  P_ENCONTRAR
                         SET  52
                         CREATE    4
                         DONE
     ...

Aquí sólo tratamos con 3 entradas pero imaginad si son decenas de ella repartidas entre varios Procesos.