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:
- Trainer ID: Se encuentra en el offset 0x02024EAE (2 bytes).
- Secret ID: Se encuentra en el offset 0x02024EB0 (2 bytes).
- Personalidad del pokémon: Los datos del equipo se encuentran en el offset 0x03004360. La personalidad del pokémon son los 4 primeros bytes, pero la posición depende de la posición de cada pokémon. Si se tratara, por ejemplo, del primer pokémon del equipo, se encontrarían en la propia dirección 0x03004360 (4 bytes).
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:
- Trainer ID: A1DF
- Secret ID: 5E9C
- Personalidad: CA5C3BC9
Pero recordemos que los datos está permutados. Así que vamos a ponerlos bien:
- Trainer ID: DFA1
- Secret ID: 9C5E
- Personalidad: C93B5CCA
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:
- Trainer ID: A1DF
- Secret ID: 5E9C
- Personalidad: D29F28DC
*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:
- Trainer ID: DFA1
- Secret ID: 9C5E
- Personalidad: DC289FD2
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.