Skip to main content

Mirror's Edge / Catalyst — Frostbite Asset & Audio Pipeline

Source: XeNTaX forum knowledge extraction (2008–2017). Covers original Mirror's Edge (UE3, 2008) and Mirror's Edge: Catalyst (Frostbite, 2016). Catalyst threads contain the technically valuable content.


1. Mirror's Edge: Catalyst — Frostbite Engine Asset Pipeline​

Catalyst uses Frostbite engine (Frostbite 3 lineage, same family as Battlefield 4/Hardline and Star Wars Battlefront). Audio and assets packed in shared Frostbite bundle/chunk model — community Battlefield / Star Wars Battlefront dumpers work with minor edits.

Frostbite Asset Model (as used by Catalyst)​

ComponentDescription
.bundlesContainer files holding game resources
.chunkRaw resource blobs; filenames NOT meaningful. Resource names live in EBX metadata files, not chunk names
EBXObject/type metadata database. Each sound/mesh/etc. described by an EBX file referencing chunk data by hash/GUID

"Names are in EBX files. That's OK." — daemon1, 2016-04-25

Chunks with no proper filenames are expected — you map them back through EBX.

Dumper / Decoder Workflow​

Working pipeline for Catalyst beta (2016):

  1. Extract bundles → chunks using Battlefield 4 / Star Wars Battlefront dumper scripts (bf4dumper.py, sw_dumper.py). Community-edited swbf_me-c_edit version adapted specifically for Mirror's Edge Catalyst.
  2. Decode audio with fb3decoder.py (Frostbite 3 audio decoder). Walks .ebx files, finds audio chunks, writes decoded .wav using ealayer3 tool for EALayer3 codec (EA-proprietary MPEG layer-3 variant).

Required Script Edits (brendan19, 2016-04-26)​

# sw_dumper.py
targetDirectory = r"<THE DIRECTORY WHERE YOU WANT THE FILES TO EXTRACT TO>"

# fb3decoder.py
dumpDirectory = r"<THE DIRECTORY WHERE YOU EXTRACTED YOUR FILES>"
targetDirectory = r"<THE DIRECTORY WHERE YOU WANT THE DECODED .WAV FILES PLACED>"
# Download Zench's ealayer3 tool so the script can handle EALayer3:
ealayer3Path = r"<THE DIRECTORY THAT HAS THE EALAYER3 TOOL>\ealayer3.exe"

ealayer3 Tool Note​

  • Zench's ealayer3 extracts multi-file chunks incorrectly — e.g., chunk with 5 sounds produces 15 files, 10 duplicates
  • daemon1's updated ealayer3 fixes this

Frostbite EBX numDict (Field Type Lookup Table)​

fb3decoder.py decodes EBX fields via numDict mapping 16-bit type codes to Python struct format chars:

CodeStructMeaning
0xC12DQuint64 (8 bytes)
0xC0CDBuint8 (1 byte)
0x0035Iuint32 (4 bytes)
0xC10DIuint32 (4 bytes)
0xC14Dddouble (8 bytes)
0xC0AD?bool (1 byte)
0xC0FDiint32 (4 bytes)
0xC0BDbint8 (1 byte)
0xC0EDhint16 (2 bytes)
0xC0DDHuint16 (2 bytes)
0xC13Dffloat (4 bytes)

Gotcha: Newer patches introduce field types absent from table. User hit KeyError: 49437 (0xC11D) decoding non-audio EBX — code not in dict. daemon1's guidance: new type unrelated to audio, safely delete non-audio EBX folders and rerun.

Community guess for 0xC11D: ("q", 8) — int64 (8 bytes) (low-confidence).

Practice Notes​

  • Full beta extraction yielded ~28.5 GB across /bundles and /chunks
  • Successfully decoded named SFX from initial package; then full cat/cas pair set

2. Mirror's Edge (Original, 2008) — Textures​

Original game uses UE3. Texture ripping via:

  • Ninja Ripper (D3D runtime ripper)
  • Texmod (D3D runtime ripper)

No native texture container RE documented in XeNTaX dump.


3. Tools Reference​

ToolPurposeNotes
bf4dumper.py / sw_dumper.pyBF4 / SWBF Frostbite bundle→chunk dumpers
swbf_me-c_editCommunity-edited SWBF dumper for ME Catalyst
fb3decoder.pyFrostbite 3 audio decoder (walks EBX, writes .wav)
ealayer3 (Zench / daemon1)EALayer3 codec decoder; daemon1's version fixes multi-file chunks
Ninja RipperD3D texture ripper (original ME)
TexmodD3D texture ripper (original ME)

Key Facts​

  • Catalyst = Frostbite 3 (same family as BF4, SWBF) → existing dumpers work with edits
  • Bundle/Chunk/EBX model: names in EBX, not chunk filenames
  • Audio = EALayer3 (EA-proprietary MPEG layer-3)
  • EBX numDict field types: 11 known codes (uint64/uint8/uint32/double/bool/int32/int8/int16/uint16/float)
  • New patches may add unknown field types → delete non-audio EBX folders to bypass
  • Original ME (UE3): textures via Ninja Ripper / Texmod only

4. Frostbite Engine (Cross-Game Reference)​

Reserved section — Frostbite asset pipeline applies to Catalyst, NFS 2016+, and other EA titles using Frostbite 3/4.

Games Using Frostbite​

TitleYearEngineStatus
Mirror's Edge: Catalyst2016Frostbite 3See §1
Need for Speed (2016)2016Frostbite 3XeNTaX extraction confirmed
Need for Speed Payback2017Frostbite 3Bundle/chunk model
Need for Speed Heat2019Frostbite 4Same pipeline
Need for Speed Unbound2022Frostbite 4Same pipeline
Battlefield 42013Frostbite 3Original dumper source
Star Wars Battlefront2015Frostbite 3sw_dumper.py source

Tool Embeds​

bf4dumper.py / sw_dumper.py — Frostbite bundle→chunk dumpers
# Frostbite bundle→chunk dumper
# Usage: Edit targetDirectory below, then run
# Works with BF4, SWBF, ME Catalyst, NFS 2016+

targetDirectory = r"<EXTRACT TO HERE>"

Source: XeNTaX forums

fb3decoder.py — Frostbite 3 audio decoder (EBX → .wav)
# Frostbite 3 audio decoder
# Walks .ebx files, finds audio chunks, writes decoded .wav

dumpDirectory = r"<EXTRACTED FILES DIR>"
targetDirectory = r"<OUTPUT .WAV DIR>"
ealayer3Path = r"<EALAYER3 TOOL DIR>\ealayer3.exe"

Source: XeNTaX forums

ealayer3 — EALayer3 codec decoder (EA-proprietary MPEG layer-3)

EALayer3 is EA's proprietary MPEG layer-3 variant used in Frostbite games.

  • Zench's version: Original decoder. Extracts multi-file chunks incorrectly (5 sounds → 15 files, 10 duplicates).
  • daemon1's version: Fixes multi-file chunk extraction. Use this one.

Source: XeNTaX forums

swbf_me-c_edit — Community-edited SWBF dumper for ME Catalyst

Modified version of sw_dumper.py adapted specifically for Mirror's Edge Catalyst's bundle structure.

# swbf_me-c_edit — ME Catalyst specific dumper
# Same usage as sw_dumper.py but handles Catalyst's bundle layout

Source: XeNTaX forums