Por qué no tenemos un sistema de ítems aleatorios

 Hace unos días vi un video (no lo encuentro ahora) sobre el sistema implementado en Diablo para generar objetos completamente aleatorios. Una de las funcionalidades más interesantes del juego y sus clones. Viéndolo así, la idea parecía genial, y armado con la explicación me dispuse a adaptarla a mi proyecto. Sin embargo, no llegué a poner ni una línea.

Luego de analizar la idea, me di cuenta de que The Key of the World no había sido diseñado para eso. Su sistema de objetos apunta más bien hacia The Witcher. Si recuerdan, la saga del brujo no se caracteriza por su abundancia de ítems diferentes. Así, abusando de mi memoria, hay 4-5 espadas comunes, algunas espadas únicas, y lo mismo para las armaduras. En especial, lo que más complica nuestro caso, es que muchos objetos tienen descripciones hechas a la medida. Sí, puede ser una espada normalita, pero también puedes tener alguna por ahí con una descripción medio humorística. 

¿Podría implementarse un sistema de objetos construidos aleatoriamente? Pues sí, combinando ambas cosas en un sistema híbrido. Después de todo, Diablo no deja de tener ítems únicos. Esta opción no está completamente descartada. Pero... eso demanda una ampliación del sistema de salva/carga de partidas, y del sistema de objetos, en primer lugar. Luego vendría crear un generador de ítems, que no crean que es sencillo, ¡para nada!

Yo preferiría invertir ese tiempo en algo más útil, como mejorar el sistema con un nuevo enfoque que vi en un grupo de Unreal. Esta nueva solución arma los objetos a partir de bloques de funcionalidad, en vez de utilizar clases para cada tipo de objetos. ¿Quieres una poción que puedas arrojar? Pues le agregas un comportamiento Lanzar. Igual, se requiere una reescritura casi completa del sistema actual y el tiempo no abunda.

Les recuerdo que el pre-alfa está disponible para descarga, prueben y dejen su opinión aquí o en itch.io. 

The Key of the World, primer prototipo de acceso público (al fin)

Disclaimer: esta es una versión muy pre alpha, que no he podido probar a fondo. Puede, o mejor dicho, les aseguro que contiene bugs y cosas incompletas. Pueden descargarlo de itch.io.

Como debo haber mencionado en algún momento, y si no lo hice, ahora lo hago, el arte está en proceso de reemplazo total. Se agradece cualquier donación que puedan hacer, porque el presupuesto inicial se ha invertido solo en los personajes del jugador y el equipamiento inicial.

Nuevo huracán

 Bien, nos ha tocado la lotería. Habíamos escapado en los años anteriores, pero la suerte no dura para siempre. Sobre todo en este país. He tenido la fortuna de sufrir unos daños no tan importantes, si los comparamos con los de otros vecinos, casi que ni siquiera califico como damnificado. Pero eso no quiere que no los tenga, y que el presupuesto necesario para recuperarme esté ahí a la mano. De hecho, no lo está, ni lo estará muy pronto, así que lo que queda es esperar por ayudas de amigos y por la bajada de los precios. 

En cuanto al proyecto, de momento llevo una semana sin electricidad y no se sabe cuándo se restablezca. Un árbol caído cortó mi cable, así que no creo que sea prioridad de la Empresa Eléctrica resolver eso. El artista 3d desapareció justo con el paso del ciclón, porque tuvo la mala suerte de irse a refugiar justo a una zona cercana al punto de entrada. Ahora mismo ese pueblo debe estar a oscuras, inaccesible e incomunicado. La buena noticia es que casi todo el trabajo de los personajes básicos está hecho. La mala: que el presupuesto no alcanza para más. Estoy valorando cómo hacer una campaña de donaciones para completar lo necesario para la siguiente tarea, que sería el rediseño de al menos una escena. 

Espero que la próxima vez pueda venir con mejores noticias, pero no les garantizo nada. 

¡Cada día menos corriente!

 Creo que no es noticia para nadie la situación del país. Lo único que crece son los apagones: ya se ha regularizado un calendario de 10-12 horas seguidas, con 3-4 de electricidad, y eso, por tratarse de una ciudad importante. Hay lugares donde lo normal es 20 o más. Por tanto, me he visto obligado a trabajar a la hora que sea. Ayer, o mejor dicho, hoy, tuve que levantarme a las 12 de la noche, dedicar una hora al proyecto y otra hora a estudiar O3DE. Lo malo de esto es la irregularidad. Dormir de día y trabajar de noche es algo normal, no lo adecuado, pero se sobrelleva. Sin embargo, dormir cuando se pueda y trabajar lo mismo a las 11 de la noche que a las 5 de la madrugada, eso ya te pasa factura, sobre todo a cierta edad.

El colmo de todo es que acabo de escribir una novela distópica ambientada en la Habana del futuro y me ha sido difícil imaginar un futuro peor que el presente. Y es que este país ya es una distopía.

Pero bueno, no caigamos en el nuevo deporte nacional: las lamentaciones.Buenas noticias, o casi, ya solo falta texturizar los nuevos modelos de personajes y su equipo. El environment art y el rediseño de los niveles tendrá que esperar a la próxima ronda de donaciones, porque el presupuesto no alcanza (ahora es cuando dan el paso al frente y ofrecen su apoyo monetario). Luego del cambio, habrá un beta más abierto... o eso espero.

 

Sí, estoy vivo

Largo tiempo sin venir por aquí, pero el problema es el tiempo. No precisamente que no alcance, sino que ahora, con la situación del país, nos sobra el tiempo. Es que en esencia, con 17-18 horas de apagón diarias, estamos forzados a una inactividad total. Encima de eso, la oficina donde trabajo no tenía internet, e incluso ahora la que tenemos ni es permanente, ni es buena.

Pero no voy a caer en la tentación de contarles el montón de desgracias que vivimos. Ya, de hecho, la gente no quiere visitar Cuba porque dicen que los de acá solo sabemos hablar de miseria y desgracias (supongo que es lo de esperar, cuando solo tienes miserias y desgracias). A pesar de todo, aún hay una pizca de buenas noticias y es que un par de amigos han donado al proyecto y estamos en fase de rehacer los personajes. Esta vez, buscando un look estilizado más cercano a la idea inicial. El trabajo debió terminarse en dos meses, pero se ha alargado un poco y realmente, no sé cuándo estará terminado. Lamentablemente, los fondos disponibles no alcanzan para más, es que ni siquiera alcanzaban para esa tarea y tuve que complementarlos con mis propios ahorros.

En el apartado técnico, Godot ha resultado problemático en algunos aspectos, casi todos relacionados con la navegación. He encontrado muy poca información sobre el tema, así que esos errores persisten, estropeando la jugabilidad y el movimiento por la escena. Pero es un poco tarde para cambiar de motor (la idea me ha pasado por la cabeza varias veces, y las malas influencias han estado ahí), así que toca seguir adelante.

De momento, tenemos un demo con casi dos horas de contenido, bastante feature complete (vean los videos en Youtube), aunque insuficiente para atraer a un publisher hasta que se arregle el asunto de la apariencia y la interfaz de usuario. No esperen un demo público a corto plazo, pero sí en cuatro o cinco meses. 

A la caza del bug

 Cualquier software de cierta complejidad tendrá bugs. Con suerte, serán fáciles de encontrar, el problema es que la suerte es inversamente proporcional a lo complejo que sea. Un juego, aún en estado de prototipo, es casi un plato de espaguetis: hay muchos subsistemas en acción a la vez.

He tenido que dedicar tres días a resolver un bug bastante escurridizo, que había pasado desapercibido porque es muy difícil desarrollar y probar a fondo a la vez. Como casi todo, se produjo cuando solucioné un problema. Puede parecer tonto, pero manejar el estado de muerte de un personaje es... muy jodido. El personaje debe desaparecer del mapa (si es un NPC) o finalizar el juego (si es el del jugador), pero no puede ser de golpe. Hay que ejecutar una animación, y en dependencia de si es un NPC, hay que guardar su estado para que no vuelva a aparecer cuando restaures la partida o regreses a esa escena y dejar algún botín o no. 

Había logrado que todo esto funcionara bien, excepto en un lugar crítico. La primera pelea del jugador es una batalla grupal. Por desgracia, para probarla hay que iniciar la partida desde el principio y jugar unos dos minutos. Tampoco es una pelea que puedas ganar, es una batalla de equipo donde un NPC carga el peso de casi todo el combate. Justo ahí estaba el problema. Todos los combates funcionaban bien, pero en esta pelea específica, de los tres NPCs, dos morían y dejaban de reaccionar, pero no desaparecían. El último en morir siempre funcionaba como debe ser. Lo cual llevaba a un segundo problema: tu NPC acompañante se quedaba bloqueado ahí. A pesar de que la quest se registraba como cumplida, el NPC no salía del combate y era imposible continuar el juego. 

¿Por qué nunca llegaba a completarse la animación de muerte, y por tanto, no se disparaba la desaparición? ¿Por qué el sistema funcionaba bien cuando peleaba contra un solo oponente, e incluso, contra dos? Me tomó tres noches de trabajo (digamos que siete u ocho horas) rastrear todas las posibles causas. Algo estaba interrumpiendo la animación de muerte, y encima, estaba devolviendo el NPC al estado combate, a pesar de estar marcado como muerto. ¿Era el AnimationTree? ¿Acaso los tres NPCs era una misma instancia de la escena o algo así?

Bien, el error no estaba ahí. Se trataba de un bug en la IA, que solo podía darse en ese caso específico, porque era una batalla de grupo. En concreto: la IA al entrar en combate puede llamar a los miembros de su grupo para que acudan a pelear, pero esto no estaba verificando si el NPC estaba muerto, solo si no estaba ya en el estado combate. Por tanto, apenas morían, los NPCs eran llamados otra vez a la batalla, devolviéndolos al estado combate. Aunque, al estar marcados como muertos, no podían hacer nada salvo estar ahí parados.

La solución óptima y que cortaría de raíz el problema es que la máquina de estados del personaje no cambie si ya está muerto, porque hay muchas otras formas en que el estado combate se activa: al recibir un ataque de cualquier tipo, por ejemplo. De todas formas, he rastreado muchas de esas vías de entrada y agregado verificaciones. 

Por esa razón es que los equipos de beta testing son tan grandes: veinte personas, por lo menos, muchas más para proyectos grandes. En el caso de este proyecto, dos beta testers han encontrado una buena parte de los errores, pero no todos. Como siempre les digo, la fase de pruebas es más complicada de lo que parece.

Estamos en pruebas

 El proyecto ha iniciado su segunda prueba, esta vez un poco más abierta. Y sí, he estado ausente por un buen tiempo. Más de lo normal. La situación del país empeora cada día que pasa y estamos viviendo en un mundo post-apocalíptico y distópico. Por tanto, no alcanza el tiempo para blogs: hay que dedicar cada minuto con electricidad a trabajar.

Luego de esta fase de pruebas estoy planeando una primera salida en itch.io, como una especie de crowdfunding o early access con menos pretensiones y compromisos. Así que nos veremos por allá.


De vuelta a Linux Mint

 Luego de una muy mala experiencia con Ubuntu 24.04, me he vuelto a Linux Mint. Esta vez, por suerte, Godot funciona bien, no hay fallos raros con el teclado y puedo programar sin problemas. He tenido que corregir montones de líneas de diálogos que en Ubuntu se tuvieron que quedar sin tildes ni ñ, lo cual ha sido un trabajo pesado y que seguramente está incompleto. También puedo reportar que O3DE funciona bastante bien.

Las únicas quejas hasta ahora son dos: el soporte de Cinnamon para Wayland todavía es experimental y Synaptic no tiene la opción Marcar todas las actualizaciones. En general, estaba trabajando más fuera de Wayland que dentro, porque muchas aplicaciones no lo soportan bien (OBS, por ejemplo, y algunas herramientas de O3DE), así que eso... como que no es tan crítico. Démosle un par de años para ponerse al día.

No es la primera ocasión en que uso Ubuntu, pero sí la primera en que la experiencia es tan mala. A cada rato saltaba una notificación de error, la configuración del teclado ha cambiado y no logré configurar un teclado inglés como siempre lo he hecho (como decía, adiós a caracteres españoles, a menos que usara AltGr y cosas así), por no hablar del proceso de instalación, que falló un montón de veces sin dar explicaciones. 

Vamos ahora a las malas noticias, que no tienen nada que ver con Linux. Hemos pasado a un régimen de 6-7 horas de electricidad al día. A veces, algunas de esas horas son durante la madrugada, lo que las hace imposibles de aprovechar. Es difícil llevar un horario preciso, o ni siquiera aproximado de cuándo tocan esas escasas horas. Por tanto, el trabajo se resiente mucho. A pesar de eso, he logrado corregir algunos señalamientos que se le hicieron a la primera demo cerrada. De momento, he tenido que reducir el ritmo de trabajo, por otros compromisos, así que no agregaré mucho contenido por ahora. También hay ciertos aspectos de Godot con los que no estoy muy conforme, sobre todo en rendimiento, por lo que considero que para futuros proyectos de más envergadura, tendrá que ser con otro motor.

Y ya que hablamos de motores, ¡he completado el cuarteto! Ya tengo un mínimo de conocimientos en Unity, Godot, Unreal y O3DE, que son los 4 que están un poquito más en boca de todos (que no en uso). Me faltarían Unigine y CryEngine, aunque el primero lo trabajé hace años, siendo el primer motor comercial con el que tuve contacto. En cuanto a CryEngine, parece que algunos miembros de su comunidad se están pasando a O3DE, por inconformidades que no me quedan muy claras.

Quizás en otro momento escriba un poco sobre las diferencias entre los cuatro motores.

Al fin, primer demo alcanzado

 Ayer completé una primera ronda de pruebas, rectificando y agregando contenido hasta donde fue posible. Con eso he alcanzado la hora y media de juego, distribuidas (no muy bien) a lo largo de tres escenarios con dos locaciones subordinadas adicionales. La introducción a la historia principal del juego está ahí, aunque podrían haber cambios, claro. O sea, al fin estamos listos para un demo cerrado.

El contenido actual incluye las susodichas escenas, casi 300 líneas de diálogo, unas trece misiones, cuarenta ítems, unas cuantas peleas (se agregarán algunas más, aparte de los dos puntos de respawn actuales) y mucho territorio por explorar. Sobre todo eso, les recomiendo explorar. El sistema de combate funciona, aunque estamos escasos de habilidades en ciertas clases, y estoy planificando un refactorizado. Hay una carencia relativamente importante: no es posible reparar los objetos todavía, pero a menos que abuses de ellos, deberían aguantar la hora y media de juego, en especial las armas, que son las que más uso reciben.

Durante los últimos tiempos, he ido chocando con pequeñas limitaciones de Godot. Se echa de menos un sistema de cinemáticas, aunque por ahora se ha ido supliendo eso. El sistema de navegación es, por decirlo de forma amable, una mierda. He tenido que mantener la complejidad de la escena bajo control, porque en cierta ocasión, encontré crasheos del motor al calcular una malla muy extensa. La búsqueda de caminos puede devolver resultados jodidamente ridículos, lamentablemente tendremos que apechugar con eso, porque es lo que hay. Con el nuevo kitbash, el rendimiento se ha ido al carajo, aún cuando ahora tenemos menos polígonos por cada edificio. Godot sigue reportando entre 2 y 3 millones de primitivas en la escena, o varios miles de primitivas en objetos que solo tienen 300 polígonos, no queda claro de dónde saca esa información, o qué entiende Godot por "primitiva". 

Ya veremos qué nos dicen los primeros afortunados (o desgraciados) que prueben el demo.

Más pruebas con O3DE


 Otro video de O3DE. Esta vez reimplemento un sistema traído desde las lejanas tierras de Godot, para ocultar el techo al entrar en las casas y así poder explorar el interior sin problemas.

Reporte de avance

De vuelta con otro reporte de progresos, aunque en realidad no ha sido gran cosa. Mayormente mi trabajo ahora consiste en agregar contenido, y algún que otro bugfix. Al fin se ha integrado al proyecto un primer kitbash para las casas de dos de las escenas. En algún momento debe llegar un segundo. Justamente eso es lo que me está atrasando ahora: el trabajo de rehacer casi todas las edificaciones  suele tomarme muchísimo tiempo. A pesar de que estoy dedicando casi tres horas diarias al trabajo, si los apagones lo permiten, no he conseguido todo el avance que quería para la presentación el día 23.

En cuanto a eso, si estás por la Habana en esa fecha, habrá un encuentro con jugadores en el Joven Club de Plaza. No sé si habrá equipamiento que cumpla los requisitos del juego, pero si lo hay, será posible verlo en acción.

Ahora, vayamos a otra cosa. En concreto, a otro culpable del atraso. En esta semana o la próxima debería salir O3DE 24.09 y he logrado probar el preview en Linux. Ha sido un proceso accidentado, pero de nuevo estoy poniéndome al día con el motor, e incluso hice un reporte de bug. El mes dedicado a estudiar Blueprint me ha servido de base para entender mejor el Script Canvas. Hay grandes diferencias: Script Canvas es orientado a eventos, los get/set están dentro de la línea de ejecución mientras que en BP basta que algún nodo las use, en BP necesitas un Sequence para ejecutar una secuencia de instrucciones y en SC puedes, desde cualquier nodo, conectar hilos de ejecución con varios nodos más, y otras que de momento, no he identificado. Sin embargo, conocer BP me ha abierto un poco la mente a esta forma de programar, y probablemente si hubiera dedicado más tiempo a SC, habría entendido BP mejor desde el principio.


 

Pero volviendo al tema, O3DE ya está casi listo para producción. De hecho, hay varios equipos haciendo cosas comerciales y ha ganado cierto renombre en aplicaciones de robótica. La versión 24.09, tal como esperaba, va a marcar un punto de inflexión, de ahora en adelante marchamos hacia la madurez del motor. Cabe esperar optimización, mejoras de estabilidad, usabilidad y el completamiento de funcionalidades como un sistema de partículas libre (desarrollado por Huawei). Todavía no lo veo como indie friendly, pero para un equipo con varios ingenieros capaces, las posibilidades de personalización de los flujos de trabajo son interesantes.

En cuanto regrese del viaje, pienso dedicar algo de tiempo a dominar Script Canvas y sacar algunos videos cortos con casos de uso básicos, de esos que ayudan más cuando uno está en pañales.

Vuelven las pruebas con O3DE

Con el 24.09 a las puertas, he dedicado algo de mi escaso tiempo a O3DE. La comunidad ha mejorado y esta vez he tenido ayuda invaluable de otros.