Difference between revisions of "Graphics directory"
From Worms Knowledge Base
CyberShadow (Talk | contribs) |
|||
Line 36: | Line 36: | ||
return sum; | return sum; | ||
} | } | ||
+ | |||
+ | [[Category:Directories]] |
Revision as of 11:06, 22 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 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; }