Difference between revisions of "Graphics directory"

From Worms Knowledge Base

Jump to: navigation, search
 
m (Wording, sections, code formatting)
 
(8 intermediate revisions by 3 users not shown)
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.
+
{{ParentArticle|[[File formats]]}}
 +
A Worms directory (a DIR file) acts 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]].
+
== File Format ==
  
File format is as follows:
+
The format (as well as others) was first reverse-engineered by [[Jon Skeet]], and implemented in [[Fudge Boy]]'s [[WA directory editor|sprite editor]].
  
* a 12-byte header, consisting of:
+
* A 12-byte header, consisting of:
** a 4-byte signature - "DIR\x1A"
+
** A 4-byte signature, "DIR\x1A"
** complete file length, including header and table of contents (4 bytes)
+
** Complete file length, including header and table of contents (4 bytes)
** address (file offset) of the directory 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 actual data of the files stored in the directory
* the table of contents, which consists of:
+
* The table of contents, consisting of:
** a signature (?) DWORD, 0x0000000A (4 bytes);
+
** 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;
+
** 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 file name matches this hash, or 0 for no matching file entries.
** the list of files stored in the directory. Each list entry consists of:
+
** 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 (relative to the start of the TOC) to the next entry for this hash value, or 0 for none (4 bytes)
*** offset within DIR file of this file entry's data (4 bytes)
+
*** Offset within DIR file of this file entry's data (4 bytes)
*** 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 file name, padded to a multiple of 4 characters (with at least one after trailing \0).
 +
 
 +
== Hash Calculation ==
 +
 
 +
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;
 +
}

Latest revision as of 16:38, 17 April 2017

(Up to File formats)

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

File Format

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

  • 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, consisting 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 file name 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, or 0 for none (4 bytes)
      • Offset within DIR file of this file entry's data (4 bytes)
      • Length of file (4 bytes)
      • The file name, padded to a multiple of 4 characters (with at least one after trailing \0).

Hash Calculation

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