Creative Coding

Halo: Combat Evolved Now Runs in a Browser Tab, 128 Players and All

Mitchell Hynes' port sits on top of a decompilation chain — punpckhdq to Bnunu to Windows/Linux/Android and now the web — averaging 94fps with 20,000 games played in five hours.

There is an unofficial web version of Halo: Combat Evolved, by developer Mitchell Hynes, at mitchellhynes.com/halo/halo.html. It has working split-screen co-op and multiplayer for up to 128 players, reportedly averaged 94 FPS, and saw around 20,000 games played within five hours of going up.

This is not emulation, and the difference is the whole point

The lineage, per 80 Level’s account: the Xbox port was brought to Windows, Linux and Android on the basis of Bnunu’s project, which itself derives from punpckhdq’s Halo decompilation.

Emulation means running the original machine code on a simulated Xbox — simulating the CPU, the GPU, the memory map. You get the original binary’s exact behaviour and you pay for the simulation layer, which is why emulating a sixth-generation console well is demanding and why it does not go faster than the original hardware without hacks.

Decompilation means recovering source code from the binary. Volunteers disassemble the machine code, work out what each function does, write C or C++ that compiles to equivalent instructions, and verify — ideally byte-for-byte against the original. The output is a source tree.

Once you have source, you have a program, not an artefact. You can compile it for anything with a compiler: ARM for Android, x86-64 for Linux, and WebAssembly for a browser. There is no simulation layer, which is why it runs at 94fps rather than at some fraction of original speed. The game is executing natively on your actual hardware.

This is the technique behind the recent wave of Ocarina of Time, Majora’s Mask, Super Mario 64 and Perfect Dark native ports, and it is one of the most significant developments in game preservation of the last decade.

Why it is so much work

Matching decompilation — producing source that compiles to bit-identical output — is brutal and slow, and the reasons are instructive:

The compiler is part of the puzzle. You have to work out which compiler, which version, and which optimisation flags produced the original binary, then write source that that compiler turns into those instructions. Modern compilers produce different code from a 2001 Microsoft toolchain for identical input.

Optimisations destroy structure. Inlining, loop unrolling, register allocation and dead-code elimination all mean the assembly’s shape does not reflect the source’s shape. Reconstructing a readable function from heavily optimised output is inference, not translation.

Nothing has a name. Variables, functions, types and struct fields are all gone. Every name in a decompilation project was chosen by a contributor who worked out what the thing did.

And data layout is load-bearing. Struct padding, alignment, endianness and vtable arrangement all have to match, or the game reads its own data wrongly.

Halo is a particularly large target: a 2001 FPS with a sophisticated engine, scripting, physics, netcode and a famously good AI system.

What the browser version changes

94fps is the headline and the preservation argument is the substance.

A decompiled game is architecture-independent. The original Xbox is a dying platform — its hardware fails, its discs rot, and its emulation depends on continued volunteer effort against a fixed target. A source tree compiles for hardware that does not exist yet. That is a qualitatively stronger form of preservation than either the disc or the emulator.

And a browser is the lowest-friction distribution there has ever been. 20,000 games in five hours is a number you get from a URL and from nothing else. No install, no storefront, no platform approval.

The 128-player figure is a modification, not a port. The original supported 16. Raising it to 128 means the netcode was understood well enough to change — which is what you can do with source and cannot do with a binary.

Worth noting what it doesn’t do: the developer says the build doesn’t play well on mobile devices, so this is a desktop-browser thing for now.

Decompilation projects of this kind distribute code, not content. You supply your own copy of the game, and the project’s tooling extracts the assets from it. That is the structural reason these projects survive — they are not redistributing anyone’s copyrighted art, audio or level data.

A browser build is a harder case, because a web page that plays a game has to get the assets from somewhere, and “bring your own copy” is awkward in a tab. How this particular build handles that is not something we can determine from the available reporting, and it is the thing most likely to determine how long the link stays up.

The underlying activity — reverse-engineering software you own for interoperability — has substantial legal protection in several jurisdictions. Serving someone else’s assets does not.