Skip to content

Changelog

All notable changes to AEGIS IADS.


v0.8.0 — 2026-03-01

Merges all v0.7.3 branch work (v0.7.3-1 performance, v0.7.3-2 diagnostics) into a single release. Tested across two full squadron sessions (v0.7.3-1 and v0.7.3-2) totaling ~174 minutes, 91 HARM engagements, and zero scripting errors. All features from v0.7.3 are included.

Added

  • Critical Unit Tracking (Mission Kill Detection) — SAM types with a dedicated tracking radar (SA-2, SA-3, SA-5, SA-6, SA-10, HAWK, PATRIOT) now have a trackRadar field in SYSTEM_DB. At init, AEGIS finds the tracking radar unit by DCS type name and stores its identity. In _OnDeath(), a two-tier check runs: Tier 1 checks if the tracking radar unit is dead (mission kill), Tier 2 falls back to group-level check. Mission-killed SAMs are marked DESTROYED and surviving units are silenced (ALARM_STATE=GREEN + enableEmission(false) + WEAPON_HOLD). Self-contained systems (SA-8, SA-11, SA-15, TOR, etc.) keep the existing group-kill logic. Orphan PD promotion now fires correctly on mission kill.
  • EW Detection Range Override — Per-EW detection range cap via DET{range} name suffix (e.g., EW-NORTH-DET120). Contacts beyond the cap are dropped before feeding to the sector. Models degraded radars, terrain masking, or doctrinal placement without touching DCS unit properties. Global ewDetectionRange config default (0 = no limit).
  • High Digit SAMs (HDS) support — SYSTEM_DB entries for SA-10B, SA-12, SA-17, SA-20A, SA-20B, SA-21, SA-23. Track radar associations from DCS unit dump. Mast-mounted engagement radars selected as mission-kill targets for SA-20B and SA-21. WEZ/NEZ values are real-world estimates pending in-game verification.
  • CurrentHill mod support — SA-15CH (TOR-M2) entry with higher WEZ and altitude ceiling than base SA-15.
  • Round-robin EW polling — The EW poll loop no longer processes all sectors in a single burst every ewPollInterval seconds. Instead, it spreads work across time: one sector per sub-cycle, with subInterval = ewPollInterval / numSectors. A 7-sector network with a 10s poll interval fires every ~1.4s, processing one sector each tick. Total work per full rotation is identical — same contacts, same state transitions, same DCS API calls — just spread across time instead of spiked.
  • Activation range diagnostic logging — When debug = true and a SAM has EW-fed contacts outside its activation range, the poll loop logs the nearest contact distance and effective actRange: SA6-WEST-3: nearest contact 27.3 NM (actRange 22 NM). Fires once per poll cycle per SAM with contacts outside actRange. Silent when contacts are in range or when no contacts exist.
  • SAM position in discovery log — SAM registration log lines now include DCS coordinates: SAM: SAM-SA6-WEST-3 [SA6 AREA] (TR: ...) @(234567, 456789). Always logged (not debug-only). Enables position comparison between mission files.
  • Debug performance logging — When debug = true, each sector poll logs elapsed time and contact count if >1ms: PERF: NORTH poll 2.3ms (12 contacts). Silent when below threshold.
  • _CheckActivation() returns two additional values: nearest alt-valid contact distance (NM) and effective actRange (NM). Existing callers unaffected (Lua ignores extra returns).
  • Startup log shows sector count and sub-interval: EW poll started (every 10s, 7 sectors, sub-interval 1.4s)
  • DET suffix parsed once at init using order-independent segment scanning — zero runtime cost
  • Squared-distance range filter in EW poll loop, short-circuited when detRangeSq == 0
  • PB HARM EW detection delay gated by detection range — EW can't score on a HARM it can't see
  • F10 EW markers show Detection: XX NM when a cap is set
  • EW contact state logging — contacts acquired / contacts lost messages in debug mode

Changed

  • Zone-aware activation range_CheckActivation now derives actRange from the active engagement zone (NEZ or WEZ) plus the system's built-in margin. A NEZ SA-6 (nez=6, margin=4) activates at 10 NM, not the default 22 NM. ACT suffix still overrides.
  • pcall closure eliminationpcall(function() return det.object:getCategory() end) replaced with pcall(det.object.getCategory, det.object) in the contact filter loop. Zero closure allocation per contact per poll.

Fixed

  • SA-3 track radar type name — Corrected from snr s-125 neva to snr s-125 tr (confirmed via DCS unit dump).
  • SA-5 track radar verifiedRPC_5N62V confirmed via DCS unit dump, removed UNVERIFIED tag.
  • Alert frustration cooldown — After frustration powers down a SAM, a 30-60s cooldown prevents the next poll cycle from immediately re-alerting on the same contact. WEZ contacts still break cooldown immediately.
  • EW hasContacts set before range filterew.hasContacts was flagged before detection range cap filtered contacts. Now set only after at least one contact survives all filters.
  • HARM detection vs frustration raceharmCooldownUntil is now set at detection time (not just after crew delay), freezing the SAM's state during processing.

v0.7.2 — 2026-02-24

Added

  • Alert Frustration — SAM in ALERT with no contacts inside WEZ powers down after 30-60s (configurable). 10% chance crew stays hot and re-rolls. Prevents SAMs from staying lit indefinitely for recce aircraft loitering at the activation range edge.
  • Nat 20 Bravery Roll — Any crew has a 5% chance to STAY_HOT against a HARM, regardless of system capability. Even a non-selfProtect SA-2 crew might decide to fight back. Multi-HARM saturation still overrides. F10 marker shows DEFIANT when triggered.
  • Orphan Promotion — When a PD's parent SAM is destroyed, the PD promotes to an autonomous SAM and starts EMCON cycling independently. An orphaned SA-15 is still a capable short-range SAM.
  • _PromoteOrphanPD() — creates full SAM entry from PD data, manages sector list transitions
  • New config parameters: alertFrustrationMin/Max, alertFrustrationStayPct, harmBraveryPct
  • PD nodes now track sector field for orphan promotion

v0.7.1 — 2026-02-23

Changed

  • TOO/SP HARM reaction delay increased from 1-4s to 8-12s (models full detection + classification + crew action pipeline)
  • ECM jam effect replaced WEAPON_HOLD with jammed EMCON cycling — SAMs go dark when jammed, cycle intermittently with burn-through window
  • PB HARM EW network warning now delayed by EW detection time (score-per-sweep model based on HARM-to-EW range)
  • PB HARM EW warnings gated on ETA — warning only sent if it arrives before HARM impact

Added

  • harmInbound flag — PB HARMs set a flag on all SAMs in trajectory regardless of EW coverage. If SAM emits while flag active, own-radar HARM detection triggers reaction tree.
  • PB HARM score table — configurable PB_HARM_SCORE_TABLE for EW detection delay based on range (12s floor at close range, effectively never at 70+ NM)
  • Jammed EMCON cycling — jammed SAMs cycle with separate timing (8-15s on, 45-120s off), burn-through contacts engageable during 1-3s jam detection window
  • Burn-through monitoring — SAMs stay ALERT engaging as long as burn-through contacts remain in range, monitored every 5s
  • _ComputeEWDetectionDelay() — score-per-sweep computation, multiple EWs sum independently
  • _CheckHarmInbound() / _TriggerHarmInboundReaction() — own-radar HARM detection helpers
  • _StartJammedEMCON() / _StopJammedEMCON() — jammed EMCON lifecycle management
  • _JammedEmconOnPhase() / _JammedEmconOffPhase() — jammed EMCON timer chain
  • _JammedBurnThroughMonitor() — sustains ALERT while burn-through contacts exist
  • New config parameters: pbHarmInboundMargin, pbHarmEwReactionMin/Max, pbHarmDetThreshold, pbHarmSweepPeriod, pbHarmDetFloor, jamDetectionDelayMin/Max, jamEmconOnMin/Max, jamEmconOffMin/Max
  • EW node pos field cached at init for detection delay calculations
  • F10 markers show PB HARM INBOUND countdown, JAMMED EMCON (ECM) state, and BURN-THROUGH (ECM) during burn-through engagement
  • EW poll guards jammed EMCON — poll hands off state transitions while jammed EMCON timer chain is active

Removed

  • WEAPON_HOLD / WEAPON_FREE ROE manipulation in ECM section (replaced by state transitions via enableEmission)

v0.7.0 — 2026-02-23

Added

  • ECM Jammer Framework (Phase 6.0) — ECM aircraft suppress emitting SAMs via WEAPON_HOLD
  • JAMMER_DB with per-type effectRange and burnThrough (GROWLER, PROWLER, SPARKVARK, GENERIC)
  • AI ECM aircraft auto-discovered at startup (opposing coalition, ECM- prefix)
  • Player client ECM discovered via S_EVENT_BIRTH in multiplayer
  • Per-group F10 menu for player ECM (ON/OFF/STATUS)
  • Burn-through mechanic — contacts close enough overcome jamming, SAM gets WEAPON_FREE
  • sam.jammed field for marker and status display
  • F10 markers show *** JAMMED (ECM) *** on suppressed SAMs
  • ECM aircraft markers with type, range, active state
  • Jammer info in status report and topology
  • weapon-hold-test.lua — DCS API validation script for WEAPON_HOLD mid-track
  • client-slot-debug.lua — client slot event logger for ECM discovery validation
  • ecmEnabled config option (default false)

Notes

  • WEAPON_HOLD mid-track behavior awaiting DCS in-game validation

v0.6.2 — 2026-02-21

Added

  • PB HARM Network Warning (Phase 5) — trajectory projection warns SAMs in the HARM's path
  • S_EVENT_SHOT + weapon poll at T+2s for position/velocity
  • Ray projection math identifies SAMs within 5 NM of projected path
  • Network-gated: only SAMs with a live EW in their sector receive warnings
  • Emitting SAMs get full HARM reaction; dark SAMs get EMCON suppression
  • Dark SAMs with PD: PD goes ALERT to defend while parent stays dark
  • Weapon-alive cooldown extension — tracks weapon object, extends cooldown while HARM in flight

Fixed

  • PD stays hot during parent HARM reaction — PD reads parent's harmCooldownUntil
  • HARM targeting PD redirects to parent SAM — co-located PD treated as same threat
  • GO_DARK activates PDs — covers panic/multi-HARM bypassing LAST_DITCH path
  • EW power killALARM_STATE=GREEN used instead of enableEmission(false) for EW radars
  • EW hasContacts cleared on death/depower to prevent stale contact data

v0.3.2

Added

  • HARM Reaction Policies (Phase 3.2) — decision tree for HARM response
  • Self-protect systems (SA-10, SA-11, PATRIOT, SA-15, TOR) → STAY_HOT, engage ARM
  • SAMs with live PD → LAST_DITCH, PD defends then parent goes dark
  • All others → GO_DARK with jittered cooldown
  • Crew reaction delay (1-4s randomized)
  • Cooldown jitter (45-90s instead of fixed 60)
  • Panic chance (15%) — selfProtect crew goes dark anyway
  • Multi-HARM saturation — 2+ HARMs within 15s forces GO_DARK regardless

v0.3.1

Added

  • HARM Detection (Phase 3.1) — S_EVENT_SHOT hook identifies anti-radiation missiles
  • ARM identification via missileCategory=6 AND guidance=5
  • TOO/SP mode: getTarget() maps HARM to tracked SAM
  • GO_DARK reaction with cooldown guard
  • Contact Filtering — only aircraft and TALDs trigger SAM activation
  • Bombs, HARMs, AAMs, SAM missiles filtered from contact lists

v0.2.0

Added

  • Infrastructure Dependencies (Phase 2) — EW and PWR nodes
  • Per-node power sources (name-based auto-linking)
  • EMCON Cycling — degraded SAMs cycle radar on/off with randomized timing
  • Startup jitter, threat memory, quick peek, double-sweep, neighbor spook
  • Configurable EMCON timing and jitter parameters

v0.1.0

Added

  • Core IADS (Phase 1) — EW-driven WEZ gating
  • SAMs start dark, activate based on EW radar feeds
  • Activation range vs engagement zone (actRange vs WEZ/NEZ)
  • Point defense slaving
  • Group name overrides (zone, range, activation suffixes)
  • Order-independent suffix parsing
  • Name-based sector assignment
  • F10 map debug markers and radio menu status
  • Zero dependencies — no MOOSE, no MIST, no desanitization