Sacred

From XentaxWiki
Revision as of 12:56, 26 October 2005 by Paul Siramy (talk | contribs) (Change ID into Version. Added place for Headers yet to decode. Wrote which .pak file use which header)

Jump to: navigation, search

Choose archive extension:

PAK


Format Specifications

byte {3}     - Header
byte {1}     - Version

if (header == TEX && version == 3){

// PAK\Texture*.pak
uint32 {4}   - Number Of Files
uint32 {4}   - Unknown
byte {244}   - null


// for each file
uint32 {4}   - Type ID
uint32 {4}   - Offset
uint32 {4}   - Compressed Size


// for each file
char {32}    - Filename (null)
uint16 {2}   - X Image Size
uint16 {2}   - Y Image Size
byte {1}     - Type ID
uint32 {4}   - Compressed Size
byte {39}    - null Padding
byte {X}     - File Data

}
else if (header == ISO && version == 3){

// PAK\Tiles.pak
uint32 {4}   - Number Of Files
uint32 {4}   - Number Of Files Yep, again
byte {244}   - null


// for each file
uint32 {4}   - Tag_66 Always = 66
uint32 {4}   - Offset
uint32 {4}   - Tag_64 Always = 64


// for each file
char {32}    - Filename (null)
uint32 {4}   - Entry Index within the file PAK\Texture.pak (Header = TEX)
uint32 {4}   - Tile position within texture image Range from 0 to 17
byte {6}     - null
byte {1}     - Tag_1 Always = 1
byte {17}    - null

}
else if (header == CIF && version == 0){

// PAK\Creature.pak
uint32 {4}   - Number Of Files
uint32 {4}   - Unknown
byte {244}   - null


// for each file
byte {64}    - File Data

}
else if (header == WPN && version == 8){

// PAK\Weapon.pak
uint32 {4}   - Number Of Files
uint32 {4}   - Unknown


// for each file
byte {322}   - File Data

}
else if (header == SND && version == 1){

// PAK\Sound.pak
uint32 {4}   - Number Of Files
uint32 {4}   - Unknown
byte {244}   - null


// for each file
uint32 {4}   - Type ID
uint32 {4}   - Offset
uint32 {4}   - Compressed Size

}
else if (header == ITM && version == 5){

// PAK\Items*.pak
uint32 {4}   - Number Of Files
uint32 {4}   - Unknown
byte {244}   - null


// for each file
uint32 {4}   - Type ID
uint32 {4}   - Offset
uint32 {4}   - Compressed Size


// for each file
byte {56}    - Unknown
char {32}    - Filename (null)
byte {X}     - File Data

}
else if (header == ITM && version == 3){

// PAK\Items*.pak ? I don't have ITM file(s) with version = 3, in Sacred+
uint32 {4}   - Number Of Files
uint32 {4}   - Unknown
byte {244}   - null


// for each file
uint32 {4}   - Type ID
uint32 {4}   - Offset
uint32 {4}   - Compressed Size


// for each file
char {32}    - Filename (null)
byte {X}     - File Data

}
else if (header == MDL && version == 3){

// PAK\Models*.pak
Unknown

}
else if (header == MHP && version == 1){

// PAK\Motions.pak
Unknown

}
else if (header == MIX && version == 0){

// PAK\Mixed.pak
Unknown

}
else if (header == OBJ && version == 1){

// World\Floor.pak, World\Static.pak,
Unknown

}
else if (header == SPF && version == 1){

// PAK\sndProfiles.pak
Unknown

}
else if (header == TRG && version == 1){

// World\Triggers.pak
Unknown

}

File Data Format in TEX (textures) PAK

This is a simple zlib-compressed image, as the first character of the File Data indicates (it's an 'x'). The size of this File Data is 'Compressed Size' bytes, the size of the uncompressed file is :

   Uncompressed File Data Size = (X Image Size) * (Y Image Size) * 2

Once uncompressed, you have directly the pixels. Each pixel is an unsigned word (16 bits). It contains Alpha, Red, Green and Blue componant values, and each are 4 bits. A mapping of these bits would give :

   (highest bit) AAAARRRRGGGGBBBB (lowest bit)

The encoding of the pixel is Top to Bottom, and for each line is Left to Right. Note : the Alpha channel IS really used (it's not just for padding), check H_KEULE_02_1.TGA from texture00.pak for a good example (16 levels of alpha here)

MultiEx BMS Script

Not written yet

Compatible Programs