Para lograr que las plantas no tengan tiempo de espera (CD) en Plants vs. Zombies, es necesario analizar cómo el juego gestiona los datos de cada unidad. Un punto de entrada lógico es la función en la dirección 0041BA60, la cual se encarga de restar el costo de soles al plantar. A través de la ingeniería inversa, podemos deducir la existencia de una estructura o clase que define las propiedades de cada planta. Si localizamos el valor del costo de soles, es muy probable que los datos de recarga se encuentren en la misma estructura de memoria. Propuesta de la estructura de datos:
struct DatosPlanta {
int idPlanta;
int costoSolar;
int resistencia;
char nombre[32];
int tiempoEnfriamiento; // Representado en centésimas de segundo
// ... otros atributos de la interfaz y comportamiento
};
Localización del costo solar y la estructura de datos
En la función 0041BA60, el registro ebx contiene el valor del costo de la planta. Al rastrear el origen de este valor, llegamos a 00410871, donde se ejecuta un mov ebx, eax. El valor de eax proviene de una llamada previa a la subrutina plantsvszombies.sub_41DAE0. Dentro de sub_41DAE0, se observa la lógica para obtener la información detallada del objeto: ```
; Lógica simplificada de sub_41DAE0
push ebx
push esi
mov ebx, eax ; ebx recibe el ID de la planta
call <sub_467B00> ; Obtiene el costo base en soles
; ... validaciones de IDs específicos (28, 2C, 29, etc.)
mov esi, eax
; ... lógica adicional de cálculo
pop esi
pop ebx
ret
Al profundizar en `sub_467B00`, encontramos el acceso a una tabla de datos estática: ```
; sub_467B00 - Obtención de atributos mediante ID de planta
mov ecx, dword ptr ds:[6A9EC0]
mov ecx, dword ptr ds:[ecx+7F8]
; ... (comparaciones de contexto de juego)
lea eax, dword ptr ds:[eax+eax*8]
mov eax, dword ptr ds:[eax*4+69F2C0] ; Acceso al array de datos
ret
Análisis de la dirección base 0x69F2C0
La instrucción mov eax, dword ptr ds:[eax*4+69F2C0] combinada con lea eax, [eax+eax*8] revela la escala del índice. La operación matemática realizada es (ID * 9) * 4, lo que resulta en un desplazamiento de 36 bytes por cada registro de planta. Por lo tanto, cada entrada en la tabla mide exactamente 36 bytes. Al inspeccionar la memoria en el volcado (dump) cerca de la dirección base 0x69F2C0, podemos identificar los campos: 1. Primeros 4 bytes (offset 0): Costo de soles. Por ejemplo, para el Girasol el valor es 0x32 (50 en decimal).
2. Siguientes 4 bytes (offset 4): Tiempo de recarga.
Inicialmente, se podría confundir el segundo campo con la vida de la planta (HP). Sin embargo, al obsrevar que la Nuez (id 3) tiene un valor significativamente alto en comparación con el Girasol, y tras realizar pruebas modificando este valor a 1, se confirma que el enfriamiento se vuelve casi instantáneo. En este sistema, un valor de 100 equivale aproximadamente a 1 segundo de tiempo de recarga en el juego. Para eliminar el CD, basta con modificar estos valores en la tabla de datos.