Graphics directory

From Worms Knowledge Base

Revision as of 07:35, 25 August 2006 by Lex (Talk | contribs)

Jump to: navigation, search
(Up to File formats)

A Worms directory (a DIR file) usually acts as a file archive, containing (usually graphics) files. Its built-in hash table allows fast access to files of the file name.

The DIR file format, as well as others, was first reverse-engineered by Jon Skeet, and implemented in Fudge Boy's sprite editor.


File format is as follows:

  • a 12-byte header, consisting of:
    • a 4-byte signature - "DIR\x1A"
    • complete file length, including header and table of contents (4 bytes)
    • address (file offset) of the directory table of contents (4 bytes)
  • the actual data of the files stored in the directory;
  • the table of contents, which consists of:
    • a signature (?) DWORD, 0x0000000A (4 bytes);
    • a 1024-entry DWORD hash table (4096 bytes). Each entry is an offset (relative to the start of the TOC) to the first file entry, whose filename matches this hash, or 0 for no matching file entries;
    • the list of files stored in the directory. Each list entry consists of:
      • offset (relative to the start of the TOC) to the next entry for this hash value, of 0 for none (4 bytes)
      • offset within DIR file of this file entry's data (4 bytes)
      • length of file (4 bytes)
      • the filename, padded to a multiple of 4 characters (with at least one after trailing \0).


The hash function (with which the hashes to the file names are calculated) is as follows:

#define HASH_BITS 10
#define HASH_SIZE (1<<HASH_BITS)
static int hash (char *str)
{
    int sum=0;
    while (*str)
    {
        sum=((sum<<1)%HASH_SIZE)|(sum>>(HASH_BITS-1)&1);
        sum+=(unsigned char)*str++;
        sum %= HASH_SIZE;
    }
    return sum;
}
Personal tools