Death Rally HAF Format
The HAF Format is a video format made for Death Rally to store the opening and ending cutscenes. Its individual frames appear to be lifted verbatim from the GIF Format, EXCEPT the pixel values have been rotated right 3 bits, basically making this the opposite of what the Death Rally BPK Format does.
Also comparing against the BPK format, because HAF uses GIF's LZW Compression, the end code is 0x101 while the reset code is 0x100.
No transparency appears to be used - these are all keyframes.
|UINT16LE||frame_count||Number of frames in this file|
Array for indicating which sound effects to play from the relevant obfuscated XM Format sound file on each keyframe
Find the XM note / frequency each sample plays at
|UINT8[frame_count]||frame_lengths||Array for indicating how long each frame is to be shown for, in 1/70ths of a second (0 == move on to the next frame as fast as possible)|
Then a series of frames follows.
|UINT16LE||length||Length of the following two fields in bytes.|
|UINT8||palette||Uncompressed VGA Palette, first 16 colours are reserved for the letterbox surrounds which expects a grey ramp|
|UINT8||min_bit_width||Minimum pixel bit depth. Always seems to be 0x08.|
|UINT8[length - 0x302]||frame_data||LZW-compressed frame data, exactly how it would be stored in a GIF after the values have been rotated right by 3 bits.|
|UINT8||end_of_image||GIF trailer. Always 0x3B.|
The 201st frame of ENDANI.HAF appears to misdecode. Find out why.
Frame data chunks
|UINT8||length||Length of this frame data chunk, or 0 to indicate the end of this image.|
|UINT8[length]||data||This chunk's data.|
This file format was reverse engineered by GreaseMonkey. If you find this information helpful in a project you're working on, please give credit where credit is due. (A link back to this wiki would be nice too!)
- GIF 89a specification for the particular flavour of LZW used.