Vidas Infinitas en los Juegos
Para conseguir vidas infinitas en un juego (la energía suele ser diferente), hay que seguir 2 pasos:
1. Encontrar la dirección dónde se almacena el número de vidas.
2. Modificar el código del juego para que no reste una vida cuando nos matemos.
Vamos a usar de ejemplo un juego sencillo, el Profanation.
El procedemiento es el siguiente:
Ejecutar juego y conocer número de vidas inicial.
Aquí hay que tener cuidado. Al comenzar el juego, vemos que tenemos 9 vidas, pero en realidad no es así: tenemos 10, porque el contador llega a 0. Lo que hay que hacer en todos los juegos es matarse para contar el número de vidas real. Si el número real coincide con las veces que podemos matarnos, ése es el número a buscar. Si no coincide, como en este caso, habrá dos opciones a buscar: las reales y las que se muestran en pantalla (en este caso son 10 ó 9).
Rutina para almacenar las vidas.
En la mayoría de los juegos, la rutina para almacenar las vidas es la siguiente:
ld a, vidas
ld (dir), a
En números decimales, la secuencia sería 62, n, 50, x, y
Por lo tanto, lo que debemos hacer ahora es cargar el código en memoria y buscar esa secuencia. En el Profanation de ejemplo, el código se carga en la dirección &1770 y se ejecuta en esa misma dirección.
Bastan dos líneas en Basic para buscar la secuencia:
10 For a= &1770 to 44000: IF PEEK(a)= 62 AND PEEK(a+1)= 10 AND PEEK(a+2)= 50 then PRINT a+1
20 NEXT
En este caso, el resultado sólo es una dirección: la 6491. Para comprobar si hemos acertado, pokeamos esa dirección con un valor diferente (por ejemplo, 5) y ejecutamos el juego. Si el juego comienza con 5 vidas, ya hemos encontrado dónde se ponen las vidas al iniciarse el juego. Si el resultado de la búsqueda hubiera dado varias direcciones, lo que hacemos es pokear cada una de esas direcciones con un valor diferente al de las vidas del juego (1, 2, 3, 4, 5, ...), ejecutar el juego y ver si las vidas han cambiado y en qué número.
¿dónde se guardan esas vidas?
Ya sabemos dónde se reinician las vidas (6491). Ahora miramos dónde se guardan esas vidas. Para ello miramos las direcciones siguientes a la 6491 y encontramos 50, 140, 74. Por tanto, la dirección donde el juego revisa las vidas es la 19084 (140+256*74)
Buscar en el código
Por último, debemos buscar en el código las secuencias que contengan la dirección 19084 (valores 140 y 74)
Otras 2 sencillas líneas de Basic nos darán las respuestas
10 For a= &1770 to 44000: IF PEEK(a)= 140 AND PEEK(a+1)= 74 then PRINT a-1,peek(a-1),Peek(a+2)
20 NEXT
La búsqueda nos proporciona 5 direcciones: 6121, 6128, 6492, 6612, 19200
Debemos empezar a buscar por las que el código siguiente sea una instrucción del tipo dec registro, generalmente dec a. Si después hay una instrucción del tipo "ld (dir), a", casi seguro que lo hemos encontrado. El primer resultado cumple los requisitos:
6120 ld a, (19084)
6124 dec a
6125 jp z, (&1770) -que es la dirección de inicio del juego-
6128 ld (19084), a
Pokeamos a 0 las direcciones 6124, 6125, 6126 y 6127 (si no pokeamos estas 3 últimas, el juego se acaba en cuanto nos matemos una vez), ejecutamos el juego y, EUREKA, tenemos vidas infinitas en el Profanation. Si no funciona con el primer resultado, habría que probar los siguientes.
Desprotegido por ABRAXAS Madrid