![]() | ![]() | ![]() | Objetos que pueden encenderse y apagarse |
Los objetos pueden tener el atributo conmutable, lo que significa que se pueden encender y apagar, como si tuvieran algún tipo de interruptor. Si el objeto tiene el atributo encendido, significa que está encendido. Si no lo tiene, estará apagado. La librería cambia ese atributo cuando el jugador enciende o apaga el objeto. Por ejemplo:
Object foco_batman "Foco de la Ciudad de Gotham" Azotea
with nombre 'foco' 'luz' 'silueta' 'viejo',
articulo "el",
descripcion "Tiene una especie de silueta sobre él.",
si_encendido "El viejo foco de la ciudad proyecta la silueta
de un murciélago sobre las nubes bajas del cielo
crepuscular.",
si_apagado "Aquí está el viejo foco de la ciudad, olvidado
pero aún funcional.",
has conmutable estatico;
|
La propiedad articulo indica qué palabra debe usarse como artículo indefinido con este objeto (en lugar de "un"). Le ponemos "el" para que la librería nunca ponga algo como "llevas un Foco de la Ciudad de Gotham", sino "llevas el Foco de la Ciudad de Gotham" (bueno, en realidad el jugador nunca podrá llevar este objeto porque lo hemos hecho estatico).
De forma similar a las puertas que pueden tener diferente descripción inicial según estén abiertas o cerradas, los objetos conmutables también pueden tener diferente "descripción de habitación" si están encendidos o apagados. El texto de las propiedades si_encendido y si_apagado se mostrará junto con la descripción de la habitación (una u otra según el foco esté encendido o apagado). Ya que no le hemos dado el atributo encendido, eso significa que inicialmente está apagado. Si el jugador intenta examinar un objeto conmutable, además de la descripción del mismo se le informará seguidamente si está encendido o apagado:
> EXAMINA FOCO Tiene una especie de silueta sobre él. El Foco de la Ciudad de Gotham está apagado. |
Un objeto más complejo pero mucho más útil sería una linterna proporcione luz al encenderla, y que el jugador pueda llevar consigo. El código siguiente es parte de este objeto. Observa que lo hemos complicado un poco más, dándole la propiedad baterias que contendrá un número indicando si las baterías de la lámpara están muy cargadas o poco. Este código no está completo, ya que falta la rutina encargada de ir disminuyendo el valor de las baterías a medida que pasa el tiempo. Tal como está, la linterna estaría siempre a plena potencia (mantendría su valor inicial de 40).
Object lampara "lámpara de sodio" Camara
with nombre 'lampara' 'pesada' 'sodio' 'rechoncha',
describir [;
if (self hasnt encendida)
"^La rechoncha lámpara de sodio descansa pesadamente
en el suelo.";
else
"^La rechoncha lámpara de sodio descansa el el
suelo, iluminando la estancia.";
],
baterias 40,
antes [;
Examinar:
print "Es una pesadísima lámpara de arqueólogo";
if (self hasnt encendida)
" y ahora está apagada.";
if (self.baterias < 10)
" y está brillando con una luz muy tenue.";
else " y brilla con una radiante luz amarilla.";
Quemar: <<Encender self>>;
Encender:
if (self.baterias <=0)
"Desgraciadamente parece que se han agotado las
baterías.";
if (parent(self)~=localizacion
&& parent(self) hasnt soporte)
"La lámpara debe estar apoyada en un lugar firme,
antes de encenderla.";
Coger, Sacar:
if (self has encendida)
"La bombilla es demasiado delicada, no conviene
levantarla mientras está encendida. Además el asa está
muy caliente.";
],
despues [;
Encender:
give self luz;
Apagar:
give self ~luz;
],
has femenino conmutable;
|
Observa la rutina despues, es la encargada de hacer que la lámpara realmente proporcione luz al darle el atributo luz cuando es encendida y quitárselo cuando es apagada. No confundas el atributo encendido (que puede significar diferentes cosas según el objeto, por ejemplo un tocadiscos encendido podría estar haciendo música), con el atributo luz que significa que ese objeto está irradiando luz, y por tanto permitiría al jugador ver incluso aunque la habitación estuviera a oscuras. Para crear una linterna no basta con hacerla conmutable, hay que ponerle y quitarle el atributo luz "a mano", como en el ejemplo anterior.
Observa además cómo la rutina antes no te dejará encender la lámpara a menos que esté sobre el suelo o sobre un soporte. Por otro lado, si el jugador deja la lámpara en el suelo ya podrá encenderla, pero no podrá cogerla porque está demasiado caliente (como se indica en la regla para las acciones Coger y Sacar. Aparentemente la lámpara no le servirá de mucho (de hecho no puede llevarla apagada hasta un lugar oscuro y allí encenderla, ya que antes debería dejarla en el suelo, pero entonces ya no podrá referirse más a ella porque la librería, por defecto, no deja que el jugador pueda usar ningún objeto que esté en una habitación oscura, salvo los que él lleve consigo). Más adelante programaremos la solución a este rompecabezas, que consiste en que el jugador puede empujar la lámpara mientras está encendida y así arrastrarla de una habitación a otra. También añadiremos más adelante la parte que se ocupa de ir agotando las baterías con el paso del tiempo.
![]() |
Observar que hemos usado una rutina llamada describir. Esta
rutina es similar a inicial, se usa para mostrar un texto
que mencione este objeto durante la descripción de la habitación. La
diferencia es que inicial sólo se usaba si el objeto no
había sido movido, mientras que describir se usará
siempre. No confundir describir con descripcion
(esta última es la que sale cuando el jugador "EXAMINA LA
LAMPARA").
Si te fijas, en describir comprobamos si la lámpara está encendida o no para mostrar un mensaje diferente en cada caso. ¿Por qué lo hemos hecho así en vez de usar si_encendida y si_apagada como habíamos hecho antes con el foco? La respuesta es que si_encendida y si_apagada son como inicial en el sentido de que sólo los usará la librería mientras el jugador no haya cogido el objeto. En el momento en que el objeto es cogido y luego dejado, su descripción ya no se tomará de esas propiedades, sino que se creará una descripción por defecto que será: "Puedes ver también una lámpara de sodio." En cambio la propiedad describir, si existe, será utilizada siempre, y si retorna true (como es el caso de nuestra lámpara), la librería ya no intentará describirla de otra forma (si retorna false seguirá con su mecanismo normal de descripción, usando si procede las propiedades si_encendida o si_apagada y si no existen (o si el objeto ha sido cogido y dejado) creará finalmente la frase por defecto antes mencionada. Hay mucho más que contar sobre la descripción de habitaciones y lo veremos en el capítulo sobre descripciones. |
![]() | ![]() | ![]() | Objetos que pueden encenderse y apagarse |