GoodEngine/HO (File Format): Difference between revisions

no edit summary
No edit summary
Line 1:
'''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.
 
 
==Blocks==
==Format==
===HEL/HEB===
0x800 HO header
Line 9 ⟶ 10:
! Offset !! Type !! Variable !! Description
|-
| 0x00 || int/string || '''cMagic''' || "'''HEL'''" or "'''HEB'''"
|-
| 0x04 || int || '''verPackFile''' ||
Line 17 ⟶ 18:
| 0x0C || int || '''geBuildNum''' ||
|-
| 0x10 || int || '''pad''' || padding
|-
| 0x14 || int || '''timeValue''' || Number of seconds since 00:00, Jan 1 1970 UTC, with a timezone offset of UTC-7:00 (Pacific Time)
Line 23 ⟶ 24:
| 0x18 || string || '''timeString''' || <code>Www Mmm dd hh:mm:ss yyyy</code>
|-
| 0x40 || int || [FormatInfo] '''sectorSize''' || always '''0x800''' (Headersize)
|-
| 0x44 || int || [MasterTable] '''startSector''' ||
|-
| 0x48 || int || [MasterTable] '''tableSize''' || Size of [[#MAST (MasterTable)|MAST]]
|-
| 0x4C || int || '''pad01''' || padding
|-
| 0x400 || stringWideString || '''platform''' ||
* WII
* PS3
Line 37 ⟶ 38:
* PC
|-
| 0x43C || stringWideString || '''user''' || always "'''hvir_autobuild'''"
|-
| 0x47C || stringWideString || '''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: BTTM
* FGUY = Family Guy: Back to the Multiverse
* FIVE = Hollywood Workout
* RB09 = ? '''[Unreleased]'''
* STRO = Saints Row: The Cooler '''[Unreleased]'''
* MM = Megamind '''[Unreleased]'''
* CSNO = Casino '''[Unreleased]'''
* BAKU = ? '''[Unreleased]'''
|-
| 0x4BC || stringWideString || '''creator''' || always "'''GoodEditor:PackView.GEPlugin'''"
|-
| 0x4FC || stringWideString || '''comment''' ||
|-
| 0x5FC || stringWideString || '''hash''' ||
|-
| 0x63C || int || '''libVersion''' ||
|-
| 0x640 || int || '''pad02''' || padding
|}
 
===MAST (MasterTable)===
====TableHeader====
{| class="wikitable"
|-
! Offset !! Type !! Variable !! Description
|-
| 0x00 || string || '''tableTypeTag''' || '''MAST'''
|-
| 0x04 || int || '''entryCount''' || Amount of [[#MasterEntry|master entries]], always 1.
|-
| 0x08 || int || '''tableFlags''' ||
|-
| 0x0C || int || '''firstString''' || Offset to [[#StringTable|StringTable]], relative to start of this header.
|-
| 0x10 || int || '''stringTableSize''' || Size of [[#StringTable|StringTable]], relative to end of [[#MasterEntry|MasterEntry]].
|-
| 0x14 || int || '''firstMetaRec''' ||
|-
| 0x18 || int || '''metaDataSize''' ||
|-
| 0x1C || int || '''reserved''' ||
|}
 
====MasterEntry====
{| class="wikitable"
|-
! Offset !! Type !! Variable !! Description
|-
| 0x00 || string || '''sectionType''' || '''SECT'''
|-
| 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 (MasterTable)|MAST]].
|-
| 0x14 || int || '''fromNameHash''' ||
|-
| 0x18 || int || '''fromNamePtr''' ||
|-
| 0x1C || int || '''startSector''' || Multiply this by 0x800 to get the absolute offset. Start of [[#SECT (SectionTable)|SECT]].
|-
| 0x20 || int || '''sizeOnDisk''' || Size of [[#SECT (SectionTable)|SECT]].
|-
| 0x24 || int || '''sizeInMem''' || Size of [[#SECT (SectionTable)|SECT]].
|-
| 0x28 || int || '''memoryAlignment''' ||
|-
| 0x2C || int || '''attributeFlags''' ||
|-
| 0x30 || int || '''externName''' ||
|-
| 0x34 || int || '''metaBlockCount''' ||
|-
| 0x38 || int || '''metaRecord''' ||
|-
| 0x3C || int || '''reserved''' ||
|}
 
=====StringTable=====
Unknown
 
===SECT (SectionTable)===
====TableHeader====
{| class="wikitable"
|-
! Offset !! Type !! Variable !! Description
|-
| 0x00 || string || '''tableTypeTag''' || '''SECT'''
|-
| 0x04 || int || '''entryCount''' || Amount of [[#SectionEntry|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|MetaSection]], relative to start of this header.
|-
| 0x18 || int || '''metaDataSize''' || Size of [[#MetaSection|MetaSection]].
|-
| 0x1C || int || '''reserved''' ||
|}
 
====SectionEntry====
{| class="wikitable"
|-
! Offset !! Type !! Variable !! Description
|-
| 0x00 || string || '''sectionType''' ||
* '''P''' = Parcel
* '''PD''' = ParcelDebug
* '''PTEX''' = ParcelTexture
* '''PFST''' = 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 (SectionTable)|SECT]].
|-
| 0x14 || int || '''fromNameHash''' ||
|-
| 0x18 || int || '''fromNamePtr''' ||
|-
| 0x1C || int || '''startSector''' || Multiply this by 0x800 to get the absolute offset. Start of section.
|-
| 0x20 || int || '''sizeOnDisk''' || Size of section, relative to start of '''startSector'''
|-
| 0x24 || int || '''sizeInMem''' || Size of section, relative to start of '''startSector'''
|-
| 0x28 || int || '''memoryAlignment''' ||
|-
| 0x2C || int || '''attributeFlags''' ||
|-
| 0x30 || int || '''externName''' ||
|-
| 0x34 || int || '''metaBlockCount''' || Amount of [[#PSL (ParcelSliceMeta)|PSL]]/[[#PSLD (ParcelSliceDebugMeta)|PSLD]] entries.
|-
| 0x38 || int || '''metaRecord''' || Offset to [[#PSL (ParcelSliceMeta)|PSL]] or [[#PSLD (ParcelSliceDebugMeta)|PSLD]] entry, relative to start of [[#SECT (SectionTable)|SECT]].
|-
| 0x3C || int || '''reserved''' ||
|}
 
 
===MetaSection===
====PSL (ParcelSliceMeta)====
{| class="wikitable"
|-
! Offset !! Type !! Variable !! Description
|-
! colspan="4" | MetaParcelSlicesHeader
|-
| 0x00 || int/string || '''metatype''' || '''PSL'''
|-
| 0x04 || int || '''metasize''' || Size of ParcelSliceMeta.
|-
| 0x08 || int || '''numSlices''' || Amount of slice entries.
|-
| 0x0C || int || '''reserved''' ||
|-
! colspan="4" | MetaParcelSlicesEntry
|-
| 0x00 || int || '''sliceType''' ||
* 0 = [[#ParcelTOC|ParcelTOC]]
* 1 = ParcelData
* 2 = Padding (0x33)
|-
| 0x04 || int || '''sliceStart''' || Offset to slice, relative to start of [[#SectionEntry|'''startSector''']].
|-
| 0x08 || int || '''sliceSize''' || Size of slice in [[#SectionEntry|SectionEntry]].
|-
| 0x0C || int || '''sliceAlign''' ||
|}
 
=====ParcelTOC=====
{| class="wikitable
|-
! Offset !! Type !! Variable !! Description
|-
! colspan="4" | TOCHeader
|-
| 0x00 || int || '''elementCount''' || Amount of TOC entries.
|-
| 0x04 || int || '''brickDataOffset''' ||
|-
| 0x08 || int[6] || ''' reserved''' ||
|-
! colspan="4" | TOCEntry
|-
| 0x00 || int || '''elementSize''' || Size of asset (with 0x33 padding bytes).
|-
| 0x04 || int || '''elementOffset''' || Offset to asset, relative to start of [[#SectionEntry|'''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)====
{| class="wikitable
|-
! Offset !! Type !! Variable !! Description
|-
| 0x00 || int/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)=====
{| class="wikitable"
|-
! Offset !! Type !! Variable !! Description
|-
| 0x00 || int[count] || '''entrySize''' || Length in bytes of the entries below
|-
! colspan="4" | 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.
|-
| colspan="4 | Padding bytes until this entry reaches '''<entrySize>''' in length.
|}
2,079

edits