Objetos que pueden encenderse y apagarseEl modelo del mundoPuertasListado automático de salidas

Listado automático de salidas

(Esp) Si el programador pone al principio del programa (antes de cualquier otro include) la línea siguiente:

Constant ADMITIR_COMANDO_SALIDAS;       

Entonces el jugador podrá usar el verbo "Salidas" (o su abreviatura "x") y el juego responderá con la lista de salidas "obvias" que hay en esa habitación, es decir, la respuesta podría ser algo así:

Cámara Cuadrada
Una hundida y tenebrosa cámara de piedra, de 10 metros de ancho. Un
haz de luz corta las tinieblas desde lo alto de las escaleras, dándole
a la cámara una iluminación difusa. Pero en las sombras, dos bajos
dinteles al este y al sur llevan a la oscuridad más profunda del
Templo.",

> X
Salidas visibles: sur, este, arriba, fuera.

El programador no necesita escribir código alguno. La librería se ocupa de examinar el objeto "habitación" en el que se halla el jugador y comprobar si tiene algo definido en sus propiedades al_n, al_s, etc. De hecho es más inteligente que esto ya que usa el objeto brújula para ver cuáles son las direcciones creadas en el juego, para el caso especial de que el programador haya redefinido estas direcciones, como en los ejercicios 6 ó 7 antes vistos. Ahora bien ¿cómo sabe la librería qué salidas tiene una habitación?

La respuesta es que primero tiene que determinar qué tipo de información ha puesto el programador en una dirección dada, digamos por ejemplo al_n. Puede encontrarse uno de los siguientes casos:

  1. El programador no ha definido al_n en esa habitación. En ese caso esa salida no existe (no hay salida hacia el norte).
  2. El programador ha definido al_n pero le ha dado valor cero (este es un caso totalmente inusual, pero hay que tenerlo en cuenta). Esto significa que esa salida no lleva a ningún sitio, luego tampoco hay salida hacia el norte.
  3. El programador ha definido al_n y le ha dado como valor un texto entre comillas. En este caso se entiende que ese texto es un mensaje diciendo algo como "No puedes", por lo que tampoco hay salida hacia el norte.
  4. El programador ha definido al_n y le ha dado como valor otro objeto (es decir, otra habitación o bien un objeto tipo puerta). En este caso la librería asume que hay una salida hacia el norte.
  5. El programador ha definido al_n, pero su valor es una rutina. Habría que ejecutar esa rutina para saber qué responde (podría responder con un objeto, o bien con el valor 0 para indicar que no puede pasar). No obstante, si en este momento se ejecutara la rutina podría aparecer texto impreso por esta rutina (como por ejemplo "Con cuidado pasas hacia el norte") lo cual no es deseable ya que realmente el jugador no ha intentado ir en esa dirección. De modo que por si acaso, la librería asumirá que si hay una rutina es que sí hay una salida hacia el norte (al menos en algún momento del juego la habrá, cuando se cumplan las condiciones necesarias para que la rutina deje pasar).

Este último caso puede ser controvertido. La mayoría de las veces la suposición de la librería es correcta: hay una salida, sólo que tal vez el jugador no puede pasar aún por ella (por ejemplo, una puerta estrecha por la que no puede pasar si lleva un objeto). No obstante ¿es correcto que la salida aparezca listada si el jugador pone "salidas"?

La respuesta depende del juego. Si es una salida que se menciona en la descripción no hay nada malo en que el jugador vea esta salida con el comando "salidas", aún cuando no pueda atravesarla. Pero si se trataba de una salida "secreta" que no se desvela hasta más adelante (ej: una pared deslizante, que se abre con un mecanismo adecuado), entonces no debe mencionarse esa salida aunque el jugador escriba "salidas".

Evidentemente la librería no sabe de qué va el juego. Lo único que puede saber es que en esa dirección hay una rutina y que por tanto esa dirección llevará a algún sitio alguna vez.

Para ayudar a la librería con estos casos excepcionales, se le puede dar a la habitación una propiedad llamada salidas. Si esta propiedad existe en la habitación, la librería la llamará repetidas veces (una para cada dirección de la brújula), como si le preguntara "¿Debo decirle al jugador si hay salida en esta dirección?". La respuesta de la rutina será una de las siguientes:

  • [0] (o false) "Averigualo tú misma", le dice la rutina a la librería. Entonces la librería aplicará las reglas antes mencionadas.
  • [1] (o true) "Sí, pero no la muestres, ya la he mostrado yo". La librería no escribe nada pero toma nota de que hay al menos una salida en la habitación.
  • [2] "No, no la muestres"
  • [otros] "Sí, muestrala"

Así, por ejemplo, imaginemos una habitación que tiene una salida normal en el lado sur y una pared deslizante en el lado norte. La pared está abierta si el objeto mecanismo_secreto tiene la propiedad encendido (que obtendrá cuando el jugador active este mecanismo de la forma apropiada, esto formaría parte del código de ese objeto). La propiedad al_n deberá ser una rutina que compruebe ese mecanismo. La definición de la habitación podría ser esta:

Object SinSalida "Callejón sin salida"
 with   descripcion [;
            if (mecanismo_secreto hasnt encendido)
                print "Aquí parece terminar el pasillo, una pared lisa
                impide continuar hacia el norte.";
            else print "¡La pared que había en el lado norte ha 
                desaparecido! Al otro lado sólo ves oscuridad.";
            "Puedes volver al pasillo por el sur.";
        ],
        al_s Pasillo,
        al_n [;
            if (mecanismo_secreto has encendido)
                return HabitacionSecreta;
            else "No puedes atravesar paredes.";
        ],
 has    luz;

El problema con la definición anterior es que al_n es una rutina y por tanto la librería mostrará esa salida si el jugador lo pide. Algo así:

Callejón sin salida
Aquí parece terminar el pasillo, una pared lisa impide continuar hacia
el norte. Puedes volver al pasillo por el sur.

> X
Salidas visibles: norte, sur.

Lo deseable sería que la salida norte no fuera mencionada a menos que el mecanismo haya sido activado. Para lograr esto hay que darle a la habitación la propiedad salidas. Basta añadir lo siguiente entre las propiedades (por ejemplo, delante de la línea que dice has luz):

        salidas [ direc;
            if (direc==al_n) 
            {
                if (mecanismo_secreto has encendido) return 3;
                else return 2;
            }
            return 0;
        ],

Observar que recibe un parámetro llamado direc (podemos llamarlo como queramos), y que comprobamos si direc es igual a al_n (si no lo es, retorna 0, indicando que la librería debe averiguar por su método habitual si hay salida o no). Pero para el caso especial del norte, queremos decidir nosotros, y la decisión depende de si el mecanismo fue activado o no. Si lo fue retornamos 3 ("Sí, muestrala") y si no, retornamos 2 ("No, no la muestres"). También podríamos haber escrito nosotros la palabra "norte" o similar en el caso de que el mecanismo estuviera activado, y retornar 1 para que la librería no lo imprima. El return 0 podría haberse omitido, ya que de todas formas cuando la rutina llegara a su fin retornaría false. Por tanto otra forma alternativa de lo anterior sería:

        salidas [ direc;
            if (direc==al_n) 
            {
                if (mecanismo_secreto has encendido) "norte";
                else return 2;
            }
        ],

Observa que la cadena "norte" hace que ese texto sea impreso y además retorna true. Podríamos haber aprovechado para poner algo diferente a "norte", como por ejemplo "norte a través de la pared deslizante", o "hueco norte", etc.

Recuerda que para que el comando "Salidas" esté presente, debes definir la constante ADMITIR_COMANDO_SALIDAS. De lo contrario el jugador no podrá usar ese verbo.

Esta es una característica de InformATE que no existía en la librería original inglesa.


Zak McKraken - spinf@geocities.com

Objetos que pueden encenderse y apagarseEl modelo del mundoPuertasListado automático de salidas