I’ve added my DLC tool to the SA Tools suite, you can find it in the SA1 folder. It’s a simple command line tool that unpacks VMS files and rebuilds them from source assets and metadata. I want to make a GUI version of it someday, but for now I want to work on something else. The tool and the data should be self explanatory for the most part, and there’s also plenty of documentation in the readme file.
For those who want some juicy details, here’s the layout of SA1 DLC files:
* VMU HEADER
* OFFSET SIZE TYPE DESCRIPTION
* 0 16 string DLC title
* 10 32 string DLC description
* 30 16 string Application title
* 40 2 ushort Number of icons
* 42 2 ushort Animation speed
* 44 2 ushort Eyecatch type (unused)
* 46 2 ushort CRC (unused)
* 48 4 uint32 Size without the header
* 4C 20 null Reserved
* 60 32 ushort Icon palette, 16 colors
* 80 512 byte Icon graphics
*
* SECTIONS HEADER (SIZE 64 BYTES)
* 280 4 uint32 Pointer to item layout table
* 284 4 uint32 Item count
* 288 4 uint32 Pointer to string table
* 28C 4 uint32 String item count
* 290 4 uint32 Pointer to PVM
* 294 4 uint32 Number of PVMs (always 1)
* 298 4 uint32 Number of textures in the PVM
* 29C 4 uint32 Pointer to MLT
* 2A0 4 uint32 Number of MLTs (either 0 or 1)
* 2A4 4 uint32 Pointer to PRS
* 2A8 4 uint32 Number of PRSes (always 1)
* 2AC 4 uint32 Checksum
* 2B0 16 null Unused
*
* ITEM LAYOUT TABLE HEADER (SIZE 12 BYTES)
* 2C0 4 uint32 DLC ID (e.g. 504 in SONICADV_504)
* 2C4 1 byte Enable Sonic / Enable Tails
* 2C5 1 byte Enable Knuckles / Enable Gamma
* 2C6 1 byte Enable Amy / Enable Big
* 2C7 1 byte Unknown, probably unused
* 2C8 4 uint32 Regional lock
*
* ITEM LAYOUT TABLE (ARRAY BEGINS AT 0x2CC, ITEM SIZE 30 BYTES)
* 0 1 uint8 Level ID
* 1 1 uint8 Act ID
* 2 1 uint8 Scale X multiplied by 10
* 3 1 uint8 Scale Y multiplied by 10
* 4 1 uint8 Scale Z multiplied by 10
* 5 1 uint8 Rotation speed X
* 6 1 uint8 Rotation speed Y
* 7 1 uint8 Rotation speed Z
* 8 1 sint8 Item type (0: model, -128: sprite, -1: invisible)
* 9 1 uint8 Texture ID
* A 2 ushort Flags
* C 1 uint8 Object ID for collectibles or the number of objects to collect
* D 1 byte Unknown
* E 1 uint8 Message ID to show when touching the object
* F 1 uint8 Trigger distance
* 10 1 uint8 Level ID to warp or soundbank ID (8 for MLT, 15 for ADX music)
* 11 1 uint8 Act ID to warp to or sound/music ID to play
* 12 2 ushort Rotation X
* 14 2 ushort Rotation Y
* 16 2 ushort Rotation Z
* 18 2 short Position X
* 1A 2 short Position Y
* 1C 2 short Position Z
*
* DLC OBJECT FLAGS
* BIT_0 Unknown
* BIT_4 Unknown
* BIT_8 Solid
* BIT_9 Play sound
* BIT_10 Show message
* BIT_11 Hide object and disable everything except collision
* BIT_12 Warp
* BIT_13 Collectible item
* BIT_14 Timer item
* BIT_15 Starts the challenge
*
* REGIONAL LOCK BITS
* -1 Disable regional lock
* 1 Japan
* 3 US
* 4 Europe
* 7 All regions