Doctrine Field Reference
All fields available in any doctrine table (Medusa_MM_Doctrine, per-network inline tables, or named global tables). Every field is optional. Omit any field to use its default.
| Field | Type | Default | Description |
|---|---|---|---|
ADIZBufferNm | number | 12 | Distance in nautical miles to project the ADIZ beyond the border. Min: 0, Max: 200 |
ADIZEnabled | boolean | true | Project an ADIZ ring outside the border zones. Only applies when borderZones are configured on the network. The ADIZ is a convex hull expansion that smooths concave notches in the border |
AutoDiscoverEwrs | boolean | true | When true, groups with the network prefix that contain only radar units (no launchers) are automatically treated as sensors. The group still needs the prefix to be discovered |
BallisticSimMaxSec | number | 120 | Maximum lookahead in seconds for the ballistic trajectory simulation. Min: 10, Max: 600 |
BallisticSimStepSec | number | 1.0 | Time step in seconds for the ballistic trajectory simulation used in HARM kinematic classification. Min: 0.1, Max: 5 |
BatteryTargetDatalink | boolean | true | When true, HOT batteries contribute their detected tracks to the network track store. Separate from SAMAsEWR (which controls whether batteries stay warm specifically to act as sensors) |
DefendPk | number | 0.30 | Minimum estimated Pk for a point defense battery to activate against an inbound HARM. Min: 0, Max: 1 |
EMCON | table | nil | Per-role emission control policies. Keys are role names (EWR, GCI, VLR_SAM, LR_SAM, MR_SAM, SR_SAM, AAA), values are policy strings. If nil, each role uses its built-in default. VLR_SAM defaults to MINIMIZE |
EmconRotateGroups | number | 2 | Number of sensor groups for COORDINATED_ROTATION. Sensors are divided into this many groups that take turns radiating |
EngageTactics | string | "SHOOT_IN_DEPTH" | Multi-battery engagement strategy. SHOOT_LOOK_SHOOT assigns only one battery per track. SHOOT_IN_DEPTH allows one battery per role tier (VLR, LR, MR, SR) per track. SHOOT_SHOOT assigns the two highest-Pk batteries per track regardless of role. SHOOT_SHOOT_FLOOD uses SHOOT_SHOOT rules for LR/MR (up to 2) but activates every SR_SAM and AAA in range above PkFloor without limit. VLR_SAM batteries always use SHOOT_LOOK_SHOOT among themselves regardless of this setting, but a VLR_SAM assignment never blocks other tiers from also engaging the same track. Batteries with weapon range above 250km are automatically reclassified from LR_SAM to VLR_SAM at creation |
EngageTimeoutSec | number | 45 | Seconds since last shot or assignment change before Medusa looks for any equal-or-better Pk battery to hand off to. Before this timeout, a handoff requires 50% better Pk. Min: 0, Max: 300 |
GuiltByAssociation | boolean | true | When a track is promoted to BANDIT or HOSTILE, nearby tracks (within 11km) flying the same direction (within 15 degrees) at similar speed (within 20%) are promoted to match |
HARMResponse | string | "AUTO_DEFENSE" | How batteries react to detected HARMs. AUTO_DEFENSE, SELF_DEFEND, SHUTDOWN_UNLESS_PD, SHUTDOWN, IGNORE |
HARMSaturateOnAmmo | boolean | false | Cap a battery’s HARM defense points at its remaining ammo count. A battery with 9 defense points but only 2 missiles left can only defend against 2 HARMs. Without this, defense points are based purely on unit count |
HARMShutdownM | number | 15000 | Maximum closest point of approach (CPA) in meters between a HARM and a battery for the battery to be considered threatened. Batteries whose projected CPA is beyond this distance are not shut down. Min: 0, Max: 300000 |
HoldDownSec | number | 15 | Seconds a battery stays HOT after its target goes stale or after a handoff. Also sets the duration of each last-chance salvo detection check cycle. Min: 0, Max: 300 |
LookaheadSec | number | 8 | Seconds to project the target’s position forward when computing Pk. Accounts for the time the battery needs to come online and acquire the target after activation. Min: 0, Max: 30 |
MaxEngageRangePct | table | nil | Per-role cap on engagement range as a percentage of hardware max. Example: { LR_SAM = 80 } limits long-range SAMs to 80% of their weapon range. Valid role keys: VLR_SAM, LR_SAM, MR_SAM, SR_SAM, AAA. Roles not listed use full range |
Name | string | "Passive Defense" | Label for this doctrine (appears in logs only, no behavioral effect) |
PerTrackScanUpdateRate | number | 5 | Minimum seconds between position updates for the same contact. Lower values give faster track updates at higher DCS API cost. Min: 1, Max: 60 |
PkFloor | number | 0.25 | Minimum estimated Pk for a battery to be assigned a target. Batteries below this threshold are not activated. Rolling Pk may adjust the effective value upward based on network kill rate. Min: 0, Max: 1 |
PoolDefensePoints | boolean | false | When enabled, nearby HARM-capable batteries pool their defense points when evaluating whether a battery can self-defend against HARMs. Point defense batteries are excluded to avoid double-counting |
PoolDefensePointsRadius | number | nil | Radius in meters for the defense point pooling spatial query. Only used when PoolDefensePoints is true. Min: 1000, Max: 100000 |
Posture | string | "HOT_WAR" | Controls how fast the IADS classifies contacts and what criteria are needed to declare them hostile. See the Posture section below |
QuietPeriodSec | number | 0 | Seconds radar stays OFF between scan cycles for PERIODIC_SCAN and COORDINATED_ROTATION. Min: 0, Max: 86400 |
ROE | string | "TIGHT" | Minimum track identification for target assignment. FREE = BANDIT or HOSTILE, TIGHT = HOSTILE only, HOLD = no assignments made |
RollingPkEnabled | boolean | true | Enables adaptive PkFloor adjustment based on network kill rate. When false, PkFloor stays at the configured static value |
SAMAsEWR | string | "WHEN_NO_EWR" | Whether LR_SAM and MR_SAM batteries with search radars stay warm as supplemental sensors. DISABLED = never, WHEN_NO_EWR = only if all dedicated EWR/GCI are destroyed, ALWAYS = always |
ScanSec | number | 30 | Seconds radar stays ON per cycle for PERIODIC_SCAN and COORDINATED_ROTATION. Min: 0, Max: 86400 |
SensorCleanupSec | number | 30 | How often Medusa clears its internal record of contacts that have left sensor coverage. No visible effect on behavior. Only relevant if you have very long missions with thousands of contacts passing through. Min: 5, Max: 300 |
StickyRangePct | number | 15 | Percentage below PkFloor that Pk must drop before a battery releases its target. At default 15, a battery with PkFloor 0.25 won’t release until Pk drops below 0.2125. Also extends the effective engagement range by the same percentage |
TargetKillRate | number | 0.50 | Target actual kill rate for the Rolling Pk control loop. If the network’s kill rate is above this, the effective PkFloor drops (more shots taken). If below, PkFloor rises (fewer shots taken). Only used when RollingPkEnabled is true. Min: 0, Max: 1 |
ThreatSpeedScaling | number | 30 | Bonus threat points for fast targets. A Mach 1 target gets the full value (30 points) added to its threat score. Slower targets get proportionally less. Higher threat scores get assigned batteries first. Min: 0, Max: 100 |
Posture
Section titled “Posture”Posture controls how quickly the IADS moves contacts through the identification ladder (UNKNOWN, BOGEY, BANDIT, HOSTILE) and what conditions allow engagement.
| Posture | Meaning | Identification speed | Border behavior |
|---|---|---|---|
HOT_WAR | Active conflict | Fast. IFF confirms in 3-8 seconds, BANDIT in 15-45 seconds, HOSTILE via 30-second dwell timer | Border zones have no effect on identification. All contacts are processed at full speed |
WARM_WAR | Heightened tensions | Moderate. IFF confirms in 10-30 seconds, BANDIT in 45-120 seconds. Crossing the border starts a 15-45 second timer before HOSTILE (contact must still be inside when timer expires) | Contacts outside the ADIZ are tracked but cannot advance past BOGEY until they enter the ADIZ |
COLD_WAR | Peacetime patrol | Slow. IFF confirms in 30-60 seconds, BANDIT in 120-300 seconds. Crossing the border starts a 30-120 second timer before HOSTILE (contact must still be inside when timer expires) | ADIZ entry forces immediate BOGEY promotion. Radar illumination does not count as identification evidence |
Contacts identified as having launched an anti-radiation missile (via kinematic backtracking) are declared HOSTILE instantly regardless of posture or position. Contacts heading directly toward a defended site at combat speed for 60 seconds (120 seconds in COLD_WAR) are declared HOSTILE via hostile intent.
HOSTILE is permanent. Once a contact is declared hostile, the classification is never reversed regardless of posture or position.
Change posture mid-mission with the runtime API:
Medusa.API.setPosture("SyADF", "HOT_WAR")