Registrarse

[ASM] HG ESP | El gran ASM de Mikelan para expandir la PokéDex

Mikelan98

WaH used to be a bigger place...
Como me da a mí que mi era ya acabó hace algún tiempo, y después de las muchas insistencias de Rafa, hoy escribo este post (que quisiera haber escrito mucho antes pero la pereza no me ha permitido hacerlo) para revelar los secretos mejor guardados de mi investigaciones.

Antes que nada, aviso de que este post está dirigido hacia gente que ya ha manoseado el ASM en 4ª generación alguna vez. Si no estás familiarizado con nada de la programación ASM, te invito amablemente a que ahorres tiempo de tu vida volviendo al índice de WaH y buscando tutoriales de iniciación al bello arte del ensamblador. No me parece justo que alguien sin conocimientos aproveche mi trabajo, pues no lo publico para que se juegue sino para que se continúe.

He modificado más de 50 subrutinas o valores aislados en todo el arm9, por lo que no merece la pena escribir un tutorial sobre todo lo que he hecho, porque es trabajo que he desarrollado durante 2 años y tendría que llorar sangre para explicároslo.

Aquí tenéis el arm9 modificado junto con los overlays (unos están modificados y otros no, pasarlo por WinMerge si queréis saber cuáles son)

802

Podéis extraer tanto código como queráis para adaptarlo al arm9 de vuestra ROM, pero tenéis que darme créditos necesaria y obligatoriamente. Si me robáis rutinas sin acreditarme, moveré hilos para asegurarme de que no se sepa más de vosotros en WaH ¬¬

Y las cosas a tener en cuenta para continuar de desarrollar lo que ya está hecho. Por cierto, no os voy a pasar los archivos de recursos gráficos (narcs de los sprites o iconos) porque eso lo podéis hacer vosotros manualmente.

OVERWORLDS DE LOS POKÉMON

En 0x000FEBD2 se encuentra la primera "tabla" o "lista" que creé. El primer halfword corresponde al overworld de Bulbasaur (los overworlds se encuentran en el narc 0/8/1). Eso quiere decir que el archivo 0x129 en el narc es el minisprite de Bulbasaur. El segundo halfword corresponde a Ivysaur y así sucesivamente.

Mi código, cuando lo descubráis, veréis que lo que hace es "poner" a todos los Pokémon como si fueran Bulbasaur, y sólo en el último momento, cambia los gráficos del overworld.

Cosas a tener en cuenta:

  • Los overworlds tienen diferenciación entre macho y hembra. Cuando es hembra el Pokémon que acompaña al prota en el juego, mi código lo detecta le suma al overworld +1, lo que permite que, por ejemplo, 0x129 corresponda a Bulbasaur macho y 0x12A a Bulbasaur hembra. Es por ello que los halfwords tienen valores, en su mayoría, de 2 en 2, y el narc 0/8/1 se estructure por parejas (Bulbasaur M/Bulbasaur H/Ivysaur M/Ivysaur H...).
  • Cuando los Pokémon no pueden tener género, se le suma +2, por lo que el valor que tenemos que escribir en el halfword es el número del archivo - 2. Esto implica que, por ejemplo, Snorlax y Articuno compartan el mismo número, con la diferencia de que a Articuno el juego le sumará +2 a la hora de coger el overworld del narc, debido a que no tiene género.
  • A las formas alternativas se le van sumando +2 por cada forma.
  • El número interno de Victini no es 494 sino 544, motivo por el cual después del halfword de Arceus hay 50 FF FF's hasta llegar al de Victini.
  • Números de overworld superiores a 0x700 creo que era (y si no, simplemente mirad cuál corresponde a Steelix) son para los Pokémon gigantes.

No os tenéis que rallar por estos números (porque ya los adapté yo) si seguís la misma estructura que tengo yo en el narc 0/8/1: todos los Pokémon empiezan a aparecer en el ID 0x129 y por parejas macho/hembra y por orden. En el caso de que un Pokémon tenga forma alternativa, la pareja va después de la forma original. Por ejemplo:

Misdreavus M
Misdreavus H
Unown A
Unown A
Unown B
Unown B
Unown C
Unown C
...
Unown !
Unown !
Wobbuffet M
Wobbuffet H


Siempre hay que tener en cuenta que una cosa es la estructura de la tabla en el arm9 y otra es la estructura del narc que tiene los recursos gráficos.

Por cierto, no sé si tuve en cuenta las megaevoluciones a la hora de crear la tabla, en cuyo caso ya sabéis, Venusaur tendría 2 parejas distintas, Charizard 3 parejas distintas...

COSAS QUE MEJORAR: La subrutina que hace que los Pokémon gigantes se encerraran en sus PokéBall al entrar en edificios la desactivé, pero quedó buggeada porque realmente hice una chapuza de bypass. Esto hizo que ahora, en edificios, cada vez que reseteas la pantalla el Pokémon entra o sale de la PokéBall, y además, al salir de edificios, el Pokémon siempre tiene la animación de salir de ella.

ICONOS

Nada del otro mundo, el código tiene implementadas 2 anti-limitaciones que hacían que los iconos de números a partir del 493 se viesen como (?). Sin embargo, una de ellas ha jodido los colores de los iconos de Unown, que cambian de paleta dependiendo del número límite.

Por lo demás, en el narc 0/2/0, que es el de los gráficos para los iconos, 50 iconos después de Arceus (o sea, empezando por el archivo nº 551) está el de Victini, Snivy y en adelante. Hay que tener en cuenta que después del icono de Arceus están algunos de formas alternativas propias del juego original y son INTOCABLES (por eso Victini no es el número 494). Las formas alternativas empiezan en el archivo nº 860 y tienen la estructura de: forma original - forma alternativa 1 - (forma alternativa 2...). Sin embargo, lo de las formas alternativas lo explico a continuación, pues considero que puede caer fácilmente en desuso este modo de abordar las formas alternativas.

El número de paleta correspondientes a los iconos (recordemos que los iconos tienen que elegir 1 de entre 3 paletas posibles) creo que siguen en el mismo sitio (obviamente, ampliados para los 802 Pokémon). Aún así, os reto a continuar con los trabajos de MeroMero y hallar la (milagrosa) forma de hacer que los iconos compartan una misma paleta de 256 colores entre todos, o como mínimo, de 48 colores.

COSAS QUE MEJORAR: Lo de las paletas de las formas alternativas de Unown, uno de los ED01 lo sustituí por otro valor y eso cambió todas sus paletas. Se arreglaría simplemente eliminando la limitación en vez de cambiar el valor límite, os lo dejo a vosotros.

FORMAS ALTERNATIVAS

He perdido el offset de la tabla que rige las formas alternativas, pero aún así considero mucho mejor meter las formas alternativas como Pokémon totalmente independientes (sobre todo formas de Alola y megaevoluciones) y programar las grandes excepciones por otro lado (como Deerling, que requerirá mucho ASM).

Igualmente, hay vestigios de mi código para las formas alternativas en el narc 0/2/0 (el de los iconos), en el que después de Marshadow aparecen las formas alternativas.



Y de momento ya está, eso es lo más imprescindible para seguir investigando y desarrollando el arm9. Sólo tenéis que comparar los archivos con los originales y usar el IDA para saber qué narices es ese código.

La verdad es que siento mucho no poder explayarme contandoos cómo he hecho las cosas, pero es que de la mitad no me acuerdo y la otra mitad sería un tocho enoooooooooorme.

Conforme me vaya acordando de más apartados, los iré escribiendo en el thread. Para "expandir" realmente la PokéDex lo único que hace falta es expandir los narcs que tienen los archivos de los sprites, los datos de los Pokémon, su moveset, sus huellas...
 
Última edición:

BluRose

chiste, chiste
decidí hacer algo con esto porque me gustaría hacer esto en pokeplat o aún solo en hgss para ver si yo pudiera implementarlo por mi mismo

descubrí que hay 5 overlays modificados (de 128 en total):

overlay_0001
overlay_0003
overlay_0018
overlay_0027
overlay_0101

PD: interesantamente, overlay_0006 y overlay_0012 son modificados si te gustaría añadir el tipo hada, pero no aquí
overlay_0018 puede tener las modificaciones (nueva tabla) de todos modos

PD2: overlay_0018 definitivamente tiene muchas de las modificaciones, si el método de meromero es algo que tiene modificaciones similares
¿puede explicarme alguien como funciona punteros en nds? me parece que arm9.bin sea el comienzo (0x02000000) y que todos los overlays estén después
por ejemplo, meromero dice que muchas de sus modificaciones están en overlay_0018 (0x12) pero las direcciones en su mensaje corresponden con overlay_0049 en la rom, y eso no me hace sentido. ¿son los overlays cargados en un método diferente que el ordén?
 
Última edición:

Mikelan98

WaH used to be a bigger place...
¡Hola BluRose!

En primer lugar, felicidades por atreverte a experimentar código en NDS. Te lo explico para que lo entiendas mejor: efectivamente, el arm9.bin es "sagrado", se carga siempre siempre en la RAM (memoria volátil, es sobre lo que la consola trabaja realmente) y contiene las instrucciones (o el código, si prefieres llamarlo así) de las cosas más importantes del juego que están siempre presentes.

Por otro lado, los overlays se cargan de forma selectiva en la RAM, dependiendo de lo que el juego necesita. Pongamos un ejemplo. Cada uno de los juegos de cuarta generación (DPPtHGSS) se pueden "dividir" en dos partes principales: la parte 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, y necesita leer estos para las batallas: 6, 7, 10, 12, y 18. Es un ejemplo de carga selectiva.

Por eso, necesitas entrar en una batalla para poder ver el overlay 18 en la RAM. Por otro lado, como ya hemos dicho, el arm9 va a estar siempre ahí presente.

En cuanto a tu segunda duda, tiene que ver con esto que acabo de decir. Ya que el arm9 se carga en la dirección de memoria 0x02000000 siempre, y es lo que empieza leyéndose, y los punteros que encontramos ahí van dirigiéndose a overlays específicos dependiendo de para qué lo necesiten. En primer lugar el juego ordena cargar los overlays necesarios (siempre después del arm9, en la memoria), el orden puede variar si nos encontramos en situaciones del juego distintas (por ejemplo, abrimos el PokéGear y los overlays puede que se carguen con un orden distinto al que se cargan en el overworld, a parte de que se cargarán algunos más que antes no se cargaban).

En resumidas cuentas, para ver el overlay 18 en la RAM (y el código modificado, por extensión) tienes que estar dentro de una batalla. Además, mi overlay 18 creo que tiene programado al Arceus de tipo hada, por eso hay muchas cosas diferentes.

Espero haberte ayudado.
 
Arriba