Pasando a Godot 3.3

 Al final hemos terminado dando un salto desde la 3.2 a la 3.3, pero supongo que eso ya lo sabían. Elcambio me ha afectado principalmente porque ahora necesito un SDK de Android superior y todos los cubanos hemos puesto el grito en el cielo. La verdad, los que no viven en Cuba no tienen ni idea de lo que cuesta hacerse con un SDK o NDK. Solo obtuve el de Windows, aunque ya tengo planes para descargar el de Linux también. 

La migración ha ido muy bien, aunque al principio le atribuí unos problemas que eran, por supuesto, culpa mía. Estoy en proceso de pulir El Laberinto del Saber (si estás en Cuba, puedes comprarlo aquí) para quizás, si todos los astros se alinean en una conjunción perfecta, poderlo poner en Google Play y quizás, solo quizás, también en GoG. O en cualquier otro lugar. 

También lo he utilizado para un nuevo proyecto 3D, pero aún no he avanzado lo suficiente como para poder formarme una opinión. En general, la rama 3.x no me convence más allá del 2D y mi experiencia, aunque limitada, está llena de problemas de rendimiento y diseño. Espero que en un par de meses ya esté halándome los pelos por la desesperación.

Haciendo el trabajo sucio: compilando las plantillas de exportación de Godot

 De momento no hay plantillas de exportación para Android de la rama master, porque básicamente es menos que alfa, aunque dicen que ya está cerca. Por eso, si quería hacer pruebas reales tenía que poner manos a la obra y crearlas yo. 

El proceso está documentado en la ayuda, por suerte, y en teoría no es difícil, solo trabajoso. Sin embargo, si estás en Cuba o cualquier otro país sujeto a un embargo estadounidense, la cosa se complica. Para empezar necesitaba un SDK de Android actualizado y solo pude conseguirlo para Windows. También el correspondiente NDK. Todo eso lo obtuve vía VPN, aunque al costo de mover mi entorno de desarrollo a Windows. Como les decía, si cuentas con una conexión rápida y sin restricciones, el proceso de compilación descarga todo lo necesario mientras te preparas un café, te tomas una cerveza o haces cualquier cosa de esas que involucre comida o bebida y que yo no puedo hacer (porque no tengo ni café, ni bebidas y de comida voy justo).

Sin entrar en detalles, porque todo está bastante claro en la documentación, y cuando digo todo, es todo, el proceso involucra múltiples compilaciones del motor, dos para cada arquitectura si quieres tener debug y release. En mi caso, me salté el debug y la arquitectura x86, lo cual redujo las compilaciones a las dos de ARM y la espera a más o menos una hora. No disponía en ese momento de mi propio build del editor de Godot para Windows, así que me había bajado un nightly build y enseguida logré exportar mi apk sin problemas. Hasta ahí los cuentos de hadas y el final feliz. Cuando probé el proyecto en el teléfono me dio una pantalla negra unos segundos antes de cerrarse. Sabía que podía pasar, pero uno tiene sus esperanzas a veces.

Las razones pueden ser muchas: que Godot 4 aún no corra en Android, que el renderizador Vulkan no sea compatible con mi teléfono, que mi teléfono no soporte Vulkan adecuadamente... hay para escoger.
No queda más que esperar unos meses a ver si llega el alfa, el renderizador secundario GL ES 3, y volver a probar. Lo que sí me queda claro es que a finales de año si ya alcanzamos una beta estaremos de suerte.

Dungeons and Honor, multiplayer hecho en Cuba

 Y además, indie, trabajo de un solo desarrollador. 


En estos días subiré otra partida. Les debo (y les deberé) el stream en vivo porque acá la velocidad de subida es más falsa que un dólar con la cara de Tutankamón y es insuficiente para esos lujos.

Reporte de progreso, devlog

 O como quieran llamarlo.

El master está más o menos usable según lo que quieras hacer. No recomiendo que intenten nada que tenga que ver con gráficos y creación de escenas, pero tirar líneas y ver si funcionan no los matará de una rabieta. Lo que he hecho en los últimos días es armar parte de la base del sistema RPG y probar números.
Casi todo el trabajo se lo han llevado los ítems. Es bastante básico y lo implementado hasta ahora es muy poco: las armas dañan, las armaduras protegen y cualquier objeto puede proveer algún tipo de bonificación por su uso. Armas y armaduras pueden equiparse, o en este caso, escudo, porque no tengo armaduras para probar. Lo de montar objetos sobre el personaje requiere un pulido a fondo, pero me sorprendió que me resultó muy fácil. La vez anterior me encontré todo tipo de problemas de escala y cometí errores enormes debido al desconocimiento. Ahora es posible crear objetos complejos, que incluyan, por ejemplo, un sistema de partículas, porque cada objeto es una escena. No estoy muy seguro de que esto funcione bien en un móvil de gama media baja, por eso no lo considero una funcionalidad definitiva.


 

Hice un pequeño experimento para crear una escena grande con carga progresiva por secciones. Nos preocupaba mucho el impacto que tendría en el rendimiento un escenario muy grande y complejo, pero en lo personal, me opongo a sacrificar el espacio y limitarnos a pequeñas salitas. Por tanto, me dediqué a comprobar qué tan factible sería particionar la escena. La prueba no salió mal: la carga era imperceptible (de nuevo, el resultado podría variar según el móvil), quizás porque los elementos de la escena ya estaban en memoria. El método que utilicé fue un poco burdo: instanciar las escenas cuando el jugador se aproxima a ellas, eliminarlas cuando el jugador se aleja, todo eso fuera del área visible. Quedan un montón de incógnitas (digamos, qué hacer con los NPCs de una sección al eliminarla), pero no quiero ni pensar en eso ahora.

El trabajoso asunto de los números

 Mientras nos llega Godot 4, he estado trabajando en la base del sistema RPG: objetos y habilidades. Ambas cosas requieren probar y afinar las fórmulas, que después tendrán que ser reajustadas cuando se implemente el combate real, y vuelta a reajustar cuando los jugadores las pongan a prueba. Pero ahora mismo, es solo la fase de sacar cuentas. O como dice un colega: el papeleo. He tratado de no enredar mucho porque mis matemáticas no son buenas y para que el jugador no tenga que echar números sin necesidad. En teoría, un punto invertido en cualquier atributo tendrá un efecto perceptible en los cálculos que incluyen dicho atributo. Un punto invertido en Fuerza, por ejemplo, produce varios puntos de daño adicional, en dependencia del arma.

Aún en un sistema RPG simple como el que estoy creando, el trabajo conlleva muchas pruebas y tiempo. En primer lugar tengo que descubrir qué es implementable con mi actual dominio del motor, que está muy lejos de un sistema como el de Diablo 2 o DOTA 2. Lo que he podido hacer hasta ahora es algo más simple: cuatro atributos, de los que derivan cosas como esquiva y precisión, y algunos bonificadores/penalizadores que pueden afectar esos atributos y las habilidades. Estas últimas también pueden afectar los atributos, o en caso de las pasivas, el daño de las armas y habilidades, estadísticas derivadas, o cualquier otra cosa que pueda crear por el camino. 

En estos días he logrado implementar los daños básicos (aunque solo he probado el de tipo normal) y una armadura que protege al objetivo. El siguiente paso es agregar un uso más realista introduciendo el temporizador de las acciones, en dependencia del cooldown del objeto o habilidad, y sincronizar eso con una animación. Por suerte, tengo un modelo con animaciones que puedo utilizar. 

Poniendo a prueba Godot 4

 Pretendía traer un video comparando Godot 4 antes y después de su optimización, pero en el momento de grabar las comparaciones me encontré con un problema: aún desactivando VSync el proyecto no pasaba de 60 cuadros. Lo atribuí a algún error en Godot, en definitiva ni siquiera estaba en fase alfa, miles de cosas no funcionan como debe ser. 

Hace dos días me dediqué a revisar la configuración del proyecto, buscando los cambios recién implementados. Noté que no había tocado la configuración multihilo, que por defecto viene a Single Thread. Al cambiarlo a Multi Thread el rendimiento se disparó, alcanzando los 90 FPS, con picos de más de 100, aunque lo normal es que varíe constantemente. El por qué de los saltos entre 80 y 120 FPS de un segundo para otro escapa a mi comprensión. He tomado prestado un modelo de otro proyecto, con alta calidad y texturas PBR, además he subido al máximo todas las opciones de calidad y GI, excepto FXAA porque afectaba la textura de la cota de malla (se volvía borrosa).


En caso de que piensen que 100 FPS con una escena casi vacía no es gran cosa, yo también pensé lo mismo, hasta que recordé que estoy usando los drivers libres, no los propietarios de AMD. Es lógico que el rendimiento no sea el máximo posible.

Hasta el domingo pasado, el master sigue (y seguirá) en un estado no apto para el trabajo. Ha sido corregido un problema que me molestaba: la serialización de las variables export, que nos e guardaban, y junto a eso, el detalle que no me permitía exportar un String porque el editor no dejaba modificar. Ahora ya puedo hacer ambas cosas. Persiste el error de indexado de diccionarios, es imposible usar la sintaxis [] para leer el valor de un miembro. En cambio, sí puedes usarla para escribir el valor. O sea:

a = dicc["miembro"]  #No funciona, hay que usar a=dicc.get("miembro")

dicc["miembro"]=valor  #sí funciona

Curioso. 

En otro orden de cosas, Juan Linietsky, uno de los fundadores de Godot y ahora mismo el desarrollador principal, afirma que su última gran tarea será la implementación del renderizador GL ES 3. Luego de eso seguirá involucrado, pero con cosas más sencillas. Pero que no cunda el pánico, que afirma que hay contribuyentes capacitados para hacerse cargo.


El tamaño (del lag) sí importa

 He vuelto a jugar Dota. No es que la vez anterior jugase mucho, porque casi todo el tiempo estaba en proceso de actualizar y con una conexión lenta es para morirse. No es que yo sea un gran fan, ni un jugador profesional, pero me divierte y de hecho, lo descubrí cuando aún era un mapa de Warcraft 3.
O sea, que no se las den de listillos conmigo, que yo estaba ahí cuando empezó.

 

Pero nada, como les decía, no soy un as jugando. A decir verdad, me dan unas buenas palizas, a menos que juegue con un equipo bueno contra otro malo. Tampoco me sé con exactitud los builds por héroe, yo tiro de lo primero que me apaezca en la tienda. Algo que no ayuda en nada es que si estás en Cuba ya partes con desventaja.
El primer día tenía una latencia más o menos aceptable, sobre los 100ms. Me lucí con el Sniper, en las partidas de aprendizaje.  Miren qué cosa más chula:

El segundo día ya las cosas no fueron tan fáciles en las partidas normales. Las regiones con mejor latencia no bajaban de 350 ms. Y  eso, lamentablemente, se siente. No llega a medio segundo, pero marca una diferencia sustancial. Es la diferencia entre acertar un toletazo con el Rey Mono y fallarlo (los fallé casi todos). Es la diferencia entre apartarte a tiempo y que te atizen en toda la cabeza. Sumen a eso mis errores de principiante contra gente que ya sabe jugar, con eso basta para evitar tenerme en el equipo porque soy la garantía de la derrota.
Es un mal que padecemos los cubanos. Incluso dentro de la red nacional, los pings a los nuevos VPS de ETECSA son de 300 o 400. No sé para qué carajo tenemos un cable de fibra de una punta a la otra del país. Con esa latencia es imposible crear un MMO al estilo de For Honor, o algo parecido. Nada de combates en tiempo real. Por eso, la próxima vez que te quejes de que tus 20 mbps y tu latencia de 90 ms, recuerda que aquí estamos mucho peor.

Si crees que tu lanzamiento ha sido terrible, mira el mío

 El jueves pasado me adelanté a mis planes y subí la versión de venta del juego a la plataforma Apklis, que si no lo sabes, es la tienda cubana de aplciaciones móviles (para Android, por supuesto). Tenía pensado lanzarla el viernes, pero decidí no esperar y ponerla con antelación a disposición  de algunos amigos. Pues ya es domingo y la aplicación aún no aparece a la venta. Por suerte, no anuncié de antemano la fecha de salida.

El caso es que Apklis se ha visto saturada por la salida de una aplicación que permite a los usuarios ver el estado de las ventas en la página de comercio electrónico. Han bastado 25 mil compras en pocos días para poner la plataforma de rodillas. La gente se queja de que paga por la app y no se descarga, o se descarga y no funciona, o recién están descubriendo que sus nombres de usuarios son inválidos por contener espacios y caracteres indebidos. Algo que no se advierte de forma bien visible en ningún lado, ni se valida cuando te registras.

Arreglados estamos si una plataforma de venta no logra manejar unos miles de transacciones diarias. 

Entonces, no me queda más que esperar a que la saturación disminuya con el tiempo, lo cual podría tomar un par de semanas. Es evidente que Apklis necesita una mejora en sus servidores urgentemente, y creo que con sus ingresos pueden permitírselo. Solamente de Comprando En Cuba, la apk de la discordia, deben haber ingresado unos $113 mil pesos, equivalentes a precio oficial a unos $4700 USD. Supongo que con eso algo se puede hacer.

Reporte de estado, Godot 4

 
Para que evitarles malestar a su cuerpo y malas noches a su familia, en este blog nos dedicamos a hacer de piloto de pruebas para software pre-pre alfa, como Godot 4. Así pueden aprender de mis experiencias (buenas o malas) y obrar en consecuencia. En realidad no pretendía involucrarme mucho con Godot 4 hasta dentro de un par de meses, pero tuve que hacer un alto en el trabajo de diseño y meterle mano al código. Me di cuenta de que no tenía idea de cómo implementar mi propuesta de sistema de habilidades, o sea, que corría el riesgo de cagarme fuera del cajón.

A ver, Anteriormente en Godot 4... La última vez que trabajé con la rama master se dañó irreparablemente una escena que me había costado hacer. El sistema de renderizado 3d fallaba bestialmente con modelos animados y ni siquiera conseguí comparar la mejora de rendimiento luego de las optimizaciones (aunque lo primero fue lo que me detuvo). Era muy difícil seguir los mensajes en el panel de salida porque estaba lleno de errores, aunque hay que reconocer que el editor no explotaba a menudo. Tampoco logré entenderme con la nueva sintaxis de export y había un error en el acceso a los índices de los diccionarios, o sea, que había que usar dicc.get("indice") en vez de dicc["indice"].

A día de hoy, el error de los diccionarios persiste, aunque se sabe la causa. El renderizado no lo he mirado a fondo, pero creo que se mantiene la deformación de los modelos. Me encontré un problema que explotaba el editor, pero al final logré descubrir que se debía a que estaba usando una función con parámetros en una clase hija cuando la función de igual nombre en la clase padre no los tenía. Esto es perfectamente válido en la programación orientada a objeto, así que podría ser un error en el intérprete de GDScript. Otro detalle raro es que no se puede exportar una variable de tipo String, o mejor dicho, puedes pero el editor no permite editar el valor. Fuera de eso, el editor es bastante estable y los errores que desbordaban el panel de salida se han ido. 

En fin, Godot 4 se mantiene en estado inusable para cosas serias y se mantendrá así por un período largo y difícil de determinar. El editor al fin está recibiendo cierta cantidad de trabajo, lo que a la larga implica mejoras, pero ahora mismo es una ruleta rusa. El renderizador secundario no aparece aún y se han dicho tantas cosas que ya no sé si será basado en GL ES 2 o 3. La última propuesta fue GL ES 3 para 3d y un renderizador GL ES 2 para 2d. El renderizador Vulkan está muy completo a nivel de funcionalidades y optimización, así que supongo que solo falta pulir fallos. Otras funcionalidades sufrirán cambios no anunciados, como Navigation3D que desapareció debido a una simplificación, ahora solo necesitamos las Regiones. Lo que sí espero es que no haya más cambios en la sintaxis de GDScript, por eso intenté algunas pruebas de concepto que no tenían nada que ver con interacción o gráficos y me fue bastante bien.

Dentro de un mes quizás les haga otro reporte, aunque no espero grandes cambios. Ojalá me equivoque.

La Pira, un éxito más para los videojuegos cubanos

 Con apenas cinco días de lanzado, La Pira ha alcanzado las 10 mil descargas y sigue subiendo. No tengo datos de las ventas reales, porque el juego se distribuye gratis con utiliza micropagos y ConWiro no ha revelado cifras de ingresos aún. Sin embargo, es lo más cercano a una historia de éxito entre los juegos cubanos.

Eso no quiere decir que el desarrollo de juegos se haya vuelto fácil de repente en nuestro país. Para nada. Simplemente hemos cambiado el nivel de dificultad de Very hard, con permadeath incluida, a Difícil. Los enemigos siguen haciendo el doble de daño con el doble de vida. Pero es, si no una luz al final del túnel, al menos una velita.

A diferencia de la "industria" editorial cubana, que se desliza apaciblemente hacia su muerte, el mercado de los videojuegos es el coto de caza de gente joven, o por lo menos, gente altamente calificada y que se mantiene al día con las últimas tecnologías. Hay otra mentalidad, que empuja a hacer más con lo poco que hay y obliga a cambiar a un país cuya consigna es el no cambio.

El mérito de ConWiro, o Nameless Studio, que es otro protagonista de una historia de éxito, ha sido abrir camino para los demás, en un mercado que históricamente ha accedido a los juegos gratis se rehúsa a pagar por juegos. Ahora hace falta que otros empiecen a ver los videojuegos como un negocio viable y no como un hobby del cual puedo sacar unos centavos, pero si no, pues no importa. Hay que pensar en rentabilidad. Hay que pensar "voy a dedicarme a esto para vivir".

El próximo paso natural, que creo demorará un poco, es una tienda de juegos para PC. Eso probablemente marque el inicio de una industria como tal del videojuego en Cuba. Incluso ya no parece tan loco pensar en un MMORPG cubano. Estas cosas requieren de más conectividad y mejor infrastructura para soportar e-commerce (sí, podía haber dicho comercio electrónico pero así suena más chulo). No nos queda otra que esperar y de momento, ir probando los límites.

Por esta razón es que no puedo estudiar

 Esta semana me he planteado un nuevo reto: estudiar matemáticas. Me he bajado las conferencias de Freya Holmer (que sugiero le eches una mirada si estás dispuesto a dedicarle varias horas), empezando por las de matemáticas básicas, para seguir con las de shaders. Como les decía, son varias horas cada una, pero muy bien explicadas, hasta yo las entiendo. 

El asunto es que aunque no voy mal, ya me ha golpeado el problema usual. Soy pésimo estudiante, porque tiendo a caer dormido en las clases (ostento el récord de haber dormido en más aulas de la Universidad de Oriente, incluso durante un examen) o disociarme y empezar a divagar. Empeizo a mirar los audífonos de Freya y pensar si una cosa de ese tamaño me molestaría en las orejas (odio los audífonos), o si serían de tan buena calidad que al fin no me molestarían tanto, luego me entretiene el gato de Freya, y así sucesivamente. Cuando vengo a caer en cuenta, me he quedado botado en la carretera. Me es muy difícil escuchar a las personas que intentan enseñarme y no por culpa de ellas, sino mía.

La ventaja es que ahora sí puedo virar para atrás y reiniciar desde donde perdí el hilo, gracias a eso algo se está pegando. He tratado de tomar notas para reforzar el aprendizaje, aunque sin muchas garantías de que funcione si no aplico todo lo que voy aprendiendo. 

Veremos si puedo completar el reto y sacar algo de beneficio.

Y así se ve el nuevo Laberinto del Saber

 Mi natural vagancia me impide escribir un largo post explicando los cambios y por qué deberían probar este juego en cuanto salga. ASí que ahí lo dejoÑ



Tutorial completo sobre juegos multijugador con Godot

Un post muy breve para recomendarles este tutorial (bastante largo) que cubre la creación de juegos multijugador con Godot. Lo mejor: con servidor dedicado, que otros muchos tutoriales no cubren el tema porque el asunto tiene sus cosas. En Godot hay que cumplir ciertos requisitos como tener los nodos con el mismo nombre para poder hacer un rpc de un lado a otro y etc.

Yo ayer volví a dedicarle veinte minutos y al fin logré implementar los primeros elementos del servidor. En concreto, conectar desde el cliente, solicitar un valor y recibirlo. Todo muy simple. Lo cual no quiere decir que ahora mismo tenga en planes ponerme a hacer un MMORPG, para nada nadísima. Aunque se han dado ciertas condiciones en Cuba, como por ejemplo que ya es posible rentar un VPS, el trabajo que requiere un MMORPG es bestial. No lo intenten en casa.