BFRES (File Format)
BFRES is an archive format used on Wii U and in Mario Kart 8 to store graphics data. Typically, a BFRES file will contain information for one model including textures and animations, but this is not necessarily the case. BFRES seems to be a direct upgrade of the BRRES format used on Wii. Due to their vast size, large BFRES files are often compressed using YAZ0 compression.
This article describes the BFRES file format seen in Mario Kart 8. It is unknown if the file format differs between games like the BRRES format does. The basic architecture of a BFRES file is any number of subfiles each in one of 12 specific formats. Each subfile is something like a model or a texture. Unless otherwise noted, all offsets in BFRES files are relative to themselves, not the beginning of the file which is more common in other formats.
Every BFRES file begins with an 0x6c byte FRES header.
|0x00||4||"FRES" File identifier, ASCII string.|
|0x04||1||Unknown has value 0x03 in Mario Kart 8 files.[FRES 1]|
|0x05||1||Unknown has value 0x00, 0x03 or 0x04 in Mario Kart 8 files.|
|0x06||1||Unknown has value 0x00 in Mario Kart 8 files.|
|0x07||1||Unknown has value 0x01, 0x02 or 0x04 in Mario Kart 8 files.|
|0x08||2||Byte order mark (BOM): 0xFE,0xFF for big endian and 0xFF,0xFE for little endian.|
|0x0a||2||Unknown Probably a version number[FRES 2], always has value 0x0010 in Mario Kart 8 files.|
|0x0c||4||File length including all headers, in bytes.|
|0x10||4||File alignment a power of 2. Most specific data alignment required in the file. The graphics card often requires data to be aligned to specific power of 2 boundaries. If the file is loaded into memory aligned to this value[FRES 3], then all addresses will be correct for the graphics card.|
|0x14||4||File name offset (without file extension).|
|0x18||4||Unknown. Probably a length or an offset.|
|0x1c||4||String table offset.|
|0x20||4 × 12||File offsets. Offsets to index groups for each of the 12 subfile types. 0 indicates that a particular subfile type is not present.|
|0x50||2 × 12||File counts. Numer of files in the index groups for each of the 12 subfile types. 0 for subfile types which are not present.|
|0x68||4||Unknown always 0 in Mario Kart 8 files.|
|0x6c||End of FRES header|
- Almost certainly 4 separate bytes as have not yet read BOM.
- This is an assumption because of the parallel with BRRES.
- That is to say, the address of the data is a multiple of this value.