Mostrando entradas con la etiqueta huesos. Mostrar todas las entradas
Mostrando entradas con la etiqueta huesos. Mostrar todas las entradas

26.6.18

Tutorial de creación de ficción interactiva - Huesos (y 15)


Busquemos ya la salida de este tutorial, que hemos pasado ya mucho tiempo en la oscuras tierras de huesos y reglas. En el anterior capítulo ya habíamos conseguido que nuestro minimundo tumulario fuese bastante coherente y contuviese todos los elementos necesarios para nuestra historia. Veamos que retoques necesita para que contenga también nuestra historia y no sólo una extraña simulación de la edad del bronce.

Lo primero es que la protagonista no debería encontrarse con el fin de la historia demasiado pronto, esto ya lo habíamos hecho en el caso de Squiffy, aquí lo podemos hacer simplemente añadiendo alguna regla más de 'Do the player mean':

Definition: a tinaja is sacred if restos de un sacerdote is in it.
Does the player mean opening a sacred tinaja 
  when there are less than three open tinajas: it is very unlikely.

Lo he hecho en dos pasos para que veáis cómo es posible mezclar diversos mecanismos de control. Por una parte defino que una tinaja sagrada si contiene un sacerdote (el único que contiene el mundo del juego en este caso) y luego uso esa definición junto con el requisito de que haya menos de tres tinajas abiertas para decirle al parser que mejor no considere la tinaja del sacerdote si es demasiado pronto. Creo que queda bastante elegante, ¿no os parece?

Vale, y cuando aparece el sacerdote, ¿qué? Pues en la versión de Squiffy desarrollábamos el temor de la protagonista y finalmente cuando intentaba vaciar la tinaja cambiábamos el escenario apagando la luz y haciendo que huyese. Primero revisemos la descripción de los restos del sacerdote y metamos algo de los textos de Squiffy usando la técnica de los examina en diversos intentos:

Chapter 8 - Historia

Section 1 - Examina

Does the player mean examining restos sacerdote when the restos de sacerdote is in a open tinaja: it is very likely.

Instead of examining restos de sacerdote for the first time:
 say "Los restos del sacerdote parecen demasiado bien conservados. Su piel está seca, como costra salada, 
             pero aún tiene cara. Una cara de sonrisa excesiva y amenazadora que  te ha hecho soltar un breve 
             grito al destapar la tinaja.".
 
Instead of examining restos de sacerdote for the second time:
 say "No entiendes cómo un sacerdote puede estar aquí en el túmulo del pueblo. No tiene sentido.  
             Los sacerdotes ya no se entierran en el pueblo. Viven apartados, en su propia colina y por 
             lo que sabes los entierran allí mismo, en los cimientos del templo dedicado a Potnia. Pero 
             éste está aquí, y está casi entero, casi sin corromper. ¿Por qué está en el túmulo tan lejos 
             del resto de los suyos?".

Instead of examining restos de sacerdote for the third time:
 say "Potnia, la diosa de los animales es adorada, por todo el que tiene juicio, pues de ella 
             depende toda prosperidad, así como la suerte en los partos o que las tormentas y las heladas 
             no destruyan las cosechas. Hasta la luz nace de ella, al menos si está de humor. Mover los 
             restos de uno de sus sacerdotes podría ser un gran pecado, por ello te tiemblan las manos 
             al pensar en sacar al sacerdote de su tinaja.".
 
Instead of examining restos de sacerdote:
 say "Cuánto más lo miras más segura estás de que debes salvaguardar estos restos y  también que 
             si lo haces atraerás contra ti y tus descendientes las peores maldiciones de Potnia. Tal 
             vez vuestros ganados perezcan y vuestras mujeres se vuelvan estériles.".

Buen truco lo de 'for the X time', ¿eh? Inform 7 os da siempre muchas herramientas para hacer las cosas como estáis viendo, aunque a veces eso ha jugado en su contra, así que si os perdéis y qué es mejor (probablemente todas las formas sean válidas) ya sabéis que podéis preguntar lo que queráis aquí y aquí. Y, de nuevo, podéis ver cómo las reglas más 'concretas' siempre se considerarán antes en I7 frente a las más generales.

Vale, ahora habrá que proporcionar una reacción adecuada al verbo 'tocar', ¿no? Porque en estos textos se mencionan un buen montón de texturas, se habla de sequedad, etc... Inform ya trae 'touching' como acción, así que nos bastará con darle contenido para algunas cosas que nos parezcan relevantes, por ejemplo:

Section 2 - Tocar
 
Instead of touching a tinaja:
 say "Rugosa, vieja, segura.".
 
Instead of touching a contenido:
 say "Secos, conocidos. Nunca los manipularías sin el debido respeto.".
 
Instead of touching a piedra de chispa:
 say "Con bordes afilados, pero no cortantes.".
 
Instead of touching a saco:
 say "Burdo, basto, lo bastante apretado para contener los restos de vuestros antepasados.".
 
Instead of touching restos de un sacerdote:
 say "Seco y quebradizo. El tacto del sacerdote te pensar en maldiciones, en enfermedades, en ovejas 
             estériles y cabras de ubres secas, en todo lo negativo que la diosa Potnia podía llegar a 
             desatar contra los que no respetan las tradiciones.".

Y ahora al meollo, qué pasa si intentas coger los restos del sacerdote o vaciar su tinaja (añadiendo un pequeño sinónimo además):

Instead of taking a contenido when the noun is in a tinaja (called vase):
 try emptying vase.

Section 3 - Vaciar tinaja del sacerdote
 
Instead of emptying a sacred tinaja for the first time:
 say "Con muchísimo cuidado y aún más respeto haces un intento de tirar de los flacos 
             y secos brazos del sacerdote, pero la piel está quebradiza y frágil.";
 say line break;
 say "Al primer sonido de desgarro te da un vuelco el corazón.";
 say line break;
 say "No vas a poder hacerlo. No vas a poder. Si tiras más del sacerdote lo vas
              desmembrar. Aunque debes.".

Instead of emptying a sacred tinaja:
 say "Vuelves a intentarlo, pero tanto es el miedo que tienes que caeshacia atrás.";
 say line break;
 say "Con horror ves como la lámpara rueda por el suelo hasta apagarse.";
 now the lampara is not lit;
 move the lampara to the tumulo.

Ya hemos provocado que con su segundo intento la protagonista se quede a oscuras y sin lámpara, lo que en realidad hace que no pueda hacer nada de nada, excepto lo que le permitamos, como por ejemplo:

Section 4 - Salir o moverse en la oscuridad

Instead of exiting when in darkness and there is a sacred open tinaja for the first time:
 say "Intentas encontrar el camino de salida, pero sólo logras tropezar con alguna tinaja volcándola y 
              haciéndote daño en las rodillas.".
 
Instead of exiting when in darkness and there is a sacred open tinaja for the second time:
 say "Vagas por entre las tinajas con más cuidado, intentando aguzar tu envejecida vista buscando 
             el escaso resplandor del pasillo de entrada. Pero no logras ver nada.".
 
Instead of exiting when in darkness and there is a sacred open tinaja for the third time:
 say "Te parece escuchar los pasos tambaleantes de la momia del sacerdote que te busca en la 
            oscuridad mientras te abres paso apresuradamente entre las tinajas para darte de bruces contra una pared.".
 
Instead of exiting when in darkness and there is a sacred open tinaja for the fourth time:
 say "Con la respiración ya muy alterada y sin saber muy bien como sales al exterior.";
 secuencia final.
 
Instead of exiting when in darkness:
 say "No tiene sentido marcharse hasta no haber recogido los restos de tus antepasados.".

Ya tenemos la secuencia final usando 'salir' como comando clave, excepto que falta eso de 'secuencia final'. Inform 7 permite agrupar varias cosas dentro de una frase nueva de esta forma:

To secuencia final:
 say line break;
 say "...";
 wait for any key;
 end the story saying "Mientras la anciana corre asustada desde el túmulo hacia su aldea, 
         en la oscuridad el sacerdote, que no se había movido de la tinaja, sonríe. No había tenido 
         que hacer casi nada, tan sólo apagar una lámpara- y no tendría que pagar un precio demasiado 
         alto por trastear entre los vivos en aquella ocasión. Sabía que ella ya no regresaría y que 
         para cuando llegasen los hombres de Esus -demasiado pronto ya- ella, la anciana piadosa, 
         estaría lejos y a salvo.".

Pues ya tenemos vuestra primera aventura... más o menos. Faltaría añadir una intro de forma parecida a como hemos puesto una secuencia final, por ejemplo:

Section 5 - Secuencia inicial

When play begins:
 say "Lo más impresionante es el silencio. Lo más terrorífico la oscuridad. 
          En el mundo de los vivos el sonido lo permea todo. Los ruidos son constantes. 
          Los trinos de los pájaros. Las llamadas de las cigarras. Los berridos del ganado. 
          Las voces de la gente. La vida es ruidosa. Hasta los espírtus más cotidianos como 
          el arroyo y el viento se anuncian con el sonido.";
 say line break;
 wait for any key;
 say "Sin embargo los muertos viven en el silencio frío y oscuro del túmulo. No es 
          un lugar para los vivos, ni lo es para ti, una anciana.";
 say line break;
 wait for any key;
 say "Los antepasados crearon el túmulo con enormes paredes de piedra, tan gruesas 
          que parece casi inexplicable ahora que pudiesen moverlas sin ser héroes gigantes 
          y míticos. Tal vez lo fuesen, pero sabes que nada quedaba fuera del alcance de una 
          pueblo unido y decidido. Nadie sabe ya si crearon estas fuertes paredes para proteger 
          a los muertos de los saqueos o a los vivos de que los muertos regresasen, pero fuese por 
          lo que fuese lo que queda fuera del túmulo era el sonido de la vida.";
 say line break;
 wait for any key;
 say "El túmulo es un mundo ajeno, pero has tenido que venir a salvar los restos de vuestros 
          antepasados de los hombre gigantes de Esus.";
 clear the screen.

Y ya está. Más o menos, realidad queda mucho que se mejorar y ampliar, pero, ¿por qué no lo hacéis vosotros? Hacedla mejor, más detallada, más completa y si queréis mostradnos vuestra versión aquí.

Aquí acaba este tutorial y el resultado final podéis descargarlo aquí o ver el resultado compilado aquí.

También podéis verlo en itchio aquí.

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.

14.6.18

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

Si probáis a abrir una tinaja veréis dos cosas: primero que el texto de respuesta es bastante inadecuado, porque no te dice nada de lo que encuentras y además podréis comprobar que si intentas repetidamente 'abrir tinaja' va a intentar abrir la misma tinaja una y otra vez. El comportamiento no se parece en nada al que obtuvimos en la versión Squiffy, ni tampoco a la idea del 'flujo de acción' del relato original (una anciana que va abriendo tinajas y vaciando el contenido con respeto y cuidado en un saco). Necesitamos que la secuencia sea algo parecido a: 'abrir tinaja', 'examinar tinaja', 'vaciar tinaja', 'abrir tinaja', 'vaciar tinaja'... Dado que no hemos 'nombrado' (ni queremos) cada una de las tinajas, podría parecer todo un reto crear un mecanismo de interacción que resulte fácil y al mismo tiempo intuitivo para el interlector; pero no lo es. Sé que alguno estará pensando, "pero, pero... ¿no tenemos que nombrar cada tinaja de una forma diferente para que el interlector pueda decir vacía esa tinaja y luego aquella otra?".

:)

Pues la verdad es que no. La solución tradicional a este problema en un 'juego de aventuras' sería pintar cada tinaja de un color, o hacer que cada tinaja sea de una arcilla diferente, o decir que unas están descascarilladas mientras que otras están agrietadas. A fin de cuentas hay hasta una obra inglesa que usa tal solución como puzle: 69105 keys. En esta obra hay literalmente 69105 llaves pero sólo hay un formato de llave que sólo tiene una copia, ¡encuéntrala si puedes!. En el fondo esta obra lo que contiene es un 'meta puzle', es algo que tiene sentido por el medio que se usa y por la forma en la que se resuelve 'habitualmente' la ambigüedad. Para abrir la puerta de la obra tendrás que escribir algo tan chungo como 'abre la puerta con la llave pequeña de hierro con mango azulado, cabeza ovalada y diente cuadrado'. 

:)

Salvaje. Como puzle. Pero, ¿no sería posible resolver el puzle escribiendo 'simplemente': > probar con una llave, probar con una llave, probar con una llave, probar con una llave.... [69101 veces más]?  Y la obra debería responder con:

> probar con una llave. probar con una llave...
Pruebas con la llave pequeña de hierro con mango azulado, cabeza ovalada y dientes cuadrados. No funciona.
Pruebas con la llave pequeña de hierro con mango azulado, cabeza ovalada y dientes triangularas. No funciona.
Pruebas con la llave pequeña de hierro con mango azulado, cabeza ovalada y dientes redondeados. No funciona.
Pruebas con la llave pequeña de hierro con mango azulado, cabeza rectangular y dientes cuadrados. No funciona.
....
¡Vaya la llave mediana de hueso de dragón con mango dorado, cabeza triangular y dientes redondeados sí que logra abrir la puerta!

Como solución a ese puzle pierde toda la gracia, pero para nuestra obra sí que tendría sentido. Y diría más, para gran parte de las obras de ficción interactiva la distinción usando adjetivos diferenciados es un auténtico dolor para el interlector que tiene que teclear una y otra vez los 'adjetivos' que identifican al objeto concreto con el que quiere interactuar y, sin embargo, la usamos una y otra vez. Va siendo hora que nos liberemos de ella, veamos cómo.

Lo primero es cambiar el mensaje estándar que devolvemos al abrir una tinaja, esto se logra mediante las reglas 'After' de esta forma:

Chapter 5 - Abrir tinaja

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

Podéis ver que hemos incluido una respuesta útil para las tinajas que no contengan nada. Esto nos permite subir el número de tinajas por encima del número de contenidos, como a 12 por ejemplo -no nos pasemos o el interlector pensará que se han acabado las tinajas que vaciar y que el resto está vacía. Como ya sabéis para lograr esto basta con subir el número de tinajas y de tapas.

There are twelve tapas.
There are twelve tinajas.

Si probáis la obra ahora veréis, que 'abrir tinaja' insiste en usar una y otra vez la misma tinaja, ¿cómo resolvemos esto? Pues es brutalmente sencillo, incluyamos es única línea extra de código.

Does the player mean opening a tinaja which is open: it is very unlikely.

Ahora le hemos explicado al parser que es muy poco probable que el interlector quiera abrir una tinaja que ya está abierta. Probadlo. Magia negra, ¿eh? Inform 7 tiene cosas realmente maravillosas en su interior. Podemos hacer lo mismo a la hora de examinar tinajas, para que 'ex tinaja' no nos de el mismo resultado una y otra vez.

Chapter 6 - Examinar tinaja

A tinaja can be examined. A tinaja is usually not examined.

Does the player mean examining a tinaja which is examined: it is very unlikely.

After examining or opening a tinaja:
 now the noun is examined.

Fijaos lo fácil que resulta añadir una cualidad nueva a cualquier objeto o clase de objeto, darle un valor inicial y hacer que dicha cualidad cambie tras una acción o varias. Daos cuenta que podría haber puesto el cambio de la propiedad en la anterior sección, ya que ahí hemos definido lo que pasa 'después de abrir una tinaja', pero me ha parecido más fácil de entender si lo ponía aquí y funciona. Inform 7 os permite añadir el código cerca de la sección que determina un comportamiento, y eso en obras grandes es realmente útil. Por supuesto podemos hacer lo mismo con las tapas, de esta forma:

Chapter 7 - Examinar tapa

A tapa can be examined. A tapa is usually not examined.

Does the player mean examining a tapa which is examined: it is very unlikely.

After examining or opening a tapa:
 now the noun is examined.

¡Pero es el mismo código! Mejor hacerlo de forma algo más general:

Chapter 6 - Examinar rotativo

A thing can be examined. A thing is usually not examined.

Does the player mean examining a thing which is examined: it is very unlikely.

After examining or opening a thing:
 now the noun is examined.

Mucho mejor. En Inform 7 si veis la forma de hacer algo de forma general, hacedla de forma general, e incluso os diría que si no veis como hacerlo de forma general pasaos por textualiza o por el caad y preguntadnos. Muy pocas veces implementar el caso concreto en lugar del general sale rentable, y el caso general os dará un rico y, a veces, agradablemente sorprendente resultado cuando interactuéis con la obra por hilos raros de la historia.

Pero seamos un poco críticos. ¿Queremos realmente este comportamiento en el caso de examinar? Está genial para ir examinando tinajas cerradas y ver un poco todo lo que hay, pero si el interlector está haciendo de la anciana que acaba de abrir una tinaja concreta, ¿el comando examina no debería referirse a esa tinaja? Desde luego el comando vaciar debería hacerlo. ¿O tal vez deberíamos tener un comportamiento diferente con las tinajas abiertas o cerradas? ¿O es que deberíamos distinguir entre la propia tinaja abierta y su contenido? Uff... habrá que escoger y no es una elección obvia. Al final tendréis que escoger en vuestras obras una interacción que os parezca la más lógica e intuitiva para el interlector, y eso no es algo que sea independiente de la obra misma.

En la próxima entrega os explicaré cuál ha sido mi decisión a ese respecto y cómo lo he implementado. ¡Por cierto nos olvidamos en la anterior entrega que la anciana también lleva un saco! ¿Sabríais incluirlo? Venga incluidlo vosotros mismos y si no siempre podéis mirar cómo lo he dejado yo aquí.

13.6.18

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

Vamos a redondear algunas cosillas básicas antes de meternos con lo que queda de narrativa principal -nos queda el bucle de ir abriendo vasijas hasta que encontramos al sacerdote, apagamos la linterna que se cae en la oscuridad, miedo, etc...

Ya teníamos una lámpara, un entorno oscuro y ya se podía encender y apagar la lámpara, pero la verdad es que lo hemos simulado todo de una forma muy superficial. Para encender fuego es necesario un yesquero que normalmente está compuesto por algo 'metálico', un pedernal que produce chispas al chocarlo con el metal y algo de yesca o que prenda con facilidad. Todo eso estaba en el relato original y en la versión de Squiffy, así que deberíamos incluirlo en el inventario inicial de la protagonista. No es muy difícil ver como sería:

Section 5 - Objetos para encender la lámpara

A piedra de chispa (f) is a thing carried by the player.
The description of piedra chispa is "Gris oscura con vetas casi blancas. De bordes duros, cortantes, 
fácil de afilar. Los hombres del sur las usaban para crear sus armas en tiempos remotos. Es la que 
crea el fuego cuando se la golpea contra la piedra del sol, como si la piedra del sol le prestase 
el calor.".

A piedra de sol (f) is a thing carried by the player.
The description of piedra sol is "Dorada sin ser oro.  Dicen que cayeron del sol en el lejano norte.".

A yesca (f) is a thing carried by the player.  The indefinite article of yesca is "algo de".
Understand "algo de yesca" or "poco de" as yesca.
The description of yesca is "Hilos de sus mejores vestidos viejos, mezclado con hongo de árbol seco. 
Recibe la semilla del fuego y crea la llama.".

Algo interesante que podemos ver en se código es cómo tratar incontables (algo de yesca, un montón de harina, un poco de agua...). La parte importante es que es muy incorrecto que se refieran a ellos como 'un/una' algo al describirlo, por eso le decimos al compilador que su artículo indefinido es otro diferente: "algo de".

Con esos tres objetos creados ya podemos enriquecer la regla del encendido requiriendo los tres objetos para poder encender la lámpara. Una primera aproximación sería:

Instead of switching on the lampara when lampara is carried and piedra de chispa is carried 
      and piedra de sol is carried and yesca is carried:
 say "Con dificultad tus viejos dedos entre chocan las dos piedras para hacer una pequeña 
             llama en la yesca con la que  enciendes la lámpara.";
 now the lampara is lit.
 
Instead of switching on the lampara:
 say "Necesitas la piedra de sol y la piedra de chispa, así como algo de yesca para enceder 
             la lámpara.";
 stop the action.

Aquí podemos ver en funcionamiento la magia de las reglas que se ejecutan según orden de 'especificidad'. La primera regla requiere que se cumpla una condición así que se ejecutará primero, la segunda, sin embargo, se considerará después. Si lo probáis veréis que funciona estupendamente y en esta clase de cosas está la magia y dificultad de I7. El que las reglas tengan prioridad según como de concretas sean es lo que nos permite separar nuestro código en pequeños fragmentos manejables, distribuidos incluso entre extensiones y que todo funcione.

Pero la verdad es que nuestra aproximación es un poco horrible con todos esos 'and' tras el 'when', habría que organizar esto un poco mejor. Para empezar encapsulemos esas condiciones en una sola de esta forma:

To decide if the player can lit a fire:
 if piedra de chispa is carried and piedra de sol is carried and yesca is carried:
  yes;
 otherwise:
  no.

Instead of switching on the lampara when the player can lit a fire and lampara is carried:
 say "Con dificultad tus viejos dedos entre chocan las dos piedras para hacer una 
             pequeña llama en la yesca con la que  enciendes la lámpara.";
 now the lampara is lit.

Con lo que hemos aprendido como 'definir nuevas condiciones' en I7 usando 'To decide if'. Este procedimiento permite utilizar parámetros de esta forma:

To decide if (actor - a person) can lit a fire:
 if piedra de chispa is carried by actor and piedra de sol is carried by actor and yesca is carried by actor:
  yes;
 otherwise:
  no.

No está mal y para esta historia es más que suficiente, pero ya que nos hemos puesto a generalizar, ¿podríamos cambiar el código para que cualquier cosa que se pueda encender con fuego pueda ser encendido por cualquier PNJ además del interlector? ¡Sí! Tenéis que definir adecuadamente las cualidades de esos objetos o la 'clase' a la que pertenecen... y os lo voy a dejar como ejercicio.

Hablando de la protagonista. Inform 7 permite examinarte a tí mismo con comandos como 'examináme' ó 'exme' y la respuesta por defecto no puede ser más inadecuada para una anciana, ¡probadlo! (hay que probar todo lo que se os vaya ocurriendo). ¿Cómo se cambia esto? Es fácil el jugador no es diferente a cualquier otro objeto de la obra así que:

Chapter 4 - El interlector

The description of the player is "Los años han hecho mella en tí, pero aún mantienes cierta compostura.".

Y vamos a dejarlo aquí por hoy. El estado actual de la obra podéis descargarla aquí.


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í.

16.5.18

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

Retomemos el tutorial. En la última entrega teníamos definidas varias tinajas (seis) con sus tapas y sus textos de descripción variables. Pero si lo habéis probado habréis visto un efecto bastante desagradable con el  comando más básico de todos 'examinar'. Si examináis una tinaja todo funciona como esperamos, pero si intentamos 'ex tinajas' nos encontramos con una respuesta muy inadecuada: "No puedes especificar objetos múltiples con ese verbo." Si probáis con otros comandos como coger veréis que sí que acepta múltiples objetos. 

Algunos comandos de Inform 7 simplemente no funcionan por defecto con múltiples objetos, y los que lo hacen generan una lista de respuestas, una por cada objeto con el nombre del objeto delante, y eso tampoco nos viene muy bien.

Siempre hay más de una forma de resolver los problemas cuando trabajas con un parser, por ejemplo se nos puede ocurrir resolver esto interceptando el mensaje de error que está saliendo. Esto se puede hacer incluyendo una regla como esta:
Rule for printing a parser error when the player's command includes "ex tinajas":
    say "Amontonadas unas sobre otras esperan ser rescatadas. 
         [if the number of open tinajas is 1]Hay una tinaja abierta.
         [otherwise if the number of open tinajas is  0]Ninguna está abierta aún.
         [otherwise]Hay [the number of open tinajas in words] abiertas.[end if]". 

Aquí vemos cómo siempre podemos interceptar el comando del jugador tal cual y comprobar su contenido (leer la sección del manual de 'Advanced Text'), también podemos ver que el texto se puede hacer variables con condicionales [if <condición>]...[end if], así como vemos que I7 nos permite calcular números de conjuntos definidos por una propiedad 'the number of open tinajas', e incluso permite que ese número se escriba con palabras 'in words'.

Pero esta no es una manera muy apropiada de resolver esto, ¿no sería posible simplemente indicarle a I7 que examinar soporta una lista de objetos múltiples? Sí, basta con añadirle una nueva regla sintáctica de acción sobre objetos múltiples para examining, de esta forma:
Understand "examina [things]" as examining.

Instead of examining conjunto tinajas:
 say "Amontonadas unas sobre otras esperan ser rescatadas. 
             [if the number of open tinajas is 1]Hay una tinaja abierta.
             [otherwise if the number of open tinajas is  0]Ninguna está abierta aún.
             [otherwise]Hay [the number of open tinajas in words] abiertas.[end if]".  
Esto mismo lo podéis hacer para el resto de los verbos comunes, como romper:

Understand "rompe [things]" as attacking.

Instead of attacking conjunto tinajas:
 say "Tendríamos que ser mucho más respetuosos con 
             los restos de nuestros antepasados. Abrirlas con cuidado.".  
 
Instead of attacking tinaja:
 try attacking conjunto tinajas. 
De paso hemos aprendido cómo se puede redirigir en I7 una acción hacia otra con 'try'.

Seguimos en la siguiente entrega.

19.10.16

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

Bien, ya tenemos tinajas y tapas, pero, ¡resulta que no les hemos incluido descripción a ninguna de las dos cosas! Un poco paradójico cuando justamente estamos intentando incluir todo el texto y decoración que la obra necesita.

Añadir descripción es bastante sencillo. Como en los casos anteriores incluimos un 'The description of...', sólo que ahora hay que usar la palabra 'usually' para indicar que estamos definiendo la descripción para toda una 'clase' de cosas y no sólo para una cosa. Es decir, podríamos incluir algo como:

The description of a tapa is usually "Envejecida, pero aún se reconoce la madera de los árboles locales, los mismos que os proveen de madera para cuencos o para cocinar.".

The description of a tinaja is usually "Arcilla amarilla con algunos toques de rojo muy pálido cocida 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 adecuda.".

Ya tenemos descripciones, pero es un poco raro que cualquiera de las seis tinajas y seis tapas tenga exactamente a misma descripción, ¿no? Sería interesante poder poner un menaje que variase de una a otra de forma aleatoria. Inform 7 tiene todo un conjunto de opciones para hacer el texto variable y en concreto hacerlo aleatorios. La opción más sencilla es la construcción:

[one of]...[or]...[at random]

Que permite ofrecer un texto variable que cambie con cada acción de examinar asegurándose que no se repita lo elegido mientras existan alternativas. Por ejemplo lo podríamos dejar como:

The description of a tapa is usually "[one of]Envejecida, pero aún se reconoce la madera de los árboles locales, los mismos que os proveen de madera para cuencos o para cocinar.[or]De madera vieja. Algo carcomida por el tiempo, pero aún reconocible como de los árboles locales.[or]Madera envejecida por el tiempo aunque aún resistente, capaz de proteger los restos de los anteasados.[at random]".

The description of a tinaja is usually "[one of]Arcilla amarilla con algunos toques de rojo muy pálido cocida en el horno comunitario.[or]Barro cocido a fuego lento para ser duradero.[or]Amasado por manos expertas y cocido en el horno comunitario.[at random] 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 adecuda.".

Se puede ver que esta variabilidad del texto se puede aplicar tanto a toda la descripción o un fragmento del mismo. Pero claro, esto no da realmente una descripción diferente para cada tinaja ni cada tapa, tampoco es que lo necesitáramos, realmente, pero más adelante veremos algunas opciones de mejora posibles. En cualquier caso, para darle más color es de interés añadir al menos dos o tres opciones de descripción a casi todas las descripciones principales, pero no es algo imprescindible. Continuemos con la lista de cosas que deberían estar en la obra según dijimos en el post anterior.  Necesitamos el túmulo en su mismo, uno que transmita la sensación de ser otro mundo, uno oscuro y tenebroso cercano al mundo espiritual en el que vivirían los muertos, o al menos portal del mismo.

Para empezar retoquemos un poco el túmulo en sí, aunque sea de una manera un tanto obvia, por ejemplo con:

Tumulo is a dark room. The printed name of tumulo is "Cámara de enterramiento".
The description of tumulo is "Piedras enormes te rodean levantadas por tus antepasados para proteger a los restos de sus muertos. Separan este sagrado espacio dedicado a los fallecidos del mundo de los vivos. Ninguna luz perturba este lugar si no la traes contigo. Ningún sonido llega desde el exterior. Entrar en este lugar es como entrar en otro mundo. Montones de tinajas, algunas en hileras, la mayor parte desordenadas, contienen esos restos a tu alrededor.".

Ahora revisemos de éste lugar qué cosas mencionadas nos faltan. Ya incluimos las piedras pero las podernos hacer más pesadas, más amenazadoras, por ejemplo con:

Some piedras (f) are scenery in the tumulo. 
The description of piedras is "Amarillentas como las colinas cercanas a la aldea. Enormes como caballos, pero las historias dicen que fueron traídas de tierras sagradas lejanas, allá en el lejano sur de nuestros orígenes, por antepasados que aún no sabían como hacer que ningún animal trabajase para ellos. Cierran todo el lugar transformándolo en una cueva sólo para los difuntos y sobre ellas una capa de tierra lo cubre todo.".

Además solo tenemos definido 'piedras', no una de ellas de forma individual. Podríamos limitarnos a incluir un sinónimo de piedras con la palabra 'piedra', esto se haría en Inform 7 con la frase 'Understand', así:

Understand "piedra" as piedras.

En este caso queda bastante bien y lo podemos dejar así, pero hay veces en los que habría que distinguir por el contexto y las respuestas entre el 'conjunto' y el 'individuo' aunque sea genérico. Eso es lo que le pasa a las tinajas. De hecho el texto que hemos incluido en la descripción del túmulo referente a ellas no debería estar en él, sino el un objeto del 'conjunto de tinajas', esto sería de esta forma:

Some conjunto tinajas (f) is a thing in Tumulo.   The conjunto tinajas is fixed in place.
The printed name of conjunto tinajas is "tinajas". "Montones de tinajas, algunas en hileras, la mayor parte desordenadas, contienen esos restos a tu alrededor."

Hemos creado un objeto genérico no movible que tiene un texto que se muestra separado pero como parte de la descripción del lugar. Pero ahora vemos las tinajas como dos veces, una en la descripción y otra en el lugar. Lo podemos solucionar quitando a las tinajas del túmulo, o sea:

There are six tapas.
There are six tinajas.

¡Pero entonces ya no podemos hacer nada con las tinajas, ni examinarlas siquiera! Por que no están allí simplemente. Diablos. ¿Cómo referirnos a las tinajas como conjunto y a la vez conseguir que haya muchas individuales? En realidad no puede ser más sencillo, las tinajas son parte de conjunto de tinajas, ¿no? Pues lo indicamos con:

All the tinajas are part of conjunto tinajas.

Inform 7 permite trabajar así, declarando cosas que afectan a todos los objetos de una misma clase o que comportan una propiedad. Y lo puedes hacer en tiempo de ejecución de la obra o como en este caso en la parte de descripción del mundo.

Se nos ha hecho un poco largo el post. El estado actual de esta obra lo podéis descargar de aquí,

Mañana seguimos creando nuestro pequeño mundo de los difuntos.



12.10.16

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

En el anterior post organizamos el código y empezamos a incluir decoraciones. En el caso de los relatos interactivos orientados a comandos el texto no vive por sí mismo sino que va 'clavado' o 'pintado' aquí o allá asociado a acciones pero muy frecuentemente a los objetos y lugares del modelo del mundo. Muy frecuentemente es más importante en una de estas obras que 'parezca' a que lo 'sea' en realidad. Es decir, frecuentemente lo que acaba siendo la obra se parece más al escenario o decorado que se ve en la foto de la izquierda que a una casa de verdad. En este sentido tratamos al interlector un poco como un abducido por extraterrestres y preso en un simulacro. No se trata de simular todos y cada uno de los aspectos de una casa si incluimos una en el relato, sino que se trata de que no se 'note' que no es una casa sino algo hecho de cartón-piedra. El equilibrio es delicado, porque aunque lo más probable es que no sea necesario incluir en el modelo del mundo las tuberías que recorrerían una casa de verdad, ¿qué pasa si le das al interlector un pico? Nada le impide que las busque picando en una de las paredes y entonces descubrirán que son de cartón-piedra y escaparán de tu obra. Mejor no les des un pico, pero si se los das ten preparada una buena excusa para que no rompan tu decorado.

Como siempre nos tenemos que guiar por la narrativa; es decir, tendremos que incluir todo lo que la historia:

  1. Necesita para completarse
  2. Necesita para tener sentido
  3. Necesita para ser coherente
  4. Sugiere que está
Muchos autores sólo incluyen el primer punto. Eso es muy insuficiente. Muchos autores ni siquiera saben distinguir entre el segundo punto y el tercero. Y raras son las obras que no se han saltado el último punto. Si el interlector está preso en una prisión, tendrás que incluir las paredes, el techo, el suelo y las rejas que conforman su prisión. Todo eso sólo es el nivel punto. Para que la historia tenga sentido tendrás que incluir los elementos que hagan al calabozo triste y desesperante. La suciedad, la humedad, las marcas de anteriores prisioneros. Para que sea coherente asegúrate de saber de dónde viene la luz, cómo llegan los prisioneros allí, cómo los vigilan los carceleros. Y finalmente... si dices que la luz proviene de un ventanuco, éste debe estar, pero también las estrellas que se ven a su través y los ruidos del mundo exterior que entran por él.

Dejaremos de lado aún a las tinajas que trataremos mucho más adelante. ¿Qué nos exige en cada punto la historia que tenemos entre manos?

El primer punto es evidente que sólo requiere las tinajas para completar la historia... bueno, las tinajas y todo su contenido, lo que será el cometido de un post posterior. Nada más, ni siquiera el túmulo. Pero el segundo punto necesita un lugar oscuro, una tumba, el túmulo en sí mismo. Con sus piedras viejas y enormes, con un suelo básicamente de tierra en la que las tinajas se hayan asentado casi hasta quedar unidas unas a otras, probablemente telarañas, polvo removido por la visita de nuestro protagonista. Pero todo eso no es suficiente para que el escenario sea coherente, al menos tiene que haber alguna clase de pasillo que nos haya traído hasta es lugar y por el que nos podamos marchar. Necesitamos una fuente de luz, una pequeña, por lo que también tendremos de hacer zonas de luz y de oscuridad, cosas que se vean desde el principio y tal vez zonas a las que haya que iluminar.

Uff... son montones de cosas y además ya se van perfilando una serie de acciones que habrá que implementar, como salirse del túmulo o la posibilidad de iluminar diversas secciones del túmulo. Hay dos maneras de encarar esto; la ordenada y eficaz o la entretenida y laboriosa. La ordenada consiste en que te pares ahora mismo y hagas una lista de todos los objetos que vas a necesitar y las acciones que estos objetos requieren... de hecho, en esta aproximación tradicionalmente se ha hecho un walkthrough, o en palabras castellanas, una secuencia de acciones que llevan al menos a uno de los finales de la obra, al final 'bueno'. Este componente, esta lista, era tan habitual que incluso hay colecciones de 'soluciones' y se siguen pidiendo en muchos casos para los concursos. A mí eso ya no me gusta. Si una obra necesita que exista y que se guarde su 'solución' es que es una colección de puzles indigerible que no está bien enhebrada, cuya complejidad no está equilibrada con el interés que despierta. Por eso ya no incluyo ese requisito en los concursos -como en Más allá de la Comp- ni me parece siquiera interesante leer 'soluciones' o que se publiquen.

Así que vamos a hacerlo de forma desordenada y creativa. Como hemos ya dicho un par de veces lo único que necesita el relato son las tinajas. No vamos a hacer el tratamiento correcto de las tinajas que deben de incluir toda la interacción, el contenido de las mismas y la interacción con el contenido. Pero hagamos un poco de estructura para ver cómo iría. Lo primero sería crear un conjunto de tinajas todas iguales. El relato requiere en realidad que el número sea 'enorme' y desconocido, pero empecemos con algo más controlable, por ejemplo siete tinajas. Inform 7 contiene un maravilloso sistema para hacer objetos iguales, que consiste en: primero crear una 'clase' de objetos y luego decir simplemente cuántos objetos de esa clase están presentes.

Section 3 - Tinajas

A tinaja is a kind of container.
The grammatical gender of a tinaja is usually feminine gender.

There are six tinajas in Tumulo.

Decimos que una tinaja es un contenedor, que es femenino y luego decimos que hay seis. Listo. Podéis descargaros el código de aquí, compiladlo y veréis que es bastante sencillo pedirle al parser que haga cosas por vosotros con tinajas. Pero le faltan cosas. Para empezar a nuestro personaje anciana no debería resultarle nada sencillo arrastrar estas tinajas de aquí para allá, y desde luego no debería poder cogerlas. Esto se resuelve añadiendo un 'fixed in place' a la definición de las tinajas. Además deberían estar cerradas y debería ser posible abrirla y cerrarla, esto se consigue añadiendo 'closed' y 'openable' a la tinaja. Quedando el código:

Section 3 - Tinajas

A tinaja is a kind of closed openable container. A tinaja is usually fixed in place.
The grammatical gender of a tinaja is usually feminine gender.

There are six tinajas in Tumulo.

Pero en realidad la tinaja debería tener una tapa, una buena tapa de madera sellada con betún. Añadir una tapa a un contenedor no es tan sencillo en Inform 7. Lo primero es crear otra clase de objeto que sea la tapa, decir que hay seis y explicar que cada tinaja tiene su correspondiente tapa. O sea:

Section 3 - Tinajas

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

A tinaja is a kind of closed openable container. A tinaja is usually fixed in place.
The grammatical gender of a tinaja is usually feminine gender.

There are six tapas.
There are six tinajas in Tumulo.

Tenemos que asociar ahora las tapas a las tinajas. Inform 7 tiene la posibilidad de hacer objetos partes de otros objetos y de esta forma una tinaja cerrada tendrá una tapa asociada que podremos separar cuando la abramos. Una forma de asociar una tapa a una tinaja sería esta:

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.

Como este capítulo se ha alargado demasiado mejor dejarlo aquí.

30.9.16

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

Si algo tenía Squiffy era su simplicidad. Una única secuencia de texto en dónde sólo había secciones separadas por [] y [[]] cada una con su nombre y los enlaces entre ellas. Como ya empezamos a ver en la anterior entrega en Inform 7 la cosa va a ser algo más complicado y merece la pena que empecemos desde el principio a ordenar nuestro código. Por supuesto podríamos hacerlo con comentarios, ya que Inform 7 proporciona una herramienta muy sencilla para incluir comentarios que es rodear una parte del texto con corchetes.

Por ejemplo podríamos empezar con poner un comentario indicando las circunstancias de la creación de esta obra, con una especie de mínima ficha que explique al que se la encuentre en el futuro de qué va todo esto. Claro que Inform 7 ya proporciona un mecanismo para incluir información 'bibliográfica' de la obras, como podéis ver en este enlace. Si añadimos esta información y además ponemos un comentario de contexto de la obra nos quedaría una cabecera como la siguiente:

"Huesos" by Johan Paz (in spanish)

[==============================================================

 Huesos - ejemplo de historia interactiva creada en Inform 7
 
 Parte del tutorial de 'huesos':
  
  http://pacificaciones.blogspot.com.es/search/label/tutorialhuesos
  
 Creado en 2016 por Johan Paz con motivo de la competición:
  
  http://wiki.caad.es/M%C3%A1s_all%C3%A1_de_la_Comp
  
==============================================================]

The story title is "Huesos". 
The story author is "Johan Paz". 
The story headline is "Una historia de fantasmas en la edad del bronce". 
The story genre is "Horror". 
The release number is 1. 
The story description is "Sin casi apoyo de tu comunidad, tú, una pobre anciana 
vas a lograr que los huesos de tus antepasados no sean profanados." 
The story creation year is 2016. 

Estos cambios no modifican la obra absolutamente en nada, pero ayudarán a los que se encuentren la obra en el futuro y en su 'publicación' y propagación como explica la sección de la documentación que he enlazado anteriormente.

Otra herramienta que tiene Inform 7 para hacer más claro el código es la capacidad de hacer secciones mediante las palabras claves 'Part', 'Chapter', 'Section', numeradas y con un título. Estas secciones además sirven para navegar por nuestro código tanto en el IDE como cuando se publica la obra incluyendo el código.

Creemos una 'parte' para cosas técnicas -que de momento dejaremos vacía-, otra con el modelo del mundo. En la parte del modelo del mundo separaremos en capítulos la parte de mapeado y la parte de objetos. Finalmente crearemos una sección para cada lugar o cosa existente. El código nos quedaría de esta forma:

"Huesos" by Johan Paz (in spanish)

[==============================================================

 Huesos - ejemplo de historia interactiva creada en Inform 7
 
 Parte del tutorial de 'huesos':
  
  http://pacificaciones.blogspot.com.es/search/label/tutorialhuesos
  
 Creado en 2016 por Johan Paz con motivo de la competición:
  
  http://wiki.caad.es/M%C3%A1s_all%C3%A1_de_la_Comp
  
==============================================================]

Part 0 - Referencia bibliográfica

The story title is "Huesos". 
The story author is "Johan Paz". 
The story headline is "Una historia de fantasmas en la edad del bronce". 
The story genre is "Horror". 
The release number is 1. 
The story description is "Sin casi apoyo de tu comunidad, tú, una pobre anciana 
vas a lograr que los huesos de tus antepasados no sean profanados." 
The story creation year is 2016. 

Part 1 - Herramientas y apaños técnicos

Part 2 - Modelo del mundo

Chapter 1 - Mapeado

Section 1 - Túmulo

Tumulo is a dark room. The printed name of tumulo is "Interior del túmulo".
The description of tumulo is "Piedras enormes te rodean levantadas por tus 
antepasados para proteger a los restos de sus muertos. Montones de tinajas, 
algunas en hileras, la mayor parte desordenadas, contienen esos restos a tu alrededor.".

Chapter 2 - Objetos

Section 1 - Lámpara de aceite

A lampara (f) is a switched on device carried by the player. The lampara is lit.
The printed name of lampara is "lámpara".
The description of lampara is "Arcilla roja con pequeñas decoraciones en 
arcilla blanca que representan los signos sagrados de los dioses. Una lámpara 
muy adecuada para esta misión sagrada.".

Instead of switching on the lampara:
 say "Con dificultad enciendes la lámpara.";
 now the lampara is lit.
 
Instead of switching off the lampara:
 say "Soplas sobre la trémula llama de la lámpara, apagándola.";
 now the lampara is unlit.

Si compiláis este código veréis que el IDE ya os crea un índice que nos facilitará mucho la localización del código que nos interese cuando estemos depurando el comportamiento de la obra. Sé que parece un poco excesivo poner todas etiquetas pero es mucho más importante de lo que parece y en realidad es bastante sencillo hacerlo.

Ahora que tenemos la obra un poco más ordenada, sería necesario añadir 'niveles de examinado'. ¿Qué es un nivel de examinado? Llamo nivel de examinado a la existencia de mensajes de detalle -accesibles por el comando 'ex' o 'examinar'- de todas las 'cosas' que aparecen en los mensajes de los lugares por donde pasará el interlector y los objetos que lleva encima o se encuentren en estos lugares. Por ejemplo, en la descripción del único lugar de esta obra, el túmulo, se habla de 'piedras', 'antepasados', 'muertos', 'tinajas', 'hileras' y 'restos'. Disponer de una respuesta adecuado a los examinas de todos esos conceptos sería tener el primer nivel de examinado completo. Personalmente no me doy por satisfecho hasta que esté completo el tercer nivel de examinado, es decir, respuestas correctas para los conceptos mencionados en las respuestas de los conceptos mencionados en las respuestas de los conceptos mencionados por la descripción de inventario y de lugares. Pero es que yo soy un poco demasiado exigente, con que lleguéis al primer nivel ya estará bastante bien.

De la lista de concepto anterior no todas las cosas son lo mismo, por ejemplo, 'piedras', 'tinajas' e 'hileras' son cosas que 'realmente' estarán ahí, mientras que 'antepasados', 'muertos' y 'restos' no van a estar realmente, al menos no hasta que empecemos a abrir tinajas. Las respuestas no pueden ser lo mismo. El comando 'examinar' es mirar con los ojos, así que un 'ex piedras' debería dar detalle de las piedras tal y cómo sea que sean en la realidad del mundo de la obra, pero un 'ex muertos' debería decir que están dentro de las tinajas, poco más... excepto si las tinajas están abiertas. Cuidado con estos detalles variables que es lo que finalmente dará calidad a vuestra obra interactiva.

Trataremos con las tinajas (y sus hileras) más adelante, ya que van a ser los objetos más importantes de esta obra, pero, ¿cómo incluimos la descripción de las piedras del túmulo? Una primera aproximación es simplemente incluirlos como un objeto más en el túmulo, es decir:

Section 2 - Piedras

Some piedras (f) are in the tumulo. 
The description of piedras is "Enormes como caballos. Amarillentas como las colinas cercanas 
a la aldea, pero las historias dicen que fueron traídas de tierras sagradas lejanas, 
allá en el lejano sur de nuestros orígenes.".

Esto proporciona el objeto piedras, al que podemos referirnos más adelante y nos da la descripción que buscábamos, pero hace aparece el texto:

Interior del túmulo
Piedras enormes te rodean levantadas por tus antepasados para proteger a los restos de sus muertos. 
Montones de tinajas, algunas en hileras, la mayor parte desordenadas, 
contienen esos restos a tu alrededor.

Puedes ver unas piedras aquí.

Y ese 'puedes ver unas piedras aquí', no es precisamente lo que queremos. Además estas piedras 'grandes como caballos' resulta que pueden cogerse con el comando 'coger piedras'. No, esto no queda bien. Por suerte Inform 7 contempla esta clase de objetos de 'decoración' y los llama 'escenarios'. Si cambiamos el código por:

Section 2 - Piedras

Some piedras (f) are scenery in the tumulo. 
The description of piedras is "Enormes como caballos. Amarillentas como las colinas cercanas 
a la aldea, pero las historias dicen que fueron traídas de tierras sagradas lejanas, 
allá en el lejano sur de nuestros orígenes.".

Veréis que el comportamiento cambia totalmente y sólo por una palabra. Es una de las magias de Inform 7, es un sistema que tiene tanta historia tras de sí que ya contempla mucho de lo que podemos necesitar.

En el siguiente capítulo veremos como incluir el resto de las decoraciones y cómo simplificar un poco este código.

28.9.16

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

En la anterior entrega ya completamos la versión de nuestra historia 'Huesos' en forma de una hiperficción realizada con Squiffy. Hasta ahora hemos transformado un texto lineal en una historia que se puede explorar a través de varios caminos, lo que es la base de una narración interactiva. Pero un relato interactivo basado en comandos -nuestras viejas conocidas las aventuras conversacionles- son algo bastante diferente, es una historia que surge de forma emergente de un 'modelo de mundo'. Un relato interactivo por lo tanto tiene necesariamente una coherencia interna que una hiperficción -o un librojuego- no tiene porqué tener, necesita esa coherencia porque el interlector en este caso no sólo controla el discurrir de la historia sino que puede interactuar con el 'mundo' en el que está con una plétora de comandos -acciones- diferentes que deben contestar adecuadamente. Y si estas respuestas no son coherentes, perderemos la credibilidad.

En algunos aspectos hacer un relato interactivo basado en comandos es mucho más difícil que hacer una hiperficción o que un librojuego, porque el autor aquí pierde aún más control de su obra y hay que hacer un enorme trabajo de programación para incluir todos esos comandos posibles así como las respuestas adecuadas... o había que hacerlo, en el pasado. Por suerte las herramientas actuales para crear aventuras conversacionales están muy evolucionadas y con muy poco código es posible obtener modelos del mundo coherentes y complejos. En el resto de este tutorial vamos a usar una de estas herramientas avanzadas: Inform 7.

Esta herramienta contiene en su interior un ingente universo de capacidades que no tenéis porqué conocer en un principio -que se pueda usar muy por debajo de sus capacidades es también parte de su magia- pero que os servirá para tener modelos de mundo muy avanzados en el futuro. Hay un tutorial de Inform 7 que merece la pena hacer antes de programar ninguna aventura y os animo a hacerlo, ya que este tutorial no va -como ya habéis visto- tanto de la parte técnica de las herramientas, como de la parte de escritura.

¿Cómo es el código más básico que podemos crear con Inform 7? Pues tan simple como el que podéis ver aquí abajo:

"Huesos" by Johan Paz (in spanish)

Interior del túmulo is a room.

En dicho código tan sólo hemos puesto el nombre de la obra y del autor, hemos indicado que es en español y hemos creado la primera -y en este caso única- habitación en la que se desarrollará la historia. Nada más empezar ya tenemos entre manos algo totalmente diferente, ya estamos creando un mundo en el que nuestro interlector va a 'estar'.

Pongamos algo más de detalles a este mundo. El túmulo debería estar a oscuras, y deberíamos iluminarnos con una lámpara de aceite. Esto se logra en Inform 7 de la siguiente forma:


"Huesos" by Johan Paz (in spanish)

Interior del túmulo is a dark room.

A lámpara (f) is a switched on device carried by the player. The lámpara is lit.

Instead of switching on the lámpara:
 say "Con dificultad enciendes la lámpara.";
 now the lámpara is lit.
 
Instead of switching off the lámpara:
 say "Soplas sobre la trémula llama de la lámpara, apagándola.";
 now the lámpara is unlit.

Hemos indicado que el interior del túmulo está oscuro, pero que tenemos un artefacto que se puede encender y apagar que empieza como encendido -la (f) le indica al sistema que es femenino. Además hemos incluido nuestras primeras dos reglas para encender y apagar la lámpara. Si copiáis el código anterior en el IDE de I7 y lo corréis veréis cómo el sistema de creación se encarga de proporcionaros toda la coherencia que necesitáis. Probad a dejar la lámpara mientras estáis en la oscuridad. Intentad encenderla o simplemente cogerla después de haberla dejado en la oscuridad. Ahí tenéis todo un nuevo conjunto de puzles, de dificultades coherentes que surgen por si mismas cuando trabajamos con un modelo de mundo en lugar de sólo con enlaces y párrafos de texto.

Pero Inform 7 no es perfecto. Por ejemplo la adaptación al español, aún es un poco regular, y si usáis 'lámpara' con acento como en el ejemplo el juego no aceptará 'lampara' sin acento -sí es una falta de ortografía pero si lo incluis podrán jugar con más facilidad chavales que escriben sin acentos sus Whatsapps. Para lograr esto tenemos que dar un poco de vuelta y escribir el siguiente código.

"Huesos" by Johan Paz (in spanish)

Tumulo is a dark room. The printed name of tumulo is "Interior del túmulo".

A lampara (f) is a switched on device carried by the player. The lampara is lit.
The printed name of lampara is "lámpara".

Instead of switching on the lampara:
 say "Con dificultad enciendes la lámpara.";
 now the lampara is lit.
 
Instead of switching off the lampara:
 say "Soplas sobre la trémula llama de la lámpara, apagándola.";
 now the lampara is unlit.

En el que hemos separado la declaración de los objetos y lugares del nombre que deben mostrar cuando se ejecute la obra. Es una buena práctica hacer eso para los juegos en español y aunque es incómodo es algo que recomiendo tal y como está de momento la versión para español de Inform 7.

Nos faltaría ahora añadir descripción tanto para el lugar como para la lámpara, y es fácil, no muy diferente de lo de indicar el nombre.

Tumulo is a dark room. The printed name of tumulo is "Interior del túmulo".
The description of tumulo is "Piedras enormes te rodean. Levantadas por tus antepasados para proteger a los 
restos de sus muertos. Montones de tinajas, algunas en hileras, la mayor parte desordenadas, 
contienen esos restos a tu alrededor.".

A lampara (f) is a switched on device carried by the player. The lampara is lit.
The printed name of lampara is "lámpara".
The description of lampara is "Arcilla roja con pequeñas decoraciones en arcilla blanca que representan los 
signos sagrados de los dioses. Una lámpara muy adecuada para esta misión sagrada.".

Corred la obra y observad las diferencias. Bien, tenemos un inicio de mundo creíble, pero ya empezamos a ver que vamos a necesitar bastantes más textos para la misma obra. Toda cosa que pongamos debe poderse examinar y hay que incluir el texto correspondiente.

Pero vayamos poco a poco.

8.9.16

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

Los relatos escritos deben poseer un buen 'ritmo'. El ritmo es la 'sensación' que se tiene al leerlo. Esta sensación puede ser más o menos rápida, agresiva o por lo contrario pausado o aún soporífero. Es importante que el ritmo del relato sea el adecuado para aquello que cuenta. Al imprimir el ritmo adecuado el lector se 'contagiará' de las sensaciones de los protagonistas de forma más intensa y por lo tanto disfrutará mucho más de la experiencia lectora.

El ritmo es uno de los elementos más complejos de conseguir en un relato, ya que no hay reglas demasiado fijas sobre cómo conseguirlo, aunque hay elementos que se pueden usar para lograrlo, como los tiempos verbales, la longitud de las frases, etc... pero que el ritmo sea realmente adecuado es una suerte de 'baile' entre la morfología del texto, el léxico y la semántica. Un hermoso y salvaje baile.

¿Se conserva el ritmo en los relatos interactivos? En realidad sí, pero es mucho más difícil de 'controlar'. Si quieres transmitir una sensación de urgencia, por mucho que escribas con frases cortas o ultra cortas, si el interlector no pulsa de forma frenética los enlaces el 'ritmo' de urgencia no se mantendrá. En la ficción interactiva el interlector es siempre el que controla el discurrir y por lo tanto puede afectar muchísimo al ritmo.

Si quieres que más o menos se mantenga el ritmo que tienes pensado para cada parte del relato puedes jugar con algunos trucos. Un hecho interesante es que muchos interlectores son 'impacientes', al menos en la primera lectura. Muchos se precipitan a 'clickar' los enlaces que parecen lógicos para avanzar en la acción. Si quieres meter a tu interlector en un frenesí de urgencia, crea textos de escena cortos, déjale muy claro cuáles de los enlaces son de acción, y ponle bien visible aquellos que te conviene que crean que son la solución, y, encima, borra el texto cuando pulse en el enlace. De esta forma el interlector impaciente -que son muchos- se verá en una secuencia de textos cortos enlazados por acciones y se volverá más y más frenético, hasta llegar a la angustia que la sensación de urgencia que querías expresar requiere. Si requieres transmitir una sensación de meditación, algo lento y muy pausado, haz lo contrario. Textos algo más largos -nunca demasiado largos, porque los interlectores impacientes simplemente se lo saltarán- y en los primeros párrafos no incluyas ni una sola acción, por sólo enlaces a pasajes de exploración y varios niveles.

Estas diferencias tienen al menos una ventaja. En un relato tradicional simplemente no puedes pasarte con la cantidad de información y de texto. Eso destruye el ritmo y aburre al lector, sin embargo en el caso de la ficción interactiva puedes dejar información adicional en niveles de descripción que el interlector simplemente puede ignorar para ir a lo concreto, a la acción. Para ilustrar este hecho he creado esta versión de Huesos que avanza un poco más en el relato, pero sobre todo que mete bastante más información que no estaba en el relato original, pero que al estar conectado de forma periférica simplemente no rompe el ritmo de lectura, ya que es el propio usuario el que ha solicitado ampliar la información.

Bien, esto va cogiendo forma, pero aún no hemos atacado la parte más complicado del relato original. Los dos siguientes párrafos del relato son básicamente un elipsis encubierta. El autor nos engaña -sí soy malvado- y parece hacernos ver cómo la anciana va abriendo tinajas, remueve los restos dentro de ellas y rescata lo que puede en los dos primeros sacos. Incluso se permite sacar a la anciana del túmulo en un fragmento de texto que probablemente es bastante redundante, no muy bien conseguido, y todo es para trasmitirnos la sensación de tiempo, de acción repetitiva sin que haya en realidad ninguna acción repetitiva en absoluto en el texto. Al tiempo que nos produce un poco de sopor, de normalidad, de rutina, que puede así contrastar más adelante con la tensión y la extrañeza de encontrar el cadáver del sacerdote.

Transcribir tal cual esta elipsis simplemente no funcionaría aunque es tentador. Necesitamos provocar al interlector el mismo tipo de sensación de normalidad, de rutina, que crea el relato. Una forma de generar esa sensación en un interlector es llevarlo a pensar que está 'resolviendo un juego'. Si lo situamos ante lo que parece un puzle a resolver, estamos jugando con las convenciones de lo interactivo y el interlector se olvidará del contexto pasando a 'modo de resolución', que es equivalente a lo 'rutinario' en un lector normal. Así que tenemos que intentar presentar el vaciado de las tinajas como un 'juego' de alguna clase, algo a resolver.

Para lograr esto vamos a tener que hacer un poquillo de código, algo que permita 'repetir' la acción de 'abrir tinaja' y que, sin embargo, de un resultado diferente y preferiblemente uno que varíe de una lectura a otra, de forma que si el interlector relea la obra le de algo más de sensación de realismo. Evidentemente esto se puede lograr con un cuidado diseño de enlaces fijos, pero mejor veamos un poco de cómo se codifica en Squiffy.

En la documentación de Squiffy podéis ver varias secciones que hablan de cómo se puede incluir código en Squiffy. La forma más habitual de hacerlo con esta herramienta es añadiendo javascript a la estructura de nuestro relato interactivo, como se explica aquí, jugando con atributos, como se explica aquí y/o haciendo 'saltos' programados de unas secciones a otras como se explica aquí.

Una estructura simple que podemosa usar es tener una sección que contenga una llamada a función de javascript que haga un salto a una sección u otra de forma condicional, esto se hace de esta forma:

@start Inicio

[[]]:
@clear

[[Inicio]]:
@set count = 0
Estamos en una panadería repleta de hogazas de pan. Cojo una hogaza de [[pan]].

[[pan]]:
    var count = squiffy.get("count")
    var next = "pan" + count
    squiffy.set("count", count + 1)
    squiffy.story.go(next)
    
[[pan0]]:
Es una hogaza de pan negro fragante y ácida. ¡Quiero [[más]](pan)!

[[pan1]]:
Es una hogaza de pan blanco deliciosamente tierno. ¡Quiero [[más]](pan)!

[[pan2]]:
Es una hogaza de pan de semillas. Llena demasiado. ¡Ya basta de pan!

En este caso estamos usando un contador de squiffy que se incrementa cada vez que se pulsa en 'pan' y se salta a una sección numerada. Lo que se consigue con esto es separar el texto de cada clase de pan de la lógica que llega a la siguiente. De hecho el código de antes da un resultado bastante obvio, siempre el mismo y que no merece la pena hacerlo con código. La gracia es que podemos cambiar ese comportamiento cambiando sólo la lógica escrita en pan para dejar por ejemplo un avance aleatorio, como este:

@start Inicio

[[]]:
@clear

[[Inicio]]:
@set count = 0
Estamos en una panadería repleta de hogazas de pan. Cojo una hogaza de [[pan]].

[[pan]]:
    var count = squiffy.get("count")
    var next = "pan" + Math.floor(Math.random() * 3);
    squiffy.set("count", count + 1)
    squiffy.story.go(next)
    
[[pan0]]:
Es una hogaza de pan negro fragante y ácida. {if count< 3:¡Quiero [[más]](pan)!}{else:¡Ya basta de pan!}

[[pan1]]:
Es una hogaza de pan blanco deliciosamente tierno. {if count< 3:¡Quiero [[más]](pan)!}{else:¡Ya basta de pan!}

[[pan2]]:
Es una hogaza de pan de semillas, crujiente y deliciosa. {if count< 3:¡Quiero [[más]](pan)!}{else:¡Ya basta de pan!}

Este ejemplo ya se acerca bastante a lo que queremos, una secuencia más o menos aleatoria de secciones que representen el buscar entre las tinajas y que nos lleve a un determinado final. Pero en nuestro caso no vamos a querer que una misma tinaja se repita, para ellos sustituiremos la lógica central del ejemplo por esta otra:

[[huesos belaiska]]:
@set count = 0
@set tinajas = 012345x
Dejó la lámpara sobre la tinaja de al lado y, con cuidado, pero con toda la prisa que podía darse, los 
introdujo en el primer saco. Hueso a hueso. Bien colocados casi no ocuparon nada. Aun así allí había 
muchos cuerpos que recoger. Todos los muertos desde la fundación de la ciudad. Muchas más [[tinajas]](abrir tinaja) 
que abrir y revisar.

[[abrir tinaja]]:
    var count = squiffy.get("count")
    var cadena = squiffy.get("tinajas")
    if ( cadena == "------x" ) {
        next = "tinajax" 
    } else {
        var rango = 6
        if ( count > 2 ) { rango = 7 }
        var seleccionado = "-"
        while ( seleccionado == "-" ) {
            var index = Math.floor(Math.random() * rango)
            seleccionado = cadena[index]
        }
        var next = "tinaja" + cadena[index];
        cadena = cadena.substring(0, index) + "-" + cadena.substring(index + 1)
        squiffy.set("tinajas", cadena)
    }
    squiffy.set("count", count + 1)
    squiffy.story.go(next)

En la que usamos una variable de squiffy -tinajas- como una cadena en la que vamos marcando las que ya hemos abierto hasta que llegamos a la del sacerdote por suerte o porque no queda ninguna otra. Además hemos añadido una condición para que al menos abra tres tinajas antes de que aparezca como alternativa la del sacerdote. Por fin tenemos un texto variable, que da la sensación de mostrarnos el trabajo de rescatar los restos y al tiempo no es excesivamente larga como para aburrir.

Aquí podéis ver el resultado final.