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.

No te quejes de Cyberpunk 2077

 Ayer implementé los últimos detalles de jugabilidad del Laberinto, así que el demo está, técnicamente, completo. He hablado acerca del largo y pesado proceso de pulido, pero nada acerca del trabajo con beta testers. Si eres indie, al final mucho de este trabajo recaerá sobre ti.  

Lo explicaré de una forma simple y sencilla. De una docena de beta testers voluntarios, solo dos o tres reportarán algo. El resto nunca reportará nada, quizás porque no jugaron lo suficiente, o porque ni siqueira probaron el juego. Esos dos o tres reportarán los errores más graves que no lograste ver tú, lo cual no deja de ser útil. Sin embargo, es poco probable que pasen de ahí. No conseguirás que en una segunda ronda de pruebas te informen de más problemas. Debe ser que ya están aburridos del juego, así que es razonable que ya no rindan tanto. No puedes pedirle más a un voluntario.

Por eso, ayer cuando terminé de programar, tuve que hacer una corrida de prueba, donde me percaté de un montón de detalles de jugabilidad que se habían pasado por alto. Volví a Godot a retocar todas las escenas, e incluso me planteé retrasar la salida del demo. Y yo solo tengo ocho escenas. Pero el proceso de balanceo de la jugabilidad tiene lo suyo. Sospecho que tendré que darle otra pasada al juego completo para ver si alcanza el nivel de dificultad que pretendo.

Así que ya pueden imaginarse a CD Projekt haciendo lo mismo con Cyberpunk 2077. Cientos de diálogos que probar, cientos de misiones, una ciudad gigantesca. Sí, van a  decirme que para eso le pagan a un montón de beta testers, pero ni así. Esto es algo que hay que vivirlo para entenderlo.

Ah, y acaba de escribirme la artista para recordarme unos botones que no coinciden con la estética del juego. En fin, que sí tendré que atrasar la salida hasta la semana próxima. Espero que los jugadores no se sientan decepcionados.

El reto de los dos días, en video

 Un breve video del prototipo de prueba que hice la semana pasada. Aparte de lo que implementé en esas dos noches de trabajo, agregué zoom y rotación de la cámara. Sin embargo, la rotación probó no ser una buena idea, porque requiere ciertos cálculos adicionales. Al girar la cámara, la orientación del pivote no coincide con la del personaje y causa que cuando te mueves hacia arriba, el personaje se desplaza hacia abajo. Soluble, pero completamente fuera de la idea.



Historia de los juegos hechos en Cuba

 Me he tomado más de lo que esperaba (dos o tres meses más), pero ya está concluido y estrenado en Youtube:


El audio no es el mejor, porque mis condiciones de grabación no son nada buenas, pero creo que se entiende.

Reto de ayer: clon de Diablo Immortal

 Hay días que uno amanece creativo. Como que se te sale el pájaro que todos llevamos por dentro. Luego de ver el gameplay de Diablo Immortal, hasta yo, que no soy fan de jugar en el teléfono (eso se lo dejo a mi hija) quise probar algo parecido. Y una conversación en el grupo de desarrolladores cubanos en Telegram me hizo preguntarme qué tan rápido podía hacer un prototipo, usando Godot.


 

 La respuesta es un par de horas. Tengan en cuenta que es algo que no había hecho nunca, ya que no es lo mismo que hacer una cámara isométrica. En este caso, la cámara sigue al jugador, y el control de movimiento se hace mediante un botón en la pantalla. En esas dos horas logré implementar movimiento del personaje y animación, solo me falta orientar el modelo en la dirección del movimiento. 

De paso, hice un pequeño experimento de rendimiento. El proyecto, con sombras activadas, corre a unos 52-53 cuadros por segundo en mi Redmi Note 7 y usa GL ES 3. También tuve un extraño bug cuando agregué la configuración de iluminación recomendada para exteriores, que resolví creando el Environment desde cero y cambiando solo el tonemap. Aún tendré que experimentar un poco más con eso a ver los valores correctos.