Difference between revisions of "Graphics directory"

From Worms Knowledge Base

Jump to: navigation, search
 
Line 1: Line 1:
 
Worms directories usually act as a file archive, containing (usually graphics) files. Its built-in hash table allows fast access to files by the file name.
 
Worms directories usually act as a file archive, containing (usually graphics) files. Its built-in hash table allows fast access to files by the file name.
  
The DIR file format, as well as others, was first reverse-engineered by [[Skeet]].
+
The DIR file format, as well as others, was first reverse-engineered by [[Skeet]], and implemented in [[Fudge Boy]]'s sprite editor.
 +
 
  
 
File format is as follows:
 
File format is as follows:
Line 18: Line 19:
 
*** length of file (4 bytes)
 
*** length of file (4 bytes)
 
*** the filename, padded to a multiple of 4 characters (with at least one after trailing \0).
 
*** 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;
 +
}

Revision as of 20:27, 4 July 2006

Worms directories usually act as a file archive, containing (usually graphics) files. Its built-in hash table allows fast access to files by the file name.

The DIR file format, as well as others, was first reverse-engineered by 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