2_an Hola! Así es, la versión 2 de monogatari fue hecha básicamente desde cero con grandes cambios en cómo funciona internamente pero manteniendo el funcionamiento externo lo más parecido posible a lo que era.
Puedes consultar la documentación de la versión 2 aquí aunque efectivamente, aún hay muchas cosas no documentadas.
Sobre los cambios
Empecemos por las razones de los cambios. Una restructura era necesaria por varias razones:
- Actualizar un juego en desarrollo a una nueva versión de Monogatari era una tarea dificil. Como anteriormente todas las modificaciones se hacian directo en los archivos principales (
index.html
, monogatari.js
) cada que estos cambiaban, la actualización se tenía que hacer de forma manual, cuidando no sobreescribir los cambios que ya se habían hecho y al mismo tiempo incorporandolos a la nueva versión. Era un proceso tedioso y que a futuro evitaba una actualización automática usando alguna herramienta.
- Mantener monogatari usando la estructura anterior se iba complicando cada que una nueva funcionalidad se agregaba. Un claro ejemplo de cómo la complejidad hubiera aumentado considerablemente de seguir así es que la última version estable (1.4.1) tenía un archivo
monogatari.js
con 2480 líneas de código y eso ya incluía básicamente todas las funcionalidades de lo que pasaba en el script. La versión 2 tiene un archivo base monogatari.js
de 3325 líneas de código y eso sin ninguna de la funcionalidad del script! Supongamos que sean unas 5 mil líneas ya juntando las otras funcionalidades, tener eso en un sólo archivo se vuelve una tarea complicada.
- La única forma de agregar funcionalidades o modificar algo era modificando monogatari en si. No había una forma fácil de agregar cosas que no involucrara meterte al código base lo que no permite que personas puedan compartir sus creaciones (librerias, funciones, etc.) fácilmente para que otros puedan usarlas.
- Todas las librerías externas antes estaban en su propio archivo (
typed.js
, polyfill.js
, particles.js
etc.). Esto abría la posibilidad de que un archivo faltara y algo dejara de funcionar y también aumentaba el número de archivos que se tenían que cargar al abrir la página y esto es malo para la velocidad de carga del juego.
La arquitectura de la versión 2 está diseñada para solucionar todos estos problemas.
Sobre /engine
Se decidio poner todos los archivos relacionados al "nucleo"/código base de monogatari en la carpeta /engine
. Efectivamente, estos archivos ya no son "legibles" porque modificar el nucleo ya no es lo que se debería hacer para agregar funcionalidad o cambiar cosas. Básicamente nada dentro de esta carpeta es algo que alguien necesite editar mas que para casos muy especificos y de uso avanzado.
Una breve descripción de cada carpeta:
/engine/core
: Aquí está la base de monogatari, esto es el engine en si
/engine/debug
: Brinda las librerías que usa monogatari para mostrarte errores "bonitos" y la puedes eliminar en cuanto tu juego este fuera de desarollo
/engine/electron
: Tiene los archivos de configuración necesarios por si quieres sacar tu juego como una aplicación de escritorio usando electron
/engine/error
: Tiene plantillas HTML de códigos de error para un servidor (404, 500 etc.)
/engine/nginx
: Tiene la configuración necesaria por si quieres "servir" tu juego usando un nginx, un servidor web. Para servidores apache, se usa el archivo .htaccess
que está en la carpeta principal.
De todo el /engine
los únicos archivos que son 100% necesarios son monogatari.js
y monogatari.css
que están en /engine/core
. Todos los demás pueden ser eliminados y no afectan en nada.
Sobre los archivos .map
, puedes leer más aquí: https://es.stackoverflow.com/questions/132809/para-que-sirven-los-archivos-js-map
Sobre los componentes
Efectivamente, la estructura del index.html
ahora se ve bastante diferente. Esto es porque monogatari ahora usa componentes autocontenidos principalmente.
Qué significa eso? El tema de los componentes es bastante extenso, si has usado algún otro framework como React, Angular o Vue es probable que estes familiarizado con el concepto pero si no, es más facil con un ejemplo.
Tomemos la pantalla de "Loading", esta pantalla es un componente. Tiene dos archivos que la definen, un index.js
que define su funcionalidad y el contenido que tiene en su interior así como un archivo index.css
que define su apariencia. Puedes ver ambos aquí: https://github.com/Monogatari/Monogatari/blob/develop/src/components/loading-screen/index.js
Si te adentras al index.js
verás que ahí mismo definimos el HTML de esta pantalla en una función render()
. También hay otras funciones que hacen que ese mismo HTML cambie cada que se carga un archivo.
Los componentes se dicen autocontenidos porque dentro de ellos tenemos todo lo que necesitan para funcionar, ahora ellos tienen esa responsabilidad y no monogatari como tal. Para usar un componente, basta con poner su tag HTML donde lo queremos. En el index.html
encontrarás que en alguna parte dice: <loading-screen></loading-screen>
esto simplemente pone el componente ahí y este se encarga del resto.
Tú y todos pueden crear sus propios componentes y lo que es mejor, los pueden compartir y lo único que se necesita para usarlos es incluir sus archivos en tu juego y poner su tag donde lo necesites. Puedes encontrar la lista entera de los componentes que monogatari ya trae consigo actualmente aquí: https://github.com/Monogatari/Monogatari/tree/develop/src/components
Sobre las acciones
Similar a los componentes, las acciones también se volvieron archivos separados. Una acción es la cosa que define qué pasa cuando monogatari lee algo en tu script como:
show scene <some_scene>
play music
wait
Cada una de estas "funciones" usa una acción que define qué pasa al correrla y cómo revertirla. Aquí puedes encontrar la lista entera de acciones disponibles actualmente: https://github.com/Monogatari/Monogatari/tree/develop/src/actions
Así como con los componentes, cualquiera puede crear una acción y otros pueden usarla facilmente al incluirla en sus juegos. También puedes modificar una acción de manera fácil ya que al ser clases, puden extenderse fácilmente.
En resumen
Monogatari cambió con el proposito de hacer el código más mantenible, modular y predecible. Espero esto te ayude de algo!
Qué otros recursos puedes consultar?