[Pokesav] Guía de Ivs y Pids, para tratar de entender...

roflmao

Guía de Ivs y Pids, para tratar de entender la relación.

Bueno este es mi intento de explicar como se relacionan los IVs y el PID de un pokemon.

Esta guia es muy preliminaria. Se mejorara basado en las preguntas que hagan.

Lo mas importante es:

No hay preguntas que sean chorras, tontas, estupidas, etc...

Tener paciencia para aprender y lo podreis hacer.

Para poder aprender esto adecuadamente hay que superar varios aspectos matematicos.

1)Tener facilidad con los numeros binarios y hexadecimales.
2)Saber que es un bit, y que es una byte.
3)Saber sobre las operaciones >>, <<, &, |, , % que se aplican a los numeros.

1) Para ver algo sobre el sistema binaro, ve a http://es.wikipedia.org/wiki/Sistema_binario. Para

el hexadecimal: http://es.wikipedia.org/wiki/Sistema_hexadecimal

Si alguien sabe de un lugar mejor, favor de proveer un link.

2) Un bit es un digito en el systema binario. Asi como 3000 tiene 4 digitos el numero 1011b tiene

4 bits.

8 bits hacen una byte.

(La b es para indicar que el numero deberia de ser visto en el systema binario y no decimal.)

Un numero en hex se escribe con 0x al frente o h atras. (ejemplo: 0xA3F0 o A3F0h)

3) Las operaciones << y >> se pueden pensar como recorrer los bits de un numero binario.

Si preguntamos que es 5<<3, la respuesta la podemos calcular asi:

5=4+1=1(22)+0(2)+1=101b
Recorriendo 3 bits a la izquierda da 101000b. Nota, que siempre se agregan el mismo numero de

zeros por los cual se esta recorriendo.

Si hacemos 56>>3, la respuesta la podemos calcular asi:
56=32+16+8=25+24+23+ 022+02+0*1=111000b.

Recorriendo 3 bits ala derecha da 111b. Nota que siempre se desechan el mismo numero de bits por

los cual se esta recorriendo.

La operaciones & y | se pueden usar con los numeros en cualquier systema. Por ejemplo podemos

preguntar, que es (8 & 7). Para calcularlo hay que ver que 8=1000b, 7=111b,

Despues se compara cada bit y se calcula "bit por bit". 0&0=0, 0&1=0, 1&0=1, y 1&1=1.
1000b

&0111b

0000b

Para calcular 8|7 se usa que 0|0=0, 0|1=1, 1|0=1, y 1|1=1.
1000b

|0111b

1111b
Para calcular 87 se usa que 00=0, 01=1, 10=1, y 11=0.
1000b

0111b

1111b
Para calcular 8%7 divide 8 por 7 y se toma lo que sobra.

& tambien es conocida como "AND"
| tambien es conocida como "OR"
^ tambien es conocida como "XOR"

% tambien es conocida como "MOD"

El pokemon (.pkm)

Los pokemon son guardados en la partida en 136 bytes si entan en la box, o en 236 si estan en tu

equipo. Usando Pokesav es posible exportar el pokemon a un archivo *.pkm

Supongamos que es un Celebi.

Este es una Celebi Osada/Bold 30 / 30 / 30 / 31 / 30 / 30 del evento 10 Aniv.

Esto es la informacion en hex (corto para Hexadecimal)

---|00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F


00 |D4 FA 2C E0 00 00 3B 06 FB 00 00 00 0A 00 00 00
10 |80 43 05 00 AA 1E 00 07 00 00 00 00 00 00 00 00
20 |00 00 00 00 00 00 00 00 5B 01 69 00 49 00 5E 00
30 |14 0A 0A 0A 00 00 00 00 DE 7B FF 3D 00 00 00 00
40 |04 00 00 00 00 00 00 00 2D 01 2F 01 36 01 2F 01
50 |2C 01 33 01 FF FF 26 02 E9 9A 06 02 00 00 00 02
60 |00 00 00 00 00 00 00 00 22 01 21 01 DE 01 2B 01
70 |38 01 33 01 40 01 FF FF 00 00 00 07 09 0D 00 00
80 |37 00 00 04 33 02 00 00

Estan separados en bytes (si los cuentas veras que son 136).

Las primero cuatro bytes son el PID (cuando los voltemos)

Asi que PID = 0xE02CFAD4.

Los IVs estan entre 0x38 y 0x3B. Asi que los IVs son determinados de 0x3DFF7BDE

Para calcular los IVs en este caso se hace lo siguente:

Se define:
iv1= 0x3DFF7BDE & 0x7FFF;
iv2= (0x3DFF7BDE >>0xF) & 0x7FFF;

y se calcula:

SP =iv1 & 0x1f;
Ataque =(iv1 & 0x3e0)>>0x5;
Defensa =(iv1 & 0x7c00)>>0xA;
Velocidad =iv2 & 0x1f;
Ataque Especial =(iv2 & 0x3e0)>>0x5;
Defensa Especial =(iv2 & 0x7c00)>>0xA;


Ahora hay que saber que es una funcion recursiva.

En programcion es una funcion que se llama a si misma. Claro que siempre hay que enpesar de algun

valor inicial.

Matematicamente podemos pensar asi: Dado un valor inicial X[0], Una funcion recursiva que inicia

con X[0] es una para cual X[1]=F(X[0]), X[2]=F(X[1]), X[3]=F(X[2]), etcetera, donde F es la

funcion recursiva.

Si quieres calcular X[7]=F(X[6])=F(F(X[5]))=...=F(F(F(F(F(F(F(F(X[0])))))))).


En pokemon hay algo muy importante llamado Generador de numero Pseudoaleatorio (Pseudo-Random

Number Generator, en ingles). Me referire a el como PRNG.

El PRNG es una funcion recursiva.

Se define con la formula: X[n+1] = (0x41C64E6D * X[n] + 0x6073) % 0xFFFFFFFF

Se empieza con algo llamado "la seed". En el juego puede que sea un poco diferente (hablando

tecnicamente) pero para nuestras consideraciones podemos asumir que el juego determina algun X[0]

que nos dara X[1],X[2],X[3],X[4],X[5],X[6], etc.

Cada uno de esos es un numero de 32-bits.

Un numero de 32 bits, GHIJ KLMN , si lo representamos en HEX (cada letra puede ser entre

0 y F)

A GHIJ le llamaremos "la alta" (la parte alta), y a KLMN "la baja" (la parte baja).

La respuesta rapida es de que la alta de X[1] es la baja del PID y la alta de X[2] es la alta del

PID.

Hay varios algoritmos, por el momento solo describire dos.

En uno la alta de X[3] es iv1, y la alta de X[4] es iv2.
En el otro la alta de X[4] es iv1, y la alta de X[5] es iv2.


PID --> IVs


Por lo general hay que usar un programa para hacer esto.

La razon es que el PID esta compuesto de la alta de X[1] y la alta de X[2]. Esto significa que

hemos perdido algunos bits necesarios para calcular X[3], X[4], X[5].

La forma en que esto se esquiva usando un program es en la siguiente.

Supongamos que el PID es 0x45A6738F. 0x45A6 es la alta de algun X[2], y 0x738F la alta de algun X[1].

Podemos decir que X[1]=0x738F0000, y ver si el X[2] tendra la alta 0x45A6. Si es asi podemos

procedir con la calculacion de los IVs.

Intentamos X[1]=0x738F0001, y ver si el X[2] tendra la alta 0x45A6. Si es asi podemos procedir

con la calculacion de los IVs.

Intentamos X[1]=0x738F0002, y ver si el X[2] tendra la alta 0x45A6. Si es asi podemos procedir

con la calculacion de los IVs,

....
Hasta intentar X[1]=0x738FFFFF. Esos son 65536 casos que para una computadora no toma mucho

tiempo pero para uno toma demasiado.

De esta forma obtenemos todos los IVs que corresponden a ese PID.


IVs --> PID


[Este mataterial es solo con el interes de ser completo:

Los cuerpos finitos (matematicos) pueden tener pn elementos. (Este ^ no es el mismo describido

anteriormente. Este es el que dice que multiplicamos p, n veces). Donde p es un numero primo.

Y un espacio vectorial de pn elementos es un cuerpo finito. En particular podemos encontrar

elementos simetricos de suma y multiplicacion.

El espacio de numeros de 32-bits es un espacio vectorial de 232 elementos (sobre el cuerpo

finito {0,1}). Asi que el un cuerpo finito.]

Lo que todo esto nos abilita es encontrar la siguiente formula:
X[n]=0xEEB9EB65*X[n+1]+0xA3561A1.

Entonces como teniendo los 6 IVs podemos obtener iv1 y iv2:
ivs=HP+At<<5+Def<<10+Vel<<15+AtS<<20+DefS;
iv1=(ivs&0xffff)%0x8000);
iv2=ivs>>0xf;

Podemos hacer algo similar que en PID --> IVs.

Haqui podemos empezar con X[4] o X[5] dependiendo que algoritmo usemos.

En el caso los 6 IVs 31, iv1=0x7FFF, iv2=0x7FFF.

Ahora podemos dejar que X[4]=0x7FFF0000, calcular X[3] y ver si la alta es 0x7FFF. Si lo es

calculamos X[2] y X[1] para hacer el PID.

Despues podemos dejar que X[4]=0x7FFF0001, calcular X[3] y ver si la alta es 0x7FFF. Si lo es

calculamos X[2] y X[1] para hacer el PID.

De nuevo hacemos cada uno de estos hasta X[4]=0x7FFFFFFF, calculamos X[3] y ver si la alta es

0x7FFF. Si lo es calculamos X[2] y X[1] para hacer el PID.

Esto nos dara varios PID que combinan legalmente con 6 IVs en 31.


Muchas personas, especialmente las que no saben de programacion, aunque tambien algunas que si saben de programacion, quieren poder hacer esto manualmente.

Porque en cada caso hay 65536 casos, no es practico hacer PID --> IVs, o IVs --> manualmente.

Esto no significa que uno no puede calcular pares de IVs y PIDs legales. Se puede, solo hay que ser un poco menos stricto.

El PID en hex es un numero 0xGHIJKLMNO, cada letra es un variable que representa un digito en hex (entre 0 y F).

Tomemos un ejemplo:
Supongamos que el PID es 0x45A6738F. 0x45A6 es la alta de algun X[2], y 0x738F la alta de algun X[1].

Si queremos hacer unos IVs para este PID, tendremos que hacer lo que ya describi anteriormente.

Pero si solo queremos un PID con baja de 0x738F, podemos conseguir IVs para algun PID.

Si queremos que la baja del PID sea 0x738F podemos poner X[1]=0x738F3456

Usando la primera formula del : X[n+1] = (0x41C64E6D * X[n] + 0x6073) % 0xFFFFFFFF

y en una calculadora hex, calculamos X[2] = (0x41C64E6D * X[1] + 0x6073) % 0xFFFFFFFF

el resultado es: X[2]=0x266FDD11.

En una calculadora hex, calculamos X[3] = (0x41C64E6D * X[2] + 0x6073) % 0xFFFFFFFF

el resultado es: X[3]=0xBF22AEB0.

En una calculadora hex, calculamos X[4] = (0x41C64E6D * X[3] + 0x6073) % 0xFFFFFFFF

el resultado es: X[4]=0xBF1E6163.

Con esto estamos listos para hacer un par de PID y IVs.

PID=0x266F738F=644838287

iv1=BF22, iv2=BF1E.

SP =iv1 & 0x1f=2
Ataque =(iv1 & 0x3e0)>>0x5=25
Defensa =(iv1 & 0x7c00)>>0xA=15
Velocidad =iv2 & 0x1f=30
Ataque Especial =(iv2 & 0x3e0)>>0x5=24
Defensa Especial =(iv2 & 0x7c00)>>0xA=15

Si le pones ese PID y esos IVs a un pokemon y lo pasas por Legit.exe, te dira "Normal D/P or GBA".

Usuarios habituales

  • roflmao

Tags