Dune 2 SHP specification

Matthias Mailänder edited this page Jul 7, 2014 · 2 revisions
Clone this wiki locally
======================
Dune 2 SHP file format
======================
Sourced from Red Horizon Utilities by Emanuel Rabina
http://www.ultraq.net.nz/redhorizon/

The Dune 2 SHP file, is a multiple image filetype, where each image can have
it's own set of dimensions.  The file is structured as follows:

File header:
  NumImages (2 bytes)    - the number of images in the file
  Offsets[NumImages + 1] - offset to the image header for an image.  The last
    (2 or 4 bytes each)    offset points to the end of the file.  The offsets
                           don't take into account the NumImages bytes at the
                           beginning, so add 2 bytes to the offset value to
                           get the actual position of an image header in the
                           file

The size of the offsets can be either 2 or 4 bytes.  There is no simple way
to determine which it will be, but checking the file's 4th byte to see if
it's 0, seems to be a commonly accepted practice amongst existing Dune 2 SHP
file readers:

eg: A 2-byte offset file: 01 00 06 00 EC 00 45 0A ...
    A 4-byte offset file: 01 00 08 00 00 00 EC 00 ...
                                      ^^
The marked byte will be 0 in 4-byte offset files, non 0 in 2-byte offset
files.
Lastly, like C&C SHP files, there is an extra offset, pointing to the end of
the file (or what would have been the position of another image header/data
pair).

Following the file header, are a series of image header & image data pairs.
The image header is structured as follows:

Image header:
  Flags (2 bytes)    - flags to identify the type of data following the
                       Datasize field, and/or the compression schemes used
  Slices (1 byte)    - number of Format2 slices used to encode the image
                       data.  Often this is the same as the height of the
                       image
  Width (2 bytes)    - width of the image
  Height (1 byte)    - height of the image
  Filesize (2 bytes) - size of the image data in the file
  Datasize (2 bytes) - size of the image data when Format2 encoded/compressed

Regarding the flags, there seem to be 4 values:
 - 00000000 (0) = Decompress with Format80, then Format2
 - 00000001 (1) = (see 3)
 - 00000010 (2) = Decompress with Format2
 - 00000011 (3) = A small 16-byte lookup table follows, and the image data
                  should be decompressed with Format80 then Format2.
 - 00000101 (5) = The first byte gives the size of the lookup table that
                  follows, and the image data should be decompressed with
                  Format80 then Format2.

And after this image header is the image data.