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

Por: Javier San José

En esta entrega voy a tratar de explicar las técnicas de programación que permiten crear PSIs más o menos sofisticados. Veremos como hacer que se muevan y que cojan o dejen cosas.

En primer lugar hay que tener en cuenta que en el SINTAC los PSIs no existen como tal; me explico, hay otros sistemas que disponen de condactos y facilidades especiales para manejar PSIs, tal es el caso del CAECHO. Por el contrario el SINTAC no dispone de estas facilidades por lo que habrá que programar los PSIs digamos desde cero.

En todo caso esto no es una labor en absoluto difícil si se tienen claros una serie de conceptos. Esos conceptos son los que trataré de explicar seguidamente.

La forma más correcta de definir a un PSI es asignar a cada uno que vayamos a crear una variable (al menos) y una localidad si está previsto que lleve objetos. La variable nos servirá para guardar la localidad en que se encuentra el PSI en cada momento. Por supuesto, si se trata de un PSI estático no es necesario reservar una variable ya que la localidad del PSI será siempre fija. Además debemos añadir un mensaje con el nombre del PSI y reservar uno o más procesos de control del PSI: uno para diálogo, uno para movimiento y uno o más auxiliares (coger y dejar objetos, p. ej.) Con todos estos datos confeccionaremos una tabla similar a esta:

PSI  VARIABLE  MENS TEXTO          LOC  PROCESOS

1    100       10   el jardinero   -    9=diálogo
                                        10=movimiento
2    101       11   el guardia     -    11=diálogo
                                        12=movimiento
3    102       12   Sir Gwain      249  13=diálogo
                                        14=movimiento
                                        15=auxiliar
                                        16=auxiliar

En esta tabla la columna VARIABLE indica la variable que se usará para guardar la localidad del PSI, la columna MENS indica el número de mensaje con el nombre del PSI, la columna TEXTO el texto del mensaje, la columna LOC indica la localidad que se usará para almacenar los objetos que lleve el PSI y la columna PROCESOS indica los procesos que se usarán para el control del PSI.

En este caso tenemos 2 PSIs que se mueven y dialogan y uno que además puede llevar objetos, los cuales serán puestos en la localidad 249. Seguiré la explicación con este último PSI, Sir Gwain.

Primero hay que inicializar la variable correspondiente, Gwain empieza en la localidad 5, así en PRO 4 antes del DESC [1] introduciremos lo siguiente:

     _    _    LET       102  5
    

Para que el jugador 'vea' a Gwain imprimiremos el mensaje correspondiente cuando esté en la misma localidad, esto va en PRO 1 (mejor al final):

     _    _    MES       "Aquí está: "
     _    _    EQ        [1]  [102]
               MES       12
     .
     .    (aquí entradas para otros PSIs)
     .
     _    _    NEWLINE

Ahora vamos a hacer que Gwain camine por unas cuantas localidades. Esto en el PRO 14, que es el de movimiento de Gwain:

     \PRO 14
     _    _    EQ        [1]  [102]
               MES       12
               MESSAGE   " se va."
     _    _    INC       102
               EQ        102  9
               LET       102  5
     _    _    EQ        [1]  [102]
               MES       12
               MESSAGE   " viene."
     \END

Este proceso mueve a Gwain siguiendo el recorrido de localidades 5-6-7-8-5-6... A este proceso lo llamaremos desde PRO 3 así:

      _    _    PROCESS   14
      

¿Por qué desde el PRO 3?, pues porque este proceso se ejecuta tras la respuesta del jugador. Así la secuencia de juego será: orden del jugador-movimiento de PSIs. Es decir, hasta que el jugador no introduzca su orden los PSIs no se moverán. Para que los PSIs se muevan cada cierto tiempo se debe usar el condacto TIME para limitar el tiempo que el jugador tiene para introducir su orden y si se le pasa se moverán los PSIs. Para ello en PRO 4 se añade una entrada de la forma:

     _    _    TIME      3    1
     

Así damos 3 segundos al jugador para que teclee la primera letra de la orden, luego en PRO 0, justo después de la etiqueta $buc_princ, se introducirá lo siguiente:

     $buc_princ
     _    _    TIMEOUT
               PROCESS   3
     _    _    SYSMESS   6
               ...

Con esto haremos que el PRO 3 se ejecute si se le ha pasado el tiempo al jugador; recordar que en PRO 3 van las llamadas a los PRO de movimiento de los PSIs.

El proceso de movimiento de este PSI tiene una 'pega' y es que el PSI permanece en cada localidad un sólo turno de juego y luego se larga. Esto impide que el jugador pueda dialogar con el PSI. Para evitar este problema se puede añadir un contador de movimiento que haga que el PSI permanezca más de un turno de juego en la localidad del jugador:

     \PRO 14
     _    _    NOTEQ     103  5
               INC       103
               DONE
     _    _    LET       103  0
     _    _    EQ        [1]  [102]
               MES       12
               MESSAGE   " se va."
     _    _    INC       102
               EQ        102  9
               LET       102  5
     _    _    EQ        [1]  [102]
               MES       12
               MESSAGE   " viene."
     \END

En este proceso modificado la variable 103 controla cuantos turnos está el PSI en una localidad antes de moverse a otra. Esta variable debería ser inicializada a 0 en el PRO 4.

Ahora vamos a ver los procesos necesarios para que el PSI pueda coger y dejar cosas. Usaremos dos procesos auxiliares:

     \PRO 15   ; Sir Gwain coge algo
     _    _    WHATO
               ISAT      [8]  [102]
               PUTO      249
               MESSAGE   "Sir Gwain coge _."
               DONE
     _    _    MESSAGE   "Sir Gwain no puede coger eso."
     \END

     \PRO 16   ; Sir Gwain deja algo
     _    _    WHATO
               ISAT      [8]  249
               PUTO      [102]
               MESSAGE   "Sir Gwain deja _."
               DONE
     _    _    MESSAGE   "Sir Gwain no tiene eso."
     \END

En el PRO 12, que es de diálogo de Sir Gwain, se añadirán las siguientes entradas:

     COGE _    PROCESS   15
               DONE

     DEJA _    PROCESS   16
               DONE

Con esto, cuando digamos al PSI que coja o deje algo lo hará. Si lo que se quiere es que el PSI haga estas cosas por su cuenta se deberá llamar a los PRO 15 y 16 desde el PRO 14, metiendo en las variables de nombre y adjetivo (3 y 4) el nombre y adjetivo del objeto que debe coger. En este caso se usarán unos procesos mejorados que impriman los mensajes "Sir Gwain coge _." o "Sir Gwain deja _." sólo si el jugador está presente.

     \PRO 15
     _    _    WHATO
     _    _    ISAT      [8]  [102]
               PUTO      249
               SKIP      $coge
     _    _    EQ        [1]  [102]
               MESSAGE   "Sir Gwain no puede coger eso."
               DONE
     $coge
     _    _    EQ        [1]  [102]
               MESSAGE   "Sir Gwain coge _."

El PRO 16 será similar a este. La forma en que se llamarán desde el PRO 14 será:

     _    _    LET       3    nombre_objeto
               LET       4    adjetivo_objeto
               PROCESS   14

Básicamente esto es todo lo que se debe saber para crear PSIs 'profesionales'. Con las ideas aquí expuestas y algo de imaginación se pueden crear PSIs que parezcan casi reales.