El paso del tiempo: daemons, relojes, turnosEl modelo del mundoLas diferentes formas de establecer conversaciónLuz y oscuridad

Luz y oscuridad

La librería se ocupa de todo. El programador sólo tiene que especificar qué objetos dan luz y cuáles no, y la propia librería se ocupa de deducir si la habitación en la que se halla el jugador tiene luz o no. Incluso es capaz de deducir cuándo aparece o desaparece la luz, lo cual incluye eventos como por ejemplo:

Hay un eclipse total de sol
Salta el interruptor general de la casa
Tu linterna se queda sin pilas
Un enano te roba la linterna y se va con ella
Dejas caer una cerilla encendida, con la que te alumbrabas
Pones la linterna en una caja opaca y cierras la tapa
El humo negro hace opaca la botella en la que ardía la vela
El enano que había robado tu linterna entra corriendo en la habitación oscura en la que estabas.

El objetivo de la lista anterior es mostrar que el manejo correcto de la luz y la oscuridad es complicadillo y que mejor se lo dejas a la librería. Tu código tan sólo necesita hacer algo como lo siguiente:

give linterna luz;
remove cerilla;
give botella ~transparente;
move enano to HabitacionOscura;

y deja que la librería deduzca las consecuencias. Como puedes suponer, el atributo luz significa que un objeto emite luz (o si se trata de una habitación, que está iluminada, por ejemplo porque es un lugar exterior y es de día). Si quieres que en tu juego nunca haya oscuridad, una forma ingeniosa de hacerlo sería:

  give jugador luz; 

en la rutina Inicializar. El juego se comportará como si el jugador emitiera luz, por lo que nunca habrá oscuridad cerca de él.

La definición de "cuándo hay luz" es bastante complicada, e implica recursividad hacia arriba y hacia abajo en el árbol de objetos del juego. Recuerda que el objeto padre del jugador (aquél en que está contenido) no tiene por qué ser necesariamente una habitación, puede ser por ejemplo un coche cuyo padre es una habitación.

Definición
Hay luz para el jugador si en el objeto padre del jugador "Hay luz". En un objeto "Hay luz" si:
y un objeto "tiene fuente de luz" si

El proceso termina tan pronto como se descubra luz. Existen dos rutinas que el programador puede encontrar útiles (retornan true o false):

  HayLuz(objeto);
  TieneFuenteDeLuz(objeto); 

(!) De modo que la luz es emitida hacia arriba y hacia abajo en el árbol de objetos. En algunos casos especialmente retorcidos esto puede no ser así, por ejemplo una caja opaca cuyo exterior es fluorescente pero cuyo interior está a oscuras, y que contiene un actor que no debería ver nada de lo que hay en la caja... El dilema puede resolverse poniendo una caja ficticia dentro de la exterior.

(?) EJERCICIO 32  Imagina un troll que tiene miedo de la oscuridad y que te impide el paso hasta que le ofrezcas algo con qué alumbrarse ¿cómo lo programarías de modo que aceptara una pecera que contiene un pez fluorescente lo mismo que aceptaría una lámpara encendida?
(Solución) Este es fácil.

Tras cada turno, la librería vuelve a calcular si hay luz o no. La ausencia de luz afectará a las acciones Mirar, BuscarEn, MirarDebajo y Examinar. Además, ya que este suele ser un rompecabezas típico, afectará a la acción Ir si proporcionas una rutina llamada CaminarAOscuras. Si esta rutina existe, será llamada por la librería cada vez que el jugador se mueva desde un lugar a oscuras a otro lugar a oscuras, justo antes de que la descripción de la nueva habitación sea impresa. En esta rutina puedes matar al jugador o hacer cualquier otra acción. Si no proporcionas esta rutina, el jugador podrá moverse libremente a oscuras (sujeto a las reglas y salidas de los lugares por los que pase, claro).

(!) Cuando el jugador se queda a oscuras, la variable localizacion pasa a tomar el valor laoscuridad, que es un objeto especial que actúa como una habitación y que tiene como nombre corto "Oscuridad". Puedes cambiar algunas propiedades de esta "habitación", como por ejemplo su rutina inicial, su descripcion o su nombre_corto. Por ejemplo, en la rutina Inicializar podrías poner:

  laoscuridad.nombre_corto= "Oscuridad tétrica";  

Véase el ejemplo en el capítulo sobre el paso del tiempo donde se crea una "oscuridad" amenazadora para el juego Ruinas.

(!)
(?) EJERCICIO 33  Programar un murciélago mascota que se escapa en cuanto se ve a oscuras.
(Solución)


Zak McKraken - spinf@geocities.com

El paso del tiempo: daemons, relojes, turnosEl modelo del mundoLas diferentes formas de establecer conversaciónLuz y oscuridad