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]

HEL/HEB (Header)[edit]

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 Always 0x800 (2048 bytes).
0x44 int [MasterTable] startSector Always 1 (if sectorSize is 0x800).
0x48 int [MasterTable] tableSize Size of MAST.
0x4C int pad01 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
  • RB09 = ? [Unreleased]
  • STRO = Saints Row: The Cooler [Unreleased]
  • MM = Megamind [Unreleased]
  • CSNO = Casino [Unreleased]
  • BAKU = Bakugan [Unreleased]
  • UFCU = UFC Undisputed [Unreleased]
0x4BC WideString creator always "GoodEditor:PackView.GEPlugin"
0x4FC WideString comment null
0x5FC WideString hash
0x63C int libVersion Always 1.
0x640 int pad02 null

MAST (MasterTable)[edit]

TableHeader[edit]

Offset Type Variable Description
0x00 string 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 int reserved null

MasterEntry[edit]

Offset Type Variable Description
0x00 int sectionType SECT/TCES
0x04 short packLangID null
0x06 byte parcelType null
0x07 byte pad 0x33
0x08 int userKey null
0x0C int nameHash Lowercase BKDRHash of domain string.
0x10 int namePtr Offset to domain string, relative to start of MAST.
0x14 int fromNameHash null
0x18 int fromNamePtr 0xFFFFFFFF
0x1C int startSector Multiply this by sectorSize to get the absolute offset. Start of SECT (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 int reserved null
StringTable[edit]

Unknown

SECT (SectionTable)[edit]

TableHeader[edit]

Offset Type Variable Description
0x00 string 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 int reserved null

SectionEntry[edit]

Offset Type Variable Description
0x00 int sectionType
  • P = Parcel
  • PD/DP = ParcelDebug
  • PTEX/XETP = ParcelTexture
  • PFST/TSFP = ParcelMemFast
0x04 short packLangID

(Values are in big-endian)

  • 0x0000 = NeutralNeutral
  • 0x0401 = ArabicSaudiArabia
  • 0x0804 = ChineseChina
  • 0x0C04 = ChineseHongKong
  • 0x0404 = ChineseTaiwan
  • 0x1004 = ChineseSingapore
  • 0x0405 = CzechRepublic
  • 0x0406 = DanishDenmark
  • 0x0413 = DutchNetherlands
  • 0x0409 = EnglishUS
  • 0x0809 = EnglishUK
  • 0x0C09 = EnglishAustralia
  • 0x1009 = EnglishCanada
  • 0x040B = FinnishFinland
  • 0x040C = FrenchFrance
  • 0x0407 = GermanGermany
  • 0x0807 = GermanSwiss
  • 0x0408 = GreekGreece
  • 0x0410 = ItalianItaly
  • 0x0411 = JapaneseJapan
  • 0x0412 = KoreanKorea
  • 0x0814 = NorwegianNynorsk
  • 0x0415 = PolishPoland
  • 0x0816 = PortuguesePortugal
  • 0x0416 = PortugueseBrazilian
  • 0x0419 = RussianFederation
  • 0x041B = SlovakSlovak
  • 0x080A = SpanishMexican
  • 0x0C0A = SpanishSpain
  • 0x041D = SwedishSweden
  • 0x0422 = UkrainianUkraine
0x06 byte parcelType
  • 0 = UNDEFINED
  • 1 = EXCLUSIVE
  • 2 = SHARED
  • 3 = FROMDOMAIN
0x07 byte pad 0x33
0x08 int userKey null
0x0C int nameHash Lowercase BKDRHash of domain string.
0x10 int namePtr Offset to domain string, relative to start of SECT.
0x14 int fromNameHash Lowercase BKDRHash 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 int reserved null


MetaSection[edit]

PSL (ParcelSliceMeta)[edit]

Offset Type Variable Description
MetaParcelSlicesHeader
0x00 string 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
0x1E short blobFlags

PSLD (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? Offset to assetname?
0x0C int Unknown
0x10 int Unknown 0xFFFFFFFF
0x14 int[3] Unknown null
0x20 String assetname Name of corresponding asset.
Padding - 0x33 bytes until this entry reaches <entrySize> in length.