En octubre aparecieron en el navegador versiones jugables de Halo, GTA: Vice City, God of War o Super Mario 64, y las reunimos en una lista. La pregunta que más nos han hecho después es cómo es posible: esos juegos se escribieron para consolas con procesadores, tarjetas gráficas y controles que no tienen nada que ver con una pestaña de Chrome. La respuesta es que no hay un solo truco, sino cuatro caminos distintos, y que todos terminan en la misma pieza del navegador: WebAssembly.
Un juego de consola es un programa compilado para un procesador concreto (el MIPS de la Nintendo 64, el Emotion Engine de la PlayStation 2, el Cell de la PS3) que habla directamente con su hardware: le pide al chip gráfico que dibuje, al de sonido que suene y al puerto del control que le diga qué botón se pulsó. Para que corra en una pestaña hay que resolver cinco cosas a la vez: que su código se ejecute en un procesador distinto, que sus gráficos salgan por las funciones del navegador, que su sonido también, que el control se lea igual y que sus archivos (el disco o el cartucho) estén en algún lado. Y todo a 30 o 60 cuadros por segundo. Cada camino resuelve la primera parte de manera diferente.
Emular: una consola de mentira dentro de la pestaña
Un emulador es un programa que se hace pasar por la consola: lee las instrucciones del juego una por una, averigua qué significa cada una y hace lo que haría el procesador original, y además imita el chip gráfico, el de sonido y la memoria. El juego no se toca: corre tal cual, con la ROM o la imagen del disco. Para llevarlo al navegador, el emulador mismo se compila a WebAssembly. Así funcionan EmulatorJS, que se describe como «un frontend web para RetroArch» y carga sus núcleos de consolas antiguas; js-dos, que lleva DOSBox a la pestaña para los juegos de MS-DOS, y v86, que emula una PC x86 completa y va más lejos: traduce el código de máquina «a módulos de WebAssembly mientras corre» para ganar velocidad.
El problema es el costo. Un emulador trabaja varias veces por cada instrucción del juego, y eso es fácil para una NES o un Super Nintendo, razonable para una Nintendo 64 o una PlayStation, y muy difícil para una PS2, una PS3 o una Xbox 360, que ya en una PC nativa exigen procesadores potentes. Dentro de una pestaña, con la capa extra de WebAssembly, no alcanza. Por eso los juegos de esa generación de nuestra lista no son emuladores, sino de los caminos que siguen.
Portar el código, cuando existe
Si se tiene el código fuente del juego, no hace falta imitar ninguna consola: basta con compilarlo para el navegador. La herramienta casi universal es Emscripten, un compilador que toma código en C o C++ y produce WebAssembly más el JavaScript que lo conecta con la página; incluso traduce las bibliotecas que usan los juegos de PC (SDL para ventanas y controles, OpenGL para gráficos) a sus equivalentes del navegador. Lo probamos con un pequeño «bucle de juego» en C que mueve mil objetos durante 600 cuadros, compilado con Emscripten 7.0.0 en un contenedor sin red:
$ emcc -O2 hola.c -o hola.js
$ ls -l hola.js hola.wasm
7686 hola.js
9320 hola.wasm
$ node hola.js
Hola desde WebAssembly: el objeto 999 terminó en (19.20, 19.20)
$ head -c 8 hola.wasm | od -A n -t x1
00 61 73 6d 01 00 00 00
$ gcc -O2 hola.c -o hola-nativo && ./hola-nativo
Hola desde código nativo: el objeto 999 terminó en (19.20, 19.20)El mismo archivo de C da el mismo resultado como WebAssembly y como programa nativo. Los 9 KB del .wasm empiezan con la firma 00 61 73 6d («\0asm») y la versión 1 del formato, y un navegador los ejecuta igual que Node. Así llegaron a la web los clásicos cuyo código se publicó: id Software liberó el de Doom en 1997 y el de Quake en 1999, y EA publicó en febrero de 2025, bajo licencia GPL, el de varios Command & Conquer, entre ellos Generals y Zero Hour, que hoy se juega en el navegador. Hay un detalle importante: lo que se libera es el código, no los gráficos, sonidos y mapas. EA dejó claro que esos siguen siendo suyos, y por eso el port de Generals pide los archivos de tu copia.
Descompilar o recompilar: rehacer el código que nunca se publicó
La mayoría de los juegos nunca liberó su código. La comunidad encontró dos formas de reconstruirlo a partir del programa compilado, y son las que explican casi toda la ola de octubre. Para entender qué es descompilar en general, tenemos una guía con el mismo programa descompilado en siete lenguajes.
La primera es la descompilación «coincidente»: un grupo de personas reescribe a mano, función por función, código en C que, al compilarse con el compilador original, produce exactamente los mismos bytes que el juego. El proyecto de Super Mario 64 terminó en 2019 y advierte que «no incluye todos los recursos» del juego: para compilarlo hay que poner tu propia ROM, de la que extrae los gráficos y sonidos. Con ese código ya legible se hicieron versiones para PC, como sm64coopdx, que es la base del Mario 64 multijugador de nuestra lista. Lo mismo pasó con LEGO Island: su descompilación compara cada función con el binario original, de ahí salió una versión portátil y, de esa, el port con Emscripten que se juega en isle.pizza. El Halo del navegador se apoya en otra descompilación hecha durante meses por aficionados, y Ship of Harkinian hizo lo mismo con Ocarina of Time para PC.
La segunda es la recompilación estática, que no espera a que alguien reescriba el código a mano: lo traduce una sola vez, de forma automática, a C. N64Recomp lo describe así: convierte los binarios de la Nintendo 64 «en código C que se puede compilar para cualquier plataforma», instrucción por instrucción y de forma muy literal, para evitar el trabajo que un emulador repite en cada ejecución. Con esa herramienta se hizo Majora’s Mask para PC (Zelda64Recomp, mayo de 2024), que solo pide tu copia del juego. La misma idea, aplicada a la PSP, la PS2 y la PS3, está detrás de los God of War y Gran Turismo 4 de la lista y de ps3recomp. El resultado se puede compilar como programa nativo o, otra vez con Emscripten, como WebAssembly.
La recompilación no es gratis: el programa necesita saber dónde empieza y termina cada función, y N64Recomp lo saca de una descompilación o un desensamble ya hecho. Tampoco sirve para todo: el código que se genera o se modifica mientras el juego corre, o los chips muy particulares de cada consola, siguen pidiendo trabajo a mano. Es, en parte, lo que la IA aceleró este año. Un caso cercano, aunque no sea en el navegador, es nxnative: como la Switch y los chips de Apple usan procesadores ARM, puede ejecutar el código original sin traducirlo y solo reemplaza lo que hacía el sistema de la consola.
Reimplementar el motor y usar los datos de siempre
El cuarto camino deja el código original de lado y escribe un motor nuevo que entiende los archivos del juego: los mapas, modelos, texturas y guiones. OpenRCT2 se presenta como una «reimplementación de código abierto de RollerCoaster Tycoon 2» y OpenMW como un motor que «permite jugar Morrowind». Ninguno trae el juego: los dos leen los datos de tu instalación. Como suelen estar en C o C++, también se pueden compilar a WebAssembly. reVC, la base del Vice City del navegador, está entre este camino y el anterior: sus autores reconstruyeron el código del juego a partir del binario, y también necesita los archivos de tu copia.
Lo que pone el navegador
Sea cual sea el camino, el juego termina hablando con las mismas piezas del navegador. WebAssembly ejecuta el código a una velocidad cercana a la nativa; WebGL (y su sucesor, WebGPU) dibuja en 3D usando la tarjeta gráfica; Web Audio mezcla el sonido; la Gamepad API lee los controles de Xbox o PlayStation conectados a la computadora, y IndexedDB o el sistema de archivos privado del origen (OPFS) guardan las partidas y los archivos que subes. Si el juego usa varios hilos, como casi todos los modernos (uno para el sonido, otro para la física), hace falta SharedArrayBuffer, y aquí aparece la trampa que más proyectos encuentran.
Desde las vulnerabilidades Spectre, los navegadores solo dan SharedArrayBuffer a las páginas «aisladas entre orígenes», y para eso el servidor tiene que mandar dos encabezados. La documentación de Emscripten lo advierte: el código con hilos «no funcionará» si no están bien puestos. Lo comprobamos con un programa de dos hilos compilado con -pthread, servido dos veces a Chromium:
--- sin encabezados
cross-origin-opener-policy: (no viene)
cross-origin-embedder-policy: (no viene)
crossOriginIsolated = false; typeof SharedArrayBuffer = undefined
salida del programa: (nada)
error: Failed to execute 'postMessage' on 'Worker': SharedArrayBuffer transfer requires self.crossOriginIsolated.
--- con COOP y COEP
cross-origin-opener-policy: same-origin
cross-origin-embedder-policy: require-corp
crossOriginIsolated = true; typeof SharedArrayBuffer = function
salida del programa: Dos hilos terminados: 999999 y 1500000Sin los encabezados, el programa ni siquiera arranca; con Cross-Origin-Opener-Policy: same-origin y Cross-Origin-Embedder-Policy: require-corp, funciona. El precio es que la página ya no puede cargar imágenes, guiones ni anuncios de otros sitios que no lo autoricen, por eso estos ports suelen vivir en dominios propios, sin nada más alrededor. Si quieres jugar con estas piezas desde cero, nuestro ejemplo de canvas en JavaScript y el curso de C son un buen comienzo.
Lo legal: el código no es el juego
La línea que separa a los proyectos que siguen en línea de los que cayeron es casi siempre la misma: quién pone los datos del juego. Un emulador, una descompilación o un motor reimplementado pueden ser código propio, pero los gráficos, la música, los modelos y los mapas siguen siendo de la editora, aunque el juego ya no se venda. Por eso Halo, Vice City, God of War, Gran Turismo 4, Mario 64 o Generals piden la imagen de tu disco, tu ROM o los archivos de tu instalación, mientras que los que repartían el juego entero, como Black Ops o GTA V, fueron los primeros en desaparecer. Celeste es un ejemplo de manual: su estudio pidió el 14 de octubre retirar de GitHub una versión para el navegador que incluía sus gráficos y sonidos.
Tampoco el código está a salvo. Take-Two pidió en febrero de 2021 retirar de GitHub los proyectos re3 y reVC, y en septiembre demandó a sus desarrolladores; el caso terminó en abril de 2023 con un acuerdo cuyos términos no se publicaron. The Simpsons: Hit & Run del navegador parte de un código que se filtró en 2021, lo que lo deja en una posición todavía más frágil. Y que una empresa libere el código, como EA, no libera los datos. Para el contexto más amplio, en especial ahora que la IA abarata la ingeniería inversa, revisamos qué dice la ley.
Los cuatro caminos, comparados
- Emular. Necesita: la ROM o el disco. Ventaja: sirve para cualquier juego de esa consola sin tocarlo. Costo: el más lento; en el navegador funciona bien hasta la generación de Nintendo 64 y PlayStation. Ejemplos: EmulatorJS, js-dos, v86.
- Portar el código. Necesita: el código fuente. Ventaja: el juego corre como programa propio, a máxima velocidad. Costo: solo existe para juegos cuyo código se publicó (o se filtró). Ejemplos: Doom, Quake, C&C Generals.
- Descompilar o recompilar. Necesita: reconstruir el código desde el binario, a mano o con una herramienta. Ventaja: velocidad nativa y la posibilidad de mejorar el juego (más resolución, más cuadros por segundo). Costo: meses de trabajo por juego, aunque la IA lo está acortando. Ejemplos: Super Mario 64, LEGO Island, Halo, God of War, ps3recomp.
- Reimplementar el motor. Necesita: entender los formatos de los archivos del juego. Ventaja: libertad total para corregir y ampliar. Costo: es escribir un motor completo. Ejemplos: OpenRCT2, OpenMW y, a medio camino, reVC.
Lo que cambió en 2026 no es la técnica: los cuatro caminos existen desde hace años. Cambió la velocidad. Lo que antes era el trabajo de un equipo de aficionados durante años, hoy se acelera con agentes de IA que leen desensambles y escriben código, y por eso la lista de juegos en el navegador creció en semanas. La parte difícil sigue siendo la misma de siempre: el juego tiene que ser tuyo para que esto tenga sentido.
Fuente: N64Recomp; descompilación de Super Mario 64; isle.pizza; v86; EmulatorJS; OpenRCT2; Emscripten; web.dev; retiro de re3 en GitHub; TorrentFreak; GameFromScratch. Portada: logotipo de WebAssembly de Carlos Baraza, CC0.
