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)
160344534
>>> str(_)[:8]
'16034453'
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.