
‹ ›First bootNowLockout, from the first boot to the sky it has now
That's Lockout on the first day it loaded in Halo Campaign Evolved, and the same view from a few builds later. Drag the divider to compare.
Halo Campaign Evolved is a Halo 1 game. Its simulation has never heard of Halo 2, yet you can now host Lockout, Zanzibar, Ascension and 22 other Halo 2 maps from the multiplayer menu, with bots, Slayer and CTF. Lockout first played on October 21, all 25 maps reached the Hub on October 24, and their lifts arrived today.
We already had a way to bring classic Halo CE maps into the game. This is the story of what changed when the maps came from a different game.
Teaching the tools a second game
Our converter starts from Halo 2's maps in The Master Chief Collection, and those files look nothing like Halo CE's. They are compressed in chunks. Every texture's pixels sit in a separate textures.dat, every sound in separate .dat files, and every weapon, vehicle and most shaders in a shared.map that all the maps lean on.
So mjolnir cache learned to read the file header, name the game a map came from and unpack Halo 2's data into the same files we produce for a Halo 1 map, in the same units and axes. Everything after that step works on either game's maps.
That left one rule: Halo 2 could not break Halo 1. We reconverted Chill Out from start to finish with the new code, and it came out byte for byte identical to the released map.
First boot: a sky 3 metres wide
Two of the first bugs are in that picture at the top.
The black sky. Halo 2 squeezes a model's positions into a range of -1 to 1 across its bounding box. We read those numbers as they were, so Lockout's whole sky became a 3 metre knot at the centre of the world.
The dark rooms. Halo 2 stores its lightmaps at half brightness and doubles them in the shader. Our materials take a lightmap as it comes, so we now double them during conversion.
With those fixed, Lockout had a sky of sorts, and a new problem.

‹ ›White planesCloud banksLockout's sky as flat white planes, then as the cloud banks and mountains it should be
Shaders with the labels removed
Those white planes are clouds. Most of the work on these maps went into problems like this one.
Halo CE's shaders are a short list of types with named fields. Halo 2 has a large set of shader templates, and the MCC files no longer keep the names of their inputs. A shader says "use these bitmaps with these numbers" without saying what any of them mean.
The answer is in the map files, though, because the compiled shaders are in there too. We read them back one template at a time and rebuilt the maths in our own materials. A cloud bank turned out to be a mask times two scrolling layers. The fog-like gas in Lockout's chambers is the same recipe.
Green gas drifting behind the glass of Lockout's chambers.
To find what was left, we toured all the maps and listed every template with no code of its own. Whatever the converter didn't recognise had been drawn as a plain opaque surface, or from one bitmap alone, and the results were easy to spot:
- Desolation's light shafts were solid white slabs until they faded by viewing angle, as Halo 2's do.
- Covenant holo panels on Midship, Desolation and Gemini were white blocks.
- Beaver Creek's creek was a glossy, unmoving picture. It now uses Halo CE's water, with moving ripples.
- Zanzibar's beach had a big white patch, which was a plane Halo 2 only uses as a mask for its water.
- Zanzibar's palms lost their leaf shapes, because those shapes are stored in the bump map's alpha channel and not the base map's.
- Backwash's sky drew black above the swamp fog, because Halo 2's fog covers the sky too.
Beaver Creek from above, its creek running through the canyon.
Backwash's swamp, lost in its heavy green fog.
Ascension's sea of cloud fooled us for a while. It looks like fog, but it's a transparent plane of cloud puffs sitting under the fog layer, with a second cloud texture scrolling across it. Once we drew it that way, wisps drifted through it, and we checked the result side by side with MCC.

‹ ›Flat planeCloud seaAscension's rocks standing in a flat grey plane, then in a sea of drifting cloud
The world underneath
Looks are only half of a map. The Halo simulation does all the collision, and it never looks at what Unreal draws, so it needs its own copy of every wall and floor.
Halo 2's collision is close to Halo CE's but stored in smaller tables, so we widen it into the older layout. Halo 2 also reuses pieces of level geometry many times, which Halo CE never did, so each copy is placed in the world and added to the collision. On Lockout, that's 3,162 surfaces in the main level, 7,312 triangles from 75 placed pieces and 840 more from 15 crates. Every surface also needs a material, so bullets and footsteps behave. Halo 2's materials map onto the 29 the game ships, closest match first.
The maps needed some game rules translated too. Halo 2 picks spawns by influence, so Lockout's starting points have no team at all. Each one now takes the side of the nearest CTF flag, which gives CTF real red and blue spawns.
Weapons are where you'll notice the translation most. For now, several Halo 2 weapons spawn as stand-ins: the battle rifle as an assault rifle, the brute shot as a fuel rod gun, and the carbine, brute plasma rifle and sentinel beam as plasma rifles.
Making Ascension's antennas turn
Ascension's great antennas swing around the map every 40 seconds. Turning the art is easy. The collision is the hard part, because the simulation's level collision can't move, so a solid arm would stay where it started while the picture of it swung away.
We tried moving the object directly. The object moved, and its physics stayed behind. The only thing the simulation moves properly is a device machine, the kind of object an elevator is. The campaign has an elevator on Assault on the Control Room, so each turning part in Halo 2 became a new machine cloned from that one, with Halo 2's collision and a new animation.

‹ ›One momentSeconds laterAscension's antennas at two moments of their turn
Three bugs came with it, each a small puzzle:
- Falling through. Our first arms were built from physics boxes, and players dropped straight through them. Players collide with a machine's collision model, not its physics boxes.
- The wobble. We set the machine's "transition time" to 40 seconds, and the antennas shook. The engine reads that field as a rate, so they were turning 40 times a second, and it looked like a slow wobble.
- The pause. Zanzibar's wheel turned for 24 seconds of every 30, then stopped for 6. The engine counts animation frames differently from Halo 2, so the wheel finished its circle early and waited.
You can now stand on an antenna arm and ride it around. Zanzibar's wheel and flywheels and Foundation's fans work the same way.
Zanzibar from above, with its great wheel beside the sea wall.
Lifts: the code shipped, the data didn't
Halo 2's lifts, jump pads and vents don't exist as Halo CE objects. They are phantoms: invisible shapes that nothing collides with, each with a direction and a push. Nothing in the simulation pushes a player the way these do, so our level loader does the work. It watches for a player inside a phantom and sets their velocity every 50 milliseconds. Each player's own game pushes them, because a push the host sends to a joiner's character does nothing.
This went into the mods on October 25, and it worked: Lockout's lift threw us out onto the top floor. Then we got caught out by our own pipeline. That test used a freshly converted Lockout. The maps on the Hub were converted before lifts existed, and the later releases only added bots to them, so no published map had the lift data. Our changelog said the lift worked, and it did, just not on the map you'd downloaded.
Lift data is only read by the loader, so we didn't need to convert anything again. add_lifts.py adds the lifts to each map's level file and refuses to continue if anything else in the map changes. As of today, 14 maps are at version 1.3.0 with their lifts, so update your maps to get them: Ascension, Backwash, Coagulation, Colossus, Desolation, Foundation, Gemini, Headlong, Ivory Tower, Lockout, Midship, Relic, Tombstone and Warlock. The other 11 have no player lifts and stay at 1.2.0.
These are less tested than we'd like, and we'd like your help. A script flew a test player into 30 of the 54 lifts, pads and vents, across 12 of the 14 maps. Only Lockout's lift has been ridden from the bottom. We haven't yet tried these:
- Coagulation's and Headlong's lifts and Backwash's main lifts, which the test didn't reach.
- A vent from the bottom. The test entered vent shafts near the top.
- A joiner riding a lift in a real match between two PCs.
- Speeds and heights against Halo 2. Ascension's jump pad reached about 32 m/s, and we don't know yet how that compares.
If a lift throws you somewhere odd, please tell us which map and which lift.
Sound
Halo 2's sounds live in those separate .dat files, as Opus audio and Xbox ADPCM, with no headers to say where anything starts. The converter pulls them out and brings them in beside the map, so you get the background loops, the hums of placed objects and, on Ascension, the antennas' own sound cues, timed to their turn.
What still isn't there
We'd rather you hear these from us:
- Doors and other sliding parts don't move, and neither do Terminal's train or Backwash's monitor.
- Colossus's and Terminal's lightning isn't drawn, and Tombstone's viewscreen is missing.
- Random detail sounds, such as Ascension's thunder and wind gusts, aren't played yet.
- Bots don't ride lifts, so on maps like Lockout they stay near where they spawn.
- Halo 2's own weapons are stand-ins, as above.
Relic's island in its dark sea.
Read the code
The Halo 2 conversion is in our public repository. If you want the full detail, every shader template included, start with these:
| What | Where |
|---|---|
| The whole conversion, step by step | docs/h2_map_conversion.md |
| Halo 2's file format | docs/h2_cache_format.md |
| What was tested for the lift release | docs/h2_lifts_release.md |
| Turning parts into machines | tools/level/h2_machines.py |
| Adding lifts to published maps | tools/level/add_lifts.py |
| How classic maps are converted | Halo CE map conversion |
All 25 maps are on the Hub, or use the Install Halo 2 maps button on the launcher's Multiplayer page. Go and ride something.
