Planeta Aventurero

Distribuir contenido
Planeta aventurero de CAAD (en pruebas)
Actualizado: hace 2 horas 36 mins

Retornando a las puertas del destino.

Hace 2 horas 36 mins

He tenido esto muy abandonado. Me propuse a principios de año hacer algo largo, depurado, terminado. Algo, en definitiva, que fuese una obra de verdad y no un esbozo, ensayo, una prueba... o más bien me propuse terminar dos proyectos. Una obra de literatura normal y una ficción interactiva.
Pero no tenía ni idea de cuál. 
La cosa es que entre tanto se han acabado definitivamente las Sillyberrys, se ha hecho la Rayuela de Arena de este año, y he tenido más cambios en mi vida... todo lo cual no me ha ayudado a decidirme sobre qué dos obras deseaba hacer. De hecho me ha desinflado los ánimos bastante. Hasta hoy.
En cuanto a la literatura tradicional parecía que me iba a centrar en un proyecto nuevo que me ha surgido, una colaboración en una antología de SF Hard con varios autores. Ese proyecto es el único para el que he escrito algo en este tiempo y ahora estamos ya en fase de revisión y ajuste, así que irá para delante, pero... necesito terminar algo más personal. Así que habrá una obra mía que casi seguro que será la colección de cuentos de 'Colonos de Tulgia' que se puede encontrar en este mismo blog, pero espero que muy depurado no sólo por mí, sino por algún editor externo si es que puedo conseguir uno de confianza. Quiero crear una buena portada y hacer una maquetación seria. Y sí, quiero autopublicar, sé que no me voy a comer un colín con esa forma de trabajar y que sólo será una perdida de dinero, pero le tengo cariño a esa colección de cuentos en concreto y quiero autopublicarlo yo mismo.
¿Y la obra de ficción interactiva?
Pues empecé el año pensando en retomar la reiteradamente postergada 'La torre y el mar'; pero luego pensé que para ser algo largo y terminado tal vez sería el momento de sacar de una vez 'Sortilegios' o una versión renovada de 'Apache'. Eso pensé, pero sin acabar de decidirme. Los conocidos me recomendaron intentar 'Sortilegios' que les parecía más interesante. Y en ello he estado... a ratos.
Pero sin avanzar gran cosa y sin entender porqué no avanzaba nada. Esta mañana, repentinamente, me he dado cuenta que 'Sortilegios' requiere muchísimo trabajo para generar una obra (masiva, sí, pero...) muy tradicional y, en el fondo, con una estructura narrativa muy normalita. Lo que... bueno, como que no me llena.
Parece que sí que necesito tener entre manos algo más rompedor, más experimental, y por eso he pensado en 'Puertas del destino'. 
'Puertas del destino' es un viejo proyecto totalmente personal (ni siquiera está listada en la wiki del caad como uno de mis proyectos) basado en Inform 7 que requiere un control técnico bastante complicado para que quede bien. Tal vez demasiado complicado, pero, diablos, parece que es justo lo que me apetece, así que ese va a ser.
'Puertas del destino' es una obra de una única localización que intenté crear para la XComp3, una obra que va de una tienda en la que puedes pagar para intentar cambia tu destino y... el de tu apellido. Será una obra mezcla de SF Soft y Fantasía.
No digo más que destrozaría las sorpresas que esta obra debería contener.
¡¡Deseadme suerte!!

Categorías: Planeta

Repertorio de acciones en Inform

Hace 2 horas 36 mins
Alien: La aventura (Alpha Aventuras 2008−2018)El analizador de comandos de toda ficción interactiva se presenta al usuario bajo la siguiente premisa: eres libre de escribir lo que quieras, como si de algún modo estuvieses conversando con el narrador de la obra o con el director de partida de un juego de rol —una idea que está detrás, de hecho, del término "aventura conversacional", utilizado ampliamente en el pasado para referirse al medio y que aún hoy sigue siendo popular entre algunas personas—. La premisa es falsa, por supuesto. A pesar de la ilusión de poder escribir cualquier cosa para comunicarte con la obra, la cantidad de entradas que puede procesar correctamente el analizador de comandos se reduce en realidad a un conjunto muy limitado de acciones.

Cada obra puede definir potencialmente su propio repertorio de acciones particular, completamente diferente (o no) de otras obras. Existe, no obstante, un cierto conjunto de acciones que es habitual encontrar en la gran mayoría de las ficciones interactivas. Gracias a esto los usuarios más veteranos pueden explotar lo aprendido al experimentar obras previas para hacerse una idea general de las acciones que pueden utilizar al iniciar una nueva FI.

El sistema de autoría Inform (tanto en su versión 6, como en la 7) implementa este conjunto de acciones básicas, junto con comportamientos y mensajes por defecto, de manera que cualquier obra de ficción interactiva creada con este sistema cuenta de partida con todas ellas. Los autores son libres después para eliminar o añadir acciones de acuerdo a sus necesidades, desde luego, pero lo más común en este caso —al menos si es que las acciones añadidas resultan clave para hacer avanzar la narración—, es que la obra informe al usuario de cuáles son las novedades que se salen del conjunto habitual. En The Inform Designers Manual (2001) Graham Nelson, autor de Inform, detalla el repertorio completo de acciones del sistema [1]. A continuación se reproduce esta relación de acciones, junto con las entradas de teclado típicas que genera cada una en la traducción de la librería al español INFSP.
Grupo 1Acciones relacionadas con la operación del software. No tienen que ver con la historia de la obra ni con el modelo de mundo subyacente.

Acción Producida típicamente por Notas Pronouns "pronombres" Lista correspondencia de pronombres con objetos de la obra Quit "fin" Restart "reiniciar" Restore "cargar" Save "guardar" Verify "verificar" Comprueba la integridad del fichero de la obra ScriptOn "script on" Inicia transcripción de la sesión en un fichero de texto ScriptOff "script off" Finaliza la transcripción NotifyOn "notificar on" Activa notificaciones de puntuación NotifyOff "notificar off" Desactiva notificaciones Places "lugares" Lista las localidades visitadas Objects "objetos" Lista los objetos manipulados Score "puntuación" FullScore "puntuación completa" Muestra la puntuación detallada de la partida Version "versión" Muestra la versión actual de la obra LMode1 "breve" Descripciones normales de las localidades LMode2 "largo" Siempre descripciones completas de las localidades LMode3 "superbreve" siempre descripciones abreviadas de las localidadesGrupo 2Acciones que de forma automática interactúan sobre el modelo de mundo, en caso de darse las condiciones adecuadas:

Acción Producida típicamente por Notas Look "mira" Examine "examina pez" Search "busca en el caja" Inv "inventario" InvTall "inventario alto" Se convierte en Inv InvWide "inventario ancho" Se convierte en Inv Take "coge pez" Drop "deja pez" Remove "coge pez de la caja" PutOn "pon caja en la estantería" Insert "pon pez en la caja" LetGo acción de apoyo interna Provocada por Remove Receive acción de apoyo interna Provocada por PutOn e Insert Empty "vacía caja" Se convierte en EmptyT d_obj EmptyT "vacía bolsa en la caja" Para cada elemento contenido, se convierte en Remove y después en Drop/PutOn/Insert Transfer "mueve manzana a la caja" Se convierte en Drop/PutOn/Insert Go "norte" Enter "entra en el armario" GetOff "sal del armario" GoIn "entra" Se convierte en Go in_obj Exit "sal" Puede convertirse en Go out_obj Unlock "abre puerta con llave" Lock "cierra puerta con llave" SwitchOn "enciende radio" SwitchOff "apaga radio" Open "abre puerta" Close "cierra puerta" Disrobe "quítate sombrero" Wear "ponte sombrero" Eat "come pez" Wait "espera" Grupo 3Imprimen un mensaje y finalizan en la fase before de la ejecución (sin producir ningún cambio en el modelo de mundo).

Acción Producida típicamente por Notas LookUnder "mira bajo [la alfombra]" noun puede ser nothing Listen "escucha [casete]" noun puede ser nothing Taste "prueba [escabeche]" noun puede ser nothing Touch "toca [pintura]" noun puede ser nothing Pull "tira carretilla" Push "empuja carretilla" Wave "agita varita" Turn "gira sintonizador" PushDir "empuja carretilla norte" ThrowAt "lanza dardo a diana" ThrownAt acción de apoyo interna Provocada por ThrowAt JumpOver "salta sobre verja" Tie "ata cuerda [al gancho]" second puede ser nothing Drink "bebe absenta" Attack "ataca soldados" Swing "columpiate en cuerda" Blow "sopla pipa" Rub "limpia mesa" Set "pon trampa" SetTo "pon temporizador a 10" second no es un objeto del modelo de mundo Buy "compra helado" Climb "escala escalera" Squeeze "aplasta tomate" Burn "quema papeles [con cerilla]" second puede ser nothing Dig "cava jardín [con pala]" second puede ser nothing Cut "corta papel" Consulta "consulta pez en libro" Establece noun y el asunto Tell "habla Gema sobre Arturo" Establece noun y el asunto Answer "responde confirmación a Álvaro" Establece noun y el asunto Ask "pregunta Gema sobre Isaac" Establece noun y el asunto Give "da moneda a troll" Show "muestra pasaporte al guardia" AskFor "pide margaritas a Gema" WakeOther "despierta a dormilón" Kiss "besa Gema" Sleep "duerme" Sing "canta" WaveHands "agita manos" Mira también Wave Swim "nada" Sorry "perdón" Strong palabras muy malsonantes Mild palabras algo malsonantes Jump "salta" Mira también JumpOver Think "piensa" Smell "huele [café]" noun puede ser nothing Pray "reza" VagueGo "anda" Yes "si" No "no" Wake "despierta" Mira también WakeOther
Acciones que se trasladan a las reglas life de los objetos:

Acción Producida típicamente por Answer "di si al cajero" Ask "pregunta mujer sobre plutonio" Attack "ataca soldados" Give "da moneda a Caronte" Kiss "besa Gema" Order "Thorin, ve al oeste" Show "muestra pasaporte al guardia" Tell "habla a Paris sobre Helena" ThrowAt "lanza hacha al enano" WakeOther "despierta a bella durmiente"
[Descargar repertorio completo como un fichero de texto].
[1] Nelson, G (2001). The Inform Designers Manual. (4th ed.) Interactive Fiction Library. (Disponible online: https://www.inform-fiction.org/manual/html/)
Categorías: Planeta

Tabla de contenidos

Hace 2 horas 36 mins

Apuntes sobre ficción interactiva:

El sistema de autoría Inform 6:
Reseñas:
Categorías: Planeta

Sistemas de conversación en Inform 6

Hace 2 horas 36 mins

Uno de los principales retos a la hora de añadir personajes no jugadores (PNJs o NPCs, por sus siglas en inglés) en una ficción interactiva es la implementación de las conversaciones entre ellos y el personaje controlado por el jugador (PJ o PC). Existen múltiples maneras de crear un sistema de conversación, cada uno con sus ventajas e inconvenientes. Una buena práctica antes de decidirse por la utilización de uno u otro es analizar las particularidades de cada sistema y las necesidades de la propia obra a fin de seleccionar aquel que pueda adecuarse mejor a ella —para hacerse una imagen bastante completa de las diferentes opciones con las que cuenta un autor, el Manual Técnico de TADS 3 [1] incluye una sección dedicada a analizar con cierta exhaustividad algunos de los sistemas de conversación más utilizados—.

En líneas generales, estos sistemas de conversación pueden adoptar tres formas de interfaz: 1) "VERBO [PREPOSICIÓN] <PNJ>", algo en el estilo "habla con Fran"; 2) "VERBO [PREP.] <PNJ> [PREP.] <asunto>", estilo "pregunta a Fran sobre los sistemas de conversación"; 3) Entrada libre de texto, como en "me gustaría saber qué sistemas de conversación existen". A continuación se ofrece una relación rápida de las particularidades de cada uno de ellos junto con ejemplos de obras que los utilizan, así como herramientas para facilitar su implementación en el sistema de autoría Inform 6:
1) Interfaz "VERBO [PREP.] <PNJ>"
La interfaz más simple, utilizando comandos del tipo "HABLA CON <nombre_de_PNJ>" (y sinónimos). A priori facilita evitar situaciones de sordera que se pueden manifestar en las otras dos interfaces que analizamos —llamamos "sordera" a situaciones en las que el usuario no es capaz de hacerse entender por la obra, bien porque el analizador no haya podido comprendender correctamente la entrada o, en ocasiones, porque aún habiéndola entendido no ofrece después una respuesta adecuada para esta entrada. Algo que, por supuesto, conviene en lo posible evitar—. Con cada entrada del usuario se retorna un intercambio de conversación entre PJ y PNJ. Este intercambio puede ser contextual y variar, lo que permite cosas como que tras haber hablado ya con un personaje éste deje de estar interesado en volver a hablar y, así, subsiguientes intentos de introducir el mismo comando devuelvan una respuesta adecuada del PNJ. O, en conversaciones largas, éstas se pueden dividir en varios fragmentos e ir retornándolos secuencialmente con entradas sucesivas del comando "HABLA CON <nombre_de_PNJ>" hasta agotar la conversación por completo.

Ejemplos de uso: Ariadne in Aeaea (2016) y 1958: Dancing With Fear (2017), ambas de Víctor Ojuel.

El principal inconveniente de las interfaces de este estilo es que, en su forma más básica, limitan la agencia del usuario puesto que se le priva de formas con las que guiar la conversación —no puede escoger las respuestas del PJ, ni los temas sobre los que se habla—. Al final del artículo se discuten brevemente ciertos mecanismos que pueden ayudar a solucionar este último punto.

La forma más rápida de implementarlo en Inform 6 posiblemente sea reescribir las respuestas por defecto de la librería a las acciones ##Answer, ##Ask y ##Tell —en general será conveniente reescribir también las acciones ##AskFor, con la que los PJ pueden pedir objetos a los PNJs; y ##Order, con la que pueden introducir comandos e intentar que sean ejecutados por el PNJ en lugar del PJ— a través del objeto "LibraryMessages":

Object LibraryMessages
  with before [;
    Answer, Ask, Tell, AskFor, Order:
      "Para iniciar una conversación usa simplemente la acción HABLA (a/con) PERSONAJE.";
      [ ... ]
];

Y redefinir la gramática asociada al verbo 'habla' para que invoque a una nueva acción ##TalkTo:

Extend 'habla' replace
  * noun -> TalkTo
  * 'a'/'con' noun -> TalkTo
  * creature -> TalkTo
  * 'a'/'con' creature -> TalkTo
;

[ TalkToSub;
  ! Mensaje por defecto tipo:
  ! "No parece estar interesado en hablar ahora."
  [...]
];

De este modo cada uno de los PNJs del modelo de mundo pueden capturar la nueva acción ##TalkTo en sus rutinas before() y ofrecer respuestas adecuadas. (Advertir que los ejemplos de código propuestos más arriba son sólo un esbozo incompleto. Queda en manos de los autores añadir nuevas líneas de gramática para que, por ejemplo, términos como "conversa" funcionen como sinónimos de "habla", o que la lógica de la rutina TalkToSub() retorne mensajes por defecto adecuados y diferentes cuando el usuario intente lanzar la acción sobre objetos animados o inanimados o sobre sí mismo).
2) Interfaz "VERBO [PREP.] <PNJ> [PREP.] <asunto>"
Una de los sistemas de conversación más ampliamente utilizados a lo largo de los años. Consiste en el uso de comandos del tipo "PREGUNTA A <nombre_de_PNJ> ACERCA DE <asunto>" (habitualmente, además de "pregunta" se contemplan otros verbos como "responde", "di", "cuenta", etc.) o, también, "<nombre_de_PNJ>, <asunto>". Al permitir especificar un asunto sobre el que tratar presenta la ventaja de ofrecer una mayor libertad al usuario, algo que nos impedía el primer sistema analizado. Por contra, esta mayor libertad redunda en un mayor riesgo de provocar situaciones de sordera; cualquier intento por parte del usuario de tratar un asunto que no haya sido contemplado por el autor retornará algún mensaje genérico del tipo "No sé nada sobre ese tema.", lo que puede deteriorar la experiencia y llegar a generar frustraciones con la interfaz. O puede dar lugar a escenarios más indeseables aún: algunas obras requieren conseguir cierta información de un PNJ para avanzar en la historia, de manera que el usuario puede encontrarse en situaciones de bloqueo del tipo "adivina el asunto" en las que debe dar con las palabras adecuadas sobre las que hablar con ese personaje determiando para conseguir dicha información. Estas situaciones de bloqueo suelen revelar un grave problema de diseño y a menudo resultan más frustrantes para el usuario que los bloqueos motivados por situaciones del tipo "adivina el comando" —una de las principales barreras de accesibilidad en obras de ficción interactiva mal implementadas. Varios autores, como Andrew Plotkin (2011), han abordado ya en el pasado este tipo de problemas con más detalle [2]—. Al igual que con el primer ejempo de interfaz, al final del artículo se discuten mecanismos que pueden aliviar estos inconvenientes.

Dado que se trata del sistema más utilizado y se considera prácticamente estándar en el medio, la librería Inform 6 ofrece de partida toda la infraestructura necesaria (gramáticas, definición de acciones, modelo de mundo...) para implementarla.

Ejemplos de uso: Alien: La aventura (Alpha Aventuras, 2008−2018) o Anchorhead (Gentry, M. 1998−2018), entre muchas otras.
3) NLP aplicado sobre entrada libre del teclado
Esta interfaz plantea permitir la entrada de texto completamente libre por parte del usuario y que, a través de procesamiento de lenguaje natural, la obra pueda interpretar esta entrada y ofrecer respuestas de los PNJs acordes a ella. En la práctica no hay ficciones interactivas con analizador de comandos que hayan utilizado realmente sistemas de este estilo con éxito —sí versiones del sistema (2) que pueden parecer imitarlo al utilizar análisis no estricto para reconocer patrones entre la entrada de usuario y las palabras clave asociadas a cada tema de conversación—. No existen tampoco herramientas ideadas específicamente para implementar conversaciones así en Inform 6, por lo que sería tarea del autor crear el sistema por su cuenta —lo que no se antoja en absoluto sencillo—.

En cambio, algunas otras obras englobadas en clases distintas de narrativa electrónica si han experimentado con acercamientos de este tipo para establecer conversaciones con PNJs, como por ejemplo Starship Titanic (The Digital Village, 1998), Façade (Mateas, M. y Stern, A., 2005) o el reciente Restless (Short, E. 2018), presentado en la edición de 2018 de la ECTOCOMP y que hace uso, entre otros, de las capacidades procedimentales de generación de texto automático del MiddleWare Character Engine [3], desarrollado por la compañía Spirit AI.
Mecanismos para mitigar las desventajas de (1): menús
Los menús representan una posible forma de añadir capacidad de decisión por parte del usuario aún utilizando formas de interfaz simples como las vistas en el punto (1) para iniciar las conversaciones. Estos menús se presentan de forma similar a la que puede observarse en videojuegos como las aventuras gráficas —por ejemplo en The Curse of Monkey Island (LucasArts, 1997)— o los RPG occidentales —ej: Torment: Tides of Numenera (inXile Entertainment, 2017)—: al iniciar la conversación se presenta un conjunto de opciones al usuario (normalmente etiquetadas con números); el usuario selecciona una opción (su número asociado); el PNJ da la respuesta adecuada a esa opción; y se vuelve a repetir el mismo flujo hasta que se agote la conversación.

Algunas de las ficciones interactivas mejor valoradas por la comunidad [4] utilizan este tipo de sistema de conversación: Photopia (Cadre, A. 1998) , Rameses (Bond, S. 2000) o De Baron (Gijsbers, V. 2006), entre otras.

Existen diferentes extensiones para implementar un sistema de conversación basado en menús en Inform 6. Probablemente la más popular, la más robusta y la mejor documentada sea gtalk.h creada por Boettcher, G.; Fundin, K. y Tilford, M. J.:

El sistema basado en menús presenta, por su parte, ciertos inconvenientes —como con el resto de sistemas, para encontrar una descripción detallada del funcionamiento de cada uno junto con sus ventajas y sus inconvenientes, se emplaza de nuevo al lector a consultar el Manual de TADS 3[1]—, el más importante probablemente sea la ruptura de coherencia de la interfaz; durante todo el flujo de la conversación la entrada del usuario deja de consistir en un comando de entre el conjunto de comandos de texto definidos por la obra para convertirse en una selección de opciones del menú (habitualmente, la selección de un número asociado a cada opción). Roberts, M. J. et al. (2008) destacan cómo esta ruptura llama la atención sobre la interfaz de usuario y, por tanto, degrada la experiencia de estar interactuando con el narrador de la obra: «Una enumeración de opciones no encaja bien con el aspecto y comportamiento de un juego de texto. La interfaz de usuario de una ficción interactiva reivindica una salida que pueda ser interpretada como voz del narrador y simular, al menos, [un espacio de posibilidades abierto]».
Mecanismos para mitigar las desventajas de (2): inventario de temas
Con la pretensión de evitar las situaciones de bloqueo de tipo "adivina la palabra" de los sistemas de conversación basados en las interfaces de tipo (2), así como los inconvenientes de los sistemas basados en menús, surgen los inventarios de temas. Estos sistemas consisten en ofrecer directamente una lista de asuntos (un inventario) sobre los que se puede hablar con un PNJ, y que el usuario puede consultar en cualquier momento.

Esta lista de temas no tiene por qué ser completa. Es decir, el usuario potencialmente podría todavía intentar tocar asuntos no listados por el inventario, consciente de la posibilidad de que el PNJ retorne alguna respuesta genérica indicando que no sabe nada sobre ese tema. Al ser consciente de partida de esta posibilidad, se mitiga la frustración y, a cambio, se deja abierta la puerta a la exploración libre y a experimentar la sensación de recompensa y gratificación por descubrir temas y fragmentos de conversación secundarios ocultos o no evidentes. El grueso de la conversación, sin embargo, junto con toda la información que pueda resultar importante para la historia, debería incluirse dentro de los temas sugeridos por el inventario a fin de evitar los temidos bloqueos de "adivina la palabra".

Son numerosos los ejemplos de obras que han adoptado este sistema de conversación en la última década. Por citar algunos: Aotearoa (Wigdahl, M. 2010), Shelter from the storm (Eve, E. 2009) o Make It Good (Ingold, J. 2009).

Para facilitar a los autores la implementación de este tipo de sistema de conversación en Inform 6 he creado una extensión llamada choiceSet (basada en otra extensión previa: NPC_conversation [5]):
  • choiceSet.h (la parte final del código incluye un ejemplo de uso)
  • El Chico (pequeña obra con un ejemplo de uso de la extensión más completo)
Relación de obras citadas:
[1] Roberts, M. J.; Breslin, S; Eve, E.; Nizette, M. y Sewe, A. (2008). TADS 3 Technical Manual: Choosing a Conversation System [Online]. Disponible en: http://tads.org/t3doc/doc/techman/convbkg.htm (Consultado el 2019/02/08).
[2] Plotkin, A. (2011). 'Characterizing, If Not Defining, Interactive Fiction'. En Jackson-Mead, K. y Wheeler, J. R. (ed), IF Theory Reader. 1st ed. Boston, MA: Transcript On Press. pp.(59-66).
[3] Short, E. (2019) Conversation as Gameplay (Talk) [Online]. Transcripción de coloquio en la Oxford/London IF Meetup. Disponible en: https://emshort.blog/2019/01/20/conversation-as-gameplay-talk/ (Consultado el 2019/02/08).
[4] IFDB (2015). Interactive Fiction Top 50 of all time (2015 edition) [Online]. Gijsbers, V. (ed.). Disponible en: https://ifdb.tads.org/viewcomp?id=p6s9uem6td8rfihv (Consultado el 2019/02/10).
[5] Mastodon (2011). Ahora que me acuerdo... [Online]. Disponible en: https://lanemastodon.wordpress.com/2011/04/02/ahora-que-me-acuerdo/ (Consultado el 2019/02/10).
Categorías: Planeta

La ficción interactiva

Hace 2 horas 36 mins

Coloquialmente se utiliza el término ficción interactiva (traducción directa del inglés interactive fiction) para referirse a un amplio y heterogéneo grupo de obras de carácter interactivo que suelen tener en común un preponderante componente narrativo. Bajo esta clasificación es habitual encontrar colocadas propuestas de lo más diversas; desde librojuegos (físicos o digitales —entre los cuáles los más populares posiblemente sean aquellos del tipo Elige Tu Propia Aventura, o CYOA, por sus siglas en inglés—) a hiperficciones, cómics interactivos, novelas visuales (visual novels), aventuras gráficas, u otra clase de videojuegos. Incluso nuevas propuestas de ficción televisiva o cinematográfica con componente interactivo pueden llegar a ajustarse a esta etiqueta, al menos tal y como es entendida informalmente —un ejemplo de este último caso podría ser: Black Mirror: Bandersnatch (2018), dirigida por D. Slade y producida y distribuida por la compañía Netflix—.

Zork (Infocom, 1977)El término "interactive fiction", sin embargo, fue acuñado por la compañía de software Infocom a principios de la década de 1980 [1] para hacer referencia al tipo muy concreto de obra que comercializaba y que en español se ha identificado tradicionalmente como juego de texto o aventura conversacional. Se incide en diferenciar aquí ficción interactiva de juego/aventura conversacional debido a que dentro de este género es perfectamente posible minimizar o renunciar por completo al aspecto lúdico y perseguir en su lugar una vertiente más literaria, por una parte, y porque no toda trama de ficción interactiva tiene por qué adoptar la forma de aventura; la obra Photopia (A. Cadre, 1998) es un ejemplo paradigmático de ficción interactiva que no se ajusta a los parámetros clásicos de las aventuras conversacionales.

De esta manera, acotando el término a su sentido más estricto —aquel empleado por Infocom—, la difinición de ficción interactiva se limitaría a un género literario sobre soporte electrónico que ofrece al usuario la posibilidad de explorar un mundo simulado y producir cambios en este entorno y en el propio progreso de la narración, por medio de la introducción de sencillos comandos de texto.

Cabe llamar la atención sobre tres ideas fundamentales de la definición anterior. En primer lugar, la ficción interactiva es ante todo un género literario; es decir, su desarrollo se lleva a cabo principalmente a través de la expresión verbal. En segundo lugar, el papel destacado que desempeña la interacción del usuario en la experiencia de este tipo de software. Algunos autores, como Niesz y Holland, reflejan claramente esta importancia al ofrecer su definición particular para la ficción interactiva como «obras de ficción que invitan explícitamente al lector a interactuar con ellas mediante consultas o respuestas, a participar activamente de la historia y a cambiar deliberadamente el desarrollo de la trama, del personaje, del entorno o del lenguaje, junto con el autor» [2]. Y, por último; las ficciones interactivas se sustentan sobre la simulación de un cierto entorno. «[Esta simulación] ofrece una modalidad de interacción continua, análoga a la interacción real, lo que puede resultar en una experiencia más inmersiva y cautivadora para los jugadores que las simples historias con numerosas ramificaciones» [3]. El hecho de utilizar un modelo de mundo como base puede redundar igualmente en beneficio de ficciones interactivas con pretensiones pedagógicas de algún tipo, tal y como señalan también Riedl et al. (2006) —ver ref. 3—, al ofrecer potencialmente una experiencia de aprendizaje más realista, así como una progresión narrativa coherente.

El profesor N. Montfort del MIT recoge las ideas expuestas más arriba y caracteriza sucintamente la ficción interactiva del siguiente modo [4]:

  1. Es un software de computador que acepta texto como entrada e igualmente produce texto como salida (principalmente).
  2. Es una narrativa potencial; esto es, un sistema que produce una narrativa a lo largo de la interacción con él.
  3. Es la simulación de un entorno o modelo de mundo.
  4. Es una estructura de reglas a través de las cuáles se persigue un resultado, lo que también se puede determinar como un juego.
Será principalmente esta caracterización de Montfort la que se use en el blog como marco formal desde el que analizar este tipo concreto de obra. A pesar de ello, debido a la utilización coloquial que se hace del término "ficción interactiva" y con objeto de evitar ambigüedades, en ocasiones también se nombra a estas obras como ficción interactiva con analizador de comandos o ficción interactiva de parser.

A continuación se adjuntan un conjunto de enlaces a través de los que se puede acceder a mucha más información acerca del medio, así como a multitud de ejemplos gratuitos de obras de ficción interactiva:

[1] Nelson, G. (2001). The Inform Designer's Manual (4th Ed.). Dan Sanderson, UK.
[2] Niesz, A. J. y Holland, N. N. (1984). Interactive fiction. Critical Inquiry, 11(1):110-129.
[3] Riedl, M. O., Stern, A. y Dini, D. M. (2006) Mixing story and simulation in interactive narrative. The Artificial Intelligence for Interactive Digital Entertainment Conference (AIIDE).
[4] Montfort, N. (2004). Twisty Little Passages: An Approach to Interactive Fiction. MIT Press, Cambridge, MA, USA.
Categorías: Planeta

Un hombre bueno (1): Triángulo de personalidades - Tutorial I7

Hace 2 horas 36 mins
En el anterior capítulo introductorio de este tutorial creamos un lugar y un personaje, Lycurgus. Si corréis el ejemplo en el IDE de Inform 7, veréis a Lycurgus dentro de su tienda, pero, ¿es eso lo que queremos?

Eso nos lleva a la discusión sobre la 'trinidad' de las obras interactivas. En las obras interactivas (incluso en un librojuego) siempre podemos distinguir tres entidades relacionadas: el interlector (el humano, el usuario, el jugador...), el narrador (el que cuenta la historia y, en el caso de ficción interactiva de comandos, el que responde los comandos) y la marioneta (el personaje al que le ocurre la historia, en nuestro caso Lycurgus). Estas tres personalidades se pueden relacionar de muchas maneras diferentes, pueden unirse entre ellas o no. Un ejemplo reciente es Bandersnatch de Black Mirror. En este caso el narrador es Netflix y su presencia es casi nula, pues muestra la historia visualmente; la marioneta es Stefan, al que le pasan todas la penalidades y, finalmente, el interlector (en este caso interespectador) es el que ve el capítulo. Y toda la obra habla de la relación entre el interespectador y la marioneta, que se resiste a ser manipulada, etc... En la mayor parte de las aventuras tradicionales la marioneta se identifica con el interlector, y el narrador contesta a sus acciones, a veces de forma neutra, a veces de forma didáctica o incluso burlona (véase El libro que se aburría).

¿Qué relaciones podrían establecerse entre esas tres entidades? Veamos casos:
  1. Verás lo que le pasó a este tipo (narrador / interlector / marioneta): en este caso alguien (un narrador) nos cuenta una historia en la que el interlector puede intervenir (tal vez aconsejar), pero la marioneta tiene una identidad propia. El ejemplo de Bandersnatch nos sirve para un caso de narrador casi inexistene, también podéis probar el esbozo de Berg para ver un caso mucho más extremo en la que las tres personalidades están presentes y juegan un papel.
  2. Vayamos de aventuras (narrador / interlector = marioneta ): este es el caso habitual de casi todas las aventuras conversacionales clásicas. La marioneta en este caso no es más que una extensión del jugador, suele ser anónima neutra y genérica (para que se identifique con facilidad el interlector con la marioneta), lo que muchas veces lleva al más que gastado arquetipo de la marioneta amnésica, que no sabe quién es ni dónde está. Un ejemplo clásico de esta opción es la propia aventura original o ROTA.
  3. Por favor, ayuda ( interlector / narrador = marioneta ): en estos casos la marioneta 'contacta' con alguien externo y le pide asistencia, ejecuta las recomendaciones (si es que las acepta) y cuenta los resultados. Este caso es el de todas las aventuras tipo lifeline.
  4. Escribamos juntos esta historia ( narrador = interlector / marioneta ): en este caso el narrador queda anulado porque son las propias elecciones del interlector los que conforman la historia, el sistema plantea lo más libremente posible las opciones y corre la simulación presentando las consecuencias en forma de reacción de la/s marioneta/s. El ejemplo más claro que se me ocurre es First Draft of the Revolution, que es una obra que me encanta. Creo que es una opción muy poco explorada e interesante, pero aquí la interfaz por comandos va muy forzada, por lo que probablemente Inform 7 no sería la mejor opción.
  5. Te está pasando ( narrador = interlector = marioneta ): no sé si se puede conseguir esta unidad completa si no es un entorno de realidad virtual o juego de primera persona, En cuanto la interfaz fuese mediante descripción de texto el narrador tenderá a separarse y acabarás haciendo el caso número 2. Yo intenté aproximarme a este caso en Hierba tras el cristal en donde la marioneta (Layna) se narra a sí misma y por eso el narrador habla ¡en primera persona! Para acabar de completar el egocentrismo exagerado de esta marioneta respondona, a veces establece autodiálogos con una voz que no deja de ser una parte de su cabeza, o sea discute con ella misma. En tal contexto el interlector queda constituido como una parte de la propia Layna, es algo así como una parte más de su cabeza a la que se le van ocurriendo 'ideas' que probar. El resultado es divertido y en su momento llamó mucho la atención, aunque no sé cuánta gente se dio cuenta de esta ruptura de paradigma. Por otra parte no es un 'Te está pasando' puro, es un ejemplo un tanto forzado que no queda del todo mal.
Antes de poder escribir más líneas tenemos que decidir qué relación hay en nuestro caso entre el narrador, el interlector y la marioneta. Es decir, cuál de los casos anteriores es el que va a usar nuestra historia. Aunque Inform 7 puede usarse en cualquier mezcla de relación entre esas tres entidades viene por defecto con respuestas en las que se da por hecho que el interlector y la marioneta se identifican y que el narrador es lo más neutral posible. Esta elección no nos viene mal si queremos que el interlector se meta en la piel de un viejo artesano constructor de máscaras de teatro. Es decir, un clásico 'Vayamos de aventuras', tal vez dándole un poco más de color a la marioneta de lo que es habitual.

¿Cómo logramos la identificación de Lycurgus con el jugador? Simplemente cambiando la línea mostrada a continuación.

Fácil, ¿no? La importancia de esto es mayor de lo que parece. Para Inform 7 el 'jugador' es un personaje más de la obra, un 'person' como otro cualquiera y de hecho es posible cambiarlo a lo largo del devenir de la historia. Esto te permite crear obras en la que el protagonista pase de un personaje a otro (véase un estupendo ejemplo de esta técnica en Del otro lado).


Categorías: Planeta

Ya llega el 2019

Hace 2 horas 36 mins

Ya ha llegado el final del 2018.
Un año en el que he perdido a mi padre por un cáncer cerebral que se lo llevó en pocos meses. Un cáncer que me mostró lo frágil que es nuestra mente. Un poco más de presión en alguna parte de la corteza cerebral y los recuerdos se desvanecen, junto con la capacidad de leer, de entender la hora o incluso la capacidad de usar palabras. No había imaginado lo duro que es algo tan simple como enseñar a tu padre a usar su propio reloj despertador cada pocos días.
Un año que me ha demostrado lo minúsculo que somos y cómo podemos pasar de ser algo, una persona llena de pasiones y miedos a nada en un instante. La muerte es un cambio tan fundamental que asusta y devasta. Es fácil entender porqué se crea el mito del alma, o el de los fantasma. Es fácil comprender que una historia tan absurda como Ciudad Permutación tenga sentido para alguien. Nunca olvidaré como escuché en la televisión a Ana María Matute rechazar fervientemente que no haya nada tras la muerte. Ella no podía aceptar que la mente, que es tan rica y compleja, simplemente se desvanezca en nada. El mismo razonamiento que en la novela mencionada antes. Pero, ay, es justo esa la realidad de lo que somos, pura evanescencia que se cree importante en un Universo ciego y azaroso.
Un año que me demostró lo mucho que puedo fallar. Lo mal que puedo llevar las circunstancias y lo débil que soy ante las dificultades. Lo mucho que me queda por aprender y madurar con mis casi cincuenta.
Acabo el año con afónico y con los bronquios algo afectados, lo que entiendo que es adecuado para un año tan malo. Y sí, he creado muchas cosillas durante este año, ya lo he contado. Pero es el momento de hacer autocrítica: queda claro que puedo escribir incluso en malas circunstancias y que puedo escribir rápido. Lo del #iftober fue una maravillosa locura, pero lo que hice realmente no fue un verdadero reto para mí, ya sé que puedo escribir rápido, incluso interactiva. La verdadera pregunta es si puedo escribir de verdad bien. Algo que de verdad deje una marca en alguien.
Así que mi propósito para este año 2019 es seguir, levantarme como un fénix y continuar intentando hacer al menos una cosa que os emocione y os deje temblando. Mi propósito será crear una única cosa ya sea literatura lineal o interactiva que sea realmente buena, algo que se quede ahí y me haga algo menos evanescente.

(Os he dejado arriba mi fénix favorito, Rachel Summers de Marvel, la versión de Romita Jr., tal vez su momento más alto y más bajo.La propia definición del fénix)
Categorías: Planeta

Un hombre bueno (0) - Tutorial I7

Hace 2 horas 36 mins
Aunque tengo ya un tutorial de Inform 7 (Huesos) y además tengo uno iniciado con mecánicas roleras (Acero)  me he dado cuenta al ver algunas preguntas básicas que me han hecho sobre I7 de que hace falta un tutorial mucho más detallado y sobre todo uno que contenga recomendaciones sobre lo que interesa hacer y lo que no.
Además siendo como soy un escritor casi puramente brújula (y permitiendo, como permite, I7 escribir como un escritor brújula) curiosamente os ofrecí una aproximación muy de escritor mapa en el tutorial de los Huesos. Lo hice para que se viese que partiendo del mismo material se pueden hacer cosas tan diferentes como una hiperficción y una ficción interactiva de parser.
Finalmente veo que, por fin, empiezan a verse entre los creadores de ficción interactiva en español piezas que se empiezan a alejar de la literatura de género, lo que me alegra. No me entendáis mal, soy un enamorado de la literatura de género (bueno, no del dinoporno, de eso no) pero me da rabia que se identifique la ficción interactiva sólo con historias de fantasía, terror o ciencia-ficción. Así que he decidido crear un tutorial con una historia que se aleje en lo posible de la literatura de género con la intención de demostrar que la FI también alcanza esos lares.
Así que hoy nace el Tutorial "Un hombre bueno" con un triple objetivo:
  1. Escribir un tutorial que explique no sólo como hacer una AC en I7, sino cómo hacerla bien, cómo estructurarla y dejarla lista para publicar.
  2. Mostrar cómo hacer de 'escritor brújula' en FI.
  3. Escribir una historia sobre un personaje que no sea un héroe.
Mi primer paso ha sido encontrar un nombre y una ilustración que me inspire una historia; y simplemente dando vueltas por la red me he topado con lo que veis arriba a la izquierda. Un viejo ofrece lo que parecen máscaras de teatro a una dama romana o griega y lo que parecen dos de sus sirvientas una adulta y una niña. ¿Será una actriz? ¿O es una cortesana que quiere decorar su apartamento? ¿O tal vez es una patricia que está organizando una fiesta? No tengo ni idea, vamos a irlo descubriendo a medida que se lo escribamos.
¿Por qué esa imagen? Primero porque una tiendecilla en una de las cajellas de una ciudad antigua parece un escenario ideal para una aventura de una única habitación (lo que es una categoría en sí misma en IF que incluso ha tenido sus propios concursos). Escoger la opción de una habitación fuerza a escribir en profundidad, haciendo que la acción no dependa de la exploración, que es uno de los aspectos de las ACs más gastados.

Lo primero que tendrás que hacer es instalarte Inform 7 y la librería de español.
De momento sólo sé que el título es 'Un hombre bueno', que estará en español y que su protagonista es un liberto romano llamado Lycurgus. ¿Como creamos un comienzo de obra que se correponda a eso?

Pues de esta forma:

Como se puede ver la primera línea indica el nombre de la obra, el autor y dice que estará en español. Y luego hemos puesto una sección de comentarios explicando la obra, su objetivo y su fecha de creación, todo lo cual puede ser muy útil para los que lleguen a esas fuentes en el futuro. Luego hemos añadido una sección de librerías (de momento no hemos puesto ninguna) y opciones (hemos indicado que siempre ponga todo el texto de la descripción de la localidad y que no use puntos).

Finalmente tenemos la sección del relato en sí mismo. Inform 7 permite estructurar el relato en partes, secciones y capítulos. Vamos a usar esta capacidad. De momento hemos creado una única parte con todo el modelo del mundo de la obra.  Dentro de esa parte hemos creado dos secciones: lugares y personajes. Y en cada sección crearemos un capítulo por cada sitio o personaje que incluyamos.

Sólo tenemos dos cosas: la tienda y el protagonista.

¡Bien, ya hemos empezado!


Categorías: Planeta

Todas mis entradas de la #iftober

Hace 2 horas 36 mins


Me ha parecido que había demasiado ficherillo en mi itchio, así que he creado una página agluntinadora y ahora tenéis en una única creación los quince minirelatos que cree para Héctor el Inquisidor durante la #iftober. Podéis encontrarlo aquí.
Categorías: Planeta

15 obras para la #iftober

Hace 2 horas 36 mins
Acabo de subir 'Reloj' (https://johan-paz.itch.io/2018-iftober-14-reloj) que completa el grupo de las 15 primeras obras para #IFTober (https://twitter.com/search?q=%23iftober&src=typd) y tal vez las únicas. Hay de todo un poco en este grupo de 15 obras: cosas son puzle y sin puzle, algunos con algún efecto montado en javascript, cortos y algo más largos. Pero todos tienen en común el uso exclusivo de texto con una apariencia muy simplificada de negro, blanco y rojo.

La historia de Héctor está más o menos situada en el universo de los Colonos de Tulgia (https://docs.google.com/document/d/1qFe0axQiXeeFQwhLrM7sL6OhpEvMqxLYDL32ghIxgzE), en el que también están situados mis tweet de este wordtober (https://twitter.com/search?q=%23wordtober1&src=typd) y estará situado 'La Torre y el Mar' (http://wiki.caad.es/La_torre_y_el_mar)

Ha sido agotador, y eso que muchas las he subido sin revisar ni una vez. Este ritmo es simplemente insostenible. En estos días he creado más miniobrillas que en todas las Sillyberrys (http://sillyberrys.net/).

Es posible escribir una IF improvisada en muy pocas horas usando Squiffy, Twine o Ink; pero es un ejercicio muy diferente hacerlo constantemente día tras día. Llega un momento en el que simplemente se te acaban las fuerzas. Es raro, porque es algo que no me pasa con la Nanowrimo.
Categorías: Planeta

Y de pronto, #iftober...

Hace 2 horas 36 mins
Por culpa de Eduardo ha empezado una locura más y me ha dado por apuntarme (como si no estuviese ya bastante pillado).
Intentar hacer una miniobrilla cada día durante un puñetero mes entero es simplemente un disparate, o, para estar en sintonía con la serie que voy a crear, un sindiós. Ya resultaba casi imposible mantener el ritmo en el caso de las Sillyberrys, pero esto es peor. Mucho peor.
Esto será como hacer la nanowrimo. Una nanowrimo en la que el relato se resista, se agite como un demonio siendo exorcizado, y muerda con cada descuido.
Locura total.
¡La Emperatriz nos guarde!

Categorías: Planeta

Mis planes tras la Rayuela

Hace 2 horas 36 mins

Ya casi ha terminado el plazo de presentación de obras de la Rayuela interactiva. Ya van más de diez obras presentadas, lo que está muy bien, aunque dado el número de inscritos espero que se alcancen más de veinte obras en las próximas horas.
Yo no he podido participar como quería, y como mucho me limitaré a subir una versión revisada de Ananké, con alguna mejora en cómo se ganan y pierden los puntos de 'adoración', para darle más dinamismo al juego.
He estado tentado —para ser sinceros sigo tentado— de crear una versión interactiva de un viejo relato no publicado llamado 'Por nuestro Señor' que va de relatividad en las religiones.  También he estado pensado en terminar la versión uno de mi 'Sillyberry' porno que va de rollo de demonios, llamada 'Lo hacemos porque os amamos' y subirla a itchio. Pero sería una participación enormemente precipitada, mala, puramente testimonial, por darme el gusto de haber incluido un texto interactivo a la Rayuela, así que lo verdaderamente lógico es pensar en qué voy a hacer en el futuro.
Tengo un relato bastante pensado para 'Actos de Fé' de Cerbero, pero no he escrito ni una palabra, así que creo será buena idea intentarlo. Conociéndome será algo como dos tardes de improvisar como un animal hasta las tres mil palabras, luego dos semanas de arrastrar los pies en la corrección y finalmente un arrebato absurdo de mandarlo en la que me dejaré un porrón de erratas.
Pero necesito pero YA ponerme a hacer una obra interactiva larga. Y la verdad es que tengo dudas, entre rehacer 'Apache' en Inform 7 y completarla, o hacer la obra que más me apetece pero que no creo que sea muy popular 'Sortilegios'.
Tal vez haga las dos cosas.
:)
Pero sin prisas.
Categorías: Planeta

Rayuela de Arena - 9 y 12 de Agosto

Hace 2 horas 36 mins
El jueves 9 preparé mi primera y, tal vez única, aportación a la Rayuela de Arena: Ananké, un juego print and play con mucha aleatoriedad y muchos dados, como a mí me gusta.
:)
He tenido más bien poco tiempo para probarlo, así que tan sólo espero que no esté demasiado desbalanceado. Lo que sí que tengo claro es que tiene una buena cantidad de color y 'cosas chulas', como decía Rubén hace tiempo. Así que, al menos, espero que sea divertido. ¡No os olvidéis de comentar aquí mismo vuestra experiencias con Ananké, que tengo mucha curiosidad!
Y ahora vamos con 'La Torre y el Mar'. Dadas las circunstancias médicas de mi madre ya me queda claro que no puedo implementarlo con Inform 7, así que hoy he decidido pasar el proyecto a Squiffy. Ya he traspasado textos y también he estado recopilando efectos sonoros adecuados.
Tal vez intente localizar efectos visuales para el fondo, pero no sé si me dará para tanto...
Y... ¡¡Suerte a todos los participantes!!
Categorías: Planeta

Rayuela de Arena - 7 de Agosto

Hace 2 horas 36 mins

La cosa va avanzando pero demasiado lento. Al final estoy teniendo mucho menos tiempo de lo esperado, pero al menos ya casi tengo la primera versión de 'Ananké', el Print and Play que dije que iba a presentar. Han quedado una reglas chulas, complejillas, pero fáciles de entender (espero) y creo que puede dar bastante juego.
Me falta terminar de maquetar y diseñar las fichas/cartas del juego, supongo que esta semana estará para subirlo. Así me olvidaré de él y podré intentar centrar mi cabeza en 'La torre y el mar', aunque... la verdad es que por alguna razón se me va el pensamiento en el relato que se me a ocurrido para esta convocatoria de Editorial Cerbero y al relato que he empezado a hacer con Gema Moratalla.
Categorías: Planeta

Rayuela de Arena - 2 de Agosto

Hace 2 horas 36 mins
Hoy no he tenido casi tiempo, así que ha sido sobre todo un día de reflexión y revisión. He estado seleccionando algunas imágenes para "Ananké", y viendo si queda mejor en forma de documento o de powerpoint. Normalmente hago un powerpoint para los Print and Play, pero no queda nada profesional, así que esta vez creo que haré un documento, como cuando Rubén me obligó a montar unas instrucciones independientes para "Kala". 
En cuanto a "La torre y el mar", he hecho algunas pruebas con Squiffy (sí, realmente lo voy  reescribir), porque tiene mucho componente de diálogo y en Inform 7 siempre me quedo insatisfecho con las conversaciones. No me gustó nada como quedó en El Anillo 3 el diálogo final por menús. En lo que hice de Berg al menos el menú tenía gracia, pero seguía por ser insatisfactorios. En el mundo anglo se usa mucho las conversaciones por 'tema', pero siempre me ha parecido que es una forma de elección 'ciega'. Incluso en Alabaster, que es de las mejores conversaciones que he visto por 'tema' en realidad queda regular.
Así que le he estado dando muchas, muchas vueltas; y muy cerca he estado de pasarme a Squiffy, pero las pruebas de hoy no me han convencido, quiero que el interlector tenga más libertad. Así que al final lo que he decidido es usar masivamente las librerías AKI y mezclar los 'temas' de conversación entre los diversos enlaces del texto disponible, y tal vez cree un comando '>> temas'.
Ya iremos viendo.
Categorías: Planeta

Rayuela de Arena - Inicio

Hace 2 horas 36 mins
Ya empieza la Jam de ficción interactiva de este año. De hecho dado el número de inscritos se puede decir que es la Comp de esta década, es más, con ochenta inscritos es sin duda la de mayor éxito de la historia desde el concurso de aventuras de MH, que tuvo cien participantes.
Sí señores ya empieza la Rayuela de Arena y si alguna vez habéis estado en esto de la narrativa interactiva no deberíais perdérosla, ya que la cosa promete marcar un antes y un después.
Sinceramente estoy muy sorprendido. Cuando Edu Sánchez apareció por euphoria diciendo que iba a crear una Jam que lo iba a petar, sinceramente no le creí. ¿Por qué iba a creerle? Yo mismo he organizado unas cuantas comps a lo largo de los años, incluso poniendo premios o dinero como acicate y el resultado ha sido reguleras. Nunca he logrado atraer a más de veintipocos inscritos y no sé si alguna vez hemos llegado a las diez obras participantes.
¡Así que congratulémonos!
Voy a preparar dos obras, como hice en la Jam del Mar: un juego P&P que he estado bosquejando estos días y si hay suerte subiré La torre y el mar. El juego P&P es porque me conozco y sé que en Agosto me entierro en partidas de rol del viejo Akaram y lo mismo... en fin, es para que al menos haya algo mío en este evento que espero que sea histórico. Os puedo adelantar el título 'Ananké'. En cuanto a "La torre y el mar", muchas han sido las cosas que han cambiado desde que la inicié, incluyendo la muerte de mi padre, así que básicamente la voy a reescribir por completo y además he decidido no hacer nada hasta hoy, el día de comienzo de la jam.
Es por una tontería romántica.
La verdad es que siempre he querido ser capaz de hacer esto. Sólo cuando cree desde cero en un fin de semana Pronto me acerqué a ello; y sin duda "Pronto" es mi obra más extraña y personal. Y necesito que "La torre y el mar" lo vuelva a ser. Y, claro, también envidio a Blue Lacuna en muchos otros aspectos, empezando por su sorprendentemente hermosa web (¿no veis, no sé, cierto parecido con mi blog?, pues ya sabéis), pasando por su longitud y terminando en el impacto que tuvo lo conseguido de su sistema de comandos de una palabra, que me hizo crear una librería a partir de la de Aaron y modificar Anillo 3 con ella.
Pero no nos engañemos, aunque empiezo mis vacaciones el viernes, sé que muchos días no tendré tiempo ni para sentarme aquí. Y la verdad, ahora mismo sufro un 'síndrome' (o una realidad) del impostor (parece que ni en 200 palabras soy capaz de detectar todos los gazapos), bastante chungo, así que... es más probable que no veáis esta vez tampoco "La torre y el mar".
No voy a hacer una web tan chula, ni grabar un video chulo como el de Blue Lacuna, pero al menos intentaré mantener un diario de mis avances en la Rayuela del Siglo en este blog.

Categorías: Planeta

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

Hace 2 horas 36 mins
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.
Categorías: Planeta

Midiendo la agencia

Hace 2 horas 36 mins
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:



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.410H = 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.410H =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.466H = 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'.



Categorías: Planeta

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

Hace 2 horas 36 mins
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.
Categorías: Planeta

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

Hace 2 horas 36 mins
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í.
Categorías: Planeta

(c)1998-2019 CAAD

Todos los contenidos de esta web son propiedad de CAAD. Las colaboraciones son propiedad de sus respectivos autores.