Registrarse

[pokeemerald] Arreglar el RNG roto de Emerald

Diego Mertens

Dartrix Joven
Esto puede sonar engorroso y complicado… ¡Pero en realidad es bastante simple!
Prueba:

Simplemente, vamos a modificar src/main.c
Sí, sólo ese, ¡Ya que vamos a modificar el RNG directamente de la fuente!

Primero, tendremos que buscar esto: void SeedRngAndSetTrainerId(void)
Y reemplazamos con esto:
Código:
void SeedRngAndSetTrainerId(void)
{
    u32 seed = RtcGetMinuteCount();
    u16 val = RtcGetMinuteCount();
    seed = (seed >> 16) ^ (seed & 0xFFFF);
    SeedRng(seed);
    SeedRng(val);
    gTrainerId = val;
}
Justo arriba de eso, agregamos esto:
Código:
static void SeedRngWithRtc(void)
{
    u32 seed = RtcGetMinuteCount();
    seed = (seed >> 16) ^ (seed & 0xFFFF);
    SeedRng(seed);
}
Luego, buscamos; InitMapMusic(); y justo debajo, pegamos esto; SeedRngWithRtc();

Guardamos y compliamos. ¡Ya hemos terminado!
Sí, tengo las modificaciones de DizzyEggg, pero eso no modifica el RNG, por lo que… ¡Les funcionará igualmente!
 
Última edición:

Diego Mertens

Dartrix Joven
ACTUALIZACIÓN 5/3/2020
¡IMPORTANTE!
Debido a un pequeñísimo error de mi parte, (no agregar definición aleatoria para el TID) el ID del jugador siempre sería 0.
Para arreglarlo, es tan fácil como hacer esto:
Código:
void SeedRngAndSetTrainerId(void)
{
    u32 seed = RtcGetMinuteCount();
    u16 val = RtcGetMinuteCount();
    seed = (seed >> 16) ^ (seed & 0xFFFF);
    SeedRng(seed);
    SeedRng(val);
    gTrainerId = val;
}
Pero... También sería necesario cambiar un par de cositas para que el TID no se defina cada vez que se carga la partida...
Código:
static void SeedRngWithRtc(void)
{
    u32 seed = RtcGetMinuteCount();
    seed = (seed >> 16) ^ (seed & 0xFFFF);
    SeedRng(seed);
}
copiamos eso justo arriba de void SeedRngAndSetTrainerId(void) y luego reemplazamos el SeedRngAndSetTrainerId(); con SeedRngWithRtc();, y con eso ya deberíamos haber solucionado el problema. Lamento este error tan de novato XD
PD: En el vídeo no se aprecia este error, porque era una partida ya iniciada.
 

Diego Mertens

Dartrix Joven
Perdón por mi ignorancia pero, cuál es el problema con el RNG de pokéemerald?
El problema es con Emerald en general.
Cuando los programadores de Emerald codificaron su RNG (sacado de FireRed y LeafGreen), olvidaron poner que se "guarde" el valor actual. Por lo tanto, el valor de los Pokémon (sus stats, habilidades, etc) están fijos en la partida. ¿Cómo así? Pues porque inicia desde cero. Eso hace que, si a 3 minutos desde el 0, hubiera un shiny con naturaleza modesta, siempre al cargar la partida y a los 3 minutos obtendríamos el mismo exacto Pokémon, siempre.
Esto hace que los shiny hunting se vean extremadamente afectados, ya que tienen que empezar con un id y sid que tengan shinies cerca del tiempo de inicio.
Esto también afecta los Pokémon que salen salvajes y todo lo que tenga que ver con la aleatoriedad.
 
Arriba