GoodEngine/HO (File Format): Difference between revisions
Content added Content deleted
EnergyDrink (talk | contribs) No edit summary |
EnergyDrink (talk | contribs) No edit summary |
||
(14 intermediate revisions by 2 users not shown) | |||
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 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=== |
|||
HO archives are stored as [https://en.wikipedia.org/wiki/Endianness big endian] in all console versions of each game. Family Guy PC archives are stored as [https://en.wikipedia.org/wiki/Endianness little endian]. |
|||
==Format== |
==Format== |
||
=== |
===Header=== |
||
0x800 HO header |
|||
{| class="wikitable" |
{| class="wikitable" |
||
|- |
|- |
||
! Offset !! Type !! Variable !! Description |
! Offset !! Type !! Variable !! Description |
||
|- |
|- |
||
| 0x00 || |
| 0x00 || char[4] || '''cMagic''' || '''HEL''' or '''HEB''' |
||
|- |
|- |
||
| 0x04 || int || '''verPackFile''' || |
| 0x04 || int || '''verPackFile''' || |
||
Line 18: | Line 18: | ||
| 0x0C || int || '''geBuildNum''' || |
| 0x0C || int || '''geBuildNum''' || |
||
|- |
|- |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
|- |
|- |
||
| 0x18 || |
| 0x18 || char[0x18] || '''timeString''' || <code>Www Mmm dd hh:mm:ss yyyy</code> |
||
|- |
|- |
||
| 0x40 || int || [FormatInfo] '''sectorSize''' || |
| 0x40 || int || [FormatInfo] '''sectorSize''' || Always 0x800 (2048 bytes). |
||
|- |
|- |
||
| 0x44 || int || [MasterTable] '''startSector''' || |
| 0x44 || int || [MasterTable] '''startSector''' || Always 1 (if '''sectorSize''' is 0x800). |
||
|- |
|- |
||
| 0x48 || int || [MasterTable] '''tableSize''' || Size of [[# |
| 0x48 || int || [MasterTable] '''tableSize''' || Size of [[#MasterTable|MAST]]. |
||
|- |
|- |
||
| 0x4C || |
| 0x4C || byte[0x3B4] || '''reserved''' || ''null'' |
||
|- |
|- |
||
| 0x400 || WideString || '''platform''' || |
| 0x400 || WideString || '''platform''' || |
||
Line 44: | Line 42: | ||
* WALE = Wall-E |
* WALE = Wall-E |
||
* Up = Up |
* Up = Up |
||
* SB09 = |
* SB09 = SpongeBob's Truth or Square |
||
* UFCT = UFC Personal Trainer |
* UFCT = UFC Personal Trainer |
||
* FIVE = Harley Pasternak's Hollywood Workout |
* FIVE = Harley Pasternak's Hollywood Workout |
||
* FGUY = Family Guy: Back to the Multiverse |
* FGUY = Family Guy: Back to the Multiverse |
||
* RB09 = ? '''[Unreleased]''' |
|||
* STRO = Saints Row: The Cooler '''[Unreleased]''' |
|||
* MM = Megamind '''[Unreleased]''' |
|||
* CSNO = Casino '''[Unreleased]''' |
|||
* BAKU = ? '''[Unreleased]''' |
|||
|- |
|- |
||
| 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''' || |
||
|- |
|- |
||
| 0x63C || int || '''libVersion''' || |
| 0x63C || int || '''libVersion''' || Always 1. |
||
|- |
|- |
||
| 0x640 || |
| 0x640 || byte[0x1C0] || '''reserved''' || ''null'' |
||
|} |
|} |
||
=== |
===MasterTable=== |
||
====TableHeader==== |
====TableHeader==== |
||
{| class="wikitable" |
{| class="wikitable" |
||
Line 71: | Line 64: | ||
! Offset !! Type !! Variable !! Description |
! Offset !! Type !! Variable !! Description |
||
|- |
|- |
||
| 0x00 || |
| 0x00 || char[4] || '''tableTypeTag''' || '''MAST''' |
||
|- |
|- |
||
| 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 81: | Line 74: | ||
| 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 || |
| 0x1C || byte[4] || '''reserved''' || ''null'' |
||
|} |
|} |
||
Line 93: | Line 86: | ||
! Offset !! Type !! Variable !! Description |
! Offset !! Type !! Variable !! Description |
||
|- |
|- |
||
| 0x00 || |
| 0x00 || int || '''sectionType''' || '''SECT/TCES''' |
||
|- |
|- |
||
| 0x04 || |
| 0x04 || ushort || '''packLangID''' || ''null'' |
||
|- |
|- |
||
| 0x06 || |
| 0x06 || ubyte || '''parcelType''' || ''null'' |
||
|- |
|- |
||
| 0x07 || byte || '''pad''' || |
| 0x07 || byte || '''pad''' || ''0x33'' |
||
|- |
|- |
||
| 0x08 || int || '''userKey''' || |
| 0x08 || int || '''userKey''' || ''null'' |
||
|- |
|- |
||
| 0x0C || |
| 0x0C || uint || '''nameHash''' || Lowercase BKDR hash of domain string. |
||
|- |
|- |
||
| 0x10 || int || '''namePtr''' || Offset to domain string, relative to start of [[# |
| 0x10 || int || '''namePtr''' || Offset to domain string, relative to start of [[#MasterTable|MAST]]. |
||
|- |
|- |
||
| 0x14 || |
| 0x14 || uint || '''fromNameHash''' || ''null'' |
||
|- |
|- |
||
| 0x18 || int || '''fromNamePtr''' || |
| 0x18 || int || '''fromNamePtr''' || ''0xFFFFFFFF'' |
||
|- |
|- |
||
| 0x1C || int || '''startSector''' || Multiply this by |
| 0x1C || int || '''startSector''' || Multiply this by [[#Header|'''sectorSize''']] to get the absolute offset. Start of [[#SectionTable|SectionTable]]. |
||
|- |
|- |
||
| 0x20 || int || '''sizeOnDisk''' || Size of [[# |
| 0x20 || int || '''sizeOnDisk''' || Size of [[#SectionTable|SECT]]. |
||
|- |
|- |
||
| 0x24 || int || '''sizeInMem''' || Size of [[# |
| 0x24 || int || '''sizeInMem''' || Size of [[#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 || |
| 0x3C || byte[4] || '''reserved''' || ''null'' |
||
|} |
|} |
||
Line 133: | Line 126: | ||
Unknown |
Unknown |
||
=== |
===SectionTable=== |
||
====TableHeader==== |
====TableHeader==== |
||
{| class="wikitable" |
{| class="wikitable" |
||
Line 139: | Line 132: | ||
! Offset !! Type !! Variable !! Description |
! Offset !! Type !! Variable !! Description |
||
|- |
|- |
||
| 0x00 || |
| 0x00 || char[4] || '''tableTypeTag''' || '''SECT''' |
||
|- |
|- |
||
| 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 151: | Line 144: | ||
| 0x14 || int || '''firstMetaRec''' || Offset to [[#MetaSection|MetaSection]], relative to start of this header. |
| 0x14 || int || '''firstMetaRec''' || Offset to [[#MetaSection|MetaSection]], relative to start of this header. |
||
|- |
|- |
||
| 0x18 || int || '''metaDataSize''' || Size of [[#MetaSection|MetaSection]]. |
| 0x18 || int || '''metaDataSize''' || Size of PSL/PSLD entries in [[#MetaSection|MetaSection]] (without child blocks). |
||
|- |
|- |
||
| 0x1C || |
| 0x1C || byte[4] || '''reserved''' || ''null'' |
||
|} |
|} |
||
Line 161: | Line 154: | ||
! Offset !! Type !! Variable !! Description |
! Offset !! Type !! Variable !! Description |
||
|- |
|- |
||
| 0x00 || |
| 0x00 || int || '''sectionType''' || |
||
* '''P''' = Parcel |
* '''P''' = Parcel |
||
* '''PD''' = ParcelDebug |
* '''PD/DP''' = ParcelDebug |
||
* '''PTEX''' = ParcelTexture |
* '''PTEX/XETP''' = ParcelTexture |
||
* '''PFST''' = ParcelMemFast |
* '''PFST/TSFP''' = ParcelMemFast '''(Not present in Ratatouille)''' |
||
|- |
|- |
||
| 0x04 || |
| 0x04 || ushort || '''packLangID''' || |
||
'''Values are in big-endian'''<br>First byte is region code, second byte is language code<br>E.g., 0x0409 = English US, 0x0009 = English Neutral |
|||
* 0x0000 = Neutral Neutral |
|||
* 0x0401 = Arabic SaudiArabia |
|||
* 0x0804 = Chinese China |
|||
* 0x0C04 = Chinese HongKong |
|||
* 0x0404 = Chinese Taiwan |
|||
* 0x1004 = Chinese Singapore |
|||
* 0x0405 = Czech Republic |
|||
* 0x0406 = Danish Denmark |
|||
* 0x0413 = Dutch Netherlands |
|||
* 0x0409 = English US |
|||
* 0x0809 = English UK |
|||
* 0x0C09 = English Australia |
|||
* 0x1009 = English Canada |
|||
* 0x040B = Finnish Finland |
|||
* 0x040C = French France |
|||
* 0x0407 = German Germany |
|||
* 0x0807 = German Swiss |
|||
* 0x0408 = Greek Greece |
|||
* 0x0410 = Italian Italy |
|||
* 0x0411 = Japanese Japan |
|||
* 0x0412 = Korean Korea |
|||
* 0x0814 = Norwegian Nynorsk |
|||
* 0x0415 = Polish Poland |
|||
* 0x0816 = Portuguese Portugal |
|||
* 0x0416 = Portuguese Brazilian |
|||
* 0x0419 = Russian Federation |
|||
* 0x041B = Slovak Slovak |
|||
* 0x080A = Spanish Mexican |
|||
* 0x0C0A = Spanish Spain |
|||
* 0x041D = Swedish Sweden |
|||
* 0x0422 = Ukrainian Ukraine |
|||
|- |
|- |
||
| 0x06 || |
| 0x06 || ubyte || '''parcelType''' || |
||
* 0 = UNDEFINED |
|||
* 1 = EXCLUSIVE |
|||
* 2 = SHARED |
|||
* 3 = FROMDOMAIN |
|||
|- |
|- |
||
| 0x07 || byte || '''pad''' || |
| 0x07 || byte || '''pad''' || ''0x33'' |
||
|- |
|- |
||
| 0x08 || int || '''userKey''' || |
| 0x08 || int || '''userKey''' || ''null'' |
||
|- |
|- |
||
| 0x0C || |
| 0x0C || uint || '''nameHash''' || Lowercase BKDR hash of domain string. |
||
|- |
|- |
||
| 0x10 || int || '''namePtr''' || Offset to domain string, relative to start of [[# |
| 0x10 || int || '''namePtr''' || Offset to domain string, relative to start of [[#SectionTable|SECT]]. |
||
|- |
|- |
||
| 0x14 || |
| 0x14 || uint || '''fromNameHash''' || Lowercase BKDR hash of domain string from original parcel (if '''parcelType''' is 3). |
||
|- |
|- |
||
| 0x18 || int || '''fromNamePtr''' || |
| 0x18 || int || '''fromNamePtr''' || ''0xFFFFFFFF'' |
||
|- |
|- |
||
| 0x1C || int || '''startSector''' || Multiply this by |
| 0x1C || int || '''startSector''' || Multiply this by [[#Header|'''sectorSize''']] to get the absolute offset. Start of section. |
||
|- |
|- |
||
| 0x20 || int || '''sizeOnDisk''' || Size of section |
| 0x20 || int || '''sizeOnDisk''' || Size of section. |
||
|- |
|- |
||
| 0x24 || int || '''sizeInMem''' || Size of section |
| 0x24 || int || '''sizeInMem''' || Size of section. |
||
|- |
|- |
||
| 0x28 || int || '''memoryAlignment''' || |
| 0x28 || int || '''memoryAlignment''' || Memory alignment of ParcelData assets in section. |
||
|- |
|- |
||
| 0x2C || int || '''attributeFlags''' || |
| 0x2C || int || '''attributeFlags''' || ''null'' |
||
|- |
|- |
||
| 0x30 || int || '''externName''' || |
| 0x30 || int || '''externName''' || ''0xFFFFFFFF'' |
||
|- |
|- |
||
| 0x34 || int || '''metaBlockCount''' || Amount of [[# |
| 0x34 || int || '''metaBlockCount''' || Amount of [[#ParcelSliceMeta|PSL]]/[[#ParcelSliceDebugMeta|PSLD]] entries, always 1. |
||
|- |
|- |
||
| 0x38 || int || '''metaRecord''' || Offset to [[# |
| 0x38 || int || '''metaRecord''' || Offset to [[#ParcelSliceMeta|PSL]] (P, PTEX, PFST) or [[#ParcelSliceDebugMeta|PSLD]] (PD) entry, relative to start of [[#SectionTable|SECT]]. |
||
|- |
|- |
||
| 0x3C || |
| 0x3C || byte[4] || '''reserved''' || ''null'' |
||
|} |
|} |
||
===MetaSection=== |
===MetaSection=== |
||
==== |
====ParcelSliceMeta==== |
||
{| class="wikitable" |
{| class="wikitable" |
||
|- |
|- |
||
Line 211: | Line 239: | ||
! colspan="4" | MetaParcelSlicesHeader |
! colspan="4" | MetaParcelSlicesHeader |
||
|- |
|- |
||
| 0x00 || |
| 0x00 || char[4] || '''metatype''' || '''PSL''' |
||
|- |
|- |
||
| 0x04 || int || '''metasize''' || Size of |
| 0x04 || int || '''metasize''' || Size of PSL. |
||
|- |
|- |
||
| 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 |
||
Line 244: | Line 272: | ||
| 0x04 || int || '''brickDataOffset''' || |
| 0x04 || int || '''brickDataOffset''' || |
||
|- |
|- |
||
| 0x08 || int[6] || ''' reserved''' || |
| 0x08 || int[6] || ''' reserved''' || ''0x74747474'' |
||
|- |
|- |
||
! colspan="4" | TOCEntry |
! colspan="4" | TOCEntry |
||
Line 250: | Line 278: | ||
| 0x00 || int || '''elementSize''' || Size of asset (with 0x33 padding bytes). |
| 0x00 || int || '''elementSize''' || Size of asset (with 0x33 padding bytes). |
||
|- |
|- |
||
| 0x04 || int || '''elementOffset''' || Offset to asset, relative to start of [[#SectionEntry|''' |
| 0x04 || int || '''elementOffset''' || Offset to asset, relative to start of [[#SectionEntry|'''startSector''']]. |
||
|- |
|- |
||
| 0x08 || int || '''blobSize''' || Size of asset (without 0x33 padding bytes). |
| 0x08 || int || '''blobSize''' || Size of asset (without 0x33 padding bytes). |
||
Line 256: | Line 284: | ||
| 0x0C || int || '''blobAlign''' || |
| 0x0C || int || '''blobAlign''' || |
||
|- |
|- |
||
| 0x10 || AssetID || '''uidSelf''' || AssetID of corresponding asset. |
| 0x10 || [[AssetID]] || '''uidSelf''' || AssetID of corresponding asset. |
||
|- |
|- |
||
| 0x18 || int || '''wmlTypeID''' || AssetType of corresponding asset. |
| 0x18 || int || '''wmlTypeID''' || AssetType of corresponding asset. |
||
|- |
|- |
||
| 0x1C || short || '''subType''' || |
| 0x1C || short || '''subType''' || Not present in Ratatouille/Wall-E |
||
|- |
|- |
||
| 0x1E || short || '''blobFlags''' || |
| 0x1E || short || '''blobFlags''' || int32 in Ratatouille/Wall-E |
||
|} |
|} |
||
==== |
====ParcelSliceDebugMeta==== |
||
{| class="wikitable |
{| class="wikitable |
||
|- |
|- |
||
! Offset !! Type !! Variable !! Description |
! Offset !! Type !! Variable !! Description |
||
|- |
|- |
||
| 0x00 || |
| 0x00 || string || '''magic''' || '''PSLD''' |
||
|- |
|- |
||
| 0x04 || int || '''size''' || Size of |
| 0x04 || int || '''size''' || Size of PSLD. |
||
|- |
|- |
||
| 0x08 || int || '''count'''|| Amount of '''entrySize''' and '''NameTableEntry''' |
| 0x08 || int || '''count'''|| Amount of [[#PSLD Entry|'''entrySize''']] and [[#PSLD Entry|'''NameTableEntry''']]. |
||
|- |
|- |
||
| 0x0C || int || '''offset''' || Offset to '''NameTableEntry''' |
| 0x0C || int || '''offset''' || Offset to [[#PSLD Entry|'''NameTableEntry''']], relative to start of [[#SectionEntry|'''startSector''']]. |
||
|- |
|- |
||
| 0x10 || |
| 0x10 || byte[16] || Unknown || |
||
|} |
|} |
||
=====PD (ParcelDebug)===== |
|||
=====PSLD Entry===== |
|||
{| class="wikitable" |
{| class="wikitable" |
||
|- |
|- |
||
! Offset !! Type !! Variable !! Description |
! Offset !! Type !! Variable !! Description |
||
|- |
|- |
||
| 0x00 || int[count] || '''entrySize''' || Length in bytes of the entries below |
| 0x00 || int[count] || '''entrySize''' || Length in bytes of the entries below. |
||
|- |
|- |
||
! colspan="4" | NameTableEntry |
! colspan="4" | NameTableEntry |
||
|- |
|- |
||
| 0x00 || AssetID || '''assetid''' || AssetID of corresponding asset. |
| 0x00 || [[AssetID]] || '''assetid''' || AssetID of corresponding asset. |
||
|- |
|- |
||
| 0x08 || int || '''offset'''? || |
| 0x08 || int || '''offset'''? || Relative offset to assetname? |
||
|- |
|- |
||
| 0x0C || int |
| 0x0C || int || Unknown || |
||
|- |
|- |
||
⚫ | |||
⚫ | |||
|- |
|- |
||
| 0x14 || int[3] || Unknown || ''null'' |
|||
⚫ | |||
⚫ | |||
⚫ | |||
|- |
|||
⚫ | |||
|} |
|} |
||
[[Category:File Format]] [[Category:GoodEngine]] |
Latest revision as of 00:56, 27 November 2022
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
HO archives are stored as big endian in all console versions of each game. Family Guy PC archives are stored as little endian.
Format
Header
Offset | Type | Variable | Description |
---|---|---|---|
0x00 | char[4] | 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 | char[0x18] | 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 | byte[0x3B4] | reserved | 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 | Always 1. |
0x640 | byte[0x1C0] | reserved | null |
MasterTable
TableHeader
Offset | Type | Variable | Description |
---|---|---|---|
0x00 | char[4] | 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 | byte[4] | reserved | null |
MasterEntry
Offset | Type | Variable | Description |
---|---|---|---|
0x00 | int | sectionType | SECT/TCES |
0x04 | ushort | packLangID | null |
0x06 | ubyte | parcelType | null |
0x07 | byte | pad | 0x33 |
0x08 | int | userKey | null |
0x0C | uint | nameHash | Lowercase BKDR hash of domain string. |
0x10 | int | namePtr | Offset to domain string, relative to start of MAST. |
0x14 | uint | fromNameHash | null |
0x18 | int | fromNamePtr | 0xFFFFFFFF |
0x1C | int | startSector | Multiply this by sectorSize to get the absolute offset. Start of 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 | byte[4] | reserved | null |
StringTable
Unknown
SectionTable
TableHeader
Offset | Type | Variable | Description |
---|---|---|---|
0x00 | char[4] | 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 | byte[4] | reserved | null |
SectionEntry
Offset | Type | Variable | Description |
---|---|---|---|
0x00 | int | sectionType |
|
0x04 | ushort | packLangID |
Values are in big-endian
|
0x06 | ubyte | parcelType |
|
0x07 | byte | pad | 0x33 |
0x08 | int | userKey | null |
0x0C | uint | nameHash | Lowercase BKDR hash of domain string. |
0x10 | int | namePtr | Offset to domain string, relative to start of SECT. |
0x14 | uint | fromNameHash | Lowercase BKDR hash 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 | byte[4] | reserved | null |
MetaSection
ParcelSliceMeta
Offset | Type | Variable | Description |
---|---|---|---|
MetaParcelSlicesHeader | |||
0x00 | char[4] | metatype | PSL |
0x04 | int | metasize | Size of PSL. |
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 | 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 | Not present in Ratatouille/Wall-E |
0x1E | short | blobFlags | int32 in Ratatouille/Wall-E |
ParcelSliceDebugMeta
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
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? | Relative offset to assetname? |
0x0C | int | Unknown | |
0x10 | int | Unknown | 0xFFFFFFFF |
0x14 | int[3] | Unknown | null |
0x20 | char[] | assetname | Null-terminated name of corresponding asset. |
Padding - 0x33 bytes until this entry reaches <entrySize> in length. |