26.7.18

Tutorial de juegos 'rpg' para Inform 7 - Acero (5) - Acciones

Hasta ahora tenemos una forma 'crear' personajes, obtener sus características, niveles de grupo de habilidad y porcentaje de habilidades, así como hemos creado lo necesario para poder hacer las tiradas; pero nos falta relacionar lo que 'ocurre' en la narración con las tiradas y sus resultados.

Desde luego podríamos usar las funciones que hemos creado hasta ahora para incluir verificaciones en cada una de las tiradas necesarias en todos 'Instead of' de la obra, de una manera similar a cómo informábamos del lanzamiento de flechas por parte de nuestro lagarto. Pero entonces tendríamos un código bastante feo y nada propio de Inform 7. ¿Cómo podemos hacerlo más natural?

Lo primero sería relacionar las acciones con la tirada que les corresponde, podríamos pensar en tablas para hacer esto, pero las 'acciones' en las tablas de Inform 7 están limitadas a definiciones de acciones concretas y nosotros necesitaríamos una relación con acciones genéricas, tal abiertas como sea necesarias. De forma que vamos a organizarlo mediante unas reglas nuevas 'validate roll', y así de paso aprendemos cómo usar libros de reglas nuevas. Nuestro objetivo será lograr algo como esto:

The last roll result is a skill roll result that varies.

Before doing anything:
  now last roll result is the skill roll result produced by the validate roll rules.
 
Before a character (called the actor) doing anything:
  now last roll result is the skill roll result produced by the validate roll rules.

Podemos usar una variable global porque Inform 7 sólo va a verificar una acción cada vez y 'doing anything' va a cubrir todas las acciones. Se puede ver que Inform 7 tiene acciones para el jugador y para los PNJs, así que tenemos que cubrir las dos. Las reglas de 'validate roll' se declaran de esta forma:

Validate roll rules is a rulebook producing a skill roll result.

Es decir, son reglas que actuarán sobre una acción y generan un resultado de tirada. Los valores por defecto serían:

Validate roll doing anything:
 rule succeeds with result success.
 
Validate roll a character (called actor) doing anything:
 rule succeeds with result success.

Es decir, si no definimos una verificación concreta a hacer cualquier acción tiene un éxito como resultado. Una verificación básica podría ser:

Validate roll jumping:
 rule succeeds with result the normal roll jump for the player. 
 
Validate roll a character (called actor) jumping:
 rule succeeds with result the normal roll jump for the actor. 

Y ya aquí nos encontramos con una dificultad, si corremos el juego e intentamos '>> salta'  os dará un error. Se debe a que el jugador ahora mismo no es un character y por lo tanto no tiene porcentajes en sus tiradas.

No es posible simplemente decir que el jugador es un personaje de tal o cual tipo porque el jugador y nace como un person y no se puede redefinir sobre la marcha. Para dar cualidades especiales al jugador en Inform 7 hay que crear un objeto de personaje nuevo y cambiar tras el inicio del juego el objeto del jugador por el que hemos creado para él, por ejemplo con:

The selected player is wolferm human in the explanada.

When play begins:
 let old player be the player;
 now the player is the selected player;
 remove old player from play.

Fijaos que lo he llamado 'jugador seleccionado', porque en realidad en el juego habrá que crear alguna clase de introducción que nos permita seleccionar o crear dicho personaje. Con esto ya funcionará el verbo salta para el jugador, claro que si queréis que se use la tirada del salto tendréis que crear reglas específicas sobre lo que pasa con el jugador cuando da un saltito. Eso os lo voy a dejar como ejercicio. Hagamos ahora que el lagarto dispare de 'verdad'. Lo primero es que en S3 cada arma tiene una dificultad de disparo diferente, así que tendremos que adelantar un poco del futuro capítulo de armas para poder definir la categoría de arco que el lagarto va a usar:

Chapter - Weapons

A weapon is a kind of thing.
A projectile weapon is a kind of weapon.
A bow is a kind of projectile weapon.
A long bow is a kind of bow.
A short bow is a kind of bow.
A composite bow is a kind of bow.

Y ahora ya le podemos dar al lagarto un arma haciendo esto:

El arco blanco is a long bow.
Sherack is carrying arco blanco.

Y ya podemos hacer una versión simplificada de las reglas de 'disparar', para el caso de 'arco largo' de esta forma:

 
Validate roll shooting a long bow:
 rule succeeds with result the difficult roll use bow for the player. 
 
Validate roll a character (called actor) shooting a long bow:
 rule succeeds with result the difficult roll use bow for the actor. 

Dado que disparar con el arco largo  en S3 es una acción dificil. Si añadimos un poco de maquillaje para verificar el resultado de la acción con:

Chapter - Definition for simplified the when for Insteads

To decide if success:
 if the last roll result is success:
  decide yes;
 decide no.
 
To decide if success completely:
 if  the last roll result is special success:
  decide yes;
 decide no.
 
To decide if failed:
 if  the last roll result is failure:
  decide yes;
 decide no.
 
To decide if failed completely:
 if  the last roll result is disaster:
  decide yes;
 decide no.

Ahora ya podemos escribir:

To say Sherack disparando:
 say "Sherack dispara contra la diana".

Instead of Sherack shooting when failed completely:
 say "[Sherack disparando], pero tan sólo consigue golpearse con la cuerda del arco en la mejilla.".
 
Instead of Sherack shooting when failed:
 say "[Sherack disparando], pero la flecha pasa por encima del muñeco.".
 
Instead of Sherack shooting when success:
 say "[Sherack disparando] y acierta en el muñeco de entrenamiento.".
 
Instead of Sherack shooting when success completely:
 say "[Sherack disparando] y acierta justo en entre los ojos del muñeco de entrenamiento.".

Véase como se pueden escribir frases de 'To say' para no repetir texto. Y ahora ya sólo tenemos que decirle al lagarto que dispare cada turno:

Every turn:
 try Sherack shooting arco blanco.

Pues ya tenemos una forma de añadir las tiradas necesarias para cada acción que ya podemos usar en nuestra historia. En la próxima entrega hablaremos de armas y, tal vez, armaduras.

El estado de 'acero' es este y el de la librería este.

24.7.18

Relatos del cuarto de hora - Edición Twitter 2018. Ventrículos cerebrales asimétricos.

16:10

"Ventrículos cerebrales asimétricos."

No podía sacarme la frase de la cabeza. ¿Qué diablos significaba eso exactamente? Hasta que me lo dijo especialista sólo sabía de los ventrículos del corazón. ¿Es que el cerebro bombeaba algo? ¿Pensamientos? ¿Amor? ¿Deseo? ¿Envidia? Desde luego en aquel momento el mío no paraba de bombear ansiedad; aunque según lo que me acaba de diagnosticar el doctor, seguro que lo hacía asimétricamente. 

Tal vez por eso siempre había sido un raro. Mi cerebro no latía correctamente, y las ideas andaban por ahí entrechocando un poco al azar, de forma incorrecta. Seguro que las personas de bien que siempre me miraban raro en la calle, o en las fiestas, tenía los ventrículos cerebrales perfectamente simétricos y equilibrados. A ellos no les pasaría lo de tener siempre la sensación de no estar en el mundo adecuado, de no encajar, ni saber realmente qué es lo que quieren. No, seguro que la mente de la gente con el cerebro bien compartimentado tiene una circulación de ideas correcta. Por eso no tenían problema para ir al trabajo cada mañana, por eso sonreían a su jefe y hablaban de fútbol con toda normalidad. Claro, así les resultaba fácil, con sus hermosos ventrículos cerebrales perfectamente simétricos. ¡Quien los tuviera!

Todo eso cruzó mi asimétrica cabeza, el tiempo que tardó el médico en verificar el resultado. Lamentablemente la máquina estaba mal calibrada, mis ventrículos eran normales y simplemente yo era el capullo de siempre.

16:23

18.7.18

Midiendo la agencia

Debido a la cercana jam de narraciones interactivas religiosas-mitológicas, se ha estado hablando de la 'agencia' de los relatos interactivos. De su importancia o falta de importancia —en realidad la 'agencia' en casi todas las obras interactivas que ha creado el mundillo en décadas es muy baja—, y de cuánta 'agencia' tienen las obras que son interesantes. ¿Y qué es eso de la 'agencia'?

La definición filosófica como puedes leer en la wikipedia es: "[...] la capacidad que posee un agente (una persona u otra identidad) para actuar en un mundo [...]". Podéis ver que en realidad es un concepto muy abstracto y que para los que no creemos en el 'libre albedrío', pues casi que es cháchara, pero en el contexto de las creaciones interactivas tiene un significado muy concreto: la agencia es la capacidad que tiene el 'interlector' de seleccionar el devenir de la historia. Si estamos hablando una ficción interactiva es evidente que el 'interlector' va a hacer elecciones y que el detalle del discurrir de la historia será diferente en 'extensión', pero si resulta que la historia tiene una estructura como esta:



¿Realmente ha habido alguna capacidad de "actuar sobre el mundo"? Más bien no, de hecho podemos decir que con ese esquema de historia la 'agencia' es de 1: sólo hay un destino final posible hagas lo que hagas. No tienes elección real, no tienes capacidad para modificar el mundo.

Hay un montón de artículos que intentan clasificar 'topologías' de historias, analizando la 'forma' de estos árboles de branching. Por ejemplo este es un artículo interesante sobre el asunto. Y más allá, hay mucha gente intentando escapar de diversas formas de estos modelos de bifurcación y buscando alternativas que dependen del estado del mundo, o de bifurcaciones 'retrasadas', etc... pero este artículo no va a ir de nada de eso.

Este artículo va de algo más 'numérico', ¿podemos medir la agencia? y... ¿podemos evaluar la utilidad de desarrollar una determinada rama o es preferible podarla? Para ello usaremos siempre el mismo ejemplo, que debemos detallar primero. Imaginemos una historia muy corta que tiene esta árbol de escenas:


En esta historia empezamos con la escena I (de inicial) que nos permite escoger entre A y B. A nos permite escoger entre los finales C y D, mientras que la B siempre nos lleva al final E. ¿Cuál es la agencia de esta historia? Una respuesta simple sería 3. Hay tres finales posibles, ¿no? Así que el interlector puede escoger entre 3 destinos diferentes según escoja a lo largo de la historia. Pero eso es una respuesta en realidad demasiado simplificada. Imaginemos que nuestra historia tiene 'tirón' y podemos hacer estadísticas y nos encontramos con que cada final tiene una probabilidad muy diferente, por ejemplo esta:


Seguir diciendo que la agencia de la historia es 3, sería bastante ingenuo ya que la mayor parte de los interlectores 'ven' el mismo destino podríamos inclinarnos por pensar que la agencia es más bien 1; pero eso tampoco es muy 'correcto'. ¿Podemos dar un número más objetivo al número de 'destinos aparentes' de la historia y por lo tanto más cercano a la 'realidad' de su agencia?

Sí, podemos.  Podemos recurrir a la teoría de la información de Shannon, que nos indica que el número de bits mínimo que necesitamos para codificar un símbolo de un sistema de comunicación (¿y no es una historia interactiva un sistema  de comunicación con mensajes potenciales diferentes?) tiene como valor:


Li=log2(1/Pi) = -log2(Pi)

Y que por lo tanto el total de bits que proporcionan todos los símbolos posibles del sistema de comunicación (en nuestro caso los finales) es la suma ponderada de esos bits, o sea:


{\displaystyle H=\sum _{i=0}^{n}-P_{i}\log _{2}P_{i}}

Que no es otra cosa más que la 'entropía' del sistema de comunicación, y en nuestro caso la entropía de nuestra historia. Dado que esa métrica está en número de bits necesarios para saber cuánto es la 'agencia' en 'destinos diferenciables' nos basta con elevar dos a ese número. Daos cuenta que en el caso de que las probabilidades de elección de los diversos finales estuviese perfectamente equilibrada el valor de agencia obtenido coincidiría exactamente con el número de finales posibles.

¿Cuánto valdría la agencia en el caso del ejemplo? Pues:


H = - 0.05 * log2(0.05) - 0.8 * log2(0.8) - 0.15 * log2(0.15)
H =  0.216 + 0.257 + 0.410
H = 0,883

Agencia = 2^H = 1,84

Es decir, en realidad hemos escrito una historia que se percibe como de 'agencia' algo inferior a 2. En esta historia, como es muy simple, sólo con la estadística de los finales escogidos podemos reconstruir cuál a sido la preferencia de elección del interlector en cada nodo.


Con todos los porcentajes de elección a la vista resulta evidente que la elección A --> C no es nada deseada por nuestros interlectores, ¿ha merecido la pena gastar el tiempo en hacerla? Veamos la agencia percibida sin la existencia de C.

% de D sería 85% y el de E 15%
H = -0.85 * log2(0.85) -0.15 * log2(0.15)
H = 0.199 + 0.410
H =0.609 

Agencia = 2 ^ H = 1,5

La diferencia entre poner y no poner C es de 0.3 finales, mientras que el coste se ha incrementado... ¿en cuanto? Suponiendo que cada nodo cuesta lo mismo habríamos incrementado el coste de la historia en un 1/6 para incrementar su valor de agencia en un 0.3/1.84, o sea un 17% de incremento de coste para un 16% de incremento de valor. Aún es un ratio razonable, pero ya bajo (Daos cuenta que si todos los finales fuesen equivalente estaríamos pasando de agencia 2 a 3 y de coste 5 a 6, es decir un 17% de incremento del coste para un incremento de un 33% del valor percibido).

¡Parece que hemos obtenido una herramienta para calcular si merece la pena o no crear un serie de ramas en una ficción interactiva! 

¿O no?

Alguno estará pensando que he usado las estadísticas finales, es decir, lo que de verdad piensan los usuarios sobre nuestra historia y que cuando la estemos creando no hay forma de saber eso. Bueno... el total es difícil, pero podemos hacer una buena estimación, ya que no es tan difícil hacerse una idea de qué podría escoger un interlector enfrentado a cada elección dada. Hagamos el ejercicio hipotético...

La historia empieza en I y el interlector tiene que escoger entre A y B. Pensándolo un poco vemos que es bastante más probable que escoja A, usando los porcentaje podemos usar por ejemplo que el 80% escogerá A y el 20% escogerá B. En B ya no hay más elecciones, pero A hay que escoger entre C y D, y D parece mucho más probable que C. Siendo generosos (ya que creemos en nuestra historia) asignamos un 10% a C. Para calcular los porcentajes de cada final basta con ir multiplicando hacia el origen y sumando cuando se junten ramas, y nos quedan estos valores:




Los porcentajes no son los mismos, pero se parecen y nos dan una buena idea de que los finales están bastante desequilibrado!! De hecho la agencia que nos sale es de:


H = - 0.08 * log2(0.08) - 0.72 * log2(0.72) - 0.20 * log2(0.20)
H =  0.292 + 0.342 + 0.466
H = 1,1


Agencia = 2^H = 2,1

Como veis, incluso con nuestra estimación demasiado generosas con la elección B y la elección C, parece claro que algunas de los finales y ramas están sobrando, y viendo los porcentajes que salen queda claro qué rama/elección es la que sobra.

Este cálculo lo podríais refinar más si en cada punto de decisión tenéis en cuenta cuántos nodos/trabajo hay bajo la decisión que os parece improbable, y recordad que si añadís una rama de 'baja popularidad', excepto que se una mucho más adelante con una de mucha popularidad la probabilidad de los finales que vaya a generar no hará más que bajar y bajar a medida que avance la historia.

Una última anotación: la forma de la función H(p) = -p * log2(p) es la de la gráfica de abajo...




Podéis ver que el máximo de esta función está entre el 0.3 y el 0.4, así que cuando vayáis a bifucar vuestra historia deberías pensaros bien si merece la pena incluir alguna opción que tenga menos del 30% de probabilidad de ser escogida por parte de los interlectores.

Espero que este articulillo lleno de logaritmos os haya resultado ilustrativo y os sea de utilidad a la hora de decidir cuántas y qué elecciones ponéis en vuestras historias.

Nota final sobre el valor de los finales: todo lo que hemos argumentado aquí puede verse significativamente modificado si algunos de los finales aunque sean muy improbables son muy impactantes. Puedes ajustar los cálculos del valor de las ramas añadiéndoles un valor del impacto de tal final improbable, pero ¡cuidado!, piénsate muy bien si quieres realmente gastar tu tiempo en crear un final muy muy chulo pero que muy poca gente vaya a ver, ya que eso, más que parte integrante de la obra, será un 'huevo de pascua'.



17.7.18

Participación en Visiones 2018

Os dejo con mi participación para el 'visiones' de este año.

Los amantes de Annanyariel

En la realidad las historias no tienen un principio. Tampoco tienen un final. Los principios y los finales son una invención de los cronistas, los escritores o los dramaturgos. Las historias reales se entremezclan unas con otras, amalgamándose los inicios de unas con los finales de otras, sin sentido, sin relación causal. Las historias reales son dramas, pasiones y parodias hechas de retales deshilachados cuyos protagonistas, carentes de guion, van improvisando sobre la marcha. Así que podríamos escoger decir que la historia de Annanyariel empezó una noche mientras acariciaba el miembro, aún erecto, de su último y olvidable amante dúnitor. 

En aquella época el hechicero visitaba demasiado las tabernas del puerto en busca de amantes que ni le conocieran ni le quisiesen conocer. Marineros por lo general. El hechicero sabía que los tripulantes, en especial los de barcos mercantes, no pasan mucho tiempo en el mar —aunque parezca paradójico —, lo pasan dentro de esas miserables casas estrechas, chirriantes y carentes de toda intimidad llamadas barcos. Tal vez se pueda amar al mar, que es a la par terrible y hermoso, pero basta con pasar unas semanas en uno de esos cascarones de madera para entender que es mucho más difícil amar a los barcos. Annanyariel había aprendido que los marinos mercantes tras llegar a cualquier puerto tan sólo querían alejarse lo más rápido posible de sus vidas, alejarse del barco, de sus compañeros, de todo lo que eran y que no hay mejor forma que una ducha rápida de sexo con un desconocido, con alguien al que nunca más iban a ver. Lo mismo que él quería por entonces. 

La vida académica lo aburría hasta la saciedad. Jugaba al juego, se aplicaba a fondo en el intercambio de halagos y de críticas mordaces, de favores y traiciones que hacían caer a unos y ascender a otros en el escalafón de la Universidad de Artes Arcanas. Era bueno en ello, su carrera hacia los puestos más altos y más secretos de la institución era, sin duda, imparable; pero se aburría y se daba asco a sí mismo. La verdad es que no aportaba nada. ¿Su investigación? No era más que una excusa para poder asistir a los banquetes, recibir dinero de los reyes incautos que financiaban todo aquello, y dar charlas que le pagaban con generosidad. Era bueno dando charlas. Elegante, divertido, brillante, capaz de entretener a un centenar de magos de pacotilla mientras llenaba una docena de pizarras con runas, esquemas y fórmulas que, aún incompresibles para la mayoría, no eran más que triviales variantes de los descubrimientos de los sabios del pasado. Engañaba a todos, pero no a sí mismo. Se sabía un fraude, sabía que su estudio de las correlaciones y las armonías en los hechizos sobre los diversos elementos era un callejón sin salida. Llevaba más de diez años explotando ese filón, aprovechándose de él sin generar nada auténtico. Tal vez acabasen levantando una estatua en su honor en la calle de los Reverenciados, pero sería una estatua hueca, repleta de aire y humo.

Así que Annanyariel escapaba a su otra pasión, la del sexo con todos. No es que desconociese el amor de verdad, no. Se había enamorado una vez, de otra yalna, al principio de su estancia en la ciudad, cuando apenas era un mago, cuando no era más que un aprendiz aventajado de escriba. Ella era casi tan alta como él, con el pelo ondulado de un intenso color verde oscuro, la piel amarillenta, casi dorada, hermosas orejas puntiagudas, largas piernas y unos pechos pequeños pero perfectos, que le hacían recordar los de las estatuas de desnudos que veía en los jardines de los ricos de su ciudad natal. Estaba realmente loco por ella y, con el tiempo, había llegado a comprender que era por su determinación y por su fe. Ella transmitía la seguridad que le confería saberse heredera de los ayolanis originales, de los primeros poseedores del don de la magia; y él, que no era nada, ni provenía de nada, orbitaba a su alrededor, riéndose de sus tontos rituales, de su incansable repetición del nombre de su dios, de cómo vestía y comía sólo lo adecuado, lo que Ayol’Ani, el supuesto dios de la magia, había vestido o comido cuando vino al mundo a traernos su don. Él mostraba desdén en público por todo lo que ella era, pero la adoraba en privado, amándola en cuerpo y en alma. Hacía de su lecho de amante un altar a ella, pues su claridad de pensamiento, su absoluta certeza, el saberse algo importante, algo fundamental, en realidad le aportaba lo que nunca había tenido: sensación de pertenencia a algo mayor que él.

¿Qué era él, sino un desecho de la calle demasiado listo —o demasiado tonto —  para quedarse en el barro? ¿Qué era sino un insecto afortunado y sin escrúpulos que había tenido la suerte de dar con un hombre — uno de los muchos que le pagaban por sexo — que había visto su inteligencia y lo había tomado a su cargo? Annanyariel se creía basura, y el hecho de que ella le hablase, le llevase a su cama y le dejase adorarla en privado, le hacía amarla, pero también odiarla. Él era un desastre por dentro,  sin embargo, no fue su falta de seguridad, su fractura interna, lo que hizo que ella se alejase, no, lo hizo que él siempre acababa usando el sexo para aliviarse el agujero que sentía en su alma. Ella le soportó desdenes públicos, burlas a su fe, que la hiciese quedar en ridículo en los debates de la Universidad; pero la primera vez que le encontró siéndole infiel con un estudiante de brebajes, un humano, moreno, de pecho peludo y rizado, le prohibió regresar a su lecho, a su vida y le pidió que nunca le volviese a hablar.

La noche en la que podríamos decir que esta historia empezó Annanyariel se sentía particularmente asqueado de sí mismo, pero, al tiempo, su escape sexual le había resultado muy satisfactorio. El marinero dúnitor había cumplido con su papel de amante fuerte e incansable y el hechicero, ya de mediana edad, disfrutaba de contemplar el sorprendente milagro de una erección que no parecía declinar. Fue en ese momento que, apartando el ensortijado vello púbico del enano, descubrió un enrevesado tatuaje en la base del miembro, uno que no era un tatuaje de marinero; ya que, de alguna forma, se trataba de un encantamiento. El trazado de las líneas no dejaba lugar a dudas. Sorprendido interrogó al marinero sobre el origen de aquellos dibujos, y éste, de manera ruda y con el peor de los acentos, le explico que era para ser «fuerte como un toro», y que se lo habían realizado en tierras lejanas, al otro lado del mundo, en una caverna oscura donde una bruja restauraba virginidades, remediaba calvicies y, al parecer, ofrecía erecciones inacabables. Se le ocurrió preguntar si realmente funcionaba, y el marinero, tras reírse a carcajadas, le demostró que claro que funcionaba, se lo demostró hasta más allá del mediodía.

En aquella época nadie practicaba esta clase de encantamiento, nadie tejía magia con cuerpos vivos. Era un tipo de arte que se consideraba indigno, impropio, demasiado cercano a la denostada necromancia, una suerte de arcaica y primitiva mezcla de chamanismo y engaño. Pero, si la resistencia podía ser impuesta mediante encantamiento a un miembro viril, ¿no sería posible mejorar otros aspectos del cuerpo o de la mente?

Había una razón para que Annanyariel pensara en aquello, una razón que le había estado persiguiendo durante años: en la estantería de su despacho un pequeño y ajado libro le estaba esperando, un libro sobre el que había trabajado desde que era profesor en la Universidad y que aún se le resistía. De hecho, podríamos haber escogido empezar esta historia en ese punto, podríamos haber decidido que esta historia empezó cuando la profesora Andrayal, Decana de Encantamientos, se lo regaló.

Andrayal había aceptado al joven hechicero en su vida y en su lecho a pesar de saber que el amor que expresaba por ella era sobre todo ambición y miedo, ambición de poder y miedo a enfrentarse al mundo más allá de los muros de la ciudad de los hechiceros. Ella sabía que él la estaba usando y no le importaba, pues ella misma lo estaba usando a él. Sentía debilidad por aquel pobre e inseguro elfillo que sólo poseía su inteligencia y su habilidad para aparentar. Él era ya un brillante hechicero y Andrayal sabía que lo sería aún más en el futuro, pero veía cómo aquello no le bastaba, cómo se esforzaba por acaparar reconocimientos y cómo recurría una y otra vez a la mentira, a la manipulación, e incluso al sexo para conseguir un puesto permanente en la Universidad. Pobrecillo. Tenía tan lamentable opinión de sí mismo que creía que tan sólo acostándose con la ‘anciana’ decana conseguiría evitar regresar al mundo exterior —al que tenía auténtico pánico. Le dejó hacer y lo disfrutó. A fin de cuentas, era posiblemente uno de los mejores amantes de una ciudad en la que los varones tendían a ser fríos, cerebrales, y, sin duda, era el amante más experimentado que jamás había tenido. Pero decidió acabar con todo el asunto antes de que llegase el momento decisivo en la elección del nuevo miembro del Colegio de Encantamiento. Era lo bastante vieja como para concederse algunas debilidades, pero también lo bastante como para saber que hay límites que no quería cruzar. 

Un mes antes de la votación quedó con él en la mejor terraza del puerto de la ciudad, y allí, en público, bajo el sonido de las aves marinas, le regaló el libro. Le explicó que era una reliquia, tal vez verdadera, tal vez falsa, en cualquier caso, tan antigua como para ser auténtica. Le explicó que la leyenda decía que perteneció a la esposa de Ayol’Ani, el supuesto dios de la magia, y que el contenido no parecía más que un galimatías sin sentido interrumpido por dibujos, por esquemas que tal vez fuesen la interpretación que podría hacer un lego de auténticos hermegramas. Ella observó como él cogía el libro con pereza al principio, y cómo se iba interesando más y más a medida que hojeaba las notas que las generaciones de hechiceros habían ido añadiendo al libro y que demostraban que tal vez sí que hubiese algo auténtico en aquellas páginas desaliñadas. Estuvieron hablando hasta que encendieron los faroles del puerto, y cuando ella decidió que ya estaba totalmente entregado al librito, se despidió de él. «No nos veremos nunca más», le dijo y se marchó mientras sonreía sabiendo que acababa de darle un puzle sin solución que compensaría de largo la angustia de haber perdido a su principal valedora a un mes de jugarse su futuro en la ciudad.

Y el libro sí que fue una pasión para Annanyariel. Si se lo hubiesen entregado sin anotaciones lo habría desechado de inmediato, no parecía más que una sarta de letras inventadas que se juntaban en palabras incompresibles y esquemas que cualquier ignorante dibujaría si le pidiesen que pintase un hermegrama —un dibujo de suelo para potenciar un hechizo. Pero las notas explicaban que las letras eran una forma inculta de transcripción de una de las lenguas antiguas de los pescadores del pantano ya desaparecido sobre el que se había edificado la ciudad. Las notas explicaban cómo se podía ver más allá de las incorrecciones de los dibujos y, sobre todo, las notas explicaban la apasionante historia de cómo, a partir de aquel aparente galimatías, Baggom había logrado crear la escuela de la hermelogia, el arte mágico de comprender lenguas extrañas. Él conocía la historia de Baggom, uno de los primeros hechiceros importantes, pero nadie le había contado nada de aquel libro, ni de la relación que tenía con el creador de la hermelogia. 

Parecía haber algo real en aquel librillo. No, no sólo lo parecía, podía sentir que era real y, sin embargo, como ya les había pasado a muchos otros antes que a él —incluyendo a Andrayal—, pronto le embargó la frustración. Los primeros capítulos del libro, junto con los hermegramas que contenían, eran fáciles de interpretar —al menos una vez que logró hacerse con el conocimiento necesario para entender la lengua muerta de los pantanos—, y el conocimiento mágico que se deducía de ellos era fácil de identificar con lo que conocían: hechizos y esquemas que se habían inventado en los primeros tiempos y que eran útiles aún en aquellos días. Sin embargo, llegado al capítulo ocho la cosa cambiaba. Los textos sugerían poderes que deberían ser imposibles según lo que había aprendido a lo largo de su vida, y las instrucciones eran básicamente imposibles de seguir.

Muchas horas libres de su vida adulta las había dedicado a intentar ejecutar uno de los hechizos descritos, uno de los más interesantes y aparentemente más factibles, pero por más que practicó, por más que lo intentó, falló. Hubiese sido necesario tener una tercera mano para lograrlo, o haber sido tan ágil y flexible como el más hábil de los contorsionistas. Y los otros capítulos tenían problemas parecidos: en uno era necesario tener a la vez la voz más aguda y la más grave del registro vocal conocido; en otro había una letanía tan larga y tan rápida que nadie podría pronunciarla sin ahogarse, y en los más esotéricos se indicaban colores a usar en el hermegrama que no se podían ver, como «el color que deja un dedo en el aire» o «el color que hace que una abeja escoja entre dos flores blancas». Eran aparentemente hechizos irrealizables, pero ahora tenía una posible solución a estos problemas.
Encontró el encantamiento donde recordaba haberlo visto años atrás, en una crónica de los inicios de las colonias sureñas, las islas de las perlas. Los recolectores de perlas son prodigiosos submarinistas que dependen de su capacidad de contener la respiración. En el tiempo de Annanyariel la ciudad de los hechiceros enviaba ‘caramelos de aire’ que los recolectores chupaban para mantenerse más tiempo bajo el agua e ir más y más profundo; pero en el pasado muchos recolectores se hacían un encantamiento en el pecho que incrementaba su capacidad pulmonar. Y sí, allí estaba descrito en detalle, en la crónica, con todo el entramado rúnico y el salmo de encantamiento a utilizar. 

Reconstruir las partes recogidas incorrectamente en la crónica le resultó muy sencillo —no dejaba de ser magia primitiva—, pero no tanto lograr el tatuaje adecuado. No podía hacérselo él mismo, y los tatuadores del puerto, los más expertos de la ciudad, no estaban acostumbrados a trabajar con la exactitud que él requería. Tuvo que hacer cientos de pruebas de su destreza hasta que quedó satisfecho. Se ganó el sobrenombre del ‘tatuacerdos’ y la ciudad se llenó de rumores sobre su amor por decorar animales rollizos. El resto no fue tan complicado como caro. Invocar a los espíritus implicaba velas que ya nadie fabricaba, inciensos con componentes del otro extremo del mundo y polvos exóticos compuestos por huesos de animales gigantes casi extintos. Estuvo a punto de arruinarse pero mereció la pena.

Cuando acabó el dolor de adaptación de sus pulmones a las cualidades espirituales que le había injertado, respiró profundamente y le quedó claro lo mucho que había cambiado. Fue a probarlo, al mar, y se asustó de todo el tiempo que podía permanecer bajo el agua conteniendo el aliento. Eso sí, su nueva capacidad pulmonar no le aseguraba poder ejecutar los hechizos del librito. Tardó meses en aprender a usar su nueva capacidad para pronunciar adecuadamente y a la velocidad necesaria las letanías inacabables que se indicaban. Muchas veces pensó en abandonar, pero una extraña certeza sobre que el libro era auténtico y que lo que contenía podía hacerse lo hizo perseverar hasta que lo logró.

Una tarde especialmente lluviosa del invierno de la costa norte, su enésimo intento tuvo éxito. Mirando hacia el sur, con el hermegrama bajo sus pies, pronunció el hechizo más largo que nadie había intentado nunca, sin pararse a respirar, y de pronto la pared de su despacho desapareció y fue sustituida por la vista de los campos de cultivo. No todo fue perfecto, no. No había calculado que había gran diferencia de altura entre el suelo de su torre y el de aquel lugar, por lo que cayó hasta una colina y luego rodó por su ladera. Podría haberse matado, pero cuando, magullado, dolorido y cubierto de barro, dejó de rodar, el hechicero estalló en carcajadas. El libro tenía que ser auténtico. ¡Transporte instantáneo! Con dificultad se levantó y se giró cojeando hasta ver a lo lejos, a millas de distancia y desdibujados por la intensa lluvia, los muros de la ciudad de los hechiceros, con sus torres y sus puentes voladizos. Le pareció la vista más hermosa del mundo.

El transporte instantáneo era teóricamente imposible, pero él lo había logrado. Lo cambiaría todo, desde el comercio a la guerra, pasando por la política. ¿Cuán rápido podrían comunicarse los reyes entre ellos con mensajeros que podrían materializarse a decenas o, tal vez, centenares de millas de distancia en un parpadeo? ¿De qué servían las murallas contra un ejército que podía materializarse detrás de ellas? ¿De qué servían los barcos si alguien podía ir a otro extremo del mundo a buscar la mercancía que necesitara? Los poderosos del mundo iban a pagar cantidades obscenas por este conocimiento. Esto lo pondría en los libros de historia y lo haría enormemente rico. Pero Annanyariel sabía que hay que ir con cuidado en estas cosas, ir paso a paso. Y eso hizo.

En secreto depuró su técnica, y gastó el poco dinero que le quedaba en repetir el encantamiento pulmonar con uno de sus mejores alumnos. Meses más tarde convocó al Consejo a una demostración en la plaza principal de la ciudad y, gracias a su destreza social y política, casi todos los Grandes Maestros y Decanos acudieron. Cuando él mismo desapareció de un extremo de la plaza para reaparecer en un balcón al otro extremo, el silencio del asombro cubrió la plaza; pero cuando su alumno repitió el prodigio el clamor de la incredulidad le abrió las puertas de un puesto permanente en el Consejo de la Ciudad. Hasta la ya muy anciana Andrayal le felicitó. 

Sin duda aquella era la mejor manera. Los hechiceros decidirían cómo aprovechar el descubrimiento, así los reyes no se echarían unos sobre otros, no desgarrarían la tierra con ejércitos para ser los únicos que pudiesen ignorar murallas. No se destruirían fortunas comerciales ni se prendería fuego a los barcos que se hubiesen vueltos inútiles. El mundo no se volvería del revés y la ciudad de los hechiceros sería aún más independiente y más poderosa. A fin de cuentas, lo más importante era que el libro era auténtico y Annanyariel sabía que dentro de sus páginas se ocultaban secretos mayores, prodigios aún más increíbles. Le dieron independencia, recursos y todos los colaboradores que pidió. Hasta empezaron a esculpir el molde para su estatua en la calle de los Reverenciados. 

En pocos años la ciudad se llenó de hechiceros con el pecho tatuado, capaces de cruzar el país en un parpadeo, y los encantamientos sobre la piel se empezaron a usar para muchas más cosas. Durante ese tiempo Annanyariel y sus discípulos fueron siempre los que abrían el camino. Los misterios del libro fueron cayendo uno a uno a medida que iban descubriendo qué mejora en la visión, en la voz, en los músculos o en sus órganos internos necesitaban implantar. Sus discípulos exploraban los límites de sus cuerpos, descubrían nuevos sentidos, nuevas gamas de color o del sonido que parecían inimaginables y el hechicero se fue haciendo todas las modificaciones, hasta que no quedó ni un rincón de su cuerpo que no contuviese un tatuaje. Su percepción del mundo, sus límites físicos, estaban tan alterados que a Annanyariel le costaba recordar cómo había sido antes.

Se convirtió en la persona más famosa de todo el mundo, y seguramente el más famoso hechicero de todos los tiempos, pero la verdad es que no sintió que realmente llegaba a su consagración hasta que recibió carta de la Alta Iniciada de los Ayolanis. Una carta que le invitaba a dar un discurso en la Ciudadela de la Iglesia. Una carta de la mujer que había amado y que le había expulsado de su vida. 
Su reacción ante la carta fue completamente impulsiva. No mandó respuesta, simplemente se transportó con su nueva magia hasta el mismo corazón secreto y supuestamente inexpugnable de la Ciudadela, provocando la conmoción y la ira de los cultistas. Armas surgieron de entre las túnicas, y hechizos de combate refulgieron en el aire, pero un simple gesto de ella detuvo el conflicto. Cruzó la estancia en silencio, sin prisa, hasta detenerse justo frente a él. Le sostuvo la mirada lo suficiente para que Annanyariel sintiese resquebrajarse su seguridad y, sólo entonces, le indicó que la acompañase mientras ordenaba a todos los demás que esperasen.

Cruzaron un laberinto de estancias y pasillos para llegar a lo que parecían unas cómodas, pero humildes habitaciones, donde ella, aún sin decir nada, abandonó su tiara ceremonial, y el manto que la cubría. La mujer de piel dorada y pelo verde que quedó sin los símbolos externos de poder no era tan diferente de la que el hechicero había amado hacía décadas, y así, solos, en la intimidad, las antiguas palabras de halago y coqueteo empezaron a surgir de su boca. Ella lo detuvo con el simple gesto de una ceja y luego le pidió que se explicase. 

Toda la historia se desparramó desde el alma de Annanyariel. Todo lo del libro de la esposa del dios. Todos los cambios que se había hecho. De dónde había sacado su nueva magia. Le contó hasta cosas que ni él mismo se había parado a pensar que estaban allí: que lo había hecho todo tan sólo para volver hasta ella, porque aprender lo que contenía el libro era aproximarse a la deidad a la que ella rendía culto.

Ella tomó el libro de las manos del hechicero y lo ojeó un poco. Le preguntó si con este conocimiento él pensaba que podría alcanzar el poder del dios de la magia, ser igual que él, y el hechicero le contestó que hasta el momento ningún secreto del libro se había resistido a él ni a sus aprendices. Ella repitió la pregunta. Y él le contestó que sí que lo creía. Ella cerró el libro y sin mirarlo le dijo que no había aprendido nada, tras lo cual, arrojó el libro a las llamas. La sorpresa lo dejó paralizado, y mientras veía cómo el fuego destruía las antiguas runas y las notas de siglos de investigación, escuchó como ella le decía que la invitación para dar una charla quedaba revocada, y que, si no se marchaba de inmediato y para siempre, declararía una sentencia de muerte en su contra.
Annanyariel ni siquiera protestó. Salió de la habitación, y allí mismo en el pasillo trazó el hermegrama necesario y regresó a la ciudad de los magos. Fue entonces, ya en su laboratorio, cuando sucumbió a la ira. El libro no importaba, para entonces habían hecho decenas de copias; pero ella había despreciado todo su trabajo, lo había tratado de ignorante, y eso no lo soportaba. Empezó a romper todo lo que estaba a su alcance lleno de furia hasta que todos sus ayudantes salieron despavoridos. Luego se sentó en el centro del caos, con pergaminos repartidos por el suelo, preparados alquímicos desparramándose de forma peligrosa y chispas de colores que el ojo normal no puede ver surgiendo de los artefactos que acaba de estrellar contra las paredes. Así estuvo callado, conmocionado, hasta que una idea absurda cruzó su mente.

Si podía recorrer largas distancias en nada de tiempo, ¿por qué no recorrer ninguna distancia hacia el pasado? Ellos habían podido llevar, en su más reciente experimento, un grupo de más de diez personas hasta una isla remota en el sur, un viaje que hubiese necesitado años, ¿acaso no era eso equivalente a haber retrocedido todos esos años en el pasado y luego haber viajado de forma normal hasta la isla?

En un estallido de creatividad —reforzado, probablemente, por los recientes añadidos espirituales que había hecho a su cerebro— trazó varios hermegramas completamente nuevos en una de las pizarras. Oh, sí, podría funcionar. Si estaba en lo cierto podía no-viajar desde aquel mismo lugar a su versión siglos atrás, al pantano en donde el maldito dios de la magia se mostró a los mortales y tal vez traerlo de vuelta. Oh, sí, iba a funcionar, y entonces ella, delante del mismísimo dios al que adoraba no tendría más remedio que reconocer su grandeza.

Arrancó la pizarra de sus anclajes y la tiró al suelo. No iba a gastar tiempo en ordenar todo aquello ni en pintar el hermegrama de nuevo. Arrojó lejos de sí sus vestimentas más incómodas y trazó en el aire con sus manos y con su voz el camino para ir desde allí a allí mismo.

Y el hechizo funcionó.

Aunque viajar hacia el pasado no es lo mismo que viajar hasta un lugar muy remoto en el presente. Si te hiciste un tatuaje ayer y vas al pasado hasta anteayer, ¿cómo podrías tener el tatuaje? Si viajas hasta un punto en el que ni siquiera habían nacido tus más remotos antepasados, ¿cómo puede existir siquiera tu cuerpo? 

El hechicero no había pensado en estas paradojas y aunque el viaje funcionó sintió como era violentamente despojado de todas sus mejoras, de cómo su espíritu era truncado, cortado, reducido con cada mejora espiritual que le era arrancada por el discurrir invertido del tiempo. Y luego sintió cómo su cuerpo intentaba descomponerse, negarse a sí mismo; hasta que lo que llegó al pasado ya no era más un yalna, ni un hechicero, era poco más que un moribundo monstruo deforme y desprovisto de todo poder. Cubierto de su propia sangre, una sangre que no debería existir aún, cayó a las aguas pestilentes del pantano y pensó que moriría.

Pero no lo hizo. Cuando despertó descubrió que una mujer del pantano, una de su propia especie, cubierta por ropas que eran más bien andrajos, lo había recogido y sanado las heridas. Las físicas al menos. Pero sus manos estaban deformadas, su voz no era más que un susurro, y por dentro se sentía desprovisto de todo poder. Ya nunca volvería a invocar ningún conjuro.

Preguntó por el dios de la magia, pero nadie sabía nada. Luego preguntó por cualquier hechicero que pudiese ayudarlo, a fin de cuentas, él conocía magias mucho más avanzadas que cualquier truco que pudiese conocer esta gente arcaica, podía enseñar magia de verdad a cualquiera con una pizca de conocimiento y poder, crear su propio sanador; pero nadie sabía de ningún hechicero. 

Tras algunos años abandonó toda esperanza, aceptó ser un lisiado perdido en un pantano de tiempos primitivos. Incluso aceptó el amor de aquella mujer que le había salvado la vida, y tuvieron hijos. Aprendió muchas cosas que no había imaginado que fuesen importantes en su vida previa, cosas que calmaron su corazón, cosas que le hicieron ver el mundo de otras formas sin necesidad de cambiar sus ojos con hechicería. Pero hubo algo que no entendió hasta que fue un anciano frecuentemente enfermo, hasta que estuvo del todo impedido, incluso para caminar. Fue entonces que entendió que esta historia no está hecha de retazos o de azar. Lo entendió cuando ella, su compañera, la madre de sus hijos, con su arcaico acento del pantano y mientras le acariciaba la cabeza para consolarlo de la enfermedad, le llamó Pequeño Anni.

Aiol Anni,

14.7.18

Tutorial de juegos 'rpg' para Inform 7 - Acero (4) - Tiradas

En la anterior entrega vimos como en S3 se calculan los porcentajes de cada una de las habilidades y cómo esto se podría trasladar a la extensión que estamos haciendo; pero aún nos quedan dos pasos más que dar. Lo primero es conocer cómo se hace la tirada de éxito en sí. Es decir, en una partida de tablero como tal si un jugador intenta digamos que acertar algo con una flecha, ¿qué tira y cómo sabe si ha tenido éxito o no? Lo segundo que nos falta es ver cómo aplicar estas tiradas a las 'acciones' de una obra interactiva de parser.

Veamos lo primero. Las tiradas de acción en S3 se hacen lanzando un d%, es decir, dos dados de diez caras en los que se ha escogido cuál es el dado de las unidades y cuál es el de las decenas. La regla básica es muy simple, si la tirada es igual o menor que el porcentaje es un éxito y si es superior es un fracaso. 

En S3 en realidad se distinguen entre dos categorías de éxito y dos de fracaso. Cuando el dado de unidades es un 1 y el número total es inferior al porcentaje entonces no sólo es un éxito sino un éxito especial. En el caso de fallos, los fallos pares acabados en cero serán desastres. Los especiales y los desastres permiten dar más color a las partidas y jugar con cosas improbables. Lo primero sería declarar las categorías de resultados posibles, esto lo podemos hacer creando un nuevo tipo de valor de esta forma:

Chapter - Rolling a skill

A skill roll result is a kind of value. 
The skill roll results are disaster, failure, success, special success.

Ahora necesitamos la función que haga la tirada y nos diga qué ha resultado. Usaremos de nuevo la librería de dados y algunos cuantos cálculos matemáticos con partes enteras y la función 'módulo' de esta forma:

To decide which skill roll result is the roll ( skill - a skill ) for ( char - a character ):
 let base roll be the roll of d%;
 let success percent be the percent in skill for char;
 let units be the remainder after dividing base roll by 10;
 let tens be base roll divided by 10;
 if base roll is greater than the success percent:
  [FAILURE]
  if units is 0 and the remainder after dividing tens by 2 is 0:
   decide on disaster;
  otherwise:
   decide on failure;
 otherwise:
  [SUCCESS]
  if units is 1:
   decide on special success;
  otherwise:
   decide on success.

¿Cómo se usaría esta función? Pues hagamos que nuestro lagarto arquero dispare todos los turnos de juego, como si estuviese practicando con el arco:

Every turn:
 say "Sherack dispara contra la diana: [roll bow for Sherack].".

Si corremos ahora la obra veremos que salen esta clase de mensajes:

>i
No llevas nada.

Sherack dispara contra la diana: special success.

>i
No llevas nada.

Sherack dispara contra la diana: success.

>i
No llevas nada.

Sherack dispara contra la diana: failure.

>i
No llevas nada.

Sherack dispara contra la diana: disaster.

Mola, aunque evidentemente habría que darle un formato mucho más bonito, ¿no? Algo como:

Every turn:
 say "Sherack dispara contra la diana";
 let result be roll bow for Sherack;
 if result is special success:
  say " acertando justo en entre los ojos del muñeco de entrenamiento.";
 otherwise if result is success:
  say " acertando en el muñeco de entrenamiento.";
 otherwise if result is failure:
  say ", pero la flecha pasa por encima del muñeco.";
 otherwise:
  say ", pero tan sólo consigue golpearse con la cuerda del arco en la mejilla.".

Mucho mejor ahora, pero hacer esto por todas partes de la historia no parece muy buena idea, ¿no? Parte del problema es el que os expliqué en la primera entrada del tutorial, ¿realmente quieres todo esto en tu obra? Pero en realidad podemos buscar algunos mecanismos generales que nos permitan simplificar un poco toda esta codificación. Eso lo veremos en la siguiente entrega.

En realidad las tiradas en S3 no son siempre el porcentaje de la habilidad, a veces es necesario considerar tiradas sencillas, difíciles, etc... esto se logra de esta forma:

Chapter - Difficulty levels

A difficulty level is a kind of value. 
The difficulty levels are extremely easy, very easy, quite easy, easy, 
simple, normal, complex, difficult, quite difficult, very difficult, extremely difficult, impossible.

To decide which number is the modification percent of (difficulty - a difficulty level):
 if difficulty is extremely easy:
  decide on 75;
 if difficulty is very easy:
  decide on 60;
 if difficulty is quite easy:
  decide on 45;
 if difficulty is easy:
  decide on 30;
 if difficulty is simple:
  decide on 15;
 if difficulty is normal:
  decide on 0;
 if difficulty is complex:
  decide on -15;
 if difficulty is difficult:
  decide on -30;
 if difficulty is quite difficult:
  decide on -45;
 if difficulty is very difficult:
  decide on -60;
 if difficulty is extremely difficult:
  decide on -75;
 if difficulty is impossible:
  decide on -90.

To decide which skill roll result is the roll (skill - a skill) for (char - a character):
 decide on normal roll skill for char.

To decide which skill roll result is the (difficulty - a difficulty level) roll (skill - a skill) for (char - a character):
 let base roll be the roll of d%;
 let success percent be the percent in skill for char;
 increase success percent by the modification percent of difficulty;
 let units be the remainder after dividing base roll by 10;
 let tens be base roll divided by 10;
 if base roll is greater than the success percent:
  [FAILURE]
  if units is 0 and the remainder after dividing tens by 2 is 0:
   decide on disaster;
  otherwise:
   decide on failure;
 otherwise:
  [SUCCESS]
  if units is 1:
   decide on special success;
  otherwise:
   decide on success.

Basta por hoy. La obra actualmente está en este estado y la librería en este.

5.7.18

Tutorial de juegos 'rpg' para Inform 7 - Acero (3) - Habilidades

En S3 como en BRP las acciones se deciden si son un ´éxito o un fracaso según una tirada de d%. Primero se calcula el porcentaje de éxito, y luego se lanza un d% cuyo resultado debe ser igual o menor que ese porcentaje. Las tiradas en sí y cómo se relacionan con las acciones que Inform 7 entiende lo veremos en el siguiente capítulo pero veamos en este cómo se calcula en S3 el porcentaje de éxito.

He de avisar que este capítulo del tutorial será con diferencia el más enrevesado, de forma que si hay algo que no entendéis muy bien o que os parece demasiado complicado no os preocupéis demasiado. Podría haber simplificado mucho este tema pero he preferido dejarlo tal cuál es en S3 en realidad para que veáis un sistema complejo, la codificación que necesita y opciones de cómo podéis hacerla.

En S3 hay tres capas (es otra de las razones del nombre) de abstracción que determinan finalmente la probabilidad de éxito de una acción concreta. Primero está el conocimiento general más o menos teórico sobre un campo de experiencia del personaje (tales como 'ciencia' o 'sigilo' o 'artesanía), estos conocimientos están clasificados en lo que se llama 'grupo de habilidades' y tienen un valor que va desde 0 (desconocimiento completo) a 10 (máximo conocimiento teórico). Se llama a estos valores 'niveles' y es lo más parecido que tiene S3 a los niveles de d20. Modelemos primero los niveles de los grupos de habilidad:

Chapter - Group of skills

A group of skills is a kind of object. 

Algunos de estos niveles tienen valores 'naturales' en el caso de que sean lo bastante intuitivo como para que cualquier personaje con suficiente agilidad, fuerza o inteligencia pudiese intentar hacer acciones de ese grupo sin necesidad de un entrenamiento. Esto se resuelve en S3 mediante unos niveles base relacionados con las características. Las tablas de estos valores base se han ido ajustando con los años y, aunque se corresponden con niveles de distribución gaussianos, en realidad son fruto sobre todo de la prueba y error. Añado todo el código necesario para calcular los niveles básicos de un tirón (mediante tablas y funciones):

Some group of skills are defined by Table of Groups of Skills.

Table of Groups of Skills
a group of skills strength base agility base  intelligence base will base size base constitution base
shoot  2 1 0 0 0 0
hand to hand combat 1 0 0 0 0 0
art 0 0 1 1 0 0
craft 0 0 0 0 0 0
athletic 1 1 0 0 0 0
science 0 0 0 0 0 0
language 0 0 0 0 0 0
geo-hist 0 0 0 0 0 0
medicine 0 0 0 0 0 0
perception 0 0 0 1 0 1
stealth 0 1 1 0 1 0
magic 0 0 0 0 0 0

[
FUE  CON  TAM  INT  VOL  AGI
0 – 5 -2 0 – 1 -2 0 – 5 -2 0 – 3 -2 0 – 2 -2 0 – 2 -2
6 – 9 -1 2 – 4 -1 6 – 9 -1 4 – 5 -1 3 – 4 -1 3 – 4 -1
10 – 13 0 5 – 6 0 10 – 13 0 6 – 8 0 5 – 8 0 5 – 8 0
14 – 17 1 7 – 8 1 14 – 17 1 9 – 11 1 9 – 13 1 9 – 13 1
18 – 21 2 9 – 10 2 18 – 21 2 12 – 15 2 14 – 17 2 14 – 17 2
22 – 24 3 11  - 12 3 22 – 24 3 16 – 19 3 18 – 21 3 18 – 21 3
25+ 4 13+ 4 25+ 4 20+ 4 22+ 4 22+ 4
]

To decide which number is strength base plus of (car - a number):
 if car is less than 6:
  decide on -2;
 if car is less than 10:
  decide on -1;
 if car is less than 14:
  decide on 0;
 if car is less than 18:
  decide on 1;
 if car is less than 22:
  decide on 2;
 if car is less than 25:
  decide on 3;
 decide on 4.
 
To decide which number is size base plus of (car - a number):
 decide on strength base plus of car.
 
To decide which number is constitution base plus of (car - a number):
 if car is less than 2:
  decide on -2;
 if car is less than 5:
  decide on -1;
 if car is less than 7:
  decide on 0;
 if car is less than 9:
  decide on 1;
 if car is less than 11:
  decide on 2;
 if car is less than 13:
  decide on 3;
 decide on 4.

To decide which number is intelligence base plus of (car - a number):
 if car is less than 4:
  decide on -2;
 if car is less than 6:
  decide on -1;
 if car is less than 9:
  decide on 0;
 if car is less than 12:
  decide on 1;
 if car is less than 16:
  decide on 2;
 if car is less than 20:
  decide on 3;
 decide on 4.
 
To decide which number is will base plus of (car - a number):
 if car is less than 3:
  decide on -2;
 if car is less than 5:
  decide on -1;
 if car is less than 9:
  decide on 0;
 if car is less than 14:
  decide on 1;
 if car is less than 18:
  decide on 2;
 if car is less than 22:
  decide on 3;
 decide on 4.
 
To decide which number is agility base plus of (car - a number):
 decide on will base plus of car.
 
To decide which number is base level of (group - a group of skills) for (char - a character):
 let level be 0;
 if strength base of group is greater than 0:
  let byStrength be strength base plus of strength of char;
  if strength base of group is greater than 1:
   increase level by byStrength divided by strength base of group;
  otherwise:
   increase level by byStrength;
 if agility base of group is greater than 0:
  let byAgility be agility base plus of agility of char;
  if agility base of group is greater than 1:
   increase level by byAgility divided by agility base of group;
  otherwise:
   increase level by byAgility;
 if intelligence base of group is greater than 0:
  let byIntelligence be intelligence base plus of intelligence of char;
  if intelligence base of group is greater than 1:
   increase level by byIntelligence divided by intelligence base of group;
  otherwise:
   increase level by byIntelligence;
 if will base of group is greater than 0:
  let byWill be will base plus of will of char;
  if will base of group is greater than 1:
   increase level by byWill divided by will base of group;
  otherwise:
   increase level by byWill; 
 if size base of group is greater than 0:
  let bySize be size base plus of will of char;
  if size base of group is greater than 1:
   decrease level by bySize divided by size base of group;
  otherwise:
   decrease level by bySize; 
 if constitution base of group is greater than 0:
  let byConstitution be will base plus of constitution of char;
  if constitution base of group is greater than 1:
   increase level by byConstitution divided by constitution base of group;
  otherwise:
   increase level by byConstitution;  
 decide on level.

Como he dicho no hay más que experiencia de los años en ese código, no una razón fácilmente explicable. Aunque...

:)

...seguro que se os ocurre cómo simplificar el código que acabo de incluir haciéndolo algo más general y de menor complejidad. Os animo a revisar la sección de listas del manual de Inform 7 y pensar en cómo se podrían usar para mejorar y generalizar el código anterior.

Ya tenemos una forma de 'calcular' los niveles de grupo de habilidad básicos, pero cada personaje tendrá además una experiencia dada en digamos  combate cuerpo a cuerpo o en puntería, ¿no? ¿Cómo incorporamos esta información al personaje en cuestión? La respuesta más obvia sería añadir a character los campos numéricos necesarios que representen todos los niveles que tiene el personaje, pero serían 12 números más y cuando luego añadamos las habilidades serían otros 60 números más... uff... empieza a sonar excesivo. Pensemos un poco mejor. Lo primero es que vamos a usar estos números muy pocas veces a lo largo de la lógica del juego, sólo cuando haya algo de acción usaremos uno de esos números y sólo uno, así que nos podríamos permitir calcularlos 'sobre la marcha', además esto tiene la ventaja de que si provocamos un cambio temporal de las características (por un hechizo por ejemplo) el valor del número se verá afectado sin más. Lo otro a considerar es que probablemente tus PNJs no serán por lo general 'personas completas', tendrán algo de arquetipo y seguramente sólo te interesarán los valores 'relevantes' de cada personaje (la habilidad de arco de un arquero, por ejemplo y no su habilidad para cocinas), así que podríamos pensar en algo que se rellene sólo cuando sea necesario, cuando los valores se desvíen de la base. Esto se puede hacer con tablas en Inform 7 de esta forma (añadiendo el hecho de que la suma total de niveles sólo puede llegar a 10):

Table of Group Skill Level by Character
character group extra
a character a group of skills a number
with 500 blank rows.

To decide which number is the extra level of (group - a group of skills) for (char - a character):
 repeat through the Table of Group Skill Level by Character:
  if character entry is char and group entry is group:
   decide on extra entry;
 decide on 0. 

To decide which number is the level of (group - a group of skills) for (char - a character):
 let total be base level of group for char;
 increase total by the extra level of group for char;
 if total is less than 10:
  decide on total;
 otherwise:
  decide on 10.

Esta aproximación en Inform 7 tiene alguna limitaciones, puedes ver que he dejado 500 líneas en blanco, eso es todo lo que va a poder soportar la librería. 500 valores de incrementos de niveles de los grupos de habilidad frente a su base. Si pones en tu obra muchíiiisimos PNJs mejor cambia ese número, así que no pongas 10000 orcos distinguibles cada uno con su nombre y sus habilidades.

:)

Nos faltaría una forma de incrementar esos niveles a lo largo del juego, algo como esto:

To increase (group - a group of skills) level of (char - a character) by (amount - a number):
 let found be false;
 repeat through the Table of Group Skill Level by Character:
  if character entry is char and group entry is group:
   let initial be extra entry;
   increase initial by amount;
   now extra entry is initial;
   now found is true;
 if found is false:
  choose a blank row in Table of Group Skill Level by Character; 
  now character entry is char; 
  now group entry is group; 
  now extra entry is amount.
   
To increase (group - a group of skills) level of (char - a character):
 increase group level of char by 1.

Y también una forma de darle valores de niveles a los PNJs al principio del juego, que podríamos hacerlo con esto:

Chapter - Initial levels for characters

When play begins:
 repeat through the Table of Initial Extra Levels for Characters:
  increase group entry level of character entry by extra entry.

Table of Initial Extra Levels for Characters
character group extra
-- -- --

Ahora ya podríamos proporcionar a Sherack de algo más de carácter haciendo que sea alguien con conocimiento en armas de distancia medio aceptable de esta forma:

Table of Initial Extra Levels for Characters (continued)
character group extra
Sherack shoot 4

Vale, las habilidades son de un grupo de habilidades en S3, y cada una tiene un multiplicador que proporciona el porcentaje base al que se añade la experiencia de cada personaje. Por ejemplo, un personaje con puntería 5 tiene una base de 25% en arco, que puede haber subido hasta 50% si tiene 25% extra que ha ganado como experiencia. Implementar esto es en realidad casi lo mismo que hemos hecho con los niveles:

Chapter - Skill

A skill is a kind of object. Some skills are defined by Table of Defined Skills.

Table of Defined Skills
a skill group multiplier
bow shoot 5

Chapter - Skill sheet for all characters

Table of Skill Percents by Character
character skill base extra
a character a skill a number
with 500 blank rows

To decide which number is the extra percent in (skill - a skill) for (char - a character):
 repeat through the Table of Skill Percents by Character:
  if character entry is char and skill base entry is skill:
   decide on extra entry;
 decide on 0. 

To decide which number is the percent in (skill - a skill) for (char - a character):
 let total be the extra percent in skill for char;
 let base level be the level of group of skill for char;
 increase total by base level multiplied by multiplier of skill;
 decide on total.
 
To increase (skill - a skill) percent of (char - a character) by (amount - a number):
 let found be false;
 repeat through the Table of Skill Percents by Character:
  if character entry is char and skill  base entry is skill:
   let initial be extra entry;
   increase initial by amount;
   now extra entry is initial;
   now found is true;
 if found is false:
  choose a blank row in Table of Skill Percents by Character;
  now character entry is char;
  now skill base entry is skill;
  now extra entry is amount.
   
To increase (skill - a skill) percent of (char - a character):
 increase skill percent of char by the roll of 1d4.

Chapter - Initial percents for characters

When play begins:
 repeat through the Table of Initial Extra Percents for Characters:
  increase skill entry percent of character entry by extra entry.

Table of Initial Extra Percents for Characters
character skill extra
-- -- --

En este caso sólo he incluido la habilidad de 'arco' en la tabla de habilidades para simplificar un poco el texto. Ahora ya podemos hacer a Sherack un arquero de verdad con:

Table of Initial Extra Percents for Characters (continued)
character skill extra
Sherack bow 60

Y ya tendríamos todo un sistema de habilidades en funcionamiento... al menos para calcular los porcentajes, en los próximos capítulos veremos cómo usar estos porcentajes de verdad en la resolución de acciones.

Podéis ver el estado actual de la librería aquí y del juego aquí.

3.7.18

Tutorial de juegos 'rpg' para Inform 7 - Acero (2) - Características


Empecemos con los personajes. En casi todos los sistema de rol los personajes tienen un grupo de números que representan lo más básico y fijo de los mismos: su altura, cómo de fornidos están, su belleza, su relación con la magia, etc... A estos números se les llama por lo general 'características' y es lo primero que se escoge mediante algún procedimiento como el reparto de puntos o el lanzamiento de dados.

En el sistema de ejemplo que estamos usando S3 las características se deciden mediante el lanzamiento de dados y existen:
  • Tamaño: altura y dimensiones en general, para antropomorfos se expresa en unidades de 10 cm de altura, así alguien de tamaño 17 tendrá 170 cm de altura.
  • Constitución: resistencia al dolor, a las heridas, a las enfermedades, etc...
  • Fuerza: la capacidad de levantar pesos, golpear con intensidad, etc... está expresado en unidades equivalentes en número al tamaño para que puedan compararse.
  • Inteligencia: expresados en decenas del CI, así alguien con un INT: 11 tendrá un CI de 110.
  • Agilidad: velocidad, capacidad de reacción, etc... expresado en un rango de hasta 20 puntos para poder transformar en un porcentaje multiplicando por 5.
  • Voluntad: capacidad de concentración, esfuerzo mental, se usa tanto para el aprendizaje como para la imposición de efectos mágico en los demás. También expresados en rangos de hasta 20.
  • Aspecto: belleza física, capacidad de empatía y en general lo agraciado que resulta el personaje hacia los demás. También se expresa en valores de hasta 20, pero en realidad sólo se considera sin ajuste dentro de su propia especie.
  • Poder: esta característica en realidad cambia de significado de campaña en campaña pero representa la conexión del personaje con lo paranormal, ya sea la magia, los poderes psíquicos, etc...
Podríamos incluir en nuestro juego las tiradas correspondientes, pero no parece lo más adecuado, mejor creemos una nueva extensión para el sistema de juego e incluyamos en ella todo lo que tiene que ver con la capa 'rolera' de la historia. Ya sabéis como File >> New extension. Yo a la mía la he llamado 'S3 role playing system'. En realidad debería haber añadido detrás 'SP' para indicar que estará escrita en español, pero dado que va a ser original nuestra, si alguien la quiere traducir al inglés que llame a la suya 'EN'.

:)

Lo primero en la extensión sería extender la clase 'person' a una que va a contener todos los aspectos roleros, de esta formas si hay otras 'person' en la historia que no requieren tener 'ficha de personaje' no sobrecargarán el tamaño de la obra con elementos innecesarios. Esto ya sabéis que se hace con algo tan simple como:

A character is a kind of person.

Sobre esta nueva clase añadimos todas las características de las que hemos hablado, eso es algo tan sencillo como:

A character has a number called strength.
A character has a number called constitution.
A character has a number called size.
A character has a number called intelligence.
A character has a number called agility.
A character has a number called will.
A character has a number called beauty.
A character has a number called power.

Ahora nos queda explicar cómo rellenamos estos valores de características. Normalmente la tirada o la forma de elección en casi todos los sistemas depende de una agrupación a la que se le llama 'especie' o 'raza' y que indica si el personaje es humano, enano, elfo, orco o lo que sea. En la campaña que vamos a usar de base (Akaram) hay una enorme multiplicidad de razas jugables antropomorfas, pero nuestro juego se va a situar en la frontera del Reino de Renorf con las tierras salvajes de los hombres lagarto; por allí sólo suelen encontrarse las razas de humanos del norte (los altos raynos pelirrojos, los fornidos normer de los mares helados y los wolferm morenos) y dos de los tipos de hombres lagaro (los azules sershas y los más grandes, más tontos y rojos slalash). Incluiremos tan sólo estas cinco razas en la extensión de esta forma:

Chapter - Races

A breed is a kind of object.  Some breeds are defined by Table of Races

Table of races
a race strength roll constitution roll size roll intelligence roll 
agility roll will roll beauty roll power roll
rayno 3d4+11 2d4+2 3d4+11 3d4+2 5d4 5d4 5d4 3d4+2 
wolferm 3d4+11 2d4+3 3d4+10 3d4+2 5d4 5d4 5d4 3d4
normer 2d4+15 2d4+3 2d4+14 3d4+1 5d4 5d4 5d4 2d4+2
sersha 3d4+10 1d4+4 3d4+9 3d4+1 5d4+2 2d4+3 5d4 2d4+2
slalash 3d4+12 1d4+7 3d4+11 2d4+2 4d4+1 2d4+2 5d4 2d4

Chapter - Characters

A character is a kind of person. A character has a breed called race.

¿Y cómo se calculan las características de los personajes? Pues incluiremos una función que lance los dados de la raza a la que pertenezca el personaje de esta forma:

To roll dice for (char - a character):
 now the strength of char is the roll of the strength roll of the race of char;
 now the constitution of char is the roll of the constitution roll of the race of char;
 now the size of char is the roll of the size roll of the race of char;
 now the intelligence of char is the roll of the intelligence roll of the race of char;
 now the agility of char is the roll of the agility roll of the race of char;
 now the will of char is the roll of the will roll of the race of char;
 now the beauty of char is the roll of the beauty roll of the race of char;
 now the power of char is the roll of the power roll of the race of char.

Y cuando comience a ejecutarse la obra buscaremos a todos los personajes y lanzaremos sus dados:

When play begins:
 repeat with char running through characters:
  roll dice for char.

Esto creará las características de todos los personajes no jugador, para el jugador seguramente querremos al menos permitirle escoger la raza al principio de la obra, así que tendremos que usar 'roll dice for' de forma explícita, pero ya llegaremos a eso. Para simplificar la creación de personajes podemos crear sub-clases de 'character' que sean de una raza dada como por ejemplo:

A rayno human is a kind of character. The race of a rayno human is usually rayno.
A wolferm human is a kind of character. The race of a wolferm human is usually wolferm.
A normer human is a kind of character.  The race of a normer human is usually normer.
A sersha lizardman is a kind of character.  The race of a sersha lizardman is usually sersha.
A slalash lizardman is a kind of character.  The race of a slalash lizardman is usually slalash.

Bien, ya podríamos empezar a escribir un poco de historia. Por ejemplo, creemos un lugar que suene interesante y un PNJ lagarto que esté justo allí.

Chapter 1 - Mapeado

Section 1 - La puerta de las ruinas de Shatard

La explanada is a room. The printed name of explanada is "La explanada frente a la puerta de Shatard".

Sherack is a sersha lizardman in la explanada.

Estupendo, ahora Sherack existe y tendrá su altura, su fuerza, su agilidad, etc...  pero no podemos verlo, ¿no? Incluyamos una función básica para mostrar la 'ficha' del personaje en la extensión:

Chapter - Describing characters

To say sheet of (char - a character):
 say "[char]: ([race of char]) STR: [strength of char] CON: [constitution of char] 
             SIZ: [size of char] INT: [intelligence of char] AGI: [agility of char] 
             WIL: [will of char] BEA: [beauty of char] POW: [power of char].".

Y cambiemos un poco el examine de los personajes para usar esta pequeña función, así:

Instead of examining a character:
 say sheet of the noun.

Si probáis la obra ahora veréis que Sherack mantiene sus características a lo largo de la obra, pero cambiará cada vez que la reiniciéis. Hemos avanzado bastante para un capítulo, en el próximo veremos la habilidades y cómo se usan para decidir si una acción ha sido un éxito o un fracaso.

Podéis descargaros la versión de la extensión aquí y el estado actual de la obra aquí.