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
trackRadarfield 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. GlobalewDetectionRangeconfig 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
ewPollIntervalseconds. Instead, it spreads work across time: one sector per sub-cycle, withsubInterval = 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 = trueand 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 NMwhen a cap is set - EW contact state logging —
contacts acquired/contacts lostmessages in debug mode
Changed¶
- Zone-aware activation range —
_CheckActivationnow 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 elimination —
pcall(function() return det.object:getCategory() end)replaced withpcall(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 nevatosnr s-125 tr(confirmed via DCS unit dump). - SA-5 track radar verified —
RPC_5N62Vconfirmed 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
hasContactsset before range filter —ew.hasContactswas flagged before detection range cap filtered contacts. Now set only after at least one contact survives all filters. - HARM detection vs frustration race —
harmCooldownUntilis 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
DEFIANTwhen 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
sectorfield 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¶
harmInboundflag — 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_TABLEfor 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
posfield cached at init for detection delay calculations - F10 markers show
PB HARM INBOUNDcountdown,JAMMED EMCON (ECM)state, andBURN-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_FREEROE manipulation in ECM section (replaced by state transitions viaenableEmission)
v0.7.0 — 2026-02-23¶
Added¶
- ECM Jammer Framework (Phase 6.0) — ECM aircraft suppress emitting SAMs via
WEAPON_HOLD JAMMER_DBwith 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_BIRTHin multiplayer - Per-group F10 menu for player ECM (ON/OFF/STATUS)
- Burn-through mechanic — contacts close enough overcome jamming, SAM gets
WEAPON_FREE sam.jammedfield 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 forWEAPON_HOLDmid-trackclient-slot-debug.lua— client slot event logger for ECM discovery validationecmEnabledconfig option (defaultfalse)
Notes¶
WEAPON_HOLDmid-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 kill —
ALARM_STATE=GREENused instead ofenableEmission(false)for EW radars - EW
hasContactscleared 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=6ANDguidance=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