En muchos juegos basados en texto aparecen objetos que pueden abrirse y cerrarse. Puertas, ventanas, baúles, cajas fuertes o maletas son ejemplos típicos de objetos así. El AGE proporciona soporte para crear fácilmente tales objetos, que los jugadores y criaturas pueden abrir y cerrar con o sin necesitar para ello una llave, según cómo están configurados.
Grosso modo, el sistema de cosas abribles y cerrables de AGE funciona de la siguiente manera:
cerrar cosa
introducida por un jugador sirve para cerrar algo que está abierto, la orden abrir cosa
para abrir algo que está cerrado. Es posible definir condiciones para que estos comandos funcionen o no según el criterio que se quiera (por ejemplo, una puerta que no se pueda abrir sin más porque está atrancada, etc.)abrir cosa con llave
introducida por un jugador sirve para quitar el cerrojo a algo que está cerrado con llave, y la orden cerrar cosa con llave
hace lo contrario. AGE permite definir qué cosa del juego es la llave de cada cosa abrible/cerrable con llave. Asimismo, también se pueden definir condiciones para que estos comandos funcionen o no (además de la condición implícita de tener la llave).Para definir una cosa abrible y/o cerrable en nuestro mundo de AGE, creamos una cosa en el PUCK de forma normal (rellenando su nombre único, nombres de referencia y demás campos útiles como de costumbre) y a continuación vamos a la ficha llamada “Abrir/Cerrar” de su panel de objeto.
Lo primero que vemos en esta ficha son cuatro cuadros que podemos marcar para determinar si la cosa es “Abrible”, “Cerrable”, “Cerrable con llave” y “Abrible con llave”, respectivamente. Así, por ejemplo, si queremos crear una caja que se pueda abrir y cerrar pero que no necesite una llave para ello, marcaremos los dos primeros cuadros. Si lo que queremos es una puerta que además tenga una llave que tenga una cerradura con llave, los marcaremos todos. Es perfectamente posible marcar cualquier combinación de acciones posibles: por ejemplo, un plástico donde venga envuelto un CD de música podría modelarse como un objeto abrible, pero no cerrable (una vez que lo rompemos, no podemos devolverlo a su estado original).
A continuación vemos cuatro formularios para textos dinámicos asociadas a cada una de las cuatro acciones: abrir, cerrar, cerrar con llave y abrir con llave. Como es lógico, sólo tendremos que cubrir los campos correspondientes a las acciones que hayamos marcado como posibles en los cuadros anteriores (por ejemplo, a abrir y cerrar en el caso de la caja).
El formulario de estos textos dinámicos es análogo al de las descripciones y nombres dinámicos; pero con un añadido: además de especificar una condición y un texto asociado, también tenemos la posibilidad de marcar o no una casilla llamada “Con éxito”. Esta casilla determina si la acción correspondiente (abrir, cerrar, etc.) se llevará a cabo con éxito o no, en el caso de que la condición asociada sea cierta. De este modo, en el formulario de “Texto al abrir” no sólo estamos definiendo el texto en sí, sino también las condiciones que son necesarias para que la cosa se pueda abrir; y lo análogo para “Texto al cerrar” y el resto de formularios similares.
Más en detalle, cuando un jugador teclea una orden abrir
sobre una cosa, AGE hace lo siguiente:
El funcionamiento de cerrar
es análogo, trabajando en cada caso con la casilla y el formulario correspondientes a esa orden.
Las condiciones que se pueden teclear en estos formularios son expresiones booleanas en BeanShell, exactamente igual que para las descripciones y nombres dinámicos. A menudo, para escribir estas condiciones necesitaremos tener una forma de saber si una cosa está abierta o cerrada, y si está cerrada con llave o no. Para ello, podemos usar los siguientes métodos de la clase Item
:
/*clase Item*/ boolean isOpen ( ) /*clase Item*/ boolean isClosed ( ) /*clase Item*/ boolean isLocked ( ) /*clase Item*/ boolean isUnlocked ( )
Estos métodos nos permiten comprobar el estado de las cosas abribles/cerrables: son métodos booleanos que devuelven true
si la cosa sobre la que los ejecutamos está abierta, cerrada, cerrada con llave o no cerrada con llave, respectivamente; y false
de lo contrario.
De este modo, por ejemplo, podemos definir una caja que se abra y se cierre marcándola como abrible y cerrable en la ficha correspondiente, y luego introduciendo lo siguiente en los formularios:
De esta forma, conseguimos una caja que funciona de la manera más normal: se puede abrir si está cerrada, se puede cerrar si está abierta, y las otras posibles combinaciones (como abrirla si ya está abierta) no funcionan y nos dan un mensaje que podemos personalizar. Sin embargo, el sistema de condiciones también nos da la posibilidad de crear cosas abribles y cerrables que funcionen de maneras más extrañas, si es necesario.
Para definir el estado inicial de un objeto abrible/cerrable, podemos utilizar la propiedad closed
: si vamos a la ficha “Propiedades” del panel de nuestra caja y añadimos una propiedad closed
con valor true
y tiempo restante -1 (infinito), la caja comenzará estando cerrada. De lo contrario, empezará abierta hasta que alguien la cierre.
Si además queremos que para abrir una cosa abrible o cerrable haga falta tener en posesión otro objeto (que comúnmente llamamos llave), podemos hacerlo marcando la cosa como abrible/cerrable con llave y utilizando los otros dos formularios, que procesan las órdenes de tipo cerrar X con Y
y abrir X con Y
. Éstos funcionan exactamente igual que los formularios para abrir X
y cerrar X
que hemos visto antes, con la salvedad de que AGE nos proporciona una manera de definir qué objeto u objetos Y son los que sirven para abrir X.
Para hacer esto, creamos una relación (flecha) que vaya de X (el objeto que se abre) a Y (su llave asociada), y en el panel de la relación, donde se nos pregunta “Relación estructural”, marcamos “Se abre con” para expresar que X se abre con Y. Es posible definir de esta manera varias llaves que abran una misma puerta, o varias puertas que se abran con una misma llave, creando varias flechas.
De este modo, cuando un jugador teclea una orden abrir X con Y
, si X e Y son cosas válidas y que están al alcance del jugador, AGE hace lo siguiente:
De esta manera, AGE nos comprueba automáticamente que el jugador lleva la llave adecuada, y hace que la acción de abrir con llave no tenga éxito en caso contrario; pero seguimos pudiendo utilizar las condiciones de las descripciones para determinar si hay éxito o fracaso en el caso de que el jugador sí tenga la llave (por ejemplo, tal vez el jugador tiene la llave pero la puerta está atrancada…)
La acción de abrir con llave se comporta de forma totalmente análoga a la acción cerrar con llave, pero usando los formularios correspondientes.
La propiedad 'locked' nos permite definir inicialmente si una cosa va a estar cerrada con llave o no: poniendo dicha propiedad a 'true' y con temporizador -1 en la ficha de “Propiedades” de una cosa, nos aseguraremos de que empiece cerrada con llave al principio del juego.
Nótese que con el sistema de apertura y cierre con llave aquí descrito se implementa por defecto el manejo de llaves típico de los juegos americanos clásicos, en los que para abrir una puerta primero hay que “abrirla con llave” (unlock), que corresponde sólo a girar la llave, y después “abrirla” realmente (open). En el mundo hispanohablante, muchos autores actuales prefieren un sistema más simple en el que al poner “abrir puerta” ya se abra con llave automáticamente (incluyendo las acciones unlock+open) en el caso de que el jugador tenga la llave. Este sistema de apertura y cierre fácil de conseguir en AGE, simplemente ignorando las casillas y formularios de “Abrible con llave” y “Cerrable con llave” y definiendo las condiciones del “abrir” y “cerrar” normales para que miren si el jugador tiene la llave. Otras variantes se pueden definir de forma similar.
Un uso común de las cosas abribles o cerrables es que sirvan como puertas de acceso entre una localidad y otra, de forma que haya sea necesario abrir la puerta para atravesar el camino correspondiente.
Para definir una puerta entre dos habitaciones, hacemos lo siguiente:
Aunque no es necesario para que la puerta funcione, muchas veces será conveniente no ponerle nombres para mostrar. Esto hace que no se muestre tras la descripción de las habitaciones (o sea, que no aparezcan cosas como “Aquí hay una espada, un escudo y una puerta roja”, cosa que suele ser antinatural). Por supuesto, sí que es necesario que la puerta tenga algún nombre de referencia para poder manipularla.
Otro uso común para las cosas abribles o cerrables es servir para modelar objetos que hay que abrir para sacar otros objetos de su interior, como baúles o cajones. Para hacer esto, basta con crear un objeto abrible y/o cerrable (como la caja vista anteriormente) y definirlo a la vez como contenedor, y AGE se encargará automáticamente de que sólo se pueda acceder a los objetos que contiene cuando esté abierta. En la siguiente sección, contenedores, veremos cómo se define una cosa como contenedor.