GoodEngine/HO (File Format)

From Heavy Iron Modding

HO archives are container files used by Heavy Iron Studios in their 7 Havok games. They are used to store assets, which are the resources and objects used to create levels, characters and menus for the games.

Endian

HO archives are stored as big endian in all console versions of each game. Family Guy PC archives are stored as little endian.

Format

HEL/HEB

0x800 HO header

Offset Type Variable Description
0x00 string cMagic HEL or HEB
0x04 int verPackFile
0x08 int verWMlSchema
0x0C int geBuildNum
0x10 long timeValue Number of seconds since 00:00, Jan 1 1970 UTC, with a timezone offset of UTC-7:00 (Pacific Time)
0x18 string timeString Www Mmm dd hh:mm:ss yyyy
0x40 int [FormatInfo] sectorSize HO archives are divided in 2048 (0x800) byte sectors, i.e. HO Header is Sector 0, MAST is Sector 1...
0x44 int [MasterTable] startSector
0x48 int [MasterTable] tableSize Size of MAST
0x4C int pad01
0x400 WideString platform
  • WII
  • PS3
  • XENON (Xbox360)
  • PC
0x43C WideString user always "hvir_autobuild"
0x47C WideString target
  • Rats = Ratatouille
  • WALE = Wall-E
  • Up = Up
  • SB09 = Spongebob's Truth or Square
  • UFCT = UFC Personal Trainer
  • FIVE = Harley Pasternak's Hollywood Workout
  • FGUY = Family Guy: Back to the Multiverse
  • RB09 = ? [Unreleased]
  • STRO = Saints Row: The Cooler [Unreleased]
  • MM = Megamind [Unreleased]
  • CSNO = Casino [Unreleased]
  • BAKU = Bakugan [Unreleased]
0x4BC WideString creator always "GoodEditor:PackView.GEPlugin"
0x4FC WideString comment
0x5FC WideString hash
0x63C int libVersion
0x640 int pad02

MAST (MasterTable)

TableHeader

Offset Type Variable Description
0x00 string tableTypeTag MAST
0x04 int entryCount Amount of master entries, always 1.
0x08 int tableFlags
0x0C int firstString Offset to StringTable, relative to start of this header.
0x10 int stringTableSize Size of StringTable, relative to end of MasterEntry.
0x14 int firstMetaRec
0x18 int metaDataSize
0x1C int reserved

MasterEntry

Offset Type Variable Description
0x00 int sectionType SECT/TCES
0x04 short packLangID
0x06 byte parcelType
0x07 byte pad
0x08 int userKey
0x0C int nameHash
0x10 int namePtr Offset to domain string, relative to start of MAST.
0x14 int fromNameHash
0x18 int fromNamePtr
0x1C int startSector Multiply this by sectorSize to get the absolute offset. Start of SECT.
0x20 int sizeOnDisk Size of SECT.
0x24 int sizeInMem Size of SECT.
0x28 int memoryAlignment
0x2C int attributeFlags
0x30 int externName
0x34 int metaBlockCount
0x38 int metaRecord
0x3C int reserved
StringTable

Unknown

SECT (SectionTable)

TableHeader

Offset Type Variable Description
0x00 string tableTypeTag SECT
0x04 int entryCount Amount of section entries.
0x08 int tableFlags
0x0C int firstString Offset to domain string, relative to start of this header.
0x10 int stringTableSize Size of domain string.
0x14 int firstMetaRec Offset to MetaSection, relative to start of this header.
0x18 int metaDataSize Size of MetaSection.
0x1C int reserved

SectionEntry

Offset Type Variable Description
0x00 int sectionType
  • P = Parcel
  • PD/DP = ParcelDebug
  • PTEX/XETP = ParcelTexture
  • PFST/TSFP = ParcelMemFast
0x04 short packLangID
0x06 byte parcelType
0x07 byte pad
0x08 int userKey
0x0C int nameHash
0x10 int namePtr Offset to domain string, relative to start of SECT.
0x14 int fromNameHash
0x18 int fromNamePtr
0x1C int startSector Multiply this by sectorSize to get the absolute offset. Start of section.
0x20 int sizeOnDisk Size of section.
0x24 int sizeInMem Size of section.
0x28 int memoryAlignment Memory alignment of asset data in section.
0x2C int attributeFlags
0x30 int externName
0x34 int metaBlockCount Amount of PSL/PSLD entries.
0x38 int metaRecord Offset to PSL or PSLD entry, relative to start of SECT.
0x3C int reserved


MetaSection

PSL (ParcelSliceMeta)

Offset Type Variable Description
MetaParcelSlicesHeader
0x00 string metatype PSL
0x04 int metasize Size of ParcelSliceMeta.
0x08 int numSlices Amount of slice entries.
0x0C int reserved
MetaParcelSlicesEntry
0x00 int sliceType
  • 0 = ParcelTOC
  • 1 = ParcelData
  • 2 = Padding (0x33)
0x04 int sliceStart Offset to slice, relative to start of startSector.
0x08 int sliceSize Size of slice in SectionEntry.
0x0C int sliceAlign
ParcelTOC
Offset Type Variable Description
TOCHeader
0x00 int elementCount Amount of TOC entries.
0x04 int brickDataOffset
0x08 int[6] reserved
TOCEntry
0x00 int elementSize Size of asset (with 0x33 padding bytes).
0x04 int elementOffset Offset to asset, relative to start of startsector.
0x08 int blobSize Size of asset (without 0x33 padding bytes).
0x0C int blobAlign
0x10 AssetID uidSelf AssetID of corresponding asset.
0x18 int wmlTypeID AssetType of corresponding asset.
0x1C short subType
0x1E short blobFlags

PSLD (ParcelSliceDebugMeta)

Offset Type Variable Description
0x00 string magic PSLD
0x04 int size Size of ParcelSliceDebugMeta.
0x08 int count Amount of entrySize and NameTableEntry
0x0C int offset Offset to NameTableEntry
0x10 int[4] Unknown Unknown
PD (ParcelDebug)
Offset Type Variable Description
0x00 int[count] entrySize Length in bytes of the entries below
NameTableEntry
0x00 AssetID assetid AssetID of corresponding asset.
0x08 int offset? Offset to assetname?
0x0C int[5] Unknown Unknown
0x20 String assetname Name of corresponding asset.
Padding bytes until this entry reaches <entrySize> in length.