Page 1 of 1

[Pt] Modificación de los parámetros del Poké Radar para la aparición de variocolores

Posted: Sun Jun 14, 2020 10:49 pm
by Mikelan98
Image


Image Introducción Image

Hace unos días me descargué el nuevo hack de Drayano, Pokémon Renegade Platinum (llevaba años esperando a que Dray hiciese esto), y de momento lo estoy disfrutando bastante. Sin embargo, hay algo que siempre me ha frustrado, y es el Poké Radar.
Image

Para los más despistados, el Poké Radar es un objeto que permite "invocar" a Pokémon salvajes (haciendo que la hierba alta se mueva) y, si tienes suerte y vas encontrando todo el rato Pokémon de la misma especie y con el mismo nivel, se van incrementando las probabilidades de que, en una de esas, aparezca un Pokémon variocolor. Idealmente, el máximo de probabilidad para que te aparezcan los variocolores se produce en la ronda 40, aunque te pueden aparecer antes.

Nunca he conseguido mantener una cadena de más de 10 Pokémon, y es algo muy frustrante, porque con esos pocos sé que no me va a aparecer en la vida ni un triste variocolor.

Y he pensado, ya que Dray ha incrementado la probabilidad general de aparición de los variocolores (de 1/8192 a 1/512), ¿por qué no incrementar la aparición de variocolores específicamente en el método del Poké Radar? Al fin y al cabo, creo que no soy el único al que una cadena de 40 Pokémon le parece una exageración.

Image Investigación Image

Lo primero que hay que hacer es empaparse de documentación (sería un trabajazo tener que descubrir, desde cero, cómo funciona el Poké Radar internamente). Podemos empezar por buscar en portales como Wikidex.net, Pokexperto o Bulbapedia.
  1. Wikidex.net no posee ninguna información sobre cómo funciona el Poké Radar en el ámbito teórico, aunque sí tiene mucha información práctica (aunque parece ser que está copiada de Pokexperto).
  2. Pokexperto nos da la siguiente fórmula, y una tabla de las probabilidades por cada longitud de la cadena de Pokémon. Sin embargo, me da la sensación de que la fórmula es empírica (creada a partir de conocimiento estadístico), por lo que igualmente también busco en Bulbapedia.
    Image
  3. Bulbapedia nos da esta otra fórmula, junto a otra tabla como la de Pokexperto (aunque con números ligeramente distintos)
    Image

Igualmente, tenemos que encontrar (en algún portal de PokéHacking dedicado) alguna información de dónde está el código correspondiente al Poké Radar. Increíblemente, hay información de este tipo en la wiki de Project Pokémon, donde podemos ver que la rutina del Poké Radar en la RAM, en Pokémon Platinum, corresponde al offset 0x02069B00 (o lo que es lo mismo, el código está en el 0x69B00 del arm9.bin.

Si desensamblamos rápido con CrystalTile2, veremos lo siguiente:
Image

Fijaos, qué casualidad, que aparece el número 8200 nada más empezar la rutina. La fórmula de Bulbapedia tiene la constante 8200 en ella. Además, en la instrucción que está justo arriba, vemos C8h, aka 0xC8, aka 200. El otro número de la fórmula de Bulbapedia. Por lo tanto, tomamos esta fórmula como la verdadera (descartando la de Pokexperto) y construimos un modelo matemático con ella.

Image Procedimiento Image

Ya tenemos la ecuación matemática correcta, y sabemos qué dos valores podemos modificar en la ROM para hacer lo que nosotros queramos. Con la fórmula, y un documento de Excel, construimos un modelo que emule los porcentajes que nos encontramos en el juego.

Antes de nada, tenemos que analizar matemáticamente la función que hemos encontrado en Bulbapedia. Ambos valores de 65535 se anulan, pues están en numerador y denominador de la función (me imagino que esta redundancia se expresa así por la forma en la que el procesador va operando con estos números, que no es tan simple como dividir y multiplicar).

Así pues, la función principal (la que contiene los dos parámetros de importancia y la variable, nc, que representa el número de rondas) está actuando como denominador. Esto nos dará una función matemática muy similar a la siguiente:
Image

En la que hay que tener en cuenta un término matemático muy importante; asíntota. La asíntota hace referencia al punto en el que la función se hace máxima (teóricamente, roza el infinito) y vuelve por debajo. Este término va a ser muy importante a continuación, pues en las ROMs originales, la asíntota coincidía con la ronda 40 (la máxima ronda), en la que la probabilidad de encontrar al variocolor también era la máxima (0.5%). Me imagino que las rondas estarán bloqueadas por código para no llegar a la 41 y quedarse siempre en la 40, pero en el caso de que se pudiera acceder a la ronda 41 del Poké Radar, nunca nos encontraríamos un variocolor ahí. ¿Por qué? Porque, como ya he dicho, la ronda 41 ha sobrepasado la asíntota, y tendría valores de probabilidad negativos o infinitos. Esto, a nivel de procesador, se traduce en que el juego lee un valor del tipo "FFFFXXXX" y lo desprecia, asignando un 0 a la probabilidad real de que aparezca algún variocolor en esa ronda.

Variando la localización de la asíntota (mediante la correcta modificación de los parámetros) nos puede permitir adelantar el "máximo" que se producía en la ronda 40 a, por ejemplo, la ronda 20.

Image

Cabe destacar que, en la ronda 0 (nada más iniciar el Poké Radar) no puede salir ningún tile de hierba brillante. Lo he probado varias veces, modificando los parámetros, y he llegado a la conclusión de que la fórmula no se aplica en la primera ronda (si bien es posible que salga un variocolor con la probabilidad estándar de aparición de variocolores, 1/8192).

La segunda columna corresponde a la probabilidad concreta de encontrarnos, en esa ronda, algún variocolor. Por su parte, la tercera columna es la probabilidad acumulada de que, en ese punto de la cadena, salga o haya salido algún variocolor.
Image

Por otro lado, en este gráfico están representadas las probabilidades que os he comentado (en azul está la probabilidad de la ronda, en naranja, la probabilidad acumulada). Podemos ver que, con la probabilidad estándar de variocolores original (1/8192) y con los parámetros del Poké Radar originales, la probabilidad de conseguir un variocolor es extremadamente baja (incluso habiendo llegado a la ronda 40, donde sólo alcanza un 2% de probabilidad acumulada).

Tenemos, por tanto, tres factores que nos influyen.
Image

En primer lugar, veremos cómo varía el primero de ellos (la probabilidad estándar de variocolores). Se ha puesto de ejemplo la de Pokémon Renegade Platinum (en la versión completa, la probabilidad es de 1/512). No hace falta ser muy avispado para darse cuenta de que todas las probabilidades del Poké Radar se verán multiplicadas por 16 (que es 8192/512).

Image

Este primer factor (la probabilidad general de los variocolores) se ha puesto de ejemplo para reseñar su importancia a la hora de calibrar los otros dos parámetros, si bien no es útil modificarlo únicamente para el radar (porque afecta a las probabilidades generales y porque no varía ni la inclunación el punto de asíntota, es decir, el punto en el que se alcanza la ronda con mayores probabilidades).

Los otros dos parámetros deben de ser modificados conjuntamente, pues lo más importante de ellos es la relación que tienen. Hay que tener en cuenta las siguientes premisas.
  • Para evitar que la función adquiera formas raras, hay que modificar los parámetros en la misma proporción (es decir, multiplicar o dividir ambos por el mismo número).
  • Si vamos reduciendo proporcionalmente sus valores, multiplicaremos las probabilidades en la misma proporción. Por ejemplo, si dividimos entre 10 ambos parámetros (se quedan en 820 y 20) la probabilidad de variocolor en cada una de las rondas se multiplica por 10.
  • Valores más bajos (proporcionalmente) del parámetro 2 con respecto al 1 van a hacer más plana la gráfica, de forma que las probabilidades de las primeras rondas se parezcan más a las de las últimas.
  • Valores más bajos (proporcionalmente) del parámetro 1 con respecto al 2 van a desplazar la asíntota hacia la izquierda, por lo que el máximo de probabilidad se va a dar en rondas más tempranas.

Sobre este último punto, cabe destacar que la ronda a la que se alcanza varía proporcionalmente a la reducción del parámetro 1. Por ejemplo, si se divide entre 2 (quedando 4100) la asíntota se daría a la mitad de rondas (ronda 20). Muy probablemente nos interese reducir la ronda a la cual ocurre esto, para que la búsqueda de variocolores no se haga extremadamente pesada. Sin embargo, hay que tener presente que, a partir de esa ronda, ya no aparecerán más variocolores (por lo que he explicado anteriormente; las probabilidades pasan a ser negativas).

Os pongo un ejemplo:

Image

Aquí, el parámetro 2 se ha duplicado con respecto a su relación original con el parámetro 1. Por tanto, la asíntota se ha desplazado hasta la ronda 20 (donde alcanza una probabilidad del 80%). A partir de aquí, la probabilidad de variocolores es cero.

Image Plantilla misericordiosa de la salvación Image

Como sé que no habéis entendido la mitad de las cosas que he escrito, voy a dejar por aquí una plantilla de Excel para que vayáis probando a modificar los tres parámetros.

DESCARGAR PLANTILLA EXCEL

Una vez tengáis claros los valores de cada parámetro, las localizaciones de éstos en el arm9 de Pokémon Platinum (la versión inglesa) son las siguientes:
  • Parámetro 1: 0x69B0C (un solo byte)
  • Parámetro 2: 0x69B6C (valor de 4 bytes)

Esta investigación está enfocada más a la curiosidad que a otra cosa, pero siempre viene bien tener este tipo de cosas escritas (sobre todo por si alguien va a desarrollar un hack en Pokémon Platino y le interesa modificar estos detalles).