DO/Updated Sprite Format
From Dark Omen Wiki
Line 33: | Line 33: | ||
struct SpriteFileHeader | struct SpriteFileHeader | ||
{ | { | ||
- | char ID[4]; | + | char ID[4]; // = 'WHDO' |
- | int filesize; | + | int filesize; // = the size of the file in bytes |
- | int version?; | + | int version?; // = 32 |
- | int frameDataOffset | + | int frameDataOffset // = file offset to beginning of the frame data |
- | int colourTableOffset // = file offset to beginning of the palette data | + | int colourTableOffset // = file offset to beginning of the palette data |
- | int | + | int colourTableEntries // = the total number of colours in the colour table (1) |
- | int paletteCount | + | int paletteCount // = how many unique palettes exist in this sprite |
- | int frameCount | + | int frameCount // = the number of frames of animation in this sprite |
} | } | ||
==1. Number of palette entries== | ==1. Number of palette entries== | ||
- | This is the total number of colours stored in the file, each of which belongs only to one palette. e.g. there may be 300 colours stored in the file, spread throughout 5 different palettes; the | + | This is the total number of colours stored in the file, each of which belongs only to one palette. e.g. there may be 300 colours stored in the file, spread throughout 5 different palettes; the colourTableEntries is 300, the paletteCount is 5 ) |
=Frame Headers= | =Frame Headers= | ||
Line 91: | Line 91: | ||
This offset is into the '''frame data'''. i.e. this frame's data is at SpriteHeader.frameDataOffset + FrameHeader.dataOffset and goes on to SpriteHeader.frameDataOffset + FrameHeader.dataOffset + FrameHeader.compressedSize | This offset is into the '''frame data'''. i.e. this frame's data is at SpriteHeader.frameDataOffset + FrameHeader.dataOffset and goes on to SpriteHeader.frameDataOffset + FrameHeader.dataOffset + FrameHeader.compressedSize | ||
- | = | + | =Colour Table= |
Each colour is stored as follows: | Each colour is stored as follows: | ||
- | struct | + | struct Colour |
{ | { | ||
byte blue; | byte blue; | ||
Line 103: | Line 103: | ||
} | } | ||
- | The number of colours in the | + | The number of colours in the table is stored in the file header, and palettes are made up of entries from this data |
=Frame Data= | =Frame Data= | ||
- | This part of the file consists of all of the (potentially compressed) colour indexed data for each frame. To separate it, you must know the size of each frame as listed in the frame headers | + | This part of the file consists of all of the (potentially compressed) colour indexed data for each frame. To separate it, you must know the start in the buffer and size of each frame as listed in the frame headers |
Revision as of 17:57, 19 July 2008
Contents |
Overall Structure
The overall structure of a sprite file looks a like this (in this order):
SPRITE FILE HEADER <size=32> FRAME HEADER 1 <size=32> FRAME HEADER 2 <size=32> . . FRAME HEADER (number of frames) <size=32> COLOUR TABLE ENTRY 1 <size=4> COLOUR TABLE ENTRY 2 <size=4> . . COLOUR TABLE ENTRY (number of palette entries) <size=4> FRAME 1 DATA <size=varies> FRAME 2 DATA <size=varies> . . FRAME (number of frames) DATA <size=varies>
For a description of each part, see below.
Sprite File Header
The file header consists of the first 32 bytes of the file
struct SpriteFileHeader { char ID[4]; // = 'WHDO' int filesize; // = the size of the file in bytes int version?; // = 32 int frameDataOffset // = file offset to beginning of the frame data int colourTableOffset // = file offset to beginning of the palette data int colourTableEntries // = the total number of colours in the colour table (1) int paletteCount // = how many unique palettes exist in this sprite int frameCount // = the number of frames of animation in this sprite }
1. Number of palette entries
This is the total number of colours stored in the file, each of which belongs only to one palette. e.g. there may be 300 colours stored in the file, spread throughout 5 different palettes; the colourTableEntries is 300, the paletteCount is 5 )
Frame Headers
There is one frame header for each animation frame in the sprite:
struct FrameHeader { byte frameType; // see table below (1) byte compressionType; // 0: not compressed, 1: packbits, 2: unknown (2) short colourCount; // = the number of unique colours in the frame signed short X; // = X position of this frame signed short Y; // = Y position of this frame short frameWidth; // = width of this frame short frameHeight; // = height of this frame int dataOffset; // = offset into the frame data (3) int compressedSize; // = length of the compressed frame data int uncompressedSize; // = length of the uncompressed frame data int paletteDataOffset; // = offset into the palette data int unknown; // = 0 }
1. Frame Type
Each frame has a type:
Type Description 4 This is a normal frame. 5 The frame is empty. i.e. there is no frame or palette data associated with this frame. Width and Height are 0.
2. Frame Compression
Frames can be compressed. Unit sprite files seem to use no compression at all, animations for encounters between battles (filename beginning M_) can be compressed using two methods (or be uncompressed).
Compression Type Decription 0 Uncompressed - the frame data consists of 1 byte indices in to the associated palette 1 Packbits - the frame is compressed using the PACKBITS compression scheme. 2 Unknown - the frame is compressed using an unknown compression algorithm
3. Offset Into the Frame Data
This offset is into the frame data. i.e. this frame's data is at SpriteHeader.frameDataOffset + FrameHeader.dataOffset and goes on to SpriteHeader.frameDataOffset + FrameHeader.dataOffset + FrameHeader.compressedSize
Colour Table
Each colour is stored as follows:
struct Colour { byte blue; byte green; byte red; byte padding; // =0 not used }
The number of colours in the table is stored in the file header, and palettes are made up of entries from this data
Frame Data
This part of the file consists of all of the (potentially compressed) colour indexed data for each frame. To separate it, you must know the start in the buffer and size of each frame as listed in the frame headers