25.6.18

Tutorial de creación de ficción interactiva - Huesos (14)

En el último capítulo dejamos pendiente reconsiderar si la política de elección de objetos para el comando de examinar era el más adecuado. Lo que realmente queremos conseguir es que una secuencia como: abrir tinaja, examina tinaja,  vaciar tinaja, abrir tinaja, vaciar tinaja... tenga unas respuestas adecuadas, y la actual lo hace de forma no muy fina. Parece que necesitamos de alguna forma saber cuál es la última tinaja que la protagonista haya abierto y tenerlo en cuenta para tener una experiencia de interacción coherente e intuitiva.

Hay varias formas de anotar cuál es la tinaja que ha sido la última abierta. Vamos a usar la que menos le gusta a un programador, la variable global y de paso aprendemos cómo usarla:

The last open tinaja is an object that varies. 

Hago que sea 'object' y no 'tinaja' para que su valor inicial sea 'nada', lo que nos permite verificar si hemos abierto alguna tinaja antes. Otras formas de hacer esto sería:

  1. Poner una marca de 'última abierta' en las tinajas, pero entonces tendríamos que activar y desactivar esta marca manualmente, así como tendríamos que crear todo lo necesario para localizar cuál es la última, etc...
  2. Poner un marcador en cada tinaja con el 'turno' de cuándo las abrimos, véase esta parte del manual de Inform, para entender el tratamiento del tiempo en esta herramienta. Esta aproximación al menos no requiere que se active y desactive la marca, pero sigue requiriendo crear lo necesario para localizar cuál es la última tinaja que se abrió.
En este caso nos sobra con la variable global, pero tened cuidado con ellas, si usáis muchas podéis acabar teniendo un montón de referencias cruzadas y comportamientos inesperados. Usadlas con mucha precaución. Nuestra variable global se actualizaría con la siguiente modificación:

After opening tinaja:
 if there is a contenido (called content) in the noun:
  say the description of the content;
  say paragraph break;
  now the last open tinaja is the noun;
 otherwise:
  say "Esta tinaja ya no contiene más que polvo.".

Y una vez que sabemos cuál es la última tinaja que hemos abierto podemos modificar el comando examinar para que tienda a apuntar a ella de esta forma:

Does the player mean examining a thing which is examined: it is very unlikely.
Does the player mean examining a tinaja which is the last open tinaja: it is very likely.

Si lo probáis veréis que no está mal, pero los 'contenidos' necesitan algunos retoques para verse bien, por ejemplo en la lista del inventario. Lo que he hecho es renombrarlos en la tabla y cambiar su artículo indeterminado de esta forma:

The indefinite article of a contenido is usually "los".

Table of Contenidos Tinajas
contenido description
a restos de Belaiska "El olor es aún intenso dentro de la tinaja pero el cuerpo 
ya sólo era un pequeño montón de huesos.  
Esta es la tinaja donde enterrásteis a Belaiska, la mujer de tu hermano, muerta de parto."
...

De esta forma si el parser intenta pintar el nombre del contenido de Belaiska mostrará 'los restos de Belaiska' lo que está bastante bien. Ahora empecemos a guiar un poco al interlector en su misión de recoger los huesos y digámosle que no ande abriendo tinajas ni ton ni son:

Before opening tinaja:
 if the noun is not the last open tinaja and there is a contenido in the last open tinaja:
  say "Mejor no abramos más tinajas hasta que recuperemos los restos de las que ya tenemos abiertas.";
  stop the action.

Es un poco más restrictivo de lo que me gusta pero para esta obra tiene bastante sentido. Ahora que le hemos limitado a abrir una tinaja cada vez tendremos que darle la posibilidad de usar el saco. Creemos para empezar la acción de 'vaciar':

Chapter 7 - Vaciar

Emptying is an action applying to one thing.

Understand "vacia [something]" as emptying.

Carry out emptying:
 say "No parece algo que pueda vaciarse.".

Y ahora construyamos la acción de vaciar tinaja concretamente:

Does the player mean emptying a tinaja which is the last open tinaja: it is very likely.
 
Instead of emptying an open tinaja when there is a contenido (called content) in the noun:
 say "Recoges con cuidado los [the printed name of content] y los guardas en tu saco.";
 move the content to saco.

Véase que sólo hemos creado una reacción diferente cuando estamos refiriéndonos a una tinaja que tiene un contenido, si está vacía irá por el comportamiento general. Esta es la forma más adecuado en Inform 7, no os pongáis a meter condicionales dentro del cuerpo de la regla si podéis ponerlas en la declaración de la misma, de esta forma funcionarán conjuntamente de mucho más armoniosamente. Daos cuenta también cómo hemos usado la información de cuál es la última tinaja abierta para recomendar al parser que use esa para la acción de vaciar.

¿Podría referirse el interlector a una tinaja concreta por ejemplo refiriéndose a su contenido? Pues sí, la verdad, ya que Inform 7 permite referirse a cualquier objeto de varias formas como por su nombre/adjetivos, pero también por sus propiedades y sus relaciones (véase este capítulo); y no sólo eso, nos proporciona una serie de relaciones preconstruidas y con ellas es posible escribir:

Understand "tinaja de [something related by containment]" as a tinaja when the item described is open. 

Rule for printing a parser error when the latest parser error is the can't see any such thing error :
 if the player's command includes "tinaja": 
  say "¿Qué tinaja es esa?";
 otherwise:
  say "No sé a qué te refieres.".

Si probamos el estado actual de esta obra, ¡wow!, ya tenemos todo lo necesario para que el interlector pueda interactuar con el minimundo que le hemos creado y haga todo lo que esperamos que haga. ¿Qué nos falta entonces? Pues en realidad nos falta la historia. El interlector debe poder ir abriendo tinajas -lo tenemos-, guardando huesos -lo tenemos- hasta que se encuentre con los restos del sacerdote y se 'desencadene' el drama. La historia, como vamos a ver, está constituida por una serie de reglas concretas que modifican el comportamiento general del mundo que hemos creado para darle sentido a la obra. Pero esto lo veremos en la siguiente y, probablemente última, entrega de este tutorial.

No hay comentarios: