HARM Detection and Defense
All tracks in Medusa are the same. A track is a radar contact with a position, a velocity vector, and a history of where it has been. Medusa does not know whether a track is a fighter, a cruise missile, or a HARM. It has to figure that out from the flight behavior.
DCS does expose weapon type information on objects, but using it would be unrealistic. A real IADS identifies incoming missiles from radar returns and flight characteristics, not by reading a label. Medusa works the same way.
Detection
Section titled “Detection”Every second, Medusa evaluates active tracks that are moving faster than 50 m/s and have been tracked for at least 10 seconds. It measures 8 flight characteristics of each track:
- Speed. HARMs fly fast, typically Mach 1 to 3.
- Dive angle. HARMs pitch down steeply after their midcourse climb.
- Heading rate. HARMs fly a straight course toward an emitter. Fighters maneuver.
- Acceleration. After motor burnout, a HARM accelerates only from gravity during its dive. Fighters under power have different acceleration profiles.
- Closest point of approach (CPA). How close the track’s projected flight path comes to the nearest active radar. HARMs aim directly at emitters.
- CPA rate. Whether the CPA is getting smaller over time. A closing CPA means the track is homing.
- Range rate. How fast the track is closing on the nearest emitter.
- Altitude rate. HARMs follow a loft arc, climbing then diving. Fighters can fly at any altitude but don’t follow ballistic arcs.
Each of these is compared against a statistical profile of what HARM flight looks like versus normal aircraft flight. The comparison produces a score that accumulates over multiple scans. Positive scores mean the track looks more like a HARM. Negative scores mean it looks like a normal aircraft.
After 15 scans, Medusa starts classifying:
| Score | Label | Meaning |
|---|---|---|
| Above 4.55 | CONFIRMED | Track is classified as a HARM. This is permanent for this track. |
| Above 2.73 | PROBABLE | Strong HARM indicators but not confirmed yet |
| Above 1.14 | SUSPECT | Some HARM indicators present |
| Below -20 | CLEARED | Track is not a HARM. Can be re-evaluated if the track is less than 5 minutes old and still active, since no HARM has a flight time longer than that. |
Once a track is CONFIRMED, Medusa marks it as a HARM (AssessedAircraftType = HARM) and the HARM response system takes over. A CONFIRMED classification does not change back.
Defense strategies
Section titled “Defense strategies”When Medusa confirms a HARM heading toward a battery, it decides what to do based on the HARMResponse doctrine setting:
| Strategy | Behavior |
|---|---|
AUTO_DEFENSE | Checks for point defense, then checks if the battery has enough HARM-capable units to defend itself. If neither can protect it, shuts down. (default) |
SELF_DEFEND | Stays hot if the battery’s own defense points outnumber inbound HARMs. Does not count nearby point defense. |
SHUTDOWN_UNLESS_PD | Stays hot only if a HARM-capable point defense provider is assigned and alive. No math. |
SHUTDOWN | Always shuts down the threatened battery. |
IGNORE | No reaction to HARMs. |
How AUTO_DEFENSE decides
Section titled “How AUTO_DEFENSE decides”For each confirmed HARM, Medusa finds the battery closest to the HARM’s projected flight path (using CPA). It then checks, in order:
-
Point defense. If the battery has an assigned point defense provider (like a Tor or Pantsir) that is alive, has ammo, has HARM-capable units, and the HARM’s closest point of approach is within the provider’s weapon range, the battery stays hot. The PD provider handles the HARM. If the HARM is outside the provider’s reach, point defense is skipped and the battery falls through to self-defense or shutdown.
-
Self-defense. Medusa counts defense points for the battery. TLARs (all-in-one radar/launcher units like the Tor) count 4 points each. Standalone launchers count 1.5 points each. For
AUTO_DEFENSE, nearby point defense assets are added to the total. Medusa then counts how many HARMs are within the threat radius (default 15,000 meters CPA). If defense points outnumber the HARMs, the battery stays hot. -
Shutdown. If the battery can’t defend itself, Medusa turns off its radar, sets weapons hold, and disables its AI. The battery stays cold for the estimated time-to-impact plus a 20-second safety margin.
Which batteries can defend against HARMs?
Section titled “Which batteries can defend against HARMs?”DCS does not provide any API to ask whether a specific unit can engage a specific weapon. Medusa uses a lookup table of system name substrings that are checked against each unit’s DCS type name (the value returned by Unit.getTypeName()). If any entry in the list appears anywhere in the unit’s type name, that unit is considered HARM-capable. By default the list contains: S-300, Tor, Pantsir, Patriot, and NASAMS.
You can add systems to this list:
MEDUSA_CONFIG = { HarmCapableSystems = { "SA-15", "Roland" }, -- added to the built-in list}Batteries without any units matching these substrings get 0 defense points and will always shut down (or rely on point defense).
Ammo-aware defense points
Section titled “Ammo-aware defense points”Defense points are counted from unit types: TLARs contribute 4 points each, standalone launchers contribute 1.5 points each. By default these counts come from the number of living units, regardless of how much ammo they have left. A Tor battery with three vehicles has 12 defense points even if it is down to its last missile.
Set HARMSaturateOnAmmo = true to cap a battery’s defense points at its remaining ammo count. That same Tor battery with 1 missile left gets 1 defense point instead of 12. If 2 HARMs are inbound, the battery shuts down.
This also applies to pooled neighbors (see below). Each neighbor’s contribution is individually capped at its own ammo.
Consider the tradeoff in mass ARM saturation attacks. A battery with 2 missiles facing 3 HARMs shuts down rather than killing 2 out of 3. If the ARMs already had good knowledge of the battery’s radar positions before shutdown, the battery may end up taking all 3 hits instead of stopping 2 of them.
Pooled defense points
Section titled “Pooled defense points”By default, the self-defense check only counts the battery’s own units. Nearby HARM-capable batteries are not considered (unless using AUTO_DEFENSE, which adds point defense assets).
Set PoolDefensePoints = true and PoolDefensePointsRadius to a distance in meters (1,000 to 100,000). During the self-defense check, Medusa queries all HARM-capable batteries within that radius and adds their defense points to the total. Point defense batteries are excluded from this count to avoid double-counting with the point defense check that runs first.
This matters for dense SAM clusters. Three SA-15 batteries 5 km apart each have 4 defense points alone. With pooling at 10 km radius, any one of them gets 12 pooled defense points. An attacker needs to overwhelm all three to force shutdowns.
Medusa_MM_Doctrine = { HARMSaturateOnAmmo = true, PoolDefensePoints = true, PoolDefensePointsRadius = 10000, -- 10 km}HARM assignment priority
Section titled “HARM assignment priority”Confirmed HARM tracks are assigned to batteries separately from normal target assignment. Only batteries with HARM-capable units are considered. An SA-2 or SA-5 will never be activated to engage a HARM.
Among HARM-capable batteries, Medusa picks the one with the highest estimated Pk against the HARM, the same way it picks batteries for normal targets.
What shutdown looks like
Section titled “What shutdown looks like”When a battery shuts down for a HARM:
- Radar emissions turn off
- ROE set to weapons hold
- DCS AI is fully disabled (not just weapons hold, but AI processing stops)
- The battery stays cold for the estimated time the HARM needs to arrive, plus 20 seconds
During shutdown, the battery cannot be assigned to any target. After the shutdown timer expires, EMCON resumes control of the battery’s emissions based on doctrine policy.
Doctrine fields
Section titled “Doctrine fields”| Field | Default | What it does |
|---|---|---|
HARMResponse | "AUTO_DEFENSE" | Which defense strategy to use |
HARMShutdownM | 15000 | CPA distance in meters for a battery to be considered threatened by a HARM |
HARMSaturateOnAmmo | false | Cap defense points at remaining ammo count |
DefendPk | 0.30 | Minimum estimated Pk for a point defense battery to activate against an inbound HARM |
PoolDefensePoints | false | Pool defense points from nearby HARM-capable batteries during self-defense check |
PoolDefensePointsRadius | none | Radius in meters for pooled defense point query (1,000 to 100,000) |