INFORMACIÓN DEL EQUIPO POKÉMON
Pokémon Ruby USA
¡Holas a todos!
En este tema trataremos de investigar y destapar toda la información que se esconde detrás de los Pokémon del Equipo, sí, esos 6 Pokémon que tenemos en el Menú Pokémon.
He estado investigando en la ram durante un tiempo y he conseguido sacar bastante información, aunque aún queda mucho por descubrir y eso es lo que intentaremos conseguir en este Tema.
• Información que tenemos actualmente:
• Información Extra:
• En Investigación...
• Gente que ha Colaborado con la Investigación:
• ¿Para qué sirve todo esto?
Con toda esta información y un poco de originalidad puedes hacer un montón de cosas. ¿Quieres ejemplos? Pues aquí te dejo unas cuantas cosas que puedes hacer con toda esta información, ya sea a través de WBTO o a través de rutinas ASM.
-Puedes hacer que cuando captures a algún pokémon en un evento especial, como el inicial del LT, lo recibas con menos vida de lo normal.
-Puedes hacer que un mago te gaste alguna broma cambiándole el nombre a tu Pokémon.
-Puedes crear un sistema de loterías a través del ID de cualquier información de tu Pokémon. Ejemplo: Que ganes la lotería si tienes un pokémon que su nombre empiece por un random como puede ser J.
-Puedes hacer algo más difícil como hacer que tu pokémon aumente la HP o cualquier stat durante un tiempo determinado comparando el valor del Reloj del juego a través de ASM.
No te dejo más ideas porque eso ya es tarea de tu imaginación, pero como puedes ver, se pueden realizar múltiples cosas con toda esta información, sólo es cuestión de meterle ganas.
• Ejemplo de Cambio de Nombre del Pokémon
Aquí te dejo un ejemplo de script para cambiar el nombre del 1º Pokémon del Equipo por Gershel. Los códigos en Hex de los nombres los puedes sacar de las Tablas del Thingy.
#dynamic 0x800000
#org @inicio1
"Los comandos que tú quieras"
writebytetooffset 0xC1 0x03004368 'Se pone una G a la primera letra.
writebytetooffset 0xD9 0x03004369 'Se pone una e a la segunda letra.
writebytetooffset 0xE6 0x0300436A 'Se pone una r a la tercera letra.
writebytetooffset 0xE7 0x0300436B 'Se pone una s a la cuarta letra.
writebytetooffset 0xDC 0x0300436C 'Se pone una h a la quinta letra.
writebytetooffset 0xD9 0x0300436D 'Se pone una e a la sexta letra.
writebytetooffset 0xE0 0x0300436E 'Se pone una l a la séptima letra.
writebytetooffset 0xFF 0x0300436F 'Se pone un espacio vacío en la octava letra.
writebytetooffset 0xFF 0x03004370 'Se pone un espacio vacío en la novema letra.
writebytetooffset 0xFF 0x03004371 'Se pone un espacio vacío en la décima letra.
"Los comandos que tú quieras"
end
• ¿Qué puedes hacer tú para colaborar con la Investigacion?
En el apartado de "En Investigación..." hay una lista con muchas cosas aún por investigar. Pues si tienes información que aún no se haya descubierto, puedes aportarla comentando en este Tema. Haciendo esto ayudas al avance del Rom Hacking y te ganarás un puesto entre los colaboradores de la Investigación. Igual que yo he decidido compartir toda esta información con vosotros, tú también puedes compartir la tuya con nosotros. Puedes aportar toda la información sobre los Pokémon del Equipo. También puedes aportar en "Información Extra" toda esa información que no sea de offsets, sinó de información para poner en esos offsets, como los estados Pokémon (que hay mucho por investigar aún), los símbolos del PC (que creo que ya están todos en la lista), y mucho más, como los números de los ataques, etc.
• ¿Cual es el objetivo de la Investigación?
El objetivo de la Investigación de los Pokémon del Equipo es reunir el máximo de información de la estructura de los Pokémon del Equipo en la Memoria Ram del juego, para que todos puedan hacer un uso de esta información en sus hacks y crear hacks mucho más dinamicos y divertidos.
Eso es todo. Espero que investiguéis y podáis aportar pronto más información a la investigación para reunir toda la información sobre los Pokémon del Equipo.
Saludos!
A ver, esto también lo estuve investigando un poco por encima hace algún tiempo y ayer y hoy también lo he estado mirando por un comentario de Eing. Aquí van mis conclusiones y algunas informaciones que he obtenidos, algunas yo mismo y otras que he encontrado por ahí.
Muchas cosas como el PP de los ataques, los ataques o la especie del pokémon, por ejemplo, se encuentran en una zona dentro de la estructura del pokémon en la Ram. Es una zona muy amplía. El problema es que está encriptado y si cambias un byte, bad egg. Es decir, adiós pokémon xD.
La clave principal creo que reside en 2 bytes que preceden (casi xD) a los datos encriptados del pokémon.
La imagen la he tomado de fire red, pero da igual, la estructura de los pokémon es básicamente la misma, o por lo menos, esta parte, porque también lo he mirado en ruby xD. Bueno, los 2 bytes que digo son los marcados en rojo. Los verdes no sé qué son, pero parecen irrelevantes, ya que siempre mantienen esos valores. Aunque es posible que tengan alguna función, quizás en pokémon especiales. Y lo azul son los datos del pokémon, 48 bytes exactamente. Después de eso va otra serie de bytes en "00", que no sé lo que son y el quinto byte (07) corresponde al nivel del pokémon, por situarnos xD.
El caso es que siempre, siempre, siempre que cambia algo dentro de lo marcado en azul, ya sea porque el pokémon aprende un nuevo ataque, baja el PP de cualquiera de ellos o lo que sae, esa combinación cambia. Por lo que si cambiamos cualquier dato de la zona azul sin cambiar los bytes de la zona roja a sus valores correctos, nuestro pokémon será interpretado como un bad egg.
En mi opinión, hay que averiguar como cambia la zona roja en función de los cambios que sufra la zona azul, de esa manera, podremos manipular completamente al pokémon en cuestión.
También quiero aclarar que los bytes fuera de la zona azul no están encriptados y son mucho más manipulables, pero pueden dar problemas. Por ejemplo, si le cambias el nivel a un pokémon, cuando va a subir de nivel tras una batalla (lo normal xD), se queda pillado el juego.
Bueno, eso es todo, seguiré aportando información según la vaya consiguiendo :D
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