24977-Crianza_de_Pokémon_Shiny_en_la_guardería_\[100%]_\[INVESTIGACIÓN_FINALIZADA]_\[RUBY]
#4
Javi4315♪ 13374
[NOTA: Esto es para Ruby, como dice el título de la investigación]

Bueno, se puede determinar si un pokémon es o no shiny a partir de algunos datos de la ram. El problema es que de manera externa al rom se puede hacer, pero hacerlo en el rom es más complicado (aunque quizás existan rutinas). El problema viene porque hay que hacer operaciones XOR. Y digo que se puede porque hay una rutina para Fire Red, pero el caso es que se pudiera insertar una rutina con la misma función en Ruby.

Como sea, vamos a ver cómo determinar si el pokémon es shiny. Necesitamos los siguientes datos de la ram:



Es importante saber que estos datos están permutados, por lo que, a la hora de manipularlos, hay que tener esto en cuenta.

EJEMPLOS

Voy a hacer dos pruebas. Una con un pokémon normal y otra con uno shiny. Para las operaciones XOR utilizaré esta calculadora, ¿Por qué esta calculadora? Efectivamente, porque es la primera que he encontrado en Google.

EJEMPLO 1 - Pokémon no shiny

Obtenemos de la RAM los datos que necesitamos:



Pero recordemos que los datos está permutados. Así que vamos a ponerlos bien:



El Trainer ID y el Secret ID tienen 2 bytes, pero la personalidad tiene 4. Así que vamos a partirla en dos partes:

C93B5CCA: P1 = C93B; P2 = 5CCA.

Ahora tenemos vamos a nuestra calculadora XOR para hacer los cálculos. La fórmula es previsible:

Trainer ID ⊕ Secret ID ⊕ P1 ⊕ P2

O lo que es lo mismo (sustituyendo por los valores):

DFA1 ⊕ 9C5E ⊕ C93B ⊕ 5CCA

Y esta preciosa operación nos da como resultado: D60E

CONCLUSIÓN: El pokémon no es shiny.

EJEMPLO 2 - Pokémon shiny

(Copio el ejemplo 1 y le cambio los datos)

Obtenemos de la RAM los datos que necesitamos:



*Obviamente los valores de Trainer ID y Secret ID son los mismos porque es la misma partida. Si iniciáramos otra partida, estos datos cambiarían.

Pero recordemos que los datos está permutados. Así que vamos a ponerlos bien:



El Trainer ID y el Secret ID tienen 2 bytes, pero la personalidad tiene 4. Así que vamos a partirla en dos partes:

DC289FD2: P1 = DC28; P2 = 9FD2.

Ahora tenemos vamos a nuestra calculadora XOR para hacer los cálculos. La fórmula es previsible:

Trainer ID ⊕ Secret ID ⊕ P1 ⊕ P2

O lo que es lo mismo (sustituyendo por los valores):

DFA1 ⊕ 9C5E ⊕ DC28 ⊕ 9FD2

Y esta preciosa operación nos da como resultado: 5

CONCLUSIÓN: El pokémon sí es shiny.

Vale, ¿Y eso por qué?

Claro, os estaréis prguntando, ¿Por qué si el resultado es D60E no es shiny? ¿Y por qué si es 5 sí lo es?

Bueno, pues esto es lo más sencillo de todo. Siempre que el resultado sea menor que 8, el pokémon será shiny.

¿Entonces qué nos quedas?

Bueno. Sabemos dónde están los tres datos que necesitamos y podemos determinar si el resultado es menor que 8. Lo que necesitamos sería hacer las operaciones (XOR) de manera interna. A ver que se puede hacer.