10414-Información_del_Equipo_Pokémon_\[Estado:_80%]
#3
Sonicarvalho 17082
Hola a todos! No podía dejar de reparar en la sección de Investigación, pues yo soy un maníaco de ASM '¬¬

En primer lugar, vamos a iluminar todos los bytes (o cuasi todos).


Ahora vamos a las explicaciones. (Nota que voy hablar a mi manera, entonces Encriptar= Cifrar y Desencriptar = descifrar)
Los datos de los pokemon en la generación 3 son compuestos por 80 bytes, pero tienen 100 bytes (0x64) cuando están en la party, como podéis observar en esa tabla. Pero como los 20 bytes extras son de cosas como HP, Status, etc. , no son importantes lo suficiente para ser mencionados, pues están desencriptados e pueden ser fácilmente accedidos y cambiados con WTBO.

El resumen: Los datos que nos interesan son los verdes e los azules, porque los rojos no son guardados cuando el pokemon es depositado en el PC (porque pensaban que los pokemons eran curados e su HP era otra vez el máximo? Porque eses datos desaparecen e cuando van para la party son copias de los datos originales de los pokemons (los 80 bytes)).

En esos 80 bytes, podemos dividi-los en dos partes:

[list=1]
  • Los primeros 32 bytes son informaciónes desencriptadas, como lo nombre, lo nombre de su original trainer y una cosa mucho importante llamada personalidad [4 bytes], que contiene la información como ser shiny , la naturaleza, e mucho mas, necesaria para desencriptar los otros 48 bytes!
  • Los otros 48 bytes son informaciones encriptadas que contienen las informaciónes mas importantes de nuestros pokemons, como el espécimen, la EXP, los IV's & EV's, lo nivel, etc.
  • [/list]


    Dado eso, podemos decir que los datos que interesan a nosotros so los azules.

    Pero, sólo se puede acceder a esos datos si tenemos la clave (o es llave? Soy portugués, me perdonen xD ).
    Ahora enfrentamos otro problema: la clave no es la misma para todos los pokemons, de facto es única! PERO lo algoritmo necesario para encontrar la clave es siempre el MISMO!!
    Pero eso no es todo: el juego tiene mas otro check para saber se el pokemon es legal o no. En esa tabla que yo vos presenté está presente un ítem llamado "CheckSum" (de lo ingles 'CheckSumatory', la función necesaria para el juego comparar los datos y su integridad)

    Ahora vos debéis estar preguntándo lo que hace esa tal suma o checksum? ¿:.
    Muy simples: hay un checksum en los primeros 32 bytes para ver se los otros 48 bytes estan
    legales, porque como a lo cierto ya lo repararan, esos datos son los datos mas importantes de los pokemons. Lo juego compara los dos checksums y si no son iguales, el pokemon vira BAD EGG!

    Pero antes de hacer lo que quier que sea, primero vamos a estudiar las partes encriptadas de los bytes.

    Pequeña nota: Si repararan, solo están ali 40 bytes, eso es porque es usado el comando XOR (en asm eor) que puede diminuir el numero de bytes y voltar a poner-lo bien! Es ese el principio de los patchs IPS, ellos XORan la rom Original con la modificada, y solo los bytes alterados permanecen!
    Surge un problema porque eses datos no están siempre en el mismo hogar, que es definido por la personalidad, el primer valor de los datos que no están encriptados. Entonces torna extremamente difícil cambiar los datos. Pero por un sistema de checks, podemos hacer con que los datos sean almacenados por la misma orden en el offset de ram libre + 0x18. Eso va a tornar la rutina gigantesca, pero solo voy a presentar el codigo hex, para no ocupar la pagina web toda.

    Entonce nos queda hacer una rutina que haga lo siguiente:
    [list=1]
  • Encuentre a clave de encriptacion y la guarde en un offset de RAM libre.
  • Almacenar el CheckSum en el offset de RAM libre + 0x6
  • Decryptar y copiar los datos de lo pokemon seleccionado en el offset de RAM libre+ 0x18)
  • A partir de ese offset libre, almacene los datos en esta orden: tamaño = offset +0x08; attack = offset + 0x0c; effort = offset +0x10; misc. = offset + 0x14
  • [/list]

    Dado eso, los datos pueden ser cambiados con WTBO, siguiendo la imagen de la tablas ali arriba.
    ---------------------EDIT----------------------
    La rutina no esta user-friendly, me perdonen, pero como vosotros sabéis, esos datos encriptados cambian de posición en la RAM dependiendo del Personality Value. Yo he dado unas vueltas con la rutina para que ella pueda leer donde estan y poner los offsets de los datos por la siguiente orden: Growth(Tamaño)-Attack-Effort-Misc. Dado eso tendrán que acceder a los datos usando ASM. Pero como una buena parte de vosotros no lo sabe, yo voy a postar acá las rotinas en HEX, despues de tener todo hecho. Por ahora quedan las rutinas de encriptamiento/desencriptamiento.

    Entonces les voy a explicar algunas cosas:
    Esa rutina desencripta los datos en la RAM, en un offset libre. Para ese efecto, he elegido 0203F400.
    Para elegir el pokemon que quieren desencriptar, tendrán que elegir el slot de la party (0x0->1;0x1->2;0x2->3;0x3->4;0x4->5;0x5->6) e poner-lo en la var 8004. Porque esa VAR? Porque el Special 0x9F hace lo mismo. Vosotros eligen un pokemon y eso special pone el numero de la posicion del en la party (esto es muy bueno si queréis, por ejemplo, hacer una EV SHOP o un evento relacionado).

    La rutina de desencriptamiento es esta (en HEX):

    Tendrán que la poner en un offset que termine en 0,4,8 o C. Tiene que ser pues hay comandos ali que son de 4 bytes (el BL), Y si no están alignados correctamente, no trabajaran correctamente.

    La rutina de encriptamiento es cuasi el mismo, solo que al revés. No es tan gigantesca porque no tiene que saber onde poner la data ni el que haya sido cambiado. Primero arregla el checksum e después encripta los datos.
    Hay que ser llamada después de cualquier modificación hecha.

    Tendrán que la poner en un offset que termine en 0,4,8 o C
    Creditos a JPAN (un otro hacker, también de Portugal, pero no esta aquí) por el Checksum Fix/Rutinas. Primer me pareció bien usar mí rutina, pero JPAN me aconsejó a usar sus rutinas, para tener compatibilidad con sus códigos. Entonces, me pus a lo trabajo de convertir sus códigos de FR para R/S. El resultado: esas dos rutinas, trabajando para R/S
    Ahora es todo. Mas tarde me voy a poner como lo acceder a los datos.

    Saludos![hr]Las próximas rutinas fueran hechas por JPAN. Entonces tenéis que dar creditos a el, no a mi. Yo solo las adapte a Ruby.

    Ya saben:
    Party slot en la variable 0x8004 (para correcto desencriptamiento & encriptamiento)
    Cosas especiales en las variables 8005 arriba.
    Si quieren elegir el pokemon sin el setvar 0x8004 0xPartySlot entonces pueden recorrer al special 0x9F, que pone el party slot del pokemon han elegido en la variable 0x8004.

    La mayoría de estas rutinas usa usa las variables 0x8005 arriba como input o entonces como output.Eso significa que unas veces tienes que poner un valor en 8005 y otras es la variable que te da el valor que quieres (Ej: Viendo la pokebola de un pokemon ).
    ----------------------
    Viendo la pokebola de un pokemon!
    Útil para scripts en que solo te dejan entrar teniendo un pokemon (o entonces toda la party) en una pokebola especial, o entonces un sitio que libertes los pokemons pero guardes la bola.
    Var_8004- Party Slot
    Var_8005 es donde va a ser guardado el numero hex de la bola.
    03 b5 03 48 00 68 03 49 c0 78 c0 08 08 80 03 bd
    14 f4 03 02 CE E8 02 02

    Ejemplo de Script

    ---
    Identificar una especie pokemon
    Si, es verdad que ya hay una combinación de comandos que hace eso, pero esta rutina funciona también con huevos. Es util para trade events, o entonces para eventos como la activación de los 3 REGIs, con relicanth en 1er lugar y wailord en 6to de la party.
    03 b5 03 48 00 68 03 49 00 88 08 80 03 db 00 00
    08 f4 03 02 ce e8 02 02
    Ejemplo de script:

    ---

    Aumentando la felicidad de un Pokemon por cualquier valor (hasta 0xFF)!
    Esto es util para una Happiness shop, o entonces un evento en que un pokemon no te gusta mismo nada pero tu le salvas la vida y el desde eso se pone a gustar de ti mucho.
    0f b5 08 48 00 68 08 49 0b 88 42 7a 9a 18 ff 2a
    01 dc 62 72 0f bd ff 23 d3 1a ff 22 42 72 0b 80
    0f bd 00 00 08 f4 03 02 CE E8 02 02

    En este caso especifico tienen que hacer 'setvar 0x8005 0xValorDeFelicidad' y solo después deben hacer callasm.

    Ejemplo de script:

    -------

    Apagando todos los EV's
    A veces, en los filmes, hay magos que absorben poderes. Esto es bueno para un evento así, en que un mago retira todas las fuerzas a un pokemon tuyo.
    03 B5 03 48 00 68 00 21 01 60 81 80 03 BD 00 00
    10 F4 03 02

    Ejemplo de script:


    Por ahora es todo. Mas tarde traeré unas cuantas mas rutinas. Creditos a JPAN.

    Saludos ~Sonicarvalho
    Aka D.Ray