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
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;