Files
w3dhub_linux_launcher/docs/file_formats/MIX.md
2026-01-17 22:45:08 -06:00

4.7 KiB

Westwood Renegade MIX Archive

with W3D Hub / Tiberian Technologies alterations

The .MIX archive file format is used by Renegade as yes.

Important

The MIX format has no notion about directories.

Each file name MUST be unique.

e.g. data/map.dds and data/RA_Under/MAP.dds have the same base file name and therefore MUST raise an error when writing.

Note

io_pos is the current position on the seek head of the open file

Reading

  • Read Header
    • validate MIME type (MIX1 or MIX2)
  • Jump to io_pos file_data_offset
  • Read file_count
  • Read array of file_data
  • Jump to io_pos file_names_offset
  • Read file_count
  • Read array of file_names
  • Read file blobs
    • For each file's file_data
      • Jump io_pos to file_content_offset
      • Read file_content_length
  • Done.

Writing

  • Write MIME type (MIX1 or MIX2)
  • Jump to io_pos 16
  • Write file blobs
    • IMPORTANT: Add -io_pos & 7 padding to io_pos AFTER each file blob is written
    • Save io_pos as file_data_offset
  • Write file_count
    • Write array of file_data
    • Save io_pos as file_names_offset
  • Write file_count
    • Write array of file_names
      • IMPORTANT: Ensure file names are null terminated and DO NOT exceed 254 (+ null byte) characters in length.
  • Jump to io_pos 4
  • Done.

Pseudo Example:

header:
  mime: MIX1 or MIX2
  file_data_offset: 0x1024EAEA
  file_names_offset: 0x8192EAEA
  reserved: 0

files:
  array:
    - file_blob

file_data:
  file_count: 0x000021
  array:
    file_name_crc32: 0xEFEFEFEF
    file_content_offset: 0x3217DEAD
    file_content_length: 0x0018BEEF

file_names:
  file_count: 0x000021
  array:
    file_name_length: 0xff
    file_name: "mp_wep_gdi.w3d"

MIME Types

MIX1 0x3158494D

Westwood Farm Fresh Organic.

MIX2 0x3258494D

Same as MIX1. MIX2 hints to the engine's file reader to decrypt files before use.

Data Structures

Header

Name Offset Type Description
MIME 0 int32_t 4 bytes representing MIX1 (0x3158494D) or MIX2 (0x3258494D)
File Data Offset 4 int32_t Offset in MIX archive that file_data data starts
File Names Offset 8 int32_t Offset in MIX archive that file_name data starts
RESERVED 12 int32_t Unused reserved int. Write as 0

File

Name Offset Type Description
File Blob complex char[file_content_length] File contents

File Data

Name Offset Type Description
File Count file_data_offset int32_t Number of files in MIX archive

File Data Array

Name Offset Type Description
File Name CRC32 file_data_offset + 4 * (index * sizeof) uint32_t CRC32 of UPPERCASE file name in network byte order
File Content Offset file_data_offset + 8 * (index * sizeof) uint32_t File content offset
File Content Length file_data_offset + 12 * (index * sizeof) uint32_t File content length

File Names

Name Offset Type Description
File Count file_names_offset int32_t Number of files in MIX archive

File Names Array

Name Offset Type Description
File Name Length complex uint8_t Length of string in bytes, including null byte.
File Name complex char[file_name_length] null terminated string