@@ -557,123 +557,153 @@ MANTIS.JammerLoadoutTiers = {
557557-- @type MANTIS.JammerJitterPercent
558558MANTIS .JammerJitterPercent = 0.10
559559
560- --- Jammer SAM Parameters — v8 curves {peak%, mu_nm, sigma_L, tail_dist, band, floor%}
561- -- floor: residual effectiveness inside burnthrough (noise injection)
560+ --- Jammer SAM Parameters — v9 curves (v8.1) {peak%, mu_nm, sigma_L, tail_dist, band, floor%}
561+ -- v9 changes from v8:
562+ -- * Width rework: curves now track radar detection/track envelope (not just missile range)
563+ -- * Long-range systems widened (SA-5, SA-21, SA-23, Nike, PAC-2, S-300/400 family)
564+ -- * Short-range systems tightened (SA-19, SON-9, HQ-7, Rapier)
565+ -- * HAWK widened to match CW illuminator envelope (~90nm)
566+ -- floor: residual effectiveness inside burnthrough (now tapers past mu with R^2 falloff)
562567-- 5 = legacy radar, no ECCM | 3 = moderate ECCM | 2 = advanced ECCM/AESA | 0 = optical/IR
563568-- @type MANTIS.JammerSAMParams
564569MANTIS .JammerSAMParams = {
565- [" Nike" ] = {peak = 78 ,mu = 35 ,sigma_L = 14 ,tail_dist = 80 , band = " S" , floor = 5 },
566- [" Hawk" ] = {peak = 30 ,mu = 15 ,sigma_L = 6 , tail_dist = 28 , band = " IJ" , floor = 3 },
567- [" SA-2" ] = {peak = 75 ,mu = 40 ,sigma_L = 16 ,tail_dist = 85 , band = " S" , floor = 5 },
568- [" SA-3" ] = {peak = 45 ,mu = 22 ,sigma_L = 10 ,tail_dist = 50 , band = " IJ" , floor = 5 },
569- [" SA-5" ] = {peak = 52 ,mu = 60 ,sigma_L = 22 ,tail_dist = 110 ,band = " S" , floor = 5 },
570- [" SA-6" ] = {peak = 33 ,mu = 18 ,sigma_L = 8 , tail_dist = 42 , band = " IJ" , floor = 3 },
571- [" SA-8" ] = {peak = 38 ,mu = 10 ,sigma_L = 4 , tail_dist = 22 , band = " IJ" , floor = 3 },
570+ -- Standard SamData (canonical entries — aliases below point to these)
571+ [" Nike" ] = {peak = 78 ,mu = 55 ,sigma_L = 22 ,tail_dist = 110 ,band = " S" , floor = 5 },
572+ [" Hawk" ] = {peak = 30 ,mu = 22 ,sigma_L = 9 , tail_dist = 55 , band = " IJ" , floor = 3 },
573+ [" SA-2" ] = {peak = 75 ,mu = 40 ,sigma_L = 16 ,tail_dist = 90 , band = " S" , floor = 5 },
574+ [" SA-3" ] = {peak = 45 ,mu = 22 ,sigma_L = 10 ,tail_dist = 52 , band = " IJ" , floor = 5 },
575+ [" SA-5" ] = {peak = 52 ,mu = 75 ,sigma_L = 26 ,tail_dist = 145 ,band = " S" , floor = 5 },
576+ [" SA-6" ] = {peak = 33 ,mu = 18 ,sigma_L = 8 , tail_dist = 48 , band = " IJ" , floor = 3 },
577+ [" SA-8" ] = {peak = 38 ,mu = 10 ,sigma_L = 4 , tail_dist = 24 , band = " IJ" , floor = 3 },
572578 [" SA-9" ] = {peak = 3 , mu = 3 , sigma_L = 1 , tail_dist = 5 , band = " OPT" ,floor = 0 },
573- [" SA-10" ] = {peak = 32 ,mu = 50 ,sigma_L = 20 ,tail_dist = 90 , band = " S" , floor = 3 },
574- [" SA-11" ] = {peak = 52 ,mu = 28 ,sigma_L = 12 ,tail_dist = 55 , band = " IJ" , floor = 3 },
579+ [" SA-10" ] = {peak = 32 ,mu = 50 ,sigma_L = 20 ,tail_dist = 95 , band = " S" , floor = 3 },
580+ [" SA-10B" ] = {peak = 30 ,mu = 52 ,sigma_L = 20 ,tail_dist = 100 ,band = " S" , floor = 3 },
581+ [" SA-11" ] = {peak = 52 ,mu = 28 ,sigma_L = 12 ,tail_dist = 58 , band = " IJ" , floor = 3 },
575582 [" SA-13" ] = {peak = 3 , mu = 3 , sigma_L = 1 , tail_dist = 5 , band = " OPT" ,floor = 0 },
576- [" SA-15" ] = {peak = 30 ,mu = 14 ,sigma_L = 6 , tail_dist = 30 , band = " IJ" , floor = 3 },
577- [" SA-19" ] = {peak = 25 ,mu = 18 ,sigma_L = 7 , tail_dist = 38 , band = " IJ" , floor = 2 },
578- [" SA-10B" ] = {peak = 30 ,mu = 52 ,sigma_L = 20 ,tail_dist = 95 , band = " S" , floor = 3 },
579- [" SA-17" ] = {peak = 24 ,mu = 32 ,sigma_L = 14 ,tail_dist = 65 , band = " IJ" , floor = 2 },
580- [" SA-20A" ] = {peak = 22 ,mu = 58 ,sigma_L = 22 ,tail_dist = 95 , band = " S" , floor = 2 },
581- [" SA-20B" ] = {peak = 20 ,mu = 60 ,sigma_L = 22 ,tail_dist = 100 ,band = " S" , floor = 2 },
582- [" S-300VM" ] = {peak = 16 ,mu = 70 ,sigma_L = 28 ,tail_dist = 110 ,band = " S" , floor = 2 },
583- [" S-300V4" ] = {peak = 14 ,mu = 75 ,sigma_L = 28 ,tail_dist = 115 ,band = " S" , floor = 2 },
584- [" S-400" ] = {peak = 18 ,mu = 65 ,sigma_L = 25 ,tail_dist = 105 ,band = " S" , floor = 2 },
585- [" SA-21" ] = {peak = 18 ,mu = 65 ,sigma_L = 25 ,tail_dist = 105 ,band = " S" , floor = 2 },
586- -- NATO designation aliases (allow mission designers to use SA-NN naming)
587- [" SA-22" ] = {peak = 10 ,mu = 5 , sigma_L = 2 , tail_dist = 12 , band = " IJ" , floor = 0 }, -- alias for Pantsir S1
588- [" SA-23" ] = {peak = 16 ,mu = 70 ,sigma_L = 28 ,tail_dist = 110 ,band = " S" , floor = 2 }, -- alias for S-300VM
589- [" SA-23B" ] = {peak = 14 ,mu = 75 ,sigma_L = 28 ,tail_dist = 115 ,band = " S" , floor = 2 }, -- alias for S-300V4
590- [" SA-27" ] = {peak = 22 ,mu = 38 ,sigma_L = 16 ,tail_dist = 72 , band = " IJ" , floor = 2 }, -- alias for Buk-M3
591- [" SA-28" ] = {peak = 18 ,mu = 35 ,sigma_L = 15 ,tail_dist = 75 , band = " IJ" , floor = 2 }, -- alias for S-350
592- [" NASAMS" ] = {peak = 25 ,mu = 28 ,sigma_L = 12 ,tail_dist = 55 , band = " IJ" , floor = 2 },
593- [" Patriot" ] = {peak = 32 ,mu = 50 ,sigma_L = 20 ,tail_dist = 90 , band = " S" , floor = 3 },
594- [" Rapier" ] = {peak = 12 ,mu = 8 , sigma_L = 3 , tail_dist = 18 , band = " IJ" , floor = 0 },
595- [" Gepard" ] = {peak = 18 ,mu = 6 , sigma_L = 2 , tail_dist = 15 , band = " IJ" , floor = 0 },
583+ [" SA-15" ] = {peak = 30 ,mu = 11 ,sigma_L = 5 , tail_dist = 22 , band = " IJ" , floor = 3 },
584+ [" SA-17" ] = {peak = 24 ,mu = 32 ,sigma_L = 14 ,tail_dist = 68 , band = " IJ" , floor = 2 },
585+ [" SA-19" ] = {peak = 25 ,mu = 8 , sigma_L = 3.5 ,tail_dist = 16 ,band = " IJ" , floor = 2 },
586+ [" SA-20A" ] = {peak = 22 ,mu = 65 ,sigma_L = 24 ,tail_dist = 115 ,band = " S" , floor = 2 },
587+ [" SA-20B" ] = {peak = 20 ,mu = 68 ,sigma_L = 24 ,tail_dist = 120 ,band = " S" , floor = 2 },
588+ [" S-300VM" ] = {peak = 16 ,mu = 80 ,sigma_L = 30 ,tail_dist = 135 ,band = " S" , floor = 2 }, -- SA-23 canonical
589+ [" S-300V4" ] = {peak = 14 ,mu = 85 ,sigma_L = 30 ,tail_dist = 145 ,band = " S" , floor = 2 }, -- SA-23B canonical
590+ [" S-400" ] = {peak = 18 ,mu = 80 ,sigma_L = 30 ,tail_dist = 150 ,band = " S" , floor = 2 }, -- SA-21 canonical
591+ [" NASAMS" ] = {peak = 25 ,mu = 28 ,sigma_L = 12 ,tail_dist = 52 , band = " IJ" , floor = 2 },
592+ [" Patriot" ] = {peak = 32 ,mu = 62 ,sigma_L = 24 ,tail_dist = 110 ,band = " S" , floor = 3 },
593+ [" Rapier" ] = {peak = 12 ,mu = 6 , sigma_L = 2.5 ,tail_dist = 14 ,band = " IJ" , floor = 0 },
594+ [" Gepard" ] = {peak = 18 ,mu = 6 , sigma_L = 2 , tail_dist = 18 , band = " IJ" , floor = 0 },
596595 [" Roland" ] = {peak = 35 ,mu = 5 , sigma_L = 2 , tail_dist = 12 , band = " IJ" , floor = 3 },
597- [" HQ-7" ] = {peak = 38 ,mu = 10 , sigma_L = 4 , tail_dist = 22 , band = " IJ" , floor = 3 },
596+ [" HQ-7" ] = {peak = 38 ,mu = 8 , sigma_L = 3.5 , tail_dist = 18 , band = " IJ" , floor = 3 },
598597 [" HQ-2" ] = {peak = 70 ,mu = 38 ,sigma_L = 15 ,tail_dist = 80 , band = " S" , floor = 5 },
599598 [" C-RAM" ] = {peak = 3 , mu = 3 , sigma_L = 1 , tail_dist = 5 , band = " OPT" ,floor = 0 },
600599 [" Avenger" ] = {peak = 3 , mu = 3 , sigma_L = 1 , tail_dist = 5 , band = " OPT" ,floor = 0 },
601600 [" Chaparral" ] = {peak = 3 , mu = 3 , sigma_L = 1 , tail_dist = 5 , band = " OPT" ,floor = 0 },
602601 [" Linebacker" ] = {peak = 3 , mu = 3 , sigma_L = 1 , tail_dist = 5 , band = " OPT" ,floor = 0 },
603602 [" Silkworm" ] = {peak = 35 ,mu = 20 ,sigma_L = 8 , tail_dist = 40 , band = " IJ" , floor = 3 },
604603 [" Dog Ear" ] = {peak = 40 ,mu = 10 ,sigma_L = 4 , tail_dist = 20 , band = " IJ" , floor = 5 },
605- [" Pantsir S1" ] = {peak = 10 ,mu = 5 , sigma_L = 2 , tail_dist = 12 , band = " IJ" , floor = 0 },
604+ [" Pantsir S1" ] = {peak = 10 ,mu = 9 , sigma_L = 4 , tail_dist = 20 , band = " IJ" , floor = 0 }, -- SA-22 canonical
606605 [" Tor M2" ] = {peak = 28 ,mu = 14 ,sigma_L = 6 , tail_dist = 30 , band = " IJ" , floor = 3 },
607- [" IRIS-T SLM" ] = {peak = 18 ,mu = 18 ,sigma_L = 8 , tail_dist = 40 , band = " IJ" , floor = 2 },
608- [" SON-9" ] = {peak = 48 ,mu = 20 ,sigma_L = 9 , tail_dist = 42 , band = " IJ" , floor = 5 },
609- [" TAMIR IDFA" ] = {peak = 19 ,mu = 25 ,sigma_L = 12 ,tail_dist = 55 ,band = " S" , floor = 2 },
606+ [" IRIS-T SLM" ] = {peak = 18 ,mu = 22 ,sigma_L = 10 ,tail_dist = 50 , band = " IJ" , floor = 2 },
607+ [" SON-9" ] = {peak = 48 ,mu = 14 ,sigma_L = 6 , tail_dist = 30 , band = " IJ" , floor = 5 },
608+ -- IDF Mod
609+ [" TAMIR IDFA" ] = {peak = 19 ,mu = 25 ,sigma_L = 12 ,tail_dist = 52 ,band = " S" , floor = 2 },
610610 [" STUNNER IDFA" ]= {peak = 16 ,mu = 45 ,sigma_L = 18 ,tail_dist = 80 ,band = " S" , floor = 2 },
611- [" SA-2 HDS" ] = {peak = 75 ,mu = 40 ,sigma_L = 16 ,tail_dist = 85 , band = " S" , floor = 5 },
612- [" SA-3 HDS" ] = {peak = 45 ,mu = 22 ,sigma_L = 10 ,tail_dist = 50 , band = " IJ" , floor = 5 },
613- [" SA-10B HDS" ] = {peak = 30 ,mu = 52 ,sigma_L = 20 ,tail_dist = 95 , band = " S" , floor = 3 },
611+ -- HDS Mod (canonical for keys with no base equivalent)
614612 [" SA-10C HDS" ] = {peak = 30 ,mu = 50 ,sigma_L = 20 ,tail_dist = 92 , band = " S" , floor = 3 },
615- [" SA-17 HDS" ] = {peak = 24 ,mu = 32 ,sigma_L = 14 ,tail_dist = 65 , band = " IJ" , floor = 2 },
616- [" SA-12 HDS" ] = {peak = 35 ,mu = 42 ,sigma_L = 16 ,tail_dist = 75 , band = " S" , floor = 3 },
617- [" SA-23 HDS" ] = {peak = 16 ,mu = 70 ,sigma_L = 28 ,tail_dist = 110 ,band = " S" , floor = 2 },
618- [" HQ-2 HDS" ] = {peak = 70 ,mu = 38 ,sigma_L = 15 ,tail_dist = 80 , band = " S" , floor = 5 },
613+ [" SA-12 HDS" ] = {peak = 35 ,mu = 50 ,sigma_L = 18 ,tail_dist = 90 , band = " S" , floor = 3 },
619614 [" SAMPT Block 1 HDS" ] = {peak = 28 ,mu = 45 ,sigma_L = 18 ,tail_dist = 85 , band = " S" , floor = 3 },
620615 [" SAMPT Block 1INT HDS" ]= {peak = 26 ,mu = 48 ,sigma_L = 18 ,tail_dist = 88 ,band = " S" , floor = 3 },
621616 [" SAMPT Block 2 HDS" ] = {peak = 22 ,mu = 52 ,sigma_L = 20 ,tail_dist = 92 , band = " S" , floor = 2 },
622- [" RBS98M SMA" ] = {peak = 25 ,mu = 12 ,sigma_L = 5 , tail_dist = 25 ,band = " IJ" , floor = 3 },
623- [" RBS70 SMA" ] = {peak = 5 , mu = 4 , sigma_L = 2 , tail_dist = 10 ,band = " OPT" ,floor = 0 },
624- [" RBS70M SMA" ] = {peak = 5 , mu = 4 , sigma_L = 2 , tail_dist = 10 ,band = " OPT" ,floor = 0 },
625- [" RBS90 SMA" ] = {peak = 5 , mu = 4 , sigma_L = 2 , tail_dist = 10 ,band = " OPT" ,floor = 0 },
626- [" RBS90M SMA" ] = {peak = 5 , mu = 4 , sigma_L = 2 , tail_dist = 10 ,band = " OPT" ,floor = 0 },
627- [" RBS103A SMA" ] = {peak = 20 ,mu = 55 ,sigma_L = 20 ,tail_dist = 90 ,band = " S" , floor = 2 },
628- [" RBS103B SMA" ] = {peak = 22 ,mu = 45 ,sigma_L = 18 ,tail_dist = 80 ,band = " S" , floor = 2 },
629- [" RBS103AM SMA" ] = {peak = 20 ,mu = 55 ,sigma_L = 20 ,tail_dist = 90 ,band = " S" , floor = 2 },
630- [" RBS103BM SMA" ] = {peak = 22 ,mu = 45 ,sigma_L = 18 ,tail_dist = 80 ,band = " S" , floor = 2 },
631- [" Lvkv9040M SMA" ]= {peak = 15 ,mu = 3 , sigma_L = 1 , tail_dist = 8 , band = " OPT" ,floor = 0 },
617+ -- SMA Mod (canonical for SMA-only keys)
618+ [" RBS70 SMA" ] = {peak = 5 , mu = 4 , sigma_L = 2 , tail_dist = 10 ,band = " OPT" ,floor = 0 }, -- canonical for RBS70 family
619+ [" RBS90 SMA" ] = {peak = 5 , mu = 4 , sigma_L = 2 , tail_dist = 10 ,band = " OPT" ,floor = 0 }, -- canonical for RBS90 family
620+ [" RBS98M SMA" ] = {peak = 25 ,mu = 12 ,sigma_L = 5 , tail_dist = 25 ,band = " IJ" , floor = 3 }, -- canonical
621+ [" RBS103A SMA" ] = {peak = 20 ,mu = 55 ,sigma_L = 20 ,tail_dist = 90 ,band = " S" , floor = 2 }, -- canonical
622+ [" RBS103B SMA" ] = {peak = 22 ,mu = 45 ,sigma_L = 18 ,tail_dist = 80 ,band = " S" , floor = 2 }, -- canonical
623+ [" Lvkv9040M SMA" ]= {peak = 15 ,mu = 3 , sigma_L = 1 , tail_dist = 8 , band = " OPT" ,floor = 0 }, -- canonical
624+ -- CH Mod (canonical for CHM-only keys)
632625 [" 2S38 CHM" ] = {peak = 8 , mu = 3 , sigma_L = 1 , tail_dist = 8 , band = " OPT" ,floor = 0 },
633- [" PantsirS1 CHM" ] = {peak = 10 ,mu = 5 , sigma_L = 2 , tail_dist = 12 , band = " IJ" , floor = 0 },
634- [" PantsirS2 CHM" ] = {peak = 10 ,mu = 5 , sigma_L = 2 , tail_dist = 12 , band = " IJ" , floor = 0 },
635- [" PGL-625 CHM" ] = {peak = 12 ,mu = 4 , sigma_L = 2 , tail_dist = 10 , band = " OPT" ,floor = 0 },
636- [" HQ-17A CHM" ] = {peak = 30 ,mu = 14 ,sigma_L = 6 , tail_dist = 30 , band = " IJ" , floor = 3 },
637- [" M903PAC2 CHM" ] = {peak = 32 ,mu = 50 ,sigma_L = 20 ,tail_dist = 90 , band = " S" , floor = 3 },
638- [" M903PAC3 CHM" ] = {peak = 15 ,mu = 55 ,sigma_L = 22 ,tail_dist = 95 , band = " S" , floor = 2 },
639- [" M903PAC2KAT1 CHM" ] = {peak = 32 ,mu = 50 ,sigma_L = 20 ,tail_dist = 90 , band = " S" , floor = 3 },
640- [" TorM2 CHM" ] = {peak = 28 ,mu = 14 ,sigma_L = 6 , tail_dist = 30 , band = " IJ" , floor = 3 },
641- [" TorM2K CHM" ] = {peak = 28 ,mu = 14 ,sigma_L = 6 , tail_dist = 30 , band = " IJ" , floor = 3 },
642- [" TorM2M CHM" ] = {peak = 26 ,mu = 16 ,sigma_L = 6 , tail_dist = 32 , band = " IJ" , floor = 3 },
626+ [" PGL-625 CHM" ] = {peak = 12 ,mu = 6 , sigma_L = 2.5 ,tail_dist = 14 ,band = " OPT" ,floor = 0 }, -- Type-08
627+ [" HQ-17A CHM" ] = {peak = 30 ,mu = 11 ,sigma_L = 5 , tail_dist = 24 , band = " IJ" , floor = 3 },
628+ [" M903PAC3 CHM" ] = {peak = 15 ,mu = 58 ,sigma_L = 22 ,tail_dist = 105 ,band = " S" , floor = 2 },
629+ [" TorM2M CHM" ] = {peak = 26 ,mu = 16 ,sigma_L = 6 , tail_dist = 32 , band = " IJ" , floor = 3 }, -- variant
643630 [" NASAMS3-AMRAAMER CHM" ] = {peak = 20 ,mu = 35 ,sigma_L = 14 ,tail_dist = 65 , band = " IJ" , floor = 2 },
644631 [" NASAMS3-AIM9X2 CHM" ] = {peak = 10 ,mu = 15 ,sigma_L = 6 , tail_dist = 30 , band = " IJ" , floor = 0 },
645- [" C-RAM CHM" ] = {peak = 3 , mu = 3 , sigma_L = 1 , tail_dist = 5 , band = " OPT" ,floor = 0 },
646- [" PGZ-09 CHM" ] = {peak = 22 ,mu = 5 , sigma_L = 2 , tail_dist = 12 , band = " IJ" , floor = 0 },
632+ [" PGZ-09 CHM" ] = {peak = 22 ,mu = 5 , sigma_L = 2 , tail_dist = 14 , band = " IJ" , floor = 0 }, -- Type-09
647633 [" PGZ-95 CHM" ] = {peak = 15 ,mu = 4 , sigma_L = 2 , tail_dist = 10 , band = " OPT" ,floor = 0 },
648- [" S350-9M100 CHM" ] = {peak = 18 ,mu = 35 ,sigma_L = 15 ,tail_dist = 75 , band = " IJ" , floor = 2 },
649- [" S350-9M96D CHM" ] = {peak = 18 ,mu = 35 ,sigma_L = 15 ,tail_dist = 75 , band = " IJ" , floor = 2 },
650- [" HQ-22 CHM" ] = {peak = 20 ,mu = 58 ,sigma_L = 22 ,tail_dist = 100 ,band = " S" , floor = 2 },
651- [" LD-3000 CHM" ] = {peak = 3 , mu = 3 , sigma_L = 1 , tail_dist = 5 , band = " OPT" ,floor = 0 },
652- [" LD-3000M CHM" ] = {peak = 3 , mu = 3 , sigma_L = 1 , tail_dist = 5 , band = " OPT" ,floor = 0 },
653- [" FlaRakRad CHM" ] = {peak = 35 ,mu = 5 , sigma_L = 2 , tail_dist = 12 , band = " IJ" , floor = 3 },
654- [" IRIS-T SLM CHM" ] = {peak = 18 ,mu = 18 ,sigma_L = 8 , tail_dist = 40 , band = " IJ" , floor = 2 },
634+ [" S350-9M100 CHM" ] = {peak = 18 ,mu = 35 ,sigma_L = 15 ,tail_dist = 78 , band = " IJ" , floor = 2 }, -- SA-28 canonical
635+ [" HQ-22 CHM" ] = {peak = 20 ,mu = 70 ,sigma_L = 26 ,tail_dist = 120 ,band = " S" , floor = 2 },
636+ [" IRIS-T SLM CHM" ] = {peak = 18 ,mu = 22 ,sigma_L = 10 ,tail_dist = 50 , band = " IJ" , floor = 2 }, -- will be aliased
655637 [" Skynex CHM" ] = {peak = 12 ,mu = 4 , sigma_L = 2 , tail_dist = 10 , band = " OPT" ,floor = 0 },
656638 [" Skyshield CHM" ] = {peak = 12 ,mu = 4 , sigma_L = 2 , tail_dist = 10 , band = " OPT" ,floor = 0 },
657- [" BukM3-9M317M CHM" ] = {peak = 22 ,mu = 38 ,sigma_L = 16 ,tail_dist = 72 , band = " IJ" , floor = 2 },
658- [" BukM3-9M317MA CHM" ] = {peak = 22 ,mu = 38 ,sigma_L = 16 ,tail_dist = 72 , band = " IJ" , floor = 2 },
639+ [" BukM3-9M317M CHM" ] = {peak = 22 ,mu = 38 ,sigma_L = 16 ,tail_dist = 75 , band = " IJ" , floor = 2 }, -- SA-27 canonical
659640 [" SkySabre CHM" ] = {peak = 18 ,mu = 18 ,sigma_L = 7 , tail_dist = 40 , band = " IJ" , floor = 2 },
660641 [" Stormer CHM" ] = {peak = 10 ,mu = 5 , sigma_L = 2 , tail_dist = 12 , band = " OPT" ,floor = 0 },
661- [" THAAD CHM" ] = {peak = 10 ,mu = 80 ,sigma_L = 35 ,tail_dist = 120 ,band = " IJ" , floor = 0 },
662- [" LAV-AD CHM" ] = {peak = 3 , mu = 3 , sigma_L = 1 , tail_dist = 5 , band = " OPT" ,floor = 0 },
642+ [" THAAD CHM" ] = {peak = 10 ,mu = 90 ,sigma_L = 38 ,tail_dist = 140 ,band = " IJ" , floor = 0 },
663643 [" WieselOzelot CHM" ] = {peak = 3 , mu = 3 , sigma_L = 1 , tail_dist = 5 , band = " OPT" ,floor = 0 },
664644 [" USInfantryFIM92K CHM" ] = {peak = 3 , mu = 3 , sigma_L = 1 , tail_dist = 5 , band = " OPT" ,floor = 0 },
665- [" RBS98M CHM" ] = {peak = 25 ,mu = 12 ,sigma_L = 5 , tail_dist = 25 ,band = " IJ" , floor = 3 },
666- [" RBS70 CHM" ] = {peak = 5 , mu = 4 , sigma_L = 2 , tail_dist = 10 ,band = " OPT" ,floor = 0 },
667- [" RBS70M CHM" ] = {peak = 5 , mu = 4 , sigma_L = 2 , tail_dist = 10 ,band = " OPT" ,floor = 0 },
668- [" RBS90 CHM" ] = {peak = 5 , mu = 4 , sigma_L = 2 , tail_dist = 10 ,band = " OPT" ,floor = 0 },
669- [" RBS90M CHM" ] = {peak = 5 , mu = 4 , sigma_L = 2 , tail_dist = 10 ,band = " OPT" ,floor = 0 },
670- [" RBS103A CHM" ] = {peak = 20 ,mu = 55 ,sigma_L = 20 ,tail_dist = 90 ,band = " S" , floor = 2 },
671- [" RBS103B CHM" ] = {peak = 22 ,mu = 45 ,sigma_L = 18 ,tail_dist = 80 ,band = " S" , floor = 2 },
672- [" RBS103AM CHM" ] = {peak = 20 ,mu = 55 ,sigma_L = 20 ,tail_dist = 90 ,band = " S" , floor = 2 },
673- [" RBS103BM CHM" ] = {peak = 22 ,mu = 45 ,sigma_L = 18 ,tail_dist = 80 ,band = " S" , floor = 2 },
674- [" Lvkv9040M CHM" ]= {peak = 15 ,mu = 3 , sigma_L = 1 , tail_dist = 8 , band = " OPT" ,floor = 0 },
675645}
676646
647+ -- Alias entries: point alias keys to the canonical entry's table.
648+ -- Modifying any canonical entry above automatically updates all its aliases.
649+ -- This prevents parameter drift when updating values.
650+ do
651+ local p = MANTIS .JammerSAMParams
652+ -- NATO designation aliases
653+ p [" SA-21" ] = p [" S-400" ] -- SA-21 Growler
654+ p [" SA-22" ] = p [" Pantsir S1" ] -- SA-22 Greyhound
655+ p [" SA-23" ] = p [" S-300VM" ] -- SA-23 Gladiator
656+ p [" SA-23B" ] = p [" S-300V4" ] -- SA-23B Antey-2500 (improved)
657+ p [" SA-27" ] = p [" BukM3-9M317M CHM" ] -- SA-27 Gollum (Buk-M3)
658+ p [" SA-28" ] = p [" S350-9M100 CHM" ] -- SA-28 Vityaz (S-350)
659+ -- Buk-M3 variants (same radar)
660+ p [" BukM3-9M317MA CHM" ] = p [" BukM3-9M317M CHM" ]
661+ -- S-350 variants (same radar)
662+ p [" S350-9M96D CHM" ] = p [" S350-9M100 CHM" ]
663+ -- Pantsir variants
664+ p [" PantsirS1 CHM" ] = p [" Pantsir S1" ]
665+ p [" PantsirS2 CHM" ] = p [" Pantsir S1" ]
666+ -- Tor-M2 variants
667+ p [" TorM2 CHM" ] = p [" Tor M2" ]
668+ p [" TorM2K CHM" ] = p [" Tor M2" ]
669+ -- Patriot PAC-2 (same MPQ-65 radar)
670+ p [" M903PAC2 CHM" ] = p [" Patriot" ]
671+ p [" M903PAC2KAT1 CHM" ] = p [" Patriot" ]
672+ -- IRIS-T (base and CHM are same system)
673+ p [" IRIS-T SLM CHM" ] = p [" IRIS-T SLM" ]
674+ -- HDS variants (same radar as base entry)
675+ p [" SA-2 HDS" ] = p [" SA-2" ]
676+ p [" SA-3 HDS" ] = p [" SA-3" ]
677+ p [" SA-10B HDS" ] = p [" SA-10B" ]
678+ p [" SA-17 HDS" ] = p [" SA-17" ]
679+ p [" SA-23 HDS" ] = p [" S-300VM" ]
680+ p [" HQ-2 HDS" ] = p [" HQ-2" ]
681+ -- Roland / FlaRakRad (same system)
682+ p [" FlaRakRad CHM" ] = p [" Roland" ]
683+ -- Phalanx-class CIWS (Ka-band, essentially unjammable)
684+ p [" C-RAM CHM" ] = p [" C-RAM" ]
685+ p [" LD-3000 CHM" ] = p [" C-RAM" ]
686+ p [" LD-3000M CHM" ] = p [" C-RAM" ]
687+ -- SMA / CHM Swedish duplicates (CH mod re-implements SMA assets)
688+ p [" RBS70 CHM" ] = p [" RBS70 SMA" ]
689+ p [" RBS70M SMA" ] = p [" RBS70 SMA" ]
690+ p [" RBS70M CHM" ] = p [" RBS70 SMA" ]
691+ p [" RBS90 CHM" ] = p [" RBS90 SMA" ]
692+ p [" RBS90M SMA" ] = p [" RBS90 SMA" ]
693+ p [" RBS90M CHM" ] = p [" RBS90 SMA" ]
694+ p [" RBS98M CHM" ] = p [" RBS98M SMA" ]
695+ p [" RBS103A CHM" ] = p [" RBS103A SMA" ]
696+ p [" RBS103AM SMA" ] = p [" RBS103A SMA" ]
697+ p [" RBS103AM CHM" ] = p [" RBS103A SMA" ]
698+ p [" RBS103B CHM" ] = p [" RBS103B SMA" ]
699+ p [" RBS103BM SMA" ] = p [" RBS103B SMA" ]
700+ p [" RBS103BM CHM" ] = p [" RBS103B SMA" ]
701+ p [" Lvkv9040M CHM" ]= p [" Lvkv9040M SMA" ]
702+ -- IR MANPADS (all near-zero, different systems but share params)
703+ p [" LAV-AD CHM" ] = p [" SA-9" ]
704+ -- NOTE: SA-13, Avenger, Chaparral, Linebacker kept separate (different real systems)
705+ end
706+
677707
678708---- -------------------------------------------------------------------
679709-- MANTIS System
@@ -2943,8 +2973,8 @@ function MANTIS:SeadAllowSuppression(targetGroup, targetName, attackerGroup, wea
29432973 return self
29442974 end
29452975
2946- --- [Internal] Core jamming probability curve (v8 engine).
2947- -- Includes decoupled bt_mod/range_mod, ±10% jitter, and floor .
2976+ --- [Internal] Core jamming probability curve (v9 / v8.1 engine).
2977+ -- Features: decoupled bt_mod/range_mod, tapering residual floor, ±10% jitter.
29482978 -- @param #MANTIS self
29492979 -- @param #number d Distance in nautical miles
29502980 -- @param #table params {peak, mu, sigma_L, tail_dist, band, floor}
@@ -2962,7 +2992,7 @@ function MANTIS:SeadAllowSuppression(targetGroup, targetName, attackerGroup, wea
29622992 elseif band == " S" then bm = cfg .mult_S
29632993 elseif band == " IJ" then bm = cfg .mult_IJ
29642994 else bm = cfg .mult_OPT end
2965- -- Decoupled window modifiers (v8)
2995+ -- Decoupled window modifiers
29662996 local eff_sigma_L = sigma_L / cfg .bt_mod
29672997 local eff_tail_dist = tail_dist * cfg .range_mod
29682998 local eff_peak = math.min (95 , peak * bm )
@@ -2973,12 +3003,19 @@ function MANTIS:SeadAllowSuppression(targetGroup, targetName, attackerGroup, wea
29733003 local lambda = math.log (100.0 ) / eff_tail_dist
29743004 raw = eff_peak * math.exp (- lambda * (d - mu ))
29753005 end
2976- -- Stochastic jitter ±10% (v8)
3006+ -- Tapering residual floor (v9): floor full inside engagement band (d <= mu),
3007+ -- attenuates with R^2-like falloff past mu over 2.5x the main decay distance.
3008+ -- Prevents artificial hard cliff at 200nm cap; matches real radar/jammer physics.
3009+ local eff_floor = floor * bm
3010+ if eff_floor > 0 and d > mu then
3011+ local floorLambda = math.log (100.0 ) / (eff_tail_dist * 2.5 )
3012+ eff_floor = eff_floor * math.exp (- floorLambda * (d - mu ))
3013+ end
3014+ raw = math.max (eff_floor , raw )
3015+ -- Stochastic jitter ±10% applied AFTER floor (v9), so residual also varies.
3016+ -- Prevents gameable flat long-range value. Reflects S/N, RCS, atmospheric fluctuation.
29773017 local jitter = 1.0 + (math.random () * 2 - 1 ) * (self .JammerJitterPercent or 0.10 )
29783018 raw = raw * jitter
2979- -- Minimum effectiveness floor (residual noise injection, v8)
2980- local eff_floor = (floor or 0 ) * bm
2981- raw = math.max (eff_floor , raw )
29823019 return math.max (0 , math.min (95 , raw )) / 100.0
29833020 end
29843021
0 commit comments