Cierra Runic Games

Me entero con unos días de atraso que Runic Games, el estudio creador de esa joyita que fue Torchlight, ha tenido que cerrar. Lamentable, pero considerando que Runic Games produjo muy pocos títulos durante sus nueve años, era de esperarse. Por mi parte, solo llegué a conocer Torchlight 1 y 2, pero veo en las noticias que también lanzaron Hob, una especie de aventura con puzzles.
Solo queda esperar que sus empleados continúen en la industria, y desearles suerte.

Sistema de IA básico terminado

En los últimos días parece que no tengo otro tema. De hecho, me duermo pensando en esto, y entre IA y Divinity, mi sueño es bastante incómodo. Pero el resultado es que el sistema de inteligencia artificial funciona bastante bien a nivel básico. O sea, que como prueba de concepto está bien, y ahora es que las cosas empiezan a  complicarse.
Para continuar, tengo que implementar un mini-sistema RPG: habilidades e items utilizables por las entidades, incluyendo al jugador; que aunque sea mini, no es trivial. De paso, eso me permitirá probar otro enfoque en la implementación de habilidades y objetos usando ScriptableObjects. Sí, otra obsesión reciente, quizás debería consultar un médico. Y ya que hablamos del tema, este video ofrece un buen punto de partida:

Al principio me pareció que no sacaría nada útil, pero resultó que estaba equivocado. Hay algunos trucos, como el de instanciar los ScriptableObjects que no sabía con exactitud cómo hacerlo, y el de usar Resource.LoadAll para cargar todos los ScriptableObjects de una carpeta.
El siguiente paso sería conseguir que los NPC utilicen sus habilidades (nada de optimizaciones por el momento) y objetos para derrotar al jugador. Luego, combate entre grupos. Y entonces, si todo lo anterior camina como debe y no he encontrado algún error garrafal, ir al punto de optimizar el combate, lo cual requiere un sistema de items mucho más completo y funcional, bonificadores y penalizadores, etc. Suficiente trabajo para un mes, creo.
No estoy seguro de que necesite corutinas en algún momento, aunque la idea me ha rondado por la cabeza un par de veces. Quizás no dentro de las acciones, pero sí en el StateManager, para no sobrecargar el juego cuando una entidad tenga más de una acción en su estado activo. Hay que tener en cuenta que ahora las acciones son simples, pero en el futuro se volverán mucho más complejas a medida que necesiten valorar factores diversos con vistas a hacer la IA más inteligente. Ojalá no se vuelvan necesarias.
Pensaba dar algunas conclusiones, pero creo que aún es demasiado prematuro y las dejaré para más adelante. Aún estoy a tiempo de toparme con algún problema insoluble que me haga descartar todo el trabajo.

Usando ScriptableObjects para IA

Hace unos meses el canal de Unity publicó una serie de videos, basados mayormente en esta conferencia:


Hasta hace poco no había tenido tiempo de estudiar los tutoriales y comenzar a adaptar el código, o incluso decidir si era mejor que mi anterior intento. Y recién hace dos días fue que pude mirar un poco más lo que había hecho y cambiar algunas cosas.
En esencia, el sistema me parece bastante bueno. Por lo menos resuelve el problema de la modularidad de la IA, algo que no había logrado resolver en mi aproximación anterior. Confieso que últimamente he dudado de los ScriptableObjects, pero creo que en este caso sí son muy útiles. Para un RPG, poder definir comportamientos específicos para cada entidad es esencial. Por ejemplo, un mago no pelea de la misma forma que un guerrero de largo alcance, que a su vez es muy distinto a un guerrero cuerpo a cuerpo, y así sucesivamente, según las clases o el equipo de cada NPC.
Los tutoriales muestran de forma relativamente sencilla cómo armar una máquina de estados usando ScriptableObjects y cómo solucionar el problema que se deriva de que éstos guardan la información entre corridas. Pero además, la conferencia abunda un poco más en otros trucos que podemos hacer con ScriptableObjects, usándolos como enums, por mencionar uno.
Yo recomiendo ver la conferencia primero y luego los tutoriales, si estás buscando una guía para desarrollar tu propia inteligencia artificial. Y ya que hablamos del tema, tengo que decir que la IA de Divinity: Original Sin 2 es genial. Me encanta cómo los NPCs encuentran siempre la mejor forma de fastidiarte, buscando lugares elevados, lanzando a tus compañeros en el fuego, etc. La verdad, no recuerdo haber visto un sistema tan avanzado de combate.

Divinity: Original Sin 2 no es de mundo abierto

Un poco decepcionante, la verdad, aunque hay que admitir que no está tan mal. Luego de varios días uno se percata de que este RPG en realidad no es de mundo abierto, sino más bien lineal. Me recuerda un poco The Witcher 2, donde tenías que ir de ubicación en ubicación y resolver todo antes de pasar a la siguiente. Lo que se queda atrás se pierde.
Las ventajas de este enfoque son que la línea temporal de la historia es más fácil de controlar, y la trama en sí es más simple. No hay tantas bifurcaciones, salvo las que se desprenden de las decisiones del jugador. En un mundo abierto no hay mucho orden, un jugador puede ir primero a un lugar y luego a otro, y otras personas podrían hacerlo a la inversa. Todo un reguero.
Esta es una situación que he experimentado escribiendo mis intentos de guión para RPGs abiertos. ¿Cuándo se dispara un evento importante, por ejemplo, un mensaje para realizar una misión? ¿Y si el jugador nunca viene a determinado lugar? ¿Y si liquida a X NPC antes de que se le asigne la misión? Todas esas son preguntas a las que hay que darle solución (no respuesta, porque en principio, cualquier respuesta debería ser válida).
En fin, un dolor de cabeza que involucra a programadores y escritores. Lo cual me recuerda que aún no he logrado diseñar un sistema de gestión de misiones que valga la pena.

Otra reseña

Un breve post para avisar que me acaba de llegar otra reseña, esta es la primera fuera de Cuba. Tengo que agradecer a Marita, del blog Monalisa a los 40, por dedicar el tiempo y el esfuerzo para leerse el texto y darnos sus opiniones.

Documental sobre CDPRED/Unity 2017.2

Dos breves antes del fin de semana: si no han estado siguiendo la serie de documentales de Noclip sobre CDPRED/The Witcher, deberían hacerlo. Incluso Marcin Iwinski, uno de los fundadores de CD Projekt, es entrevistado (en el documental anterior dedicado a la primera entrega de la saga no aparecía), y los siguientes capítulos abarcan hasta la tercera parte del juego.
En mi opinión, un excelente material sobre la historia de esta compañía desarrolladora de videojuegos y su buque insignia, que no deben perderse. En serio. Hay algunas perlas de sabiduría perdidas por ahí si sabes prestar atención, como suele suceder cuando una docena de personas te hablan acerca de cómo construyeron algo.
Lo otro es que ayer salió Unity3d 2017.2. La lista de cambios solo trae algo interesante: soporte para tilemaps. Al fin, carajo. También hay que mencionar otra cosita como Cinemachine 2D. La lista de mejoras, por supuesto, es más grande, pero no vi nada que me resultara interesante o extremadamente necesario para mis proyectos actuales. Me da la impresión de que últimamente, los de Unity se centran en machacarnos con Cinemachine, como si tuviesen algún tipo de trastorno obsesivo con eso. Vale, macho, que ya sabemos que tienes Timeline y Cinemachine desde hace rato, no hace falta que en cada convención me expliques que puedo hacer una peli con eso.
Y completamente fuera del tema: ya tengo Divinitiy: Original Sin 2, y me lo estoy pasando en grande. Incluso estoy tratando de volver a los años 90, cuando no había internet (¿que sí había, dices? pues sería en tu país, porque aquí, ahora mismo en el 2017 no se puede decir con total seguridad que haya internet) y no mirar ningún walkthrough. Un RPG genial, de esos que solo se ven uno al año.  Pero supongo que si eres rolero no te estaré diciendo nada nuevo. Y si no lo eres... no te sientas triste. Es posible que haya algún hobby esperándote en el futuro para llenar esa vida tan vacía que llevas.

Jugar, cuando eres zurdo

No soy zurdo, por suerte. Pero un pequeño problema, que espero que sea temporal, me ha obligado desde hace varios meses a darle un poco de reposo a la mano derecha. Revisando un antiguo proyecto que uso para experimentar ideas, descubrí que, aparte de tener el código de la cámara isométrica desactualizado, no me había preocupado en verificar qué tan factible es jugar cuando tienes que manejar el mouse con la mano izquierda y desplazar la cámara con la derecha. Sobre todo, si no has implementado los controles adecuados del lado derecho del teclado.
Sí, era un código puesto a toda prisa, ni siquiera mi última versión  de la cámara isométrica. Ese es el problema de la accesibilidad: no nos percatamos de que falta hasta que nos afecta directamente. Es muy difícil valorar lo que necesita alguien que es zurdo, carece de una mano, no ve los colores o simplemente no ve nada, si nosotros mismos no sufrimos esas carencias.
En mi caso, ha sido necesario pasar varios meses volviéndome zurdo poco a poco incluso para descubrir el valor de jugar con un mando de Xbox y lo mucho que me faltaba por aprender a la hora de diseñar interfaces compatibles con mandos.
Por suerte, en este caso la solución es trivial y tampoco es que sea algo prioritario. Como les decía, es un proyecto de pruebas y con cambiar el mouse de lugar basta. Lo que sí trataré de tener esto en cuenta para proyectos más serios.

A partir de mañana se extiende el servicio de Internet en Cuba

Quizás no podamos decir que el 29 de septiembre es el día que arrancó el servicio de Internet en los hogares cubanos, porque el mismo ha estado dando vueltas de una forma u otra (pruebas piloto, comercialización limitada), pero sí es una fecha significativa. A partir de mañana, 17 consejos populares (o barrios) en 7 municipios del país, podrán contratar Nauta Hogar, siempre y cuando dispongan ya de teléfono fijo en casa.
La oferta, esperada desde hace años, ha sido mejorada en base a las críticas de los participantes en la prueba piloto, pero aún así adolece de carencias y no está al alcance del bolsillo trabajador, a menos que aprendas a vivir sin comer y no te moleste andar desnudo y descalzo. La anterior oferta arrancaba en 128kbps a $10 CUC (pueden asumirlo como $10 USD), que fue casi de inmediato subida a 256kbps, siendo la siguiente velocidad 512 a $30 o $40, hasta llegar a 2mbps a $115 mensual. Ahora la velocidad mínima es 1mbps, algo un poco más decente y acorde con los requerimientos de la internet moderna, aunque no deja de ser insuficiente y que muy pronto será obsoleto.
El pago mensual cubre solo 30 horas, las horas adicionales se pagan a $1.50 CUC. Esto es algo que no ha cambiado, quizás porque las críticas se centraron en las velocidades de acceso, que era lo que más preocupaba a los usuarios normales. Para ellos, Internet es solo una vía de comunicación, algo así como un teléfono moderno, y una o dos horas al día les basta para un poco de chateo en Facebook o una conversación por Imo. Para el usuario avanzado, que utiliza la red como fuente de información, 30 horas son menos que nada.
Pero menos da un ladrillo, así que toca conformarse y criticar, a ver si la todopoderosa ETECSA mejora la oferta con más horas y menor precio. De momento, Santiago de Cuba se queda fuera, como siempre, pero como no tengo teléfono ni posibilidades de pagar el servicio, tampoco me apura que llegue.

Documental: La historia de The Witcher

Un poco tarde, pero no podía dejar de mencionar este genial documental sobre la historia del videojuego The Witcher, que abarca desde un primer proyecto cancelado, hasta la fallida versión para consolas. Todo ello narrado por los protagonistas de la historia, con arte conceptual y videos de los prototipos.En polaco, pero subtitulado en inglés.


ScriptableObjects

Los ScriptableObjects son unmecanismo de Unity que solemos descubrir más o menos a nivel medio. Son una forma de serializar y almacenar información, ya que las estrucutras de datos normales no guardan los valores que les pones en el editor o entre corridas del proyecto.
Casi todo el mundo empieza utilizando XML o JSON hasta que descubre los SriptableObjects. No voy a entrar en detalles técnicos, porque los tutoriales sobran por ahí. Mejor hablaré de cómo me ha ido con ellos.
Nuestra relación ha tenido altas y bajas, y probablemente las seguirá teniendo. XML fue mi primera opción para guardar definiciones de personajes, objetos y habilidades: es flexible y todos lo conocemos a fondo. En cambio, los ScriptableObjects son clases, por tanto tienen una estructura fija. Como ventaja, ofrecen que son más "naturales" para Unity: pueden ser asignados desde el editor y utilizados como cualquier otro asset. Otro detalle que puede causar problemas es que un ScriptableObject retiene los valores asignados. Por ejemplo, en mi caso tenía la definición de las habilidades en ScriptableObjects y me sucedía que cada vez que ejecutaba el juego, el jugador empezaba con unos valores raros en los niveles de cada una, en vez de inicializados a cero. Luego de romperme la cabeza durante un largo tiempo, descubrí que como estaba usando los objetos directamente, éstos retenían el valor de la última ejecución. Y no solo el asignado por el jugador, como los NPC también usaban la misma instancia del objeto, el reguero era épico.
O sea, que no deberías usar un ScriptableObject directamente, sino como base desde donde sacar información. O solo hacerlo en caso de que no cambies los valores.
Mi último experimento con ellos fue crear un sistema de items, donde cada definición de un item ocupa su propio asset. Como les decía, el item  puede ahora tener sus propias funciones, y también aprovechar la herencia, derivando de una clase padre BaseItem otras clases especializadas, como ItemWeapon.
Después de todo esto, si me preguntan qué opción es mejor, ScriptableObjects o XML/JSON, pues yo diría que cualquiera de las dos. Al final terminas haciendo lo mismo: instanciar objetos a partir de la información. Los ScriptableObjects son marginalmente superiores por ser assets, en mi opinión (que podría cambiar en el futuro y no debería ser tomada como verdad absoluta) y por ello los seguiré utilizando, pero no dudo que cualquier programador podría encontrar alternativas a esto usando XML/JSON. Lo recomendable es conocer ambos métodos.

Configuración de gráficos

Y como les decía ayer, dediqué un rato a jugar con al configuración gráfica del proyecto, más que nada para probar cosas y ver qué funciona. Unity por defecto trae varios niveles de calidad con un montón de parámetros, pero por supuesto, nadie los usa directamente. Lo más adecuado es ofrecer al jugador la posibilidad de ajustar a gusto cada parámetro, en vez de darle niveles predefinidos.
El gran problema aquí es que son una docena de cosas que se pueden cambiar, y quizás algunas no sean relevantes según el tipo de juego. Al respecto no he logrado encontrar información concreta, por lo que supongo que tendré que aplicar el método de ensayo y error.
Por lo pronto, los resultados que he obtenido son un poco confusos. En casa, la diferencia entre la calidad máxima y la mínima es de 20 cuadros por segundo o más. Sin embargo, en un hardware más limitado, no conseguí ganar en rendimiento ni siquiera con la calidad reducida. Lo cual es muy jodido, porque en esencia, la idea es que puedas tunear el juego en caso de que tu GPU sea una basura integrada de Intel.
Pero bueno, ensayo y error, a ver qué sucede. Otro detalle que necesito mejorar es la usabilidad, hay algunas cosas que deben ser cambiadas a checkboxes, en aras de ser más intuitivas, como el modo pantalla completa y las sombras. La razón por la que no lo hice desde el principio es bastante tonta: porque no sabía y no me molesté en intentarlo. Pero ya va siendo hora de estudiarlo, junto con los dropdown, que también pueden ser muy útiles en ciertas situaciones.

Y al fin, solución para el Unity 2017 y su raro problema offline

El Unity 2017.1 tiene un raro problema al trabajar en modo offline: en realidad, no funciona si estás totalmente desconectado. En la oficina, donde hay internet (aunque limitada), tengo que desconectar el cable, activar el modo offline, cerrar, y volver a abrir el editor, esta vez con el cable conectado. En casa, de ninguna manera.
Sin embargo, ayer un amigo me dio una solución que solucionó todos mis problemas, y valga la redundancia. El truco consiste en abrir una escena del proyecto desde el explorador de Windows, en vez de ejecutar el editor mediante el acceso directo. Ya he comprobado que funciona en casa y he logrado al fin pasarme por completo a la nueva versión, que trae algunas cosas que me interesaban. Por ejemplo, ya puedo descartar el Visual Studio 2017, pues el Monodevelop funciona (desde la 5.3, si no recuerdo mal, me daba problemas el autocompletado). Sí, algunos dicen que el VS es mucho mejor, pero yo siempre he preferido las herramientas simples y funcionales. Visual Studio 2017 es cualquier cosa menos simple.
Bajo el capó, la 2017.1 trae cosas interesantes como el .NET 4.6, que en definitiva, para mí es más importante que Cinemachina, que es lo que ha sido promocionado hasta el cansancio por la compañía.  Algunos problemitas raros persisten: por ejemplo, el build se cuelga si antes no he dejado que se precalcule la iluminación global, algo que descubrí en la versión anterior, y que una vez que has hallado la solución, es un asunto fácil de evitar. Así que de momento estoy muy alegre con mi nuevo Unity, hasta que suceda algún percance que me haga tirarme de los pelos.
Aprovechando  el entusiasmo, implementé casi completo el sistema de configuración de calidad, pero de eso les hablaré mañana... o quizás el lunes.

Divinity Original Sin 2, Larian da el paletazo

Leí ayer que Larian Studios ha conseguido vender 500k copias de Divinity Original Sin 2 en apenas cuatro días, toda una proeza (sin mencionar que alcanzaron los $500000 solicitados en su campaña en un lapso muy breve). Yo aún no he podido echarle mano al juego, ya saben que aquí estamos fuera de... todo, aunque sí pude probar un demo hace un tiempito. Un buen RPG, que prometía mucho, y por lo que veo, ha cumplido con creces.
Si aún no sabes de qué va el juego, pues aquí está el trailer para que te pongas al día:

Yo, como desarrollador, me alegro muchísimo de su éxito, y como jugador también. Espero que eso les garantice seguir en el negocio para que puedan darnos otros buenos títulos como este.