EvilEngine/HIP (File Format): Difference between revisions

no edit summary
No edit summary
 
(18 intermediate revisions by 3 users not shown)
Line 1:
'''HIP archives''', also referred to as '''HIP/HOP files''', are files used by Heavy Iron Studios to store all level data in their Evil Engine games. They are made up of [[assets]], which are the resources and objects used to create levels, characters and menus.
==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.
 
In [[:Category:Scooby|Scooby-Doo! Night of 100 Frights]], all HIP archives use the file extension <code>.HIP</code>. [[:Category:Scooby|SpongeBob SquarePants: Battle for Bikini Bottom]] introduced the file extension <code>.HOP</code>, which has the exact same file format as <code>.HIP</code> but is typically used to store different types of assets. Localized <code>.HIP</code> files were added in [[:Category:TSSM|The SpongeBob SquarePants Movie]] and later games to support different languages (<code>_US.HIP</code>, <code>_JP.HIP</code>, etc.).
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.
 
==GeneralFile InfoFormat==
There are three known revisions of the HIP archive format: the first one used in [[:Category:Scooby|Scooby-Doo! Night of 100 Frights]], a second one used in [[:Category:BFBB|SpongeBob SquarePants: Battle For Bikini Bottom]] and a third one which is used in [[:Category:TSSM|The SpongeBob SquarePants Movie]], [[:Category:Incredibles|The Incredibles]], [[:Category:ROTU|The Incredibles: Rise of the Underminer]] and [[:Category:RatProto|Ratatouille Prototype]].
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.
<pre>
PKR: HIP file version update history
char[4] sectionName
Version 1:
int sectionSize
- baseline
Version 2:
- Compatible version support information
- Asset data checksum
- Layer data checksum
- Creation/Modification date
Version 3:
- HIP Layers represent asset memory placement
- Layers are not compacted to reduce waste
- Loading is based on layers (was by asset)
- Added asynchronous loading support
</pre>
bfbb
 
===String FormatIntegers===
All integers in HIP archives are unsigned 32-bit (4 bytes long). They are always written in [https://en.wikipedia.org/wiki/Endianness big endian], regardless of platform.
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).
 
Integers are referred to as <code>int</code> in format descriptions.
 
===Strings===
All strings in HIP archives are [https://en.wikipedia.org/wiki/Null-terminated_string null-terminated] (i.e. end with a NULL byte, <code>'\0'</code> in C/C++). They do not have a character count at the beginning. All strings are padded at the end so that their length is a multiple of two bytes, meaning:
* Strings with an odd length (<code>"abc"</code>) will end with one NULL (hex <code>61 62 63 00</code>).
* Strings with an even length (<code>"abcd"</code>) with end with two NULLs (hex <code>61 62 63 64 00 00</code>).
* Empty strings are written as hex <code>00 00</code>.
 
Strings are referred to as <code>string</code> in format descriptions.
 
===Structure===
A HIP archive is stored as a tree of ''blocks'' (also known as chunks), where blocks can contain arbitrary data as well as any number of child blocks.
 
Each block begins with an <code>int</code> human-readable ID that determines what kind of data is present in the block, followed by an <code>int</code> length that is the total amount of bytes taken up by the block's data + child blocks, if any. After the ID and length, the block's data is stored; its format depends on the block ID (see [[#Blocks|Blocks]]). Any remaining bytes after the data make up the block's child blocks, which have the same format as normal blocks. Child blocks are parsed repeatedly until the end of the parent block is reached.
 
The basic block hierarchy common to all HIP archives is as follows:
 
* [[#HIPA|HIPA]]
* [[#PACK|PACK]] (Package)
** [[#PVER|PVER]] (PackageVersion)
** [[#PFLG|PFLG]] (PackageFlags)
** [[#PCNT|PCNT]] (PackageCount)
** [[#PCRT|PCRT]] (PackageCreated)
** [[#PMOD|PMOD]] (PackageModified)
** [[#PLAT|PLAT]] (PackagePlatform) '''[Not present in Scooby]'''
* [[#DICT|DICT]] (Dictionary)
** [[#ATOC|ATOC]] (AssetTableOfContents)
*** [[#AINF|AINF]] (AssetInfo)
*** [[#AHDR|AHDR]] (AssetHeader) '''[Multiple can be present]'''
**** [[#ADBG|ADBG]] (AssetDebug)
** [[#LTOC|LTOC]] (LayerTableOfContents)
*** [[#LINF|LINF]] (LayerInfo)
*** [[#LHDR|LHDR]] (LayerHeader) '''[Multiple can be present]'''
**** [[#LDBG|LDBG]] (LayerDebug)
* [[#STRM|STRM]] (AssetDataStream)
** [[#DHDR|DHDR]] (AssetDataHeader)
** [[#DPAK|DPAK]] (AssetDataPackage)
 
===Assets===
Assets are the most important part of HIP archives; they're like the files in ZIP archives. Assets hold all of the raw data for textures, models, sounds, and even objects within a level. Assets also have a name, as well as a unique ID (which is generated from the name using a [[Data Types#AssetID|hash algorithm]]). The ID is used by the game to find/identify assets. Assets also have a type ID that tells the game how to interpret the asset's raw data. The asset's data is stored at a specified offset in the [[#DPAK|DPAK]] block. HIP archives do not use any compression for asset data.
 
Each asset entry is represented by an [[#AHDR|AHDR]] block in HIP archives.
 
====Types====
A list of all known asset types can be found here: [[Asset#List of asset types|List of asset types]]
 
===Layers===
Layers are used by HIP archives to group assets of specific types together. Layers have a type ID that specifies what "category" of asset types they contain. For example, <code>TEXTURE</code> layers contain all of the [[RWTX]] assets in a HIP archive, <code>MODEL</code> layers contain all of the [[MODL]] assets, and <code>DEFAULT</code> layers contain many different types of assets (most <code>.HIP</code> files have all their assets in the <code>DEFAULT</code> layer).
 
Assets in the same layer have their raw data stored next to each other in the [[#DPAK|DPAK]] block. This is mainly done to optimize the memory layout of assets in-game, as well as enforce the order in which assets are loaded (e.g. <code>TEXTURE</code> layers must be stored before <code>MODEL</code> in order for textures to be applied to models properly).
 
Each layer entry is represented by an [[#LHDR|LHDR]] block in HIP archives.
 
====Types====
The following table lists all known layer types and their corresponding type IDs in each game. An empty cell means the layer type is not present in the game.
 
{| class="wikitable"
! Name !! [[:Category:Scooby|Scooby]] !! [[:Category:BFBB|BFBB]] !! [[:Category:TSSM|TSSM]] !! [[:Category:Incredibles|Incredibles]] !! [[:Category:ROTU|ROTU]] !! [[:Category:Ratatouille_prototypes|RatProto]]
|-
| DEFAULT || colspan="6" style="text-align:center" | 0
|-
| TEXTURE || colspan="6" style="text-align:center" | 1
|-
| TEXTURE_STRM || colspan="2" | || colspan="4" style="text-align:center" | 2
|-
| BSP || colspan="2" style="text-align:center" | 2 || colspan="4" style="text-align:center" | 3
|-
| MODEL || colspan="2" style="text-align:center" | 3 || colspan="4" style="text-align:center" | 4
|-
| ANIMATION || colspan="2" style="text-align:center" | 4 || colspan="4" style="text-align:center" | 5
|-
| VRAM || colspan="2" style="text-align:center" | 5 || colspan="4" style="text-align:center" | 6
|-
| SRAM || colspan="2" style="text-align:center" | 6 || colspan="4" style="text-align:center" | 7
|-
| SNDTOC || colspan="2" style="text-align:center" | 7 || colspan="4" style="text-align:center" | 8
|-
| CUTSCENE || colspan="2" style="text-align:center" | 8 || colspan="4" style="text-align:center" | 9
|-
| CUTSCENETOC || colspan="2" style="text-align:center" | 9 || colspan="4" style="text-align:center" | 10
|-
| JSPINFO || || style="text-align:center" | 10 || colspan="4" style="text-align:center" | 11
|}
 
====Layout====
HIP archives often contain multiple layers of the same type, usually placed right next to each other. In the vanilla games, assets are distributed across those layers so that each layer has roughly the same number of assets. For example, if a HIP archive has 3 <code>TEXTURE</code> layers and 30 total [[RWTX]] assets, each <code>TEXTURE</code> layer will contain 10 [[RWTX]] assets. This was most likely done for multi-threading purposes (loading multiple layers in parallel).
 
[[:Category:TSSM|The SpongeBob SquarePants Movie]] and later games have JSP layer "groups" to support multiple JSPs in one level. These are made up of 3 <code>BSP</code> layers followed by one <code>JSPINFO</code> layer. JSP layer groups often appear multiple times in a HIP archive. A <code>.HIP</code>/<code>.HOP</code> pair will always have the same number of JSP layer groups, even though they are completely empty in <code>.HIP</code> files.
 
The following tables specify the layout of layers for each game. Each table is sorted by the layers' order of appearance in HIP archives.
 
* The '''Name''' column is the internal name for each layer type.
* The '''Count''' column is how many times each layer type repeats.
* The '''Asset Types''' column lists what asset types appear in each layer type and whether they mainly appear in <code>.HIP</code>, <code>.HOP</code>, or localized <code>.HIP</code> files (e.g. <code>_US.HIP</code>).
 
{| class="wikitable"
|+ [[:Category:Scooby|Scooby-Doo! Night of 100 Frights]]
! Name !! Count !! Asset Types
|-
| TEXTURE || 1 || HIP: [[RWTX]]
|-
| BSP || 1 || HIP: [[BSP]]
|-
| MODEL || 1 || HIP: [[MODL]]
|-
| ANIMATION || 1 ||
|-
| DEFAULT || 1 || HIP: [[ALST]], [[ANIM]], [[ATBL]], [[BUTN]], [[CAM]], [[CNTR]], [[COND]], [[CSNM]], [[DPAT]], [[DSTR]], [[EGEN]], [[ENV]], [[FOG]], [[GRUP]], [[GUST]], [[HANG]], [[LITE]], [[LOBM]], [[MAPR]], [[MINF]], [[MPHT]], [[MRKR]], [[MVPT]], [[NPC]], [[PARE]], [[PARS]], [[PEND]], [[PICK]], [[PKUP]], [[PLAT]], [[PLYR]], [[PORT]], [[PRJT]], [[SCRP]], [[SFX]], [[SIMP]], [[SURF]], [[TEXT]], [[TIMR]], [[TRIG]], [[UI]], [[UIFT]], [[VOLU]]
|-
| CUTSCENE || 1 || HIP: [[CSN]]
|-
| SRAM || 1 || HIP: [[SND]], [[SNDS]]
|-
| SNDTOC || 1 || HIP: [[CTOC]], [[SNDI]]
|}
 
{| class="wikitable"
|+ [[:Category:BFBB|SpongeBob SquarePants: Battle for Bikini Bottom]]
! Name !! Count !! Asset Types
|-
| TEXTURE || 3 || HOP: [[RWTX]]
|-
| BSP || 3 || HOP: [[JSP]] (RpClump)
|-
| JSPINFO || 1 || HOP: [[JSP]] (JSP Info)
|-
| MODEL || 3 || HOP: [[MODL]]
|-
| ANIMATION || 1 || HOP: [[ANIM]]
|-
| DEFAULT || 1 || HIP: [[ALST]], [[ATBL]], [[BOUL]], [[BUTN]], [[CAM]], [[CNTR]], [[COND]], [[CRDT]], [[CSNM]], [[DPAT]], [[DSCO]], [[DSTR]], [[DYNA]], [[EGEN]], [[ENV]], [[FLY]], [[FOG]], [[GRUP]], [[LKIT]], [[MINF]], [[MRKR]], [[MVPT]], [[PARE]], [[PARP]], [[PARS]], [[PICK]], [[PKUP]], [[PLAT]], [[PLYR]], [[PORT]], [[RAW]], [[SFX]], [[SHRP]], [[SIMP]], [[SURF]], [[TEXT]], [[TIMR]], [[TRIG]], [[UI]], [[UIFT]], [[VIL]], [[VILP]]
 
HOP: [[COLL]], [[JAW]], [[LODT]], [[MAPR]], [[PIPT]], [[SHDW]]
|-
| CUTSCENE || 1 || HOP: [[CSN]]
|-
| SRAM || 1 || HOP: [[SND]], [[SNDS]]
|-
| SNDTOC || 1 || HOP: [[CTOC]], [[SNDI]]
|}
 
{| class="wikitable"
! Name !! Count !! Asset Types
|+ [[:Category:TSSM|The SpongeBob SquarePants Movie]]
|-
| TEXTURE || 3 || HOP: [[RWTX]]
|-
| TEXTURE_STRM || 1 || HIP: [[TEXS]]
|-
| BSP || 3 || HOP: [[JSP]] (RpClump)
|-
| JSPINFO || 1 || HOP: [[JSP]] (JSP Info)
|-
| MODEL || 3 || HOP: [[MODL]]
|-
| ANIMATION || 1 ||
|-
| DEFAULT || 1 || HIP: [[ALST]], [[ATBL]], [[BOUL]], [[BUTN]], [[CAM]], [[CNTR]], [[COND]], [[CSNM]], [[DPAT]], [[DSCO]], [[DYNA]], [[EGEN]], [[ENV]], [[FLY]], [[FOG]], [[GRUP]], [[LKIT]], [[MINF]], [[MRKR]], [[MVPT]], [[PARE]], [[PARP]], [[PARS]], [[PICK]], [[PKUP]], [[PLAT]], [[PLYR]], [[PORT]], [[RANM]], [[RAW]], [[SCRP]], [[SDFX]], [[SGRP]], [[SIMP]], [[SPLN]], [[SURF]], [[TIMR]], [[TRIG]], [[UIM]]
 
HOP: [[ANIM]], [[COLL]], [[DEST]], [[JAW]], [[LODT]], [[MAPR]], [[PIPT]], [[SHRP]]
 
Localized HIP: [[CRDT]], [[TEXT]]
|-
| CUTSCENE || 1 || HOP: [[CSN]]
|-
| SRAM || 1 || HOP: [[CSSS]], [[SND]], [[SNDS]]
|-
| SNDTOC || 1 || HOP: [[SNDI]]
|-
| CUTSCENETOC || 1 || HOP: [[CTOC]]
|}
 
{| class="wikitable"
|+ [[:Category:Incredibles|The Incredibles]]
! Name !! Count !! Asset Types
|-
| TEXTURE || 3 || HOP: [[RWTX]]
|-
| TEXTURE_STRM || 1 || HIP: [[BINK]], [[TEXS]], [[WIRE]]
|-
| BSP || 3 || HOP: [[JSP]] (RpClump)
|-
| JSPINFO || 1 || HOP: [[JSP]] (JSP Info)
|-
| MODEL || 3 || HOP: [[MODL]]
|-
| ANIMATION || 1 ||
|-
| DEFAULT || 1 || HIP: [[ALST]], [[ATBL]], [[ATKT]], [[BOUL]], [[BUTN]], [[CAM]], [[CNTR]], [[COND]], [[CSNM]], [[DPAT]], [[DUPC]], [[DYNA]], [[ENV]], [[FOG]], [[GRUP]], [[LKIT]], [[MINF]], [[MRKR]], [[MVPT]], [[NPCS]], [[ONEL]], [[PGRS]], [[PICK]], [[PLAT]], [[PLYR]], [[PORT]], [[RANM]], [[RAW]], [[SCRP]], [[SDFX]], [[SGRP]], [[SIMP]], [[SLID]], [[SPLP]], [[SSET]], [[SURF]], [[TIMR]], [[TPIK]], [[TRIG]], [[TRWT]], [[UIM]], [[VIL]], [[ZLIN]]
 
HOP: [[ANIM]], [[COLL]], [[DEST]], [[DTRK]], [[GRSM]], [[LODT]], [[MAPR]], [[NGMS]], [[PIPT]], [[SHRP]], [[SPLN]]
 
Localized HIP: [[CRDT]], [[SUBT]], [[TEXT]]
|-
| CUTSCENE || 1 || HOP: [[CSN]]
|-
| SRAM || 1 || HOP: [[CSSS]], [[SND]], [[SNDS]]
 
Localized HIP: [[SNDS]]
|-
| SNDTOC || 1 || HOP: [[SNDI]]
 
Localized HIP: [[SNDI]]
|-
| CUTSCENETOC || 1 || HOP: [[CTOC]]
|}
 
{| class="wikitable"
|+ [[:Category:ROTU|The Incredibles: Rise of the Underminer]]
! Name !! Count !! Asset Types
|-
| TEXTURE || 3 || HOP: [[RWTX]]
|-
| TEXTURE_STRM || 1 || HIP: [[TEXS]], [[WIRE]]
 
HOP: [[BINK]]
|-
| BSP || 3 || HOP: [[JSP]] (RpClump)
|-
| JSPINFO || 1 || HOP: [[JSP]] (JSP Info)
|-
| MODEL || 3 || HOP: [[MODL]]
|-
| ANIMATION || 1 || HOP: [[ANIM]]
|-
| DEFAULT || 1 || HIP: [[ALST]], [[ATBL]], [[BOUL]], [[CAM]], [[CCRV]], [[CNTR]], [[COND]], [[DPAT]], [[DYNA]], [[ENV]], [[FOG]], [[GRUP]], [[LKIT]], [[MINF]], [[MRKR]], [[MVPT]], [[NPCS]], [[PARE]], [[PARP]], [[PARS]], [[PGRS]], [[PICK]], [[PLAT]], [[PLYR]], [[PORT]], [[RAW]], [[SCRP]], [[SDFX]], [[SGRP]], [[SIMP]], [[SPLN]], [[SURF]], [[TIMR]], [[TPIK]], [[TRIG]], [[TRWT]], [[UIM]], [[VOLU]]
 
HOP: [[COLL]], [[DEST]], [[JAW]], [[LODT]], [[MAPR]], [[NGMS]], [[PIPT]], [[SHRP]], [[SPLN]]
 
Localized HIP: [[CRDT]], [[SUBT]], [[TEXT]]
|-
| CUTSCENE || 1 ||
|-
| SRAM || 1 || HOP: [[SND]], [[SNDS]]
 
Localized HIP: [[SNDS]]
|-
| SNDTOC || 1 || HOP: [[SNDI]]
 
Localized HIP: [[SNDI]]
===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.
| CUTSCENETOC || 1 ||
|}
 
==StructureBlocks==
This section contains the format for all known block types in HIP archives. Each section heading is the block's type ID as if it was a human-readable string.
 
===HIPA===
This block contains no data or child blocks. It is used to mark the start of the file, and the ID can serve as a [https://en.wikipedia.org/wiki/Magic_number_(programming)#In_files magic number] to identify the file's type.
This section is empty.
 
===PACK===
This sectionblock contains no data andbut it does 6contain subchild sectionsblocks: [[#PVER|PVER]], [[#PFLG|PFLG]], [[#PCNT|PCNT]], [[#PCRT|PCRT]], and [[#PMOD|PMOD]], andas PLATwell (althoughas [[#PLAT|PLAT]] isin notevery presentgame inpast Scooby Doo: Night of 100 Frights). This block is used to group together various metadata about the archive.
<pre>
section PVER
section PFLG
section PCNT
section PCRT
section PMOD
section PLAT
</pre>
 
====PVER====
This sectionblock contains information about the archive version.
<pre>
int subVersion
int clientVersion
int compatiblecompatVersion
</pre>
 
'''subVersion''' is 2 in all games.
===PFLG===
 
This section contains archive flags.
'''clientVersion''' is 0x00000001 in Scooby-Doo PS2 prototype, 0x00040006 (4.6) in Scooby-Doo final, and 0x000A000F (10.15) in all other games.
 
'''compatVersion''' is 1 in all games.
 
====PFLG====
This block contains archive flags. It is unused by the game.
<pre>
int flags
</pre>
 
* In all games, this value always includes 0x2E in the flags. Its meaning is unknown.
===PCNT===
* In BFBB, every file except font2.HIP has some extra flags:
This section contains counters.
** 0x140000 is used in German PS2 HIP's
** 0x290000 is used in US GC HIP's
** 0x2A0000 is used in US Xbox HIP's
** 0x2C0000 is used in US PS2 HIP's
** 0x510000 is used in GC mn-pal/mnu3.HIP and mn-pal/mnu3.HOP
** 0x02000000 is used in all US HIP's except font2.HIP
** 0x03000000 is used in all German PS2 HIP's
 
====PCNT====
This block contains counts of specific things, only the first 2 are used by the game.
<pre>
int assetCount
int AHDRCount \\ Amount of AHDR sections
int layerCount
int LHDRCount \\ Amount of LHDR sections
int maxAssetSize
int sizeOfLargestSourceFileAsset
int maxLayerSize
int sizeOfLargestLayer
int maxXformAssetSize
int sizeOfLargestSourceVirtualAsset
</pre>
 
'''assetCount''' determines how many assets are in the HIP archive and thus how many [[#AHDR|AHDR]] blocks should be present.
===PCRT===
 
This section contains a date.
'''layerCount''' determines how many layers are in the HIP archive and thus how many [[#LHDR|LHDR]] blocks should be present.
 
'''maxAssetSize''' is the largest asset size in bytes out of all assets in the archive.
 
'''maxLayerSize''' is the size in bytes of the layer that takes up the most space in the [[#DPAK|DPAK]] block, minus the padding bytes at the end.
 
'''maxXformAssetSize''' is the largest asset size in bytes out of all assets specifically with the <code>READ_TRANSFORM</code> flag set (see [[#AHDR|AHDR]] flags).
 
====PCRT====
This block contains the creation date of the archive.
<pre>
int createdDate
int fileDate \\ Date file was compiled
string createdDateString
string dateString \\ Date as string
</pre>
 
'''createdDate''' is the number of seconds since 00:00, Jan 1 1970 UTC, with a timezone offset of UTC-7:00 (Pacific Time).
===PMOD===
 
'''createdDateString''' is '''createdDate''' as a string, in the format <code>Www Mmm dd hh:mm:ss yyyy</code>.
* Www - the day of the week (one of Mon, Tue, Wed, Thu, Fri, Sat, Sun).
* Mmm - the month (one of Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec).
* dd - the day of the month
* hh - hours
* mm - minutes
* ss - seconds
* yyyy - years
* Example: Thu Sep 02 06:15:46 2004
 
This is the same format returned by the C standard function [https://en.cppreference.com/w/c/chrono/ctime <code>ctime()</code>]. It always ends with a newline character (<code>'\n'</code>, <code>'\x0A'</code>) in Scooby.
 
====PMOD====
This block contains the latest modification date of the archive.
<pre>
int modifiedDate
This section contains a date
int modDate \\ Date file was last changed
</pre>
 
====PLAT====
This sectionblock contains information about the specific game, platform, language, dataetc. the archive was built for. It's not present in Scooby Doo. The format differs between BFBB and its subsequent games:
 
BFBB:
* Format for Battle for Bikini Bottom
<pre>
int platformID
string targetPlatform
string targetPlatformNameplatformName
string regionFormatregion
string language
string targetGamegameName
</pre>
 
TSSM, Incredibles, ROTU:
* Format for The Incredibles, Spongebob Movie and Rise of the Underminer
<pre>
int platformID
string targetPlatform
string language
string regionFormatregion
string targetGamegameName
</pre>
 
'''platformID''' is a 4-byte ID referring to which platform the archive was built for.
 
'''platformName''' is a human-readable string corresponding to the platformID.
 
'''region''' is the archive's target region.
 
'''language''' is the archive's target language.
 
'''gameName''' is the archive's target game.
 
The following table lists all possible values for these variables:
 
{| class="wikitable"
! Name !! [[:Category:BFBB|BFBB]] !! [[:Category:TSSM|TSSM]]/[[:Category:Incredibles|Incredibles]]/[[:Category:ROTU|ROTU]]
|-
| platformID || <code>'GC\0\0'</code>, <code>'P2\0\0'</code>, <code>'XB\0\0'</code> || <code>'GC\0\0'</code>, <code>'PS2\0'</code>, <code>'BX\0\0'</code>
|-
| platformName || GameCube, Xbox, PlayStation 2 ||
|-
| region || NTSC, PAL || NTSC, PAL
|-
| language || US Common, United Kingdom, French, German || US, BE, CH, CZ, DE, DK, ES, FI, FR, IT, JP, KR, NL, NO, PL, PT, RU, SE, SK, TW, UK
|-
| gameName || Sponge Bob, Incredibles, Jimmy Newtron || Incredibles
|}
 
===DICT===
This sectionblock serves as a "dictionary" for all the assets and layers in the HIP archive. It contains no data and 2 subchild sectionsblocks: [[#ATOC|ATOC]] and [[#LTOC|LTOC]].
<pre>
section ATOC
section LTOC
</pre>
 
====ATOC====
This section holds all the asset entries for the HIP archive. It contains no data and a [[#AINF|AINF]] child block followed by a variable number of [[#AHDR|AHDR]] child blocks. The number of AHDR blocks should match the '''assetCount''' value found in [[#PCNT|PCNT]]. All AHDR blocks together form a list and is sorted by the '''id''' value found within each block when building the HIP archive.
This section contains one AINF sub section and an array of AHDR sub sections as specified in PCNT.
<pre>
section AINF
section[AHDRCount] AHDR
</pre>
 
=====AINF=====
This block is unused by the game.
<pre>
int unknownainf
</pre>
 
This value is always 0.
===AHDR===
 
This section contains data and one ADBG sub section. AHDR is used to define an asset entry.
=====AHDR=====
This block defines an entry for an [[asset]]. It contains some data followed by an [[#ADBG|ADBG]] child block.
<pre>
int id
uint assetID \\ identifier ID for this asset, must be unique for each asset
int type
char[4] [[Asset|assetType]] \\ asset type
int offset
int fileOffset \\ absolute
int fileSizesize
int plus
int plusValue \\ amount of padding after file data
int flags
section ADBG
</pre>
 
'''id''' is the asset's unique 4-byte ID, which is calculated by the asset's name using a variation of the BKDR hash algorithm, described [[Data Types#AssetID|here]].
===ADBG===
 
<pre>
'''type''' is the asset's 4-byte type ID, which is typically human-readable and can be read as an ASCII string if preferred. All known type IDs can be found [[Asset#List of asset types|here]].
int alignment \\ file must be aligned to this amount of bytes in the stream, this will define the plusValue in the AHDR
 
string assetName
'''offset''' is the starting position of the asset's data, relative to the beginning of the file.
string assetFileName
 
uint checksum \\ ignored
'''size''' is the length in bytes of the asset's data.
</pre>
 
'''plus''' is the amount of padding bytes present between the end of the asset's data and the next asset in the layer's data. It's calculated from the '''alignment''' value in the [[#ADBG|ADBG]] block. The last asset in each layer has a plus value of 0.
 
'''flags''' is a bitfield of settings which specifies how the asset's data is stored and how it should be handled by the game:
* 0x1 - SOURCE_FILE - The asset's data was sourced from an external file. The filename/path can be found in the [[#ADBG|ADBG]] child block.
* 0x2 - SOURCE_VIRTUAL - The asset's data was created within the level editor Heavy Iron used. The filename in [[#ADBG|ADBG]] is empty.
* 0x4 - READ_TRANSFORM - The asset's data is stored in a special format which needs to be "transformed" by the game into a runtime-specific format. This applies to all [[RenderWare]] assets, such as [[MODL]], which is stored as a <code>.dff</code> file and needs to be transformed into an "RpClump" (RenderWare object) at runtime.
* 0x8 - WRITE_TRANSFORM - The asset's data needs to be transformed from a runtime-specific format into a special binary format, likely used by Heavy Iron's level editor.
 
===LTOC===ADBG======
This block defines debugging info for its parent [[#AHDR|AHDR]] block.
This section contains one LINF sub section and an array of LHDR sub sections as specified in PCNT.
<pre>
int alignment
section LINF
string name
section[LHDRCount] LHDR
string filename
int checksum
</pre>
 
'''alignment''' is the multiple of bytes that the asset's data aligns to. This value can be -1 (or any negative value), which means it uses the "default" alignment value for the asset's specific type ID. The default alignment value for each asset type can be found in <code>.LIP</code>/<code>.LOP</code> files in BFBB and Scooby (either 16 or 32 for most types).
===LINF===
 
'''name''' is the asset's name, which also determines the asset's ID. This was (unfortunately) trimmed to 31 characters (plus the NULL byte) when stored in vanilla HIP files, despite HIP files supporting longer strings, however, the asset ID was calculated from the asset's original name. This means that there are sometimes multiple assets in a HIP file with the same name but different IDs.
 
'''filename''' is the asset's source filename if the <code>SOURCE_FILE</code> flag is set in the parent [[#AHDR|AHDR]] block.
 
'''checksum''' is the checksum of the asset's data. The algorithm to calculate the checksum is [https://opensource.apple.com/source/CommonCrypto/CommonCrypto-60074/libcn/crc32-mpeg-2.c.auto.html CRC-32/MPEG-2]. It's unused by the game.
 
====LTOC====
This section holds all the layer entries for the HIP archive. It contains no data and a [[#LINF|LINF]] child block followed by a variable number of [[#LHDR|LHDR]] child blocks. The number of LHDR blocks should match the '''layerCount''' value found in [[#PCNT|PCNT]].
 
=====LINF=====
This block is unused by the game.
<pre>
int unknownlinf
</pre>
 
This value is always 0.
===LHDR===
 
This section contains data and one LDBG sub section. LHDR is used to define a layer entry.
=====LHDR=====
This block defines an entry for a layer. It contains some data followed by an [[#LDBG|LDBG]] child block.
<pre>
int layerTypetype
int assetAmountassetCount
int[assetAmountassetCount] assetIDlistassetIDs
section LDBG
</pre>
 
'''type''' is the layer's type ID, which determines what types of assets are stored within this layer. Multiple layers can have the same type ID, which means that assets will be divided evenly between those layers. [[#Layers|Layers]] lists all known type IDs.
===LDBG===
 
'''assetCount''' is the number of assets in this layer.
 
'''assetIDs''' is a list of all the assets' IDs. The order of IDs in this list determines the order that the assets' data will be stored in [[#DPAK|DPAK]].
 
======LDBG======
This block is unused by the game.
<pre>
int unknownldbg
</pre>
 
This value is unknown in Scooby-Doo PS2 prototype and always -1 (0xFFFFFFFF) in all other games.
 
===STRM===
This block organizes all of the data for the assets in the HIP archive. It contains no data and 2 child blocks: [[#DHDR|DHDR]] and [[#DPAK|DPAK]]. Some Incredibles PC archives (mainly localized ones) are known to have an incorrect section/block size value in this block. This could be due to the additional used padding bytes, even though the assets are the same length as in the US version. However, blocksize values in this block are ignored by the game anyway.
This section contains no data and 2 sub sections: DHDR and DPAK.
====DHDR====
This block is unused by the game.
<pre>
int dhdr
section DHDR
section DPAK
</pre>
 
This value is always -1 (0xFFFFFFFF).
===DHDR===
<pre>
int unknown
</pre>
 
====DPAK====
This section contains a byte array whichblock contains all asset data. AHDR references this, sectiongrouped by fileOffsetlayer.
 
If AHDRCount is 0, this section is empty (no firstPadding or data).
Each layer is aligned to a fixed size which depends on the target platform:
* GameCube: 32 bytes
* PS2/Xbox: 2048 bytes
 
Each asset is aligned to the alignment value specified by their corresponding [[#ADBG|ADBG]] block.
 
In order to align assets and layers, padding bytes are used. All padding bytes have the value <code>0x33</code>.
* All assets, ''except'' for the last asset in each layer, have padding bytes after them. The plus value in each asset's [[#AHDR|AHDR]] block is set to the amount of padding bytes used.
* All layers, including the last one, have padding at the end. The '''maxLayerSize''' value in [[#PCNT|PCNT]] does not include the amount of padding bytes used.
 
If there are 0 assets ('''assetCount''' in [[#PCNT|PCNT]] is 0), this block contains no data. Otherwise:
<pre>
int paddingAmount
int firstPadding \\ Initital padding at start of data
char[paddingAmount] padding
byte[] data
char[] data
</pre>
 
There is padding between the start of the block and the beginning of the asset data. The amount of padding is calculated from the fixed layer alignment size (described above), minus the first 4 bytes which is reserved for '''paddingAmount'''. It specifies how many padding bytes will follow.
 
'''Scooby-Doo PS2 Prototype:''' Those HIP archives do not have padding bytes at the beginning of this block. They also use <code>0x00</code> as pad byte instead of <code>0x33</code>.
 
==Tools==
[[HipHopFile]] is a C# library which can be used to work with HIP files.
 
==External links==
* [https://github.com/bfbbdecomp/bfbb/blob/master/src/Core/x/xhipio.cpp xhipio.cpp] - BFBB's source code for reading basic blocks and values from HIP archives
* [https://github.com/bfbbdecomp/bfbb/blob/master/src/Core/x/xpkrsvc.cpp xpkrsvc.cpp] - BFBB's source code for reading all assets and layers from BFBB-specific HIP archives
 
[[Category:Modding]] [[Category:File Format]]
2,079

edits