Bundle (original): Difference between revisions

Split Bundle 2 information into a separate page.
mNo edit summary
(Split Bundle 2 information into a separate page.)
Line 1:
{{hatnote|This page is about the original Bundle format, used only during development. For the version used in retail titles, see [[Bundle 2]].}}
{{subpage|Enumerations|text=Enumerations used in the Bundle container.}}
 
The Bundle container is the core file format used in development builds of Burnout 5/Paradise, Black (Xbox 360), and Criterion'sBlack other2 7th-gen(Xbox titles,360). withIt theis exceptionnot ofused Burnoutin Revengeany (X360)retail titles. Each Bundle holds one or more resources (assets) and contains information about each resource, such as its size, [[Resource Types (Burnout Paradise)|type]], compression, alignment, and so on.
 
The Bundle format has two major versions: the original, using the <code>bndl</code> magic, and Bundle 2, using the <code>bnd2</code> magic. The first Bundle format underwent at least five iterations during its use from early 2006 to early-mid 2007,. butAt itpresent, wasonly neverfiles usedusing inBundle aversion retail3, game4, and can5 onlyhave bebeen found in development builds of games such as Burnout Paradisediscovered. It was succeeded by Bundle 2, which ultimately saw use in the retail versions of Burnout Paradise (version[[Bundle 2),]] Need for Speed Hot Pursuit (version 3), and Need for Speed Most Wanted (version 5)container.
 
At present, only files using Bundle version 3, 4, and 5 have been discovered. Those versions, plus Bundle 2 version 2, are described below. For information on later versions, see the [https://needforspeed.miraheze.org/wiki/Bundle Need for Speed Wiki].
 
= Overview =
Bundles are used for nearly every asset in Burnout Paradise, with the only exceptions being the <code>JUNKYARDLIGHTING.DAT</code> text file and <code>STARDATA.DAT</code> binary file (both in the <code>ENVIRONMENTSETTINGS</code> folder), the non-RAM portion of sound assets, and video files. This makes it one of the most important formats to understand when attempting to parse assets.
 
While the header contains some valuable data, such as the flags and chunk offsets, the majority of relevant information is in resource entries, which store the ID, uncompressed and compressed size, alignment, relative offset, and type of each resource in each chunk. These also store the import offsets, which enable importing specific data from other resources.
 
Bundle debug data is also important to understand. Sometimes called Bundle imports, this was originally only available in development builds but shipped with every Bundle in the game in Remastered.it Consistingconsists of XML data headed by the <code>ResourceStringTable</code> element, itand contains the ID, name, and type name of every resource in a respective bundle. This means that effectivelywhere debug data is present, every resource name in the game is known. Despite this, the resource names given by the debug data sometimes do not match the hash when encoded. In some cases, such as with Registry resources, this means the name is hardcoded.
 
= Memory types =
Across all Bundle versions, a common theme is the use of separate data chunks to define what memory type resources are loaded into. These chunks are as follows:
 
Bundle:
# Main Memory
# Disposable
Line 24 ⟶ 21:
# Disposable uninitialized
 
Keep these in mind when viewing the specs belowstructures.
Bundle 2 V2:
# Main Memory
# Graphics System
# Graphics Local
 
Keep these in mind when viewing the specs below.
 
= Bundle LayoutStructures =
The original Bundle format's versions were treated more like additions to the previous version. Thus, rather than a full structure for each, only their additions are described here.
 
== CgsResource::BundleHeaderBase ==
== Version 3 ==
=== Bundle ===
{| class="wikitable"
Line 42 ⟶ 34:
| 0x0 || 0x4 || char[4] || macMagicNumber || Bundle magic || bndl
|-
| 0x4 || 0x4 || uint32_t || muVersion || Bundle version || 3
|-
| 0x8 || 0x4 || uint32_t || muResourceEntriesCount || Number of resources in the bundle ||
|-
| 0xC || 0x28 || [[#Unknown0 | Unknown0]][5] || || Size and alignment of each chunk ||
|-
| 0x34 || 0x14 || uint32_t[5] || || Memory address of each chunk ||
Line 58 ⟶ 50:
| 0x54 || 0x4 || uint32_t || muResourceDataOffset || Resource data offset ||
|-
| 0x58 || 0x4 || uint32_t || muPlatform || Platform the bundle was built for || See [[Bundle/Enumerations#Platform | Platform]]
|}
 
Line 70 ⟶ 62:
| 0x4 || 0x4 || uint32_t || muImportOffset || Bundle imports offset ||
|-
| 0x8 || 0x4 || uint32_t || muResourceTypeId || Resource type || See [[Resource#ResourceType Types (Burnout Paradise)|Resource TypesResourceType]]
|-
| 0xC || 0x28 || [[#Unknown0 | Unknown0]][5] || mauSizeAndAlignmentOnDisk || ||
|-
| 0x34 || 0x28 || [[#Unknown0 | Unknown0]][5] || mauDiskOffset || Offsets in bundle || Alignment is unused (always 1)
|-
| 0x5C || 0x14 || uint32_t[5] || || Memory addresses || Swapped endian
Line 86 ⟶ 78:
| 0x0 || 0x4 || uint32_t || muImportCount || Number of imports ||
|-
| 0x8 || || || || Import entries || Aligned 8. See [[#ImportEntry | ImportEntry]] structure
|}
 
Line 94 ⟶ 86:
! Offset !! Size !! Type !! Name !! Description !! Comments
|-
| 0x0 || 0x8 || [[Common Data Types (Burnout Paradise)#CgsResourceID | ID]] || mResourceId || Resource name CRC32 ||
|-
| 0x8 || 0x4 || uint32_t || muOffset || ||
Line 112 ⟶ 104:
|}
 
== CgsResource::BundleHeaderV4 ==
== Version 4 Additions ==
=== Bundle (Additions) ===
{| class="wikitable"
|-
! Offset !! Size !! Type !! Name !! Description !! Comments
|-
| 0x5C || 0x4 || uint32_t || muFlags || Bundle flags || See [[Bundle/Enumerations#Flags | Flags]]
|-
| 0x60 || 0x4 || uint32_t || || Number of compressed resources ||
Line 133 ⟶ 125:
|}
 
== CgsResource::BundleHeaderV5 ==
== Version 5 Additions ==
=== Bundle (Additions) ===
{| class="wikitable"
|-
Line 144 ⟶ 136:
|}
 
= Bundle 2 LayoutEnumerations =
=== BundleV2Platform ===
{| class="wikitable"
|-
! Offset !! Size !! Type !! Name !! DescriptionValue !! Comments
|-
| ? || 1 || PC
| 0x0 || 0x4 || char[4] || macMagicNumber || Bundle magic || bnd2
|-
| ? || 2 || Xbox 360
| 0x4 || 0x4 || uint32_t || muVersion || Bundle version ||
|-
| ? || 3 || PlayStation 3
| 0x8 || 0x4 || uint32_t || muPlatform || Platform the bundle was built for || See [[Bundle/Enumerations#Platform|Platform]]
|-
| 0xC || 0x4 || uint32_t || muDebugDataOffset || Bundle debug data offset || ResourceStringTable XML
|-
| 0x10 || 0x4 || uint32_t || muResourceEntriesCount || Number of resources in the bundle ||
|-
| 0x14 || 0x4 || uint32_t || muResourceEntriesOffset || Resource entries offset ||
|-
| 0x18 || 0xC || uint32_t[3] || mauResourceDataOffset || Resource data offset ||
|-
| 0x24 || 0x4 || uint32_t || muFlags || Bundle flags || See [[Bundle/Enumerations#Flags|Flags]]
|}
 
=== ResourceEntryFlags ===
{| class="wikitable"
|-
! Offset !! Size !! Type !! Name !! DescriptionValue !! Comments
|-
| IsCompressed || 0x1 || Resources are zlib compressed
| 0x0 || 0x8 || ID || mResourceId || Resource name CRC32 || Hashed names are all lowercase
|-
| 0x8 || 0x8 || uint64_t || muImportHash || Dependency name(s) CRC32(s) || Multiple are combined with a bitwise OR
|-
| 0x10 || 0xC || uint32_t[3] || mauUncompressedSizeAndAlignment || Resource sizes (uncompressed) for each chunk || Has high nibble for alignment; changes between platforms<br>1 << [nibble] equals the memory alignment value
|-
| 0x1C || 0xC || uint32_t[3] || mauSizeAndAlignmentOnDisk || Resource sizes (compressed) for each chunk || See above
|-
| 0x28 || 0xC || uint32_t[3] || mauDiskOffset || Resource offsets for each chunk || Relative to the start of the respective chunk
|-
| 0x34 || 0x4 || uint32_t || muImportOffset || Bundle imports offset ||
|-
| 0x38 || 0x4 || uint32_t || muResourceTypeId || Resource type || See [[Resource Types (Burnout Paradise)|Resource Types]]
|-
| 0x3C || 0x2 || uint16_t || muImportCount || Number of imports ||
|-
| 0x3E || 0x1 || uint8_t || muFlags || ||
|-
| 0x3F || 0x1 || uint8_t || muStreamIndex || ||
|}
 
=== ImportEntryResourceType ===
| 0x38 || 0x4 || uint32_t || muResourceTypeId || Resource type || See [[Resource Types (Burnout Paradise) | Resource Types]].
{| class="wikitable"
|-
! Offset !! Size !! Type !! Name !! Description !! Comments
|-
| 0x0 || 0x8 || ID || mResourceId || Resource name CRC32 || ImportEntries are appended to the end of resources.
|-
| 0x8 || 0x4 || uint32_t || muOffset || ||
|-
| 0xC || 0x4 || || || padding ||
|}