Objetos que se abren y objetos que se activan
Ahora que ya hemos visto "nuevo concepto, flags y variables" vamos a descubrir y a utilizar los dos primeros flags que nos ofrece la librería para manipular los objetos y dotarles de estado. Para que un objeto se pueda abrir y cerrar, debemos activarle el flag abrible. Este flag nos permitirá que podamos usar ordenes como abrir objeto o cerrar objeto. Y para hacer que un objeto se pueda encender y apagar, activaremos el flag conmutable. Estos dos flags "marcan" el objeto con una característica y habilita en el modelo del mundo y la librería las reglas y comportamientos necesarios para que el jugador pueda manipular los objetos (es decir, para que el jugador pueda abrirlos y cerrarlos, encenderlos y apagarlos).
Todo esto nos lleva a otros dos nuevos flags: los flags que indican el estado. Si un objeto se puede abrir y cerrar, tiene que tener un flag que indique en que estado está (es decir, si está abierto o cerrado). Este flag es el flag abierto, el cual esta activado (vale true) cuando se ha abierto el objeto o desactivado (vale false) cuando está cerrado. El otro flag es encendido, que vale true cuando se ha encendido el objeto y false cuando se ha apagado. Estos flags cambian durante el juego cuando el jugador los manipula con las ordenes correspondientes, pero, además, sirven para definir el estado inicial del objeto cuando empieza la partida.
Flag abrible / abierto
Para crear un objeto que se puede abrir y cerrar, tan solo tenemos que añadir el flag abrible a la línea de flags dentro del objeto que vamos a crear, así:
flags abrible
Por defecto, todos los objetos están abiertos a no ser que se indique lo contrario. Así que si queremos que el estado inicial de nuestro objeto sea cerrado, debemos añadir !abierto o not abierto a la línea de flags. La admiración ! o el not delante de un flag niega su valor y, por lo tanto, su significado. Así, si el flag abierto significa que "está abierto", su negación significa que "está cerrado".
Un objeto cerrado:
flags abrible, not abierto
Otro objeto cerrado (usando la admiración en vez de not):
flags abrible, !abierto
Un objeto que se puede abrir y cerrar solamente tiene poca utilidad y es raro de encontrar (como un paraguas o un libro), ya que la mayoría de objetos que se abren y cierran suelen ser puertas o tapas de una caja donde guardar cosas dentro, y para hacer este tipo de objetos es necesario usar más flags.
- Para hacer objetos que se pueden abrir y cerrar para guardar cosas dentro como cajas: Recipientes y soportes.
- Para hacer objetos que se pueden abrir y cerrar para poder entrar, como puertas: Puertas por donde pasar
- Para hacer objetos que se pueden abrir y cerrar con llave (ya sean cajas, puertas o lo que sea): Objetos que se cierran con pestillo y con llave.
Flag conmutable / encendido
Para crear un objeto que se puede encender y apagar, tan solo tenemos que añadir el flag conmutable a la línea de flags dentro del objeto que vamos a crear, así:
flags conmutable
Por defecto, todos los objetos están apagados a no ser que se indique lo contrario. Así que si queremos que el estado inicial de nuestro recipiente sea cerrado, debemos añadir encendido a la línea de flags:
flags conmutable, encendido
Ejemplo completo
En el siguiente ejemplo, creamos dos objetos: una radio que se puede encender y apagar, y un paraguas, que se puede abrir y cerrar.
include system/default
object Main:MainBase
def start
Estado.jugador = McAventura
#jugador.accion(Mirar)
end
endobject
/**
* El objeto jugador
*/
object McAventura:Personaje dentro:Habitacion
nombre MS:Mc Aventura
def alMirar: "Eres Mc Aventura, el protagonista de esta historia."
endobject
/**
* Localidades
*/
object Habitacion:Localidad
nombre MS:Habitación
def alMirar: "Estás en tu habitación, cálida y soleada, de donde parten tus primeros recuerdos."
endobject
/**
* Objetos que se encienden y apagan
*/
object Radio dentro:Habitacion
nombre FS:radio
flags conmutable
def alMirar: "Una radio para oir música."
endobject
/**
* Objetos que se abren y se cierran
*/
object Paraguas dentro:Habitacion
nombre MS:paraguas
flags abrible, !abierto
def alMirar: "Es un paraguas negro viejo, sirve para protegerte de la lluvia."
endobject
Un salida posible sería:
Habitación Estás en tu habitación, cálida y soleada, de donde parten tus primeros recuerdos. Salidas posibles: ninguna. Puedes ver una radio y una paraguas. >> ex paraguas Es un paraguas negro viejo, sirve para protegerte de la lluvia. >> ex radio Una radio para oir música. >> abrir paraguas Abres el paraguas. >> encender radio Enciendes la radio. >> apagar radio Apagas la radio.
Si apagamos un objeto apagado o cerramos un objeto cerrado, etc, el sistema nos avisará:
>> abrir paraguas El paraguas ya está abierto. >> apagar radio La radio ya está apagada.
Si intentamos apagar o encender algo que no es conmutable, el sistema nos avisará. Lo mismo pasa si intentamos cerrar o abrir algo que no es abrible:
>> apagar paraguas El paraguas no es algo que se pueda apagar. >> cerrar radio La radio no es algo que puedas cerrar.
En el caso de encender, sucede una cosa curiosa: dado que el objeto que queremos encender no es conmutable, el sistema cree que lo que intentamos hacer es quemarlo (prenderle fuego), así que lo interpreta de esa manera y responde el mensaje "Con esa peligrosa acción no lograrás nada." El verbo encender@tiene otros sinónimos que no son ambiguos: @activar para encender algo conmutable o quemar para prenderle fuego.
>> encender paraguas Con esa peligrosa acción no lograrás nada. >> activar paraguas El paraguas no es algo que se pueda encender.
Otro sinónimo curioso es arrancar objeto, el cual si se usa con un objeto conmutable se interpreta como "encender" o "activar", pero si no es conmutable se toma como un gesto agresivo, como si intentáramos arrancarlo del suelo como una flor:
>> arrancar radio La radio ya está encendida. >> arrancar paraguas ¿Realmente es necesario?
Mostrando el estado automáticamente
Sin embargo, tenemos un pequeño problema: el jugador no puede saber si el paraguas esta abierto o cerrado o si la radio esta encendida o apagada, ya que en ningún momento se muestra su estado al examinarlos. Para arreglar esto, podemos añadir al texto de los métodos alMirar una llamada al método listaDeEstadosMensaje(), el cual nos devuelve un texto con todos los estados del objeto actual.
def alMirar: "El objeto está "+listaDeEstadosMensaje()+"."
Si modificamos el ejemplo anterior tal y como sigue:
include system/default
object Main:MainBase
def start
Estado.jugador = McAventura
#jugador.accion(Mirar)
end
endobject
/**
* El objeto jugador
*/
object McAventura:Personaje dentro:Habitacion
nombre MS:Mc Aventura
def alMirar: "Eres Mc Aventura, el protagonista de esta historia."
endobject
/**
* Localidades
*/
object Habitacion:Localidad
nombre MS:Habitación
def alMirar: "Estás en tu habitación, cálida y soleada, de donde parten tus primeros recuerdos."
endobject
/**
* Objetos que se encienden y apagan
*/
object Radio dentro:Habitacion
nombre FS:radio
flags conmutable
def alMirar: "Una radio para oir música. Está "+listaDeEstadosMensaje()+"."
endobject
/**
* Objetos que se abren y se cierran
*/
object Paraguas dentro:Habitacion
nombre MS:paraguas
flags abrible, not abierto
def alMirar: "Es un paraguas negro viejo, sirve para protegerte\
de la lluvia. Está "+listaDeEstadosMensaje()+"."
endobject
Ahora al examinar cada objeto nos devuelve el estado:
>> ex paraguas Es un paraguas negro viejo, sirve para protegerte de la lluvia. Está cerrado. >> ex radio Una radio para oir música. Esta apagada.
Resumen
Hemos aprendido 4 flags nuevos que permiten establecer el estado a los objetos (todos estos flags se pueden combinar):
Para abrir y cerrar
| Flag | Descripción |
|---|---|
abrible | Marca el objeto con la característica de que se puede abrir y cerrar. |
abierto | Estado del objeto: está abierto. |
not abierto o !abierto | Estado del objeto: está cerrado. |
Pare encender y apagar
| Flag | Descripción |
|---|---|
conmutable | Marca el objeto con la característica de que se puede encender y apagar. |
encendido | Estado del objeto: está encendido. |
not encendido o !encendido | Estado del objeto: está apagado. |
Y las ordenes necesarias para trabajar con ellos: abrir objeto y cerrar objeto; así como encender objeto (o activar) y apagar objeto, correspondientes a la accion Abrir, accion Cerrar, accion Encender y accion Apagar.
Para mostrar el estado de un objeto, se puede utilizar el método listaDeEstadosMensaje() dentro de alMirar:
def alMirar: "El objeto está "+listaDeEstadosMensaje()+"."