Why WipEout Pulse custom skins are named 16034453


A bit more than one year ago, I started investigating the WAD file format of the 2005 PSP game "WipEout Pure" and its 2007 sequel "WipEout Pulse".

Earlier this year, the ship skin editor was released, which allowed once again to create custom liveries for the game (this feature was at some point an official feature by a Flash-based web skin editor, but that editor and server are long gone by now.

The custom skins are basically just a normal PSP-formatted save game, with a file called "16034453" that contains the texture data for the skin. But why is it called like that?

As we know from previous investigations into the WAD format, the "filename" in the WAD header is a 32-bit hash using the CRC-32 algorithm with 0xFFFFFFFF as the initial value (by default, CRC-32 uses 0x00000000 as its value).

The same algorithm is (for some reason) used to hash the "real" filename that the game looks up. The game is looking for image.dat as the filename. Instead of using the value of the hash as-is (like with WAD) or using the hexadecimal representation (which for a 32-bit value would always be 8 characters), the decimal representation is used. For a 32-bit unsigned integer, the decimal representation might be up to 10 characters (0xFFFFFFFF = 4294967295). Presumably in order to fit into the 8.3 file naming scheme, the decimal representation of the hash is therefore cut off to 8 characters, and this ends up being the 16034453 filename we have seen in the save games:

% python3
>>> import zlib
>>> zlib.crc32(b'image.dat', 0xFFFFFFFF)
>>> str(_)[:8]

This might be the reason why you don't see any mentions of "16034453" in the WipEout Pulse binary, but you DO see image.dat being used to open the ship skin. Given that it's basically using the same method (CRC-32 with different initial value) as the WAD file format, one could see this as weird "WAD contents in a folder" encoding, or maybe just a really simple form of obfuscation.

In any case, when you see 16034453, you now know it's a derived value from image.dat, which is what the game is looking for.

Thomas Perl · 2021-12-28