DAT Format (Dark Legions)
Graphics data archives for Dark Legions, containing sprites and other graphics, are paired with separate header files and come in three variants that differ only slightly from each other:
- .DAT archives with .DMP header files - standard version
- .DAC archives with .DMC header files - compressed or transparent sprites (C for "compressed"?)
- .BDT archives with .BDM header files - large graphics (B for "big"?)
It is easy to tell which archives pair with which headers as they will use the same file name, save for the extension.
DMP and DMC headers
Offset | Type | Purpose |
---|---|---|
0x0000 | ! INT32LE? | ! Unknown |
0x0004 | ! INT32LE? | ! Unknown, usually (always?) identical to the value at 0x0000 |
0x0008 | Array of indices | See below |
The files generally have some NULL padding after the valid index entries; checking for the end of the index can be done by stopping when an index with a zero offset and zero graphic size is reached.
Indices:
Type | Purpose |
---|---|
UINT32LE | Offset of graphic (see notes) |
UINT8 | Graphic width (pixels) |
UINT8 | Graphic height (pixels) |
! UINT8? | ! X offset? |
! UINT8? | ! Y offset? |
! UINT8? | ! mirrored X offset? |
! UINT8? | ! mirrored Y offset? |
For DAC/DMC pairs, the graphic offsets apply to the decompressed data. To read the sprites, a memory block sufficient to hold the sum of the width × height of each graphic in the index should be allocated, and the .DAC decompressed into memory. The .DMC index's offsets can then be added to the pointer to the start of the memory block.
BDM headers
Offset | Type | Purpose |
---|---|---|
0x0000 | UINT32LE | ! X offset modifier (not fully understood) |
0x0004 | UINT32LE | ! Y offset modifier (not fully understood) |
0x0008 | Array of indices | See below |
Indices:
Type | Purpose |
---|---|
UINT32LE | Offset of graphic (in decompressed data) |
UINT16LE | Graphic width (pixels) |
UINT16LE | Graphic height (pixels) |
UINT16LE | X drawing offset |
UINT16LE | Y drawing offset |
As with .DAC files, .BDT files should be decompressed to memory first before using the index offsets to find the individual graphics.
! While the X and Y offset modifiers are not fully understood, they might define a center point around which the graphic is drawn?
Beware that if the graphic's offsets end up directing the game to draw outside of the screen area, severe errors will likely result (sufficient to crash a DOSBox session that the game is running in). It would be prudent for tool authors to include checks against writing a file that could cause such errors.
DAT / DAC / BDT data
! Need to confirm if .DAT files are compressed - probably the difference between DAT and DAC is that DACs need to be decompressed as a block for the index offsets to be valid, but DAT offsets are used first and the data blocks decompressed individually.
The data archives use a minor compression scheme reminiscent of RLE compression. When decompressing, if a byte's value is 0x00, then the next byte is a count of how many times to repeat the 0x00 value. All other values should be copied through unchanged. The decompressed data is a simple array of VGA 256-color pixel values to be interpreted using the header metadata; SK00.COL is a sensible default palette to use for interpreting them in most situations. ! 0x00 is probably considered transparent for sprites, although this needs to be confirmed.