Hello Friends,
Welcome back to another MCC Dev & Flighting Update! This time around, we have a special guest joining us to talk through some of the updates that have come to MCC. More specifically we’ll be focusing on the improvements to better mirror legacy titles for both Halo: Combat Evolved and Halo 2.
A Living Legacy
In working on MCC, we partnered very closely with a couple studios over the years. This includes Saber Interactive, where a good friend, Roman Levedev, has been knee deep in the code across the collection. Today, we get a chance to hear about his work over the past few years in bringing many impactful changes to MCC. Let’s dive on in!
Postums: Thanks, Roman, for joining me today. First off, tell me a little bit about yourself.
Roman: Hello Tyler, my name is Roman Levedev and I am the Tech Lead from Saber Interactive who worked as Lead Project Programmer on Halo: Combat Evolved Anniversary (H:CEA) for x360, Halo 2: Anniversary (H2A) for the Xbox One and Halo Online for PC before rejoining MCC in 2019 to help bring the collection to PC.
Tell me a little bit about what helped you decide where to start first in bringing MCC closer to parity with legacy?
Scoops (Sean Cooper) mentioned in an interview that there is a branch of the Halo: Combat Evolved (H:CE) code where prototyping was started for the legacy visual fixes. I took transparent_generic and fog shader from there and ported to H:CEA code base. While going through the bug list from our bug tracking system, I saw several videos made by the Halo community on YouTube about legacy graphics issues and knew that not all bugs were covered yet. I was really impressed by the depth of analysis in one video authored by a guy who seems to be a fan of Pokémon
There were videos about Halo 2 (H2) issues as well, and other fans had created a huge list of issues in Google Sheets with image comparisons. It really drove home how passionate the community is.
What were some of the early challenges when trying to mirror MCC versions of these games with the legacy ones?
I had to find original Xbox dev kit docs and become familiar with low level assembler and all technical details of Xbox Nvidia GPU. Luckily, a couple of weeks later we found an Xbox devkit, however setup of an ancient pipeline to build the game and tools was a challenge.

Scoops really helped to find docs and different XDK versions. But still It was hard to find the correct version of Visual Studio and service packs for H2.
Having H:CE/H2 debug builds on original hardware made bug fixing a lot easier. It also helped to prove that fixes were correct. When making videos and screenshots by connecting Xbox to capture-cards, it technically isn’t actually correct. There is a transformation of digital data to analog and then back. Every capture-device makes it differently. For example, there was a bug where the Arbiter appeared dull during cutscenes. Here is the screenshot that specular, bloom, colors, shadows look very similar.
When fixing these bugs, were there ever opportunities to port the original source code over that you tried and worked or failed?
Most fixes required us to restore original high-level code and make correct DX11 implementation, for example H:CE active camo, sun, water, fog and some other effects. I made a list of all shaders and fixed them one by one, since all shaders were written in c code. H2 shaders on the other side mostly were data driven and generation of shaders for PC was mostly correct, that’s why H2 looked very similar to original. If shader generation has been totally broken, then it would be noticeable everywhere. But this also was a problem, some tags were changed for original H2 multiplayer DLC maps and hundreds of tags were changed later during port to Windows Vista. So, I had to dig through the issues one by one. While some fixes uncovered bugs in shader generation that helped to fix several bugs at once, it was not even close to H:CE, where shading fixes covered 99% of graphical issues.
Screenshot from devkit, H:CE fog example:

What was the most difficult task for Halo: CE? For Halo 2?
I think water, sound and cinematic interpolation for both legacy and remastered graphics were the most difficult tasks for H:CE. I kept fixing audio for several seasons. Environment audio was a hard topic, since every system has its own I3DL2 implementation with a huge list of different parameters, and some features not fully implemented. Matching fmod with Xbox implementation was hard. Even original code messed with occlusion and obstruction, and they were passed incorrectly to the audio subsystem. But most annoying were bugs with looping sounds, which appeared as noticeable clicks during music playback.
It took a lot of time to fix H2 shadows, but the overall impact on image quality is huge. Interesting thing is that only H2 shadows used traditional z-buffer for rendering, w-buffer was used for everything else. That’s why there were a lot of z-fighting issues. They were so bad on Elites that during initial PC port lights were removed for the multiplayer model. To fix all these issues I had to implement something like w-buffer.
In general, it was much easier to fix H:CE visuals, I managed to handle it by myself, while H2 required more hands and more time.
What areas are you still working on to bring closer to parity?
I don’t have H:CE visual issues on my plate. Some bugs that are present in Season 8 like plasma pistol tint, frame-dependent particle physics are already fixed. But H2 still needs attention, we are still working on the correct implementation of depth of field effect, water ripples, there are still some issues with particle effects.
If you could fix one bug in all of MCC, what would it be?
I’m a simple man. I see bug, I fix it 
What is your favorite bug you have fixed thus far around these legacy titles?
There was a famous bug about the ‘wrong Captain Keyes model’, the reason for this bug is that source art wasn’t submitted with updated tags. During PC port all textures were reconverted, and we got this old look.

A similar thing happened to bump maps for H:CE/H2. Sources were mostly ok, but target format was p8-bump (palletized 8-bit per pixel), which involved an additional post process that gives different results from uncompressed import. As you can see, it makes a huge difference.

Do you have any fun stories you want to share? The community always loves hearing about awesome things developers are working on behind-the-scenes.
I have couple fun stories to share!
#1 - Just a fun fact, that for H:CE when I was stitching s3d engine with H:CE engine I’ve created two windows, one for the remastered view and one for the original with legacy view. First step was to show them side-by-side and second step was to show/hide window to make sure that camera settings, first person weapon size and position were identical to legacy render. On the screenshot you can see that the camera fov was different at that time. Guys from 343 saw this feature and realized that it’s cool
Who knows, maybe without this there would be no legacy render and I would not have to fix it now.
#2 - There was a fun bug that I had to fix for H1A Xbox 360 project. There is a known glitch:
“When the level starts, if the player continues to rapidly press the enter/exit vehicle button, the player will hop out of the Pelican and then hop back in. After a few moments, the Pelican will fly back into the shaft room. After a few seconds, the player will mysteriously be ejected from the Pelican and die almost instantly when the Pelican hits the third of three large spinning disks approximately halfway down the shaft.” Source: Halopedia
The issue on Xbox was that the disk didn’t hit pelican and player was able to stay alive and walk in the shaft forever. QA marked this bug as TCR failure, non-progression. The PC build worked fine with the same maps. The reason for this difference was in the start phase of spinning ring animation; it used its object index as random seed. And Xbox 360 is a big-endian system, and you get 0x87654321 instead of 0x12345678. The Pelican was able to pass the first ring without being hit.
#3 - Bug introduced in Halo 2 Vista, “Zealot Reinforcements do not follow player after spawning”. The reason for this bug is that path-finding generation algorithm created a link between tree and stone that prevented elites to go further. It happened because bounding radius for the tree near Elites was increased from 9 to 11 to avoid some LOD issues.
Thanks so much Roman for stopping on by and sharing all the fun details for this update! It’s very appreciated.
Anytime!
Such cool stuff, I always love it when we get to talk with our partner teams and see some of the amazing things they are working on to make Halo that much better!
Well, that will do it for this edition of the MCC Development and Flighting Update. Thanks for stopping in friends. As always, we will see you online!
Cheers,
Postums