4. Escenas, ayuda, desambiguación y cocodrilos

Inform 7: Empezando a programar - capítulo IV

Por Xavi C.

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

En este capítulo, un tanto más teórico pero también muy práctico, vamos a aprender a programar pensando en cocodrilos (sí, has leído bien), a desambigüar y a crear escenas. También vamos a implementar el comando "ayuda" para el jugador, para que sepa qué tiene que hacer. Este capítulo es muy importante así que mantén tu mente despejada y tus ojos bien abiertos, la isla misteriosa te espera. ¡Vamos allá!

Ayudando al jugador

Vamos a empezar por darle algo de ayuda al jugador, para ello haremos uso de una de las librerías que nos descargamos en el capítulo 1, la "Basic Help Menu SP by Emily Short", que también podremos descargar de aquí: (enlace directo)

Una vez instalada, llamaremos a ella en nuestro código fuente en la parte de la Introducción, así:

Include Basic Help Menu SP by Emily Short.

Si lo pruebas tal cual, aunque funciona, el resultado es bastante decepcionante, pero podemos modificar los mensajes de la ayuda fácilmente, vamos a hacerlo modificando la sección 2 de la Introducción, el mensaje inicial (porque es donde está el "When play begins", reemplaza el código actual por el siguiente:

Section 2 - Mensaje inicial y ayuda extendida

When play begins:

clear the screen;

display the boxed quotation

"La isla.

por Grendelkhan";

show the current quotation;

wait for any key;

say "Teclea 'AYUDA' durante el juego para recibir instrucciones.[paragraph break]Bienvenido a...";

choose row 1 in Table of Basic Help Options;

now description entry is "[italic type]El gran conquistador Hernán Cortés se encuentra a merced del peligro en una tierra exótica buscando un tesoro perdido... ¿logrará encontrarlo? ¡Solo depende de tu pericia en esta aventura singular![paragraph break][roman type]Este es un juego que sirve como ejemplo para el tutorial de Inform 7 de Grendelkhan que puedes descargar desde el CAAD o en www.yonostudio.com".

Table of Basic Help Options (continued)

title subtable description

"Contactar con el autor" -- "Si tienes dificultades con [story title], contacta conmigo a través de mi e-mail: yonostudio@gmail.com o entra en los foros del portal CAAD: www.caad.es. También puedes visitar mi web: www.yonostudio.com"

"Pistas" -- "A continuación van unas cuantas pistas para [story title].[paragraph break][bold type]1. La serpiente odia las piedras.[line break]2. ¿Has probado a nadar en el mar?[line break]3. El mendigo tiene sed.[line break]4. ¡Piensa un poco y lo conseguirás![roman type]".

Más adelante ya aprenderás como seguir modificando la ayuda, lo principal es que haya alguna ayuda en tu juego por sencillo que sea, porque sino el jugador lo dejará a las primeras de cambio cuando no sepa qué hacer.

Montando una escena

Vamos a crear escenas, como en las películas. Te preguntarás ¿para qué quiero hacer una escena? Lo primero será definir una escena como un lapso de tiempo entre un suceso y otro, por ejemplo: un determinado número de turnos desde que empieza el juego. Con escenas podemos hacer muchas cosas, como limitar el tiempo para que un jugador escape de una celda o crear sucesos recurrentes como podría serlo un guardia que vigila a un recluso cada cinco minutos.

En nuestro juego, una escena podría ser la siguiente: el náufrago tiene tanta sed que solo sobrevivirá si le damos a beber agua antes de 30 minutos. Un poco drástico, lo sé, pero de momento es la que se me ocurre, ya tendrás tiempo de pensar en mejores escenas en tus juegos. Para no hacer un puzzle injusto, le diremos a Inform que cuente los 30 minutos a partir de que llegamos a la isla y vemos al náufrago, teniendo en cuenta que Inform entiende los minutos como acciones (esto es, el jugador dispondrá de 30 turnos). La escena puede tener dos finales: uno bueno y uno malo, el bueno es que le damos el agua en el tiempo justo, el malo es que se muere de sed (y el juego terminará). Para ello vamos a la parte Nudo de nuestro código y ponemos lo siguiente:

Section 1 - Escena del náufrago

Tener sed is a recurring scene. Tener sed begins when the Isla is visited for the first time.

Tener sed ends happily when the naufrago is recuperado.

Tener sed ends sadly when the time since Tener sed began is 30 minutes.

When Tener sed begins:

change contador to 0.

When Tener sed ends happily:

say "El náufrago empieza a tener mejor aspecto, te mira agradecido[line break]-¡Gracias, amigo! -te dice el hombre, levantándose con dificultad."

When Tener sed ends sadly:

end the game saying "El náufrago cae inconsciente en la arena, muerto de sed.'"

The contador is a number that varies.

Every turn during Tener sed:

increase contador by 1;

if contador is 1, say "-¡Tengo sed! Ahh...- le oyes decir.";

if contador is 2, say "El náufrago parece estar sediento, apenas puede apoyarse en la arena.";

if contador is 7, say "Aún puedes escuchar los lamentos del náufrago...";

if contador is 15, say "Deberías pensar en darle algo de agua al náufrago...";

if contador is 20, say "Deberías darle algo de agua al náufrago rápidamente, o caerá inconsciente.";

if contador is 28, say "El náufrago apenas está ya consciente...".

Como podrás observar, hemos utilizado una variable llamada "contador" que se incrementará en cada turno, gracias al "Every turn", con la que podemos enviar mensajes al jugador para que se dé prisa en buscar agua. Puedes cambiar los números del contador, poner más e incluso aumentar los quince minutos, ya que tal vez sea poco tiempo. Tienes más información sobre creación de escenas en el capítulo 10 (10.1. Introduction to scenes) del manual de Inform 7.

Estados de un personaje

Por otro lado, tenemos que crear los dos estados posibles del náufrago: moribundo y recuperado, para ello tenemos que añadir la siguiente sentencia en la sección del náufrago:

The naufrago can be moribundo or recuperado. The naufrago is moribundo.

¿Has visto? Los estados de un personaje se programan igual que los de un objeto, puesto que para Inform todo son objetos; con el "can be" definiremos los estados para cualquier cosa en el juego. El náufrago empezará moribundo, pero se recuperará cuando le demos agua. Abrá que programar, por tanto, la parte en la que le damos el agua, en la que su estado moribundo cambiará a recuperado, y pararemos la escena.

Instead of giving the cantimplora to the naufrago when the cantimplora is llena:

say "El hombre coge nerviosamente la cantimplora con las dos manos y bebe de ella hasta la última gota...";

now the naufrago is recuperado;

now the description of naufrago is "Un hombre vestido con arapos, ahora tiene mejor aspecto. Es un tipo alto y delgado que parece haber sobrevivido a terrible naufragio.";

now the cantimplora is vacia.

Instead of giving the cantimplora to the naufrago when the cantimplora is vacia:

say "El hombre coge nerviosamente la cantimplora con las dos manos... ¡y ve que está vacía![paragraph break]Encolerizado te la arroja, aunque sin fuerzas, y te implora '¡Dame agua, por favor!'";

move the cantimplora to Isla.

¿Comprendes bien el anterior código? ¡Deberías! Le estamos diciendo a Inform que si le damos la cantimplora llena de agua al náufrago, entonces estará recuperado, cambiará su descripción por otra más adecuada y además vaciaremos la cantimplora, cosa muy lógica. Por contra, si le damos la cantimplora vacía, nos la tirará a la cabeza (con lo que la movemos al escenario) y nada más.

Desambigüación

Date cuenta en que el jugador tal vez intente poner "dar agua" en lugar de "dar cantimplora". Es lógico que si sabemos que el náufrago pide agua y tenemos una cantimplora llena de agua, el jugador opte poner poner "dar agua" que "dar cantimplora", así que será lógico poner un sinónimo de agua para la cantimplora; si ponemos un...

Understand "agua" as the cantimplora.

...en la sección de la cantimplora solucionaremos esto... aparentemente. Porque crearemos un problema nuevo: Inform no sabrá a qué agua nos referimos (la cantimplora, el riachuelo o el mar, pues se han utilizado sinónimos de agua para estos tres objetos); esto es un problema de desambigüación y no es un problema fácil de resolver, pero no es imposible, hay que estar atento a los posibles conflictos con objetos y decidir qué acción es la que Inform debe llevar a cabo.

Nosotros queremos que el jugador pueda beber agua del riachuelo aunque lleve la cantimplora a cuestas, y que pueda darle agua de la cantimplora al náufrago aunque el agua del mar esté presente. Entonces tenemos que indicarle a Inform, con una Rule, lo que el jugador quiere decir, o sea: "Does the player mean". Veamos el ejemplo:

Does the player mean drinking the mar: it is very unlikely.

Does the player mean drinking the cantimplora when the player is in Bosque2: it is very unlikely.

Con el "it is very unlikely" le decimos a Inform que esa es la opción que menos nos gusta, en caso de ambigüedad cuando no se sepa claramente a qué se refiere el jugador. Así solucionamos el problema de desambigüación con el agua, algo especialmente molesto, como podrás comprobar si eliminas las dos anteriores sentencias, ya que en ese caso el juego nos preguntará a qué agua nos referimos. Te recomiendo que le eches un vistazo al capítulo 16.19. Does the player mean... del manual de Inform 7, puesto que te aclarará muchas dudas al respecto.

Cocodrilos

Todo aquél que empiece a jugar un relato interactivo quiere que le pasen cosas, sean estas buenas o malas, pero no limitarse a deambular por un decorado sin tener nada que hacer. Si te fijas en nuestro juego, a pesar de ser tan corto, hemos incluido algo en cada localidad: una serpiente en el bosque, tiburones en el mar, un cofre en la playa y un náufrago en una isla. Todas estas cosas son cocodrilos, pequeños y visibles, pero cocodrilos al fin y al cabo. ¿Porqué les llamo cocodrilos? Bueno, lo aprendí hace tiempo en un taller literario y me hizo gracia. Cocodrilo para mí es todo aquello que pueda causar sorpresa al jugador, todo aquello con lo que pueda... ¡jugar!

Pero los mejores cocodrilos son los que están agazapados, acechando al jugador... no son visibles pero sabes que están ahí, ¡esperando su oportunidad! Un enorme cocodrilo acompaña al mapa del tesoro escondido en el cofre, que actuará cuando el jugador cruce a nado el mar: se mojará el mapa y se borrará su contenido. Ese cocodrilo se reirá a carcajadas del jugador, y la próxima vez intentará cruzar el mar con el mapa protegido de alguna forma, por ejemplo, dentro del cofre cerrado.

Acciones que suceden después: before

Vamos a programar el cocodrilo que mojará al mapa y lo volverá inservible. ¿Se te ocurre cómo? Pues definiendo dos estados para él: seco y mojado, o sea: "can be seco or mojado", y con una comprobación de si se moja gracias a una sentencia nueva: "before", que es como "instead" pero que sucede después de la acción. Ten esto claro: "instead" se ejecuta antes de la acción, "before" después. Lo tendrás más claro con el siguiente código, elimina el mapa anterior y copia lo siguiente:

Section 2 - El mapa del tesoro

The mapa del tesoro is carried by player. The mapa del tesoro can be seco or mojado. The mapa del tesoro is seco. The description is "¡Parece un mapa auténtico! Tal vez si logro descifrarlo encontraré un tesoro... ¡y seré rico! ¡Ja!".

Before nadaring en the costa:

if the mapa is carried:

now the description of the mapa del tesoro is "¡Maldición! El agua lo ha destrozado... ¡No debí haber nadado con el mapa en la mano! Tendría que haberlo protegido... ¡ahora no sirve de nada!";

now the mapa is mojado.

Before nadaring en the mar:

if the mapa is carried:

now the description of the mapa del tesoro is "¡Maldición! El agua lo ha destrozado... ¡No debí haber nadado con el mapa en la mano! Tendría que haberlo protegido... ¡ahora no sirve de nada!";

now the mapa is mojado.

Cocodrilos por todos lados

Un cocodrilo puede estar acechando en cualquier rincón, solo es cuestión de programarlo, y puede ser tan pequeño o tan grande como quieras. Por ejemplo, otro pequeño cocodrilo es el que acecha cuando el jugador canta en presencia del náufrago... ¡sorpresa, el náufrago se queja!; ese pequeño detalle lo programamos en el primer capítulo y sirve también como cocodrilo.

Así que a partir de ahora tienes que visualizar cocodrilos por todas partes, cuantos más haya más divertido será tu juego... pero ¡ojo! ¡cuidado! Cocodrilo no significa atiborrar tus escenarios de trampas ocultas y muertes inesperadas, esos no son verdaderos cocodrilos. El buen cocodrilo se intuye aunque no se vea; tenlo en cuenta en tus futuros proyectos.

En el siguiente capítulo

Se me ocurre un gran cocodrilo para mi juego, dado que es un poco incongruente tener a Hernán Cortés buscando un tesoro cuando debería estar charlando con Moctezuma, he pensado que todo podría ser un sueño. Sí, como en Los Serrano y otras series y películas... si a ellos les funcionó, ¿porqué no a mí? ¡Es un buen cocodrilo! Así que en mi juego lo que sucede es que un chaval se ha quedado dormido en clase de historia (toma cocodrilo) y en realidad el náufrago es el profesor que da la clase. Todo esto se puede programar en Inform con unas pocas líneas de código y ya sabes como hacerlo, por ejemplo con un "now the player is in Clase de historia" o algo así. ¡Lo veremos en el capítulo que viene!