tuts_gba
Thread Id: 25322
Thread Name: GBA | Otros | Jugando con las Cabecera de los Mapas [Edición Hex]
#0
Cheve_X 15014
Bueno, antes que nada, debemos entender que éste tutorial será adaptado a cada Rom Base simplemente cambiando de Offsets, ya que todas funcionan de igual manera.
Los offset serán diferenciados con los colores: Fire Red Ruby Esmeralda

Parte Número 1: Conociendo la Data

Bueno, los cabezales de mapas se organizan de las siguiente manera:

En el Offset: 0x05524C 0x053324 0x084AA0 se encuentra la dirección a la Tabla de Cabezales de Mapas, en ésta Tabla, encontramos direcciones a las tablas de Mapas de cada cabezal.

Las direcciones de las Tabla de Cabezales de Mapas son las siguientes:

71DeD0
308588
84AA0

Entonces, resumimos:

Offset de Inicio > Dirección a Tabla de Cabezales > Cada dirección de Cabezal lleva a la Data de Cada mapa.

Sabiendo ésto, es muy fácil realizar cualquier operación con los mapas y los cabezales. Ya sea que necesitemos Borrar mapas, Crear mapas, borrar cabezales, crear cabezales.

Parte 2: Realizando Operaciones: Crear nuevos cabezales
Ésto puede ser hecho mediante A-Map tranquilamente, llendo a éste menú e introduciendo la cantidad nueva de Cabezales que queremos:



Pero como soy un renegado de la vida, igual os voy a explicar como hacerlo en Hex :D

Bueno, para agregar cabezales de mapa, será necesario repuntear nuestra tabla, ¿Como hacemos eso? sencillo, vamos al Offset donde se encuentra la dirección a nuestra tabla. (Es decir, vamos al offset 0x05524C 0x053324 0x084AA0 ) y allí vamos a necesitar poner un offset con espacio libre donde escribir nuestros nuevos cabezales... ¿Pero como sabemos cuanto espacio necesitaremos?

Bueno, para saberlo, vamos a donde se encuentra nuestra tabla original:

71DeD0
308588
84AA0

Ahora, podemos fácilmente saber donde termina la tabla:



Asi que para repuntear vamos a copiar toda esa data que está seleccionada en la imágen...

La longitud de la data de cada Rom es FR: 0xAC RBY y EMER: 0x88, ésto es porque cada puntero utiliza 4 bytes, es decir, dirección permutada +08 (XX XX XX 08) contando el cabezal nº 0, si usamos AC, o 88, lo dividimos por 4 y lo pasamos a decimal nos dá la cantidad actual de cabezales de Mapas que tiene nuestra Rom.

Bueno, ahora que copiamos eso, y sabemos lo que sabemos, lo vamos a pegar en un lugar con, al menos, 4 bytes más de espacio vacio.
Entonces copiamos la Data y digamos que yo encontré como offset vacio 0x970000. (En Emerald me fuí al EEEEE0)
Entonces voy a ese offset y pego la Data que copié antes:



Ahora, me dirijo al offset que me decía donde se encontraba mi tabla de cabezales

0x05524C 0x053324 0x084AA0

y reemplazo ese valor con el offset donde pege la nueva data. Ese Offset debe estar permutado y puesto como Pointer.


Nuestro Offset:

970000

Permutado:

00 00 97

Como Pointer

00 00 97 08



Una vez que lo reemplazamos, le damos a guardar en nuestro editor HEX.
Volvemos a ir a nuestra nueva tabla (En mi caso 0x970000 0x970000 0xEEEEE0 ) y ahora al final escribiremos un nuevo offset que deberá tener espacio libre según ésta formula:

Mapas nuevos para el Cabezal * 4

Yo por ejemplo usaré el 0x980000 como mi dirección

así que lo permuto y lo escribo a lo ultimo de mi nueva tabla

(A partir de aquí solo sigo con FireRed ya que el procedimiento es exactamente el mismo en todas las bases)



Bueno, ahora si quereís asignarle a ésta nueva cabecera un nuevo mapa, deberán hacerlo con A-Map, de la forma convencional, pero sabrán que no se estará sobreescribiendo nada. Ya que la data de los mapas cambia dependiendo de varias cosas jaja

Ahora, yo dije que hibamos a jugar un poco no? pues ¿Que les pareces si arruinamos un poco la Rom o "jugamos con su sistema"? :3

Bueno, vayamos a nuestra tabla de cabezales y miremos la primer dirección:

"Despermutada" sería 08 35 20 04, sin el 08 0x352004, es la dirección del cabezal 0; El cabezal 0 tiene 5 mapas, cada offset lleva a los datos de cada mapa.
Ahora, si van a esa dirección podrán ver que el cabezal tiene "Espacio Reservado" (Si, ese espacio para insertar más mapas es el "Espacio Reservado" al que se refiere el A-Map)

Ahora, volvamos a nuestra tabla, y vayamos al tercer cabezal. (352204) y copiemos el primer Offset permutado:

88 FF 34 08

¿Que tal si lo pegamos en 0x352004 en un lugar de los "Reservados"?



Exactamente, ahora ambos cabezales comparten el mismo mapa

Si borras éste offset de los cabezales, el mapa desaparecerá, pero sus datos seguirán allí. Aunque supongo que llendo un poco más a fondo se puede saber qué datos borrar y cuales no para hacer que un mapa se convierta en "Espacio Vacio" o "FF's"


Aunque no es nada muy específico lo que se enseñó aquí espero que hayan aprendido algo de como están estructurados los cabezales de los mapas y que en un futuro les sirva para algo.
Un saludo y nos vemos en otro tutorial.
#1
cosarara97 12296
Muy bien explicado Cheve!
Añado que si queréis saber cómo está estructurada cada parte del mapa podéis verlo aquí (es parte del código fuente de Blue Spider):
https://gitorious.org/blue-spider-map-editor/blue-spider-map-editor/source/ecb0b74a2a63819afdb5f2bdc8729b2304089e20:bluespider/structures.py
Por ejemplo, la primera estructura que hay en ese archivo es el cabezal del mapa:

map_header = (
("map_data_ptr", "ptr", 0),
("event_data_ptr", "ptr", 4),
("level_script_ptr", "ptr", 8),
("connections_ptr", "ptr", 12),
("song_index", "short", 16),
("map_ptr_index", "short", 18),
("label_index", "byte", 20),
("is_a_cave", "byte", 21),
("weather", "byte", 22),
("map_type", "byte", 23),
("null", "short", 24), # Unknown at 24-25
("show_label", "byte", 26),
("battle_type", "byte", 27),
)

Para cada "elemento" de cada estructura hay lo siguiente: el nombre ("map_data_ptr"), el tipo ("ptr" para una dirección, "byte" para un solo byte, "short" para dos bytes) y la posición (el offset) dentro de la estructura.

PD: Y obviamente todo está en little-endian, o sea, permutado del revés.
#2
Tito Sayer301 26309
Gran tuto Cheve_X, quizás sea mas complicado que hacerlo con la opcion del A-Map, pero donde esté la profesionalidad del Hex, que se quite lo demás.

Lo mas genial de todo, es como lo has explicado para TODAS las ROMs de una forma facil y comoda.

Sigue así puto, animoo!
#3
Loony Boo♪ 12263
Esta es una información un tanto rayante, pero viene bien saber cómo funciona la cabecera de los mapas, ¿que por qué? ¡Porque tengo curiosidad! Además, no viene mal saberlo si en el futuro le doy algún tipo de uso), y una de las mejores formas posibles de aprender es... pues las que todos los veteranos conocemos: ¡experimentar!. Un gran detalle que te voy a agradecer es haber incluído la rom base de Pokémon Emerald como rom utilizable para el tutorial, así que te llevas un +Gracias y mis más sinc... bueno, que muchas gracias por el tutorial.

¡Saludos!