GoodEngine/HO (File Format): Difference between revisions
Content added Content deleted
EnergyDrink (talk | contribs) m (→HEL/HEB) |
EnergyDrink (talk | contribs) 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 || |
| 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''' || |
| 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''' || |
| 0x4C || int || '''pad01''' || |
||
|- |
|- |
||
| 0x400 || |
| 0x400 || WideString || '''platform''' || |
||
* WII |
* WII |
||
* PS3 |
* PS3 |
||
Line 37: | Line 38: | ||
* PC |
* PC |
||
|- |
|- |
||
| 0x43C || |
| 0x43C || WideString || '''user''' || always "'''hvir_autobuild'''" |
||
|- |
|- |
||
| 0x47C || |
| 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 || |
| 0x4BC || WideString || '''creator''' || always "'''GoodEditor:PackView.GEPlugin'''" |
||
|- |
|- |
||
| 0x4FC || |
| 0x4FC || WideString || '''comment''' || |
||
|- |
|- |
||
| 0x5FC || |
| 0x5FC || WideString || '''hash''' || |
||
|- |
|- |
||
| 0x63C || int || '''libVersion''' || |
| 0x63C || int || '''libVersion''' || |
||
|- |
|- |
||
| 0x640 || int || '''pad02''' || |
| 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. |
|||
|} |
|} |