Re: Dune 2 SHP file format - In conjunction with the document mentioned above, I added my findings about the format, and wrote something about it in the source code for my Dune 2 SHP file converter: /* * ====================== * Dune 2 SHP file format * ====================== * * 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. */