- pyphiverses -
Hacia la utopia interactiva

pyphiverses, pronunciado "pi-fi-verses" (ó "pa-if-ivers-es").

Nótese el uso de "fi" en la pronunciación española e "if" en la inglesa, siglas en cada lengua para "Ficción interactiva" e "Interactive Fiction" respectivamente.

Este peculiar nombre, intencionadamente rebuscado (e inédito, para facilitar la localización de información), está compuesto de los siguientes elementos, que definen, a grandes rasgos, la filosofia del proyecto.

py
De Python, el lenguaje de programación escogido.
p[i] (3.14159…) y phi (1.61803…)
Dos de los inabarcables numeros irracionales más representativos de la matemática y la naturaleza. La belleza de la estabilidad del círculo y la esfera y el número aúreo como generador de estructura.
phi
Representa una oración/frase en lógica de primer orden (o de predicados).
verse
Verso, insinuando la componente textual y lingüistica.
verses
Múltiples universos, multiverso.

Bienvenidos a los pyphiverses.

¡Hola! Soy dddddd, alias por el que la mayoria de vosotros me conoce en estos mundos de internet. Comunidades virtuales cómo el caad, del que fuí un integrante más en la primera época y con el que mantengo contacto en su nueva y renovada forma gracias a internet, más activo a cada momento.

Como casi todos los aficionados a la ficción interactiva (aventuras conversacionales, libro juegos…), no he podido resistir la tentación de crear mis propios relatos y universos. Otro hecho habitual, casi ley, es: una vez metidos el asunto, acabamos queriendo diseñar y desarrollar un parser, o motor de ficción interactiva, sobre todo si se tienen inquietudes en programación y sistemas informáticos.

Ésta es la propuesta que os traigo desde mi humilde experiencia, adquirida gracias a todos vosotros.

¿Qué es pyphiverses? Modelando el multiverso.

pyphiverses pretende ser el framework definitivo para la creación de todo tipo de ficciones interactivas. Software libre (GPL, versión por determinar), modular/extensible, moderno, internacionalizable, multiplataforma, multiparadigma, multimedia y, sobre todo, multi-multi colaborativo. (-;

Inspirado por otros sistemas de autoria, principalmente Aetheria Game Engine (AGE) y attoMOLEZak, Morgul, vuelvan!) pero también en MUnDo_CAAD, Superglús, Kenshira, Inform,… todos ellos motores y modelos de mundo, intentaremos sentar las bases de lo que será el siguiente nivel: el meta-motor multiuniverso.

¿Por qué otro nuevo sistema?

Para coger lo mejor de cada uno y servir de marco para la experimentación con nuevos tipos de parsers (IA, gramáticas complejas…) y modelos de mundo. También para crear un ámplio repositorio de elementos reutilizables.

Todo empezó con pAGEyna, como una broma en el dia de los santos inocentes, pero poco ha poco ha ido tomando forma y saliendo del subsuelo. La idea era crear un sistema compatible con Aetheria aprovechando el dinamismo de un lenguaje de programación como Python.

Después de un par de conversaciones en el canal #caad del IRC, leer antiguos documentos, logs y mesas redondas de varias jornadas aventureras y crear unos esbozos, lo más lógico parecia crear un sistema que permitiera la creación de universos personalizados, en base a un modelo de mundo extremadamente ligero, extensible y reutilizable, de forma que las molestias que causan las particularidades de otros sistemas y modelos de mundo no interfieran en el ambiente de cada obra.

Aetheria tiene una filosofia similar, pero la rigidez de Java™ (y, porque no decirlo, los [pre]juicios que algunos tenemos hacia ese lenguaje y sus "alrededores") no parecia encajar con nuestra idea. Dicho ésto, si Java™ (+API) es tu apuesta, no puedo dejar de promover la participación con ese proyecto, que pocos dias atrás ha alcanzado la versión 1.0 tras largos años de diseño y desarrollo. Es software libre (BSD) y hasta el momento ha sido un proyecto de una sola persona, Al-Khwarizmi, quién os recibirá con los brazos abiertos (aunque ha recibido apoyo y colaboración, especialmente por parte de jenesis, durante la creación de su más reciente obra, de inminente publicación).

attoMOLE se basa en una serie de ganchos (hooks). Domostró su potencia en attoPAWS. La definición de un conjunto de ganchos adecuados será una parte importante este proyecto.

MUnDo_CAAD es, como indica su nombre un MUD y como tal tiene características multijugador (como Aeheria) y de integración de elementos en caliente que conviene estudiar.

Superglús goza de buena salud, como demuestran las aventuras creadas últimamente, y recibe actualizaciones de cuando en cuando. Tras la última ampliación de la libreria base solo hay pequeños retoques, debido a lo maduro del sistema.

Kenshira parece más parado, pero tiene características únicas (AJAX, IDE remoto, cambios en caliente) que merecen ser tenidas en cuenta. Basado en Java™ también.

Inform, en todas sus variantes, es una de las plataformas más utilizadas y goza de buena salud y mejor soporte en la comunidad hispanohablante. Precisamente por ser tan utilizada es a la que más pegas se le han sacado, muchas veces por la complejidad para entender y modificar la inmensa libreria, o por el desconocimiento de la misma.

Quede claro que pyphiverses no pretende extinguir ninguno de estos sistemas, todo lo contrario, pretende subirse a hombros de gigantes y generar retroalimentación entre todos ellos. Tampoco la pequeña descripción que hemos hecho aquí de estos proyectos pretende ser rigurosa y exacta. Seguro que alguna de sus características más importantes se han quedado en el tintero. Siguiendo los enlaces obtendreis información detallada y os podréis poner en contacto con los desarrolladores y mantenedores respectivos.

¿Cúal es la arquitectura de pyphiverses?

La base para el sistema, sujeta a estudio y deliberación, se resume, más o menos, en el siguiente árbol de capas con relación jerárquica entre ellas. Reglas y eventos se definirán mediante plugins que formarán el repositorio. Un plugin puede ser inyectado en cualquier capa, incluso en más de una. El multiverso es la raiz principal, valga la redundancia.

Multiverso
 Universos
  Épocas
   Mundos
    Submundos
     Áreas
El multiverso

Proporcionará todo lo que consideremos que ha de ser común a todo el sistema. Funcionalidades cómo la creación de parsers, clusters, recepción de usuarios (cliente/servidor), intercomunicación "fina" entre universos, etc…. Contiene todas las capas con los plugins que existan listos para cargarse y dar vida a un mundo, a una ficción interactiva concreta.

Los parsers (un tipo más de plugin) más generales podrán ir aquí, aunque en determinadas situaciones pueden tener sentido en otra capa (un parser para comunicarse con un tipo de robot determinado en una "epoca", o en el mismo "ente" robot, por ejemplo).

Aquí se tendrá la última oportunidad de manejar los eventos/acciones, siempre que ninguna entidad (de las situadas en la "cadena") haya cancelado su distribución. Este sistema de eventos tiene pintar de plantear dificultades de implementación y es posible que haya buscar un equilibrio entre complejidad, generalidad y facilidad de uso. Twisted es maduro y tiene una arquitectura realmente potente. Estando enfocado a la comunicación en red no sabemos si se acoplará limpiamente, aunque tiene que existir la forma.

Universos
Aquí residirá la lógica de cada tipo de universo y la parte más general del "modelo de mundo". Se pretende que sean lo más ligeros posibles, y que los detalles se implementen en el resto de las capas.
Épocas/Situaciones de universo
Se definirán diferentes marcos sobre el que crear mundos. Un ejemplo seria la época medieval, con sus leyes y tecnología propias.
Mundos
La equivalencia es el juego, la obra, el mundo en el que se va a desarrollar una determinada ficción.
Submundos/Situaciones de mundo
Similar a "Épocas" pero referente a un mundo, en vez de sobre un universo. Un ejemplo seria la Tierra tras el impacto de un grán meteorito o un pueblo al que repentinamente la desaparición del turismo cambia sus hábitos de vida.
Áreas
Como se explicó hace un momento, es otra unidad más de encapsulación de reglas, por ejemplo áreas de neblina (visibilidad de objetos), paises (leyes), cárceles o conventos (restricción de posesiones y movimiento), etc…

Se puede apreciar que los mundos tienen el papel central, con dos capas de generalización y dos de especialización, por encima y debajo respectivamente. Se intuye que estas capas son de una misma clase concreta.

Los tipos de entidades, capaces de interactuar con el mundo se plantean asi:

Localizaciones
 Entes
 Objetos
Localizaciones
La equivalencia con la mayoria de los sistemas actuales es la localidad o habitación, pero se pretende que el movimiento no esté limitado a los puntos cardinales (que en ciertas ocasiones no tendrá sentido) ni se reduzcan a lugares cerrados.
Entes
Todo personaje, jugador o no, capaz de comunicarse y actuar es un ente. Podrá tener características o habilidades concretas (necesarias, entre otros, para mundos "roleros"), generará eventos que podrán provocar cambios en el mundo y, en definitiva, darán dinamismo a la ficción.
Objetos
Por decirlo de alguna manera son un tipo particular de entes, de capacidades más limitadas, pero también capaces de interactuar. Desde una piedra, hasta una máquina expendedora, pasando por mobiliario, etc…. La linea que separa una entidad de un objeto no está totalmente definida.

La clase base es la entidad que proporcionará las características comunes. Varias de estas características son ya apreciables en la descripción de los tres tipos.

La entidad podría usarse como las entidades abstractas de Aetheria, aunque en la implementación puede que no aparezca tal nombre, ya que parece anti-intuitivo tener algo abstracto que no sea clase "básica" (en el sentido POO) del sistema. Recomiendo encarecidamente la lectura de la documentación de Aetheria para entender para qué sirve una clase abstracta allá, ya que pueden servir para implementar capítulos, guiones y otros ingeniosos métodos de control del mundo y la historia que acontece en él. Hemos visto que, aparentemente, en Aetheria no hay una justificación que impida que la funcionalidad de la AbstractEntity pase a la clase Entity.

Esta terminologia nos servirá de base para la discusión y podrá cambiarse si encontramos mejores definiciones y estructuras, cosa que ocurrirá porque hayaremos pegas. Eso sí… idealmente, no debemos perder de vista la idea raiz, ni marearnos en discusiones sobre la terminologia, aunque es importante que todos hablemos de lo mismo.

Lo crucial es definir una arquitectura flexible.

Se planea el uso de ganchos, relaciones, eventos, eventos de acción (con antes y despues), parseCommands y amigos, código ejecutable en todos los "objetos", PyQt, IDEs… pero dejaremos los detalles para la siguiente ocasión, en la que concretaremos la idea de implementación.

¿En qué estado se encuentra el proyecto?

Nos encontramos en la fase de definición de requisitos y diseño de arquitectura. Se trabaja sobre una especie de prototipo muy básico que nos sirve para realizar pruebas de concepto, y que poco a poco irá tomando forma.

Por el momento existe disposición de colaborar por parte de presi y Eliuk Blau, además de la de un servidor, y contamos con la asistencia de Al-Khwarizmi. Todos nosotros, obviamente, en función al tiempo que nos dejen nuestras obligaciones.

¿Puedo colaborar? ¿Cómo?

¡Por supuesto!, toda sugerencia o crítica constructiva es bienvenida. Me consta que a más de uno la idea le parecerá interesante…

Se pone a disposición de todos un hilo en el foro del caad para que todas las ideas y referencias bibliográficas importantes que tengais que aportar sobre esta propuesta inicial puedan ser expresadas y compartidas. No buscamos solamente colaboración en ingenieria de software, estamos interesados en oir vuestras experiencias en distintos ámbitos, desde libro-juegos, rol de mesa, rol monojugador computerizado, MUDs, MMORPGs, lenguajes naturales, diseño gráfico (tengo una propuesta de logotipo por aquí) y de interfaz, inteligencia artificial, simulación, etc, etc, etc… Como veis, el abanico es muy ámplio y la colaboración interdisciplinar absolutamente necesaria.

Gracias por llegar hasta acá.

¡Os esperamos!
dddddd.-