GoodEngine/HO (File Format): Difference between revisions

From Heavy Iron Modding
Content added Content deleted
mNo edit summary
No edit summary
 
(6 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===
===Endian===
Line 5: Line 5:


==Format==
==Format==
===HEL/HEB===
===Header===
0x800 HO header

{| class="wikitable"
{| class="wikitable"
|-
|-
! Offset !! Type !! Variable !! Description
! Offset !! Type !! Variable !! Description
|-
|-
| 0x00 || string || '''cMagic''' || '''HEL''' or '''HEB'''
| 0x00 || char[4] || '''cMagic''' || '''HEL''' or '''HEB'''
|-
|-
| 0x04 || int || '''verPackFile''' ||
| 0x04 || int || '''verPackFile''' ||
Line 20: Line 18:
| 0x0C || int || '''geBuildNum''' ||
| 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)
| 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''' || <code>Www Mmm dd hh:mm:ss yyyy</code>
| 0x18 || char[0x18] || '''timeString''' || <code>Www Mmm dd hh:mm:ss yyyy</code>
|-
|-
| 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''' || Always 0x800 (2048 bytes).
|-
|-
| 0x44 || int || [MasterTable] '''startSector''' || Always 1 (if '''sectorSize''' is 0x800)
| 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 [[#MasterTable|MAST]].
|-
|-
| 0x4C || int || '''pad01''' || ''null''
| 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 = Spongebob's Truth or Square
* 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 = Bakugan '''[Unreleased]'''
* UFCU = UFC Undisputed '''[Unreleased]'''
|-
|-
| 0x4BC || WideString || '''creator''' || always "'''GoodEditor:PackView.GEPlugin'''"
| 0x4BC || WideString || '''creator''' || always "'''GoodEditor:PackView.GEPlugin'''"
Line 61: Line 53:
| 0x5FC || WideString || '''hash''' ||
| 0x5FC || WideString || '''hash''' ||
|-
|-
| 0x63C || int || '''libVersion''' ||
| 0x63C || int || '''libVersion''' || Always 1.
|-
|-
| 0x640 || int || '''pad02''' || ''null''
| 0x640 || byte[0x1C0] || '''reserved''' || ''null''
|}
|}


===MAST (MasterTable)===
===MasterTable===
====TableHeader====
====TableHeader====
{| class="wikitable"
{| class="wikitable"
Line 72: Line 64:
! Offset !! Type !! Variable !! Description
! Offset !! Type !! Variable !! Description
|-
|-
| 0x00 || string || '''tableTypeTag''' || '''MAST'''
| 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.
Line 86: Line 78:
| 0x18 || int || '''metaDataSize''' || ''null''
| 0x18 || int || '''metaDataSize''' || ''null''
|-
|-
| 0x1C || int || '''reserved''' || ''null''
| 0x1C || byte[4] || '''reserved''' || ''null''
|}
|}


Line 96: Line 88:
| 0x00 || int || '''sectionType''' || '''SECT/TCES'''
| 0x00 || int || '''sectionType''' || '''SECT/TCES'''
|-
|-
| 0x04 || short || '''packLangID''' || ''null''
| 0x04 || ushort || '''packLangID''' || ''null''
|-
|-
| 0x06 || byte || '''parcelType''' || ''null''
| 0x06 || ubyte || '''parcelType''' || ''null''
|-
|-
| 0x07 || byte || '''pad''' || ''0x33''
| 0x07 || byte || '''pad''' || ''0x33''
Line 104: Line 96:
| 0x08 || int || '''userKey''' || ''null''
| 0x08 || int || '''userKey''' || ''null''
|-
|-
| 0x0C || int || '''nameHash''' || Lowercase BKDRHash of domainString.
| 0x0C || uint || '''nameHash''' || Lowercase BKDR hash of domain string.
|-
|-
| 0x10 || int || '''namePtr''' || Offset to domainString, relative to start of [[#MAST (MasterTable)|MAST]].
| 0x10 || int || '''namePtr''' || Offset to domain string, relative to start of [[#MasterTable|MAST]].
|-
|-
| 0x14 || int || '''fromNameHash''' || ''null''
| 0x14 || uint || '''fromNameHash''' || ''null''
|-
|-
| 0x18 || int || '''fromNamePtr''' || ''0xFFFFFFFF''
| 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 [[#Header|'''sectorSize''']] to get the absolute offset. Start of [[#SectionTable|SectionTable]].
|-
|-
| 0x20 || int || '''sizeOnDisk''' || Size of [[#SECT (SectionTable)|SECT]].
| 0x20 || int || '''sizeOnDisk''' || Size of [[#SectionTable|SECT]].
|-
|-
| 0x24 || int || '''sizeInMem''' || Size of [[#SECT (SectionTable)|SECT]].
| 0x24 || int || '''sizeInMem''' || Size of [[#SectionTable|SECT]].
|-
|-
| 0x28 || int || '''memoryAlignment''' || ''0xFFFFFFFF''
| 0x28 || int || '''memoryAlignment''' || ''0xFFFFFFFF''
Line 128: Line 120:
| 0x38 || int || '''metaRecord''' || ''0xFFFFFFFF''
| 0x38 || int || '''metaRecord''' || ''0xFFFFFFFF''
|-
|-
| 0x3C || int || '''reserved''' || ''null''
| 0x3C || byte[4] || '''reserved''' || ''null''
|}
|}


Line 134: Line 126:
Unknown
Unknown


===SECT (SectionTable)===
===SectionTable===
====TableHeader====
====TableHeader====
{| class="wikitable"
{| class="wikitable"
Line 140: Line 132:
! Offset !! Type !! Variable !! Description
! Offset !! Type !! Variable !! Description
|-
|-
| 0x00 || string || '''tableTypeTag''' || '''SECT'''
| 0x00 || char[4] || '''tableTypeTag''' || '''SECT'''
|-
|-
| 0x04 || int || '''entryCount''' || Amount of [[#SectionEntry|section entries]].
| 0x04 || int || '''entryCount''' || Amount of [[#SectionEntry|section entries]].
Line 146: Line 138:
| 0x08 || int || '''tableFlags''' || ''null''
| 0x08 || int || '''tableFlags''' || ''null''
|-
|-
| 0x0C || int || '''firstString''' || Offset to domainString, relative to start of this header.
| 0x0C || int || '''firstString''' || Offset to domain string, relative to start of this header.
|-
|-
| 0x10 || int || '''stringTableSize''' || Size of domainString.
| 0x10 || int || '''stringTableSize''' || Size of domain string.
|-
|-
| 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 || int || '''reserved''' || ''null''
| 0x1C || byte[4] || '''reserved''' || ''null''
|}
|}


Line 166: Line 158:
* '''PD/DP''' = ParcelDebug
* '''PD/DP''' = ParcelDebug
* '''PTEX/XETP''' = ParcelTexture
* '''PTEX/XETP''' = ParcelTexture
* '''PFST/TSFP''' = ParcelMemFast
* '''PFST/TSFP''' = ParcelMemFast '''(Not present in Ratatouille)'''
|-
|-
| 0x04 || short || '''packLangID''' ||
| 0x04 || ushort || '''packLangID''' ||
'''(Values are in big-endian)'''
'''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 = NeutralNeutral
* 0x0000 = Neutral Neutral
* 0x0401 = ArabicSaudiArabia
* 0x0401 = Arabic SaudiArabia
* 0x0804 = ChineseChina
* 0x0804 = Chinese China
* 0x0C04 = ChineseHongKong
* 0x0C04 = Chinese HongKong
* 0x0404 = ChineseTaiwan
* 0x0404 = Chinese Taiwan
* 0x1004 = ChineseSingapore
* 0x1004 = Chinese Singapore
* 0x0405 = CzechRepublic
* 0x0405 = Czech Republic
* 0x0406 = DanishDenmark
* 0x0406 = Danish Denmark
* 0x0413 = DutchNetherlands
* 0x0413 = Dutch Netherlands
* 0x0409 = EnglishUS
* 0x0409 = English US
* 0x0809 = EnglishUK
* 0x0809 = English UK
* 0x0C09 = EnglishAustralia
* 0x0C09 = English Australia
* 0x1009 = EnglishCanada
* 0x1009 = English Canada
* 0x040B = FinnishFinland
* 0x040B = Finnish Finland
* 0x040C = FrenchFrance
* 0x040C = French France
* 0x0407 = GermanGermany
* 0x0407 = German Germany
* 0x0807 = GermanSwiss
* 0x0807 = German Swiss
* 0x0408 = GreekGreece
* 0x0408 = Greek Greece
* 0x0410 = ItalianItaly
* 0x0410 = Italian Italy
* 0x0411 = JapaneseJapan
* 0x0411 = Japanese Japan
* 0x0412 = KoreanKorea
* 0x0412 = Korean Korea
* 0x0814 = NorwegianNynorsk
* 0x0814 = Norwegian Nynorsk
* 0x0415 = PolishPoland
* 0x0415 = Polish Poland
* 0x0816 = PortuguesePortugal
* 0x0816 = Portuguese Portugal
* 0x0416 = PortugueseBrazilian
* 0x0416 = Portuguese Brazilian
* 0x0419 = RussianFederation
* 0x0419 = Russian Federation
* 0x041B = SlovakSlovak
* 0x041B = Slovak Slovak
* 0x080A = SpanishMexican
* 0x080A = Spanish Mexican
* 0x0C0A = SpanishSpain
* 0x0C0A = Spanish Spain
* 0x041D = SwedishSweden
* 0x041D = Swedish Sweden
* 0x0422 = UkrainianUkraine
* 0x0422 = Ukrainian Ukraine
|-
|-
| 0x06 || byte || '''parcelType''' ||
| 0x06 || ubyte || '''parcelType''' ||
* 0 = UNDEFINED
* 0 = UNDEFINED
* 1 = EXCLUSIVE
* 1 = EXCLUSIVE
Line 212: Line 204:
| 0x08 || int || '''userKey''' || ''null''
| 0x08 || int || '''userKey''' || ''null''
|-
|-
| 0x0C || int || '''nameHash''' || Lowercase BKDRHash of domainString.
| 0x0C || uint || '''nameHash''' || Lowercase BKDR hash of domain string.
|-
|-
| 0x10 || int || '''namePtr''' || Offset to domainString, relative to start of [[#SECT (SectionTable)|SECT]].
| 0x10 || int || '''namePtr''' || Offset to domain string, relative to start of [[#SectionTable|SECT]].
|-
|-
| 0x14 || int || '''fromNameHash''' || Lowercase BKDRHash of domainString from original parcel (if '''parcelType''' is 3)
| 0x14 || uint || '''fromNameHash''' || Lowercase BKDR hash of domain string from original parcel (if '''parcelType''' is 3).
|-
|-
| 0x18 || int || '''fromNamePtr''' || ''0xFFFFFFFF''
| 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 [[#Header|'''sectorSize''']] to get the absolute offset. Start of section.
|-
|-
| 0x20 || int || '''sizeOnDisk''' || Size of section.
| 0x20 || int || '''sizeOnDisk''' || Size of section.
Line 232: Line 224:
| 0x30 || int || '''externName''' || ''0xFFFFFFFF''
| 0x30 || int || '''externName''' || ''0xFFFFFFFF''
|-
|-
| 0x34 || int || '''metaBlockCount''' || Amount of [[#PSL (ParcelSliceMeta)|PSL]]/[[#PSLD (ParcelSliceDebugMeta)|PSLD]] entries.
| 0x34 || int || '''metaBlockCount''' || Amount of [[#ParcelSliceMeta|PSL]]/[[#ParcelSliceDebugMeta|PSLD]] entries, always 1.
|-
|-
| 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 [[#ParcelSliceMeta|PSL]] (P, PTEX, PFST) or [[#ParcelSliceDebugMeta|PSLD]] (PD) entry, relative to start of [[#SectionTable|SECT]].
|-
|-
| 0x3C || int || '''reserved''' || ''null''
| 0x3C || byte[4] || '''reserved''' || ''null''
|}
|}



===MetaSection===
===MetaSection===
====PSL (ParcelSliceMeta)====
====ParcelSliceMeta====
{| class="wikitable"
{| class="wikitable"
|-
|-
Line 248: Line 239:
! colspan="4" | MetaParcelSlicesHeader
! colspan="4" | MetaParcelSlicesHeader
|-
|-
| 0x00 || string || '''metatype''' || '''PSL'''
| 0x00 || char[4] || '''metatype''' || '''PSL'''
|-
|-
| 0x04 || int || '''metasize''' || Size of PSL.
| 0x04 || int || '''metasize''' || Size of PSL.
Line 287: 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|'''startsector''']].
| 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 297: Line 288:
| 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
|}
|}


====PSLD (ParcelSliceDebugMeta)====
====ParcelSliceDebugMeta====
{| class="wikitable
{| class="wikitable
|-
|-
Line 311: Line 302:
| 0x04 || int || '''size''' || Size of PSLD.
| 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 || byte[16] || Unknown ||
| 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
Line 328: Line 320:
| 0x00 || [[AssetID]] || '''assetid''' || AssetID of corresponding asset.
| 0x00 || [[AssetID]] || '''assetid''' || AssetID of corresponding asset.
|-
|-
| 0x08 || int || '''offset'''? || Offset to assetname?
| 0x08 || int || '''offset'''? || Relative offset to assetname?
|-
|-
| 0x0C || int || Unknown ||
| 0x0C || int || Unknown ||
Line 336: Line 328:
| 0x14 || int[3] || Unknown || ''null''
| 0x14 || int[3] || Unknown || ''null''
|-
|-
| 0x20 || String || '''assetname''' || Name of corresponding asset.
| 0x20 || char[] || '''assetname''' || Null-terminated name of corresponding asset.
|-
|-
| colspan="4 | Padding - 0x33 bytes until this entry reaches '''<entrySize>''' in length.
| colspan="4 | Padding - 0x33 bytes until this entry reaches '''<entrySize>''' in length.
|}
|}


[[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
  • WII
  • PS3
  • XENON (Xbox360)
  • PC
0x43C WideString user always "hvir_autobuild"
0x47C WideString 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: Back to the Multiverse
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
  • P = Parcel
  • PD/DP = ParcelDebug
  • PTEX/XETP = ParcelTexture
  • PFST/TSFP = ParcelMemFast (Not present in Ratatouille)
0x04 ushort packLangID

Values are in big-endian
First byte is region code, second byte is language code
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 ubyte parcelType
  • 0 = UNDEFINED
  • 1 = EXCLUSIVE
  • 2 = SHARED
  • 3 = FROMDOMAIN
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
  • 0 = ParcelTOC
  • 1 = ParcelData
  • 2 = Padding (0x33)
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.