Creating the Halo MCC PC Transfer Tool

I started working on this tool shortly after I realized that I missed the date 343 did a one time transfer of files that were on the fileshare. I had too many maps and game types to fit on my file share anyway so it made sense to try to find a way to transfer them. I found out that a tool called Horizon which was used for modding Xbox 360 files that could find and extract the files easily after seeing a tweet by GameCheat13 that has since been removed. The downside is that each file had to be extracted and named individually. I had over 200 maps and over 50 game types which meant that it was going to take a while.

I started looking for a code solution to speed things up. I googled for a while looking for an open source tool that could read Xbox 360 files made for modding the game Borderlands called WillowTree#. I dug through and found the code that read the Xbox 360 files and after going through that code’s readme file it linked to a blank website called www.skunkiebutt.com. The Wayback Machine shows that the last time the website had content was in 2016. I started looking for another way of obtaining the original code which lead me to this GitHub repository that someone posted to archive the code.

Finally I had a way of getting the info from the files. I started working on the extraction process making as simple as calling a function and returning all the halo files. Once I did that I started on a UI to make the program user friendly. I decided on a simple Windows Forms project since I had some experience working with them before. After I had it set up, I created my own GitHub repository for it and started reworking UI and working on error handling to make it even more user friendly.

The window from the first commit to the repository.

The window from the first commit to the repository.

I had a working version that was fairly user friendly, but it wasn’t quite ready to share yet. I’m no lawyer but I knew that I needed to make the licences easily visible so I added a licence window to the program that would run when the program first opened. I made some minor changes to the main window then compiled and uploaded a release to GitHub.

I continued working on making the UI better and adding small changes like an auto resolve button to fix some small exceptions (like a file already having the same name or having a character Windows wouldn’t allow). One of the additions I really liked was an update checker. I personally hate programs that check for updates when the computer starts or are always running in the background. The solution I used was to check where the latest release link redirects to when the application starts. If you use tags like v1.0.0.0 you can simply split the redirect URL string and compare the version numbers of the tag to the current version of your application.

Update Checker Code.jpg

Screenshot support was something I wanted to do very early but wasn’t as simple as maps or game types. I compared the screenshots I downloaded as JPGs from my file share on Bungie’s website to the files I extracted from my Xbox 360. The files on the Xbox 360 were stored as JPGs but with some extra info around the JPG file. I did some more research and found out it was stored as a JFIF file. I tried viewing the extracted JFIF files online but nothing seemed to be able to display it properly. The JFIF file marks the start of the image with FF D8 and FF D9 to mark the end of the image. All the data between the start of image marker and the end of image marker is the file you would get if download it from Bungie’s website. Once I had the ability to get a JPG version from the extracted JFIF file I made some UI for screenshots.

I started adding support for Halo 3 shortly after the game was released. The games files worked exactly like Halo Reach’s files so most of it was getting some new UI set up. The UI I had thrown together for Halo: Reach worked but wasn’t going to be the easiest to add another game to. Once I pushed out support for Halo 3 I started working on making the UI easier to add games to in preparation for Halo 3:ODST and Halo 4. Each game has a section for maps, game types and screen shots. (Halo 3: ODST is an exception because there was no forge system and firefight only had skulls.) I made a class that controls each game’s tab. Now when I add support for another game the class will handle populating all the lists and getting the selected files instead of writing a repetitive code for each game. Now each button calls a function on the class which does the repetitive work.

I’m waiting for Halo 4 flighting to start working on Halo 4 support. I’m happy with my progress overall.