Bomb Jack GX

Lancé esto EXACTAMENTE al mismo tiempo que cayeron los servidores de CPCWiki, así que nunca pude hablar sobre los detalles técnicos. El código usa una sincronización muy precisa (exact timing), por lo que, una vez más, sin querer creé una prueba para emuladores, como me voy dando cuenta cuando la gente publica videos donde no se ve bien…

Quité los modos de «Extra Sugar» porque todos esos marcadores y logros estaban diseñados para un sistema basado en disco que guardara tu progreso. Así que pensé en configurarlo para que se jugara como el juego de arcade y simplemente tener una sola tabla de puntuaciones para mantenerlo simple en un cartucho.

Poco antes de terminar el juego, se le añadió al PicoGX la capacidad de leer y escribir en la tarjeta SD, así que agregué el guardado de puntuaciones altas a último momento. Creo que habría sido el primer juego en usar esta función si el mod de Bloodwych no se me hubiera adelantado. Así que tal vez podría considerar volver a incluir el contenido de Extra Sugar, pero tendría que rediseñar todos los fondos nuevos que hice para Extra Sugar, que solo existen en 4 colores. Y para ser sincero, no mucha gente ha descargado Bomb Jack GX en comparación con Extra Sugar, lo cual es interesante.

El mapa de memoria es completamente diferente y hubo que retocar bastante código para eliminar lo que se automodificaba y así poder ejecutarlo desde la ROM. La pantalla ya no necesita doble búfer gracias a los sprites por hardware y la mayor parte del código se ejecuta desde la ROM, por lo que 64k de RAM son más que suficientes. Y la ROM es de solo 128k, así que de nuevo, espacio de sobra.

Los fondos obviamente están en Modo 0 esta vez y realmente usan más colores que el arcade porque usé tramado (dithering) siempre que pude para intentar que no se vieran tan toscos en Modo 0. Todos se retoquetearon a mano. También usan cambios de paleta por línea (colour splits) cuando es posible para lograr más de 16 colores. O 12 colores, ya que las plataformas siempre ocupan 4.

El sistema de interrupciones es mucho más complicado que en Extra Sugar, pero la estructura del juego fue mucho más fácil de escribir gracias a la PRI, que tal vez sea la característica más subestimada del GX. Cualquier código crítico en cuanto a sincronización se colocó en la cadena de interrupciones, lo que hizo que todo fuera mucho más simple y limpio.

El código de los sprites se rehizo por completo para usar sprites por hardware. El juego necesita un máximo de 12 sprites para los objetos del juego (1 jugador + 9 enemigos + bola P + moneda B). Me preocupaba cuánto tiempo llevaría actualizar el ASIC para animarlos, ya que la memoria de sprites no está indexada (lo cual es supermolesto). Así que, para que vayan más rápido, los datos de los sprites son todos sprites compilados y, siempre que es posible, se guardan como un delta; es decir, solo se cambian los píxeles que son diferentes respecto al sprite anterior. Todas las animaciones de los enemigos funcionan así y se van turnando para actualizarse, de 4 en 4. De hecho, la actualización de sprites se hace bastante rápido, por lo general antes de que la pantalla empiece a dibujar el fotograma visible. Y la lógica del juego ya era rápida, así que el juego corre a 50Hz sin problemas.

Donde se fue más tiempo fue en la multiplexación de sprites, que también se manejó mediante la interrupción. Después de los objetos del juego, me quedaban 4 sprites libres y quería multiplexarlos para hacer 24 bombas. Esto es pan comido cuando están apiladas verticalmente, pero el problema es que puede haber hasta 7 bombas en una misma línea. Por lo tanto, cuando hay más de 4, el juego hace una intrincada multiplexación horizontal donde los sprites se mueven de un lado a otro en cada línea de escaneo para que aparezcan dos veces. Esto requiere una sincronización precisa y es un punto de fallo para los emuladores.

El medidor de arcoíris en la parte superior de la pantalla también está hecho con dos de los sprites de las bombas. Estos se redibujan rápidamente como bombas en el tiempo que transcurre entre que termina la pantalla superior y comienza el área de juego. Por lo tanto, el juego a menudo tiene más de 30 sprites en pantalla a la vez y puede tener más de 16 sprites en una sola línea. Eso no lo puedes hacer en una Master System o una NES.

Las vidas extra en la parte inferior de la pantalla no son sprites, sino que se hacen con cambios de paleta (colour splits) como en Extra Sugar.

La pantalla de título es una solución completamente diferente al mismo problema: quiero que el logo esté en alta resolución, pero necesitas al menos 7 colores para dibujarlo y no se pueden separar fácilmente. Esta vez tenía los sprites por hardware de mi lado, pero las letras son demasiado grandes para cubrirlas por completo solo con ellos. Así que terminé dibujando el logo en Modo 1 usando dos tonos de azul, negro y naranja, y las letras están cubiertas con una disposición estratégica de sprites por hardware combinada con cambios de paleta en el canal naranja. Reescribe dos de los sprites por hardware mientras hace esto, por lo que se usan 18 sprites en total. Una vez más, esto requiere una sincronización precisa, así que, de nuevo, es algo que no se ve 100% correcto en todos los emuladores.

Aparte de eso, todo se armó bastante rápido. El GX es divertido y todavía tiene mucho potencial sin explotar.

23 Me gusta

Muchas gracias por una información tan valiosa sobre soluciones técnicas.
Qué vergüenza, todavía no he probado tu juego… Me hace más feliz programar en hardware antiguo que jugar en él. Pero tu trabajo es increíble, gracias de nuevo por compartirlo.

Tío, esto se ve tan perfecto respecto a la recreativa que sigo alucinando incluso después de todo este tiempo…

Gracias por la explicación tan detallada :slight_smile:

¡Súper genial! Una lástima que nunca pueda estar al mismo nivel de calidad que los «juegos creados en los últimos meses usando IA», pero, ¡hey, aun así es un esfuerzo estupendo!

…y creo que hemos encontrado nuestro nuevo meme :stuck_out_tongue:

7 Me gusta

¿Puedes dejarlo pasar, por favor? ¿A qué viene tanto revuelo?

¿Hay algún plan para añadir ese toque de dulzura extra también a la versión GX?

P. D. A veces disfruto más leyendo sobre un juego que jugándolo en realidad. En este caso, he disfrutado de ambas cosas.

Muchas gracias por el artículo, ha estado superinteresante, y por hacer estas dos excelentes versiones de Bomb Jack, especialmente la de GX.

Me encanta que guarde las puntuaciones máximas, es genial para picarse a conseguir la mejor puntuación :slight_smile:

¡Qué envidia me das por haber logrado que el multiplexado de sprites funcione en el Plus! Yo nunca he podido hacer que funcione bien sin fallos gráficos horribles y pausas extrañas. ¡Mi reino por una tabla de punteros de sprites del ASIC!

Como digo, es posible, así que tal vez algún día. El mayor obstáculo es que tendría que volver a dibujar todos los fondos adicionales. Y ha habido muchísimas menos descargas del juego de GX en comparación con el de CPC.

Sin embargo, el proceso de conversión fue divertido, ya que partes enormes del juego se iban armando de golpe.

2 Me gusta

¡Me encantaría que trabajaras en la actualización de otro juego de Amstrad que te interese! O tal vez en un juego de arcade que te guste mucho y que no haya tenido versión para CPC…

¡O Platypus CPC+!

1 me gusta

Lo integré en la cadena de interrupciones para que, una vez que estuviera funcionando, no tuviera que preocuparme demasiado por ello. Puse un montón de código en la interrupción. Es una pena que el CPC normal no tenga un PRI. Es una característica muy simple, pero facilita enormemente el trabajo con tareas donde el tiempo es crítico.

También ayuda que las bombas no se muevan de un lado a otro. El multiplexado vertical es fácil, pero el horizontal requería un ajuste de tiempo al milímetro, al nivel del NOP, y apenas consigue funcionar. Además, se consume toda la CPU durante esas líneas, pero me sobraba muchísimo tiempo de CPU.

Como las interrupciones tienen unos pocos NOP de incertidumbre en su temporización, dependiendo de lo que estés interrumpiendo, conseguí interrupciones precisas cuando las necesitaba llamándolas una línea antes y luego configurando el PRI para interrumpir de nuevo en la siguiente línea de escaneo. La función de interrupción entonces espera (WAIT) a que la interrupción se active dentro de la propia interrupción. Desperdicia una línea de escaneo de tiempo de CPU, pero te da una interrupción con una precisión exacta.

2 Me gusta

Si eres astuto con esto, puedes aprovechar parte de ese tiempo para el trabajo de preparación. Solo hay una pequeña variación en los posibles tiempos de interrupción, por lo que realizas la interrupción temprana y luego puedes preparar el equivalente a unos buenos 50 NOP antes de un HALT que lleve a la siguiente línea de escaneo. Es especialmente útil si estás usando DMA para temporizar las interrupciones de línea de escaneo (en lugar de múltiples PRI), porque así ni siquiera malgastas parte de ese tiempo configurando el PRI de nuevo.

1 me gusta

Hay que admitir, de todos modos, que hace poco tiempo que el cartucho de Rodrik está disponible.

Porque, francamente, hay potencial de sobra para darle una buena paliza a la versión de MSX2, a pesar de lo excelente que es esta última.