Skip to content

Target Assignment

Medusa is an emissions harness. It controls which SAM batteries have their radars on. The DCS scripting engine does not expose any API to command a specific unit to fire at a specific target, select weapons, or control missile guidance. These are hard limitations of the DCS mission scripting environment, not design choices. When Medusa “assigns a target” to a battery, it turns on that battery’s radar and sets its ROE to weapons free. DCS AI then independently detects and engages whatever it sees.

Medusa runs its assignment logic once per second. Each cycle does the following, in order:

  1. Track classification. Updates track identification (UNKNOWN, BOGEY, BANDIT, HOSTILE) and checks for HARMs.
  2. HARM detection and response. Detects inbound anti-radiation missiles and shuts down threatened batteries.
  3. Target assignment. Picks the best battery for each unassigned track and turns it on.
  4. Handoff evaluation. Checks if any currently-engaged battery should hand off its target to a better one.
  5. Deactivation. Turns off batteries that no longer have a reason to be on.
  6. EMCON. Applies emission control policies to batteries not currently engaged.

For each active track that meets the ROE threshold (BANDIT for ROE = "FREE", HOSTILE for ROE = "TIGHT"), Medusa searches for nearby batteries that are:

  • Cold or warm (not already HOT for another target)
  • Operational (not destroyed, not out of ammo)
  • Not under HARM shutdown
  • Not a point defense battery
  • Within weapon range of the track

Batteries with weapon range above 250km are automatically classified as VLR_SAM (Very Long Range SAM) instead of LR_SAM. This happens at battery creation based on the DCS weapon descriptor range data. The 250km threshold sits 10km above the SA-5’s 240km max range, so stock DCS SA-5s stay LR_SAM. Modded systems like S-400 variants at 380km+ become VLR_SAM automatically. VLR_SAMs do not follow the EngageTactics setting used by the rest of the IADS. They exist in their own battery pool and always follow SHOOT_LOOK_SHOOT among themselves. A VLR_SAM on a track does not prevent LR, MR, or SR batteries from also engaging that track. VLR_SAMs default to MINIMIZE EMCON and SEARCH_ONLY when ammo is depleted. This exists so the target assignment process works gracefully with modded SAM systems like the S-400 that might otherwise break the logic and tuning of the assignment system.

Mission makers sometimes spread SR SAM launchers (SA-8, SA-15, etc.) across large distances within a single DCS group. Medusa detects this at startup. If any two launchers in a group are more than 1 NM apart, Medusa clusters the launchers by proximity and tracks each cluster’s position separately.

When checking if a track is in range, Medusa measures from the nearest cluster, not from the group centroid. This means a track flying near a distant launcher in a spread-out SA-8 group will correctly see that launcher as in range, even if the group’s center point is far away.

The WTA still treats the group as one battery with one Pk value (the best Pk across all clusters). Activating the battery turns on the whole DCS group, and DCS AI on each launcher engages independently.

For each eligible battery, Medusa computes a Pk (kill probability) estimate based on three factors:

  • Range. Pk is highest at the battery’s optimal engagement range and drops off at shorter or longer distances. Very long-range shots have low Pk. For batteries with weapon range under 20 km (SA-8, SA-15, SA-19, SA-3, SA-6), the Pk model is tuned so that Pk equals PkFloor at max range. This means short-range systems activate as soon as a target enters their engagement envelope. Longer-range systems (SA-2, SA-10, SA-5) have natural Pk decay at max range, since max-range shots are less reliable for those systems.
  • Aspect. Head-on and tail-chase shots have higher Pk than beam (crossing) shots.
  • Altitude. Pk tapers near the edges of the battery’s engagement envelope.

The battery with the highest Pk above the PkFloor threshold (default: 0.25) gets assigned. Medusa turns on its radar and sets ROE to weapons free.

After 10 shots, Medusa tracks the network’s actual kill rate over a sliding window and compares it to TargetKillRate (default: 0.50). If the kill rate is above the target, the effective PkFloor drops by 0.02 per shot, allowing the IADS to take more engagements. If the kill rate is below the target, the floor rises by 0.02, making the IADS pickier.

The effective PkFloor never drops below the configured PkFloor (default: 0.25) and never rises above 0.60. Before the window fills (fewer than 10 shots), the configured PkFloor is used as-is.

The estimated Pk (what the model predicts for a given shot) and the actual kill rate (what the network is achieving) are on different scales. The model might estimate 0.67 for a shot while the network only kills 42% of the time. Rolling Pk works entirely in the actual-outcome space: it compares the real kill rate to the target kill rate, then uses PkFloor as the lever to push performance toward the target. If the model overestimates, the kill rate drops below target, the floor rises, and only the highest-estimated-Pk shots get through. The system self-corrects for model inaccuracy.

Once a battery is HOT and assigned to a track, Medusa periodically checks whether a different battery would do a better job. This check starts 20 seconds after assignment (HANDOFF_DWELL_SEC) to give the battery time to acquire and fire.

A handoff happens when either:

  1. Pk drops too low. The target moved out of effective range and Pk fell below the PkFloor threshold. To prevent the battery from flickering on and off at the edge of its envelope, Medusa applies a sticky band. Pk must drop below PkFloor * (1 - StickyRangePct/100) before the battery releases the target. At the default StickyRangePct of 15, a battery with PkFloor of 0.25 won’t release until Pk drops below 0.2125.

  2. A better battery is available. If the battery hasn’t fired for 45 seconds (EngageTimeoutSec), Medusa looks for any other battery with equal or better Pk. Before that timeout, it only hands off if another battery has at least 50% better Pk. This prevents unnecessary churn when the current battery is close to firing.

When a handoff happens, the new battery gets assigned immediately and starts its warmup process. The old battery enters a last-chance salvo window.

After a handoff, the old battery stays HOT for a bounded window instead of immediately going cold. This gives DCS AI a chance to fire if it already has a radar lock on the target.

The sequence:

  1. Handoff occurs. The new battery is assigned and starts warming up. The old battery loses its target assignment but stays HOT.
  2. Hold-down timer runs. The old battery stays HOT for HoldDownSec (default: 15 seconds).
  3. Detection check. When the hold-down expires, Medusa checks whether the battery’s radar still detects the old target. If yes, the hold-down extends for one more cycle (another 15 seconds). If no, the battery goes cold.
  4. One extension only. The detection check happens once. After the second hold-down expires, the battery goes cold regardless of whether it still sees the target.
  5. Shot tracking. If DCS AI fires during the last-chance window, Medusa tracks up to 2 missiles. The battery stays HOT until those missiles resolve (hit or miss), then goes cold.

If DCS AI doesn’t fire during the last-chance window, the battery goes cold and EMCON resumes control.

A HOT battery goes cold when:

  • Its target track expires (the aircraft was destroyed or left sensor coverage)
  • Its target track goes stale and the hold-down timer (HoldDownSec, default 15 seconds) has expired
  • The last-chance salvo window closes (see above)
  • It has no target and HoldDownSec (default 15 seconds) has passed since its last activity
  • It becomes non-operational (lost its tracker or launcher units, ran out of ammo)

A battery will not go cold while it has a missile in flight, even if it would otherwise be deactivated. Medusa waits for the missile to resolve before shutting down the radar.

After deactivation, EMCON resumes control of the battery’s emissions based on doctrine policy.

When a battery loses its search radar but still has TELAR units (self-contained radar/launcher vehicles like Buk or Osa), Medusa releases the battery from IADS control entirely. The battery’s radar is turned on, ROE set to weapons free, and it is removed from all IADS tracking. From that point, DCS AI runs the battery independently. Medusa will not assign targets to it, evaluate handoffs, apply EMCON, or shut it down for HARMs. The TELARs’ onboard tracking radars can still detect targets if they happen to be pointing in the right direction.

The log shows battery X released to autonomous DCS AI control when this happens. The battery will not return to IADS coordination for the rest of the mission.

These doctrine fields control target assignment behavior. All are optional. Omit any field to use the default.

FieldDefaultWhat it does
ROE"TIGHT"Which tracks are eligible. FREE = BANDIT or HOSTILE, TIGHT = HOSTILE only, HOLD = no assignments
PkFloor0.25Minimum Pk to assign a battery. This is the floor; Rolling Pk may adjust the effective value upward (max 0.60) based on the network’s actual kill rate
HoldDownSec15Seconds a battery stays HOT after its target goes stale or after a handoff (used for last-chance detection check)
EngageTimeoutSec45Seconds without firing before Medusa considers handing off to an equal-Pk battery (before this, requires 50% better Pk)
StickyRangePct15How far below PkFloor the Pk must drop before releasing. Prevents flickering at range boundaries
LookaheadSec8Seconds 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
MaxTargets1Maximum concurrent target assignments per battery
TargetKillRate0.50Target actual kill rate for Rolling Pk. If the network kills above this rate, PkFloor loosens. Below it, PkFloor tightens. Lower values make the IADS more aggressive
EngageTactics"SHOOT_IN_DEPTH"How many batteries can engage the same track. SHOOT_LOOK_SHOOT = one at a time. SHOOT_IN_DEPTH = one per role tier (one VLR, one LR, one MR, one SR). SHOOT_SHOOT = up to 2 batteries. SHOOT_SHOOT_FLOOD = up to 2 LR/MR batteries, plus all SR SAMs and AAA in range. VLR_SAM batteries always use SHOOT_LOOK_SHOOT among themselves but never block other tiers from engaging the same track
MaxEngageRangePct(none)Per-role hard cap on engagement range as % of hardware max. See Doctrine for details