Skip to content

Naming Conventions

Medusa uses Dot-Echelon notation to discover assets and infer command hierarchy from DCS group names. The system is derived from how internet domain names work - dot-separated segments read from left to right, where each segment places the group one level deeper into an organizational hierarchy.

The sole purpose of Dot-Echelon notation is to confer command hierarchy. You can use as many or as few echelon levels as you want - from zero (flat network) to as many as you can dream up (I’m sure at some point DCS will crash, but go off).

{prefix}.{echelon}.{echelon}.{echelon}...

Segments after the prefix read left-to-right, top-down - highest echelon first, unit last:

red.1div.1bde.1bn.sa10_battery
| | | | +-- Unit (sa10_battery)
| | | +-- Battalion
| | +-- Brigade
| +-- Division (highest echelon)
+-- Prefix

Read left to right, top down - just like a military mailing address. Division, brigade, battalion, unit. The opposite of how domain names work.

There is no limit to the number of echelon levels. These are all valid:

red.sa10 - No hierarchy (flat)
red.north.sa10 - One echelon
red.1bde.1bn.sa10 - Two echelons
red.southern_cmd.1div.1bde.1bn.sa10 - Four echelons

If you don’t need hierarchy, just use the prefix and a label. If you’re migrating from another IADS script, you just need to add the prefix to your existing group names:

RED SA-10 Bandar --> red.SA-10 Bandar
RED SA-6 North --> red.SA-6 North
RED EWR Bigbird --> red.EWR Bigbird
RED Tor Point Defense --> red.Tor Point Defense

This creates a flat network with no command hierarchy - every group reports directly to the network. You can migrate to Dot-Echelon hierarchy later by renaming groups.

Special tokens anywhere in the group name identify non-battery roles:

TokenRoleEntity Created
ewrEarly Warning RadarSensorUnit
gciGround Controlled InterceptSensorUnit
awacsAirborne Early WarningSensorUnit (airborne)
hqHeadquartersC2Node
(none)SAM / AAA batteryBattery

AWACS groups must contain an aircraft with the DCS AWACS attribute (E-2, E-3, A-50, KJ-2000). Medusa validates this on discovery and rejects groups without it. Place each AWACS aircraft in its own group to avoid the DCS getSensors() bug that returns incorrect data for multi-unit groups. AWACS are exempt from EMCON policies and always emit.

Role tokens are case-insensitive and matched using word boundary rules - they match at the start of any segment (dot-separated or space-separated), either as the whole segment or followed by a non-alphanumeric character. This means EWR, ewr, Ewr all work, and both Dot-Echelon style and flat naming are recognized out of the box:

pvo.north.ewr.1div - "ewr" is the entire segment
opfor.EWR North - "ewr" at start of segment, followed by space
red.EWR-1.1div - "ewr" at start of segment, followed by hyphen
iads.newer_radar.1div - "newer" does not start with "ewr", no match
red.ewrything.1div - "ewr" followed by "y" (alphanumeric), rejected

When a role token is found, echelon parsing starts from the segment immediately right of the rightmost role token.

Flat naming (no hierarchy):

pvo SA-10 Bandar - lowercase prefix, space separated
OPFOR SA-6 North - uppercase prefix
Red EWR Bigbird - pascal prefix
redFor EWR-1 - camelCase prefix
RED IADS HQ Main - multi-word prefix
red.SA-15 Point Defense - dot-separated prefix
red.1div.EWR South - dot-echelon with hierarchy

With hierarchy:

pvo.1Div.EWR.North - EWR under 1Div
OPFOR.1BDE.1BN.GCI.Cairo - GCI under 1BN under 1BDE
redFor.1Div.HQ.CommandPost - HQ for 1Div
Red.1Div.1BDE.1BN.SA10 - Battery under 1BN under 1BDE under 1Div

The following tokens are all recognized as EWR roles: ewr, radar, sensor. This means red.north.radar.1div and red.north.ewr.1div produce the same result.

Medusa also auto-discovers EWR groups: any group with a search radar but no launchers is automatically classified as a sensor, even without an explicit role token. This can be disabled via doctrine:

Medusa_MM_Doctrine = {
AutoDiscoverEwrs = false,
}

Override the defaults via MEDUSA_CONFIG:

MEDUSA_CONFIG = {
Networks = {
{
name = "RED",
coalition = "red",
prefix = "red",
},
},
Roles = {
HQ = "command", -- Use .command. instead of .hq.
GCI = "gci",
EWR = "radar", -- Use .radar. instead of .ewr.
},
}