Skip to content

Changelog

All notable changes to AEGIS IADS.


v0.8.4-beta2 — 2026-04-03

Mobile SAM Position Tracking. SAMs with the MOB suffix get periodic position updates, enabling shoot-and-scoot and convoy escort scenarios.

Added

  • MOB suffix for SAM groups. SAM-SA22-NORTH-1-MOB opts the SAM into periodic position polling. Static SAMs are unaffected.
  • Tiered position polling. Idle mobile SAMs poll every 60s, active SAMs poll every 20s. DESTROYED SAMs skipped.
  • Round-robin mobile poll. Position updates spread across time — no burst of API calls.
  • [MOB] in topology log and F10 markers. Mobile SAMs clearly identified in discovery and debug output.

Added — EA

  • DIR pod bearing display. Pod assignments show bearing to target in F10 STATUS, GUI, and markers.
  • Range-dependent EW pie narrowing. Pie shrinks with distance beyond 45 NM. Standoff jamming covers narrower arc.
  • ESM range reveal. Range estimates build over time: NONE → LOW (±20 NM) → MED (±10 NM) → HIGH (~5 NM). Stale emitters decay.

Fixed

  • Pod swap clears old assignment. Reassigning a target to a different pod now clears the original pod instead of duplicating.
  • EW contact masking pie scales with power density. More focused beam = wider shadow. OMNI ±25° (was ±30°), W90 ±30° (was ±45°), W70 ±37° (was ±35°), W50 ±45° (was ±25°), DIR ±60° (unchanged).

v0.8.4-beta — 2026-03-14

Unified Burn-Through Physics + SYSTEM_DB Corrections + Companion App. EW burn-through formula rewrite, per-system tracking bias, sector jam behavior fixes, HERC jammer platform, SYSTEM_DB WEZ corrections, Gladiator/Giant missile split for S-300V family, and an IADS companion visualizer.

Changed — EA

  • EW burn-through formula rewritten. Physics-based β constant replaces the old multi-knob formula. Fewer config parameters, more accurate results. ewBeta = 1.8 default.
  • Per-system trackingBias in SYSTEM_DB. Each SAM type now has its own tracking bias from SME-corrected TR/Eff ratios (1.05–3.19). Systems with large radar headroom (SA-2, SA-3, SA-6) are harder to jam; radar-limited systems (SA-23V4G, SA-23G, PATRIOT) are easier. samTrackingBias global default lowered from 1.5 to 1.0.
  • Sector jam flag is now observable. Only set when jamming actually masks a contact. Prevents distant jammers from false-flagging sectors.
  • Nearest-EW bearing gate. Jam axis check uses nearest EW only — fixes false positives in multi-EW formations.
  • HERC jammer platform. EC-130H Compass Call support (EA-HERC-{anything}). Prowler, Sparkvark, and Generic types removed — simplified to Growler and HERC.

Changed — SYSTEM_DB

  • SA-6 WEZ corrected. 18 → 14 NM. Old value exceeded the 3M9M missile's effective range.
  • SA-11 WEZ corrected. 18 → 25 NM. Was incorrectly identical to SA-6 despite nearly double the launcher range.
  • PATRIOT WEZ corrected. 40 → 80 NM. PAC-2 GEM/T goes 81 NM — old value was a pre-HDS guess.
  • SA-22 Pantsir-S1 added. CurrentHill mod. WEZ 11 NM, PD category, selfProtect.
  • SAMP/T added. HDS mod. WEZ 65 NM (Aster 30), AREA category, selfProtect.
  • SA-12/SA-23 Gladiator/Giant split. Defaults now model Gladiator missiles (medium-range, all altitudes) instead of Giant (high-altitude/ABM only, H_min 3,281 ft). SA-12: 54→41 NM. SA-23: 108→54 NM. Use SA12G/SA23G suffix for Giant-range modeling. New V4 entries: SA23V4 (81 NM), SA23V4G (205 NM).

Added

  • IADS companion visualizer. Real-time IADS status visualization via UDP export, Python bridge, and web UI.

Changed — Performance

  • EW sub-polling. EW radars within a sector now poll one at a time at 200ms intervals instead of all at once. Each tick = exactly 1 getDetectedTargets() call. SAM state machine runs after the last EW completes.
  • Redundant API call elimination. State transitions with identical DCS commands (e.g., DARK→AWARE) skip all DCS API calls. PD slaving is now event-driven (updates when parent transitions, not every poll tick). Several internal lookups optimized from O(all PDs) to O(children).

Fixed

  • Static object discovery for PWR/CMD. Power sources and command centers placed as static objects (e.g., HESCO generators) are now discovered automatically. Previously only dynamic ground groups were scanned.

v0.8.3 — 2026-03-11

NEZ Ambush Reset + EA GUI Fixes. NEZ SAMs now use full WEZ for frustration decisions once the ambush is sprung, DIR burn-through normalization fixed, SET_BRG supports ABS/REL magnetic bearings, and several EA GUI reliability fixes.

Added

  • NEZ frustration gating (ambush reset). ALERT SAMs with NEZ zone override now use their full system-rated WEZ for frustration/stay-hot decisions instead of the restricted NEZ. Once the ambush is sprung, the SAM fights with full capability. Dropping to AWARE resets the ambush — requires NEZ actRange entry again. Non-NEZ SAMs: zero behavior change.
  • SET_BRG ABS/REL mode. Bearing input text box now sends ABS or REL flag based on the panel's bearing mode toggle. ABS mode converts magnetic bearing to true using calibrated declination. REL mode offsets from current heading (legacy behavior). Old hooks default to REL (backward compatible).

Fixed

  • DIR burn-through distance normalization. DIR jammers were ~22% weaker than intended at range due to normalizing against base range instead of the DIR-extended range. Now normalizes correctly. OMNI/WIDE unaffected.
  • SP fallback fires in multiplayer. The single-player EA fallback could map a non-jammer player to someone else's jammer in MP. Replaced with slot-based lookup — if the slot doesn't map to a jammer unit, no fallback fires.

Changed

  • EA REQ logging gated behind debug. EA GUI request logging now only fires when debug = true. Reduces log volume with active EA players.
  • Hook poll interval increased. EA GUI hook default poll interval from 1.5s to 2.0s. Reduces server UDP load.

v0.8.2 — 2026-03-07

HARM Reaction Tuning + Singleplayer EA Fixes. Four changes from squadron feedback to improve HARM reaction realism, plus six fixes for EA in singleplayer.

Changed

  • Crew reaction delay reduced. harmReactionDelayMin/Max from 8-12s to 6-9s. Tighter detection → classification → action pipeline.
  • First-HARM-only reaction. Crew reacts to the first HARM detected. Subsequent HARMs increment the multi-HARM saturation counter but do not restart the reaction delay timer.
  • Per-SAM saturation threshold. harmMultiThreshold replaced by harmMultiThresholdMin/Max (default 4-8). Each SAM crew rolls a random threshold at init — crew personality. Old config key accepted for backward compat.
  • SP + PD saturation exception. SAMs that are both selfProtect AND have live PD escorts fight through multi-HARM saturation (STAY_HOT). Kill the PDs first, then saturate.

Fixed

  • Singleplayer EA treated as AI. In SP, the player's EA aircraft was registered as AI at mission start. When the player spawned in, it wasn't upgraded to player-controlled — no F10 menu, no GUI, AI OMNI jamming. Now auto-upgrades on spawn. MP unaffected.
  • EA GUI hook: config override blocks SP localhost. Saved MP server address prevented localhost auto-connect in SP. Reordered discovery: SP localhost first, then chat auto-connect, then config as fallback.
  • EA socket: LuaSocket not found in mission env. Now prepends LuaSocket paths before requiring — fixes require("socket") failure even with desanitized MissionScripting.lua.
  • EA GUI: SP player name mismatch. Hook and mission use different player names in SP. Added fallback: find first player-controlled jammer when lookups fail.
  • EA GUI: SP connection timeout. Hook now retries on localhost in SP instead of dropping to manual setup mode when the mission socket isn't ready yet.
  • EA GUI: SP dormant after first empty response. Hook went permanently dormant in SP because onPlayerChangeSlot never fires. Now skips dormant logic in SP.

Added

  • HARM detection range gate. harmDetectionRange (default 40 NM). SAM tracking radar has finite detection range against ARM RCS (~0.1 m²). HARMs launched beyond detection range are invisible until they close. Detection delay computed from excess distance at typical AGM-88 speed (680 m/s). Configurable, 0 = unlimited (legacy).

Removed

  • Configurator presets. Removed Veteran/Conscript/Ambush/Paranoid presets from the Setup Configurator. Individual parameter controls remain.

v0.8.1 — 2026-03-06

Electronic Attack v2 — Complete EA system overhaul. Physics-based burn-through with antenna gain curves, WIDE mode presets, Home-on-Jam, passive ESM with NATO threat identification, GUI overlay with copilot/WSO support, and server auto-discovery. Merges all v0.8.0-1 and v0.8.0-2 development.

Added — EA Core

  • Physics-based burn-through formula. burnRange × ratio × gainMult / mult × pow(dist/effectRange, exponent). Applied at both EW and SAM layers. Based on √Rj radar physics. Contacts inside burn-through range pass through jamming.
  • Physics-based antenna gain curve. _BeamGain(halfAngleDeg) derives jam power from beam width: 0.4 / (1 - cos(rad(angle)))^0.29. Replaces hand-tuned omniSpread / directionalFocus with physics. Gain auto-computed at init from configurable half-angles.
  • EW contact filtering. Per-contact geometric jam zone filter in the EW poll loop. Bearing-based pie masking with cosine gradient and burn-through distance comparison. Contacts outside the jam pie or inside burn-through range pass unfiltered.
  • Sector jam warning (C2 path). When EW detects jamming, sector.jammed = true. DARK/AWARE SAMs in jammed sectors start EMCON cycling (go autonomous). Same degradation as losing the EW, except the EW is still alive and feeding contacts that survive the jam filter.
  • Four jammer modes. OMNI (2 pods barrage), WIDE (configurable cone + 1 directional pod), 2xDIR (2 independent directional pods), OFF. AI jammers default to OMNI. Player jammers default to OFF.
  • WIDE mode presets (W90 / W70 / W50). WSO can adjust the WIDE cone width in-flight. W90 = ±45° (0.61x gain), W70 = ±35° (0.68x, default), W50 = ±25° (0.80x, tightest). Selectable via F10 submenu or EA GUI buttons.
  • Directional pod targeting. Lock onto specific radiating emitters via F10 menu or EA GUI. Directional gets longer range (90 NM) and deeper suppression.
  • JAMMER_BASELINE table. Single shared baseline with all tuning knobs (effectRange, pods, burnThroughRatio, burnExponent, gains, pie widths, biases). Overridable via config.jammerBaseline.
  • WSO F10 menu. Full pod management under F10 > EA. Mode selection, pod submenus with bearing lock and target select, STATUS command.
  • Emitter alerts. Player jammers get NEW EMITTER and EMITTER LOST alerts when radiating emitters enter/leave range.

Added — Home-on-Jam (Phase 6.3)

  • Home-on-Jam. HOJ-capable SAMs (SA-10, SA-10B, SA-11, SA-12, SA-17, SA-20A, SA-20B, SA-21, SA-23, PATRIOT) can break through jamming with escalating probability per peek (7% base + 7% per consecutive peek). 75-120s weapons-free window, 60s cooldown. Disable with hojEnabled = false.
  • Differentiated jammed EMCON timing. HOJ-capable SAMs peek aggressively (12-25s on, 20-45s off). Standard SAMs peek cautiously (5-10s on, 60-150s off). Independent of HOJ toggle.

Added — Passive ESM

  • Passive emitter display. Emitter list populates regardless of jammer mode (including OFF). ESM is a passive receiver — the WSO sees threats before deciding to jam. Applies to both EA panel and F10 status.
  • Signal strength bars. 5-bar indicator (||||| to |....) based on distance relative to emitter reference range. Displayed in F10 status, F10 target menu, and EA panel.
  • Relative bearing. Emitter bearings displayed relative to aircraft nose (0° = dead ahead, 90° = 3 o'clock).
  • ESM emitter identification — NATO reporting names. srLabel field in SYSTEM_DB maps each SAM type to its NATO reporting name (e.g., SA-2 → "Fan Song", SA-6 → "Straight Flush", SA-10 → "Big Bird"). PD/SHORAD falls back to system designator. EW stays "EW".
  • Generic emitter labels. Emitters labeled by NATO radar name by default. eaDebugLabels = true shows full group names + type tags.
  • Stale emitter retention (threat memory). Emitters persist for eaEmitterMemory seconds (default 60) after they stop radiating. Stale emitters display ~~~~~. Destroyed emitters drop immediately.

Added — EA GUI Overlay

  • EA GUI overlay. Optional clickable panel for EA pilots. Mission-side UDP socket (port 19410) via pcall(require, "socket"). Client-only DCS hook with DialogLoader panel. Silent no-op if socket unavailable. F10 menus and GUI stay in sync.
  • Server discovery — SRS-style auto connect. Server hook sends AEGIS-EA:host:port chat message to connecting players. Client intercepts in onChatMessage(). No manual IP entry needed. Singleplayer auto-connects to localhost.
  • Copilot/WSO support via slot-based lookup. Hook captures DCS slot ID on every slot change. Mission script builds eaUnitMap (unit ID → jammer group name). _FindJammerBySlot() strips seat suffix (207_2207) and resolves via unit map. Both pilot and copilot/WSO get the EA GUI panel.
  • Bearing input text box (WIDE mode). WSO types a relative bearing (0-359°) and locks the WIDE cone to that direction without maneuvering. SET_BRG command.
  • Magnetic declination calibration. CALIBRATE button stores heading offset. REL/ABS toggle switches emitter bearings between nose-relative and magnetic absolute.
  • Connection timeout → setup mode fallback. After 10s without server response, panel switches to manual address input.
  • Client dormant mode. Non-EA clients stop polling after empty state response. 5s grace period on slot changes. Reduces server load.
  • Pod label cache. Cached display labels prevent raw group names from leaking when emitters go dark.

Changed

  • Renamed ECM- prefix to EA- (Electronic Attack). ECM- still accepted with deprecation warning. ecmEnabled config renamed to eaEnabled (old key still accepted).
  • _ComputeBurnThrough signature. 5th parameter changed from isDirectional (boolean) to gainMult (number).
  • EA wire protocol. 11 pipe-delimited state fields. 5-field emitter entries (name;label;brg;strength;staleFlag). Slot ID in REQ/CMD packets (null-byte delimited, backwards compatible).
  • _IsJammed() rewritten. Formula-based with mode awareness and Home-on-Jam immunity window.
  • JAMMER_DB simplified. Per-type entries reduced to a single mult multiplier.

Fixed

  • Dead onDuration in jammed EMCON — config fields now actually drive on-cycle timing.
  • HALF_DIR hemisphere missing on SAM layer — SAMs behind the aircraft no longer incorrectly jammed.
  • WIDE mode bearing lock bug — cone follows locked bearing, not heading.
  • Ghost control_OnDeath clears jammerPlayers entries for killed jammer.
  • Player re-slot kills jammer — re-slot now reactivates correctly.
  • Any crew leave kills jammer — multicrew now counts remaining crew, deactivates on last-out.

Removed

  • TOR entry from SYSTEM_DB. Unused — falls through to UNKNOWN defaults.
  • Dead flat jamEmcon* config keys. Old undifferentiated jammed EMCON timing constants removed (superseded by HOJ/STD variants).

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

  • License — Code licensed under GPLv3. Documentation licensed under CC BY-SA 4.0.
  • 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

  • ECM enabled by defaultecmEnabled now defaults to true. ECM aircraft detection and jammed EMCON cycling are active out of the box. Set ecmEnabled = false to disable.
  • 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, CMD, PWR nodes
  • Per-node power sources (name-based auto-linking)
  • CMD kill degrades sector to EMCON
  • 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