De vez en cuando nos encontramos con proyectos sorprendentes, como sucede en el caso que nos ocupa ahora. En realidad os vamos a contar que Mark Russinovich, director de tecnología de Microsoft Azure, ha publicado DoomPaint, un proyecto que consigue que el juego Doom original sea jugable dentro de Microsoft Paint.
Para empezar, os diremos que el truco no consiste en portar el motor a la aplicación de dibujo, sino en copiar cada fotograma al portapapeles de Windows y pegarlo en el lienzo como si fuera una edición real de documento. El resultado alcanza hasta 35 fotogramas por segundo en su resolución nativa.
Como vamos a ver, aunque en pantalla parece un añadido a la herramienta de dibujo, el motor gráfico no vive dentro de ella, Paint solo recibe instrucciones de pegado constantes mientras el cálculo ocurre en un proceso totalmente independiente. Russinovich lo resume en la documentación del proyecto diciendo que Paint renderiza el juego, pero no lo computa.
ViZDoom, el motor que corre en segundo plano para ejecutar Doom
El cálculo recae en ViZDoom, una plataforma basada en ZDoom pensada originalmente para la investigación en aprendizaje automático visual. Este motor ejecuta sin interfaz gráfica propia el shareware DOOM1.WAD, correspondiente al primer episodio del juego original, y recurre a los WAD de Freedoom, publicados bajo licencia BSD, para los mapas que esa versión no incluye.
Al funcionar en lo que se conoce como modo headless, ViZDoom delega toda la representación visual en el proceso que gestiona el portapapeles, así que nosotros solo vemos el resultado final dentro del lienzo de Paint. Cada fotograma se convierte en un mapa de bits independiente del dispositivo y se envía al portapapeles de Windows. DoomPaint permite elegir el mapa inicial con –map, alternar entre el shareware y las fases de Freedoom con –wad, y ajustar la dificultad de 1 a 5 con –skill. ViZDoom arranca directamente sobre el mapa elegido, sin pantallas de título ni menús, una combinación que no requiere adquirir ninguna copia comercial del juego.
Cómo se resuelve la sincronización del portapapeles en Paint
Según explica Russinovich, el mayor obstáculo técnico no fue generar las imágenes, sino evitar que el programa Paint las leyera a medio escribir. Una versión inicial sobrescribía el portapapeles sin parar y, en ocasiones, remplazaba los datos de un fotograma antes de que la aplicación terminara de procesarlos, lo que producía errores de lectura al acceder a datos incompletos. Ese tipo de conflicto ocurre cuando dos procesos acceden al mismo recurso al mismo tiempo sin coordinarse entre sí.
La solución consiste en publicar un único objeto de datos OLE, el mecanismo estándar de Windows para compartir contenido entre aplicaciones a través del portapapeles, y actualizar solo los bytes de la imagen que contiene, en lugar de sustituirlo entero cada vez. Cada lectura de Paint señala además el momento exacto en que puede prepararse el siguiente fotograma, lo que elimina la condición de carrera entre ambos procesos.
Control de teclado y sonido en tiempo real
Para que podamos echar una partida sin sobresaltos, DoomPaint instala un componente de teclado de bajo nivel que intercepta las teclas de movimiento, disparo y apertura de puertas mientras la ventana de Paint permanece activa. De este modo, las pulsaciones no llegan a la aplicación de dibujo ni activan sus menús, atajos o cuadros de diálogo habituales, y podemos movernos por el mapa sin que la interfaz de edición interfiera con los controles.
Por su parte, el sonido se reproduce mediante el motor de audio de ViZDoom, y la música original del primer episodio se convierte sobre la marcha del formato MUS de Doom a MIDI, que suena a través del sintetizador integrado de Windows.
Si os animáis a probarlo en vuestro propio equipo, no necesitaréis configurar nada a mano, basta con ejecutar el script a través de este enlace.
