Pachinko Wars: cómo hallar el dinero

En este artículo explicaré cómo Pachinko Wars almacena el dinero en memoria y cómo localizar dicho valor utilizando el emulador Mesen.

Para ello utilizaremos la herramienta Debug → Memory Search. No debe confundirse con Debug → Memory Viewer.

Localizando el valor del dinero

Actualmente tenemos 20480G. Este valor no puede almacenarse en un único byte, ya que el valor máximo de un byte es 255.

Como no conocemos el formato utilizado por el juego para guardar el dinero, aprovecharemos la tienda para realizar algunas pruebas. Compraremos una pelotica que cuesta 10G y observaremos qué valores cambian en memoria.

Procedimiento

  1. Entrar en la tienda y situarse en la opción para comprar peloticas.
  2. Abrir la herramienta Debug → Memory Search.
  3. Realizar la primera búsqueda con los siguientes parámetros:
    • Memory type: Work RAM
    • Format: Hex
    • Value size: 16-bit
      (También podría ser 8 o 32 bits, pero inicialmente asumiremos que ocupa al menos 2 bytes.)
    • Compare To: Specific value = FFFF
    • Operator: Less than
    • Pulsar Apply Filter.
  4. Comprar una pelotica de 10G.
  5. Realizar una segunda búsqueda:
    • Compare To: Previous search value
    • Operator: Less than
    • Pulsar Apply Filter.
  6. Comprar otra pelotica de 10G.
  7. Repetir la búsqueda anterior:
    • Compare To: Previous search value
    • Operator: Less than
    • Pulsar Apply Filter.

Después de estos pasos encontraremos la dirección de memoria RAM[$11B7], cuyo contenido es 07 FE.

A primera vista estos valores no parecen tener sentido, ya que tras las compras nuestro dinero quedó en 20460G. Por lo tanto, es momento de experimentar para descubrir cómo funciona realmente este formato.

Analizando el formato

Comenzamos modificando ambos bytes:

RAM[$11B7] = 00
RAM[$11B8] = 00

Al volver al juego observamos que ahora tenemos 0G.

Probemos otro valor:

RAM[$11B7] = 01
RAM[$11B8] = 00

Ahora tenemos 10G.

Esto indica que el primer byte representa unidades de 10G. Verifiquémoslo asignando el valor máximo posible para un byte:

RAM[$11B7] = FF
RAM[$11B8] = 00

El resultado es 2550G.

La relación es evidente:

255 × 10 = 2550G

Por lo tanto, cada incremento en RAM[$11B7] equivale a 10G.

El papel del segundo byte

La siguiente hipótesis es que el segundo byte actúa como un contador que aumenta cada vez que el primer byte alcanza su valor máximo.

Probemos generando 2560G:

RAM[$11B7] = 00
RAM[$11B8] = 01

El resultado es exactamente 2560G.

Si queremos obtener 2570G, basta con hacer:

RAM[$11B7] = 01
RAM[$11B8] = 01

De esta forma podemos deducir que el dinero se almacena como un valor de 16 bits dividido en dos bytes:

Dinero = ((RAM[$11B8] * 256) + RAM[$11B7]) * 10

Dinero máximo

Si asignamos el valor máximo a ambos bytes:

RAM[$11B7] = FF
RAM[$11B8] = FF

Obtendremos:

65535 × 10 = 655350G

Por lo tanto, el valor máximo de dinero que puede almacenar el juego es 655350G.

¿Qué ocurre si vendemos peloticas con el dinero al máximo?

Quedaba una última curiosidad por resolver. Una vez alcanzado el valor máximo posible, ¿qué sucede si vendemos peloticas y el juego intenta aumentar todavía más el dinero?

Tras realizar la prueba, el resultado fue el esperado para un desbordamiento (overflow): el contador volvió al inicio y el dinero quedó reducido a 10G.

Esto confirma que el juego utiliza un contador de 16 bits sin ninguna protección adicional contra desbordamientos. Cuando se supera el valor máximo (FFFF), el contador vuelve a cero y continúa incrementándose desde ahí.

Leave a Reply

Your email address will not be published. Required fields are marked *

Are you human? Please solve:Captcha