WAD3 Format Specification

Derived from Quake’s WAD2 format. All data types uses little endian byte order.

After the format’s header there are num_dirs directory entries that contains data about all the files within the WAD3 archive, as well as their position within the file.

Table of contents
  1. Header
  2. Directory Entry
    1. File types
  3. File Entry
    1. Qpic Image
    2. Miptex Image
    3. Font
  4. Sources

Header

typedef struct {
    char[4] magic;     // File format magic number
    int num_dirs;      // Number of Directory entries
    int dir_offset;    // Offset from the WAD3 data's beginning for first Directory entry
} Header;

The magic number is 4 bytes represented by the string WAD3 in ascii.

Directory Entry

typedef struct {
    int entry_offset;           // Offset from the beginning of the WAD3 data
    int disk_size;              // The entry's size in the archive in bytes
    int entry_size;             // The entry's uncompressed size
    char file_type;             // File type of the entry
    _Bool compressed;           // Whether the file was compressed
    short padding;
    nt_string[16] texture_name  // Null-terminated texture name
} DirEntry;

The file entries archived in the WAD3’s directory are described using an array of DirEntry structures.

File types

The WAD3 format can store up to 256 different entry types, but only three are actually supported in GoldSrc:

  • qpic (0x42): A simple image of any size.
  • miptex (0x43): World texture with dimensions that are multiple-of-16 and 4 mipmaps. This is the typical entry type.
  • font (0x45): Fixed-height font for 256 ascii characters.

File Entry

The description of the files within the WAD3 archive varies depending on its file type:

Qpic Image

A simple image of any size. I’m unsure what this is used for.

typedef struct {
    int width, height;
    char[height][width] data;
    short colors_used;
    char[colors_used][3] palette;
} QpicT;

Miptex Image

This is the file type used by world textures and is the typical type of file you find in WAD3 archives. The structure is similar to what’s used to describe textures in the BSP format.

// Image structure used by each mip level
typedef struct {
    char[width][height] data;           // Raw image data. Each byte points to an index in the palette
} MipMap;

// Texture structure
typedef struct {
    nt_string[16] texture_name;         // Null-terminated texture name
    u_int width, height;                // Dimensions of the texture (must be divisible by 16)
    u_int[4] mip_offsets;               // Offset from start of texture file to each mipmap level's image
    MipMap[4] mip_images;               // One MipMap for each mipmap level
    short colors_used;                  // Number of colors used in the palette (always 256 for GoldSrc)
    char[colors_used][3] palette        // The color palette for the mipmaps (always 256 * 3 = 768 for GoldSrc)
} MipTex;

For the MipMap images, the first image (level 0) is the texture image in its original dimensions.
All following levels have dimensions that are a quarter the size of the previous level. For example, for a 16x16 texture:

  • Level 0 is 16x16 (original)
  • Level 1 is 8x8
  • Level 2 is 4x4
  • Level 3 is 2x2

Font

Fixed-height font.

typedef struct {
    short startoffset;
    short charwidth;
} CharInfo;

typedef struct {
    int width, height;
    int row_count;
    int row_height;
    CharInfo[256] font_info;
    char[height][width] data;
    short colors_used;
    char[colors_used][3] palette;
} Font;

Sources