GoodEngine/HO (File Format)

From Heavy Iron Modding
< GoodEngine(Redirected from HO (File Format))

HO archives are container files used by Heavy Iron Studios in their 7 Good Engine/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[edit]

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

Format[edit]

Header[edit]

Offset Type Variable Description
0x00 char[4] 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 char[0x18] timeString Www Mmm dd hh:mm:ss yyyy
0x40 int [FormatInfo] sectorSize Always 0x800 (2048 bytes).
0x44 int [MasterTable] startSector Always 1 (if sectorSize is 0x800).
0x48 int [MasterTable] tableSize Size of MAST.
0x4C byte[0x3B4] reserved null
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
0x4BC WideString creator always "GoodEditor:PackView.GEPlugin"
0x4FC WideString comment null
0x5FC WideString hash
0x63C int libVersion Always 1.
0x640 byte[0x1C0] reserved null

MasterTable[edit]

TableHeader[edit]

Offset Type Variable Description
0x00 char[4] tableTypeTag MAST
0x04 int entryCount Amount of master entries, always 1.
0x08 int tableFlags null
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 0xFFFFFFFF
0x18 int metaDataSize null
0x1C byte[4] reserved null

MasterEntry[edit]

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

Unknown

SectionTable[edit]

TableHeader[edit]

Offset Type Variable Description
0x00 char[4] tableTypeTag SECT
0x04 int entryCount Amount of section entries.
0x08 int tableFlags null
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 PSL/PSLD entries in MetaSection (without child blocks).
0x1C byte[4] reserved null

SectionEntry[edit]

Offset Type Variable Description
0x00 int sectionType
  • P = Parcel
  • PD/DP = ParcelDebug
  • PTEX/XETP = ParcelTexture
  • PFST/TSFP = ParcelMemFast (Not present in Ratatouille)
0x04 ushort packLangID

Values are in big-endian
First byte is region code, second byte is language code
E.g., 0x0409 = English US, 0x0009 = English Neutral

  • 0x0000 = Neutral Neutral
  • 0x0401 = Arabic SaudiArabia
  • 0x0804 = Chinese China
  • 0x0C04 = Chinese HongKong
  • 0x0404 = Chinese Taiwan
  • 0x1004 = Chinese Singapore
  • 0x0405 = Czech Republic
  • 0x0406 = Danish Denmark
  • 0x0413 = Dutch Netherlands
  • 0x0409 = English US
  • 0x0809 = English UK
  • 0x0C09 = English Australia
  • 0x1009 = English Canada
  • 0x040B = Finnish Finland
  • 0x040C = French France
  • 0x0407 = German Germany
  • 0x0807 = German Swiss
  • 0x0408 = Greek Greece
  • 0x0410 = Italian Italy
  • 0x0411 = Japanese Japan
  • 0x0412 = Korean Korea
  • 0x0814 = Norwegian Nynorsk
  • 0x0415 = Polish Poland
  • 0x0816 = Portuguese Portugal
  • 0x0416 = Portuguese Brazilian
  • 0x0419 = Russian Federation
  • 0x041B = Slovak Slovak
  • 0x080A = Spanish Mexican
  • 0x0C0A = Spanish Spain
  • 0x041D = Swedish Sweden
  • 0x0422 = Ukrainian Ukraine
0x06 ubyte parcelType
  • 0 = UNDEFINED
  • 1 = EXCLUSIVE
  • 2 = SHARED
  • 3 = FROMDOMAIN
0x07 byte pad 0x33
0x08 int userKey null
0x0C uint nameHash Lowercase BKDR hash of domain string.
0x10 int namePtr Offset to domain string, relative to start of SECT.
0x14 uint fromNameHash Lowercase BKDR hash of domain string from original parcel (if parcelType is 3).
0x18 int fromNamePtr 0xFFFFFFFF
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 ParcelData assets in section.
0x2C int attributeFlags null
0x30 int externName 0xFFFFFFFF
0x34 int metaBlockCount Amount of PSL/PSLD entries, always 1.
0x38 int metaRecord Offset to PSL (P, PTEX, PFST) or PSLD (PD) entry, relative to start of SECT.
0x3C byte[4] reserved null

MetaSection[edit]

ParcelSliceMeta[edit]

Offset Type Variable Description
MetaParcelSlicesHeader
0x00 char[4] metatype PSL
0x04 int metasize Size of PSL.
0x08 int numSlices Amount of slice entries.
0x0C int reserved null
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[edit]
Offset Type Variable Description
TOCHeader
0x00 int elementCount Amount of TOC entries.
0x04 int brickDataOffset
0x08 int[6] reserved 0x74747474
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 Not present in Ratatouille/Wall-E
0x1E short blobFlags int32 in Ratatouille/Wall-E

ParcelSliceDebugMeta[edit]

Offset Type Variable Description
0x00 string magic PSLD
0x04 int size Size of PSLD.
0x08 int count Amount of entrySize and NameTableEntry.
0x0C int offset Offset to NameTableEntry, relative to start of startSector.
0x10 byte[16] Unknown
PSLD Entry[edit]
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? Relative offset to assetname?
0x0C int Unknown
0x10 int Unknown 0xFFFFFFFF
0x14 int[3] Unknown null
0x20 char[] assetname Null-terminated name of corresponding asset.
Padding - 0x33 bytes until this entry reaches <entrySize> in length.