6. Más extensiones: personajes móviles, secuencias, menús e hipervínculos

Inform 7: Empezando a programar - capítulo VI

Por Xavi C.

Versión 1.1 - Revisión 14/01/11

En el anterior capítulo vimos cómo crear tablas y conversaciones por menús, entre otras cosas. En esta ocasión aprenderemos a crear personajes móviles, secuencias, menús e hipervínculos, gracias a las extensiones disponibles para Inform.

Date cuenta que las extensiones también tienen su documentación particular. Si revisas la pestaña de Documentation, abajo de todo verás "Installed Extensions"; si haces click ahí te saldrá un listado con todas las extensiones que tienes instaladas en tu Inform 7, y si clicamos en una de ellas (por ejemplo la "Basic Screen Effects by Emily Short") nos saldrá toda su documentación y ejemplos, con lo que podrás hacer un mejor uso de la extensión. Y ahora, ¡vamos allá!

Extensiones habituales

Recuerda que siempre tienes que utilizar la extensión Spanish para que Inform entienda español. Vamos a recordarlo. Primero de todo, como siempre, llamamos a las librerías habituales.

La indispensable para que Inform entienda español:

Include Spanish by Sebastian Arg.

La práctica librería para efectos básicos de pantalla:

Include Basic Screen Effects Sp by Emily Short.

Y por último, la útil librería de ayuda para el jugador:

Include Basic Help Menu SP by Emily Short.

La primera extensión es obligatoria, las otras dos son opcionales pero altamente recomendables. Y ahora vamos a ver otras extensiones que son también muy útiles y que darán un toque de calidad a nuestras creaciones.

Personajes móviles

Vamos a crear un nuevo proyecto donde veremos cómo programar personajes móviles, esto es, que no estén fijos en una localidad, sino que se puedan mover libremente por el mapa del juego, o asignarles una ruta. Para ello vamos a servirnos de la librería "Patrollers" que puedes descargar de aquí (enlace directo)

Primero de todo, llamamos a la extensión o librería:

Include Patrollers Sp by Michael Callaghan.

Vamos a crear un mapa por donde se moverá el personaje. Pongamos que nuestro relato se desarrolla en un centro comercial, he aquí mi propuesta:

The centrocomercial is a region. The Centro, the Centro2, the Centro3 and the Centro4 are in the centrocomercial.

The tiendas is a backdrop in the centrocomercial. The description is "Multitud de tiendas de todo tipo.". Understand "tienda", "centro", "centro comercial", "comercios" and "comercio" as the tiendas.

The gente is a backdrop. The gente is everywhere. The description is "Hay gente por todos lados, entrando y saliendo de todas las tiendas y comercios.".

Centro is a room. The printed name of Centro is "Centro comercial". The description is "Estás en un centro comercial repleto de gente y tiendas de todo tipo.".

Centro2 is west of Centro and east of Centro4. The printed name of Centro2 is "Centro comercial". The description is "Estás en un centro comercial repleto de gente y tiendas de todo tipo.".

Centro3 is west of Centro4 and east of Centro. The printed name of Centro3 is "Centro comercial". The description is "Estás en un centro comercial repleto de gente y tiendas de todo tipo.".

Centro4 is east of Centro3 and west of Centro2. The printed name of Centro4 is "Centro comercial". The description is "Estás en un centro comercial repleto de gente y tiendas de todo tipo.".

Y una vez tenemos localidades por donde moverse, creamos un primer personaje, al que tendremos que asignar la clase "Patroller":

The mujer is female in the Centro. The mujer is a patroller. The mujer is aimless. The drive of the mujer is 50.

Con "The mujer is a patroller" le decimos a Inform que el personaje mujer es de la clase patroller. Además tenemos que indicarle el tipo de movimiento que hace, en este caso es un movimiento aleatorio, por lo que pondremos "aimless", y su frecuencia de movimiento será del 50% gracias a la sentencia "The drive of the mujer is 50".

Por último, queda activar el movimiento del personaje:

When play begins:

activate the mujer.

Siempre podremos activar a un personaje "patroller" con la orden "activate", o pararlo con la orden "deactivate", por ejemplo así:

Instead of kissing the mujer:

say "¡Muacs!";

deactivate the mujer.

Vamos a ver si funciona, compila el ejemplo anterior y observa cómo la mujer se mueve por el centro comercial y se para cuando la besamos.

Es posible asignar rutas predefinidas para los personajes. Para ello utilizaremos la propiedad "RoomTable" y la clase "RoomLed", vamos a verlo modificando el comportamiento de movimiento actual de la mujer, que pasará del aleatorio "aimless" a la ruta de la tabla "de_tiendas":

The mujer is female in the Centro. The mujer is a patroller. The mujer is RoomLed. The RoomTable of the mujer is the Table of de_tiendas.

Table of de_tiendas

TargetRoom

Centro

Centro2

Centro3

Importante: en la tabla de movimiento se deberá especificar la ruta en la columna "TargetRoom", poniendo en primer lugar la localidad de inicio del personaje.

Nota: Podría moverse también mediante la propiedad "DirectionTable", mírate la documentación de la extensión Patrollers Sp.

Un personaje incluso podría seguir al jugador mediante "Following" de manera muy sencilla; modifica a la mujer de la siguiente manera:

The mujer is female in the Centro3. The mujer is a patroller. The mujer is following.

Every turn: if the mujer is in location, deactivate the mujer.

Compila y ejecuta el ejemplo. Gracias a la sentencia "The mujer is following." el personaje se mueve hacia nosotros. Verás que la mujer llega hasta tu posición, incluso si cambias de localidad (hasta que llega a tu posición, en cuyo caso se para). Es importante desactivar a un personaje que nos persigue si llega hasta nuestra posición, ya que si no Inform nos dará un error, tenlo en cuenta. En mi ejemplo he puesto un "every turn", pero podría poner otra cosa, por ejemplo podría tener lugar una secuencia de amor... lo que tú elijas, pero no te olvides de los personajes que pululan por el relato, no los abandones... ¡ellos nunca lo harán y te lo demostrarán con errores!

Secuencias

Es posible crear secuencias en Inform 7, es decir, lapsos de tiempo no-interactivo donde van saliendo textos en pantalla, que pueden servir como introducción o cambio de escena. Para ello existe la librería Cortos, que puedes descargar de aquí (enlace directo).

Veamos un ejemplo práctico con un nuevo proyecto en Inform. Primero de todo, como siempre, llamamos a la librería que nos ocupa, la "Cortos", para poder hacer secuencias de texto:

Include Cortos by Johan Paz.

Bien, ahora vamos a crear una secuencia de introducción para un relato de terror. La forma de crear una secuencia es la siguiente:

crear una tabla con, al menos, una columna llamada 'phrase'; bajo esta columna habrá que incluir 'texto' a modo de párrafos, que se irán mostrando durante la secuencia:

Table of Secuencia 1

phrase

"Jamás pensé que el horror se escondía tras bellas máscaras."

"Nunca creí que me iba a suceder algo así."

"Pero, a veces, la gente..."

"no es lo que parece."

Para mostrar esta secuencia basta con invocar el comando 'tell the fragment on', de esta forma:

tell the fragment on Table of Secuencia 1

Existen además dos variantes para este comando:

tell the fragment on Table of Secuencia 1, cleaning the screen

que limpiaría la pantalla al finalizar la secuencia y:

tell the fragment on Table of Secuencia 1, cleaning the screen after each phrase

que limpiaría la pantalla tras cada párrafo mostrado.

En la imagen siguiente vemos un ejemplo de introducción usando la librería "Cortos" y la "Basic Screen Effects":

Menús

Es posible crear menús en Inform 7, para ello haremos uso de la librería Menus SP, que puedes descargar de aquí (enlace directo)

Primero de todo, llamamos a ella:

Include Menus SP by Emily Short.

Vamos a crear una tabla de ejemplo llamada "Inicio". Cada tabla de menú debe llevar invariablemente cuatro columnas: title, subtable, description y toggle. En "title" irá la frase o palabra que el jugador verá como opción, por ejemplo "Jugar" o "Ayuda". En "subtable" podremos llamar a otras tablas simplemente poniendo su nombre, por ejemplo en Ayuda pondremos la "Table of Basic Help Options" que viene por defecto con la librería "Basic Help Menu SP"; en caso de que no pongamos ninguna subtabla, pondremos "--". En "description" irá el texto de la opción de menú, como por ejemplo una explicación del juego, y si se deja vacía (porque llamamos a una subtabla, por ejemplo) se pondrá "--". Por último, en "toggle" se puede poner una regla del tipo "carry out" como "switch" o "a number", si la dejamos vacía habrá que poner también un "--". Veamos mi propuesta de menú para un empezar a jugar:

Table of Inicio

title subtable description toggle

"Jugar a [story title]" -- "Esto es una demo." quit rule

"Introducción" -- "Esto es una introducción." --

"Créditos" -- "Esto son los créditos." --

"Ayuda" Table of Basic Help Options -- --

Y llamaremos a la tabla desde el inicio del juego:

When play begins:

change the current menu to the Table of Inicio;

carry out the displaying activity;

clear the screen;

try looking.

E incluso podemos crear una acción nueva para llamar a la tabla desde el juego:

inicing is an action applying to nothing.

understand "inicio" as inicing.

report inicing:

change the current menu to the Table of Inicio;

carry out the displaying activity;

clear the screen;

try looking.

Aquí un ejemplo de menú funcionando junto con la librería Cortos:

Hipervínculos

Tal vez quieras poner hipervínculos en tu juego, para dar la posibilidad al jugador de hacer click sobre una palabra en el texto. Esto es posible gracias a la extensión Inline Hyperlinks. Descarga e instala las siguientes extensiones: Text Capture y Inline Hyperlinks. Una vez correctamente instaladas, llama a la Inline Hyperlinks:

Include Inline Hyperlinks by Erik Temple.

Con lo que ya podremos utilizar hiperenlaces. Una forma sencilla de llamar a ellos es con el token "[link]", que hará posible el enlace con la palabra que lo lleve. Por ejemplo, podemos examinar con un click, veámoslo:

The castillo is a room. "Te encuentras en un castillo espeluznante.".

The espada is here. It is female. The description is "Una espada mágica flota en el aire."

Before reading a command:

say "¿Quieres [link]examinar la espada[end link]?"

Tal vez te haya dado error al compilar, aunque todo lo anterior es correcto... ¿porqué? Lo vemos ahora...

Diferencias entre Z-Code y Glulx

Bueno, resulta que esta extensión es solo para "Glulx", y hasta ahora estábamos compilando en Z-Code. Las diferencias entre Glulx y Z-Code se basan esencialmente en que el primero usa únicamente texto, y el segundo puede utilizar enlaces y multimedia, como gráficos y sonidos. Esto se puede cambiar en la pestaña "Settings", cambiando el Story File Format a Glulx, como muestra la imagen:

Probando enlaces

Bien, ahora ejecuta el juego y pulsa sobre el link; el juego lo entenderá y examinará la espada. Con este sencillo sistema pueden hacerse librojuegos en Inform. Vamos a ver una opción aún más sencilla pero muy potente, con la que podremos examinar objetos con solo pulsar sobre su nombre. Esto se consigue con el token "[as]" de la siguiente manera:

The espada is here. "Una [link]espada[as]examinar espada[end link] mágica". It is female. The description is "Una espada mágica flota en el aire."

Gracias a la cadena de texto "Una [link]espada[as]examinar espada[end link] mágica" conseguimos que el jugador examine la espada con solo hacer click sobre su nombre. Has de tener especial cuidado en poner la palabra en cuestión entre [link] y [end link], y la acción tras el [as], tal como la escribiría el jugador.

Creando un librojuego

Con todo lo anterior, pasemos ahora a hacer algo más vistoso. Veamos un ejemplo práctico, con un típico texto de librojuego, copia el siguiente código:

"Librojuego"

Include Spanish by Sebastian Arg.

Include Basic Screen Effects SP by Emily Short.

Include Inline Hyperlinks by Erik Temple.

Use no scoring.

The castillo is a room. "Te encuentras en el tenebroso castillo del conde Drácula. La débil luz de tu [link]lámpara[as]examinar lampara[end link] apenas ilumina una lúgubre estancia llena de [link]telarañas[as]examinar telaranas[end link]. Unas tortuosas [link]escaleras[as]ir arriba[end link] son la única salida posible...".

The lampara is carried by the player. The description is "Debes darte prisa, se está acabando la luz...".

Some telaranas are here. They are scenery. The printed name of telaranas is "telarañas". The description is "Terroríficas telarañas... ¡un momento! Parece que tras ellas hay una [link]puerta[as]examinar puerta[end link]."

A puerta is here. It is female and scenery. The description is "Una enigmática puerta tras las telarañas parece albergar un mal aún mayor... [link]¿qué se esconderá tras ella?[as]abrir puerta[end link]".

Instead of opening the puerta, end the story saying "¡Has encontrado la tumba del conde Drácula!".

The escaleras is up of the castillo. "Te sorprende encontrar una habitación vacía... la única opción es volver [link]abajo[end link].".

Como ves, hemos hecho un uso intensivo de los links para crear un librojuego, que por otro lado es perfectamente jugable como relato interactivo. Tan solo habrá que tener especial cuidado en poner bien las acciones tras el [as], y programar correctamente todos los links que queramos que sean enlazables.

Salidas como enlaces

Veamos ahora un ejemplo más complicado: hacer que las direcciones sean enlaces. Para ello voy a traducir el ejemplo que incluye la extensión Inline Hyperlinks, pues funciona de maravilla. Vamos a hacer uso de los hiperenlaces para poder hacer click directamente sobre una determinada dirección, en lugar de escribir la salida.

Imaginemos que queremos programar un laberinto, y queremos que todas sus salidas puedan ser clickeables por el jugador. Primero de todo vamos a crear la localidad "Laberinto", que nos servirá para todas las localidades del laberinto:

The printed name of a room is "Laberinto". The description of a room is usually "Un laberinto de oscuros y tortuosos corredores. Salidas: [exits]".

Como ves, es posible poner las salidas de una localidad utilizando el token "[exits]". Sigamos ahora con algo más complicado, que hará que la descripción de las salidas se ajuste a lo que queremos, que no es otra cosa que poder hacer click sobre ellas. El código siguiente lo consigue:

To say exits:

let count be the number of adjacent rooms;

if count is greater than 0:

repeat with destination running through adjacent rooms:

let the way be the best route from the location to the destination, using even locked doors;

let dir be indexed text;

let dir be "[way]";

let dir be "[dir]";

say "[link][way][as]ir al [dir][end link]";

let count be count minus 1;

if count > 0:

say ", ";

say ". ";

Fíjate en el token "[link]", pues es el encargado de hacer que una palabra sea clickable. Terminanos el laberinto y ejecutamos el juego:

R01 is a room. R02 is north of R01. R03 is east of R01. R04 is north of R02 and northwest of R03. R05 is northeast of R02. R06 is north of R05. R07 is west of R06. R08 is southwest of R04 and northwest of R02. R09 is east of R06. R10 is northeast of R06. R11 is east of R10. R12 is southeast of R09. R13 is south of R12. R14 is northeast of R12. R14 is southeast of R11. R15 is up from R03. R16 is east of R15. R17 is north of R16. R18 is down from R17. The description of R18 is "Oscuros y tortuosos corredores, pero... espera, al noreste... ¡Puedes ver una salida! Salidas: [exits]"

Exit is northeast of R18. Exit is outside from R18. The printed name of Exit is "Afuera". "Has salido hacia la luz." Southwest from Exit is nowhere. Inside from Exit is nowhere. After looking in Exit, end the story saying "Conseguiste salir del laberinto".

Aquí una muestra del código anterior funcionando: