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

Por: Javier San José

Hace algún tiempo traté en esta sección el tema de los contenedores y propuse una rutina para el SINTAC que realizaba la acción de METER algo EN un contenedor.

Recuerdo que se usaba la bandera de usuario 0 para indicar si el objeto era o no contenedor, así:

     @5   SACO      _    1    XOOOOOOOOOOOOOOO
     un viejo saco

sería la definición de un objeto "contenedor". El proceso que hacía todo esto era el siguiente:

     \PRO 10
     ; METER objeto EN contenedor.
     ; 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 del 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
     _         _    LET  3    [254]
                    LET  4    [255]
                    WHATO

     ; si tiene el objeto lo metemos en el contenedor
     _         _    CARRIED [8]
                    PUTO [253]
                    MESSAGE   "Metes _."
                    DONE

     ; si no tiene el objeto, avisamos
     _         _    MESSAGE   "No tienes eso."
                    NOTDONE

     \END

El proceso ha sido ligeramente modificado para que avise con un mensaje si no se lleve el objeto que se pretende meter en el contenedor.

El siguiente proceso es complementario al anterior. Es decir, permite SACAR algo DE un contenedor.

     \PRO 11
     ; SACAR objeto DE contenedor.
     ; Este proceso saca el objeto cuyo nombre y adjetivo
     ; son los primeros de la frase (variables 3 y 4) del
     ; objeto cuyo nombre y adjetivo van en segundo lugar en
     ; la frase tecleada (variables 5 y 6), si este último es
     ; un contenedor.
     ; VARIABLES USADAS: 253, 254 y 255
     ; SALIDA: si el objeto se pudo sacar del 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 del 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 sacar _ de ahí."
                    NOTDONE

     ; si es contenedor recuperamos las variables 3 y 4
     _         _    LET  3    [254]
                    LET  4    [255]
                    WHATO

     ; si el objeto está en el contenedor lo sacamos
     _         _    ISAT [8]  [253]
                    PUTO 254
                    MESSAGE   "Sacas _."
                    DONE

     ; si el objeto no está en el contenedor, avisamos
     _         _    MESSAGE   "Eso no está ahí."
                    NOTDONE

     \END

Este proceso es similar al anterior; de hecho la primera parte es idéntica. Antes de sacar el objeto del contenedor se comprueba si este está dentro del contenedor, si está lo sacamos y si no se imprime un mensaje de aviso.

Para usar estos procesos se colocarían en el Proceso 4 (tabla de respuestas) las siguientes entradas:

     METER     _    PROCESS 10
                    DONE
     METER     _    DONE      ; esto se ejecuta si no pudo
                              ; meter el objeto
     SACAR     _    PROCESS 11
                    DONE
     SACAR     _    DONE      ; esto se ejecuta si no pudo
                              ; sacar el objeto