Registrarse

[Otros] HGSS | Editar la efectividad entre tipos

Mikelan98

WaH used to be a bigger place...
Nota: Para que luego no andéis preguntando chorradas, un número precedido por 0x significa que está en hexadecimal.

000505
000805
0A0A05
0A0B05
0A0C14
0A0F14
0A0614
0A0505
0A1005
0A0814
0B0A14
0B0B05
0B0C05
0B0414
0B0514
0B1005
0D0B14
0D0D05
0D0C05
0D0400
0D0214
0D1005
0C0A05
0C0B14
0C0C05
0C0305
0C0414
0C0205
0C0605
0C0514
0C1005
0C0805
0F0B05
0F0C14
0F0F05
0F0414
0F0214
0F1014
0F0805
0F0A05
010014
010F14
010305
010205
010E05
010605
010514
011114
010814
030C14
030305
030405
030505
030705
030800
040A14
040D14
040C05
040314
040200
040605
040514
040814
020D05
020C14
020114
020614
020505
020805
0E0114
0E0314
0E0E05
0E1100
0E0805
060A05
060C14
060105
060305
060205
060E14
060705
061114
060805
050A14
050F14
050105
050405
050214
050614
050805
070000
070E14
071105
070805
070714
101014
100805
110105
110E14
110714
111105
110805
080A05
080B05
080D05
080F14
080514
080805
FEFE00
000700
010700
FFFF

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):

00000A00010A00020A00030A00040A00050500060A00070000080500090A000A0A000B0A000C0A000D0A000E0A000F0A00100A00110A 01001401010A01020501030501040A010514010605010700010814010905010A0A010B0A010C0A010D0A010E05010F1401100A011114 02000A02011402020A02030A02040A02050502061402070A02080502090A020A0A020B0A020C14020D05020E0A020F0A02100A02110A 03000A03010A03020A03030503040503050503060A030705030800030914030A0A030B0A030C14030D0A030E0A030F0A03100A03110A 04000A04010A04020004031404040A04051404060504070A04081404090A040A14040B0A040C05040D14040E0A040F0A04100A04110A 05000A05010505021405030A05040505050A05061405070A05080505090A050A14050B0A050C0A050D0A050E0A050F1405100A05110A 06000A06010506020506030506040A06050A06060A060705060805060905060A05060B0A060C14060D0A060E14060F0A06100A061114 07000007010A07020A07030A07040A07050A07060A07071407080A07090A070A0A070B0A070C0A070D0A070E14070F0A07100507110A 08000A08010A08020A08030A08040A08051408060A08070A080805080914080A05080B05080C0A080D05080E0A080F1408100A08110A 09000A09011409020A09030509040A09050A09060A09070A09080509090A090A05090B0A090C0A090D0A090E0A090F0A091014091114 0A000A0A010A0A020A0A030A0A040A0A05050A06140A070A0A08140A090A0A0A050A0B050A0C140A0D0A0A0E0A0A0F140A10050A110A 0B000A0B010A0B020A0B030A0B04140B05140B060A0B070A0B080A0B090A0B0A140B0B050B0C050B0D0A0B0E0A0B0F0A0B10050B110A 0C000A0C010A0C02050C03050C04140C05140C06050C070A0C08050C090A0C0A050C0B140C0C050C0D0A0C0E0A0C0F0A0C10050C110A 0D000A0D010A0D02140D030A0D04000D050A0D060A0D070A0D080A0D090A0D0A0A0D0B140D0C050D0D050D0E0A0D0F0A0D10050D110A 0E000A0E01140E020A0E03140E040A0E050A0E060A0E070A0E08050E090A0E0A0A0E0B0A0E0C0A0E0D0A0E0E050E0F0A0E100A0E1100 0F000A0F010A0F02140F030A0F04140F050A0F060A0F070A0F08050F090A0F0A050F0B050F0C140F0D0A0F0E0A0F0F050F10140F110A 10000A10010A10020A10030A10040A10050A10060A10070A100805100900100A0A100B0A100C0A100D0A100E0A100F0A10101410110A 11000A11010511020A11030A11040A11050A11060A11071411080A110905110A0A110B0A110C0A110D0A110E14110F0A11100A111105 FFFFFFFF

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.
 
Última edición por un moderador:

Mikelan98

WaH used to be a bigger place...
Respuesta: [Tutorial HGSS] Editar la efectividad entre tipos

Actualizado el tutorial, para insertar nuevas "relaciones".
 

Dani_SR_17

¡Pokémon LionHeart!
Respuesta: [Tutorial HGSS] Editar la efectividad entre tipos

¿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 ;)
 

Cheve

MoonLover~
Miembro de honor
Respuesta: [Tutorial HGSS] Editar la efectividad entre tipos

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
 
Arriba