Version 1.0 (Beta) - 7/9/26
This document describes the track-side files used by the MCM1 Plugin Editor for Supercross / TrackEdit-style tracks:
.trk - editable 16 x 16 construction-set layout
.ter - MakeTerr terrain compile input
.scn - scene descriptor that points the game at the compiled terrain
.dat - binary race / AI navigation field
The formats below are based on the current MCM1PluginEditor parser and writer.
They are intended for programmers implementing readers, writers, or validators.
Use these links to jump directly to the file format you need:
| Format | Role | Example file |
|---|---|---|
.trk | Editable construction-set source | tracks/classic_test.trk |
.ter | MakeTerr terrain compile input | tracks/classic_test.ter |
.scn | Game scene descriptor | tracks/classic_test.scn |
.dat | Supercross race / AI navigation field | tracks/classic_test.dat |
.trk, .ter, and .scn are INI-like text files.
Lines are normally CRLF terminated.
Section names are written as [SectionName].
Key/value lines use Key=Value.
The editor ignores blank lines and semicolon comments when parsing .trk and
plugin .ini files.
The editor writes text files with the Windows default encoding through the desktop bridge.
Paths in generated .ter files are Windows paths. The current desktop editor
uses absolute plugin paths in the .ter file because MakeTerr is launched
outside the WebView context.
Supercross tracks are a fixed 16 x 16 grid of construction pieces.
The .trk file stores cells in row-major order:
index = row * 16 + colpiece number = index + 1row 0 = north / top rowcol 0 = west / left columnThe .ter file uses terrain grid coordinates:
xxxxxxxxxxBaseX = col * 16BaseY = (15 - row) * 16So .ter BaseY is inverted relative to .trk row order. The top .trk row
is written at BaseY=240, and the bottom row is written at BaseY=0.
Orientations use TrackEdit's cardinal convention:
xxxxxxxxxx0 = North1 = West2 = South3 = EastThe editor uses this same convention for saved .trk files and for the .dat
writer.
.TRK FormatFORMAT BANNER:
.TRKEditable 16 x 16 construction-set source layout. Example:
tracks/classic_test.trk.
The .trk file is the editable construction-set source track.
xxxxxxxxxx[Track]Plugin=classic.iniName=Classic Test TrackPiece_01=1Orient_01=2...Piece_256=1Orient_256=0Plugin
The construction-set INI used by the track. This can be a bare file name such as
classic.ini or stepup2.ini. The example track classic_test.trk uses
Plugin=classic.ini.
Name
Human-readable track name.
Piece_NN
Construction piece id for cell NN, where NN is 01 through 256.
Orient_NN
Orientation for cell NN. Values are 0..3 using the orientation table above.
Cell NN maps to grid coordinates as:
xxxxxxxxxxindex = NN - 1row = floor(index / 16)col = index % 16Example:
xxxxxxxxxxPiece_01 -> row 0, col 0Piece_16 -> row 0, col 15Piece_17 -> row 1, col 0Piece_256 -> row 15, col 15.TER FormatFORMAT BANNER:
.TERMakeTerr terrain compile input generated from the track grid and active plugin assets. Example:
tracks/classic_test.ter.
The .ter file is MakeTerr's terrain definition input. The editor generates a
TerrainType=TRACK .ter for Supercross layouts.
xxxxxxxxxx[ElevationData]TotalElevationFiles=256TotalTextureMapFiles=<texture palette count>TotalTexturePlacements=256TotalTargetWidth=256TotalTargetBreadth=256ElevationFormat=ASCElevationDefault=0TextureFormat=8ShareTextures=1UpPropagateTextures=0ElevationPath=<absolute plugin folder>\TextureMapPath=<absolute plugin folder>\GridResolutionInFeet=3.0ShareGeometries=0TerrainType=TRACKxxxxxxxxxx[TerrainPalette]TotalFileSets=<texture palette count>NumberOfColors=236FileSet_1=<absolute plugin folder>\<texture path>FileSet_2=<absolute plugin folder>\<texture path>...The editor builds this palette from all texture map references in the active plugin pieces, de-duplicated case-insensitively by raw path.
For each palette entry:
xxxxxxxxxx[TextureMapFile_1]Name=<texture path>CoverageInGrids=16PixelsPerGrid=8CoverageInGrids=16 means each texture covers one 16 x 16 construction tile.
PixelsPerGrid=8 corresponds to a 128 x 128 tile texture.
Each of the 256 cells has one [TexturePlacement_N] and one
[ElevationFile_N] section.
x[TexturePlacement_1]MapId=1XIndex=0YIndex=240Transform=NONE
[ElevationFile_1]Name=..\classic\Per.ascWidth=16Breadth=16BaseX=0BaseY=240N is row-major, matching .trk piece numbering.
MapId
One-based index into [TerrainPalette] / [TextureMapFile_N].
XIndex, YIndex
Tile placement in terrain grid units. The editor writes these from col and
row using the coordinate conversion shown above.
Transform
Texture transform passed to MakeTerr. For pieces with
NumberMapOrientations=4, the editor writes NONE because the plugin supplies
orientation-specific texture maps. For pieces with NumberMapOrientations=1,
the editor mirrors TrackEdit's rotation convention:
xxxxxxxxxxOrient 0 -> NONEOrient 1 -> HDOrient 2 -> HVOrient 3 -> VDName
ASC geometry file for the cell's piece and orientation.
Width, Breadth
Both are 16 for construction-set tiles.
BaseX, BaseY
Same coordinates as XIndex, YIndex.
.SCN FormatFORMAT BANNER:
.SCNScene descriptor that tells MCM1 which compiled terrain file to load. Example:
tracks/classic_test.scn.
The .scn file tells the game which compiled .trn terrain file to load.
The editor writes the minimal form:
xxxxxxxxxx[SceneInfo]SceneName=Classic Test Track[Environment]TerrainFile=classic_test.trnbaseName comes from the saved .trk file name with the extension removed and
non-word characters sanitized by the editor before Build Track writes files.
.DAT Format - Supercross Grid NavigationFORMAT BANNER:
.DATFixed-size binary Supercross race / AI navigation field. Example:
tracks/classic_test.dat.
The Supercross .dat file is binary. It is not a National spline. It is a fixed
16 x 16 per-cell race / AI navigation field.
All integer fields are signed 32-bit little-endian.
Total size:
xxxxxxxxxx8 + (256 * 24) = 6152 bytesxxxxxxxxxxoffset size type field0x0000 4 i32 startCol + 10x0004 4 i32 startRow + 1Coordinates are one-based. A Start/Finish tile at .trk row 0, col 0 writes
startCol+1 = 1 and startRow+1 = 1.
After the 8-byte header, there are 256 fixed-size records. Each record is 24 bytes:
xxxxxxxxxxoffset size type field+0 4 i32 P1x+4 4 i32 P1y+8 4 i32 P2x+12 4 i32 P2y+16 4 i32 flag+20 4 i32 dirRecords are stored column-major:
xxxxxxxxxxfor col = 0..15 for row = 0..15 write record for cell[row][col]Record offset:
xxxxxxxxxxrecordIndex = col * 16 + rowrecordOffset = 8 + recordIndex * 24This differs from .trk and .ter, which number cells row-major.
P1x, P1y
Forward race-line neighbor as one-based grid coordinates:
xxxxxxxxxxx = col + 1y = row + 1P2x, P2y
Backward race-line neighbor, also one-based.
For off-route cells, all four neighbor values remain zero:
xxxxxxxxxxP1x=0, P1y=0, P2x=0, P2y=0flag
Usually the active plugin piece's PieceType for that cell.
For PieceType=8, the editor resolves the value to either 2 or 7 based on
the handedness of the forward/backward neighbors. This mirrors the TrackEdit
90-degree turn behavior.
dir
The cell orientation from .trk:
xxxxxxxxxx0 = North1 = West2 = South3 = EastThe DAT writer derives the route from the current .trk grid and the active
plugin's construction-set metadata:
StartFinishPiece from [ThisConstructionSet] identifies the start cell.
Each piece's Connectivity string supplies ports: N, S, E, W.
Each piece's PieceType controls whether the cell is route-capable.
PieceType=0 and PieceType=9 are treated as non-racing cells.
The route starts at the Start/Finish cell and walks in the start cell's orientation:
xxxxxxxxxx0 -> row - 11 -> col - 12 -> row + 13 -> col + 1At each next cell, the writer ignores the port it arrived from, then chooses the first connected port that leads to either:
the Start/Finish cell, or
another racing cell whose ports connect back.
The resulting ordered path is written into P1 and P2 fields.
xxxxxxxxxxwrite_i32_le(startCol + 1)write_i32_le(startRow + 1)
for col in 0..15: for row in 0..15: rec = records[row * 16 + col] write_i32_le(rec.P1x) write_i32_le(rec.P1y) write_i32_le(rec.P2x) write_i32_le(rec.P2y) write_i32_le(rec.flag) write_i32_le(rec.dir)When the desktop editor's Build Track action runs for an open track, it first
writes:
xxxxxxxxxxtracks/<baseName>.scntracks/<baseName>.tertracks/<baseName>.datThe .trk file is saved separately by Save Track / Save Track As.
MakeTerr consumes the .ter and referenced ASC/TGA assets to produce:
xxxxxxxxxxtracks/<baseName>.trnmaketerr.exemaketerr.exe is the terrain compiler that turns a .ter description plus its
referenced ASC/TGA assets into a compiled .trn file.
For Supercross / TrackEdit-style tracks, use the maketerr.exe located in the
MCM1 TrackEdit folder. That is the compiler expected by this document's
TerrainType=TRACK .ter files and the editor's Build Track action.
Run it from the command line as:
xxxxxxxxxxmaketerr.exe <path-to-ter-file> logExample:
xxxxxxxxxxmaketerr.exe tracks\classic_test.ter logMakeTerr writes maketerr.log next to the .ter file. The editor displays that
log after MakeTerr exits and scrolls the log view to the bottom.
There is also a different downloadable maketerr.exe used for building National
tracks. That executable is larger and produces a different kind of .trn file.
Do not treat the National compiler as interchangeable with the TrackEdit
Supercross compiler when building the files described here.
The playable track folder normally needs:
xxxxxxxxxx<baseName>.scn<baseName>.trn<baseName>.datOther files, such as menu images or auxiliary AI files, are outside the scope of the current MCM Plugin Editor generator.