Ingeniería Inversa de un juego de Game Boy Advance: ¡Vamos a alargar el puente! — Parte 1

Bruno Macabeus
4 min readMar 9, 2021

Esta publicación es parte de una serie llamada Ingeniería Inversa de un juego de Game Boy Advance. Lee la introducción aquí.

Sígueme en Twitter para más diversión de computadora 🐦

Bueno, nuestro objetivo es crear un editor de niveles, ¿verdad? Pero eso es muy complicado y hay un millón de cosas que hacer. Así que vamos a empezar con algo más obvio: ¡vamos a crear algunas tiles en el mapa!

Algo importante de un proyecto de ingeniería inversa es “encontrar y repetir los patrones.” Es más fácil solo repetir un patrón que crear o borrar algo. Osea que en vez de “crear las tiles” desde cero, empezaremos con algo más simple: vamos a “repetir las tiles” en orden para “alargar alguna estructura en el nivel”. Nos hará nuestro trabajo fácil si tenemos una parte practical para alargar del nivel. Eso es, alguna parte del nivel donde las tiles son regulares (una secuencia de las mismas tiles), con espacio alrededor, donde será fácil de ver que algo ha cambiado.
Resulta que el primer nivel tiene una muy buen área con un puente flotante.

Una de esas herramientas en no$gba, el VRAM Viewer (ábrelo presionando F5) es lo que exactamente necesitamos para nuestro trabajo. En él, podemos ver las diferentes capas del background del nivel. En la Game Boy Advance, estos son llamados BG 0, BG 1, BG 2 y BG 3. Puedes ver que BG 0 contiene las imágenes del background que están más lejos de la cámara, el cielo azul y el HUD, mientras que BG 1 contiene las imágenes del background que están más cerca y BG3 no tiene nada.
Pero lo que es más importante para nosotros es BG 2 donde podemos ver las tiles “que caminan”.

Captura de pantalla enseñando la herramienta del VRAM Viewer en no$gba, y el área con el puente que vamos a alargar

Moviendo el ratón hacia una tile, podremos ver información sobre ella. Mientras hay un montón de detalles, hay solo dos cosas que nos importa más que son:

  • N° de tile: El número del ID asociado con la tile. Por ejemplo: en este nivel, cada tile con el número 9B representa una pieza específica del puente, que está en la esquina superior de la izquierda. 9A es el ID de la parte del puente que se repite.
  • Dirección del mapa: la dirección donde la tile está guardada en la memoria. En este caso, es en la dirección 0600F1AD.

Ey, ¡mencioné una dirección de la memoria! Y esta dirección es esperada, ya que direcciones entre 06000000 y 06017FFF son una sección de la memoria llamada VRAM (Video RAM). Esta sección contiene los sprites del background, y como vimos antes, ¡el mapa de tiles!
La memoria de la Game Boy Advance está dividida en múltiples secciones, cada una con un propósito y funcionalidad diferente. Si quieres saber más sobre ellos, puedes leer aquí, pero cuando yo introduzco una nueva sección, la describo brevemente.

Así que ahora sabemos que la dirección 0600F1AD contiene el mapa de tiles que estamos mirando. Interesante… así que vamos a ver qué hay ahí:

La región de la memoria conteniendo el mapa de tiles. El byte destacado es la tile para la esquina superior de la izquierda del puente.

¡Genial! ¿Puedes ver el puente en esos bytes? Fíjate que 00 representa un archivo vacío, mientras todo lo demás es una tile que será mostrada en la pantalla. Y esa secuencia de bytes, “9B 9A 9A…” ¡es nuestro puente! Así que, llenando en los bytes de la izquierda del 9B siguiendo el patrón ¿sería suficiente para alargar el puente? ¡Vamos a probarlo!

La región de la memoria después de alargar los bytes asociados con el puente.

Hemos alargado el puente en la VRAM, y ya que la GBA dibuja la pantalla basada en la información, podemos avanzar un frame en el emulador (usando la tecla /) para ver qué pasa…
¡Y podemos ver que hemos podido alargar el puente! ¡¡Genial!!

GIF con dos frames del juego, enseñando el resultado de la modificación.

Sin embargo, cuando avanzamos un frame más, podemos ver que el puente vuelve a su estado original… Hmm…¿cómo ha pasado esto? ¿cómo lo arreglamos?

Siguiente publicación: Entendiendo a la traviesa DMA

--

--