Difference between revisions of "Graphics directory"
From Worms Knowledge Base
CyberShadow (Talk | contribs) |
CyberShadow (Talk | contribs) |
||
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; }