Tiger Archive

Tiger archive files are the newer archive files used since Tomb Raider 2013, they are the replacement for bigfiles.

File names

File names are only stored in the form of a hash, just like with Bigfiles.

Until Shadow the same CRC-32 algorithm was used. In Shadow the hash switched to a 64-bit hash with the FNV-1A algorithm.

Specialisation

See the explanation on Bigfiles for more information.

Format

The file will start with a magic and the version number. The magic is TAFS (Tiger Archive FileSystem) or 0x53464154.

struct TigerArchive
{
    uint32_t magic;
    uint32_t version;
}

Version 3

This is the first iteration of the Tiger format, used in Tomb Raider and Temple of Osiris.

struct TigerArchiveEntry
{
    uint32_t hash; // Filename hash
    uint32_t specMask; // Specialisation mask
    uint32_t size;
    uint32_t packedOffset;
}

struct TigerArchive
{
    uint32_t magic;
    uint32_t version;

    uint32_t numArchives;
    uint32_t numRecords;
    uint32_t dlcIndex;

    // Config name/build dir such as pcx64-w, scarlett-w
    char configName[32];

    // All file records
    TigerArchiveEntry records[numRecords];
}

The following code can be used to decode the packed offset.

auto bigfile = packedOffset & 0xF;
auto offset = packedOffset & 0xFFFFF800;

Version 4

This is the second iteration used in Rise of the Tomb Raider.

struct TigerArchiveEntry
{
    uint32_t hash; // Filename hash
    uint32_t specMask; // Specialisation mask
    uint32_t size;
    uint32_t pad;
    uint64_t packedOffset;
}

struct TigerArchive
{
    uint32_t magic;
    uint32_t version;

    uint32_t numArchives;
    uint32_t numRecords;
    uint32_t dlcIndex;

    // Config name/build dir such as pcx64-w, scarlett-w
    char configName[32];

    // All file records
    TigerArchiveEntry records[numRecords];
}

Use the following code to decode the packed offset.

auto bigfile = packedOffset & 0xffff;
auto offset = (packedOffset >> 32) & 0xFFFFFFFF;

Version 5

This is the version used since Shadow of the Tomb Raider.

struct TigerArchiveEntry
{
    uint64_t hash; // Filename hash
    uint64_t specMask; // Specialisation mask
    uint32_t size;
    uint32_t unknown;
    uint64_t packedOffset;
}

struct TigerArchive
{
    uint32_t magic;
    uint32_t version;

    uint32_t numArchives;
    uint32_t numRecords;
    uint32_t dlcIndex;
    uint32_t language;

    // Config name/build dir such as pcx64-w, scarlett-w
    char configName[32];

    // All file records
    TigerArchiveEntry records[numRecords];
}

Use the following code to decode the packed offset.

auto bigfile = packedOffset & 0xffff;
auto offset = (packedOffset >> 32) & 0xFFFFFFFF;