11 KiB
StarCraft Asset Organization Guide
This document describes the organization and structure of assets extracted from Starcraft.mpq for use with alternative game engines.
Directory Structure
After extraction, assets are organized into the following categories:
assets/
├── audio/ # Sound effects, music, voice lines
├── graphics/ # Sprites, tiles, images
├── video/ # Cinematics and video files
├── data/ # Game data tables and binary files
├── maps/ # Map files
├── fonts/ # Font definitions
├── text/ # String tables and text files
├── scripts/ # AI and scripting files
└── unknown/ # Unclassified or unknown file types
Asset Categories
🔊 Audio (audio/)
File Types: .wav, .ogg, .mp3
Contains all audio assets including:
- Sound Effects: Unit sounds, weapon sounds, UI feedback
- Music: Background music tracks
- Voice Lines: Unit acknowledgments, mission briefings
- Ambient Sounds: Environmental audio
Format Notes:
- Most audio files are in WAV format (PCM or compressed)
- Some files may use proprietary Blizzard compression
- Sample rates vary (typically 22050 Hz or 44100 Hz)
Common Patterns:
File000*.wav- Sound effect files (numbered)- Files with size=0 in metadata still contain valid audio data
🎨 Graphics (graphics/)
File Types: .pcx, .grp, .dds, .tga, .bmp
Contains visual assets:
-
PCX Files: Image files (256-color palette-based)
- UI elements
- Menu backgrounds
- Portraits
- Loading screens
-
GRP Files: Sprite/graphic files (proprietary format)
- Unit sprites
- Building sprites
- Effects and animations
- Terrain tiles
Format Notes:
.pcx- Standard PCX image format (256 colors).grp- Blizzard's proprietary sprite format with frame data- Sprites may contain multiple frames for animations
- Palette information stored separately (
.pal,.wpefiles indata/)
Usage:
- PCX files can be opened with standard image tools
- GRP files require custom parsers or conversion tools
🎬 Video (video/)
File Types: .smk, .bik, .avi
Contains cinematic and video content:
- SMK Files: Smacker video format (older)
- BIK Files: Bink video format (newer)
- Mission briefings
- Campaign cinematics
- Victory/defeat sequences
Format Notes:
- Smacker (.smk) is a legacy video codec
- Requires specific decoders (libsmacker, RAD Game Tools)
- Resolution typically 640x480 or lower
- May include embedded audio
📊 Data (data/)
File Types: .dat, .bin, .pal, .wpe, .cv5, .vf4, .vx4, .vr4
Contains game logic and configuration data:
DAT Files - Database tables:
units.dat- Unit statistics and propertiesweapons.dat- Weapon damage, range, behaviorupgrades.dat- Upgrade definitionstechdata.dat- Technology treesprites.dat- Sprite definitionsimages.dat- Image/animation datasfxdata.dat- Sound effect mappingsorders.dat- Unit order/command definitions
Palette Files:
.pal- Color palette data (256 colors).wpe- Warp/special effect palettes
Tileset Files:
.cv5- Terrain tile definitions.vf4- Tile graphics (4-byte).vx4- Extended tile data.vr4- Terrain rendering data
Format Notes:
- DAT files are binary tables with fixed-width records
- Use tools like PyDAT, DatEdit, or custom parsers
- Palette files define 256 RGB colors (768 bytes)
- Tileset files work together to render terrain
Parsing Libraries:
- Consider using existing SC format parsers:
scbw(Rust)PyMS(Python)BWAPIstructures (C++)
🗺️ Maps (maps/)
File Types: .chk, .scm, .scx
Contains map and scenario files:
- CHK Files: Map scenario data (inside MPQ/SCM/SCX)
- SCM Files: StarCraft Map (single-player)
- SCX Files: StarCraft Expansion Map (Brood War)
Structure:
- Maps are themselves MPQ archives containing:
scenario.chk- Core map data- Trigger definitions
- Unit placement
- Terrain layout
- String tables
Format Sections:
VER- VersionDIM- DimensionsERA- TilesetUNIT- Unit placementsTHG2- TriggersMBRF- Map briefing- And many more...
Tools:
- ScmDraft - Map editor
- PyMS - Python parser
- BWAPI map parsers
🔤 Fonts (fonts/)
File Types: .fnt, .ttf
Font rendering data:
- Bitmap font definitions
- Character glyph data
- Font metrics and kerning
Format:
- Custom bitmap font format
- Contains character width, height, offset data
- Pre-rendered glyphs for each character
📝 Text (text/)
File Types: .txt, .tbl, .rtf
String tables and localized text:
- TBL Files: String table format
- UI text
- Unit names
- Campaign dialogue
- Error messages
Format:
- Binary format with string offsets
- Null-terminated strings
- String IDs referenced by game code
- Localization support (different files per language)
Common Files:
stat_txt.tbl- Main string table- Mission briefing strings
- Campaign storyline text
🤖 Scripts (scripts/)
File Types: .ais, .aiscript, .ai
AI and scripting files:
- AI behavior scripts
- Build orders
- Unit micro commands
- Campaign AI definitions
Format:
- Text-based scripts (in some cases)
- Binary AI bytecode (in others)
- References units, buildings, and actions from DAT files
❓ Unknown (unknown/)
Files that couldn't be automatically categorized:
- Files with
.xxxextension (placeholder) - Files without extensions
- Unknown or proprietary formats
Common Cases:
- Temporary files
- Internal debug data
- Encrypted or packed data
- Format unknown without reverse engineering
File Naming Conventions
Numbered Files
Many files use numeric naming patterns:
These numbers typically correspond to:
- Internal asset IDs
- References in DAT files (e.g.,
images.datrow 123) - Sound ID mappings in
sfxdata.dat
Structured Paths
Some files maintain directory structure:
glue/PalNl/- UI palette filesunit/- Unit-related assetsrez/- Resources
Preserve these paths as they often indicate asset relationships.
Integration Guide
For Game Engine Developers
-
Start with Data Files:
- Parse
units.dat,weapons.datto understand game entities - Build a data model based on DAT structure
- Reference existing parsers for format details
- Parse
-
Load Graphics:
- Convert PCX to your engine's format (PNG, DDS, etc.)
- Write GRP parser for sprite data
- Extract frame information for animations
- Load palettes from PAL/WPE files
-
Audio System:
- Convert WAV files to your preferred format
- Build sound effect mapping from
sfxdata.dat - Implement audio triggers based on game events
-
Map Loading:
- Parse CHK format for map data
- Extract tileset references
- Load unit placements
- Implement trigger system
-
Rendering Pipeline:
- Use tileset data (CV5, VF4, VX4, VR4) for terrain
- Render sprites from GRP files
- Apply palette effects
- Implement proper layering (terrain, units, effects)
Recommended Workflow
# 1. Extract assets
python extract_starcraft_assets.py
# 2. Inspect extracted files
ls -R assets/
# 3. Start with a simple asset
# For example, load a PCX image:
from PIL import Image
img = Image.open('assets/graphics/SomImage.pcx')
img.show()
# 4. Reference existing tools
# - PyMS for DAT parsing
# - scbw for Rust integration
# - BWAPI for C++ examples
File Format Resources
Documentation
- Staredit.net: Community wiki with format specs
- BWAPI Documentation: API for StarCraft modding
- Farty's Resource Pages: Comprehensive format details
- Campaign Creations: SC modding forums
Tools & Libraries
-
PyMS: Python tools for SC assets
-
scbw: Rust library for SC formats
- Parse DAT, GRP, CHK files
-
ScmDraft: Map editor (Windows)
- Visual inspection of map structure
-
DatEdit: DAT file editor
- Useful for understanding table structure
Parsing Examples
Python - Read a PAL file:
def read_palette(path):
with open(path, 'rb') as f:
data = f.read(768) # 256 colors * 3 bytes (RGB)
palette = [(data[i], data[i+1], data[i+2])
for i in range(0, 768, 3)]
return palette
Python - Basic TBL reader:
def read_tbl(path):
with open(path, 'rb') as f:
count = int.from_bytes(f.read(2), 'little')
offsets = [int.from_bytes(f.read(2), 'little')
for _ in range(count)]
strings = []
for offset in offsets:
f.seek(offset)
string = b''
while True:
char = f.read(1)
if char == b'\x00':
break
string += char
strings.append(string.decode('latin-1'))
return strings
Legal Considerations
⚠️ Important: StarCraft assets are copyrighted by Blizzard Entertainment.
- These assets are extracted for educational purposes and personal use
- Creating alternative engines for personal learning is generally acceptable
- Distribution of extracted assets is prohibited
- Commercial use requires proper licensing from Blizzard
- Always respect Blizzard's intellectual property rights
For legitimate projects:
- Use assets only for testing and development
- Create your own original assets for distribution
- Consider open-source alternatives (OpenRA, etc.)
- Contact Blizzard for licensing if planning commercial release
Troubleshooting
Corrupted Files
Some files may fail to extract:
- Try extracting with different tools
- Files with metadata size=0 may still be valid
- Check if file is actually used by the game
Missing Assets
If expected assets aren't found:
- Check other MPQ files (e.g.,
BroodWar.mpq,Patch_rt.mpq) - Assets may be in expansion or patch archives
- Some assets generated at runtime (not in MPQ)
Format Unknown
For unknown formats:
- Check community resources (staredit.net)
- Use hex editor to inspect file structure
- Compare with similar known formats
- Community may have reverse-engineered specs
Additional Resources
- StarCraft Wiki: https://starcraft.fandom.com/
- Staredit Network: http://www.staredit.net/
- BWAPI: https://github.com/bwapi/bwapi
- PyMS GitHub: https://github.com/poiuyqwert/PyMS
Credits
- Blizzard Entertainment: Original StarCraft assets and game
- StormLib: Ladislav Zezula - MPQ archive library
- PyStorm: Python bindings for StormLib
- Community: Countless modders and reverse engineers who documented formats
Happy Modding! 🎮
For questions or issues with asset extraction, please refer to the PyStorm documentation or community resources.