<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://codresearch.dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jakes625</id>
	<title>COD Engine Research - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://codresearch.dev/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Jakes625"/>
	<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php/Special:Contributions/Jakes625"/>
	<updated>2026-07-28T08:15:04Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.3</generator>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:LoadContext&amp;diff=1092</id>
		<title>Category:LoadContext</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:LoadContext&amp;diff=1092"/>
		<updated>2026-07-11T14:38:05Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* XAssetEntry */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Load Context =&lt;br /&gt;
&lt;br /&gt;
The relationship is:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Global DB state&lt;br /&gt;
├── Zone registry&lt;br /&gt;
│   ├── patch_mp       -&amp;gt; its own XZoneMemory&lt;br /&gt;
│   ├── common_mp      -&amp;gt; its own XZoneMemory&lt;br /&gt;
│   ├── ui_mp          -&amp;gt; its own XZoneMemory&lt;br /&gt;
│   ├── mp_boneyard_load -&amp;gt; its own XZoneMemory&lt;br /&gt;
│   └── mp_boneyard    -&amp;gt; its own XZoneMemory&lt;br /&gt;
├── Current stream state&lt;br /&gt;
│   └── points at one zone&#039;s XZoneMemory while that zone is loading&lt;br /&gt;
└── Global XAsset registry&lt;br /&gt;
    └── shared by assets from every loaded zone&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* XZoneMemory is per zone.&lt;br /&gt;
* Dependencies do not combine their blocks into one XZoneMemory.&lt;br /&gt;
* The global XAsset registry spans all loaded zones.&lt;br /&gt;
* Each XAssetEntry records its owning zoneIndex.&lt;br /&gt;
* Asset overrides and deduplication happen through the shared registry.&lt;br /&gt;
* Unloading a zone frees that zone’s XZoneMemory and removes or reveals its registry entries as appropriate.&lt;br /&gt;
&lt;br /&gt;
Conceptually:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void DB_LoadZone(XZone *zone, DBFile *file)&lt;br /&gt;
{&lt;br /&gt;
    DB_AllocXZoneMemory(file-&amp;gt;blockSizes, &amp;amp;zone-&amp;gt;memory);&lt;br /&gt;
    DB_InitStreams(&amp;amp;zone-&amp;gt;memory);&lt;br /&gt;
&lt;br /&gt;
    // The global stream state now points into this zone&#039;s seven blocks.&lt;br /&gt;
    DB_LoadXFile(&amp;amp;zone-&amp;gt;memory, file);&lt;br /&gt;
&lt;br /&gt;
    // Loaded assets are registered into the shared global XAsset registry.&lt;br /&gt;
    DB_PostLoadXZone(zone);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== XZone ==&lt;br /&gt;
The encompassing live zone record appears shaped like:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
// PROVEN: PS3 DB_LoadXAssets and its callers use these five numeric bits as&lt;br /&gt;
// zone allocation/free categories. CORRELATED: Xbox IW4 symbols provide the&lt;br /&gt;
// DB_ZONE_* member names for those bits.&lt;br /&gt;
enum XZoneFlags : int&lt;br /&gt;
{&lt;br /&gt;
    None = 0,&lt;br /&gt;
    DB_ZONE_COMMON = 0x01,&lt;br /&gt;
    DB_ZONE_UI = 0x02,&lt;br /&gt;
    DB_ZONE_GAME = 0x04,&lt;br /&gt;
    DB_ZONE_LOAD = 0x08,&lt;br /&gt;
    DB_ZONE_DEV = 0x10&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
typedef struct XZone&lt;br /&gt;
{&lt;br /&gt;
    uint32_t zoneId;          // 0x00&lt;br /&gt;
    uint32_t unknown04;       // 0x04&lt;br /&gt;
    char     name[64];        // 0x08&lt;br /&gt;
    uint32_t unknown48;       // 0x48&lt;br /&gt;
    XZoneFlags zoneFlags;     // 0x4C&lt;br /&gt;
    uint32_t unknown50;       // 0x50&lt;br /&gt;
    XZoneMemory memory;       // 0x54&lt;br /&gt;
} XZone;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XZoneInfo ===&lt;br /&gt;
PS3 function 0x0011B968, corresponding to DB_LoadXAssets, independently proves the field behavior:&lt;br /&gt;
* It iterates XZoneInfo using a 0x0C stride.&lt;br /&gt;
* +0x08 is intersected with each loaded XZone flag word at +0x4C.&lt;br /&gt;
* Every zone where (freeFlags &amp;amp; zoneFlags) != 0 is selected for unloading.&lt;br /&gt;
* +0x04 is copied into the internal queued request at +0x40 and becomes the loaded zone’s category/lifetime flags.&lt;br /&gt;
* Freeing happens before new named records from the same batch are queued.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Meaning&lt;br /&gt;
! PS3 usage&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x01&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;COMMON&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;code_post_gfx_mp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;patch_mp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;common_mp&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x02&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;UI&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;ui_mp&amp;lt;/code&amp;gt;, DLC UI zones&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x04&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;GAME&amp;lt;/code&amp;gt;&lt;br /&gt;
| Main map/game zone path&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;lt;map&amp;amp;gt;_load&amp;lt;/code&amp;gt; path&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;DEV&amp;lt;/code&amp;gt;&lt;br /&gt;
| Appears in free masks, but no standalone PS3 allocation observed yet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Common combined masks include:&lt;br /&gt;
* 0x06 = UI | GAME&lt;br /&gt;
* 0x18 = LOAD | DEV&lt;br /&gt;
* 0x1E = every category except COMMON&lt;br /&gt;
The Xbox builds also contain the assertion !(freeFlags &amp;amp; DB_ZONE_COMMON). That prohibition is Xbox-proven and strongly PS3-correlated.&lt;br /&gt;
patch_mp and common_mp have 0x01, while ui_mp has 0x02.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct XZoneInfo&lt;br /&gt;
{&lt;br /&gt;
    char* Name,&lt;br /&gt;
    XZoneFlags AllocFlags,&lt;br /&gt;
    XZoneFlags FreeFlags&lt;br /&gt;
} XZoneInfo; // 0x0C&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== XZoneMemory ==&lt;br /&gt;
XZoneMemory is the memory-block allocation for one loaded zone/fastfile. It is only one component of the engine’s broader database loading state.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
typedef enum XFileBlockType&lt;br /&gt;
{&lt;br /&gt;
    XFILE_BLOCK_TEMP     = 0,&lt;br /&gt;
    XFILE_BLOCK_PHYSICAL = 1,&lt;br /&gt;
    XFILE_BLOCK_RUNTIME  = 2,&lt;br /&gt;
    XFILE_BLOCK_VIRTUAL  = 3,&lt;br /&gt;
    XFILE_BLOCK_LARGE    = 4,&lt;br /&gt;
    XFILE_BLOCK_CALLBACK = 5,&lt;br /&gt;
    XFILE_BLOCK_VERTEX   = 6,&lt;br /&gt;
&lt;br /&gt;
    XFILE_BLOCK_COUNT    = 7&lt;br /&gt;
} XFileBlockType;&lt;br /&gt;
&lt;br /&gt;
typedef struct XZoneMemoryBlock&lt;br /&gt;
{&lt;br /&gt;
    void* address;  // Live address; null when size is zero&lt;br /&gt;
    uint32_t size;     // Declared allocation size&lt;br /&gt;
} XZoneMemoryBlock;&lt;br /&gt;
&lt;br /&gt;
typedef struct XZoneMemory&lt;br /&gt;
{&lt;br /&gt;
    XZoneMemoryBlock blocks[XFILE_BLOCK_COUNT];&lt;br /&gt;
} XZoneMemory;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== XAssetEntry ==&lt;br /&gt;
The engines load context keeps a record of semantic asset names to it&#039;s place in memory. The engine more or less does this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct XAssetEntry&lt;br /&gt;
{&lt;br /&gt;
    uint32_t assetType;          // 0x00: XAssetType&lt;br /&gt;
    XAsset*  headerPointer;      // 0x04: canonical asset-header pointer&lt;br /&gt;
&lt;br /&gt;
    uint8_t  zoneIndex;          // 0x08: owning zone-record index&lt;br /&gt;
    uint8_t  flags09;            // 0x09: bit 0 is tested by registry logic&lt;br /&gt;
    uint8_t  state0A;            // 0x0A: initialized to zero; meaning OPEN&lt;br /&gt;
    uint8_t  pad0B;              // 0x0B: no semantics proven&lt;br /&gt;
&lt;br /&gt;
    uint16_t nextHashIndex;      // 0x0C: next entry in the name-hash chain&lt;br /&gt;
    uint16_t nextOverrideIndex;  // 0x0E: override/replacement chain&lt;br /&gt;
} XAssetEntry;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:LoadContext&amp;diff=1091</id>
		<title>Category:LoadContext</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:LoadContext&amp;diff=1091"/>
		<updated>2026-07-11T14:35:11Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* XZone */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Load Context =&lt;br /&gt;
&lt;br /&gt;
The relationship is:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Global DB state&lt;br /&gt;
├── Zone registry&lt;br /&gt;
│   ├── patch_mp       -&amp;gt; its own XZoneMemory&lt;br /&gt;
│   ├── common_mp      -&amp;gt; its own XZoneMemory&lt;br /&gt;
│   ├── ui_mp          -&amp;gt; its own XZoneMemory&lt;br /&gt;
│   ├── mp_boneyard_load -&amp;gt; its own XZoneMemory&lt;br /&gt;
│   └── mp_boneyard    -&amp;gt; its own XZoneMemory&lt;br /&gt;
├── Current stream state&lt;br /&gt;
│   └── points at one zone&#039;s XZoneMemory while that zone is loading&lt;br /&gt;
└── Global XAsset registry&lt;br /&gt;
    └── shared by assets from every loaded zone&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* XZoneMemory is per zone.&lt;br /&gt;
* Dependencies do not combine their blocks into one XZoneMemory.&lt;br /&gt;
* The global XAsset registry spans all loaded zones.&lt;br /&gt;
* Each XAssetEntry records its owning zoneIndex.&lt;br /&gt;
* Asset overrides and deduplication happen through the shared registry.&lt;br /&gt;
* Unloading a zone frees that zone’s XZoneMemory and removes or reveals its registry entries as appropriate.&lt;br /&gt;
&lt;br /&gt;
Conceptually:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void DB_LoadZone(XZone *zone, DBFile *file)&lt;br /&gt;
{&lt;br /&gt;
    DB_AllocXZoneMemory(file-&amp;gt;blockSizes, &amp;amp;zone-&amp;gt;memory);&lt;br /&gt;
    DB_InitStreams(&amp;amp;zone-&amp;gt;memory);&lt;br /&gt;
&lt;br /&gt;
    // The global stream state now points into this zone&#039;s seven blocks.&lt;br /&gt;
    DB_LoadXFile(&amp;amp;zone-&amp;gt;memory, file);&lt;br /&gt;
&lt;br /&gt;
    // Loaded assets are registered into the shared global XAsset registry.&lt;br /&gt;
    DB_PostLoadXZone(zone);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== XZone ==&lt;br /&gt;
The encompassing live zone record appears shaped like:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
// PROVEN: PS3 DB_LoadXAssets and its callers use these five numeric bits as&lt;br /&gt;
// zone allocation/free categories. CORRELATED: Xbox IW4 symbols provide the&lt;br /&gt;
// DB_ZONE_* member names for those bits.&lt;br /&gt;
enum XZoneFlags : int&lt;br /&gt;
{&lt;br /&gt;
    None = 0,&lt;br /&gt;
    DB_ZONE_COMMON = 0x01,&lt;br /&gt;
    DB_ZONE_UI = 0x02,&lt;br /&gt;
    DB_ZONE_GAME = 0x04,&lt;br /&gt;
    DB_ZONE_LOAD = 0x08,&lt;br /&gt;
    DB_ZONE_DEV = 0x10&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
typedef struct XZone&lt;br /&gt;
{&lt;br /&gt;
    uint32_t zoneId;          // 0x00&lt;br /&gt;
    uint32_t unknown04;       // 0x04&lt;br /&gt;
    char     name[64];        // 0x08&lt;br /&gt;
    uint32_t unknown48;       // 0x48&lt;br /&gt;
    XZoneFlags zoneFlags;     // 0x4C&lt;br /&gt;
    uint32_t unknown50;       // 0x50&lt;br /&gt;
    XZoneMemory memory;       // 0x54&lt;br /&gt;
} XZone;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== XZoneInfo ===&lt;br /&gt;
PS3 function 0x0011B968, corresponding to DB_LoadXAssets, independently proves the field behavior:&lt;br /&gt;
* It iterates XZoneInfo using a 0x0C stride.&lt;br /&gt;
* +0x08 is intersected with each loaded XZone flag word at +0x4C.&lt;br /&gt;
* Every zone where (freeFlags &amp;amp; zoneFlags) != 0 is selected for unloading.&lt;br /&gt;
* +0x04 is copied into the internal queued request at +0x40 and becomes the loaded zone’s category/lifetime flags.&lt;br /&gt;
* Freeing happens before new named records from the same batch are queued.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Value&lt;br /&gt;
! Meaning&lt;br /&gt;
! PS3 usage&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x01&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;COMMON&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;code_post_gfx_mp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;patch_mp&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;common_mp&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x02&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;UI&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;ui_mp&amp;lt;/code&amp;gt;, DLC UI zones&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x04&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;GAME&amp;lt;/code&amp;gt;&lt;br /&gt;
| Main map/game zone path&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LOAD&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;lt;map&amp;amp;gt;_load&amp;lt;/code&amp;gt; path&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;DEV&amp;lt;/code&amp;gt;&lt;br /&gt;
| Appears in free masks, but no standalone PS3 allocation observed yet&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Common combined masks include:&lt;br /&gt;
* 0x06 = UI | GAME&lt;br /&gt;
* 0x18 = LOAD | DEV&lt;br /&gt;
* 0x1E = every category except COMMON&lt;br /&gt;
The Xbox builds also contain the assertion !(freeFlags &amp;amp; DB_ZONE_COMMON). That prohibition is Xbox-proven and strongly PS3-correlated.&lt;br /&gt;
patch_mp and common_mp have 0x01, while ui_mp has 0x02.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct XZoneInfo&lt;br /&gt;
{&lt;br /&gt;
    char* Name,&lt;br /&gt;
    XZoneFlags AllocFlags,&lt;br /&gt;
    XZoneFlags FreeFlags&lt;br /&gt;
} XZoneInfo; // 0x0C&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== XZoneMemory ==&lt;br /&gt;
XZoneMemory is the memory-block allocation for one loaded zone/fastfile. It is only one component of the engine’s broader database loading state.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
typedef enum XFileBlockType&lt;br /&gt;
{&lt;br /&gt;
    XFILE_BLOCK_TEMP     = 0,&lt;br /&gt;
    XFILE_BLOCK_PHYSICAL = 1,&lt;br /&gt;
    XFILE_BLOCK_RUNTIME  = 2,&lt;br /&gt;
    XFILE_BLOCK_VIRTUAL  = 3,&lt;br /&gt;
    XFILE_BLOCK_LARGE    = 4,&lt;br /&gt;
    XFILE_BLOCK_CALLBACK = 5,&lt;br /&gt;
    XFILE_BLOCK_VERTEX   = 6,&lt;br /&gt;
&lt;br /&gt;
    XFILE_BLOCK_COUNT    = 7&lt;br /&gt;
} XFileBlockType;&lt;br /&gt;
&lt;br /&gt;
typedef struct XZoneMemoryBlock&lt;br /&gt;
{&lt;br /&gt;
    void* address;  // Live address; null when size is zero&lt;br /&gt;
    uint32_t size;     // Declared allocation size&lt;br /&gt;
} XZoneMemoryBlock;&lt;br /&gt;
&lt;br /&gt;
typedef struct XZoneMemory&lt;br /&gt;
{&lt;br /&gt;
    XZoneMemoryBlock blocks[XFILE_BLOCK_COUNT];&lt;br /&gt;
} XZoneMemory;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== XAssetEntry ==&lt;br /&gt;
The engines load context keeps a record of semantic asset names to it&#039;s place in memory. The engine more or less does this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct XAssetEntry&lt;br /&gt;
{&lt;br /&gt;
    uint32_t assetType;          // 0x00: XAssetType&lt;br /&gt;
    uint32_t headerPointer;      // 0x04: canonical asset-header pointer&lt;br /&gt;
&lt;br /&gt;
    uint8_t  zoneIndex;          // 0x08: owning zone-record index&lt;br /&gt;
    uint8_t  flags09;            // 0x09: bit 0 is tested by registry logic&lt;br /&gt;
    uint8_t  state0A;            // 0x0A: initialized to zero; meaning OPEN&lt;br /&gt;
    uint8_t  pad0B;              // 0x0B: no semantics proven&lt;br /&gt;
&lt;br /&gt;
    uint16_t nextHashIndex;      // 0x0C: next entry in the name-hash chain&lt;br /&gt;
    uint16_t nextOverrideIndex;  // 0x0E: override/replacement chain&lt;br /&gt;
} XAssetEntry;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:LoadContext&amp;diff=1090</id>
		<title>Category:LoadContext</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:LoadContext&amp;diff=1090"/>
		<updated>2026-07-11T00:47:05Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Load Context =&lt;br /&gt;
&lt;br /&gt;
The relationship is:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
Global DB state&lt;br /&gt;
├── Zone registry&lt;br /&gt;
│   ├── patch_mp       -&amp;gt; its own XZoneMemory&lt;br /&gt;
│   ├── common_mp      -&amp;gt; its own XZoneMemory&lt;br /&gt;
│   ├── ui_mp          -&amp;gt; its own XZoneMemory&lt;br /&gt;
│   ├── mp_boneyard_load -&amp;gt; its own XZoneMemory&lt;br /&gt;
│   └── mp_boneyard    -&amp;gt; its own XZoneMemory&lt;br /&gt;
├── Current stream state&lt;br /&gt;
│   └── points at one zone&#039;s XZoneMemory while that zone is loading&lt;br /&gt;
└── Global XAsset registry&lt;br /&gt;
    └── shared by assets from every loaded zone&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* XZoneMemory is per zone.&lt;br /&gt;
* Dependencies do not combine their blocks into one XZoneMemory.&lt;br /&gt;
* The global XAsset registry spans all loaded zones.&lt;br /&gt;
* Each XAssetEntry records its owning zoneIndex.&lt;br /&gt;
* Asset overrides and deduplication happen through the shared registry.&lt;br /&gt;
* Unloading a zone frees that zone’s XZoneMemory and removes or reveals its registry entries as appropriate.&lt;br /&gt;
&lt;br /&gt;
Conceptually:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
void DB_LoadZone(XZone *zone, DBFile *file)&lt;br /&gt;
{&lt;br /&gt;
    DB_AllocXZoneMemory(file-&amp;gt;blockSizes, &amp;amp;zone-&amp;gt;memory);&lt;br /&gt;
    DB_InitStreams(&amp;amp;zone-&amp;gt;memory);&lt;br /&gt;
&lt;br /&gt;
    // The global stream state now points into this zone&#039;s seven blocks.&lt;br /&gt;
    DB_LoadXFile(&amp;amp;zone-&amp;gt;memory, file);&lt;br /&gt;
&lt;br /&gt;
    // Loaded assets are registered into the shared global XAsset registry.&lt;br /&gt;
    DB_PostLoadXZone(zone);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== XZone ==&lt;br /&gt;
The encompassing live zone record appears shaped like:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct XZone&lt;br /&gt;
{&lt;br /&gt;
    uint32_t zoneId;          // 0x00&lt;br /&gt;
    uint32_t unknown04;       // 0x04&lt;br /&gt;
    char     name[64];        // 0x08&lt;br /&gt;
    uint32_t unknown48;       // 0x48&lt;br /&gt;
    uint32_t zoneFlags;       // 0x4C&lt;br /&gt;
    uint32_t unknown50;       // 0x50&lt;br /&gt;
    XZoneMemory memory;       // 0x54&lt;br /&gt;
} XZone;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== XZoneMemory ==&lt;br /&gt;
XZoneMemory is the memory-block allocation for one loaded zone/fastfile. It is only one component of the engine’s broader database loading state.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
typedef enum XFileBlockType&lt;br /&gt;
{&lt;br /&gt;
    XFILE_BLOCK_TEMP     = 0,&lt;br /&gt;
    XFILE_BLOCK_PHYSICAL = 1,&lt;br /&gt;
    XFILE_BLOCK_RUNTIME  = 2,&lt;br /&gt;
    XFILE_BLOCK_VIRTUAL  = 3,&lt;br /&gt;
    XFILE_BLOCK_LARGE    = 4,&lt;br /&gt;
    XFILE_BLOCK_CALLBACK = 5,&lt;br /&gt;
    XFILE_BLOCK_VERTEX   = 6,&lt;br /&gt;
&lt;br /&gt;
    XFILE_BLOCK_COUNT    = 7&lt;br /&gt;
} XFileBlockType;&lt;br /&gt;
&lt;br /&gt;
typedef struct XZoneMemoryBlock&lt;br /&gt;
{&lt;br /&gt;
    void* address;  // Live address; null when size is zero&lt;br /&gt;
    uint32_t size;     // Declared allocation size&lt;br /&gt;
} XZoneMemoryBlock;&lt;br /&gt;
&lt;br /&gt;
typedef struct XZoneMemory&lt;br /&gt;
{&lt;br /&gt;
    XZoneMemoryBlock blocks[XFILE_BLOCK_COUNT];&lt;br /&gt;
} XZoneMemory;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== XAssetEntry ==&lt;br /&gt;
The engines load context keeps a record of semantic asset names to it&#039;s place in memory. The engine more or less does this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct XAssetEntry&lt;br /&gt;
{&lt;br /&gt;
    uint32_t assetType;          // 0x00: XAssetType&lt;br /&gt;
    uint32_t headerPointer;      // 0x04: canonical asset-header pointer&lt;br /&gt;
&lt;br /&gt;
    uint8_t  zoneIndex;          // 0x08: owning zone-record index&lt;br /&gt;
    uint8_t  flags09;            // 0x09: bit 0 is tested by registry logic&lt;br /&gt;
    uint8_t  state0A;            // 0x0A: initialized to zero; meaning OPEN&lt;br /&gt;
    uint8_t  pad0B;              // 0x0B: no semantics proven&lt;br /&gt;
&lt;br /&gt;
    uint16_t nextHashIndex;      // 0x0C: next entry in the name-hash chain&lt;br /&gt;
    uint16_t nextOverrideIndex;  // 0x0E: override/replacement chain&lt;br /&gt;
} XAssetEntry;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Zone_(MW2)&amp;diff=1089</id>
		<title>Zone (MW2)</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Zone_(MW2)&amp;diff=1089"/>
		<updated>2026-07-11T00:40:15Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: Created page with &amp;quot;placeholder...  &amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt; enum {  XFILE_BLOCK_TEMP	= 0,  XFILE_BLOCK_PHYSICAL	= 1,  XFILE_BLOCK_RUNTIME	= 2,  XFILE_BLOCK_VIRTUAL	= 3,  XFILE_BLOCK_LARGE	= 4,  XFILE_BLOCK_CALLBACK	= 5, #if defined(PC) || defined(PS3)  XFILE_BLOCK_VERTEX	= 6,  #ifdef PC  XFILE_BLOCK_INDEX	= 7,  #endif #endif  MAX_XFILE_COUNT };   struct XFile {   int size;   int externalSize;   int blockSize[MAX_XFILE_COUNT]; }; &amp;lt;/syntaxhighlight&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;placeholder...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
enum&lt;br /&gt;
{&lt;br /&gt;
 XFILE_BLOCK_TEMP	= 0,&lt;br /&gt;
 XFILE_BLOCK_PHYSICAL	= 1,&lt;br /&gt;
 XFILE_BLOCK_RUNTIME	= 2,&lt;br /&gt;
 XFILE_BLOCK_VIRTUAL	= 3,&lt;br /&gt;
 XFILE_BLOCK_LARGE	= 4,&lt;br /&gt;
 XFILE_BLOCK_CALLBACK	= 5,&lt;br /&gt;
#if defined(PC) || defined(PS3)&lt;br /&gt;
 XFILE_BLOCK_VERTEX	= 6,&lt;br /&gt;
 #ifdef PC&lt;br /&gt;
 XFILE_BLOCK_INDEX	= 7,&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
 MAX_XFILE_COUNT&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
struct XFile&lt;br /&gt;
{&lt;br /&gt;
  int size;&lt;br /&gt;
  int externalSize;&lt;br /&gt;
  int blockSize[MAX_XFILE_COUNT];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Main_Page&amp;diff=1088</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Main_Page&amp;diff=1088"/>
		<updated>2026-07-11T00:38:11Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Research */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Welcome to the Call of Duty Engine research wiki. The goal of this site is to organize information on any Call of Duty file system, structure system, functions, etc. Hopefully this table will help you browse our site effectively.&lt;br /&gt;
&lt;br /&gt;
Never edited a wiki before? Check out the [//meta.wikimedia.org/wiki/Help:Contents User&#039;s Guide] and then come back. ;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;NOTE: Editing has been disabled by normal and anonymous users&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For those who&#039;d like to make an edit but do not have permissions to do so, you may contact me by direct messaging me on discord: redeyex32&lt;br /&gt;
&lt;br /&gt;
==Research==&lt;br /&gt;
* [[:Category:Utilities|Basic Utilities]]&lt;br /&gt;
* [[:Category:LoadContext|Load Context]]&lt;br /&gt;
* [[:Category:FastFiles|FastFiles and Zones]]&lt;br /&gt;
* [[:Category:PAK Files|PAK Files]]&lt;br /&gt;
* [[:Category:Assets|Assets]]&lt;br /&gt;
* [[:Category:Save Data|Save Data]]&lt;br /&gt;
* [[:Category:Game Structures|Game Structures]]&lt;br /&gt;
&lt;br /&gt;
==FastFiles and Zone files==&lt;br /&gt;
* [[FastFiles_and_Zone_files_(MW2)|Modern Warefare 2]]&lt;br /&gt;
* [[FastFiles_and_Zone_files_(BO1)|Black Ops 1]]&lt;br /&gt;
* [[FastFiles_and_Zone_files_(BO2)|Black Ops 2]]&lt;br /&gt;
* [[FastFiles_and_Zone_files_(Ghosts)|Ghosts]]&lt;br /&gt;
* [[FastFiles_and_Zone_files_(AW)|Advanced Warefare]]&lt;br /&gt;
&lt;br /&gt;
==Infinity Ward Games==&lt;br /&gt;
* [[:Category:CoD4|Modern Warfare]]&lt;br /&gt;
* [[:Category:MW2|Modern Warfare 2]]&lt;br /&gt;
* [[:Category:MW3|Modern Warfare 3]]&lt;br /&gt;
* [[:Category:Ghosts|Ghosts]]&lt;br /&gt;
&lt;br /&gt;
==Treyarch Games==&lt;br /&gt;
* [[:Category:WaW|World at War]]&lt;br /&gt;
* [[:Category:BO1|Black Ops]]&lt;br /&gt;
* [[:Category:BO2|Black Ops 2]]&lt;br /&gt;
* [[:Category:BO3|Black Ops 3]]&lt;br /&gt;
&lt;br /&gt;
==Sledgehammer Games==&lt;br /&gt;
* [[:Category:AW|Advanced Warfare]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Editing Basics ==&lt;br /&gt;
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]&lt;br /&gt;
* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:LoadContext&amp;diff=1087</id>
		<title>Category:LoadContext</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:LoadContext&amp;diff=1087"/>
		<updated>2026-07-11T00:34:58Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: Created page with &amp;quot;placeholder...  == XAssetEntry == The engines load context keeps a record of semantic asset names to it&amp;#039;s place in memory. The engine more or less does this: &amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt; typedef struct XAssetEntry {     uint32_t assetType;          // 0x00: XAssetType     uint32_t headerPointer;      // 0x04: canonical asset-header pointer      uint8_t  zoneIndex;          // 0x08: owning zone-record index     uint8_t  flags09;            // 0x09: bit 0 is tested by regist...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;placeholder...&lt;br /&gt;
&lt;br /&gt;
== XAssetEntry ==&lt;br /&gt;
The engines load context keeps a record of semantic asset names to it&#039;s place in memory. The engine more or less does this:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct XAssetEntry&lt;br /&gt;
{&lt;br /&gt;
    uint32_t assetType;          // 0x00: XAssetType&lt;br /&gt;
    uint32_t headerPointer;      // 0x04: canonical asset-header pointer&lt;br /&gt;
&lt;br /&gt;
    uint8_t  zoneIndex;          // 0x08: owning zone-record index&lt;br /&gt;
    uint8_t  flags09;            // 0x09: bit 0 is tested by registry logic&lt;br /&gt;
    uint8_t  state0A;            // 0x0A: initialized to zero; meaning OPEN&lt;br /&gt;
    uint8_t  pad0B;              // 0x0B: no semantics proven&lt;br /&gt;
&lt;br /&gt;
    uint16_t nextHashIndex;      // 0x0C: next entry in the name-hash chain&lt;br /&gt;
    uint16_t nextOverrideIndex;  // 0x0E: override/replacement chain&lt;br /&gt;
} XAssetEntry;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Graphics_Map_Asset_(MW2)&amp;diff=1086</id>
		<title>Graphics Map Asset (MW2)</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Graphics_Map_Asset_(MW2)&amp;diff=1086"/>
		<updated>2026-07-05T22:25:52Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Notes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Category:Assets]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
The graphics map (or gfx_map) has existed on every Call of Duty so far and is part of the D3DBSP system produced by Radiant. Where the [[:Collision Map Asset (MW2)|collision map]] is used for collision data in the map, the graphics map holds visual systems such as lights and particularly the dPVS system. The Dynamic Potentially Visible Sets (dPVS) were developed by Umbra Software to compute visibility databases in real time, and power the Call of Duty engine to this day.&lt;br /&gt;
&lt;br /&gt;
=== Rendering ===&lt;br /&gt;
[[MW2_Rendering|Rendering]]&lt;br /&gt;
&lt;br /&gt;
=== Structures ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#pragma pack(push, 4)&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxImage GfxImage;&lt;br /&gt;
typedef struct Material Material;&lt;br /&gt;
typedef struct XModel XModel;&lt;br /&gt;
&lt;br /&gt;
typedef struct DpvsPlane&lt;br /&gt;
{&lt;br /&gt;
    float normal[3];&lt;br /&gt;
    float dist;&lt;br /&gt;
    uint8_t type;&lt;br /&gt;
    uint8_t signbits;&lt;br /&gt;
    uint16_t pad12;&lt;br /&gt;
} DpvsPlane; // 0x14&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxWorldDpvsPlanes&lt;br /&gt;
{&lt;br /&gt;
    int32_t cellCount;&lt;br /&gt;
    DpvsPlane *planes;&lt;br /&gt;
    uint16_t *nodes;&lt;br /&gt;
    uint32_t *sceneEntCellBits;&lt;br /&gt;
} GfxWorldDpvsPlanes; // 0x10&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxSky&lt;br /&gt;
{&lt;br /&gt;
    int32_t skySurfCount;&lt;br /&gt;
    int32_t *skyStartSurfs;&lt;br /&gt;
    GfxImage *skyImage;&lt;br /&gt;
    int32_t skySamplerState;&lt;br /&gt;
} GfxSky; // 0x10&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxCellTreeCount&lt;br /&gt;
{&lt;br /&gt;
    uint32_t aabbTreeCount;&lt;br /&gt;
} GfxCellTreeCount; // 0x04&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxAabbTree&lt;br /&gt;
{&lt;br /&gt;
    float mins[3];&lt;br /&gt;
    float maxs[3];&lt;br /&gt;
    uint16_t childCount;&lt;br /&gt;
    uint16_t surfaceCount;&lt;br /&gt;
    uint16_t startSurfIndex;&lt;br /&gt;
    uint16_t smodelIndexCount;&lt;br /&gt;
    uint16_t *smodelIndexes;&lt;br /&gt;
    int32_t childrenOffset;&lt;br /&gt;
} GfxAabbTree; // 0x28&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxCellTree&lt;br /&gt;
{&lt;br /&gt;
    GfxAabbTree *aabbTrees;&lt;br /&gt;
} GfxCellTree; // 0x04&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxPortalVertex&lt;br /&gt;
{&lt;br /&gt;
    float xyz[3];&lt;br /&gt;
} GfxPortalVertex; // 0x0C&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxPortal&lt;br /&gt;
{&lt;br /&gt;
    uint8_t isQueued;&lt;br /&gt;
    uint8_t isAncestor;&lt;br /&gt;
    uint8_t recursionDepth;&lt;br /&gt;
    uint8_t hullPointCount;&lt;br /&gt;
    int32_t hullPointsRuntimePointer;&lt;br /&gt;
    DpvsPlane plane;&lt;br /&gt;
    GfxPortalVertex *vertices;&lt;br /&gt;
    uint8_t unknown20To21[2];&lt;br /&gt;
    uint8_t vertexCount;&lt;br /&gt;
    uint8_t pad23;&lt;br /&gt;
    float hullAxis[2][3];&lt;br /&gt;
} GfxPortal; // 0x3C&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxCell&lt;br /&gt;
{&lt;br /&gt;
    float mins[3];&lt;br /&gt;
    float maxs[3];&lt;br /&gt;
    int32_t portalCount;&lt;br /&gt;
    GfxPortal *portals;&lt;br /&gt;
    uint8_t reflectionProbeCount;&lt;br /&gt;
    uint8_t pad21[3];&lt;br /&gt;
    uint8_t *reflectionProbes;&lt;br /&gt;
} GfxCell; // 0x28&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxReflectionProbe&lt;br /&gt;
{&lt;br /&gt;
    float offset[3];&lt;br /&gt;
} GfxReflectionProbe; // 0x0C&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxTexture&lt;br /&gt;
{&lt;br /&gt;
    uint32_t words[6];&lt;br /&gt;
} GfxTexture; // 0x18&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxLightmapArray&lt;br /&gt;
{&lt;br /&gt;
    GfxImage *primary;&lt;br /&gt;
    GfxImage *secondary;&lt;br /&gt;
} GfxLightmapArray; // 0x08&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxWorldVertexData&lt;br /&gt;
{&lt;br /&gt;
    uint8_t *vertices;&lt;br /&gt;
    int32_t worldVbHandle;&lt;br /&gt;
    int32_t worldVbOffset;&lt;br /&gt;
} GfxWorldVertexData; // 0x0C&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxWorldVertexLayerData&lt;br /&gt;
{&lt;br /&gt;
    uint8_t *data;&lt;br /&gt;
    int32_t layerVbHandle;&lt;br /&gt;
    int32_t layerVbOffset;&lt;br /&gt;
} GfxWorldVertexLayerData; // 0x0C&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxWorldDraw&lt;br /&gt;
{&lt;br /&gt;
    uint32_t reflectionProbeCount;&lt;br /&gt;
    GfxImage **reflectionImages;&lt;br /&gt;
    GfxReflectionProbe *reflectionProbes;&lt;br /&gt;
    GfxTexture *reflectionProbeTextures;&lt;br /&gt;
    int32_t lightmapCount;&lt;br /&gt;
    GfxLightmapArray *lightmaps;&lt;br /&gt;
    GfxTexture *lightmapPrimaryTextures;&lt;br /&gt;
    GfxTexture *lightmapSecondaryTextures;&lt;br /&gt;
    GfxImage *skyImage;&lt;br /&gt;
    GfxImage *outdoorImage;&lt;br /&gt;
    uint32_t vertexCount;&lt;br /&gt;
    GfxWorldVertexData vd;&lt;br /&gt;
    uint32_t vertexLayerDataSize;&lt;br /&gt;
    GfxWorldVertexLayerData vld;&lt;br /&gt;
    int32_t indexCount;&lt;br /&gt;
    uint16_t *indices;&lt;br /&gt;
    int32_t indexBufferRaw;&lt;br /&gt;
} GfxWorldDraw; // 0x54&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxLightGridEntry&lt;br /&gt;
{&lt;br /&gt;
    uint16_t colorsIndex;&lt;br /&gt;
    uint8_t primaryLightIndex;&lt;br /&gt;
    uint8_t needsTrace;&lt;br /&gt;
} GfxLightGridEntry; // 0x04&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxLightGridColors&lt;br /&gt;
{&lt;br /&gt;
    uint8_t rgb[56][3];&lt;br /&gt;
} GfxLightGridColors; // 0xA8&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxLightGrid&lt;br /&gt;
{&lt;br /&gt;
    uint32_t hasLightRegions;&lt;br /&gt;
    uint32_t sunPrimaryLightIndex;&lt;br /&gt;
    uint16_t mins[3];&lt;br /&gt;
    uint16_t maxs[3];&lt;br /&gt;
    uint32_t rowAxis;&lt;br /&gt;
    uint32_t colAxis;&lt;br /&gt;
    uint16_t *rowDataStart;&lt;br /&gt;
    uint32_t rawRowDataSize;&lt;br /&gt;
    uint8_t *rawRowData;&lt;br /&gt;
    uint32_t entryCount;&lt;br /&gt;
    GfxLightGridEntry *entries;&lt;br /&gt;
    uint32_t colorCount;&lt;br /&gt;
    GfxLightGridColors *colors;&lt;br /&gt;
} GfxLightGrid; // 0x38&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxBrushModel&lt;br /&gt;
{&lt;br /&gt;
    float writableMins[3];&lt;br /&gt;
    float writableMaxs[3];&lt;br /&gt;
    float boundsMins[3];&lt;br /&gt;
    float boundsMaxs[3];&lt;br /&gt;
    uint32_t surfaceCount;&lt;br /&gt;
    uint32_t startSurfIndex;&lt;br /&gt;
} GfxBrushModel; // 0x38&lt;br /&gt;
&lt;br /&gt;
typedef struct MaterialMemory&lt;br /&gt;
{&lt;br /&gt;
    Material *material;&lt;br /&gt;
    int32_t memory;&lt;br /&gt;
} MaterialMemory; // 0x08&lt;br /&gt;
&lt;br /&gt;
typedef struct Sunflare&lt;br /&gt;
{&lt;br /&gt;
    uint32_t hasValidData;&lt;br /&gt;
    Material *spriteMaterial;&lt;br /&gt;
    Material *flareMaterial;&lt;br /&gt;
    float spriteSize;&lt;br /&gt;
    float flareMinSize;&lt;br /&gt;
    float flareMinDot;&lt;br /&gt;
    float flareMaxSize;&lt;br /&gt;
    float flareMaxDot;&lt;br /&gt;
    float flareMaxAlpha;&lt;br /&gt;
    int32_t flareFadeInTime;&lt;br /&gt;
    int32_t flareFadeOutTime;&lt;br /&gt;
    float blindMinDot;&lt;br /&gt;
    float blindMaxDot;&lt;br /&gt;
    float blindMaxDarken;&lt;br /&gt;
    int32_t blindFadeInTime;&lt;br /&gt;
    int32_t blindFadeOutTime;&lt;br /&gt;
    float glareMinDot;&lt;br /&gt;
    float glareMaxDot;&lt;br /&gt;
    float glareMaxLighten;&lt;br /&gt;
    int32_t glareFadeInTime;&lt;br /&gt;
    int32_t glareFadeOutTime;&lt;br /&gt;
    float sunFxPosition[3];&lt;br /&gt;
} Sunflare; // 0x60&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxSceneDynModel&lt;br /&gt;
{&lt;br /&gt;
    uint16_t lod;&lt;br /&gt;
    uint16_t surfId;&lt;br /&gt;
    uint16_t dynEntId;&lt;br /&gt;
} GfxSceneDynModel; // 0x06&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxSceneDynBrush&lt;br /&gt;
{&lt;br /&gt;
    uint16_t surfId;&lt;br /&gt;
    uint16_t dynEntId;&lt;br /&gt;
} GfxSceneDynBrush; // 0x04&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxShadowGeometry&lt;br /&gt;
{&lt;br /&gt;
    uint16_t surfaceCount;&lt;br /&gt;
    uint16_t smodelCount;&lt;br /&gt;
    uint16_t *sortedSurfIndex;&lt;br /&gt;
    uint16_t *smodelIndex;&lt;br /&gt;
} GfxShadowGeometry; // 0x0C&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxLightRegionAxis&lt;br /&gt;
{&lt;br /&gt;
    float dir[3];&lt;br /&gt;
    float midPoint;&lt;br /&gt;
    float halfSize;&lt;br /&gt;
} GfxLightRegionAxis; // 0x14&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxLightRegionHull&lt;br /&gt;
{&lt;br /&gt;
    float kdopMidPoint[9];&lt;br /&gt;
    float kdopHalfSize[9];&lt;br /&gt;
    uint32_t axisCount;&lt;br /&gt;
    GfxLightRegionAxis *axis;&lt;br /&gt;
} GfxLightRegionHull; // 0x50&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxLightRegion&lt;br /&gt;
{&lt;br /&gt;
    int32_t hullCount;&lt;br /&gt;
    GfxLightRegionHull *hulls;&lt;br /&gt;
} GfxLightRegion; // 0x08&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxPackedPlacement&lt;br /&gt;
{&lt;br /&gt;
    float origin[3];&lt;br /&gt;
    uint32_t packedAxis[3];&lt;br /&gt;
    float scale;&lt;br /&gt;
} GfxPackedPlacement; // 0x1C&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxStaticModelInst&lt;br /&gt;
{&lt;br /&gt;
    float mins[3];&lt;br /&gt;
    float maxs[3];&lt;br /&gt;
    uint32_t groundLighting;&lt;br /&gt;
    uint8_t unknown1CTo23[8];&lt;br /&gt;
} GfxStaticModelInst; // 0x24&lt;br /&gt;
&lt;br /&gt;
typedef struct SrfTriangles&lt;br /&gt;
{&lt;br /&gt;
    int32_t vertexLayerData;&lt;br /&gt;
    int32_t baseVertex;&lt;br /&gt;
    uint32_t minVertexIndex;&lt;br /&gt;
    uint16_t vertexCount;&lt;br /&gt;
    uint16_t triCount;&lt;br /&gt;
    int32_t baseIndex;&lt;br /&gt;
} SrfTriangles; // 0x14&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxSurface&lt;br /&gt;
{&lt;br /&gt;
    SrfTriangles tris;&lt;br /&gt;
    Material *material;&lt;br /&gt;
    uint8_t lightmapIndex;&lt;br /&gt;
    uint8_t reflectionProbeIndex;&lt;br /&gt;
    uint8_t primaryLightIndex;&lt;br /&gt;
    uint8_t castsSunShadow;&lt;br /&gt;
} GfxSurface; // 0x1C&lt;br /&gt;
&lt;br /&gt;
typedef union GfxMapDrawSurf&lt;br /&gt;
{&lt;br /&gt;
    uint64_t packed;&lt;br /&gt;
} GfxMapDrawSurf; // 0x08&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxCullGroup&lt;br /&gt;
{&lt;br /&gt;
    float mins[3];&lt;br /&gt;
    float maxs[3];&lt;br /&gt;
    int32_t surfaceCount;&lt;br /&gt;
    int32_t startSurfIndex;&lt;br /&gt;
} GfxCullGroup; // 0x20&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxStaticModelDrawInst&lt;br /&gt;
{&lt;br /&gt;
    GfxPackedPlacement placement;&lt;br /&gt;
    XModel *model;&lt;br /&gt;
    uint16_t cullDist;&lt;br /&gt;
    uint16_t lightingHandle;&lt;br /&gt;
    uint8_t reflectionProbeIndex;&lt;br /&gt;
    uint8_t primaryLightIndex;&lt;br /&gt;
    uint8_t flags;&lt;br /&gt;
    uint8_t firstMaterialSkinIndex;&lt;br /&gt;
    uint8_t unknown28;&lt;br /&gt;
    uint8_t unknown29;&lt;br /&gt;
    uint8_t unknown2A;&lt;br /&gt;
    uint8_t unknown2B;&lt;br /&gt;
} GfxStaticModelDrawInst; // 0x2C&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxWorldDpvsStatic&lt;br /&gt;
{&lt;br /&gt;
    uint32_t smodelCount;&lt;br /&gt;
    uint32_t staticSurfaceCount;&lt;br /&gt;
    uint32_t litSurfsBegin;&lt;br /&gt;
    uint32_t litSurfsEnd;&lt;br /&gt;
    uint32_t visibilityCounts[8];&lt;br /&gt;
    uint32_t *smodelVisData[3];&lt;br /&gt;
    uint32_t *surfaceVisData[3];&lt;br /&gt;
    uint16_t *sortedSurfIndex;&lt;br /&gt;
    GfxStaticModelInst *smodelInsts;&lt;br /&gt;
    GfxSurface *surfaces;&lt;br /&gt;
    GfxCullGroup *cullGroups;&lt;br /&gt;
    GfxStaticModelDrawInst *smodelDrawInsts;&lt;br /&gt;
    GfxMapDrawSurf *surfaceMaterials;&lt;br /&gt;
    uint32_t *surfaceCastsSunShadow;&lt;br /&gt;
    volatile uint32_t usageCount;&lt;br /&gt;
} GfxWorldDpvsStatic; // 0x68&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxWorldDpvsDynamic&lt;br /&gt;
{&lt;br /&gt;
    uint32_t dynEntClientWordCount[2];&lt;br /&gt;
    uint32_t dynEntClientCount[2];&lt;br /&gt;
    uint32_t *dynEntCellBits[2];&lt;br /&gt;
    uint8_t *dynEntVisData[6];&lt;br /&gt;
} GfxWorldDpvsDynamic; // 0x30&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxHeroOnlyLight&lt;br /&gt;
{&lt;br /&gt;
    uint8_t bytes[0x38];&lt;br /&gt;
} GfxHeroOnlyLight; // 0x38&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxWorld&lt;br /&gt;
{&lt;br /&gt;
    const char *name;&lt;br /&gt;
    const char *baseName;&lt;br /&gt;
    int32_t planeCount;&lt;br /&gt;
    int32_t nodeCount;&lt;br /&gt;
    int32_t surfaceCount;&lt;br /&gt;
    uint32_t skyCount;&lt;br /&gt;
    GfxSky *skies;&lt;br /&gt;
    int32_t primaryLightFirstShadowable;&lt;br /&gt;
    int32_t primaryLightCount;&lt;br /&gt;
    int32_t sortKeyLitDecal;&lt;br /&gt;
    int32_t sortKeyEffectDecal;&lt;br /&gt;
    int32_t sortKeyEffectAuto;&lt;br /&gt;
    int32_t sortKeyDistortion;&lt;br /&gt;
    GfxWorldDpvsPlanes dpvsPlanes;&lt;br /&gt;
    GfxCellTreeCount *cellTreeCounts;&lt;br /&gt;
    GfxCellTree *cellTrees;&lt;br /&gt;
    GfxCell *cells;&lt;br /&gt;
    GfxWorldDraw worldDraw;&lt;br /&gt;
    GfxLightGrid lightGrid;&lt;br /&gt;
    int32_t modelCount;&lt;br /&gt;
    GfxBrushModel *models;&lt;br /&gt;
    float mins[3];&lt;br /&gt;
    float maxs[3];&lt;br /&gt;
    uint32_t checksum;&lt;br /&gt;
    int32_t materialMemoryCount;&lt;br /&gt;
    MaterialMemory *materialMemory;&lt;br /&gt;
    Sunflare sun;&lt;br /&gt;
    float outdoorLookupMatrix[16];&lt;br /&gt;
    GfxImage *outdoorImage;&lt;br /&gt;
    uint32_t *cellCasterBits;&lt;br /&gt;
    uint32_t *cellCasterBits2;&lt;br /&gt;
    GfxSceneDynModel *sceneDynModel;&lt;br /&gt;
    GfxSceneDynBrush *sceneDynBrush;&lt;br /&gt;
    uint32_t *primaryLightEntityShadowVis;&lt;br /&gt;
    uint32_t *primaryLightDynEntShadowVis[2];&lt;br /&gt;
    uint8_t *primaryLightForModelDynEnt;&lt;br /&gt;
    GfxShadowGeometry *shadowGeom;&lt;br /&gt;
    GfxLightRegion *lightRegion;&lt;br /&gt;
    GfxWorldDpvsStatic dpvs;&lt;br /&gt;
    GfxWorldDpvsDynamic dpvsDyn;&lt;br /&gt;
    uint32_t unknown26C;&lt;br /&gt;
    uint32_t heroOnlyLightCount;&lt;br /&gt;
    GfxHeroOnlyLight *heroOnlyLights;&lt;br /&gt;
    uint32_t unknown278;&lt;br /&gt;
    int32_t umbraGateCount;&lt;br /&gt;
    uint8_t *umbraGateData;&lt;br /&gt;
    uint8_t *umbraGateData2;&lt;br /&gt;
} GfxWorld; // 0x288 on PS3/32-bit&lt;br /&gt;
&lt;br /&gt;
#pragma pack(pop)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
// sceneEntCellBits count = cellCount &amp;lt;&amp;lt; 9 uint32_t values.&lt;br /&gt;
// rowDataStart count = maxs[rowAxis] - mins[rowAxis] + 1 uint16_t values.&lt;br /&gt;
// vertices payload size = vertexCount * 0x10 bytes.&lt;br /&gt;
// vertexLayerData payload size = vertexLayerDataSize bytes.&lt;br /&gt;
// cellCasterBits count = cellCount * ((cellCount + 31) &amp;gt;&amp;gt; 5) uint32_t values.&lt;br /&gt;
// cellCasterBits2 count = ((cellCount + 31) &amp;gt;&amp;gt; 5) uint32_t values.&lt;br /&gt;
// sceneDynModel count = dpvsDyn.dynEntClientCount[0].&lt;br /&gt;
// sceneDynBrush count = dpvsDyn.dynEntClientCount[1].&lt;br /&gt;
// primaryLightEntityShadowVis count = max(0, primaryLightCount - primaryLightFirstShadowable - 1) * 0x2000 uint32_t values.&lt;br /&gt;
// primaryLightDynEntShadowVis[0] count = same shadowable tail * sceneDynModel count.&lt;br /&gt;
// primaryLightDynEntShadowVis[1] count = same shadowable tail * sceneDynBrush count.&lt;br /&gt;
// primaryLightForModelDynEnt count = sceneDynModel count bytes.&lt;br /&gt;
// dpvs.smodelVisData[i] count = dpvs.visibilityCounts[6] uint32_t values.&lt;br /&gt;
// dpvs.surfaceVisData[i] count = dpvs.visibilityCounts[7] uint32_t values.&lt;br /&gt;
// dpvs.sortedSurfIndex count = dpvs.staticSurfaceCount uint16_t values.&lt;br /&gt;
// dpvs.smodelInsts and dpvs.smodelDrawInsts count = dpvs.smodelCount.&lt;br /&gt;
// dpvs.surfaces, dpvs.cullGroups, and dpvs.surfaceMaterials count = surfaceCount.&lt;br /&gt;
// dpvs.surfaceCastsSunShadow count = dpvs.visibilityCounts[7] uint32_t values.&lt;br /&gt;
// dpvsDyn.dynEntCellBits[i] count = dynEntClientWordCount[i] * dpvsPlanes.cellCount uint32_t values.&lt;br /&gt;
// dpvsDyn.dynEntVisData load order is [0, 3, 1, 4, 2, 5].&lt;br /&gt;
// dpvsDyn.dynEntVisData[0..2] byte size = dynEntClientWordCount[0] &amp;lt;&amp;lt; 5.&lt;br /&gt;
// dpvsDyn.dynEntVisData[3..5] byte size = dynEntClientWordCount[1] &amp;lt;&amp;lt; 5.&lt;br /&gt;
// heroOnlyLights count = heroOnlyLightCount, stride 0x38.&lt;br /&gt;
// umbraGateData and umbraGateData2 byte size = umbraGateCount + 0x1000.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keep in mind that the checksum is checked on other clients using the mapcrc dvar.&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Graphics_Map_Asset_(MW2)&amp;diff=1085</id>
		<title>Graphics Map Asset (MW2)</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Graphics_Map_Asset_(MW2)&amp;diff=1085"/>
		<updated>2026-07-05T22:25:06Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Structures */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Category:Assets]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
The graphics map (or gfx_map) has existed on every Call of Duty so far and is part of the D3DBSP system produced by Radiant. Where the [[:Collision Map Asset (MW2)|collision map]] is used for collision data in the map, the graphics map holds visual systems such as lights and particularly the dPVS system. The Dynamic Potentially Visible Sets (dPVS) were developed by Umbra Software to compute visibility databases in real time, and power the Call of Duty engine to this day.&lt;br /&gt;
&lt;br /&gt;
=== Rendering ===&lt;br /&gt;
[[MW2_Rendering|Rendering]]&lt;br /&gt;
&lt;br /&gt;
=== Structures ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
#pragma pack(push, 4)&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxImage GfxImage;&lt;br /&gt;
typedef struct Material Material;&lt;br /&gt;
typedef struct XModel XModel;&lt;br /&gt;
&lt;br /&gt;
typedef struct DpvsPlane&lt;br /&gt;
{&lt;br /&gt;
    float normal[3];&lt;br /&gt;
    float dist;&lt;br /&gt;
    uint8_t type;&lt;br /&gt;
    uint8_t signbits;&lt;br /&gt;
    uint16_t pad12;&lt;br /&gt;
} DpvsPlane; // 0x14&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxWorldDpvsPlanes&lt;br /&gt;
{&lt;br /&gt;
    int32_t cellCount;&lt;br /&gt;
    DpvsPlane *planes;&lt;br /&gt;
    uint16_t *nodes;&lt;br /&gt;
    uint32_t *sceneEntCellBits;&lt;br /&gt;
} GfxWorldDpvsPlanes; // 0x10&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxSky&lt;br /&gt;
{&lt;br /&gt;
    int32_t skySurfCount;&lt;br /&gt;
    int32_t *skyStartSurfs;&lt;br /&gt;
    GfxImage *skyImage;&lt;br /&gt;
    int32_t skySamplerState;&lt;br /&gt;
} GfxSky; // 0x10&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxCellTreeCount&lt;br /&gt;
{&lt;br /&gt;
    uint32_t aabbTreeCount;&lt;br /&gt;
} GfxCellTreeCount; // 0x04&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxAabbTree&lt;br /&gt;
{&lt;br /&gt;
    float mins[3];&lt;br /&gt;
    float maxs[3];&lt;br /&gt;
    uint16_t childCount;&lt;br /&gt;
    uint16_t surfaceCount;&lt;br /&gt;
    uint16_t startSurfIndex;&lt;br /&gt;
    uint16_t smodelIndexCount;&lt;br /&gt;
    uint16_t *smodelIndexes;&lt;br /&gt;
    int32_t childrenOffset;&lt;br /&gt;
} GfxAabbTree; // 0x28&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxCellTree&lt;br /&gt;
{&lt;br /&gt;
    GfxAabbTree *aabbTrees;&lt;br /&gt;
} GfxCellTree; // 0x04&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxPortalVertex&lt;br /&gt;
{&lt;br /&gt;
    float xyz[3];&lt;br /&gt;
} GfxPortalVertex; // 0x0C&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxPortal&lt;br /&gt;
{&lt;br /&gt;
    uint8_t isQueued;&lt;br /&gt;
    uint8_t isAncestor;&lt;br /&gt;
    uint8_t recursionDepth;&lt;br /&gt;
    uint8_t hullPointCount;&lt;br /&gt;
    int32_t hullPointsRuntimePointer;&lt;br /&gt;
    DpvsPlane plane;&lt;br /&gt;
    GfxPortalVertex *vertices;&lt;br /&gt;
    uint8_t unknown20To21[2];&lt;br /&gt;
    uint8_t vertexCount;&lt;br /&gt;
    uint8_t pad23;&lt;br /&gt;
    float hullAxis[2][3];&lt;br /&gt;
} GfxPortal; // 0x3C&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxCell&lt;br /&gt;
{&lt;br /&gt;
    float mins[3];&lt;br /&gt;
    float maxs[3];&lt;br /&gt;
    int32_t portalCount;&lt;br /&gt;
    GfxPortal *portals;&lt;br /&gt;
    uint8_t reflectionProbeCount;&lt;br /&gt;
    uint8_t pad21[3];&lt;br /&gt;
    uint8_t *reflectionProbes;&lt;br /&gt;
} GfxCell; // 0x28&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxReflectionProbe&lt;br /&gt;
{&lt;br /&gt;
    float offset[3];&lt;br /&gt;
} GfxReflectionProbe; // 0x0C&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxTexture&lt;br /&gt;
{&lt;br /&gt;
    uint32_t words[6];&lt;br /&gt;
} GfxTexture; // 0x18&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxLightmapArray&lt;br /&gt;
{&lt;br /&gt;
    GfxImage *primary;&lt;br /&gt;
    GfxImage *secondary;&lt;br /&gt;
} GfxLightmapArray; // 0x08&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxWorldVertexData&lt;br /&gt;
{&lt;br /&gt;
    uint8_t *vertices;&lt;br /&gt;
    int32_t worldVbHandle;&lt;br /&gt;
    int32_t worldVbOffset;&lt;br /&gt;
} GfxWorldVertexData; // 0x0C&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxWorldVertexLayerData&lt;br /&gt;
{&lt;br /&gt;
    uint8_t *data;&lt;br /&gt;
    int32_t layerVbHandle;&lt;br /&gt;
    int32_t layerVbOffset;&lt;br /&gt;
} GfxWorldVertexLayerData; // 0x0C&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxWorldDraw&lt;br /&gt;
{&lt;br /&gt;
    uint32_t reflectionProbeCount;&lt;br /&gt;
    GfxImage **reflectionImages;&lt;br /&gt;
    GfxReflectionProbe *reflectionProbes;&lt;br /&gt;
    GfxTexture *reflectionProbeTextures;&lt;br /&gt;
    int32_t lightmapCount;&lt;br /&gt;
    GfxLightmapArray *lightmaps;&lt;br /&gt;
    GfxTexture *lightmapPrimaryTextures;&lt;br /&gt;
    GfxTexture *lightmapSecondaryTextures;&lt;br /&gt;
    GfxImage *skyImage;&lt;br /&gt;
    GfxImage *outdoorImage;&lt;br /&gt;
    uint32_t vertexCount;&lt;br /&gt;
    GfxWorldVertexData vd;&lt;br /&gt;
    uint32_t vertexLayerDataSize;&lt;br /&gt;
    GfxWorldVertexLayerData vld;&lt;br /&gt;
    int32_t indexCount;&lt;br /&gt;
    uint16_t *indices;&lt;br /&gt;
    int32_t indexBufferRaw;&lt;br /&gt;
} GfxWorldDraw; // 0x54&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxLightGridEntry&lt;br /&gt;
{&lt;br /&gt;
    uint16_t colorsIndex;&lt;br /&gt;
    uint8_t primaryLightIndex;&lt;br /&gt;
    uint8_t needsTrace;&lt;br /&gt;
} GfxLightGridEntry; // 0x04&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxLightGridColors&lt;br /&gt;
{&lt;br /&gt;
    uint8_t rgb[56][3];&lt;br /&gt;
} GfxLightGridColors; // 0xA8&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxLightGrid&lt;br /&gt;
{&lt;br /&gt;
    uint32_t hasLightRegions;&lt;br /&gt;
    uint32_t sunPrimaryLightIndex;&lt;br /&gt;
    uint16_t mins[3];&lt;br /&gt;
    uint16_t maxs[3];&lt;br /&gt;
    uint32_t rowAxis;&lt;br /&gt;
    uint32_t colAxis;&lt;br /&gt;
    uint16_t *rowDataStart;&lt;br /&gt;
    uint32_t rawRowDataSize;&lt;br /&gt;
    uint8_t *rawRowData;&lt;br /&gt;
    uint32_t entryCount;&lt;br /&gt;
    GfxLightGridEntry *entries;&lt;br /&gt;
    uint32_t colorCount;&lt;br /&gt;
    GfxLightGridColors *colors;&lt;br /&gt;
} GfxLightGrid; // 0x38&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxBrushModel&lt;br /&gt;
{&lt;br /&gt;
    float writableMins[3];&lt;br /&gt;
    float writableMaxs[3];&lt;br /&gt;
    float boundsMins[3];&lt;br /&gt;
    float boundsMaxs[3];&lt;br /&gt;
    uint32_t surfaceCount;&lt;br /&gt;
    uint32_t startSurfIndex;&lt;br /&gt;
} GfxBrushModel; // 0x38&lt;br /&gt;
&lt;br /&gt;
typedef struct MaterialMemory&lt;br /&gt;
{&lt;br /&gt;
    Material *material;&lt;br /&gt;
    int32_t memory;&lt;br /&gt;
} MaterialMemory; // 0x08&lt;br /&gt;
&lt;br /&gt;
typedef struct Sunflare&lt;br /&gt;
{&lt;br /&gt;
    uint32_t hasValidData;&lt;br /&gt;
    Material *spriteMaterial;&lt;br /&gt;
    Material *flareMaterial;&lt;br /&gt;
    float spriteSize;&lt;br /&gt;
    float flareMinSize;&lt;br /&gt;
    float flareMinDot;&lt;br /&gt;
    float flareMaxSize;&lt;br /&gt;
    float flareMaxDot;&lt;br /&gt;
    float flareMaxAlpha;&lt;br /&gt;
    int32_t flareFadeInTime;&lt;br /&gt;
    int32_t flareFadeOutTime;&lt;br /&gt;
    float blindMinDot;&lt;br /&gt;
    float blindMaxDot;&lt;br /&gt;
    float blindMaxDarken;&lt;br /&gt;
    int32_t blindFadeInTime;&lt;br /&gt;
    int32_t blindFadeOutTime;&lt;br /&gt;
    float glareMinDot;&lt;br /&gt;
    float glareMaxDot;&lt;br /&gt;
    float glareMaxLighten;&lt;br /&gt;
    int32_t glareFadeInTime;&lt;br /&gt;
    int32_t glareFadeOutTime;&lt;br /&gt;
    float sunFxPosition[3];&lt;br /&gt;
} Sunflare; // 0x60&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxSceneDynModel&lt;br /&gt;
{&lt;br /&gt;
    uint16_t lod;&lt;br /&gt;
    uint16_t surfId;&lt;br /&gt;
    uint16_t dynEntId;&lt;br /&gt;
} GfxSceneDynModel; // 0x06&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxSceneDynBrush&lt;br /&gt;
{&lt;br /&gt;
    uint16_t surfId;&lt;br /&gt;
    uint16_t dynEntId;&lt;br /&gt;
} GfxSceneDynBrush; // 0x04&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxShadowGeometry&lt;br /&gt;
{&lt;br /&gt;
    uint16_t surfaceCount;&lt;br /&gt;
    uint16_t smodelCount;&lt;br /&gt;
    uint16_t *sortedSurfIndex;&lt;br /&gt;
    uint16_t *smodelIndex;&lt;br /&gt;
} GfxShadowGeometry; // 0x0C&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxLightRegionAxis&lt;br /&gt;
{&lt;br /&gt;
    float dir[3];&lt;br /&gt;
    float midPoint;&lt;br /&gt;
    float halfSize;&lt;br /&gt;
} GfxLightRegionAxis; // 0x14&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxLightRegionHull&lt;br /&gt;
{&lt;br /&gt;
    float kdopMidPoint[9];&lt;br /&gt;
    float kdopHalfSize[9];&lt;br /&gt;
    uint32_t axisCount;&lt;br /&gt;
    GfxLightRegionAxis *axis;&lt;br /&gt;
} GfxLightRegionHull; // 0x50&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxLightRegion&lt;br /&gt;
{&lt;br /&gt;
    int32_t hullCount;&lt;br /&gt;
    GfxLightRegionHull *hulls;&lt;br /&gt;
} GfxLightRegion; // 0x08&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxPackedPlacement&lt;br /&gt;
{&lt;br /&gt;
    float origin[3];&lt;br /&gt;
    uint32_t packedAxis[3];&lt;br /&gt;
    float scale;&lt;br /&gt;
} GfxPackedPlacement; // 0x1C&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxStaticModelInst&lt;br /&gt;
{&lt;br /&gt;
    float mins[3];&lt;br /&gt;
    float maxs[3];&lt;br /&gt;
    uint32_t groundLighting;&lt;br /&gt;
    uint8_t unknown1CTo23[8];&lt;br /&gt;
} GfxStaticModelInst; // 0x24&lt;br /&gt;
&lt;br /&gt;
typedef struct SrfTriangles&lt;br /&gt;
{&lt;br /&gt;
    int32_t vertexLayerData;&lt;br /&gt;
    int32_t baseVertex;&lt;br /&gt;
    uint32_t minVertexIndex;&lt;br /&gt;
    uint16_t vertexCount;&lt;br /&gt;
    uint16_t triCount;&lt;br /&gt;
    int32_t baseIndex;&lt;br /&gt;
} SrfTriangles; // 0x14&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxSurface&lt;br /&gt;
{&lt;br /&gt;
    SrfTriangles tris;&lt;br /&gt;
    Material *material;&lt;br /&gt;
    uint8_t lightmapIndex;&lt;br /&gt;
    uint8_t reflectionProbeIndex;&lt;br /&gt;
    uint8_t primaryLightIndex;&lt;br /&gt;
    uint8_t castsSunShadow;&lt;br /&gt;
} GfxSurface; // 0x1C&lt;br /&gt;
&lt;br /&gt;
typedef union GfxMapDrawSurf&lt;br /&gt;
{&lt;br /&gt;
    uint64_t packed;&lt;br /&gt;
} GfxMapDrawSurf; // 0x08&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxCullGroup&lt;br /&gt;
{&lt;br /&gt;
    float mins[3];&lt;br /&gt;
    float maxs[3];&lt;br /&gt;
    int32_t surfaceCount;&lt;br /&gt;
    int32_t startSurfIndex;&lt;br /&gt;
} GfxCullGroup; // 0x20&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxStaticModelDrawInst&lt;br /&gt;
{&lt;br /&gt;
    GfxPackedPlacement placement;&lt;br /&gt;
    XModel *model;&lt;br /&gt;
    uint16_t cullDist;&lt;br /&gt;
    uint16_t lightingHandle;&lt;br /&gt;
    uint8_t reflectionProbeIndex;&lt;br /&gt;
    uint8_t primaryLightIndex;&lt;br /&gt;
    uint8_t flags;&lt;br /&gt;
    uint8_t firstMaterialSkinIndex;&lt;br /&gt;
    uint8_t unknown28;&lt;br /&gt;
    uint8_t unknown29;&lt;br /&gt;
    uint8_t unknown2A;&lt;br /&gt;
    uint8_t unknown2B;&lt;br /&gt;
} GfxStaticModelDrawInst; // 0x2C&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxWorldDpvsStatic&lt;br /&gt;
{&lt;br /&gt;
    uint32_t smodelCount;&lt;br /&gt;
    uint32_t staticSurfaceCount;&lt;br /&gt;
    uint32_t litSurfsBegin;&lt;br /&gt;
    uint32_t litSurfsEnd;&lt;br /&gt;
    uint32_t visibilityCounts[8];&lt;br /&gt;
    uint32_t *smodelVisData[3];&lt;br /&gt;
    uint32_t *surfaceVisData[3];&lt;br /&gt;
    uint16_t *sortedSurfIndex;&lt;br /&gt;
    GfxStaticModelInst *smodelInsts;&lt;br /&gt;
    GfxSurface *surfaces;&lt;br /&gt;
    GfxCullGroup *cullGroups;&lt;br /&gt;
    GfxStaticModelDrawInst *smodelDrawInsts;&lt;br /&gt;
    GfxMapDrawSurf *surfaceMaterials;&lt;br /&gt;
    uint32_t *surfaceCastsSunShadow;&lt;br /&gt;
    volatile uint32_t usageCount;&lt;br /&gt;
} GfxWorldDpvsStatic; // 0x68&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxWorldDpvsDynamic&lt;br /&gt;
{&lt;br /&gt;
    uint32_t dynEntClientWordCount[2];&lt;br /&gt;
    uint32_t dynEntClientCount[2];&lt;br /&gt;
    uint32_t *dynEntCellBits[2];&lt;br /&gt;
    uint8_t *dynEntVisData[6];&lt;br /&gt;
} GfxWorldDpvsDynamic; // 0x30&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxHeroOnlyLight&lt;br /&gt;
{&lt;br /&gt;
    uint8_t bytes[0x38];&lt;br /&gt;
} GfxHeroOnlyLight; // 0x38&lt;br /&gt;
&lt;br /&gt;
typedef struct GfxWorld&lt;br /&gt;
{&lt;br /&gt;
    const char *name;&lt;br /&gt;
    const char *baseName;&lt;br /&gt;
    int32_t planeCount;&lt;br /&gt;
    int32_t nodeCount;&lt;br /&gt;
    int32_t surfaceCount;&lt;br /&gt;
    uint32_t skyCount;&lt;br /&gt;
    GfxSky *skies;&lt;br /&gt;
    int32_t primaryLightFirstShadowable;&lt;br /&gt;
    int32_t primaryLightCount;&lt;br /&gt;
    int32_t sortKeyLitDecal;&lt;br /&gt;
    int32_t sortKeyEffectDecal;&lt;br /&gt;
    int32_t sortKeyEffectAuto;&lt;br /&gt;
    int32_t sortKeyDistortion;&lt;br /&gt;
    GfxWorldDpvsPlanes dpvsPlanes;&lt;br /&gt;
    GfxCellTreeCount *cellTreeCounts;&lt;br /&gt;
    GfxCellTree *cellTrees;&lt;br /&gt;
    GfxCell *cells;&lt;br /&gt;
    GfxWorldDraw worldDraw;&lt;br /&gt;
    GfxLightGrid lightGrid;&lt;br /&gt;
    int32_t modelCount;&lt;br /&gt;
    GfxBrushModel *models;&lt;br /&gt;
    float mins[3];&lt;br /&gt;
    float maxs[3];&lt;br /&gt;
    uint32_t checksum;&lt;br /&gt;
    int32_t materialMemoryCount;&lt;br /&gt;
    MaterialMemory *materialMemory;&lt;br /&gt;
    Sunflare sun;&lt;br /&gt;
    float outdoorLookupMatrix[16];&lt;br /&gt;
    GfxImage *outdoorImage;&lt;br /&gt;
    uint32_t *cellCasterBits;&lt;br /&gt;
    uint32_t *cellCasterBits2;&lt;br /&gt;
    GfxSceneDynModel *sceneDynModel;&lt;br /&gt;
    GfxSceneDynBrush *sceneDynBrush;&lt;br /&gt;
    uint32_t *primaryLightEntityShadowVis;&lt;br /&gt;
    uint32_t *primaryLightDynEntShadowVis[2];&lt;br /&gt;
    uint8_t *primaryLightForModelDynEnt;&lt;br /&gt;
    GfxShadowGeometry *shadowGeom;&lt;br /&gt;
    GfxLightRegion *lightRegion;&lt;br /&gt;
    GfxWorldDpvsStatic dpvs;&lt;br /&gt;
    GfxWorldDpvsDynamic dpvsDyn;&lt;br /&gt;
    uint32_t unknown26C;&lt;br /&gt;
    uint32_t heroOnlyLightCount;&lt;br /&gt;
    GfxHeroOnlyLight *heroOnlyLights;&lt;br /&gt;
    uint32_t unknown278;&lt;br /&gt;
    int32_t umbraGateCount;&lt;br /&gt;
    uint8_t *umbraGateData;&lt;br /&gt;
    uint8_t *umbraGateData2;&lt;br /&gt;
} GfxWorld; // 0x288 on PS3/32-bit&lt;br /&gt;
&lt;br /&gt;
#pragma pack(pop)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Notes ====&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
// PS3 serialized pointers are 32-bit pointer cells.&lt;br /&gt;
// sceneEntCellBits count = cellCount &amp;lt;&amp;lt; 9 uint32_t values.&lt;br /&gt;
// rowDataStart count = maxs[rowAxis] - mins[rowAxis] + 1 uint16_t values.&lt;br /&gt;
// vertices payload size = vertexCount * 0x10 bytes.&lt;br /&gt;
// vertexLayerData payload size = vertexLayerDataSize bytes.&lt;br /&gt;
// cellCasterBits count = cellCount * ((cellCount + 31) &amp;gt;&amp;gt; 5) uint32_t values.&lt;br /&gt;
// cellCasterBits2 count = ((cellCount + 31) &amp;gt;&amp;gt; 5) uint32_t values.&lt;br /&gt;
// sceneDynModel count = dpvsDyn.dynEntClientCount[0].&lt;br /&gt;
// sceneDynBrush count = dpvsDyn.dynEntClientCount[1].&lt;br /&gt;
// primaryLightEntityShadowVis count = max(0, primaryLightCount - primaryLightFirstShadowable - 1) * 0x2000 uint32_t values.&lt;br /&gt;
// primaryLightDynEntShadowVis[0] count = same shadowable tail * sceneDynModel count.&lt;br /&gt;
// primaryLightDynEntShadowVis[1] count = same shadowable tail * sceneDynBrush count.&lt;br /&gt;
// primaryLightForModelDynEnt count = sceneDynModel count bytes.&lt;br /&gt;
// dpvs.smodelVisData[i] count = dpvs.visibilityCounts[6] uint32_t values.&lt;br /&gt;
// dpvs.surfaceVisData[i] count = dpvs.visibilityCounts[7] uint32_t values.&lt;br /&gt;
// dpvs.sortedSurfIndex count = dpvs.staticSurfaceCount uint16_t values.&lt;br /&gt;
// dpvs.smodelInsts and dpvs.smodelDrawInsts count = dpvs.smodelCount.&lt;br /&gt;
// dpvs.surfaces, dpvs.cullGroups, and dpvs.surfaceMaterials count = surfaceCount.&lt;br /&gt;
// dpvs.surfaceCastsSunShadow count = dpvs.visibilityCounts[7] uint32_t values.&lt;br /&gt;
// dpvsDyn.dynEntCellBits[i] count = dynEntClientWordCount[i] * dpvsPlanes.cellCount uint32_t values.&lt;br /&gt;
// dpvsDyn.dynEntVisData load order is [0, 3, 1, 4, 2, 5].&lt;br /&gt;
// dpvsDyn.dynEntVisData[0..2] byte size = dynEntClientWordCount[0] &amp;lt;&amp;lt; 5.&lt;br /&gt;
// dpvsDyn.dynEntVisData[3..5] byte size = dynEntClientWordCount[1] &amp;lt;&amp;lt; 5.&lt;br /&gt;
// heroOnlyLights count = heroOnlyLightCount, stride 0x38.&lt;br /&gt;
// umbraGateData and umbraGateData2 byte size = umbraGateCount + 0x1000.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keep in mind that the checksum is checked on other clients using the mapcrc dvar.&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(Ghosts)&amp;diff=1084</id>
		<title>FastFiles and Zone files (Ghosts)</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(Ghosts)&amp;diff=1084"/>
		<updated>2026-07-05T21:32:14Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: Created page with &amp;quot;Category:FastFiles Category:Ghosts  == Main FastFile Structure == &amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;    //Entry point for the FF.  struct DB_Header  {    char magic[8];    int version;    // tbd...  }; &amp;lt;/syntaxhighlight&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FastFiles]]&lt;br /&gt;
[[Category:Ghosts]]&lt;br /&gt;
&lt;br /&gt;
== Main FastFile Structure ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 //Entry point for the FF.&lt;br /&gt;
 struct DB_Header&lt;br /&gt;
 {&lt;br /&gt;
   char magic[8];&lt;br /&gt;
   int version;&lt;br /&gt;
   // tbd...&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Main_Page&amp;diff=1083</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Main_Page&amp;diff=1083"/>
		<updated>2026-07-05T21:30:58Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* FastFiles and Zone files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Welcome to the Call of Duty Engine research wiki. The goal of this site is to organize information on any Call of Duty file system, structure system, functions, etc. Hopefully this table will help you browse our site effectively.&lt;br /&gt;
&lt;br /&gt;
Never edited a wiki before? Check out the [//meta.wikimedia.org/wiki/Help:Contents User&#039;s Guide] and then come back. ;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;NOTE: Editing has been disabled by normal and anonymous users&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For those who&#039;d like to make an edit but do not have permissions to do so, you may contact me by direct messaging me on discord: redeyex32&lt;br /&gt;
&lt;br /&gt;
==Research==&lt;br /&gt;
* [[:Category:Utilities|Basic Utilities]]&lt;br /&gt;
* [[:Category:FastFiles|FastFiles and Zones]]&lt;br /&gt;
* [[:Category:PAK Files|PAK Files]]&lt;br /&gt;
* [[:Category:Assets|Assets]]&lt;br /&gt;
* [[:Category:Save Data|Save Data]]&lt;br /&gt;
* [[:Category:Game Structures|Game Structures]]&lt;br /&gt;
&lt;br /&gt;
==FastFiles and Zone files==&lt;br /&gt;
* [[FastFiles_and_Zone_files_(MW2)|Modern Warefare 2]]&lt;br /&gt;
* [[FastFiles_and_Zone_files_(BO1)|Black Ops 1]]&lt;br /&gt;
* [[FastFiles_and_Zone_files_(BO2)|Black Ops 2]]&lt;br /&gt;
* [[FastFiles_and_Zone_files_(Ghosts)|Ghosts]]&lt;br /&gt;
* [[FastFiles_and_Zone_files_(AW)|Advanced Warefare]]&lt;br /&gt;
&lt;br /&gt;
==Infinity Ward Games==&lt;br /&gt;
* [[:Category:CoD4|Modern Warfare]]&lt;br /&gt;
* [[:Category:MW2|Modern Warfare 2]]&lt;br /&gt;
* [[:Category:MW3|Modern Warfare 3]]&lt;br /&gt;
* [[:Category:Ghosts|Ghosts]]&lt;br /&gt;
&lt;br /&gt;
==Treyarch Games==&lt;br /&gt;
* [[:Category:WaW|World at War]]&lt;br /&gt;
* [[:Category:BO1|Black Ops]]&lt;br /&gt;
* [[:Category:BO2|Black Ops 2]]&lt;br /&gt;
* [[:Category:BO3|Black Ops 3]]&lt;br /&gt;
&lt;br /&gt;
==Sledgehammer Games==&lt;br /&gt;
* [[:Category:AW|Advanced Warfare]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Editing Basics ==&lt;br /&gt;
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]&lt;br /&gt;
* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Main_Page&amp;diff=1082</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Main_Page&amp;diff=1082"/>
		<updated>2026-07-05T21:29:00Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Welcome to the Call of Duty Engine research wiki. The goal of this site is to organize information on any Call of Duty file system, structure system, functions, etc. Hopefully this table will help you browse our site effectively.&lt;br /&gt;
&lt;br /&gt;
Never edited a wiki before? Check out the [//meta.wikimedia.org/wiki/Help:Contents User&#039;s Guide] and then come back. ;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;NOTE: Editing has been disabled by normal and anonymous users&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For those who&#039;d like to make an edit but do not have permissions to do so, you may contact me by direct messaging me on discord: redeyex32&lt;br /&gt;
&lt;br /&gt;
==Research==&lt;br /&gt;
* [[:Category:Utilities|Basic Utilities]]&lt;br /&gt;
* [[:Category:FastFiles|FastFiles and Zones]]&lt;br /&gt;
* [[:Category:PAK Files|PAK Files]]&lt;br /&gt;
* [[:Category:Assets|Assets]]&lt;br /&gt;
* [[:Category:Save Data|Save Data]]&lt;br /&gt;
* [[:Category:Game Structures|Game Structures]]&lt;br /&gt;
&lt;br /&gt;
==FastFiles and Zone files==&lt;br /&gt;
* [[FastFiles_and_Zone_files_(MW2)|Modern Warefare 2]]&lt;br /&gt;
* [[FastFiles_and_Zone_files_(BO1)|Black Ops 1]]&lt;br /&gt;
* [[FastFiles_and_Zone_files_(BO2)|Black Ops 2]]&lt;br /&gt;
* [[FastFiles_and_Zone_files_(AW)|Advanced Warefare]]&lt;br /&gt;
&lt;br /&gt;
==Infinity Ward Games==&lt;br /&gt;
* [[:Category:CoD4|Modern Warfare]]&lt;br /&gt;
* [[:Category:MW2|Modern Warfare 2]]&lt;br /&gt;
* [[:Category:MW3|Modern Warfare 3]]&lt;br /&gt;
* [[:Category:Ghosts|Ghosts]]&lt;br /&gt;
&lt;br /&gt;
==Treyarch Games==&lt;br /&gt;
* [[:Category:WaW|World at War]]&lt;br /&gt;
* [[:Category:BO1|Black Ops]]&lt;br /&gt;
* [[:Category:BO2|Black Ops 2]]&lt;br /&gt;
* [[:Category:BO3|Black Ops 3]]&lt;br /&gt;
&lt;br /&gt;
==Sledgehammer Games==&lt;br /&gt;
* [[:Category:AW|Advanced Warfare]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Editing Basics ==&lt;br /&gt;
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]&lt;br /&gt;
* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Main_Page&amp;diff=1081</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Main_Page&amp;diff=1081"/>
		<updated>2026-07-05T21:27:50Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
Welcome to the Call of Duty Engine research wiki. The goal of this site is to organize information on any Call of Duty file system, structure system, functions, etc. Hopefully this table will help you browse our site effectively.&lt;br /&gt;
&lt;br /&gt;
Never edited a wiki before? Check out the [//meta.wikimedia.org/wiki/Help:Contents User&#039;s Guide] and then come back. ;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;big&amp;gt;&#039;&#039;&#039;NOTE: Editing has been disabled by normal and anonymous users until admins are finished.&#039;&#039;&#039;&amp;lt;/big&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For those who&#039;d like to make an edit but do not have permissions to do so, you may contact me by direct messaging me on discord: redeyex32&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Research==&lt;br /&gt;
* [[:Category:Utilities|Basic Utilities]]&lt;br /&gt;
* [[:Category:FastFiles|FastFiles and Zones]]&lt;br /&gt;
* [[:Category:PAK Files|PAK Files]]&lt;br /&gt;
* [[:Category:Assets|Assets]]&lt;br /&gt;
* [[:Category:Save Data|Save Data]]&lt;br /&gt;
* [[:Category:Game Structures|Game Structures]]&lt;br /&gt;
&lt;br /&gt;
==FastFiles==&lt;br /&gt;
* [[FastFiles_and_Zone_files_(MW2)|Modern Warefare 2]]&lt;br /&gt;
* [[FastFiles_and_Zone_files_(BO1)|Black Ops 1]]&lt;br /&gt;
* [[FastFiles_and_Zone_files_(BO2)|Black Ops 2]]&lt;br /&gt;
* [[FastFiles_and_Zone_files_(AW)|Advanced Warefare]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Infinity Ward Games==&lt;br /&gt;
* [[:Category:CoD4|Modern Warfare]]&lt;br /&gt;
* [[:Category:MW2|Modern Warfare 2]]&lt;br /&gt;
* [[:Category:MW3|Modern Warfare 3]]&lt;br /&gt;
* [[:Category:Ghosts|Ghosts]]&lt;br /&gt;
&lt;br /&gt;
==Treyarch Games==&lt;br /&gt;
* [[:Category:WaW|World at War]]&lt;br /&gt;
* [[:Category:BO1|Black Ops]]&lt;br /&gt;
* [[:Category:BO2|Black Ops 2]]&lt;br /&gt;
* [[:Category:BO3|Black Ops 3]]&lt;br /&gt;
&lt;br /&gt;
==Sledgehammer Games==&lt;br /&gt;
* [[:Category:AW|Advanced Warfare]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
== Editing Basics ==&lt;br /&gt;
* [//www.mediawiki.org/wiki/Manual:Configuration_settings Configuration settings list]&lt;br /&gt;
* [//www.mediawiki.org/wiki/Manual:FAQ MediaWiki FAQ]&lt;br /&gt;
* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]&lt;br /&gt;
* [//www.mediawiki.org/wiki/Localisation#Translation_resources Localise MediaWiki for your language]&lt;br /&gt;
--&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=MW2_Rendering&amp;diff=1080</id>
		<title>MW2 Rendering</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=MW2_Rendering&amp;diff=1080"/>
		<updated>2026-07-05T18:42:22Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Render Side Usage */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Rendering =&lt;br /&gt;
This section is to give you information on how to render surfaces, triangles, maps and apply texture blends and material technique sets per platform.&lt;br /&gt;
&lt;br /&gt;
== Playstation 3 ==&lt;br /&gt;
The ps3 uses a different translation due to it&#039;s RSX chip.&lt;br /&gt;
&lt;br /&gt;
==== RSX Method Names ====&lt;br /&gt;
&amp;lt;code&amp;gt;Mapped material-state methods:&amp;lt;/code&amp;gt;&lt;br /&gt;
* NV30_3D_COLOR_MASK&lt;br /&gt;
* NV30_3D_ALPHA_FUNC_ENABLE&lt;br /&gt;
* NV30_3D_ALPHA_FUNC_FUNC&lt;br /&gt;
* NV30_3D_ALPHA_FUNC_REF&lt;br /&gt;
* NV30_3D_CULL_FACE_ENABLE&lt;br /&gt;
* NV30_3D_CULL_FACE&lt;br /&gt;
* NV30_3D_POLYGON_MODE_FRONT&lt;br /&gt;
* NV30_3D_POLYGON_MODE_BACK&lt;br /&gt;
* NV30_3D_BLEND_FUNC_ENABLE&lt;br /&gt;
* NV40_3D_BLEND_EQUATION&lt;br /&gt;
* NV30_3D_BLEND_FUNC_SRC&lt;br /&gt;
* NV30_3D_BLEND_FUNC_DST&lt;br /&gt;
* NV30_3D_DEPTH_WRITE_ENABLE&lt;br /&gt;
* NV30_3D_DEPTH_TEST_ENABLE&lt;br /&gt;
* NV30_3D_DEPTH_FUNC&lt;br /&gt;
* NV30_3D_POLYGON_OFFSET_FILL_ENABLE&lt;br /&gt;
* NV30_3D_POLYGON_OFFSET_FACTOR&lt;br /&gt;
* NV30_3D_POLYGON_OFFSET_UNITS&lt;br /&gt;
* NV30_3D_STENCIL_ENABLE&lt;br /&gt;
* NV30_3D_STENCIL_OP_FAIL/ZFAIL/ZPASS&lt;br /&gt;
* NV30_3D_STENCIL_FUNC_FUNC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Texture/program names:&amp;lt;/code&amp;gt;&lt;br /&gt;
* NV30_3D_TEX_OFFSET&lt;br /&gt;
* NV30_3D_TEX_FORMAT&lt;br /&gt;
* NV30_3D_TEX_NPOT_SIZE&lt;br /&gt;
* NV40_3D_TEX_SIZE1&lt;br /&gt;
* NV30_3D_TEX_SWIZZLE&lt;br /&gt;
* NV30_3D_TEX_ENABLE&lt;br /&gt;
* NV30_3D_TEX_FILTER&lt;br /&gt;
* NV30_3D_TEX_WRAP&lt;br /&gt;
* NV30_3D_FP_ACTIVE_PROGRAM&lt;br /&gt;
&lt;br /&gt;
==== Enum/Payload Names ====&lt;br /&gt;
From the TOC[-0x7174] lookup table:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
Blend equation: FUNC_ADD, FUNC_SUBTRACT, FUNC_REVERSE_SUBTRACT, MIN, MAX&lt;br /&gt;
Blend factors: SRC_COLOR, ONE_MINUS_SRC_COLOR, SRC_ALPHA, ONE_MINUS_SRC_ALPHA, DST_ALPHA, ONE_MINUS_DST_ALPHA, DST_COLOR, ONE_MINUS_DST_COLOR&lt;br /&gt;
Stencil ops: KEEP, REPLACE, INCR, DECR, INVERT, INCR_WRAP, DECR_WRAP&lt;br /&gt;
Compare funcs: NEVER, LESS, EQUAL, LEQUAL, GREATER, NOTEQUAL, GEQUAL, ALWAYS&lt;br /&gt;
Depth funcs seen: ALWAYS, LESS, EQUAL, LEQUAL&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Render Side Usage ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct RsxCommand {&lt;br /&gt;
    unsigned int method;&lt;br /&gt;
    unsigned int value;&lt;br /&gt;
    const char *name; // correlated display/debug name&lt;br /&gt;
} RsxCommand;&lt;br /&gt;
&lt;br /&gt;
static const GfxStateBits *SelectStateBits(&lt;br /&gt;
    const MaterialAsset *material,&lt;br /&gt;
    int techniqueSlot)&lt;br /&gt;
{&lt;br /&gt;
    for (int i = 0; i &amp;lt; 37; i++) {&lt;br /&gt;
        MaterialStateBitsEntry e = material-&amp;gt;stateBitsEntries[i];&lt;br /&gt;
&lt;br /&gt;
        if (e.techniqueSlot == techniqueSlot &amp;amp;&amp;amp;&lt;br /&gt;
            e.stateBitsIndex &amp;lt; material-&amp;gt;stateBitsCount) {&lt;br /&gt;
            return &amp;amp;material-&amp;gt;stateBits[e.stateBitsIndex];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static int DecodeMaterialStateBits(&lt;br /&gt;
    const GfxStateBits *state,&lt;br /&gt;
    RsxCommand *out,&lt;br /&gt;
    int maxOut)&lt;br /&gt;
{&lt;br /&gt;
    int n = 0;&lt;br /&gt;
&lt;br /&gt;
    unsigned int word0 = state-&amp;gt;loadBits[0];&lt;br /&gt;
    unsigned int word1 = state-&amp;gt;loadBits[1];&lt;br /&gt;
&lt;br /&gt;
    // The exact bit extraction still needs to be completed from PS3 traces.&lt;br /&gt;
    // These are examples of the bridge destination methods, not final masks.&lt;br /&gt;
&lt;br /&gt;
    out[n++] = (RsxCommand){&lt;br /&gt;
        .method = 0x0324,&lt;br /&gt;
        .value = /* decoded color mask from word0 */ 0xf,&lt;br /&gt;
        .name = &amp;quot;NV30_3D_COLOR_MASK&amp;quot;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    out[n++] = (RsxCommand){&lt;br /&gt;
        .method = 0x0A74,&lt;br /&gt;
        .value = /* decoded depth-test enable from word1 */ 1,&lt;br /&gt;
        .name = &amp;quot;NV30_3D_DEPTH_TEST_ENABLE&amp;quot;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    out[n++] = (RsxCommand){&lt;br /&gt;
        .method = 0x0A6C,&lt;br /&gt;
        .value = /* lookup decoded depth func */ 0x0201,&lt;br /&gt;
        .name = &amp;quot;NV30_3D_DEPTH_FUNC&amp;quot;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    out[n++] = (RsxCommand){&lt;br /&gt;
        .method = 0x0310,&lt;br /&gt;
        .value = /* decoded blend enable from word0 */ 0,&lt;br /&gt;
        .name = &amp;quot;NV30_3D_BLEND_FUNC_ENABLE&amp;quot;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    return n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DrawGfxWorld(XAsset *asset)&lt;br /&gt;
{&lt;br /&gt;
    if (!asset || asset-&amp;gt;kind != ASSET_GFX_WORLD)&lt;br /&gt;
        return;&lt;br /&gt;
&lt;br /&gt;
    GfxWorldAsset *world = (GfxWorldAsset *)asset;&lt;br /&gt;
&lt;br /&gt;
    for (unsigned int i = 0; i &amp;lt; world-&amp;gt;surfaceCount; i++) {&lt;br /&gt;
        GfxSurface *surface = &amp;amp;world-&amp;gt;surfaces[i];&lt;br /&gt;
        MaterialAsset *material = surface-&amp;gt;material;&lt;br /&gt;
&lt;br /&gt;
        if (!material)&lt;br /&gt;
            continue;&lt;br /&gt;
&lt;br /&gt;
        int techniqueSlot = 0; // selected by draw path/pass&lt;br /&gt;
        const GfxStateBits *state = SelectStateBits(material, techniqueSlot);&lt;br /&gt;
&lt;br /&gt;
        if (state) {&lt;br /&gt;
            RsxCommand cmds[64];&lt;br /&gt;
            int count = DecodeMaterialStateBits(state, cmds, 64);&lt;br /&gt;
&lt;br /&gt;
            for (int c = 0; c &amp;lt; count; c++) {&lt;br /&gt;
                // In the real renderer this becomes OpenGL state,&lt;br /&gt;
                // but the RSX command/value remains the source of truth.&lt;br /&gt;
                ApplyOrRecordRsxCommand(cmds[c].method, cmds[c].value, cmds[c].name);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        DrawSurfaceGeometry(surface, material);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The key relationship is:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
    GfxWorldAsset&lt;br /&gt;
      -&amp;gt; GfxSurface&lt;br /&gt;
          -&amp;gt; MaterialAsset&lt;br /&gt;
              -&amp;gt; technique slot&lt;br /&gt;
                  -&amp;gt; GfxStateBits row&lt;br /&gt;
                      -&amp;gt; raw loadBits&lt;br /&gt;
                          -&amp;gt; RSX/NV4097 commands&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Xbox 360 ==&lt;br /&gt;
&amp;lt;code&amp;gt;n/a&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=MW2_Rendering&amp;diff=1079</id>
		<title>MW2 Rendering</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=MW2_Rendering&amp;diff=1079"/>
		<updated>2026-07-05T18:40:37Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Playstation 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Rendering =&lt;br /&gt;
This section is to give you information on how to render surfaces, triangles, maps and apply texture blends and material technique sets per platform.&lt;br /&gt;
&lt;br /&gt;
== Playstation 3 ==&lt;br /&gt;
The ps3 uses a different translation due to it&#039;s RSX chip.&lt;br /&gt;
&lt;br /&gt;
==== RSX Method Names ====&lt;br /&gt;
&amp;lt;code&amp;gt;Mapped material-state methods:&amp;lt;/code&amp;gt;&lt;br /&gt;
* NV30_3D_COLOR_MASK&lt;br /&gt;
* NV30_3D_ALPHA_FUNC_ENABLE&lt;br /&gt;
* NV30_3D_ALPHA_FUNC_FUNC&lt;br /&gt;
* NV30_3D_ALPHA_FUNC_REF&lt;br /&gt;
* NV30_3D_CULL_FACE_ENABLE&lt;br /&gt;
* NV30_3D_CULL_FACE&lt;br /&gt;
* NV30_3D_POLYGON_MODE_FRONT&lt;br /&gt;
* NV30_3D_POLYGON_MODE_BACK&lt;br /&gt;
* NV30_3D_BLEND_FUNC_ENABLE&lt;br /&gt;
* NV40_3D_BLEND_EQUATION&lt;br /&gt;
* NV30_3D_BLEND_FUNC_SRC&lt;br /&gt;
* NV30_3D_BLEND_FUNC_DST&lt;br /&gt;
* NV30_3D_DEPTH_WRITE_ENABLE&lt;br /&gt;
* NV30_3D_DEPTH_TEST_ENABLE&lt;br /&gt;
* NV30_3D_DEPTH_FUNC&lt;br /&gt;
* NV30_3D_POLYGON_OFFSET_FILL_ENABLE&lt;br /&gt;
* NV30_3D_POLYGON_OFFSET_FACTOR&lt;br /&gt;
* NV30_3D_POLYGON_OFFSET_UNITS&lt;br /&gt;
* NV30_3D_STENCIL_ENABLE&lt;br /&gt;
* NV30_3D_STENCIL_OP_FAIL/ZFAIL/ZPASS&lt;br /&gt;
* NV30_3D_STENCIL_FUNC_FUNC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Texture/program names:&amp;lt;/code&amp;gt;&lt;br /&gt;
* NV30_3D_TEX_OFFSET&lt;br /&gt;
* NV30_3D_TEX_FORMAT&lt;br /&gt;
* NV30_3D_TEX_NPOT_SIZE&lt;br /&gt;
* NV40_3D_TEX_SIZE1&lt;br /&gt;
* NV30_3D_TEX_SWIZZLE&lt;br /&gt;
* NV30_3D_TEX_ENABLE&lt;br /&gt;
* NV30_3D_TEX_FILTER&lt;br /&gt;
* NV30_3D_TEX_WRAP&lt;br /&gt;
* NV30_3D_FP_ACTIVE_PROGRAM&lt;br /&gt;
&lt;br /&gt;
==== Enum/Payload Names ====&lt;br /&gt;
From the TOC[-0x7174] lookup table:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
Blend equation: FUNC_ADD, FUNC_SUBTRACT, FUNC_REVERSE_SUBTRACT, MIN, MAX&lt;br /&gt;
Blend factors: SRC_COLOR, ONE_MINUS_SRC_COLOR, SRC_ALPHA, ONE_MINUS_SRC_ALPHA, DST_ALPHA, ONE_MINUS_DST_ALPHA, DST_COLOR, ONE_MINUS_DST_COLOR&lt;br /&gt;
Stencil ops: KEEP, REPLACE, INCR, DECR, INVERT, INCR_WRAP, DECR_WRAP&lt;br /&gt;
Compare funcs: NEVER, LESS, EQUAL, LEQUAL, GREATER, NOTEQUAL, GEQUAL, ALWAYS&lt;br /&gt;
Depth funcs seen: ALWAYS, LESS, EQUAL, LEQUAL&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Render Side Usage ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
typedef struct RsxCommand {&lt;br /&gt;
    unsigned int method;&lt;br /&gt;
    unsigned int value;&lt;br /&gt;
    const char *name; // correlated display/debug name&lt;br /&gt;
} RsxCommand;&lt;br /&gt;
&lt;br /&gt;
static const GfxStateBits *SelectStateBits(&lt;br /&gt;
    const MaterialAsset *material,&lt;br /&gt;
    int techniqueSlot)&lt;br /&gt;
{&lt;br /&gt;
    for (int i = 0; i &amp;lt; 37; i++) {&lt;br /&gt;
        MaterialStateBitsEntry e = material-&amp;gt;stateBitsEntries[i];&lt;br /&gt;
&lt;br /&gt;
        if (e.techniqueSlot == techniqueSlot &amp;amp;&amp;amp;&lt;br /&gt;
            e.stateBitsIndex &amp;lt; material-&amp;gt;stateBitsCount) {&lt;br /&gt;
            return &amp;amp;material-&amp;gt;stateBits[e.stateBitsIndex];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
static int DecodeMaterialStateBits(&lt;br /&gt;
    const GfxStateBits *state,&lt;br /&gt;
    RsxCommand *out,&lt;br /&gt;
    int maxOut)&lt;br /&gt;
{&lt;br /&gt;
    int n = 0;&lt;br /&gt;
&lt;br /&gt;
    unsigned int word0 = state-&amp;gt;loadBits[0];&lt;br /&gt;
    unsigned int word1 = state-&amp;gt;loadBits[1];&lt;br /&gt;
&lt;br /&gt;
    // The exact bit extraction still needs to be completed from PS3 traces.&lt;br /&gt;
    // These are examples of the bridge destination methods, not final masks.&lt;br /&gt;
&lt;br /&gt;
    out[n++] = (RsxCommand){&lt;br /&gt;
        .method = 0x0324,&lt;br /&gt;
        .value = /* decoded color mask from word0 */ 0xf,&lt;br /&gt;
        .name = &amp;quot;NV30_3D_COLOR_MASK&amp;quot;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    out[n++] = (RsxCommand){&lt;br /&gt;
        .method = 0x0A74,&lt;br /&gt;
        .value = /* decoded depth-test enable from word1 */ 1,&lt;br /&gt;
        .name = &amp;quot;NV30_3D_DEPTH_TEST_ENABLE&amp;quot;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    out[n++] = (RsxCommand){&lt;br /&gt;
        .method = 0x0A6C,&lt;br /&gt;
        .value = /* lookup decoded depth func */ 0x0201,&lt;br /&gt;
        .name = &amp;quot;NV30_3D_DEPTH_FUNC&amp;quot;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    out[n++] = (RsxCommand){&lt;br /&gt;
        .method = 0x0310,&lt;br /&gt;
        .value = /* decoded blend enable from word0 */ 0,&lt;br /&gt;
        .name = &amp;quot;NV30_3D_BLEND_FUNC_ENABLE&amp;quot;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    return n;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void DrawGfxWorld(BaseAsset *asset)&lt;br /&gt;
{&lt;br /&gt;
    if (!asset || asset-&amp;gt;kind != ASSET_GFX_WORLD)&lt;br /&gt;
        return;&lt;br /&gt;
&lt;br /&gt;
    GfxWorldAsset *world = (GfxWorldAsset *)asset;&lt;br /&gt;
&lt;br /&gt;
    for (unsigned int i = 0; i &amp;lt; world-&amp;gt;surfaceCount; i++) {&lt;br /&gt;
        GfxSurface *surface = &amp;amp;world-&amp;gt;surfaces[i];&lt;br /&gt;
        MaterialAsset *material = surface-&amp;gt;material;&lt;br /&gt;
&lt;br /&gt;
        if (!material)&lt;br /&gt;
            continue;&lt;br /&gt;
&lt;br /&gt;
        int techniqueSlot = 0; // selected by draw path/pass&lt;br /&gt;
        const GfxStateBits *state = SelectStateBits(material, techniqueSlot);&lt;br /&gt;
&lt;br /&gt;
        if (state) {&lt;br /&gt;
            RsxCommand cmds[64];&lt;br /&gt;
            int count = DecodeMaterialStateBits(state, cmds, 64);&lt;br /&gt;
&lt;br /&gt;
            for (int c = 0; c &amp;lt; count; c++) {&lt;br /&gt;
                // In the real renderer this becomes Silk/OpenGL state,&lt;br /&gt;
                // but the RSX command/value remains the source of truth.&lt;br /&gt;
                ApplyOrRecordRsxCommand(cmds[c].method, cmds[c].value, cmds[c].name);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        DrawSurfaceGeometry(surface, material);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The key relationship is:&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
    GfxWorldAsset&lt;br /&gt;
      -&amp;gt; GfxSurface&lt;br /&gt;
          -&amp;gt; MaterialAsset&lt;br /&gt;
              -&amp;gt; technique slot&lt;br /&gt;
                  -&amp;gt; GfxStateBits row&lt;br /&gt;
                      -&amp;gt; raw loadBits&lt;br /&gt;
                          -&amp;gt; RSX/NV4097 commands&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Xbox 360 ==&lt;br /&gt;
&amp;lt;code&amp;gt;n/a&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=MW2_Rendering&amp;diff=1078</id>
		<title>MW2 Rendering</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=MW2_Rendering&amp;diff=1078"/>
		<updated>2026-07-05T18:34:30Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Playstation 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Rendering =&lt;br /&gt;
This section is to give you information on how to render surfaces, triangles, maps and apply texture blends and material technique sets per platform.&lt;br /&gt;
&lt;br /&gt;
== Playstation 3 ==&lt;br /&gt;
The ps3 uses a different translation due to it&#039;s RSX chip.&lt;br /&gt;
&lt;br /&gt;
==== RSX Method Names ====&lt;br /&gt;
&amp;lt;code&amp;gt;Mapped material-state methods:&amp;lt;/code&amp;gt;&lt;br /&gt;
* NV30_3D_COLOR_MASK&lt;br /&gt;
* NV30_3D_ALPHA_FUNC_ENABLE&lt;br /&gt;
* NV30_3D_ALPHA_FUNC_FUNC&lt;br /&gt;
* NV30_3D_ALPHA_FUNC_REF&lt;br /&gt;
* NV30_3D_CULL_FACE_ENABLE&lt;br /&gt;
* NV30_3D_CULL_FACE&lt;br /&gt;
* NV30_3D_POLYGON_MODE_FRONT&lt;br /&gt;
* NV30_3D_POLYGON_MODE_BACK&lt;br /&gt;
* NV30_3D_BLEND_FUNC_ENABLE&lt;br /&gt;
* NV40_3D_BLEND_EQUATION&lt;br /&gt;
* NV30_3D_BLEND_FUNC_SRC&lt;br /&gt;
* NV30_3D_BLEND_FUNC_DST&lt;br /&gt;
* NV30_3D_DEPTH_WRITE_ENABLE&lt;br /&gt;
* NV30_3D_DEPTH_TEST_ENABLE&lt;br /&gt;
* NV30_3D_DEPTH_FUNC&lt;br /&gt;
* NV30_3D_POLYGON_OFFSET_FILL_ENABLE&lt;br /&gt;
* NV30_3D_POLYGON_OFFSET_FACTOR&lt;br /&gt;
* NV30_3D_POLYGON_OFFSET_UNITS&lt;br /&gt;
* NV30_3D_STENCIL_ENABLE&lt;br /&gt;
* NV30_3D_STENCIL_OP_FAIL/ZFAIL/ZPASS&lt;br /&gt;
* NV30_3D_STENCIL_FUNC_FUNC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Texture/program names:&amp;lt;/code&amp;gt;&lt;br /&gt;
* NV30_3D_TEX_OFFSET&lt;br /&gt;
* NV30_3D_TEX_FORMAT&lt;br /&gt;
* NV30_3D_TEX_NPOT_SIZE&lt;br /&gt;
* NV40_3D_TEX_SIZE1&lt;br /&gt;
* NV30_3D_TEX_SWIZZLE&lt;br /&gt;
* NV30_3D_TEX_ENABLE&lt;br /&gt;
* NV30_3D_TEX_FILTER&lt;br /&gt;
* NV30_3D_TEX_WRAP&lt;br /&gt;
* NV30_3D_FP_ACTIVE_PROGRAM&lt;br /&gt;
&lt;br /&gt;
==== Enum/Payload Names ====&lt;br /&gt;
From the TOC[-0x7174] lookup table:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
Blend equation: FUNC_ADD, FUNC_SUBTRACT, FUNC_REVERSE_SUBTRACT, MIN, MAX&lt;br /&gt;
Blend factors: SRC_COLOR, ONE_MINUS_SRC_COLOR, SRC_ALPHA, ONE_MINUS_SRC_ALPHA, DST_ALPHA, ONE_MINUS_DST_ALPHA, DST_COLOR, ONE_MINUS_DST_COLOR&lt;br /&gt;
Stencil ops: KEEP, REPLACE, INCR, DECR, INVERT, INCR_WRAP, DECR_WRAP&lt;br /&gt;
Compare funcs: NEVER, LESS, EQUAL, LEQUAL, GREATER, NOTEQUAL, GEQUAL, ALWAYS&lt;br /&gt;
Depth funcs seen: ALWAYS, LESS, EQUAL, LEQUAL&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Xbox 360 ==&lt;br /&gt;
&amp;lt;code&amp;gt;n/a&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Pixel_Shader_Asset&amp;diff=1077</id>
		<title>Pixel Shader Asset</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Pixel_Shader_Asset&amp;diff=1077"/>
		<updated>2026-07-05T18:27:11Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Structures */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Category:Assets]]&lt;br /&gt;
[[Category:CoD4]]&lt;br /&gt;
[[Category:WaW]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
[[Category:BO1]]&lt;br /&gt;
[[Category:MW3]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
[[Category:Ghosts]]&lt;br /&gt;
== Modern Warfare 3 &amp;amp; Ghosts ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialPixelShaderProgram&lt;br /&gt;
{&lt;br /&gt;
	CgBinaryProgram *ps;	// size = size&lt;br /&gt;
	int size;&lt;br /&gt;
	const char *data;	// size = size2&lt;br /&gt;
	int size2;&lt;br /&gt;
	int unknown[2];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialPixelShader&lt;br /&gt;
{&lt;br /&gt;
	const char *name;&lt;br /&gt;
	MaterialPixelShaderProgram prog;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Call of Duty 4 &amp;amp; World at War &amp;amp; Modern Warfare 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Rendering ===&lt;br /&gt;
[[MW2_Rendering|Rendering]]&lt;br /&gt;
&lt;br /&gt;
=== Structures ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct GfxPixelShaderLoadDef&lt;br /&gt;
{&lt;br /&gt;
    CgBinaryProgram *ps; // serialized Cg/NV fragment program blob&lt;br /&gt;
    int size;            // byte size of ps payload&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialPixelShaderProgram&lt;br /&gt;
{&lt;br /&gt;
    union&lt;br /&gt;
    {&lt;br /&gt;
        // Fastfile/source view, consumed by Load_GfxPixelShaderLoadDef.&lt;br /&gt;
        struct&lt;br /&gt;
        {&lt;br /&gt;
            CgBinaryProgram *ps; // +0x00&lt;br /&gt;
            int size;            // +0x04&lt;br /&gt;
            char runtime[0x0C];  // +0x08, overwritten/filled by runtime build, size 8 ifndef mw2&lt;br /&gt;
        } load;&lt;br /&gt;
&lt;br /&gt;
        // Runtime view after EBOOT.elf:00361f38 builds the PS3 fragment program data.&lt;br /&gt;
        struct&lt;br /&gt;
        {&lt;br /&gt;
            unsigned short *patchTable;      // +0x00&lt;br /&gt;
            int commandListOffset;           // +0x04, offset to copied RSX command dwords&lt;br /&gt;
            int commandDwordCount;           // +0x08&lt;br /&gt;
            unsigned short patchTableWords;  // +0x0C&lt;br /&gt;
            unsigned short uploadByteSize;   // +0x0E&lt;br /&gt;
            void *sharedUpload;              // +0x10, default fragment upload image&lt;br /&gt;
        } runtime;&lt;br /&gt;
    };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialPixelShader&lt;br /&gt;
{&lt;br /&gt;
    const char *name;              // +0x00, XString&lt;br /&gt;
    MaterialPixelShaderProgram prog; // +0x04, total asset size 0x18&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
MaterialPixelShader is 0x18 bytes on PS3. EBOOT.elf:0x00107578 loads the name, then loads prog at +0x04. MaterialPixelShaderProgram itself is 0x14 bytes; EBOOT.elf:0x000fb128 copies those bytes, aliases the first 8 bytes as GfxPixelShaderLoadDef, and calls the pixel program loader.&lt;br /&gt;
&lt;br /&gt;
ps is not the final RSX-bound shader address. It is the serialized Cg/NV fragment-program blob pointer. When inline, the loader consumes size bytes for that blob, then 0x004c7428 -&amp;gt; 0x00361f38 parses/builds runtime data from it.&lt;br /&gt;
&lt;br /&gt;
At draw time the upload image is still patched. Shader arg kinds 5, 6, and 7 provide code/material/literal pixel constants; 00396e48 uses the runtime patch table to write those float4 values into the upload image, then 004a7bd4 copies it to a draw cache and 003abd08 binds it through RSX method 0x408e4.&lt;br /&gt;
&lt;br /&gt;
== Black Ops ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialPixelShaderProgram&lt;br /&gt;
{&lt;br /&gt;
	char *data;	// size = size &amp;lt;&amp;lt; 2&lt;br /&gt;
	char unknown[2];&lt;br /&gt;
	unsigned __int16 size;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialPixelShader&lt;br /&gt;
{&lt;br /&gt;
	const char *name;&lt;br /&gt;
	MaterialPixelShaderProgram prog;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Black Ops 2 ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialPixelShaderProgram&lt;br /&gt;
{&lt;br /&gt;
	char *data1;	// if flag2 &amp;amp; 0x80: size = (size1 &amp;lt;&amp;lt; 4) + 0x10&lt;br /&gt;
			// else: size = 0&lt;br /&gt;
	char *data2;	// if flag2 &amp;amp; 0x80:&lt;br /&gt;
			// 	if flag1 &amp;amp; 0x80: size = size1 + 0x11&lt;br /&gt;
			//	else: size = (size1 &amp;lt;&amp;lt; 2) + 0x14&lt;br /&gt;
			// else: size = 0x10&lt;br /&gt;
	unsigned __int16 size1;&lt;br /&gt;
	char flag1;&lt;br /&gt;
	char flag2;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialPixelShader&lt;br /&gt;
{&lt;br /&gt;
	const char *name;&lt;br /&gt;
	MaterialPixelShaderProgram prog;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Pixel_Shader_Asset&amp;diff=1076</id>
		<title>Pixel Shader Asset</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Pixel_Shader_Asset&amp;diff=1076"/>
		<updated>2026-07-05T13:54:51Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Call of Duty 4 &amp;amp; World at War &amp;amp; Modern Warfare 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Category:Assets]]&lt;br /&gt;
[[Category:CoD4]]&lt;br /&gt;
[[Category:WaW]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
[[Category:BO1]]&lt;br /&gt;
[[Category:MW3]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
[[Category:Ghosts]]&lt;br /&gt;
== Modern Warfare 3 &amp;amp; Ghosts ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialPixelShaderProgram&lt;br /&gt;
{&lt;br /&gt;
	CgBinaryProgram *ps;	// size = size&lt;br /&gt;
	int size;&lt;br /&gt;
	const char *data;	// size = size2&lt;br /&gt;
	int size2;&lt;br /&gt;
	int unknown[2];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialPixelShader&lt;br /&gt;
{&lt;br /&gt;
	const char *name;&lt;br /&gt;
	MaterialPixelShaderProgram prog;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Call of Duty 4 &amp;amp; World at War &amp;amp; Modern Warfare 2 ==&lt;br /&gt;
&lt;br /&gt;
=== Rendering ===&lt;br /&gt;
[[MW2_Rendering|Rendering]]&lt;br /&gt;
&lt;br /&gt;
=== Structures ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialPixelShaderProgram&lt;br /&gt;
{&lt;br /&gt;
	CgBinaryProgram *ps;&lt;br /&gt;
	int size;&lt;br /&gt;
#ifdef MW2&lt;br /&gt;
	char unknown[0xC];&lt;br /&gt;
#else&lt;br /&gt;
	char unknown[8];&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialPixelShader &lt;br /&gt;
{&lt;br /&gt;
	const char *name;&lt;br /&gt;
	MaterialPixelShaderProgram prog;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Black Ops ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialPixelShaderProgram&lt;br /&gt;
{&lt;br /&gt;
	char *data;	// size = size &amp;lt;&amp;lt; 2&lt;br /&gt;
	char unknown[2];&lt;br /&gt;
	unsigned __int16 size;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialPixelShader&lt;br /&gt;
{&lt;br /&gt;
	const char *name;&lt;br /&gt;
	MaterialPixelShaderProgram prog;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
== Black Ops 2 ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialPixelShaderProgram&lt;br /&gt;
{&lt;br /&gt;
	char *data1;	// if flag2 &amp;amp; 0x80: size = (size1 &amp;lt;&amp;lt; 4) + 0x10&lt;br /&gt;
			// else: size = 0&lt;br /&gt;
	char *data2;	// if flag2 &amp;amp; 0x80:&lt;br /&gt;
			// 	if flag1 &amp;amp; 0x80: size = size1 + 0x11&lt;br /&gt;
			//	else: size = (size1 &amp;lt;&amp;lt; 2) + 0x14&lt;br /&gt;
			// else: size = 0x10&lt;br /&gt;
	unsigned __int16 size1;&lt;br /&gt;
	char flag1;&lt;br /&gt;
	char flag2;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialPixelShader&lt;br /&gt;
{&lt;br /&gt;
	const char *name;&lt;br /&gt;
	MaterialPixelShaderProgram prog;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Technique_Set_Asset&amp;diff=1075</id>
		<title>Technique Set Asset</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Technique_Set_Asset&amp;diff=1075"/>
		<updated>2026-07-05T13:52:27Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Category:Assets]]&lt;br /&gt;
[[Category:CoD4]]&lt;br /&gt;
[[Category:WaW]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
[[Category:BO1]]&lt;br /&gt;
[[Category:MW3]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
[[Category:Ghosts]]&lt;br /&gt;
&lt;br /&gt;
=== Rendering ===&lt;br /&gt;
[[MW2_Rendering|Rendering]]&lt;br /&gt;
&lt;br /&gt;
=== Structures ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialArgumentCodeConst &lt;br /&gt;
{&lt;br /&gt;
	unsigned __int16 index;&lt;br /&gt;
	char firstRow;&lt;br /&gt;
	char rowCount;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union MaterialArgumentDef &lt;br /&gt;
{&lt;br /&gt;
	const float *literalConst;&lt;br /&gt;
	MaterialArgumentCodeConst codeConst;&lt;br /&gt;
	unsigned int codeSampler;&lt;br /&gt;
	unsigned int nameHash;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialShaderArgument-&amp;gt;type */&lt;br /&gt;
enum MTL_ARG&lt;br /&gt;
{&lt;br /&gt;
    MATERIAL_VERTEX_CONST = 0x0,&lt;br /&gt;
    LITERAL_VERTEX_CONST = 0x1,&lt;br /&gt;
    MATERIAL_PIXEL_SAMPLER = 0x2,&lt;br /&gt;
    CODE_PRIM_BEGIN = 0x3,&lt;br /&gt;
    CODE_VERTEX_CONST = 0x3,&lt;br /&gt;
    CODE_PIXEL_SAMPLER = 0x4,&lt;br /&gt;
    CODE_PIXEL_CONST = 0x5,&lt;br /&gt;
    MATERIAL_PIXEL_CONST = 0x6,&lt;br /&gt;
    CODE_PRIM_END = 0x6,&lt;br /&gt;
    LITERAL_PIXEL_CONST = 0x7,&lt;br /&gt;
    COUNT = 0x8&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct MaterialShaderArgument&lt;br /&gt;
{&lt;br /&gt;
	unsigned __int16 type;&lt;br /&gt;
	unsigned __int16 dest;&lt;br /&gt;
	MaterialArgumentDef u;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* for pixel constants, Dest is not “a GLSL uniform slot” directly. &lt;br /&gt;
 * The engine uses Dest to look up a patch list in the pixel shader load data, &lt;br /&gt;
 * then writes those float4s into the shader byte stream before upload.&lt;br /&gt;
 * material arg Dest for samplers goes straight to RSX texture unit methods &lt;br /&gt;
 * (0x1a00 + Dest*0x20, etc.), while material/code pixel constants go &lt;br /&gt;
 * through the shader patch table.&lt;br /&gt;
 */&lt;br /&gt;
struct MaterialVertexStreamRouting&lt;br /&gt;
{&lt;br /&gt;
    unsigned char Source;&lt;br /&gt;
    unsigned char Dest;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexDeclaration&lt;br /&gt;
{&lt;br /&gt;
#if defined(COD4) || defined(WAW) || defined(BO1)&lt;br /&gt;
	char unknown[0x22];&lt;br /&gt;
#elif defined(MW2) || defined(MW3)&lt;br /&gt;
    unsigned char StreamCount;&lt;br /&gt;
    unsigned char HasOptionalSource;&lt;br /&gt;
    MaterialVertexStreamRouting Routing[13];&lt;br /&gt;
#elif defined(GHOSTS)&lt;br /&gt;
	char unknown[0x20];&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#pragma pack(push, 4)&lt;br /&gt;
struct MaterialPass &lt;br /&gt;
{&lt;br /&gt;
	MaterialVertexDeclaration *vertexDecl;&lt;br /&gt;
	MaterialVertexShader *vertexShader;&lt;br /&gt;
	MaterialPixelShader *pixelShader;&lt;br /&gt;
	char perPrimArgCount;&lt;br /&gt;
	char perObjArgCount;&lt;br /&gt;
	char stableArgCount;&lt;br /&gt;
	char customSamplerFlags;&lt;br /&gt;
	char precompiledIndex;&lt;br /&gt;
	MaterialShaderArgument *args;&lt;br /&gt;
};&lt;br /&gt;
#pragma pack(pop)&lt;br /&gt;
&lt;br /&gt;
struct MaterialTechnique &lt;br /&gt;
{&lt;br /&gt;
	const char *name;&lt;br /&gt;
	unsigned __int16 flags;&lt;br /&gt;
	unsigned __int16 passCount;&lt;br /&gt;
	MaterialPass passArray[1];	// count = passCount&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialTechniqueSet-&amp;gt;worldVertFormat */&lt;br /&gt;
enum MaterialWorldVertexFormat : char&lt;br /&gt;
{&lt;br /&gt;
  MTL_WORLDVERT_TEX_1_NRM_1 = 0x0,&lt;br /&gt;
  MTL_WORLDVERT_TEX_2_NRM_1 = 0x1,&lt;br /&gt;
  MTL_WORLDVERT_TEX_2_NRM_2 = 0x2,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_1 = 0x3,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_2 = 0x4,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_3 = 0x5,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_1 = 0x6,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_2 = 0x7,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_3 = 0x8,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_1 = 0x9,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_2 = 0xA,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_3 = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#ifdef PS3&lt;br /&gt;
 #ifdef COD4&lt;br /&gt;
  #define MAX_TECHNIQUES 26&lt;br /&gt;
 #elif defined(WAW)&lt;br /&gt;
  #define MAX_TECHNIQUES 51&lt;br /&gt;
 #elif defined(MW2)&lt;br /&gt;
  #define MAX_TECHNIQUES 37&lt;br /&gt;
 #elif defined(BO1)&lt;br /&gt;
  #define MAX_TECHNIQUES 71&lt;br /&gt;
 #elif defined(MW3)&lt;br /&gt;
  #define MAX_TECHNIQUES 41&lt;br /&gt;
 #elif defined(GHOSTS)&lt;br /&gt;
  #define MAX_TECHNIQUES 39&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef XBOX&lt;br /&gt;
 #ifdef COD4&lt;br /&gt;
  #define MAX_TECHNIQUES 26&lt;br /&gt;
 #elif defined(WAW)&lt;br /&gt;
  #define MAX_TECHNIQUES 51&lt;br /&gt;
 #elif defined(MW2)&lt;br /&gt;
  #define MAX_TECHNIQUES 33&lt;br /&gt;
 #elif defined(BO1)&lt;br /&gt;
  #define MAX_TECHNIQUES 71&lt;br /&gt;
 #elif defined(MW3)&lt;br /&gt;
  #define MAX_TECHNIQUES 37&lt;br /&gt;
 #elif defined(GHOSTS)&lt;br /&gt;
  #define MAX_TECHNIQUES 36&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef PC&lt;br /&gt;
 #ifdef COD4&lt;br /&gt;
  #define MAX_TECHNIQUES 34&lt;br /&gt;
 #elif defined(WAW)&lt;br /&gt;
  #define MAX_TECHNIQUES 59&lt;br /&gt;
 #elif defined(MW2)&lt;br /&gt;
  #define MAX_TECHNIQUES 48&lt;br /&gt;
 #elif defined(BO1)&lt;br /&gt;
  #define MAX_TECHNIQUES 130&lt;br /&gt;
 #elif defined(MW3)&lt;br /&gt;
  #define MAX_TECHNIQUES 54&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
struct MaterialTechniqueSet &lt;br /&gt;
{&lt;br /&gt;
	char *name;&lt;br /&gt;
	MaterialWorldVertexFormat worldVertFormat;&lt;br /&gt;
	MaterialTechnique *techniques[MAX_TECHNIQUES];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Black Ops 2 ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialArgumentCodeConst &lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 index;&lt;br /&gt;
  char firstRow;&lt;br /&gt;
  char rowCount;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union MaterialArgumentDef &lt;br /&gt;
{&lt;br /&gt;
  const float *literalConst;&lt;br /&gt;
  MaterialArgumentCodeConst codeConst;&lt;br /&gt;
  unsigned int codeSampler;&lt;br /&gt;
  unsigned int nameHash;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialShaderArgument-&amp;gt;type */&lt;br /&gt;
#define MTL_ARG_MATERIAL_VERTEX_CONST	0x0&lt;br /&gt;
#define MTL_ARG_LITERAL_VERTEX_CONST	0x1&lt;br /&gt;
#define MTL_ARG_MATERIAL_PIXEL_SAMPLER	0x2&lt;br /&gt;
#define  MTL_ARG_CODE_PRIM_BEGIN	0x3&lt;br /&gt;
#define MTL_ARG_CODE_VERTEX_CONST	0x3&lt;br /&gt;
#define MTL_ARG_CODE_PIXEL_SAMPLER	0x4&lt;br /&gt;
#define MTL_ARG_CODE_PIXEL_CONST	0x5&lt;br /&gt;
#define MTL_ARG_MATERIAL_PIXEL_CONST	0x6&lt;br /&gt;
#define  MTL_ARG_CODE_PRIM_END		0x6&lt;br /&gt;
#define MTL_ARG_LITERAL_PIXEL_CONST	0x7&lt;br /&gt;
#define MLT_ARG_COUNT			0x8&lt;br /&gt;
&lt;br /&gt;
struct MaterialShaderArgument&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 type;&lt;br /&gt;
  unsigned __int16 dest;&lt;br /&gt;
  MaterialArgumentDef u;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialStreamRouting&lt;br /&gt;
{&lt;br /&gt;
  char source;&lt;br /&gt;
  char dest;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexStreamRouting&lt;br /&gt;
{&lt;br /&gt;
  MaterialStreamRouting data[16];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexDeclaration&lt;br /&gt;
{&lt;br /&gt;
  char streamCount;&lt;br /&gt;
  bool hasOptionalSource;&lt;br /&gt;
  MaterialVertexStreamRouting routing;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxVertexShaderLoadDef&lt;br /&gt;
{&lt;br /&gt;
  char *cachedPart;&lt;br /&gt;
  char *physicalPart;&lt;br /&gt;
  unsigned __int16 cachedPartSize;&lt;br /&gt;
  unsigned __int16 physicalPartSize;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexShaderProgram&lt;br /&gt;
{&lt;br /&gt;
  D3DVertexShader *vs;&lt;br /&gt;
  GfxVertexShaderLoadDef loadDef;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexShader&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  MaterialVertexShaderProgram prog;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxPixelShaderLoadDef&lt;br /&gt;
{&lt;br /&gt;
  char *cachedPart;&lt;br /&gt;
  char *physicalPart;&lt;br /&gt;
  unsigned __int16 cachedPartSize;&lt;br /&gt;
  unsigned __int16 physicalPartSize;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union MaterialPixelShaderProgram&lt;br /&gt;
{&lt;br /&gt;
  D3DPixelShader *ps;&lt;br /&gt;
  GfxPixelShaderLoadDef loadDef;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialPixelShader&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  MaterialPixelShaderProgram prog;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#pragma pack(push, 4)&lt;br /&gt;
struct MaterialPass &lt;br /&gt;
{&lt;br /&gt;
  MaterialVertexDeclaration *vertexDecl;&lt;br /&gt;
  MaterialVertexShader *vertexShader;&lt;br /&gt;
  union&lt;br /&gt;
  {&lt;br /&gt;
    MaterialPixelShader *pixelShader;&lt;br /&gt;
    MaterialPixelShader *localPixelShader;&lt;br /&gt;
  };&lt;br /&gt;
  char perPrimArgCount;&lt;br /&gt;
  char perObjArgCount;&lt;br /&gt;
  char stableArgCount;&lt;br /&gt;
  char customSamplerFlags;&lt;br /&gt;
  char precompiledIndex;&lt;br /&gt;
  char materialType;  //It is unknown wether this is used/exists on Xbox or PS3.&lt;br /&gt;
  union&lt;br /&gt;
  {&lt;br /&gt;
    MaterialShaderArgument *args;&lt;br /&gt;
    MaterialShaderArgument *localArgs;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
#pragma pack(pop)&lt;br /&gt;
&lt;br /&gt;
struct MaterialTechnique&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  unsigned __int16 flags;&lt;br /&gt;
  unsigned __int16 passCount;&lt;br /&gt;
  MaterialPass passArray;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialTechniqueSet-&amp;gt;worldVertFormat */&lt;br /&gt;
enum MaterialWorldVertexFormat : char&lt;br /&gt;
{&lt;br /&gt;
  MTL_WORLDVERT_TEX_1_NRM_1 = 0x0,&lt;br /&gt;
  MTL_WORLDVERT_TEX_2_NRM_1 = 0x1,&lt;br /&gt;
  MTL_WORLDVERT_TEX_2_NRM_2 = 0x2,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_1 = 0x3,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_2 = 0x4,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_3 = 0x5,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_1 = 0x6,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_2 = 0x7,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_3 = 0x8,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_1 = 0x9,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_2 = 0xA,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_3 = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#ifdef PS3&lt;br /&gt;
  #define MAX_TECHNIQUES 32&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef XBOX&lt;br /&gt;
  #define MAX_TECHNIQUES 36&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef PC&lt;br /&gt;
 #define MAX_TECHNIQUES 36&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
struct MaterialTechniqueSet &lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  MaterialWorldVertexFormat worldVertFormat;&lt;br /&gt;
  MaterialTechnique *techniques[MAX_TECHNIQUES];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Material_Asset&amp;diff=1074</id>
		<title>Material Asset</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Material_Asset&amp;diff=1074"/>
		<updated>2026-07-05T13:51:52Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Category:Assets]]&lt;br /&gt;
[[Category:CoD4]]&lt;br /&gt;
[[Category:WaW]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
[[Category:BO1]]&lt;br /&gt;
[[Category:MW3]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
[[Category:Ghosts]]&lt;br /&gt;
&lt;br /&gt;
== Call of Duty 4 &amp;amp; World at War &amp;amp; Modern Warfare 2 &amp;amp; Modern Warfare 3 ==&lt;br /&gt;
&lt;br /&gt;
=== Rendering ===&lt;br /&gt;
[[MW2_Rendering|Rendering]]&lt;br /&gt;
&lt;br /&gt;
=== Structures ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialConstantDef &lt;br /&gt;
{&lt;br /&gt;
	int nameHash;&lt;br /&gt;
	char name[12];&lt;br /&gt;
	vec4_t literal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxStateBitsStructured&lt;br /&gt;
{&lt;br /&gt;
    //This word stores blend, alpha, culling, color write, gamma, and polygon mode state.&lt;br /&gt;
    unsigned int srcBlendRgb : 4;       // bits 0-3 &lt;br /&gt;
    unsigned int dstBlendRgb : 4;       // bits 4-7 &lt;br /&gt;
    unsigned int blendOpRgb : 3;        // bits 8-10&lt;br /&gt;
    unsigned int alphaTestDisabled : 1; // bit 11&lt;br /&gt;
    unsigned int alphaTest : 2;         // bits 12-13 &lt;br /&gt;
    unsigned int cullFace : 2;          // bits 14-15&lt;br /&gt;
    unsigned int srcBlendAlpha : 4;     // bits 16-19&lt;br /&gt;
    unsigned int dstBlendAlpha : 4;     // bits 20-23&lt;br /&gt;
    unsigned int blendOpAlpha : 3;      // bits 24-26&lt;br /&gt;
    unsigned int colorWriteRgb : 1;     // bit 27&lt;br /&gt;
    unsigned int colorWriteAlpha : 1;   // bit 28&lt;br /&gt;
    unsigned int unused0 : 1;           // bit 29&lt;br /&gt;
    unsigned int gammaWrite : 1;        // bit 30&lt;br /&gt;
    unsigned int polymodeLine : 1;      // bit 31&lt;br /&gt;
&lt;br /&gt;
    // This word stores depth and stencil state.&lt;br /&gt;
    unsigned int depthWrite : 1;          // bit 0&lt;br /&gt;
    unsigned int depthTestDisabled : 1;   // bit 1&lt;br /&gt;
    unsigned int depthTest : 2;           // bits 2-3&lt;br /&gt;
    unsigned int polygonOffset : 2;       // bits 4-5&lt;br /&gt;
    unsigned int stencilFrontEnabled : 1; // bit 6&lt;br /&gt;
    unsigned int stencilBackEnabled : 1;  // bit 7&lt;br /&gt;
    unsigned int stencilFrontPass : 3;    // bits 8-10&lt;br /&gt;
    unsigned int stencilFrontFail : 3;    // bits 11-13&lt;br /&gt;
    unsigned int stencilFrontZFail : 3;   // bits 14-16&lt;br /&gt;
    unsigned int stencilFrontFunc : 3;    // bits 17-19&lt;br /&gt;
    unsigned int stencilBackPass : 3;     // bits 20-22&lt;br /&gt;
    unsigned int stencilBackFail : 3;     // bits 23-25&lt;br /&gt;
    unsigned int stencilBackZFail : 3;    // bits 26-28&lt;br /&gt;
    unsigned int stencilBackFunc : 3;     // bits 29-31&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GfxStateBits &lt;br /&gt;
{&lt;br /&gt;
#ifdef XBOX&lt;br /&gt;
	int loadBits[2];&lt;br /&gt;
#elif defined(PS3)&lt;br /&gt;
	int (*loadBits)[2];&lt;br /&gt;
 #if defined(MW2) || defined(MW3)&lt;br /&gt;
	 GfxStateBitsStructured structured;&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct WaterWritable&lt;br /&gt;
{&lt;br /&gt;
	float floatTime;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct water_t &lt;br /&gt;
{&lt;br /&gt;
	WaterWritable writable;&lt;br /&gt;
	float *H0X;		// Count = M * N&lt;br /&gt;
	float *H0Y;		// Count = M * N&lt;br /&gt;
	float *wTerm;		// Count = M * N&lt;br /&gt;
	int M;&lt;br /&gt;
	int N;&lt;br /&gt;
	float Lx;&lt;br /&gt;
	float Lz;&lt;br /&gt;
	float gravity;&lt;br /&gt;
	float windvel;&lt;br /&gt;
	float winddir[2];&lt;br /&gt;
	float amplitude;&lt;br /&gt;
	float codeConstant[4];&lt;br /&gt;
	GfxImage *image;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialTextureDef-&amp;gt;semantic */&lt;br /&gt;
#define TS_2D		0x0&lt;br /&gt;
#define TS_FUNCTION	0x1&lt;br /&gt;
#define TS_COLOR_MAP	0x2&lt;br /&gt;
#define TS_UNUSED_1	0x3&lt;br /&gt;
#define TS_UNUSED_2	0x4&lt;br /&gt;
#define TS_NORMAL_MAP	0x5&lt;br /&gt;
#define TS_UNUSED_3	0x6&lt;br /&gt;
#define TS_UNUSED_4	0x7&lt;br /&gt;
#define TS_SPECULAR_MAP	0x8&lt;br /&gt;
#define TS_UNUSED_5	0x9&lt;br /&gt;
#define TS_UNUSED_6	0xA&lt;br /&gt;
#define TS_WATER_MAP	0xB&lt;br /&gt;
&lt;br /&gt;
union MaterialTextureDefInfo &lt;br /&gt;
{&lt;br /&gt;
	GfxImage *image;	// MaterialTextureDef-&amp;gt;semantic != TS_WATER_MAP&lt;br /&gt;
	water_t *water;		// MaterialTextureDef-&amp;gt;semantic == TS_WATER_MAP&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialTextureDef&lt;br /&gt;
{&lt;br /&gt;
	unsigned int nameHash;&lt;br /&gt;
	char nameStart;&lt;br /&gt;
	char nameEnd;&lt;br /&gt;
	char sampleState;&lt;br /&gt;
	char semantic;&lt;br /&gt;
	unsigned char isMatureContent;&lt;br /&gt;
	unsigned char pad[3];&lt;br /&gt;
	MaterialTextureDefInfo u;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GFxDrawSurfFields&lt;br /&gt;
{&lt;br /&gt;
	unsigned long long unused,&lt;br /&gt;
			primarySortKey,&lt;br /&gt;
			surfType,&lt;br /&gt;
			primaryLightIndex,&lt;br /&gt;
			prepass,&lt;br /&gt;
			materialSortedIndex,&lt;br /&gt;
			customIndex,&lt;br /&gt;
			reflectionProbeIndex,&lt;br /&gt;
			objectId;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GfxDrawSurf &lt;br /&gt;
{&lt;br /&gt;
	GFxDrawSurfFields fields;&lt;br /&gt;
	unsigned long long packed;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct __declspec(align(8)) MaterialInfo&lt;br /&gt;
{&lt;br /&gt;
	const char *name;&lt;br /&gt;
	char gameFlags;&lt;br /&gt;
	char sortKey;&lt;br /&gt;
	char textureAtlasRowCount;&lt;br /&gt;
	char textureAtlasColumnCount;&lt;br /&gt;
	GfxDrawSurf drawSurf;&lt;br /&gt;
	int surfaceTypeBits;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Material&lt;br /&gt;
{&lt;br /&gt;
	MaterialInfo info;&lt;br /&gt;
	char stateBitsEntry[TECHNIQUE_COUNT];	// see MaterialTechniqueType&lt;br /&gt;
	char textureCount;&lt;br /&gt;
	char constantCount;&lt;br /&gt;
	char stateBitsCount;&lt;br /&gt;
	char stateFlags;&lt;br /&gt;
	char cameraRegion;&lt;br /&gt;
#ifdef PS3&lt;br /&gt;
	unsigned short ushorts[TECHNIQUE_COUNT];&lt;br /&gt;
	unsigned short *ushortArray;	// count = TECHNIQUE_COUNT, see MaterialTechniqueType&lt;br /&gt;
#endif&lt;br /&gt;
	MaterialTechniqueSet *techniqueSet;&lt;br /&gt;
	MaterialTextureDef *textureTable;&lt;br /&gt;
	MaterialConstantDef *constantTable;&lt;br /&gt;
	GfxStateBits *stateBitTable;&lt;br /&gt;
#if defined(MW2) || defined(MW3)&lt;br /&gt;
	const char **unknownXStringArray;&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Black Ops &amp;amp; Black Ops 2==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialConstantDef &lt;br /&gt;
{&lt;br /&gt;
  unsigned int nameHash;&lt;br /&gt;
  char name[12];&lt;br /&gt;
  vec4_t literal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxStateBits &lt;br /&gt;
{&lt;br /&gt;
#if defined(XBOX) || defined(BO2)	// ps3 uses this for bo2..&lt;br /&gt;
  unsigned int loadBits[2];&lt;br /&gt;
#elif defined PS3&lt;br /&gt;
	int (*loadBits)[2];&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct WaterWritable&lt;br /&gt;
{&lt;br /&gt;
	float floatTime;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct water_t &lt;br /&gt;
{&lt;br /&gt;
	WaterWritable writable;&lt;br /&gt;
	float *H0X;		// Count = M * N&lt;br /&gt;
	float *H0Y;		// Count = M * N&lt;br /&gt;
	float *wTerm;		// Count = M * N&lt;br /&gt;
	int M;&lt;br /&gt;
	int N;&lt;br /&gt;
	float Lx;&lt;br /&gt;
	float Lz;&lt;br /&gt;
	float gravity;&lt;br /&gt;
	float windvel;&lt;br /&gt;
	float winddir[2];&lt;br /&gt;
	float amplitude;&lt;br /&gt;
	float codeConstant[4];&lt;br /&gt;
	GfxImage *image;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialTextureDef-&amp;gt;semantic */&lt;br /&gt;
#define TS_2D		0x0&lt;br /&gt;
#define TS_FUNCTION	0x1&lt;br /&gt;
#define TS_COLOR_MAP	0x2&lt;br /&gt;
#define TS_UNUSED_1	0x3&lt;br /&gt;
#define TS_UNUSED_2	0x4&lt;br /&gt;
#define TS_NORMAL_MAP	0x5&lt;br /&gt;
#define TS_UNUSED_3	0x6&lt;br /&gt;
#define TS_UNUSED_4	0x7&lt;br /&gt;
#define TS_SPECULAR_MAP	0x8&lt;br /&gt;
#define TS_UNUSED_5	0x9&lt;br /&gt;
#define TS_UNUSED_6	0xA&lt;br /&gt;
#define TS_WATER_MAP	0xB&lt;br /&gt;
&lt;br /&gt;
union MaterialTextureDefInfo &lt;br /&gt;
{&lt;br /&gt;
  GfxImage *image;	// MaterialTextureDef-&amp;gt;semantic != TS_WATER_MAP&lt;br /&gt;
  water_t *water;		// MaterialTextureDef-&amp;gt;semantic == TS_WATER_MAP&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialTextureDef&lt;br /&gt;
{&lt;br /&gt;
  unsigned int nameHash;&lt;br /&gt;
  char nameStart;&lt;br /&gt;
  char nameEnd;&lt;br /&gt;
  char samplerState;&lt;br /&gt;
  char semantic;&lt;br /&gt;
  char isMatureContent;&lt;br /&gt;
#ifdef BO1&lt;br /&gt;
  MaterialTextureDefInfo u;&lt;br /&gt;
#elif&lt;br /&gt;
  GfxImage *image;&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GFxDrawSurfFields&lt;br /&gt;
{&lt;br /&gt;
	unsigned long long unused,&lt;br /&gt;
			primarySortKey,&lt;br /&gt;
			surfType,&lt;br /&gt;
			primaryLightIndex,&lt;br /&gt;
			prepass,&lt;br /&gt;
			materialSortedIndex,&lt;br /&gt;
			customIndex,&lt;br /&gt;
			reflectionProbeIndex,&lt;br /&gt;
			objectId;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GfxDrawSurf &lt;br /&gt;
{&lt;br /&gt;
  GFxDrawSurfFields fields;&lt;br /&gt;
  unsigned long long packed;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialInfo&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  unsigned int gameFlags;&lt;br /&gt;
  char pad;&lt;br /&gt;
  char sortKey;&lt;br /&gt;
  char textureAtlasRowCount;&lt;br /&gt;
  char textureAtlasColumnCount;&lt;br /&gt;
  GfxDrawSurf drawSurf;&lt;br /&gt;
  unsigned int surfaceTypeBits;&lt;br /&gt;
  unsigned int layeredSurfaceTypes;&lt;br /&gt;
  unsigned __int16 hashIndex;&lt;br /&gt;
  int surfaceFlags;&lt;br /&gt;
#ifdef BO2&lt;br /&gt;
  int contents;&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Material&lt;br /&gt;
{&lt;br /&gt;
  MaterialInfo info;&lt;br /&gt;
  char stateBitsEntry[TECHNIQUE_COUNT];	// see MaterialTechniqueType&lt;br /&gt;
  char textureCount;&lt;br /&gt;
  char constantCount;&lt;br /&gt;
  char stateBitsCount;&lt;br /&gt;
  char stateFlags;&lt;br /&gt;
  char cameraRegion;&lt;br /&gt;
  char probeMipBits;&lt;br /&gt;
  MaterialTechniqueSet *techniqueSet;&lt;br /&gt;
  MaterialTextureDef *textureTable;&lt;br /&gt;
  MaterialConstantDef *constantTable;&lt;br /&gt;
  GfxStateBits *stateBitTable;&lt;br /&gt;
#ifdef BO2&lt;br /&gt;
  Material *thermalMaterial;&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ghosts ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialConstantDef &lt;br /&gt;
{&lt;br /&gt;
	unsigned int nameHash;&lt;br /&gt;
	char name[12];&lt;br /&gt;
	float literal[4];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxStateBits&lt;br /&gt;
{&lt;br /&gt;
	int (*loadBits)[3];&lt;br /&gt;
	char unknown1[0xE];&lt;br /&gt;
	char unknown2[0xE];&lt;br /&gt;
	char unknown3[2];&lt;br /&gt;
	char unknown4[2];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct WaterWritable&lt;br /&gt;
{&lt;br /&gt;
	float floatTime;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct water_t &lt;br /&gt;
{&lt;br /&gt;
	WaterWritable writable;&lt;br /&gt;
	float *H0X;	// Count = M * N&lt;br /&gt;
	float *H0Y;	// Count = M * N&lt;br /&gt;
	float *wTerm;	// Count = M * N&lt;br /&gt;
	int M;&lt;br /&gt;
	int N;&lt;br /&gt;
	float Lx;&lt;br /&gt;
	float Lz;&lt;br /&gt;
	float gravity;&lt;br /&gt;
	float windvel;&lt;br /&gt;
	float winddir[2];&lt;br /&gt;
	float amplitude;&lt;br /&gt;
	float codeConstant[4];&lt;br /&gt;
	GfxImage *image;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialTextureDef-&amp;gt;semantic */&lt;br /&gt;
#define TS_2D		0x0&lt;br /&gt;
#define TS_FUNCTION	0x1&lt;br /&gt;
#define TS_COLOR_MAP	0x2&lt;br /&gt;
#define TS_UNUSED_1	0x3&lt;br /&gt;
#define TS_UNUSED_2	0x4&lt;br /&gt;
#define TS_NORMAL_MAP	0x5&lt;br /&gt;
#define TS_UNUSED_3	0x6&lt;br /&gt;
#define TS_UNUSED_4	0x7&lt;br /&gt;
#define TS_SPECULAR_MAP	0x8&lt;br /&gt;
#define TS_UNUSED_5	0x9&lt;br /&gt;
#define TS_UNUSED_6	0xA&lt;br /&gt;
#define TS_WATER_MAP	0xB&lt;br /&gt;
&lt;br /&gt;
union MaterialTextureDefInfo &lt;br /&gt;
{&lt;br /&gt;
	GfxImage *image;&lt;br /&gt;
	water_t *water;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialTextureDef&lt;br /&gt;
{&lt;br /&gt;
	unsigned int nameHash;&lt;br /&gt;
	char nameStart;&lt;br /&gt;
	char nameEnd;&lt;br /&gt;
	char sampleState;&lt;br /&gt;
	char semantic;&lt;br /&gt;
	MaterialTextureDefInfo u;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GFxDrawSurfFields&lt;br /&gt;
{&lt;br /&gt;
	unsigned long long unused,&lt;br /&gt;
			primarySortKey,&lt;br /&gt;
			surfType,&lt;br /&gt;
			primaryLightIndex,&lt;br /&gt;
			prepass,&lt;br /&gt;
			materialSortedIndex,&lt;br /&gt;
			customIndex,&lt;br /&gt;
			reflectionProbeIndex,&lt;br /&gt;
			objectId;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GfxDrawSurf &lt;br /&gt;
{&lt;br /&gt;
	GFxDrawSurfFields fields;&lt;br /&gt;
	unsigned long long packed;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct __declspec(align(8)) MaterialInfo // 0x20&lt;br /&gt;
{&lt;br /&gt;
	const char *name;&lt;br /&gt;
	char gameFlags;&lt;br /&gt;
	char sortKey;&lt;br /&gt;
	char textureAtlasRowCount;&lt;br /&gt;
	char textureAtlasColumnCount;&lt;br /&gt;
	GfxDrawSurf drawSurf;&lt;br /&gt;
	int surfaceTypeBits;&lt;br /&gt;
	char unknown[0xC];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Material	// 0xB8&lt;br /&gt;
{&lt;br /&gt;
	MaterialInfo info;&lt;br /&gt;
	char stateBitsEntry[TECHNIQUE_COUNT];	// see MaterialTechniqueType&lt;br /&gt;
	char textureCount;	// 0x47&lt;br /&gt;
	char constantCount;	// 0x48&lt;br /&gt;
	char stateBitsCount;	// 0x49&lt;br /&gt;
	char stateFlags;	// 0x4A&lt;br /&gt;
	char cameraRegion;	// 0x4B&lt;br /&gt;
	char unknown;		// 0x4C&lt;br /&gt;
	char stringCount;	// 0x4D&lt;br /&gt;
#ifdef PS3&lt;br /&gt;
	unsigned short ushorts[TECHNIQUE_COUNT];&lt;br /&gt;
	unsigned short *ushortArray;		// count = TECHNIQUE_COUNT, see MaterialTechniqueType&lt;br /&gt;
#endif&lt;br /&gt;
	MaterialTechniqueSet *techniqueSet;&lt;br /&gt;
	MaterialTextureDef *textureTable;	// count = textureCount&lt;br /&gt;
	MaterialConstantDef *constantTable;	// count = constantCount&lt;br /&gt;
	GfxStateBits *stateBitTable;	// count = stateBitsCount&lt;br /&gt;
	const char **XStringArray;	// count = stringCount&lt;br /&gt;
	int unknown;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Graphics_Map_Asset_(MW2)&amp;diff=1073</id>
		<title>Graphics Map Asset (MW2)</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Graphics_Map_Asset_(MW2)&amp;diff=1073"/>
		<updated>2026-07-05T13:51:02Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Category:Assets]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
The graphics map (or gfx_map) has existed on every Call of Duty so far and is part of the D3DBSP system produced by Radiant. Where the [[:Collision Map Asset (MW2)|collision map]] is used for collision data in the map, the graphics map holds visual systems such as lights and particularly the dPVS system. The Dynamic Potentially Visible Sets (dPVS) were developed by Umbra Software to compute visibility databases in real time, and power the Call of Duty engine to this day.&lt;br /&gt;
&lt;br /&gt;
=== Rendering ===&lt;br /&gt;
[[MW2_Rendering|Rendering]]&lt;br /&gt;
&lt;br /&gt;
=== Structures ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct XModelDrawInfo&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 lod;&lt;br /&gt;
  unsigned __int16 surfId;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxSceneDynModel&lt;br /&gt;
{&lt;br /&gt;
  XModelDrawInfo info;&lt;br /&gt;
  unsigned __int16 dynEntId;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct BModelDrawInfo&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 surfId;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxSceneDynBrush&lt;br /&gt;
{&lt;br /&gt;
  BModelDrawInfo info;&lt;br /&gt;
  unsigned __int16 dynEntId;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxStreamingAabbTree&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 firstItem;&lt;br /&gt;
  unsigned __int16 itemCount;&lt;br /&gt;
  unsigned __int16 firstChild;&lt;br /&gt;
  unsigned __int16 childCount;&lt;br /&gt;
  float mins[3];&lt;br /&gt;
  float maxs[3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxWorldStreamInfo&lt;br /&gt;
{&lt;br /&gt;
  int aabbTreeCount;&lt;br /&gt;
  GfxStreamingAabbTree *aabbTrees;&lt;br /&gt;
  int leafRefCount;&lt;br /&gt;
  int *leafRefs;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GfxColor&lt;br /&gt;
{&lt;br /&gt;
  unsigned int packed;&lt;br /&gt;
  char array[4];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union PackedUnitVec&lt;br /&gt;
{&lt;br /&gt;
  unsigned int packed;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxWorldVertex&lt;br /&gt;
{&lt;br /&gt;
  float xyz[3];&lt;br /&gt;
  float binormalSign;&lt;br /&gt;
  GfxColor color;&lt;br /&gt;
  float texCoord[2];&lt;br /&gt;
  float lmapCoord[2];&lt;br /&gt;
  PackedUnitVec normal;&lt;br /&gt;
  PackedUnitVec tangent;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxWorldVertexData&lt;br /&gt;
{&lt;br /&gt;
  GfxWorldVertex *vertices;&lt;br /&gt;
  D3DVertexBuffer worldVb;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxLight&lt;br /&gt;
{&lt;br /&gt;
  char type;&lt;br /&gt;
  char canUseShadowMap;&lt;br /&gt;
  char unused[2];&lt;br /&gt;
  float color[3];&lt;br /&gt;
  float dir[3];&lt;br /&gt;
  float origin[3];&lt;br /&gt;
  float radius;&lt;br /&gt;
  float cosHalfFovOuter;&lt;br /&gt;
  float cosHalfFovInner;&lt;br /&gt;
  int exponent;&lt;br /&gt;
  unsigned int spotShadowIndex;&lt;br /&gt;
  GfxLightDef *def;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxReflectionProbe&lt;br /&gt;
{&lt;br /&gt;
  float offset[3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxWorldDpvsPlanes&lt;br /&gt;
{&lt;br /&gt;
  int cellCount;&lt;br /&gt;
  cplane_s *planes;&lt;br /&gt;
  unsigned __int16 *nodes;&lt;br /&gt;
  unsigned int *sceneEntCellBits; //Size = cellCount &amp;lt;&amp;lt; 11&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxAabbTree&lt;br /&gt;
{&lt;br /&gt;
  float mins[3];&lt;br /&gt;
  float maxs[3];&lt;br /&gt;
  unsigned __int16 childCount;&lt;br /&gt;
  unsigned __int16 surfaceCount;&lt;br /&gt;
  unsigned __int16 startSurfIndex;&lt;br /&gt;
  unsigned __int16 smodelIndexCount;&lt;br /&gt;
  unsigned __int16 *smodelIndexes;&lt;br /&gt;
  int childrenOffset;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxLightGridEntry&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 colorsIndex;&lt;br /&gt;
  char primaryLightIndex;&lt;br /&gt;
  char needsTrace;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxLightGridColors&lt;br /&gt;
{&lt;br /&gt;
  char rgb[56][3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxStaticModelInst&lt;br /&gt;
{&lt;br /&gt;
  float mins[3];&lt;br /&gt;
  float maxs[3];&lt;br /&gt;
  GfxColor groundLighting;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct srfTriangles_t&lt;br /&gt;
{&lt;br /&gt;
  int vertexLayerData;&lt;br /&gt;
  int firstVertex;&lt;br /&gt;
  unsigned __int16 vertexCount;&lt;br /&gt;
  unsigned __int16 triCount;&lt;br /&gt;
  int baseIndex;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxSurface&lt;br /&gt;
{&lt;br /&gt;
  srfTriangles_t tris;&lt;br /&gt;
  Material *material;&lt;br /&gt;
  char lightmapIndex;&lt;br /&gt;
  char reflectionProbeIndex;&lt;br /&gt;
  char primaryLightIndex;&lt;br /&gt;
  bool castsSunShadow;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxCullGroup&lt;br /&gt;
{&lt;br /&gt;
  float mins[3];&lt;br /&gt;
  float maxs[3];&lt;br /&gt;
  int surfaceCount;&lt;br /&gt;
  int startSurfIndex;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxDrawSurfFields&lt;br /&gt;
{&lt;br /&gt;
  __int64 _bf0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GfxDrawSurf&lt;br /&gt;
{&lt;br /&gt;
  GfxDrawSurfFields fields;&lt;br /&gt;
  unsigned __int64 packed;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxWorldDpvsStatic&lt;br /&gt;
{&lt;br /&gt;
  unsigned int smodelCount;&lt;br /&gt;
  unsigned int staticSurfaceCount;&lt;br /&gt;
  unsigned int litSurfsBegin;&lt;br /&gt;
  unsigned int litSurfsEnd;&lt;br /&gt;
  char unknown1[0x20];&lt;br /&gt;
  char *smodelVisData[3];&lt;br /&gt;
  char *surfaceVisData[3];&lt;br /&gt;
  unsigned __int16 *sortedSurfIndex;&lt;br /&gt;
  GfxStaticModelInst *smodelInsts;&lt;br /&gt;
  GfxSurface *surfaces;&lt;br /&gt;
  GfxCullGroup *cullGroups;&lt;br /&gt;
  GfxStaticModelDrawInst *smodelDrawInsts;&lt;br /&gt;
  GfxDrawSurf *surfaceMaterials;&lt;br /&gt;
  unsigned int *surfaceCastsSunShadow;&lt;br /&gt;
  volatile int usageCount;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#pragma pack(push, 4)&lt;br /&gt;
struct GfxPackedPlacement&lt;br /&gt;
{&lt;br /&gt;
  float origin[3];&lt;br /&gt;
  PackedUnitVec axis[3];&lt;br /&gt;
  float scale;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxStaticModelDrawInst&lt;br /&gt;
{&lt;br /&gt;
  GfxPackedPlacement placement;&lt;br /&gt;
  XModel *model;&lt;br /&gt;
  float cullDist;&lt;br /&gt;
  char reflectionProbeIndex;&lt;br /&gt;
  char primaryLightIndex;&lt;br /&gt;
  unsigned __int16 lightingHandle;&lt;br /&gt;
  char flags;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct cplane_s&lt;br /&gt;
{&lt;br /&gt;
  float normal[3];&lt;br /&gt;
  float dist;&lt;br /&gt;
  char type;&lt;br /&gt;
  char signbits;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxPortalWritable&lt;br /&gt;
{&lt;br /&gt;
  bool isQueued;&lt;br /&gt;
  bool isAncestor;&lt;br /&gt;
  char recursionDepth;&lt;br /&gt;
  char hullPointCount;&lt;br /&gt;
  float (*hullPoints)[2];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct DpvsPlane&lt;br /&gt;
{&lt;br /&gt;
  float coeffs[4];&lt;br /&gt;
  char side[3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxPortal&lt;br /&gt;
{&lt;br /&gt;
  GfxPortalWritable writable;&lt;br /&gt;
  DpvsPlane plane;&lt;br /&gt;
  float (*vertices)[3];&lt;br /&gt;
       char unknown[2];&lt;br /&gt;
  char vertexCount;&lt;br /&gt;
  float hullAxis[2][3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxCell&lt;br /&gt;
{&lt;br /&gt;
  float mins[3];&lt;br /&gt;
  float maxs[3];&lt;br /&gt;
  int portalCount;&lt;br /&gt;
  GfxPortal *portals;&lt;br /&gt;
  char reflectionProbeCount;&lt;br /&gt;
  char *reflectionProbes;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxLightmapArray&lt;br /&gt;
{&lt;br /&gt;
  GfxImage *primary;&lt;br /&gt;
  GfxImage *secondary;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxLightGrid&lt;br /&gt;
{&lt;br /&gt;
  bool hasLightRegions;&lt;br /&gt;
  unsigned int sunPrimaryLightIndex;&lt;br /&gt;
  unsigned __int16 mins[3];&lt;br /&gt;
  unsigned __int16 maxs[3];&lt;br /&gt;
  unsigned int rowAxis;&lt;br /&gt;
  unsigned int colAxis;&lt;br /&gt;
  unsigned __int16 *rowDataStart;&lt;br /&gt;
  unsigned int rawRowDataSize;&lt;br /&gt;
  char *rawRowData;&lt;br /&gt;
  unsigned int entryCount;&lt;br /&gt;
  GfxLightGridEntry *entries;&lt;br /&gt;
  unsigned int colorCount;&lt;br /&gt;
  GfxLightGridColors *colors;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxBrushModelWritable&lt;br /&gt;
{&lt;br /&gt;
  float mins[3];&lt;br /&gt;
  float maxs[3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxBrushModel&lt;br /&gt;
{&lt;br /&gt;
  GfxBrushModelWritable writable;&lt;br /&gt;
  float bounds[2][3];&lt;br /&gt;
  unsigned int surfaceCount;&lt;br /&gt;
  unsigned int startSurfIndex;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialMemory&lt;br /&gt;
{&lt;br /&gt;
  Material *material;&lt;br /&gt;
  int memory;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct sunflare_t&lt;br /&gt;
{&lt;br /&gt;
  bool hasValidData;&lt;br /&gt;
  Material *spriteMaterial;&lt;br /&gt;
  Material *flareMaterial;&lt;br /&gt;
  float spriteSize;&lt;br /&gt;
  float flareMinSize;&lt;br /&gt;
  float flareMinDot;&lt;br /&gt;
  float flareMaxSize;&lt;br /&gt;
  float flareMaxDot;&lt;br /&gt;
  float flareMaxAlpha;&lt;br /&gt;
  int flareFadeInTime;&lt;br /&gt;
  int flareFadeOutTime;&lt;br /&gt;
  float blindMinDot;&lt;br /&gt;
  float blindMaxDot;&lt;br /&gt;
  float blindMaxDarken;&lt;br /&gt;
  int blindFadeInTime;&lt;br /&gt;
  int blindFadeOutTime;&lt;br /&gt;
  float glareMinDot;&lt;br /&gt;
  float glareMaxDot;&lt;br /&gt;
  float glareMaxLighten;&lt;br /&gt;
  int glareFadeInTime;&lt;br /&gt;
  int glareFadeOutTime;&lt;br /&gt;
  float sunFxPosition[3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxShadowGeometry&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 surfaceCount;&lt;br /&gt;
  unsigned __int16 smodelCount;&lt;br /&gt;
  unsigned __int16 *sortedSurfIndex;&lt;br /&gt;
  unsigned __int16 *smodelIndex;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxLightRegionAxis&lt;br /&gt;
{&lt;br /&gt;
  float dir[3];&lt;br /&gt;
  float midPoint;&lt;br /&gt;
  float halfSize;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxLightRegionHull&lt;br /&gt;
{&lt;br /&gt;
  float kdopMidPoint[9];&lt;br /&gt;
  float kdopHalfSize[9];&lt;br /&gt;
  unsigned int axisCount;&lt;br /&gt;
  GfxLightRegionAxis *axis;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxLightRegion&lt;br /&gt;
{&lt;br /&gt;
  unsigned int hullCount;&lt;br /&gt;
  GfxLightRegionHull *hulls;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxWorldDpvsDynamic&lt;br /&gt;
{&lt;br /&gt;
  unsigned int dynEntClientWordCount[2];&lt;br /&gt;
  unsigned int dynEntClientCount[2];&lt;br /&gt;
  unsigned int *dynEntCellBits[2];&lt;br /&gt;
  char *dynEntVisData[2][3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SunLightParseParams&lt;br /&gt;
{&lt;br /&gt;
  char name[64];&lt;br /&gt;
  float ambientScale;&lt;br /&gt;
  float ambientColor[3];&lt;br /&gt;
  float diffuseFraction;&lt;br /&gt;
  float sunLight;&lt;br /&gt;
  float sunColor[3];&lt;br /&gt;
  float diffuseColor[3];&lt;br /&gt;
  bool diffuseColorHasBeenSet;&lt;br /&gt;
  float angles[3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxWorldVertexLayerData&lt;br /&gt;
{&lt;br /&gt;
  char *data;&lt;br /&gt;
  D3DVertexBuffer layerVb;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef char GfxTexture[0x34];&lt;br /&gt;
&lt;br /&gt;
struct GfxWorldDraw&lt;br /&gt;
{&lt;br /&gt;
  unsigned int reflectionProbeCount;&lt;br /&gt;
  GfxImage * * reflectionImages;&lt;br /&gt;
  GfxReflectionProbe *reflectionProbes;&lt;br /&gt;
  GfxTexture * reflectionProbeTextures; //Count = refelctionProbeCount&lt;br /&gt;
  int lightmapCount;&lt;br /&gt;
  GfxLightmapArray *lightmaps;&lt;br /&gt;
  GfxTexture * lightmapPrimaryTextures; //Count = lightmapCount&lt;br /&gt;
  GfxTexture * lightmapSecondaryTextures; //Count = lightmapCount&lt;br /&gt;
  GfxImage *skyImage;&lt;br /&gt;
  GfxImage *outdoorImage;&lt;br /&gt;
  unsigned int vertexCount;&lt;br /&gt;
  GfxWorldVertexData vd;&lt;br /&gt;
  unsigned int vertexLayerDataSize;&lt;br /&gt;
  GfxWorldVertexLayerData vld;&lt;br /&gt;
  int indexCount;&lt;br /&gt;
  unsigned __int16 *indices;&lt;br /&gt;
  D3DIndexBuffer indexBuffer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownGfxWorldStruct2&lt;br /&gt;
{&lt;br /&gt;
  int unknownCount;&lt;br /&gt;
  int * unknownArray;&lt;br /&gt;
  GfxImage * unknownImage;&lt;br /&gt;
  int unknown;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxWorld&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  const char *baseName;&lt;br /&gt;
  int planeCount;&lt;br /&gt;
  int nodeCount;&lt;br /&gt;
       int unknown2;&lt;br /&gt;
       unsigned int unknownCount1;&lt;br /&gt;
       unknownGfxWorldStruct2 * unknownStructs1; //Count = unknownCount1;&lt;br /&gt;
       char unknown1[0x18];&lt;br /&gt;
  GfxWorldDpvsPlanes dpvsPlanes; //The following rely on the count in this&lt;br /&gt;
       char *unknown4;&lt;br /&gt;
  GfxAabbTree *aabbTree;&lt;br /&gt;
  GfxCell *cells;&lt;br /&gt;
  GfxWorldDraw worldDraw;&lt;br /&gt;
  GfxLightGrid lightGrid;&lt;br /&gt;
  int modelCount;&lt;br /&gt;
  GfxBrushModel *models;&lt;br /&gt;
  float mins[3];&lt;br /&gt;
  float maxs[3];&lt;br /&gt;
  unsigned int checksum;&lt;br /&gt;
  int materialMemoryCount;&lt;br /&gt;
  MaterialMemory *materialMemory;&lt;br /&gt;
  sunflare_t sun;&lt;br /&gt;
  unsigned int *cellCasterBits[2];&lt;br /&gt;
  GfxSceneDynModel *sceneDynModel;&lt;br /&gt;
  GfxSceneDynBrush *sceneDynBrush;&lt;br /&gt;
  unsigned int *primaryLightEntityShadowVis;&lt;br /&gt;
  unsigned int *primaryLightDynEntShadowVis[2];&lt;br /&gt;
  char *primaryLightForModelDynEnt;&lt;br /&gt;
  GfxShadowGeometry *shadowGeom;&lt;br /&gt;
  GfxLightRegion *lightRegion;&lt;br /&gt;
  GfxWorldDpvsStatic dpvs;&lt;br /&gt;
  GfxWorldDpvsDynamic dpvsDyn;&lt;br /&gt;
       unsigned int unknownCount2;&lt;br /&gt;
       char * unknown2; //Size = unknownCount2 * 0x38&lt;br /&gt;
       int unknown3;&lt;br /&gt;
};&lt;br /&gt;
#pragma pack(pop)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Keep in mind that the checksum is checked on other clients using the mapcrc dvar.&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Graphics_Map_Asset_(MW2)&amp;diff=1072</id>
		<title>Graphics Map Asset (MW2)</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Graphics_Map_Asset_(MW2)&amp;diff=1072"/>
		<updated>2026-07-05T13:50:45Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Category:Assets]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
The graphics map (or gfx_map) has existed on every Call of Duty so far and is part of the D3DBSP system produced by Radiant. Where the [[:Collision Map Asset (MW2)|collision map]] is used for collision data in the map, the graphics map holds visual systems such as lights and particularly the dPVS system. The Dynamic Potentially Visible Sets (dPVS) were developed by Umbra Software to compute visibility databases in real time, and power the Call of Duty engine to this day.&lt;br /&gt;
&lt;br /&gt;
=== Rendering ===&lt;br /&gt;
[[MW2_Rendering|Rendering]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct XModelDrawInfo&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 lod;&lt;br /&gt;
  unsigned __int16 surfId;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxSceneDynModel&lt;br /&gt;
{&lt;br /&gt;
  XModelDrawInfo info;&lt;br /&gt;
  unsigned __int16 dynEntId;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct BModelDrawInfo&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 surfId;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxSceneDynBrush&lt;br /&gt;
{&lt;br /&gt;
  BModelDrawInfo info;&lt;br /&gt;
  unsigned __int16 dynEntId;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxStreamingAabbTree&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 firstItem;&lt;br /&gt;
  unsigned __int16 itemCount;&lt;br /&gt;
  unsigned __int16 firstChild;&lt;br /&gt;
  unsigned __int16 childCount;&lt;br /&gt;
  float mins[3];&lt;br /&gt;
  float maxs[3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxWorldStreamInfo&lt;br /&gt;
{&lt;br /&gt;
  int aabbTreeCount;&lt;br /&gt;
  GfxStreamingAabbTree *aabbTrees;&lt;br /&gt;
  int leafRefCount;&lt;br /&gt;
  int *leafRefs;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GfxColor&lt;br /&gt;
{&lt;br /&gt;
  unsigned int packed;&lt;br /&gt;
  char array[4];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union PackedUnitVec&lt;br /&gt;
{&lt;br /&gt;
  unsigned int packed;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxWorldVertex&lt;br /&gt;
{&lt;br /&gt;
  float xyz[3];&lt;br /&gt;
  float binormalSign;&lt;br /&gt;
  GfxColor color;&lt;br /&gt;
  float texCoord[2];&lt;br /&gt;
  float lmapCoord[2];&lt;br /&gt;
  PackedUnitVec normal;&lt;br /&gt;
  PackedUnitVec tangent;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxWorldVertexData&lt;br /&gt;
{&lt;br /&gt;
  GfxWorldVertex *vertices;&lt;br /&gt;
  D3DVertexBuffer worldVb;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxLight&lt;br /&gt;
{&lt;br /&gt;
  char type;&lt;br /&gt;
  char canUseShadowMap;&lt;br /&gt;
  char unused[2];&lt;br /&gt;
  float color[3];&lt;br /&gt;
  float dir[3];&lt;br /&gt;
  float origin[3];&lt;br /&gt;
  float radius;&lt;br /&gt;
  float cosHalfFovOuter;&lt;br /&gt;
  float cosHalfFovInner;&lt;br /&gt;
  int exponent;&lt;br /&gt;
  unsigned int spotShadowIndex;&lt;br /&gt;
  GfxLightDef *def;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxReflectionProbe&lt;br /&gt;
{&lt;br /&gt;
  float offset[3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxWorldDpvsPlanes&lt;br /&gt;
{&lt;br /&gt;
  int cellCount;&lt;br /&gt;
  cplane_s *planes;&lt;br /&gt;
  unsigned __int16 *nodes;&lt;br /&gt;
  unsigned int *sceneEntCellBits; //Size = cellCount &amp;lt;&amp;lt; 11&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxAabbTree&lt;br /&gt;
{&lt;br /&gt;
  float mins[3];&lt;br /&gt;
  float maxs[3];&lt;br /&gt;
  unsigned __int16 childCount;&lt;br /&gt;
  unsigned __int16 surfaceCount;&lt;br /&gt;
  unsigned __int16 startSurfIndex;&lt;br /&gt;
  unsigned __int16 smodelIndexCount;&lt;br /&gt;
  unsigned __int16 *smodelIndexes;&lt;br /&gt;
  int childrenOffset;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxLightGridEntry&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 colorsIndex;&lt;br /&gt;
  char primaryLightIndex;&lt;br /&gt;
  char needsTrace;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxLightGridColors&lt;br /&gt;
{&lt;br /&gt;
  char rgb[56][3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxStaticModelInst&lt;br /&gt;
{&lt;br /&gt;
  float mins[3];&lt;br /&gt;
  float maxs[3];&lt;br /&gt;
  GfxColor groundLighting;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct srfTriangles_t&lt;br /&gt;
{&lt;br /&gt;
  int vertexLayerData;&lt;br /&gt;
  int firstVertex;&lt;br /&gt;
  unsigned __int16 vertexCount;&lt;br /&gt;
  unsigned __int16 triCount;&lt;br /&gt;
  int baseIndex;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxSurface&lt;br /&gt;
{&lt;br /&gt;
  srfTriangles_t tris;&lt;br /&gt;
  Material *material;&lt;br /&gt;
  char lightmapIndex;&lt;br /&gt;
  char reflectionProbeIndex;&lt;br /&gt;
  char primaryLightIndex;&lt;br /&gt;
  bool castsSunShadow;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxCullGroup&lt;br /&gt;
{&lt;br /&gt;
  float mins[3];&lt;br /&gt;
  float maxs[3];&lt;br /&gt;
  int surfaceCount;&lt;br /&gt;
  int startSurfIndex;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxDrawSurfFields&lt;br /&gt;
{&lt;br /&gt;
  __int64 _bf0;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GfxDrawSurf&lt;br /&gt;
{&lt;br /&gt;
  GfxDrawSurfFields fields;&lt;br /&gt;
  unsigned __int64 packed;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxWorldDpvsStatic&lt;br /&gt;
{&lt;br /&gt;
  unsigned int smodelCount;&lt;br /&gt;
  unsigned int staticSurfaceCount;&lt;br /&gt;
  unsigned int litSurfsBegin;&lt;br /&gt;
  unsigned int litSurfsEnd;&lt;br /&gt;
  char unknown1[0x20];&lt;br /&gt;
  char *smodelVisData[3];&lt;br /&gt;
  char *surfaceVisData[3];&lt;br /&gt;
  unsigned __int16 *sortedSurfIndex;&lt;br /&gt;
  GfxStaticModelInst *smodelInsts;&lt;br /&gt;
  GfxSurface *surfaces;&lt;br /&gt;
  GfxCullGroup *cullGroups;&lt;br /&gt;
  GfxStaticModelDrawInst *smodelDrawInsts;&lt;br /&gt;
  GfxDrawSurf *surfaceMaterials;&lt;br /&gt;
  unsigned int *surfaceCastsSunShadow;&lt;br /&gt;
  volatile int usageCount;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#pragma pack(push, 4)&lt;br /&gt;
struct GfxPackedPlacement&lt;br /&gt;
{&lt;br /&gt;
  float origin[3];&lt;br /&gt;
  PackedUnitVec axis[3];&lt;br /&gt;
  float scale;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxStaticModelDrawInst&lt;br /&gt;
{&lt;br /&gt;
  GfxPackedPlacement placement;&lt;br /&gt;
  XModel *model;&lt;br /&gt;
  float cullDist;&lt;br /&gt;
  char reflectionProbeIndex;&lt;br /&gt;
  char primaryLightIndex;&lt;br /&gt;
  unsigned __int16 lightingHandle;&lt;br /&gt;
  char flags;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct cplane_s&lt;br /&gt;
{&lt;br /&gt;
  float normal[3];&lt;br /&gt;
  float dist;&lt;br /&gt;
  char type;&lt;br /&gt;
  char signbits;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxPortalWritable&lt;br /&gt;
{&lt;br /&gt;
  bool isQueued;&lt;br /&gt;
  bool isAncestor;&lt;br /&gt;
  char recursionDepth;&lt;br /&gt;
  char hullPointCount;&lt;br /&gt;
  float (*hullPoints)[2];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct DpvsPlane&lt;br /&gt;
{&lt;br /&gt;
  float coeffs[4];&lt;br /&gt;
  char side[3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxPortal&lt;br /&gt;
{&lt;br /&gt;
  GfxPortalWritable writable;&lt;br /&gt;
  DpvsPlane plane;&lt;br /&gt;
  float (*vertices)[3];&lt;br /&gt;
       char unknown[2];&lt;br /&gt;
  char vertexCount;&lt;br /&gt;
  float hullAxis[2][3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxCell&lt;br /&gt;
{&lt;br /&gt;
  float mins[3];&lt;br /&gt;
  float maxs[3];&lt;br /&gt;
  int portalCount;&lt;br /&gt;
  GfxPortal *portals;&lt;br /&gt;
  char reflectionProbeCount;&lt;br /&gt;
  char *reflectionProbes;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxLightmapArray&lt;br /&gt;
{&lt;br /&gt;
  GfxImage *primary;&lt;br /&gt;
  GfxImage *secondary;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxLightGrid&lt;br /&gt;
{&lt;br /&gt;
  bool hasLightRegions;&lt;br /&gt;
  unsigned int sunPrimaryLightIndex;&lt;br /&gt;
  unsigned __int16 mins[3];&lt;br /&gt;
  unsigned __int16 maxs[3];&lt;br /&gt;
  unsigned int rowAxis;&lt;br /&gt;
  unsigned int colAxis;&lt;br /&gt;
  unsigned __int16 *rowDataStart;&lt;br /&gt;
  unsigned int rawRowDataSize;&lt;br /&gt;
  char *rawRowData;&lt;br /&gt;
  unsigned int entryCount;&lt;br /&gt;
  GfxLightGridEntry *entries;&lt;br /&gt;
  unsigned int colorCount;&lt;br /&gt;
  GfxLightGridColors *colors;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxBrushModelWritable&lt;br /&gt;
{&lt;br /&gt;
  float mins[3];&lt;br /&gt;
  float maxs[3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxBrushModel&lt;br /&gt;
{&lt;br /&gt;
  GfxBrushModelWritable writable;&lt;br /&gt;
  float bounds[2][3];&lt;br /&gt;
  unsigned int surfaceCount;&lt;br /&gt;
  unsigned int startSurfIndex;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialMemory&lt;br /&gt;
{&lt;br /&gt;
  Material *material;&lt;br /&gt;
  int memory;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct sunflare_t&lt;br /&gt;
{&lt;br /&gt;
  bool hasValidData;&lt;br /&gt;
  Material *spriteMaterial;&lt;br /&gt;
  Material *flareMaterial;&lt;br /&gt;
  float spriteSize;&lt;br /&gt;
  float flareMinSize;&lt;br /&gt;
  float flareMinDot;&lt;br /&gt;
  float flareMaxSize;&lt;br /&gt;
  float flareMaxDot;&lt;br /&gt;
  float flareMaxAlpha;&lt;br /&gt;
  int flareFadeInTime;&lt;br /&gt;
  int flareFadeOutTime;&lt;br /&gt;
  float blindMinDot;&lt;br /&gt;
  float blindMaxDot;&lt;br /&gt;
  float blindMaxDarken;&lt;br /&gt;
  int blindFadeInTime;&lt;br /&gt;
  int blindFadeOutTime;&lt;br /&gt;
  float glareMinDot;&lt;br /&gt;
  float glareMaxDot;&lt;br /&gt;
  float glareMaxLighten;&lt;br /&gt;
  int glareFadeInTime;&lt;br /&gt;
  int glareFadeOutTime;&lt;br /&gt;
  float sunFxPosition[3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxShadowGeometry&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 surfaceCount;&lt;br /&gt;
  unsigned __int16 smodelCount;&lt;br /&gt;
  unsigned __int16 *sortedSurfIndex;&lt;br /&gt;
  unsigned __int16 *smodelIndex;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxLightRegionAxis&lt;br /&gt;
{&lt;br /&gt;
  float dir[3];&lt;br /&gt;
  float midPoint;&lt;br /&gt;
  float halfSize;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxLightRegionHull&lt;br /&gt;
{&lt;br /&gt;
  float kdopMidPoint[9];&lt;br /&gt;
  float kdopHalfSize[9];&lt;br /&gt;
  unsigned int axisCount;&lt;br /&gt;
  GfxLightRegionAxis *axis;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxLightRegion&lt;br /&gt;
{&lt;br /&gt;
  unsigned int hullCount;&lt;br /&gt;
  GfxLightRegionHull *hulls;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxWorldDpvsDynamic&lt;br /&gt;
{&lt;br /&gt;
  unsigned int dynEntClientWordCount[2];&lt;br /&gt;
  unsigned int dynEntClientCount[2];&lt;br /&gt;
  unsigned int *dynEntCellBits[2];&lt;br /&gt;
  char *dynEntVisData[2][3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SunLightParseParams&lt;br /&gt;
{&lt;br /&gt;
  char name[64];&lt;br /&gt;
  float ambientScale;&lt;br /&gt;
  float ambientColor[3];&lt;br /&gt;
  float diffuseFraction;&lt;br /&gt;
  float sunLight;&lt;br /&gt;
  float sunColor[3];&lt;br /&gt;
  float diffuseColor[3];&lt;br /&gt;
  bool diffuseColorHasBeenSet;&lt;br /&gt;
  float angles[3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxWorldVertexLayerData&lt;br /&gt;
{&lt;br /&gt;
  char *data;&lt;br /&gt;
  D3DVertexBuffer layerVb;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef char GfxTexture[0x34];&lt;br /&gt;
&lt;br /&gt;
struct GfxWorldDraw&lt;br /&gt;
{&lt;br /&gt;
  unsigned int reflectionProbeCount;&lt;br /&gt;
  GfxImage * * reflectionImages;&lt;br /&gt;
  GfxReflectionProbe *reflectionProbes;&lt;br /&gt;
  GfxTexture * reflectionProbeTextures; //Count = refelctionProbeCount&lt;br /&gt;
  int lightmapCount;&lt;br /&gt;
  GfxLightmapArray *lightmaps;&lt;br /&gt;
  GfxTexture * lightmapPrimaryTextures; //Count = lightmapCount&lt;br /&gt;
  GfxTexture * lightmapSecondaryTextures; //Count = lightmapCount&lt;br /&gt;
  GfxImage *skyImage;&lt;br /&gt;
  GfxImage *outdoorImage;&lt;br /&gt;
  unsigned int vertexCount;&lt;br /&gt;
  GfxWorldVertexData vd;&lt;br /&gt;
  unsigned int vertexLayerDataSize;&lt;br /&gt;
  GfxWorldVertexLayerData vld;&lt;br /&gt;
  int indexCount;&lt;br /&gt;
  unsigned __int16 *indices;&lt;br /&gt;
  D3DIndexBuffer indexBuffer;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownGfxWorldStruct2&lt;br /&gt;
{&lt;br /&gt;
  int unknownCount;&lt;br /&gt;
  int * unknownArray;&lt;br /&gt;
  GfxImage * unknownImage;&lt;br /&gt;
  int unknown;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxWorld&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  const char *baseName;&lt;br /&gt;
  int planeCount;&lt;br /&gt;
  int nodeCount;&lt;br /&gt;
       int unknown2;&lt;br /&gt;
       unsigned int unknownCount1;&lt;br /&gt;
       unknownGfxWorldStruct2 * unknownStructs1; //Count = unknownCount1;&lt;br /&gt;
       char unknown1[0x18];&lt;br /&gt;
  GfxWorldDpvsPlanes dpvsPlanes; //The following rely on the count in this&lt;br /&gt;
       char *unknown4;&lt;br /&gt;
  GfxAabbTree *aabbTree;&lt;br /&gt;
  GfxCell *cells;&lt;br /&gt;
  GfxWorldDraw worldDraw;&lt;br /&gt;
  GfxLightGrid lightGrid;&lt;br /&gt;
  int modelCount;&lt;br /&gt;
  GfxBrushModel *models;&lt;br /&gt;
  float mins[3];&lt;br /&gt;
  float maxs[3];&lt;br /&gt;
  unsigned int checksum;&lt;br /&gt;
  int materialMemoryCount;&lt;br /&gt;
  MaterialMemory *materialMemory;&lt;br /&gt;
  sunflare_t sun;&lt;br /&gt;
  unsigned int *cellCasterBits[2];&lt;br /&gt;
  GfxSceneDynModel *sceneDynModel;&lt;br /&gt;
  GfxSceneDynBrush *sceneDynBrush;&lt;br /&gt;
  unsigned int *primaryLightEntityShadowVis;&lt;br /&gt;
  unsigned int *primaryLightDynEntShadowVis[2];&lt;br /&gt;
  char *primaryLightForModelDynEnt;&lt;br /&gt;
  GfxShadowGeometry *shadowGeom;&lt;br /&gt;
  GfxLightRegion *lightRegion;&lt;br /&gt;
  GfxWorldDpvsStatic dpvs;&lt;br /&gt;
  GfxWorldDpvsDynamic dpvsDyn;&lt;br /&gt;
       unsigned int unknownCount2;&lt;br /&gt;
       char * unknown2; //Size = unknownCount2 * 0x38&lt;br /&gt;
       int unknown3;&lt;br /&gt;
};&lt;br /&gt;
#pragma pack(pop)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Keep in mind that the checksum is checked on other clients using the mapcrc dvar.&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:MW2&amp;diff=1071</id>
		<title>Category:MW2</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:MW2&amp;diff=1071"/>
		<updated>2026-07-05T13:49:20Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Any pages containing information on the 6th installment in the main Call of Duty series: Modern Warfare 2. This is Infinity Wards fourth installment in the series, as such it is running off the IW4.0 engine. This makes it a direct sequel to [[:Category:CoD4|Modern Warfare]], or IW3.0.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Useful Information ===&lt;br /&gt;
[[MW2_Rendering|Rendering]]&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=MW2_Rendering&amp;diff=1070</id>
		<title>MW2 Rendering</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=MW2_Rendering&amp;diff=1070"/>
		<updated>2026-07-05T13:48:20Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: Created page with &amp;quot;= Rendering = This section is to give you information on how to render surfaces, triangles, maps and apply texture blends and material technique sets per platform.  == Playstation 3 == The ps3 uses a different translation due to it&amp;#039;s RSX chip. [ place holder ]  == Xbox 360 == &amp;lt;code&amp;gt;n/a&amp;lt;/code&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Rendering =&lt;br /&gt;
This section is to give you information on how to render surfaces, triangles, maps and apply texture blends and material technique sets per platform.&lt;br /&gt;
&lt;br /&gt;
== Playstation 3 ==&lt;br /&gt;
The ps3 uses a different translation due to it&#039;s RSX chip.&lt;br /&gt;
[ place holder ]&lt;br /&gt;
&lt;br /&gt;
== Xbox 360 ==&lt;br /&gt;
&amp;lt;code&amp;gt;n/a&amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Technique_Set_Asset&amp;diff=1069</id>
		<title>Technique Set Asset</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Technique_Set_Asset&amp;diff=1069"/>
		<updated>2026-07-02T12:04:01Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Category:Assets]]&lt;br /&gt;
[[Category:CoD4]]&lt;br /&gt;
[[Category:WaW]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
[[Category:BO1]]&lt;br /&gt;
[[Category:MW3]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
[[Category:Ghosts]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialArgumentCodeConst &lt;br /&gt;
{&lt;br /&gt;
	unsigned __int16 index;&lt;br /&gt;
	char firstRow;&lt;br /&gt;
	char rowCount;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union MaterialArgumentDef &lt;br /&gt;
{&lt;br /&gt;
	const float *literalConst;&lt;br /&gt;
	MaterialArgumentCodeConst codeConst;&lt;br /&gt;
	unsigned int codeSampler;&lt;br /&gt;
	unsigned int nameHash;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialShaderArgument-&amp;gt;type */&lt;br /&gt;
enum MTL_ARG&lt;br /&gt;
{&lt;br /&gt;
    MATERIAL_VERTEX_CONST = 0x0,&lt;br /&gt;
    LITERAL_VERTEX_CONST = 0x1,&lt;br /&gt;
    MATERIAL_PIXEL_SAMPLER = 0x2,&lt;br /&gt;
    CODE_PRIM_BEGIN = 0x3,&lt;br /&gt;
    CODE_VERTEX_CONST = 0x3,&lt;br /&gt;
    CODE_PIXEL_SAMPLER = 0x4,&lt;br /&gt;
    CODE_PIXEL_CONST = 0x5,&lt;br /&gt;
    MATERIAL_PIXEL_CONST = 0x6,&lt;br /&gt;
    CODE_PRIM_END = 0x6,&lt;br /&gt;
    LITERAL_PIXEL_CONST = 0x7,&lt;br /&gt;
    COUNT = 0x8&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct MaterialShaderArgument&lt;br /&gt;
{&lt;br /&gt;
	unsigned __int16 type;&lt;br /&gt;
	unsigned __int16 dest;&lt;br /&gt;
	MaterialArgumentDef u;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* for pixel constants, Dest is not “a GLSL uniform slot” directly. &lt;br /&gt;
 * The engine uses Dest to look up a patch list in the pixel shader load data, &lt;br /&gt;
 * then writes those float4s into the shader byte stream before upload.&lt;br /&gt;
 * material arg Dest for samplers goes straight to RSX texture unit methods &lt;br /&gt;
 * (0x1a00 + Dest*0x20, etc.), while material/code pixel constants go &lt;br /&gt;
 * through the shader patch table.&lt;br /&gt;
 */&lt;br /&gt;
struct MaterialVertexStreamRouting&lt;br /&gt;
{&lt;br /&gt;
    unsigned char Source;&lt;br /&gt;
    unsigned char Dest;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexDeclaration&lt;br /&gt;
{&lt;br /&gt;
#if defined(COD4) || defined(WAW) || defined(BO1)&lt;br /&gt;
	char unknown[0x22];&lt;br /&gt;
#elif defined(MW2) || defined(MW3)&lt;br /&gt;
    unsigned char StreamCount;&lt;br /&gt;
    unsigned char HasOptionalSource;&lt;br /&gt;
    MaterialVertexStreamRouting Routing[13];&lt;br /&gt;
#elif defined(GHOSTS)&lt;br /&gt;
	char unknown[0x20];&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#pragma pack(push, 4)&lt;br /&gt;
struct MaterialPass &lt;br /&gt;
{&lt;br /&gt;
	MaterialVertexDeclaration *vertexDecl;&lt;br /&gt;
	MaterialVertexShader *vertexShader;&lt;br /&gt;
	MaterialPixelShader *pixelShader;&lt;br /&gt;
	char perPrimArgCount;&lt;br /&gt;
	char perObjArgCount;&lt;br /&gt;
	char stableArgCount;&lt;br /&gt;
	char customSamplerFlags;&lt;br /&gt;
	char precompiledIndex;&lt;br /&gt;
	MaterialShaderArgument *args;&lt;br /&gt;
};&lt;br /&gt;
#pragma pack(pop)&lt;br /&gt;
&lt;br /&gt;
struct MaterialTechnique &lt;br /&gt;
{&lt;br /&gt;
	const char *name;&lt;br /&gt;
	unsigned __int16 flags;&lt;br /&gt;
	unsigned __int16 passCount;&lt;br /&gt;
	MaterialPass passArray[1];	// count = passCount&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialTechniqueSet-&amp;gt;worldVertFormat */&lt;br /&gt;
enum MaterialWorldVertexFormat : char&lt;br /&gt;
{&lt;br /&gt;
  MTL_WORLDVERT_TEX_1_NRM_1 = 0x0,&lt;br /&gt;
  MTL_WORLDVERT_TEX_2_NRM_1 = 0x1,&lt;br /&gt;
  MTL_WORLDVERT_TEX_2_NRM_2 = 0x2,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_1 = 0x3,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_2 = 0x4,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_3 = 0x5,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_1 = 0x6,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_2 = 0x7,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_3 = 0x8,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_1 = 0x9,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_2 = 0xA,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_3 = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#ifdef PS3&lt;br /&gt;
 #ifdef COD4&lt;br /&gt;
  #define MAX_TECHNIQUES 26&lt;br /&gt;
 #elif defined(WAW)&lt;br /&gt;
  #define MAX_TECHNIQUES 51&lt;br /&gt;
 #elif defined(MW2)&lt;br /&gt;
  #define MAX_TECHNIQUES 37&lt;br /&gt;
 #elif defined(BO1)&lt;br /&gt;
  #define MAX_TECHNIQUES 71&lt;br /&gt;
 #elif defined(MW3)&lt;br /&gt;
  #define MAX_TECHNIQUES 41&lt;br /&gt;
 #elif defined(GHOSTS)&lt;br /&gt;
  #define MAX_TECHNIQUES 39&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef XBOX&lt;br /&gt;
 #ifdef COD4&lt;br /&gt;
  #define MAX_TECHNIQUES 26&lt;br /&gt;
 #elif defined(WAW)&lt;br /&gt;
  #define MAX_TECHNIQUES 51&lt;br /&gt;
 #elif defined(MW2)&lt;br /&gt;
  #define MAX_TECHNIQUES 33&lt;br /&gt;
 #elif defined(BO1)&lt;br /&gt;
  #define MAX_TECHNIQUES 71&lt;br /&gt;
 #elif defined(MW3)&lt;br /&gt;
  #define MAX_TECHNIQUES 37&lt;br /&gt;
 #elif defined(GHOSTS)&lt;br /&gt;
  #define MAX_TECHNIQUES 36&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef PC&lt;br /&gt;
 #ifdef COD4&lt;br /&gt;
  #define MAX_TECHNIQUES 34&lt;br /&gt;
 #elif defined(WAW)&lt;br /&gt;
  #define MAX_TECHNIQUES 59&lt;br /&gt;
 #elif defined(MW2)&lt;br /&gt;
  #define MAX_TECHNIQUES 48&lt;br /&gt;
 #elif defined(BO1)&lt;br /&gt;
  #define MAX_TECHNIQUES 130&lt;br /&gt;
 #elif defined(MW3)&lt;br /&gt;
  #define MAX_TECHNIQUES 54&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
struct MaterialTechniqueSet &lt;br /&gt;
{&lt;br /&gt;
	char *name;&lt;br /&gt;
	MaterialWorldVertexFormat worldVertFormat;&lt;br /&gt;
	MaterialTechnique *techniques[MAX_TECHNIQUES];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Black Ops 2 ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialArgumentCodeConst &lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 index;&lt;br /&gt;
  char firstRow;&lt;br /&gt;
  char rowCount;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union MaterialArgumentDef &lt;br /&gt;
{&lt;br /&gt;
  const float *literalConst;&lt;br /&gt;
  MaterialArgumentCodeConst codeConst;&lt;br /&gt;
  unsigned int codeSampler;&lt;br /&gt;
  unsigned int nameHash;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialShaderArgument-&amp;gt;type */&lt;br /&gt;
#define MTL_ARG_MATERIAL_VERTEX_CONST	0x0&lt;br /&gt;
#define MTL_ARG_LITERAL_VERTEX_CONST	0x1&lt;br /&gt;
#define MTL_ARG_MATERIAL_PIXEL_SAMPLER	0x2&lt;br /&gt;
#define  MTL_ARG_CODE_PRIM_BEGIN	0x3&lt;br /&gt;
#define MTL_ARG_CODE_VERTEX_CONST	0x3&lt;br /&gt;
#define MTL_ARG_CODE_PIXEL_SAMPLER	0x4&lt;br /&gt;
#define MTL_ARG_CODE_PIXEL_CONST	0x5&lt;br /&gt;
#define MTL_ARG_MATERIAL_PIXEL_CONST	0x6&lt;br /&gt;
#define  MTL_ARG_CODE_PRIM_END		0x6&lt;br /&gt;
#define MTL_ARG_LITERAL_PIXEL_CONST	0x7&lt;br /&gt;
#define MLT_ARG_COUNT			0x8&lt;br /&gt;
&lt;br /&gt;
struct MaterialShaderArgument&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 type;&lt;br /&gt;
  unsigned __int16 dest;&lt;br /&gt;
  MaterialArgumentDef u;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialStreamRouting&lt;br /&gt;
{&lt;br /&gt;
  char source;&lt;br /&gt;
  char dest;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexStreamRouting&lt;br /&gt;
{&lt;br /&gt;
  MaterialStreamRouting data[16];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexDeclaration&lt;br /&gt;
{&lt;br /&gt;
  char streamCount;&lt;br /&gt;
  bool hasOptionalSource;&lt;br /&gt;
  MaterialVertexStreamRouting routing;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxVertexShaderLoadDef&lt;br /&gt;
{&lt;br /&gt;
  char *cachedPart;&lt;br /&gt;
  char *physicalPart;&lt;br /&gt;
  unsigned __int16 cachedPartSize;&lt;br /&gt;
  unsigned __int16 physicalPartSize;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexShaderProgram&lt;br /&gt;
{&lt;br /&gt;
  D3DVertexShader *vs;&lt;br /&gt;
  GfxVertexShaderLoadDef loadDef;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexShader&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  MaterialVertexShaderProgram prog;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxPixelShaderLoadDef&lt;br /&gt;
{&lt;br /&gt;
  char *cachedPart;&lt;br /&gt;
  char *physicalPart;&lt;br /&gt;
  unsigned __int16 cachedPartSize;&lt;br /&gt;
  unsigned __int16 physicalPartSize;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union MaterialPixelShaderProgram&lt;br /&gt;
{&lt;br /&gt;
  D3DPixelShader *ps;&lt;br /&gt;
  GfxPixelShaderLoadDef loadDef;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialPixelShader&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  MaterialPixelShaderProgram prog;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#pragma pack(push, 4)&lt;br /&gt;
struct MaterialPass &lt;br /&gt;
{&lt;br /&gt;
  MaterialVertexDeclaration *vertexDecl;&lt;br /&gt;
  MaterialVertexShader *vertexShader;&lt;br /&gt;
  union&lt;br /&gt;
  {&lt;br /&gt;
    MaterialPixelShader *pixelShader;&lt;br /&gt;
    MaterialPixelShader *localPixelShader;&lt;br /&gt;
  };&lt;br /&gt;
  char perPrimArgCount;&lt;br /&gt;
  char perObjArgCount;&lt;br /&gt;
  char stableArgCount;&lt;br /&gt;
  char customSamplerFlags;&lt;br /&gt;
  char precompiledIndex;&lt;br /&gt;
  char materialType;  //It is unknown wether this is used/exists on Xbox or PS3.&lt;br /&gt;
  union&lt;br /&gt;
  {&lt;br /&gt;
    MaterialShaderArgument *args;&lt;br /&gt;
    MaterialShaderArgument *localArgs;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
#pragma pack(pop)&lt;br /&gt;
&lt;br /&gt;
struct MaterialTechnique&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  unsigned __int16 flags;&lt;br /&gt;
  unsigned __int16 passCount;&lt;br /&gt;
  MaterialPass passArray;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialTechniqueSet-&amp;gt;worldVertFormat */&lt;br /&gt;
enum MaterialWorldVertexFormat : char&lt;br /&gt;
{&lt;br /&gt;
  MTL_WORLDVERT_TEX_1_NRM_1 = 0x0,&lt;br /&gt;
  MTL_WORLDVERT_TEX_2_NRM_1 = 0x1,&lt;br /&gt;
  MTL_WORLDVERT_TEX_2_NRM_2 = 0x2,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_1 = 0x3,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_2 = 0x4,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_3 = 0x5,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_1 = 0x6,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_2 = 0x7,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_3 = 0x8,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_1 = 0x9,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_2 = 0xA,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_3 = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#ifdef PS3&lt;br /&gt;
  #define MAX_TECHNIQUES 32&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef XBOX&lt;br /&gt;
  #define MAX_TECHNIQUES 36&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef PC&lt;br /&gt;
 #define MAX_TECHNIQUES 36&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
struct MaterialTechniqueSet &lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  MaterialWorldVertexFormat worldVertFormat;&lt;br /&gt;
  MaterialTechnique *techniques[MAX_TECHNIQUES];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Technique_Set_Asset&amp;diff=1068</id>
		<title>Technique Set Asset</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Technique_Set_Asset&amp;diff=1068"/>
		<updated>2026-07-02T12:02:05Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Category:Assets]]&lt;br /&gt;
[[Category:CoD4]]&lt;br /&gt;
[[Category:WaW]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
[[Category:BO1]]&lt;br /&gt;
[[Category:MW3]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
[[Category:Ghosts]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialArgumentCodeConst &lt;br /&gt;
{&lt;br /&gt;
	unsigned __int16 index;&lt;br /&gt;
	char firstRow;&lt;br /&gt;
	char rowCount;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union MaterialArgumentDef &lt;br /&gt;
{&lt;br /&gt;
	const float *literalConst;&lt;br /&gt;
	MaterialArgumentCodeConst codeConst;&lt;br /&gt;
	unsigned int codeSampler;&lt;br /&gt;
	unsigned int nameHash;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialShaderArgument-&amp;gt;type */&lt;br /&gt;
enum MTL_ARG&lt;br /&gt;
{&lt;br /&gt;
    MATERIAL_VERTEX_CONST = 0x0,&lt;br /&gt;
    LITERAL_VERTEX_CONST = 0x1,&lt;br /&gt;
    MATERIAL_PIXEL_SAMPLER = 0x2,&lt;br /&gt;
    CODE_PRIM_BEGIN = 0x3,&lt;br /&gt;
    CODE_VERTEX_CONST = 0x3,&lt;br /&gt;
    CODE_PIXEL_SAMPLER = 0x4,&lt;br /&gt;
    CODE_PIXEL_CONST = 0x5,&lt;br /&gt;
    MATERIAL_PIXEL_CONST = 0x6,&lt;br /&gt;
    CODE_PRIM_END = 0x6,&lt;br /&gt;
    LITERAL_PIXEL_CONST = 0x7,&lt;br /&gt;
    COUNT = 0x8&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct MaterialShaderArgument&lt;br /&gt;
{&lt;br /&gt;
	unsigned __int16 type;&lt;br /&gt;
	unsigned __int16 dest;&lt;br /&gt;
	MaterialArgumentDef u;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* for pixel constants, Dest is not “a GLSL uniform slot” directly. &lt;br /&gt;
 * The engine uses Dest to look up a patch list in the pixel shader load data, &lt;br /&gt;
 * then writes those float4s into the shader byte stream before upload.&lt;br /&gt;
 */&lt;br /&gt;
struct MaterialVertexStreamRouting&lt;br /&gt;
{&lt;br /&gt;
    unsigned char Source;&lt;br /&gt;
    unsigned char Dest;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexDeclaration&lt;br /&gt;
{&lt;br /&gt;
#if defined(COD4) || defined(WAW) || defined(BO1)&lt;br /&gt;
	char unknown[0x22];&lt;br /&gt;
#elif defined(MW2) || defined(MW3)&lt;br /&gt;
    unsigned char StreamCount;&lt;br /&gt;
    unsigned char HasOptionalSource;&lt;br /&gt;
    MaterialVertexStreamRouting Routing[13];&lt;br /&gt;
#elif defined(GHOSTS)&lt;br /&gt;
	char unknown[0x20];&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#pragma pack(push, 4)&lt;br /&gt;
struct MaterialPass &lt;br /&gt;
{&lt;br /&gt;
	MaterialVertexDeclaration *vertexDecl;&lt;br /&gt;
	MaterialVertexShader *vertexShader;&lt;br /&gt;
	MaterialPixelShader *pixelShader;&lt;br /&gt;
	char perPrimArgCount;&lt;br /&gt;
	char perObjArgCount;&lt;br /&gt;
	char stableArgCount;&lt;br /&gt;
	char customSamplerFlags;&lt;br /&gt;
	char precompiledIndex;&lt;br /&gt;
	MaterialShaderArgument *args;&lt;br /&gt;
};&lt;br /&gt;
#pragma pack(pop)&lt;br /&gt;
&lt;br /&gt;
struct MaterialTechnique &lt;br /&gt;
{&lt;br /&gt;
	const char *name;&lt;br /&gt;
	unsigned __int16 flags;&lt;br /&gt;
	unsigned __int16 passCount;&lt;br /&gt;
	MaterialPass passArray[1];	// count = passCount&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialTechniqueSet-&amp;gt;worldVertFormat */&lt;br /&gt;
enum MaterialWorldVertexFormat : char&lt;br /&gt;
{&lt;br /&gt;
  MTL_WORLDVERT_TEX_1_NRM_1 = 0x0,&lt;br /&gt;
  MTL_WORLDVERT_TEX_2_NRM_1 = 0x1,&lt;br /&gt;
  MTL_WORLDVERT_TEX_2_NRM_2 = 0x2,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_1 = 0x3,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_2 = 0x4,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_3 = 0x5,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_1 = 0x6,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_2 = 0x7,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_3 = 0x8,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_1 = 0x9,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_2 = 0xA,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_3 = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#ifdef PS3&lt;br /&gt;
 #ifdef COD4&lt;br /&gt;
  #define MAX_TECHNIQUES 26&lt;br /&gt;
 #elif defined(WAW)&lt;br /&gt;
  #define MAX_TECHNIQUES 51&lt;br /&gt;
 #elif defined(MW2)&lt;br /&gt;
  #define MAX_TECHNIQUES 37&lt;br /&gt;
 #elif defined(BO1)&lt;br /&gt;
  #define MAX_TECHNIQUES 71&lt;br /&gt;
 #elif defined(MW3)&lt;br /&gt;
  #define MAX_TECHNIQUES 41&lt;br /&gt;
 #elif defined(GHOSTS)&lt;br /&gt;
  #define MAX_TECHNIQUES 39&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef XBOX&lt;br /&gt;
 #ifdef COD4&lt;br /&gt;
  #define MAX_TECHNIQUES 26&lt;br /&gt;
 #elif defined(WAW)&lt;br /&gt;
  #define MAX_TECHNIQUES 51&lt;br /&gt;
 #elif defined(MW2)&lt;br /&gt;
  #define MAX_TECHNIQUES 33&lt;br /&gt;
 #elif defined(BO1)&lt;br /&gt;
  #define MAX_TECHNIQUES 71&lt;br /&gt;
 #elif defined(MW3)&lt;br /&gt;
  #define MAX_TECHNIQUES 37&lt;br /&gt;
 #elif defined(GHOSTS)&lt;br /&gt;
  #define MAX_TECHNIQUES 36&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef PC&lt;br /&gt;
 #ifdef COD4&lt;br /&gt;
  #define MAX_TECHNIQUES 34&lt;br /&gt;
 #elif defined(WAW)&lt;br /&gt;
  #define MAX_TECHNIQUES 59&lt;br /&gt;
 #elif defined(MW2)&lt;br /&gt;
  #define MAX_TECHNIQUES 48&lt;br /&gt;
 #elif defined(BO1)&lt;br /&gt;
  #define MAX_TECHNIQUES 130&lt;br /&gt;
 #elif defined(MW3)&lt;br /&gt;
  #define MAX_TECHNIQUES 54&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
struct MaterialTechniqueSet &lt;br /&gt;
{&lt;br /&gt;
	char *name;&lt;br /&gt;
	MaterialWorldVertexFormat worldVertFormat;&lt;br /&gt;
	MaterialTechnique *techniques[MAX_TECHNIQUES];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Black Ops 2 ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialArgumentCodeConst &lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 index;&lt;br /&gt;
  char firstRow;&lt;br /&gt;
  char rowCount;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union MaterialArgumentDef &lt;br /&gt;
{&lt;br /&gt;
  const float *literalConst;&lt;br /&gt;
  MaterialArgumentCodeConst codeConst;&lt;br /&gt;
  unsigned int codeSampler;&lt;br /&gt;
  unsigned int nameHash;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialShaderArgument-&amp;gt;type */&lt;br /&gt;
#define MTL_ARG_MATERIAL_VERTEX_CONST	0x0&lt;br /&gt;
#define MTL_ARG_LITERAL_VERTEX_CONST	0x1&lt;br /&gt;
#define MTL_ARG_MATERIAL_PIXEL_SAMPLER	0x2&lt;br /&gt;
#define  MTL_ARG_CODE_PRIM_BEGIN	0x3&lt;br /&gt;
#define MTL_ARG_CODE_VERTEX_CONST	0x3&lt;br /&gt;
#define MTL_ARG_CODE_PIXEL_SAMPLER	0x4&lt;br /&gt;
#define MTL_ARG_CODE_PIXEL_CONST	0x5&lt;br /&gt;
#define MTL_ARG_MATERIAL_PIXEL_CONST	0x6&lt;br /&gt;
#define  MTL_ARG_CODE_PRIM_END		0x6&lt;br /&gt;
#define MTL_ARG_LITERAL_PIXEL_CONST	0x7&lt;br /&gt;
#define MLT_ARG_COUNT			0x8&lt;br /&gt;
&lt;br /&gt;
struct MaterialShaderArgument&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 type;&lt;br /&gt;
  unsigned __int16 dest;&lt;br /&gt;
  MaterialArgumentDef u;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialStreamRouting&lt;br /&gt;
{&lt;br /&gt;
  char source;&lt;br /&gt;
  char dest;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexStreamRouting&lt;br /&gt;
{&lt;br /&gt;
  MaterialStreamRouting data[16];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexDeclaration&lt;br /&gt;
{&lt;br /&gt;
  char streamCount;&lt;br /&gt;
  bool hasOptionalSource;&lt;br /&gt;
  MaterialVertexStreamRouting routing;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxVertexShaderLoadDef&lt;br /&gt;
{&lt;br /&gt;
  char *cachedPart;&lt;br /&gt;
  char *physicalPart;&lt;br /&gt;
  unsigned __int16 cachedPartSize;&lt;br /&gt;
  unsigned __int16 physicalPartSize;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexShaderProgram&lt;br /&gt;
{&lt;br /&gt;
  D3DVertexShader *vs;&lt;br /&gt;
  GfxVertexShaderLoadDef loadDef;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexShader&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  MaterialVertexShaderProgram prog;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxPixelShaderLoadDef&lt;br /&gt;
{&lt;br /&gt;
  char *cachedPart;&lt;br /&gt;
  char *physicalPart;&lt;br /&gt;
  unsigned __int16 cachedPartSize;&lt;br /&gt;
  unsigned __int16 physicalPartSize;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union MaterialPixelShaderProgram&lt;br /&gt;
{&lt;br /&gt;
  D3DPixelShader *ps;&lt;br /&gt;
  GfxPixelShaderLoadDef loadDef;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialPixelShader&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  MaterialPixelShaderProgram prog;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#pragma pack(push, 4)&lt;br /&gt;
struct MaterialPass &lt;br /&gt;
{&lt;br /&gt;
  MaterialVertexDeclaration *vertexDecl;&lt;br /&gt;
  MaterialVertexShader *vertexShader;&lt;br /&gt;
  union&lt;br /&gt;
  {&lt;br /&gt;
    MaterialPixelShader *pixelShader;&lt;br /&gt;
    MaterialPixelShader *localPixelShader;&lt;br /&gt;
  };&lt;br /&gt;
  char perPrimArgCount;&lt;br /&gt;
  char perObjArgCount;&lt;br /&gt;
  char stableArgCount;&lt;br /&gt;
  char customSamplerFlags;&lt;br /&gt;
  char precompiledIndex;&lt;br /&gt;
  char materialType;  //It is unknown wether this is used/exists on Xbox or PS3.&lt;br /&gt;
  union&lt;br /&gt;
  {&lt;br /&gt;
    MaterialShaderArgument *args;&lt;br /&gt;
    MaterialShaderArgument *localArgs;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
#pragma pack(pop)&lt;br /&gt;
&lt;br /&gt;
struct MaterialTechnique&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  unsigned __int16 flags;&lt;br /&gt;
  unsigned __int16 passCount;&lt;br /&gt;
  MaterialPass passArray;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialTechniqueSet-&amp;gt;worldVertFormat */&lt;br /&gt;
enum MaterialWorldVertexFormat : char&lt;br /&gt;
{&lt;br /&gt;
  MTL_WORLDVERT_TEX_1_NRM_1 = 0x0,&lt;br /&gt;
  MTL_WORLDVERT_TEX_2_NRM_1 = 0x1,&lt;br /&gt;
  MTL_WORLDVERT_TEX_2_NRM_2 = 0x2,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_1 = 0x3,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_2 = 0x4,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_3 = 0x5,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_1 = 0x6,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_2 = 0x7,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_3 = 0x8,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_1 = 0x9,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_2 = 0xA,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_3 = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#ifdef PS3&lt;br /&gt;
  #define MAX_TECHNIQUES 32&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef XBOX&lt;br /&gt;
  #define MAX_TECHNIQUES 36&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef PC&lt;br /&gt;
 #define MAX_TECHNIQUES 36&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
struct MaterialTechniqueSet &lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  MaterialWorldVertexFormat worldVertFormat;&lt;br /&gt;
  MaterialTechnique *techniques[MAX_TECHNIQUES];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Technique_Set_Asset&amp;diff=1067</id>
		<title>Technique Set Asset</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Technique_Set_Asset&amp;diff=1067"/>
		<updated>2026-07-01T20:22:42Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Category:Assets]]&lt;br /&gt;
[[Category:CoD4]]&lt;br /&gt;
[[Category:WaW]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
[[Category:BO1]]&lt;br /&gt;
[[Category:MW3]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
[[Category:Ghosts]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialArgumentCodeConst &lt;br /&gt;
{&lt;br /&gt;
	unsigned __int16 index;&lt;br /&gt;
	char firstRow;&lt;br /&gt;
	char rowCount;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union MaterialArgumentDef &lt;br /&gt;
{&lt;br /&gt;
	const float *literalConst;&lt;br /&gt;
	MaterialArgumentCodeConst codeConst;&lt;br /&gt;
	unsigned int codeSampler;&lt;br /&gt;
	unsigned int nameHash;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialShaderArgument-&amp;gt;type */&lt;br /&gt;
enum MTL_ARG : unsigned char&lt;br /&gt;
{&lt;br /&gt;
    MATERIAL_VERTEX_CONST = 0x0,&lt;br /&gt;
    LITERAL_VERTEX_CONST = 0x1,&lt;br /&gt;
    MATERIAL_PIXEL_SAMPLER = 0x2,&lt;br /&gt;
    CODE_PRIM_BEGIN = 0x3,&lt;br /&gt;
    CODE_VERTEX_CONST = 0x3,&lt;br /&gt;
    CODE_PIXEL_SAMPLER = 0x4,&lt;br /&gt;
    CODE_PIXEL_CONST = 0x5,&lt;br /&gt;
    MATERIAL_PIXEL_CONST = 0x6,&lt;br /&gt;
    CODE_PRIM_END = 0x6,&lt;br /&gt;
    LITERAL_PIXEL_CONST = 0x7,&lt;br /&gt;
    COUNT = 0x8&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct MaterialShaderArgument&lt;br /&gt;
{&lt;br /&gt;
	unsigned __int16 type;&lt;br /&gt;
	unsigned __int16 dest;&lt;br /&gt;
	MaterialArgumentDef u;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexStreamRouting&lt;br /&gt;
{&lt;br /&gt;
    unsigned char Source;&lt;br /&gt;
    unsigned char Dest;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexDeclaration&lt;br /&gt;
{&lt;br /&gt;
#if defined(COD4) || defined(WAW) || defined(BO1)&lt;br /&gt;
	char unknown[0x22];&lt;br /&gt;
#elif defined(MW2) || defined(MW3)&lt;br /&gt;
    unsigned char StreamCount;&lt;br /&gt;
    unsigned char HasOptionalSource;&lt;br /&gt;
    MaterialVertexStreamRouting Routing[13];&lt;br /&gt;
#elif defined(GHOSTS)&lt;br /&gt;
	char unknown[0x20];&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#pragma pack(push, 4)&lt;br /&gt;
struct MaterialPass &lt;br /&gt;
{&lt;br /&gt;
	MaterialVertexDeclaration *vertexDecl;&lt;br /&gt;
	MaterialVertexShader *vertexShader;&lt;br /&gt;
	MaterialPixelShader *pixelShader;&lt;br /&gt;
	char perPrimArgCount;&lt;br /&gt;
	char perObjArgCount;&lt;br /&gt;
	char stableArgCount;&lt;br /&gt;
	char customSamplerFlags;&lt;br /&gt;
	char precompiledIndex;&lt;br /&gt;
	MaterialShaderArgument *args;&lt;br /&gt;
};&lt;br /&gt;
#pragma pack(pop)&lt;br /&gt;
&lt;br /&gt;
struct MaterialTechnique &lt;br /&gt;
{&lt;br /&gt;
	const char *name;&lt;br /&gt;
	unsigned __int16 flags;&lt;br /&gt;
	unsigned __int16 passCount;&lt;br /&gt;
	MaterialPass passArray[1];	// count = passCount&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialTechniqueSet-&amp;gt;worldVertFormat */&lt;br /&gt;
enum MaterialWorldVertexFormat : char&lt;br /&gt;
{&lt;br /&gt;
  MTL_WORLDVERT_TEX_1_NRM_1 = 0x0,&lt;br /&gt;
  MTL_WORLDVERT_TEX_2_NRM_1 = 0x1,&lt;br /&gt;
  MTL_WORLDVERT_TEX_2_NRM_2 = 0x2,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_1 = 0x3,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_2 = 0x4,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_3 = 0x5,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_1 = 0x6,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_2 = 0x7,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_3 = 0x8,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_1 = 0x9,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_2 = 0xA,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_3 = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#ifdef PS3&lt;br /&gt;
 #ifdef COD4&lt;br /&gt;
  #define MAX_TECHNIQUES 26&lt;br /&gt;
 #elif defined(WAW)&lt;br /&gt;
  #define MAX_TECHNIQUES 51&lt;br /&gt;
 #elif defined(MW2)&lt;br /&gt;
  #define MAX_TECHNIQUES 37&lt;br /&gt;
 #elif defined(BO1)&lt;br /&gt;
  #define MAX_TECHNIQUES 71&lt;br /&gt;
 #elif defined(MW3)&lt;br /&gt;
  #define MAX_TECHNIQUES 41&lt;br /&gt;
 #elif defined(GHOSTS)&lt;br /&gt;
  #define MAX_TECHNIQUES 39&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef XBOX&lt;br /&gt;
 #ifdef COD4&lt;br /&gt;
  #define MAX_TECHNIQUES 26&lt;br /&gt;
 #elif defined(WAW)&lt;br /&gt;
  #define MAX_TECHNIQUES 51&lt;br /&gt;
 #elif defined(MW2)&lt;br /&gt;
  #define MAX_TECHNIQUES 33&lt;br /&gt;
 #elif defined(BO1)&lt;br /&gt;
  #define MAX_TECHNIQUES 71&lt;br /&gt;
 #elif defined(MW3)&lt;br /&gt;
  #define MAX_TECHNIQUES 37&lt;br /&gt;
 #elif defined(GHOSTS)&lt;br /&gt;
  #define MAX_TECHNIQUES 36&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef PC&lt;br /&gt;
 #ifdef COD4&lt;br /&gt;
  #define MAX_TECHNIQUES 34&lt;br /&gt;
 #elif defined(WAW)&lt;br /&gt;
  #define MAX_TECHNIQUES 59&lt;br /&gt;
 #elif defined(MW2)&lt;br /&gt;
  #define MAX_TECHNIQUES 48&lt;br /&gt;
 #elif defined(BO1)&lt;br /&gt;
  #define MAX_TECHNIQUES 130&lt;br /&gt;
 #elif defined(MW3)&lt;br /&gt;
  #define MAX_TECHNIQUES 54&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
struct MaterialTechniqueSet &lt;br /&gt;
{&lt;br /&gt;
	char *name;&lt;br /&gt;
	MaterialWorldVertexFormat worldVertFormat;&lt;br /&gt;
	MaterialTechnique *techniques[MAX_TECHNIQUES];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Black Ops 2 ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialArgumentCodeConst &lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 index;&lt;br /&gt;
  char firstRow;&lt;br /&gt;
  char rowCount;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union MaterialArgumentDef &lt;br /&gt;
{&lt;br /&gt;
  const float *literalConst;&lt;br /&gt;
  MaterialArgumentCodeConst codeConst;&lt;br /&gt;
  unsigned int codeSampler;&lt;br /&gt;
  unsigned int nameHash;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialShaderArgument-&amp;gt;type */&lt;br /&gt;
#define MTL_ARG_MATERIAL_VERTEX_CONST	0x0&lt;br /&gt;
#define MTL_ARG_LITERAL_VERTEX_CONST	0x1&lt;br /&gt;
#define MTL_ARG_MATERIAL_PIXEL_SAMPLER	0x2&lt;br /&gt;
#define  MTL_ARG_CODE_PRIM_BEGIN	0x3&lt;br /&gt;
#define MTL_ARG_CODE_VERTEX_CONST	0x3&lt;br /&gt;
#define MTL_ARG_CODE_PIXEL_SAMPLER	0x4&lt;br /&gt;
#define MTL_ARG_CODE_PIXEL_CONST	0x5&lt;br /&gt;
#define MTL_ARG_MATERIAL_PIXEL_CONST	0x6&lt;br /&gt;
#define  MTL_ARG_CODE_PRIM_END		0x6&lt;br /&gt;
#define MTL_ARG_LITERAL_PIXEL_CONST	0x7&lt;br /&gt;
#define MLT_ARG_COUNT			0x8&lt;br /&gt;
&lt;br /&gt;
struct MaterialShaderArgument&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 type;&lt;br /&gt;
  unsigned __int16 dest;&lt;br /&gt;
  MaterialArgumentDef u;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialStreamRouting&lt;br /&gt;
{&lt;br /&gt;
  char source;&lt;br /&gt;
  char dest;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexStreamRouting&lt;br /&gt;
{&lt;br /&gt;
  MaterialStreamRouting data[16];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexDeclaration&lt;br /&gt;
{&lt;br /&gt;
  char streamCount;&lt;br /&gt;
  bool hasOptionalSource;&lt;br /&gt;
  MaterialVertexStreamRouting routing;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxVertexShaderLoadDef&lt;br /&gt;
{&lt;br /&gt;
  char *cachedPart;&lt;br /&gt;
  char *physicalPart;&lt;br /&gt;
  unsigned __int16 cachedPartSize;&lt;br /&gt;
  unsigned __int16 physicalPartSize;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexShaderProgram&lt;br /&gt;
{&lt;br /&gt;
  D3DVertexShader *vs;&lt;br /&gt;
  GfxVertexShaderLoadDef loadDef;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexShader&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  MaterialVertexShaderProgram prog;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxPixelShaderLoadDef&lt;br /&gt;
{&lt;br /&gt;
  char *cachedPart;&lt;br /&gt;
  char *physicalPart;&lt;br /&gt;
  unsigned __int16 cachedPartSize;&lt;br /&gt;
  unsigned __int16 physicalPartSize;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union MaterialPixelShaderProgram&lt;br /&gt;
{&lt;br /&gt;
  D3DPixelShader *ps;&lt;br /&gt;
  GfxPixelShaderLoadDef loadDef;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialPixelShader&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  MaterialPixelShaderProgram prog;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#pragma pack(push, 4)&lt;br /&gt;
struct MaterialPass &lt;br /&gt;
{&lt;br /&gt;
  MaterialVertexDeclaration *vertexDecl;&lt;br /&gt;
  MaterialVertexShader *vertexShader;&lt;br /&gt;
  union&lt;br /&gt;
  {&lt;br /&gt;
    MaterialPixelShader *pixelShader;&lt;br /&gt;
    MaterialPixelShader *localPixelShader;&lt;br /&gt;
  };&lt;br /&gt;
  char perPrimArgCount;&lt;br /&gt;
  char perObjArgCount;&lt;br /&gt;
  char stableArgCount;&lt;br /&gt;
  char customSamplerFlags;&lt;br /&gt;
  char precompiledIndex;&lt;br /&gt;
  char materialType;  //It is unknown wether this is used/exists on Xbox or PS3.&lt;br /&gt;
  union&lt;br /&gt;
  {&lt;br /&gt;
    MaterialShaderArgument *args;&lt;br /&gt;
    MaterialShaderArgument *localArgs;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
#pragma pack(pop)&lt;br /&gt;
&lt;br /&gt;
struct MaterialTechnique&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  unsigned __int16 flags;&lt;br /&gt;
  unsigned __int16 passCount;&lt;br /&gt;
  MaterialPass passArray;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialTechniqueSet-&amp;gt;worldVertFormat */&lt;br /&gt;
enum MaterialWorldVertexFormat : char&lt;br /&gt;
{&lt;br /&gt;
  MTL_WORLDVERT_TEX_1_NRM_1 = 0x0,&lt;br /&gt;
  MTL_WORLDVERT_TEX_2_NRM_1 = 0x1,&lt;br /&gt;
  MTL_WORLDVERT_TEX_2_NRM_2 = 0x2,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_1 = 0x3,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_2 = 0x4,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_3 = 0x5,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_1 = 0x6,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_2 = 0x7,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_3 = 0x8,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_1 = 0x9,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_2 = 0xA,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_3 = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#ifdef PS3&lt;br /&gt;
  #define MAX_TECHNIQUES 32&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef XBOX&lt;br /&gt;
  #define MAX_TECHNIQUES 36&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef PC&lt;br /&gt;
 #define MAX_TECHNIQUES 36&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
struct MaterialTechniqueSet &lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  MaterialWorldVertexFormat worldVertFormat;&lt;br /&gt;
  MaterialTechnique *techniques[MAX_TECHNIQUES];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Technique_Set_Asset&amp;diff=1066</id>
		<title>Technique Set Asset</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Technique_Set_Asset&amp;diff=1066"/>
		<updated>2026-07-01T20:18:27Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Category:Assets]]&lt;br /&gt;
[[Category:CoD4]]&lt;br /&gt;
[[Category:WaW]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
[[Category:BO1]]&lt;br /&gt;
[[Category:MW3]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
[[Category:Ghosts]]&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialArgumentCodeConst &lt;br /&gt;
{&lt;br /&gt;
	unsigned __int16 index;&lt;br /&gt;
	char firstRow;&lt;br /&gt;
	char rowCount;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union MaterialArgumentDef &lt;br /&gt;
{&lt;br /&gt;
	const float *literalConst;&lt;br /&gt;
	MaterialArgumentCodeConst codeConst;&lt;br /&gt;
	unsigned int codeSampler;&lt;br /&gt;
	unsigned int nameHash;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialShaderArgument-&amp;gt;type */&lt;br /&gt;
#define MTL_ARG_MATERIAL_VERTEX_CONST	0x0&lt;br /&gt;
#define MTL_ARG_LITERAL_VERTEX_CONST	0x1&lt;br /&gt;
#define MTL_ARG_MATERIAL_PIXEL_SAMPLER	0x2&lt;br /&gt;
#define  MTL_ARG_CODE_PRIM_BEGIN	0x3&lt;br /&gt;
#define MTL_ARG_CODE_VERTEX_CONST	0x3&lt;br /&gt;
#define MTL_ARG_CODE_PIXEL_SAMPLER	0x4&lt;br /&gt;
#define MTL_ARG_CODE_PIXEL_CONST	0x5&lt;br /&gt;
#define MTL_ARG_MATERIAL_PIXEL_CONST	0x6&lt;br /&gt;
#define  MTL_ARG_CODE_PRIM_END		0x6&lt;br /&gt;
#define MTL_ARG_LITERAL_PIXEL_CONST	0x7&lt;br /&gt;
#define MLT_ARG_COUNT			0x8&lt;br /&gt;
&lt;br /&gt;
struct MaterialShaderArgument&lt;br /&gt;
{&lt;br /&gt;
	unsigned __int16 type;&lt;br /&gt;
	unsigned __int16 dest;&lt;br /&gt;
	MaterialArgumentDef u;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexStreamRouting&lt;br /&gt;
{&lt;br /&gt;
    unsigned char Source;&lt;br /&gt;
    unsigned char Dest;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexDeclaration&lt;br /&gt;
{&lt;br /&gt;
#if defined(COD4) || defined(WAW) || defined(BO1)&lt;br /&gt;
	char unknown[0x22];&lt;br /&gt;
#elif defined(MW2) || defined(MW3)&lt;br /&gt;
    unsigned char StreamCount;&lt;br /&gt;
    unsigned char HasOptionalSource;&lt;br /&gt;
    MaterialVertexStreamRouting Routing[13];&lt;br /&gt;
#elif defined(GHOSTS)&lt;br /&gt;
	char unknown[0x20];&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#pragma pack(push, 4)&lt;br /&gt;
struct MaterialPass &lt;br /&gt;
{&lt;br /&gt;
	MaterialVertexDeclaration *vertexDecl;&lt;br /&gt;
	MaterialVertexShader *vertexShader;&lt;br /&gt;
	MaterialPixelShader *pixelShader;&lt;br /&gt;
	char perPrimArgCount;&lt;br /&gt;
	char perObjArgCount;&lt;br /&gt;
	char stableArgCount;&lt;br /&gt;
	char customSamplerFlags;&lt;br /&gt;
	char precompiledIndex;&lt;br /&gt;
	MaterialShaderArgument *args;&lt;br /&gt;
};&lt;br /&gt;
#pragma pack(pop)&lt;br /&gt;
&lt;br /&gt;
struct MaterialTechnique &lt;br /&gt;
{&lt;br /&gt;
	const char *name;&lt;br /&gt;
	unsigned __int16 flags;&lt;br /&gt;
	unsigned __int16 passCount;&lt;br /&gt;
	MaterialPass passArray[1];	// count = passCount&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialTechniqueSet-&amp;gt;worldVertFormat */&lt;br /&gt;
enum MaterialWorldVertexFormat : char&lt;br /&gt;
{&lt;br /&gt;
  MTL_WORLDVERT_TEX_1_NRM_1 = 0x0,&lt;br /&gt;
  MTL_WORLDVERT_TEX_2_NRM_1 = 0x1,&lt;br /&gt;
  MTL_WORLDVERT_TEX_2_NRM_2 = 0x2,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_1 = 0x3,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_2 = 0x4,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_3 = 0x5,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_1 = 0x6,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_2 = 0x7,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_3 = 0x8,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_1 = 0x9,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_2 = 0xA,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_3 = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#ifdef PS3&lt;br /&gt;
 #ifdef COD4&lt;br /&gt;
  #define MAX_TECHNIQUES 26&lt;br /&gt;
 #elif defined(WAW)&lt;br /&gt;
  #define MAX_TECHNIQUES 51&lt;br /&gt;
 #elif defined(MW2)&lt;br /&gt;
  #define MAX_TECHNIQUES 37&lt;br /&gt;
 #elif defined(BO1)&lt;br /&gt;
  #define MAX_TECHNIQUES 71&lt;br /&gt;
 #elif defined(MW3)&lt;br /&gt;
  #define MAX_TECHNIQUES 41&lt;br /&gt;
 #elif defined(GHOSTS)&lt;br /&gt;
  #define MAX_TECHNIQUES 39&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef XBOX&lt;br /&gt;
 #ifdef COD4&lt;br /&gt;
  #define MAX_TECHNIQUES 26&lt;br /&gt;
 #elif defined(WAW)&lt;br /&gt;
  #define MAX_TECHNIQUES 51&lt;br /&gt;
 #elif defined(MW2)&lt;br /&gt;
  #define MAX_TECHNIQUES 33&lt;br /&gt;
 #elif defined(BO1)&lt;br /&gt;
  #define MAX_TECHNIQUES 71&lt;br /&gt;
 #elif defined(MW3)&lt;br /&gt;
  #define MAX_TECHNIQUES 37&lt;br /&gt;
 #elif defined(GHOSTS)&lt;br /&gt;
  #define MAX_TECHNIQUES 36&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef PC&lt;br /&gt;
 #ifdef COD4&lt;br /&gt;
  #define MAX_TECHNIQUES 34&lt;br /&gt;
 #elif defined(WAW)&lt;br /&gt;
  #define MAX_TECHNIQUES 59&lt;br /&gt;
 #elif defined(MW2)&lt;br /&gt;
  #define MAX_TECHNIQUES 48&lt;br /&gt;
 #elif defined(BO1)&lt;br /&gt;
  #define MAX_TECHNIQUES 130&lt;br /&gt;
 #elif defined(MW3)&lt;br /&gt;
  #define MAX_TECHNIQUES 54&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
struct MaterialTechniqueSet &lt;br /&gt;
{&lt;br /&gt;
	char *name;&lt;br /&gt;
	MaterialWorldVertexFormat worldVertFormat;&lt;br /&gt;
	MaterialTechnique *techniques[MAX_TECHNIQUES];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Black Ops 2 ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialArgumentCodeConst &lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 index;&lt;br /&gt;
  char firstRow;&lt;br /&gt;
  char rowCount;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union MaterialArgumentDef &lt;br /&gt;
{&lt;br /&gt;
  const float *literalConst;&lt;br /&gt;
  MaterialArgumentCodeConst codeConst;&lt;br /&gt;
  unsigned int codeSampler;&lt;br /&gt;
  unsigned int nameHash;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialShaderArgument-&amp;gt;type */&lt;br /&gt;
#define MTL_ARG_MATERIAL_VERTEX_CONST	0x0&lt;br /&gt;
#define MTL_ARG_LITERAL_VERTEX_CONST	0x1&lt;br /&gt;
#define MTL_ARG_MATERIAL_PIXEL_SAMPLER	0x2&lt;br /&gt;
#define  MTL_ARG_CODE_PRIM_BEGIN	0x3&lt;br /&gt;
#define MTL_ARG_CODE_VERTEX_CONST	0x3&lt;br /&gt;
#define MTL_ARG_CODE_PIXEL_SAMPLER	0x4&lt;br /&gt;
#define MTL_ARG_CODE_PIXEL_CONST	0x5&lt;br /&gt;
#define MTL_ARG_MATERIAL_PIXEL_CONST	0x6&lt;br /&gt;
#define  MTL_ARG_CODE_PRIM_END		0x6&lt;br /&gt;
#define MTL_ARG_LITERAL_PIXEL_CONST	0x7&lt;br /&gt;
#define MLT_ARG_COUNT			0x8&lt;br /&gt;
&lt;br /&gt;
struct MaterialShaderArgument&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 type;&lt;br /&gt;
  unsigned __int16 dest;&lt;br /&gt;
  MaterialArgumentDef u;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialStreamRouting&lt;br /&gt;
{&lt;br /&gt;
  char source;&lt;br /&gt;
  char dest;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexStreamRouting&lt;br /&gt;
{&lt;br /&gt;
  MaterialStreamRouting data[16];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexDeclaration&lt;br /&gt;
{&lt;br /&gt;
  char streamCount;&lt;br /&gt;
  bool hasOptionalSource;&lt;br /&gt;
  MaterialVertexStreamRouting routing;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxVertexShaderLoadDef&lt;br /&gt;
{&lt;br /&gt;
  char *cachedPart;&lt;br /&gt;
  char *physicalPart;&lt;br /&gt;
  unsigned __int16 cachedPartSize;&lt;br /&gt;
  unsigned __int16 physicalPartSize;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexShaderProgram&lt;br /&gt;
{&lt;br /&gt;
  D3DVertexShader *vs;&lt;br /&gt;
  GfxVertexShaderLoadDef loadDef;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialVertexShader&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  MaterialVertexShaderProgram prog;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxPixelShaderLoadDef&lt;br /&gt;
{&lt;br /&gt;
  char *cachedPart;&lt;br /&gt;
  char *physicalPart;&lt;br /&gt;
  unsigned __int16 cachedPartSize;&lt;br /&gt;
  unsigned __int16 physicalPartSize;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union MaterialPixelShaderProgram&lt;br /&gt;
{&lt;br /&gt;
  D3DPixelShader *ps;&lt;br /&gt;
  GfxPixelShaderLoadDef loadDef;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialPixelShader&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  MaterialPixelShaderProgram prog;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#pragma pack(push, 4)&lt;br /&gt;
struct MaterialPass &lt;br /&gt;
{&lt;br /&gt;
  MaterialVertexDeclaration *vertexDecl;&lt;br /&gt;
  MaterialVertexShader *vertexShader;&lt;br /&gt;
  union&lt;br /&gt;
  {&lt;br /&gt;
    MaterialPixelShader *pixelShader;&lt;br /&gt;
    MaterialPixelShader *localPixelShader;&lt;br /&gt;
  };&lt;br /&gt;
  char perPrimArgCount;&lt;br /&gt;
  char perObjArgCount;&lt;br /&gt;
  char stableArgCount;&lt;br /&gt;
  char customSamplerFlags;&lt;br /&gt;
  char precompiledIndex;&lt;br /&gt;
  char materialType;  //It is unknown wether this is used/exists on Xbox or PS3.&lt;br /&gt;
  union&lt;br /&gt;
  {&lt;br /&gt;
    MaterialShaderArgument *args;&lt;br /&gt;
    MaterialShaderArgument *localArgs;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
#pragma pack(pop)&lt;br /&gt;
&lt;br /&gt;
struct MaterialTechnique&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  unsigned __int16 flags;&lt;br /&gt;
  unsigned __int16 passCount;&lt;br /&gt;
  MaterialPass passArray;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialTechniqueSet-&amp;gt;worldVertFormat */&lt;br /&gt;
enum MaterialWorldVertexFormat : char&lt;br /&gt;
{&lt;br /&gt;
  MTL_WORLDVERT_TEX_1_NRM_1 = 0x0,&lt;br /&gt;
  MTL_WORLDVERT_TEX_2_NRM_1 = 0x1,&lt;br /&gt;
  MTL_WORLDVERT_TEX_2_NRM_2 = 0x2,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_1 = 0x3,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_2 = 0x4,&lt;br /&gt;
  MTL_WORLDVERT_TEX_3_NRM_3 = 0x5,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_1 = 0x6,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_2 = 0x7,&lt;br /&gt;
  MTL_WORLDVERT_TEX_4_NRM_3 = 0x8,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_1 = 0x9,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_2 = 0xA,&lt;br /&gt;
  MTL_WORLDVERT_TEX_5_NRM_3 = 0xB,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#ifdef PS3&lt;br /&gt;
  #define MAX_TECHNIQUES 32&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef XBOX&lt;br /&gt;
  #define MAX_TECHNIQUES 36&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
#ifdef PC&lt;br /&gt;
 #define MAX_TECHNIQUES 36&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
struct MaterialTechniqueSet &lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  MaterialWorldVertexFormat worldVertFormat;&lt;br /&gt;
  MaterialTechnique *techniques[MAX_TECHNIQUES];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Modern_Warfare_PAK_Files&amp;diff=1065</id>
		<title>Modern Warfare PAK Files</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Modern_Warfare_PAK_Files&amp;diff=1065"/>
		<updated>2026-06-30T06:55:36Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Imagefile */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:PAK Files]]&lt;br /&gt;
[[Category:CoD4]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
[[Category:MW3]]&lt;br /&gt;
[[Category:AW]]&lt;br /&gt;
&lt;br /&gt;
There are two different types of PAK files used by the Modern Warfare series (MW, MW2, MW3) and Advanced Warfare, Packfiles and Imagefiles. Packfiles store audio data and Imagefiles store image data. Both use the same extension (.pak).&lt;br /&gt;
&lt;br /&gt;
== Imagefile ==&lt;br /&gt;
Uses the same common header as all fastfiles do. After the header is nothing else but the data.&lt;br /&gt;
=== Header ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Offset !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Magic || 0x0 || &amp;quot;IWffu100&amp;quot; or &amp;quot;S1ffu100&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Version || 0x4 || See [[:Category:FastFiles|fastfile versions]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On PS3, the compression method is the same as it is for fastfiles. Image data is concatenated as one file, split into blocks each 0x10000 bytes, then each block is compressed, and appended to the file.&lt;br /&gt;
&lt;br /&gt;
On XBOX, each image&#039;s data is compressed, then appended to the file.&lt;br /&gt;
&lt;br /&gt;
No image headers are stored in these files. See https://codresearch.dev/index.php/FastFiles_and_Zone_files_(MW2)&lt;br /&gt;
&lt;br /&gt;
Entries are the serialized source ranges and logical decode positions for streamed GfxImage payloads.&lt;br /&gt;
&lt;br /&gt;
== Packfile ==&lt;br /&gt;
=== Header ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Description !! Offset !! Size&lt;br /&gt;
|-&lt;br /&gt;
| Hash || 0x0 || 4 &lt;br /&gt;
|-&lt;br /&gt;
| Alignment || 0x4 || PS3: 0x7FC&amp;lt;br/&amp;gt;XBOX: 0x46C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The header is only found on Modern Warfare 2 &amp;amp; 3. After the header is the audio data. Each audio file is concatenated and aligned (by 0x800 on PS3). These sounds are known as streamed sounds. They are loaded through [[:Sound_Asset#Infinity_Ward|sound alias list]] assets by offsets (in StreamedSound).&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Modern_Warfare_PAK_Files&amp;diff=1064</id>
		<title>Modern Warfare PAK Files</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Modern_Warfare_PAK_Files&amp;diff=1064"/>
		<updated>2026-06-30T06:55:04Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Imagefile */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:PAK Files]]&lt;br /&gt;
[[Category:CoD4]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
[[Category:MW3]]&lt;br /&gt;
[[Category:AW]]&lt;br /&gt;
&lt;br /&gt;
There are two different types of PAK files used by the Modern Warfare series (MW, MW2, MW3) and Advanced Warfare, Packfiles and Imagefiles. Packfiles store audio data and Imagefiles store image data. Both use the same extension (.pak).&lt;br /&gt;
&lt;br /&gt;
== Imagefile ==&lt;br /&gt;
Uses the same common header as all fastfiles do. After the header is nothing else but the data.&lt;br /&gt;
=== Header ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Offset !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Magic || 0x0 || &amp;quot;IWffu100&amp;quot; or &amp;quot;S1ffu100&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| Version || 0x4 || See [[:Category:FastFiles|fastfile versions]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On PS3, the compression method is the same as it is for fastfiles. Image data is concatenated as one file, split into blocks each 0x10000 bytes, then each block is compressed, and appended to the file.&lt;br /&gt;
&lt;br /&gt;
On XBOX, each image&#039;s data is compressed, then appended to the file.&lt;br /&gt;
&lt;br /&gt;
No image headers are stored in these files. See (https://codresearch.dev/index.php/FastFiles_and_Zone_files_(MW2))&lt;br /&gt;
&lt;br /&gt;
Entries are the serialized source ranges and logical decode positions for streamed GfxImage payloads.&lt;br /&gt;
&lt;br /&gt;
== Packfile ==&lt;br /&gt;
=== Header ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Description !! Offset !! Size&lt;br /&gt;
|-&lt;br /&gt;
| Hash || 0x0 || 4 &lt;br /&gt;
|-&lt;br /&gt;
| Alignment || 0x4 || PS3: 0x7FC&amp;lt;br/&amp;gt;XBOX: 0x46C&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The header is only found on Modern Warfare 2 &amp;amp; 3. After the header is the audio data. Each audio file is concatenated and aligned (by 0x800 on PS3). These sounds are known as streamed sounds. They are loaded through [[:Sound_Asset#Infinity_Ward|sound alias list]] assets by offsets (in StreamedSound).&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Game_Map_Asset&amp;diff=1063</id>
		<title>Game Map Asset</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Game_Map_Asset&amp;diff=1063"/>
		<updated>2026-06-30T02:32:50Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Multiplayer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Category:Assets]]&lt;br /&gt;
[[Category:CoD4]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
[[Category:WaW]]&lt;br /&gt;
[[Category:BO1]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
The game map (or game world) is part of the D3DBSP system produced by Radiant, and is on every Call of Duty game except for Modern Warfare 3 and Ghosts. This contains scripting information for the map, such as AI pathing information.&lt;br /&gt;
== Call of Duty 4 Single Player &amp;amp; World at War &amp;amp; Black Ops 1 ==&lt;br /&gt;
For World at War and Black Ops 1, the MP and SP assets are identical.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum nodeType&lt;br /&gt;
{&lt;br /&gt;
  NODE_BADNODE = 0x0,&lt;br /&gt;
  NODE_PATHNODE = 0x1,&lt;br /&gt;
  NODE_COVER_STAND = 0x2,&lt;br /&gt;
  NODE_COVER_CROUCH = 0x3,&lt;br /&gt;
  NODE_COVER_CROUCH_WINDOW = 0x4,&lt;br /&gt;
  NODE_COVER_PRONE = 0x5,&lt;br /&gt;
  NODE_COVER_RIGHT = 0x6,&lt;br /&gt;
  NODE_COVER_LEFT = 0x7,&lt;br /&gt;
  NODE_COVER_WIDE_RIGHT = 0x8,&lt;br /&gt;
  NODE_COVER_WIDE_LEFT = 0x9,&lt;br /&gt;
  NODE_CONCEALMENT_STAND = 0xA,&lt;br /&gt;
  NODE_CONCEALMENT_CROUCH = 0xB,&lt;br /&gt;
  NODE_CONCEALMENT_PRONE = 0xC,&lt;br /&gt;
  NODE_REACQUIRE = 0xD,&lt;br /&gt;
  NODE_BALCONY = 0xE,&lt;br /&gt;
  NODE_SCRIPTED = 0xF,&lt;br /&gt;
  NODE_NEGOTIATION_BEGIN = 0x10,&lt;br /&gt;
  NODE_NEGOTIATION_END = 0x11,&lt;br /&gt;
  NODE_TURRET = 0x12,&lt;br /&gt;
  NODE_GUARD = 0x13,&lt;br /&gt;
  NODE_NUMTYPES = 0x14,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathlink_s&lt;br /&gt;
{&lt;br /&gt;
  float fDist;&lt;br /&gt;
  unsigned __int16 nodeNum;&lt;br /&gt;
  char disconnectCount;&lt;br /&gt;
  char negotiationLink;&lt;br /&gt;
  char ubBadPlaceCount[4];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_constant_t&lt;br /&gt;
{&lt;br /&gt;
  nodeType type;&lt;br /&gt;
  unsigned __int16 spawnflags;&lt;br /&gt;
  ScriptString targetname;&lt;br /&gt;
  ScriptString script_linkName;&lt;br /&gt;
  ScriptString script_noteworthy;&lt;br /&gt;
  ScriptString target;&lt;br /&gt;
  ScriptString animscript;&lt;br /&gt;
  int animscriptfunc;&lt;br /&gt;
  float vOrigin[3];&lt;br /&gt;
  float fAngle;&lt;br /&gt;
  float forward[2];&lt;br /&gt;
  float fRadius;&lt;br /&gt;
  float minUseDistSq;&lt;br /&gt;
  __int16 wOverlapNode[2];&lt;br /&gt;
  __int16 wChainId;&lt;br /&gt;
  __int16 wChainDepth;&lt;br /&gt;
  __int16 wChainParent;&lt;br /&gt;
  unsigned __int16 totalLinkCount;&lt;br /&gt;
  pathlink_s *Links;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_dynamic_t&lt;br /&gt;
{&lt;br /&gt;
  struct sentient_s *pOwner;&lt;br /&gt;
  int iFreeTime;&lt;br /&gt;
  int iValidTime[3];&lt;br /&gt;
  int inPlayerLOSTime;&lt;br /&gt;
  __int16 wLinkCount;&lt;br /&gt;
  __int16 wOverlapCount;&lt;br /&gt;
  __int16 turretEntNumber;&lt;br /&gt;
  __int16 userCount;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_t&lt;br /&gt;
{&lt;br /&gt;
  pathnode_constant_t constant;&lt;br /&gt;
  pathnode_dynamic_t dynamic;&lt;br /&gt;
  pathnode_transient_t transient;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_transient_t&lt;br /&gt;
{&lt;br /&gt;
  int iSearchFrame;&lt;br /&gt;
  pathnode_t *pNextOpen;&lt;br /&gt;
  pathnode_t *pPrevOpen;&lt;br /&gt;
  pathnode_t *pParent;&lt;br /&gt;
  float fCost;&lt;br /&gt;
  float fHeuristic;&lt;br /&gt;
  float costFactor;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_tree_t&lt;br /&gt;
{&lt;br /&gt;
  int axis;&lt;br /&gt;
  float dist;&lt;br /&gt;
  pathnode_tree_info_t u;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_tree_nodes_t&lt;br /&gt;
{&lt;br /&gt;
  int nodeCount;&lt;br /&gt;
  unsigned short **nodes;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union pathnode_tree_info_t&lt;br /&gt;
{&lt;br /&gt;
  pathnode_tree_t *child[2];&lt;br /&gt;
  pathnode_tree_nodes_t s;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typdef char pathbasenode_t[0x10];&lt;br /&gt;
&lt;br /&gt;
struct PathData&lt;br /&gt;
{&lt;br /&gt;
  unsigned int nodeCount;&lt;br /&gt;
  pathnode_t *nodes;&lt;br /&gt;
  pathbasenode_t *nodeBases;&lt;br /&gt;
  unsigned int chainNodeCount;&lt;br /&gt;
  unsigned __int16 *chainNodeForNode;&lt;br /&gt;
  unsigned __int16 *nodeForChainNode;&lt;br /&gt;
  int visBytes;&lt;br /&gt;
  char *pathVis;&lt;br /&gt;
  int nodeTreeCount;&lt;br /&gt;
  pathnode_tree_t *nodeTree;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GameWorldSp&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  PathData path;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Black Ops 2 ==&lt;br /&gt;
The Black Ops 2 game maps (which are loaded exactly the same) are slightly different from its predecessors. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum nodeType&lt;br /&gt;
{&lt;br /&gt;
  NODE_BADNODE = 0x0,&lt;br /&gt;
  NODE_PATHNODE = 0x1,&lt;br /&gt;
  NODE_COVER_STAND = 0x2,&lt;br /&gt;
  NODE_COVER_CROUCH = 0x3,&lt;br /&gt;
  NODE_COVER_CROUCH_WINDOW = 0x4,&lt;br /&gt;
  NODE_COVER_PRONE = 0x5,&lt;br /&gt;
  NODE_COVER_RIGHT = 0x6,&lt;br /&gt;
  NODE_COVER_LEFT = 0x7,&lt;br /&gt;
  NODE_COVER_PILLAR = 0x8,&lt;br /&gt;
  NODE_AMBUSH = 0x9,&lt;br /&gt;
  NODE_EXPOSED = 0xA,&lt;br /&gt;
  NODE_CONCEALMENT_STAND = 0xB,&lt;br /&gt;
  NODE_CONCEALMENT_CROUCH = 0xC,&lt;br /&gt;
  NODE_CONCEALMENT_PRONE = 0xD,&lt;br /&gt;
  NODE_REACQUIRE = 0xE,&lt;br /&gt;
  NODE_BALCONY = 0xF,&lt;br /&gt;
  NODE_SCRIPTED = 0x10,&lt;br /&gt;
  NODE_NEGOTIATION_BEGIN = 0x11,&lt;br /&gt;
  NODE_NEGOTIATION_END = 0x12,&lt;br /&gt;
  NODE_TURRET = 0x13,&lt;br /&gt;
  NODE_GUARD = 0x14,&lt;br /&gt;
  NODE_NUMTYPES = 0x15,&lt;br /&gt;
  NODE_DONTLINK = 0x15,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathlink_s&lt;br /&gt;
{&lt;br /&gt;
  float fDist;&lt;br /&gt;
  unsigned __int16 nodeNum;&lt;br /&gt;
  char disconnectCount;&lt;br /&gt;
  char negotiationLink;&lt;br /&gt;
  char flags;&lt;br /&gt;
  char ubBadPlaceCount[5];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_constant_t&lt;br /&gt;
{&lt;br /&gt;
  nodeType type;&lt;br /&gt;
  int spawnflags;&lt;br /&gt;
  ScriptString targetname;&lt;br /&gt;
  ScriptString script_linkName;&lt;br /&gt;
  ScriptString script_noteworthy;&lt;br /&gt;
  ScriptString target;&lt;br /&gt;
  ScriptString animscript;&lt;br /&gt;
  int animscriptfunc;&lt;br /&gt;
  vec3_t vOrigin;&lt;br /&gt;
  float fAngle;&lt;br /&gt;
  vec2_t forward;&lt;br /&gt;
  float fRadius;&lt;br /&gt;
  float minUseDistSq;&lt;br /&gt;
  __int16 wOverlapNode[2];&lt;br /&gt;
  unsigned __int16 totalLinkCount;&lt;br /&gt;
  pathlink_s *Links;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SentientHandle&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 number;&lt;br /&gt;
  unsigned __int16 infoIndex;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_dynamic_t&lt;br /&gt;
{&lt;br /&gt;
  SentientHandle pOwner;&lt;br /&gt;
  int iFreeTime;&lt;br /&gt;
  int iValidTime[3];&lt;br /&gt;
  int dangerousNodeTime[3];&lt;br /&gt;
  int inPlayerLOSTime;&lt;br /&gt;
  __int16 wLinkCount;&lt;br /&gt;
  __int16 wOverlapCount;&lt;br /&gt;
  __int16 turretEntNumber;&lt;br /&gt;
  __int16 userCount;&lt;br /&gt;
  bool hasBadPlaceLink;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_transient_t&lt;br /&gt;
{&lt;br /&gt;
  int iSearchFrame;&lt;br /&gt;
  pathnode_t *pNextOpen;&lt;br /&gt;
  pathnode_t *pPrevOpen;&lt;br /&gt;
  pathnode_t *pParent;&lt;br /&gt;
  float fCost;&lt;br /&gt;
  float fHeuristic;&lt;br /&gt;
  union&lt;br /&gt;
  {&lt;br /&gt;
    float nodeCost;&lt;br /&gt;
    float linkIndex;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_t&lt;br /&gt;
{&lt;br /&gt;
  pathnode_constant_t constant;&lt;br /&gt;
  pathnode_dynamic_t dynamic;&lt;br /&gt;
  pathnode_transient_t transient;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_tree_nodes_t&lt;br /&gt;
{&lt;br /&gt;
  int nodeCount;&lt;br /&gt;
  unsigned __int16 *nodes;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union pathnode_tree_info_t&lt;br /&gt;
{&lt;br /&gt;
  pathnode_tree_t *child[2];&lt;br /&gt;
  pathnode_tree_nodes_t s;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_tree_t&lt;br /&gt;
{&lt;br /&gt;
  int axis;&lt;br /&gt;
  float dist;&lt;br /&gt;
  pathnode_tree_info_t u;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathbasenode_t&lt;br /&gt;
{&lt;br /&gt;
  vec3_t vOrigin;&lt;br /&gt;
  unsigned int type;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct PathData&lt;br /&gt;
{&lt;br /&gt;
  unsigned int nodeCount;&lt;br /&gt;
  unsigned int originalNodeCount;&lt;br /&gt;
  pathnode_t *nodes;&lt;br /&gt;
  pathbasenode_t *nodeBases;&lt;br /&gt;
  int visBytes;&lt;br /&gt;
  char *pathVis;&lt;br /&gt;
  int smoothBytes;&lt;br /&gt;
  char *smoothCache;&lt;br /&gt;
  int nodeTreeCount;&lt;br /&gt;
  pathnode_tree_t *nodeTree;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GameWorldSp&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  PathData path;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GameWorldMp&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  PathData path;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Call of Duty 4 Multiplayer ==&lt;br /&gt;
The multiplayer Call of Duty 4 game world is pretty much unneeded. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct GameWorldMp&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Modern Warfare 2 ==&lt;br /&gt;
=== Single Player ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum nodeType&lt;br /&gt;
{&lt;br /&gt;
  NODE_BADNODE = 0x0,&lt;br /&gt;
  NODE_PATHNODE = 0x1,&lt;br /&gt;
  NODE_COVER_STAND = 0x2,&lt;br /&gt;
  NODE_COVER_CROUCH = 0x3,&lt;br /&gt;
  NODE_COVER_CROUCH_WINDOW = 0x4,&lt;br /&gt;
  NODE_COVER_PRONE = 0x5,&lt;br /&gt;
  NODE_COVER_RIGHT = 0x6,&lt;br /&gt;
  NODE_COVER_LEFT = 0x7,&lt;br /&gt;
  NODE_COVER_WIDE_RIGHT = 0x8,&lt;br /&gt;
  NODE_COVER_WIDE_LEFT = 0x9,&lt;br /&gt;
  NODE_CONCEALMENT_STAND = 0xA,&lt;br /&gt;
  NODE_CONCEALMENT_CROUCH = 0xB,&lt;br /&gt;
  NODE_CONCEALMENT_PRONE = 0xC,&lt;br /&gt;
  NODE_REACQUIRE = 0xD,&lt;br /&gt;
  NODE_BALCONY = 0xE,&lt;br /&gt;
  NODE_SCRIPTED = 0xF,&lt;br /&gt;
  NODE_NEGOTIATION_BEGIN = 0x10,&lt;br /&gt;
  NODE_NEGOTIATION_END = 0x11,&lt;br /&gt;
  NODE_TURRET = 0x12,&lt;br /&gt;
  NODE_GUARD = 0x13,&lt;br /&gt;
  NODE_NUMTYPES = 0x14,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathlink_s&lt;br /&gt;
{&lt;br /&gt;
  float fDist;&lt;br /&gt;
  unsigned __int16 nodeNum;&lt;br /&gt;
  char disconnectCount;&lt;br /&gt;
  char negotiationLink;&lt;br /&gt;
  char ubBadPlaceCount[4];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_constant_t&lt;br /&gt;
{&lt;br /&gt;
  nodeType type;&lt;br /&gt;
  unsigned __int16 spawnflags;&lt;br /&gt;
  ScriptString targetname;&lt;br /&gt;
  ScriptString script_linkName;&lt;br /&gt;
  ScriptString script_noteworthy;&lt;br /&gt;
  ScriptString target;&lt;br /&gt;
  ScriptString animscript;&lt;br /&gt;
  int animscriptfunc;&lt;br /&gt;
  float vOrigin[3];&lt;br /&gt;
  float fAngle;&lt;br /&gt;
  float forward[2];&lt;br /&gt;
  float fRadius;&lt;br /&gt;
  float minUseDistSq;&lt;br /&gt;
  __int16 wOverlapNode[2];&lt;br /&gt;
  unsigned __int16 totalLinkCount;&lt;br /&gt;
  pathlink_s *Links;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_t&lt;br /&gt;
{&lt;br /&gt;
  pathnode_constant_t constant;&lt;br /&gt;
       char unknown[0x48];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_tree_t&lt;br /&gt;
{&lt;br /&gt;
  int axis;&lt;br /&gt;
  float dist;&lt;br /&gt;
  pathnode_tree_info_t u;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_tree_nodes_t&lt;br /&gt;
{&lt;br /&gt;
  int nodeCount;&lt;br /&gt;
  unsigned short **nodes;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union pathnode_tree_info_t&lt;br /&gt;
{&lt;br /&gt;
  pathnode_tree_t *child[2];&lt;br /&gt;
  pathnode_tree_nodes_t s;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typdef char pathbasenode_t[0x10];&lt;br /&gt;
&lt;br /&gt;
struct PathData&lt;br /&gt;
{&lt;br /&gt;
  unsigned int nodeCount;&lt;br /&gt;
  pathnode_t *nodes;&lt;br /&gt;
  pathbasenode_t *nodeBases;&lt;br /&gt;
  unsigned int chainNodeCount;&lt;br /&gt;
  unsigned __int16 *chainNodeForNode;&lt;br /&gt;
  unsigned __int16 *nodeForChainNode;&lt;br /&gt;
  int visBytes;&lt;br /&gt;
  char *pathVis;&lt;br /&gt;
  int nodeTreeCount;&lt;br /&gt;
  pathnode_tree_t *nodeTree;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownGameWorldSpStruct1Internal1Internal1&lt;br /&gt;
{&lt;br /&gt;
  char unknown1[0x34];&lt;br /&gt;
  unsigned int unknownCount;&lt;br /&gt;
  char * unknown2; //Size = ((unknownCount &amp;lt;&amp;lt; 1) + unknownCount) &amp;lt;&amp;lt; 2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownGameWorldSpStruct1Internal1Internal2&lt;br /&gt;
{&lt;br /&gt;
  unknownGameWorldSpStruct1Internal1Internal1 * unknownStruct;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownGameWorldSpStruct1Internal1&lt;br /&gt;
{&lt;br /&gt;
  const char * unknownString;&lt;br /&gt;
  unsigned int unknownCount1;&lt;br /&gt;
  unknownGameWorldSpStruct1Internal1Internal1 * unknownStructs1;&lt;br /&gt;
  unsigned int unknownCount2;&lt;br /&gt;
  unknownGameWorldSpStruct1Internal1Internal2 * unknownStructs2;&lt;br /&gt;
  unsigned int unknownCount3;&lt;br /&gt;
  unknownGameWorldSpStruct1Internal1Internal2 * unknownStructs3;&lt;br /&gt;
  char unknown[0x10];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownGameWorldSpStruct1&lt;br /&gt;
{&lt;br /&gt;
  unsigned int unknownCount;&lt;br /&gt;
  unknownGameWorldSpStruct1Internal1 * unknownStructs;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownGameWorldStruct2Internal1&lt;br /&gt;
{&lt;br /&gt;
  char * unknownString;&lt;br /&gt;
  short unknown1;&lt;br /&gt;
  short unknownCount1;&lt;br /&gt;
  unsigned short * unknown2; //Count = unknownCount1&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownGameWorldStruct2&lt;br /&gt;
{&lt;br /&gt;
  unsigned int unknownCount1;&lt;br /&gt;
  char * unknown1; //Size = ((unknownCount1 &amp;lt;&amp;lt; 1) + unknownCount1) &amp;lt;&amp;lt; 2&lt;br /&gt;
  unsigned int unknownCount2;&lt;br /&gt;
  unknownGameWorldStruct2Internal1 * unknownStructs;&lt;br /&gt;
  char unknown2[0x6C];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GameWorldSp&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  PathData path;&lt;br /&gt;
       unknownGameWorldSpStruct1 unknownStruct1;&lt;br /&gt;
       unknownGameWorldStruct2 * unknownStruct2;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Multiplayer ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct GGlassPiece // len: 0x0C&lt;br /&gt;
{&lt;br /&gt;
    // 0x00..0x07: Xbox-correlated G_GlassPiece state fields.&lt;br /&gt;
    uint16_t DamageTaken;&lt;br /&gt;
    uint16_t CollapseTime;&lt;br /&gt;
    int32_t LastStateChangeTime;&lt;br /&gt;
&lt;br /&gt;
    // 0x08..0x0B: Xbox names impactDir and impactPos; &lt;br /&gt;
    // PS3 packing width is preserved here.&lt;br /&gt;
    uint16_t PackedImpactDir;&lt;br /&gt;
    uint16_t PackedImpactPos;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct GGlassName // len 0x0C&lt;br /&gt;
{&lt;br /&gt;
    // 0x00: XString nameStr. PS3 stores row+0x00 into varXString and calls Load_XString.&lt;br /&gt;
    char* Name;&lt;br /&gt;
&lt;br /&gt;
    // 0x04: G_GlassName.name. Xbox-correlated script string index &lt;br /&gt;
    // copied by the fixed row load.&lt;br /&gt;
    uint16_t ScriptName;&lt;br /&gt;
&lt;br /&gt;
    // 0x06: G_GlassName.pieceCount. PS3 uses this as the pieceIndices ushort count.&lt;br /&gt;
    uint16_t PieceCount;&lt;br /&gt;
&lt;br /&gt;
    // 0x08: ushort*. PS3 aligns to 2 and loads pieceCount indices when non-null.&lt;br /&gt;
    uint16_t* PieceIndices;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct GGlassData //len 0x80&lt;br /&gt;
{&lt;br /&gt;
    GGlassPiece* GlassPieces; // PS3 loads pieceCount fixed 0x0C-byte rows when non-null.&lt;br /&gt;
    int32_t PieceCount;&lt;br /&gt;
&lt;br /&gt;
    // 0x08..0x0B: Xbox-correlated G_GlassData damage thresholds.&lt;br /&gt;
    uint16_t DamageToWeaken;&lt;br /&gt;
    uint16_t DamageToDestroy;&lt;br /&gt;
&lt;br /&gt;
    // 0x0C: G_GlassData.glassNameCount. PS3 uses this as the G_GlassName array count.&lt;br /&gt;
    int32_t GlassNameCount;&lt;br /&gt;
&lt;br /&gt;
    // 0x10: G_GlassName*. PS3 loads glassNameCount fixed 0x0C-byte rows when non-null.&lt;br /&gt;
    GGlassName* GlassNames;&lt;br /&gt;
&lt;br /&gt;
    // 0x14..0x7F: PS3 copies these bytes as part of the fixed 0x80 root;&lt;br /&gt;
    unsigned char padding[108]; // seriously, this is how the loader does it&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GameWorldMp&lt;br /&gt;
{&lt;br /&gt;
  const char* name;&lt;br /&gt;
  GGlassData* Glassdata;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Game_Map_Asset&amp;diff=1062</id>
		<title>Game Map Asset</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Game_Map_Asset&amp;diff=1062"/>
		<updated>2026-06-30T01:35:35Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Multiplayer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Category:Assets]]&lt;br /&gt;
[[Category:CoD4]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
[[Category:WaW]]&lt;br /&gt;
[[Category:BO1]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
The game map (or game world) is part of the D3DBSP system produced by Radiant, and is on every Call of Duty game except for Modern Warfare 3 and Ghosts. This contains scripting information for the map, such as AI pathing information.&lt;br /&gt;
== Call of Duty 4 Single Player &amp;amp; World at War &amp;amp; Black Ops 1 ==&lt;br /&gt;
For World at War and Black Ops 1, the MP and SP assets are identical.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum nodeType&lt;br /&gt;
{&lt;br /&gt;
  NODE_BADNODE = 0x0,&lt;br /&gt;
  NODE_PATHNODE = 0x1,&lt;br /&gt;
  NODE_COVER_STAND = 0x2,&lt;br /&gt;
  NODE_COVER_CROUCH = 0x3,&lt;br /&gt;
  NODE_COVER_CROUCH_WINDOW = 0x4,&lt;br /&gt;
  NODE_COVER_PRONE = 0x5,&lt;br /&gt;
  NODE_COVER_RIGHT = 0x6,&lt;br /&gt;
  NODE_COVER_LEFT = 0x7,&lt;br /&gt;
  NODE_COVER_WIDE_RIGHT = 0x8,&lt;br /&gt;
  NODE_COVER_WIDE_LEFT = 0x9,&lt;br /&gt;
  NODE_CONCEALMENT_STAND = 0xA,&lt;br /&gt;
  NODE_CONCEALMENT_CROUCH = 0xB,&lt;br /&gt;
  NODE_CONCEALMENT_PRONE = 0xC,&lt;br /&gt;
  NODE_REACQUIRE = 0xD,&lt;br /&gt;
  NODE_BALCONY = 0xE,&lt;br /&gt;
  NODE_SCRIPTED = 0xF,&lt;br /&gt;
  NODE_NEGOTIATION_BEGIN = 0x10,&lt;br /&gt;
  NODE_NEGOTIATION_END = 0x11,&lt;br /&gt;
  NODE_TURRET = 0x12,&lt;br /&gt;
  NODE_GUARD = 0x13,&lt;br /&gt;
  NODE_NUMTYPES = 0x14,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathlink_s&lt;br /&gt;
{&lt;br /&gt;
  float fDist;&lt;br /&gt;
  unsigned __int16 nodeNum;&lt;br /&gt;
  char disconnectCount;&lt;br /&gt;
  char negotiationLink;&lt;br /&gt;
  char ubBadPlaceCount[4];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_constant_t&lt;br /&gt;
{&lt;br /&gt;
  nodeType type;&lt;br /&gt;
  unsigned __int16 spawnflags;&lt;br /&gt;
  ScriptString targetname;&lt;br /&gt;
  ScriptString script_linkName;&lt;br /&gt;
  ScriptString script_noteworthy;&lt;br /&gt;
  ScriptString target;&lt;br /&gt;
  ScriptString animscript;&lt;br /&gt;
  int animscriptfunc;&lt;br /&gt;
  float vOrigin[3];&lt;br /&gt;
  float fAngle;&lt;br /&gt;
  float forward[2];&lt;br /&gt;
  float fRadius;&lt;br /&gt;
  float minUseDistSq;&lt;br /&gt;
  __int16 wOverlapNode[2];&lt;br /&gt;
  __int16 wChainId;&lt;br /&gt;
  __int16 wChainDepth;&lt;br /&gt;
  __int16 wChainParent;&lt;br /&gt;
  unsigned __int16 totalLinkCount;&lt;br /&gt;
  pathlink_s *Links;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_dynamic_t&lt;br /&gt;
{&lt;br /&gt;
  struct sentient_s *pOwner;&lt;br /&gt;
  int iFreeTime;&lt;br /&gt;
  int iValidTime[3];&lt;br /&gt;
  int inPlayerLOSTime;&lt;br /&gt;
  __int16 wLinkCount;&lt;br /&gt;
  __int16 wOverlapCount;&lt;br /&gt;
  __int16 turretEntNumber;&lt;br /&gt;
  __int16 userCount;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_t&lt;br /&gt;
{&lt;br /&gt;
  pathnode_constant_t constant;&lt;br /&gt;
  pathnode_dynamic_t dynamic;&lt;br /&gt;
  pathnode_transient_t transient;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_transient_t&lt;br /&gt;
{&lt;br /&gt;
  int iSearchFrame;&lt;br /&gt;
  pathnode_t *pNextOpen;&lt;br /&gt;
  pathnode_t *pPrevOpen;&lt;br /&gt;
  pathnode_t *pParent;&lt;br /&gt;
  float fCost;&lt;br /&gt;
  float fHeuristic;&lt;br /&gt;
  float costFactor;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_tree_t&lt;br /&gt;
{&lt;br /&gt;
  int axis;&lt;br /&gt;
  float dist;&lt;br /&gt;
  pathnode_tree_info_t u;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_tree_nodes_t&lt;br /&gt;
{&lt;br /&gt;
  int nodeCount;&lt;br /&gt;
  unsigned short **nodes;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union pathnode_tree_info_t&lt;br /&gt;
{&lt;br /&gt;
  pathnode_tree_t *child[2];&lt;br /&gt;
  pathnode_tree_nodes_t s;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typdef char pathbasenode_t[0x10];&lt;br /&gt;
&lt;br /&gt;
struct PathData&lt;br /&gt;
{&lt;br /&gt;
  unsigned int nodeCount;&lt;br /&gt;
  pathnode_t *nodes;&lt;br /&gt;
  pathbasenode_t *nodeBases;&lt;br /&gt;
  unsigned int chainNodeCount;&lt;br /&gt;
  unsigned __int16 *chainNodeForNode;&lt;br /&gt;
  unsigned __int16 *nodeForChainNode;&lt;br /&gt;
  int visBytes;&lt;br /&gt;
  char *pathVis;&lt;br /&gt;
  int nodeTreeCount;&lt;br /&gt;
  pathnode_tree_t *nodeTree;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GameWorldSp&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  PathData path;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Black Ops 2 ==&lt;br /&gt;
The Black Ops 2 game maps (which are loaded exactly the same) are slightly different from its predecessors. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum nodeType&lt;br /&gt;
{&lt;br /&gt;
  NODE_BADNODE = 0x0,&lt;br /&gt;
  NODE_PATHNODE = 0x1,&lt;br /&gt;
  NODE_COVER_STAND = 0x2,&lt;br /&gt;
  NODE_COVER_CROUCH = 0x3,&lt;br /&gt;
  NODE_COVER_CROUCH_WINDOW = 0x4,&lt;br /&gt;
  NODE_COVER_PRONE = 0x5,&lt;br /&gt;
  NODE_COVER_RIGHT = 0x6,&lt;br /&gt;
  NODE_COVER_LEFT = 0x7,&lt;br /&gt;
  NODE_COVER_PILLAR = 0x8,&lt;br /&gt;
  NODE_AMBUSH = 0x9,&lt;br /&gt;
  NODE_EXPOSED = 0xA,&lt;br /&gt;
  NODE_CONCEALMENT_STAND = 0xB,&lt;br /&gt;
  NODE_CONCEALMENT_CROUCH = 0xC,&lt;br /&gt;
  NODE_CONCEALMENT_PRONE = 0xD,&lt;br /&gt;
  NODE_REACQUIRE = 0xE,&lt;br /&gt;
  NODE_BALCONY = 0xF,&lt;br /&gt;
  NODE_SCRIPTED = 0x10,&lt;br /&gt;
  NODE_NEGOTIATION_BEGIN = 0x11,&lt;br /&gt;
  NODE_NEGOTIATION_END = 0x12,&lt;br /&gt;
  NODE_TURRET = 0x13,&lt;br /&gt;
  NODE_GUARD = 0x14,&lt;br /&gt;
  NODE_NUMTYPES = 0x15,&lt;br /&gt;
  NODE_DONTLINK = 0x15,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathlink_s&lt;br /&gt;
{&lt;br /&gt;
  float fDist;&lt;br /&gt;
  unsigned __int16 nodeNum;&lt;br /&gt;
  char disconnectCount;&lt;br /&gt;
  char negotiationLink;&lt;br /&gt;
  char flags;&lt;br /&gt;
  char ubBadPlaceCount[5];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_constant_t&lt;br /&gt;
{&lt;br /&gt;
  nodeType type;&lt;br /&gt;
  int spawnflags;&lt;br /&gt;
  ScriptString targetname;&lt;br /&gt;
  ScriptString script_linkName;&lt;br /&gt;
  ScriptString script_noteworthy;&lt;br /&gt;
  ScriptString target;&lt;br /&gt;
  ScriptString animscript;&lt;br /&gt;
  int animscriptfunc;&lt;br /&gt;
  vec3_t vOrigin;&lt;br /&gt;
  float fAngle;&lt;br /&gt;
  vec2_t forward;&lt;br /&gt;
  float fRadius;&lt;br /&gt;
  float minUseDistSq;&lt;br /&gt;
  __int16 wOverlapNode[2];&lt;br /&gt;
  unsigned __int16 totalLinkCount;&lt;br /&gt;
  pathlink_s *Links;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SentientHandle&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 number;&lt;br /&gt;
  unsigned __int16 infoIndex;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_dynamic_t&lt;br /&gt;
{&lt;br /&gt;
  SentientHandle pOwner;&lt;br /&gt;
  int iFreeTime;&lt;br /&gt;
  int iValidTime[3];&lt;br /&gt;
  int dangerousNodeTime[3];&lt;br /&gt;
  int inPlayerLOSTime;&lt;br /&gt;
  __int16 wLinkCount;&lt;br /&gt;
  __int16 wOverlapCount;&lt;br /&gt;
  __int16 turretEntNumber;&lt;br /&gt;
  __int16 userCount;&lt;br /&gt;
  bool hasBadPlaceLink;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_transient_t&lt;br /&gt;
{&lt;br /&gt;
  int iSearchFrame;&lt;br /&gt;
  pathnode_t *pNextOpen;&lt;br /&gt;
  pathnode_t *pPrevOpen;&lt;br /&gt;
  pathnode_t *pParent;&lt;br /&gt;
  float fCost;&lt;br /&gt;
  float fHeuristic;&lt;br /&gt;
  union&lt;br /&gt;
  {&lt;br /&gt;
    float nodeCost;&lt;br /&gt;
    float linkIndex;&lt;br /&gt;
  };&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_t&lt;br /&gt;
{&lt;br /&gt;
  pathnode_constant_t constant;&lt;br /&gt;
  pathnode_dynamic_t dynamic;&lt;br /&gt;
  pathnode_transient_t transient;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_tree_nodes_t&lt;br /&gt;
{&lt;br /&gt;
  int nodeCount;&lt;br /&gt;
  unsigned __int16 *nodes;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union pathnode_tree_info_t&lt;br /&gt;
{&lt;br /&gt;
  pathnode_tree_t *child[2];&lt;br /&gt;
  pathnode_tree_nodes_t s;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_tree_t&lt;br /&gt;
{&lt;br /&gt;
  int axis;&lt;br /&gt;
  float dist;&lt;br /&gt;
  pathnode_tree_info_t u;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathbasenode_t&lt;br /&gt;
{&lt;br /&gt;
  vec3_t vOrigin;&lt;br /&gt;
  unsigned int type;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct PathData&lt;br /&gt;
{&lt;br /&gt;
  unsigned int nodeCount;&lt;br /&gt;
  unsigned int originalNodeCount;&lt;br /&gt;
  pathnode_t *nodes;&lt;br /&gt;
  pathbasenode_t *nodeBases;&lt;br /&gt;
  int visBytes;&lt;br /&gt;
  char *pathVis;&lt;br /&gt;
  int smoothBytes;&lt;br /&gt;
  char *smoothCache;&lt;br /&gt;
  int nodeTreeCount;&lt;br /&gt;
  pathnode_tree_t *nodeTree;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GameWorldSp&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  PathData path;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GameWorldMp&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  PathData path;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Call of Duty 4 Multiplayer ==&lt;br /&gt;
The multiplayer Call of Duty 4 game world is pretty much unneeded. &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct GameWorldMp&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
== Modern Warfare 2 ==&lt;br /&gt;
=== Single Player ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum nodeType&lt;br /&gt;
{&lt;br /&gt;
  NODE_BADNODE = 0x0,&lt;br /&gt;
  NODE_PATHNODE = 0x1,&lt;br /&gt;
  NODE_COVER_STAND = 0x2,&lt;br /&gt;
  NODE_COVER_CROUCH = 0x3,&lt;br /&gt;
  NODE_COVER_CROUCH_WINDOW = 0x4,&lt;br /&gt;
  NODE_COVER_PRONE = 0x5,&lt;br /&gt;
  NODE_COVER_RIGHT = 0x6,&lt;br /&gt;
  NODE_COVER_LEFT = 0x7,&lt;br /&gt;
  NODE_COVER_WIDE_RIGHT = 0x8,&lt;br /&gt;
  NODE_COVER_WIDE_LEFT = 0x9,&lt;br /&gt;
  NODE_CONCEALMENT_STAND = 0xA,&lt;br /&gt;
  NODE_CONCEALMENT_CROUCH = 0xB,&lt;br /&gt;
  NODE_CONCEALMENT_PRONE = 0xC,&lt;br /&gt;
  NODE_REACQUIRE = 0xD,&lt;br /&gt;
  NODE_BALCONY = 0xE,&lt;br /&gt;
  NODE_SCRIPTED = 0xF,&lt;br /&gt;
  NODE_NEGOTIATION_BEGIN = 0x10,&lt;br /&gt;
  NODE_NEGOTIATION_END = 0x11,&lt;br /&gt;
  NODE_TURRET = 0x12,&lt;br /&gt;
  NODE_GUARD = 0x13,&lt;br /&gt;
  NODE_NUMTYPES = 0x14,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathlink_s&lt;br /&gt;
{&lt;br /&gt;
  float fDist;&lt;br /&gt;
  unsigned __int16 nodeNum;&lt;br /&gt;
  char disconnectCount;&lt;br /&gt;
  char negotiationLink;&lt;br /&gt;
  char ubBadPlaceCount[4];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_constant_t&lt;br /&gt;
{&lt;br /&gt;
  nodeType type;&lt;br /&gt;
  unsigned __int16 spawnflags;&lt;br /&gt;
  ScriptString targetname;&lt;br /&gt;
  ScriptString script_linkName;&lt;br /&gt;
  ScriptString script_noteworthy;&lt;br /&gt;
  ScriptString target;&lt;br /&gt;
  ScriptString animscript;&lt;br /&gt;
  int animscriptfunc;&lt;br /&gt;
  float vOrigin[3];&lt;br /&gt;
  float fAngle;&lt;br /&gt;
  float forward[2];&lt;br /&gt;
  float fRadius;&lt;br /&gt;
  float minUseDistSq;&lt;br /&gt;
  __int16 wOverlapNode[2];&lt;br /&gt;
  unsigned __int16 totalLinkCount;&lt;br /&gt;
  pathlink_s *Links;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_t&lt;br /&gt;
{&lt;br /&gt;
  pathnode_constant_t constant;&lt;br /&gt;
       char unknown[0x48];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_tree_t&lt;br /&gt;
{&lt;br /&gt;
  int axis;&lt;br /&gt;
  float dist;&lt;br /&gt;
  pathnode_tree_info_t u;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct pathnode_tree_nodes_t&lt;br /&gt;
{&lt;br /&gt;
  int nodeCount;&lt;br /&gt;
  unsigned short **nodes;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union pathnode_tree_info_t&lt;br /&gt;
{&lt;br /&gt;
  pathnode_tree_t *child[2];&lt;br /&gt;
  pathnode_tree_nodes_t s;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typdef char pathbasenode_t[0x10];&lt;br /&gt;
&lt;br /&gt;
struct PathData&lt;br /&gt;
{&lt;br /&gt;
  unsigned int nodeCount;&lt;br /&gt;
  pathnode_t *nodes;&lt;br /&gt;
  pathbasenode_t *nodeBases;&lt;br /&gt;
  unsigned int chainNodeCount;&lt;br /&gt;
  unsigned __int16 *chainNodeForNode;&lt;br /&gt;
  unsigned __int16 *nodeForChainNode;&lt;br /&gt;
  int visBytes;&lt;br /&gt;
  char *pathVis;&lt;br /&gt;
  int nodeTreeCount;&lt;br /&gt;
  pathnode_tree_t *nodeTree;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownGameWorldSpStruct1Internal1Internal1&lt;br /&gt;
{&lt;br /&gt;
  char unknown1[0x34];&lt;br /&gt;
  unsigned int unknownCount;&lt;br /&gt;
  char * unknown2; //Size = ((unknownCount &amp;lt;&amp;lt; 1) + unknownCount) &amp;lt;&amp;lt; 2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownGameWorldSpStruct1Internal1Internal2&lt;br /&gt;
{&lt;br /&gt;
  unknownGameWorldSpStruct1Internal1Internal1 * unknownStruct;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownGameWorldSpStruct1Internal1&lt;br /&gt;
{&lt;br /&gt;
  const char * unknownString;&lt;br /&gt;
  unsigned int unknownCount1;&lt;br /&gt;
  unknownGameWorldSpStruct1Internal1Internal1 * unknownStructs1;&lt;br /&gt;
  unsigned int unknownCount2;&lt;br /&gt;
  unknownGameWorldSpStruct1Internal1Internal2 * unknownStructs2;&lt;br /&gt;
  unsigned int unknownCount3;&lt;br /&gt;
  unknownGameWorldSpStruct1Internal1Internal2 * unknownStructs3;&lt;br /&gt;
  char unknown[0x10];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownGameWorldSpStruct1&lt;br /&gt;
{&lt;br /&gt;
  unsigned int unknownCount;&lt;br /&gt;
  unknownGameWorldSpStruct1Internal1 * unknownStructs;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownGameWorldStruct2Internal1&lt;br /&gt;
{&lt;br /&gt;
  char * unknownString;&lt;br /&gt;
  short unknown1;&lt;br /&gt;
  short unknownCount1;&lt;br /&gt;
  unsigned short * unknown2; //Count = unknownCount1&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownGameWorldStruct2&lt;br /&gt;
{&lt;br /&gt;
  unsigned int unknownCount1;&lt;br /&gt;
  char * unknown1; //Size = ((unknownCount1 &amp;lt;&amp;lt; 1) + unknownCount1) &amp;lt;&amp;lt; 2&lt;br /&gt;
  unsigned int unknownCount2;&lt;br /&gt;
  unknownGameWorldStruct2Internal1 * unknownStructs;&lt;br /&gt;
  char unknown2[0x6C];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GameWorldSp&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  PathData path;&lt;br /&gt;
       unknownGameWorldSpStruct1 unknownStruct1;&lt;br /&gt;
       unknownGameWorldStruct2 * unknownStruct2;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Multiplayer ===&lt;br /&gt;
&amp;lt;code&amp;gt;unknownGameWorldStruct2 = GGlassData&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct GGlassPiece // len: 0x0C&lt;br /&gt;
{&lt;br /&gt;
    // 0x00..0x07: Xbox-correlated G_GlassPiece state fields.&lt;br /&gt;
    uint16_t DamageTaken;&lt;br /&gt;
    uint16_t CollapseTime;&lt;br /&gt;
    int32_t LastStateChangeTime;&lt;br /&gt;
&lt;br /&gt;
    // 0x08..0x0B: Xbox names impactDir and impactPos; &lt;br /&gt;
    // PS3 packing width is preserved here.&lt;br /&gt;
    uint16_t PackedImpactDir;&lt;br /&gt;
    uint16_t PackedImpactPos;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct GGlassName // len 0x0C&lt;br /&gt;
{&lt;br /&gt;
    // 0x00: XString nameStr. PS3 stores row+0x00 into varXString and calls Load_XString.&lt;br /&gt;
    char* Name;&lt;br /&gt;
&lt;br /&gt;
    // 0x04: G_GlassName.name. Xbox-correlated script string index &lt;br /&gt;
    // copied by the fixed row load.&lt;br /&gt;
    uint16_t ScriptName;&lt;br /&gt;
&lt;br /&gt;
    // 0x06: G_GlassName.pieceCount. PS3 uses this as the pieceIndices ushort count.&lt;br /&gt;
    uint16_t PieceCount;&lt;br /&gt;
&lt;br /&gt;
    // 0x08: ushort*. PS3 aligns to 2 and loads pieceCount indices when non-null.&lt;br /&gt;
    uint16_t* PieceIndices;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
struct GGlassData //len 0x80&lt;br /&gt;
{&lt;br /&gt;
    GGlassPiece* GlassPieces; // PS3 loads pieceCount fixed 0x0C-byte rows when non-null.&lt;br /&gt;
    int32_t PieceCount;&lt;br /&gt;
&lt;br /&gt;
    // 0x08..0x0B: Xbox-correlated G_GlassData damage thresholds.&lt;br /&gt;
    uint16_t DamageToWeaken;&lt;br /&gt;
    uint16_t DamageToDestroy;&lt;br /&gt;
&lt;br /&gt;
    // 0x0C: G_GlassData.glassNameCount. PS3 uses this as the G_GlassName array count.&lt;br /&gt;
    int32_t GlassNameCount;&lt;br /&gt;
&lt;br /&gt;
    // 0x10: G_GlassName*. PS3 loads glassNameCount fixed 0x0C-byte rows when non-null.&lt;br /&gt;
    GGlassName* GlassNames;&lt;br /&gt;
&lt;br /&gt;
    // 0x14..0x7F: PS3 copies these bytes as part of the fixed 0x80 root; &lt;br /&gt;
    // no consumer semantics proven yet.&lt;br /&gt;
    uint32_t unknown[0x1A];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GameWorldMp&lt;br /&gt;
{&lt;br /&gt;
  const char* name;&lt;br /&gt;
  GGlassData* Glassdata;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Menu_Asset_(MW2)&amp;diff=1061</id>
		<title>Menu Asset (MW2)</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Menu_Asset_(MW2)&amp;diff=1061"/>
		<updated>2026-06-23T16:17:55Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Assets]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
=== Rectangle Alignment ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum HorizontalAlign : char&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// Anchor X to the left edge of the 4:3 virtual screen, before safe-area adjustment.&lt;br /&gt;
    /// This is also the default horizontal rect alignment.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    HORIZONTAL_ALIGN_SUBLEFT = 0,&lt;br /&gt;
&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// Anchor X to the left viewable safe-area edge.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    HORIZONTAL_ALIGN_LEFT = 1,&lt;br /&gt;
&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// Anchor X to the horizontal center of the screen.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    HORIZONTAL_ALIGN_CENTER = 2,&lt;br /&gt;
&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// Anchor X to the right viewable safe-area edge.&lt;br /&gt;
    /// The rect offset is applied from the right side, so preview code should subtract width and X.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    HORIZONTAL_ALIGN_RIGHT = 3,&lt;br /&gt;
&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// Use the full horizontal screen span, disregarding safe-area adjustment.&lt;br /&gt;
    /// Preview code should treat the resulting X as the screen left and width as the full available width.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    HORIZONTAL_ALIGN_FULLSCREEN = 4,&lt;br /&gt;
&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// Use exact X and width parameters without safe-area adjustment or screen-size scaling.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    HORIZONTAL_ALIGN_NOSCALE = 5,&lt;br /&gt;
&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// Scale a real-screen-resolution X coordinate down into the 0..640 virtual coordinate range.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    HORIZONTAL_ALIGN_TO640 = 6,&lt;br /&gt;
&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// Anchor X to the horizontal center of the safe area.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    HORIZONTAL_ALIGN_CENTER_SAFEAREA = 7&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
enum VerticalAlign : char&lt;br /&gt;
{&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// Anchor Y to the top edge of the 4:3 virtual screen, before safe-area adjustment.&lt;br /&gt;
    /// This is also the default vertical rect alignment.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    VERTICAL_ALIGN_SUBTOP = 0,&lt;br /&gt;
&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// Anchor Y to the top viewable safe-area edge.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    VERTICAL_ALIGN_TOP = 1,&lt;br /&gt;
&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// Anchor Y to the vertical center of the screen.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    VERTICAL_ALIGN_CENTER = 2,&lt;br /&gt;
&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// Anchor Y to the bottom viewable safe-area edge.&lt;br /&gt;
    /// The rect offset is applied from the bottom side, so preview code should subtract height and Y.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    VERTICAL_ALIGN_BOTTOM = 3,&lt;br /&gt;
&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// Use the full vertical screen span, disregarding safe-area adjustment.&lt;br /&gt;
    /// Preview code should treat the resulting Y as the screen top and height as the full available height.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    VERTICAL_ALIGN_FULLSCREEN = 4,&lt;br /&gt;
&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// Use exact Y and height parameters without safe-area adjustment or screen-size scaling.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    VERTICAL_ALIGN_NOSCALE = 5,&lt;br /&gt;
&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// Scale a real-screen-resolution Y coordinate down into the 0..480 virtual coordinate range.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    VERTICAL_ALIGN_TO480 = 6,&lt;br /&gt;
&lt;br /&gt;
    /// &amp;lt;summary&amp;gt;&lt;br /&gt;
    /// Anchor Y to the vertical center of the safe area.&lt;br /&gt;
    /// &amp;lt;/summary&amp;gt;&lt;br /&gt;
    VERTICAL_ALIGN_CENTER_SAFEAREA = 7&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum operationEnum&lt;br /&gt;
{&lt;br /&gt;
  OP_NOOP = 0x0,&lt;br /&gt;
  OP_RIGHTPAREN = 0x1,&lt;br /&gt;
  OP_MULTIPLY = 0x2,&lt;br /&gt;
  OP_DIVIDE = 0x3,&lt;br /&gt;
  OP_MODULUS = 0x4,&lt;br /&gt;
  OP_ADD = 0x5,&lt;br /&gt;
  OP_SUBTRACT = 0x6,&lt;br /&gt;
  OP_NOT = 0x7,&lt;br /&gt;
  OP_LESSTHAN = 0x8,&lt;br /&gt;
  OP_LESSTHANEQUALTO = 0x9,&lt;br /&gt;
  OP_GREATERTHAN = 0xA,&lt;br /&gt;
  OP_GREATERTHANEQUALTO = 0xB,&lt;br /&gt;
  OP_EQUALS = 0xC,&lt;br /&gt;
  OP_NOTEQUAL = 0xD,&lt;br /&gt;
  OP_AND = 0xE,&lt;br /&gt;
  OP_OR = 0xF,&lt;br /&gt;
  OP_LEFTPAREN = 0x10,&lt;br /&gt;
  OP_COMMA = 0x11,&lt;br /&gt;
  OP_BITWISEAND = 0x12,&lt;br /&gt;
  OP_BITWISEOR = 0x13,&lt;br /&gt;
  OP_BITWISENOT = 0x14,&lt;br /&gt;
  OP_BITSHIFTLEFT = 0x15,&lt;br /&gt;
  OP_BITSHIFTRIGHT = 0x16,&lt;br /&gt;
  OP_STATICDVARINT = 0x17,&lt;br /&gt;
  OP_STATICDVARBOOL = 0x18,&lt;br /&gt;
  OP_STATICDVARFLOAT = 0x19,&lt;br /&gt;
  OP_STATICDVARSTRING = 0x1A,&lt;br /&gt;
  OP_INT = 0x1B,&lt;br /&gt;
  OP_STRING = 0x1C,&lt;br /&gt;
  OP_FLOAT = 0x1D,&lt;br /&gt;
  OP_SIN = 0x1E,&lt;br /&gt;
  OP_COS = 0x1F,&lt;br /&gt;
  OP_MIN = 0x20,&lt;br /&gt;
  OP_MAX = 0x21,&lt;br /&gt;
  OP_MILLISECONDS = 0x22,&lt;br /&gt;
  OP_DVARINT = 0x23,&lt;br /&gt;
  OP_DVARBOOL = 0x24,&lt;br /&gt;
  OP_DVARFLOAT = 0x25,&lt;br /&gt;
  OP_DVARSTRING = 0x26,&lt;br /&gt;
  OP_STAT = 0x27,&lt;br /&gt;
  OP_UIACTIVE = 0x28,&lt;br /&gt;
  OP_FLASHBANGED = 0x29,&lt;br /&gt;
  OP_USINGVEHICLE = 0x2A,&lt;br /&gt;
  OP_MISSILECAM = 0x2B,&lt;br /&gt;
  OP_SCOPED = 0x2C,&lt;br /&gt;
  OP_SCOPEDTHERMAL = 0x2D,&lt;br /&gt;
  OP_SCOREBOARDVISIBLE = 0x2E,&lt;br /&gt;
  OP_INKILLCAM = 0x2F,&lt;br /&gt;
  OP_INKILLCAMNPC = 0x30,&lt;br /&gt;
  OP_PLAYERFIELD = 0x31,&lt;br /&gt;
  OP_GETPERK = 0x32,&lt;br /&gt;
  OP_SELECTINGLOCATION = 0x33,&lt;br /&gt;
  OP_SELECTINGDIRECTION = 0x34,&lt;br /&gt;
  OP_TEAMFIELD = 0x35,&lt;br /&gt;
  OP_OTHERTEAMFIELD = 0x36,&lt;br /&gt;
  OP_MARINESFIELD = 0x37,&lt;br /&gt;
  OP_OPFORFIELD = 0x38,&lt;br /&gt;
  OP_MENUISOPEN = 0x39,&lt;br /&gt;
  OP_WRITINGDATA = 0x3A,&lt;br /&gt;
  OP_INLOBBY = 0x3B,&lt;br /&gt;
  OP_INPRIVATEPARTY = 0x3C,&lt;br /&gt;
  OP_PRIVATEPARTYHOST = 0x3D,&lt;br /&gt;
  OP_PRIVATEPARTYHOSTINLOBBY = 0x3E,&lt;br /&gt;
  OP_ALONEINPARTY = 0x3F,&lt;br /&gt;
  OP_ADSJAVELIN = 0x40,&lt;br /&gt;
  OP_WEAPLOCKBLINK = 0x41,&lt;br /&gt;
  OP_WEAPATTACKTOP = 0x42,&lt;br /&gt;
  OP_WEAPATTACKDIRECT = 0x43,&lt;br /&gt;
  OP_WEAPLOCKING = 0x44,&lt;br /&gt;
  OP_WEAPLOCKED = 0x45,&lt;br /&gt;
  OP_WEAPLOCKTOOCLOSE = 0x46,&lt;br /&gt;
  OP_WEAPLOCKSCREENPOSX = 0x47,&lt;br /&gt;
  OP_WEAPLOCKSCREENPOSY = 0x48,&lt;br /&gt;
  OP_SECONDSASTIME = 0x49,&lt;br /&gt;
  OP_TABLELOOKUP = 0x4A,&lt;br /&gt;
  OP_TABLELOOKUPBYROW = 0x4B,&lt;br /&gt;
  OP_TABLEGETROWNUM = 0x4C,&lt;br /&gt;
  OP_LOCALIZESTRING = 0x4D,&lt;br /&gt;
  OP_LOCALVARINT = 0x4E,&lt;br /&gt;
  OP_LOCALVARBOOL = 0x4F,&lt;br /&gt;
  OP_LOCALVARFLOAT = 0x50,&lt;br /&gt;
  OP_LOCALVARSTRING = 0x51,&lt;br /&gt;
  OP_TIMELEFT = 0x52,&lt;br /&gt;
  OP_SECONDSASCOUNTDOWN = 0x53,&lt;br /&gt;
  OP_GAMEMSGWNDACTIVE = 0x54,&lt;br /&gt;
  OP_GAMETYPENAME = 0x55,&lt;br /&gt;
  OP_GAMETYPE = 0x56,&lt;br /&gt;
  OP_GAMETYPEDESCRIPTION = 0x57,&lt;br /&gt;
  OP_SCORE = 0x58,&lt;br /&gt;
  OP_FRIENDSONLINE = 0x59,&lt;br /&gt;
  OP_SPECTATINGCLIENT = 0x5A,&lt;br /&gt;
  OP_SPECTATINGFREE = 0x5B,&lt;br /&gt;
  OP_STATRANGEBITSSET = 0x5C,&lt;br /&gt;
  OP_KEYBINDING = 0x5D,&lt;br /&gt;
  OP_ACTIONSLOTUSABLE = 0x5E,&lt;br /&gt;
  OP_HUDFADE = 0x5F,&lt;br /&gt;
  OP_MAXRECOMMENDEDPLAYERS = 0x60,&lt;br /&gt;
  OP_ACCEPTINGINVITE = 0x61,&lt;br /&gt;
  OP_ISINTERMISSION = 0x62,&lt;br /&gt;
  OP_GAMEHOST = 0x63,&lt;br /&gt;
  OP_PARTYISMISSINGMAPPACK = 0x64,&lt;br /&gt;
  OP_PARTYMISSINGMAPPACKERROR = 0x65,&lt;br /&gt;
  OP_ANYNEWMAPPACKS = 0x66,&lt;br /&gt;
  OP_AMISELECTED = 0x67,&lt;br /&gt;
  OP_PARTYSTATUSSTRING = 0x68,&lt;br /&gt;
  OP_ATTACHEDCONTROLLERCOUNT = 0x69,&lt;br /&gt;
  OP_ISSPLITSCREENONLINEPOSSIBLE = 0x6A,&lt;br /&gt;
  OP_SPLITSCREENPLAYERCOUNT = 0x6B,&lt;br /&gt;
  OP_GETPLAYERDATA = 0x6C,&lt;br /&gt;
  OP_GETPLAYERDATASPLITSCREEN = 0x6D,&lt;br /&gt;
  OP_EXPERIENCEFORLEVEL = 0x6E,&lt;br /&gt;
  OP_LEVELFOREXPERIENCE = 0x6F,&lt;br /&gt;
  OP_ISITEMUNLOCKED = 0x70,&lt;br /&gt;
  OP_ISITEMUNLOCKEDSPLITSCREEN = 0x71,&lt;br /&gt;
  OP_DEBUGPRINT = 0x72,&lt;br /&gt;
  OP_GETPLAYERDATAANYBOOLTRUE = 0x73,&lt;br /&gt;
  OP_WEAPONCLASSNEW = 0x74,&lt;br /&gt;
  OP_WEAPONNAME = 0x75,&lt;br /&gt;
  OP_ISRELOADING = 0x76,&lt;br /&gt;
  OP_SAVEGAMEAVAILABLE = 0x77,&lt;br /&gt;
  OP_UNLOCKEDITEMCOUNT = 0x78,&lt;br /&gt;
  OP_UNLOCKEDITEMCOUNTSPLITSCREEN = 0x79,&lt;br /&gt;
  OP_UNLOCKEDITEM = 0x7A,&lt;br /&gt;
  OP_UNLOCKEDITEMSPLITSCREEN = 0x7B,&lt;br /&gt;
  OP_MAILSUBJECT = 0x7C,&lt;br /&gt;
  OP_MAILFROM = 0x7D,&lt;br /&gt;
  OP_MAILRECEIVED = 0x7E,&lt;br /&gt;
  OP_MAILBODY = 0x7F,&lt;br /&gt;
  OP_MAILLOOTLOCALIZED = 0x80,&lt;br /&gt;
  OP_MAILGIVESLOOT = 0x81,&lt;br /&gt;
  OP_ANYNEWMAIL = 0x82,&lt;br /&gt;
  OP_MAILTIMETOFOLLOWUP = 0x83,&lt;br /&gt;
  OP_MAILLOOTTYPE = 0x84,&lt;br /&gt;
  OP_MAILRANLOTTERY = 0x85,&lt;br /&gt;
  OP_LOTTERYLOOTLOCALIZED = 0x86,&lt;br /&gt;
  OP_RADARISJAMMED = 0x87,&lt;br /&gt;
  OP_RADARJAMINTENSITY = 0x88,&lt;br /&gt;
  OP_RADARISENABLED = 0x89,&lt;br /&gt;
  OP_ISEMPJAMMED = 0x8A,&lt;br /&gt;
  OP_PLAYERADS = 0x8B,&lt;br /&gt;
  OP_WEAPONHEATACTIVE = 0x8C,&lt;br /&gt;
  OP_WEAPONHEATVALUE = 0x8D,&lt;br /&gt;
  OP_WEAPONHEATOVERHEATED = 0x8E,&lt;br /&gt;
  OP_GETSPLASHTEXT = 0x8F,&lt;br /&gt;
  OP_GETSPLASHDESCRIPTION = 0x90,&lt;br /&gt;
  OP_GETSPLASHMATERIAL = 0x91,&lt;br /&gt;
  OP_SPLASHHASICON = 0x92,&lt;br /&gt;
  OP_SPLASHROWNUM = 0x93,&lt;br /&gt;
  OP_GETFOCUSEDITEMNAME = 0x94,&lt;br /&gt;
  OP_GETFOCUSEDITEMX = 0x95,&lt;br /&gt;
  OP_GETFOCUSEDITEMY = 0x96,&lt;br /&gt;
  OP_GETFOCUSEDITEMWIDTH = 0x97,&lt;br /&gt;
  OP_GETFOCUSEDITEMHEIGHT = 0x98,&lt;br /&gt;
  OP_GETITEMX = 0x99,&lt;br /&gt;
  OP_GETITEMY = 0x9A,&lt;br /&gt;
  OP_GETITEMWIDTH = 0x9B,&lt;br /&gt;
  OP_GETITEMHEIGHT = 0x9C,&lt;br /&gt;
  OP_PLAYLIST = 0x9D,&lt;br /&gt;
  OP_SCOREBOARDEXTERNALMUTENOTICE = 0x9E,&lt;br /&gt;
  OP_GETCLIENTMATCHDATA = 0x9F,&lt;br /&gt;
  OP_GETCLIENTMATCHDATADEF = 0xA0,&lt;br /&gt;
  OP_GETMAPNAME = 0xA1,&lt;br /&gt;
  OP_GETMAPIMAGE = 0xA2,&lt;br /&gt;
  OP_GETMAPCUSTOM = 0xA3,&lt;br /&gt;
  OP_GETMIGRATIONSTATUS = 0xA4,&lt;br /&gt;
  OP_GETPLAYERCARDINFO = 0xA5,&lt;br /&gt;
  OP_ISOFFLINEPROFILESELECTED = 0xA6,&lt;br /&gt;
  OP_COOPPLAYER = 0xA7,&lt;br /&gt;
  OP_ISCOOP = 0xA8,&lt;br /&gt;
  OP_GETPARTYSTATUS = 0xA9,&lt;br /&gt;
  OP_GETSEARCHPARAMS = 0xAA,&lt;br /&gt;
  OP_GETTIMEPLAYED = 0xAB,&lt;br /&gt;
  OP_ISSELECTEDPLAYERFRIEND = 0xAC,&lt;br /&gt;
  OP_GETCHARBYINDEX = 0xAD,&lt;br /&gt;
  OP_GETPROFILEDATA = 0xAE,&lt;br /&gt;
  OP_ISPROFILESIGNEDIN = 0xAF,&lt;br /&gt;
  OP_GETWAITPOPUPSTATUS = 0xB0,&lt;br /&gt;
  OP_GETNATTYPE = 0xB1,&lt;br /&gt;
  OP_GETLOCALIZEDNATTYPE = 0xB2,&lt;br /&gt;
  OP_GETADJUSTEDSAFEAREAHORIZONTAL = 0xB3,&lt;br /&gt;
  OP_GETADJUSTEDSAFEAREAVERTICAL = 0xB4,&lt;br /&gt;
  OP_CONNECTIONINFO = 0xB5,&lt;br /&gt;
  OP_OFFLINEPROFILECANSAVE = 0xB6,&lt;br /&gt;
  OP_ALLSPLITSCREENPROFILESCANSAVE = 0xB7,&lt;br /&gt;
  OP_ALLSPLITSCREENPROFILESARESIGNEDIN = 0xB8,&lt;br /&gt;
  OP_DOWEHAVEMAPPACK = 0xB9,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum expDataType &lt;br /&gt;
{&lt;br /&gt;
  VAL_INT = 0x0,&lt;br /&gt;
  VAL_FLOAT = 0x1,&lt;br /&gt;
  VAL_STRING = 0x2,&lt;br /&gt;
  NUM_INTERNAL_DATATYPES = 0x3,&lt;br /&gt;
  VAL_FUNCTION = 0x3,&lt;br /&gt;
  NUM_DATATYPES = 0x4,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Statement_s;&lt;br /&gt;
struct MenuEventHandlerSet;&lt;br /&gt;
struct ExpressionSupportingData;&lt;br /&gt;
&lt;br /&gt;
struct ExpressionString&lt;br /&gt;
{&lt;br /&gt;
  const char *string;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union operandInternalDataUnion &lt;br /&gt;
{&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  ExpressionString *stringVal;&lt;br /&gt;
  Statement_s *function;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Operand &lt;br /&gt;
{&lt;br /&gt;
  expDataType dataType;&lt;br /&gt;
  operandInternalDataUnion internals;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union entryInternalData &lt;br /&gt;
{&lt;br /&gt;
  operationEnum op;&lt;br /&gt;
  Operand operand;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SetLocalVarData&lt;br /&gt;
{&lt;br /&gt;
  const char *localVarName;&lt;br /&gt;
  Statement_s *expression;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ConditionalScript&lt;br /&gt;
{&lt;br /&gt;
  MenuEventHandlerSet *eventHandlerSet;&lt;br /&gt;
  Statement_s *eventExpression;  // loads this first&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct expressionEntry &lt;br /&gt;
{&lt;br /&gt;
  int type;&lt;br /&gt;
  entryInternalData data;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Statement_s &lt;br /&gt;
{&lt;br /&gt;
  int numEntries;&lt;br /&gt;
  expressionEntry *entries;&lt;br /&gt;
  ExpressionSupportingData *supportingData;&lt;br /&gt;
  int lastExecuteTime;&lt;br /&gt;
  Operand lastResult;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum ItemFloatExpressionTarget&lt;br /&gt;
{&lt;br /&gt;
  ITEM_FLOATEXP_TGT_RECT_X = 0x0,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_RECT_Y = 0x1,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_RECT_W = 0x2,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_RECT_H = 0x3,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_FORECOLOR_R = 0x4,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_FORECOLOR_G = 0x5,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_FORECOLOR_B = 0x6,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_FORECOLOR_RGB = 0x7,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_FORECOLOR_A = 0x8,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_GLOWCOLOR_R = 0x9,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_GLOWCOLOR_G = 0xA,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_GLOWCOLOR_B = 0xB,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_GLOWCOLOR_RGB = 0xC,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_GLOWCOLOR_A = 0xD,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_BACKCOLOR_R = 0xE,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_BACKCOLOR_G = 0xF,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_BACKCOLOR_B = 0x10,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_BACKCOLOR_RGB = 0x11,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_BACKCOLOR_A = 0x12,&lt;br /&gt;
  ITEM_FLOATEXP_TGT__COUNT = 0x13,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ItemFloatExpression&lt;br /&gt;
{&lt;br /&gt;
  ItemFloatExpressionTarget target;&lt;br /&gt;
  Statement_s *expression;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union EventData&lt;br /&gt;
{&lt;br /&gt;
  const char *unconditionalScript;&lt;br /&gt;
  ConditionalScript *conditionalScript;&lt;br /&gt;
  MenuEventHandlerSet *elseScript;&lt;br /&gt;
  SetLocalVarData *setLocalVarData;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#pragma pack(push, 4)&lt;br /&gt;
struct MenuEventHandler&lt;br /&gt;
{&lt;br /&gt;
  EventData eventData;&lt;br /&gt;
  char eventType;&lt;br /&gt;
};&lt;br /&gt;
#pragma pack(pop)&lt;br /&gt;
&lt;br /&gt;
struct MenuEventHandlerSet&lt;br /&gt;
{&lt;br /&gt;
  int eventHandlerCount;&lt;br /&gt;
  MenuEventHandler **eventHandlers;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ItemKeyHandler&lt;br /&gt;
{&lt;br /&gt;
  int key;&lt;br /&gt;
  MenuEventHandlerSet *action;&lt;br /&gt;
  ItemKeyHandler *next;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct newsTickerDef_s&lt;br /&gt;
{&lt;br /&gt;
  int feedId;    // 0 = text input, 1 = motd&lt;br /&gt;
  int speed;&lt;br /&gt;
  int spacing;&lt;br /&gt;
  int lastTime;&lt;br /&gt;
  int start;&lt;br /&gt;
  int end;&lt;br /&gt;
  float x;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#define MAX_LB_COLUMNS 16&lt;br /&gt;
&lt;br /&gt;
struct columnInfo_s &lt;br /&gt;
{&lt;br /&gt;
  int pos;&lt;br /&gt;
  int width;&lt;br /&gt;
  int maxChars;&lt;br /&gt;
  int alignment;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct listBoxDef_s &lt;br /&gt;
{&lt;br /&gt;
#ifndef PC&lt;br /&gt;
  int startPos[4];&lt;br /&gt;
  int endPos[4];&lt;br /&gt;
  int drawPadding;&lt;br /&gt;
#else&lt;br /&gt;
  int unknown[4];&lt;br /&gt;
#endif&lt;br /&gt;
  float elementWidth;&lt;br /&gt;
  float elementHeight;&lt;br /&gt;
  int elementStyle;&lt;br /&gt;
  int numColumns;&lt;br /&gt;
  columnInfo_s columnInfo[MAX_LB_COLUMNS];&lt;br /&gt;
  MenuEventHandlerSet *doubleClick;&lt;br /&gt;
  int notselectable;&lt;br /&gt;
  int noscrollbars;&lt;br /&gt;
  int usepaging;&lt;br /&gt;
  vec4_t selectBorder;&lt;br /&gt;
  Material *selectIcon;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct editFieldDef_s &lt;br /&gt;
{&lt;br /&gt;
  float minVal;&lt;br /&gt;
  float maxVal;&lt;br /&gt;
  float defVal;&lt;br /&gt;
  float range;&lt;br /&gt;
  int maxChars;&lt;br /&gt;
  int maxCharsGotoNext;&lt;br /&gt;
  int maxPaintChars;&lt;br /&gt;
  int paintOffset;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#define MAX_MULTI_DVARS 32&lt;br /&gt;
&lt;br /&gt;
struct multiDef_s &lt;br /&gt;
{&lt;br /&gt;
  char *dvarList[MAX_MULTI_DVARS];&lt;br /&gt;
  char *dvarStr[MAX_MULTI_DVARS];&lt;br /&gt;
  float dvarValue[MAX_MULTI_DVARS];&lt;br /&gt;
  int count;&lt;br /&gt;
  int strDef;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct textScrollDef_s&lt;br /&gt;
{&lt;br /&gt;
  int startTime;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union itemDefData_t &lt;br /&gt;
{&lt;br /&gt;
  listBoxDef_s *listBox;&lt;br /&gt;
  editFieldDef_s *editField;&lt;br /&gt;
  multiDef_s *multi;&lt;br /&gt;
  const char *enumDvarName;&lt;br /&gt;
  newsTickerDef_s *newsTicker;&lt;br /&gt;
  textScrollDef_s *textScroll;&lt;br /&gt;
  void *data;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#define WINDOWDYNAMIC_VISIBLE		0x00000004&lt;br /&gt;
#define WINDOWDYNAMIC_HASFORECOLOR	0x00010000&lt;br /&gt;
&lt;br /&gt;
#define WINDOWSTATIC_DECORATION				0x00100000&lt;br /&gt;
#define WINDOWSTATIC_HORIZONTALSCROLL			0x00200000&lt;br /&gt;
#define WINDOWSTATIC_SCREENSPACE				0x00400000&lt;br /&gt;
#define WINDOWSTATIC_AUTOWRAPPED				0x00800000&lt;br /&gt;
#define WINDOWSTATIC_POPUP						0x01000000&lt;br /&gt;
#define WINDOWSTATIC_OUTOFBOUNDSCLICK			0x02000000&lt;br /&gt;
#define WINDOWSTATIC_LEGACYSPLITSCREENSCALE	0x04000000&lt;br /&gt;
#define WINDOWSTATIC_HIDDENDURINGFLASH			0x10000000&lt;br /&gt;
#define WINDOWSTATIC_HIDDENDURINGSCOPE			0x20000000&lt;br /&gt;
#define WINDOWSTATIC_HIDDENDURINGUI			0x40000000&lt;br /&gt;
#define WINDOWSTATIC_TEXTONLYFOCUS				0x80000000&lt;br /&gt;
&lt;br /&gt;
#pragma pack(push, 4)&lt;br /&gt;
struct rectDef_s &lt;br /&gt;
{&lt;br /&gt;
  float x;&lt;br /&gt;
  float y;&lt;br /&gt;
  float w;&lt;br /&gt;
  float h;&lt;br /&gt;
  char horzAlign;&lt;br /&gt;
  char vertAlign;&lt;br /&gt;
};&lt;br /&gt;
#pragma pack(pop)&lt;br /&gt;
&lt;br /&gt;
typedef rectDef_s Rectangle;&lt;br /&gt;
&lt;br /&gt;
struct windowDef_t&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  Rectangle rect;&lt;br /&gt;
  Rectangle rectClient;&lt;br /&gt;
  const char *group;&lt;br /&gt;
  int style;&lt;br /&gt;
  int border;&lt;br /&gt;
  int ownerDraw;&lt;br /&gt;
  int ownerDrawFlags;&lt;br /&gt;
  float borderSize;&lt;br /&gt;
  int staticFlags;&lt;br /&gt;
#ifndef PC&lt;br /&gt;
  int dynamicFlags[4];&lt;br /&gt;
#else&lt;br /&gt;
  int dynamicFlags[1];&lt;br /&gt;
#endif&lt;br /&gt;
  int nextTime;&lt;br /&gt;
  vec4_t foreColor;&lt;br /&gt;
  vec4_t backColor;&lt;br /&gt;
  vec4_t borderColor;&lt;br /&gt;
  vec4_t outlineColor;&lt;br /&gt;
  vec4_t disableColor;&lt;br /&gt;
  Material *background;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef windowDef_t Window;&lt;br /&gt;
&lt;br /&gt;
struct itemDef_s &lt;br /&gt;
{&lt;br /&gt;
  Window window;&lt;br /&gt;
#ifndef PC&lt;br /&gt;
  Rectangle textRect[4];&lt;br /&gt;
#else&lt;br /&gt;
  Rectangle textRect[1];&lt;br /&gt;
#endif&lt;br /&gt;
  int type;&lt;br /&gt;
  int dataType;&lt;br /&gt;
  int align;&lt;br /&gt;
  int fontEnum;&lt;br /&gt;
  int textAlignMode;&lt;br /&gt;
  float textAlignX;&lt;br /&gt;
  float textAlignY;&lt;br /&gt;
  float textScale;&lt;br /&gt;
  int textStyle;&lt;br /&gt;
  int gameMsgWindowIndex;&lt;br /&gt;
  int gameMsgWindowMode;&lt;br /&gt;
  const char *text;&lt;br /&gt;
  int textSaveGameInfo;&lt;br /&gt;
  menuDef_t *parent;&lt;br /&gt;
  MenuEventHandlerSet *mouseEnterText;&lt;br /&gt;
  MenuEventHandlerSet *mouseExitText;&lt;br /&gt;
  MenuEventHandlerSet *mouseEnter;&lt;br /&gt;
  MenuEventHandlerSet *mouseExit;&lt;br /&gt;
  MenuEventHandlerSet *action;&lt;br /&gt;
  MenuEventHandlerSet *accept;&lt;br /&gt;
  MenuEventHandlerSet *onFocus;&lt;br /&gt;
  MenuEventHandlerSet *leaveFocus;&lt;br /&gt;
  const char *dvar;&lt;br /&gt;
  const char *dvarTest;&lt;br /&gt;
  ItemKeyHandler *onKey;&lt;br /&gt;
  const char *enableDvar;&lt;br /&gt;
  int dvarFlags;&lt;br /&gt;
  snd_alias_list_t *focusSound;&lt;br /&gt;
  float special;&lt;br /&gt;
#ifndef PC&lt;br /&gt;
  int cursorPos[4];&lt;br /&gt;
#else&lt;br /&gt;
  int cursorPos[1];&lt;br /&gt;
#endif&lt;br /&gt;
  itemDefData_t typeData;&lt;br /&gt;
  int imageTrack;&lt;br /&gt;
  int floatExpressionCount;&lt;br /&gt;
  ItemFloatExpression *floatExpressions;&lt;br /&gt;
  Statement_s *visibleExp;&lt;br /&gt;
  Statement_s *disabledExp;&lt;br /&gt;
  Statement_s *textExp;&lt;br /&gt;
  Statement_s *materialExp;&lt;br /&gt;
  vec4_t glowColor;&lt;br /&gt;
  bool decayActive;&lt;br /&gt;
  int fxBirthTime;&lt;br /&gt;
  int fxLetterTime;&lt;br /&gt;
  int fxDecayStartTime;&lt;br /&gt;
  int fxDecayDuration;&lt;br /&gt;
  int lastSoundPlayedTime;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct StaticDvar&lt;br /&gt;
{&lt;br /&gt;
  dvar_s *dvar;&lt;br /&gt;
  const char *dvarName;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct StaticDvarList&lt;br /&gt;
{&lt;br /&gt;
  int numStaticDvars;&lt;br /&gt;
  StaticDvar **staticDvars;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct UIFunctionList&lt;br /&gt;
{&lt;br /&gt;
  int totalFunctions;&lt;br /&gt;
  Statement_s **functions;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct StringList&lt;br /&gt;
{&lt;br /&gt;
  int totalStrings;&lt;br /&gt;
  const char **strings;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ExpressionSupportingData&lt;br /&gt;
{&lt;br /&gt;
  UIFunctionList uifunctions;&lt;br /&gt;
  StaticDvarList staticDvarList;&lt;br /&gt;
  StringList uiStrings;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum transitionType&lt;br /&gt;
{&lt;br /&gt;
  TRANS_INACTIVE = 0x0,&lt;br /&gt;
  TRANS_LERP = 0x1,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum triggerType&lt;br /&gt;
{&lt;br /&gt;
  TRIGGER_NONE = 0x0,&lt;br /&gt;
  TRIGGER_CLOSEMENU = 0x1,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct menuTransition&lt;br /&gt;
{&lt;br /&gt;
  transitionType transitionType;&lt;br /&gt;
  int startTime;&lt;br /&gt;
  float startVal;&lt;br /&gt;
  float endVal;&lt;br /&gt;
  float time;&lt;br /&gt;
  triggerType endTriggerType;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct menuDef_t &lt;br /&gt;
{&lt;br /&gt;
  Window window;&lt;br /&gt;
  const char *font;&lt;br /&gt;
  int fullscreen;&lt;br /&gt;
  int itemCount;&lt;br /&gt;
  int fontIndex;&lt;br /&gt;
#ifndef PC&lt;br /&gt;
  int cursorItems[4];&lt;br /&gt;
#else&lt;br /&gt;
  int cursorItems[1];&lt;br /&gt;
#endif&lt;br /&gt;
  int fadeCycle;&lt;br /&gt;
  float fadeClamp;&lt;br /&gt;
  float fadeAmount;&lt;br /&gt;
  float fadeInAmount;&lt;br /&gt;
  float blurRadius;&lt;br /&gt;
  MenuEventHandlerSet *onOpen;&lt;br /&gt;
  MenuEventHandlerSet *onRequestClose;&lt;br /&gt;
  MenuEventHandlerSet *onClose;&lt;br /&gt;
  MenuEventHandlerSet *onEsc;&lt;br /&gt;
  ItemKeyHandler *execKeys;&lt;br /&gt;
  Statement_s *visibleExp;&lt;br /&gt;
  const char *allowedBinding;&lt;br /&gt;
  const char *soundName;&lt;br /&gt;
  int imageTrack;&lt;br /&gt;
  vec4_t focusColor;&lt;br /&gt;
  Statement_s *rectXExp;&lt;br /&gt;
  Statement_s *rectYExp;&lt;br /&gt;
  Statement_s *rectHExp;&lt;br /&gt;
  Statement_s *rectWExp; &lt;br /&gt;
#ifdef PC&lt;br /&gt;
  Statement_s *openSoundExp;&lt;br /&gt;
  Statement_s *closeSoundExp;&lt;br /&gt;
#endif&lt;br /&gt;
  itemDef_s **items; &lt;br /&gt;
#ifndef PC&lt;br /&gt;
  menuTransition scaleTransition[4];&lt;br /&gt;
  menuTransition alphaTransition[4];&lt;br /&gt;
  menuTransition xTransition[4];&lt;br /&gt;
  menuTransition yTransition[4];&lt;br /&gt;
#else&lt;br /&gt;
  char unknown[112];&lt;br /&gt;
#endif&lt;br /&gt;
  ExpressionSupportingData *expressionData;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(MW2)&amp;diff=1060</id>
		<title>FastFiles and Zone files (MW2)</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(MW2)&amp;diff=1060"/>
		<updated>2026-06-22T18:38:15Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* PS3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FastFiles]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
&lt;br /&gt;
== Main FastFile Structure ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 #define MAX_DB_HEADER_ENTRIES 0x3800&lt;br /&gt;
&lt;br /&gt;
 //Note, on PS3 all values are &amp;lt;&amp;lt; 1&lt;br /&gt;
 enum language_t&lt;br /&gt;
 {&lt;br /&gt;
   LANGUAGE_ENGLISH = 0x1,&lt;br /&gt;
   LANGUAGE_FRENCH = 0x2,&lt;br /&gt;
   LANGUAGE_GERMAN = 0x3,&lt;br /&gt;
   LANGUAGE_ITALIAN = 0x4,&lt;br /&gt;
   LANGUAGE_SPANISH = 0x5,&lt;br /&gt;
   LANGUAGE_BRITISH = 0x6,&lt;br /&gt;
   LANGUAGE_RUSSIAN = 0x7,&lt;br /&gt;
   LANGUAGE_POLISH = 0x8,&lt;br /&gt;
   LANGUAGE_KOREAN = 0x9,&lt;br /&gt;
   LANGUAGE_TAIWANESE = 0xA,&lt;br /&gt;
   LANGUAGE_JAPANESE = 0xB,&lt;br /&gt;
   LANGUAGE_CHINESE = 0xC,&lt;br /&gt;
   LANGUAGE_THAI = 0xD,&lt;br /&gt;
   LANGUAGE_LEET = 0xE,&lt;br /&gt;
   LANGUAGE_CZECH = 0xF,&lt;br /&gt;
   MAX_LANGUAGES&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 //Entry point for the FF.&lt;br /&gt;
 struct DB_Header&lt;br /&gt;
 {&lt;br /&gt;
   char magic[8];&lt;br /&gt;
   int version;&lt;br /&gt;
   bool allowOnlineUpdate;&lt;br /&gt;
   unsigned __int64 fileCreationTime;&lt;br /&gt;
   language_t languageMask;&lt;br /&gt;
   int entryCount;&lt;br /&gt;
   DbHeaderImageStreamEntry entries[]; //entryCount&lt;br /&gt;
   int fileSize;&lt;br /&gt;
   int maxFileSize;&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Magic ===&lt;br /&gt;
The magic is a string that is 8 characters long. It is either &amp;quot;IWff0100&amp;quot; or &amp;quot;IWffu100&amp;quot;. It indicates what is read after maxFileSize. If it is &amp;quot;IWff0100&amp;quot; then this FF is signed. If it is &amp;quot;IWffu100&amp;quot;, then this FF is unsigned.&lt;br /&gt;
=== Version ===&lt;br /&gt;
Helps to dictate the version of the FF, so Modern Warfare 3 FastFiles cannot be loaded on Modern Warfare 2. The Modern Warfare 2 version is 0x10D for console systems and 0x114 for PC.&lt;br /&gt;
 if (version &amp;gt; 0x10D)&lt;br /&gt;
  Com_Error(&amp;quot;Fastfile for zone &#039;%s&#039; is newer than client executable (version %d, expecting %d)&amp;quot;, version, 0x10D);&lt;br /&gt;
 else if (version &amp;lt; 0x10D)&lt;br /&gt;
  Com_Error(&amp;quot;Fastfile for zone &#039;%s&#039; is out of date (version %d, expecting %d)&amp;quot;, version, 0x10D);&lt;br /&gt;
=== AllowOnlineUpdate ===&lt;br /&gt;
Whether or not assets in this FF may be replaced by an FF loaded at a later time.&lt;br /&gt;
=== Entries ===&lt;br /&gt;
On PS3 Entries are the serialized source ranges and logical decode positions for streamed GfxImage payloads.&lt;br /&gt;
&lt;br /&gt;
The serialized header row order is not the same as the runtime record order. The engine reads:  DbHeaderImageStreamEntry, Then stores runtime records as: GfxImageStreamRecord.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
public struct DbHeaderImageStreamEntry&lt;br /&gt;
{&lt;br /&gt;
    uint FileIndex;      // 0 = current fastfile, 1..4 = imagefile%d&lt;br /&gt;
    uint SourceStart;    // compressed/source offset in selected file&lt;br /&gt;
    uint SourceEnd;      // compressed/source end offset, not size&lt;br /&gt;
    uint BlockOffset;    // low 16-bit/intra-block logical stream offset&lt;br /&gt;
    uint StreamOffset;   // full logical uncompressed stream offset&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public struct GfxImageStreamRecord&lt;br /&gt;
{&lt;br /&gt;
    uint SourceStart;&lt;br /&gt;
    uint BlockOffset;&lt;br /&gt;
    uint StreamOffset;&lt;br /&gt;
    uint SourceEnd;&lt;br /&gt;
    void* File;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Xbox 360 ====&lt;br /&gt;
 for (int32 i = 0; i &amp;lt; 0x0f; i++)&lt;br /&gt;
 {&lt;br /&gt;
   if (((1 &amp;lt;&amp;lt; i) &amp;amp; language) == 0)&lt;br /&gt;
     continue;&lt;br /&gt;
   else&lt;br /&gt;
     ReadBytes(((entryCount &amp;lt;&amp;lt; 1) + entryCount) &amp;lt;&amp;lt; 2);&lt;br /&gt;
 }&lt;br /&gt;
==== PS3 ====&lt;br /&gt;
The language selector comes from DB global/state storage:&lt;br /&gt;
&amp;lt;code&amp;gt;dbManager-&amp;gt;selectedLanguageMask; // offset +0x46024 in the manager block&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Behavior from the eboot:&lt;br /&gt;
* If selectedLanguageMask == 0, the first header’s languageMask initializes it.&lt;br /&gt;
* If it is already set, the header language mask must intersect it.&lt;br /&gt;
* The entry table for the selected language bit is read.&lt;br /&gt;
* Entry tables for other language bits are skipped with entryCount * 0x14.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    for (uint32_t i = 0; i &amp;lt; (language_t-&amp;gt;MAX_LANGUAGES - 1); i++)&lt;br /&gt;
    {&lt;br /&gt;
        uint32_t bit = 1u &amp;lt;&amp;lt; i;&lt;br /&gt;
&lt;br /&gt;
        if ((DB_Header-&amp;gt;languageMask &amp;amp; bit) == 0)&lt;br /&gt;
            continue;&lt;br /&gt;
&lt;br /&gt;
        if (DB_Header-&amp;gt;entryCount &amp;gt; MAX_DB_HEADER_ENTRIES)&lt;br /&gt;
            Com_Error(&amp;quot;Too many DB header entries&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        uint32_t entryBytes = DB_Header-&amp;gt;entryCount * 0x14;&lt;br /&gt;
&lt;br /&gt;
        if (bit != db-&amp;gt;selectedLanguageMask) //See notes above&lt;br /&gt;
        {&lt;br /&gt;
            SkipBytes(r, entryBytes);&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        for (uint32_t entryIndex = 0;&lt;br /&gt;
             entryIndex &amp;lt; DB_Header-&amp;gt;entryCount;&lt;br /&gt;
             entryIndex++)&lt;br /&gt;
        {&lt;br /&gt;
            DbHeaderImageStreamEntry *entry = &amp;amp;DB_Header-&amp;gt;entries[entryIndex];&lt;br /&gt;
&lt;br /&gt;
            entry-&amp;gt;fileIndex    = ReadU32BE(r);&lt;br /&gt;
            entry-&amp;gt;sourceStart  = ReadU32BE(r);&lt;br /&gt;
            entry-&amp;gt;sourceEnd    = ReadU32BE(r);&lt;br /&gt;
            entry-&amp;gt;blockOffset  = ReadU32BE(r);&lt;br /&gt;
            entry-&amp;gt;streamOffset = ReadU32BE(r);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== File Sizes ===&lt;br /&gt;
The fileSize is the size of the FF, everything included. The maxFileSize is the highest number that fileSize can be, and in most FFs they are equal.&lt;br /&gt;
&lt;br /&gt;
== Subheader ==&lt;br /&gt;
The rest of the FF is read depending on what the main FF magic was. If the magic was &amp;quot;IWff0100&amp;quot; then the FF is signed. If it was &amp;quot;IWffu100&amp;quot;, the FF is unsigned.&lt;br /&gt;
=== Unsigned Files ===&lt;br /&gt;
PS3 only supports unsigned fastfiles. For Xbox 360, only single player FastFiles are unsigned. Unsigned FastFiles are very simple. The only data remaining is compressed zlib data. Decompressing the data yields the [[#Zone File|zone file]].&lt;br /&gt;
=== Signed Files ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 struct DB_AuthHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[32];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthSignatureHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[256];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthSubheader&lt;br /&gt;
 {&lt;br /&gt;
   char fastfileName[32];&lt;br /&gt;
   int reserved;&lt;br /&gt;
   DB_AuthHash masterBlockHashes[244];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthXBlock&lt;br /&gt;
 {&lt;br /&gt;
 #ifdef XBOX&lt;br /&gt;
   DB_AuthHash blockSignature[0x100];&lt;br /&gt;
   char blockData[0x200000];&lt;br /&gt;
 #elif defined PS3&lt;br /&gt;
   char blockData[0x10000];&lt;br /&gt;
 #endif&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 //Sub DB_AuthHeader, continuation on the earlier.&lt;br /&gt;
 struct DB_AuthHeader&lt;br /&gt;
 {&lt;br /&gt;
   char magic[8];&lt;br /&gt;
   int reserved;&lt;br /&gt;
   DB_AuthHash subheaderHash;&lt;br /&gt;
   DB_AuthSignatureHash signedSubheaderHash;&lt;br /&gt;
   DB_AuthSubHeader subheader;&lt;br /&gt;
   DB_AuthXBlock xBlocks[];&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The signatures on the XBlocks are checked as the FastFile loads. Then the sub-header master block hashes are checked, followed by the signedSubheaderHash, and lastly the subheaderHash. If any fail, then the loading of the FF is aborted. Only Activision and the game developers can generate the RSA signatures. &lt;br /&gt;
==== Magic ====&lt;br /&gt;
The subheader magic is always &amp;quot;IWffs100&amp;quot;.&lt;br /&gt;
==== XBlocks ====&lt;br /&gt;
XBlocks are used until they are no longer needed. If the compressed data can fit into 1, then only 1 will exist.&lt;br /&gt;
&lt;br /&gt;
== Compression ==&lt;br /&gt;
=== PS3 ===&lt;br /&gt;
After the zone file is created, it is split into blocks each 0x10000 bytes, the last block being padded with zeroes if not 0x10000 bytes long. Each block is compressed using default zlib compression. The size of the compressed block is stored as an unsigned 16 bit integer over the zlib header (0x78DA). Compressed blocks are concatenated and appended to the fastfile.&lt;br /&gt;
&lt;br /&gt;
=== Xbox 360 ===&lt;br /&gt;
Once the zone file is created, the entire zone is compressed using default zlib compression. If the FastFile is unsigned (single player) then the data is simply concatenated to the header. Signed files split the data up into 0x200000 byte XBlocks, each with a 0x2000 byte hash block.&lt;br /&gt;
== Zone File ==&lt;br /&gt;
The zone file is the decompressed data from an FF. &lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
The XFile header is loaded first. It contains XBlock sizes to be allocated for g_streamBlocks.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum&lt;br /&gt;
{&lt;br /&gt;
 XFILE_BLOCK_TEMP	= 0,&lt;br /&gt;
 XFILE_BLOCK_PHYSICAL	= 1,&lt;br /&gt;
 XFILE_BLOCK_RUNTIME	= 2,&lt;br /&gt;
 XFILE_BLOCK_VIRTUAL	= 3,&lt;br /&gt;
 XFILE_BLOCK_LARGE	= 4,&lt;br /&gt;
 XFILE_BLOCK_CALLBACK	= 5,&lt;br /&gt;
#if defined(PC) || defined(PS3)&lt;br /&gt;
 XFILE_BLOCK_VERTEX	= 6,&lt;br /&gt;
 #ifdef PC&lt;br /&gt;
 XFILE_BLOCK_INDEX	= 7,&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
 MAX_XFILE_COUNT&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
struct XFile&lt;br /&gt;
{&lt;br /&gt;
  int size;&lt;br /&gt;
  int externalSize;&lt;br /&gt;
  int blockSize[MAX_XFILE_COUNT];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== g_streamBlocks ===&lt;br /&gt;
Remember that g_streamBlocks are loaded as the zone is read. Here are some examples. The raw dumps are collapsed by default to keep the page readable:&lt;br /&gt;
&lt;br /&gt;
==== Temp ====&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #a2a9b1; padding:0.5em; margin:0.5em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Temp block dump&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0000000B 40000001 000001AF 400000F5 40153A79 00000000 00000000 40153A82 401537C1 42820000 00000000 00000000 00000001 00000000 00000168 00000000 00000000 00000000 00000000 4000844B 00000000 00000000 00000085 00000085 0000016E 000001F4 00000001 00000000 00000000 00000000 00000000 00000000 00000000 40153A59 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 40000E89 4012CA4D 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Large ====&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #a2a9b1; padding:0.5em; margin:0.5em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Large block dump&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
00000000 4000002D 4000003E 40000052 40000066 4000007A 4000008F 4000009F 400000B0 400000C0 400000DA 6D656C65 655F6B6E 6966655F 73746162 00776561 705F6D31 3838375F 6C696674 5F706C72 00776561 705F6D31 3838375F 6F70656E 5F706C72 00776561 705F6D31 3838375F 6C6F6F70 5F706C72 00776561 705F6D31 3838375F 636C6F73 655F706C 72007669 65776D6F 64656C5F 736D616C 6C007669 65776D6F 64656C5F 6D656469 756D0076 6965776D 6F64656C 5F6C6172 67650077 6561705F 736D6F6B 65677265 6E616465 5F70696E 5F706C72 00776561 705F736D 6F6B6567 72656E61 64655F66 6972655F 706C7200 00000008 00000011 00000018 00000011 00000024 00000011 00000024 00000011 00000024 00000011 00000026 00000011 00000026 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000008 00000011 00000008 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 0000001B 00000011 0000001B 00000011 0000001B 00000011 0000001B 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 0000001B 00000011 0000001B 00000011 0000001B 00000011 00000023 00000011 2C326400 75695F6D 702F6D61 696E2E6D 656E7500 0000001D 0000001D ........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asset List ===&lt;br /&gt;
After the XFile header is the asset list. The asset list contains a list of script strings and a list of assets. The fastfile compiler creates a rawfile as the last asset which contains any compiler errors (as seen in french code_post_gfx_mp.ff).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct XAsset&lt;br /&gt;
{&lt;br /&gt;
  XAssetType type; //See enum below&lt;br /&gt;
  XAssetHeader * header;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct XAssetList&lt;br /&gt;
{&lt;br /&gt;
  int scriptStringCount;&lt;br /&gt;
  const char * * scriptStrings;&lt;br /&gt;
  int assetCount;&lt;br /&gt;
  XAsset *assets;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== General [[:Category:Assets|Asset]] Information ==&lt;br /&gt;
=== Asset Types ===&lt;br /&gt;
The types of assets loaded are determined by this enum.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; class=&amp;quot;article-table&amp;quot; style=&amp;quot;font-size:13px;line-height:21px;width:500px;height:500px;&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Asset Type&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Xbox ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|PS3 ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|PC ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Is Used&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Max Count&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Asset Size (PC)&lt;br /&gt;
|-&lt;br /&gt;
|physpreset&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|True&lt;br /&gt;
|0x40&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|phys_collmap&lt;br /&gt;
|0x01&lt;br /&gt;
|0x01&lt;br /&gt;
|0x01&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x48&lt;br /&gt;
|-&lt;br /&gt;
|xanim&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x58&lt;br /&gt;
|-&lt;br /&gt;
|xmodelsurfs&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x24&lt;br /&gt;
|-&lt;br /&gt;
|xmodel&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|True&lt;br /&gt;
|0x600&lt;br /&gt;
|0x130&lt;br /&gt;
|-&lt;br /&gt;
|material&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x60&lt;br /&gt;
|-&lt;br /&gt;
|pixelshader&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|True&lt;br /&gt;
|0x1FA0&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|vertexshader&lt;br /&gt;
|N/A&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|vertexdecl&lt;br /&gt;
|N/A&lt;br /&gt;
|N/A&lt;br /&gt;
|0x08&lt;br /&gt;
|True&lt;br /&gt;
|0x30&lt;br /&gt;
|0x64&lt;br /&gt;
|-&lt;br /&gt;
|techset&lt;br /&gt;
|0x07&lt;br /&gt;
|0x08&lt;br /&gt;
|0x09&lt;br /&gt;
|True&lt;br /&gt;
|0x300&lt;br /&gt;
|0xCC&lt;br /&gt;
|-&lt;br /&gt;
|image&lt;br /&gt;
|0x08&lt;br /&gt;
|0x09&lt;br /&gt;
|0x0A&lt;br /&gt;
|True&lt;br /&gt;
|0xE00&lt;br /&gt;
|0x20&lt;br /&gt;
|-&lt;br /&gt;
|sound&lt;br /&gt;
|0x09&lt;br /&gt;
|0x0A&lt;br /&gt;
|0x0B&lt;br /&gt;
|True&lt;br /&gt;
|0x3E80&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|sndcurve&lt;br /&gt;
|0x0A&lt;br /&gt;
|0x0B&lt;br /&gt;
|0x0C&lt;br /&gt;
|True&lt;br /&gt;
|0x40&lt;br /&gt;
|0x88&lt;br /&gt;
|-&lt;br /&gt;
|loaded_sound&lt;br /&gt;
|0x0B&lt;br /&gt;
|0x0C&lt;br /&gt;
|0x0D&lt;br /&gt;
|True&lt;br /&gt;
|0x546&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|col_map_sp&lt;br /&gt;
|0x0C&lt;br /&gt;
|0x0D&lt;br /&gt;
|0x0E&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x100&lt;br /&gt;
|-&lt;br /&gt;
|col_map_mp&lt;br /&gt;
|0x0D&lt;br /&gt;
|0x0E&lt;br /&gt;
|0x0F&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x100&lt;br /&gt;
|-&lt;br /&gt;
|com_map&lt;br /&gt;
|0x0E&lt;br /&gt;
|0x0F&lt;br /&gt;
|0x10&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|game_map_sp&lt;br /&gt;
|0x0F&lt;br /&gt;
|0x10&lt;br /&gt;
|0x11&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x38&lt;br /&gt;
|-&lt;br /&gt;
|game_map_mp&lt;br /&gt;
|0x10&lt;br /&gt;
|0x11&lt;br /&gt;
|0x12&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|map_ents&lt;br /&gt;
|0x11&lt;br /&gt;
|0x12&lt;br /&gt;
|0x13&lt;br /&gt;
|True&lt;br /&gt;
|2&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|fx_map&lt;br /&gt;
|0x12&lt;br /&gt;
|0x13&lt;br /&gt;
|0x14&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x74&lt;br /&gt;
|-&lt;br /&gt;
|gfx_map&lt;br /&gt;
|0x13&lt;br /&gt;
|0x14&lt;br /&gt;
|0x15&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x274&lt;br /&gt;
|-&lt;br /&gt;
|lightdef&lt;br /&gt;
|0x14&lt;br /&gt;
|0x15&lt;br /&gt;
|0x16&lt;br /&gt;
|True&lt;br /&gt;
|0x20&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|ui_map&lt;br /&gt;
|0x15&lt;br /&gt;
|0x16&lt;br /&gt;
|0x17&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|font&lt;br /&gt;
|0x16&lt;br /&gt;
|0x17&lt;br /&gt;
|0x18&lt;br /&gt;
|True&lt;br /&gt;
|0x10&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|menufile&lt;br /&gt;
|0x17&lt;br /&gt;
|0x18&lt;br /&gt;
|0x19&lt;br /&gt;
|True&lt;br /&gt;
|0x80&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|menu&lt;br /&gt;
|0x18&lt;br /&gt;
|0x19&lt;br /&gt;
|0x1A&lt;br /&gt;
|True&lt;br /&gt;
|0x264&lt;br /&gt;
|0x190&lt;br /&gt;
|-&lt;br /&gt;
|localize&lt;br /&gt;
|0x19&lt;br /&gt;
|0x1A&lt;br /&gt;
|0x1B&lt;br /&gt;
|True&lt;br /&gt;
|0x1B58&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|weapon&lt;br /&gt;
|0x1A&lt;br /&gt;
|0x1B&lt;br /&gt;
|0x1C&lt;br /&gt;
|True&lt;br /&gt;
|0x578&lt;br /&gt;
|0x684&lt;br /&gt;
|-&lt;br /&gt;
|snddriverglobals&lt;br /&gt;
|0x1B&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x1D&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|fx&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x1D&lt;br /&gt;
|0x1E&lt;br /&gt;
|True&lt;br /&gt;
|0x258&lt;br /&gt;
|0x20&lt;br /&gt;
|-&lt;br /&gt;
|impactfx&lt;br /&gt;
|0x1D&lt;br /&gt;
|0x1E&lt;br /&gt;
|0x1F&lt;br /&gt;
|True&lt;br /&gt;
|4&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|aitype&lt;br /&gt;
|0x1E&lt;br /&gt;
|0x1F&lt;br /&gt;
|0x20&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|mptype&lt;br /&gt;
|0x1F&lt;br /&gt;
|0x20&lt;br /&gt;
|0x21&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|character&lt;br /&gt;
|0x20&lt;br /&gt;
|0x21&lt;br /&gt;
|0x22&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|xmodelalias&lt;br /&gt;
|0x21&lt;br /&gt;
|0x22&lt;br /&gt;
|0x23&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|rawfile&lt;br /&gt;
|0x22&lt;br /&gt;
|0x23&lt;br /&gt;
|0x24&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|stringtable&lt;br /&gt;
|0x23&lt;br /&gt;
|0x24&lt;br /&gt;
|0x25&lt;br /&gt;
|True&lt;br /&gt;
|0x190&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|leaderboarddef&lt;br /&gt;
|0x24&lt;br /&gt;
|0x25&lt;br /&gt;
|0x26&lt;br /&gt;
|True&lt;br /&gt;
|0x64&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|structureddatadef&lt;br /&gt;
|0x25&lt;br /&gt;
|0x26&lt;br /&gt;
|0x27&lt;br /&gt;
|True&lt;br /&gt;
|0x18&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|tracer&lt;br /&gt;
|0x26&lt;br /&gt;
|0x27&lt;br /&gt;
|0x28&lt;br /&gt;
|True&lt;br /&gt;
|0x20&lt;br /&gt;
|0x70&lt;br /&gt;
|-&lt;br /&gt;
|vehicle&lt;br /&gt;
|0x27&lt;br /&gt;
|0x28&lt;br /&gt;
|0x29&lt;br /&gt;
|True&lt;br /&gt;
|0x80&lt;br /&gt;
|0x2D0&lt;br /&gt;
|-&lt;br /&gt;
|addon_map_ents&lt;br /&gt;
|0x28&lt;br /&gt;
|0x29&lt;br /&gt;
|0x2A&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x24&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(MW2)&amp;diff=1059</id>
		<title>FastFiles and Zone files (MW2)</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(MW2)&amp;diff=1059"/>
		<updated>2026-06-22T18:35:19Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Main FastFile Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FastFiles]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
&lt;br /&gt;
== Main FastFile Structure ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 #define MAX_DB_HEADER_ENTRIES 0x3800&lt;br /&gt;
&lt;br /&gt;
 //Note, on PS3 all values are &amp;lt;&amp;lt; 1&lt;br /&gt;
 enum language_t&lt;br /&gt;
 {&lt;br /&gt;
   LANGUAGE_ENGLISH = 0x1,&lt;br /&gt;
   LANGUAGE_FRENCH = 0x2,&lt;br /&gt;
   LANGUAGE_GERMAN = 0x3,&lt;br /&gt;
   LANGUAGE_ITALIAN = 0x4,&lt;br /&gt;
   LANGUAGE_SPANISH = 0x5,&lt;br /&gt;
   LANGUAGE_BRITISH = 0x6,&lt;br /&gt;
   LANGUAGE_RUSSIAN = 0x7,&lt;br /&gt;
   LANGUAGE_POLISH = 0x8,&lt;br /&gt;
   LANGUAGE_KOREAN = 0x9,&lt;br /&gt;
   LANGUAGE_TAIWANESE = 0xA,&lt;br /&gt;
   LANGUAGE_JAPANESE = 0xB,&lt;br /&gt;
   LANGUAGE_CHINESE = 0xC,&lt;br /&gt;
   LANGUAGE_THAI = 0xD,&lt;br /&gt;
   LANGUAGE_LEET = 0xE,&lt;br /&gt;
   LANGUAGE_CZECH = 0xF,&lt;br /&gt;
   MAX_LANGUAGES&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 //Entry point for the FF.&lt;br /&gt;
 struct DB_Header&lt;br /&gt;
 {&lt;br /&gt;
   char magic[8];&lt;br /&gt;
   int version;&lt;br /&gt;
   bool allowOnlineUpdate;&lt;br /&gt;
   unsigned __int64 fileCreationTime;&lt;br /&gt;
   language_t languageMask;&lt;br /&gt;
   int entryCount;&lt;br /&gt;
   DbHeaderImageStreamEntry entries[]; //entryCount&lt;br /&gt;
   int fileSize;&lt;br /&gt;
   int maxFileSize;&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Magic ===&lt;br /&gt;
The magic is a string that is 8 characters long. It is either &amp;quot;IWff0100&amp;quot; or &amp;quot;IWffu100&amp;quot;. It indicates what is read after maxFileSize. If it is &amp;quot;IWff0100&amp;quot; then this FF is signed. If it is &amp;quot;IWffu100&amp;quot;, then this FF is unsigned.&lt;br /&gt;
=== Version ===&lt;br /&gt;
Helps to dictate the version of the FF, so Modern Warfare 3 FastFiles cannot be loaded on Modern Warfare 2. The Modern Warfare 2 version is 0x10D for console systems and 0x114 for PC.&lt;br /&gt;
 if (version &amp;gt; 0x10D)&lt;br /&gt;
  Com_Error(&amp;quot;Fastfile for zone &#039;%s&#039; is newer than client executable (version %d, expecting %d)&amp;quot;, version, 0x10D);&lt;br /&gt;
 else if (version &amp;lt; 0x10D)&lt;br /&gt;
  Com_Error(&amp;quot;Fastfile for zone &#039;%s&#039; is out of date (version %d, expecting %d)&amp;quot;, version, 0x10D);&lt;br /&gt;
=== AllowOnlineUpdate ===&lt;br /&gt;
Whether or not assets in this FF may be replaced by an FF loaded at a later time.&lt;br /&gt;
=== Entries ===&lt;br /&gt;
On PS3 Entries are the serialized source ranges and logical decode positions for streamed GfxImage payloads.&lt;br /&gt;
&lt;br /&gt;
The serialized header row order is not the same as the runtime record order. The engine reads:  DbHeaderImageStreamEntry, Then stores runtime records as: GfxImageStreamRecord.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
public struct DbHeaderImageStreamEntry&lt;br /&gt;
{&lt;br /&gt;
    uint FileIndex;      // 0 = current fastfile, 1..4 = imagefile%d&lt;br /&gt;
    uint SourceStart;    // compressed/source offset in selected file&lt;br /&gt;
    uint SourceEnd;      // compressed/source end offset, not size&lt;br /&gt;
    uint BlockOffset;    // low 16-bit/intra-block logical stream offset&lt;br /&gt;
    uint StreamOffset;   // full logical uncompressed stream offset&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public struct GfxImageStreamRecord&lt;br /&gt;
{&lt;br /&gt;
    uint SourceStart;&lt;br /&gt;
    uint BlockOffset;&lt;br /&gt;
    uint StreamOffset;&lt;br /&gt;
    uint SourceEnd;&lt;br /&gt;
    void* File;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Xbox 360 ====&lt;br /&gt;
 for (int32 i = 0; i &amp;lt; 0x0f; i++)&lt;br /&gt;
 {&lt;br /&gt;
   if (((1 &amp;lt;&amp;lt; i) &amp;amp; language) == 0)&lt;br /&gt;
     continue;&lt;br /&gt;
   else&lt;br /&gt;
     ReadBytes(((entryCount &amp;lt;&amp;lt; 1) + entryCount) &amp;lt;&amp;lt; 2);&lt;br /&gt;
 }&lt;br /&gt;
==== PS3 ====&lt;br /&gt;
The language selector comes from DB global/state storage:&lt;br /&gt;
&amp;lt;code&amp;gt;dbManager-&amp;gt;selectedLanguageMask; // offset +0x46024 in the manager block&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Behavior from the eboot:&lt;br /&gt;
* If selectedLanguageMask == 0, the first header’s languageMask initializes it.&lt;br /&gt;
* If it is already set, the header language mask must intersect it.&lt;br /&gt;
* The entry table for the selected language bit is read.&lt;br /&gt;
* Entry tables for other language bits are skipped with entryCount * 0x14.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
    for (uint32_t i = 0; i &amp;lt; (language_t-&amp;gt;MAX_LANGUAGES - 1); i++)&lt;br /&gt;
    {&lt;br /&gt;
        uint32_t bit = 1u &amp;lt;&amp;lt; i;&lt;br /&gt;
&lt;br /&gt;
        if ((DB_Header-&amp;gt;languageMask &amp;amp; bit) == 0)&lt;br /&gt;
            continue;&lt;br /&gt;
&lt;br /&gt;
        uint32_t entryBytes = DB_Header-&amp;gt;entryCount * 0x14;&lt;br /&gt;
&lt;br /&gt;
        if (bit != db-&amp;gt;selectedLanguageMask) //See notes above&lt;br /&gt;
        {&lt;br /&gt;
            SkipBytes(r, entryBytes);&lt;br /&gt;
            continue;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        for (uint32_t entryIndex = 0;&lt;br /&gt;
             entryIndex &amp;lt; DB_Header-&amp;gt;entryCount;&lt;br /&gt;
             entryIndex++)&lt;br /&gt;
        {&lt;br /&gt;
            DbHeaderImageStreamEntry *entry = &amp;amp;DB_Header-&amp;gt;entries[entryIndex];&lt;br /&gt;
&lt;br /&gt;
            entry-&amp;gt;fileIndex    = ReadU32BE(r);&lt;br /&gt;
            entry-&amp;gt;sourceStart  = ReadU32BE(r);&lt;br /&gt;
            entry-&amp;gt;sourceEnd    = ReadU32BE(r);&lt;br /&gt;
            entry-&amp;gt;blockOffset  = ReadU32BE(r);&lt;br /&gt;
            entry-&amp;gt;streamOffset = ReadU32BE(r);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== File Sizes ===&lt;br /&gt;
The fileSize is the size of the FF, everything included. The maxFileSize is the highest number that fileSize can be, and in most FFs they are equal.&lt;br /&gt;
&lt;br /&gt;
== Subheader ==&lt;br /&gt;
The rest of the FF is read depending on what the main FF magic was. If the magic was &amp;quot;IWff0100&amp;quot; then the FF is signed. If it was &amp;quot;IWffu100&amp;quot;, the FF is unsigned.&lt;br /&gt;
=== Unsigned Files ===&lt;br /&gt;
PS3 only supports unsigned fastfiles. For Xbox 360, only single player FastFiles are unsigned. Unsigned FastFiles are very simple. The only data remaining is compressed zlib data. Decompressing the data yields the [[#Zone File|zone file]].&lt;br /&gt;
=== Signed Files ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 struct DB_AuthHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[32];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthSignatureHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[256];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthSubheader&lt;br /&gt;
 {&lt;br /&gt;
   char fastfileName[32];&lt;br /&gt;
   int reserved;&lt;br /&gt;
   DB_AuthHash masterBlockHashes[244];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthXBlock&lt;br /&gt;
 {&lt;br /&gt;
 #ifdef XBOX&lt;br /&gt;
   DB_AuthHash blockSignature[0x100];&lt;br /&gt;
   char blockData[0x200000];&lt;br /&gt;
 #elif defined PS3&lt;br /&gt;
   char blockData[0x10000];&lt;br /&gt;
 #endif&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 //Sub DB_AuthHeader, continuation on the earlier.&lt;br /&gt;
 struct DB_AuthHeader&lt;br /&gt;
 {&lt;br /&gt;
   char magic[8];&lt;br /&gt;
   int reserved;&lt;br /&gt;
   DB_AuthHash subheaderHash;&lt;br /&gt;
   DB_AuthSignatureHash signedSubheaderHash;&lt;br /&gt;
   DB_AuthSubHeader subheader;&lt;br /&gt;
   DB_AuthXBlock xBlocks[];&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The signatures on the XBlocks are checked as the FastFile loads. Then the sub-header master block hashes are checked, followed by the signedSubheaderHash, and lastly the subheaderHash. If any fail, then the loading of the FF is aborted. Only Activision and the game developers can generate the RSA signatures. &lt;br /&gt;
==== Magic ====&lt;br /&gt;
The subheader magic is always &amp;quot;IWffs100&amp;quot;.&lt;br /&gt;
==== XBlocks ====&lt;br /&gt;
XBlocks are used until they are no longer needed. If the compressed data can fit into 1, then only 1 will exist.&lt;br /&gt;
&lt;br /&gt;
== Compression ==&lt;br /&gt;
=== PS3 ===&lt;br /&gt;
After the zone file is created, it is split into blocks each 0x10000 bytes, the last block being padded with zeroes if not 0x10000 bytes long. Each block is compressed using default zlib compression. The size of the compressed block is stored as an unsigned 16 bit integer over the zlib header (0x78DA). Compressed blocks are concatenated and appended to the fastfile.&lt;br /&gt;
&lt;br /&gt;
=== Xbox 360 ===&lt;br /&gt;
Once the zone file is created, the entire zone is compressed using default zlib compression. If the FastFile is unsigned (single player) then the data is simply concatenated to the header. Signed files split the data up into 0x200000 byte XBlocks, each with a 0x2000 byte hash block.&lt;br /&gt;
== Zone File ==&lt;br /&gt;
The zone file is the decompressed data from an FF. &lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
The XFile header is loaded first. It contains XBlock sizes to be allocated for g_streamBlocks.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum&lt;br /&gt;
{&lt;br /&gt;
 XFILE_BLOCK_TEMP	= 0,&lt;br /&gt;
 XFILE_BLOCK_PHYSICAL	= 1,&lt;br /&gt;
 XFILE_BLOCK_RUNTIME	= 2,&lt;br /&gt;
 XFILE_BLOCK_VIRTUAL	= 3,&lt;br /&gt;
 XFILE_BLOCK_LARGE	= 4,&lt;br /&gt;
 XFILE_BLOCK_CALLBACK	= 5,&lt;br /&gt;
#if defined(PC) || defined(PS3)&lt;br /&gt;
 XFILE_BLOCK_VERTEX	= 6,&lt;br /&gt;
 #ifdef PC&lt;br /&gt;
 XFILE_BLOCK_INDEX	= 7,&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
 MAX_XFILE_COUNT&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
struct XFile&lt;br /&gt;
{&lt;br /&gt;
  int size;&lt;br /&gt;
  int externalSize;&lt;br /&gt;
  int blockSize[MAX_XFILE_COUNT];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== g_streamBlocks ===&lt;br /&gt;
Remember that g_streamBlocks are loaded as the zone is read. Here are some examples. The raw dumps are collapsed by default to keep the page readable:&lt;br /&gt;
&lt;br /&gt;
==== Temp ====&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #a2a9b1; padding:0.5em; margin:0.5em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Temp block dump&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0000000B 40000001 000001AF 400000F5 40153A79 00000000 00000000 40153A82 401537C1 42820000 00000000 00000000 00000001 00000000 00000168 00000000 00000000 00000000 00000000 4000844B 00000000 00000000 00000085 00000085 0000016E 000001F4 00000001 00000000 00000000 00000000 00000000 00000000 00000000 40153A59 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 40000E89 4012CA4D 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Large ====&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #a2a9b1; padding:0.5em; margin:0.5em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Large block dump&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
00000000 4000002D 4000003E 40000052 40000066 4000007A 4000008F 4000009F 400000B0 400000C0 400000DA 6D656C65 655F6B6E 6966655F 73746162 00776561 705F6D31 3838375F 6C696674 5F706C72 00776561 705F6D31 3838375F 6F70656E 5F706C72 00776561 705F6D31 3838375F 6C6F6F70 5F706C72 00776561 705F6D31 3838375F 636C6F73 655F706C 72007669 65776D6F 64656C5F 736D616C 6C007669 65776D6F 64656C5F 6D656469 756D0076 6965776D 6F64656C 5F6C6172 67650077 6561705F 736D6F6B 65677265 6E616465 5F70696E 5F706C72 00776561 705F736D 6F6B6567 72656E61 64655F66 6972655F 706C7200 00000008 00000011 00000018 00000011 00000024 00000011 00000024 00000011 00000024 00000011 00000026 00000011 00000026 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000008 00000011 00000008 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 0000001B 00000011 0000001B 00000011 0000001B 00000011 0000001B 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 0000001B 00000011 0000001B 00000011 0000001B 00000011 00000023 00000011 2C326400 75695F6D 702F6D61 696E2E6D 656E7500 0000001D 0000001D ........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asset List ===&lt;br /&gt;
After the XFile header is the asset list. The asset list contains a list of script strings and a list of assets. The fastfile compiler creates a rawfile as the last asset which contains any compiler errors (as seen in french code_post_gfx_mp.ff).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct XAsset&lt;br /&gt;
{&lt;br /&gt;
  XAssetType type; //See enum below&lt;br /&gt;
  XAssetHeader * header;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct XAssetList&lt;br /&gt;
{&lt;br /&gt;
  int scriptStringCount;&lt;br /&gt;
  const char * * scriptStrings;&lt;br /&gt;
  int assetCount;&lt;br /&gt;
  XAsset *assets;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== General [[:Category:Assets|Asset]] Information ==&lt;br /&gt;
=== Asset Types ===&lt;br /&gt;
The types of assets loaded are determined by this enum.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; class=&amp;quot;article-table&amp;quot; style=&amp;quot;font-size:13px;line-height:21px;width:500px;height:500px;&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Asset Type&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Xbox ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|PS3 ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|PC ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Is Used&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Max Count&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Asset Size (PC)&lt;br /&gt;
|-&lt;br /&gt;
|physpreset&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|True&lt;br /&gt;
|0x40&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|phys_collmap&lt;br /&gt;
|0x01&lt;br /&gt;
|0x01&lt;br /&gt;
|0x01&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x48&lt;br /&gt;
|-&lt;br /&gt;
|xanim&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x58&lt;br /&gt;
|-&lt;br /&gt;
|xmodelsurfs&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x24&lt;br /&gt;
|-&lt;br /&gt;
|xmodel&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|True&lt;br /&gt;
|0x600&lt;br /&gt;
|0x130&lt;br /&gt;
|-&lt;br /&gt;
|material&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x60&lt;br /&gt;
|-&lt;br /&gt;
|pixelshader&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|True&lt;br /&gt;
|0x1FA0&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|vertexshader&lt;br /&gt;
|N/A&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|vertexdecl&lt;br /&gt;
|N/A&lt;br /&gt;
|N/A&lt;br /&gt;
|0x08&lt;br /&gt;
|True&lt;br /&gt;
|0x30&lt;br /&gt;
|0x64&lt;br /&gt;
|-&lt;br /&gt;
|techset&lt;br /&gt;
|0x07&lt;br /&gt;
|0x08&lt;br /&gt;
|0x09&lt;br /&gt;
|True&lt;br /&gt;
|0x300&lt;br /&gt;
|0xCC&lt;br /&gt;
|-&lt;br /&gt;
|image&lt;br /&gt;
|0x08&lt;br /&gt;
|0x09&lt;br /&gt;
|0x0A&lt;br /&gt;
|True&lt;br /&gt;
|0xE00&lt;br /&gt;
|0x20&lt;br /&gt;
|-&lt;br /&gt;
|sound&lt;br /&gt;
|0x09&lt;br /&gt;
|0x0A&lt;br /&gt;
|0x0B&lt;br /&gt;
|True&lt;br /&gt;
|0x3E80&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|sndcurve&lt;br /&gt;
|0x0A&lt;br /&gt;
|0x0B&lt;br /&gt;
|0x0C&lt;br /&gt;
|True&lt;br /&gt;
|0x40&lt;br /&gt;
|0x88&lt;br /&gt;
|-&lt;br /&gt;
|loaded_sound&lt;br /&gt;
|0x0B&lt;br /&gt;
|0x0C&lt;br /&gt;
|0x0D&lt;br /&gt;
|True&lt;br /&gt;
|0x546&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|col_map_sp&lt;br /&gt;
|0x0C&lt;br /&gt;
|0x0D&lt;br /&gt;
|0x0E&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x100&lt;br /&gt;
|-&lt;br /&gt;
|col_map_mp&lt;br /&gt;
|0x0D&lt;br /&gt;
|0x0E&lt;br /&gt;
|0x0F&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x100&lt;br /&gt;
|-&lt;br /&gt;
|com_map&lt;br /&gt;
|0x0E&lt;br /&gt;
|0x0F&lt;br /&gt;
|0x10&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|game_map_sp&lt;br /&gt;
|0x0F&lt;br /&gt;
|0x10&lt;br /&gt;
|0x11&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x38&lt;br /&gt;
|-&lt;br /&gt;
|game_map_mp&lt;br /&gt;
|0x10&lt;br /&gt;
|0x11&lt;br /&gt;
|0x12&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|map_ents&lt;br /&gt;
|0x11&lt;br /&gt;
|0x12&lt;br /&gt;
|0x13&lt;br /&gt;
|True&lt;br /&gt;
|2&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|fx_map&lt;br /&gt;
|0x12&lt;br /&gt;
|0x13&lt;br /&gt;
|0x14&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x74&lt;br /&gt;
|-&lt;br /&gt;
|gfx_map&lt;br /&gt;
|0x13&lt;br /&gt;
|0x14&lt;br /&gt;
|0x15&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x274&lt;br /&gt;
|-&lt;br /&gt;
|lightdef&lt;br /&gt;
|0x14&lt;br /&gt;
|0x15&lt;br /&gt;
|0x16&lt;br /&gt;
|True&lt;br /&gt;
|0x20&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|ui_map&lt;br /&gt;
|0x15&lt;br /&gt;
|0x16&lt;br /&gt;
|0x17&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|font&lt;br /&gt;
|0x16&lt;br /&gt;
|0x17&lt;br /&gt;
|0x18&lt;br /&gt;
|True&lt;br /&gt;
|0x10&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|menufile&lt;br /&gt;
|0x17&lt;br /&gt;
|0x18&lt;br /&gt;
|0x19&lt;br /&gt;
|True&lt;br /&gt;
|0x80&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|menu&lt;br /&gt;
|0x18&lt;br /&gt;
|0x19&lt;br /&gt;
|0x1A&lt;br /&gt;
|True&lt;br /&gt;
|0x264&lt;br /&gt;
|0x190&lt;br /&gt;
|-&lt;br /&gt;
|localize&lt;br /&gt;
|0x19&lt;br /&gt;
|0x1A&lt;br /&gt;
|0x1B&lt;br /&gt;
|True&lt;br /&gt;
|0x1B58&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|weapon&lt;br /&gt;
|0x1A&lt;br /&gt;
|0x1B&lt;br /&gt;
|0x1C&lt;br /&gt;
|True&lt;br /&gt;
|0x578&lt;br /&gt;
|0x684&lt;br /&gt;
|-&lt;br /&gt;
|snddriverglobals&lt;br /&gt;
|0x1B&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x1D&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|fx&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x1D&lt;br /&gt;
|0x1E&lt;br /&gt;
|True&lt;br /&gt;
|0x258&lt;br /&gt;
|0x20&lt;br /&gt;
|-&lt;br /&gt;
|impactfx&lt;br /&gt;
|0x1D&lt;br /&gt;
|0x1E&lt;br /&gt;
|0x1F&lt;br /&gt;
|True&lt;br /&gt;
|4&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|aitype&lt;br /&gt;
|0x1E&lt;br /&gt;
|0x1F&lt;br /&gt;
|0x20&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|mptype&lt;br /&gt;
|0x1F&lt;br /&gt;
|0x20&lt;br /&gt;
|0x21&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|character&lt;br /&gt;
|0x20&lt;br /&gt;
|0x21&lt;br /&gt;
|0x22&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|xmodelalias&lt;br /&gt;
|0x21&lt;br /&gt;
|0x22&lt;br /&gt;
|0x23&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|rawfile&lt;br /&gt;
|0x22&lt;br /&gt;
|0x23&lt;br /&gt;
|0x24&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|stringtable&lt;br /&gt;
|0x23&lt;br /&gt;
|0x24&lt;br /&gt;
|0x25&lt;br /&gt;
|True&lt;br /&gt;
|0x190&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|leaderboarddef&lt;br /&gt;
|0x24&lt;br /&gt;
|0x25&lt;br /&gt;
|0x26&lt;br /&gt;
|True&lt;br /&gt;
|0x64&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|structureddatadef&lt;br /&gt;
|0x25&lt;br /&gt;
|0x26&lt;br /&gt;
|0x27&lt;br /&gt;
|True&lt;br /&gt;
|0x18&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|tracer&lt;br /&gt;
|0x26&lt;br /&gt;
|0x27&lt;br /&gt;
|0x28&lt;br /&gt;
|True&lt;br /&gt;
|0x20&lt;br /&gt;
|0x70&lt;br /&gt;
|-&lt;br /&gt;
|vehicle&lt;br /&gt;
|0x27&lt;br /&gt;
|0x28&lt;br /&gt;
|0x29&lt;br /&gt;
|True&lt;br /&gt;
|0x80&lt;br /&gt;
|0x2D0&lt;br /&gt;
|-&lt;br /&gt;
|addon_map_ents&lt;br /&gt;
|0x28&lt;br /&gt;
|0x29&lt;br /&gt;
|0x2A&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x24&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(MW2)&amp;diff=1058</id>
		<title>FastFiles and Zone files (MW2)</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(MW2)&amp;diff=1058"/>
		<updated>2026-06-22T18:19:18Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Entries */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FastFiles]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
&lt;br /&gt;
== Main FastFile Structure ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 //Note, on PS3 all values are &amp;lt;&amp;lt; 1&lt;br /&gt;
 enum language_t&lt;br /&gt;
 {&lt;br /&gt;
   LANGUAGE_ENGLISH = 0x1,&lt;br /&gt;
   LANGUAGE_FRENCH = 0x2,&lt;br /&gt;
   LANGUAGE_GERMAN = 0x3,&lt;br /&gt;
   LANGUAGE_ITALIAN = 0x4,&lt;br /&gt;
   LANGUAGE_SPANISH = 0x5,&lt;br /&gt;
   LANGUAGE_BRITISH = 0x6,&lt;br /&gt;
   LANGUAGE_RUSSIAN = 0x7,&lt;br /&gt;
   LANGUAGE_POLISH = 0x8,&lt;br /&gt;
   LANGUAGE_KOREAN = 0x9,&lt;br /&gt;
   LANGUAGE_TAIWANESE = 0xA,&lt;br /&gt;
   LANGUAGE_JAPANESE = 0xB,&lt;br /&gt;
   LANGUAGE_CHINESE = 0xC,&lt;br /&gt;
   LANGUAGE_THAI = 0xD,&lt;br /&gt;
   LANGUAGE_LEET = 0xE,&lt;br /&gt;
   LANGUAGE_CZECH = 0xF,&lt;br /&gt;
   MAX_LANGUAGES&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 //Entry point for the FF.&lt;br /&gt;
 struct DB_Header&lt;br /&gt;
 {&lt;br /&gt;
   char magic[8];&lt;br /&gt;
   int version;&lt;br /&gt;
   bool allowOnlineUpdate;&lt;br /&gt;
   unsigned __int64 fileCreationTime;&lt;br /&gt;
   language_t region;&lt;br /&gt;
   int entryCount;&lt;br /&gt;
   DbHeaderImageStreamEntry entries[]; //entryCount&lt;br /&gt;
   int fileSize;&lt;br /&gt;
   int maxFileSize;&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Magic ===&lt;br /&gt;
The magic is a string that is 8 characters long. It is either &amp;quot;IWff0100&amp;quot; or &amp;quot;IWffu100&amp;quot;. It indicates what is read after maxFileSize. If it is &amp;quot;IWff0100&amp;quot; then this FF is signed. If it is &amp;quot;IWffu100&amp;quot;, then this FF is unsigned.&lt;br /&gt;
=== Version ===&lt;br /&gt;
Helps to dictate the version of the FF, so Modern Warfare 3 FastFiles cannot be loaded on Modern Warfare 2. The Modern Warfare 2 version is 0x10D for console systems and 0x114 for PC.&lt;br /&gt;
 if (version &amp;gt; 0x10D)&lt;br /&gt;
  Com_Error(&amp;quot;Fastfile for zone &#039;%s&#039; is newer than client executable (version %d, expecting %d)&amp;quot;, version, 0x10D);&lt;br /&gt;
 else if (version &amp;lt; 0x10D)&lt;br /&gt;
  Com_Error(&amp;quot;Fastfile for zone &#039;%s&#039; is out of date (version %d, expecting %d)&amp;quot;, version, 0x10D);&lt;br /&gt;
=== AllowOnlineUpdate ===&lt;br /&gt;
Whether or not assets in this FF may be replaced by an FF loaded at a later time.&lt;br /&gt;
=== Entries ===&lt;br /&gt;
On PS3 Entries are the serialized source ranges and logical decode positions for streamed GfxImage payloads.&lt;br /&gt;
&lt;br /&gt;
The serialized header row order is not the same as the runtime record order. The engine reads:  DbHeaderImageStreamEntry, Then stores runtime records as: GfxImageStreamRecord.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
public struct DbHeaderImageStreamEntry&lt;br /&gt;
{&lt;br /&gt;
    uint FileIndex;      // 0 = current fastfile, 1..4 = imagefile%d&lt;br /&gt;
    uint SourceStart;    // compressed/source offset in selected file&lt;br /&gt;
    uint SourceEnd;      // compressed/source end offset, not size&lt;br /&gt;
    uint BlockOffset;    // low 16-bit/intra-block logical stream offset&lt;br /&gt;
    uint StreamOffset;   // full logical uncompressed stream offset&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
public struct GfxImageStreamRecord&lt;br /&gt;
{&lt;br /&gt;
    uint SourceStart;&lt;br /&gt;
    uint BlockOffset;&lt;br /&gt;
    uint StreamOffset;&lt;br /&gt;
    uint SourceEnd;&lt;br /&gt;
    void* File;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Xbox 360 ====&lt;br /&gt;
 for (int32 i = 0; i &amp;lt; 0x0f; i++)&lt;br /&gt;
 {&lt;br /&gt;
   if (((1 &amp;lt;&amp;lt; i) &amp;amp; language) == 0)&lt;br /&gt;
     continue;&lt;br /&gt;
   else&lt;br /&gt;
     ReadBytes(((entryCount &amp;lt;&amp;lt; 1) + entryCount) &amp;lt;&amp;lt; 2);&lt;br /&gt;
 }&lt;br /&gt;
==== PS3 ====&lt;br /&gt;
 readBytes(entryCount * 0x14);&lt;br /&gt;
&lt;br /&gt;
=== File Sizes ===&lt;br /&gt;
The fileSize is the size of the FF, everything included. The maxFileSize is the highest number that fileSize can be, and in most FFs they are equal.&lt;br /&gt;
&lt;br /&gt;
== Subheader ==&lt;br /&gt;
The rest of the FF is read depending on what the main FF magic was. If the magic was &amp;quot;IWff0100&amp;quot; then the FF is signed. If it was &amp;quot;IWffu100&amp;quot;, the FF is unsigned.&lt;br /&gt;
=== Unsigned Files ===&lt;br /&gt;
PS3 only supports unsigned fastfiles. For Xbox 360, only single player FastFiles are unsigned. Unsigned FastFiles are very simple. The only data remaining is compressed zlib data. Decompressing the data yields the [[#Zone File|zone file]].&lt;br /&gt;
=== Signed Files ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 struct DB_AuthHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[32];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthSignatureHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[256];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthSubheader&lt;br /&gt;
 {&lt;br /&gt;
   char fastfileName[32];&lt;br /&gt;
   int reserved;&lt;br /&gt;
   DB_AuthHash masterBlockHashes[244];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthXBlock&lt;br /&gt;
 {&lt;br /&gt;
 #ifdef XBOX&lt;br /&gt;
   DB_AuthHash blockSignature[0x100];&lt;br /&gt;
   char blockData[0x200000];&lt;br /&gt;
 #elif defined PS3&lt;br /&gt;
   char blockData[0x10000];&lt;br /&gt;
 #endif&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 //Sub DB_AuthHeader, continuation on the earlier.&lt;br /&gt;
 struct DB_AuthHeader&lt;br /&gt;
 {&lt;br /&gt;
   char magic[8];&lt;br /&gt;
   int reserved;&lt;br /&gt;
   DB_AuthHash subheaderHash;&lt;br /&gt;
   DB_AuthSignatureHash signedSubheaderHash;&lt;br /&gt;
   DB_AuthSubHeader subheader;&lt;br /&gt;
   DB_AuthXBlock xBlocks[];&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The signatures on the XBlocks are checked as the FastFile loads. Then the sub-header master block hashes are checked, followed by the signedSubheaderHash, and lastly the subheaderHash. If any fail, then the loading of the FF is aborted. Only Activision and the game developers can generate the RSA signatures. &lt;br /&gt;
==== Magic ====&lt;br /&gt;
The subheader magic is always &amp;quot;IWffs100&amp;quot;.&lt;br /&gt;
==== XBlocks ====&lt;br /&gt;
XBlocks are used until they are no longer needed. If the compressed data can fit into 1, then only 1 will exist.&lt;br /&gt;
&lt;br /&gt;
== Compression ==&lt;br /&gt;
=== PS3 ===&lt;br /&gt;
After the zone file is created, it is split into blocks each 0x10000 bytes, the last block being padded with zeroes if not 0x10000 bytes long. Each block is compressed using default zlib compression. The size of the compressed block is stored as an unsigned 16 bit integer over the zlib header (0x78DA). Compressed blocks are concatenated and appended to the fastfile.&lt;br /&gt;
&lt;br /&gt;
=== Xbox 360 ===&lt;br /&gt;
Once the zone file is created, the entire zone is compressed using default zlib compression. If the FastFile is unsigned (single player) then the data is simply concatenated to the header. Signed files split the data up into 0x200000 byte XBlocks, each with a 0x2000 byte hash block.&lt;br /&gt;
== Zone File ==&lt;br /&gt;
The zone file is the decompressed data from an FF. &lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
The XFile header is loaded first. It contains XBlock sizes to be allocated for g_streamBlocks.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum&lt;br /&gt;
{&lt;br /&gt;
 XFILE_BLOCK_TEMP	= 0,&lt;br /&gt;
 XFILE_BLOCK_PHYSICAL	= 1,&lt;br /&gt;
 XFILE_BLOCK_RUNTIME	= 2,&lt;br /&gt;
 XFILE_BLOCK_VIRTUAL	= 3,&lt;br /&gt;
 XFILE_BLOCK_LARGE	= 4,&lt;br /&gt;
 XFILE_BLOCK_CALLBACK	= 5,&lt;br /&gt;
#if defined(PC) || defined(PS3)&lt;br /&gt;
 XFILE_BLOCK_VERTEX	= 6,&lt;br /&gt;
 #ifdef PC&lt;br /&gt;
 XFILE_BLOCK_INDEX	= 7,&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
 MAX_XFILE_COUNT&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
struct XFile&lt;br /&gt;
{&lt;br /&gt;
  int size;&lt;br /&gt;
  int externalSize;&lt;br /&gt;
  int blockSize[MAX_XFILE_COUNT];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== g_streamBlocks ===&lt;br /&gt;
Remember that g_streamBlocks are loaded as the zone is read. Here are some examples. The raw dumps are collapsed by default to keep the page readable:&lt;br /&gt;
&lt;br /&gt;
==== Temp ====&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #a2a9b1; padding:0.5em; margin:0.5em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Temp block dump&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0000000B 40000001 000001AF 400000F5 40153A79 00000000 00000000 40153A82 401537C1 42820000 00000000 00000000 00000001 00000000 00000168 00000000 00000000 00000000 00000000 4000844B 00000000 00000000 00000085 00000085 0000016E 000001F4 00000001 00000000 00000000 00000000 00000000 00000000 00000000 40153A59 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 40000E89 4012CA4D 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Large ====&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #a2a9b1; padding:0.5em; margin:0.5em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Large block dump&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
00000000 4000002D 4000003E 40000052 40000066 4000007A 4000008F 4000009F 400000B0 400000C0 400000DA 6D656C65 655F6B6E 6966655F 73746162 00776561 705F6D31 3838375F 6C696674 5F706C72 00776561 705F6D31 3838375F 6F70656E 5F706C72 00776561 705F6D31 3838375F 6C6F6F70 5F706C72 00776561 705F6D31 3838375F 636C6F73 655F706C 72007669 65776D6F 64656C5F 736D616C 6C007669 65776D6F 64656C5F 6D656469 756D0076 6965776D 6F64656C 5F6C6172 67650077 6561705F 736D6F6B 65677265 6E616465 5F70696E 5F706C72 00776561 705F736D 6F6B6567 72656E61 64655F66 6972655F 706C7200 00000008 00000011 00000018 00000011 00000024 00000011 00000024 00000011 00000024 00000011 00000026 00000011 00000026 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000008 00000011 00000008 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 0000001B 00000011 0000001B 00000011 0000001B 00000011 0000001B 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 0000001B 00000011 0000001B 00000011 0000001B 00000011 00000023 00000011 2C326400 75695F6D 702F6D61 696E2E6D 656E7500 0000001D 0000001D ........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asset List ===&lt;br /&gt;
After the XFile header is the asset list. The asset list contains a list of script strings and a list of assets. The fastfile compiler creates a rawfile as the last asset which contains any compiler errors (as seen in french code_post_gfx_mp.ff).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct XAsset&lt;br /&gt;
{&lt;br /&gt;
  XAssetType type; //See enum below&lt;br /&gt;
  XAssetHeader * header;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct XAssetList&lt;br /&gt;
{&lt;br /&gt;
  int scriptStringCount;&lt;br /&gt;
  const char * * scriptStrings;&lt;br /&gt;
  int assetCount;&lt;br /&gt;
  XAsset *assets;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== General [[:Category:Assets|Asset]] Information ==&lt;br /&gt;
=== Asset Types ===&lt;br /&gt;
The types of assets loaded are determined by this enum.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; class=&amp;quot;article-table&amp;quot; style=&amp;quot;font-size:13px;line-height:21px;width:500px;height:500px;&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Asset Type&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Xbox ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|PS3 ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|PC ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Is Used&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Max Count&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Asset Size (PC)&lt;br /&gt;
|-&lt;br /&gt;
|physpreset&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|True&lt;br /&gt;
|0x40&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|phys_collmap&lt;br /&gt;
|0x01&lt;br /&gt;
|0x01&lt;br /&gt;
|0x01&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x48&lt;br /&gt;
|-&lt;br /&gt;
|xanim&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x58&lt;br /&gt;
|-&lt;br /&gt;
|xmodelsurfs&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x24&lt;br /&gt;
|-&lt;br /&gt;
|xmodel&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|True&lt;br /&gt;
|0x600&lt;br /&gt;
|0x130&lt;br /&gt;
|-&lt;br /&gt;
|material&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x60&lt;br /&gt;
|-&lt;br /&gt;
|pixelshader&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|True&lt;br /&gt;
|0x1FA0&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|vertexshader&lt;br /&gt;
|N/A&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|vertexdecl&lt;br /&gt;
|N/A&lt;br /&gt;
|N/A&lt;br /&gt;
|0x08&lt;br /&gt;
|True&lt;br /&gt;
|0x30&lt;br /&gt;
|0x64&lt;br /&gt;
|-&lt;br /&gt;
|techset&lt;br /&gt;
|0x07&lt;br /&gt;
|0x08&lt;br /&gt;
|0x09&lt;br /&gt;
|True&lt;br /&gt;
|0x300&lt;br /&gt;
|0xCC&lt;br /&gt;
|-&lt;br /&gt;
|image&lt;br /&gt;
|0x08&lt;br /&gt;
|0x09&lt;br /&gt;
|0x0A&lt;br /&gt;
|True&lt;br /&gt;
|0xE00&lt;br /&gt;
|0x20&lt;br /&gt;
|-&lt;br /&gt;
|sound&lt;br /&gt;
|0x09&lt;br /&gt;
|0x0A&lt;br /&gt;
|0x0B&lt;br /&gt;
|True&lt;br /&gt;
|0x3E80&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|sndcurve&lt;br /&gt;
|0x0A&lt;br /&gt;
|0x0B&lt;br /&gt;
|0x0C&lt;br /&gt;
|True&lt;br /&gt;
|0x40&lt;br /&gt;
|0x88&lt;br /&gt;
|-&lt;br /&gt;
|loaded_sound&lt;br /&gt;
|0x0B&lt;br /&gt;
|0x0C&lt;br /&gt;
|0x0D&lt;br /&gt;
|True&lt;br /&gt;
|0x546&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|col_map_sp&lt;br /&gt;
|0x0C&lt;br /&gt;
|0x0D&lt;br /&gt;
|0x0E&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x100&lt;br /&gt;
|-&lt;br /&gt;
|col_map_mp&lt;br /&gt;
|0x0D&lt;br /&gt;
|0x0E&lt;br /&gt;
|0x0F&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x100&lt;br /&gt;
|-&lt;br /&gt;
|com_map&lt;br /&gt;
|0x0E&lt;br /&gt;
|0x0F&lt;br /&gt;
|0x10&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|game_map_sp&lt;br /&gt;
|0x0F&lt;br /&gt;
|0x10&lt;br /&gt;
|0x11&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x38&lt;br /&gt;
|-&lt;br /&gt;
|game_map_mp&lt;br /&gt;
|0x10&lt;br /&gt;
|0x11&lt;br /&gt;
|0x12&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|map_ents&lt;br /&gt;
|0x11&lt;br /&gt;
|0x12&lt;br /&gt;
|0x13&lt;br /&gt;
|True&lt;br /&gt;
|2&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|fx_map&lt;br /&gt;
|0x12&lt;br /&gt;
|0x13&lt;br /&gt;
|0x14&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x74&lt;br /&gt;
|-&lt;br /&gt;
|gfx_map&lt;br /&gt;
|0x13&lt;br /&gt;
|0x14&lt;br /&gt;
|0x15&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x274&lt;br /&gt;
|-&lt;br /&gt;
|lightdef&lt;br /&gt;
|0x14&lt;br /&gt;
|0x15&lt;br /&gt;
|0x16&lt;br /&gt;
|True&lt;br /&gt;
|0x20&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|ui_map&lt;br /&gt;
|0x15&lt;br /&gt;
|0x16&lt;br /&gt;
|0x17&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|font&lt;br /&gt;
|0x16&lt;br /&gt;
|0x17&lt;br /&gt;
|0x18&lt;br /&gt;
|True&lt;br /&gt;
|0x10&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|menufile&lt;br /&gt;
|0x17&lt;br /&gt;
|0x18&lt;br /&gt;
|0x19&lt;br /&gt;
|True&lt;br /&gt;
|0x80&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|menu&lt;br /&gt;
|0x18&lt;br /&gt;
|0x19&lt;br /&gt;
|0x1A&lt;br /&gt;
|True&lt;br /&gt;
|0x264&lt;br /&gt;
|0x190&lt;br /&gt;
|-&lt;br /&gt;
|localize&lt;br /&gt;
|0x19&lt;br /&gt;
|0x1A&lt;br /&gt;
|0x1B&lt;br /&gt;
|True&lt;br /&gt;
|0x1B58&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|weapon&lt;br /&gt;
|0x1A&lt;br /&gt;
|0x1B&lt;br /&gt;
|0x1C&lt;br /&gt;
|True&lt;br /&gt;
|0x578&lt;br /&gt;
|0x684&lt;br /&gt;
|-&lt;br /&gt;
|snddriverglobals&lt;br /&gt;
|0x1B&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x1D&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|fx&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x1D&lt;br /&gt;
|0x1E&lt;br /&gt;
|True&lt;br /&gt;
|0x258&lt;br /&gt;
|0x20&lt;br /&gt;
|-&lt;br /&gt;
|impactfx&lt;br /&gt;
|0x1D&lt;br /&gt;
|0x1E&lt;br /&gt;
|0x1F&lt;br /&gt;
|True&lt;br /&gt;
|4&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|aitype&lt;br /&gt;
|0x1E&lt;br /&gt;
|0x1F&lt;br /&gt;
|0x20&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|mptype&lt;br /&gt;
|0x1F&lt;br /&gt;
|0x20&lt;br /&gt;
|0x21&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|character&lt;br /&gt;
|0x20&lt;br /&gt;
|0x21&lt;br /&gt;
|0x22&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|xmodelalias&lt;br /&gt;
|0x21&lt;br /&gt;
|0x22&lt;br /&gt;
|0x23&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|rawfile&lt;br /&gt;
|0x22&lt;br /&gt;
|0x23&lt;br /&gt;
|0x24&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|stringtable&lt;br /&gt;
|0x23&lt;br /&gt;
|0x24&lt;br /&gt;
|0x25&lt;br /&gt;
|True&lt;br /&gt;
|0x190&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|leaderboarddef&lt;br /&gt;
|0x24&lt;br /&gt;
|0x25&lt;br /&gt;
|0x26&lt;br /&gt;
|True&lt;br /&gt;
|0x64&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|structureddatadef&lt;br /&gt;
|0x25&lt;br /&gt;
|0x26&lt;br /&gt;
|0x27&lt;br /&gt;
|True&lt;br /&gt;
|0x18&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|tracer&lt;br /&gt;
|0x26&lt;br /&gt;
|0x27&lt;br /&gt;
|0x28&lt;br /&gt;
|True&lt;br /&gt;
|0x20&lt;br /&gt;
|0x70&lt;br /&gt;
|-&lt;br /&gt;
|vehicle&lt;br /&gt;
|0x27&lt;br /&gt;
|0x28&lt;br /&gt;
|0x29&lt;br /&gt;
|True&lt;br /&gt;
|0x80&lt;br /&gt;
|0x2D0&lt;br /&gt;
|-&lt;br /&gt;
|addon_map_ents&lt;br /&gt;
|0x28&lt;br /&gt;
|0x29&lt;br /&gt;
|0x2A&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x24&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(MW2)&amp;diff=1057</id>
		<title>FastFiles and Zone files (MW2)</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(MW2)&amp;diff=1057"/>
		<updated>2026-06-22T18:13:49Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Main FastFile Structure */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FastFiles]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
&lt;br /&gt;
== Main FastFile Structure ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 //Note, on PS3 all values are &amp;lt;&amp;lt; 1&lt;br /&gt;
 enum language_t&lt;br /&gt;
 {&lt;br /&gt;
   LANGUAGE_ENGLISH = 0x1,&lt;br /&gt;
   LANGUAGE_FRENCH = 0x2,&lt;br /&gt;
   LANGUAGE_GERMAN = 0x3,&lt;br /&gt;
   LANGUAGE_ITALIAN = 0x4,&lt;br /&gt;
   LANGUAGE_SPANISH = 0x5,&lt;br /&gt;
   LANGUAGE_BRITISH = 0x6,&lt;br /&gt;
   LANGUAGE_RUSSIAN = 0x7,&lt;br /&gt;
   LANGUAGE_POLISH = 0x8,&lt;br /&gt;
   LANGUAGE_KOREAN = 0x9,&lt;br /&gt;
   LANGUAGE_TAIWANESE = 0xA,&lt;br /&gt;
   LANGUAGE_JAPANESE = 0xB,&lt;br /&gt;
   LANGUAGE_CHINESE = 0xC,&lt;br /&gt;
   LANGUAGE_THAI = 0xD,&lt;br /&gt;
   LANGUAGE_LEET = 0xE,&lt;br /&gt;
   LANGUAGE_CZECH = 0xF,&lt;br /&gt;
   MAX_LANGUAGES&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 //Entry point for the FF.&lt;br /&gt;
 struct DB_Header&lt;br /&gt;
 {&lt;br /&gt;
   char magic[8];&lt;br /&gt;
   int version;&lt;br /&gt;
   bool allowOnlineUpdate;&lt;br /&gt;
   unsigned __int64 fileCreationTime;&lt;br /&gt;
   language_t region;&lt;br /&gt;
   int entryCount;&lt;br /&gt;
   DbHeaderImageStreamEntry entries[]; //entryCount&lt;br /&gt;
   int fileSize;&lt;br /&gt;
   int maxFileSize;&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Magic ===&lt;br /&gt;
The magic is a string that is 8 characters long. It is either &amp;quot;IWff0100&amp;quot; or &amp;quot;IWffu100&amp;quot;. It indicates what is read after maxFileSize. If it is &amp;quot;IWff0100&amp;quot; then this FF is signed. If it is &amp;quot;IWffu100&amp;quot;, then this FF is unsigned.&lt;br /&gt;
=== Version ===&lt;br /&gt;
Helps to dictate the version of the FF, so Modern Warfare 3 FastFiles cannot be loaded on Modern Warfare 2. The Modern Warfare 2 version is 0x10D for console systems and 0x114 for PC.&lt;br /&gt;
 if (version &amp;gt; 0x10D)&lt;br /&gt;
  Com_Error(&amp;quot;Fastfile for zone &#039;%s&#039; is newer than client executable (version %d, expecting %d)&amp;quot;, version, 0x10D);&lt;br /&gt;
 else if (version &amp;lt; 0x10D)&lt;br /&gt;
  Com_Error(&amp;quot;Fastfile for zone &#039;%s&#039; is out of date (version %d, expecting %d)&amp;quot;, version, 0x10D);&lt;br /&gt;
=== AllowOnlineUpdate ===&lt;br /&gt;
Whether or not assets in this FF may be replaced by an FF loaded at a later time.&lt;br /&gt;
=== Entries ===&lt;br /&gt;
On PS3 Entries are the serialized source ranges and logical decode positions for streamed GfxImage payloads.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
public struct DbHeaderImageStreamEntry&lt;br /&gt;
{&lt;br /&gt;
    public uint FileIndex;      // 0 = current fastfile, 1..4 = imagefile%d&lt;br /&gt;
    public uint SourceStart;    // compressed/source offset in selected file&lt;br /&gt;
    public uint SourceEnd;      // compressed/source end offset, not size&lt;br /&gt;
    public uint BlockOffset;    // low 16-bit/intra-block logical stream offset&lt;br /&gt;
    public uint StreamOffset;   // full logical uncompressed stream offset&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Xbox 360 ====&lt;br /&gt;
 for (int32 i = 0; i &amp;lt; 0x0f; i++)&lt;br /&gt;
 {&lt;br /&gt;
   if (((1 &amp;lt;&amp;lt; i) &amp;amp; language) == 0)&lt;br /&gt;
     continue;&lt;br /&gt;
   else&lt;br /&gt;
     ReadBytes(((entryCount &amp;lt;&amp;lt; 1) + entryCount) &amp;lt;&amp;lt; 2);&lt;br /&gt;
 }&lt;br /&gt;
==== PS3 ====&lt;br /&gt;
 readBytes(entryCount * 0x14);&lt;br /&gt;
&lt;br /&gt;
=== File Sizes ===&lt;br /&gt;
The fileSize is the size of the FF, everything included. The maxFileSize is the highest number that fileSize can be, and in most FFs they are equal.&lt;br /&gt;
&lt;br /&gt;
== Subheader ==&lt;br /&gt;
The rest of the FF is read depending on what the main FF magic was. If the magic was &amp;quot;IWff0100&amp;quot; then the FF is signed. If it was &amp;quot;IWffu100&amp;quot;, the FF is unsigned.&lt;br /&gt;
=== Unsigned Files ===&lt;br /&gt;
PS3 only supports unsigned fastfiles. For Xbox 360, only single player FastFiles are unsigned. Unsigned FastFiles are very simple. The only data remaining is compressed zlib data. Decompressing the data yields the [[#Zone File|zone file]].&lt;br /&gt;
=== Signed Files ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 struct DB_AuthHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[32];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthSignatureHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[256];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthSubheader&lt;br /&gt;
 {&lt;br /&gt;
   char fastfileName[32];&lt;br /&gt;
   int reserved;&lt;br /&gt;
   DB_AuthHash masterBlockHashes[244];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthXBlock&lt;br /&gt;
 {&lt;br /&gt;
 #ifdef XBOX&lt;br /&gt;
   DB_AuthHash blockSignature[0x100];&lt;br /&gt;
   char blockData[0x200000];&lt;br /&gt;
 #elif defined PS3&lt;br /&gt;
   char blockData[0x10000];&lt;br /&gt;
 #endif&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 //Sub DB_AuthHeader, continuation on the earlier.&lt;br /&gt;
 struct DB_AuthHeader&lt;br /&gt;
 {&lt;br /&gt;
   char magic[8];&lt;br /&gt;
   int reserved;&lt;br /&gt;
   DB_AuthHash subheaderHash;&lt;br /&gt;
   DB_AuthSignatureHash signedSubheaderHash;&lt;br /&gt;
   DB_AuthSubHeader subheader;&lt;br /&gt;
   DB_AuthXBlock xBlocks[];&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The signatures on the XBlocks are checked as the FastFile loads. Then the sub-header master block hashes are checked, followed by the signedSubheaderHash, and lastly the subheaderHash. If any fail, then the loading of the FF is aborted. Only Activision and the game developers can generate the RSA signatures. &lt;br /&gt;
==== Magic ====&lt;br /&gt;
The subheader magic is always &amp;quot;IWffs100&amp;quot;.&lt;br /&gt;
==== XBlocks ====&lt;br /&gt;
XBlocks are used until they are no longer needed. If the compressed data can fit into 1, then only 1 will exist.&lt;br /&gt;
&lt;br /&gt;
== Compression ==&lt;br /&gt;
=== PS3 ===&lt;br /&gt;
After the zone file is created, it is split into blocks each 0x10000 bytes, the last block being padded with zeroes if not 0x10000 bytes long. Each block is compressed using default zlib compression. The size of the compressed block is stored as an unsigned 16 bit integer over the zlib header (0x78DA). Compressed blocks are concatenated and appended to the fastfile.&lt;br /&gt;
&lt;br /&gt;
=== Xbox 360 ===&lt;br /&gt;
Once the zone file is created, the entire zone is compressed using default zlib compression. If the FastFile is unsigned (single player) then the data is simply concatenated to the header. Signed files split the data up into 0x200000 byte XBlocks, each with a 0x2000 byte hash block.&lt;br /&gt;
== Zone File ==&lt;br /&gt;
The zone file is the decompressed data from an FF. &lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
The XFile header is loaded first. It contains XBlock sizes to be allocated for g_streamBlocks.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum&lt;br /&gt;
{&lt;br /&gt;
 XFILE_BLOCK_TEMP	= 0,&lt;br /&gt;
 XFILE_BLOCK_PHYSICAL	= 1,&lt;br /&gt;
 XFILE_BLOCK_RUNTIME	= 2,&lt;br /&gt;
 XFILE_BLOCK_VIRTUAL	= 3,&lt;br /&gt;
 XFILE_BLOCK_LARGE	= 4,&lt;br /&gt;
 XFILE_BLOCK_CALLBACK	= 5,&lt;br /&gt;
#if defined(PC) || defined(PS3)&lt;br /&gt;
 XFILE_BLOCK_VERTEX	= 6,&lt;br /&gt;
 #ifdef PC&lt;br /&gt;
 XFILE_BLOCK_INDEX	= 7,&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
 MAX_XFILE_COUNT&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
struct XFile&lt;br /&gt;
{&lt;br /&gt;
  int size;&lt;br /&gt;
  int externalSize;&lt;br /&gt;
  int blockSize[MAX_XFILE_COUNT];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== g_streamBlocks ===&lt;br /&gt;
Remember that g_streamBlocks are loaded as the zone is read. Here are some examples. The raw dumps are collapsed by default to keep the page readable:&lt;br /&gt;
&lt;br /&gt;
==== Temp ====&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #a2a9b1; padding:0.5em; margin:0.5em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Temp block dump&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0000000B 40000001 000001AF 400000F5 40153A79 00000000 00000000 40153A82 401537C1 42820000 00000000 00000000 00000001 00000000 00000168 00000000 00000000 00000000 00000000 4000844B 00000000 00000000 00000085 00000085 0000016E 000001F4 00000001 00000000 00000000 00000000 00000000 00000000 00000000 40153A59 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 40000E89 4012CA4D 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Large ====&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #a2a9b1; padding:0.5em; margin:0.5em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Large block dump&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
00000000 4000002D 4000003E 40000052 40000066 4000007A 4000008F 4000009F 400000B0 400000C0 400000DA 6D656C65 655F6B6E 6966655F 73746162 00776561 705F6D31 3838375F 6C696674 5F706C72 00776561 705F6D31 3838375F 6F70656E 5F706C72 00776561 705F6D31 3838375F 6C6F6F70 5F706C72 00776561 705F6D31 3838375F 636C6F73 655F706C 72007669 65776D6F 64656C5F 736D616C 6C007669 65776D6F 64656C5F 6D656469 756D0076 6965776D 6F64656C 5F6C6172 67650077 6561705F 736D6F6B 65677265 6E616465 5F70696E 5F706C72 00776561 705F736D 6F6B6567 72656E61 64655F66 6972655F 706C7200 00000008 00000011 00000018 00000011 00000024 00000011 00000024 00000011 00000024 00000011 00000026 00000011 00000026 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000008 00000011 00000008 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 0000001B 00000011 0000001B 00000011 0000001B 00000011 0000001B 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 0000001B 00000011 0000001B 00000011 0000001B 00000011 00000023 00000011 2C326400 75695F6D 702F6D61 696E2E6D 656E7500 0000001D 0000001D ........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asset List ===&lt;br /&gt;
After the XFile header is the asset list. The asset list contains a list of script strings and a list of assets. The fastfile compiler creates a rawfile as the last asset which contains any compiler errors (as seen in french code_post_gfx_mp.ff).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct XAsset&lt;br /&gt;
{&lt;br /&gt;
  XAssetType type; //See enum below&lt;br /&gt;
  XAssetHeader * header;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct XAssetList&lt;br /&gt;
{&lt;br /&gt;
  int scriptStringCount;&lt;br /&gt;
  const char * * scriptStrings;&lt;br /&gt;
  int assetCount;&lt;br /&gt;
  XAsset *assets;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== General [[:Category:Assets|Asset]] Information ==&lt;br /&gt;
=== Asset Types ===&lt;br /&gt;
The types of assets loaded are determined by this enum.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; class=&amp;quot;article-table&amp;quot; style=&amp;quot;font-size:13px;line-height:21px;width:500px;height:500px;&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Asset Type&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Xbox ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|PS3 ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|PC ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Is Used&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Max Count&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Asset Size (PC)&lt;br /&gt;
|-&lt;br /&gt;
|physpreset&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|True&lt;br /&gt;
|0x40&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|phys_collmap&lt;br /&gt;
|0x01&lt;br /&gt;
|0x01&lt;br /&gt;
|0x01&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x48&lt;br /&gt;
|-&lt;br /&gt;
|xanim&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x58&lt;br /&gt;
|-&lt;br /&gt;
|xmodelsurfs&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x24&lt;br /&gt;
|-&lt;br /&gt;
|xmodel&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|True&lt;br /&gt;
|0x600&lt;br /&gt;
|0x130&lt;br /&gt;
|-&lt;br /&gt;
|material&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x60&lt;br /&gt;
|-&lt;br /&gt;
|pixelshader&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|True&lt;br /&gt;
|0x1FA0&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|vertexshader&lt;br /&gt;
|N/A&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|vertexdecl&lt;br /&gt;
|N/A&lt;br /&gt;
|N/A&lt;br /&gt;
|0x08&lt;br /&gt;
|True&lt;br /&gt;
|0x30&lt;br /&gt;
|0x64&lt;br /&gt;
|-&lt;br /&gt;
|techset&lt;br /&gt;
|0x07&lt;br /&gt;
|0x08&lt;br /&gt;
|0x09&lt;br /&gt;
|True&lt;br /&gt;
|0x300&lt;br /&gt;
|0xCC&lt;br /&gt;
|-&lt;br /&gt;
|image&lt;br /&gt;
|0x08&lt;br /&gt;
|0x09&lt;br /&gt;
|0x0A&lt;br /&gt;
|True&lt;br /&gt;
|0xE00&lt;br /&gt;
|0x20&lt;br /&gt;
|-&lt;br /&gt;
|sound&lt;br /&gt;
|0x09&lt;br /&gt;
|0x0A&lt;br /&gt;
|0x0B&lt;br /&gt;
|True&lt;br /&gt;
|0x3E80&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|sndcurve&lt;br /&gt;
|0x0A&lt;br /&gt;
|0x0B&lt;br /&gt;
|0x0C&lt;br /&gt;
|True&lt;br /&gt;
|0x40&lt;br /&gt;
|0x88&lt;br /&gt;
|-&lt;br /&gt;
|loaded_sound&lt;br /&gt;
|0x0B&lt;br /&gt;
|0x0C&lt;br /&gt;
|0x0D&lt;br /&gt;
|True&lt;br /&gt;
|0x546&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|col_map_sp&lt;br /&gt;
|0x0C&lt;br /&gt;
|0x0D&lt;br /&gt;
|0x0E&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x100&lt;br /&gt;
|-&lt;br /&gt;
|col_map_mp&lt;br /&gt;
|0x0D&lt;br /&gt;
|0x0E&lt;br /&gt;
|0x0F&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x100&lt;br /&gt;
|-&lt;br /&gt;
|com_map&lt;br /&gt;
|0x0E&lt;br /&gt;
|0x0F&lt;br /&gt;
|0x10&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|game_map_sp&lt;br /&gt;
|0x0F&lt;br /&gt;
|0x10&lt;br /&gt;
|0x11&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x38&lt;br /&gt;
|-&lt;br /&gt;
|game_map_mp&lt;br /&gt;
|0x10&lt;br /&gt;
|0x11&lt;br /&gt;
|0x12&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|map_ents&lt;br /&gt;
|0x11&lt;br /&gt;
|0x12&lt;br /&gt;
|0x13&lt;br /&gt;
|True&lt;br /&gt;
|2&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|fx_map&lt;br /&gt;
|0x12&lt;br /&gt;
|0x13&lt;br /&gt;
|0x14&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x74&lt;br /&gt;
|-&lt;br /&gt;
|gfx_map&lt;br /&gt;
|0x13&lt;br /&gt;
|0x14&lt;br /&gt;
|0x15&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x274&lt;br /&gt;
|-&lt;br /&gt;
|lightdef&lt;br /&gt;
|0x14&lt;br /&gt;
|0x15&lt;br /&gt;
|0x16&lt;br /&gt;
|True&lt;br /&gt;
|0x20&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|ui_map&lt;br /&gt;
|0x15&lt;br /&gt;
|0x16&lt;br /&gt;
|0x17&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|font&lt;br /&gt;
|0x16&lt;br /&gt;
|0x17&lt;br /&gt;
|0x18&lt;br /&gt;
|True&lt;br /&gt;
|0x10&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|menufile&lt;br /&gt;
|0x17&lt;br /&gt;
|0x18&lt;br /&gt;
|0x19&lt;br /&gt;
|True&lt;br /&gt;
|0x80&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|menu&lt;br /&gt;
|0x18&lt;br /&gt;
|0x19&lt;br /&gt;
|0x1A&lt;br /&gt;
|True&lt;br /&gt;
|0x264&lt;br /&gt;
|0x190&lt;br /&gt;
|-&lt;br /&gt;
|localize&lt;br /&gt;
|0x19&lt;br /&gt;
|0x1A&lt;br /&gt;
|0x1B&lt;br /&gt;
|True&lt;br /&gt;
|0x1B58&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|weapon&lt;br /&gt;
|0x1A&lt;br /&gt;
|0x1B&lt;br /&gt;
|0x1C&lt;br /&gt;
|True&lt;br /&gt;
|0x578&lt;br /&gt;
|0x684&lt;br /&gt;
|-&lt;br /&gt;
|snddriverglobals&lt;br /&gt;
|0x1B&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x1D&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|fx&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x1D&lt;br /&gt;
|0x1E&lt;br /&gt;
|True&lt;br /&gt;
|0x258&lt;br /&gt;
|0x20&lt;br /&gt;
|-&lt;br /&gt;
|impactfx&lt;br /&gt;
|0x1D&lt;br /&gt;
|0x1E&lt;br /&gt;
|0x1F&lt;br /&gt;
|True&lt;br /&gt;
|4&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|aitype&lt;br /&gt;
|0x1E&lt;br /&gt;
|0x1F&lt;br /&gt;
|0x20&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|mptype&lt;br /&gt;
|0x1F&lt;br /&gt;
|0x20&lt;br /&gt;
|0x21&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|character&lt;br /&gt;
|0x20&lt;br /&gt;
|0x21&lt;br /&gt;
|0x22&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|xmodelalias&lt;br /&gt;
|0x21&lt;br /&gt;
|0x22&lt;br /&gt;
|0x23&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|rawfile&lt;br /&gt;
|0x22&lt;br /&gt;
|0x23&lt;br /&gt;
|0x24&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|stringtable&lt;br /&gt;
|0x23&lt;br /&gt;
|0x24&lt;br /&gt;
|0x25&lt;br /&gt;
|True&lt;br /&gt;
|0x190&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|leaderboarddef&lt;br /&gt;
|0x24&lt;br /&gt;
|0x25&lt;br /&gt;
|0x26&lt;br /&gt;
|True&lt;br /&gt;
|0x64&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|structureddatadef&lt;br /&gt;
|0x25&lt;br /&gt;
|0x26&lt;br /&gt;
|0x27&lt;br /&gt;
|True&lt;br /&gt;
|0x18&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|tracer&lt;br /&gt;
|0x26&lt;br /&gt;
|0x27&lt;br /&gt;
|0x28&lt;br /&gt;
|True&lt;br /&gt;
|0x20&lt;br /&gt;
|0x70&lt;br /&gt;
|-&lt;br /&gt;
|vehicle&lt;br /&gt;
|0x27&lt;br /&gt;
|0x28&lt;br /&gt;
|0x29&lt;br /&gt;
|True&lt;br /&gt;
|0x80&lt;br /&gt;
|0x2D0&lt;br /&gt;
|-&lt;br /&gt;
|addon_map_ents&lt;br /&gt;
|0x28&lt;br /&gt;
|0x29&lt;br /&gt;
|0x2A&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x24&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(MW2)&amp;diff=1056</id>
		<title>FastFiles and Zone files (MW2)</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(MW2)&amp;diff=1056"/>
		<updated>2026-06-22T18:13:06Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Entries */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FastFiles]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
&lt;br /&gt;
== Main FastFile Structure ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 //Note, on PS3 all values are &amp;lt;&amp;lt; 1&lt;br /&gt;
 enum language_t&lt;br /&gt;
 {&lt;br /&gt;
   LANGUAGE_ENGLISH = 0x1,&lt;br /&gt;
   LANGUAGE_FRENCH = 0x2,&lt;br /&gt;
   LANGUAGE_GERMAN = 0x3,&lt;br /&gt;
   LANGUAGE_ITALIAN = 0x4,&lt;br /&gt;
   LANGUAGE_SPANISH = 0x5,&lt;br /&gt;
   LANGUAGE_BRITISH = 0x6,&lt;br /&gt;
   LANGUAGE_RUSSIAN = 0x7,&lt;br /&gt;
   LANGUAGE_POLISH = 0x8,&lt;br /&gt;
   LANGUAGE_KOREAN = 0x9,&lt;br /&gt;
   LANGUAGE_TAIWANESE = 0xA,&lt;br /&gt;
   LANGUAGE_JAPANESE = 0xB,&lt;br /&gt;
   LANGUAGE_CHINESE = 0xC,&lt;br /&gt;
   LANGUAGE_THAI = 0xD,&lt;br /&gt;
   LANGUAGE_LEET = 0xE,&lt;br /&gt;
   LANGUAGE_CZECH = 0xF,&lt;br /&gt;
   MAX_LANGUAGES&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 //Entry point for the FF.&lt;br /&gt;
 struct DB_Header&lt;br /&gt;
 {&lt;br /&gt;
   char magic[8];&lt;br /&gt;
   int version;&lt;br /&gt;
   bool allowOnlineUpdate;&lt;br /&gt;
   unsigned __int64 fileCreationTime;&lt;br /&gt;
   language_t region;&lt;br /&gt;
   int entryCount;&lt;br /&gt;
   Entry entries[];&lt;br /&gt;
   int fileSize;&lt;br /&gt;
   int maxFileSize;&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Magic ===&lt;br /&gt;
The magic is a string that is 8 characters long. It is either &amp;quot;IWff0100&amp;quot; or &amp;quot;IWffu100&amp;quot;. It indicates what is read after maxFileSize. If it is &amp;quot;IWff0100&amp;quot; then this FF is signed. If it is &amp;quot;IWffu100&amp;quot;, then this FF is unsigned.&lt;br /&gt;
=== Version ===&lt;br /&gt;
Helps to dictate the version of the FF, so Modern Warfare 3 FastFiles cannot be loaded on Modern Warfare 2. The Modern Warfare 2 version is 0x10D for console systems and 0x114 for PC.&lt;br /&gt;
 if (version &amp;gt; 0x10D)&lt;br /&gt;
  Com_Error(&amp;quot;Fastfile for zone &#039;%s&#039; is newer than client executable (version %d, expecting %d)&amp;quot;, version, 0x10D);&lt;br /&gt;
 else if (version &amp;lt; 0x10D)&lt;br /&gt;
  Com_Error(&amp;quot;Fastfile for zone &#039;%s&#039; is out of date (version %d, expecting %d)&amp;quot;, version, 0x10D);&lt;br /&gt;
=== AllowOnlineUpdate ===&lt;br /&gt;
Whether or not assets in this FF may be replaced by an FF loaded at a later time.&lt;br /&gt;
=== Entries ===&lt;br /&gt;
On PS3 Entries are the serialized source ranges and logical decode positions for streamed GfxImage payloads.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
public struct DbHeaderImageStreamEntry&lt;br /&gt;
{&lt;br /&gt;
    public uint FileIndex;      // 0 = current fastfile, 1..4 = imagefile%d&lt;br /&gt;
    public uint SourceStart;    // compressed/source offset in selected file&lt;br /&gt;
    public uint SourceEnd;      // compressed/source end offset, not size&lt;br /&gt;
    public uint BlockOffset;    // low 16-bit/intra-block logical stream offset&lt;br /&gt;
    public uint StreamOffset;   // full logical uncompressed stream offset&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Xbox 360 ====&lt;br /&gt;
 for (int32 i = 0; i &amp;lt; 0x0f; i++)&lt;br /&gt;
 {&lt;br /&gt;
   if (((1 &amp;lt;&amp;lt; i) &amp;amp; language) == 0)&lt;br /&gt;
     continue;&lt;br /&gt;
   else&lt;br /&gt;
     ReadBytes(((entryCount &amp;lt;&amp;lt; 1) + entryCount) &amp;lt;&amp;lt; 2);&lt;br /&gt;
 }&lt;br /&gt;
==== PS3 ====&lt;br /&gt;
 readBytes(entryCount * 0x14);&lt;br /&gt;
&lt;br /&gt;
=== File Sizes ===&lt;br /&gt;
The fileSize is the size of the FF, everything included. The maxFileSize is the highest number that fileSize can be, and in most FFs they are equal.&lt;br /&gt;
&lt;br /&gt;
== Subheader ==&lt;br /&gt;
The rest of the FF is read depending on what the main FF magic was. If the magic was &amp;quot;IWff0100&amp;quot; then the FF is signed. If it was &amp;quot;IWffu100&amp;quot;, the FF is unsigned.&lt;br /&gt;
=== Unsigned Files ===&lt;br /&gt;
PS3 only supports unsigned fastfiles. For Xbox 360, only single player FastFiles are unsigned. Unsigned FastFiles are very simple. The only data remaining is compressed zlib data. Decompressing the data yields the [[#Zone File|zone file]].&lt;br /&gt;
=== Signed Files ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 struct DB_AuthHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[32];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthSignatureHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[256];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthSubheader&lt;br /&gt;
 {&lt;br /&gt;
   char fastfileName[32];&lt;br /&gt;
   int reserved;&lt;br /&gt;
   DB_AuthHash masterBlockHashes[244];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthXBlock&lt;br /&gt;
 {&lt;br /&gt;
 #ifdef XBOX&lt;br /&gt;
   DB_AuthHash blockSignature[0x100];&lt;br /&gt;
   char blockData[0x200000];&lt;br /&gt;
 #elif defined PS3&lt;br /&gt;
   char blockData[0x10000];&lt;br /&gt;
 #endif&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 //Sub DB_AuthHeader, continuation on the earlier.&lt;br /&gt;
 struct DB_AuthHeader&lt;br /&gt;
 {&lt;br /&gt;
   char magic[8];&lt;br /&gt;
   int reserved;&lt;br /&gt;
   DB_AuthHash subheaderHash;&lt;br /&gt;
   DB_AuthSignatureHash signedSubheaderHash;&lt;br /&gt;
   DB_AuthSubHeader subheader;&lt;br /&gt;
   DB_AuthXBlock xBlocks[];&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The signatures on the XBlocks are checked as the FastFile loads. Then the sub-header master block hashes are checked, followed by the signedSubheaderHash, and lastly the subheaderHash. If any fail, then the loading of the FF is aborted. Only Activision and the game developers can generate the RSA signatures. &lt;br /&gt;
==== Magic ====&lt;br /&gt;
The subheader magic is always &amp;quot;IWffs100&amp;quot;.&lt;br /&gt;
==== XBlocks ====&lt;br /&gt;
XBlocks are used until they are no longer needed. If the compressed data can fit into 1, then only 1 will exist.&lt;br /&gt;
&lt;br /&gt;
== Compression ==&lt;br /&gt;
=== PS3 ===&lt;br /&gt;
After the zone file is created, it is split into blocks each 0x10000 bytes, the last block being padded with zeroes if not 0x10000 bytes long. Each block is compressed using default zlib compression. The size of the compressed block is stored as an unsigned 16 bit integer over the zlib header (0x78DA). Compressed blocks are concatenated and appended to the fastfile.&lt;br /&gt;
&lt;br /&gt;
=== Xbox 360 ===&lt;br /&gt;
Once the zone file is created, the entire zone is compressed using default zlib compression. If the FastFile is unsigned (single player) then the data is simply concatenated to the header. Signed files split the data up into 0x200000 byte XBlocks, each with a 0x2000 byte hash block.&lt;br /&gt;
== Zone File ==&lt;br /&gt;
The zone file is the decompressed data from an FF. &lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
The XFile header is loaded first. It contains XBlock sizes to be allocated for g_streamBlocks.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum&lt;br /&gt;
{&lt;br /&gt;
 XFILE_BLOCK_TEMP	= 0,&lt;br /&gt;
 XFILE_BLOCK_PHYSICAL	= 1,&lt;br /&gt;
 XFILE_BLOCK_RUNTIME	= 2,&lt;br /&gt;
 XFILE_BLOCK_VIRTUAL	= 3,&lt;br /&gt;
 XFILE_BLOCK_LARGE	= 4,&lt;br /&gt;
 XFILE_BLOCK_CALLBACK	= 5,&lt;br /&gt;
#if defined(PC) || defined(PS3)&lt;br /&gt;
 XFILE_BLOCK_VERTEX	= 6,&lt;br /&gt;
 #ifdef PC&lt;br /&gt;
 XFILE_BLOCK_INDEX	= 7,&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
 MAX_XFILE_COUNT&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
struct XFile&lt;br /&gt;
{&lt;br /&gt;
  int size;&lt;br /&gt;
  int externalSize;&lt;br /&gt;
  int blockSize[MAX_XFILE_COUNT];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== g_streamBlocks ===&lt;br /&gt;
Remember that g_streamBlocks are loaded as the zone is read. Here are some examples. The raw dumps are collapsed by default to keep the page readable:&lt;br /&gt;
&lt;br /&gt;
==== Temp ====&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #a2a9b1; padding:0.5em; margin:0.5em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Temp block dump&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0000000B 40000001 000001AF 400000F5 40153A79 00000000 00000000 40153A82 401537C1 42820000 00000000 00000000 00000001 00000000 00000168 00000000 00000000 00000000 00000000 4000844B 00000000 00000000 00000085 00000085 0000016E 000001F4 00000001 00000000 00000000 00000000 00000000 00000000 00000000 40153A59 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 40000E89 4012CA4D 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Large ====&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #a2a9b1; padding:0.5em; margin:0.5em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Large block dump&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
00000000 4000002D 4000003E 40000052 40000066 4000007A 4000008F 4000009F 400000B0 400000C0 400000DA 6D656C65 655F6B6E 6966655F 73746162 00776561 705F6D31 3838375F 6C696674 5F706C72 00776561 705F6D31 3838375F 6F70656E 5F706C72 00776561 705F6D31 3838375F 6C6F6F70 5F706C72 00776561 705F6D31 3838375F 636C6F73 655F706C 72007669 65776D6F 64656C5F 736D616C 6C007669 65776D6F 64656C5F 6D656469 756D0076 6965776D 6F64656C 5F6C6172 67650077 6561705F 736D6F6B 65677265 6E616465 5F70696E 5F706C72 00776561 705F736D 6F6B6567 72656E61 64655F66 6972655F 706C7200 00000008 00000011 00000018 00000011 00000024 00000011 00000024 00000011 00000024 00000011 00000026 00000011 00000026 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000008 00000011 00000008 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 0000001B 00000011 0000001B 00000011 0000001B 00000011 0000001B 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 0000001B 00000011 0000001B 00000011 0000001B 00000011 00000023 00000011 2C326400 75695F6D 702F6D61 696E2E6D 656E7500 0000001D 0000001D ........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asset List ===&lt;br /&gt;
After the XFile header is the asset list. The asset list contains a list of script strings and a list of assets. The fastfile compiler creates a rawfile as the last asset which contains any compiler errors (as seen in french code_post_gfx_mp.ff).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct XAsset&lt;br /&gt;
{&lt;br /&gt;
  XAssetType type; //See enum below&lt;br /&gt;
  XAssetHeader * header;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct XAssetList&lt;br /&gt;
{&lt;br /&gt;
  int scriptStringCount;&lt;br /&gt;
  const char * * scriptStrings;&lt;br /&gt;
  int assetCount;&lt;br /&gt;
  XAsset *assets;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== General [[:Category:Assets|Asset]] Information ==&lt;br /&gt;
=== Asset Types ===&lt;br /&gt;
The types of assets loaded are determined by this enum.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; class=&amp;quot;article-table&amp;quot; style=&amp;quot;font-size:13px;line-height:21px;width:500px;height:500px;&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Asset Type&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Xbox ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|PS3 ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|PC ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Is Used&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Max Count&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Asset Size (PC)&lt;br /&gt;
|-&lt;br /&gt;
|physpreset&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|True&lt;br /&gt;
|0x40&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|phys_collmap&lt;br /&gt;
|0x01&lt;br /&gt;
|0x01&lt;br /&gt;
|0x01&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x48&lt;br /&gt;
|-&lt;br /&gt;
|xanim&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x58&lt;br /&gt;
|-&lt;br /&gt;
|xmodelsurfs&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x24&lt;br /&gt;
|-&lt;br /&gt;
|xmodel&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|True&lt;br /&gt;
|0x600&lt;br /&gt;
|0x130&lt;br /&gt;
|-&lt;br /&gt;
|material&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x60&lt;br /&gt;
|-&lt;br /&gt;
|pixelshader&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|True&lt;br /&gt;
|0x1FA0&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|vertexshader&lt;br /&gt;
|N/A&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|vertexdecl&lt;br /&gt;
|N/A&lt;br /&gt;
|N/A&lt;br /&gt;
|0x08&lt;br /&gt;
|True&lt;br /&gt;
|0x30&lt;br /&gt;
|0x64&lt;br /&gt;
|-&lt;br /&gt;
|techset&lt;br /&gt;
|0x07&lt;br /&gt;
|0x08&lt;br /&gt;
|0x09&lt;br /&gt;
|True&lt;br /&gt;
|0x300&lt;br /&gt;
|0xCC&lt;br /&gt;
|-&lt;br /&gt;
|image&lt;br /&gt;
|0x08&lt;br /&gt;
|0x09&lt;br /&gt;
|0x0A&lt;br /&gt;
|True&lt;br /&gt;
|0xE00&lt;br /&gt;
|0x20&lt;br /&gt;
|-&lt;br /&gt;
|sound&lt;br /&gt;
|0x09&lt;br /&gt;
|0x0A&lt;br /&gt;
|0x0B&lt;br /&gt;
|True&lt;br /&gt;
|0x3E80&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|sndcurve&lt;br /&gt;
|0x0A&lt;br /&gt;
|0x0B&lt;br /&gt;
|0x0C&lt;br /&gt;
|True&lt;br /&gt;
|0x40&lt;br /&gt;
|0x88&lt;br /&gt;
|-&lt;br /&gt;
|loaded_sound&lt;br /&gt;
|0x0B&lt;br /&gt;
|0x0C&lt;br /&gt;
|0x0D&lt;br /&gt;
|True&lt;br /&gt;
|0x546&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|col_map_sp&lt;br /&gt;
|0x0C&lt;br /&gt;
|0x0D&lt;br /&gt;
|0x0E&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x100&lt;br /&gt;
|-&lt;br /&gt;
|col_map_mp&lt;br /&gt;
|0x0D&lt;br /&gt;
|0x0E&lt;br /&gt;
|0x0F&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x100&lt;br /&gt;
|-&lt;br /&gt;
|com_map&lt;br /&gt;
|0x0E&lt;br /&gt;
|0x0F&lt;br /&gt;
|0x10&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|game_map_sp&lt;br /&gt;
|0x0F&lt;br /&gt;
|0x10&lt;br /&gt;
|0x11&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x38&lt;br /&gt;
|-&lt;br /&gt;
|game_map_mp&lt;br /&gt;
|0x10&lt;br /&gt;
|0x11&lt;br /&gt;
|0x12&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|map_ents&lt;br /&gt;
|0x11&lt;br /&gt;
|0x12&lt;br /&gt;
|0x13&lt;br /&gt;
|True&lt;br /&gt;
|2&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|fx_map&lt;br /&gt;
|0x12&lt;br /&gt;
|0x13&lt;br /&gt;
|0x14&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x74&lt;br /&gt;
|-&lt;br /&gt;
|gfx_map&lt;br /&gt;
|0x13&lt;br /&gt;
|0x14&lt;br /&gt;
|0x15&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x274&lt;br /&gt;
|-&lt;br /&gt;
|lightdef&lt;br /&gt;
|0x14&lt;br /&gt;
|0x15&lt;br /&gt;
|0x16&lt;br /&gt;
|True&lt;br /&gt;
|0x20&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|ui_map&lt;br /&gt;
|0x15&lt;br /&gt;
|0x16&lt;br /&gt;
|0x17&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|font&lt;br /&gt;
|0x16&lt;br /&gt;
|0x17&lt;br /&gt;
|0x18&lt;br /&gt;
|True&lt;br /&gt;
|0x10&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|menufile&lt;br /&gt;
|0x17&lt;br /&gt;
|0x18&lt;br /&gt;
|0x19&lt;br /&gt;
|True&lt;br /&gt;
|0x80&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|menu&lt;br /&gt;
|0x18&lt;br /&gt;
|0x19&lt;br /&gt;
|0x1A&lt;br /&gt;
|True&lt;br /&gt;
|0x264&lt;br /&gt;
|0x190&lt;br /&gt;
|-&lt;br /&gt;
|localize&lt;br /&gt;
|0x19&lt;br /&gt;
|0x1A&lt;br /&gt;
|0x1B&lt;br /&gt;
|True&lt;br /&gt;
|0x1B58&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|weapon&lt;br /&gt;
|0x1A&lt;br /&gt;
|0x1B&lt;br /&gt;
|0x1C&lt;br /&gt;
|True&lt;br /&gt;
|0x578&lt;br /&gt;
|0x684&lt;br /&gt;
|-&lt;br /&gt;
|snddriverglobals&lt;br /&gt;
|0x1B&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x1D&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|fx&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x1D&lt;br /&gt;
|0x1E&lt;br /&gt;
|True&lt;br /&gt;
|0x258&lt;br /&gt;
|0x20&lt;br /&gt;
|-&lt;br /&gt;
|impactfx&lt;br /&gt;
|0x1D&lt;br /&gt;
|0x1E&lt;br /&gt;
|0x1F&lt;br /&gt;
|True&lt;br /&gt;
|4&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|aitype&lt;br /&gt;
|0x1E&lt;br /&gt;
|0x1F&lt;br /&gt;
|0x20&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|mptype&lt;br /&gt;
|0x1F&lt;br /&gt;
|0x20&lt;br /&gt;
|0x21&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|character&lt;br /&gt;
|0x20&lt;br /&gt;
|0x21&lt;br /&gt;
|0x22&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|xmodelalias&lt;br /&gt;
|0x21&lt;br /&gt;
|0x22&lt;br /&gt;
|0x23&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|rawfile&lt;br /&gt;
|0x22&lt;br /&gt;
|0x23&lt;br /&gt;
|0x24&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|stringtable&lt;br /&gt;
|0x23&lt;br /&gt;
|0x24&lt;br /&gt;
|0x25&lt;br /&gt;
|True&lt;br /&gt;
|0x190&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|leaderboarddef&lt;br /&gt;
|0x24&lt;br /&gt;
|0x25&lt;br /&gt;
|0x26&lt;br /&gt;
|True&lt;br /&gt;
|0x64&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|structureddatadef&lt;br /&gt;
|0x25&lt;br /&gt;
|0x26&lt;br /&gt;
|0x27&lt;br /&gt;
|True&lt;br /&gt;
|0x18&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|tracer&lt;br /&gt;
|0x26&lt;br /&gt;
|0x27&lt;br /&gt;
|0x28&lt;br /&gt;
|True&lt;br /&gt;
|0x20&lt;br /&gt;
|0x70&lt;br /&gt;
|-&lt;br /&gt;
|vehicle&lt;br /&gt;
|0x27&lt;br /&gt;
|0x28&lt;br /&gt;
|0x29&lt;br /&gt;
|True&lt;br /&gt;
|0x80&lt;br /&gt;
|0x2D0&lt;br /&gt;
|-&lt;br /&gt;
|addon_map_ents&lt;br /&gt;
|0x28&lt;br /&gt;
|0x29&lt;br /&gt;
|0x2A&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x24&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:FastFiles&amp;diff=1055</id>
		<title>Category:FastFiles</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:FastFiles&amp;diff=1055"/>
		<updated>2026-06-15T21:35:23Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;FastFiles are the CoD engine&#039;s way of storing Zone files. FastFiles (FFs) almost always have some sort of RSA2048 signature, a zlib compression along the way, and then on later CoDs some encryption. The Zones are a library of [[:Category:Assets|assets]]. Every FF in every CoD game starts the same way...&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Magic || 0x0 || char[8] || &amp;quot;IWffu100&amp;quot; for unsigned fastfiles, &amp;quot;IWff0100&amp;quot; for signed fastfiles, &amp;quot;TAff0100&amp;quot; for treyarch&#039;s Black Ops 2 fastfile, and &amp;quot;S1ff0100&amp;quot; for Sledgehammer Advanced Warfare fastfiles.&lt;br /&gt;
|-&lt;br /&gt;
| Version || 0x8 || int || See below.&lt;br /&gt;
|}&lt;br /&gt;
So by reading the version of the input FF, you can tell what system and game the FF is from. Note that pre-alpha versions of Call of Duty 4 are missing the version integer, and must be handled specially. Also keep in mind that the Quantum of Solace FFs are missing the magic in the struct above. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| XFILE_VERSION || &#039;&#039;&#039;007:QoS&#039;&#039;&#039; ||&#039;&#039;&#039;CoD4&#039;&#039;&#039;||&#039;&#039;&#039;WaW&#039;&#039;&#039;||&#039;&#039;&#039;MW2&#039;&#039;&#039;||&#039;&#039;&#039;BO1&#039;&#039;&#039;||&#039;&#039;&#039;MW3&#039;&#039;&#039;||&#039;&#039;&#039;BO2&#039;&#039;&#039;||&#039;&#039;&#039;Ghosts&#039;&#039;&#039;||&#039;&#039;&#039;CoD: Online&#039;&#039;&#039;||&#039;&#039;&#039;Advanced Warfare&#039;&#039;&#039;||&#039;&#039;&#039;BO3 Beta&#039;&#039;&#039;||&#039;&#039;&#039;BO3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Xbox 360||0x1D6||0x1||0x183||0x10D||0x1D9||0x70||0x92||0x22E||n/a||0x72E||n/a||0x253&lt;br /&gt;
|-&lt;br /&gt;
|Playstation 3||0x1D6||0x1||0x183||0x10D||0x1D9||0x70||0x92||0x22E||n/a||0x72E||n/a||0x25E&lt;br /&gt;
|-&lt;br /&gt;
|Wii/Wii-U||0x1D2||0x1A2||0x19B||n/a||0x1DD||0x6B||0x94||0x22E||n/a||n/a||n/a||n/a&lt;br /&gt;
|-&lt;br /&gt;
|PC||0x1D6||0x5||0x183||0x114||0x1D9||0x1||0x93||0x135||0x13C||0x72E||0x1FB||n/a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Stream Blocks ==&lt;br /&gt;
After the Zone (XFile) is extracted from the fastfile, you read the block sizes of each g_streamBlock allocation. This determines how much memory to allocate to each stream to read data into. Each block stream has a specific role in the data that is read and it goes as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|  ||&#039;&#039;&#039;Temp&#039;&#039;&#039;||&#039;&#039;&#039;Physical&#039;&#039;&#039;||&#039;&#039;&#039;Runtime&#039;&#039;&#039;||&#039;&#039;&#039;Virtual&#039;&#039;&#039;||&#039;&#039;&#039;Large&#039;&#039;&#039;||&#039;&#039;&#039;Callback&#039;&#039;&#039;||&#039;&#039;&#039;Vertex&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Purpose||Asset Pool Headers, Counts, Root Pointers||Sound Data||??||PC uses this for loading assets||Strings and Data Chunks (rawfiles)||Used in some loader methods||Material and Image data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
One distinction is that PC uses virtual for a load of loading where PS3 mainly uses large.&lt;br /&gt;
&lt;br /&gt;
Stream blocks exist within a stack, when a loader is using a block, it pops the requested block onto the stack, reads data into it, then when complete, pops that block off the stack, and returns to the previous block at the block stream cursor position.&lt;br /&gt;
&lt;br /&gt;
=== Block Stream Flow ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #a2a9b1; padding:0.5em; margin:0.5em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Show&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
START&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Init XBlockStream                                |&lt;br /&gt;
| ActiveBlock = TEMP                               |&lt;br /&gt;
| Stack = empty                                    |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Read header                                      |&lt;br /&gt;
| Source cursor advances                           |&lt;br /&gt;
| Blocks are created from header block sizes       |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Read XAssetList root                             |&lt;br /&gt;
| ActiveBlock = TEMP                               |&lt;br /&gt;
| Reads: scriptStringCount, scriptStringsPtr,      |&lt;br /&gt;
|        assetCount, assetsPtr                     |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Materialize ScriptStringsPtr                     |&lt;br /&gt;
| Payload block = LARGE                            |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| PUSH LARGE                                       |&lt;br /&gt;
| Stack push: previous = TEMP                      |&lt;br /&gt;
| ActiveBlock = LARGE                              |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Read script string pointer array                 |&lt;br /&gt;
| ActiveBlock = LARGE                              |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| For each script string pointer                   |&lt;br /&gt;
|                                                  |&lt;br /&gt;
|  0        -&amp;gt; null, no payload                    |&lt;br /&gt;
| -1 inline -&amp;gt; read CString at current LARGE pos   |&lt;br /&gt;
| -2 insert -&amp;gt; reserve extra pointer cell in LARGE |&lt;br /&gt;
|              patch original + inserted cells     |&lt;br /&gt;
|              read CString in LARGE               |&lt;br /&gt;
| offset    -&amp;gt; decode block+offset, resolve/defer  |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| POP LARGE                                        |&lt;br /&gt;
| ActiveBlock returns to TEMP                      |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Materialize AssetsPtr                            |&lt;br /&gt;
| Payload block = LARGE                            |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| PUSH LARGE                                       |&lt;br /&gt;
| Stack push: previous = TEMP                      |&lt;br /&gt;
| ActiveBlock = LARGE                              |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Phase 1: read XAsset table                       |&lt;br /&gt;
| ActiveBlock = LARGE                              |&lt;br /&gt;
| Each row: asset type + asset pointer             |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Phase 2: for each asset row                      |&lt;br /&gt;
| Materialize asset root pointer                   |&lt;br /&gt;
| Root payload block = TEMP                        |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Asset root pointer kind                          |&lt;br /&gt;
|                                                  |&lt;br /&gt;
|  0        -&amp;gt; asset value = null                  |&lt;br /&gt;
| -1 inline -&amp;gt; PUSH TEMP, read asset payload       |&lt;br /&gt;
| -2 insert -&amp;gt; reserve pointer cell in LARGE       |&lt;br /&gt;
|              patch original + inserted cells     |&lt;br /&gt;
|              PUSH TEMP, read asset payload       |&lt;br /&gt;
| offset    -&amp;gt; decode block+offset                 |&lt;br /&gt;
|              PUSH decoded block, read payload    |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Read asset object fields                         |&lt;br /&gt;
| Nested pointers may push TEMP, LARGE, VIRTUAL,   |&lt;br /&gt;
| or another decoded/allocated block               |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| POP nested block(s)                              |&lt;br /&gt;
| POP asset payload block                          |&lt;br /&gt;
| Continue next asset                              |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| After all assets                                 |&lt;br /&gt;
| POP LARGE                                        |&lt;br /&gt;
| ActiveBlock returns to TEMP                      |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Resolve deferred CString pointers                |&lt;br /&gt;
| Validate source cursor                           |&lt;br /&gt;
| Seal/pad emitted blocks                          |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pop behavior:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
POP behavior:&lt;br /&gt;
&lt;br /&gt;
If popping from TEMP:&lt;br /&gt;
  restore TEMP cursor to the position saved when TEMP was pushed&lt;br /&gt;
&lt;br /&gt;
If popping from any other block:&lt;br /&gt;
  keep that block&#039;s advanced cursor&lt;br /&gt;
&lt;br /&gt;
Always:&lt;br /&gt;
  ActiveBlock = previous block from the stack frame&lt;br /&gt;
&lt;br /&gt;
Important:&lt;br /&gt;
  Source _position is not rewound by POP.&lt;br /&gt;
  The stack only controls emitted block cursors.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pointers in Zone Files ==&lt;br /&gt;
Pointers can be classified as one of the following:&lt;br /&gt;
* &amp;lt;code&amp;gt; 0 &amp;lt;/code&amp;gt;: null, no data follows&lt;br /&gt;
* &amp;lt;code&amp;gt; -1 &amp;lt;/code&amp;gt;: inline, data follows after the struct, usually in order but &#039;&#039;&#039;NOT ALWAYS&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt; -2 &amp;lt;/code&amp;gt;: insert, space is allocated in the stream block and inserted into later&lt;br /&gt;
* &amp;lt;code&amp;gt; else &amp;lt;/code&amp;gt;: everything else is an encoded offset, it contains which block and offset it&#039;s pointing too.&lt;br /&gt;
&lt;br /&gt;
Pointers have different types as well, depending on the type the data is loaded differently.&lt;br /&gt;
* &amp;lt;code&amp;gt; Direct &amp;lt;/code&amp;gt;: It points directly to data, such as char*, int*, itemDef_t*&lt;br /&gt;
* &amp;lt;code&amp;gt; Alias &amp;lt;/code&amp;gt;: It pointers to shared assets, such as Material*&lt;br /&gt;
&lt;br /&gt;
For encoded offsets the first 4 bits (or 3 bits in BO2) are extracted and used as an index for the g_streamBlocks array. The other bits are the offset and is added to the data pointer in g_streamBlocks. &lt;br /&gt;
&lt;br /&gt;
=== Encoding ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int EncodeOffset(int blockIndex, int offset)&lt;br /&gt;
{&lt;br /&gt;
    return (blockIndex &amp;lt;&amp;lt; 28) | (offset + 1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Decoding ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XBlockAddress DecodeOffset(int value)&lt;br /&gt;
{&lt;br /&gt;
    int block = (XFILE_BLOCK)(value &amp;gt;&amp;gt; 28);&lt;br /&gt;
    int offset = (int)(value &amp;amp; 0x0FFFFFFF) - 1;&lt;br /&gt;
&lt;br /&gt;
    return new XBlockAddress(block, offset);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example a pointer with a value of &amp;lt;code&amp;gt; 0x40001689 &amp;lt;/code&amp;gt; means that the data belongs in block stream &amp;lt;code&amp;gt; 4 (large) &amp;lt;/code&amp;gt; at offset &amp;lt;code&amp;gt; 0x1688 &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The offset is only correct after the zone file has been loaded into the respective g_streamBlocks/memory. This is because data gets loaded into different blocks depending on how each executable loader works. In addition, data is aligned based on data type.&lt;br /&gt;
&lt;br /&gt;
== Insert Pointers ==&lt;br /&gt;
For -2 pointers, the flow goes as follows:&lt;br /&gt;
1. ReadPointer reads raw -2, writes that 4-byte value into the active emitted block, and remembers that cell as PatchAddress.&lt;br /&gt;
&lt;br /&gt;
2. Later, when the pointer is materialized it recognizes -2 (insert)&lt;br /&gt;
&lt;br /&gt;
3. For insert, it allocates one extra 4-byte pointer cell in the LARGE block, aligned to 4, initialized to 0&lt;br /&gt;
&lt;br /&gt;
4. It resolves the actual payload address according to the plan: current block position, allocated block position, or current stream position.&lt;br /&gt;
&lt;br /&gt;
5. It patches two cells to the encoded payload address:&lt;br /&gt;
the original pointer field that contained -2&lt;br /&gt;
the new inserted pointer cell in LARGE&lt;br /&gt;
&lt;br /&gt;
== Padding Rules ==&lt;br /&gt;
[[BlockStream_Padding|block stream padding docs]]&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=BlockStream_Padding&amp;diff=1054</id>
		<title>BlockStream Padding</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=BlockStream_Padding&amp;diff=1054"/>
		<updated>2026-06-15T21:32:45Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: Created page with &amp;quot;= Block Stream Padding = Data inserted into the block stream is padded depending on data type.  {| class=&amp;quot;wikitable sortable&amp;quot; ! Type !! Size !! Root block !! Padding / alignment rules !! Loader path !! Confidence |- | &amp;lt;code&amp;gt;LocalizeEntry&amp;lt;/code&amp;gt; | &amp;lt;code&amp;gt;0x08&amp;lt;/code&amp;gt; | &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt; | No explicit padding proven. Two direct &amp;lt;code&amp;gt;XString&amp;lt;/code&amp;gt; cells at &amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt;. | &amp;lt;code&amp;gt;0x104278&amp;lt;/code&amp;gt; | Proven |- | &amp;lt;code&amp;gt;RawFile&amp;lt;/code&amp;gt; | &amp;lt;code&amp;gt;0x10&amp;lt;/co...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Block Stream Padding =&lt;br /&gt;
Data inserted into the block stream is padded depending on data type.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! Type !! Size !! Root block !! Padding / alignment rules !! Loader path !! Confidence&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LocalizeEntry&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| No explicit padding proven. Two direct &amp;lt;code&amp;gt;XString&amp;lt;/code&amp;gt; cells at &amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x104278&amp;lt;/code&amp;gt;&lt;br /&gt;
| Proven&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RawFile&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| No explicit root padding proven. &amp;lt;code&amp;gt;buffer&amp;lt;/code&amp;gt; payload at &amp;lt;code&amp;gt;+0x0C&amp;lt;/code&amp;gt; is 1-byte aligned. Payload length is &amp;lt;code&amp;gt;compressedLen&amp;lt;/code&amp;gt; when &amp;lt;code&amp;gt;+0x04 != 0&amp;lt;/code&amp;gt;, else &amp;lt;code&amp;gt;len + 1&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x103ec0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Proven&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;StringTable&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| No explicit padding proven. Cell array pointer at &amp;lt;code&amp;gt;+0x0C&amp;lt;/code&amp;gt;; count is &amp;lt;code&amp;gt;columns * rows&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x103b18&amp;lt;/code&amp;gt;&lt;br /&gt;
| Proven&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;StringTableCell&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| No explicit padding proven. Direct &amp;lt;code&amp;gt;XString&amp;lt;/code&amp;gt; at &amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;; hash at &amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt; is copied unchanged.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x1039d8&amp;lt;/code&amp;gt;&lt;br /&gt;
| Proven&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MenuList&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x0C&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| No explicit padding proven. Name &amp;lt;code&amp;gt;XString&amp;lt;/code&amp;gt; at &amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;. Menu pointer table at &amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;; entries are 4-byte alias pointer cells to &amp;lt;code&amp;gt;MenuDef&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x10f0b8&amp;lt;/code&amp;gt;&lt;br /&gt;
| Proven&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;RectangleDef&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x14&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Explicit trailing padding field at &amp;lt;code&amp;gt;+0x12&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;ushort&amp;lt;/code&amp;gt;) after two 1-byte alignment fields at &amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;+0x11&amp;lt;/code&amp;gt;.&lt;br /&gt;
| Embedded in &amp;lt;code&amp;gt;Window&amp;lt;/code&amp;gt;&lt;br /&gt;
| Strong&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Window&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0xB0&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| No extra root padding proven beyond embedded field layout. Direct &amp;lt;code&amp;gt;XString&amp;lt;/code&amp;gt;s at &amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;+0x2C&amp;lt;/code&amp;gt;. Alias material/background pointer at &amp;lt;code&amp;gt;+0xAC&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x10e538&amp;lt;/code&amp;gt;&lt;br /&gt;
| Proven&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MenuDef&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x2F0&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| No explicit root padding proven. Root &amp;lt;code&amp;gt;Window&amp;lt;/code&amp;gt; at &amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;. Event-handler pointers at &amp;lt;code&amp;gt;+0x0E4..+0x0F4&amp;lt;/code&amp;gt;. Direct statement/XString pointers at &amp;lt;code&amp;gt;+0x0F8..+0x0124&amp;lt;/code&amp;gt;. Item pointer table at &amp;lt;code&amp;gt;+0x0128&amp;lt;/code&amp;gt;. Expression-support pointer at &amp;lt;code&amp;gt;+0x02EC&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x10ecd8&amp;lt;/code&amp;gt;&lt;br /&gt;
| Proven&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ItemDef&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x1CC&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Explicit pad bytes at &amp;lt;code&amp;gt;+0x1B5..+0x1B7&amp;lt;/code&amp;gt;. No other root padding proven. Event-handler pointers at &amp;lt;code&amp;gt;+0x138..+0x160&amp;lt;/code&amp;gt;. Alias sound wrapper at &amp;lt;code&amp;gt;+0x16C&amp;lt;/code&amp;gt;. Type-data branch at &amp;lt;code&amp;gt;+0x184&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x10e940&amp;lt;/code&amp;gt;&lt;br /&gt;
| Proven&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;StructuredDataDefSet&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x0C&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| No explicit padding proven. Name &amp;lt;code&amp;gt;XString&amp;lt;/code&amp;gt; at &amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;. Def array pointer at &amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;; count at &amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x103630&amp;lt;/code&amp;gt;&lt;br /&gt;
| Proven&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;StructuredDataDef&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x34&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| No explicit padding proven. Array pointers at &amp;lt;code&amp;gt;+0x0C&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+0x14&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+0x1C&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+0x24&amp;lt;/code&amp;gt; use counts at &amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+0x18&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;+0x20&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x103400&amp;lt;/code&amp;gt;&lt;br /&gt;
| Proven&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;StructuredDataEnum&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x0C&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| No explicit padding proven. Entry array pointer at &amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;; entries are &amp;lt;code&amp;gt;count * 0x08&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x103278&amp;lt;/code&amp;gt;&lt;br /&gt;
| Proven&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;StructuredDataEnumEntry&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Explicit trailing padding field at &amp;lt;code&amp;gt;+0x06&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;ushort&amp;lt;/code&amp;gt;). Direct &amp;lt;code&amp;gt;XString&amp;lt;/code&amp;gt; at &amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;; index at &amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x103138&amp;lt;/code&amp;gt;&lt;br /&gt;
| Proven&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;StructuredDataStructProperty&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| No explicit padding proven. Direct &amp;lt;code&amp;gt;XString&amp;lt;/code&amp;gt; at &amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;; embedded type and offset are part of the fixed root.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x102e78&amp;lt;/code&amp;gt;&lt;br /&gt;
| Proven&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;StructuredDataStruct&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| No explicit padding proven. Property array pointer at &amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt;; entries are &amp;lt;code&amp;gt;count * 0x10&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x102fb8&amp;lt;/code&amp;gt;&lt;br /&gt;
| Proven&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;StructuredDataIndexedArray&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| No explicit padding proven. Parent loader allocates &amp;lt;code&amp;gt;count * 0x10&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x0E3BB8&amp;lt;/code&amp;gt;&lt;br /&gt;
| Proven&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;StructuredDataEnumedArray&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| No explicit padding proven. Parent loader allocates &amp;lt;code&amp;gt;count * 0x10&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x0E3AE0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Proven&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;WeaponVariantDef&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x74&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Hide-tag array at &amp;lt;code&amp;gt;+0x0C&amp;lt;/code&amp;gt; is 2-byte aligned. Animation pointer array at &amp;lt;code&amp;gt;+0x10&amp;lt;/code&amp;gt; is 4-byte aligned. Accuracy &amp;lt;code&amp;gt;Vec2[]&amp;lt;/code&amp;gt; arrays at &amp;lt;code&amp;gt;+0x68/+0x6C&amp;lt;/code&amp;gt; are 4-byte aligned. Explicit trailing pad byte at &amp;lt;code&amp;gt;+0x73&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x1152F8&amp;lt;/code&amp;gt;&lt;br /&gt;
| Proven&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;WeaponDef&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x684&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Model and XString pointer arrays are 4-byte aligned. Note-track ushort arrays are 2-byte aligned. Surface/hit-location float arrays are 4-byte aligned. Alias asset wrappers use TEMP alias-cell semantics. Not every scalar gap is individually proven yet.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x114678&amp;lt;/code&amp;gt;&lt;br /&gt;
| Proven for major pointer-bearing fields; partial for all scalar gaps&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;TracerDef&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x70&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt; body, &amp;lt;code&amp;gt;TEMP&amp;lt;/code&amp;gt; wrapper&lt;br /&gt;
| Name at &amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt; resolves in &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;. Material at &amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt; is a TEMP alias-wrapper pointer aligned to 4. No other pointer-bearing fields proven.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x10E148&amp;lt;/code&amp;gt; body, &amp;lt;code&amp;gt;0x10E1B8&amp;lt;/code&amp;gt; wrapper&lt;br /&gt;
| Proven&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;FxEffectDef&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x20&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt; body, &amp;lt;code&amp;gt;TEMP&amp;lt;/code&amp;gt; wrapper&lt;br /&gt;
| Root body pushes &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;elemDefs&amp;lt;/code&amp;gt; pointer at &amp;lt;code&amp;gt;+0x1C&amp;lt;/code&amp;gt; is 4-byte aligned.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x113038&amp;lt;/code&amp;gt;&lt;br /&gt;
| Strong loader-graph proof&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;FxElemDef&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0xFC&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;velSamples&amp;lt;/code&amp;gt; at &amp;lt;code&amp;gt;+0xB4&amp;lt;/code&amp;gt; is 4-byte aligned. &amp;lt;code&amp;gt;visSamples&amp;lt;/code&amp;gt; at &amp;lt;code&amp;gt;+0xB8&amp;lt;/code&amp;gt; is 4-byte aligned. Multi-visual arrays are 4-byte aligned. Extended default byte payload is 1-byte aligned. Trail-index payloads are 2-byte aligned.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x112E20&amp;lt;/code&amp;gt;&lt;br /&gt;
| Proven for loader behavior; some semantic field names remain IW-family backed&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;FxElemDefVisuals[]&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x04&amp;lt;/code&amp;gt; each&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Array path is 4-byte aligned when &amp;lt;code&amp;gt;visualCount &amp;amp;gt; 1&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;elemType != 11&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x112D20&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;0x112C98&amp;lt;/code&amp;gt;&lt;br /&gt;
| Strong&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;FxElemMarkVisuals[]&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x08&amp;lt;/code&amp;gt; each&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Array path is 4-byte aligned when &amp;lt;code&amp;gt;elemType == 11&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x112D20&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;0x1105E0&amp;lt;/code&amp;gt;&lt;br /&gt;
| Strong&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;FxTrailDef&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x24&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Root is 4-byte aligned. Vertex payload is 4-byte aligned. Index payload is 2-byte aligned.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x0F4AE8&amp;lt;/code&amp;gt;&lt;br /&gt;
| Strong&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;FxSparkFountainDef&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x34&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Root is 4-byte aligned.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x0E6DF8&amp;lt;/code&amp;gt;&lt;br /&gt;
| Strong&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SndAliasList&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x0C&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;TEMP&amp;lt;/code&amp;gt; root, nested &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Name resolves in &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;. Alias array payload is 4-byte aligned in &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x10A900&amp;lt;/code&amp;gt; body via wrapper&lt;br /&gt;
| Strong loader-trace proof&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SndAlias&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x64&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Five direct strings at &amp;lt;code&amp;gt;+0x00..+0x10&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;SoundFile[]&amp;lt;/code&amp;gt; at &amp;lt;code&amp;gt;+0x14&amp;lt;/code&amp;gt; is 4-byte aligned in &amp;lt;code&amp;gt;TEMP&amp;lt;/code&amp;gt;. &amp;lt;code&amp;gt;SndCurve*&amp;lt;/code&amp;gt; wrapper at &amp;lt;code&amp;gt;+0x50&amp;lt;/code&amp;gt; uses 4-byte TEMP alias alignment. &amp;lt;code&amp;gt;SpeakerMap&amp;lt;/code&amp;gt; at &amp;lt;code&amp;gt;+0x60&amp;lt;/code&amp;gt; resolves in current LARGE stream.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x10A600&amp;lt;/code&amp;gt;&lt;br /&gt;
| Strong&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SoundFile&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x10&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;TEMP&amp;lt;/code&amp;gt;&lt;br /&gt;
| Explicit pad bytes at &amp;lt;code&amp;gt;+0x02..+0x03&amp;lt;/code&amp;gt;. Root is fixed-size. Loaded-sound union branch then pushes &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x10A4A8&amp;lt;/code&amp;gt;&lt;br /&gt;
| Strong&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;LoadedSound&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x1C&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;TEMP&amp;lt;/code&amp;gt; root, nested &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;PHYSICAL&amp;lt;/code&amp;gt;&lt;br /&gt;
| Name resolves in &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;. Seek-table payload at &amp;lt;code&amp;gt;+0x14&amp;lt;/code&amp;gt; is 4-byte aligned in &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;. Physical audio payload at &amp;lt;code&amp;gt;+0x18&amp;lt;/code&amp;gt; is 64-byte aligned in &amp;lt;code&amp;gt;PHYSICAL&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x109FC0&amp;lt;/code&amp;gt; body&lt;br /&gt;
| Strong&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SndCurve&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x88&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;TEMP&amp;lt;/code&amp;gt; root, nested &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Explicit pad bytes at &amp;lt;code&amp;gt;+0x06..+0x07&amp;lt;/code&amp;gt;. Filename &amp;lt;code&amp;gt;XString&amp;lt;/code&amp;gt; resolves in &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x109C50&amp;lt;/code&amp;gt;&lt;br /&gt;
| Strong&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;SpeakerMap&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x198&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Explicit 3-byte padding at &amp;lt;code&amp;gt;+0x01..+0x03&amp;lt;/code&amp;gt;. Name &amp;lt;code&amp;gt;XString&amp;lt;/code&amp;gt; at &amp;lt;code&amp;gt;+0x04&amp;lt;/code&amp;gt;.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x109B10&amp;lt;/code&amp;gt;&lt;br /&gt;
| Strong&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MaterialTechniqueSet&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x9C&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Name &amp;lt;code&amp;gt;XString&amp;lt;/code&amp;gt; at &amp;lt;code&amp;gt;+0x00&amp;lt;/code&amp;gt;. Technique pointer table starts at &amp;lt;code&amp;gt;+0x08&amp;lt;/code&amp;gt;; fixed count 37 on PS3; pointer cells are 4 bytes each.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x107E80&amp;lt;/code&amp;gt;&lt;br /&gt;
| Strong&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MaterialTechnique&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Pass count is &amp;lt;code&amp;gt;ushort&amp;lt;/code&amp;gt; at &amp;lt;code&amp;gt;+0x06&amp;lt;/code&amp;gt;. Pass array follows root.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x107C88&amp;lt;/code&amp;gt;&lt;br /&gt;
| Strong&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MaterialPass&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x18&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Explicit 3-byte padding after &amp;lt;code&amp;gt;PrecompiledIndex&amp;lt;/code&amp;gt;. Shader-argument array at &amp;lt;code&amp;gt;+0x14&amp;lt;/code&amp;gt; is 4-byte aligned.&lt;br /&gt;
| &amp;lt;code&amp;gt;0x107BF8&amp;lt;/code&amp;gt;&lt;br /&gt;
| Strong&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MaterialVertexShaderProgram&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x08&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt; root, TEMP payload&lt;br /&gt;
| Shader bytecode payload is 16-byte aligned in current TEMP stream.&lt;br /&gt;
| Reader implementation mirrors PS3 shader path&lt;br /&gt;
| Modeled from loader pattern, not yet directly tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MaterialPixelShaderProgram&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0x14&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt; root, TEMP payload&lt;br /&gt;
| Shader bytecode payload is 16-byte aligned in current TEMP stream.&lt;br /&gt;
| Reader implementation mirrors PS3 shader path&lt;br /&gt;
| Modeled from loader pattern, not yet directly tagged&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Material&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;0xA8&amp;lt;/code&amp;gt;&lt;br /&gt;
| &amp;lt;code&amp;gt;LARGE&amp;lt;/code&amp;gt;&lt;br /&gt;
| Proven/aligned payload rules currently encoded are: ushort payload at &amp;lt;code&amp;gt;+0x90&amp;lt;/code&amp;gt; is 2-byte aligned, texture table at &amp;lt;code&amp;gt;+0x98&amp;lt;/code&amp;gt; is 4-byte aligned, constant table at &amp;lt;code&amp;gt;+0x9C&amp;lt;/code&amp;gt; is 16-byte aligned, state-bit table at &amp;lt;code&amp;gt;+0xA0&amp;lt;/code&amp;gt; is 4-byte aligned, unknown XString pointer array at &amp;lt;code&amp;gt;+0xA4&amp;lt;/code&amp;gt; is 4-byte aligned. Root has explicit 2-byte pad at &amp;lt;code&amp;gt;+0x8E&amp;lt;/code&amp;gt;.&lt;br /&gt;
| Material loader family&lt;br /&gt;
| Partial&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:FastFiles&amp;diff=1053</id>
		<title>Category:FastFiles</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:FastFiles&amp;diff=1053"/>
		<updated>2026-06-12T03:50:49Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* flow */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;FastFiles are the CoD engine&#039;s way of storing Zone files. FastFiles (FFs) almost always have some sort of RSA2048 signature, a zlib compression along the way, and then on later CoDs some encryption. The Zones are a library of [[:Category:Assets|assets]]. Every FF in every CoD game starts the same way...&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Magic || 0x0 || char[8] || &amp;quot;IWffu100&amp;quot; for unsigned fastfiles, &amp;quot;IWff0100&amp;quot; for signed fastfiles, &amp;quot;TAff0100&amp;quot; for treyarch&#039;s Black Ops 2 fastfile, and &amp;quot;S1ff0100&amp;quot; for Sledgehammer Advanced Warfare fastfiles.&lt;br /&gt;
|-&lt;br /&gt;
| Version || 0x8 || int || See below.&lt;br /&gt;
|}&lt;br /&gt;
So by reading the version of the input FF, you can tell what system and game the FF is from. Note that pre-alpha versions of Call of Duty 4 are missing the version integer, and must be handled specially. Also keep in mind that the Quantum of Solace FFs are missing the magic in the struct above. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| XFILE_VERSION || &#039;&#039;&#039;007:QoS&#039;&#039;&#039; ||&#039;&#039;&#039;CoD4&#039;&#039;&#039;||&#039;&#039;&#039;WaW&#039;&#039;&#039;||&#039;&#039;&#039;MW2&#039;&#039;&#039;||&#039;&#039;&#039;BO1&#039;&#039;&#039;||&#039;&#039;&#039;MW3&#039;&#039;&#039;||&#039;&#039;&#039;BO2&#039;&#039;&#039;||&#039;&#039;&#039;Ghosts&#039;&#039;&#039;||&#039;&#039;&#039;CoD: Online&#039;&#039;&#039;||&#039;&#039;&#039;Advanced Warfare&#039;&#039;&#039;||&#039;&#039;&#039;BO3 Beta&#039;&#039;&#039;||&#039;&#039;&#039;BO3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Xbox 360||0x1D6||0x1||0x183||0x10D||0x1D9||0x70||0x92||0x22E||n/a||0x72E||n/a||0x253&lt;br /&gt;
|-&lt;br /&gt;
|Playstation 3||0x1D6||0x1||0x183||0x10D||0x1D9||0x70||0x92||0x22E||n/a||0x72E||n/a||0x25E&lt;br /&gt;
|-&lt;br /&gt;
|Wii/Wii-U||0x1D2||0x1A2||0x19B||n/a||0x1DD||0x6B||0x94||0x22E||n/a||n/a||n/a||n/a&lt;br /&gt;
|-&lt;br /&gt;
|PC||0x1D6||0x5||0x183||0x114||0x1D9||0x1||0x93||0x135||0x13C||0x72E||0x1FB||n/a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Stream Blocks ==&lt;br /&gt;
After the Zone (XFile) is extracted from the fastfile, you read the block sizes of each g_streamBlock allocation. This determines how much memory to allocate to each stream to read data into. Each block stream has a specific role in the data that is read and it goes as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|  ||&#039;&#039;&#039;Temp&#039;&#039;&#039;||&#039;&#039;&#039;Physical&#039;&#039;&#039;||&#039;&#039;&#039;Runtime&#039;&#039;&#039;||&#039;&#039;&#039;Virtual&#039;&#039;&#039;||&#039;&#039;&#039;Large&#039;&#039;&#039;||&#039;&#039;&#039;Callback&#039;&#039;&#039;||&#039;&#039;&#039;Vertex&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Purpose||Asset Pool Headers, Counts, Root Pointers||Sound Data||??||PC uses this for loading assets||Strings and Data Chunks (rawfiles)||Used in some loader methods||Material and Image data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
One distinction is that PC uses virtual for a load of loading where PS3 mainly uses large.&lt;br /&gt;
&lt;br /&gt;
Stream blocks exist within a stack, when a loader is using a block, it pops the requested block onto the stack, reads data into it, then when complete, pops that block off the stack, and returns to the previous block at the block stream cursor position.&lt;br /&gt;
&lt;br /&gt;
=== Block Stream Flow ===&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #a2a9b1; padding:0.5em; margin:0.5em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Show&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
START&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Init XBlockStream                                |&lt;br /&gt;
| ActiveBlock = TEMP                               |&lt;br /&gt;
| Stack = empty                                    |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Read header                                      |&lt;br /&gt;
| Source cursor advances                           |&lt;br /&gt;
| Blocks are created from header block sizes       |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Read XAssetList root                             |&lt;br /&gt;
| ActiveBlock = TEMP                               |&lt;br /&gt;
| Reads: scriptStringCount, scriptStringsPtr,      |&lt;br /&gt;
|        assetCount, assetsPtr                     |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Materialize ScriptStringsPtr                     |&lt;br /&gt;
| Payload block = LARGE                            |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| PUSH LARGE                                       |&lt;br /&gt;
| Stack push: previous = TEMP                      |&lt;br /&gt;
| ActiveBlock = LARGE                              |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Read script string pointer array                 |&lt;br /&gt;
| ActiveBlock = LARGE                              |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| For each script string pointer                   |&lt;br /&gt;
|                                                  |&lt;br /&gt;
|  0        -&amp;gt; null, no payload                    |&lt;br /&gt;
| -1 inline -&amp;gt; read CString at current LARGE pos   |&lt;br /&gt;
| -2 insert -&amp;gt; reserve extra pointer cell in LARGE |&lt;br /&gt;
|              patch original + inserted cells     |&lt;br /&gt;
|              read CString in LARGE               |&lt;br /&gt;
| offset    -&amp;gt; decode block+offset, resolve/defer  |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| POP LARGE                                        |&lt;br /&gt;
| ActiveBlock returns to TEMP                      |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Materialize AssetsPtr                            |&lt;br /&gt;
| Payload block = LARGE                            |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| PUSH LARGE                                       |&lt;br /&gt;
| Stack push: previous = TEMP                      |&lt;br /&gt;
| ActiveBlock = LARGE                              |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Phase 1: read XAsset table                       |&lt;br /&gt;
| ActiveBlock = LARGE                              |&lt;br /&gt;
| Each row: asset type + asset pointer             |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Phase 2: for each asset row                      |&lt;br /&gt;
| Materialize asset root pointer                   |&lt;br /&gt;
| Root payload block = TEMP                        |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Asset root pointer kind                          |&lt;br /&gt;
|                                                  |&lt;br /&gt;
|  0        -&amp;gt; asset value = null                  |&lt;br /&gt;
| -1 inline -&amp;gt; PUSH TEMP, read asset payload       |&lt;br /&gt;
| -2 insert -&amp;gt; reserve pointer cell in LARGE       |&lt;br /&gt;
|              patch original + inserted cells     |&lt;br /&gt;
|              PUSH TEMP, read asset payload       |&lt;br /&gt;
| offset    -&amp;gt; decode block+offset                 |&lt;br /&gt;
|              PUSH decoded block, read payload    |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Read asset object fields                         |&lt;br /&gt;
| Nested pointers may push TEMP, LARGE, VIRTUAL,   |&lt;br /&gt;
| or another decoded/allocated block               |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| POP nested block(s)                              |&lt;br /&gt;
| POP asset payload block                          |&lt;br /&gt;
| Continue next asset                              |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| After all assets                                 |&lt;br /&gt;
| POP LARGE                                        |&lt;br /&gt;
| ActiveBlock returns to TEMP                      |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Resolve deferred CString pointers                |&lt;br /&gt;
| Validate source cursor                           |&lt;br /&gt;
| Seal/pad emitted blocks                          |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pop behavior:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
POP behavior:&lt;br /&gt;
&lt;br /&gt;
If popping from TEMP:&lt;br /&gt;
  restore TEMP cursor to the position saved when TEMP was pushed&lt;br /&gt;
&lt;br /&gt;
If popping from any other block:&lt;br /&gt;
  keep that block&#039;s advanced cursor&lt;br /&gt;
&lt;br /&gt;
Always:&lt;br /&gt;
  ActiveBlock = previous block from the stack frame&lt;br /&gt;
&lt;br /&gt;
Important:&lt;br /&gt;
  Source _position is not rewound by POP.&lt;br /&gt;
  The stack only controls emitted block cursors.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pointers in Zone Files ==&lt;br /&gt;
Pointers can be classified as one of the following:&lt;br /&gt;
* &amp;lt;code&amp;gt; 0 &amp;lt;/code&amp;gt;: null, no data follows&lt;br /&gt;
* &amp;lt;code&amp;gt; -1 &amp;lt;/code&amp;gt;: inline, data follows after the struct, usually in order but &#039;&#039;&#039;NOT ALWAYS&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt; -2 &amp;lt;/code&amp;gt;: insert, space is allocated in the stream block and inserted into later&lt;br /&gt;
* &amp;lt;code&amp;gt; else &amp;lt;/code&amp;gt;: everything else is an encoded offset, it contains which block and offset it&#039;s pointing too.&lt;br /&gt;
&lt;br /&gt;
Pointers have different types as well, depending on the type the data is loaded differently.&lt;br /&gt;
* &amp;lt;code&amp;gt; Direct &amp;lt;/code&amp;gt;: It points directly to data, such as char*, int*, itemDef_t*&lt;br /&gt;
* &amp;lt;code&amp;gt; Alias &amp;lt;/code&amp;gt;: It pointers to shared assets, such as Material*&lt;br /&gt;
&lt;br /&gt;
For encoded offsets the first 4 bits (or 3 bits in BO2) are extracted and used as an index for the g_streamBlocks array. The other bits are the offset and is added to the data pointer in g_streamBlocks. &lt;br /&gt;
&lt;br /&gt;
=== Encoding ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int EncodeOffset(int blockIndex, int offset)&lt;br /&gt;
{&lt;br /&gt;
    return (blockIndex &amp;lt;&amp;lt; 28) | (offset + 1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Decoding ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XBlockAddress DecodeOffset(int value)&lt;br /&gt;
{&lt;br /&gt;
    int block = (XFILE_BLOCK)(value &amp;gt;&amp;gt; 28);&lt;br /&gt;
    int offset = (int)(value &amp;amp; 0x0FFFFFFF) - 1;&lt;br /&gt;
&lt;br /&gt;
    return new XBlockAddress(block, offset);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example a pointer with a value of &amp;lt;code&amp;gt; 0x40001689 &amp;lt;/code&amp;gt; means that the data belongs in block stream &amp;lt;code&amp;gt; 4 (large) &amp;lt;/code&amp;gt; at offset &amp;lt;code&amp;gt; 0x1688 &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The offset is only correct after the zone file has been loaded into the respective g_streamBlocks/memory. This is because data gets loaded into different blocks depending on how each executable loader works. In addition, data is aligned based on data type.&lt;br /&gt;
&lt;br /&gt;
=== Padding Rules ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|  ||&#039;&#039;&#039;XStruct&#039;&#039;&#039;||&#039;&#039;&#039;Pointers&#039;&#039;&#039;||&#039;&#039;&#039;Byte&#039;&#039;&#039;||&#039;&#039;&#039;Bool&#039;&#039;&#039;||&#039;&#039;&#039;int16/uint16&#039;&#039;&#039;||&#039;&#039;&#039;Default&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Byte Alignment||4||4||1||1||2||4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Insert Pointers ==&lt;br /&gt;
For -2 pointers, the flow goes as follows:&lt;br /&gt;
1. ReadPointer reads raw -2, writes that 4-byte value into the active emitted block, and remembers that cell as PatchAddress.&lt;br /&gt;
&lt;br /&gt;
2. Later, when the pointer is materialized it recognizes -2 (insert)&lt;br /&gt;
&lt;br /&gt;
3. For insert, it allocates one extra 4-byte pointer cell in the LARGE block, aligned to 4, initialized to 0&lt;br /&gt;
&lt;br /&gt;
4. It resolves the actual payload address according to the plan: current block position, allocated block position, or current stream position.&lt;br /&gt;
&lt;br /&gt;
5. It patches two cells to the encoded payload address:&lt;br /&gt;
the original pointer field that contained -2&lt;br /&gt;
the new inserted pointer cell in LARGE&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:FastFiles&amp;diff=1052</id>
		<title>Category:FastFiles</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:FastFiles&amp;diff=1052"/>
		<updated>2026-06-12T03:48:18Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Stream Blocks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;FastFiles are the CoD engine&#039;s way of storing Zone files. FastFiles (FFs) almost always have some sort of RSA2048 signature, a zlib compression along the way, and then on later CoDs some encryption. The Zones are a library of [[:Category:Assets|assets]]. Every FF in every CoD game starts the same way...&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Magic || 0x0 || char[8] || &amp;quot;IWffu100&amp;quot; for unsigned fastfiles, &amp;quot;IWff0100&amp;quot; for signed fastfiles, &amp;quot;TAff0100&amp;quot; for treyarch&#039;s Black Ops 2 fastfile, and &amp;quot;S1ff0100&amp;quot; for Sledgehammer Advanced Warfare fastfiles.&lt;br /&gt;
|-&lt;br /&gt;
| Version || 0x8 || int || See below.&lt;br /&gt;
|}&lt;br /&gt;
So by reading the version of the input FF, you can tell what system and game the FF is from. Note that pre-alpha versions of Call of Duty 4 are missing the version integer, and must be handled specially. Also keep in mind that the Quantum of Solace FFs are missing the magic in the struct above. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| XFILE_VERSION || &#039;&#039;&#039;007:QoS&#039;&#039;&#039; ||&#039;&#039;&#039;CoD4&#039;&#039;&#039;||&#039;&#039;&#039;WaW&#039;&#039;&#039;||&#039;&#039;&#039;MW2&#039;&#039;&#039;||&#039;&#039;&#039;BO1&#039;&#039;&#039;||&#039;&#039;&#039;MW3&#039;&#039;&#039;||&#039;&#039;&#039;BO2&#039;&#039;&#039;||&#039;&#039;&#039;Ghosts&#039;&#039;&#039;||&#039;&#039;&#039;CoD: Online&#039;&#039;&#039;||&#039;&#039;&#039;Advanced Warfare&#039;&#039;&#039;||&#039;&#039;&#039;BO3 Beta&#039;&#039;&#039;||&#039;&#039;&#039;BO3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Xbox 360||0x1D6||0x1||0x183||0x10D||0x1D9||0x70||0x92||0x22E||n/a||0x72E||n/a||0x253&lt;br /&gt;
|-&lt;br /&gt;
|Playstation 3||0x1D6||0x1||0x183||0x10D||0x1D9||0x70||0x92||0x22E||n/a||0x72E||n/a||0x25E&lt;br /&gt;
|-&lt;br /&gt;
|Wii/Wii-U||0x1D2||0x1A2||0x19B||n/a||0x1DD||0x6B||0x94||0x22E||n/a||n/a||n/a||n/a&lt;br /&gt;
|-&lt;br /&gt;
|PC||0x1D6||0x5||0x183||0x114||0x1D9||0x1||0x93||0x135||0x13C||0x72E||0x1FB||n/a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Stream Blocks ==&lt;br /&gt;
After the Zone (XFile) is extracted from the fastfile, you read the block sizes of each g_streamBlock allocation. This determines how much memory to allocate to each stream to read data into. Each block stream has a specific role in the data that is read and it goes as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|  ||&#039;&#039;&#039;Temp&#039;&#039;&#039;||&#039;&#039;&#039;Physical&#039;&#039;&#039;||&#039;&#039;&#039;Runtime&#039;&#039;&#039;||&#039;&#039;&#039;Virtual&#039;&#039;&#039;||&#039;&#039;&#039;Large&#039;&#039;&#039;||&#039;&#039;&#039;Callback&#039;&#039;&#039;||&#039;&#039;&#039;Vertex&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Purpose||Asset Pool Headers, Counts, Root Pointers||Sound Data||??||PC uses this for loading assets||Strings and Data Chunks (rawfiles)||Used in some loader methods||Material and Image data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
One distinction is that PC uses virtual for a load of loading where PS3 mainly uses large.&lt;br /&gt;
&lt;br /&gt;
Stream blocks exist within a stack, when a loader is using a block, it pops the requested block onto the stack, reads data into it, then when complete, pops that block off the stack, and returns to the previous block at the block stream cursor position.&lt;br /&gt;
&lt;br /&gt;
=== flow ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
START&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Init XBlockStream                                |&lt;br /&gt;
| ActiveBlock = TEMP                               |&lt;br /&gt;
| Stack = empty                                    |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Read header                                      |&lt;br /&gt;
| Source cursor advances                           |&lt;br /&gt;
| Blocks are created from header block sizes       |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Read XAssetList root                             |&lt;br /&gt;
| ActiveBlock = TEMP                               |&lt;br /&gt;
| Reads: scriptStringCount, scriptStringsPtr,      |&lt;br /&gt;
|        assetCount, assetsPtr                     |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Materialize ScriptStringsPtr                     |&lt;br /&gt;
| Payload block = LARGE                            |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| PUSH LARGE                                       |&lt;br /&gt;
| Stack push: previous = TEMP                      |&lt;br /&gt;
| ActiveBlock = LARGE                              |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Read script string pointer array                 |&lt;br /&gt;
| ActiveBlock = LARGE                              |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| For each script string pointer                   |&lt;br /&gt;
|                                                  |&lt;br /&gt;
|  0        -&amp;gt; null, no payload                    |&lt;br /&gt;
| -1 inline -&amp;gt; read CString at current LARGE pos   |&lt;br /&gt;
| -2 insert -&amp;gt; reserve extra pointer cell in LARGE |&lt;br /&gt;
|              patch original + inserted cells     |&lt;br /&gt;
|              read CString in LARGE               |&lt;br /&gt;
| offset    -&amp;gt; decode block+offset, resolve/defer  |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| POP LARGE                                        |&lt;br /&gt;
| ActiveBlock returns to TEMP                      |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Materialize AssetsPtr                            |&lt;br /&gt;
| Payload block = LARGE                            |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| PUSH LARGE                                       |&lt;br /&gt;
| Stack push: previous = TEMP                      |&lt;br /&gt;
| ActiveBlock = LARGE                              |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Phase 1: read XAsset table                       |&lt;br /&gt;
| ActiveBlock = LARGE                              |&lt;br /&gt;
| Each row: asset type + asset pointer             |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Phase 2: for each asset row                      |&lt;br /&gt;
| Materialize asset root pointer                   |&lt;br /&gt;
| Root payload block = TEMP                        |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Asset root pointer kind                          |&lt;br /&gt;
|                                                  |&lt;br /&gt;
|  0        -&amp;gt; asset value = null                  |&lt;br /&gt;
| -1 inline -&amp;gt; PUSH TEMP, read asset payload       |&lt;br /&gt;
| -2 insert -&amp;gt; reserve pointer cell in LARGE       |&lt;br /&gt;
|              patch original + inserted cells     |&lt;br /&gt;
|              PUSH TEMP, read asset payload       |&lt;br /&gt;
| offset    -&amp;gt; decode block+offset                 |&lt;br /&gt;
|              PUSH decoded block, read payload    |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Read asset object fields                         |&lt;br /&gt;
| Nested pointers may push TEMP, LARGE, VIRTUAL,   |&lt;br /&gt;
| or another decoded/allocated block               |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| POP nested block(s)                              |&lt;br /&gt;
| POP asset payload block                          |&lt;br /&gt;
| Continue next asset                              |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| After all assets                                 |&lt;br /&gt;
| POP LARGE                                        |&lt;br /&gt;
| ActiveBlock returns to TEMP                      |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
  |&lt;br /&gt;
  v&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
| Resolve deferred CString pointers                |&lt;br /&gt;
| Validate source cursor                           |&lt;br /&gt;
| Seal/pad emitted blocks                          |&lt;br /&gt;
+--------------------------------------------------+&lt;br /&gt;
END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pop behavior:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
POP behavior:&lt;br /&gt;
&lt;br /&gt;
If popping from TEMP:&lt;br /&gt;
  restore TEMP cursor to the position saved when TEMP was pushed&lt;br /&gt;
&lt;br /&gt;
If popping from any other block:&lt;br /&gt;
  keep that block&#039;s advanced cursor&lt;br /&gt;
&lt;br /&gt;
Always:&lt;br /&gt;
  ActiveBlock = previous block from the stack frame&lt;br /&gt;
&lt;br /&gt;
Important:&lt;br /&gt;
  Source _position is not rewound by POP.&lt;br /&gt;
  The stack only controls emitted block cursors.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Pointers in Zone Files ==&lt;br /&gt;
Pointers can be classified as one of the following:&lt;br /&gt;
* &amp;lt;code&amp;gt; 0 &amp;lt;/code&amp;gt;: null, no data follows&lt;br /&gt;
* &amp;lt;code&amp;gt; -1 &amp;lt;/code&amp;gt;: inline, data follows after the struct, usually in order but &#039;&#039;&#039;NOT ALWAYS&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt; -2 &amp;lt;/code&amp;gt;: insert, space is allocated in the stream block and inserted into later&lt;br /&gt;
* &amp;lt;code&amp;gt; else &amp;lt;/code&amp;gt;: everything else is an encoded offset, it contains which block and offset it&#039;s pointing too.&lt;br /&gt;
&lt;br /&gt;
Pointers have different types as well, depending on the type the data is loaded differently.&lt;br /&gt;
* &amp;lt;code&amp;gt; Direct &amp;lt;/code&amp;gt;: It points directly to data, such as char*, int*, itemDef_t*&lt;br /&gt;
* &amp;lt;code&amp;gt; Alias &amp;lt;/code&amp;gt;: It pointers to shared assets, such as Material*&lt;br /&gt;
&lt;br /&gt;
For encoded offsets the first 4 bits (or 3 bits in BO2) are extracted and used as an index for the g_streamBlocks array. The other bits are the offset and is added to the data pointer in g_streamBlocks. &lt;br /&gt;
&lt;br /&gt;
=== Encoding ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int EncodeOffset(int blockIndex, int offset)&lt;br /&gt;
{&lt;br /&gt;
    return (blockIndex &amp;lt;&amp;lt; 28) | (offset + 1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Decoding ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XBlockAddress DecodeOffset(int value)&lt;br /&gt;
{&lt;br /&gt;
    int block = (XFILE_BLOCK)(value &amp;gt;&amp;gt; 28);&lt;br /&gt;
    int offset = (int)(value &amp;amp; 0x0FFFFFFF) - 1;&lt;br /&gt;
&lt;br /&gt;
    return new XBlockAddress(block, offset);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example a pointer with a value of &amp;lt;code&amp;gt; 0x40001689 &amp;lt;/code&amp;gt; means that the data belongs in block stream &amp;lt;code&amp;gt; 4 (large) &amp;lt;/code&amp;gt; at offset &amp;lt;code&amp;gt; 0x1688 &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The offset is only correct after the zone file has been loaded into the respective g_streamBlocks/memory. This is because data gets loaded into different blocks depending on how each executable loader works. In addition, data is aligned based on data type.&lt;br /&gt;
&lt;br /&gt;
=== Padding Rules ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|  ||&#039;&#039;&#039;XStruct&#039;&#039;&#039;||&#039;&#039;&#039;Pointers&#039;&#039;&#039;||&#039;&#039;&#039;Byte&#039;&#039;&#039;||&#039;&#039;&#039;Bool&#039;&#039;&#039;||&#039;&#039;&#039;int16/uint16&#039;&#039;&#039;||&#039;&#039;&#039;Default&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Byte Alignment||4||4||1||1||2||4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Insert Pointers ==&lt;br /&gt;
For -2 pointers, the flow goes as follows:&lt;br /&gt;
1. ReadPointer reads raw -2, writes that 4-byte value into the active emitted block, and remembers that cell as PatchAddress.&lt;br /&gt;
&lt;br /&gt;
2. Later, when the pointer is materialized it recognizes -2 (insert)&lt;br /&gt;
&lt;br /&gt;
3. For insert, it allocates one extra 4-byte pointer cell in the LARGE block, aligned to 4, initialized to 0&lt;br /&gt;
&lt;br /&gt;
4. It resolves the actual payload address according to the plan: current block position, allocated block position, or current stream position.&lt;br /&gt;
&lt;br /&gt;
5. It patches two cells to the encoded payload address:&lt;br /&gt;
the original pointer field that contained -2&lt;br /&gt;
the new inserted pointer cell in LARGE&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:FastFiles&amp;diff=1051</id>
		<title>Category:FastFiles</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:FastFiles&amp;diff=1051"/>
		<updated>2026-06-12T03:39:32Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;FastFiles are the CoD engine&#039;s way of storing Zone files. FastFiles (FFs) almost always have some sort of RSA2048 signature, a zlib compression along the way, and then on later CoDs some encryption. The Zones are a library of [[:Category:Assets|assets]]. Every FF in every CoD game starts the same way...&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Magic || 0x0 || char[8] || &amp;quot;IWffu100&amp;quot; for unsigned fastfiles, &amp;quot;IWff0100&amp;quot; for signed fastfiles, &amp;quot;TAff0100&amp;quot; for treyarch&#039;s Black Ops 2 fastfile, and &amp;quot;S1ff0100&amp;quot; for Sledgehammer Advanced Warfare fastfiles.&lt;br /&gt;
|-&lt;br /&gt;
| Version || 0x8 || int || See below.&lt;br /&gt;
|}&lt;br /&gt;
So by reading the version of the input FF, you can tell what system and game the FF is from. Note that pre-alpha versions of Call of Duty 4 are missing the version integer, and must be handled specially. Also keep in mind that the Quantum of Solace FFs are missing the magic in the struct above. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| XFILE_VERSION || &#039;&#039;&#039;007:QoS&#039;&#039;&#039; ||&#039;&#039;&#039;CoD4&#039;&#039;&#039;||&#039;&#039;&#039;WaW&#039;&#039;&#039;||&#039;&#039;&#039;MW2&#039;&#039;&#039;||&#039;&#039;&#039;BO1&#039;&#039;&#039;||&#039;&#039;&#039;MW3&#039;&#039;&#039;||&#039;&#039;&#039;BO2&#039;&#039;&#039;||&#039;&#039;&#039;Ghosts&#039;&#039;&#039;||&#039;&#039;&#039;CoD: Online&#039;&#039;&#039;||&#039;&#039;&#039;Advanced Warfare&#039;&#039;&#039;||&#039;&#039;&#039;BO3 Beta&#039;&#039;&#039;||&#039;&#039;&#039;BO3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Xbox 360||0x1D6||0x1||0x183||0x10D||0x1D9||0x70||0x92||0x22E||n/a||0x72E||n/a||0x253&lt;br /&gt;
|-&lt;br /&gt;
|Playstation 3||0x1D6||0x1||0x183||0x10D||0x1D9||0x70||0x92||0x22E||n/a||0x72E||n/a||0x25E&lt;br /&gt;
|-&lt;br /&gt;
|Wii/Wii-U||0x1D2||0x1A2||0x19B||n/a||0x1DD||0x6B||0x94||0x22E||n/a||n/a||n/a||n/a&lt;br /&gt;
|-&lt;br /&gt;
|PC||0x1D6||0x5||0x183||0x114||0x1D9||0x1||0x93||0x135||0x13C||0x72E||0x1FB||n/a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Stream Blocks ==&lt;br /&gt;
After the Zone (XFile) is extracted from the fastfile, you read the block sizes of each g_streamBlock allocation. This determines how much memory to allocate to each stream to read data into. Each block stream has a specific role in the data that is read and it goes as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|  ||&#039;&#039;&#039;Temp&#039;&#039;&#039;||&#039;&#039;&#039;Physical&#039;&#039;&#039;||&#039;&#039;&#039;Runtime&#039;&#039;&#039;||&#039;&#039;&#039;Virtual&#039;&#039;&#039;||&#039;&#039;&#039;Large&#039;&#039;&#039;||&#039;&#039;&#039;Callback&#039;&#039;&#039;||&#039;&#039;&#039;Vertex&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Purpose||Asset Pool Headers, Counts, Root Pointers||Sound Data||??||PC uses this for loading assets||Strings and Data Chunks (rawfiles)||Used in some loader methods||Material and Image data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
One distinction is that PC uses virtual for a load of loading where PS3 mainly uses large.&lt;br /&gt;
&lt;br /&gt;
Stream blocks exist within a stack, when a loader is using a block, it pops the requested block onto the stack, reads data into it, then when complete, pops that block off the stack, and returns to the previous block at the block stream cursor position.&lt;br /&gt;
&lt;br /&gt;
== Pointers in Zone Files ==&lt;br /&gt;
Pointers can be classified as one of the following:&lt;br /&gt;
* &amp;lt;code&amp;gt; 0 &amp;lt;/code&amp;gt;: null, no data follows&lt;br /&gt;
* &amp;lt;code&amp;gt; -1 &amp;lt;/code&amp;gt;: inline, data follows after the struct, usually in order but &#039;&#039;&#039;NOT ALWAYS&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt; -2 &amp;lt;/code&amp;gt;: insert, space is allocated in the stream block and inserted into later&lt;br /&gt;
* &amp;lt;code&amp;gt; else &amp;lt;/code&amp;gt;: everything else is an encoded offset, it contains which block and offset it&#039;s pointing too.&lt;br /&gt;
&lt;br /&gt;
Pointers have different types as well, depending on the type the data is loaded differently.&lt;br /&gt;
* &amp;lt;code&amp;gt; Direct &amp;lt;/code&amp;gt;: It points directly to data, such as char*, int*, itemDef_t*&lt;br /&gt;
* &amp;lt;code&amp;gt; Alias &amp;lt;/code&amp;gt;: It pointers to shared assets, such as Material*&lt;br /&gt;
&lt;br /&gt;
For encoded offsets the first 4 bits (or 3 bits in BO2) are extracted and used as an index for the g_streamBlocks array. The other bits are the offset and is added to the data pointer in g_streamBlocks. &lt;br /&gt;
&lt;br /&gt;
=== Encoding ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int EncodeOffset(int blockIndex, int offset)&lt;br /&gt;
{&lt;br /&gt;
    return (blockIndex &amp;lt;&amp;lt; 28) | (offset + 1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Decoding ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XBlockAddress DecodeOffset(int value)&lt;br /&gt;
{&lt;br /&gt;
    int block = (XFILE_BLOCK)(value &amp;gt;&amp;gt; 28);&lt;br /&gt;
    int offset = (int)(value &amp;amp; 0x0FFFFFFF) - 1;&lt;br /&gt;
&lt;br /&gt;
    return new XBlockAddress(block, offset);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example a pointer with a value of &amp;lt;code&amp;gt; 0x40001689 &amp;lt;/code&amp;gt; means that the data belongs in block stream &amp;lt;code&amp;gt; 4 (large) &amp;lt;/code&amp;gt; at offset &amp;lt;code&amp;gt; 0x1688 &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The offset is only correct after the zone file has been loaded into the respective g_streamBlocks/memory. This is because data gets loaded into different blocks depending on how each executable loader works. In addition, data is aligned based on data type.&lt;br /&gt;
&lt;br /&gt;
=== Padding Rules ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|  ||&#039;&#039;&#039;XStruct&#039;&#039;&#039;||&#039;&#039;&#039;Pointers&#039;&#039;&#039;||&#039;&#039;&#039;Byte&#039;&#039;&#039;||&#039;&#039;&#039;Bool&#039;&#039;&#039;||&#039;&#039;&#039;int16/uint16&#039;&#039;&#039;||&#039;&#039;&#039;Default&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Byte Alignment||4||4||1||1||2||4&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Insert Pointers ==&lt;br /&gt;
For -2 pointers, the flow goes as follows:&lt;br /&gt;
1. ReadPointer reads raw -2, writes that 4-byte value into the active emitted block, and remembers that cell as PatchAddress.&lt;br /&gt;
&lt;br /&gt;
2. Later, when the pointer is materialized it recognizes -2 (insert)&lt;br /&gt;
&lt;br /&gt;
3. For insert, it allocates one extra 4-byte pointer cell in the LARGE block, aligned to 4, initialized to 0&lt;br /&gt;
&lt;br /&gt;
4. It resolves the actual payload address according to the plan: current block position, allocated block position, or current stream position.&lt;br /&gt;
&lt;br /&gt;
5. It patches two cells to the encoded payload address:&lt;br /&gt;
the original pointer field that contained -2&lt;br /&gt;
the new inserted pointer cell in LARGE&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(MW2)&amp;diff=1050</id>
		<title>FastFiles and Zone files (MW2)</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=FastFiles_and_Zone_files_(MW2)&amp;diff=1050"/>
		<updated>2026-06-12T03:26:40Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Zone File */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:FastFiles]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
&lt;br /&gt;
== Main FastFile Structure ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 //Note, on PS3 all values are &amp;lt;&amp;lt; 1&lt;br /&gt;
 enum language_t&lt;br /&gt;
 {&lt;br /&gt;
   LANGUAGE_ENGLISH = 0x1,&lt;br /&gt;
   LANGUAGE_FRENCH = 0x2,&lt;br /&gt;
   LANGUAGE_GERMAN = 0x3,&lt;br /&gt;
   LANGUAGE_ITALIAN = 0x4,&lt;br /&gt;
   LANGUAGE_SPANISH = 0x5,&lt;br /&gt;
   LANGUAGE_BRITISH = 0x6,&lt;br /&gt;
   LANGUAGE_RUSSIAN = 0x7,&lt;br /&gt;
   LANGUAGE_POLISH = 0x8,&lt;br /&gt;
   LANGUAGE_KOREAN = 0x9,&lt;br /&gt;
   LANGUAGE_TAIWANESE = 0xA,&lt;br /&gt;
   LANGUAGE_JAPANESE = 0xB,&lt;br /&gt;
   LANGUAGE_CHINESE = 0xC,&lt;br /&gt;
   LANGUAGE_THAI = 0xD,&lt;br /&gt;
   LANGUAGE_LEET = 0xE,&lt;br /&gt;
   LANGUAGE_CZECH = 0xF,&lt;br /&gt;
   MAX_LANGUAGES&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 //Entry point for the FF.&lt;br /&gt;
 struct DB_Header&lt;br /&gt;
 {&lt;br /&gt;
   char magic[8];&lt;br /&gt;
   int version;&lt;br /&gt;
   bool allowOnlineUpdate;&lt;br /&gt;
   unsigned __int64 fileCreationTime;&lt;br /&gt;
   language_t region;&lt;br /&gt;
   int entryCount;&lt;br /&gt;
   Entry entries[];&lt;br /&gt;
   int fileSize;&lt;br /&gt;
   int maxFileSize;&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
=== Magic ===&lt;br /&gt;
The magic is a string that is 8 characters long. It is either &amp;quot;IWff0100&amp;quot; or &amp;quot;IWffu100&amp;quot;. It indicates what is read after maxFileSize. If it is &amp;quot;IWff0100&amp;quot; then this FF is signed. If it is &amp;quot;IWffu100&amp;quot;, then this FF is unsigned.&lt;br /&gt;
=== Version ===&lt;br /&gt;
Helps to dictate the version of the FF, so Modern Warfare 3 FastFiles cannot be loaded on Modern Warfare 2. The Modern Warfare 2 version is 0x10D for console systems and 0x114 for PC.&lt;br /&gt;
 if (version &amp;gt; 0x10D)&lt;br /&gt;
  Com_Error(&amp;quot;Fastfile for zone &#039;%s&#039; is newer than client executable (version %d, expecting %d)&amp;quot;, version, 0x10D);&lt;br /&gt;
 else if (version &amp;lt; 0x10D)&lt;br /&gt;
  Com_Error(&amp;quot;Fastfile for zone &#039;%s&#039; is out of date (version %d, expecting %d)&amp;quot;, version, 0x10D);&lt;br /&gt;
=== AllowOnlineUpdate ===&lt;br /&gt;
Whether or not assets in this FF may be replaced by an FF loaded at a later time.&lt;br /&gt;
=== Entries ===&lt;br /&gt;
These are still not entirely understood. Most FF systems simply parse past them.&lt;br /&gt;
==== Xbox 360 ====&lt;br /&gt;
 for (int32 i = 0; i &amp;lt; 0x0f; i++)&lt;br /&gt;
 {&lt;br /&gt;
   if (((1 &amp;lt;&amp;lt; i) &amp;amp; language) == 0)&lt;br /&gt;
     continue;&lt;br /&gt;
   else&lt;br /&gt;
     ReadBytes(((entryCount &amp;lt;&amp;lt; 1) + entryCount) &amp;lt;&amp;lt; 2);&lt;br /&gt;
 }&lt;br /&gt;
==== PS3 ====&lt;br /&gt;
 readBytes(entryCount * 0x14);&lt;br /&gt;
=== File Sizes ===&lt;br /&gt;
The fileSize is the size of the FF, everything included. The maxFileSize is the highest number that fileSize can be, and in most FFs they are equal.&lt;br /&gt;
&lt;br /&gt;
== Subheader ==&lt;br /&gt;
The rest of the FF is read depending on what the main FF magic was. If the magic was &amp;quot;IWff0100&amp;quot; then the FF is signed. If it was &amp;quot;IWffu100&amp;quot;, the FF is unsigned.&lt;br /&gt;
=== Unsigned Files ===&lt;br /&gt;
PS3 only supports unsigned fastfiles. For Xbox 360, only single player FastFiles are unsigned. Unsigned FastFiles are very simple. The only data remaining is compressed zlib data. Decompressing the data yields the [[#Zone File|zone file]].&lt;br /&gt;
=== Signed Files ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
 struct DB_AuthHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[32];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthSignatureHash&lt;br /&gt;
 {&lt;br /&gt;
   char bytes[256];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthSubheader&lt;br /&gt;
 {&lt;br /&gt;
   char fastfileName[32];&lt;br /&gt;
   int reserved;&lt;br /&gt;
   DB_AuthHash masterBlockHashes[244];&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 struct DB_AuthXBlock&lt;br /&gt;
 {&lt;br /&gt;
 #ifdef XBOX&lt;br /&gt;
   DB_AuthHash blockSignature[0x100];&lt;br /&gt;
   char blockData[0x200000];&lt;br /&gt;
 #elif defined PS3&lt;br /&gt;
   char blockData[0x10000];&lt;br /&gt;
 #endif&lt;br /&gt;
 };&lt;br /&gt;
 &lt;br /&gt;
 //Sub DB_AuthHeader, continuation on the earlier.&lt;br /&gt;
 struct DB_AuthHeader&lt;br /&gt;
 {&lt;br /&gt;
   char magic[8];&lt;br /&gt;
   int reserved;&lt;br /&gt;
   DB_AuthHash subheaderHash;&lt;br /&gt;
   DB_AuthSignatureHash signedSubheaderHash;&lt;br /&gt;
   DB_AuthSubHeader subheader;&lt;br /&gt;
   DB_AuthXBlock xBlocks[];&lt;br /&gt;
 };&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The signatures on the XBlocks are checked as the FastFile loads. Then the sub-header master block hashes are checked, followed by the signedSubheaderHash, and lastly the subheaderHash. If any fail, then the loading of the FF is aborted. Only Activision and the game developers can generate the RSA signatures. &lt;br /&gt;
==== Magic ====&lt;br /&gt;
The subheader magic is always &amp;quot;IWffs100&amp;quot;.&lt;br /&gt;
==== XBlocks ====&lt;br /&gt;
XBlocks are used until they are no longer needed. If the compressed data can fit into 1, then only 1 will exist.&lt;br /&gt;
&lt;br /&gt;
== Compression ==&lt;br /&gt;
=== PS3 ===&lt;br /&gt;
After the zone file is created, it is split into blocks each 0x10000 bytes, the last block being padded with zeroes if not 0x10000 bytes long. Each block is compressed using default zlib compression. The size of the compressed block is stored as an unsigned 16 bit integer over the zlib header (0x78DA). Compressed blocks are concatenated and appended to the fastfile.&lt;br /&gt;
&lt;br /&gt;
=== Xbox 360 ===&lt;br /&gt;
Once the zone file is created, the entire zone is compressed using default zlib compression. If the FastFile is unsigned (single player) then the data is simply concatenated to the header. Signed files split the data up into 0x200000 byte XBlocks, each with a 0x2000 byte hash block.&lt;br /&gt;
== Zone File ==&lt;br /&gt;
The zone file is the decompressed data from an FF. &lt;br /&gt;
&lt;br /&gt;
=== Header ===&lt;br /&gt;
The XFile header is loaded first. It contains XBlock sizes to be allocated for g_streamBlocks.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum&lt;br /&gt;
{&lt;br /&gt;
 XFILE_BLOCK_TEMP	= 0,&lt;br /&gt;
 XFILE_BLOCK_PHYSICAL	= 1,&lt;br /&gt;
 XFILE_BLOCK_RUNTIME	= 2,&lt;br /&gt;
 XFILE_BLOCK_VIRTUAL	= 3,&lt;br /&gt;
 XFILE_BLOCK_LARGE	= 4,&lt;br /&gt;
 XFILE_BLOCK_CALLBACK	= 5,&lt;br /&gt;
#if defined(PC) || defined(PS3)&lt;br /&gt;
 XFILE_BLOCK_VERTEX	= 6,&lt;br /&gt;
 #ifdef PC&lt;br /&gt;
 XFILE_BLOCK_INDEX	= 7,&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
 MAX_XFILE_COUNT&lt;br /&gt;
};&lt;br /&gt;
 &lt;br /&gt;
struct XFile&lt;br /&gt;
{&lt;br /&gt;
  int size;&lt;br /&gt;
  int externalSize;&lt;br /&gt;
  int blockSize[MAX_XFILE_COUNT];&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== g_streamBlocks ===&lt;br /&gt;
Remember that g_streamBlocks are loaded as the zone is read. Here are some examples. The raw dumps are collapsed by default to keep the page readable:&lt;br /&gt;
&lt;br /&gt;
==== Temp ====&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #a2a9b1; padding:0.5em; margin:0.5em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Temp block dump&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
0000000B 40000001 000001AF 400000F5 40153A79 00000000 00000000 40153A82 401537C1 42820000 00000000 00000000 00000001 00000000 00000168 00000000 00000000 00000000 00000000 4000844B 00000000 00000000 00000085 00000085 0000016E 000001F4 00000001 00000000 00000000 00000000 00000000 00000000 00000000 40153A59 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 40000E89 4012CA4D 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Large ====&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;border:1px solid #a2a9b1; padding:0.5em; margin:0.5em 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Large block dump&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
00000000 4000002D 4000003E 40000052 40000066 4000007A 4000008F 4000009F 400000B0 400000C0 400000DA 6D656C65 655F6B6E 6966655F 73746162 00776561 705F6D31 3838375F 6C696674 5F706C72 00776561 705F6D31 3838375F 6F70656E 5F706C72 00776561 705F6D31 3838375F 6C6F6F70 5F706C72 00776561 705F6D31 3838375F 636C6F73 655F706C 72007669 65776D6F 64656C5F 736D616C 6C007669 65776D6F 64656C5F 6D656469 756D0076 6965776D 6F64656C 5F6C6172 67650077 6561705F 736D6F6B 65677265 6E616465 5F70696E 5F706C72 00776561 705F736D 6F6B6567 72656E61 64655F66 6972655F 706C7200 00000008 00000011 00000018 00000011 00000024 00000011 00000024 00000011 00000024 00000011 00000026 00000011 00000026 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000023 00000011 00000008 00000011 00000008 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 00000018 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 0000001A 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 0000001B 00000011 0000001B 00000011 0000001B 00000011 0000001B 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 00000008 00000011 0000001B 00000011 0000001B 00000011 0000001B 00000011 00000023 00000011 2C326400 75695F6D 702F6D61 696E2E6D 656E7500 0000001D 0000001D ........&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Asset List ===&lt;br /&gt;
After the XFile header is the asset list. The asset list contains a list of script strings and a list of assets. The fastfile compiler creates a rawfile as the last asset which contains any compiler errors (as seen in french code_post_gfx_mp.ff).&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct XAsset&lt;br /&gt;
{&lt;br /&gt;
  XAssetType type; //See enum below&lt;br /&gt;
  XAssetHeader * header;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct XAssetList&lt;br /&gt;
{&lt;br /&gt;
  int scriptStringCount;&lt;br /&gt;
  const char * * scriptStrings;&lt;br /&gt;
  int assetCount;&lt;br /&gt;
  XAsset *assets;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== General [[:Category:Assets|Asset]] Information ==&lt;br /&gt;
=== Asset Types ===&lt;br /&gt;
The types of assets loaded are determined by this enum.&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;1&amp;quot; cellspacing=&amp;quot;1&amp;quot; class=&amp;quot;article-table&amp;quot; style=&amp;quot;font-size:13px;line-height:21px;width:500px;height:500px;&amp;quot;&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Asset Type&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Xbox ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|PS3 ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|PC ID&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Is Used&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Max Count&lt;br /&gt;
! scope=&amp;quot;col&amp;quot;|Asset Size (PC)&lt;br /&gt;
|-&lt;br /&gt;
|physpreset&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|0x00&lt;br /&gt;
|True&lt;br /&gt;
|0x40&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|phys_collmap&lt;br /&gt;
|0x01&lt;br /&gt;
|0x01&lt;br /&gt;
|0x01&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x48&lt;br /&gt;
|-&lt;br /&gt;
|xanim&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|0x02&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x58&lt;br /&gt;
|-&lt;br /&gt;
|xmodelsurfs&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|0x03&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x24&lt;br /&gt;
|-&lt;br /&gt;
|xmodel&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|0x04&lt;br /&gt;
|True&lt;br /&gt;
|0x600&lt;br /&gt;
|0x130&lt;br /&gt;
|-&lt;br /&gt;
|material&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|0x05&lt;br /&gt;
|True&lt;br /&gt;
|0x1000&lt;br /&gt;
|0x60&lt;br /&gt;
|-&lt;br /&gt;
|pixelshader&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|0x06&lt;br /&gt;
|True&lt;br /&gt;
|0x1FA0&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|vertexshader&lt;br /&gt;
|N/A&lt;br /&gt;
|0x07&lt;br /&gt;
|0x07&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|vertexdecl&lt;br /&gt;
|N/A&lt;br /&gt;
|N/A&lt;br /&gt;
|0x08&lt;br /&gt;
|True&lt;br /&gt;
|0x30&lt;br /&gt;
|0x64&lt;br /&gt;
|-&lt;br /&gt;
|techset&lt;br /&gt;
|0x07&lt;br /&gt;
|0x08&lt;br /&gt;
|0x09&lt;br /&gt;
|True&lt;br /&gt;
|0x300&lt;br /&gt;
|0xCC&lt;br /&gt;
|-&lt;br /&gt;
|image&lt;br /&gt;
|0x08&lt;br /&gt;
|0x09&lt;br /&gt;
|0x0A&lt;br /&gt;
|True&lt;br /&gt;
|0xE00&lt;br /&gt;
|0x20&lt;br /&gt;
|-&lt;br /&gt;
|sound&lt;br /&gt;
|0x09&lt;br /&gt;
|0x0A&lt;br /&gt;
|0x0B&lt;br /&gt;
|True&lt;br /&gt;
|0x3E80&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|sndcurve&lt;br /&gt;
|0x0A&lt;br /&gt;
|0x0B&lt;br /&gt;
|0x0C&lt;br /&gt;
|True&lt;br /&gt;
|0x40&lt;br /&gt;
|0x88&lt;br /&gt;
|-&lt;br /&gt;
|loaded_sound&lt;br /&gt;
|0x0B&lt;br /&gt;
|0x0C&lt;br /&gt;
|0x0D&lt;br /&gt;
|True&lt;br /&gt;
|0x546&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|col_map_sp&lt;br /&gt;
|0x0C&lt;br /&gt;
|0x0D&lt;br /&gt;
|0x0E&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x100&lt;br /&gt;
|-&lt;br /&gt;
|col_map_mp&lt;br /&gt;
|0x0D&lt;br /&gt;
|0x0E&lt;br /&gt;
|0x0F&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x100&lt;br /&gt;
|-&lt;br /&gt;
|com_map&lt;br /&gt;
|0x0E&lt;br /&gt;
|0x0F&lt;br /&gt;
|0x10&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|game_map_sp&lt;br /&gt;
|0x0F&lt;br /&gt;
|0x10&lt;br /&gt;
|0x11&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x38&lt;br /&gt;
|-&lt;br /&gt;
|game_map_mp&lt;br /&gt;
|0x10&lt;br /&gt;
|0x11&lt;br /&gt;
|0x12&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|map_ents&lt;br /&gt;
|0x11&lt;br /&gt;
|0x12&lt;br /&gt;
|0x13&lt;br /&gt;
|True&lt;br /&gt;
|2&lt;br /&gt;
|0x2C&lt;br /&gt;
|-&lt;br /&gt;
|fx_map&lt;br /&gt;
|0x12&lt;br /&gt;
|0x13&lt;br /&gt;
|0x14&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x74&lt;br /&gt;
|-&lt;br /&gt;
|gfx_map&lt;br /&gt;
|0x13&lt;br /&gt;
|0x14&lt;br /&gt;
|0x15&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x274&lt;br /&gt;
|-&lt;br /&gt;
|lightdef&lt;br /&gt;
|0x14&lt;br /&gt;
|0x15&lt;br /&gt;
|0x16&lt;br /&gt;
|True&lt;br /&gt;
|0x20&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|ui_map&lt;br /&gt;
|0x15&lt;br /&gt;
|0x16&lt;br /&gt;
|0x17&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|font&lt;br /&gt;
|0x16&lt;br /&gt;
|0x17&lt;br /&gt;
|0x18&lt;br /&gt;
|True&lt;br /&gt;
|0x10&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|menufile&lt;br /&gt;
|0x17&lt;br /&gt;
|0x18&lt;br /&gt;
|0x19&lt;br /&gt;
|True&lt;br /&gt;
|0x80&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|menu&lt;br /&gt;
|0x18&lt;br /&gt;
|0x19&lt;br /&gt;
|0x1A&lt;br /&gt;
|True&lt;br /&gt;
|0x264&lt;br /&gt;
|0x190&lt;br /&gt;
|-&lt;br /&gt;
|localize&lt;br /&gt;
|0x19&lt;br /&gt;
|0x1A&lt;br /&gt;
|0x1B&lt;br /&gt;
|True&lt;br /&gt;
|0x1B58&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|weapon&lt;br /&gt;
|0x1A&lt;br /&gt;
|0x1B&lt;br /&gt;
|0x1C&lt;br /&gt;
|True&lt;br /&gt;
|0x578&lt;br /&gt;
|0x684&lt;br /&gt;
|-&lt;br /&gt;
|snddriverglobals&lt;br /&gt;
|0x1B&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x1D&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|fx&lt;br /&gt;
|0x1C&lt;br /&gt;
|0x1D&lt;br /&gt;
|0x1E&lt;br /&gt;
|True&lt;br /&gt;
|0x258&lt;br /&gt;
|0x20&lt;br /&gt;
|-&lt;br /&gt;
|impactfx&lt;br /&gt;
|0x1D&lt;br /&gt;
|0x1E&lt;br /&gt;
|0x1F&lt;br /&gt;
|True&lt;br /&gt;
|4&lt;br /&gt;
|0x08&lt;br /&gt;
|-&lt;br /&gt;
|aitype&lt;br /&gt;
|0x1E&lt;br /&gt;
|0x1F&lt;br /&gt;
|0x20&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|mptype&lt;br /&gt;
|0x1F&lt;br /&gt;
|0x20&lt;br /&gt;
|0x21&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|character&lt;br /&gt;
|0x20&lt;br /&gt;
|0x21&lt;br /&gt;
|0x22&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|xmodelalias&lt;br /&gt;
|0x21&lt;br /&gt;
|0x22&lt;br /&gt;
|0x23&lt;br /&gt;
|False&lt;br /&gt;
|0&lt;br /&gt;
|N/A&lt;br /&gt;
|-&lt;br /&gt;
|rawfile&lt;br /&gt;
|0x22&lt;br /&gt;
|0x23&lt;br /&gt;
|0x24&lt;br /&gt;
|True&lt;br /&gt;
|0x400&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|stringtable&lt;br /&gt;
|0x23&lt;br /&gt;
|0x24&lt;br /&gt;
|0x25&lt;br /&gt;
|True&lt;br /&gt;
|0x190&lt;br /&gt;
|0x10&lt;br /&gt;
|-&lt;br /&gt;
|leaderboarddef&lt;br /&gt;
|0x24&lt;br /&gt;
|0x25&lt;br /&gt;
|0x26&lt;br /&gt;
|True&lt;br /&gt;
|0x64&lt;br /&gt;
|0x18&lt;br /&gt;
|-&lt;br /&gt;
|structureddatadef&lt;br /&gt;
|0x25&lt;br /&gt;
|0x26&lt;br /&gt;
|0x27&lt;br /&gt;
|True&lt;br /&gt;
|0x18&lt;br /&gt;
|0x0C&lt;br /&gt;
|-&lt;br /&gt;
|tracer&lt;br /&gt;
|0x26&lt;br /&gt;
|0x27&lt;br /&gt;
|0x28&lt;br /&gt;
|True&lt;br /&gt;
|0x20&lt;br /&gt;
|0x70&lt;br /&gt;
|-&lt;br /&gt;
|vehicle&lt;br /&gt;
|0x27&lt;br /&gt;
|0x28&lt;br /&gt;
|0x29&lt;br /&gt;
|True&lt;br /&gt;
|0x80&lt;br /&gt;
|0x2D0&lt;br /&gt;
|-&lt;br /&gt;
|addon_map_ents&lt;br /&gt;
|0x28&lt;br /&gt;
|0x29&lt;br /&gt;
|0x2A&lt;br /&gt;
|True&lt;br /&gt;
|1&lt;br /&gt;
|0x24&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Material_Asset&amp;diff=1049</id>
		<title>Material Asset</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Material_Asset&amp;diff=1049"/>
		<updated>2026-06-12T03:12:40Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Call of Duty 4 &amp;amp; World at War &amp;amp; Modern Warfare 2 &amp;amp; Modern Warfare 3 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Category:Assets]]&lt;br /&gt;
[[Category:CoD4]]&lt;br /&gt;
[[Category:WaW]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
[[Category:BO1]]&lt;br /&gt;
[[Category:MW3]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
[[Category:Ghosts]]&lt;br /&gt;
== Call of Duty 4 &amp;amp; World at War &amp;amp; Modern Warfare 2 &amp;amp; Modern Warfare 3 ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialConstantDef &lt;br /&gt;
{&lt;br /&gt;
	int nameHash;&lt;br /&gt;
	char name[12];&lt;br /&gt;
	vec4_t literal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxStateBitsStructured&lt;br /&gt;
{&lt;br /&gt;
    //This word stores blend, alpha, culling, color write, gamma, and polygon mode state.&lt;br /&gt;
    unsigned int srcBlendRgb : 4;       // bits 0-3 &lt;br /&gt;
    unsigned int dstBlendRgb : 4;       // bits 4-7 &lt;br /&gt;
    unsigned int blendOpRgb : 3;        // bits 8-10&lt;br /&gt;
    unsigned int alphaTestDisabled : 1; // bit 11&lt;br /&gt;
    unsigned int alphaTest : 2;         // bits 12-13 &lt;br /&gt;
    unsigned int cullFace : 2;          // bits 14-15&lt;br /&gt;
    unsigned int srcBlendAlpha : 4;     // bits 16-19&lt;br /&gt;
    unsigned int dstBlendAlpha : 4;     // bits 20-23&lt;br /&gt;
    unsigned int blendOpAlpha : 3;      // bits 24-26&lt;br /&gt;
    unsigned int colorWriteRgb : 1;     // bit 27&lt;br /&gt;
    unsigned int colorWriteAlpha : 1;   // bit 28&lt;br /&gt;
    unsigned int unused0 : 1;           // bit 29&lt;br /&gt;
    unsigned int gammaWrite : 1;        // bit 30&lt;br /&gt;
    unsigned int polymodeLine : 1;      // bit 31&lt;br /&gt;
&lt;br /&gt;
    // This word stores depth and stencil state.&lt;br /&gt;
    unsigned int depthWrite : 1;          // bit 0&lt;br /&gt;
    unsigned int depthTestDisabled : 1;   // bit 1&lt;br /&gt;
    unsigned int depthTest : 2;           // bits 2-3&lt;br /&gt;
    unsigned int polygonOffset : 2;       // bits 4-5&lt;br /&gt;
    unsigned int stencilFrontEnabled : 1; // bit 6&lt;br /&gt;
    unsigned int stencilBackEnabled : 1;  // bit 7&lt;br /&gt;
    unsigned int stencilFrontPass : 3;    // bits 8-10&lt;br /&gt;
    unsigned int stencilFrontFail : 3;    // bits 11-13&lt;br /&gt;
    unsigned int stencilFrontZFail : 3;   // bits 14-16&lt;br /&gt;
    unsigned int stencilFrontFunc : 3;    // bits 17-19&lt;br /&gt;
    unsigned int stencilBackPass : 3;     // bits 20-22&lt;br /&gt;
    unsigned int stencilBackFail : 3;     // bits 23-25&lt;br /&gt;
    unsigned int stencilBackZFail : 3;    // bits 26-28&lt;br /&gt;
    unsigned int stencilBackFunc : 3;     // bits 29-31&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GfxStateBits &lt;br /&gt;
{&lt;br /&gt;
#ifdef XBOX&lt;br /&gt;
	int loadBits[2];&lt;br /&gt;
#elif defined(PS3)&lt;br /&gt;
	int (*loadBits)[2];&lt;br /&gt;
 #if defined(MW2) || defined(MW3)&lt;br /&gt;
	 GfxStateBitsStructured structured;&lt;br /&gt;
 #endif&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct WaterWritable&lt;br /&gt;
{&lt;br /&gt;
	float floatTime;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct water_t &lt;br /&gt;
{&lt;br /&gt;
	WaterWritable writable;&lt;br /&gt;
	float *H0X;		// Count = M * N&lt;br /&gt;
	float *H0Y;		// Count = M * N&lt;br /&gt;
	float *wTerm;		// Count = M * N&lt;br /&gt;
	int M;&lt;br /&gt;
	int N;&lt;br /&gt;
	float Lx;&lt;br /&gt;
	float Lz;&lt;br /&gt;
	float gravity;&lt;br /&gt;
	float windvel;&lt;br /&gt;
	float winddir[2];&lt;br /&gt;
	float amplitude;&lt;br /&gt;
	float codeConstant[4];&lt;br /&gt;
	GfxImage *image;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialTextureDef-&amp;gt;semantic */&lt;br /&gt;
#define TS_2D		0x0&lt;br /&gt;
#define TS_FUNCTION	0x1&lt;br /&gt;
#define TS_COLOR_MAP	0x2&lt;br /&gt;
#define TS_UNUSED_1	0x3&lt;br /&gt;
#define TS_UNUSED_2	0x4&lt;br /&gt;
#define TS_NORMAL_MAP	0x5&lt;br /&gt;
#define TS_UNUSED_3	0x6&lt;br /&gt;
#define TS_UNUSED_4	0x7&lt;br /&gt;
#define TS_SPECULAR_MAP	0x8&lt;br /&gt;
#define TS_UNUSED_5	0x9&lt;br /&gt;
#define TS_UNUSED_6	0xA&lt;br /&gt;
#define TS_WATER_MAP	0xB&lt;br /&gt;
&lt;br /&gt;
union MaterialTextureDefInfo &lt;br /&gt;
{&lt;br /&gt;
	GfxImage *image;	// MaterialTextureDef-&amp;gt;semantic != TS_WATER_MAP&lt;br /&gt;
	water_t *water;		// MaterialTextureDef-&amp;gt;semantic == TS_WATER_MAP&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialTextureDef&lt;br /&gt;
{&lt;br /&gt;
	unsigned int nameHash;&lt;br /&gt;
	char nameStart;&lt;br /&gt;
	char nameEnd;&lt;br /&gt;
	char sampleState;&lt;br /&gt;
	char semantic;&lt;br /&gt;
	unsigned char isMatureContent;&lt;br /&gt;
	unsigned char pad[3];&lt;br /&gt;
	MaterialTextureDefInfo u;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GFxDrawSurfFields&lt;br /&gt;
{&lt;br /&gt;
	unsigned long long unused,&lt;br /&gt;
			primarySortKey,&lt;br /&gt;
			surfType,&lt;br /&gt;
			primaryLightIndex,&lt;br /&gt;
			prepass,&lt;br /&gt;
			materialSortedIndex,&lt;br /&gt;
			customIndex,&lt;br /&gt;
			reflectionProbeIndex,&lt;br /&gt;
			objectId;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GfxDrawSurf &lt;br /&gt;
{&lt;br /&gt;
	GFxDrawSurfFields fields;&lt;br /&gt;
	unsigned long long packed;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct __declspec(align(8)) MaterialInfo&lt;br /&gt;
{&lt;br /&gt;
	const char *name;&lt;br /&gt;
	char gameFlags;&lt;br /&gt;
	char sortKey;&lt;br /&gt;
	char textureAtlasRowCount;&lt;br /&gt;
	char textureAtlasColumnCount;&lt;br /&gt;
	GfxDrawSurf drawSurf;&lt;br /&gt;
	int surfaceTypeBits;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Material&lt;br /&gt;
{&lt;br /&gt;
	MaterialInfo info;&lt;br /&gt;
	char stateBitsEntry[TECHNIQUE_COUNT];	// see MaterialTechniqueType&lt;br /&gt;
	char textureCount;&lt;br /&gt;
	char constantCount;&lt;br /&gt;
	char stateBitsCount;&lt;br /&gt;
	char stateFlags;&lt;br /&gt;
	char cameraRegion;&lt;br /&gt;
#ifdef PS3&lt;br /&gt;
	unsigned short ushorts[TECHNIQUE_COUNT];&lt;br /&gt;
	unsigned short *ushortArray;	// count = TECHNIQUE_COUNT, see MaterialTechniqueType&lt;br /&gt;
#endif&lt;br /&gt;
	MaterialTechniqueSet *techniqueSet;&lt;br /&gt;
	MaterialTextureDef *textureTable;&lt;br /&gt;
	MaterialConstantDef *constantTable;&lt;br /&gt;
	GfxStateBits *stateBitTable;&lt;br /&gt;
#if defined(MW2) || defined(MW3)&lt;br /&gt;
	const char **unknownXStringArray;&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Black Ops &amp;amp; Black Ops 2==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialConstantDef &lt;br /&gt;
{&lt;br /&gt;
  unsigned int nameHash;&lt;br /&gt;
  char name[12];&lt;br /&gt;
  vec4_t literal;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxStateBits &lt;br /&gt;
{&lt;br /&gt;
#if defined(XBOX) || defined(BO2)	// ps3 uses this for bo2..&lt;br /&gt;
  unsigned int loadBits[2];&lt;br /&gt;
#elif defined PS3&lt;br /&gt;
	int (*loadBits)[2];&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct WaterWritable&lt;br /&gt;
{&lt;br /&gt;
	float floatTime;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct water_t &lt;br /&gt;
{&lt;br /&gt;
	WaterWritable writable;&lt;br /&gt;
	float *H0X;		// Count = M * N&lt;br /&gt;
	float *H0Y;		// Count = M * N&lt;br /&gt;
	float *wTerm;		// Count = M * N&lt;br /&gt;
	int M;&lt;br /&gt;
	int N;&lt;br /&gt;
	float Lx;&lt;br /&gt;
	float Lz;&lt;br /&gt;
	float gravity;&lt;br /&gt;
	float windvel;&lt;br /&gt;
	float winddir[2];&lt;br /&gt;
	float amplitude;&lt;br /&gt;
	float codeConstant[4];&lt;br /&gt;
	GfxImage *image;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialTextureDef-&amp;gt;semantic */&lt;br /&gt;
#define TS_2D		0x0&lt;br /&gt;
#define TS_FUNCTION	0x1&lt;br /&gt;
#define TS_COLOR_MAP	0x2&lt;br /&gt;
#define TS_UNUSED_1	0x3&lt;br /&gt;
#define TS_UNUSED_2	0x4&lt;br /&gt;
#define TS_NORMAL_MAP	0x5&lt;br /&gt;
#define TS_UNUSED_3	0x6&lt;br /&gt;
#define TS_UNUSED_4	0x7&lt;br /&gt;
#define TS_SPECULAR_MAP	0x8&lt;br /&gt;
#define TS_UNUSED_5	0x9&lt;br /&gt;
#define TS_UNUSED_6	0xA&lt;br /&gt;
#define TS_WATER_MAP	0xB&lt;br /&gt;
&lt;br /&gt;
union MaterialTextureDefInfo &lt;br /&gt;
{&lt;br /&gt;
  GfxImage *image;	// MaterialTextureDef-&amp;gt;semantic != TS_WATER_MAP&lt;br /&gt;
  water_t *water;		// MaterialTextureDef-&amp;gt;semantic == TS_WATER_MAP&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialTextureDef&lt;br /&gt;
{&lt;br /&gt;
  unsigned int nameHash;&lt;br /&gt;
  char nameStart;&lt;br /&gt;
  char nameEnd;&lt;br /&gt;
  char samplerState;&lt;br /&gt;
  char semantic;&lt;br /&gt;
  char isMatureContent;&lt;br /&gt;
#ifdef BO1&lt;br /&gt;
  MaterialTextureDefInfo u;&lt;br /&gt;
#elif&lt;br /&gt;
  GfxImage *image;&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GFxDrawSurfFields&lt;br /&gt;
{&lt;br /&gt;
	unsigned long long unused,&lt;br /&gt;
			primarySortKey,&lt;br /&gt;
			surfType,&lt;br /&gt;
			primaryLightIndex,&lt;br /&gt;
			prepass,&lt;br /&gt;
			materialSortedIndex,&lt;br /&gt;
			customIndex,&lt;br /&gt;
			reflectionProbeIndex,&lt;br /&gt;
			objectId;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GfxDrawSurf &lt;br /&gt;
{&lt;br /&gt;
  GFxDrawSurfFields fields;&lt;br /&gt;
  unsigned long long packed;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialInfo&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  unsigned int gameFlags;&lt;br /&gt;
  char pad;&lt;br /&gt;
  char sortKey;&lt;br /&gt;
  char textureAtlasRowCount;&lt;br /&gt;
  char textureAtlasColumnCount;&lt;br /&gt;
  GfxDrawSurf drawSurf;&lt;br /&gt;
  unsigned int surfaceTypeBits;&lt;br /&gt;
  unsigned int layeredSurfaceTypes;&lt;br /&gt;
  unsigned __int16 hashIndex;&lt;br /&gt;
  int surfaceFlags;&lt;br /&gt;
#ifdef BO2&lt;br /&gt;
  int contents;&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Material&lt;br /&gt;
{&lt;br /&gt;
  MaterialInfo info;&lt;br /&gt;
  char stateBitsEntry[TECHNIQUE_COUNT];	// see MaterialTechniqueType&lt;br /&gt;
  char textureCount;&lt;br /&gt;
  char constantCount;&lt;br /&gt;
  char stateBitsCount;&lt;br /&gt;
  char stateFlags;&lt;br /&gt;
  char cameraRegion;&lt;br /&gt;
  char probeMipBits;&lt;br /&gt;
  MaterialTechniqueSet *techniqueSet;&lt;br /&gt;
  MaterialTextureDef *textureTable;&lt;br /&gt;
  MaterialConstantDef *constantTable;&lt;br /&gt;
  GfxStateBits *stateBitTable;&lt;br /&gt;
#ifdef BO2&lt;br /&gt;
  Material *thermalMaterial;&lt;br /&gt;
#endif&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ghosts ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MaterialConstantDef &lt;br /&gt;
{&lt;br /&gt;
	unsigned int nameHash;&lt;br /&gt;
	char name[12];&lt;br /&gt;
	float literal[4];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct GfxStateBits&lt;br /&gt;
{&lt;br /&gt;
	int (*loadBits)[3];&lt;br /&gt;
	char unknown1[0xE];&lt;br /&gt;
	char unknown2[0xE];&lt;br /&gt;
	char unknown3[2];&lt;br /&gt;
	char unknown4[2];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct WaterWritable&lt;br /&gt;
{&lt;br /&gt;
	float floatTime;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct water_t &lt;br /&gt;
{&lt;br /&gt;
	WaterWritable writable;&lt;br /&gt;
	float *H0X;	// Count = M * N&lt;br /&gt;
	float *H0Y;	// Count = M * N&lt;br /&gt;
	float *wTerm;	// Count = M * N&lt;br /&gt;
	int M;&lt;br /&gt;
	int N;&lt;br /&gt;
	float Lx;&lt;br /&gt;
	float Lz;&lt;br /&gt;
	float gravity;&lt;br /&gt;
	float windvel;&lt;br /&gt;
	float winddir[2];&lt;br /&gt;
	float amplitude;&lt;br /&gt;
	float codeConstant[4];&lt;br /&gt;
	GfxImage *image;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* MaterialTextureDef-&amp;gt;semantic */&lt;br /&gt;
#define TS_2D		0x0&lt;br /&gt;
#define TS_FUNCTION	0x1&lt;br /&gt;
#define TS_COLOR_MAP	0x2&lt;br /&gt;
#define TS_UNUSED_1	0x3&lt;br /&gt;
#define TS_UNUSED_2	0x4&lt;br /&gt;
#define TS_NORMAL_MAP	0x5&lt;br /&gt;
#define TS_UNUSED_3	0x6&lt;br /&gt;
#define TS_UNUSED_4	0x7&lt;br /&gt;
#define TS_SPECULAR_MAP	0x8&lt;br /&gt;
#define TS_UNUSED_5	0x9&lt;br /&gt;
#define TS_UNUSED_6	0xA&lt;br /&gt;
#define TS_WATER_MAP	0xB&lt;br /&gt;
&lt;br /&gt;
union MaterialTextureDefInfo &lt;br /&gt;
{&lt;br /&gt;
	GfxImage *image;&lt;br /&gt;
	water_t *water;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MaterialTextureDef&lt;br /&gt;
{&lt;br /&gt;
	unsigned int nameHash;&lt;br /&gt;
	char nameStart;&lt;br /&gt;
	char nameEnd;&lt;br /&gt;
	char sampleState;&lt;br /&gt;
	char semantic;&lt;br /&gt;
	MaterialTextureDefInfo u;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GFxDrawSurfFields&lt;br /&gt;
{&lt;br /&gt;
	unsigned long long unused,&lt;br /&gt;
			primarySortKey,&lt;br /&gt;
			surfType,&lt;br /&gt;
			primaryLightIndex,&lt;br /&gt;
			prepass,&lt;br /&gt;
			materialSortedIndex,&lt;br /&gt;
			customIndex,&lt;br /&gt;
			reflectionProbeIndex,&lt;br /&gt;
			objectId;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union GfxDrawSurf &lt;br /&gt;
{&lt;br /&gt;
	GFxDrawSurfFields fields;&lt;br /&gt;
	unsigned long long packed;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct __declspec(align(8)) MaterialInfo // 0x20&lt;br /&gt;
{&lt;br /&gt;
	const char *name;&lt;br /&gt;
	char gameFlags;&lt;br /&gt;
	char sortKey;&lt;br /&gt;
	char textureAtlasRowCount;&lt;br /&gt;
	char textureAtlasColumnCount;&lt;br /&gt;
	GfxDrawSurf drawSurf;&lt;br /&gt;
	int surfaceTypeBits;&lt;br /&gt;
	char unknown[0xC];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Material	// 0xB8&lt;br /&gt;
{&lt;br /&gt;
	MaterialInfo info;&lt;br /&gt;
	char stateBitsEntry[TECHNIQUE_COUNT];	// see MaterialTechniqueType&lt;br /&gt;
	char textureCount;	// 0x47&lt;br /&gt;
	char constantCount;	// 0x48&lt;br /&gt;
	char stateBitsCount;	// 0x49&lt;br /&gt;
	char stateFlags;	// 0x4A&lt;br /&gt;
	char cameraRegion;	// 0x4B&lt;br /&gt;
	char unknown;		// 0x4C&lt;br /&gt;
	char stringCount;	// 0x4D&lt;br /&gt;
#ifdef PS3&lt;br /&gt;
	unsigned short ushorts[TECHNIQUE_COUNT];&lt;br /&gt;
	unsigned short *ushortArray;		// count = TECHNIQUE_COUNT, see MaterialTechniqueType&lt;br /&gt;
#endif&lt;br /&gt;
	MaterialTechniqueSet *techniqueSet;&lt;br /&gt;
	MaterialTextureDef *textureTable;	// count = textureCount&lt;br /&gt;
	MaterialConstantDef *constantTable;	// count = constantCount&lt;br /&gt;
	GfxStateBits *stateBitTable;	// count = stateBitsCount&lt;br /&gt;
	const char **XStringArray;	// count = stringCount&lt;br /&gt;
	int unknown;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=MapEnts_Asset&amp;diff=1048</id>
		<title>MapEnts Asset</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=MapEnts_Asset&amp;diff=1048"/>
		<updated>2026-06-12T02:58:29Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Modern Warfare 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Category:Assets]]&lt;br /&gt;
[[Category:CoD4]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
[[Category:MW3]]&lt;br /&gt;
[[Category:Ghosts]]&lt;br /&gt;
[[Category:AW]]&lt;br /&gt;
[[Category:WaW]]&lt;br /&gt;
[[Category:BO1]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
[[Category:BO3]]&lt;br /&gt;
The map_ents asset is part of the D3DBSP system used that is produced by Radiant. This is used to define any entities in the map particularly spawn points, helicopter path points, physable entities, and destructible entities. Although the entity string itself is quite easy to understand, some unknown structures have been added on later Call of Duty games.&lt;br /&gt;
== Call of Duty 4 &amp;amp; World at War &amp;amp; Black Ops 1 ==&lt;br /&gt;
This is the simplest map_ents.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MapEnts&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  char *entityString;&lt;br /&gt;
  int numEntityChars;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The entityString is simply a string that defines different entitys, and it&#039;s length is numEntityChars. This is a simple as it gets.&lt;br /&gt;
== Modern Warfare 2 ==&lt;br /&gt;
Modern Warfare 2 adds some extra data to the end, believed to be buffer data and Stage data.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct TriggerModel&lt;br /&gt;
{&lt;br /&gt;
    int contents;&lt;br /&gt;
    uint16_t hullCount;&lt;br /&gt;
    uint16_t firstHull;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct TriggerHull&lt;br /&gt;
{&lt;br /&gt;
    Bounds bounds;&lt;br /&gt;
    int contents;&lt;br /&gt;
    uint16_t slabCount;&lt;br /&gt;
    uint16_t firstSlab;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct TriggerSlab&lt;br /&gt;
{&lt;br /&gt;
    float dir[3];&lt;br /&gt;
    float midPoint;&lt;br /&gt;
    float halfSize;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MapTriggers&lt;br /&gt;
{&lt;br /&gt;
  uint count;&lt;br /&gt;
  TriggerModel* models;		//size = count &amp;lt;&amp;lt; 3&lt;br /&gt;
  uint hullCount;&lt;br /&gt;
  TriggerHull* hulls;		//size = hullCount &amp;lt;&amp;lt; 5&lt;br /&gt;
  uint slabcount;&lt;br /&gt;
  TriggerSlab* slabs;		//size = ((slabCount &amp;lt;&amp;lt; 2) + slabCount) &amp;lt;&amp;lt; 2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Stage&lt;br /&gt;
{&lt;br /&gt;
  char * stageName;&lt;br /&gt;
  float origin[3];&lt;br /&gt;
  uint16_t triggerIndex;&lt;br /&gt;
  char sunPrimaryLightIndex;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MapEnts&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  char *entityString;&lt;br /&gt;
  int numEntityChars;&lt;br /&gt;
  MapTriggers trigger;&lt;br /&gt;
  Stage * stages;&lt;br /&gt;
  byte stageCount;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Keep in mind that the MapTriggers is also used in the addon_map_ents asset, despite one of those never actually having been found.&lt;br /&gt;
&lt;br /&gt;
== Modern Warfare 3 ==&lt;br /&gt;
Modern Warfare 3 adds even more extra data to the end, believed to be buffer data.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct unknownInternalMapEnts1&lt;br /&gt;
{&lt;br /&gt;
  int unknownCount1;&lt;br /&gt;
  char * unknownData1;			//size = unknownCount1 &amp;lt;&amp;lt; 3&lt;br /&gt;
  int unknownCount2;&lt;br /&gt;
  char * unknownData2;			//size = unknownCount2 &amp;lt;&amp;lt; 5&lt;br /&gt;
  int unknownCount3;&lt;br /&gt;
  char * unknownData3;			//size = ((unknownCount3 &amp;lt;&amp;lt; 2) + unknownCount3) &amp;lt;&amp;lt; 2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownInternalMapEnts2&lt;br /&gt;
{&lt;br /&gt;
  unknownInternalMapEnts1 unknownStruct1;&lt;br /&gt;
  short unknownCount1;&lt;br /&gt;
  char * unknownData1;			//size = unknownCount1 * 0x1C&lt;br /&gt;
  int unknownCount2;&lt;br /&gt;
  char * unknownData2;			//size = unknownCount2&lt;br /&gt;
  char * unknownData3;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
  char * unknownData4;			//size = unknownStruct1-&amp;gt;unknownCount1&lt;br /&gt;
  char * unknownData5;			//size = ((unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1) + unknownStruct1-&amp;gt;unknownCount1) &amp;lt;&amp;lt; 2&lt;br /&gt;
  char * unknownData6;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 2&lt;br /&gt;
  char * unknownData7;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MapEnts&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  char *entityString;&lt;br /&gt;
  int numEntityChars;&lt;br /&gt;
       unknownInternalMapEnts1 unknownStruct1;&lt;br /&gt;
       unknownInternalMapEnts2 unknownStruct2;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Keep in mind that the unknownInternalMapEnts1 is also used in the addon_map_ents and col_map_mp (clipMap) assets.&lt;br /&gt;
== Black Ops 2 &amp;amp; 3 ==&lt;br /&gt;
Black Ops 2 adds similar data to Modern Warfare 2 to the end of it&#039;s asset, believed to be buffer data.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct TriggerModel&lt;br /&gt;
{&lt;br /&gt;
  int contents;&lt;br /&gt;
  unsigned __int16 hullCount;&lt;br /&gt;
  unsigned __int16 firstHull;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct TriggerHull&lt;br /&gt;
{&lt;br /&gt;
  Bounds bounds;&lt;br /&gt;
  int contents;&lt;br /&gt;
  unsigned __int16 slabCount;&lt;br /&gt;
  unsigned __int16 firstSlab;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct TriggerSlab&lt;br /&gt;
{&lt;br /&gt;
  vec3_t dir;&lt;br /&gt;
  float midPoint;&lt;br /&gt;
  float halfSize;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MapTriggers&lt;br /&gt;
{&lt;br /&gt;
  unsigned int count;&lt;br /&gt;
  TriggerModel *models;&lt;br /&gt;
  unsigned int hullCount;&lt;br /&gt;
  TriggerHull *hulls;&lt;br /&gt;
  unsigned int slabCount;&lt;br /&gt;
  TriggerSlab *slabs;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MapEnts&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  char *entityString;&lt;br /&gt;
  int numEntityChars;&lt;br /&gt;
  MapTriggers trigger;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ghosts ==&lt;br /&gt;
Ghosts provides a fundamental change to the way the map_ents asset works, because while the entityString still exists it goes unused.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Bounds&lt;br /&gt;
{&lt;br /&gt;
  float midPoint[3];&lt;br /&gt;
  float halfSize[3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct TriggerModel&lt;br /&gt;
{&lt;br /&gt;
  int contents;&lt;br /&gt;
  unsigned __int16 hullCount;&lt;br /&gt;
  unsigned __int16 firstHull;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct TriggerHull&lt;br /&gt;
{&lt;br /&gt;
  Bounds bounds;&lt;br /&gt;
  int contents;&lt;br /&gt;
  unsigned __int16 slabCount;&lt;br /&gt;
  unsigned __int16 firstSlab;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct TriggerSlab&lt;br /&gt;
{&lt;br /&gt;
  float dir[3];&lt;br /&gt;
  float midPoint;&lt;br /&gt;
  float halfSize;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MapTriggers&lt;br /&gt;
{&lt;br /&gt;
  unsigned int count;&lt;br /&gt;
  TriggerModel *models;&lt;br /&gt;
  unsigned int hullCount;&lt;br /&gt;
  TriggerHull *hulls;&lt;br /&gt;
  unsigned int slabCount;&lt;br /&gt;
  TriggerSlab *slabs;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ClientTriggerAabbNode&lt;br /&gt;
{&lt;br /&gt;
  Bounds bounds;&lt;br /&gt;
  unsigned __int16 firstChild;&lt;br /&gt;
  unsigned __int16 childCount;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ClientTriggers&lt;br /&gt;
{&lt;br /&gt;
  MapTriggers trigger;&lt;br /&gt;
  unsigned __int16 numClientTriggerNodes;&lt;br /&gt;
  ClientTriggerAabbNode *clientTriggerAabbTree;&lt;br /&gt;
  unsigned int triggerStringLength;&lt;br /&gt;
  char *triggerString;&lt;br /&gt;
  __int16 *visionSetTriggers;&lt;br /&gt;
  char *triggerType;&lt;br /&gt;
  float (*origins)[3];&lt;br /&gt;
  float *scriptDelay;&lt;br /&gt;
  __int16 *audioTriggers;&lt;br /&gt;
  __int16 *blendLookup;&lt;br /&gt;
  __int16 *npcTriggers;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ClientTriggerBlendNode&lt;br /&gt;
{&lt;br /&gt;
  float pointA[3];&lt;br /&gt;
  float pointB[3];&lt;br /&gt;
  unsigned __int16 triggerA;&lt;br /&gt;
  unsigned __int16 triggerB;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ClientTriggerBlend&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 numClientTriggerBlendNodes;&lt;br /&gt;
  ClientTriggerBlendNode *blendNodes;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SpawnPointEntityRecord&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 index;&lt;br /&gt;
  scr_string_t name;&lt;br /&gt;
  scr_string_t target;&lt;br /&gt;
  scr_string_t script_noteworthy;&lt;br /&gt;
  float origin[3];&lt;br /&gt;
  float angles[3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SpawnPointRecordList&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 spawnsCount;&lt;br /&gt;
  SpawnPointEntityRecord *spawns;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SplinePointEntityRecord&lt;br /&gt;
{&lt;br /&gt;
  int splineId;&lt;br /&gt;
  int splineNodeId;&lt;br /&gt;
  char *splineNodeLabel;&lt;br /&gt;
  float splineNodeTension;&lt;br /&gt;
  float origin[3];&lt;br /&gt;
  float corridorDims[2];&lt;br /&gt;
  float tangent[3];&lt;br /&gt;
  float distToNextNode;&lt;br /&gt;
  float (*positionCubic)[3];&lt;br /&gt;
  float (*tangentQuadratic)[3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SplinePointRecordList&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 splinePointCount;&lt;br /&gt;
  float splineLength;&lt;br /&gt;
  SplinePointEntityRecord *splinePoints;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SplineRecordList&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 splineCount;&lt;br /&gt;
  SplinePointRecordList *splines;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MapEnts&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  char *entityString;&lt;br /&gt;
  int numEntityChars;&lt;br /&gt;
  MapTriggers trigger;&lt;br /&gt;
  ClientTriggers clientTrigger;&lt;br /&gt;
  ClientTriggerBlend clientTriggerBlend;&lt;br /&gt;
  SpawnPointRecordList spawnList;&lt;br /&gt;
  SplineRecordList splineList;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Advanced Warfare ==&lt;br /&gt;
Advanced Warfare provides a fundamental change to the way the map_ents asset works, because while the entityString still exists it goes unused.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct unknownInternalMapEnts1&lt;br /&gt;
{&lt;br /&gt;
  int unknownCount1;&lt;br /&gt;
  char * unknownData1;			//size = unknownCount1 &amp;lt;&amp;lt; 3&lt;br /&gt;
  int unknownCount2;&lt;br /&gt;
  char * unknownData2;			//size = unknownCount2 &amp;lt;&amp;lt; 5&lt;br /&gt;
  int unknownCount3;&lt;br /&gt;
  char * unknownData3;			//size = (unknownCount3 &amp;lt;&amp;lt; 4) + (unknownCount3 &amp;lt;&amp;lt; 2)&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownInternalMapEnts2&lt;br /&gt;
{&lt;br /&gt;
  unknownInternalMapEnts1 unknownStruct1;&lt;br /&gt;
  short unknownCount1;&lt;br /&gt;
  char * unknownData1;			//size = unknownCount1 * 0x1C&lt;br /&gt;
  int unknownCount2;&lt;br /&gt;
  char * unknownData2;			//size = unknownCount2&lt;br /&gt;
  char * unknownData3;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
  char * unknownData4;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
  char * unknownData5;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
  char * unknownData6;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
  char * unknownData7;			//size = ((unknownStruct1-&amp;gt;unknownCount1 + unknownStruct1-&amp;gt;unknownCount1) + unknownStruct1-&amp;gt;unknownCount1) &amp;lt;&amp;lt; 2&lt;br /&gt;
  char * unknownData8;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 2&lt;br /&gt;
  char * unknownData9;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
  char * unknownData10;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
  char * unknownData11;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
  char * unknownData12;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
  char * unknownData13;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownInternalMapEnts3&lt;br /&gt;
{&lt;br /&gt;
  short unknownCount;&lt;br /&gt;
  char * unknownData;			//size = unknownCount * 0x1C&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownInternalMapEnts4Internal1&lt;br /&gt;
{&lt;br /&gt;
  short unknown1;&lt;br /&gt;
  ScriptString unknownScriptString1;&lt;br /&gt;
  ScriptString unknownScriptString2;&lt;br /&gt;
  ScriptString unknownScriptString3;&lt;br /&gt;
  ScriptString unknownScriptString4;&lt;br /&gt;
  char unknown2[0x12];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownInternalMapEnts4&lt;br /&gt;
{&lt;br /&gt;
  short unknownCount;&lt;br /&gt;
  unknownInternalMapEnts4Internal1 * unknownStruct;			//Count = unknownCount&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownInternalMapEnts5Internal1Internal1&lt;br /&gt;
{&lt;br /&gt;
  char unknown1[8];&lt;br /&gt;
  char (*unknown2)[0x40];&lt;br /&gt;
  char unknown3[0x28];&lt;br /&gt;
  char (*unknown4)[0x30];&lt;br /&gt;
  char (*unknown5)[0x24];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownInternalMapEnts5Internal1&lt;br /&gt;
{&lt;br /&gt;
  short unknownCount;&lt;br /&gt;
  int unknown;&lt;br /&gt;
  unknownInternalMapEnts5Internal1Internal1 * unknownStruct;			//Count = unknownCount&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownInternalMapEnts5&lt;br /&gt;
{&lt;br /&gt;
  short unknownCount;&lt;br /&gt;
  unknownInternalMapEnts5Internal1 * unknownStruct;			//Count = unknownCount&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MapEnts&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  char *entityString;&lt;br /&gt;
  int numEntityChars;&lt;br /&gt;
       unknownInternalMapEnts1 unknownStruct1;&lt;br /&gt;
       unknownInternalMapEnts2 unknownStruct2;&lt;br /&gt;
       unknownInternalMapEnts3 unknownStruct3;&lt;br /&gt;
       unknownInternalMapEnts4 unknownStruct4;&lt;br /&gt;
       unknownInternalMapEnts5 unknownStruct5;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source Format ==&lt;br /&gt;
The source format must work in tandem with the other D3DBSP assets. Currently the used the source format is simply a text file with the entityString located at &amp;quot;raw/maps/(MAPNAME).d3dbsp&amp;quot; for SP maps and at &amp;quot;raw/maps/mp/(MAPNAME).d3dbsp&amp;quot; for MP maps.&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=MapEnts_Asset&amp;diff=1047</id>
		<title>MapEnts Asset</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=MapEnts_Asset&amp;diff=1047"/>
		<updated>2026-06-12T02:55:39Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Modern Warfare 2 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Category:Assets]]&lt;br /&gt;
[[Category:CoD4]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
[[Category:MW3]]&lt;br /&gt;
[[Category:Ghosts]]&lt;br /&gt;
[[Category:AW]]&lt;br /&gt;
[[Category:WaW]]&lt;br /&gt;
[[Category:BO1]]&lt;br /&gt;
[[Category:BO2]]&lt;br /&gt;
[[Category:BO3]]&lt;br /&gt;
The map_ents asset is part of the D3DBSP system used that is produced by Radiant. This is used to define any entities in the map particularly spawn points, helicopter path points, physable entities, and destructible entities. Although the entity string itself is quite easy to understand, some unknown structures have been added on later Call of Duty games.&lt;br /&gt;
== Call of Duty 4 &amp;amp; World at War &amp;amp; Black Ops 1 ==&lt;br /&gt;
This is the simplest map_ents.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct MapEnts&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  char *entityString;&lt;br /&gt;
  int numEntityChars;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
The entityString is simply a string that defines different entitys, and it&#039;s length is numEntityChars. This is a simple as it gets.&lt;br /&gt;
== Modern Warfare 2 ==&lt;br /&gt;
Modern Warfare 2 adds some extra data to the end, believed to be buffer data and Stage data.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct TriggerModel&lt;br /&gt;
{&lt;br /&gt;
    int contents;&lt;br /&gt;
    uint16_t hullCount;&lt;br /&gt;
    uint16_t firstHull;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct TriggerHull&lt;br /&gt;
{&lt;br /&gt;
    Bounds bounds;&lt;br /&gt;
    int contents;&lt;br /&gt;
    uint16_t slabCount;&lt;br /&gt;
    uint16_t firstSlab;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MapTriggers&lt;br /&gt;
{&lt;br /&gt;
  int count;&lt;br /&gt;
  char * unknownData1;		//size = count &amp;lt;&amp;lt; 3&lt;br /&gt;
  int hullCount;&lt;br /&gt;
  char * hullCount;			//size = hullCount &amp;lt;&amp;lt; 5&lt;br /&gt;
  int hullCount;&lt;br /&gt;
  char * slabCount;			//size = ((slabCount &amp;lt;&amp;lt; 2) + slabCount) &amp;lt;&amp;lt; 2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Stage&lt;br /&gt;
{&lt;br /&gt;
  char * stageName;&lt;br /&gt;
  float origin[3];&lt;br /&gt;
  uint16_t triggerIndex;&lt;br /&gt;
  char sunPrimaryLightIndex;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MapEnts&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  char *entityString;&lt;br /&gt;
  int numEntityChars;&lt;br /&gt;
  MapTriggers trigger;&lt;br /&gt;
  Stage * stages;&lt;br /&gt;
  byte stageCount;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Keep in mind that the unknownInternalMapEnts1 is also used in the addon_map_ents asset, despite one of those never actually having been found.&lt;br /&gt;
&lt;br /&gt;
== Modern Warfare 3 ==&lt;br /&gt;
Modern Warfare 3 adds even more extra data to the end, believed to be buffer data.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct unknownInternalMapEnts1&lt;br /&gt;
{&lt;br /&gt;
  int unknownCount1;&lt;br /&gt;
  char * unknownData1;			//size = unknownCount1 &amp;lt;&amp;lt; 3&lt;br /&gt;
  int unknownCount2;&lt;br /&gt;
  char * unknownData2;			//size = unknownCount2 &amp;lt;&amp;lt; 5&lt;br /&gt;
  int unknownCount3;&lt;br /&gt;
  char * unknownData3;			//size = ((unknownCount3 &amp;lt;&amp;lt; 2) + unknownCount3) &amp;lt;&amp;lt; 2&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownInternalMapEnts2&lt;br /&gt;
{&lt;br /&gt;
  unknownInternalMapEnts1 unknownStruct1;&lt;br /&gt;
  short unknownCount1;&lt;br /&gt;
  char * unknownData1;			//size = unknownCount1 * 0x1C&lt;br /&gt;
  int unknownCount2;&lt;br /&gt;
  char * unknownData2;			//size = unknownCount2&lt;br /&gt;
  char * unknownData3;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
  char * unknownData4;			//size = unknownStruct1-&amp;gt;unknownCount1&lt;br /&gt;
  char * unknownData5;			//size = ((unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1) + unknownStruct1-&amp;gt;unknownCount1) &amp;lt;&amp;lt; 2&lt;br /&gt;
  char * unknownData6;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 2&lt;br /&gt;
  char * unknownData7;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MapEnts&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  char *entityString;&lt;br /&gt;
  int numEntityChars;&lt;br /&gt;
       unknownInternalMapEnts1 unknownStruct1;&lt;br /&gt;
       unknownInternalMapEnts2 unknownStruct2;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Keep in mind that the unknownInternalMapEnts1 is also used in the addon_map_ents and col_map_mp (clipMap) assets.&lt;br /&gt;
== Black Ops 2 &amp;amp; 3 ==&lt;br /&gt;
Black Ops 2 adds similar data to Modern Warfare 2 to the end of it&#039;s asset, believed to be buffer data.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct TriggerModel&lt;br /&gt;
{&lt;br /&gt;
  int contents;&lt;br /&gt;
  unsigned __int16 hullCount;&lt;br /&gt;
  unsigned __int16 firstHull;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct TriggerHull&lt;br /&gt;
{&lt;br /&gt;
  Bounds bounds;&lt;br /&gt;
  int contents;&lt;br /&gt;
  unsigned __int16 slabCount;&lt;br /&gt;
  unsigned __int16 firstSlab;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct TriggerSlab&lt;br /&gt;
{&lt;br /&gt;
  vec3_t dir;&lt;br /&gt;
  float midPoint;&lt;br /&gt;
  float halfSize;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MapTriggers&lt;br /&gt;
{&lt;br /&gt;
  unsigned int count;&lt;br /&gt;
  TriggerModel *models;&lt;br /&gt;
  unsigned int hullCount;&lt;br /&gt;
  TriggerHull *hulls;&lt;br /&gt;
  unsigned int slabCount;&lt;br /&gt;
  TriggerSlab *slabs;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MapEnts&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  char *entityString;&lt;br /&gt;
  int numEntityChars;&lt;br /&gt;
  MapTriggers trigger;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ghosts ==&lt;br /&gt;
Ghosts provides a fundamental change to the way the map_ents asset works, because while the entityString still exists it goes unused.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct Bounds&lt;br /&gt;
{&lt;br /&gt;
  float midPoint[3];&lt;br /&gt;
  float halfSize[3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct TriggerModel&lt;br /&gt;
{&lt;br /&gt;
  int contents;&lt;br /&gt;
  unsigned __int16 hullCount;&lt;br /&gt;
  unsigned __int16 firstHull;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct TriggerHull&lt;br /&gt;
{&lt;br /&gt;
  Bounds bounds;&lt;br /&gt;
  int contents;&lt;br /&gt;
  unsigned __int16 slabCount;&lt;br /&gt;
  unsigned __int16 firstSlab;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct TriggerSlab&lt;br /&gt;
{&lt;br /&gt;
  float dir[3];&lt;br /&gt;
  float midPoint;&lt;br /&gt;
  float halfSize;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MapTriggers&lt;br /&gt;
{&lt;br /&gt;
  unsigned int count;&lt;br /&gt;
  TriggerModel *models;&lt;br /&gt;
  unsigned int hullCount;&lt;br /&gt;
  TriggerHull *hulls;&lt;br /&gt;
  unsigned int slabCount;&lt;br /&gt;
  TriggerSlab *slabs;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ClientTriggerAabbNode&lt;br /&gt;
{&lt;br /&gt;
  Bounds bounds;&lt;br /&gt;
  unsigned __int16 firstChild;&lt;br /&gt;
  unsigned __int16 childCount;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ClientTriggers&lt;br /&gt;
{&lt;br /&gt;
  MapTriggers trigger;&lt;br /&gt;
  unsigned __int16 numClientTriggerNodes;&lt;br /&gt;
  ClientTriggerAabbNode *clientTriggerAabbTree;&lt;br /&gt;
  unsigned int triggerStringLength;&lt;br /&gt;
  char *triggerString;&lt;br /&gt;
  __int16 *visionSetTriggers;&lt;br /&gt;
  char *triggerType;&lt;br /&gt;
  float (*origins)[3];&lt;br /&gt;
  float *scriptDelay;&lt;br /&gt;
  __int16 *audioTriggers;&lt;br /&gt;
  __int16 *blendLookup;&lt;br /&gt;
  __int16 *npcTriggers;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ClientTriggerBlendNode&lt;br /&gt;
{&lt;br /&gt;
  float pointA[3];&lt;br /&gt;
  float pointB[3];&lt;br /&gt;
  unsigned __int16 triggerA;&lt;br /&gt;
  unsigned __int16 triggerB;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ClientTriggerBlend&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 numClientTriggerBlendNodes;&lt;br /&gt;
  ClientTriggerBlendNode *blendNodes;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SpawnPointEntityRecord&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 index;&lt;br /&gt;
  scr_string_t name;&lt;br /&gt;
  scr_string_t target;&lt;br /&gt;
  scr_string_t script_noteworthy;&lt;br /&gt;
  float origin[3];&lt;br /&gt;
  float angles[3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SpawnPointRecordList&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 spawnsCount;&lt;br /&gt;
  SpawnPointEntityRecord *spawns;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SplinePointEntityRecord&lt;br /&gt;
{&lt;br /&gt;
  int splineId;&lt;br /&gt;
  int splineNodeId;&lt;br /&gt;
  char *splineNodeLabel;&lt;br /&gt;
  float splineNodeTension;&lt;br /&gt;
  float origin[3];&lt;br /&gt;
  float corridorDims[2];&lt;br /&gt;
  float tangent[3];&lt;br /&gt;
  float distToNextNode;&lt;br /&gt;
  float (*positionCubic)[3];&lt;br /&gt;
  float (*tangentQuadratic)[3];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SplinePointRecordList&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 splinePointCount;&lt;br /&gt;
  float splineLength;&lt;br /&gt;
  SplinePointEntityRecord *splinePoints;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SplineRecordList&lt;br /&gt;
{&lt;br /&gt;
  unsigned __int16 splineCount;&lt;br /&gt;
  SplinePointRecordList *splines;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MapEnts&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  char *entityString;&lt;br /&gt;
  int numEntityChars;&lt;br /&gt;
  MapTriggers trigger;&lt;br /&gt;
  ClientTriggers clientTrigger;&lt;br /&gt;
  ClientTriggerBlend clientTriggerBlend;&lt;br /&gt;
  SpawnPointRecordList spawnList;&lt;br /&gt;
  SplineRecordList splineList;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Advanced Warfare ==&lt;br /&gt;
Advanced Warfare provides a fundamental change to the way the map_ents asset works, because while the entityString still exists it goes unused.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
struct unknownInternalMapEnts1&lt;br /&gt;
{&lt;br /&gt;
  int unknownCount1;&lt;br /&gt;
  char * unknownData1;			//size = unknownCount1 &amp;lt;&amp;lt; 3&lt;br /&gt;
  int unknownCount2;&lt;br /&gt;
  char * unknownData2;			//size = unknownCount2 &amp;lt;&amp;lt; 5&lt;br /&gt;
  int unknownCount3;&lt;br /&gt;
  char * unknownData3;			//size = (unknownCount3 &amp;lt;&amp;lt; 4) + (unknownCount3 &amp;lt;&amp;lt; 2)&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownInternalMapEnts2&lt;br /&gt;
{&lt;br /&gt;
  unknownInternalMapEnts1 unknownStruct1;&lt;br /&gt;
  short unknownCount1;&lt;br /&gt;
  char * unknownData1;			//size = unknownCount1 * 0x1C&lt;br /&gt;
  int unknownCount2;&lt;br /&gt;
  char * unknownData2;			//size = unknownCount2&lt;br /&gt;
  char * unknownData3;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
  char * unknownData4;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
  char * unknownData5;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
  char * unknownData6;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
  char * unknownData7;			//size = ((unknownStruct1-&amp;gt;unknownCount1 + unknownStruct1-&amp;gt;unknownCount1) + unknownStruct1-&amp;gt;unknownCount1) &amp;lt;&amp;lt; 2&lt;br /&gt;
  char * unknownData8;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 2&lt;br /&gt;
  char * unknownData9;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
  char * unknownData10;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
  char * unknownData11;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
  char * unknownData12;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
  char * unknownData13;			//size = unknownStruct1-&amp;gt;unknownCount1 &amp;lt;&amp;lt; 1&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownInternalMapEnts3&lt;br /&gt;
{&lt;br /&gt;
  short unknownCount;&lt;br /&gt;
  char * unknownData;			//size = unknownCount * 0x1C&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownInternalMapEnts4Internal1&lt;br /&gt;
{&lt;br /&gt;
  short unknown1;&lt;br /&gt;
  ScriptString unknownScriptString1;&lt;br /&gt;
  ScriptString unknownScriptString2;&lt;br /&gt;
  ScriptString unknownScriptString3;&lt;br /&gt;
  ScriptString unknownScriptString4;&lt;br /&gt;
  char unknown2[0x12];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownInternalMapEnts4&lt;br /&gt;
{&lt;br /&gt;
  short unknownCount;&lt;br /&gt;
  unknownInternalMapEnts4Internal1 * unknownStruct;			//Count = unknownCount&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownInternalMapEnts5Internal1Internal1&lt;br /&gt;
{&lt;br /&gt;
  char unknown1[8];&lt;br /&gt;
  char (*unknown2)[0x40];&lt;br /&gt;
  char unknown3[0x28];&lt;br /&gt;
  char (*unknown4)[0x30];&lt;br /&gt;
  char (*unknown5)[0x24];&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownInternalMapEnts5Internal1&lt;br /&gt;
{&lt;br /&gt;
  short unknownCount;&lt;br /&gt;
  int unknown;&lt;br /&gt;
  unknownInternalMapEnts5Internal1Internal1 * unknownStruct;			//Count = unknownCount&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct unknownInternalMapEnts5&lt;br /&gt;
{&lt;br /&gt;
  short unknownCount;&lt;br /&gt;
  unknownInternalMapEnts5Internal1 * unknownStruct;			//Count = unknownCount&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct MapEnts&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  char *entityString;&lt;br /&gt;
  int numEntityChars;&lt;br /&gt;
       unknownInternalMapEnts1 unknownStruct1;&lt;br /&gt;
       unknownInternalMapEnts2 unknownStruct2;&lt;br /&gt;
       unknownInternalMapEnts3 unknownStruct3;&lt;br /&gt;
       unknownInternalMapEnts4 unknownStruct4;&lt;br /&gt;
       unknownInternalMapEnts5 unknownStruct5;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Source Format ==&lt;br /&gt;
The source format must work in tandem with the other D3DBSP assets. Currently the used the source format is simply a text file with the entityString located at &amp;quot;raw/maps/(MAPNAME).d3dbsp&amp;quot; for SP maps and at &amp;quot;raw/maps/mp/(MAPNAME).d3dbsp&amp;quot; for MP maps.&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Menu_Asset_(MW2)&amp;diff=1046</id>
		<title>Menu Asset (MW2)</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Menu_Asset_(MW2)&amp;diff=1046"/>
		<updated>2026-06-12T02:09:00Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Assets]]&lt;br /&gt;
[[Category:MW2]]&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;cpp&amp;quot;&amp;gt;&lt;br /&gt;
enum operationEnum&lt;br /&gt;
{&lt;br /&gt;
  OP_NOOP = 0x0,&lt;br /&gt;
  OP_RIGHTPAREN = 0x1,&lt;br /&gt;
  OP_MULTIPLY = 0x2,&lt;br /&gt;
  OP_DIVIDE = 0x3,&lt;br /&gt;
  OP_MODULUS = 0x4,&lt;br /&gt;
  OP_ADD = 0x5,&lt;br /&gt;
  OP_SUBTRACT = 0x6,&lt;br /&gt;
  OP_NOT = 0x7,&lt;br /&gt;
  OP_LESSTHAN = 0x8,&lt;br /&gt;
  OP_LESSTHANEQUALTO = 0x9,&lt;br /&gt;
  OP_GREATERTHAN = 0xA,&lt;br /&gt;
  OP_GREATERTHANEQUALTO = 0xB,&lt;br /&gt;
  OP_EQUALS = 0xC,&lt;br /&gt;
  OP_NOTEQUAL = 0xD,&lt;br /&gt;
  OP_AND = 0xE,&lt;br /&gt;
  OP_OR = 0xF,&lt;br /&gt;
  OP_LEFTPAREN = 0x10,&lt;br /&gt;
  OP_COMMA = 0x11,&lt;br /&gt;
  OP_BITWISEAND = 0x12,&lt;br /&gt;
  OP_BITWISEOR = 0x13,&lt;br /&gt;
  OP_BITWISENOT = 0x14,&lt;br /&gt;
  OP_BITSHIFTLEFT = 0x15,&lt;br /&gt;
  OP_BITSHIFTRIGHT = 0x16,&lt;br /&gt;
  OP_STATICDVARINT = 0x17,&lt;br /&gt;
  OP_STATICDVARBOOL = 0x18,&lt;br /&gt;
  OP_STATICDVARFLOAT = 0x19,&lt;br /&gt;
  OP_STATICDVARSTRING = 0x1A,&lt;br /&gt;
  OP_INT = 0x1B,&lt;br /&gt;
  OP_STRING = 0x1C,&lt;br /&gt;
  OP_FLOAT = 0x1D,&lt;br /&gt;
  OP_SIN = 0x1E,&lt;br /&gt;
  OP_COS = 0x1F,&lt;br /&gt;
  OP_MIN = 0x20,&lt;br /&gt;
  OP_MAX = 0x21,&lt;br /&gt;
  OP_MILLISECONDS = 0x22,&lt;br /&gt;
  OP_DVARINT = 0x23,&lt;br /&gt;
  OP_DVARBOOL = 0x24,&lt;br /&gt;
  OP_DVARFLOAT = 0x25,&lt;br /&gt;
  OP_DVARSTRING = 0x26,&lt;br /&gt;
  OP_STAT = 0x27,&lt;br /&gt;
  OP_UIACTIVE = 0x28,&lt;br /&gt;
  OP_FLASHBANGED = 0x29,&lt;br /&gt;
  OP_USINGVEHICLE = 0x2A,&lt;br /&gt;
  OP_MISSILECAM = 0x2B,&lt;br /&gt;
  OP_SCOPED = 0x2C,&lt;br /&gt;
  OP_SCOPEDTHERMAL = 0x2D,&lt;br /&gt;
  OP_SCOREBOARDVISIBLE = 0x2E,&lt;br /&gt;
  OP_INKILLCAM = 0x2F,&lt;br /&gt;
  OP_INKILLCAMNPC = 0x30,&lt;br /&gt;
  OP_PLAYERFIELD = 0x31,&lt;br /&gt;
  OP_GETPERK = 0x32,&lt;br /&gt;
  OP_SELECTINGLOCATION = 0x33,&lt;br /&gt;
  OP_SELECTINGDIRECTION = 0x34,&lt;br /&gt;
  OP_TEAMFIELD = 0x35,&lt;br /&gt;
  OP_OTHERTEAMFIELD = 0x36,&lt;br /&gt;
  OP_MARINESFIELD = 0x37,&lt;br /&gt;
  OP_OPFORFIELD = 0x38,&lt;br /&gt;
  OP_MENUISOPEN = 0x39,&lt;br /&gt;
  OP_WRITINGDATA = 0x3A,&lt;br /&gt;
  OP_INLOBBY = 0x3B,&lt;br /&gt;
  OP_INPRIVATEPARTY = 0x3C,&lt;br /&gt;
  OP_PRIVATEPARTYHOST = 0x3D,&lt;br /&gt;
  OP_PRIVATEPARTYHOSTINLOBBY = 0x3E,&lt;br /&gt;
  OP_ALONEINPARTY = 0x3F,&lt;br /&gt;
  OP_ADSJAVELIN = 0x40,&lt;br /&gt;
  OP_WEAPLOCKBLINK = 0x41,&lt;br /&gt;
  OP_WEAPATTACKTOP = 0x42,&lt;br /&gt;
  OP_WEAPATTACKDIRECT = 0x43,&lt;br /&gt;
  OP_WEAPLOCKING = 0x44,&lt;br /&gt;
  OP_WEAPLOCKED = 0x45,&lt;br /&gt;
  OP_WEAPLOCKTOOCLOSE = 0x46,&lt;br /&gt;
  OP_WEAPLOCKSCREENPOSX = 0x47,&lt;br /&gt;
  OP_WEAPLOCKSCREENPOSY = 0x48,&lt;br /&gt;
  OP_SECONDSASTIME = 0x49,&lt;br /&gt;
  OP_TABLELOOKUP = 0x4A,&lt;br /&gt;
  OP_TABLELOOKUPBYROW = 0x4B,&lt;br /&gt;
  OP_TABLEGETROWNUM = 0x4C,&lt;br /&gt;
  OP_LOCALIZESTRING = 0x4D,&lt;br /&gt;
  OP_LOCALVARINT = 0x4E,&lt;br /&gt;
  OP_LOCALVARBOOL = 0x4F,&lt;br /&gt;
  OP_LOCALVARFLOAT = 0x50,&lt;br /&gt;
  OP_LOCALVARSTRING = 0x51,&lt;br /&gt;
  OP_TIMELEFT = 0x52,&lt;br /&gt;
  OP_SECONDSASCOUNTDOWN = 0x53,&lt;br /&gt;
  OP_GAMEMSGWNDACTIVE = 0x54,&lt;br /&gt;
  OP_GAMETYPENAME = 0x55,&lt;br /&gt;
  OP_GAMETYPE = 0x56,&lt;br /&gt;
  OP_GAMETYPEDESCRIPTION = 0x57,&lt;br /&gt;
  OP_SCORE = 0x58,&lt;br /&gt;
  OP_FRIENDSONLINE = 0x59,&lt;br /&gt;
  OP_SPECTATINGCLIENT = 0x5A,&lt;br /&gt;
  OP_SPECTATINGFREE = 0x5B,&lt;br /&gt;
  OP_STATRANGEBITSSET = 0x5C,&lt;br /&gt;
  OP_KEYBINDING = 0x5D,&lt;br /&gt;
  OP_ACTIONSLOTUSABLE = 0x5E,&lt;br /&gt;
  OP_HUDFADE = 0x5F,&lt;br /&gt;
  OP_MAXRECOMMENDEDPLAYERS = 0x60,&lt;br /&gt;
  OP_ACCEPTINGINVITE = 0x61,&lt;br /&gt;
  OP_ISINTERMISSION = 0x62,&lt;br /&gt;
  OP_GAMEHOST = 0x63,&lt;br /&gt;
  OP_PARTYISMISSINGMAPPACK = 0x64,&lt;br /&gt;
  OP_PARTYMISSINGMAPPACKERROR = 0x65,&lt;br /&gt;
  OP_ANYNEWMAPPACKS = 0x66,&lt;br /&gt;
  OP_AMISELECTED = 0x67,&lt;br /&gt;
  OP_PARTYSTATUSSTRING = 0x68,&lt;br /&gt;
  OP_ATTACHEDCONTROLLERCOUNT = 0x69,&lt;br /&gt;
  OP_ISSPLITSCREENONLINEPOSSIBLE = 0x6A,&lt;br /&gt;
  OP_SPLITSCREENPLAYERCOUNT = 0x6B,&lt;br /&gt;
  OP_GETPLAYERDATA = 0x6C,&lt;br /&gt;
  OP_GETPLAYERDATASPLITSCREEN = 0x6D,&lt;br /&gt;
  OP_EXPERIENCEFORLEVEL = 0x6E,&lt;br /&gt;
  OP_LEVELFOREXPERIENCE = 0x6F,&lt;br /&gt;
  OP_ISITEMUNLOCKED = 0x70,&lt;br /&gt;
  OP_ISITEMUNLOCKEDSPLITSCREEN = 0x71,&lt;br /&gt;
  OP_DEBUGPRINT = 0x72,&lt;br /&gt;
  OP_GETPLAYERDATAANYBOOLTRUE = 0x73,&lt;br /&gt;
  OP_WEAPONCLASSNEW = 0x74,&lt;br /&gt;
  OP_WEAPONNAME = 0x75,&lt;br /&gt;
  OP_ISRELOADING = 0x76,&lt;br /&gt;
  OP_SAVEGAMEAVAILABLE = 0x77,&lt;br /&gt;
  OP_UNLOCKEDITEMCOUNT = 0x78,&lt;br /&gt;
  OP_UNLOCKEDITEMCOUNTSPLITSCREEN = 0x79,&lt;br /&gt;
  OP_UNLOCKEDITEM = 0x7A,&lt;br /&gt;
  OP_UNLOCKEDITEMSPLITSCREEN = 0x7B,&lt;br /&gt;
  OP_MAILSUBJECT = 0x7C,&lt;br /&gt;
  OP_MAILFROM = 0x7D,&lt;br /&gt;
  OP_MAILRECEIVED = 0x7E,&lt;br /&gt;
  OP_MAILBODY = 0x7F,&lt;br /&gt;
  OP_MAILLOOTLOCALIZED = 0x80,&lt;br /&gt;
  OP_MAILGIVESLOOT = 0x81,&lt;br /&gt;
  OP_ANYNEWMAIL = 0x82,&lt;br /&gt;
  OP_MAILTIMETOFOLLOWUP = 0x83,&lt;br /&gt;
  OP_MAILLOOTTYPE = 0x84,&lt;br /&gt;
  OP_MAILRANLOTTERY = 0x85,&lt;br /&gt;
  OP_LOTTERYLOOTLOCALIZED = 0x86,&lt;br /&gt;
  OP_RADARISJAMMED = 0x87,&lt;br /&gt;
  OP_RADARJAMINTENSITY = 0x88,&lt;br /&gt;
  OP_RADARISENABLED = 0x89,&lt;br /&gt;
  OP_ISEMPJAMMED = 0x8A,&lt;br /&gt;
  OP_PLAYERADS = 0x8B,&lt;br /&gt;
  OP_WEAPONHEATACTIVE = 0x8C,&lt;br /&gt;
  OP_WEAPONHEATVALUE = 0x8D,&lt;br /&gt;
  OP_WEAPONHEATOVERHEATED = 0x8E,&lt;br /&gt;
  OP_GETSPLASHTEXT = 0x8F,&lt;br /&gt;
  OP_GETSPLASHDESCRIPTION = 0x90,&lt;br /&gt;
  OP_GETSPLASHMATERIAL = 0x91,&lt;br /&gt;
  OP_SPLASHHASICON = 0x92,&lt;br /&gt;
  OP_SPLASHROWNUM = 0x93,&lt;br /&gt;
  OP_GETFOCUSEDITEMNAME = 0x94,&lt;br /&gt;
  OP_GETFOCUSEDITEMX = 0x95,&lt;br /&gt;
  OP_GETFOCUSEDITEMY = 0x96,&lt;br /&gt;
  OP_GETFOCUSEDITEMWIDTH = 0x97,&lt;br /&gt;
  OP_GETFOCUSEDITEMHEIGHT = 0x98,&lt;br /&gt;
  OP_GETITEMX = 0x99,&lt;br /&gt;
  OP_GETITEMY = 0x9A,&lt;br /&gt;
  OP_GETITEMWIDTH = 0x9B,&lt;br /&gt;
  OP_GETITEMHEIGHT = 0x9C,&lt;br /&gt;
  OP_PLAYLIST = 0x9D,&lt;br /&gt;
  OP_SCOREBOARDEXTERNALMUTENOTICE = 0x9E,&lt;br /&gt;
  OP_GETCLIENTMATCHDATA = 0x9F,&lt;br /&gt;
  OP_GETCLIENTMATCHDATADEF = 0xA0,&lt;br /&gt;
  OP_GETMAPNAME = 0xA1,&lt;br /&gt;
  OP_GETMAPIMAGE = 0xA2,&lt;br /&gt;
  OP_GETMAPCUSTOM = 0xA3,&lt;br /&gt;
  OP_GETMIGRATIONSTATUS = 0xA4,&lt;br /&gt;
  OP_GETPLAYERCARDINFO = 0xA5,&lt;br /&gt;
  OP_ISOFFLINEPROFILESELECTED = 0xA6,&lt;br /&gt;
  OP_COOPPLAYER = 0xA7,&lt;br /&gt;
  OP_ISCOOP = 0xA8,&lt;br /&gt;
  OP_GETPARTYSTATUS = 0xA9,&lt;br /&gt;
  OP_GETSEARCHPARAMS = 0xAA,&lt;br /&gt;
  OP_GETTIMEPLAYED = 0xAB,&lt;br /&gt;
  OP_ISSELECTEDPLAYERFRIEND = 0xAC,&lt;br /&gt;
  OP_GETCHARBYINDEX = 0xAD,&lt;br /&gt;
  OP_GETPROFILEDATA = 0xAE,&lt;br /&gt;
  OP_ISPROFILESIGNEDIN = 0xAF,&lt;br /&gt;
  OP_GETWAITPOPUPSTATUS = 0xB0,&lt;br /&gt;
  OP_GETNATTYPE = 0xB1,&lt;br /&gt;
  OP_GETLOCALIZEDNATTYPE = 0xB2,&lt;br /&gt;
  OP_GETADJUSTEDSAFEAREAHORIZONTAL = 0xB3,&lt;br /&gt;
  OP_GETADJUSTEDSAFEAREAVERTICAL = 0xB4,&lt;br /&gt;
  OP_CONNECTIONINFO = 0xB5,&lt;br /&gt;
  OP_OFFLINEPROFILECANSAVE = 0xB6,&lt;br /&gt;
  OP_ALLSPLITSCREENPROFILESCANSAVE = 0xB7,&lt;br /&gt;
  OP_ALLSPLITSCREENPROFILESARESIGNEDIN = 0xB8,&lt;br /&gt;
  OP_DOWEHAVEMAPPACK = 0xB9,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum expDataType &lt;br /&gt;
{&lt;br /&gt;
  VAL_INT = 0x0,&lt;br /&gt;
  VAL_FLOAT = 0x1,&lt;br /&gt;
  VAL_STRING = 0x2,&lt;br /&gt;
  NUM_INTERNAL_DATATYPES = 0x3,&lt;br /&gt;
  VAL_FUNCTION = 0x3,&lt;br /&gt;
  NUM_DATATYPES = 0x4,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Statement_s;&lt;br /&gt;
struct MenuEventHandlerSet;&lt;br /&gt;
struct ExpressionSupportingData;&lt;br /&gt;
&lt;br /&gt;
struct ExpressionString&lt;br /&gt;
{&lt;br /&gt;
  const char *string;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union operandInternalDataUnion &lt;br /&gt;
{&lt;br /&gt;
  int intVal;&lt;br /&gt;
  float floatVal;&lt;br /&gt;
  ExpressionString *stringVal;&lt;br /&gt;
  Statement_s *function;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Operand &lt;br /&gt;
{&lt;br /&gt;
  expDataType dataType;&lt;br /&gt;
  operandInternalDataUnion internals;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union entryInternalData &lt;br /&gt;
{&lt;br /&gt;
  operationEnum op;&lt;br /&gt;
  Operand operand;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct SetLocalVarData&lt;br /&gt;
{&lt;br /&gt;
  const char *localVarName;&lt;br /&gt;
  Statement_s *expression;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ConditionalScript&lt;br /&gt;
{&lt;br /&gt;
  MenuEventHandlerSet *eventHandlerSet;&lt;br /&gt;
  Statement_s *eventExpression;  // loads this first&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct expressionEntry &lt;br /&gt;
{&lt;br /&gt;
  int type;&lt;br /&gt;
  entryInternalData data;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct Statement_s &lt;br /&gt;
{&lt;br /&gt;
  int numEntries;&lt;br /&gt;
  expressionEntry *entries;&lt;br /&gt;
  ExpressionSupportingData *supportingData;&lt;br /&gt;
  int lastExecuteTime;&lt;br /&gt;
  Operand lastResult;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum ItemFloatExpressionTarget&lt;br /&gt;
{&lt;br /&gt;
  ITEM_FLOATEXP_TGT_RECT_X = 0x0,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_RECT_Y = 0x1,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_RECT_W = 0x2,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_RECT_H = 0x3,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_FORECOLOR_R = 0x4,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_FORECOLOR_G = 0x5,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_FORECOLOR_B = 0x6,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_FORECOLOR_RGB = 0x7,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_FORECOLOR_A = 0x8,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_GLOWCOLOR_R = 0x9,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_GLOWCOLOR_G = 0xA,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_GLOWCOLOR_B = 0xB,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_GLOWCOLOR_RGB = 0xC,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_GLOWCOLOR_A = 0xD,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_BACKCOLOR_R = 0xE,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_BACKCOLOR_G = 0xF,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_BACKCOLOR_B = 0x10,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_BACKCOLOR_RGB = 0x11,&lt;br /&gt;
  ITEM_FLOATEXP_TGT_BACKCOLOR_A = 0x12,&lt;br /&gt;
  ITEM_FLOATEXP_TGT__COUNT = 0x13,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ItemFloatExpression&lt;br /&gt;
{&lt;br /&gt;
  ItemFloatExpressionTarget target;&lt;br /&gt;
  Statement_s *expression;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union EventData&lt;br /&gt;
{&lt;br /&gt;
  const char *unconditionalScript;&lt;br /&gt;
  ConditionalScript *conditionalScript;&lt;br /&gt;
  MenuEventHandlerSet *elseScript;&lt;br /&gt;
  SetLocalVarData *setLocalVarData;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#pragma pack(push, 4)&lt;br /&gt;
struct MenuEventHandler&lt;br /&gt;
{&lt;br /&gt;
  EventData eventData;&lt;br /&gt;
  char eventType;&lt;br /&gt;
};&lt;br /&gt;
#pragma pack(pop)&lt;br /&gt;
&lt;br /&gt;
struct MenuEventHandlerSet&lt;br /&gt;
{&lt;br /&gt;
  int eventHandlerCount;&lt;br /&gt;
  MenuEventHandler **eventHandlers;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ItemKeyHandler&lt;br /&gt;
{&lt;br /&gt;
  int key;&lt;br /&gt;
  MenuEventHandlerSet *action;&lt;br /&gt;
  ItemKeyHandler *next;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct newsTickerDef_s&lt;br /&gt;
{&lt;br /&gt;
  int feedId;    // 0 = text input, 1 = motd&lt;br /&gt;
  int speed;&lt;br /&gt;
  int spacing;&lt;br /&gt;
  int lastTime;&lt;br /&gt;
  int start;&lt;br /&gt;
  int end;&lt;br /&gt;
  float x;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#define MAX_LB_COLUMNS 16&lt;br /&gt;
&lt;br /&gt;
struct columnInfo_s &lt;br /&gt;
{&lt;br /&gt;
  int pos;&lt;br /&gt;
  int width;&lt;br /&gt;
  int maxChars;&lt;br /&gt;
  int alignment;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct listBoxDef_s &lt;br /&gt;
{&lt;br /&gt;
#ifndef PC&lt;br /&gt;
  int startPos[4];&lt;br /&gt;
  int endPos[4];&lt;br /&gt;
  int drawPadding;&lt;br /&gt;
#else&lt;br /&gt;
  int unknown[4];&lt;br /&gt;
#endif&lt;br /&gt;
  float elementWidth;&lt;br /&gt;
  float elementHeight;&lt;br /&gt;
  int elementStyle;&lt;br /&gt;
  int numColumns;&lt;br /&gt;
  columnInfo_s columnInfo[MAX_LB_COLUMNS];&lt;br /&gt;
  MenuEventHandlerSet *doubleClick;&lt;br /&gt;
  int notselectable;&lt;br /&gt;
  int noscrollbars;&lt;br /&gt;
  int usepaging;&lt;br /&gt;
  vec4_t selectBorder;&lt;br /&gt;
  Material *selectIcon;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct editFieldDef_s &lt;br /&gt;
{&lt;br /&gt;
  float minVal;&lt;br /&gt;
  float maxVal;&lt;br /&gt;
  float defVal;&lt;br /&gt;
  float range;&lt;br /&gt;
  int maxChars;&lt;br /&gt;
  int maxCharsGotoNext;&lt;br /&gt;
  int maxPaintChars;&lt;br /&gt;
  int paintOffset;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#define MAX_MULTI_DVARS 32&lt;br /&gt;
&lt;br /&gt;
struct multiDef_s &lt;br /&gt;
{&lt;br /&gt;
  char *dvarList[MAX_MULTI_DVARS];&lt;br /&gt;
  char *dvarStr[MAX_MULTI_DVARS];&lt;br /&gt;
  float dvarValue[MAX_MULTI_DVARS];&lt;br /&gt;
  int count;&lt;br /&gt;
  int strDef;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct textScrollDef_s&lt;br /&gt;
{&lt;br /&gt;
  int startTime;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
union itemDefData_t &lt;br /&gt;
{&lt;br /&gt;
  listBoxDef_s *listBox;&lt;br /&gt;
  editFieldDef_s *editField;&lt;br /&gt;
  multiDef_s *multi;&lt;br /&gt;
  const char *enumDvarName;&lt;br /&gt;
  newsTickerDef_s *newsTicker;&lt;br /&gt;
  textScrollDef_s *textScroll;&lt;br /&gt;
  void *data;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#define WINDOWDYNAMIC_VISIBLE		0x00000004&lt;br /&gt;
#define WINDOWDYNAMIC_HASFORECOLOR	0x00010000&lt;br /&gt;
&lt;br /&gt;
#define WINDOWSTATIC_DECORATION				0x00100000&lt;br /&gt;
#define WINDOWSTATIC_HORIZONTALSCROLL			0x00200000&lt;br /&gt;
#define WINDOWSTATIC_SCREENSPACE				0x00400000&lt;br /&gt;
#define WINDOWSTATIC_AUTOWRAPPED				0x00800000&lt;br /&gt;
#define WINDOWSTATIC_POPUP						0x01000000&lt;br /&gt;
#define WINDOWSTATIC_OUTOFBOUNDSCLICK			0x02000000&lt;br /&gt;
#define WINDOWSTATIC_LEGACYSPLITSCREENSCALE	0x04000000&lt;br /&gt;
#define WINDOWSTATIC_HIDDENDURINGFLASH			0x10000000&lt;br /&gt;
#define WINDOWSTATIC_HIDDENDURINGSCOPE			0x20000000&lt;br /&gt;
#define WINDOWSTATIC_HIDDENDURINGUI			0x40000000&lt;br /&gt;
#define WINDOWSTATIC_TEXTONLYFOCUS				0x80000000&lt;br /&gt;
&lt;br /&gt;
#pragma pack(push, 4)&lt;br /&gt;
struct rectDef_s &lt;br /&gt;
{&lt;br /&gt;
  float x;&lt;br /&gt;
  float y;&lt;br /&gt;
  float w;&lt;br /&gt;
  float h;&lt;br /&gt;
  char horzAlign;&lt;br /&gt;
  char vertAlign;&lt;br /&gt;
};&lt;br /&gt;
#pragma pack(pop)&lt;br /&gt;
&lt;br /&gt;
typedef rectDef_s Rectangle;&lt;br /&gt;
&lt;br /&gt;
struct windowDef_t&lt;br /&gt;
{&lt;br /&gt;
  const char *name;&lt;br /&gt;
  Rectangle rect;&lt;br /&gt;
  Rectangle rectClient;&lt;br /&gt;
  const char *group;&lt;br /&gt;
  int style;&lt;br /&gt;
  int border;&lt;br /&gt;
  int ownerDraw;&lt;br /&gt;
  int ownerDrawFlags;&lt;br /&gt;
  float borderSize;&lt;br /&gt;
  int staticFlags;&lt;br /&gt;
#ifndef PC&lt;br /&gt;
  int dynamicFlags[4];&lt;br /&gt;
#else&lt;br /&gt;
  int dynamicFlags[1];&lt;br /&gt;
#endif&lt;br /&gt;
  int nextTime;&lt;br /&gt;
  vec4_t foreColor;&lt;br /&gt;
  vec4_t backColor;&lt;br /&gt;
  vec4_t borderColor;&lt;br /&gt;
  vec4_t outlineColor;&lt;br /&gt;
  vec4_t disableColor;&lt;br /&gt;
  Material *background;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
typedef windowDef_t Window;&lt;br /&gt;
&lt;br /&gt;
struct itemDef_s &lt;br /&gt;
{&lt;br /&gt;
  Window window;&lt;br /&gt;
#ifndef PC&lt;br /&gt;
  Rectangle textRect[4];&lt;br /&gt;
#else&lt;br /&gt;
  Rectangle textRect[1];&lt;br /&gt;
#endif&lt;br /&gt;
  int type;&lt;br /&gt;
  int dataType;&lt;br /&gt;
  int align;&lt;br /&gt;
  int fontEnum;&lt;br /&gt;
  int textAlignMode;&lt;br /&gt;
  float textAlignX;&lt;br /&gt;
  float textAlignY;&lt;br /&gt;
  float textScale;&lt;br /&gt;
  int textStyle;&lt;br /&gt;
  int gameMsgWindowIndex;&lt;br /&gt;
  int gameMsgWindowMode;&lt;br /&gt;
  const char *text;&lt;br /&gt;
  int textSaveGameInfo;&lt;br /&gt;
  menuDef_t *parent;&lt;br /&gt;
  MenuEventHandlerSet *mouseEnterText;&lt;br /&gt;
  MenuEventHandlerSet *mouseExitText;&lt;br /&gt;
  MenuEventHandlerSet *mouseEnter;&lt;br /&gt;
  MenuEventHandlerSet *mouseExit;&lt;br /&gt;
  MenuEventHandlerSet *action;&lt;br /&gt;
  MenuEventHandlerSet *accept;&lt;br /&gt;
  MenuEventHandlerSet *onFocus;&lt;br /&gt;
  MenuEventHandlerSet *leaveFocus;&lt;br /&gt;
  const char *dvar;&lt;br /&gt;
  const char *dvarTest;&lt;br /&gt;
  ItemKeyHandler *onKey;&lt;br /&gt;
  const char *enableDvar;&lt;br /&gt;
  int dvarFlags;&lt;br /&gt;
  snd_alias_list_t *focusSound;&lt;br /&gt;
  float special;&lt;br /&gt;
#ifndef PC&lt;br /&gt;
  int cursorPos[4];&lt;br /&gt;
#else&lt;br /&gt;
  int cursorPos[1];&lt;br /&gt;
#endif&lt;br /&gt;
  itemDefData_t typeData;&lt;br /&gt;
  int imageTrack;&lt;br /&gt;
  int floatExpressionCount;&lt;br /&gt;
  ItemFloatExpression *floatExpressions;&lt;br /&gt;
  Statement_s *visibleExp;&lt;br /&gt;
  Statement_s *disabledExp;&lt;br /&gt;
  Statement_s *textExp;&lt;br /&gt;
  Statement_s *materialExp;&lt;br /&gt;
  vec4_t glowColor;&lt;br /&gt;
  bool decayActive;&lt;br /&gt;
  int fxBirthTime;&lt;br /&gt;
  int fxLetterTime;&lt;br /&gt;
  int fxDecayStartTime;&lt;br /&gt;
  int fxDecayDuration;&lt;br /&gt;
  int lastSoundPlayedTime;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct StaticDvar&lt;br /&gt;
{&lt;br /&gt;
  dvar_s *dvar;&lt;br /&gt;
  const char *dvarName;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct StaticDvarList&lt;br /&gt;
{&lt;br /&gt;
  int numStaticDvars;&lt;br /&gt;
  StaticDvar **staticDvars;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct UIFunctionList&lt;br /&gt;
{&lt;br /&gt;
  int totalFunctions;&lt;br /&gt;
  Statement_s **functions;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct StringList&lt;br /&gt;
{&lt;br /&gt;
  int totalStrings;&lt;br /&gt;
  const char **strings;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct ExpressionSupportingData&lt;br /&gt;
{&lt;br /&gt;
  UIFunctionList uifunctions;&lt;br /&gt;
  StaticDvarList staticDvarList;&lt;br /&gt;
  StringList uiStrings;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum transitionType&lt;br /&gt;
{&lt;br /&gt;
  TRANS_INACTIVE = 0x0,&lt;br /&gt;
  TRANS_LERP = 0x1,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
enum triggerType&lt;br /&gt;
{&lt;br /&gt;
  TRIGGER_NONE = 0x0,&lt;br /&gt;
  TRIGGER_CLOSEMENU = 0x1,&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct menuTransition&lt;br /&gt;
{&lt;br /&gt;
  transitionType transitionType;&lt;br /&gt;
  int startTime;&lt;br /&gt;
  float startVal;&lt;br /&gt;
  float endVal;&lt;br /&gt;
  float time;&lt;br /&gt;
  triggerType endTriggerType;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
struct menuDef_t &lt;br /&gt;
{&lt;br /&gt;
  Window window;&lt;br /&gt;
  const char *font;&lt;br /&gt;
  int fullscreen;&lt;br /&gt;
  int itemCount;&lt;br /&gt;
  int fontIndex;&lt;br /&gt;
#ifndef PC&lt;br /&gt;
  int cursorItems[4];&lt;br /&gt;
#else&lt;br /&gt;
  int cursorItems[1];&lt;br /&gt;
#endif&lt;br /&gt;
  int fadeCycle;&lt;br /&gt;
  float fadeClamp;&lt;br /&gt;
  float fadeAmount;&lt;br /&gt;
  float fadeInAmount;&lt;br /&gt;
  float blurRadius;&lt;br /&gt;
  MenuEventHandlerSet *onOpen;&lt;br /&gt;
  MenuEventHandlerSet *onRequestClose;&lt;br /&gt;
  MenuEventHandlerSet *onClose;&lt;br /&gt;
  MenuEventHandlerSet *onEsc;&lt;br /&gt;
  ItemKeyHandler *execKeys;&lt;br /&gt;
  Statement_s *visibleExp;&lt;br /&gt;
  const char *allowedBinding;&lt;br /&gt;
  const char *soundName;&lt;br /&gt;
  int imageTrack;&lt;br /&gt;
  vec4_t focusColor;&lt;br /&gt;
  Statement_s *rectXExp;&lt;br /&gt;
  Statement_s *rectYExp;&lt;br /&gt;
  Statement_s *rectHExp;&lt;br /&gt;
  Statement_s *rectWExp; &lt;br /&gt;
#ifdef PC&lt;br /&gt;
  Statement_s *openSoundExp;&lt;br /&gt;
  Statement_s *closeSoundExp;&lt;br /&gt;
#endif&lt;br /&gt;
  itemDef_s **items; &lt;br /&gt;
#ifndef PC&lt;br /&gt;
  menuTransition scaleTransition[4];&lt;br /&gt;
  menuTransition alphaTransition[4];&lt;br /&gt;
  menuTransition xTransition[4];&lt;br /&gt;
  menuTransition yTransition[4];&lt;br /&gt;
#else&lt;br /&gt;
  char unknown[112];&lt;br /&gt;
#endif&lt;br /&gt;
  ExpressionSupportingData *expressionData;&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:FastFiles&amp;diff=1045</id>
		<title>Category:FastFiles</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:FastFiles&amp;diff=1045"/>
		<updated>2026-06-12T02:01:44Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;FastFiles are the CoD engine&#039;s way of storing Zone files. FastFiles (FFs) almost always have some sort of RSA2048 signature, a zlib compression along the way, and then on later CoDs some encryption. The Zones are a library of [[:Category:Assets|assets]]. Every FF in every CoD game starts the same way...&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Magic || 0x0 || char[8] || &amp;quot;IWffu100&amp;quot; for unsigned fastfiles, &amp;quot;IWff0100&amp;quot; for signed fastfiles, &amp;quot;TAff0100&amp;quot; for treyarch&#039;s Black Ops 2 fastfile, and &amp;quot;S1ff0100&amp;quot; for Sledgehammer Advanced Warfare fastfiles.&lt;br /&gt;
|-&lt;br /&gt;
| Version || 0x8 || int || See below.&lt;br /&gt;
|}&lt;br /&gt;
So by reading the version of the input FF, you can tell what system and game the FF is from. Note that pre-alpha versions of Call of Duty 4 are missing the version integer, and must be handled specially. Also keep in mind that the Quantum of Solace FFs are missing the magic in the struct above. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| XFILE_VERSION || &#039;&#039;&#039;007:QoS&#039;&#039;&#039; ||&#039;&#039;&#039;CoD4&#039;&#039;&#039;||&#039;&#039;&#039;WaW&#039;&#039;&#039;||&#039;&#039;&#039;MW2&#039;&#039;&#039;||&#039;&#039;&#039;BO1&#039;&#039;&#039;||&#039;&#039;&#039;MW3&#039;&#039;&#039;||&#039;&#039;&#039;BO2&#039;&#039;&#039;||&#039;&#039;&#039;Ghosts&#039;&#039;&#039;||&#039;&#039;&#039;CoD: Online&#039;&#039;&#039;||&#039;&#039;&#039;Advanced Warfare&#039;&#039;&#039;||&#039;&#039;&#039;BO3 Beta&#039;&#039;&#039;||&#039;&#039;&#039;BO3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Xbox 360||0x1D6||0x1||0x183||0x10D||0x1D9||0x70||0x92||0x22E||n/a||0x72E||n/a||0x253&lt;br /&gt;
|-&lt;br /&gt;
|Playstation 3||0x1D6||0x1||0x183||0x10D||0x1D9||0x70||0x92||0x22E||n/a||0x72E||n/a||0x25E&lt;br /&gt;
|-&lt;br /&gt;
|Wii/Wii-U||0x1D2||0x1A2||0x19B||n/a||0x1DD||0x6B||0x94||0x22E||n/a||n/a||n/a||n/a&lt;br /&gt;
|-&lt;br /&gt;
|PC||0x1D6||0x5||0x183||0x114||0x1D9||0x1||0x93||0x135||0x13C||0x72E||0x1FB||n/a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Stream Blocks ==&lt;br /&gt;
After the Zone (XFile) is extracted from the fastfile, you read the block sizes of each g_streamBlock allocation. This determines how much memory to allocate to each stream to read data into. Each block stream has a specific role in the data that is read and it goes as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|  ||&#039;&#039;&#039;Temp&#039;&#039;&#039;||&#039;&#039;&#039;Physical&#039;&#039;&#039;||&#039;&#039;&#039;Runtime&#039;&#039;&#039;||&#039;&#039;&#039;Virtual&#039;&#039;&#039;||&#039;&#039;&#039;Large&#039;&#039;&#039;||&#039;&#039;&#039;Callback&#039;&#039;&#039;||&#039;&#039;&#039;Vertex&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Purpose||Asset Pool Headers, Counts, Root Pointers||Sound Data||??||PC uses this for loading assets||Strings and Data Chunks (rawfiles)||Used in some loader methods||Material and Image data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
One distinction is that PC uses virtual for a load of loading where PS3 mainly uses large.&lt;br /&gt;
&lt;br /&gt;
Stream blocks exist within a stack, when a loader is using a block, it pops the requested block onto the stack, reads data into it, then when complete, pops that block off the stack, and returns to the previous block at the block stream cursor position.&lt;br /&gt;
&lt;br /&gt;
== Pointers in Zone Files ==&lt;br /&gt;
Pointers can be classified as one of the following:&lt;br /&gt;
* &amp;lt;code&amp;gt; 0 &amp;lt;/code&amp;gt;: null, no data follows&lt;br /&gt;
* &amp;lt;code&amp;gt; -1 &amp;lt;/code&amp;gt;: inline, data follows after the struct, usually in order but &#039;&#039;&#039;NOT ALWAYS&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt; -2 &amp;lt;/code&amp;gt;: insert, space is allocated in the stream block and inserted into later&lt;br /&gt;
* &amp;lt;code&amp;gt; else &amp;lt;/code&amp;gt;: everything else is an encoded offset, it contains which block and offset it&#039;s pointing too.&lt;br /&gt;
&lt;br /&gt;
Pointers have different types as well, depending on the type the data is loaded differently.&lt;br /&gt;
* &amp;lt;code&amp;gt; Direct &amp;lt;/code&amp;gt;: It points directly to data, such as char*, int*, itemDef_t*&lt;br /&gt;
* &amp;lt;code&amp;gt; Alias &amp;lt;/code&amp;gt;: It pointers to shared assets, such as Material*&lt;br /&gt;
&lt;br /&gt;
For encoded offsets the first 4 bits (or 3 bits in BO2) are extracted and used as an index for the g_streamBlocks array. The other bits are the offset and is added to the data pointer in g_streamBlocks. &lt;br /&gt;
&lt;br /&gt;
=== Encoding ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int EncodeOffset(int blockIndex, int offset)&lt;br /&gt;
{&lt;br /&gt;
    return (blockIndex &amp;lt;&amp;lt; 28) | (offset + 1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Decoding ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XBlockAddress DecodeOffset(int value)&lt;br /&gt;
{&lt;br /&gt;
    int block = (XFILE_BLOCK)(value &amp;gt;&amp;gt; 28);&lt;br /&gt;
    int offset = (int)(value &amp;amp; 0x0FFFFFFF) - 1;&lt;br /&gt;
&lt;br /&gt;
    return new XBlockAddress(block, offset);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example a pointer with a value of &amp;lt;code&amp;gt; 0x40001689 &amp;lt;/code&amp;gt; means that the data belongs in block stream &amp;lt;code&amp;gt; 4 (large) &amp;lt;/code&amp;gt; at offset &amp;lt;code&amp;gt; 0x1688 &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The offset is only correct after the zone file has been loaded into the respective g_streamBlocks/memory. This is because data gets loaded into different blocks depending on how each executable loader works. In addition, data is aligned based on data type.&lt;br /&gt;
&lt;br /&gt;
=== Padding Rules ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|  ||&#039;&#039;&#039;XStruct&#039;&#039;&#039;||&#039;&#039;&#039;Pointers&#039;&#039;&#039;||&#039;&#039;&#039;Byte&#039;&#039;&#039;||&#039;&#039;&#039;Bool&#039;&#039;&#039;||&#039;&#039;&#039;int16/uint16&#039;&#039;&#039;||&#039;&#039;&#039;Default&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Byte Alignment||4||4||1||1||2||4&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:FastFiles&amp;diff=1044</id>
		<title>Category:FastFiles</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:FastFiles&amp;diff=1044"/>
		<updated>2026-06-12T01:57:21Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Stream Blocks */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;FastFiles are the CoD engine&#039;s way of storing Zone files. FastFiles (FFs) almost always have some sort of RSA2048 signature, a zlib compression along the way, and then on later CoDs some encryption. The Zones are a library of [[:Category:Assets|assets]]. Every FF in every CoD game starts the same way...&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Magic || 0x0 || char[8] || &amp;quot;IWffu100&amp;quot; for unsigned fastfiles, &amp;quot;IWff0100&amp;quot; for signed fastfiles, &amp;quot;TAff0100&amp;quot; for treyarch&#039;s Black Ops 2 fastfile, and &amp;quot;S1ff0100&amp;quot; for Sledgehammer Advanced Warfare fastfiles.&lt;br /&gt;
|-&lt;br /&gt;
| Version || 0x8 || int || See below.&lt;br /&gt;
|}&lt;br /&gt;
So by reading the version of the input FF, you can tell what system and game the FF is from. Note that pre-alpha versions of Call of Duty 4 are missing the version integer, and must be handled specially. Also keep in mind that the Quantum of Solace FFs are missing the magic in the struct above. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| XFILE_VERSION || &#039;&#039;&#039;007:QoS&#039;&#039;&#039; ||&#039;&#039;&#039;CoD4&#039;&#039;&#039;||&#039;&#039;&#039;WaW&#039;&#039;&#039;||&#039;&#039;&#039;MW2&#039;&#039;&#039;||&#039;&#039;&#039;BO1&#039;&#039;&#039;||&#039;&#039;&#039;MW3&#039;&#039;&#039;||&#039;&#039;&#039;BO2&#039;&#039;&#039;||&#039;&#039;&#039;Ghosts&#039;&#039;&#039;||&#039;&#039;&#039;CoD: Online&#039;&#039;&#039;||&#039;&#039;&#039;Advanced Warfare&#039;&#039;&#039;||&#039;&#039;&#039;BO3 Beta&#039;&#039;&#039;||&#039;&#039;&#039;BO3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Xbox 360||0x1D6||0x1||0x183||0x10D||0x1D9||0x70||0x92||0x22E||n/a||0x72E||n/a||0x253&lt;br /&gt;
|-&lt;br /&gt;
|Playstation 3||0x1D6||0x1||0x183||0x10D||0x1D9||0x70||0x92||0x22E||n/a||0x72E||n/a||0x25E&lt;br /&gt;
|-&lt;br /&gt;
|Wii/Wii-U||0x1D2||0x1A2||0x19B||n/a||0x1DD||0x6B||0x94||0x22E||n/a||n/a||n/a||n/a&lt;br /&gt;
|-&lt;br /&gt;
|PC||0x1D6||0x5||0x183||0x114||0x1D9||0x1||0x93||0x135||0x13C||0x72E||0x1FB||n/a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Stream Blocks ==&lt;br /&gt;
After the Zone (XFile) is extracted from the fastfile, you read the block sizes of each g_streamBlock allocation. This determines how much memory to allocate to each stream to read data into. Each block stream has a specific role in the data that is read and it goes as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|  ||&#039;&#039;&#039;Temp&#039;&#039;&#039;||&#039;&#039;&#039;Physical&#039;&#039;&#039;||&#039;&#039;&#039;Runtime&#039;&#039;&#039;||&#039;&#039;&#039;Virtual&#039;&#039;&#039;||&#039;&#039;&#039;Large&#039;&#039;&#039;||&#039;&#039;&#039;Callback&#039;&#039;&#039;||&#039;&#039;&#039;Vertex&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Purpose||Asset Pool Headers, Counts, Root Pointers||Sound Data||??||PC uses this for loading assets||Strings and Data Chunks (rawfiles)||Used in some loader methods||Material and Image data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
One distinction is that PC uses virtual for a load of loading where PS3 mainly uses large.&lt;br /&gt;
&lt;br /&gt;
Stream blocks exist within a stack, when a loader is using a block, it pops the requested block onto the stack, reads data into it, then when complete, pops that block off the stack, and returns to the previous block at the block stream cursor position.&lt;br /&gt;
&lt;br /&gt;
== Pointers in Zone Files ==&lt;br /&gt;
Pointers can be classified as one of the following:&lt;br /&gt;
* &amp;lt;code&amp;gt; 0 &amp;lt;/code&amp;gt;: null, no data follows&lt;br /&gt;
* &amp;lt;code&amp;gt; -1 &amp;lt;/code&amp;gt;: inline, data follows after the struct, usually in order but &#039;&#039;&#039;NOT ALWAYS&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt; -2 &amp;lt;/code&amp;gt;: insert, space is allocated in the stream block and inserted into later&lt;br /&gt;
* &amp;lt;code&amp;gt; else &amp;lt;/code&amp;gt;: everything else is an encoded offset, it contains which block and offset it&#039;s pointing too.&lt;br /&gt;
&lt;br /&gt;
Pointers have different types as well, depending on the type the data is loaded differently.&lt;br /&gt;
* &amp;lt;code&amp;gt; Direct &amp;lt;/code&amp;gt;: It points directly to data, such as char*, int*, itemDef_t*&lt;br /&gt;
* &amp;lt;code&amp;gt; Alias &amp;lt;/code&amp;gt;: It pointers to shared assets, such as Material*&lt;br /&gt;
&lt;br /&gt;
For encoded offsets the first 4 bits (or 3 bits in BO2) are extracted and used as an index for the g_streamBlocks array. The other bits are the offset and is added to the data pointer in g_streamBlocks. &lt;br /&gt;
&lt;br /&gt;
=== Encoding ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int EncodeOffset(int blockIndex, int offset)&lt;br /&gt;
{&lt;br /&gt;
    return (blockIndex &amp;lt;&amp;lt; 28) | (offset + 1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Decoding ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XBlockAddress DecodeOffset(int value)&lt;br /&gt;
{&lt;br /&gt;
    int block = (XFILE_BLOCK)(value &amp;gt;&amp;gt; 28);&lt;br /&gt;
    int offset = (int)(value &amp;amp; 0x0FFFFFFF) - 1;&lt;br /&gt;
&lt;br /&gt;
    return new XBlockAddress(block, offset);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example a pointer with a value of &amp;lt;code&amp;gt; 0x40001689 &amp;lt;/code&amp;gt; means that the data belongs in block stream &amp;lt;code&amp;gt; 4 (large) &amp;lt;/code&amp;gt; at offset &amp;lt;code&amp;gt; 0x1688 &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The offset is only correct after the zone file has been loaded into the respective g_streamBlocks/memory. This is because data gets loaded into different blocks depending on how each executable loader works. In addition, data is aligned based on data type.&lt;br /&gt;
&lt;br /&gt;
=== Padding Rules ===&lt;br /&gt;
&amp;lt;code&amp;gt; to do &amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
	<entry>
		<id>https://codresearch.dev/index.php?title=Category:FastFiles&amp;diff=1043</id>
		<title>Category:FastFiles</title>
		<link rel="alternate" type="text/html" href="https://codresearch.dev/index.php?title=Category:FastFiles&amp;diff=1043"/>
		<updated>2026-06-12T01:54:19Z</updated>

		<summary type="html">&lt;p&gt;Jakes625: /* Pointers in Zone Files */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;FastFiles are the CoD engine&#039;s way of storing Zone files. FastFiles (FFs) almost always have some sort of RSA2048 signature, a zlib compression along the way, and then on later CoDs some encryption. The Zones are a library of [[:Category:Assets|assets]]. Every FF in every CoD game starts the same way...&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name !! Offset !! Type !! Description&lt;br /&gt;
|-&lt;br /&gt;
| Magic || 0x0 || char[8] || &amp;quot;IWffu100&amp;quot; for unsigned fastfiles, &amp;quot;IWff0100&amp;quot; for signed fastfiles, &amp;quot;TAff0100&amp;quot; for treyarch&#039;s Black Ops 2 fastfile, and &amp;quot;S1ff0100&amp;quot; for Sledgehammer Advanced Warfare fastfiles.&lt;br /&gt;
|-&lt;br /&gt;
| Version || 0x8 || int || See below.&lt;br /&gt;
|}&lt;br /&gt;
So by reading the version of the input FF, you can tell what system and game the FF is from. Note that pre-alpha versions of Call of Duty 4 are missing the version integer, and must be handled specially. Also keep in mind that the Quantum of Solace FFs are missing the magic in the struct above. &lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
| XFILE_VERSION || &#039;&#039;&#039;007:QoS&#039;&#039;&#039; ||&#039;&#039;&#039;CoD4&#039;&#039;&#039;||&#039;&#039;&#039;WaW&#039;&#039;&#039;||&#039;&#039;&#039;MW2&#039;&#039;&#039;||&#039;&#039;&#039;BO1&#039;&#039;&#039;||&#039;&#039;&#039;MW3&#039;&#039;&#039;||&#039;&#039;&#039;BO2&#039;&#039;&#039;||&#039;&#039;&#039;Ghosts&#039;&#039;&#039;||&#039;&#039;&#039;CoD: Online&#039;&#039;&#039;||&#039;&#039;&#039;Advanced Warfare&#039;&#039;&#039;||&#039;&#039;&#039;BO3 Beta&#039;&#039;&#039;||&#039;&#039;&#039;BO3&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Xbox 360||0x1D6||0x1||0x183||0x10D||0x1D9||0x70||0x92||0x22E||n/a||0x72E||n/a||0x253&lt;br /&gt;
|-&lt;br /&gt;
|Playstation 3||0x1D6||0x1||0x183||0x10D||0x1D9||0x70||0x92||0x22E||n/a||0x72E||n/a||0x25E&lt;br /&gt;
|-&lt;br /&gt;
|Wii/Wii-U||0x1D2||0x1A2||0x19B||n/a||0x1DD||0x6B||0x94||0x22E||n/a||n/a||n/a||n/a&lt;br /&gt;
|-&lt;br /&gt;
|PC||0x1D6||0x5||0x183||0x114||0x1D9||0x1||0x93||0x135||0x13C||0x72E||0x1FB||n/a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Stream Blocks ==&lt;br /&gt;
After the Zone (XFile) is extracted from the fastfile, you read the block sizes of each g_streamBlock allocation. This determines how much memory to allocate to each stream to read data into. Each block stream has a specific role in the data that is read and it goes as follows:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|  ||&#039;&#039;&#039;Temp&#039;&#039;&#039;||&#039;&#039;&#039;Physical&#039;&#039;&#039;||&#039;&#039;&#039;Runtime&#039;&#039;&#039;||&#039;&#039;&#039;Virtual&#039;&#039;&#039;||&#039;&#039;&#039;Large&#039;&#039;&#039;||&#039;&#039;&#039;Callback&#039;&#039;&#039;||&#039;&#039;&#039;Vertex&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|Purpose||Asset Pool Headers, Counts, Root Pointers||Sound Data||??||PC uses this for loading assets||Strings and Data Chunks (rawfiles)||Used in some loader methods||Material and Image data&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
One distinction is that PC uses virtual for a load of loading where PS3 mainly uses large.&lt;br /&gt;
&lt;br /&gt;
== Pointers in Zone Files ==&lt;br /&gt;
Pointers can be classified as one of the following:&lt;br /&gt;
* &amp;lt;code&amp;gt; 0 &amp;lt;/code&amp;gt;: null, no data follows&lt;br /&gt;
* &amp;lt;code&amp;gt; -1 &amp;lt;/code&amp;gt;: inline, data follows after the struct, usually in order but &#039;&#039;&#039;NOT ALWAYS&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt; -2 &amp;lt;/code&amp;gt;: insert, space is allocated in the stream block and inserted into later&lt;br /&gt;
* &amp;lt;code&amp;gt; else &amp;lt;/code&amp;gt;: everything else is an encoded offset, it contains which block and offset it&#039;s pointing too.&lt;br /&gt;
&lt;br /&gt;
Pointers have different types as well, depending on the type the data is loaded differently.&lt;br /&gt;
* &amp;lt;code&amp;gt; Direct &amp;lt;/code&amp;gt;: It points directly to data, such as char*, int*, itemDef_t*&lt;br /&gt;
* &amp;lt;code&amp;gt; Alias &amp;lt;/code&amp;gt;: It pointers to shared assets, such as Material*&lt;br /&gt;
&lt;br /&gt;
For encoded offsets the first 4 bits (or 3 bits in BO2) are extracted and used as an index for the g_streamBlocks array. The other bits are the offset and is added to the data pointer in g_streamBlocks. &lt;br /&gt;
&lt;br /&gt;
=== Encoding ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int EncodeOffset(int blockIndex, int offset)&lt;br /&gt;
{&lt;br /&gt;
    return (blockIndex &amp;lt;&amp;lt; 28) | (offset + 1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Decoding ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
XBlockAddress DecodeOffset(int value)&lt;br /&gt;
{&lt;br /&gt;
    int block = (XFILE_BLOCK)(value &amp;gt;&amp;gt; 28);&lt;br /&gt;
    int offset = (int)(value &amp;amp; 0x0FFFFFFF) - 1;&lt;br /&gt;
&lt;br /&gt;
    return new XBlockAddress(block, offset);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For example a pointer with a value of &amp;lt;code&amp;gt; 0x40001689 &amp;lt;/code&amp;gt; means that the data belongs in block stream &amp;lt;code&amp;gt; 4 (large) &amp;lt;/code&amp;gt; at offset &amp;lt;code&amp;gt; 0x1688 &amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The offset is only correct after the zone file has been loaded into the respective g_streamBlocks/memory. This is because data gets loaded into different blocks depending on how each executable loader works. In addition, data is aligned based on data type.&lt;br /&gt;
&lt;br /&gt;
=== Padding Rules ===&lt;br /&gt;
&amp;lt;code&amp;gt; to do &amp;lt;/code&amp;gt;&lt;/div&gt;</summary>
		<author><name>Jakes625</name></author>
	</entry>
</feed>