GLUPPOPS RUSH
Hace un tiempo ya me puse a hacer un port a Unity del primer juego que habíamos hecho hace años atrás con amigos. Decidí hacerlo también para seguir probando una framework en el que estoy trabajando. Le voy dedicando muy poco tiempo pero me gustan cómo van quedando los avances.
En primera refactoricé todo el código. No sólo porque el primer código estaba en ActionScript 3 sino porque al ser la primer experiencia que tuve con un juego de ese estilo hace más de 10 años, el código no era el mejor (de hecho era muy malo). Así que empecé reescribiendo todo siguiendo model-view-controller. La idea es desarrollar toda la lógica del juego directamente sin nada de visual, hacer los tests unitarios correspondientes, estresarlo bastante y luego empezar con la parte visual. De esa manera, si la lógica anda bien todos los issues “deberían” ser solamente de la parte visual, no? (mira para un costado).
Como toda esta lógica es algo que seguramente se pueda reutilizar en otros juegos del mismo estilo, decidí directamente hacerlo como parte del framework. Así que empecé desarrollando algo más genérico que pudiera reutilizar en cualquier tipo de juego del estilo 3 en línea.
Así que empecé creando lo que sería la representación de una celda:
Supuse que a esa celda también se le pueden poner diferentes tiles encima como si fueran modificadores para lograr diferentes tipos de comportamientos, como que cada tile pudiera tener una determinada cantidad de “veces” que hay que matchearlo para romperlo, o que no se pueda cambiar de posición, etc. Y leyendo diferentes tipos de documentaciones noté que lo llaman “tile”. No me convence del todo el nombre pero para seguir una especie de congruencia general decidí usarlo.
De más está decir que está sujeta a muchos cambios, pero como interfaz para dar el pie para esos cambios creo que es más que suficiente. Y por último, junto con el pack, hice lo que sería la matriz que va a contener cada una de las celdas. Aunque en realidad, mientras lo estaba pensando también me dí cuenta que quizás se pueda hacer un juego que no sea una matriz sino que tenga una forma completamente diferente. Así que en lugar de llamarlo matriz, le puse “graph”.
Empecé a hacer pruebas, y luego de un tiempo todos los tests se pusieron verdes y estaba listo para empezar con la lógica básica de juego. Las primeras pruebas me gustaron mucho para ser honesto.
Una de las cosas que más dolores de cabeza me dió (al momento de escribir esto), fue la reacción en cadena. Ese efecto que se produce al “poppear” una cantidad de celdas, generarse nuevas, y esas que se generan hacen match con las que ya estaban y vuelve a producirse una reacción. Como sabía que iba a necesitar hacer pruebas con eso, y también como suponía que quizás en algunos niveles iba a querer modificar las probabilidades, programé un ScriptableObject para poder crear diferentes versiones respecto de la cantidad de probabilidades que tiene cada color de salir.
De esa manera puedo poner en pantalla dos colores y probar mejor las reacciones, ya que así es más probable que las reacciones en cadena se den. Con ese tipo de cosa, encontré este gran problema:
Varias veces, luego de la reacción en cadena, empezaban a pasar cosas como esta. Revise varias veces la parte lógica pero noté que estaba bien e incluso, cuando ese error pasaba, la data interna decía que la grilla estaba bien, y mantenía su tamaño junto con los tiles correctos. Así que debía ser seguramente un problema visual nada más, o sea, de cómo estaba representando esa data. Revisando encontré que el problema era un diccionario que había hecho para asociar la data con la visual. Básicamente borraba los vínculos antes de que las animaciones se completen. Fin. Jeje. Arreglado eso, el efecto se fue.
Arreglado ese problema todo lo demás empezó a ser bastante más sencillo. Ahora sólo me queda empezar a definir para dónde quiero llevar el juego. No tengo en claro si quiero dejarle la misma mecánica o jugar con otra. Pero antes que eso, voy a empezar a programar a los Gluppops Especiales.
GLUTTON
Agregué el primer Gluppop especial: El Glutton. Básicamente la lógica es que cuando se activa se come a todos los que tiene arriba. En las pruebas de estrés vi algunos comportamientos bastante graciosos como un Glutton comiéndose a otro mientras este otro estaba comiendo. Me pareció bastante copado en general así que lo dejé. Luego de esto debería pensar en algunos efectos un poco mejores para estos Gluppops especiales ya que deberían ser muy POWER. Dejo una pequeña muestra.
CROSS
Agregué uno más de los Gluppops especiales. Este lo que hace es poppear a todos los Gluppops que estén en su misma fila y columna (horizontal y verticalmente). Agregándolo también descubrí un par de bugs en mi librería de eventos que pasaba cuando se disparaba un evento desde el mismo evento, o sea, que el listener de un evento hacía otro dispatch del mismo evento. Así que ya lo arreglé y agregué también sus respectivos tests unitarios para contemplarlo. Por otro lado otro bug que pude encontrar fue similar al Glutton: Qué pasa si un Cross poppea a otro Cross? Y lo que terminaba pasando es que cuando el segundo Cross pasaba por el mismo Gluppop ya estaba en null y… Sí… Null reference y se rompía todo.
Gracias a eso decidí cambiar de una vez lo que fue el primer prototipo inicial y moverme full a model-view-controller. Inicialmente sólo la parte de mi librería de XInLine es la que se encargaba de procesar todo como data, y los Gluppops eran parte de una vista. Ahora los Gluppops son completamente LA vista. Por otro lado también le puse un pequeño gráfico para indicar la parte de la grilla afectada.
Breve ejemplo del Cross:
Como había dicho también tuve este problemilla de si un Cross poppea otro Cross. En el juego original lo que pasaba es que se destruía, pero me pareció copado probar qué pasa si en lugar de eso lo activa.
GLUTTON (new)
Una vez terminado el Cross, con todo refactorizado para arreglar muchos problemas, refactoricé también el Glutton para adaptarlo a este nuevo sistemita.
COLOR BOMB
Tercer Gluppop agregado. Este lo que hace es conectar con todos los que son de su mismo color y explotarlos a todos. Básicamente limpia un color entero del board.
ISSUES
Creo que está bueno también poner una sección para nombrar los issues con los que me encontré por diferentes motivos. Así que los voy a listar y quizás a alguien le sirva.