Tribes 2 // Mod Development Handbook GitHub

File formats

Every extension in a vanilla build-25034 install, with counts from a survey across all 19 .vl2 archives.

Counts

Extension Count Format
.wav 2962 RIFF WAVE audio — PCM and ADPCM, mostly Miles-encoded
.png 2747 PNG image
.bm8 2477 8-bit indexed bitmap, Tribes 2-specific — the low-end texture set
.dsq 428 Dynamix animation Sequence
.dif 325 Dynamix Interior Format — building interiors
.cs 290 TorqueScript source
.dts 244 Dynamix Three Space — models
.gui 136 TorqueScript GUI definition
.dml 89 DyMaterial List — texture/material lists
.ter 86 Dynamix terrain heightfield
.mis 84 Mission file (TorqueScript)
.jpg 82 JPEG image
.spn 81 Spawn graph for spawn spheres
.ifl 73 Image List — animated frame sequence
.gft 58 Tribes 2 GUI font (bitmap font)
.nav 26 AI navigation graph
.bmp 17 Windows bitmap — loading screens
.hfl 8 Help File — markup for the mission editor’s docs
.ifr 8 Immersion Force-feedback Resource
.txt 5 Plain text — EULA, readmes
.avi 1 AVI video — the intro cinematic
.log 1 A build artefact left in base.vl2
.sfk 1 Unknown — a singleton with no public Torque reference

Plus generated files not shipped: .dso (compiled script) and .ml (per-mission lightmaps).

The ones you will author or edit

.cs — TorqueScript source

Plain text. Compiled to .cs.dso on first load; the compiled form is preferred afterwards [binary]. See TorqueScript.

.dso — compiled script

The bytecode form. Generated by the engine, or in bulk by compile(fileName) / the -prepbuild launch mode [script].

Stale .dso files shadowing edited .cs files is the single most common modding problem. Sierra’s own launchers delete them all before every run [script]. See Packaging.

For the format itself — header, string/float tables, and the full opcode set — see TorqueScript — V12 Compiler. For reading a .dso back to .cs, including a byte-level worked example and a client-side decompiler tool, see TorqueScript — V12 Decompiler.

.gui — GUI definition

TorqueScript, executed like any script. A nested chain of new statements. Written by the in-game GUI editor, which stamps //--- OBJECT WRITE BEGIN --- at the top. See GUI system.

.mis — mission

TorqueScript, executed by loadMissionStage2. One nested new SimGroup(MissionGroup) declaration plus a block of metadata comments that the engine parses as data — // MissionTypes = , // DisplayName = , and the quote and string blocks. See Missions.

.vl2 — archive

A standard PKZIP archive with a renamed extension. Magic bytes at offset 0 are 50 4B 03 04 [binary]. “VL2” is Dynamix branding for “Volume v2”.

Property Vanilla TribesNEXT t2csri.vl2
Compression Stored (method 0, no compression) Deflate for .cs, Stored for .cs.dso and fonts
CRC32 Present per entry Present
Timestamps 2000-01-01, and 2002-09/10/11 clusters 2025-…

Any zip tool reads and writes them. Paths inside use forward slashes and are relative to the mod directory. See Packaging.

The 19 archives in base/:

audio.vl2        base.vl2          badlands.vl2      Classic_maps_v1.vl2
desert.vl2       ice.vl2           interiors.vl2     lava.vl2
lush.vl2         missions.vl2      scripts.vl2       shapes.vl2
skins.vl2        textures.vl2      voice.vl2
TR2final093-extras.vl2   TR2final105-client.vl2   TR2final105-server.vl2
zz_Classic_client_v1.vl2

The zz_ prefix on the last is a load-order trick — see Mod paths and overrides.

Art formats

.dts — Dynamix Three Space shape

The model format: geometry, materials, nodes (mount points), detail levels, and optionally embedded sequences. Period tooling was a 3ds Max exporter. Modern viewers exist; authoring is difficult.

Most mods reuse shipped shapes. shapeFile = "weapon_disc.dts" on your own datablock costs nothing and works everywhere.

.dsq — Dynamix Sequence

Animation data, kept separate from the shape so one skeleton can share many animations. Bound to a shape by a TSShapeConstructor datablock:

sequence0 = "light_male_root.dsq root";

See Armors.

.dif — Dynamix Interior Format

Building interiors — the constructed geometry inside bases. Placed by InteriorInstance objects in a .mis. The engine can view one directly:

Tribes2.exe MyBuilding.dif

which sets $LaunchMode = "InteriorView" [script].

.ter — terrain

The heightfield, referenced by TerrainBlock.terrainFile in a .mis. Authored in the in-game terrain editor.

.dml — DyMaterial List

A list of textures forming a material set, used by terrain and by animated surfaces.

.ifl — Image List

A frame sequence for animated textures — a text file listing image names and durations.

.png / .jpg / .bmp / .bm8

Ordinary images, except .bm8 — an 8-bit paletted Tribes 2 format used to supply a low-memory texture set for period hardware. There are 2477 of them, roughly paralleling the .png set. Replacing a texture usually means replacing both.

.gft — GUI font

Bitmap font format. console_start.cs references fonts by name (fontType = "Univers Condensed"), which resolve to .gft files.

Data formats

The AI’s map of where it can go. Generated, not authored:

Tribes2.exe -navBuild <MissionName> <MissionType>

A map without one has no bot support — buildMissionList tests for the file’s existence [script]. See AI and bots.

.spn — spawn graph

The spawn graph for spawn spheres, generated by:

Tribes2.exe -spnBuild <MissionName> <MissionType>

Placing spawn spheres in the editor is not sufficient — the graph is a separate build step, and a map without one has spheres that silently do nothing [bones]. See 15 · Lighting, navigation & spawn data.

.ml — lightmap

Per-mission precomputed lighting, written as lighting/<mission>_<crc>.ml [binary]. The CRC is the mission file’s — which is why editing a .mis invalidates cached lighting. Regenerate with:

Tribes2.exe -light <MissionName>

.hfl — help file

Markup documents for the mission editor’s in-game help, using <font:> and <a:> tags. Eight ship in scripts.vl2’s help/ directory. Same markup family as GuiMLTextCtrl — see GUI system.

.ifr — Immersion Force-feedback Resource

Force-feedback effect data for Immersion TouchSense hardware, referenced by EffectProfile.effectname. Eight ship in base.vl2’s effects/. You do not need to author these — an AudioProfile with no effect field works fine. See Audio.

.jrn — journal

Recorded input event streams from -jsave, replayable with -jload / -jplay. See Debugging.

Where each type lives

The category directory is part of the lookup path — a datablock saying shapeFile = "foo.dts" resolves to <modpath>/shapes/foo.dts:

Category directory Holds
scripts/ .cs
gui/ .gui and interface bitmaps
shapes/ .dts, .dsq
textures/ .png, .jpg, .bm8, .dml, .ifl
interiors/ .dif
terrains/ .ter, .nav, .spn
missions/ .mis
audio/ .wav
voice/<pack>/ voice .wav
music/ music
lighting/ .ml (generated)
prefs/ preference .cs (write target)
help/ .hfl
effects/ .ifr

See Mod paths and overrides.

Under the community patches

Every vanilla format above is still read. Two additions and one deprecation.

.sdft — the replacement font format

The QoL patch ships six fonts in t2csri.vl2/fonts/ in Torque’s modern .sdft format, replacing the vanilla .gft bitmap fonts:

Sui Generis.sdft
Univers.sdft
Univers Bold.sdft
Univers Condensed.sdft
Univers Condensed Bold.sdft
Univers italic.sdft

Every vanilla font name is rerouted to them through $Font::Substitute [patch-script], so .gft files remain on disk and are simply no longer reached for those names.

You do not author these. If you ship a .gui, it asks for a font by name and gets whatever the substitution table maps it to. See GUI system.

RC2a keeps the vanilla .gft fonts.

.rb — Ruby, RC2a only

t2csri/crypto.rb and t2csri/certstore.rb are Ruby 1.9 source, read by rubyExec() and evaluated in the embedded interpreter [patch-script]. Both are GPL-3-or-later. Removed entirely in the QoL rewrite.

Not a game format — the engine never sees them; a TorqueScript FileObject reads them as text and hands the contents to rubyEval.

.ifr — inert on the QoL patch

Immersion force-feedback resources still ship in base.vl2’s effects/ and EffectProfile datablocks still reference them, but TribesNEXT’s IFC22.dll stubs the Immersion exports [binary], so nothing plays. RC2a keeps the vendor DLL, so they still work there.

.vl2 — unchanged

Both patch archives are ordinary PKZIP. The QoL archive mixes methods — Deflate for .cs, Stored for .cs.dso and fonts [binary] — confirming that compression choice is free. Vanilla archives are all Stored.

.ini — the support pack’s config

Not an engine format. The community support pack writes prefs/autoload.ini (load order and per-script enable/disable, ; for comments) and prefs/autoload.log [support-script]. Both are plain text parsed by TorqueScript with FileObject, not by the engine.

The pack’s // #directive = value script headers are the same idea — metadata carried in comments the compiler ignores, parsed by script. Vanilla uses the technique for // MissionTypes = and // DisplayName = [script]; see The autoload system.