GoodEngine/HO (File Format): Difference between revisions
Content added Content deleted
EnergyDrink (talk | contribs) No edit summary |
EnergyDrink (talk | contribs) No edit summary |
||
Line 26: | Line 26: | ||
| 0x40 || int || [FormatInfo] '''sectorSize''' || HO archives are divided in 2048 (0x800) byte sectors, i.e. HO Header is Sector 0, [[#MAST (MasterTable)|MAST]] is Sector 1... |
| 0x40 || int || [FormatInfo] '''sectorSize''' || HO archives are divided in 2048 (0x800) byte sectors, i.e. HO Header is Sector 0, [[#MAST (MasterTable)|MAST]] is Sector 1... |
||
|- |
|- |
||
| 0x44 || int || [MasterTable] '''startSector''' || |
| 0x44 || int || [MasterTable] '''startSector''' || Always 1 (if '''sectorSize''' is 0x800) |
||
|- |
|- |
||
| 0x48 || int || [MasterTable] '''tableSize''' || Size of [[#MAST (MasterTable)|MAST]] |
| 0x48 || int || [MasterTable] '''tableSize''' || Size of [[#MAST (MasterTable)|MAST]] |
||
|- |
|- |
||
| 0x4C || int || '''pad01''' || |
| 0x4C || int || '''pad01''' || ''null'' |
||
|- |
|- |
||
| 0x400 || WideString || '''platform''' || |
| 0x400 || WideString || '''platform''' || |
||
Line 57: | Line 57: | ||
| 0x4BC || WideString || '''creator''' || always "'''GoodEditor:PackView.GEPlugin'''" |
| 0x4BC || WideString || '''creator''' || always "'''GoodEditor:PackView.GEPlugin'''" |
||
|- |
|- |
||
| 0x4FC || WideString || '''comment''' || |
| 0x4FC || WideString || '''comment''' || ''null'' |
||
|- |
|- |
||
| 0x5FC || WideString || '''hash''' || |
| 0x5FC || WideString || '''hash''' || |
||
Line 63: | Line 63: | ||
| 0x63C || int || '''libVersion''' || |
| 0x63C || int || '''libVersion''' || |
||
|- |
|- |
||
| 0x640 || int || '''pad02''' || |
| 0x640 || int || '''pad02''' || ''null'' |
||
|} |
|} |
||
Line 76: | Line 76: | ||
| 0x04 || int || '''entryCount''' || Amount of [[#MasterEntry|master entries]], always 1. |
| 0x04 || int || '''entryCount''' || Amount of [[#MasterEntry|master entries]], always 1. |
||
|- |
|- |
||
| 0x08 || int || '''tableFlags''' || |
| 0x08 || int || '''tableFlags''' || ''null'' |
||
|- |
|- |
||
| 0x0C || int || '''firstString''' || Offset to [[#StringTable|StringTable]], relative to start of this header. |
| 0x0C || int || '''firstString''' || Offset to [[#StringTable|StringTable]], relative to start of this header. |
||
Line 82: | Line 82: | ||
| 0x10 || int || '''stringTableSize''' || Size of [[#StringTable|StringTable]], relative to end of [[#MasterEntry|MasterEntry]]. |
| 0x10 || int || '''stringTableSize''' || Size of [[#StringTable|StringTable]], relative to end of [[#MasterEntry|MasterEntry]]. |
||
|- |
|- |
||
| 0x14 || int || '''firstMetaRec''' || |
| 0x14 || int || '''firstMetaRec''' || ''0xFFFFFFFF'' |
||
|- |
|- |
||
| 0x18 || int || '''metaDataSize''' || |
| 0x18 || int || '''metaDataSize''' || ''null'' |
||
|- |
|- |
||
| 0x1C || int || '''reserved''' || |
| 0x1C || int || '''reserved''' || ''null'' |
||
|} |
|} |
||
Line 96: | Line 96: | ||
| 0x00 || int || '''sectionType''' || '''SECT/TCES''' |
| 0x00 || int || '''sectionType''' || '''SECT/TCES''' |
||
|- |
|- |
||
| 0x04 || short || '''packLangID''' || |
| 0x04 || short || '''packLangID''' || ''null'' |
||
|- |
|- |
||
| 0x06 || byte || '''parcelType''' || |
| 0x06 || byte || '''parcelType''' || ''null'' |
||
|- |
|- |
||
| 0x07 || byte || '''pad''' || |
| 0x07 || byte || '''pad''' || ''0x33'' |
||
|- |
|- |
||
| 0x08 || int || '''userKey''' || |
| 0x08 || int || '''userKey''' || ''null'' |
||
|- |
|- |
||
| 0x0C || int || '''nameHash''' || |
| 0x0C || int || '''nameHash''' || |
||
Line 108: | Line 108: | ||
| 0x10 || int || '''namePtr''' || Offset to domain string, relative to start of [[#MAST (MasterTable)|MAST]]. |
| 0x10 || int || '''namePtr''' || Offset to domain string, relative to start of [[#MAST (MasterTable)|MAST]]. |
||
|- |
|- |
||
| 0x14 || int || '''fromNameHash''' || |
| 0x14 || int || '''fromNameHash''' || ''null'' |
||
|- |
|- |
||
| 0x18 || int || '''fromNamePtr''' || |
| 0x18 || int || '''fromNamePtr''' || ''0xFFFFFFFF'' |
||
|- |
|- |
||
| 0x1C || int || '''startSector''' || Multiply this by [[#HEL/HEB|'''sectorSize''']] to get the absolute offset. Start of [[#SECT (SectionTable)|SECT]]. |
| 0x1C || int || '''startSector''' || Multiply this by [[#HEL/HEB|'''sectorSize''']] to get the absolute offset. Start of [[#SECT (SectionTable)|SECT]]. |
||
Line 118: | Line 118: | ||
| 0x24 || int || '''sizeInMem''' || Size of [[#SECT (SectionTable)|SECT]]. |
| 0x24 || int || '''sizeInMem''' || Size of [[#SECT (SectionTable)|SECT]]. |
||
|- |
|- |
||
| 0x28 || int || '''memoryAlignment''' || |
| 0x28 || int || '''memoryAlignment''' || ''0xFFFFFFFF'' |
||
|- |
|- |
||
| 0x2C || int || '''attributeFlags''' || |
| 0x2C || int || '''attributeFlags''' || ''null'' |
||
|- |
|- |
||
| 0x30 || int || '''externName''' || |
| 0x30 || int || '''externName''' || ''0xFFFFFFFF'' |
||
|- |
|- |
||
| 0x34 || int || '''metaBlockCount''' || |
| 0x34 || int || '''metaBlockCount''' || ''null'' |
||
|- |
|- |
||
| 0x38 || int || '''metaRecord''' || |
| 0x38 || int || '''metaRecord''' || ''0xFFFFFFFF'' |
||
|- |
|- |
||
| 0x3C || int || '''reserved''' || |
| 0x3C || int || '''reserved''' || ''null'' |
||
|} |
|} |
||
Line 144: | Line 144: | ||
| 0x04 || int || '''entryCount''' || Amount of [[#SectionEntry|section entries]]. |
| 0x04 || int || '''entryCount''' || Amount of [[#SectionEntry|section entries]]. |
||
|- |
|- |
||
| 0x08 || int || '''tableFlags''' || |
| 0x08 || int || '''tableFlags''' || ''null'' |
||
|- |
|- |
||
| 0x0C || int || '''firstString''' || Offset to domain string, relative to start of this header. |
| 0x0C || int || '''firstString''' || Offset to domain string, relative to start of this header. |
||
Line 154: | Line 154: | ||
| 0x18 || int || '''metaDataSize''' || Size of [[#MetaSection|MetaSection]]. |
| 0x18 || int || '''metaDataSize''' || Size of [[#MetaSection|MetaSection]]. |
||
|- |
|- |
||
| 0x1C || int || '''reserved''' || |
| 0x1C || int || '''reserved''' || ''null'' |
||
|} |
|} |
||
Line 208: | Line 208: | ||
* 3 = FROMDOMAIN |
* 3 = FROMDOMAIN |
||
|- |
|- |
||
| 0x07 || byte || '''pad''' || |
| 0x07 || byte || '''pad''' || ''0x33'' |
||
|- |
|- |
||
| 0x08 || int || '''userKey''' || |
| 0x08 || int || '''userKey''' || ''null'' |
||
|- |
|- |
||
| 0x0C || int || '''nameHash''' || |
| 0x0C || int || '''nameHash''' || |
||
Line 218: | Line 218: | ||
| 0x14 || int || '''fromNameHash''' || |
| 0x14 || int || '''fromNameHash''' || |
||
|- |
|- |
||
| 0x18 || int || '''fromNamePtr''' || |
| 0x18 || int || '''fromNamePtr''' || ''0xFFFFFFFF'' |
||
|- |
|- |
||
| 0x1C || int || '''startSector''' || Multiply this by [[#HEL/HEB|'''sectorSize''']] to get the absolute offset. Start of section. |
| 0x1C || int || '''startSector''' || Multiply this by [[#HEL/HEB|'''sectorSize''']] to get the absolute offset. Start of section. |
||
Line 228: | Line 228: | ||
| 0x28 || int || '''memoryAlignment''' || Memory alignment of asset data in section. |
| 0x28 || int || '''memoryAlignment''' || Memory alignment of asset data in section. |
||
|- |
|- |
||
| 0x2C || int || '''attributeFlags''' || |
| 0x2C || int || '''attributeFlags''' || ''null'' |
||
|- |
|- |
||
| 0x30 || int || '''externName''' || |
| 0x30 || int || '''externName''' || ''0xFFFFFFFF'' |
||
|- |
|- |
||
| 0x34 || int || '''metaBlockCount''' || Amount of [[#PSL (ParcelSliceMeta)|PSL]]/[[#PSLD (ParcelSliceDebugMeta)|PSLD]] entries. |
| 0x34 || int || '''metaBlockCount''' || Amount of [[#PSL (ParcelSliceMeta)|PSL]]/[[#PSLD (ParcelSliceDebugMeta)|PSLD]] entries. |
||
Line 236: | Line 236: | ||
| 0x38 || int || '''metaRecord''' || Offset to [[#PSL (ParcelSliceMeta)|PSL]] or [[#PSLD (ParcelSliceDebugMeta)|PSLD]] entry, relative to start of [[#SECT (SectionTable)|SECT]]. |
| 0x38 || int || '''metaRecord''' || Offset to [[#PSL (ParcelSliceMeta)|PSL]] or [[#PSLD (ParcelSliceDebugMeta)|PSLD]] entry, relative to start of [[#SECT (SectionTable)|SECT]]. |
||
|- |
|- |
||
| 0x3C || int || '''reserved''' || |
| 0x3C || int || '''reserved''' || ''null'' |
||
|} |
|} |
||
Line 254: | Line 254: | ||
| 0x08 || int || '''numSlices''' || Amount of slice entries. |
| 0x08 || int || '''numSlices''' || Amount of slice entries. |
||
|- |
|- |
||
| 0x0C || int || '''reserved''' || |
| 0x0C || int || '''reserved''' || ''null'' |
||
|- |
|- |
||
! colspan="4" | MetaParcelSlicesEntry |
! colspan="4" | MetaParcelSlicesEntry |
Revision as of 17:25, 16 August 2022
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.
Endian
HO archives are stored as big endian in all console versions of each game. Family Guy PC archives are stored as little endian.
Format
HEL/HEB
0x800 HO header
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 | HO archives are divided in 2048 (0x800) byte sectors, i.e. HO Header is Sector 0, MAST is Sector 1... |
0x44 | int | [MasterTable] startSector | Always 1 (if sectorSize is 0x800) |
0x48 | int | [MasterTable] tableSize | Size of MAST |
0x4C | int | pad01 | null |
0x400 | WideString | platform |
|
0x43C | WideString | user | always "hvir_autobuild" |
0x47C | WideString | target |
|
0x4BC | WideString | creator | always "GoodEditor:PackView.GEPlugin" |
0x4FC | WideString | comment | null |
0x5FC | WideString | hash | |
0x63C | int | libVersion | |
0x640 | int | pad02 | null |
MAST (MasterTable)
TableHeader
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
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 | |
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. |
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
Unknown
SECT (SectionTable)
TableHeader
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 MetaSection. |
0x1C | int | reserved | null |
SectionEntry
Offset | Type | Variable | Description |
---|---|---|---|
0x00 | int | sectionType |
|
0x04 | short | packLangID |
(Values are in big-endian)
|
0x06 | byte | parcelType |
|
0x07 | byte | pad | 0x33 |
0x08 | int | userKey | null |
0x0C | int | nameHash | |
0x10 | int | namePtr | Offset to domain string, relative to start of SECT. |
0x14 | int | fromNameHash | |
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 asset data in section. |
0x2C | int | attributeFlags | null |
0x30 | int | externName | 0xFFFFFFFF |
0x34 | int | metaBlockCount | Amount of PSL/PSLD entries. |
0x38 | int | metaRecord | Offset to PSL or PSLD entry, relative to start of SECT. |
0x3C | int | reserved | null |
MetaSection
PSL (ParcelSliceMeta)
Offset | Type | Variable | Description |
---|---|---|---|
MetaParcelSlicesHeader | |||
0x00 | string | metatype | PSL |
0x04 | int | metasize | Size of ParcelSliceMeta. |
0x08 | int | numSlices | Amount of slice entries. |
0x0C | int | reserved | null |
MetaParcelSlicesEntry | |||
0x00 | int | sliceType |
|
0x04 | int | sliceStart | Offset to slice, relative to start of startSector. |
0x08 | int | sliceSize | Size of slice in SectionEntry. |
0x0C | int | sliceAlign |
ParcelTOC
Offset | Type | Variable | Description |
---|---|---|---|
TOCHeader | |||
0x00 | int | elementCount | Amount of TOC entries. |
0x04 | int | brickDataOffset | |
0x08 | int[6] | reserved | |
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)
Offset | Type | Variable | Description |
---|---|---|---|
0x00 | 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)
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[5] | Unknown | Unknown |
0x20 | String | assetname | Name of corresponding asset. |
Padding bytes until this entry reaches <entrySize> in length. |