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. It's made up of 4 main sections:
 * HIPA: this section is empty. It's used to mark the start of the file.
 * PACK: this section contains general data about the archive, such as game name, creation date and number of assets.
 * DICT: this section contains asset headers and layers. Each layer has a type and is composed of certain types of assets.
 * STRM: this section contains the raw data for the assets. Each asset header references the STRM by an absolute offset.

Header Format
This header is present at the start of all sections. char[4] sectionName int sectionSize bfbb

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.

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

PVER
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.

string targetPlatform string targetPlatformName string regionFormat string language string targetGame
 * Format for Battle for Bikini Bottom

string targetPlatform string language string regionFormat string targetGame
 * Format for The Incredibles, Spongebob Movie and Rise of the Underminer

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. uint assetID \\ identifier ID for this asset, must be unique for each asset char[4] assetType \\ asset type int fileOffset \\ absolute int fileSize int plusValue \\ amount of padding after file data int flags section ADBG

ADBG
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 uint 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
HipHopFile is a library which can be used to work with HIP files.