tuts_nds
Thread Id: 29049
Thread Name: [Tutorial HGSS] Editar la efectividad entre tipos
#0
Mikelan4315♪ 17505
Nota: Para que luego no andéis preguntando chorradas, un número precedido por 0x significa que está en hexadecimal.



Y este es el formato de cada uno:

AA CC EE

AA : tipo del ataque
CC : tipo(s) del contrincante
EE : efectividad

Estos tres bytes se repiten en cada "relación" entre tipos y termina en FFFF.

AA y CC pueden tener estos valores:

0×00 : Normal
0×01 : Lucha
0×02 : Volador
0×03 : Veneno
0×04 : Tierra
0×05 : Roca
0×06 : Bicho
0×07 : Fantasma
0×08 : Acero
0×09 : ???
0×0A : Fuego
0×0B : Agua
0×0C : Planta
0×0D : Eléctrico
0×0E : Psíquico
0×0F : Hielo
0×10 : Dragón
0×11 : Siniestro

EE puede tomar estos 4:
0×00 : Ineficaz
0×05 : Poco eficaz
0×0A : Daño normal
0×14 : Muy eficaz

Como habrás observado, EE es un multiplicador de daño, pero para obtener el número real que se le multiplica, hay que dividirlo entre 0xA (es decir, 10).

Pero hay un problema, si intentas buscar en una ROM la cadena hexadecimal 00 05 05 00 08 05 0A 0A 05, el buscador te dirá que no hay resultados. Esto es debido a que la localización de estos valores está en el overlay, y este está fragmentado, y cada fragmento está comprimido. Puedes descomprimirlo con el CrystalTile2, por ejemplo. El overlay donde se encuentran estos valores es el 12.

Ahora, si miramos la tabla, veremos que no aparecen las relaciones que provocan un daño x1. El juego, en caso de no encontrar los tres bytes que rigen las efectividades, hace que el movimiento tenga una efectividad normal.

¿En qué nos afecta esto? Bueno, si queremos introducir el tipo hada en HGSS (lo más sensato es remplazarlo por el Tipo ???) tendremos un problemón.

Si intentamos añadir (ni se te ocurra hacerlo) alguna nueva relación, desde cero, el juego crasheará al iniciar una batalla. Esto es debido a que el arm9 leerá mal los datos que haya después de los datos de las relaciones.

Cómo añadir nuevas relaciones entre tipos


Primero, hay que entender cómo funciona el juego:

El juego se "divide" en dos partes principales: el overworld (manejar al personaje por los distintos mapas, hablar a los NPCs, etc.) y las batallas. El juego necesita leer los siguientes overlays para el overworld : 1, 2, 3 y 27 (Grupo 1), y necesita leer estos para las batallas: 6, 7, 10, 12, y 18 (Grupo 2).

En realidad, el overlay 10 es leído cada vez que te dan a elegir una acción, y el 7 cuando has elegido la opción (y al comienzo y al final de la batalla también).

Cuando le das a Continuar en el menú del juego, se carga el Grupo 1, y cuando entablas una batalla se carga el Grupo 2. Puedes verlo con el visor de RAM, sobre el address 0x021D0E00.

Es algo como esto:

Overworld 01 00 00 00 01 00 00 00 02 00 00 00 01 00 00 00 03 00 00 00 01 00 00 00 1B 00 00 00 01 00 00 00

Batalla 0C 00 00 00 01 00 00 00 12 00 00 00 01 00 00 00 06 00 00 00 01 00 00 00 0A 00 00 00 01 00 00 00

El truco consiste en hallar un espacio que no sea usado durante las batallas (puesto que el Grupo 1 sobreescribe al Grupo 2 y viceversa, cuando no son cargados). Milagrosamente, este hueco existe.

El overlay 18 y el overlay 1 tienen el mismo offset en la RAM, pero el overlay 1 es mucho más grande que el 18. ¿Qué significa esto? Que lo que sobra del overlay 1 (a la hora de iniciar la batalla) está vacío, y puede ser utilizado.

Manos a la obra

Paso 1
Abre la ROM de HGSS con CrystalTile2.

Paso 2
Pincha en el icono de la NDS (o pulsa Ctrl+N).

Paso 3
Pincha con el botón derecho en el overlay_0012.bin y haz click en Extract (no en Export), para descomprimir el archivo. Haz lo mismo en el overlay_0018.bin.

Paso 4
Abre ambos con un editor hexadecimal (como HxD).

Paso 5
Añade tus propias "relaciones entre tipos" al final del overlay 18 (obviamente, el archivo se expandirá de tamaño). Recomiendo escribir las 324 relaciones ahí, por si luego tenéis que cambiarlo, que sea más cómodo.
También puedes coger la mía, actualizada a la Sexta Generación (donde el Tipo ??? es reemplazado por el Tipo Hada):



Paso 6
En el overlay 12, busca en el address XXXXXXXX el valor YYYYYYYY, y sustitúyelo por el valor ZZZZZZZZ. Estos tres valores cambian dependiendo de la región del juego:


Juego y código . . . . . . . . Address en Overlay12 . . . . . Pointer original . . . . . Pointer actualizado
. . . . . . . . . . . . . .. . (XXXXXXXX) . . . . . . . . . . (YYYYYYYY) . . . . . . . . (ZZZZZZZZ)
Española
POKEMON HG (IPKS). . . . . . . 0x0001A78C . . . . . . . . . . 9CCC2602 . . . . . . . . . A0BA1F02
POKEMON SS (IPGS). . . . . . . 0x0001A78C . . . . . . . . . . BCCC2602 . . . . . . . . . C0BA1F02

Japonesa
POKEMON HG (IPKJ). . . . . . . 0x0001A794 . . . . . . . . . . 78C12602 . . . . . . . . . E0B01F02
POKEMON SS (IPGJ). . . . . . . 0x0001A794 . . . . . . . . . . 78C12602 . . . . . . . . . E0B01F02

Inglesa
POKEMON HG (IPKE). . . . . . . 0x0001A78C . . . . . . . . . . 7CCC2602 . . . . . . . . . 60BE1F02
POKEMON SS (IPGE). . . . . . . 0x0001A78C . . . . . . . . . . 7CCC2602 . . . . . . . . . 60BE1F02

Francesa
POKEMON HG (IPKF). . . . . . . 0x0001A78C . . . . . . . . . . 9CCC2602 . . . . . . . . . A0BA1F02
POKEMON SS (IPGF). . . . . . . 0x0001A78C . . . . . . . . . . 9CCC2602 . . . . . . . . . A0BA1F02

Italiana
POKEMON HG (IPKI). . . . . . . 0x0001A78C . . . . . . . . . . 1CCC2602 . . . . . . . . . 20BA1F02
POKEMON SS (IPGI). . . . . . . 0x0001A78C . . . . . . . . . . 1CCC2602 . . . . . . . . . 20BA1F02

Alemana
POKEMON HG (IPKD). . . . . . . 0x0001A78C . . . . . . . . . . 5CCC2602 . . . . . . . . . 60BA1F02
POKEMON SS (IPGD). . . . . . . 0x0001A78C . . . . . . . . . . 5CCC2602 . . . . . . . . . 60BA1F02

Coreana
POKEMON HG (IPKK). . . . . . . 0x0001A790 . . . . . . . . . . 80D62602 . . . . . . . . . A0C41F02
POKEMON SS (IPGK). . . . . . . 0x0001A790 . . . . . . . . . . 80D62602 . . . . . . . . . A0C41F02



Paso 7
Guarda ambos archivos y cierra el editor hexadecimal.

Paso 8
Vuelve a CrystalTile2, haz click derecho en overlay_0012.bin y pincha en Compression, para importar el archivo y comprirlo en LZ. Haz lo mismo con el overlay_0018.bin. Dado que este último archivo es bastante mayor que el overlay 18 original, tendrás que abrir hueco en la ROM. Pero no te preocupes, CrystalTile2 ya lo hace por ti. Tú sólo pincha en OK.

Paso 9
Cierra el CT2 y tu ROM ya está lista. Además, funcionará tanto en emulador como en flashcards, así que no problem.



Tutorial original: https://nsmbhd.net/thread/2606-complete-type-chart-in-pokemon-hg-ss-without-breaking-code/
#1
Mikelan4315♪ 17505
Actualizado el tutorial, para insertar nuevas "relaciones".
#2
Dani_SR_17 28493
¿Nadie comenta?
Vale, que el hackeo en NDS no sea el mayoritario en el foro, pero es un aportazo como para no comentar...

La verdad, realizas un curro impresionante investigando en NDS.
Además, se agradece ver como pasaste de solo conocer donde estaba a como conseguir modificarlo y tal, da inspiración y ganas de investigar otras cosas jeje.

Sobre el tuto, pues muy bien explicadito, pasito a pasito todo claro y comprensible.

Un gran trabajo ;)
#3
Cheve_X 15014
Y yo me pregunto que clase de poder divino tienes para investigar tan a fondo.

Gracias por el aporte molón :3
Veo que el HDS cada vez avanza más y más; y no es por nada, pero actualmente eres el mayor exponente de habla hispana en ésto xD