EvilEngine/HIP (File Format)
Introduction
HIP archives are container formats used by Heavy Iron Studios in some of their games, including Spongebob Squarepants: Battle For Bikini Bottom. They are used mainly to contain assets, which are the resources used to create levels, characters and menus for the games. The files usually have the extension .HIP, but some have the .HOP extension; although the types of assets kept in both are usually different, HIP and HOP do not differ by internal structure. The archives are divided into multiple sections, each of which starts with an 8 byte header containing the section name in ASCII and the total size of the section, all of which are listed below.
There are at least three different revisions of the format: the first one used in Scooby Doo: Night of 100 Frights, a second one used in Spongebob Squarepants: Battle For Bikini Bottom and a third one which is used in The Incredibles Game, The Spongebob Squarepants Movie and The Incredibles: Rise of the Underminer.
General Info
HIP archives are big endian in all versions of each game.
Header Format
// This header is present at the start of all sections. char[4] sectionName int sectionSize
String Format
Strings do not contain a character count, are zero-terminated and aligned by two bytes (all strings will have either one or two zeroes after them). This also applies to empty strings (in this case, there will be two zeroes).
Padding
The data array of the DPAK section contains a lot of padding in order to align the file data. All padding is done by bytes which are equal to 0x33.
Structure
HIPA
// This section is empty
PACK
// This section contains no data and 6 sub sections: PVER, PFLG, PCNT, PCRT, PMOD and PLAT (although PLAT is not present in Scooby Doo: Night of 100 Frights). section PVER section PFLG section PCNT section PCRT section PMOD section PLAT <pre> ===PVER=== <pre> // This section contains information about the archive version. int subVersion int clientVersion int compatible
PFLG
// This section contains archive flags. int flags
PCNT
// This section contains counters. int AHDRCount // Amount of AHDR sections int LHDRCount // Amount of LHDR sections int sizeOfLargestSourceFileAsset int sizeOfLargestLayer int sizeOfLargestSourceVirtualAsset
PCRT
// This section contains a date int fileDate // Date file was compiled string dateString // Date as string
PMOD
// This section contains a date int modDate // Date file was last changed
PLAT
// This section contains platform data. It's not present in Scooby Doo. // Format for Battle for Bikini Bottom string targetPlatform string targetPlatformName string regionFormat string language string targetGame // Format for The Incredibles, Spongebob Movie and Rise of the Underminer string targetPlatform string language string regionFormat string targetGame
DICT
// This section contains no data and 2 sub sections: ATOC and LTOC. section ATOC section LTOC
ATOC
// This section contains one AINF sub section and an array of AHDR sub sections as specified in PCNT section AINF section[AHDRCount] AHDR
AINF
int unknown
AHDR
// This section contains data and one ADBG sub section // AHDR is used to define an asset entry int assetID // identifier ID for this asset, must be unique for each asset char[4] fileType // asset type int fileOffset // relative to entire archive int fileSize int plusValue // amount of padding after file data int flags section ADBG
ADBG
// This section contains more asset data int alignment // file must be aligned to this amount of bytes in the stream, this will define the plusValue in the AHDR string assetName string assetFileName int checksum // ignored
LTOC
// This section contains one LINF sub section and an array of LHDR sub sections as specified in PCNT section LINF section[LHDRCount] LHDR
LINF
int unknown
LHDR
// This section contains data and one LDBG sub section // LHDR is used to define a layer entry int layerType int assetAmount int[assetAmount] assetIDlist section LDBG
LDBG
int unknown
STRM
// This section contains no data and 2 sub sections: DHDR and DPAK. section DHDR section DPAK
DHDR
int unknown
DPAK
// This section contains a byte array which contains all asset data. AHDR references this section by fileOffset. // If AHDRCount is 0, this section is empty (no firstPadding or data). int firstPadding // Initital padding at start of data byte[] data
Tools
HipHopTool and Industrial Park are tools capable of handling HIP files.