GoodEngine/HO (File Format): Difference between revisions

Content added Content deleted
No edit summary
Line 1: 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.
'''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===
===HEL/HEB===
0x800 HO header
0x800 HO header
Line 9: Line 10:
! Offset !! Type !! Variable !! Description
! Offset !! Type !! Variable !! Description
|-
|-
| 0x00 || int/string || '''cMagic''' || "'''HEL'''" or "'''HEB'''"
| 0x00 || string || '''cMagic''' || '''HEL''' or '''HEB'''
|-
|-
| 0x04 || int || '''verPackFile''' ||
| 0x04 || int || '''verPackFile''' ||
Line 17: Line 18:
| 0x0C || int || '''geBuildNum''' ||
| 0x0C || int || '''geBuildNum''' ||
|-
|-
| 0x10 || int || '''pad''' || padding
| 0x10 || int || '''pad''' ||
|-
|-
| 0x14 || int || '''timeValue''' || Number of seconds since 00:00, Jan 1 1970 UTC, with a timezone offset of UTC-7:00 (Pacific Time)
| 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: Line 24:
| 0x18 || string || '''timeString''' || <code>Www Mmm dd hh:mm:ss yyyy</code>
| 0x18 || string || '''timeString''' || <code>Www Mmm dd hh:mm:ss yyyy</code>
|-
|-
| 0x40 || int || '''sectorSize''' ||
| 0x40 || int || [FormatInfo] '''sectorSize''' || always '''0x800''' (Headersize)
|-
|-
| 0x44 || int || '''startSector''' ||
| 0x44 || int || [MasterTable] '''startSector''' ||
|-
|-
| 0x48 || int || '''tableSize''' ||
| 0x48 || int || [MasterTable] '''tableSize''' || Size of [[#MAST (MasterTable)|MAST]]
|-
|-
| 0x4C || int || '''pad01''' || padding
| 0x4C || int || '''pad01''' ||
|-
|-
| 0x400 || string || '''platform''' ||
| 0x400 || WideString || '''platform''' ||
* WII
* WII
* PS3
* PS3
Line 37: Line 38:
* PC
* PC
|-
|-
| 0x43C || string || '''user''' || always "'''hvir_autobuild'''"
| 0x43C || WideString || '''user''' || always "'''hvir_autobuild'''"
|-
|-
| 0x47C || string || '''target''' ||
| 0x47C || WideString || '''target''' ||
* Rats = Ratatouille
* Rats = Ratatouille
* WALE = Wall-E
* WALE = Wall-E
* Up = Up
* Up = Up
* SB09 = Truth or Square
* SB09 = Spongebob's Truth or Square
* UFCT = UFC Personal Trainer
* 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 || string || '''creator''' || always "'''GoodEditor:PackView.GEPlugin'''"
| 0x4BC || WideString || '''creator''' || always "'''GoodEditor:PackView.GEPlugin'''"
|-
|-
| 0x4FC || string || '''comment''' ||
| 0x4FC || WideString || '''comment''' ||
|-
|-
| 0x5FC || string || '''hash''' ||
| 0x5FC || WideString || '''hash''' ||
|-
|-
| 0x63C || int || '''libVersion''' ||
| 0x63C || int || '''libVersion''' ||
|-
|-
| 0x640 || int || '''pad02''' || padding
| 0x640 || int || '''pad02''' ||
|}

===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.
|}
|}