Home - thethiny/NRS-Asset-Manager GitHub Wiki

NRS Asset Manager

A Python toolkit for extracting and parsing game assets from NetherRealm Studios titles built on the custom UE3-based Midway engine.

Supported Games

Game Codename Engine Ver Compression External Data Status
Injustice 2 (2017) DCF2 732 Oodle v4 .tfc (Texture File Cache) Full extraction
Mortal Kombat 11 (2019) MK11 769 Oodle v5 .psf (Package Script File) Full extraction

Quick Start

# Auto-detects game from file header and version
python main.py extract path/to/file.xxx

# Display file header (game, version, tables, compression)
python main.py header path/to/file.xxx

# List exports, imports, or names (or all three)
python main.py list path/to/file.xxx --exports
python main.py list path/to/file.xxx --imports
python main.py list path/to/file.xxx --names

# Extract a specific export by glob or regex
python main.py export path/to/file.xxx --name "*Body_Color*"
python main.py export path/to/file.xxx --name "Batman.*Texture" --regex

# Extract raw data (no handler processing)
python main.py export path/to/file.xxx --name "*.SkeletalMesh" --raw

# Create decompressed Midway UPK only
python main.py midway path/to/file.xxx --output out/

# Dump all raw exports
python main.py extract-all path/to/file.xxx

# Extract external bulk data (TFC/PSF)
python main.py bulk path/to/file.xxx

See Extraction Pipeline for the full architecture and How to Expand for adding new game support.

Extraction Pipeline

All NRS games follow the same three-stage pipeline:

.xxx (Compressed Archive)
  β†’ Midway Format (Decompressed UPK)
    β†’ Exports (Individual game objects)
      → Handlers (Database→JSON, Texture2D→DDS/PNG, etc.)

See Extraction Pipeline for details.

Project Structure

mk_utils/
β”œβ”€β”€ nrs/
β”‚   β”œβ”€β”€ ue3_common.py          # Shared base classes (GUID, ClassHandler, FileReader)
β”‚   β”œβ”€β”€ compression/           # Oodle v4/v5 DLL wrappers
β”‚   β”œβ”€β”€ localization_parser.py # Coalesced AES decryption (shared across all games)
β”‚   └── <game>/                # Per-game implementation (mk11/, ij2/, ...)
β”‚       β”œβ”€β”€ ue3_common.py      # Structs (header, tables, archive base)
β”‚       β”œβ”€β”€ archive.py         # UE3Asset (.xxx parser + midway builder)
β”‚       β”œβ”€β”€ midway.py          # MidwayAsset (table parsing, export reading)
β”‚       β”œβ”€β”€ ue3_properties.py  # UE3 property deserializer
β”‚       β”œβ”€β”€ enums.py           # Game-specific enums
β”‚       └── class_handlers/    # Export processors (Databaseβ†’JSON, Texture2Dβ†’DDS/PNG)
β”œβ”€β”€ scripts/
β”‚   └── <game>_extractors.py   # Per-game extraction entry point
└── utils/
    β”œβ”€β”€ filereader.py          # Memory-mapped file I/O
    └── structs.py             # ctypes binary struct wrapper

Documentation

⚠️ **GitHub.com Fallback** ⚠️