May 2025 - News archive

Namebreaking
Posted by Ojan

From Diablo I and onward, up until fairly recently, Blizzard has used MPQ files to store their game data. The MPQ format is a container format that can hold multiple files and directories, like ZIP files. While the MPQ files store files, they do not store file names. To know the names of the files, an external listfile must be used. Internally, the MPQ files instead store two hashes of the file names to identify the files.

Almost all file names of all MPQ files are known, but there are a few unknown file names.

Back in the days, some 20 years ago, I tried to figure out all the names of the MPQ files of Blizzard. At university, I wrote a distributed brute-force program that would try to find one of the remaining portrait files, but it never found it.

I just created a little CUDA program to make use of the GPU to continue to brute-force where I left off many years ago. Just a little something to run in the background, in the hopes that some of the last unknown properties of the games will be revealed.

Work begun on image converter
Posted by Ojan

I have started to work on an image converter for WarCraft I and WarCraft II. I have made a library called palpngrs out of the code I had for IronGRP, which can handle conversions to and from Palettized images and PNG files. Very few lines of code then allowed me to slap together a little utility that can convert raw IMG files (used for backgrounds and dialog elements in WarCraft I and WarCraft II) as well as Cursor files (used for the mouse cursor in WarCraft I and WarCraft II) to PNGs and back.

I have some finishing touches to do and I can't decide on a name I like for it. But with this utility, IronGRP and IronTBL, a fair amount of the game files of WarCraft I and WarCraft II can now be converted to and from more accessible formats.

IronGRP 0.4 released
Posted by Ojan

IronGRP 0.4 has just been released and is avaliable at GitHub. Some of the features have been mentioned before: It has support for Extended Uncompressed GRPs and WarCraft I GRPs, and it can now correctly differentiate between different GRP types. I have added some boundary checks for width, height, offsets and frame count, and added more unit tests. It can now also generate shell completions, to make the tool more ergonomic to work with.

When converting from GRP to PNGs, IronGRP will now name the output files "uncompressed_frame_xxx.png" or "war1_frame_xxx.png", respectively. This is to make it easier to identify the type of GRP that was used when converting back to GRP. When converting from PNGs to GRP, if no CompressionType is given (or if CompressionType Auto is given), IronGRP will create an Uncompressed GRP if any of the input filenames contains "uncompressed", and create a WarCraft I style GRP if any of the input filenames contains "war1".

A fair amount of refactoring has been done, so the code is now a bit better structured, and I've prepared to move a chunk of the code to handle the conversion between PNGs and Palettized images into its own library. This will allow me to use the same code in upcomming tools that I have in mind. The cursor formats of WarCraft I and WarCraft II uses the same principle of Palettized Images, as does the Parallax SPK files of StarCraft. I suspect the tilesets of all these games do too, but I haven't looked into that yet.