El amigo tatapindi nos ha preparado un fix para jugar correctamente en sistemas de 64bits. Recordemos el problema que yo exponía antes si se jugaba en Windows Vista o superior, donde comentábamos que los cartelitos con las regañinas de los profesores desaparecían demasiado rápido y no se podían leer, con lo que el juego pierde toda la gracia.
Con todo esto le pregunté a tatapindi si, como otras veces ha hecho, se podía sacar de la manga un parche que solucionara este problema. Y dicho y hecho, el parche ya está listo y está testeado en Windows Vista, 7 y 8.
Breve explicación del Fix:
Este fix casero corrige el problema del juego en sistemas modernos de 64bits, que hace que los carteles con los textos de los profesores cuando nos riñen desaparezcan demasiado rápido, no pudiéndose leer.
El fix hace que se muestren estos cartelitos con le tiempo suficiente para leerlos, manteniendo los tiempos del archivo original.
La descarga incluye nuevos ejecutables que pueden convivir sin problemas con el ejecutable original, o con el traducido. Llevan distinto nombre, así que pueden estar todos juntos en la misma carpeta, y podremos ejecutar el que queramos para lanzar el juego.
También se añade el original sin traducir con el fix aplicado, por si alguien quiere probarlo en inglés en sistemas de 64bits.
Explicación técnica de los cambios en el binario:
El juego utiliza allegro 4 (alleg40.dll), una librería de plataforma independiente enfocada en la creación de multimedia y la programación de videojuegos desarrollada allá por 1995. Puede manejar tareas de bajo nivel como crear interfaces de usuario, ventanas, entradas de teclado, cargar y manejar datos, manejar imágenes, reproducir sonidos, etc. Esta librería es dependiente de DirectDraw, que es un componente activo de DirectX al cual utiliza para sincronizar el refresco de pantalla (vsync) y ajustar la velocidad de frames por segundo para que podamos jugar a una velocidad normal.
Más información detallada sobre estos cambios:
La función que utiliza allegro para realizar esto es (en ASM):
CALL DWORD PTR DS:[<&alleg40.#745>>; alleg40.vsync
Mediante [_dispsw_status] y [gfx_driver] obtiene los parámetros para implementar vsync:
if (!_dispsw_status && gfx_driver->vsync)
gfx_driver->vsync();
}
Con DirectDraw:
void gfx_directx_sync(void)
{
IDirectDraw2_WaitForVerticalBlank(directdraw, DDWAITVB_BLOCKBEGIN, NULL);
}
Utilizando GDI:
static void gfx_gdi_vsync(void)
{
WaitForSingleObject(vsync_event, INFINITE);
}
Pero hay algunas placas de video que tienen implementaciones VESA incompletas o mal desarrolladas, esto lleva a que en los sistemas actuales alleg40.vsync no pueda manejar la sincronía correctamente o ni siquiera implementarla, en todos los casos.
Este es el trozo de código que debe manejar el driver de video para el vsync:
void _set_current_refresh_rate(int rate)
{
if ((rate<40) || (rate>200))
rate = 0;
current_refresh_rate = rate;
_vsync_speed = rate ? BPS_TO_TIMER(rate) : BPS_TO_TIMER(70);
}
Entonces:
if ((dv) && ((c = ugetc(dv)) != 0) && ((c == 'y') || (c == 'Y') || (c == '1')))
_wait_for_vsync = FALSE;
else
_wait_for_vsync = TRUE;
Resumiendo:
Para realizar el fix fue necesario anular completamente la rutina vsync de allegro y reemplazarla por un trozo de código que se encargue de ello manualmente, modificando el ejecutable ya compilado del juego, agregando opcodes (instrucciones) de lenguaje ensamblador.
Resumiendo más:
Doble clic al ejecutable del juego y a divertirse! :)
Muchas gracias de nuevo de parte de todos a tatapindi, al maestro del debugger.
La descarga del fix en el post principal.