8.6.18

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

Para poder avanzar un poco más tenemos que buscar una manera de incluir la variabilidad que conseguimos en Squiffy a la hora de ir abriendo tinajas en el relato. En aquella versión hicimos que los enlaces que implicaban una nueva tinaja fuesen apuntando a alguna de los posibles textos válidos hasta que, con un número mínimo de abiertas, se permitía que pudiese escogerse la tinaja del sacerdote e iniciar así la secuencia final. 

En realidad en el caso de una herramienta para ficción interactiva de parser como es la escogida (Inform 7), se podría hacer de una manera conceptualmente igual, es decir, ir capturando la secuencia de 'abrir tinaja' que el interlector vaya tecleando y escoger el siguiente mensaje de descripción aleatoriamente y seguir avanzado. Esta sería la forma natural de hacerlo en tiempos antiguos cuando lo habitual eran cosas como PAWS, o el DAAD, que parece que ahora insisten en resucitar. A fin de cuentas estas herramientas estaban fuertemente orientadas al tratamiento del comando tecleado, haciendo bastante más difícil montar una lógica del mundo más general y más robusta. Los herederos de primera generación (SINTAC, NMP, CAECHO?, SKC), segunda (Paguaplús,Superglús, AttoPAWS) y actuales (NgPAWS) de estas herramientas, no han cambiado en nada esto. Los sistemas de parser orientados a objeto (como el Inform 6 o el AGE) cambian la situación pero no del todo, ya que el modelado por clases permite montar el modelo de mundo necesario, e incluir la aleatoriedad de una forma no necesariamente orientado al comando. Sin embargo, en ambos casos el hecho de que el tratamiento de los comandos está incluido en la definición de los objetos hace que siga siendo más natural orientar la solución a 'contar las veces que se usa abrir tinaja' e incluir respuestas aleatorias. Pero esta aproximación, que parece la más natural y sencilla de hacer, tiene en realidad muchos problemas de coherencia cuando se va más allá de la secuencia de comandos que se espera que el interlector use. Es fácil que el interlector acabe viendo las 'bambalinas' porque la respuesta que se le da a 'abrir la siguiente tinaja' simplemente no está del todo alineada con el modelo de mundo que de verdad está manejando el parser.

La aproximación de reglas propuesta por Inform 7 (aún estoy esperando a que salga alguna otra herramienta con esta aproximación) permite, por fin, desligar totalmente el modelado del mundo del tratamiento del comando y de hecho lo natural en esta herramienta es hacerlo así. Veamos cómo...

Lo primero es que vamos a rellenar las tinajas con 'contenidos' de verdad, o sea, cada tinaja va a tener un objeto (thing en I7) en su interior cuya descripción es el equivalente al mensaje aleatorio que teníamos en Squiffy. Como vamos a hacer muchas cosas generales con estos objetos lo natural en I7 es crear una clase de objetos para ellos, de esta forma:

A contenido is a kind of thing.  The plural of contenido is contenidos.

Una vez definida la clase podemos usar la capacidad que tiene I7 de crear múltiples objetos usando tablas de esta forma (véase sección en el manual):

Some contenidos are defined by the Table of Contenidos Tinajas. 

Table of Contenidos Tinajas
contenido description
a contenido 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."
a contenido guerrero "Entre otros huesos de tamaño considerable, una calavera enorme 
te mira con resplandecientes dientes blancos."
a contenido niños "Varias calaveras, pequeñas, tal vez de niños acompañadas por sus 
huesesillos. Eso te hace pensar en todos los niños que morían durante el nacimiento o poco 
después de nacer, sin haber disfrutado si quiera de una breve vida con sus padres y familiares."
a contenido campesino "Huesos de un campesino, o una campesina, no muy diferente a tí. 
Ningún adorno, ni siquiera un minúsculo ídolo de los dioses que le acompañe y guie por 
las turbulenta noche del más allá. Sólo huesos cansados y desgastados."
a contenido polvo "Nada más que polvo. Es triste. Hasta ese polvo amarillento 
merece acompañaros al sur, pero no puede meterse en los sacos. Si hubieses traído 
sacos para harina... pero son caros y están todos ocupados con alimentos, son necesarios 
para los vivos."
a contenido antiguo "Esta tinaja debe ser muy antigua, pero los huesos debieron 
ser de alguien fuerte y resistentee porque aún quedan bastantes fragmentos entre el 
polvo."
a contenido reina "Debe ser el cuerpo de una princesa o de una reina, o tal 
vez de un cacique. Entre los huesos y el polvo sobre salen joyas. Pura vanidad 
envasada en barro."
a contenido sacerdote "¡No puede ser! Huesos teñidos de ocre, cuentas de piedra 
de bosque, el jade tosco pero sagrado y restos de tejido rojo. ¡Un sacerdote! 
¡Pero eso es imposible!"

Cuando quieres hacer  una obra con muchos objetos que sean de diversas clases, lo que acabamos de hacer es una forma estupenda de organizarlo y de que queden claros. Es compacta, fácil de mantener y la capacidad de I7 de extender/repartir tablas a lo largo de tu obra te simplificará aún más el trabajo (véase en el manual).

Cómo hacemos ahora que los contenidos estén en distintas tinajas, pues primero vamos a definir que una tinaja está vacía si no tiene contenido (lo que nos resultará seguro muy útil más adelante) de esta forma:

Definition: a tinaja is empty if there is no contenido in it.

Y ahora aprovechándonos de ello haremos:

When play begins:
 repeat with content running through contenidos:
  move content to a random empty tinaja.

'Definition:' es la forma que tiene Inform 7 de definir nuevos 'adjetivos' para las clases, condiciones que se pueden usar en otras frases del lenguaje, y 'random' permite escoger en un conjunto de números, objetos, etc... de forma tan general por eso es posible escribir algo tan simple y comprensible como 'a random empty tinaja'.

Como hemos creado ocho contenidos diferentes tendréis que subir el número de tinajas presentes hasta ocho, ya podéis imaginar que es con:

There are eight tapas.
There are eight tinajas.

Si corréis la obra y tecleáis 'tree' veréis las tinajas y cómo cada contenido ha acabado dentro de una de ellas. ¡Bien! Hemos creado casi todo lo que necesitamos para poder hacer funcionar nuestro relato.

Un par de cosas antes de continuar: primero, como habréis visto, hemos cambiado considerablemente los textos del contenido de las tinajas entre la versión de Squiffy y esta. Es lo normal. No sólo es el cambio necesario de tiempo verbal para hacer al interlector el protagonista (aunque esto en realidad podríais escoger no hacerlo en segunda del presente, pero no lo hagáis hasta que seáis expertos), además es que hay que ser cuidadosos con el texto de respuesta y reservar cosas para los examinar posteriores que ya veremos en otro capítulo. (Por cierto, un ejemplo de que podéis 'documentaros' incluso sobre la marcha en estos tiempos: he necesitado casi crear la descripción de la tinaja del sacerdote, he pensado en ponerle unos abalorios de piedras y no de oro, buscando sobre la época he llegado a esto, y rápidamente he visto que no hay nombre común para la variscita, así que he decidido crear uno).

Antes de despedirnos por el momento, ¿lo que hemos hecho con los contenidos no podríamos aprovecharlo para hacer que la descripción de las tinajas y sus tapas sea más coherente y así incrementar la credibilidad del modelo del mundo? Sí, de esta forma:

A tapa is a kind of supporter. 
The grammatical gender of a tapa is usually feminine gender.

Table of Description Tapa
text
"Envejecida, pero aún se reconoce la madera de los árboles locales, 
los mismos que os proveen de madera para cuencos o para cocinar."
"De madera vieja. Algo carcomida por el tiempo, 
pero aún reconocible como de los árboles locales."
"Madera envejecida por el tiempo aunque aún resistente, 
capaz de proteger los restos de los antepasados."

A tinaja is a kind of closed openable container. A tinaja is usually fixed in place.
All the tinajas are part of conjunto tinajas.
The grammatical gender of a tinaja is usually feminine gender.

Table of Description Tinaja
text
"Arcilla amarilla con algunos toques de rojo muy 
pálido cocida en el horno comunitario."
"Barro cocido a fuego lento para ser duradero."
"Amasado por manos expertas y cocido en el horno comunitario."
"Tierra y agua de vuestro río, y fuego alimentado 
con la madera de vuestros bosques. Hasta ahora, 
muy pronto la palabra 'vuestro' ya no será la adecuada."
 
When play begins:
 repeat with jar running through tinajas:
  if there is a tapa (called selected) which is not part of anything:
   now selected is part of jar;
  choose a random row in Table of Description Tinaja;
  now the description of jar is text entry;
 repeat with tapa running through tapas:
  choose a random row in Table of Description Tapa;
  now the description of tapa is text entry. 

Podéis ver que la forma de escoger un texto aleatorio de una tabla es algo diferente, pero eso también lo podéis leer con detalle en el manual.

El estado en este punto de la obra lo podéis descargar aquí.

No hay comentarios: