From cecf8dd850103168b9441167369ee58dc8b21d85 Mon Sep 17 00:00:00 2001 From: "Nikolai V. Chr" Date: Tue, 30 May 2023 23:45:41 +0200 Subject: [PATCH] Shooting BUK-M2 (SA-11) released. --- BUK-M2/BUK-M2-set.xml | 109 +- BUK-M2/Models/Armament/Weapons/M317/9M317.ac | 1544 +++++ .../Models/Armament/Weapons/M317/BUK-M2.png | Bin 0 -> 77705 bytes .../Armament/Weapons/M317/explosion-0.xml | 176 + .../Armament/Weapons/M317/explosion-1.xml | 176 + .../Armament/Weapons/M317/explosion-2.xml | 176 + .../Armament/Weapons/M317/explosion-3.xml | 176 + .../Models/Armament/Weapons/M317/m317-0.xml | 42 + .../Models/Armament/Weapons/M317/m317-1.xml | 42 + .../Models/Armament/Weapons/M317/m317-2.xml | 42 + .../Models/Armament/Weapons/M317/m317-3.xml | 42 + BUK-M2/Models/Armament/Weapons/M317/m317.xml | 7 + .../Armament/Weapons/M317/motor-smoke-0.xml | 187 + .../Armament/Weapons/M317/motor-smoke-1.xml | 187 + .../Armament/Weapons/M317/motor-smoke-2.xml | 187 + .../Armament/Weapons/M317/motor-smoke-3.xml | 187 + BUK-M2/Models/Armament/Weapons/M317/puff.png | Bin 0 -> 11337 bytes BUK-M2/Models/Armament/Weapons/M317/smoke.png | Bin 0 -> 6474 bytes BUK-M2/Nasal/damage.nas | 102 +- BUK-M2/Nasal/datalink.nas | 681 ++ BUK-M2/Nasal/fdm.nas | 4 +- BUK-M2/Nasal/fire-control-custom.nas | 62 + BUK-M2/Nasal/fire-control.nas | 646 ++ BUK-M2/Nasal/guided-missiles.nas | 5930 +++++++++++++++++ BUK-M2/Nasal/radar-logic.nas | 427 ++ BUK-M2/Sounds/launch.wav | Bin 0 -> 386516 bytes BUK-M2/Sounds/sound.xml | 25 + BUK-M2/gui/dialogs/enemies.xml | 348 + BUK-M2/gui/dialogs/prio.xml | 166 + 29 files changed, 11638 insertions(+), 33 deletions(-) create mode 100644 BUK-M2/Models/Armament/Weapons/M317/9M317.ac create mode 100644 BUK-M2/Models/Armament/Weapons/M317/BUK-M2.png create mode 100644 BUK-M2/Models/Armament/Weapons/M317/explosion-0.xml create mode 100644 BUK-M2/Models/Armament/Weapons/M317/explosion-1.xml create mode 100644 BUK-M2/Models/Armament/Weapons/M317/explosion-2.xml create mode 100644 BUK-M2/Models/Armament/Weapons/M317/explosion-3.xml create mode 100644 BUK-M2/Models/Armament/Weapons/M317/m317-0.xml create mode 100644 BUK-M2/Models/Armament/Weapons/M317/m317-1.xml create mode 100644 BUK-M2/Models/Armament/Weapons/M317/m317-2.xml create mode 100644 BUK-M2/Models/Armament/Weapons/M317/m317-3.xml create mode 100644 BUK-M2/Models/Armament/Weapons/M317/m317.xml create mode 100644 BUK-M2/Models/Armament/Weapons/M317/motor-smoke-0.xml create mode 100644 BUK-M2/Models/Armament/Weapons/M317/motor-smoke-1.xml create mode 100644 BUK-M2/Models/Armament/Weapons/M317/motor-smoke-2.xml create mode 100644 BUK-M2/Models/Armament/Weapons/M317/motor-smoke-3.xml create mode 100644 BUK-M2/Models/Armament/Weapons/M317/puff.png create mode 100644 BUK-M2/Models/Armament/Weapons/M317/smoke.png create mode 100644 BUK-M2/Nasal/datalink.nas create mode 100644 BUK-M2/Nasal/fire-control-custom.nas create mode 100644 BUK-M2/Nasal/fire-control.nas create mode 100644 BUK-M2/Nasal/guided-missiles.nas create mode 100644 BUK-M2/Nasal/radar-logic.nas create mode 100644 BUK-M2/Sounds/launch.wav create mode 100644 BUK-M2/Sounds/sound.xml create mode 100644 BUK-M2/gui/dialogs/enemies.xml create mode 100644 BUK-M2/gui/dialogs/prio.xml diff --git a/BUK-M2/BUK-M2-set.xml b/BUK-M2/BUK-M2-set.xml index f81aad3..92bb3c2 100644 --- a/BUK-M2/BUK-M2-set.xml +++ b/BUK-M2/BUK-M2-set.xml @@ -130,7 +130,57 @@ true - + + + + nasal + + + + + + enemies + + dialog-show + enemies + + + + + enemies + + dialog-show + priority + + + + + + nasal + + + + + + + nasal + + + @@ -245,6 +295,48 @@ false false + + 62 + 0.00 + 0.15 + radar + APN0506 + true + 31 + 360 + 170 + 24 + 11000 + 0 + 15 + 0 + 1576 + 145 + 900 + 0.20 + 1.312336 + 2 + 0.5 + 60 + 3000 + 0 + 1.6 + 200 + true + 5.5 + false + 24 + 0.92 + 3 + 1 + A + Bird away + true + false + 0 + 0 + 3 + @@ -294,6 +386,17 @@ 0 1 + + + + 0 + true + 1212 + /instrumentation/datalink/power + instrumentation/datalink/channel + 1 + + @@ -315,7 +418,11 @@ Aircraft/BUK-M2/Nasal/guided-missiles.nas + + Aircraft/BUK-M2/Nasal/datalink.nas + + Aircraft/BUK-M2/Nasal/fire-control-custom.nas Aircraft/BUK-M2/Nasal/fire-control.nas diff --git a/BUK-M2/Models/Armament/Weapons/M317/9M317.ac b/BUK-M2/Models/Armament/Weapons/M317/9M317.ac new file mode 100644 index 0000000..b3ca0b0 --- /dev/null +++ b/BUK-M2/Models/Armament/Weapons/M317/9M317.ac @@ -0,0 +1,1544 @@ +AC3Db +MATERIAL "DefaultWhite" rgb 1.0000 1.0000 1.0000 amb 0.2000 0.2000 0.2000 emis 0.0000 0.0000 0.0000 spec 0.5000 0.5000 0.5000 shi 10 trans 0.0000 +MATERIAL "BaseMat" rgb 0.8000 0.8000 0.8000 amb 1.0000 1.0000 1.0000 emis 0.0000 0.0000 0.0000 spec 0.5000 0.5000 0.5000 shi 12 trans 0.0000 +OBJECT world +name "Blender_export__s-200.ac" +kids 1 +OBJECT poly +name "missile1" +data 12 +Cylinder.014 +crease 35.0 +texture "BUK-M2.png" +texrep 1 1 +numvert 209 +1.68637 0.11991 -0.13685 +1.93720 0.11846 -0.13685 +1.78881 0.34799 -0.36552 +1.93705 0.34322 -0.36160 +1.78882 0.34897 -0.36453 +1.68638 0.12089 -0.13587 +1.93721 0.11945 -0.13587 +1.93705 0.34420 -0.36062 +1.68487 -0.14084 -0.12963 +1.93570 -0.14228 -0.12963 +1.78468 -0.37009 -0.35830 +1.93296 -0.36702 -0.35439 +1.78468 -0.36910 -0.35928 +1.68487 -0.13986 -0.13062 +1.93571 -0.14130 -0.13062 +1.93296 -0.36604 -0.35537 +1.68487 -0.13986 0.12943 +1.93571 -0.14130 0.12943 +1.78468 -0.36910 0.35810 +1.93296 -0.36604 0.35418 +1.78468 -0.37009 0.35712 +1.68487 -0.14084 0.12845 +1.93570 -0.14228 0.12845 +1.93296 -0.36702 0.35320 +1.68854 0.11989 0.13598 +1.93937 0.11844 0.13598 +1.79098 0.34797 0.36465 +1.93921 0.34320 0.36073 +1.79097 0.34699 0.36563 +1.68853 0.11890 0.13696 +1.93936 0.11746 0.13696 +1.93921 0.34222 0.36172 +-0.78236 0.13412 -0.13685 +0.54530 0.12648 -0.13685 +-0.43137 0.36077 -0.36552 +0.44626 0.35180 -0.36160 +-0.43136 0.36175 -0.36453 +-0.78236 0.13510 -0.13587 +0.54531 0.12746 -0.13587 +0.44626 0.35278 -0.36062 +-0.78386 -0.12663 -0.12963 +0.54380 -0.13427 -0.12963 +-0.43550 -0.35731 -0.35830 +0.44217 -0.35844 -0.35439 +-0.43550 -0.35633 -0.35928 +-0.78386 -0.12565 -0.13062 +0.54381 -0.13329 -0.13062 +0.44218 -0.35746 -0.35537 +-0.78386 -0.12565 0.12943 +0.54381 -0.13329 0.12943 +-0.43550 -0.35633 0.35810 +0.44218 -0.35746 0.35418 +-0.43550 -0.35731 0.35712 +-0.78386 -0.12663 0.12845 +0.54380 -0.13427 0.12845 +0.44217 -0.35844 0.35320 +-0.78019 0.13410 0.13598 +0.54747 0.12645 0.13598 +-0.42920 0.36075 0.36465 +0.44843 0.35178 0.36073 +-0.42921 0.35977 0.36563 +-0.78020 0.13311 0.13696 +0.54746 0.12547 0.13696 +0.44842 0.35080 0.36172 +1.94042 0.00093 -0.19017 +-0.93129 0.00093 -0.19017 +1.94042 0.07375 -0.17568 +-0.93129 0.07375 -0.17568 +1.94042 0.13549 -0.13443 +-0.93129 0.13549 -0.13443 +1.94042 0.17674 -0.07269 +-0.93129 0.17674 -0.07269 +1.94042 0.19122 0.00013 +-0.93129 0.19122 0.00013 +1.94042 0.17674 0.07295 +-0.93129 0.17674 0.07295 +1.94042 0.13549 0.13469 +-0.93129 0.13549 0.13469 +1.94042 0.07375 0.17594 +-0.93129 0.07375 0.17594 +1.94042 0.00093 0.19043 +-0.93129 0.00093 0.19043 +1.94042 -0.07190 0.17594 +-0.93129 -0.07190 0.17594 +1.94042 -0.13363 0.13469 +-0.93129 -0.13363 0.13469 +1.94042 -0.17488 0.07295 +-0.93129 -0.17488 0.07295 +1.94042 -0.18937 0.00013 +-0.93129 -0.18937 0.00013 +1.94042 -0.17488 -0.07269 +-0.93129 -0.17488 -0.07269 +1.94042 -0.13363 -0.13443 +-0.93129 -0.13363 -0.13443 +1.94042 -0.07190 -0.17568 +-0.93129 -0.07190 -0.17568 +-1.48171 0.00093 -0.15656 +-1.48171 0.06089 -0.14463 +-1.48171 0.11172 -0.11067 +-1.48171 0.14569 -0.05983 +-1.48171 0.15762 0.00013 +-1.48171 0.14569 0.06009 +-1.48171 0.11172 0.11093 +-1.48171 0.06089 0.14489 +-1.48171 0.00093 0.15682 +-1.48171 -0.05904 0.14489 +-1.48171 -0.10987 0.11093 +-1.48171 -0.14383 0.06009 +-1.48171 -0.15576 0.00013 +-1.48171 -0.14383 -0.05983 +-1.48171 -0.10987 -0.11067 +-1.48171 -0.05904 -0.14463 +-2.41768 0.00093 -0.15656 +-2.41768 0.06089 -0.14463 +-2.41768 0.11172 -0.11067 +-2.41768 0.14569 -0.05983 +-2.41768 0.15762 0.00013 +-2.41768 0.14569 0.06009 +-2.41768 0.11172 0.11093 +-2.41768 0.06089 0.14489 +-2.41768 0.00093 0.15682 +-2.41768 -0.05904 0.14489 +-2.41768 -0.10987 0.11093 +-2.41768 -0.14383 0.06009 +-2.41768 -0.15576 0.00013 +-2.41768 -0.14383 -0.05983 +-2.41768 -0.10987 -0.11067 +-2.41768 -0.05904 -0.14463 +-2.65559 0.00093 -0.13518 +-2.65559 0.05271 -0.12488 +-2.65559 0.09660 -0.09555 +-2.65559 0.12593 -0.05165 +-2.65559 0.13623 0.00013 +-2.65559 0.12593 0.05191 +-2.65559 0.09660 0.09581 +-2.65559 0.05271 0.12514 +-2.65559 0.00093 0.13544 +-2.65559 -0.05085 0.12514 +-2.65559 -0.09475 0.09581 +-2.65559 -0.12408 0.05191 +-2.65559 -0.13438 0.00013 +-2.65559 -0.12408 -0.05165 +-2.65559 -0.09475 -0.09555 +-2.65559 -0.05085 -0.12488 +-2.91627 0.00093 -0.08806 +-2.91627 0.03467 -0.08134 +-2.91627 0.06328 -0.06223 +-2.91627 0.08240 -0.03362 +-2.91627 0.08911 0.00013 +-2.91627 0.08240 0.03388 +-2.91627 0.06328 0.06249 +-2.91627 0.03467 0.08160 +-2.91627 0.00093 0.08832 +-2.91627 -0.03282 0.08160 +-2.91627 -0.06143 0.06249 +-2.91627 -0.08055 0.03388 +-2.91627 -0.08726 0.00013 +-2.91627 -0.08055 -0.03362 +-2.91627 -0.06143 -0.06223 +-2.91627 -0.03282 -0.08134 +-3.00698 0.00093 -0.05063 +-3.00698 0.02035 -0.04676 +-3.00698 0.03682 -0.03576 +-3.00698 0.04782 -0.01929 +-3.00698 0.05168 0.00013 +-3.00698 0.04782 0.01955 +-3.00698 0.03682 0.03602 +-3.00698 0.02035 0.04702 +-3.00698 0.00093 0.05089 +-3.00698 -0.01850 0.04702 +-3.00698 -0.03496 0.03602 +-3.00698 -0.04597 0.01955 +-3.00698 -0.04983 0.00013 +-3.00698 -0.04597 -0.01929 +-3.00698 -0.03496 -0.03576 +-3.00698 -0.01850 -0.04676 +-3.13379 0.00093 0.00013 +1.94042 0.00093 -0.14466 +1.94042 0.05634 -0.13364 +1.94042 0.10331 -0.10225 +1.94042 0.13469 -0.05528 +1.94042 0.14572 0.00013 +1.94042 0.13469 0.05554 +1.94042 0.10331 0.10251 +1.94042 0.05634 0.13390 +1.94042 0.00093 0.14492 +1.94042 -0.05448 0.13390 +1.94042 -0.10145 0.10251 +1.94042 -0.13284 0.05554 +1.94042 -0.14386 0.00013 +1.94042 -0.13284 -0.05528 +1.94042 -0.10145 -0.10225 +1.94042 -0.05448 -0.13364 +1.44438 0.00093 -0.14109 +1.44438 0.05497 -0.13034 +1.44438 0.10079 -0.09973 +1.44438 0.13140 -0.05391 +1.44438 0.14215 0.00013 +1.44438 0.13140 0.05417 +1.44438 0.10079 0.09999 +1.44438 0.05497 0.13061 +1.44438 0.00093 0.14136 +1.44438 -0.05312 0.13061 +1.44438 -0.09893 0.09999 +1.44438 -0.12955 0.05417 +1.44438 -0.14030 0.00013 +1.44438 -0.12955 -0.05391 +1.44438 -0.09893 -0.09973 +1.44438 -0.05312 -0.13034 +numsurf 189 +SURF 0X0 +mat 1 +refs 4 +0 0.821904 0.832671 +2 0.821904 0.832671 +3 0.821904 0.832671 +1 0.821904 0.832671 +SURF 0X0 +mat 1 +refs 4 +5 0.821904 0.832671 +6 0.821904 0.832671 +7 0.821904 0.832671 +4 0.821904 0.832671 +SURF 0X0 +mat 1 +refs 4 +3 0.821904 0.832671 +2 0.821904 0.832671 +4 0.821904 0.832671 +7 0.821904 0.832671 +SURF 0X0 +mat 1 +refs 4 +0 0.821904 0.832671 +1 0.821904 0.832671 +6 0.821904 0.832671 +5 0.821904 0.832671 +SURF 0X0 +mat 1 +refs 4 +1 0.821904 0.832671 +3 0.821904 0.832671 +7 0.821904 0.832671 +6 0.821904 0.832671 +SURF 0X0 +mat 1 +refs 4 +2 0.821904 0.832671 +0 0.821904 0.832671 +5 0.821904 0.832671 +4 0.821904 0.832671 +SURF 0X0 +mat 1 +refs 4 +8 0.821904 0.832671 +10 0.821904 0.832671 +11 0.821904 0.832671 +9 0.821904 0.832671 +SURF 0X0 +mat 1 +refs 4 +13 0.821904 0.832671 +14 0.821904 0.832671 +15 0.821904 0.832671 +12 0.821904 0.832671 +SURF 0X0 +mat 1 +refs 4 +11 0.821904 0.832671 +10 0.821904 0.832671 +12 0.821904 0.832671 +15 0.821904 0.832671 +SURF 0X0 +mat 1 +refs 4 +8 0.821904 0.832671 +9 0.821904 0.832671 +14 0.821904 0.832671 +13 0.821904 0.832671 +SURF 0X0 +mat 1 +refs 4 +9 0.821904 0.832671 +11 0.821904 0.832671 +15 0.821904 0.832671 +14 0.821904 0.832671 +SURF 0X0 +mat 1 +refs 4 +10 0.821904 0.832671 +8 0.821904 0.832671 +13 0.821904 0.832671 +12 0.821904 0.832671 +SURF 0X0 +mat 1 +refs 4 +16 0.933871 0.902116 +18 0.852384 0.903391 +19 0.853792 0.901094 +17 0.932835 0.899493 +SURF 0X0 +mat 1 +refs 4 +21 0.933506 0.899459 +22 0.932819 0.902115 +23 0.853643 0.903375 +20 0.851770 0.901094 +SURF 0X0 +mat 1 +refs 4 +19 0.000000 0.000000 +18 0.000000 0.000000 +20 0.000000 0.000000 +23 0.000000 0.000000 +SURF 0X0 +mat 1 +refs 4 +16 0.933871 0.902116 +17 0.932835 0.899493 +22 0.932819 0.902115 +21 0.933506 0.899459 +SURF 0X0 +mat 1 +refs 4 +17 0.932835 0.899493 +19 0.853792 0.901094 +23 0.853643 0.903375 +22 0.932819 0.902115 +SURF 0X0 +mat 1 +refs 4 +18 0.852384 0.903391 +16 0.933871 0.902116 +21 0.933506 0.899459 +20 0.851770 0.901094 +SURF 0X0 +mat 1 +refs 4 +24 0.821904 0.832671 +26 0.821904 0.832671 +27 0.821904 0.832671 +25 0.821904 0.832671 +SURF 0X0 +mat 1 +refs 4 +29 0.821904 0.832671 +30 0.821904 0.832671 +31 0.821904 0.832671 +28 0.821904 0.832671 +SURF 0X0 +mat 1 +refs 4 +27 0.821904 0.832671 +26 0.821904 0.832671 +28 0.821904 0.832671 +31 0.821904 0.832671 +SURF 0X0 +mat 1 +refs 4 +24 0.821904 0.832671 +25 0.821904 0.832671 +30 0.821904 0.832671 +29 0.821904 0.832671 +SURF 0X0 +mat 1 +refs 4 +25 0.821904 0.832671 +27 0.821904 0.832671 +31 0.821904 0.832671 +30 0.821904 0.832671 +SURF 0X0 +mat 1 +refs 4 +26 0.821904 0.832671 +24 0.821904 0.832671 +29 0.821904 0.832671 +28 0.821904 0.832671 +SURF 0X0 +mat 1 +refs 4 +32 0.970304 0.884794 +34 0.966778 0.958774 +35 0.957565 0.952593 +33 0.948163 0.869767 +SURF 0X0 +mat 1 +refs 4 +37 0.948163 0.890647 +38 0.965193 0.881300 +39 0.967358 0.953253 +36 0.961723 0.965834 +SURF 0X0 +mat 1 +refs 4 +35 0.957565 0.952593 +34 0.966778 0.958774 +36 0.961723 0.965834 +39 0.967358 0.953253 +SURF 0X0 +mat 1 +refs 4 +33 0.948163 0.869767 +35 0.957565 0.952593 +39 0.967358 0.953253 +38 0.965193 0.881300 +SURF 0X0 +mat 1 +refs 4 +34 0.966778 0.958774 +32 0.970304 0.884794 +37 0.948163 0.890647 +36 0.961723 0.965834 +SURF 0X0 +mat 1 +refs 4 +40 0.821929 0.832696 +42 0.890437 0.841267 +43 0.890434 0.865761 +41 0.823687 0.869718 +SURF 0X0 +mat 1 +refs 4 +45 0.959373 0.832696 +46 0.957608 0.869718 +47 0.890862 0.865748 +44 0.890864 0.841255 +SURF 0X0 +mat 1 +refs 4 +43 0.890434 0.865761 +42 0.890437 0.841267 +44 0.890864 0.841255 +47 0.890862 0.865748 +SURF 0X0 +mat 1 +refs 4 +41 0.000000 0.000000 +43 0.000000 0.000000 +47 0.000000 0.000000 +46 0.000000 0.000000 +SURF 0X0 +mat 1 +refs 4 +42 0.000000 0.000000 +40 0.000000 0.000000 +45 0.000000 0.000000 +44 0.000000 0.000000 +SURF 0X0 +mat 1 +refs 4 +48 0.834414 0.966811 +50 0.821929 0.886834 +51 0.830003 0.875049 +49 0.851721 0.946403 +SURF 0X0 +mat 1 +refs 4 +53 0.846865 0.951751 +54 0.829108 0.946403 +55 0.822882 0.869767 +52 0.832092 0.883696 +SURF 0X0 +mat 1 +refs 4 +51 0.830003 0.875049 +50 0.821929 0.886834 +52 0.832092 0.883696 +55 0.822882 0.869767 +SURF 0X0 +mat 1 +refs 4 +49 0.851721 0.946403 +51 0.830003 0.875049 +55 0.822882 0.869767 +54 0.829108 0.946403 +SURF 0X0 +mat 1 +refs 4 +50 0.821929 0.886834 +48 0.834414 0.966811 +53 0.846865 0.951751 +52 0.832092 0.883696 +SURF 0X0 +mat 1 +refs 4 +56 0.871957 0.876509 +58 0.948114 0.870404 +59 0.937390 0.879066 +57 0.867273 0.895362 +SURF 0X0 +mat 1 +refs 4 +61 0.871957 0.899411 +62 0.851770 0.881845 +63 0.934250 0.869767 +60 0.942580 0.877094 +SURF 0X0 +mat 1 +refs 4 +59 0.937390 0.879066 +58 0.948114 0.870404 +60 0.942580 0.877094 +63 0.934250 0.869767 +SURF 0X0 +mat 1 +refs 4 +57 0.867273 0.895362 +59 0.937390 0.879066 +63 0.934250 0.869767 +62 0.851770 0.881845 +SURF 0X0 +mat 1 +refs 4 +58 0.948114 0.870404 +56 0.871957 0.876509 +61 0.871957 0.899411 +60 0.942580 0.877094 +SURF 0X10 +mat 1 +refs 4 +64 0.118772 0.892513 +65 0.122949 0.914859 +67 0.113965 0.914818 +66 0.118684 0.892619 +SURF 0X10 +mat 1 +refs 4 +66 0.118684 0.892619 +67 0.113965 0.914818 +69 0.105668 0.911360 +68 0.118565 0.892681 +SURF 0X10 +mat 1 +refs 4 +68 0.118565 0.892681 +69 0.105668 0.911360 +71 0.099310 0.904987 +70 0.118433 0.892693 +SURF 0X10 +mat 1 +refs 4 +70 0.118433 0.892693 +71 0.099310 0.904987 +73 0.095863 0.896649 +72 0.118306 0.892652 +SURF 0X10 +mat 1 +refs 4 +72 0.118306 0.892652 +73 0.095863 0.896649 +75 0.095870 0.887601 +74 0.118205 0.892565 +SURF 0X10 +mat 1 +refs 4 +74 0.118205 0.892565 +75 0.095870 0.887601 +77 0.099347 0.879239 +76 0.118148 0.892446 +SURF 0X10 +mat 1 +refs 4 +76 0.118148 0.892446 +77 0.099347 0.879239 +79 0.105771 0.872850 +78 0.118139 0.892316 +SURF 0X10 +mat 1 +refs 4 +78 0.118139 0.892316 +79 0.105771 0.872850 +81 0.114157 0.869417 +80 0.118177 0.892192 +SURF 0X10 +mat 1 +refs 4 +80 0.118177 0.892192 +81 0.114157 0.869417 +83 0.123214 0.869465 +82 0.118258 0.892088 +SURF 0X10 +mat 1 +refs 4 +82 0.118258 0.892088 +83 0.123214 0.869465 +85 0.131554 0.872982 +84 0.118371 0.892033 +SURF 0X10 +mat 1 +refs 4 +84 0.118371 0.892033 +85 0.131554 0.872982 +87 0.137909 0.879429 +86 0.118498 0.892019 +SURF 0X10 +mat 1 +refs 4 +86 0.118498 0.892019 +87 0.137909 0.879429 +89 0.141307 0.887818 +88 0.118623 0.892055 +SURF 0X10 +mat 1 +refs 4 +88 0.118623 0.892055 +89 0.141307 0.887818 +91 0.141232 0.896859 +90 0.118726 0.892137 +SURF 0X10 +mat 1 +refs 4 +90 0.118726 0.892137 +91 0.141232 0.896859 +93 0.137705 0.905167 +92 0.118792 0.892250 +SURF 0X10 +mat 1 +refs 4 +73 0.631114 0.940940 +71 0.610103 0.961861 +99 0.594246 0.938582 +100 0.607492 0.925506 +SURF 0X10 +mat 1 +refs 4 +94 0.118810 0.892382 +95 0.131281 0.911480 +65 0.122949 0.914859 +64 0.118772 0.892513 +SURF 0X10 +mat 1 +refs 4 +92 0.118792 0.892250 +93 0.137705 0.905167 +95 0.131281 0.911480 +94 0.118810 0.892382 +SURF 0X10 +mat 1 +refs 4 +80 0.557004 0.956338 +82 0.529259 0.964757 +186 0.527331 0.947438 +185 0.548610 0.940371 +SURF 0X10 +mat 1 +refs 4 +83 0.582691 0.824220 +81 0.610090 0.835449 +104 0.594716 0.859076 +105 0.577592 0.851862 +SURF 0X10 +mat 1 +refs 4 +93 0.494496 0.913089 +91 0.494557 0.883872 +109 0.522005 0.888970 +110 0.521893 0.907463 +SURF 0X10 +mat 1 +refs 4 +69 0.582704 0.973074 +67 0.553154 0.972863 +97 0.558520 0.945324 +98 0.577036 0.945540 +SURF 0X10 +mat 1 +refs 4 +79 0.631110 0.856389 +77 0.642496 0.883820 +102 0.614841 0.889638 +103 0.607808 0.872343 +SURF 0X10 +mat 1 +refs 4 +89 0.505579 0.856823 +87 0.526096 0.835911 +107 0.542030 0.858845 +108 0.529032 0.871914 +SURF 0X10 +mat 1 +refs 4 +75 0.642496 0.913523 +73 0.631114 0.940940 +100 0.607492 0.925506 +101 0.614730 0.908313 +SURF 0X10 +mat 1 +refs 4 +85 0.553167 0.824410 +83 0.582691 0.824220 +105 0.577592 0.851862 +106 0.559081 0.851788 +SURF 0X10 +mat 1 +refs 4 +95 0.505465 0.940274 +93 0.494496 0.913089 +110 0.521893 0.907463 +111 0.528706 0.924679 +SURF 0X10 +mat 1 +refs 4 +71 0.610103 0.961861 +69 0.582704 0.973074 +98 0.577036 0.945540 +99 0.594246 0.938582 +SURF 0X10 +mat 1 +refs 4 +81 0.610090 0.835449 +79 0.631110 0.856389 +103 0.607808 0.872343 +104 0.594716 0.859076 +SURF 0X10 +mat 1 +refs 4 +67 0.553154 0.972863 +65 0.526024 0.961307 +96 0.541548 0.937986 +97 0.558520 0.945324 +SURF 0X10 +mat 1 +refs 4 +91 0.494557 0.883872 +89 0.505579 0.856823 +108 0.529032 0.871914 +109 0.522005 0.888970 +SURF 0X10 +mat 1 +refs 4 +77 0.642496 0.883820 +75 0.642496 0.913523 +101 0.614730 0.908313 +102 0.614841 0.889638 +SURF 0X10 +mat 1 +refs 4 +87 0.526096 0.835911 +85 0.553167 0.824410 +106 0.559081 0.851788 +107 0.542030 0.858845 +SURF 0X10 +mat 1 +refs 4 +65 0.526024 0.961307 +95 0.505465 0.940274 +111 0.528706 0.924679 +96 0.541548 0.937986 +SURF 0X10 +mat 1 +refs 4 +104 0.594716 0.859076 +103 0.607808 0.872343 +119 0.585283 0.887804 +120 0.579834 0.881894 +SURF 0X10 +mat 1 +refs 4 +97 0.558520 0.945324 +96 0.541548 0.937986 +112 0.556432 0.915461 +113 0.563513 0.918806 +SURF 0X10 +mat 1 +refs 4 +96 0.541548 0.937986 +111 0.528706 0.924679 +127 0.551247 0.909530 +112 0.556432 0.915461 +SURF 0X10 +mat 1 +refs 4 +105 0.577592 0.851862 +104 0.594716 0.859076 +120 0.579834 0.881894 +121 0.572591 0.878528 +SURF 0X10 +mat 1 +refs 4 +98 0.577036 0.945540 +97 0.558520 0.945324 +113 0.563513 0.918806 +114 0.571365 0.919088 +SURF 0X10 +mat 1 +refs 4 +106 0.559081 0.851788 +105 0.577592 0.851862 +121 0.572591 0.878528 +122 0.564740 0.878153 +SURF 0X10 +mat 1 +refs 4 +99 0.594246 0.938582 +98 0.577036 0.945540 +114 0.571365 0.919088 +115 0.578765 0.916270 +SURF 0X10 +mat 1 +refs 4 +107 0.542030 0.858845 +106 0.559081 0.851788 +122 0.564740 0.878153 +123 0.557440 0.880879 +SURF 0X10 +mat 1 +refs 4 +100 0.607492 0.925506 +99 0.594246 0.938582 +115 0.578765 0.916270 +116 0.584559 0.910775 +SURF 0X10 +mat 1 +refs 4 +108 0.529032 0.871914 +107 0.542030 0.858845 +123 0.557440 0.880879 +124 0.551831 0.886307 +SURF 0X10 +mat 1 +refs 4 +101 0.614730 0.908313 +100 0.607492 0.925506 +116 0.584559 0.910775 +117 0.587842 0.903435 +SURF 0X10 +mat 1 +refs 4 +109 0.522005 0.888970 +108 0.529032 0.871914 +124 0.551831 0.886307 +125 0.548852 0.893638 +SURF 0X10 +mat 1 +refs 4 +102 0.614841 0.889638 +101 0.614730 0.908313 +117 0.587842 0.903435 +118 0.588098 0.895368 +SURF 0X10 +mat 1 +refs 4 +110 0.521893 0.907463 +109 0.522005 0.888970 +125 0.548852 0.893638 +126 0.548855 0.901872 +SURF 0X10 +mat 1 +refs 4 +103 0.607808 0.872343 +102 0.614841 0.889638 +118 0.588098 0.895368 +119 0.585283 0.887804 +SURF 0X10 +mat 1 +refs 4 +111 0.528706 0.924679 +110 0.521893 0.907463 +126 0.548855 0.901872 +127 0.551247 0.909530 +SURF 0X10 +mat 1 +refs 4 +125 0.844466 0.970889 +124 0.818915 0.945418 +140 0.836660 0.933278 +141 0.856107 0.952964 +SURF 0X10 +mat 1 +refs 4 +118 0.915834 0.806205 +117 0.947419 0.820515 +133 0.935762 0.837177 +134 0.910910 0.826384 +SURF 0X10 +mat 1 +refs 4 +126 0.877665 0.984553 +125 0.844466 0.970889 +141 0.856107 0.952964 +142 0.881526 0.963624 +SURF 0X10 +mat 1 +refs 4 +119 0.880640 0.804784 +118 0.915834 0.806205 +134 0.910910 0.826384 +135 0.883715 0.825610 +SURF 0X10 +mat 1 +refs 4 +127 0.913428 0.984464 +126 0.877665 0.984553 +142 0.881526 0.963624 +143 0.908997 0.963725 +SURF 0X10 +mat 1 +refs 4 +120 0.847153 0.817006 +119 0.880640 0.804784 +135 0.883715 0.825610 +136 0.858075 0.835296 +SURF 0X10 +mat 1 +refs 4 +113 0.971392 0.945572 +112 0.946324 0.970744 +128 0.934339 0.953334 +129 0.953725 0.934102 +SURF 0X10 +mat 1 +refs 4 +112 0.946324 0.970744 +127 0.913428 0.984464 +143 0.908997 0.963725 +128 0.934339 0.953334 +SURF 0X10 +mat 1 +refs 4 +121 0.820570 0.841438 +120 0.847153 0.817006 +136 0.858075 0.835296 +137 0.837987 0.854251 +SURF 0X10 +mat 1 +refs 4 +114 0.984892 0.912854 +113 0.971392 0.945572 +129 0.953725 0.934102 +130 0.964270 0.909003 +SURF 0X10 +mat 1 +refs 4 +122 0.805281 0.874941 +121 0.820570 0.841438 +137 0.837987 0.854251 +138 0.826986 0.879718 +SURF 0X10 +mat 1 +refs 4 +115 0.984892 0.877623 +114 0.984892 0.912854 +130 0.964270 0.909003 +131 0.964465 0.881869 +SURF 0X10 +mat 1 +refs 4 +123 0.805020 0.911829 +122 0.805281 0.874941 +138 0.826986 0.879718 +139 0.826299 0.907496 +SURF 0X10 +mat 1 +refs 4 +116 0.971600 0.845250 +115 0.984892 0.877623 +131 0.964465 0.881869 +132 0.954412 0.856755 +SURF 0X10 +mat 1 +refs 4 +124 0.818915 0.945418 +123 0.805020 0.911829 +139 0.826299 0.907496 +140 0.836660 0.933278 +SURF 0X10 +mat 1 +refs 4 +117 0.947419 0.820515 +116 0.971600 0.845250 +132 0.954412 0.856755 +133 0.935762 0.837177 +SURF 0X10 +mat 1 +refs 4 +131 0.964465 0.881869 +130 0.964270 0.909003 +146 0.936371 0.903592 +147 0.936681 0.887457 +SURF 0X10 +mat 1 +refs 4 +139 0.826299 0.907496 +138 0.826986 0.879718 +154 0.855172 0.885457 +155 0.854754 0.901839 +SURF 0X10 +mat 1 +refs 4 +132 0.954412 0.856755 +131 0.964465 0.881869 +147 0.936681 0.887457 +148 0.930852 0.872440 +SURF 0X10 +mat 1 +refs 4 +140 0.836660 0.933278 +139 0.826299 0.907496 +155 0.854754 0.901839 +156 0.860664 0.917120 +SURF 0X10 +mat 1 +refs 4 +133 0.935762 0.837177 +132 0.954412 0.856755 +148 0.930852 0.872440 +149 0.919796 0.860764 +SURF 0X10 +mat 1 +refs 4 +141 0.856107 0.952964 +140 0.836660 0.933278 +156 0.860664 0.917120 +157 0.871986 0.928898 +SURF 0X10 +mat 1 +refs 4 +134 0.910910 0.826384 +133 0.935762 0.837177 +149 0.919796 0.860764 +150 0.905087 0.854191 +SURF 0X10 +mat 1 +refs 4 +142 0.881526 0.963624 +141 0.856107 0.952964 +157 0.871986 0.928898 +158 0.886934 0.935396 +SURF 0X10 +mat 1 +refs 4 +135 0.883715 0.825610 +134 0.910910 0.826384 +150 0.905087 0.854191 +151 0.888931 0.853686 +SURF 0X10 +mat 1 +refs 4 +143 0.908997 0.963725 +142 0.881526 0.963624 +158 0.886934 0.935396 +159 0.903196 0.935659 +SURF 0X10 +mat 1 +refs 4 +136 0.858075 0.835296 +135 0.883715 0.825610 +151 0.888931 0.853686 +152 0.873744 0.859396 +SURF 0X10 +mat 1 +refs 4 +129 0.953725 0.934102 +128 0.934339 0.953334 +144 0.918288 0.929687 +145 0.929927 0.918420 +SURF 0X10 +mat 1 +refs 4 +128 0.934339 0.953334 +143 0.908997 0.963725 +159 0.903196 0.935659 +144 0.918288 0.929687 +SURF 0X10 +mat 1 +refs 4 +137 0.837987 0.854251 +136 0.858075 0.835296 +152 0.873744 0.859396 +153 0.861860 0.870538 +SURF 0X10 +mat 1 +refs 4 +130 0.964270 0.909003 +129 0.953725 0.934102 +145 0.929927 0.918420 +146 0.936371 0.903592 +SURF 0X10 +mat 1 +refs 4 +138 0.826986 0.879718 +137 0.837987 0.854251 +153 0.861860 0.870538 +154 0.855172 0.885457 +SURF 0X10 +mat 1 +refs 4 +152 0.873744 0.859396 +151 0.888931 0.853686 +167 0.891866 0.871647 +168 0.883343 0.874911 +SURF 0X10 +mat 1 +refs 4 +145 0.929927 0.918420 +144 0.918288 0.929687 +160 0.908378 0.914412 +161 0.914957 0.908106 +SURF 0X10 +mat 1 +refs 4 +144 0.918288 0.929687 +159 0.903196 0.935659 +175 0.899879 0.917725 +160 0.908378 0.914412 +SURF 0X10 +mat 1 +refs 4 +153 0.861860 0.870538 +152 0.873744 0.859396 +168 0.883343 0.874911 +169 0.876713 0.881200 +SURF 0X10 +mat 1 +refs 4 +146 0.936371 0.903592 +145 0.929927 0.918420 +161 0.914957 0.908106 +162 0.918624 0.899774 +SURF 0X10 +mat 1 +refs 4 +154 0.855172 0.885457 +153 0.861860 0.870538 +169 0.876713 0.881200 +170 0.873007 0.889561 +SURF 0X10 +mat 1 +refs 4 +147 0.936681 0.887457 +146 0.936371 0.903592 +162 0.918624 0.899774 +163 0.918835 0.890681 +SURF 0X10 +mat 1 +refs 4 +155 0.854754 0.901839 +154 0.855172 0.885457 +170 0.873007 0.889561 +171 0.872814 0.898696 +SURF 0X10 +mat 1 +refs 4 +148 0.930852 0.872440 +147 0.936681 0.887457 +163 0.918835 0.890681 +164 0.915566 0.882194 +SURF 0X10 +mat 1 +refs 4 +156 0.860664 0.917120 +155 0.854754 0.901839 +171 0.872814 0.898696 +172 0.876077 0.907228 +SURF 0X10 +mat 1 +refs 4 +149 0.919796 0.860764 +148 0.930852 0.872440 +164 0.915566 0.882194 +165 0.909307 0.875581 +SURF 0X10 +mat 1 +refs 4 +157 0.871986 0.928898 +156 0.860664 0.917120 +172 0.876077 0.907228 +173 0.882385 0.913846 +SURF 0X10 +mat 1 +refs 4 +150 0.905087 0.854191 +149 0.919796 0.860764 +165 0.909307 0.875581 +166 0.900977 0.871888 +SURF 0X10 +mat 1 +refs 4 +158 0.886934 0.935396 +157 0.871986 0.928898 +173 0.882385 0.913846 +174 0.890749 0.917531 +SURF 0X10 +mat 1 +refs 4 +151 0.888931 0.853686 +150 0.905087 0.854191 +166 0.900977 0.871888 +167 0.891866 0.871647 +SURF 0X10 +mat 1 +refs 4 +159 0.903196 0.935659 +158 0.886934 0.935396 +174 0.890749 0.917531 +175 0.899879 0.917725 +SURF 0X10 +mat 1 +refs 3 +173 0.882385 0.913846 +172 0.876077 0.907228 +176 0.895843 0.894687 +SURF 0X10 +mat 1 +refs 3 +166 0.900977 0.871888 +165 0.909307 0.875581 +176 0.895843 0.894687 +SURF 0X10 +mat 1 +refs 3 +174 0.890749 0.917531 +173 0.882385 0.913846 +176 0.895843 0.894687 +SURF 0X10 +mat 1 +refs 3 +167 0.891866 0.871647 +166 0.900977 0.871888 +176 0.895843 0.894687 +SURF 0X10 +mat 1 +refs 3 +175 0.899879 0.917725 +174 0.890749 0.917531 +176 0.895843 0.894687 +SURF 0X10 +mat 1 +refs 3 +168 0.883343 0.874911 +167 0.891866 0.871647 +176 0.895843 0.894687 +SURF 0X10 +mat 1 +refs 3 +161 0.914957 0.908106 +160 0.908378 0.914412 +176 0.895843 0.894687 +SURF 0X10 +mat 1 +refs 3 +160 0.908378 0.914412 +175 0.899879 0.917725 +176 0.895843 0.894687 +SURF 0X10 +mat 1 +refs 3 +169 0.876713 0.881200 +168 0.883343 0.874911 +176 0.895843 0.894687 +SURF 0X10 +mat 1 +refs 3 +162 0.918624 0.899774 +161 0.914957 0.908106 +176 0.895843 0.894687 +SURF 0X10 +mat 1 +refs 3 +170 0.873007 0.889561 +169 0.876713 0.881200 +176 0.895843 0.894687 +SURF 0X10 +mat 1 +refs 3 +163 0.918835 0.890681 +162 0.918624 0.899774 +176 0.895843 0.894687 +SURF 0X10 +mat 1 +refs 3 +171 0.872814 0.898696 +170 0.873007 0.889561 +176 0.895843 0.894687 +SURF 0X10 +mat 1 +refs 3 +164 0.915566 0.882194 +163 0.918835 0.890681 +176 0.895843 0.894687 +SURF 0X10 +mat 1 +refs 3 +172 0.876077 0.907228 +171 0.872814 0.898696 +176 0.895843 0.894687 +SURF 0X10 +mat 1 +refs 3 +165 0.909307 0.875581 +164 0.915566 0.882194 +176 0.895843 0.894687 +SURF 0X10 +mat 1 +refs 4 +178 0.508345 0.832597 +179 0.531617 0.832049 +195 0.527933 0.854445 +194 0.513570 0.854580 +SURF 0X10 +mat 1 +refs 4 +90 0.444540 0.905280 +92 0.444540 0.875717 +191 0.462172 0.879540 +190 0.461999 0.902113 +SURF 0X10 +mat 1 +refs 4 +66 0.504635 0.814512 +68 0.535119 0.813735 +179 0.531617 0.832049 +178 0.508345 0.832597 +SURF 0X10 +mat 1 +refs 4 +76 0.595969 0.910089 +78 0.580631 0.937571 +184 0.566349 0.925486 +183 0.577494 0.904391 +SURF 0X10 +mat 1 +refs 4 +86 0.476043 0.951946 +88 0.455813 0.932066 +189 0.470402 0.922604 +188 0.485814 0.937934 +SURF 0X10 +mat 1 +refs 4 +72 0.586801 0.846962 +74 0.598866 0.877348 +182 0.579664 0.880031 +181 0.570507 0.857387 +SURF 0X10 +mat 1 +refs 4 +82 0.529259 0.964757 +84 0.501392 0.962780 +187 0.505687 0.946106 +186 0.527331 0.947438 +SURF 0X10 +mat 1 +refs 4 +92 0.444540 0.875717 +94 0.455890 0.848099 +192 0.470937 0.858380 +191 0.462172 0.879540 +SURF 0X10 +mat 1 +refs 4 +68 0.535119 0.813735 +70 0.564024 0.824859 +180 0.553491 0.840618 +179 0.531617 0.832049 +SURF 0X10 +mat 1 +refs 4 +78 0.580631 0.937571 +80 0.557004 0.956338 +185 0.548610 0.940371 +184 0.566349 0.925486 +SURF 0X10 +mat 1 +refs 4 +64 0.476929 0.826617 +66 0.504635 0.814512 +178 0.508345 0.832597 +177 0.487103 0.841885 +SURF 0X10 +mat 1 +refs 4 +88 0.455813 0.932066 +90 0.444540 0.905280 +190 0.461999 0.902113 +189 0.470402 0.922604 +SURF 0X10 +mat 1 +refs 4 +74 0.598866 0.877348 +76 0.595969 0.910089 +183 0.577494 0.904391 +182 0.579664 0.880031 +SURF 0X10 +mat 1 +refs 4 +84 0.501392 0.962780 +86 0.476043 0.951946 +188 0.485814 0.937934 +187 0.505687 0.946106 +SURF 0X10 +mat 1 +refs 4 +94 0.455890 0.848099 +64 0.476929 0.826617 +177 0.487103 0.841885 +192 0.470937 0.858380 +SURF 0X10 +mat 1 +refs 4 +70 0.564024 0.824859 +72 0.586801 0.846962 +181 0.570507 0.857387 +180 0.553491 0.840618 +SURF 0X10 +mat 1 +refs 16 +193 0.118607 0.892427 +194 0.118566 0.892478 +195 0.118512 0.892509 +196 0.118451 0.892514 +197 0.118393 0.892495 +198 0.118348 0.892454 +199 0.118320 0.892399 +200 0.118313 0.892336 +201 0.118330 0.892276 +202 0.118369 0.892226 +203 0.118422 0.892195 +204 0.118485 0.892191 +205 0.118545 0.892210 +206 0.118593 0.892250 +207 0.118623 0.892305 +208 0.118628 0.892367 +SURF 0X10 +mat 1 +refs 4 +186 0.527331 0.947438 +187 0.505687 0.946106 +203 0.510116 0.926511 +202 0.524154 0.926430 +SURF 0X10 +mat 1 +refs 4 +179 0.531617 0.832049 +180 0.553491 0.840618 +196 0.541036 0.859967 +195 0.527933 0.854445 +SURF 0X10 +mat 1 +refs 4 +187 0.505687 0.946106 +188 0.485814 0.937934 +204 0.497322 0.920795 +203 0.510116 0.926511 +SURF 0X10 +mat 1 +refs 4 +180 0.553491 0.840618 +181 0.570507 0.857387 +197 0.550735 0.870282 +196 0.541036 0.859967 +SURF 0X10 +mat 1 +refs 4 +188 0.485814 0.937934 +189 0.470402 0.922604 +205 0.487849 0.910880 +204 0.497322 0.920795 +SURF 0X10 +mat 1 +refs 4 +181 0.570507 0.857387 +182 0.579664 0.880031 +198 0.555392 0.883566 +197 0.550735 0.870282 +SURF 0X10 +mat 1 +refs 4 +189 0.470402 0.922604 +190 0.461999 0.902113 +206 0.483145 0.897950 +205 0.487849 0.910880 +SURF 0X10 +mat 1 +refs 4 +182 0.579664 0.880031 +183 0.577494 0.904391 +199 0.554716 0.898009 +198 0.555392 0.883566 +SURF 0X10 +mat 1 +refs 4 +190 0.461999 0.902113 +191 0.462172 0.879540 +207 0.483947 0.883850 +206 0.483145 0.897950 +SURF 0X10 +mat 1 +refs 4 +183 0.577494 0.904391 +184 0.566349 0.925486 +200 0.548410 0.911197 +199 0.554716 0.898009 +SURF 0X10 +mat 1 +refs 4 +191 0.462172 0.879540 +192 0.470937 0.858380 +208 0.489766 0.870508 +207 0.483947 0.883850 +SURF 0X10 +mat 1 +refs 4 +184 0.566349 0.925486 +185 0.548610 0.940371 +201 0.537564 0.921070 +200 0.548410 0.911197 +SURF 0X10 +mat 1 +refs 4 +177 0.487103 0.841885 +178 0.508345 0.832597 +194 0.513570 0.854580 +193 0.500179 0.860253 +SURF 0X10 +mat 1 +refs 4 +192 0.470937 0.858380 +177 0.487103 0.841885 +193 0.500179 0.860253 +208 0.489766 0.870508 +SURF 0X10 +mat 1 +refs 4 +185 0.548610 0.940371 +186 0.527331 0.947438 +202 0.524154 0.926430 +201 0.537564 0.921070 +kids 0 diff --git a/BUK-M2/Models/Armament/Weapons/M317/BUK-M2.png b/BUK-M2/Models/Armament/Weapons/M317/BUK-M2.png new file mode 100644 index 0000000000000000000000000000000000000000..54caa8bc8dcb87c7e126bec2ff84080f01075b55 GIT binary patch literal 77705 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 literal 0 HcmV?d00001 diff --git a/BUK-M2/Models/Armament/Weapons/M317/explosion-0.xml b/BUK-M2/Models/Armament/Weapons/M317/explosion-0.xml new file mode 100644 index 0000000..fcb5b09 --- /dev/null +++ b/BUK-M2/Models/Armament/Weapons/M317/explosion-0.xml @@ -0,0 +1,176 @@ + + + + explosion + smoke.png + + true + false + + + payload/armament/m317/flags/explode-id-0 + + + world + + + point + + + + -180 + 180 + -180 + 180 + + 500 + 80 + + + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 30 + 10 + + + + billboard + + + + + 1.0 + 1.0 + 0.4 + 1 + + + 2 + + + + + + 0.8 + 0.5 + 0.2 + 0.1 + + + 55 + + + + + 0.5 + + + 5 + 0.5 + + + + air + true + true + + + + + + + explosion-smoke + smoke.png + + false + false + + + payload/armament/m317/flags/explode-smoke-id-0 + + + world + + + point + + + + -180 + 180 + -180 + 180 + + 500 + 60 + + + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 50 + 10 + + + + billboard + + + + + 0.3 + 0.3 + 0.25 + 0.5 + + + 10 + + + + + + 0.4 + 0.4 + 0.4 + 0.04 + + + 60 + + + + + 40 + + + 5 + 0.5 + + + + air + true + true + + + + + diff --git a/BUK-M2/Models/Armament/Weapons/M317/explosion-1.xml b/BUK-M2/Models/Armament/Weapons/M317/explosion-1.xml new file mode 100644 index 0000000..0296b93 --- /dev/null +++ b/BUK-M2/Models/Armament/Weapons/M317/explosion-1.xml @@ -0,0 +1,176 @@ + + + + explosion + smoke.png + + true + false + + + payload/armament/m317/flags/explode-id-1 + + + world + + + point + + + + -180 + 180 + -180 + 180 + + 500 + 80 + + + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 30 + 10 + + + + billboard + + + + + 1.0 + 1.0 + 0.4 + 1 + + + 2 + + + + + + 0.8 + 0.5 + 0.2 + 0.1 + + + 55 + + + + + 0.5 + + + 5 + 0.5 + + + + air + true + true + + + + + + + explosion-smoke + smoke.png + + false + false + + + payload/armament/m317/flags/explode-smoke-id-1 + + + world + + + point + + + + -180 + 180 + -180 + 180 + + 500 + 60 + + + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 50 + 10 + + + + billboard + + + + + 0.3 + 0.3 + 0.25 + 0.5 + + + 10 + + + + + + 0.4 + 0.4 + 0.4 + 0.04 + + + 60 + + + + + 40 + + + 5 + 0.5 + + + + air + true + true + + + + + diff --git a/BUK-M2/Models/Armament/Weapons/M317/explosion-2.xml b/BUK-M2/Models/Armament/Weapons/M317/explosion-2.xml new file mode 100644 index 0000000..d90a713 --- /dev/null +++ b/BUK-M2/Models/Armament/Weapons/M317/explosion-2.xml @@ -0,0 +1,176 @@ + + + + explosion + smoke.png + + true + false + + + payload/armament/m317/flags/explode-id-2 + + + world + + + point + + + + -180 + 180 + -180 + 180 + + 500 + 80 + + + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 30 + 10 + + + + billboard + + + + + 1.0 + 1.0 + 0.4 + 1 + + + 2 + + + + + + 0.8 + 0.5 + 0.2 + 0.1 + + + 55 + + + + + 0.5 + + + 5 + 0.5 + + + + air + true + true + + + + + + + explosion-smoke + smoke.png + + false + false + + + payload/armament/m317/flags/explode-smoke-id-2 + + + world + + + point + + + + -180 + 180 + -180 + 180 + + 500 + 60 + + + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 50 + 10 + + + + billboard + + + + + 0.3 + 0.3 + 0.25 + 0.5 + + + 10 + + + + + + 0.4 + 0.4 + 0.4 + 0.04 + + + 60 + + + + + 40 + + + 5 + 0.5 + + + + air + true + true + + + + + diff --git a/BUK-M2/Models/Armament/Weapons/M317/explosion-3.xml b/BUK-M2/Models/Armament/Weapons/M317/explosion-3.xml new file mode 100644 index 0000000..d6e5d10 --- /dev/null +++ b/BUK-M2/Models/Armament/Weapons/M317/explosion-3.xml @@ -0,0 +1,176 @@ + + + + explosion + smoke.png + + true + false + + + payload/armament/m317/flags/explode-id-3 + + + world + + + point + + + + -180 + 180 + -180 + 180 + + 500 + 80 + + + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 30 + 10 + + + + billboard + + + + + 1.0 + 1.0 + 0.4 + 1 + + + 2 + + + + + + 0.8 + 0.5 + 0.2 + 0.1 + + + 55 + + + + + 0.5 + + + 5 + 0.5 + + + + air + true + true + + + + + + + explosion-smoke + smoke.png + + false + false + + + payload/armament/m317/flags/explode-smoke-id-3 + + + world + + + point + + + + -180 + 180 + -180 + 180 + + 500 + 60 + + + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 50 + 10 + + + + billboard + + + + + 0.3 + 0.3 + 0.25 + 0.5 + + + 10 + + + + + + 0.4 + 0.4 + 0.4 + 0.04 + + + 60 + + + + + 40 + + + 5 + 0.5 + + + + air + true + true + + + + + diff --git a/BUK-M2/Models/Armament/Weapons/M317/m317-0.xml b/BUK-M2/Models/Armament/Weapons/M317/m317-0.xml new file mode 100644 index 0000000..93e4ff7 --- /dev/null +++ b/BUK-M2/Models/Armament/Weapons/M317/m317-0.xml @@ -0,0 +1,42 @@ + + + + + + + aim-120 + 9M317.ac + + + select + missile1 + + payload/armament/m317/flags/msl-id-0 + + + + + Aircraft/BUK-M2/Models/Armament/Weapons/M317/motor-smoke-0.xml + + 1.83937 + 0 + 0 + + + + + explosion + Aircraft/BUK-M2/Models/Armament/Weapons/M317/explosion-0.xml + + 0 + 0 + 0 + + + + + missile1 + false + + + diff --git a/BUK-M2/Models/Armament/Weapons/M317/m317-1.xml b/BUK-M2/Models/Armament/Weapons/M317/m317-1.xml new file mode 100644 index 0000000..798788e --- /dev/null +++ b/BUK-M2/Models/Armament/Weapons/M317/m317-1.xml @@ -0,0 +1,42 @@ + + + + + + + aim-120 + 9M317.ac + + + select + missile1 + + payload/armament/m317/flags/msl-id-1 + + + + + Aircraft/BUK-M2/Models/Armament/Weapons/M317/motor-smoke-1.xml + + 1.83937 + 0 + 0 + + + + + explosion + Aircraft/BUK-M2/Models/Armament/Weapons/M317/explosion-1.xml + + 0 + 0 + 0 + + + + + missile1 + false + + + diff --git a/BUK-M2/Models/Armament/Weapons/M317/m317-2.xml b/BUK-M2/Models/Armament/Weapons/M317/m317-2.xml new file mode 100644 index 0000000..ec160b9 --- /dev/null +++ b/BUK-M2/Models/Armament/Weapons/M317/m317-2.xml @@ -0,0 +1,42 @@ + + + + + + + aim-120 + 9M317.ac + + + select + missile1 + + payload/armament/m317/flags/msl-id-2 + + + + + Aircraft/BUK-M2/Models/Armament/Weapons/M317/motor-smoke-2.xml + + 1.83937 + 0 + 0 + + + + + explosion + Aircraft/BUK-M2/Models/Armament/Weapons/M317/explosion-2.xml + + 0 + 0 + 0 + + + + + missile1 + false + + + diff --git a/BUK-M2/Models/Armament/Weapons/M317/m317-3.xml b/BUK-M2/Models/Armament/Weapons/M317/m317-3.xml new file mode 100644 index 0000000..227977a --- /dev/null +++ b/BUK-M2/Models/Armament/Weapons/M317/m317-3.xml @@ -0,0 +1,42 @@ + + + + + + + aim-120 + 9M317.ac + + + select + missile1 + + payload/armament/m317/flags/msl-id-3 + + + + + Aircraft/BUK-M2/Models/Armament/Weapons/M317/motor-smoke-3.xml + + 1.83937 + 0 + 0 + + + + + explosion + Aircraft/BUK-M2/Models/Armament/Weapons/M317/explosion-3.xml + + 0 + 0 + 0 + + + + + missile1 + false + + + diff --git a/BUK-M2/Models/Armament/Weapons/M317/m317.xml b/BUK-M2/Models/Armament/Weapons/M317/m317.xml new file mode 100644 index 0000000..dcd94c8 --- /dev/null +++ b/BUK-M2/Models/Armament/Weapons/M317/m317.xml @@ -0,0 +1,7 @@ + + + + + 9M317.ac + + \ No newline at end of file diff --git a/BUK-M2/Models/Armament/Weapons/M317/motor-smoke-0.xml b/BUK-M2/Models/Armament/Weapons/M317/motor-smoke-0.xml new file mode 100644 index 0000000..53ada28 --- /dev/null +++ b/BUK-M2/Models/Armament/Weapons/M317/motor-smoke-0.xml @@ -0,0 +1,187 @@ + + + + smoke + smoke.png + + true + false + + + payload/armament/m317/flags/smoke-id-0 + + + world + + + point + + + + 7 + 0 + 0 + + + + -1.5 + 1.5 + -1.5 + 1.5 + + 0 + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 50 + 0 + + + + billboard + + + + + 0.25 + 0.25 + 0.25 + 1 + + + 1.0 + + + + + + 0.25 + 0.25 + 0.25 + 0.5 + + + 5 + + + + + 60 + + + 0.001 + 0.5 + + + + air + false + true + + + + + + exhaust + smoke.png + + true + false + + + payload/armament/m317/flags/smoke-id-0 + + + world + + + point + + + + 0 + 0 + 0 + + + + -1.5 + 1.5 + -1.5 + 1.5 + + 0 + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 100 + 0 + + + + billboard + + + + + 1.0 + 0.7 + 0.2 + 0.7 + + + 1.0 + + + + + + 0.9 + 0.6 + 0.2 + 0.1 + + + 1.5 + + + + + 0.15 + + + 0.001 + 0.5 + + + + air + false + false + + + + + \ No newline at end of file diff --git a/BUK-M2/Models/Armament/Weapons/M317/motor-smoke-1.xml b/BUK-M2/Models/Armament/Weapons/M317/motor-smoke-1.xml new file mode 100644 index 0000000..172a3ae --- /dev/null +++ b/BUK-M2/Models/Armament/Weapons/M317/motor-smoke-1.xml @@ -0,0 +1,187 @@ + + + + smoke + smoke.png + + true + false + + + payload/armament/m317/flags/smoke-id-1 + + + world + + + point + + + + 7 + 0 + 0 + + + + -1.5 + 1.5 + -1.5 + 1.5 + + 0 + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 50 + 0 + + + + billboard + + + + + 0.25 + 0.25 + 0.25 + 1 + + + 1.0 + + + + + + 0.25 + 0.25 + 0.25 + 0.5 + + + 5 + + + + + 60 + + + 0.001 + 0.5 + + + + air + false + true + + + + + + exhaust + smoke.png + + true + false + + + payload/armament/m317/flags/smoke-id-1 + + + world + + + point + + + + 0 + 0 + 0 + + + + -1.5 + 1.5 + -1.5 + 1.5 + + 0 + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 100 + 0 + + + + billboard + + + + + 1.0 + 0.7 + 0.2 + 0.7 + + + 1.0 + + + + + + 0.9 + 0.6 + 0.2 + 0.1 + + + 1.5 + + + + + 0.15 + + + 0.001 + 0.5 + + + + air + false + false + + + + + \ No newline at end of file diff --git a/BUK-M2/Models/Armament/Weapons/M317/motor-smoke-2.xml b/BUK-M2/Models/Armament/Weapons/M317/motor-smoke-2.xml new file mode 100644 index 0000000..1d550a3 --- /dev/null +++ b/BUK-M2/Models/Armament/Weapons/M317/motor-smoke-2.xml @@ -0,0 +1,187 @@ + + + + smoke + smoke.png + + true + false + + + payload/armament/m317/flags/smoke-id-2 + + + world + + + point + + + + 7 + 0 + 0 + + + + -1.5 + 1.5 + -1.5 + 1.5 + + 0 + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 50 + 0 + + + + billboard + + + + + 0.25 + 0.25 + 0.25 + 1 + + + 1.0 + + + + + + 0.25 + 0.25 + 0.25 + 0.5 + + + 5 + + + + + 60 + + + 0.001 + 0.5 + + + + air + false + true + + + + + + exhaust + smoke.png + + true + false + + + payload/armament/m317/flags/smoke-id-2 + + + world + + + point + + + + 0 + 0 + 0 + + + + -1.5 + 1.5 + -1.5 + 1.5 + + 0 + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 100 + 0 + + + + billboard + + + + + 1.0 + 0.7 + 0.2 + 0.7 + + + 1.0 + + + + + + 0.9 + 0.6 + 0.2 + 0.1 + + + 1.5 + + + + + 0.15 + + + 0.001 + 0.5 + + + + air + false + false + + + + + \ No newline at end of file diff --git a/BUK-M2/Models/Armament/Weapons/M317/motor-smoke-3.xml b/BUK-M2/Models/Armament/Weapons/M317/motor-smoke-3.xml new file mode 100644 index 0000000..5ce082d --- /dev/null +++ b/BUK-M2/Models/Armament/Weapons/M317/motor-smoke-3.xml @@ -0,0 +1,187 @@ + + + + smoke + smoke.png + + true + false + + + payload/armament/m317/flags/smoke-id-3 + + + world + + + point + + + + 7 + 0 + 0 + + + + -1.5 + 1.5 + -1.5 + 1.5 + + 0 + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 50 + 0 + + + + billboard + + + + + 0.25 + 0.25 + 0.25 + 1 + + + 1.0 + + + + + + 0.25 + 0.25 + 0.25 + 0.5 + + + 5 + + + + + 60 + + + 0.001 + 0.5 + + + + air + false + true + + + + + + exhaust + smoke.png + + true + false + + + payload/armament/m317/flags/smoke-id-3 + + + world + + + point + + + + 0 + 0 + 0 + + + + -1.5 + 1.5 + -1.5 + 1.5 + + 0 + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + 100 + 0 + + + + billboard + + + + + 1.0 + 0.7 + 0.2 + 0.7 + + + 1.0 + + + + + + 0.9 + 0.6 + 0.2 + 0.1 + + + 1.5 + + + + + 0.15 + + + 0.001 + 0.5 + + + + air + false + false + + + + + \ No newline at end of file diff --git a/BUK-M2/Models/Armament/Weapons/M317/puff.png b/BUK-M2/Models/Armament/Weapons/M317/puff.png new file mode 100644 index 0000000000000000000000000000000000000000..5ba85dae3fc555c3aa49377e2cb9bcf4c1784a40 GIT binary patch literal 11337 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 LNkvXXu0mjfY;uv5 literal 0 HcmV?d00001 diff --git a/BUK-M2/Models/Armament/Weapons/M317/smoke.png b/BUK-M2/Models/Armament/Weapons/M317/smoke.png new file mode 100644 index 0000000000000000000000000000000000000000..658fed9ecafefc4958a5afbc8fb7babc31261572 GIT binary patch literal 6474 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 literal 0 HcmV?d00001 diff --git a/BUK-M2/Nasal/damage.nas b/BUK-M2/Nasal/damage.nas index 44b753a..81e859c 100644 --- a/BUK-M2/Nasal/damage.nas +++ b/BUK-M2/Nasal/damage.nas @@ -27,8 +27,6 @@ var mlw_max=getprop("payload/d-config/mlw_max"); # var auto_flare_caller = getprop("payload/d-config/auto_flare_caller"); # If damage.nas should detect flare releases, or if function is called from somewhere in aircraft ############################################################################################################################ -var TRUE = 1; -var FALSE = 0; var hp = hp_max; setprop("sam/damage", math.max(0,100*hp/hp_max));#used in HUD @@ -164,7 +162,9 @@ var warheads = { "pilot": [93, 0.00,1,0],# ejected pilot "BETAB-500ShP": [94, 1160.00,1,0], "Flare": [95, 0.00,0,0], - "3M9": [96, 125.00,0,0],# 3M9 Missile used with 2K12/SA-6 + "3M9": [96, 125.00,0,0],# 3M9M3 Missile used with 2K12/SA-6 + "5V28V": [97, 478.00,0,0],# Missile used with S-200D/SA-5 + "AIM-9X": [98, 20.80,0,0], }; var AIR_RADAR = "air"; @@ -189,7 +189,8 @@ var radar_signatures = { "E-8R": AIR_RADAR, "EC-137D": AIR_RADAR, "Mig-28": AIR_RADAR, - "SA-6": AIR_RADAR,#Air radar tone chosen so that there is at least some lock tone until asset-specific is created + "SA-6": "gnd-06",#Air radar tone chosen so that there is at least some lock tone until asset-specific is created + "s-200": "gnd-05", "ZSU-23-4M": "gnd-23", "S-75": "gnd-02", "buk-m2": "gnd-11", @@ -203,7 +204,7 @@ var radar_signatures = { var id2warhead = []; var launched = {};# callsign: elapsed-sec var approached = {};# callsign: uniqueID -var heavy_smoke = [61,62,63,65,92,96]; +var heavy_smoke = [61,62,63,65,92,96,97]; var k = keys(warheads); @@ -241,6 +242,10 @@ for(var myid = 0;myid 450) { - printf("Missile Approach Warning from %03d degrees.", bearing); - damageLog.push(sprintf("Missile Approach Warning from %03d degrees from %s.", bearing, notification.Callsign)); - if (rwr_to_screen) screen.log.write(sprintf("Missile Approach Warning from %03d degrees.", bearing), 1,1,0);# temporary till someone models a RWR in RIO seat + if (radarOn) { + #printf("Missile Approach Warning from %03d degrees.", bearing); + damageLog.push(sprintf("Missile Approach Warning from %03d degrees from %s.", bearing, notification.Callsign)); + if (rwr_to_screen) screen.log.write(sprintf("Missile Approach Warning from %03d degrees.", bearing), 1,0.5,0);# temporary till someone models a RWR in RIO seat + } else { + #printf("Missile Approach Warning"); + damageLog.push(sprintf("Missile Approach Warning from %s.", notification.Callsign)); + if (rwr_to_screen) screen.log.write(sprintf("Missile Approach Warning (semi-active)."), 1,0.5,0);# temporary till someone models a RWR in RIO seat + } approached[notification.Callsign~notification.UniqueIdentity] = elapsed; - if (m28_auto) mig28.engagedBy(notification.Callsign); + if (m28_auto) mig28.engagedBy(notification.Callsign, 1); } return emesary.Transmitter.ReceiptStatus_OK; } @@ -415,7 +433,7 @@ var DamageRecipient = # debug.dump(notification); # # - if (tacview_supported and tacview.starttime and getprop("sim/multiplay/txhost") != "mpserver.opredflag.com") { + if (tacview_supported and tacview.starttime and (getprop("sim/multiplay/txhost") != "mpserver.opredflag.com" or m28_auto)) { var node = getCallsign(notification.RemoteCallsign); if (node != nil and notification.SecondaryKind > 20) { # its a warhead @@ -439,9 +457,10 @@ var DamageRecipient = var callsign = processCallsign(getprop("sim/multiplay/callsign")); if (notification.RemoteCallsign == callsign and getprop("payload/armament/msg") == 1) { #damage enabled and were getting hit - if (m28_auto) mig28.engagedBy(notification.Callsign); + if (notification.SecondaryKind < 0 and hitable_by_cannon) { # cannon hit + if (m28_auto) mig28.engagedBy(notification.Callsign, 0); var probability = id2shell[-1*notification.SecondaryKind-1][1]; var typ = id2shell[-1*notification.SecondaryKind-1][2]; var hit_count = notification.Distance; @@ -457,6 +476,7 @@ var DamageRecipient = } } elsif (notification.SecondaryKind > 20) { # its a warhead + if (m28_auto) mig28.engagedBy(notification.Callsign, 1); var dist = notification.Distance; var wh = id2warhead[notification.SecondaryKind - 21]; var type = wh[4];#test code @@ -549,21 +569,18 @@ var DamageRecipient = } if (notification.Kind == CREATE and getprop("payload/armament/enable-craters") == 1 and statics["obj_"~notification.UniqueIdentity] == nil) { if (notification.SecondaryKind == 0) {# TODO: make a hash with all the models - var crater_model = getprop("payload/armament/models") ~ "crater_small.xml"; - var static = geo.put_model(crater_model, notification.Position.lat(), notification.Position.lon(), notification.Position.alt(), notification.Heading); + var static = geo.put_model(crater_model0, notification.Position.lat(), notification.Position.lon(), notification.Position.alt(), notification.Heading); if (static != nil) { statics["obj_"~notification.UniqueIdentity] = [static, notification.Position.lat(), notification.Position.lon(), notification.Position.alt(), notification.Heading, notification.SecondaryKind]; #static is a PropertyNode inside /models } } elsif (notification.SecondaryKind == 1) { - var crater_model = getprop("payload/armament/models") ~ "crater_big.xml"; - var static = geo.put_model(crater_model, notification.Position.lat(), notification.Position.lon(), notification.Position.alt(), notification.Heading); + var static = geo.put_model(crater_model1, notification.Position.lat(), notification.Position.lon(), notification.Position.alt(), notification.Heading); if (static != nil) { statics["obj_"~notification.UniqueIdentity] = [static, notification.Position.lat(), notification.Position.lon(), notification.Position.alt(), notification.Heading, notification.SecondaryKind]; } } elsif (notification.SecondaryKind == 2) { - var crater_model = getprop("payload/armament/models") ~ "bomb_hit_smoke.xml"; - var static = geo.put_model(crater_model, notification.Position.lat(), notification.Position.lon(), notification.Position.alt(), notification.Heading); + var static = geo.put_model(crater_model2, notification.Position.lat(), notification.Position.lon(), notification.Position.alt(), notification.Heading); if (static != nil) { statics["obj_"~notification.UniqueIdentity] = [static, notification.Position.lat(), notification.Position.lon(), notification.Position.alt(), notification.Heading, notification.SecondaryKind]; } @@ -863,6 +880,7 @@ var flare_update_time = 0.4; var flare_duration = 8; var flare_terminal_speed = 50;#m/s var flares_max_process_per_loop = 4; +var flare_sequencer = -120; var flare_sorter = func(a, b) { if(a[0] < b[0]){ @@ -945,7 +963,9 @@ var flare_released = func { getprop("orientation/heading-deg"), FT2M*getprop("velocities/speed-down-fps"), FT2M*math.sqrt(getprop("velocities/speed-north-fps")*getprop("velocities/speed-north-fps")+getprop("velocities/speed-east-fps")*getprop("velocities/speed-east-fps")), - int(rand()*240)-120]; + flare_sequencer]; + flare_sequencer += 1; + if (flare_sequencer > 120) flare_sequencer = -120; append(flare_list, flare); var msg = notifications.ObjectInFlightNotification.new("ffly", flare[6], MOVE, 21+95); msg.Flags = 0; @@ -1233,7 +1253,7 @@ var processCallsigns = func () { var painted = 0; var paint_list = []; foreach (var player; players) { - if(player.getChild("valid") != nil and player.getChild("valid").getValue() == TRUE and player.getChild("callsign") != nil and player.getChild("callsign").getValue() != "" and player.getChild("callsign").getValue() != nil) { + if(player.getChild("valid") != nil and player.getChild("valid").getValue() == 1 and player.getChild("callsign") != nil and player.getChild("callsign").getValue() != "" and player.getChild("callsign").getValue() != nil) { var callsign = player.getChild("callsign").getValue(); callsign_struct[callsign] = player; var str6 = player.getNode("sim/multiplay/generic/string[6]"); @@ -1247,6 +1267,7 @@ var processCallsigns = func () { } if (getprop("sim/time/elapsed-sec")-MAW_elapsed > 1.1) { setprop("payload/armament/MAW-active", 0);# resets every 1.1 seconds without warning + setprop("payload/armament/MAW-semiactive", 0); } # spike handling: @@ -1293,16 +1314,16 @@ processCallsignsTimer.start(); var code_ct = func () { #ANTIC if (getprop("payload/armament/msg")) { - setprop("sim/rendering/redout/enabled", TRUE); + setprop("sim/rendering/redout/enabled", 1); #call(func{fgcommand('dialog-close', multiplayer.dialog.dialog.prop())},nil,var err= []);# props.Node.new({"dialog-name": "location-in-air"})); - call(func{multiplayer.dialog.del();},nil,var err= []); + if (!m28_auto) call(func{multiplayer.dialog.del();},nil,var err= []); if (!getprop("gear/gear[0]/wow")) { call(func{fgcommand('dialog-close', props.Node.new({"dialog-name": "WeightAndFuel"}))},nil,var err2 = []); call(func{fgcommand('dialog-close', props.Node.new({"dialog-name": "system-failures"}))},nil,var err2 = []); call(func{fgcommand('dialog-close', props.Node.new({"dialog-name": "instrument-failures"}))},nil,var err2 = []); } setprop("sim/freeze/fuel",0); - setprop("/sim/speed-up", 1); + if (!m28_auto) setprop("/sim/speed-up", 1); setprop("/gui/map/draw-traffic", 0); setprop("/sim/marker-pins/traffic", 0); setprop("/sim/gui/dialogs/map-canvas/draw-TFC", 0); @@ -1317,7 +1338,7 @@ code_ctTimer.simulatedTime = 1; -setprop("/sim/failure-manager/display-on-screen", FALSE); +setprop("/sim/failure-manager/display-on-screen", 0); code_ctTimer.start(); @@ -1337,6 +1358,22 @@ var re_init = func (node) { } stopLaunch(); damageLog.push("Aircraft was repaired due to re-init."); + + # Remove all 3D craters and re-place them. Due to re-init can remove some of them. + + foreach (var thekey ; keys(statics)) { + var sta = statics[thekey]; + if (sta[0] != nil) { + sta[0].remove(); + if (sta[5] == 0) {# TODO: make a hash with all the models + sta[0] = geo.put_model(crater_model0, sta[1], sta[2], sta[3], sta[4]); + } elsif (sta[5] == 1) { + sta[0] = geo.put_model(crater_model1, sta[1], sta[2], sta[3], sta[4]); + } elsif (sta[5] == 2) { + sta[0] = geo.put_model(crater_model2, sta[1], sta[2], sta[3], sta[4]); + } + } + } } #================================================================== @@ -1405,6 +1442,7 @@ setlistener("sim/signals/exit", writeDamageLog, 0, 0); #screen.property_display.add("payload/armament/MAW-bearing"); #screen.property_display.add("payload/armament/MAW-active"); +#screen.property_display.add("payload/armament/MAW-semiactive"); #screen.property_display.add("payload/armament/MLW-bearing"); #screen.property_display.add("payload/armament/MLW-count"); #screen.property_display.add("payload/armament/MLW-launcher"); @@ -1412,6 +1450,8 @@ setlistener("sim/signals/exit", writeDamageLog, 0, 0); #screen.property_display.add("payload/armament/spike-air"); #screen.property_display.add("payload/armament/spike-gnd-20"); #screen.property_display.add("payload/armament/spike-gnd-02"); +#screen.property_display.add("payload/armament/spike-gnd-05"); +#screen.property_display.add("payload/armament/spike-gnd-06"); #screen.property_display.add("payload/armament/spike-gnd-11"); #screen.property_display.add("payload/armament/spike-gnd-23"); #screen.property_display.add("payload/armament/spike-gnd-p2"); diff --git a/BUK-M2/Nasal/datalink.nas b/BUK-M2/Nasal/datalink.nas new file mode 100644 index 0000000..7b88482 --- /dev/null +++ b/BUK-M2/Nasal/datalink.nas @@ -0,0 +1,681 @@ +#### Datalink + +# Copyright 2020-2021 Colin Geniet. +# Licensed under the GNU General Public License 2.0 or any later version. + + +#### Usage + +### Generalities +# +# The datalink protocol consists of a core protocol which implements a notion +# of datalink channel, and extensions which allow transmitting actual data. + +### Core protocol usage: +# +# Define the following properties (must be defined at nasal loading time). +# * Mandatory +# /instrumentation/datalink/power_prop path to property indicating if datalink is on +# /instrumentation/datalink/channel_prop path to property containing datalink channel +# (the channel property can contain anything, and is transmitted/compared as a string). +# * Optional +# /instrumentation/datalink/receive_period = 1 receiving loop update rate +# +# Optional: Re-define the function +# datalink.can_transmit(callsign, mp_prop, mp_index) +# +# This function should return 'true' when the given aircraft is able to transmit over datalink to us. +# For instance, it can be used to check line of sight and maximum range. +# The default implementation always returns true (always able to transmit). +# Arguments are callsign, property node /ai/models/multiplayer[i], index of the former node. +# +# +# API: +# - get_data(callsign) +# Returns all datalink information about 'callsign' as an object, or nil if there is none. +# This object must not be modified. +# It contains the following methods: +# callsign(): The aircraft callsign (same as the argument of get_data()). +# index(): The aircraft index in /ai/models/multiplayer[i]. +# on_link(): Returns a bool indicating whether 'callsign' is connected to this aircraft through datalink. +# +# Extensions can define other methods in this object. +# +# - get_connected_callsigns() / get_connected_indices() +# Returns a vector containing all callsigns, resp. indices +# in /ai/models/multiplayer[i], of aircrafts connected on datalink. +# Both vectors use the same order, i.e. get_connected_callsigns()[i] +# and get_connected_indices()[i] correspond to the same aircraft. +# Furthermore this order is stable (the relative order of two aircrafts +# does not change as long as neither disconnects from multiplayer). +# +# - get_all_callsigns() +# Returns a vector containing all callsigns of aircraft with any associated data. +# There is no guarantee on the order of callsigns. +# +# - send_data(data, timeout=nil) +# Send data on the datalink. 'data' is a hash of the form +# { +# : , +# ... +# } +# If 'timeout' is set, clear_data() will be called after this delay. +# Data sent with send_data() is deleted at the next call of send_data(), or by clear_data(). +# +# - clear_data() +# Clear data transmitted by this aircraft. +# +# Important note: +# After a send_data(), and until the next send_data() or clear_data(), +# the datalink behaves as if you are continuously sending the same data. +# Thus, it is important to +# 1. either call send_data() regularly +# 2. or set the timeout argument of send_data() + +### Extensions + +### Aircraft contacts (extension name: "contacts") +# +# This extension allows to simulate an aircraft transmitting information about +# another aircraft (typically one tracked on radar). The position data is not +# actually transmitted (since everyone can access it from simulator internals). +# +## Receiving data +# This extension adds the following methods to the result of get_data("A"): +# tracked(): A bool indicating that some aircraft "B" connected on datalink +# is transmitting information about aircraft "A". +# iff(): One of IFF_UNKNOWN, IFF_HOSTILE, IFF_FRIENDLY, or nil if tracked() is false. +# Indicates the result of IFF interrogation of "A" by "B" +# IFF_UNKNOWN means that e.g. no IFF interrogation was performed. +# tracked_by(): The callsign of the transmitting aircraft ("A"), or nil if tracked() is false. +# tracked_by_index(): The index of the transmitting aircraft, or nil if tracked() is false. +# The index refers to property nodes /ai/models/multiplayer[i]. +# is_known(): Equivalent to (on_link() or tracked()). +# Indicates if the position of this aircraft is supposed to be known +# (i.e. whether or not it should be displayed on a HSD or whatever). +# is_friendly(): Equivalent to (on_link() or iff() == IFF_FRIENDLY). +# is_hostile(): Equivalent to (!on_link() and iff() == IFF_HOSTILE). +# +## Sending data +# usage: send_data({ contacts: , ...}, ...) +# where is a vector of hashes of the form { callsign: , [iff: ,] }. +# is the multiplayer callsign of the tracked aircraft. +# (optional) is one of IFF_UNKNOWN, IFF_HOSTILE, IFF_FRIENDLY + +### Datalink identifier (extension name: "identifier") +# +# This extension allows each aircraft on datalink to transmit a personal +# identifier, e.g. the number of the aircraft in a flight. +# +## Receiving data +# This extension adds the method identifier() to the result of get_data(), +# which returns the identifier, or nil if there is none). +# +## Sending data +# Set the identifier with send_data({"identifier": , ...}); +# The identifier must be a string. It must not contain '!'. + +### Coordinate transmission (extension name: "point") +# +# This extension allows each aircraft to broadcast a coordinate (geo.Coord object). +# +## Receiving data +# This extension adds the method point() to the result of get_data(), +# which results the transmitted geo.Coord object, or nil if there is none. +# +## Sending data +# Transmit a geo.Coord object with send_data({"point": , ...}); + + +#### Protocol: +# +# Data is transmitted on MP generic string[7], with the following format: +# (!)+ +# +# is a hash of the datalink channel. See hash_channel() and check_channel_hash(). +# Each block corresponds to data sent by an extension. +# It starts with a prefix uniquely defining the extension. +# The rest of the block can contain any character (including non-ascii) except '!'. +# +# Remark: '!' as separator is specifically chosen to allow encoding with emesary.Transfer. +# +# The current extension prefixes are the following: +# contacts: C +# identifier: I +# point: P + +#### Extensions API +# +# Creating a new extension is done with +# register_extension(name, prefix, object, encode, decode) +# name the extension name, used as key in the 'data' argument of send_data(). +# prefix the protocol prefix. +# class contact class parent. +# A class from which all contact objects will inherit. +# It must have an init() method, which is called whenever a contact is created. +# +# encode(data) extension encoding function. +# Must return the encoding of the extension data (i.e. when calling +# send_data({name: })) into a string, which may use any character except '!'. +# The extension prefix must not be part of the encoded string. +# +# decode(aircrafts_data, callsign, index, string) extension decoding function. +# 'aircrafts_data' is a hash from callsigns to contact objects (see below). +# 'callsign' is the callsign of the aircraft which transmitted this data. +# 'index' is the index of the aircraft which transmitted this data. +# 'string' is the data encoded by encode() and transmitted through datalink. + +# Each contact in 'data' inherits from the core 'Contact' class, and the extension 'class'. +# decode() is expected to modify 'aircrafts_data', by possibly editing +# existing contacts and adding new ones. It should be careful when +# overwriting existing data in these contacts, including its own: decode() +# will be called several time on the same 'aircrafts_data' (once for each +# transmitting aircraft). +# The modified 'aircrafts_data' hash must be returned. +# +# decode() may use the following helper functions: +# add_if_missing(aircrafts_data, callsign): +# Create a new contact object for 'callsign' and add it to 'aircrafts_data', +# unless an entry for 'callsign' already exists. Returns the modified hash. + + + +#### Version and changelog +# current: v1.1.0, minimum compatible: v1.0.0 +# +## v1.1.0: +# Allow external transmission restrictions +# Make transmitting contact IFF optional +# Ensure personal identifier has no '!' +# '\n' is redundant for printf() +# Fix separator character in documentation +# Fix error when sending unknown extension +# +## v1.0.1: +# Add is_known(), is_friendly(), is_hostile() helpers to extension "contacts". +# +## v1.0.0: Initial version +# - Core protocol for datalink channel. +# - Extensions "contacts", "identifier", and "point". + + + +### Parameters +# +# Remark: most parameters need to be the same on all aircrafts. + +# Index of multiplayer string used to transmit datalink info. +# Must be the same for all aircrafts. +var mp_string = 7; +var mp_path = "sim/multiplay/generic/string["~mp_string~"]"; + +var channel_hash_period = 600; + +var receive_period = getprop("/instrumentation/datalink/receive_period") or 1; + +# Should be overwitten to add transmission restrictions. +var can_transmit = func(contact, mp_prop, mp_index) { + return 1; +} + +### Properties + +var input = { + power: getprop("/instrumentation/datalink/power_prop"), + channel: getprop("/instrumentation/datalink/channel_prop"), + ident: getprop("/instrumentation/datalink/identifier_prop"), + mp: mp_path, + models: "/ai/models", + callsign: "/sim/multiplay/callsign", +}; + +foreach (var name; keys(input)) { + if (input[name] != nil) { + input[name] = props.globals.getNode(input[name], 1); + } +} + + + +#### Core protocol implementation + +### Channel hash (based on iff.nas) +# +# Channel is hashed with current time (rounded to 10min) and own callsign. + +var clean_callsign = func(callsign) { + return damage.processCallsign(callsign); +} + +var my_callsign = func { + return clean_callsign(input.callsign.getValue()); +} + +# Time, rounded to 'channel_hash_period'. This is used to hash channel. +var get_time = func { + return int(math.floor(systime() / channel_hash_period) * channel_hash_period); +} + +# Previous / next time (with channel_hash_period interval). +# This is used to give a bit of margin on the time check. +# (will work if system clocks are coordinated within 10min). +var get_prev_time = func { return get_time() - channel_hash_period; } +var get_next_time = func { return get_time() + channel_hash_period; } + +var parse_hexadecimal = func(str) { + var res = 0; + for (var i=0; i= 48 and c < 58) { + # digit + res += c - 48; + } elsif (c >= 65 and c < 71) { + # upper case letter + res += c - 55; + } elsif (c >= 97 and c < 103) { + # lower case letter + res += c - 87; + } + } + return res; +} + +var _hash_channel = func(time, callsign, channel) { + # 5 hex digits (2^20) fit in 3 chars for emesary int encoding. + var hash = parse_hexadecimal(left(md5(time ~ callsign ~ channel), 5)); + return emesary.TransferInt.encode(hash, 3); +} + +# Hash channel (when sending). +var encode_channel = func(channel) { + return _hash_channel(get_time(), my_callsign(), channel); +} + +# Check that the hash transmitted by aircraft 'callsign' is correct for 'channel'. +var check_channel = func(hash, callsign, channel) { + return hash == _hash_channel(get_time(), callsign, channel) + or hash == _hash_channel(get_prev_time(), callsign, channel) + or hash == _hash_channel(get_next_time(), callsign, channel); +} + +### Contact object +var Contact = { + new: func(callsign) { + var c = { + # contact_parents is the list of all classes from which contacts inherit (for extensions). + parents: contact_parents, + _callsign: callsign, + }; + # Initialize all inherited classes. + foreach (var class; contact_parents) { + call(class.init, [], c, nil, nil); + } + return c; + }, + init: func { me._on_link = 0; }, + + callsign: func { return me._callsign; }, + index: func { return callsign_to_index[me._callsign]; }, + on_link: func { return me._on_link; }, + set_on_link: func(b) { me._on_link = b; }, +}; + +### Extensions +var extensions = {}; +var extension_prefixes = {}; +var max_prefix_length = 0; +var contact_parents = [Contact]; + +var register_extension = func(name, prefix, class, encode, decode) { + if (contains(extensions, name)) { + printf("Datalink: double registration of extension '%s'. Skipping.", name); + return -1; + } + if (contains(extension_prefixes, prefix)) { + printf("Datalink: double registration of extension prefix '%s'. Skipping.", name); + return -1; + } + extensions[name] = { prefix: prefix, encode: encode, decode: decode, }; + extension_prefixes[prefix] = name; + max_prefix_length = math.max(max_prefix_length, size(prefix)); + append(contact_parents, class); + + return 0; +} + + +var data_separator = "!"; + + +### Transmission + +var clear_data = func { + send_data({}); +} + +var clear_timer = maketimer(1, clear_data); +clear_timer.singleShot = 1; + +# Send data through datalink. +# +# timeout: if set, sent data will be cleared after this time (other aircrafts +# won't receive it anymore). Useful if 'send_data' is not called often. +var send_data = func(data, timeout=nil) { + if (!input.power.getBoolValue()) { + last_data = {}; + input.mp.setValue(""); + return; + } + + # First encode channel + var str = encode_channel(input.channel.getValue()); + + # Then all extensions + last_data = data; + foreach(var ext; keys(data)) { + # Skip missing extensions with a warning + if (!contains(extensions, ext)) { + printf("Warning: unknown datalink extension %s in send_data().", ext); + continue; + } + str = str ~ data_separator ~ extensions[ext].prefix ~ extensions[ext].encode(data[ext]); + } + + input.mp.setValue(str); + + if (timeout != nil) { + clear_timer.restart(timeout); + } +} + +# Used internally to update the channel/identifier while keeping the same data. +# Does not touch timeout. +var last_data = {}; +var resend_data = func { + send_data(last_data); +} + +# Very slow timer to ensure the channel hash is updated regularly. +# Only relevant if you never call send_data(); +var hash_update_timer = maketimer(channel_hash_period/2, resend_data); +hash_update_timer.start(); + + +### Receiving + +# callsign to data hash +var aircrafts_data = {}; +# List of callsigns / indices connected on datalink (index is for /ai/models/multiplayer[i]). +var connected_callsigns = []; +var connected_indices = []; + +# Maintain callsign to multiplayer index hash +# (doesn't cost much since we already iterate over MP models). +var callsign_to_index = {}; + + +var get_data = func(callsign) { + return aircrafts_data[callsign]; +} + +var get_connected_callsigns = func { + return connected_callsigns; +} + +var get_connected_indices = func { + return connected_indices; +} + +var get_all_callsigns = func { + return keys(aircrafts_data); +} + +# Helper for modifying aircrafts_data. +var add_if_missing = func(aircrafts_data, callsign) { + if (!contains(aircrafts_data, callsign)) { + aircrafts_data[callsign] = Contact.new(callsign); + } + return aircrafts_data; +} + +var receive_loop = func { + var my_channel = input.channel.getValue(); + + aircrafts_data = {}; + connected_callsigns = []; + connected_indices = []; + + var mp_models = input.models.getChildren("multiplayer"); + foreach(var mp; mp_models) { + var idx = mp.getIndex(); + if (!mp.getValue("valid")) continue; + var callsign = mp.getValue("callsign"); + if (callsign == nil) continue; + + callsign_to_index[callsign] = idx; + + var data = mp.getValue(mp_path); + if (data == nil) continue; + + # Split channel part and data part + var tokens = split(data_separator, data); + + # Check channel + if (!check_channel(tokens[0], callsign, my_channel)) continue; + + # We check this _after_ the channel. Checking the channel is quite cheap, + # and we don't know how slow this function is, it might have a get_cart_ground_intersection() + if (!can_transmit(callsign, mp, idx)) continue; + + # Add to list of connected aircrafts. + append(connected_callsigns, callsign); + append(connected_indices, idx); + # Add to data + aircrafts_data = add_if_missing(aircrafts_data, callsign); + aircrafts_data[callsign].set_on_link(1); + + # Parse extensions data + for (var i=1; i size(tokens)) break; + var prefix = left(tokens[i], len); + if (contains(extension_prefixes, prefix)) { + extension = extension_prefixes[prefix]; + break; + } + } + # Unknown extension, skip + if (extension == nil) continue; + # Remove prefix + var data = substr(tokens[i], len); + # Decode + aircrafts_data = extensions[extension].decode(aircrafts_data, callsign, data); + } + } +} + +var receive_timer = maketimer(receive_period, receive_loop); + + +# Start / stop listener +setlistener(input.power, func (node) { + if (node.getBoolValue()) { + receive_timer.start(); + resend_data(); # Sets channel/identifier + } else { + receive_timer.stop(); + aircrafts_data = {}; + clear_data(); + } +}, 1, 0); + +# Listener to resend data so as to update the channel. +setlistener(input.channel, resend_data); + + + +#### Extensions + +## Identifier + +var ContactIdentifier = { + init: func { + me._identifier = nil; + }, + set_identifier: func(ident) { + me._identifier = ident; + }, + identifier: func { + return me._identifier; + }, +}; + +var encode_identifier = func(ident) { + # Force string conversion + ident = ""~ident; + + if (find("!", ident) >= 0) { + printf("Datalink: Identifier is not allowed to contain '!': %s.", ident); + return ""; + } else { + return ident; + } +} + +var decode_identifier = func(aircrafts_data, callsign, str) { + aircrafts_data = add_if_missing(aircrafts_data, callsign); + aircrafts_data[callsign].set_identifier(str); + return aircrafts_data; +} + +register_extension("identifier", "I", ContactIdentifier, encode_identifier, decode_identifier); + + + +## Contacts + +# IFF status transmitted over datalink. +var IFF_UNKNOWN = 0; # Unknown status +var IFF_HOSTILE = 1; # Considered hostile (no response to IFF). +var IFF_FRIENDLY = 2; # Friendly, because positive IFF identification. +# This is also the priority order for IFF reports in case of conflicts: +# e.g. a contact will be reported as friendly if anyone on datalink reports it as friendly. + +var ContactTracked = { + init: func { + me._tracked_by = nil; + me._iff = IFF_UNKNOWN; + }, + set_tracked_by: func(callsign) { + me._tracked_by = callsign; + }, + set_iff: func(iff) { + # Priority order on IFF values (friendly, then hostile, then no data). + me._iff = math.max(me._iff, iff); + }, + tracked: func { + return me._tracked_by != nil; + }, + tracked_by: func { + return me._tracked_by; + }, + tracked_by_index: func { + return (me._tracked_by != nil) ? callsign_to_index[me._tracked_by] : nil; + }, + iff: func { + return me._iff; + }, + is_known: func { + return me.on_link() or me.tracked(); + }, + is_friendly: func { + return me.on_link() or me.iff() == IFF_FRIENDLY; + }, + is_hostile: func { + return !me.on_link() and me.iff() == IFF_HOSTILE; + }, +}; + +# Contact encoding: callsign + bits +# callsign: the callsign encoded with emesary.TransferString +# bits: bitfield |xxxxxxff| (left is most significant) +# f: IFF, x: unused +# encoded with emesary.TransferByte +# Additional values may be appended for extensions. + +var encode_contact = func(contact) { + # Encode bitfield + var bits = contact["iff"] != nil ? contact.iff : IFF_UNKNOWN; + + return emesary.TransferString.encode(clean_callsign(contact.callsign)) + ~ emesary.TransferByte.encode(bits); +} + +var decode_contact = func(str) { + var res = {}; + var dv = emesary.TransferString.decode(str, 0); + res.callsign = dv.value; + dv = emesary.TransferByte.decode(str, dv.pos); + var bits = dv.value; + res.iff = math.mod(bits, 4); + return res; +} + +# Special character, won't be used by emesary encoding. +var contacts_separator = "#"; + +var encode_contacts = func(contacts) { + var str = ""; + foreach (var contact; contacts) { + str = str~encode_contact(contact)~contacts_separator; + } + return str; +} + +var decode_contacts = func(aircrafts_data, callsign, str) { + var contacts = split(contacts_separator, str); + foreach (var contact; contacts) { + if (contact == "") continue; + var res = decode_contact(contact); + aircrafts_data = add_if_missing(aircrafts_data, res.callsign); + aircrafts_data[res.callsign].set_iff(res.iff); + aircrafts_data[res.callsign].set_tracked_by(callsign); + } + return aircrafts_data; +} + +register_extension("contacts", "C", ContactTracked, encode_contacts, decode_contacts); + + + +## Coordinate + +var ContactPoint = { + init: func { + me._point = nil; + }, + set_point: func(point) { + me._point = point; + }, + point: func { + return me._point; + }, +}; + +var encode_point = func(coord) { + return emesary.TransferCoord.encode(coord); +} + +var decode_point = func(aircrafts_data, callsign, str) { + var coord = emesary.TransferCoord.decode(str, 0).value; + aircrafts_data = add_if_missing(aircrafts_data, callsign); + aircrafts_data[callsign].set_point(coord); + return aircrafts_data; +} + +register_extension("point", "P", ContactPoint, encode_point, decode_point); \ No newline at end of file diff --git a/BUK-M2/Nasal/fdm.nas b/BUK-M2/Nasal/fdm.nas index 1882ac3..71abce2 100644 --- a/BUK-M2/Nasal/fdm.nas +++ b/BUK-M2/Nasal/fdm.nas @@ -13,8 +13,10 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -#io.include("Aircraft/ExpansionPack/Nasal/init.nas"); srand();# seed the random generator with systime + +#io.include("Aircraft/ExpansionPack/Nasal/init.nas"); + #with("updateloop"); # Number of iterations per second diff --git a/BUK-M2/Nasal/fire-control-custom.nas b/BUK-M2/Nasal/fire-control-custom.nas new file mode 100644 index 0000000..9151804 --- /dev/null +++ b/BUK-M2/Nasal/fire-control-custom.nas @@ -0,0 +1,62 @@ + +################### SAM INFO + +var setupTime = 300;#minimum 'launcher_tilt_time' secs no matter what, due to anim and stuff. +var reload_time = 900; +var launcher_final_tilt_deg = 24; +var launcher_start_tilt_deg = 24; +var launcher_tilt_time = 0; +var sam_align_to_target = 1; +var launcher_align_to_target = 0; +var align_speed_dps = 20; +var radar_elevation_above_terrain_m = 3; +var radar_lowest_pitch = 0.5;# 0.5 degs = roughly 925 feet at 20 nm, 25 feet at half a nm. # 0.35 = roughly 925 feet at 20 nm, 25 feet at half a nm. +var radar_off_time_min = 30;# When turning off to lure enemies into engagement zone, and to not make the SAM too easy to find, minimum turn off this duration. +var radar_off_time_max = 90;# Bigger missile_max_distance give crew incentive to keep this a bit longer +var radar_on_time = 45;# Minimum the time it would take to scan whole sky +var radar_on_after_detect_time = 180;# Crew is alert after spotting an aircraft, how long should they stay that way? +var can_detect_anti_rad = 0.35;# 0.5 very good, 0 not at all. + +#reaction tme for s-300p is 28 secs acording to http://www.astronautix.com/s/s-300p.html +# sounds a bit high, as its 4 secs for s-400 + +################### CIWS INFO + +var ciws_installed = 0; +var ciws_domain_nm = 1.50; #range where it can kill +var ciws_chance = 0.20; #chance to get a kill at 0nm distance +var ciws_burst_rounds = 60;#how many rounds in a burst +var ciws_shell = 15;#from lookup table in damage.nas +var ROUNDS_init = 30; +var ROUNDS = ROUNDS_init;#CIWS bursts remaining + +################### MISSILE INFO + +var NUM_MISSILES = 3; # total carried minus 1 +var missile_name = "M317"; +var missile_brevity = damage.id2warhead[getprop("payload/armament/"~string.lc(missile_name)~"/type-id")][4]; +var missile_max_distance = getprop("payload/armament/"~string.lc(missile_name)~"/max-fire-range-nm"); #max distance of target in nm when it will fire +var missile_min_distance = getprop("payload/armament/"~string.lc(missile_name)~"/min-fire-range-nm"); #minimum distance in nm when it will fire +var lockon_time = 12; #time in seconds it takes to lock on and get a firing solution on a target +var fire_minimum_interval = 7;# time since last track was initiated till a new can be initiated +var same_target_max_missiles = 1;# max number of missiles in air against same target + +var isInEngagementEnvelope = func (target_radial_airspeed, target_ground_distance, target_relative_altitude) { + # is the plane within the engagement envelope? + # the numbers after target_radial_airspeed are ( offset_of_engagement_envelope / speed_to_apply_that_offset ) + # larger offset means it wont fire until the plane is closer. + # for visualization: https://www.desmos.com/calculator/gw570fa9km + var vren = nil; + if ( target_radial_airspeed < 0 ) { + vren = 1 + target_radial_airspeed * ( 0.4 / 750 ); + } else { + vren = 1 + target_radial_airspeed * ( -0.25 / 750 ); + } + target_ground_distance = target_ground_distance * M2NM; + var engagement_altitude = ((1 + vren) * (-.008 * math.pow(target_ground_distance,2)) + 0.5 * target_ground_distance + 5) * 6076.12; + return target_relative_altitude <= engagement_altitude; +} + +var midflight = nil; + + diff --git a/BUK-M2/Nasal/fire-control.nas b/BUK-M2/Nasal/fire-control.nas new file mode 100644 index 0000000..f6e6674 --- /dev/null +++ b/BUK-M2/Nasal/fire-control.nas @@ -0,0 +1,646 @@ +################### GLOBALS + +var AIR = 0; +var MARINE = 1; +var SURFACE = 2; +var ORDNANCE = 3; + +var radar_update_time = 2; +var launch_update_time = 0.3; +var reloading = 0; +var missile_delay_time = 0;#time when last track was initiated +var missile_release_time = 0;#time when last missile was fired +var ciws_delay_time = 0;#time when CIWS was last fired +var launch_in_progress = 0;# if a firing solution is currently being calculated +var reload_starting = 0; +var ACTIVE_MISSILE = 0; +var semi_active_track = nil;# with multiple missiles flying in semi-active-radar mode, this can change rather fast. Which means pilots wont get a steady tone, but disrupted tones. (tradeoff) +var mutexLock = thread.newlock(); +var radarStatus = 0;# Current radar status. +var radarOnTimestamp = -500;# Last timestamp of when the radar was online +var radarOffTimestamp = -500;# Last timestamp of when the radar was offline +var radarOffDuration = radar_off_time_min; +var radarTrackTime = 0;# Last time stamp where any enemy aircraft has been spotted. + +########################################################################## +######################## Common SAM code ########################### +########################################################################## + +################### VARIOUS + +setprop("sim/multiplay/generic/float[7]", 0);# tracking radar vert rotation +setprop("sim/multiplay/generic/float[8]", 0);# tracking radar horiz rotation +setprop("sim/multiplay/generic/float[5]", 0);# launcher vert rotation +setprop("sim/multiplay/generic/float[6]", 0);# launcher horiz rotation +var start_time = systime(); + +var opfor_switch = "enemies/opfor-switch"; +setprop(opfor_switch,0); +var friend_switch = "enemies/friend-switch"; +setprop(friend_switch,0); + +################### IFF + +var target = { + new: func (callsign) { + var m = { parents: [target] }; + m.callsign = callsign; + m.in_air = 0; + m.tracking = 0; + m.missiles = []; + return m; + }, +}; + +var base = props.globals.getNode("/"); +base.getNode("instrumentation/transponder/id-code",1).setIntValue(-9999); +base.getNode("instrumentation/transponder/transmitted-id",1).setIntValue(-9999);# transponder off + +################################################################### + +var targetsV2 = nil; + +var buildTargetList = func { + # rather crappy code, but is not ran so often, so dont really matter. + if (getprop(opfor_switch) == 0 and getprop(friend_switch) == 0) { + for(var i = 1; i<=12;i+=1) { + # add new callsign to list + var sign = getprop("enemies/e"~i); + var tgt = lookup(sign); + if (tgt == nil) { + targetsV2.append(target.new(sign)); + print("added callsign: "~sign); + } + } + } + var removeList = []; + foreach(tgt ; targetsV2.vector) { + # schedule removed callsigns to be removed + if (getprop(opfor_switch) == 0 and getprop(friend_switch) == 0) { + if (tgt.callsign != getprop("enemies/e1") and tgt.callsign != getprop("enemies/e2") and tgt.callsign != getprop("enemies/e3") and tgt.callsign != getprop("enemies/e4") and tgt.callsign != getprop("enemies/e5") and tgt.callsign != getprop("enemies/e6") and tgt.callsign != getprop("enemies/e7") and tgt.callsign != getprop("enemies/e8") and tgt.callsign != getprop("enemies/e9") and tgt.callsign != getprop("enemies/e10") and tgt.callsign != getprop("enemies/e11") and tgt.callsign != getprop("enemies/e12")) { + append(removeList, tgt); + print("will remove callsign: "~tgt.callsign); + } + } + } + foreach(tgt ; removeList) { + # remove callsigns + call(func {targetsV2.remove(tgt);}, nil, var err = []); + } +}; + +var lookup = func (sign) { + + foreach (tgt ; targetsV2.vector) { + if (tgt.callsign == sign) { + return tgt; + } + } + if ( getprop(opfor_switch) == 1 and (left(sign, 5) != "OPFOR" and left(sign,5) != "opfor")) { + print("creating new target in: " ~ sign); + tgt = target.new(sign); + targetsV2.append(tgt); + return tgt; + } + if ( getprop(friend_switch) == 1 and ( left(sign, 5) == "OPFOR" or left(sign,5) == "opfor" )) { + print("creating new target in: " ~ sign); + tgt = target.new(sign); + targetsV2.append(tgt); + return tgt; + } + return nil; +} + + +var PRIO_NORM = 0; +var PRIO_HIGH = 1; +var PRIO_LOW = 2; +var PRIO_FAST = 3; +var PRIO_SLOW = 4; +var PRIO_CLOSE = 5; +var PRIO_FAR = 6; + + +################### MAIN LOOP + +var scan = func() { + setprop("sim/multiplay/visibility-range-nm", 250); + buildTargetList(); + + if ( getprop("/carrier/sunk") == 1 or getprop("/carrier/disabled") == 1) { + setprop("sim/multiplay/generic/string[6]", ""); + datalink.clear_data(); + return; + } + + if (isSetup() ) { + printf("Seconds till activation: %.1f", setupTime - (systime() - start_time)); + setprop("sam/timeleft", setupTime - (systime() - start_time)); + setprop("sam/missiles",(NUM_MISSILES+1-ACTIVE_MISSILE)); + setprop("sam/bursts", ROUNDS); + setprop("sam/info", "Preparing launch system"); + settimer(scan,radar_update_time); + if (launcher_tilt_time > 0) { + setprop("sim/multiplay/generic/float[5]", launcher_final_tilt_deg*math.max(0,(systime() - start_time)-(setupTime-launcher_tilt_time))/launcher_tilt_time);#raise the tubes in last 15 secs of activation + } else { + setprop("sim/multiplay/generic/float[5]", launcher_final_tilt_deg); + } + setprop("sim/multiplay/generic/float[6]", 0); + setprop("sim/multiplay/generic/float[7]", 0); + setprop("sim/multiplay/generic/float[8]", 0); + setprop("sim/multiplay/generic/string[6]", ""); + setprop("/sim/multiplay/generic/int[2]", 1); + datalink.clear_data(); + return; + } + setprop("sim/multiplay/generic/float[5]", launcher_final_tilt_deg); + #### ITERATE THROUGH MP LIST #### + if (radarStatus == 1) { + var my_pos = geo.aircraft_position(); + var radarAlt = my_pos.alt()+radar_elevation_above_terrain_m; + my_pos.set_alt(radarAlt); + var mvec = props.globals.getNode("/ai/models").getChildren("multiplayer"); + var tvec = props.globals.getNode("/ai/models").getChildren("tanker"); + var avec = props.globals.getNode("/ai/models").getChildren("aircraft"); + if (mvec!=nil and tvec != nil) { + mvec = mvec ~ tvec; + } + if (mvec!=nil and avec != nil) { + mvec = mvec ~ avec; + } + var prio_vector = [];#0:node,1:trigger,2:prio value + foreach(var mp; mvec){ + if (mp.getNode("valid") == nil or mp.getNode("valid").getValue() != 1) continue; + var prio = fire_control(mp, my_pos); + append(prio_vector, prio); + if (prio[3] == 1) { + radarTrackTime = systime();#this target is within envelope, we turn on radar. + } + } + prio_vector = sort(prio_vector, func (a,b) {if (a[2]>b[2]){return -1;} elsif (a[2] fire_minimum_interval ) ) { # + #### ... FOR THE MISSILE #### + #print("callsign " ~ cs ~ " found at " ~ dist_to_target); + missile_delay_time = systime(); + mp[0].getNode("unique",1).setValue(rand()); + armament.contact = radar_logic.Contact.new(mp[0], AIR); + launch_in_progress = 1; + missile_launch(mp[0], systime(), my_pos); + + } elsif ( ciws_installed and trigger == -1 and ROUNDS > 0 and ( systime() - ciws_delay_time > 1.0 ) and lu != nil) { + #### ... FOR THE CIWS #### + var contact = radar_logic.Contact.new(mp[0], AIR); + var cord = contact.get_Coord(); + var dist_nm = my_pos.direct_distance_to(cord)*M2NM; + var probabilityOfBurstKill = 0.50; + if (mp[0].getNode("velocities/true-airspeed-kt").getValue() > 50) { + probabilityOfBurstKill = extrapolate(dist_nm, 0, ciws_domain_nm, ciws_chance, 0); + } + var hits = math.max(0,int(extrapolate(rand(), 0, probabilityOfBurstKill, ciws_burst_rounds, 3)));#3 is a kill approx + var target_bearing = my_pos.course_to(cord); + setprop("sim/multiplay/generic/float[0]", -(target_bearing-getprop("orientation/heading-deg")));#CIWS horiz (inverted) + setprop("sim/multiplay/generic/float[1]", vector.Math.getPitch(my_pos, cord));#CIWS vert + setprop("sim/multiplay/generic/bool[0]",1);settimer(func {setprop("sim/multiplay/generic/bool[0]",0);}, 1);# for sound + if (hits > 0) { + var msg = notifications.ArmamentNotification.new("mhit", 4, -1*(ciws_shell+1)); + msg.RelativeAltitude = 0; + msg.Bearing = 0; + msg.Distance = hits; + msg.RemoteCallsign = mp[0].getNode("callsign").getValue(); + notifications.hitBridgedTransmitter.NotifyAll(msg); + damage.damageLog.push("CIWS fired | rounds remaining: " ~ ROUNDS ~ " | hit on: " ~ mp[0].getNode("callsign").getValue()); + } + print("CIWS fired | bursts remaining: " ~ ROUNDS ~ " | "~hits~" hits on: " ~ mp[0].getNode("callsign").getValue() ~ " @ "~ sprintf("%.1f",dist_nm) ~" nm"); + ciws_delay_time = systime(); + ROUNDS = ROUNDS - 1; + setprop("sam/bursts", ROUNDS); + if (ROUNDS == 0) { + print("Launcher out of shell ammo."); + settimer(autoreload, reload_time); + reloading = 1; + reload_starting = systime(); + } + } + if (lu != nil and lu.tracking) { + radarTrackTime = systime(); + } + } + } + + if (launcher_align_to_target and ACTIVE_MISSILE > NUM_MISSILES and systime()-missile_release_time > 2) { + # rotate launcher back to forward: + var tgt_dir = 0; + var cur_dir = getprop("sim/multiplay/generic/float[6]"); + var move_dir = geo.normdeg180(tgt_dir-cur_dir); + var max_dir = radar_update_time*align_speed_dps*0.25; + move_dir = math.clamp(move_dir, -max_dir, max_dir); + setprop("sim/multiplay/generic/float[6]", cur_dir+move_dir); + } + if (launch_in_progress == 0) { + if (reloading) { + setprop("sam/info", "Reloading"); + setprop("sam/timeleft", reload_time - (systime() - reload_starting)); + } else { + setprop("sam/info", "Search radar is "~(radarStatus==1?"ON":"OFF")); + setprop("sam/timeleft", 0); + } + clearSingleLock(); + thread.lock(mutexLock); + semi_active_track = nil; + thread.unlock(mutexLock); + } else { + setprop("sam/timeleft", 0); + } + if (getprop(getprop("payload/armament/MP-alt-ft")) == 0.0) { + # reset 'Follow view' to look at launcher + setprop(getprop("payload/armament/MP-lat"),getprop("position/latitude-deg")); + setprop(getprop("payload/armament/MP-lon"),getprop("position/longitude-deg")); + setprop(getprop("payload/armament/MP-alt-ft"),getprop("position/altitude-ft")); + } + setprop("sam/missiles",(NUM_MISSILES+1-ACTIVE_MISSILE)); + settimer(scan,radar_update_time); +} + +var isSetup = func { + return systime() - start_time < setupTime; +} + +var acquisitionRadarLoop = func { + if (isSetup() or reloading or getprop("/carrier/sunk") == 1 or getprop("/carrier/disabled") == 1) return; + var reason = ""; + var time = systime(); + if (time - radarTrackTime < radar_on_after_detect_time) { + radarStatus = 1; + reason = sprintf("Crew alert for %d seconds", radar_on_after_detect_time - (time - radarTrackTime)); + } elsif (radarStatus == 0 and time - radarOnTimestamp > radarOffDuration) { + radarStatus = 1; + reason = sprintf("Periodic check for %d seconds", radar_on_time); + } elsif (radarStatus == 1 and time - radarOffTimestamp > radar_on_time) { + radarStatus = 0; + radarOffDuration = rand()*(radar_off_time_max - radar_off_time_min)+radar_off_time_min; + reason = sprintf("Periodic pause for %d seconds", radarOffDuration); + } + + if (getprop("payload/armament/"~string.lc(missile_name)~"/guidance") == "tvm" and radarStatus == 0) { + foreach(var tgt ; targetsV2.vector) { + if (tgt.in_air > 0) { + radarTrackTime = time; + radarStatus = 1; + break; + } + } + } + setprop("/sim/multiplay/generic/int[2]", radarStatus != 1); + if (radarStatus == 1) radarOnTimestamp = time; + else radarOffTimestamp = time; + #print("Search radar is "~(radarStatus==1?"ON":"OFF")); + if (reason != "") print(reason); +} + +var radTimer = maketimer(0.5, acquisitionRadarLoop); +radTimer.start(); + +var clearSingleLock = func () { + thread.lock(mutexLock); + if (semi_active_track == nil) { + setprop("sim/multiplay/generic/string[6]", ""); + datalink.clear_data(); + } else { + setprop("sim/multiplay/generic/string[6]", left(md5(semi_active_track), 4)); + datalink.send_data({"contacts":[{"callsign":semi_active_track,"iff":0}]}); + } + thread.unlock(mutexLock); +} + +################## FIRE CONTROL +################## ALL AI LOGIC RELATED TO FIGURING OUT IF A TARGET SHOULD BE SHOT AT SHOULD GO HERE. + +var fire_control = func(mp, my_pos) { + # gather some data about the target + + if ( mp.getNode("valid").getValue() == 0 ) { return [mp,0,0,0]; } + + var ufo_pos = geo.Coord.new().set_latlon(mp.getNode("position/latitude-deg").getValue(),mp.getNode("position/longitude-deg").getValue(),(mp.getNode("position/altitude-ft").getValue() * FT2M)); + var target_distance = my_pos.direct_distance_to(ufo_pos); + var target_altitude = mp.getNode("position/altitude-ft").getValue(); + + # is this plane a friend or foe? + var lu = lookup(mp.getNode("callsign").getValue()); + if ( lu == nil ) { return [mp,0,0,0]; } + + var target_airspeed = mp.getNode("velocities/true-airspeed-kt").getValue(); + var target_ground_distance = my_pos.distance_to(ufo_pos); + var target_heading = mp.getNode("orientation/true-heading-deg").getValue(); + var relative_bearing = math.abs(geo.normdeg180(ufo_pos.course_to(my_pos) - target_heading)); + + var target_relative_altitude = target_altitude - my_pos.alt()*M2FT; + var target_radial_airspeed = math.abs(math.abs(((relative_bearing / 90 ) - 1) * target_airspeed));#200kt against us = 200kt, 200kt at angle of us = 0kt, 200kt away from us = 200kt + var target_relative_pitch = vector.Math.getPitch(my_pos, ufo_pos); + + + # can the radar see it? + var data_link_match = 0; +# foreach(var cx; gci.data_receive_callsigns) { +# if (cx[0] == callsign) { +# data_link_match = true; +# #print('tgt confirmed via datalink'); +# } +# } + + var visible = radar_logic.isNotBehindTerrain(mp); + + + if (ciws_installed and ROUNDS > 0 and target_distance*M2NM < ciws_domain_nm) { + #CIWS + var radarSeeTarget = 1; + if ( data_link_match == 0 ) { + if ( visible[0] == 0 ) {radarSeeTarget = 0 } + if ( target_relative_pitch < radar_lowest_pitch ) { radarSeeTarget = 0 } # + if ( target_distance*M2NM > 1.0 and visible[1] and math.abs(target_radial_airspeed) < 20 ) {radarSeeTarget = 0 } # i.e. notching with terrain behind + } + + if (radarSeeTarget and rand() > target_distance*M2NM / ciws_domain_nm) { + var score = 0; + var priority = getprop("priority"); + if (priority==PRIO_NORM) { + score = rand()-0.5; + } elsif (priority==PRIO_HIGH) { + score = target_altitude; + } elsif (priority==PRIO_LOW) { + score = -target_altitude; + } elsif (priority==PRIO_FAST) { + score = target_radial_airspeed; + } elsif (priority==PRIO_SLOW) { + score = -target_radial_airspeed; + } elsif (priority==PRIO_CLOSE) { + score = -target_distance; + } elsif (priority==PRIO_FAR) { + score = target_distance; + } + return [mp,-1,score,1]; + } + } + + if ( data_link_match == 0 ) { + if (target_airspeed < 60) {return [mp,0,0,0];} + if ( visible[0] == 0 ) { return [mp,0,0,0]; } + if ( target_relative_pitch < radar_lowest_pitch ) { return [mp,0,0,0]; } # + if ( visible[1] and math.abs(target_radial_airspeed) < 20 ) { return [mp,0,0,0]; } # i.e. notching, landed aircraft + } + + if ( target_distance * M2NM > missile_max_distance ) { return [mp,0,0,0]; } + if ( target_distance * M2NM < missile_min_distance ) { return [mp,0,0,0]; } + + + + + # is the plane within the engagement envelope? + # the numbers after target_radial_airspeed are ( offset_of_engagement_envelope / speed_to_apply_that_offset ) + # larger offset means it wont fire until the plane is closer. + # for visualization: https://www.desmos.com/calculator/gw570fa9km + + if (!isInEngagementEnvelope(target_radial_airspeed, target_ground_distance, target_relative_altitude) ) { return [mp,0,0,0]; } + + + + var the_dice = rand(); + + if ( the_dice > 0.20 ) { + var score = 0; + var priority = getprop("priority"); + if (priority==PRIO_NORM) { + score = rand()-0.5; + } elsif (priority==PRIO_HIGH) { + score = target_altitude; + } elsif (priority==PRIO_LOW) { + score = -target_altitude; + } elsif (priority==PRIO_FAST) { + score = target_radial_airspeed; + } elsif (priority==PRIO_SLOW) { + score = -target_radial_airspeed; + } elsif (priority==PRIO_CLOSE) { + score = -target_distance; + } elsif (priority==PRIO_FAR) { + score = target_distance; + } + return [mp,1,score,1]; + } else { + return [mp,0,0,1]; + } +} + +################### MISSILE CONTROL + + +### missile reload + +var reload = func(force = 1) { + #figure out how many to add + if (ACTIVE_MISSILE > NUM_MISSILES or force == 1) { + for ( var i = 0; i <= NUM_MISSILES; i = i + 1 ) { + + if (armament.AIM.new(i,missile_name,missile_brevity, midflight) != -1) { + #if statement just in case reload was called before all missiles were fired. Cause avoid calling search() on same missile twice. + armament.AIM.active[i].radarZ = radar_elevation_above_terrain_m; + armament.AIM.active[i].start(); + } + } + ACTIVE_MISSILE = 0;setprop("active", 0); + print("Launcher reloaded with "~(NUM_MISSILES+1)~" missiles."); + setprop("/sim/messages/copilot", "Launcher reloaded with "~(NUM_MISSILES+1)~" missiles."); + } + if (ROUNDS == 0 or force == 1) { + ROUNDS = ROUNDS_init; + print("Reloaded with "~(ROUNDS)~" bursts."); + } + setprop("sam/missiles",(NUM_MISSILES+1-ACTIVE_MISSILE)); + setprop("sam/bursts", ROUNDS); + reloading = 0; +} + +var autoreload = func() { + if ( getprop("/carrier/sunk") == 1 or getprop("/carrier/disabled") == 1) { + return; + } + if (reloading) { + reloading = 0; + if (ACTIVE_MISSILE > NUM_MISSILES or ROUNDS == 0) { + reload(0); + print("Auto reloading completed.") + } + } else { + print("Auto reloading cancelled due to manual reload.") + } +} + +### missile launch + +var missile_launch = func(mp, launchtime, my_pos) { + if ( getprop("/carrier/sunk") == 1 or getprop("/carrier/disabled") == 1) { + var lu = lookup(mp.getNode("callsign").getValue()); + if (lu != nil) { + lu.tracking = 0; + } + launch_in_progress = 0; + clearSingleLock(); + return; + } + var ufo_pos = geo.Coord.new().set_latlon(mp.getNode("position/latitude-deg").getValue(),mp.getNode("position/longitude-deg").getValue(),(mp.getNode("position/altitude-ft").getValue() * 0.3048)); + var target_bearing = my_pos.course_to(ufo_pos); + var target_pitch = vector.Math.getPitch(my_pos, ufo_pos); + var info = mp.getNode("callsign").getValue(); + var lu = lookup(mp.getNode("callsign").getValue()); + if (getprop("sam/timeleft") != 0) { + launch_in_progress = 0; + if (lu != nil) { + lu.tracking = 0; + } + return; + } elsif ( armament.AIM.active[ACTIVE_MISSILE].status == 1 and systime() - launchtime > lockon_time and radar_logic.isNotBehindTerrain(mp)[0] == 1 ) { + var theMissile = armament.AIM.active[ACTIVE_MISSILE]; + var brevity = theMissile.brevity; + #armament.defeatSpamFilter(brevity ~ " at: " ~ mp.getNode("callsign").getValue()); + damage.damageLog.push(brevity ~ " at: " ~ mp.getNode("callsign").getValue()); + if (launcher_align_to_target) { + setprop("sim/multiplay/generic/float[6]", target_bearing-getprop("orientation/heading-deg")); + theMissile.rail_head_deg = getprop("sim/multiplay/generic/float[6]"); + } + setprop("sim/multiplay/generic/float[7]", target_pitch); + setprop("sim/multiplay/generic/float[8]", target_bearing-getprop("orientation/heading-deg")); + if (sam_align_to_target) { + setprop("/orientation/heading-deg",target_bearing); + } + theMissile.release(); + missile_release_time = systime(); + ACTIVE_MISSILE = ACTIVE_MISSILE + 1;setprop("active", ACTIVE_MISSILE); + print("Fired "~missile_name~" #" ~ ACTIVE_MISSILE ~ " at: " ~ mp.getNode("callsign").getValue()); + setprop("/sim/messages/copilot", "Launch at "~mp.getNode("callsign").getValue()); + if (ACTIVE_MISSILE > NUM_MISSILES) { + setprop("/sim/messages/copilot", "Launcher out of ammo"); + print("Launcher out of missile ammo."); + settimer(autoreload, reload_time); + reloading = 1; + reload_starting = systime(); + } + if (lu != nil) { + append(lu.missiles, theMissile); + lu.in_air += 1; + lu.tracking = 0; + } + launch_in_progress = 0; + info = info~" (launched)"; + setprop("sam/info", info); + setprop("sam/missiles",(NUM_MISSILES+1-ACTIVE_MISSILE)); + clearSingleLock(); + return; + } elsif ((systime() - launchtime) > (lockon_time*1.5) or radar_logic.isNotBehindTerrain(mp)[0] == 0) { + # launch cancelled so it dont forever goes in this loop and dont allow for other firings. + if (lu != nil) { + lu.tracking = 0; + } + setprop("/sim/messages/copilot", "SAM Canceled launch at "~mp.getNode("callsign").getValue()); + launch_in_progress = 0; + info = info~" (cancelled)"; + setprop("sam/info", info); + setprop("sam/missiles",(NUM_MISSILES+1-ACTIVE_MISSILE)); + clearSingleLock(); + return; + } else { + info = sprintf("%s (tracking %d nm at %d ft)", info, armament.contact.get_range(), armament.contact.get_altitude()); + if (systime()-missile_release_time > 1.5) { + var tgt_dir = target_bearing-getprop("orientation/heading-deg"); + var max_dir = launch_update_time*align_speed_dps; + if (launcher_align_to_target) { + # now smoothly rotate launcher: + var cur_dir = getprop("sim/multiplay/generic/float[6]"); + var move_dir = geo.normdeg180(tgt_dir-cur_dir); + move_dir = math.clamp(move_dir, -max_dir, max_dir); + setprop("sim/multiplay/generic/float[6]", cur_dir+move_dir); + } + var cur_dir2 = getprop("sim/multiplay/generic/float[8]"); + var move_dir2 = geo.normdeg180(tgt_dir-cur_dir2); + move_dir2 = math.clamp(move_dir2, -max_dir, max_dir); + setprop("sim/multiplay/generic/float[8]", cur_dir2+move_dir2); + if (sam_align_to_target) { + var tgt_dir = target_bearing; + var cur_dir = getprop("orientation/heading-deg"); + var move_dir = geo.normdeg180(tgt_dir-cur_dir); + var max_dir = launch_update_time*align_speed_dps; + move_dir = math.clamp(move_dir, -max_dir, max_dir); + setprop("orientation/heading-deg", cur_dir+move_dir); + } + } + + setprop("sam/info", info); + if (mp.getNode("callsign") != nil and mp.getNode("callsign").getValue() != nil and mp.getNode("callsign").getValue() != "") { + if (getprop("payload/armament/"~string.lc(missile_name)~"/guidance") != "tvm") setprop("sim/multiplay/generic/string[6]", left(md5(mp.getNode("callsign").getValue()), 4)); + datalink.send_data({"contacts":[{"callsign":mp.getNode("callsign").getValue(),"iff":0}]}); + } else { + clearSingleLock(); + } + if (lu != nil) { + lu.tracking = 1; + radarTrackTime = systime(); + } + } + + settimer( func { missile_launch(mp, launchtime, my_pos); },launch_update_time); +} + +### missile set launched to false for target + +var missile_listener = func { + foreach(var tgt ; targetsV2.vector) { + var missilesNew = []; + foreach(var missile ; tgt.missiles) { + if (missile != nil) { + if (missile.deleted) { + tgt.in_air -= 1; + } else { + append(missilesNew, missile); + } + } + } + tgt.missiles = missilesNew; + } + settimer(missile_listener, 2.5); +} + +var extrapolate = func (x, x1, x2, y1, y2) { + return y1 + ((x - x1) / (x2 - x1)) * (y2 - y1); +} + +################### MISC + +var main_init_listener = setlistener("sim/signals/fdm-initialized", func { + print("fdm-initialized"); + targetsV2 = std.Vector.new();# OO vector (to make removing item easier) + reload(); + scan(); + aircraft.data.save(0.5);# save the target list every 30 seconds + removelistener(main_init_listener); + setlistener(opfor_switch, func { + targetsV2 = std.Vector.new();# OO vector (to make removing item easier) + }, 0, 0); + setlistener(friend_switch, func { + targetsV2 = std.Vector.new();# OO vector (to make removing item easier) + }, 0, 0); + missile_listener(); + setprop(getprop("payload/armament/MP-lat"),getprop("position/latitude-deg")); + setprop(getprop("payload/armament/MP-lon"),getprop("position/longitude-deg")); + setprop(getprop("payload/armament/MP-alt-ft"),getprop("position/altitude-ft")); + view.setViewByIndex(200);#follow view +}, 0, 0); + +setlistener("sim/signals/reinit", func { + print("reinit"); + start_time = systime(); +}); \ No newline at end of file diff --git a/BUK-M2/Nasal/guided-missiles.nas b/BUK-M2/Nasal/guided-missiles.nas new file mode 100644 index 0000000..98f3b94 --- /dev/null +++ b/BUK-M2/Nasal/guided-missiles.nas @@ -0,0 +1,5930 @@ +######################################################################################### +####### +####### Guided/Cruise missiles, rockets and dumb/glide/guided bombs code for Flightgear. +####### +####### License: GPL 2.0 +####### +####### Authors: +####### Alexis Bory, Fabien Barbier, Richard Harrison, Justin Nicholson, Nikolai V. Chr., Axel Paccalin, Colin Geniet +####### +####### The file vector.nas needs to be available in namespace 'vector'. +####### +####### In addition, some code is derived from work by: +####### David Culp, Vivian Meazza, M. Franz +####### +######################################################################################### + +# Some notes about making weapons: +# +# Firstly make sure you read the comments (line 300+) below for the properties. +# For laser/gps guided gravity bombs make sure to set the max G very low, like 0.5G, to simulate them slowly adjusting to hit the target. +# Remember for air to air missiles the speed quoted in literature is normally the speed above the launch platform. I usually fly at the typical max usage +# regime for that missile, so for example for AIM-7 it would be at 40000 ft, +# there I make sure it can reach approx the max relative speed. For older missiles the max speed quoted is sometimes absolute speed though, so beware. +# If it quotes aerodynamic speed then its the absolute speed. Speeds quoted in in unofficial sources can be any of them, +# but if its around mach 5 for A/A its a good bet its absolute, only very few A/A missiles are likely hypersonic. (among othe reasons due to heat or fuel limitations) +# If you cannot find fuel weight in literature, you probably wont go far off with a value that is 1/4 to 1/3 of total launch weight for a A/A missile. +# Stage durations is allowed to be 0, so can thrust values. If there is no second stage, instead of just setting stage 2 thrust to 0, +# set stage 2 duration to 0 also. For unpowered munitions, set all thrusts to 0. +# For very low sea skimming missiles, be sure to set terrain following to false, you cannot have it both ways. +# Since if it goes very low (below 100ft), it cannot navigate terrain reliable. +# The property terrain following only goes into effect, if a cruise altitude is set below 10000ft and not set to 0. +# Cruise missiles against ground targets will always terrain follow, no matter that property. +# If literature quotes a max distance for a weapon, its a good bet it is under the condition that the target +# is approaching the launch platform with high speed and does not evade, and also if the launch platform is an aircraft, +# that it also is approaching the target with high speed. In other words, high closing rate. For example the AIM-7, which can hit bombers out at 32 NM, +# will often have to be within 3 NM of an escaping target to hit it (source). Missiles typically have significantly less range against an evading +# or escaping target than what is commonly believed. I typically fly at 40000 ft at mach 2, approach a target flying head-on with same speed and altitude, +# to test max range. Its typically drag that I adjust for that. +# When you test missiles against aircraft, be sure to do it with a framerate of 25+, else they will not hit very good, especially high speed missiles like +# Amraam or Phoenix. Also notice they generally not hit so close against Scenario/AI objects compared to MP aircraft due to the way these are updated. +# Laser and semi-radar guided munitions need the target to be painted to keep lock. Notice gps guided munition that are all aspect will never lose lock, +# whether they can 'see' the target or not. Anti-radiation missiles will need the target to send radiation towards the missile. +# Set DEBUG_STATS and/or DEBUG_FLIGHT to true to check how the missile works during flight, when you are designing a weapon. +# +# +# Usage: +# +# To create a weapon call AIM.new(pylon, type, description, midFlightFunction). The pylon is an integer from 0 or higher. When its launched it will read the pylon position in +# controls/armament/station[pylon+1]/offsets, where the position properties must be x-m, y-m and z-m. The type is just a string, the description is a string +# that is exposed in its radar properties under AI/models during flight. The function is for changing target, guidance or guidance-law during flight. +# The mid flight function will be called often during flight with 1 parameter. The param is a hash like {time_s, dist_m, mach, weapon_position}, where the latter is a geo.Coord. +# It expects you to return a hash with any or none of these {guidance, guidanceLaw, target, remote_yaw, remote_pitch}. +# The model that is loaded and shown is located in the aircraft folder at the value of property payload/armament/models in a subfolder with same name as type. +# Inside the subfolder the xml file is called [lowercase type]-[pylon].xml +# To start making the missile try to get a lock, call start(), the missile will then keep trying to get a lock on 'contact'. +# 'contact' can be set to nil at any time or changed. To stop the search, just call stop(). To resume the search you again have call start(). +# To release the munition at a target call release(), normally do this after the missile has set its own status to MISSILE_LOCK. +# When using weapons without target, call releaseAtNothing() instead of release(), search() does not need to have been called beforehand. +# To then find out where it hit the ground check the impact report in AI/models. The impact report will contain warhead weight, but that will be zero if +# the weapon did not have time to arm before hitting ground. +# To drop the munition, without arming it nor igniting its engine, call eject(). +# Remote guidance requires the use of midFlightFunction (see below) to transmit guidance parameters, in the remote_yaw and remote_pitch fields of the output. +# +# +# Limitations: +# +# The weapons use a simplified flight model that does not have AoA or sideslip. Mass balance, rotational inertia, wind is also not implemented. They also do not roll due to aerodynmic effects. +# If you fire a weapon and have HoT enabled in flightgear, they likely will not hit very precise. +# The weapons are highly dependent on framerate, so low frame rate will make them hit imprecise. +# The drag curves are tailored for sizable munitions, so it does not work well will bullet or cannon sized munition, submodels are better suited for that. +# Inertial guidance does not account for drift and does not auto dead reckon the target if you want that you have to update the Target accordingly. +# +# +# Future features: +# +# ECM disturbance of getting radar lock. +# Lock on jam. (advanced feature) +# After FG gets HLA: stop using MP chat for hit messages. +# Allow firing only if certain conditions are met. Like not being inverted when firing ejected weapons. +# Sub munitions that have their own guidance/FDM. (advanced) +# GPS guided munitions could have waypoints added. +# Specify terminal manouvres and preferred impact aspect. +# Drag coeff reduction due to exhaust plume. This actually matters quite a bit. +# Proportional navigation should use vector math instead decomposition horizontal/vertical navigation. +# Bleeding speed due to high G turning should depend on drag-area, with AIM-120s as reference. (that would mean recalibrate all cruise-missiles so they don't crash) +# Max-g should be seperated into max structural G that it will never exceed, and max-g for certain mach. Should still depend also on altitude of course. This way it needs a certain speed to perform certain G. +# Real rocket thrust does not necesarily cutoff instantly. Make an optional fadeout. (use the aim-9 new variant paper page as guide) +# Support for seeker FOV that is smaller than FCS FOV. (ASRAAM) +# Introduce battery time. Beyond this time it wont steer. +# Anti-rad: So if the target source goes dark, it deploys a parachute and “loiters”. If it re-detects target, it releases the parachute and fires the second motor +# +# Please report bugs and features to Nikolai V. Chr. | ForumUser: Necolatis | Callsign: Leto + +var AcModel = props.globals.getNode("payload"); +var OurHdg = props.globals.getNode("orientation/heading-deg"); +var OurRoll = props.globals.getNode("orientation/roll-deg"); +var OurPitch = props.globals.getNode("orientation/pitch-deg"); +var OurAlpha = props.globals.getNode("orientation/alpha-deg"); +var OurBeta = props.globals.getNode("orientation/side-slip-deg"); +var ourAlt = props.globals.getNode("position/altitude-ft"); +var deltaSec = props.globals.getNode("sim/time/delta-sec"); +var speedUp = props.globals.getNode("sim/speed-up"); +var noseAir = props.globals.getNode("velocities/uBody-fps"); +var belowAir = props.globals.getNode("velocities/wBody-fps"); +var HudReticleDev = props.globals.getNode("payload/armament/hud/reticle-total-deviation", 1);#polar coords +var HudReticleDeg = props.globals.getNode("payload/armament/hud/reticle-total-angle", 1); +var update_loop_time = 0.000; + +var fox2_unique_id = -100; # each missile needs to have a unique numeric ID + +var SIM_TIME = 0; +var REAL_TIME = 1; + +# enables the AIM-9 aiming reticle (F-14) - doesn't require the radar to be in TWS +var use_fg_default_hud = getprop("payload/armament/use-fg-default-hud"); +if (use_fg_default_hud == nil) { + use_fg_default_hud = 0; +} + +var MISSILE_STANDBY = -1; +var MISSILE_STARTING = -0.5; +var MISSILE_SEARCH = 0; +var MISSILE_LOCK = 1; +var MISSILE_FLYING = 2; + +var AIR = 0; +var MARINE = 1; +var SURFACE = 2; +var ORDNANCE = 3; +var POINT = 4; + +var PATTERN_CIRCLE = 0; +var PATTERN_ROSETTE = 1; +var PATTERN_DOUBLE_D = 2; + +# set these to print stuff to console: +var DEBUG_STATS = 0;#most basic stuff +var DEBUG_FLIGHT = 0;#for creating missiles sometimes good to have this on to see how it flies. + +# set these to debug the code: +var DEBUG_STATS_DETAILS = 0; +var DEBUG_GUIDANCE = 0; +var DEBUG_GUIDANCE_DETAILS = 0; +var DEBUG_FLIGHT_DETAILS = 0; +var DEBUG_SEARCH = 0; +var DEBUG_CODE = 0; + +var g_fps = 9.80665 * M2FT; +var SLUGS2LBM = 32.1740485564; +var LBM2SLUGS = 1/SLUGS2LBM; +var slugs_to_lbm = SLUGS2LBM;# since various aircraft use this from outside missile, leaving it for backwards compat. + +var first_in_air = 0;# first missile is in the air, other missiles should not write to MP. +var first_in_air_max_sec = 30; + +var versionString = getprop("sim/version/flightgear"); +var version = split(".", versionString); +var major = num(version[0]); +var minor = num(version[1]); +var pica = num(version[2]); +var pickingMethod = 0; +if ((major == 2017 and minor == 2 and pica >= 1) or (major == 2017 and minor > 2) or major > 2017) { + pickingMethod = 1; +} +var offsetMethod = 0; +if ((major == 2017 and minor == 2 and pica >= 1) or (major == 2017 and minor > 2) or major > 2017) { + offsetMethod = 1; +} + +var wingedGuideFactor = 0.1; + +var spawn = func(c, context) return func {thread.newthread(func { + call(c, nil, context, context, var err = []); + if(size(err)) { + print("multi-threading error:"); + foreach(var i;err) { + print(i); + } + } +})}; + +# +# The radar will make sure to keep this variable updated. +# Whatever is targeted and ready to be fired upon, should be set here. (or set it directly on the missile using AIM.contacts[0]) +# +# The variable contactPoint is for now only used by F-16 target pod. +# +var contact = nil; +var contactPoint = nil; +# +# Contact should implement the following interface: +# +# get_type() - (AIR, MARINE, SURFACE or ORDNANCE) +# getUnique() - Used when comparing 2 targets to each other and determining if they are the same target. +# isValid() - If this target is valid +# getElevation() +# get_bearing() +# get_Callsign() +# get_range() +# get_Coord() +# get_altitude() +# get_Pitch() +# get_Speed() +# get_heading() +# get_uBody() +# get_vBody() +# get_wBody() +# getLastGroundTrackBlep() - Used for sample guidance +# getFlareNode() - Used for flares. +# getChaffNode() - Used for chaff. +# isPainted() - Tells if this target is still being radar tracked by the launch platform, only used in semi-radar guided missiles. +# isLaserPainted() - Tells if this target is still being tracked by the launch platform, only used by laser guided ordnance. +# isRadiating(coord) - Tell if anti-radiation missile is hit by radiation from target. coord is the weapon position. +# isCommandActive() +# isVirtual() - Tells if the target is just a position, and should not be considered for damage. +# get_closure_rate() - closure rate in kt + +var AIM = { + lowestETA: nil, + #done + new : func (p, type = "AIM-9L", sign = "Sidewinder", midFlightFunction = nil, nasalPosition = nil) { + if(AIM.active[p] != nil) { + #do not make new missile logic if one exist for this pylon. + return -1; + } elsif (AcModel.getNode("armament/"~string.lc(type)~"/") == nil) { + # missiletype does not exist + return -1; + } + var m = { parents : [AIM]}; + # Args: p = Pylon. + + m.mfFunction = midFlightFunction; + m.nasalPosition = nasalPosition; + + m.type_lc = string.lc(type); + m.type = type; + + m.deleted = 0; + + m.status = MISSILE_STANDBY; # -1 = stand-by, 0 = searching, 1 = locked, 2 = fired. + m.free = 0; # 0 = status fired with lock, 1 = status fired but having lost lock. + m.prop = AcModel.getNode("armament/"~m.type_lc~"/").getChild("msl", 0, 1); + m.SwSoundOnOff = AcModel.getNode("armament/"~m.type_lc~"/sound-on-off",1); + m.launchSoundProp = AcModel.getNode("armament/"~m.type_lc~"/sound-fire-on-off",1); + m.SwSoundVol = AcModel.getNode("armament/"~m.type_lc~"/sound-volume",1); + if (m.SwSoundOnOff.getValue() == nil) { + m.SwSoundOnOff.setBoolValue(0); + } + if (m.launchSoundProp.getValue() == nil) { + m.launchSoundProp.setBoolValue(0); + } + if (m.SwSoundVol.getValue() == nil) { + m.SwSoundVol.setDoubleValue(0); + } + m.tacview_support = getprop("payload/d-config/tacview_supported");# set to false, unless using an aircraft that has tacview + m.gnd_launch = getprop("payload/armament/gnd-launch");#true to be a SAM or ship + if (m.gnd_launch == nil) { + m.gnd_launch = 0; + } + if (m.tacview_support == nil) { + m.tacview_support = 0; + } + + m.ID = p; + m.stationName = AcModel.getNode("armament/station-name").getValue(); + if (m.nasalPosition == nil) { + m.pylon_prop = props.globals.getNode(AcModel.getNode("armament/pylon-stations").getValue()).getChild(m.stationName, p+AcModel.getNode("armament/pylon-offset").getValue()); + } + m.Tgt = nil; + m.callsign = "Unknown"; + m.direct_dist_m = nil; + m.speed_m = -1; + + fox2_unique_id += 1; + if (fox2_unique_id >100) fox2_unique_id = -100; + m.unique_id = fox2_unique_id; + m.nodeString = "payload/armament/"~m.type_lc~"/"; + + if (m.tacview_support) { + m.tacviewID = 11000 + int(math.floor(rand()*10000)); + } + + ############### + # Weapon specs: + ############### + + # name + m.typeLong = getprop(m.nodeString~"long-name"); # Longer name of the weapon + m.typeShort = getprop(m.nodeString~"short-name"); # Shorter name of the weapon + m.typeID = getprop(m.nodeString~"type-id"); # ID that match damage type + # detection and firing + m.max_fire_range_nm = getprop(m.nodeString~"max-fire-range-nm"); # max range that the FCS allows firing + m.min_fire_range_nm = getprop(m.nodeString~"min-fire-range-nm"); # it wont get solid lock before the target has this range + m.fcs_fov = getprop(m.nodeString~"FCS-field-deg") / 2; # fire control system total field of view diameter for when searching and getting lock before launch. + m.class = getprop(m.nodeString~"class"); # put in letters here that represent the types the missile can fire at. A=air, M=marine, G=ground, P=point + m.brevity = getprop(m.nodeString~"fire-msg"); # what the pilot will call out over the comm when he fires this weapon + m.coolable = getprop(m.nodeString~"coolable"); # If the seeker supports being cooled. (AIM-9L or later supports) + m.cool_time = getprop(m.nodeString~"cool-time"); # Time to cold the seeker from fully warm. + m.cool_duration = getprop(m.nodeString~"cool-duration"); # Typically 2.5 hours for cooling fluids. Much higher for electrical. + m.warm_detect_range_nm = getprop(m.nodeString~"warm-detect-range-nm"); # Current guidance mode detect range. (when warm) + m.cold_detect_range_nm = getprop(m.nodeString~"detect-range-nm"); # Current guidance mode default detect range. (when cold). This can differ from max-fire-range-nm in that some missiles can be fired at targets they cannot yet see. + m.beam_width_deg = getprop(m.nodeString~"seeker-beam-width-deg"); # Seeker detector instant field of view diameter + m.ready_time = getprop(m.nodeString~"ready-time"); # time to get ready after standby mode. + m.loal = getprop(m.nodeString~"lock-on-after-launch"); # bool. LOAL supported. For loal to work [optional] + m.canSwitch = getprop(m.nodeString~"auto-switch-target-allowed"); # bool. Can switch target at will if it loses lock [optional] + m.standbyFlight = getprop(m.nodeString~"prowl-flight"); # unguided/level/gyro-pitch/5/terrain-follow for LOAL and that stuff, when not locked onto stuff. + m.switchTime = getprop(m.nodeString~"switch-time-sec"); # auto switch of targets in flight: time to scan FoV. This should not be fast, some seconds or more. + m.noCommonTarget = getprop(m.nodeString~"no-common-target"); # bool. If true, target must be set directly on weapon and its not allowed to read 'contact' variable. + m.radarOrigin = getprop(m.nodeString~"FCS-at-origin"); # bool. If radar location is 0,0,0. If false use the 3 properties below also. + m.radarX = getprop(m.nodeString~"FCS-x"); # Where in the aircraft (model xml coords) the radar is located. + m.radarY = getprop(m.nodeString~"FCS-y"); # This is handy for SAMs with radar on a mast. + m.radarZ = getprop(m.nodeString~"FCS-z"); # In future I will add direction to it also, for now its center gimbal is along -x axis. + m.expand_min = getprop(m.nodeString~"expand-min-fire-range"); # Bool. Default false. If min fire range should expand with closing rate. Mainly use this for A/A missiles. + m.asc = getprop(m.nodeString~"attack-steering-cue-enabled");# Bool. ASC enabled. + # navigation, guiding and seekerhead + m.max_seeker_dev = getprop(m.nodeString~"seeker-field-deg") / 2; # missiles own seekers total FOV diameter. + m.guidance = getprop(m.nodeString~"guidance"); # heat/radar/semi-radar/tvm/laser/gps/gps-laser/vision/unguided/level/gyro-pitch/radiation/inertial/remote/remote-stable/command/sample + m.guidanceLaw = getprop(m.nodeString~"navigation"); # guidance-law: direct/direct-alt/OPN/PN/APN/PNxxyy/APNxxyy/LOS (use direct for pure pursuit, use PN for A/A missiles, use APN for modern SAM missiles PN for older, use PNxxyy/APNxxyy for surface to air where xx is degrees to aim above target, yy is seconds it will do that). GPN is APN for winged glidebombs. + m.guidanceLawHorizInit = getprop(m.nodeString~"navigation-init-pure-15"); # Bool. Guide in horizontal plane using pure pursuit until target with 15 deg of nose, before switching to + m.pro_constant = getprop(m.nodeString~"proportionality-constant"); # Constant for how sensitive proportional navigation is to target speed/acc. Normally between 3-6. [optional] + m.all_aspect = getprop(m.nodeString~"all-aspect"); # bool. set to false if missile only locks on reliably to rear of target aircraft + m.angular_speed = getprop(m.nodeString~"seeker-angular-speed-dps"); # only for heat/vision seeking missiles. Max angular speed that the target can move as seen from seeker, before seeker loses lock. + m.sun_lock = getprop(m.nodeString~"lock-on-sun-deg"); # only for heat seeking missiles. If it looks at sun within this angle, it will lose lock on target. + m.loft_alt = getprop(m.nodeString~"loft-altitude"); # if 0 then no snap up. Below 10000 then cruise altitude above ground. Above 10000 max altitude it will snap up to. + m.follow = getprop(m.nodeString~"terrain-follow"); # bool. used for anti-ship missiles that should be able to terrain follow instead of purely sea skimming. + m.reaquire = getprop(m.nodeString~"reaquire"); # bool. If weapon will try to reaquire lock after losing it. [optional] + m.maxPitch = getprop(m.nodeString~"max-pitch-deg"); # After propulsion burnout it will not be able to steer up more than this. Useful for guided bombs. [optional] + m.guidanceEnabled = getprop(m.nodeString~"guidance-enabled"); # Boolean. If guidance will activate when launched. [optional] + m.terminal_alt_factor = getprop(m.nodeString~"terminal-alt-factor"); # Float. Cruise alt multiplied by this factor determines how much is rise up in terminal. Default: 2 + m.terminal_rise_time = getprop(m.nodeString~"terminal-rise-time"); # Float. Seconds before reaching target that cruise missile will start to rise up. Default: 6 + m.terminal_dive_time = getprop(m.nodeString~"terminal-dive-time"); # Float. Seconds before reaching target that cruise missile will start to dive down. Default: 4 + m.rosette_radius = getprop(m.nodeString~"rosette-radius-deg"); # Float. Radius of uncaged rosette search pattern. If 0 then disabled. + m.seam_support = getprop(m.nodeString~"sw-expanded-acquisition-mode");# Bool. Default true. SEAM support. False for old heatseekers like AIM-9B/F/D/E and RB24. Supports then only static commandDir mode, uncage happens at firing. No radar slaving, no SEAM scan, no manual cage/uncage. + m.oldPattern = getprop(m.nodeString~"nutate-double-d-instead-of-circle"); # Bool. For old SEAM missiles like AIM-9G/H. (maybe J also, don't know). + m.seeker_filter = getprop(m.nodeString~"seeker-filter"); # Float: Ability to filter out background noise. Typically between 1 to 2 for IR. + # engine + m.force_lbf_1 = getprop(m.nodeString~"thrust-lbf-stage-1"); # stage 1 thrust [optional] + m.force_lbf_2 = getprop(m.nodeString~"thrust-lbf-stage-2"); # stage 2 thrust [optional] + m.force_lbf_3 = getprop(m.nodeString~"thrust-lbf-stage-3"); # stage 3 thrust [optional] + m.stage_1_duration = getprop(m.nodeString~"stage-1-duration-sec"); # stage 1 duration [optional] + m.stage_gap_duration = getprop(m.nodeString~"stage-gap-duration-sec"); # gap duration between stage 1 and 2 [optional] + m.stage_2_duration = getprop(m.nodeString~"stage-2-duration-sec"); # stage 2 duration [optional] + m.stage_3_duration = getprop(m.nodeString~"stage-3-duration-sec"); # stage 3 duration [optional] + m.stage_1_jet = getprop(m.nodeString~"stage-1-jet"); # Boolean. If stage 1 is a jet engine [optional] + m.stage_2_jet = getprop(m.nodeString~"stage-2-jet"); # Boolean. If stage 2 is a jet engine [optional] + m.stage_3_jet = getprop(m.nodeString~"stage-3-jet"); # Boolean. If stage 3 is a jet engine [optional] + m.jet_effectiveness = getprop(m.nodeString~"jet-effectiveness-10000ft"); # Effectiveness of the turnine at 10000 ft compared to sealevel [optional] + m.weight_fuel_lbm = getprop(m.nodeString~"weight-fuel-lbm"); # fuel weight [optional]. If this property is not present, it won't lose weight as the fuel is used. + m.vector_thrust = getprop(m.nodeString~"vector-thrust"); # Boolean. This will make less drag due to high G turns while engine is running. [optional] + m.engineEnabled = getprop(m.nodeString~"engine-enabled"); # Boolean. If engine will start at all. [optional] + # aerodynamic + m.weight_launch_lbm = getprop(m.nodeString~"weight-launch-lbs"); # total weight of armament, including fuel and warhead. + m.Cd_base = getprop(m.nodeString~"drag-coeff"); # drag coefficient + m.Cd_delta = getprop(m.nodeString~"delta-drag-coeff-deploy"); # drag coefficient added by deployment + m.ref_area_sqft = getprop(m.nodeString~"cross-section-sqft"); # normally is crosssection area of munition (without fins) + m.max_g = getprop(m.nodeString~"max-g"); # max G-force the missile can pull at sealevel (if vector thrust enabled, this will be auto reduced at engine burnout) + m.min_speed_for_guiding = getprop(m.nodeString~"min-speed-for-guiding-mach"); # minimum speed before the missile steers, before it reaches this speed it will fly ballistic. + m.intoBore = getprop(m.nodeString~"ignore-wind-at-release"); # Boolean. Default false. If true dropped weapons will ignore sideslip and AOA and start flying in aircraft bore direction. Will always be the case if ejector speed is non zero. + m.lateralSpeed = getprop(m.nodeString~"lateral-dps"); # Lateral speed in degrees per second. This is mostly for cosmetics. + # detonation + m.weight_whead_lbm = getprop(m.nodeString~"weight-warhead-lbs"); # warhead total mass. Includes scapnel, expanding rods etc etc. + m.arming_time = getprop(m.nodeString~"arming-time-sec"); # time for weapon to arm + m.selfdestruct_time = getprop(m.nodeString~"self-destruct-time-sec"); # time before selfdestruct + m.destruct_when_free = getprop(m.nodeString~"self-destruct-at-lock-lost"); # selfdestruct if lose target. Mostly for man-in-the-loop weapons like some old command guided. + m.reportDist = getprop(m.nodeString~"max-report-distance"); # Interpolation hit: max distance from target it report it exploded, not passed. Trig hit: Distance where it will trigger. + m.multiHit = getprop(m.nodeString~"hit-everything-nearby"); # bool. Only works well for slow moving targets. Needs you to pass contacts to release(). + m.inert = getprop(m.nodeString~"inert"); # bool. If the weapon is inert and will not detonate. [optional] + # avionics sounds + m.vol_search = getprop(m.nodeString~"vol-search"); # sound volume when searching + m.vol_track = getprop(m.nodeString~"vol-track"); # sound volume when having lock + # launching conditions + m.rail = getprop(m.nodeString~"rail"); # if the weapon is rail or tube fired set to true. If dropped 7ft before ignited set to false. + m.rail_dist_m = getprop(m.nodeString~"rail-length-m"); # length of tube/rail + m.rail_forward = getprop(m.nodeString~"rail-point-forward"); # true for rail, false for rail/tube with a pitch/heading-deviation + m.rail_pitch_deg = getprop(m.nodeString~"rail-pitch-deg"); # Only used when rail is not forward. 90 for vertical tube. Max 90, min -90. + m.rail_head_deg = getprop(m.nodeString~"rail-heading-deg"); # Only used when rail is not forward. 90 for vertical tube. + m.drop_time = getprop(m.nodeString~"drop-time"); # Time to fall before stage 1 thrust starts. + m.deploy_time = getprop(m.nodeString~"deploy-time"); # Time to deploy wings etc. Time starts when drop ends or rail passed. + m.no_pitch = getprop(m.nodeString~"pitch-animation-disabled"); # Bool. Default false. Set to true for ejection seats. + m.eject_speed = getprop(m.nodeString~"ejector-speed-fps"); # Ordnance ejected by pylon with this speed. Default = 0. Optional. Ignored if on rail. + m.guideWhileDrop = getprop(m.nodeString~"guide-before-ignition"); # Can guide before engine ignition if speed is high enough. + # counter-measures + m.chaffResistance = getprop(m.nodeString~"chaff-resistance"); # Float 0-1. Amount of resistance to chaff. Default 0.850. [optional] + m.flareResistance = getprop(m.nodeString~"flare-resistance"); # Float 0-1. Amount of resistance to flare. Default 0.850. [optional] + # data-link to launch platform + m.data = getprop(m.nodeString~"telemetry"); # Boolean. Data link back to aircraft when missile is flying. [optional] + m.dlz_enabled = getprop(m.nodeString~"DLZ"); # Supports dynamic launch zone info. For now only works with A/A. [optional] + m.dlz_opt_alt = getprop(m.nodeString~"DLZ-optimal-alt-feet"); # Minimum altitude required to hit the target at max range. + m.dlz_opt_mach = getprop(m.nodeString~"DLZ-optimal-closing-mach"); # Closing speed required to hit the target at max range at minimum altitude. + # detailed drag settings + m.Cd_plume = getprop(m.nodeString~"exhaust-plume-parasitic-drag-factor"); # Default 1. For AIM-120, Naval Postgraduate School paper suggest around 0.6. It will reduce drag during burn. + m.simple_drag = getprop(m.nodeString~"simplified-induced-drag"); # bool. Default true. If enabled, the properties below wont be used: + m.wing_aspect_ratio = getprop(m.nodeString~"wing-aspect-ratio"); # span^2/wing_area. Default to 8 + m.wing_eff = getprop(m.nodeString~"wing-efficiency-relative-to-an-elliptical-planform"); # Default to 0.85 + + + if (m.cold_detect_range_nm == nil) { + # backwards compatibility + m.cold_detect_range_nm = m.max_fire_range_nm; + } + m.detect_range_curr_nm = m.cold_detect_range_nm; + + if (m.max_seeker_dev == nil) { + m.max_seeker_dev = 15; + } + if (m.beam_width_deg == nil) { + m.beam_width_deg = 4; + } + m.beam_width_deg *= 0.5; + + if (m.eject_speed == nil) { + m.eject_speed = 0; + } + + if (m.rail_forward == 1) { + m.rail_pitch_deg = 0; + m.rail_head_deg = 0; + } + + if (m.asc == nil) { + m.asc = 0; + } + + if (m.wing_aspect_ratio == nil) { + m.wing_aspect_ratio = 8.0; + } + + if (m.wing_eff == nil) { + m.wing_eff = 0.85; + } + + if (m.expand_min == nil) { + m.expand_min = 0; + } + + if (m.rail_head_deg == nil) { + m.rail_head_deg = 0; + } + + if (m.radarOrigin == nil) { + m.radarOrigin = 1; + } + + if (m.all_aspect == nil) { + m.all_aspect = 1; + } + + if (m.guideWhileDrop == nil) { + m.guideWhileDrop = 0; + } + + if (m.seam_support == nil) { + m.seam_support = 1; + } + + if (m.rosette_radius == nil) { + m.rosette_radius = 7.5; + } + + if (m.oldPattern == nil) { + m.oldPattern = 0; + } + + if (m.seeker_filter == nil) { + m.seeker_filter = 0; + } + + if (m.ready_time == nil) { + m.ready_time = 0; + } + if (m.coolable == nil) { + m.coolable = 0; + } + if (m.intoBore == nil) { + m.intoBore = 0; + } + + if (m.lateralSpeed == nil) { + m.lateralSpeed = 0; + } + + if(m.maxPitch == nil) { + m.maxPitch = 90; + } + + if(m.loal == nil) { + m.loal = 0; + } + + if(m.Cd_delta == nil) { + m.Cd_delta = 0; + } + + if (m.Cd_plume == nil) { + m.Cd_plume = 1.0; + } + + if(m.canSwitch == nil) { + m.canSwitch = 0; + } + + if(m.terminal_alt_factor == nil) { + m.terminal_alt_factor = 2; + } + + if(m.terminal_rise_time == nil) { + m.terminal_rise_time = 6; + } + + if(m.terminal_dive_time == nil) { + m.terminal_dive_time = 4; + } + + if (m.weight_fuel_lbm == nil) { + m.weight_fuel_lbm = 0; + } + if (m.data == nil) { + m.data = 0; + } + if (m.stage_1_jet == nil) { + m.stage_1_jet = 0; + } + if (m.stage_2_jet == nil) { + m.stage_2_jet = 0; + } + if (m.stage_3_jet == nil) { + m.stage_3_jet = 0; + } + if (m.jet_effectiveness == nil) { + m.jet_effectiveness = 0.75; + } + if (m.vector_thrust == nil) { + m.vector_thrust = 0; + } + if (m.flareResistance == nil or !m.gnd_launch) { + m.flareResistance = 0.85; + } + if (m.chaffResistance == nil or !m.gnd_launch) { + m.chaffResistance = 0.85; + } + if (m.guidanceLaw == nil) { + m.guidanceLaw = "PN"; + } + if (m.guidanceLawHorizInit == nil) { + m.guidanceLawHorizInit = 0; + } + if (m.pro_constant == nil) { + m.pro_constant = 3; + } + if (m.force_lbf_1 == nil) { + m.force_lbf_1 = 0; + } + if (m.force_lbf_2 == nil) { + m.force_lbf_2 = 0; + } + if (m.force_lbf_3 == nil) { + m.force_lbf_3 = 0; + } + if(m.stage_gap_duration == nil) { + m.stage_gap_duration = 0; + } + if(m.stage_1_duration == nil) { + m.stage_1_duration = 0; + } + if(m.stage_2_duration == nil) { + m.stage_2_duration = 0; + } + if(m.stage_3_duration == nil) { + m.stage_3_duration = 0; + } + if (m.destruct_when_free == nil) { + m.destruct_when_free = 0; + } + if (m.reaquire == nil) { + if (m.guidance == "semi-radar" or m.guidance == "laser" or m.guidance == "heat" or m.guidance == "vision" or m.guidance == "tvm") { + m.reaquire = 1; + } else { + m.reaquire = 0; + } + } + if (m.rail == 1) { + # drop distance in time + m.drop_time = 0; + } elsif (m.drop_time == nil) { + m.drop_time = 0.5; + } + if (m.deploy_time == nil) { + m.deploy_time = 0.3; + } + if(m.typeLong == nil) { + m.typeLong = m.type; + } + if(m.typeShort == nil) { + m.typeShort = m.type; + } + if (m.standbyFlight == nil) { + m.standbyFlight = "unguided"; + } + if(m.switchTime == nil) { + m.switchTime = m.beam_width_deg*m.max_seeker_dev*0.05; + } + if(m.multiHit == nil) { + m.multiHit = 0; + } + if(m.inert == nil) { + m.inert = 0; + } + if(m.engineEnabled == nil) { + m.engineEnabled = 1; + } + if(m.guidanceEnabled == nil) { + m.guidanceEnabled = 1; + } + if (m.no_pitch == nil) { + m.no_pitch = 0; + } + if(m.simple_drag == nil) { + m.simple_drag = 1; + } + if(m.noCommonTarget == nil) { + m.noCommonTarget = 0; + } + + m.useModelCase = getprop("payload/armament/modelsUseCase"); + m.useModelUpperCase = getprop("payload/armament/modelsUpperCase"); + m.weapon_model_type = type; + if (m.useModelCase == 1) { + if (m.useModelUpperCase == 1) { + m.weapon_model_type = string.uc(type); + } else { + m.weapon_model_type = m.type_lc; + } + } + m.weapon_model = getprop("payload/armament/models")~m.weapon_model_type~"/"~m.type_lc~"-"; + m.weapon_model2 = getprop("payload/armament/models")~m.weapon_model_type~"/"~m.type_lc; + + # Find the next index for "models/model" and create property node. + # Find the next index for "ai/models/aim-9" and create property node. + # (M. Franz, see Nasal/tanker.nas) + var n = props.globals.getNode("models", 1); + var i = 0; + for (i = 0; 1==1; i += 1) { + if (n.getChild("model", i, 0) == nil) { + break; + } + } + m.model = n.getChild("model", i, 1); + + n = props.globals.getNode("ai/models", 1); + for (i = 0; 1==1; i += 1) { + if (n.getChild(m.type_lc, i, 0) == nil) { + break; + } + } + m.ai = n.getChild(m.type_lc, i, 1); + if(m.data == 1) { + m.ai.getNode("ETA", 1).setIntValue(-1); + m.ai.getNode("hit", 1).setIntValue(-1); + } + m.ai.getNode("valid", 1).setBoolValue(0); + m.ai.getNode("name", 1).setValue(type); + m.ai.getNode("sign", 1).setValue(sign); + m.ai.getNode("callsign", 1).setValue(sprintf("%s_%d", type, m.unique_id)); + m.ai.getNode("missile", 1).setBoolValue(1); + + + var id_model = m.weapon_model ~ m.ID ~ ".xml"; + m.model.getNode("path", 1).setValue(id_model); + m.model.getNode("enable-hot", 1).setBoolValue(0);# This is if people forget to set it in xml. + m.model.getNode("name", 1).setValue(m.typeLong);# this helps in debugging. + + + + # Create the AI position and orientation properties. + m.latN = m.ai.getNode("position/latitude-deg", 1); + m.lonN = m.ai.getNode("position/longitude-deg", 1); + m.altN = m.ai.getNode("position/altitude-ft", 1); + m.hdgN = m.ai.getNode("orientation/true-heading-deg", 1); + m.pitchN = m.ai.getNode("orientation/pitch-deg", 1); + m.rollN = m.ai.getNode("orientation/roll-deg", 1); + + m.mpLat = getprop("payload/armament/MP-lat");# properties to be used for showing missile over MP. + m.mpLon = getprop("payload/armament/MP-lon"); + m.mpAlt = getprop("payload/armament/MP-alt"); + m.mpAltft = getprop("payload/armament/MP-alt-ft");#used for anim of S-300 camera view: Follow + m.mpShow = 0; + if (m.mpLat != nil and m.mpLon != nil and m.mpAlt != nil and m.mpAltft != nil) { + m.mpLat = props.globals.getNode(m.mpLat, 0); + m.mpLon = props.globals.getNode(m.mpLon, 0); + m.mpAlt = props.globals.getNode(m.mpAlt, 0); + m.mpAltft = props.globals.getNode(m.mpAltft, 0); + if (m.mpLat != nil and m.mpLon != nil and m.mpAlt != nil and m.mpAltft != nil) { + m.mpShow = 1; + } + } + + + + m.target_air = find("A", m.class)==-1?0:1; + m.target_sea = find("M", m.class)==-1?0:1;#use M for marine, since S can be confused with surface. + m.target_gnd = find("G", m.class)==-1?0:1; + m.target_pnt = find("P", m.class)==-1?0:1; + + m.ac = nil; + + m.coord = geo.Coord.new().set_latlon(0, 0, 0); + m.t_coord = nil; + + + + # + # Seekerhead + # + m.caged = 1;# if gyro is caged + m.uncage_auto = 1;# will uncage when lock achieved (if SEAM supported) + m.command_dir_heading = 0;# where seeker is commanded in slave mode to look + m.command_dir_pitch = 0; + m.uncage_idle_heading = rand()*(2*m.max_seeker_dev)-m.max_seeker_dev; + m.uncage_idle_pitch = rand()*(2*m.max_seeker_dev)-m.max_seeker_dev; + m.contacts = [];# contacts that should be considered to lock onto. In slave it will only lock to the first. + m.warm = 1;# normalized warm/cold + m.ready_standby_time = 0;# time when started from standby + m.cooling = 0; + m.slave_to_radar = m.seam_support?1:0; + m.seeker_last_time = 0; + m.seeker_elev = 0; + m.seeker_head = 0; + m.seam_scan = 0; + m.cooling_last_time = 0; + m.cool_total_time = 0; + + # + # Emesary damage system + # + m.noti_time = 1.5;#2xsend freq of emesary notifications + m.last_noti = -2; + + # + # Aerodynamics and propulsion + # + m.density_alt_diff = 0; + m.max_g_current = m.max_g; + m.old_speed_horz_fps = nil; + m.old_speed_fps = 0; + m.g = 0; + m.limitGs = 0; + m.limitHalfGs = 0; + m.speed_down_fps = nil; + m.speed_east_fps = nil; + m.speed_north_fps = nil; + m.speed_horizontal_fps = nil; + m.alt_ft = nil; + m.pitch = nil; + m.hdg = nil; + m.thrust_lbf = 0; + m.myG = 0; + + # + # Simulation + # + m.last_dt = 0; + m.counter_last = -2; + m.counter = 0; + m.life_time = 0; + + # + # Fuse + # + m.crc_frames_look_back = 2; + m.crc_coord = []; + m.crc_t_coord = []; + m.crc_range = []; + setsize(m.crc_coord, m.crc_frames_look_back + 1); + setsize(m.crc_t_coord, m.crc_frames_look_back + 1); + setsize(m.crc_range, m.crc_frames_look_back + 1); + + # + # navigation and guidance + # + m.last_track_e = 0; + m.last_track_h = 0; + m.guiding = 1; + m.t_alt = 0; + m.dist_curr = 0; + m.dist_curr_direct = -1; + m.t_elev_deg = 0; + m.t_course = 0; + m.t_heading = nil; + m.t_pitch = nil; + m.t_speed_fps = nil; + m.dist_last = nil; + m.dist_direct_last = nil; + m.last_t_course = nil; + m.last_t_elev_deg = nil; + m.last_cruise_or_loft = 0; + m.last_t_norm_speed = nil; + m.last_t_elev_norm_speed = nil; + m.dive_token = 0; + m.raw_steer_signal_elev = 0; + m.raw_steer_signal_head = 0; + m.cruise_or_loft = 0; + m.curr_deviation_e = 0; + m.curr_deviation_h = 0; + m.track_signal_e = 0; + m.track_signal_h = 0; + m.remote_control_yaw = 0; + m.remote_control_pitch = 0; + m.prevTarget = nil; + m.prevGuidance = nil; + m.keepPitch = 0; + m.horz_closing_rate_fps = -1; + m.vert_closing_rate_fps = -1; + m.usingTGPPoint = 0; + m.rotate_token = 0; + m.CREv = 0; + m.CREh = 0; + m.CREv_old = 0; + m.CREh_old = 0; + m.CRE_old_dt = 0.05; + m.steer_for_free = 0; + + + + # + # Terrain following + # + m.nextGroundElevation = 0; # next Ground Elevation + m.nextGroundElevationMem = [-10000, -1]; + m.terrainStage = 0; + + # + # Rail + # + m.rail_passed = 0; + m.x = 0; + m.y = 0; + m.z = 0; + m.rail_pos = 0; + m.rail_speed_into_wind = 0; + m.rail_passed_time = nil; + m.deploy = 0; + + # + # stats + # + m.maxFPS = 0; + m.maxMach = 0; + m.maxMach1 = 0;#stage 1 + m.maxMach2 = 0;#stage 2 + m.maxMach3 = 0;#stage 3 + m.maxMach4 = 0;#stage 3 end + m.energyBleedKt = 0; + + # + # Counter-measure response + # + m.flareLast = 0; + m.flareTime = 0; + m.flareLock = 0; + m.chaffLast = 0; + m.chaffTime = 0; + m.chaffLock = 0; + m.chaffLockTime = -1000; + m.flarespeed_fps = nil; + + # + # Telemetry + # + m.first = 0; + + # + # these are used for limiting debugging spam + # + m.heatLostLock = 0; + m.semiLostLock = 0; + m.radLostLock = 0; + m.tooLowSpeed = 0; + m.tooLowSpeedPass = 0; + m.tooLowSpeedTime = -1; + m.lostLOS = 0; + + + # + # LOAL + # + m.newTargetAssigned = 0; + m.switchIndex = 0; + m.hasGuided = 0; + m.fovLost = 0; + m.maddog = 0; + m.nextFovCheck = m.switchTime; + m.observing = m.guidance; + + # + # Sound + # + m.SwSoundOnOff.setBoolValue(0); + m.SwSoundVol.setDoubleValue(m.vol_search); + m.pendingLaunchSound = -1; + m.explodeSound = 1; + + + + + m.standby();# these loops will run until released or deleted. + + #for multithreading + m.frameToggle = thread.newsem(); + m.myMath = {parents:[vector.Math],};#personal vector library, to avoid using a mutex on it. + + return AIM.active[m.ID] = m; + }, + + del: func { + # can be called at any time, before or during flight. + # + # stop semaphore counting up, and escape flight loop if its running. + # + # Note: Must never be called from the flight loop thread. + # + me.printCode("deleted weapon"); + if (me["frameLoop"] != nil) { + me.frameLoop.stop(); + me.frameLoop = nil; + } + me.deleted = 1; + thread.semup(me.frameToggle); + if (me.first) { + me.resetFirst(); + } + me.model.remove(); + me.ai.remove(); + if (me.status == MISSILE_FLYING) { + delete(AIM.flying, me.flyID); + if (me.tacview_support) { + if (tacview.starttime) { + thread.lock(tacview.mutexWrite); + tacview.write("#" ~ (systime() - tacview.starttime)~"\n"); + tacview.write("0,Event=Destroyed|"~me.tacviewID~"\n"); + tacview.write("-"~me.tacviewID~"\n"); + thread.unlock(tacview.mutexWrite); + } + } + if(getprop("payload/armament/msg")) { + thread.lock(mutexTimer); + #lat,lon,alt,rdar,typeID,typ,unique,thrustOn,callsign, heading, pitch, speed, is_deleted=0 + append(AIM.timerQueue, [AIM, AIM.notifyInFlight, [nil, -1, -1, 0, 0, me.typeID, "delete()", me.unique_id, 0,"", 0, 0, 0, 1], -1]); + thread.unlock(mutexTimer); + } + } else { + delete(AIM.active, me.ID); + } + AIM.setETA(nil); + me.SwSoundVol.setDoubleValue(0); + }, + + getCCRP: func (maxFallTime_sec, timeStep) { + # returns distance in meters to ideal release time. + # + # maxFallTime_sec: maximum allowed predicted falltime. Higher value will make method take more CPU time. + # timeStep: Fidelity of prediction. Lower value will increase CPU consumption. + # + # Assumptions: + # Ordnance do not have propulsion + # Ordnance has very limited steering + if (me.status != MISSILE_LOCK or me.Tgt == nil) { + return nil; + } + me.ccrp_agl = (getprop("position/altitude-ft")-me.Tgt.get_altitude())*FT2M; + #me.agl = getprop("position/altitude-agl-ft")*FT2M; + me.ccrp_alti = getprop("position/altitude-ft")*FT2M; + me.ccrp_roll = getprop("orientation/roll-deg"); + me.ccrp_vel = getprop("velocities/groundspeed-kt")*0.5144;#m/s + me.ccrp_dens = getprop("sim/flight-model") == "jsb"?getprop("fdm/jsbsim/atmosphere/density-altitude"):getprop("position/altitude-ft"); + me.ccrp_mach = getprop("velocities/mach"); + me.ccrp_speed_down_fps = getprop("velocities/speed-down-fps"); + me.ccrp_speed_east_fps = getprop("velocities/speed-east-fps"); + me.ccrp_speed_north_fps = getprop("velocities/speed-north-fps"); + if (me.eject_speed != 0 and !me.rail) { + # add ejector speed down from belly: + me.aircraft_vec = [me.ccrp_speed_north_fps,-me.ccrp_speed_east_fps,-me.ccrp_speed_down_fps]; + me.eject_vec = me.myMath.normalize(me.myMath.eulerToCartesian3Z(-OurHdg.getValue(),OurPitch.getValue(),OurRoll.getValue())); + me.eject_vec = me.myMath.product(-me.eject_speed, me.eject_vec); + me.init_rel_vec = me.myMath.plus(me.aircraft_vec, me.eject_vec); + me.ccrp_speed_down_fps = -me.init_rel_vec[2]; + me.ccrp_speed_east_fps = -me.init_rel_vec[1]; + me.ccrp_speed_north_fps = me.init_rel_vec[0]; + } + + me.ccrp_t = 0.0; + + me.ccrp_altC = me.ccrp_agl; + me.ccrp_vel_z = -me.ccrp_speed_down_fps*FT2M;#positive upwards + me.ccrp_fps_z = -me.ccrp_speed_down_fps; + me.ccrp_vel_x = math.sqrt(me.ccrp_speed_east_fps*me.ccrp_speed_east_fps+me.ccrp_speed_north_fps*me.ccrp_speed_north_fps)*FT2M; + me.ccrp_fps_x = me.ccrp_vel_x * M2FT; + + me.ccrp_rs = me.rho_sndspeed(me.ccrp_dens-(me.ccrp_agl/2)*M2FT); + me.ccrp_rho = me.ccrp_rs[0]; + me.ccrp_Cd = me.drag(me.ccrp_mach); + me.ccrp_mass = me.weight_launch_lbm * LBM2SLUGS; + me.ccrp_q = 0.5 * me.ccrp_rho * me.ccrp_fps_z * me.ccrp_fps_z; + me.ccrp_deacc = (me.ccrp_Cd * me.ccrp_q * me.ref_area_sqft) / me.ccrp_mass; + + while (me.ccrp_altC > 0 and me.ccrp_t <= maxFallTime_sec) { + me.ccrp_t += timeStep; + me.ccrp_acc = -9.81 + me.ccrp_deacc * FT2M; + me.ccrp_vel_z += me.ccrp_acc * timeStep; + me.ccrp_altC = me.ccrp_altC + me.ccrp_vel_z*timeStep+0.5*me.ccrp_acc*timeStep*timeStep; + } + #printf("predict fall time=%0.1f", me.t); + + if (me.ccrp_t >= maxFallTime_sec) { + return nil; + } + + me.ccrp_q = 0.5 * me.ccrp_rho * me.ccrp_fps_x * me.ccrp_fps_x; + me.ccrp_deacc = (me.ccrp_Cd * me.ccrp_q * me.ref_area_sqft) / me.ccrp_mass; + me.ccrp_acc = -me.ccrp_deacc * FT2M; + + me.ccrp_fps_x_final = me.ccrp_t*me.ccrp_acc+me.ccrp_fps_x;# calc final horz speed + me.ccrp_fps_x_average = (me.ccrp_fps_x-(me.ccrp_fps_x-me.ccrp_fps_x_final)*0.5); + me.ccrp_mach_average = me.ccrp_fps_x_average / me.ccrp_rs[1]; + + me.ccrp_Cd = me.drag(me.ccrp_mach_average); + me.ccrp_q = 0.5 * me.ccrp_rho * me.ccrp_fps_x_average * me.ccrp_fps_x_average; + me.ccrp_deacc = (me.ccrp_Cd * me.ccrp_q * me.ref_area_sqft) / me.ccrp_mass; + me.ccrp_acc = -me.ccrp_deacc * FT2M; + me.ccrp_dist = me.ccrp_vel_x*me.ccrp_t+0.5*me.ccrp_acc*me.ccrp_t*me.ccrp_t; + + me.ccrp_ac = geo.aircraft_position(); + me.ccrpPos = geo.Coord.new(me.ccrp_ac); + + # we calc heading from composite speeds, due to alpha and beta might influence direction bombs will fall: + me.ccrp_heading = geo.normdeg(math.atan2(me.ccrp_speed_east_fps,me.ccrp_speed_north_fps)*R2D); + me.ccrpPos.apply_course_distance(me.ccrp_heading, me.ccrp_dist); + + #printf("Will fall %0.1f NM ahead of aircraft.", me.dist*M2NM); + me.ccrp_elev = me.ccrp_alti-me.ccrp_agl;#faster + me.ccrpPos.set_alt(me.ccrp_elev); + + me.ccrp_distCCRP = me.ccrpPos.distance_to(me.Tgt.get_Coord()); + return me.ccrp_distCCRP; + }, + + getCCIPadv: func (maxFallTime_sec, timeStep) { + # for non flat areas. Lower falltime or higher timestep means using less CPU time. + # returns nil for higher than maxFallTime_sec. Else a vector with [Coord, hasTimeToArm]. + me.ccip_altC = getprop("position/altitude-ft")*FT2M; + me.ccip_dens = getprop("fdm/jsbsim/atmosphere/density-altitude"); + me.ccip_speed_down_fps = getprop("velocities/speed-down-fps"); + me.ccip_speed_east_fps = getprop("velocities/speed-east-fps"); + me.ccip_speed_north_fps = getprop("velocities/speed-north-fps"); + if (me.eject_speed != 0 and !me.rail) { + # add ejector speed down from belly: + me.aircraft_vec = [me.ccip_speed_north_fps,-me.ccip_speed_east_fps,-me.ccip_speed_down_fps]; + me.eject_vec = me.myMath.normalize(me.myMath.eulerToCartesian3Z(-OurHdg.getValue(),OurPitch.getValue(),OurRoll.getValue())); + me.eject_vec = me.myMath.product(-me.eject_speed, me.eject_vec); + me.init_rel_vec = me.myMath.plus(me.aircraft_vec, me.eject_vec); + me.ccip_speed_down_fps = -me.init_rel_vec[2]; + me.ccip_speed_east_fps = -me.init_rel_vec[1]; + me.ccip_speed_north_fps = me.init_rel_vec[0]; + } + + me.ccip_t = 0.0; + me.ccip_dt = timeStep; + me.ccip_fps_z = -me.ccip_speed_down_fps; + me.ccip_fps_x = math.sqrt(me.ccip_speed_east_fps*me.ccip_speed_east_fps+me.ccip_speed_north_fps*me.ccip_speed_north_fps); + me.ccip_bomb = me; + + me.ccip_rs = me.ccip_bomb.rho_sndspeed(getprop("sim/flight-model") == "jsb"?me.ccip_dens:me.ccip_altC*M2FT); + me.ccip_rho = me.ccip_rs[0]; + me.ccip_mass = me.ccip_bomb.weight_launch_lbm * LBM2SLUGS; + + me.ccipPos = geo.Coord.new(geo.aircraft_position()); + + # we calc heading from composite speeds, due to alpha and beta might influence direction bombs will fall: + if(me.ccip_fps_x == 0) return nil; + me.ccip_heading = geo.normdeg(math.atan2(me.ccip_speed_east_fps,me.ccip_speed_north_fps)*R2D); + #print(); + #printf("CCIP %.1f", me.ccip_heading); + me.ccip_pitch = math.atan2(me.ccip_fps_z, me.ccip_fps_x); + while (me.ccip_t <= maxFallTime_sec) { + me.ccip_t += me.ccip_dt; + me.ccip_bomb.deploy = me.clamp(me.extrapolate(me.ccip_t, me.drop_time, me.drop_time+me.deploy_time,0,1),0,1); + # Apply drag + me.ccip_fps = math.sqrt(me.ccip_fps_x*me.ccip_fps_x+me.ccip_fps_z*me.ccip_fps_z); + if (me.ccip_fps==0) return nil; + me.ccip_q = 0.5 * me.ccip_rho * me.ccip_fps * me.ccip_fps; + me.ccip_mach = me.ccip_fps / me.ccip_rs[1]; + me.ccip_Cd = me.ccip_bomb.drag(me.ccip_mach); + me.ccip_deacc = (me.ccip_Cd * me.ccip_q * me.ccip_bomb.ref_area_sqft) / me.ccip_mass; + me.ccip_fps -= me.ccip_deacc*me.ccip_dt; + + # new components and pitch + me.ccip_fps_z = me.ccip_fps*math.sin(me.ccip_pitch); + me.ccip_fps_x = me.ccip_fps*math.cos(me.ccip_pitch); + me.ccip_fps_z -= g_fps * me.ccip_dt; + me.ccip_pitch = math.atan2(me.ccip_fps_z, me.ccip_fps_x); + + # new position + me.ccip_altC = me.ccip_altC + me.ccip_fps_z*me.ccip_dt*FT2M; + me.ccip_dist = me.ccip_fps_x*me.ccip_dt*FT2M; + me.ccip_oldPos = geo.Coord.new(me.ccipPos); + me.ccipPos.apply_course_distance(me.ccip_heading, me.ccip_dist); + me.ccipPos.set_alt(me.ccip_altC); + + # test terrain + me.ccip_grnd = geo.elevation(me.ccipPos.lat(),me.ccipPos.lon()); + if (me.ccip_grnd != nil) { + if (me.ccip_grnd > me.ccip_altC) { + #return [me.ccipPos,me.arming_time 0 and me.ccip_t <= maxFallTime_sec) {#20 secs is max fall time + me.ccip_t += me.ccip_dt; + me.ccip_acc = -9.81 + me.ccip_deacc * FT2M; + me.ccip_vel_z += me.ccip_acc * me.ccip_dt; + me.ccip_altC = me.ccip_altC + me.ccip_vel_z*me.ccip_dt+0.5*me.ccip_acc*me.ccip_dt*me.ccip_dt; + } + #printf("predict fall time=%0.1f", t); + + if (me.ccip_t >= maxFallTime_sec) { + return nil; + } + #t -= 0.75 * math.cos(pitch*D2R); # fudge factor + + me.ccip_q = 0.5 * me.ccip_rho * me.ccip_fps_x * me.ccip_fps_x; + me.ccip_deacc = (me.ccip_Cd * me.ccip_q * me.ccip_bomb.ref_area_sqft) / me.ccip_mass; + me.ccip_acc = -me.ccip_deacc * FT2M; + + me.ccip_fps_x_final = me.ccip_t*me.ccip_acc+me.ccip_fps_x;# calc final horz speed + me.ccip_fps_x_average = (me.ccip_fps_x-(me.ccip_fps_x-me.ccip_fps_x_final)*0.5); + me.ccip_mach_average = me.ccip_fps_x_average / me.ccip_rs[1]; + + me.ccip_Cd = me.ccip_bomb.drag(me.ccip_mach_average); + me.ccip_q = 0.5 * me.ccip_rho * me.ccip_fps_x_average * me.ccip_fps_x_average; + me.ccip_deacc = (me.ccip_Cd * me.ccip_q * me.ccip_bomb.ref_area_sqft) / me.ccip_mass; + me.ccip_acc = -me.ccip_deacc * FT2M; + me.ccip_dist = me.ccip_vel_x*me.ccip_t+0.5*me.ccip_acc*me.ccip_t*me.ccip_t; + + me.ccip_ac = geo.aircraft_position(); + me.ccipPos = geo.Coord.new(me.ccip_ac); + + # we calc heading from composite speeds, due to alpha and beta might influence direction bombs will fall: + me.ccip_heading = geo.normdeg(math.atan2(me.ccip_speed_east_fps,me.ccip_speed_north_fps)*R2D); + me.ccipPos.apply_course_distance(me.ccip_heading, me.ccip_dist); + + me.ccip_elev = me.ccip_alti-me.ccip_agl;#faster + me.ccipPos.set_alt(me.ccip_elev); + return [me.ccipPos,me.arming_time me.maxBearing) { + me.horiz_intercept[1] = me.Tgt.get_bearing() + me.maxBearing; + } elsif (me.relativeBearing < -me.maxBearing) { + me.horiz_intercept[1] = me.Tgt.get_bearing() - me.maxBearing; + } + + return [me.horiz_intercept[1], math.clamp(me.loft_cue, 0, 45)]; # attack-bearing, loft-cue + }, + + get_intercept: func (bearingToRunner, dist_m, runnerHeading, runnerSpeed, chaserSpeed, chaserCoord, chaserHeading) { + # from Leto + # needs: bearingToRunner_deg, dist_m, runnerHeading_deg, runnerSpeed_mps, chaserSpeed_mps, chaserCoord + # dist_m > 0 and chaserSpeed > 0 + + if (dist_m < 500) { + return nil; + } + + me.trigAngle = 90-bearingToRunner; + me.RunnerPosition = [dist_m*math.cos(me.trigAngle*D2R), dist_m*math.sin(me.trigAngle*D2R),0]; + me.ChaserPosition = [0,0,0]; + + me.VectorFromRunner = vector.Math.minus(me.ChaserPosition, me.RunnerPosition); + me.runner_heading = 90-runnerHeading; + me.RunnerVelocity = [runnerSpeed*math.cos(me.runner_heading*D2R), runnerSpeed*math.sin(me.runner_heading*D2R),0]; + + me.a = chaserSpeed * chaserSpeed - runnerSpeed * runnerSpeed; + me.b = 2 * vector.Math.dotProduct(me.VectorFromRunner, me.RunnerVelocity); + me.c = -dist_m * dist_m; + + if ((me.b*me.b-4*me.a*me.c)<0) { + # intercept not possible + return nil; + } + + me.t1 = (-me.b+math.sqrt(me.b*me.b-4*me.a*me.c))/(2*me.a); + me.t2 = (-me.b-math.sqrt(me.b*me.b-4*me.a*me.c))/(2*me.a); + + if (me.t1 < 0 and me.t2 < 0) { + # intercept not possible + return nil; + } + + me.timeToIntercept = 0; + if (me.t1 > 0 and me.t2 > 0) { + me.timeToIntercept = math.min(me.t1, me.t2); + } else { + me.timeToIntercept = math.max(me.t1, me.t2); + } + me.InterceptPosition = vector.Math.plus(me.RunnerPosition, vector.Math.product(me.timeToIntercept, me.RunnerVelocity)); + + me.ChaserVelocity = vector.Math.product(1/me.timeToIntercept, vector.Math.minus(me.InterceptPosition, me.ChaserPosition)); + + me.interceptAngle = vector.Math.angleBetweenVectors([0,1,0], me.ChaserVelocity); + me.interceptHeading = geo.normdeg(me.ChaserVelocity[0]<0?-me.interceptAngle:me.interceptAngle); + + me.interceptDist = chaserSpeed*me.timeToIntercept; + + me.interceptCoord = geo.Coord.new(chaserCoord); + me.interceptCoord = me.interceptCoord.apply_course_distance(me.interceptHeading, me.interceptDist); + me.interceptRelativeBearing = geo.normdeg180(me.interceptHeading-chaserHeading); + + return [me.timeToIntercept, me.interceptHeading, me.interceptCoord, me.interceptDist, me.interceptRelativeBearing]; + }, + + setContacts: func (vect) { + # sets a vector of contacts the weapons will try to lock onto + # Before launch: for heatseekers in bore or unslaved mode + # do NOT call this after launch + # see also release(vect) + if (me.status == MISSILE_FLYING) return; + me.contacts = vect; + }, + + commandDir: func (heading_deg, pitch_deg) { + # commands are relative to aircraft bore + if (me.status == MISSILE_FLYING) return; + if (vector.Math.angleBetweenVectors(vector.Math.eulerToCartesian2(-heading_deg, pitch_deg), [1,0,0]) <= me.fcs_fov) { + me.command_dir_heading = heading_deg; + me.command_dir_pitch = pitch_deg; + me.slave_to_radar = 0; + } + me.printCode("Bore/dir command: heading %0.1f pitch %0.1f", heading_deg, pitch_deg); + }, + + commandRadar: func (idle_heading = 0, idle_elevation = 0) { + # command that radar is looking at a target, slave to that. + if (!me.seam_support or me.status == MISSILE_FLYING) return; + if (me.status != MISSILE_LOCK) { + me.command_dir_heading = idle_heading; + me.command_dir_pitch = idle_elevation; + } + me.slave_to_radar = 1; + me.printCode("Slave radar command. Idle: heading %0.1f pitch %0.1f", idle_heading, idle_elevation); + }, + + isRadarSlaved: func { + if (me.status == MISSILE_FLYING) return 0; + return me.slave_to_radar; + }, + + setSEAMscan: func (xfov) { + if (!me.seam_support or me.status == MISSILE_FLYING) return; + me.seam_scan = xfov; + }, + + isSEAMscan: func { + return me.seam_scan; + }, + + getWarm: func () { + return me.warm; + }, + + setCooling: func (cooling) { + if (me.status == MISSILE_FLYING) return; + if (me.cooling != cooling) { + me.printCode("Cooling commanded: "~cooling); + me.cooling = cooling; + me.cooling_last_time = 0; + #var time = getprop("sim/time/elapsed-sec"); + } + }, + + isCooling: func () { + return me.cooling; + }, + + start: func { + if (me.status == MISSILE_STANDBY) { + me.status = MISSILE_STARTING; + me.ready_standby_time = getprop("sim/time/elapsed-sec"); + if (me.ready_standby_time == 0) me.ready_standby_time = 0.001; + #printf("start #%3d %s", me.ID, me.type); + } + }, + + stop: func { + if (me.status != MISSILE_FLYING) { + me.status = MISSILE_STANDBY; + #printf("stop #%3d %s", me.ID, me.type); + } + }, + + isCaged: func () { + if (!me.seam_support) return me.status != MISSILE_FLYING; + return me.caged; + }, + + isAutoUncage: func () { + if (!me.seam_support) return 0; + return me.uncage_auto; + }, + + setAutoUncage: func (auto) { + if (!me.seam_support or me.status == MISSILE_FLYING) return; + me.uncage_auto = auto; + me.printCode("Cage auto: "~auto); + }, + + setCaged: func (cage) { + if (!me.seam_support or me.status == MISSILE_FLYING) return; + me.caged = cage; + me.printCode("Cage: "~cage); + }, + + getSeekerInfo: func { + if (me.status == MISSILE_FLYING or me.status == MISSILE_STANDBY) { + return nil; + } + return [me.seeker_head, me.seeker_elev]; + }, + + eject: func () { + if (me.stage_1_duration == 0 or me.force_lbf_1 == 0) { + me.pendingLaunchSound = 0; + } + me.stage_1_duration = 0; + me.force_lbf_1 = 0; + me.stage_2_duration = 0; + me.force_lbf_2 = 0; + me.stage_3_duration = 0; + me.force_lbf_3 = 0; + me.stage_gap_duration = 0; + me.drop_time = 10000; + me.inert = 1; + me.engineEnabled = 0; + me.guidanceEnabled = 0; + me.rail = 0; + me.releaseAtNothing(); + }, + + releaseAtNothing: func() { + me.Tgt = nil; + me.release(); + }, + + release: func(vect=nil) { + # Release missile/bomb from its pylon/rail/tube and send it away. + # + me.release = nil;# no calling this method twice + me.elapsed_last = systime(); + me.status = MISSILE_FLYING; + + if (vect!= nil) { + + # sets a vector of contacts the weapons will try to lock onto + # For LOAL weapons. + # see also setContacts() + me.contacts = vect; + } else { + me.contacts = []; + } + me.launchSoundProp.setBoolValue(0); + + if (me.engineEnabled and me.stage_1_duration > 0 and me.force_lbf_1 > 0 and me.drop_time < 1.75) { + me.pendingLaunchSound = me.drop_time; + } elsif (me.drop_time != 10000 and (!me.engineEnabled or me.stage_1_duration == 0 or me.force_lbf_1 == 0)) { + me.pendingLaunchSound = 0; + } + + me.flyID = rand(); + AIM.flying[me.flyID] = me; + delete(AIM.active, me.ID); + me.animation_flags_props(); + + # Get the A/C position and orientation values. + me.ac = geo.aircraft_position(); + me.ac_init = geo.Coord.new(me.ac); + var ac_roll = OurRoll.getValue();# positive is banking right + var ac_pitch = OurPitch.getValue(); + var ac_hdg = OurHdg.getValue(); + + me.msl_hdg = ac_hdg; + me.msl_pitch = ac_pitch; + + if (me.rail) { + if (!me.rail_forward) { + me.position_on_rail = 0; + #if (me.rail_pitch_deg == 90 and me.Tgt != nil) { + # This only really works for surface launchers which is not rolled + # me.rail_head_deg = me.Tgt.get_bearing()-OurHdg.getValue(); + #} + me.railvec = vector.Math.eulerToCartesian3X(-me.rail_head_deg, me.rail_pitch_deg,0); + me.veccy = vector.Math.rollPitchYawVector(ac_roll,ac_pitch,-ac_hdg,me.railvec); + me.carty = vector.Math.cartesianToEuler(me.veccy); + me.msl_pitch = me.carty[1]; + me.defaultHeading = me.Tgt != nil?me.Tgt.get_bearing():0;#90 deg tubes align to target heading, else north + me.msl_hdg = (me.carty[0]==nil or (ac_roll == 0 and me.rail_pitch_deg == 90))?me.defaultHeading:me.carty[0]; + } + } + + # Compute missile initial position relative to A/C center + if (me.nasalPosition == nil) { + me.x = me.pylon_prop.getNode("offsets/x-m").getValue(); + me.y = me.pylon_prop.getNode("offsets/y-m").getValue(); + me.z = me.pylon_prop.getNode("offsets/z-m").getValue(); + } else { + me.x = me.nasalPosition[0]; + me.y = me.nasalPosition[1]; + me.z = me.nasalPosition[2]; + } + var init_coord = nil; + if (me.rail) { + if (!me.rail_forward) { + me.railBegin = [-me.x, -me.y, me.z]; + me.railEnd = vector.Math.plus(me.railBegin, vector.Math.product(me.rail_dist_m, me.railvec)); + } + } + if (offsetMethod and (!me.rail or me.rail_forward)) { + var pos = aircraftToCart({x:-me.x, y:me.y, z: -me.z}); + init_coord = geo.Coord.new(); + init_coord.set_xyz(pos.x, pos.y, pos.z); + } else { + init_coord = me.getGPS(me.x, me.y, me.z, ac_pitch, ac_hdg); + } + + + # Set submodel initial position: + var mlat = init_coord.lat(); + var mlon = init_coord.lon(); + var malt = init_coord.alt() * M2FT; + + me.coord = geo.Coord.new(init_coord); + # Get target position. + if (me.Tgt != nil) { + if (me.Tgt == contactPoint) { + me.usingTGPPoint = 1; + } + me.t_coord = me.Tgt.get_Coord(); + me.maddog = 0; + me.newTargetAssigned = 1; + } else { + me.maddog = 1; + } + + me.model.getNode("latitude-deg-prop", 1).setValue(me.latN.getPath()); + me.model.getNode("longitude-deg-prop", 1).setValue(me.lonN.getPath()); + me.model.getNode("elevation-ft-prop", 1).setValue(me.altN.getPath()); + me.model.getNode("heading-deg-prop", 1).setValue(me.hdgN.getPath()); + me.model.getNode("pitch-deg-prop", 1).setValue(me.pitchN.getPath()); + me.model.getNode("roll-deg-prop", 1).setValue(me.rollN.getPath()); + var loadNode = me.model.getNode("load", 1); + loadNode.setBoolValue(1); + + # Get initial velocity vector (aircraft): + me.speed_down_fps = getprop("velocities/speed-down-fps"); + me.speed_east_fps = getprop("velocities/speed-east-fps"); + me.speed_north_fps = getprop("velocities/speed-north-fps"); + me.speed_horizontal_fps = math.sqrt(me.speed_east_fps*me.speed_east_fps + me.speed_north_fps*me.speed_north_fps); + if (me.rail) { + if (!me.rail_forward) { + # TODO: add side wind here too since rail can now have heading offset too. + me.u = noseAir.getValue(); + me.w = -belowAir.getValue(); + me.rail_speed_into_wind = me.u*math.cos(me.rail_pitch_deg*D2R)+me.w*math.sin(me.rail_pitch_deg*D2R); + } else { + # rail is pointing forward + me.rail_speed_into_wind = noseAir.getValue(); + #printf("Rail: ac_fps=%d uBody_fps=%d", math.sqrt(me.speed_down_fps*me.speed_down_fps+math.pow(math.sqrt(me.speed_east_fps*me.speed_east_fps+me.speed_north_fps*me.speed_north_fps),2)), me.rail_speed_into_wind); + } + } elsif (!me.intoBore and me.eject_speed == 0) { + # to prevent the missile to appear falling up, we need to sometimes pitch it into wind: + #var t_spd = math.sqrt(me.speed_down_fps*me.speed_down_fps + h_spd*h_spd); + var wind_pitch = math.atan2(-me.speed_down_fps, me.speed_horizontal_fps) * R2D; + if (wind_pitch < me.msl_pitch) { + # super hack, and might temporary as missile leaves launch platform look stupid: + me.msl_pitch = wind_pitch; + # this should really take place over a duration instead of instantanious. + } + if (me.speed_horizontal_fps != 0) { + # will turn weapon into wind + # (not sure this is a good idea..might lose lock immediatly if firing with a big AoA, + # but then on other hand why would you do that, unless in dogfight, and there you use aim9 anyway, + # which is always on rails, and dont have this issue) + # + # what if heavy cross wind and fires level. Then it can fly maybe 10 degs offbore, and will likely lose its lock. + # + msl_hdg = geo.normdeg(math.atan2(me.speed_east_fps,me.speed_north_fps)*R2D); + } + } elsif (me.eject_speed != 0) { + # add ejector speed down from belly: + if (me.force_lbf_1 > 0 and me.stage_1_duration > 0) { + # for missiles + # + # So we cheat a bit and pretend the aircraft groundspeed is in its nose direction instead of into airstream. + # We do this cause the missile has no alpha/beta and when firing in hard turn alpha can easy be 15+ degs, + # so the missile would otherwise be pointed much further from target that the pilot intends. + me.aircraft_vec = me.myMath.eulerToCartesian3X(-OurHdg.getValue(),OurPitch.getValue(),OurRoll.getValue()); + me.aircraft_vec = me.myMath.normalize(me.aircraft_vec); + me.aircraft_fps = math.sqrt(math.pow(math.sqrt(math.pow(me.speed_north_fps,2)+math.pow(me.speed_east_fps,2)),2)+math.pow(me.speed_down_fps,2)); + me.aircraft_vec = me.myMath.product(me.aircraft_fps, me.aircraft_vec); + } else { + # for bombs + me.aircraft_vec = [me.speed_north_fps,-me.speed_east_fps,-me.speed_down_fps]; + } + me.eject_vec = me.myMath.normalize(me.myMath.eulerToCartesian3Z(-OurHdg.getValue(),OurPitch.getValue(),OurRoll.getValue())); + me.eject_vec = me.myMath.product(-me.eject_speed, me.eject_vec); + me.init_rel_vec = me.myMath.plus(me.aircraft_vec, me.eject_vec); + me.speed_down_fps = -me.init_rel_vec[2]; + me.speed_east_fps = -me.init_rel_vec[1]; + me.speed_north_fps = me.init_rel_vec[0]; + me.msl_hdg = geo.normdeg(math.atan2(me.speed_east_fps,me.speed_north_fps)*R2D); + me.msl_pitch = math.atan2(-me.speed_down_fps, math.sqrt(me.speed_east_fps*me.speed_east_fps+me.speed_north_fps*me.speed_north_fps))*R2D; + } + + me.alt_ft = malt; + me.pitch = me.msl_pitch; + me.hdg = me.msl_hdg; + + me.latN.setDoubleValue(mlat); + me.lonN.setDoubleValue(mlon); + me.altN.setDoubleValue(malt); + me.hdgN.setDoubleValue(me.msl_hdg); + me.pitchN.setDoubleValue(me.msl_pitch); + me.rollN.setDoubleValue(0); + + me.keepPitch = me.pitch; + + if (getprop("sim/flight-model") == "jsb") { + # currently not supported in Yasim + me.density_alt_diff = getprop("fdm/jsbsim/atmosphere/density-altitude") - me.ac.alt()*M2FT; + } + + # setup lofting and cruising + me.snapUp = me.loft_alt > 10000; + + me.SwSoundVol.setDoubleValue(0); + #me.trackWeak = 1; + if (use_fg_default_hud) { + settimer(func { HudReticleDeg.setValue(0) }, 2); + interpolate(HudReticleDev, 0, 2); + } + + me.startMach = getprop("velocities/mach"); + me.startFPS = getprop("velocities/groundspeed-kt")*KT2FPS; + me.startAlt = getprop("position/altitude-ft"); + me.startDist = -1; + me.maxAlt = me.startAlt; + if (me.Tgt != nil) { + me.startDist = me.ac_init.direct_distance_to(me.Tgt.get_Coord()); + } + me.printStats("Launch %s at %s.", me.type, me.callsign); + + me.weight_current = me.weight_launch_lbm; + me.mass = me.weight_launch_lbm * LBM2SLUGS; + + # find the fuel consumption - lbm/sec + var impulse1 = me.force_lbf_1 * me.stage_1_duration; # lbf*s + var impulse2 = me.force_lbf_2 * me.stage_2_duration; # lbf*s + var impulse3 = me.force_lbf_3 * me.stage_3_duration; # lbf*s + me.impulseT = impulse1 + impulse2 + impulse3; # lbf*s + me.fuel_per_impulse = me.weight_fuel_lbm / me.impulseT;# lbm/(lbf*s) + me.fuel_per_sec_1 = me.stage_1_duration == 0?0:(me.fuel_per_impulse * impulse1) / me.stage_1_duration;# lbm/s + me.fuel_per_sec_2 = me.stage_2_duration == 0?0:(me.fuel_per_impulse * impulse2) / me.stage_2_duration;# lbm/s + me.fuel_per_sec_3 = me.stage_3_duration == 0?0:(me.fuel_per_impulse * impulse3) / me.stage_3_duration;# lbm/s + + me.printExtendedStats(); + + + # find the sun: + var sun_x = getprop("ephemeris/sun/local/x"); + var sun_y = getprop("ephemeris/sun/local/y");# unit vector pointing to sun in geocentric coords + var sun_z = getprop("ephemeris/sun/local/z"); + if (sun_x != nil) { + me.sun_enabled = 1; + me.sun = geo.Coord.new(); + me.sun.set_xyz(me.ac_init.x()+sun_x*2000000, me.ac_init.y()+sun_y*2000000, me.ac_init.z()+sun_z*2000000);#heat seeking missiles don't fly far, so setting it 2000Km away is fine. + me.sun.alt();# TODO: once fixed in FG this line is no longer needed. + } else { + # old FG versions does not supply location of sun. So this feature gets disabled. + me.sun_enabled = 0; + } + + me.lock_on_sun = 0; + + loadNode.remove(); + + # lets run the main flight loop in its own thread: + var frameTrigger = func { + thread.semup(me.frameToggle); + } + me.frameLoop = maketimer(0, frameTrigger); + me.frameLoop.simulatedTime = 1;# Prevents paused sim from triggering update + me.frameLoop.start(); + spawn(me.flight, me)(); +# me.ai.getNode("valid").setBoolValue(1); is now done at end of first flight update. + }, + + ################################################## DO NOT EXTERNALLY CALL ANYTHING BELOW THIS LINE ################################### + + printExtendedStats: func { + if (!DEBUG_STATS) return; + + var classes = ""; + var classesSep = ""; + if (me.target_air) { + classes = classes~"Airborne"; + classesSep = ", "; + } + if (me.target_gnd) { + classes = classes~classesSep~"Ground"; + classesSep = ", "; + } + if (me.target_sea) { + classes = classes~classesSep~"Ship"; + classesSep = ", "; + } + if (me.target_pnt) { + classes = classes~classesSep~"TGP point"; + } + var cooling = me.coolable?"YES":"NO"; + var rea = me.reaquire?"YES":"NO"; + var asp = ""; + if (me.guidance=="heat") { + if (!me.all_aspect) { + asp = "Rear aspect only."; + } else { + asp = "All aspect."; + } + } + var nav = ""; + var nav2 = ""; + if (me.guidanceLaw == "LOS") { + nav = "Line-of-sight"; + } elsif (me.guidanceLaw == "direct") { + nav = "Pure pursuit."; + } elsif (me.guidanceLaw == "direct-alt") { + nav = "Pure pursuit with altitude hold."; + } elsif (me.guidanceLaw == "OPN") { + nav = "Original Proportional navigation. Proportionality constant is "~me.pro_constant; + } elsif (me.guidanceLaw == "PN") { + nav = "Proportional navigation. Proportionality constant is "~me.pro_constant; + } elsif (me.guidanceLaw == "APN") { + nav = "Augmented proportional navigation. Proportionality constant is "~me.pro_constant; + } elsif (me.guidanceLaw == "GPN") { + nav = "Augmented proportional navigation. Proportionality constant is "~me.pro_constant~" for lateral and "~(wingedGuideFactor*me.pro_constant)~" for longitudal"; + } elsif (left(me.guidanceLaw,2) == "PN") { + nav = "Proportional navigation. Proportionality constant is "~me.pro_constant; + var xxyy = right(me.guidanceLaw,4); + var yy = right(xxyy,2); + var xx = left(xxyy,2); + nav2 = sprintf("Before PN it will aim %d degrees above target for %d seconds.",xx,yy); + } elsif (left(me.guidanceLaw,3) == "APN") { + nav = "Augmented proportional navigation. Proportionality constant is "~me.pro_constant; + var xxyy = right(me.guidanceLaw,4); + var yy = right(xxyy,2); + var xx = left(xxyy,2); + nav2 = sprintf("Before APN it will aim %d degrees above target for %d seconds.",xx,yy); + } + var stages = 0; + if (me.force_lbf_1 > 0 and me.stage_1_duration > 0 and me.force_lbf_2 > 0 and me.stage_2_duration > 0 and me.force_lbf_3 > 0 and me.stage_3_duration > 0) { + stages = 3; + } elsif (me.force_lbf_1 > 0 and me.stage_1_duration > 0 and me.force_lbf_2 > 0 and me.stage_2_duration > 0) { + stages = 2; + } elsif (me.force_lbf_1 > 0 and me.stage_1_duration > 0) { + stages = 1; + } + var vector = "No vectored thrust."; + if (me.vector_thrust) { + vector = "Vectored thrust."; + } + + + me.printStats("****************************************************"); + me.printStats("Stats for %s", me.typeLong); + me.printStats("Damage ID is %d, notification ID is %d, unique ID is %d", me.typeID, me.typeID+21,me.unique_id); + me.printStats("DETECTION AND FIRING:"); + me.printStats("Fire range %.1f-%.1f NM", me.min_fire_range_nm, me.max_fire_range_nm); + if (me.expand_min) { + me.printStats("Min fire range will expand with closing rate."); + } + me.printStats("Can be fired againts %s targets", classes); + me.printStats("Pilot will call out %s when firing.",me.brevity); + me.printStats("Launch platform detection field of view is +-%d degrees.",me.fcs_fov); + if (me.guidance =="heat") { + me.printStats("Seekerhead beam width is %.1f degrees radius.",me.beam_width_deg); + } + me.printStats("Weapons takes %.1f seconds to get ready.",me.ready_time); + me.printStats("Cooling supported: %s",cooling); + if (me.coolable) { + me.printStats("Time to cool %.1f seconds. Can be kept cool for %d seconds.",me.cool_time,me.cool_duration); + me.printStats("Max detect range when warm is %.1f NM, when cold %.1f NM.",me.warm_detect_range_nm, me.cold_detect_range_nm); + me.printStats("Current temperature is %d%%, which means seeker detection range of %.1f NM.", me.warm*100, me.detect_range_curr_nm); + } + if (me.maddog) { + me.printStats("Has currently no lock on anything."); + } + if (me.loal) { + me.printStats("Lock on after launch supported if fired without lock."); + } else { + me.printStats("Lock on after launch disabled."); + } + if (me.canSwitch and me.reaquire) { + me.printStats("Can switch target mid-flight by itself. Number of targets to choose from: "~size(me.contacts)); + } else { + me.printStats("Will not switch target mid-flight by itself."); + } + if (me.loal or (me.canSwitch and me.reaquire)) { + me.printStats("Takes %.1f seconds to scan FoV, while flying, for new target.", me.switchTime); + } + if (me.radarOrigin) { + me.printStats("Radar in launch vehicle is located inside vehicle at origin."); + } else { + me.printStats("Radar in launch vehicle is located inside vehicle coord system at position %.2f,%.2f,%.2f meters.", me.radarX, me.radarY, me.radarZ); + } + if (me.noCommonTarget) { + me.printStats("This weapon can not use armament.contact as target, it must be set explicit [setContacts(contacts) or release(contacts)] instead."); + } + me.printStats("NAVIGATION AND GUIDANCE:"); + if (!me.guidanceEnabled) { + me.printStats("All guidance has been disabled, the weapon will not guide."); + } else { + me.printStats("Weapon field of view is +-%d degrees.",me.max_seeker_dev); + me.printStats("Is %s guided. %s",me.guidance,asp); + if (me.loal or (me.canSwitch and me.reaquire)) { + me.printStats("When looking for target it is navigating by %s.", me.standbyFlight); + } + me.printStats("Guidance law: %s",nav); + if (nav2 != "") { + me.printStats(nav2); + } + me.printStats("Will attempt to reaquire target if its lost: %s",rea); + if (me.guidance=="heat" or me.guidance=="vision") { + me.printStats("Seeker is able to track targets moving in its FoV at %.1f degrees per second.",me.angular_speed); + } + if (me.guidance=="heat") { + me.printStats("Seeker will lock on sun if it is within %.1f degrees.",me.sun_lock); + } + if (me.loft_alt>10000) { + me.printStats("Weapon will max snap up to %d feet altitude.",me.loft_alt); + } elsif (me.loft_alt<10000 and me.loft_alt!=0) { + if (me.target_sea) { + if (me.follow) { + me.printStats("Weapon will follow terrain keeping %d AGL feet.",me.loft_alt); + } else { + me.printStats("Weapon will sea skim at %d AGL feet.",me.loft_alt); + } + } else { + me.printStats("Weapon will follow terrain keeping %d AGL feet.",me.loft_alt); + } + } else { + me.printStats("Weapon will not snap up, follow terrain or sea skim."); + } + + me.printStats("After propulsion ends, it will max steer up to %d degree pitch.",me.maxPitch); + if(me.Tgt == nil) { + me.printStats("Note: Ordnance was released with no lock or destination target."); + } elsif (me.Tgt["getVirtualType"] != nil) { + me.printStats("Note: Ordnance was released locked on this target type: %s", me.Tgt.getVirtualType()); + } + me.printStats("Seekerheads ability to filter out background noise is %.2f, where 0 is perfect and 3 is not so good.", me.seeker_filter); + me.printStats("Exhaust plume will reduce drag by %d percent.", (1-me.Cd_plume)*100); + if (me.rosette_radius > 0) { + me.printStats("When uncaged and not tracking, seekerhead will do rosette pattern, with %.1f deg radius.", me.rosette_radius); + } else { + me.printStats("When uncaged and not tracking, seekerhead will not do anything useful."); + } + if (me.seam_support) { + me.printStats("The missile support manual cage/uncage and radar slaving, and possibly auto-uncaging."); + if (me.oldPattern) { + me.printStats("If nutation is enabled, the seekerhead will do a double-D pattern."); + } else { + me.printStats("If nutation is enabled, the seekerhead will do a circle pattern."); + } + } else { + me.printStats("The missile does not support manual cage/uncage or radar slaving."); + } + } + if (stages > 0) { + me.printStats("PROPULSION:"); + me.printStats("Stage 1: %d lbf for %.1f seconds. Is %s engine.", me.force_lbf_1, me.stage_1_duration, me.stage_1_jet?"jet":"rocket"); + if (stages > 1) { + me.printStats("Stage 2: %d lbf for %.1f seconds. Is %s engine.", me.force_lbf_2, me.stage_2_duration, me.stage_2_jet?"jet":"rocket"); + if (me.stage_gap_duration > 0) { + me.printStats("Stage 1 to 2 time gap: %.1f seconds.", me.stage_gap_duration); + } + if (stages > 2) { + me.printStats("Stage 3: %d lbf for %.1f seconds. Is %s engine.", me.force_lbf_3, me.stage_3_duration, me.stage_3_jet?"jet":"rocket"); + } + } + me.printStats("%s",vector); + if (!me.weight_fuel_lbm) { + me.printStats("Fuel system not simulated."); + } else { + me.printStats("Total fuel %d lbm.",me.weight_fuel_lbm); + me.printStats("Specific Impulse is %.2f (lbf*s)/lbm. Total impulse: %.2f lbf*s.", 1/me.fuel_per_impulse, me.impulseT); + # see how much energy/fuel the missile have. For solid fuel rockets, it is normally 200-280. Lower for smokeless, higher for smoke. + if (me.weight_fuel_lbm > me.weight_launch_lbm) { + me.printStats("ERROR: More fuel mass than entire weapon, please correct."); + } else { + me.printStats("Fuel is %.1f%% of weapons mass.", 100*me.weight_fuel_lbm/me.weight_launch_lbm); + } + if (1/me.fuel_per_impulse > 400) { + me.printStats("WARNING: If this is rocket engine, it has way too much thrust."); + } elsif (1/me.fuel_per_impulse > 350) { + me.printStats("WARNING: If this is rocket engine, it most likely has too much thrust per fuel."); + } elsif (1/me.fuel_per_impulse > 280) { + me.printStats("If this is rocket engine, it has a very high thrust."); + } elsif (1/me.fuel_per_impulse > 250) { + me.printStats("If this is rocket engine, it is probably not smokeless."); + } elsif (1/me.fuel_per_impulse > 200) { + me.printStats("If this is rocket engine, it is probably smokeless."); + } else { + me.printStats("WARNING: If this is rocket engine, it probably has too little thrust."); + } + } + if (!me.engineEnabled) { + me.printStats("Engine is disabled and will not start/ignite."); + } + } + + me.printStats("AERODYNAMICS:"); + me.printStats("Full weight is %d lbm.", me.weight_launch_lbm); + me.printStats("Drag coefficient is %.2f. Reference area is %.2f square feet.", me.Cd_base,me.ref_area_sqft); + me.printStats("Total drag-area is %.3f. Use this number to compare with other weapons for drag estimation.",me.Cd_base*me.ref_area_sqft); + me.printStats("Maximum structural g-force is %.1f",me.max_g); + me.printStats("Minimum speed for steering is %.1f mach.",me.min_speed_for_guiding); + me.printStats("Weapon will roll clockwise with %.1f degrees per second.", me.lateralSpeed); + me.printStats("WARHEAD:"); + me.printStats("Warhead total weight is %.1f lbm.",me.weight_whead_lbm); + me.printStats("Arming time is %.1f seconds.",me.arming_time); + me.printStats("Will selfdestruct after %d seconds.",me.selfdestruct_time); + if (me.multiHit) { + me.printStats("When detonating, will hit everything nearby. Number of contacts to consider: %d", size(me.contacts)); + } else { + me.printStats("When detonating, will only hit single target."); + } + if (me.destruct_when_free) { + me.printStats("Will selfdestruct if loses lock."); + } + me.printStats("Will explode if target range is increasing and within %d meters of target.",me.reportDist); + if (me.inert) { + me.printStats("Warhead is inert though and will not detonate."); + } + if (me.simple_drag) { + me.printStats("Simplified induced drag will be used to determine speed bleed due to G's"); + } else { + me.printStats("To determine speed bleed due to G's wing aspect ratio is %.1f and wing effeciancy is %.2f.",me.wing_aspect_ratio,me.wing_eff); + } + me.printStats("LAUNCH CONDITIONS:"); + if (me.rail) { + me.printStats("Weapon is fired from rail/tube of length %.1f meters.",me.rail_dist_m); + if (me.rail_forward) { + me.printStats("Launch direction is forward."); + } else { + me.printStats("Launch direction is %d degrees upward.", me.rail_pitch_deg); + me.printStats(" and %d degrees right.", me.rail_head_deg); + } + } else { + me.printStats("Weapon is dropped from launcher. Dropping for %.1f seconds.",me.drop_time);#todo + me.printStats("After drop it takes %.1f seconds to deploy wings.",me.deploy_time);#todo + if (me.guideWhileDrop) { + me.printStats("In drop it will already start guiding if speed is high enough."); + } + } + if (me.intoBore or me.eject_speed != 0) { + me.printStats("Weapon will be unaffected by airstream when released."); + } else { + me.printStats("Weapon will be turn into airstream when released."); + } + if (!me.rail and me.eject_speed != 0) { + me.printStats("Weapon will be ejected at %.1f feet/sec.",me.eject_speed); + } + if (me.guidance == "heat" or me.guidance == "radar" or me.guidance == "semi-radar" or me.guidance == "tvm") { + me.printStats("COUNTER-MEASURES:"); + if (me.guidance == "radar" or me.guidance == "semi-radar" or me.guidance == "tvm") { + me.printStats("Resistance to chaff is %d%%.",me.chaffResistance*100); + } elsif (me.guidance == "heat") { + me.printStats("Resistance to flares is %d%%.",me.flareResistance*100); + } + } + me.printStats("MISC:"); + if (me.data) { + me.printStats("Will transmit telemetry data back to launch platform."); + } else { + me.printStats("Has no data connection to launch platform when launched."); + } + if (me.dlz_enabled) { + me.printStats("Dynamic launch zone support enabled."); + me.printStats("Missile will likely hit when fired at max range when closing speed is %.2f mach at %d feet.", me.dlz_opt_mach, me.dlz_opt_alt); + } else { + me.printStats("Dynamic launch zone support disabled."); + } + me.printStats("****************************************************"); + }, + + setNewTargetInFlight: func (tagt) { + if (tagt == "closest") { + tagt = nil; + me.closest = 1000000; + if (me.Tgt != nil) { + foreach(me.test_tgt ; me.contacts) { + me.test_dist = me.Tgt.get_Coord().distance_to(me.test_tgt.get_Coord()); + if (me.test_dist < me.closest and me.checkForClassInFlight(me.test_tgt)) { + me.closest = me.test_dist; + tagt = me.test_tgt; + } + } + } + } + me.Tgt = tagt; + me.callsign = tagt==nil?"Unknown":damage.processCallsign(me.Tgt.get_Callsign()); + me.printStatsDetails("Target set to %s", me.callsign); + me.newTargetAssigned = tagt==nil?0:1; + me.t_coord = tagt==nil?nil:me.Tgt.get_Coord(); + me.fovLost = 0; + me.lostLOS = tagt==nil?1:0;# to do prowl flight something needs to be lost. + me.radLostLock = 0; + me.semiLostLock = 0; + me.heatLostLock = 0; + me.hasGuided = 0; + }, + + flight: func { + + while(1==1) { + if(me.deleted) { + return; + } + thread.semdown(me.frameToggle); + if(me.deleted) { + return; + } + ############################################################################################################# + # + # + # + # MAIN FLIGHT LOOP + # + # + # + ############################################################################################################# + me.counter += 1;#main counter for which number of loop we are in. + + if (me.pendingLaunchSound > -1 and me.life_time >= me.pendingLaunchSound and me.counter >= 5) { + # For some reason, sound needs some time to see that the property is false, so we let counter go to 5 before we set it to true. + me.launchSoundProp.setBoolValue(1); + me.pendingLaunchSound = -1; + } + + me.elapsed = systime(); + + me.dt = (me.elapsed - me.elapsed_last)*speedUp.getValue(); + me.elapsed_last = me.elapsed; + + if(me.dt <= 0 or me.dt > 0.4) { + # Negative can happen if OS adjust clock while we are flying. + # Large dt can happen when pausing the sim or with heavy stuttering. + continue;# back to while() loop and wait for semaphore up. + } + + me.life_time += me.dt; + + me.handleMidFlightFunc(); + + if (me.hasGuided and me.maddog) { + me.maddog = 0; + me.printStats("Maddog stage over, guided at "~me.callsign); + } + + if (me.guidanceEnabled and !me.free and !me.newTargetAssigned and (me.canSwitch or (me.loal and me.maddog)) and size(me.contacts) > 0 and (me.dist_curr_direct==-1 or me.dist_curr_direct>me.reportDist)) { + # me.reaquire must also be enabled for me.canSwitch to work + + if (me.Tgt==nil or !me.hasGuided or (me.canSwitch and (me.fovLost or me.lostLOS or me.radLostLock or me.semiLostLock or me.heatLostLock)) and me.life_time > me.nextFovCheck) { + # test next contact + me.numberContacts = size(me.contacts); + me.switchIndex += 1; + if (me.switchIndex >= me.numberContacts) { + me.switchIndex = 0; + me.nextFovCheck = me.nextFovCheck+me.switchTime; + } + me.newTgt = me.contacts[me.switchIndex]; + if (!me.newLock(me.newTgt)) { + me.Tgt = nil; + me.callsign = "Unknown"; + me.newTargetAssigned = 0; + } else { + me.setNewTargetInFlight(me.newTgt); + } + } + } + + if (me.prevGuidance != me.guidance) { + me.keepPitch = me.pitch; + } + if (me.Tgt != nil and !me.Tgt.isValid()) {#TODO: verify that the following threaded code can handle invalid contact. As its read from property-tree, not mutex protected. + if (!(me.canSwitch and me.reaquire)) { + me.printStats(me.type~": Target went away, deleting missile."); + #me.sendMessage(me.type~" missed "~me.callsign~": Target logged off."); + thread.lock(mutexTimer); + append(AIM.timerQueue, [me,me.del,[],0]); + append(AIM.timerQueue, [me,me.log,[me.callsign~" logged off. Deleting "~me.typeLong],0]); + thread.unlock(mutexTimer); + AIM.setETA(nil); + return; + } else { + me.Tgt = nil; + me.callsign = "Unknown"; + me.newTargetAssigned = 0; + } + } elsif (me.Tgt != nil and me.Tgt.get_type() == POINT and me.guidance == "laser" and me.usingTGPPoint and contactPoint == nil) { + # if laser illuminated lock is lost on a targetpod target: + if (!(me.canSwitch and me.reaquire)) { + me.Tgt = nil; + me.guidance = "unguided"; + me.printStats("Guidance switched to %s",me.guidance); + } else { + me.Tgt = nil; + me.callsign = "Unknown"; + me.newTargetAssigned = 0; + } + } elsif (me.Tgt == nil and me.guidance == "laser" and me.usingTGPPoint and contactPoint != nil) { + # see if we can regain lock on new laser spot: + if (me.newLock(contactPoint)) { + me.setNewTargetInFlight(contactPoint); + me.printStats("Laser lock switched to %s",me.callsign); + } else { + me.printStats("Laser spot ignored, could not lock on %s",me.settings.target.get_Callsign()); + } + } + + if (!me.rail) { + me.deploy = me.clamp(me.extrapolate(me.life_time, me.drop_time, me.drop_time+me.deploy_time,0,1),0,1); + } elsif (me.rail_passed_time == nil and me.rail_passed) { + me.rail_passed_time = me.life_time; + me.deploy = 0; + } elsif (me.rail_passed_time != nil) { + me.deploy = me.clamp(me.extrapolate(me.life_time, me.rail_passed_time, me.rail_passed_time+me.deploy_time,0,1),0,1); + } + me.deploy_prop.setDoubleValue(me.deploy); + + me.thrust_lbf = me.thrust();# pounds force (lbf) + + + # Jmav remove the # from the line below for cruise missile adjustment: + #me.printAlways("guiding=%d time=%d: mach=%.3f alt=%d %s",me.guiding, me.life_time, me.speed_m, me.alt_ft, me.observing); + + + # Get total old speed, thats what we will use in next loop. + me.old_speed_horz_fps = math.sqrt((me.speed_east_fps*me.speed_east_fps)+(me.speed_north_fps*me.speed_north_fps)); + me.old_speed_fps = math.sqrt((me.old_speed_horz_fps*me.old_speed_horz_fps)+(me.speed_down_fps*me.speed_down_fps)); + + me.setRadarProperties(me.old_speed_fps); + + + + # Get air density and speed of sound (fps): + me.rs = me.rho_sndspeed(me.altN.getValue() + me.density_alt_diff); + me.rho = me.rs[0]; + me.sound_fps = me.rs[1]; + + me.max_g_current = me.maxG(me.rho, me.max_g); + + me.speed_m = me.old_speed_fps / me.sound_fps; + + if (me.old_speed_fps > me.maxFPS) { + me.maxFPS = me.old_speed_fps; + } + if (me.speed_m > me.maxMach) { + me.maxMach = me.speed_m; + } + if (me.speed_m > me.maxMach1 and me.life_time > me.drop_time and me.life_time <= (me.drop_time + me.stage_1_duration)) { + me.maxMach1 = me.speed_m; + } + if (me.speed_m > me.maxMach2 and me.life_time > (me.drop_time + me.stage_1_duration) and me.life_time <= (me.drop_time + me.stage_1_duration + me.stage_gap_duration+me.stage_2_duration)) { + me.maxMach2 = me.speed_m; + } + if (me.speed_m > me.maxMach3 and me.life_time > (me.drop_time + me.stage_1_duration + me.stage_gap_duration + me.stage_2_duration) and me.life_time <= (me.drop_time + me.stage_1_duration + me.stage_gap_duration+me.stage_2_duration+me.stage_3_duration)) { + me.maxMach3 = me.speed_m; + } + if (me.maxMach4 == 0 and me.life_time > (me.drop_time + me.stage_1_duration + me.stage_gap_duration+me.stage_2_duration+me.stage_3_duration)) { + me.maxMach4 = me.speed_m; + } + + me.Cd = me.drag(me.speed_m,me.myG); + + me.speed_change_fps = me.speedChange(me.thrust_lbf, me.rho, me.Cd); + + + if (me.last_dt != 0) { + me.speed_change_fps = me.speed_change_fps + me.energyBleed(me.g, me.altN.getValue() + me.density_alt_diff); + } + + + + ################### + #### Guidance.##### + ################### + + if(me.speed_m < me.min_speed_for_guiding) { + # No guidance at low speed. + # Still go through the guidance loop for sensor logic (need to check flares, LOS, etc. + # to detect loss of lock), but the steering commands will be ignored. + if (!me.tooLowSpeed) { + me.printStats(me.type~": Not guiding (too low speed)"); + } + me.tooLowSpeed = 1; + } else { + me.tooLowSpeed = 0; + } + + if (me.guidance == "remote" or me.guidance == "remote-stable") { + me.printGuide("Remote control"); + if (me.guidance == "remote-stable") { + me.remoteControlStabilized(); + } else { + me.remoteControl(); + } + AIM.setETA(nil); + me.prevETA = nil; + } elsif (me.Tgt != nil and me.t_coord !=nil and !me.free and me.guidance != "unguided" + and (!me.rail or me.rail_passed) and me.guidanceEnabled) { + # + # Here we figure out how to guide, navigate and steer. + # + if (me.guidance == "level") { + me.level(); + AIM.setETA(nil); + me.prevETA = nil; + } elsif (me.guidance == "gyro-pitch") { + me.pitchGyro(); + AIM.setETA(nil); + me.prevETA = nil; + } else { + me.guide(); + if (!me.guiding) { + AIM.setETA(nil); + me.prevETA = nil; + } + } + me.observing = me.guidance; + } elsif (me.guidance != "unguided" and (!me.rail or me.rail_passed) and me.guidanceEnabled and !me.free and me.t_coord == nil + and (me.newTargetAssigned or (me.canSwitch and (me.fovLost or me.lostLOS or me.radLostLock or me.semiLostLock or me.heatLostLock) or (me.loal and me.maddog)))) { + # check for too low speed not performed on purpuse, difference between flying straight on A/P and making manouvres. + if (me.observing != me.standbyFlight) { + me.keepPitch = me.pitch; + } + me.printGuide("Prowling"); + if (me.standbyFlight == "level") { + me.level(); + } elsif (me.standbyFlight == "5") { + me.level5(); + } elsif (me.standbyFlight == "gyro-pitch") { + me.pitchGyro(); + } elsif (me.standbyFlight == "terrain-follow") { + me.terrainFollow(); + } else { + me.track_signal_e = 0; + me.track_signal_h = 0; + } + me.observing = me.standbyFlight; + AIM.setETA(nil); + me.prevETA = nil; + } else { + me.observing = "unguided"; + me.track_signal_e = 0; + me.track_signal_h = 0; + me.printGuide("Unguided"); + #me.printGuideDetails(sprintf("not guiding %d %d %d %d %d",me.Tgt != nil,me.free == 0,me.guidance != "unguided",me.rail == 0,me.rail_passed)); + AIM.setETA(nil); + me.prevETA = nil; + } + + if(me.tooLowSpeed) { + # Guidance disabled due to low speed. + me.track_signal_e = 0; + me.track_signal_h = 0; + } elsif (me.observing != "unguided") { + me.limitG(); + if (me.track_signal_e > 0 and me.pitch+me.track_signal_e > me.maxPitch and me.thrust_lbf==0) {# super hack + me.printGuideDetails("Prevented to pitch up to %.2f degs.", me.pitch+me.track_signal_e); + me.adjst = 1-(me.pitch+me.track_signal_e - me.maxPitch)/45; + if (me.adjst < 0) me.adjst = 0; + me.track_signal_e *= me.adjst; + } + me.pitch += me.track_signal_e; + me.hdg += me.track_signal_h; + me.pitch = math.max(-90, math.min(90, me.pitch)); + me.hdg = geo.normdeg(me.hdg); + me.printGuideDetails("%04.1f deg pitch command done, new pitch: %04.1f deg", me.track_signal_e, me.pitch); + me.printGuideDetails("%05.1f deg heading command done, new heading: %05.1f", me.last_track_h, me.hdg); + } + + me.last_track_e = me.track_signal_e; + me.last_track_h = me.track_signal_h; + + me.new_speed_fps = me.speed_change_fps + me.old_speed_fps; + if (me.new_speed_fps < 0) { + # drag and bleed can theoretically make the speed less than 0, this will prevent that from happening. + me.new_speed_fps = 0.001; + } + + # Break speed change down total speed to North, East and Down components. + me.speed_down_fps = -math.sin(me.pitch * D2R) * me.new_speed_fps; + me.speed_horizontal_fps = math.cos(me.pitch * D2R) * me.new_speed_fps; + me.speed_north_fps = math.cos(me.hdg * D2R) * me.speed_horizontal_fps; + me.speed_east_fps = math.sin(me.hdg * D2R) * me.speed_horizontal_fps; + me.speed_down_fps += g_fps * me.dt; + + if (me.rail and !me.rail_passed) { + # missile still on rail, lets calculate its speed relative to the wind coming in from the aircraft nose. + me.rail_speed_into_wind = me.rail_speed_into_wind + me.speed_change_fps; + } else { + # gravity acc makes the weapon pitch down + me.pitch = math.atan2(-me.speed_down_fps, me.speed_horizontal_fps ) * R2D; + } + + + if (me.rail and !me.rail_passed) { + me.u = noseAir.getValue();# airstream from nose + #var v = getprop("velocities/vBody-fps");# airstream from side + me.w = -belowAir.getValue();# airstream from below + me.opposing_wind = me.u*math.cos(me.rail_pitch_deg*D2R)+me.w*math.sin(me.rail_pitch_deg*D2R); + + if (me.rail_forward) { + me.pitch = OurPitch.getValue(); + me.hdg = OurHdg.getValue(); + } else { + me.railvec = me.myMath.eulerToCartesian3X(-me.rail_head_deg, me.rail_pitch_deg,0); + me.veccy = me.myMath.rollPitchYawVector(OurRoll.getValue(),OurPitch.getValue(),-OurHdg.getValue(),me.railvec); + me.carty = me.myMath.cartesianToEuler(me.veccy); + me.defaultHeading = me.Tgt != nil?me.Tgt.get_bearing():0;#90 deg tubes align to target heading, else north + me.pitch = me.carty[1]; + me.hdg = me.carty[0]==nil?me.defaultHeading:me.carty[0]; + } + + me.speed_on_rail = math.max(me.rail_speed_into_wind - me.opposing_wind, 0); + + me.movement_on_rail = me.speed_on_rail * me.dt; + + me.rail_pos = me.rail_pos + me.movement_on_rail; + if (me.rail_forward) { + me.x = me.x - (me.movement_on_rail * FT2M);# negative cause positive is rear in body coordinates + } else { + me.position_on_rail += math.max(0, me.movement_on_rail * FT2M);# only can move forward on rail. + me.railPos = me.myMath.alongVector(me.railBegin, me.railEnd, me.rail_dist_m, me.position_on_rail); + } + } + + if (!me.rail or me.rail_passed) { + # missile not on rail, lets move it to next waypoint + if (me.observing != "level" or me.speed_m < me.min_speed_for_guiding) { + me.alt_ft = me.alt_ft - (me.speed_down_fps * me.dt); + } + me.dist_h_m = me.speed_horizontal_fps * me.dt * FT2M; + #me.coord.apply_course_distance(me.hdg, me.dist_h_m); + me.great = greatCircleMove(me.coord, me.hdg, me.dist_h_m*M2NM); + me.coord.set_latlon(me.great.lat, me.great.lon, me.alt_ft * FT2M); + #me.coord.set_alt(me.alt_ft * FT2M); + } else { + # missile on rail, lets move it on the rail + if (me.rail_forward) { + var init_coord = nil; + if (offsetMethod) { + me.geodPos = aircraftToCart({x:-me.x, y:me.y, z: -me.z}); + me.coord.set_xyz(me.geodPos.x, me.geodPos.y, me.geodPos.z); + } else { + me.coord = me.getGPS(me.x, me.y, me.z, OurPitch.getValue()); + } + } else { + me.coord = me.getGPS(-me.railPos[0], -me.railPos[1], me.railPos[2], OurPitch.getValue(), OurHdg.getValue()); + } + me.alt_ft = me.coord.alt() * M2FT; + # find its speed, for used in calc old speed + me.speed_down_fps = -math.sin(me.pitch * D2R) * me.rail_speed_into_wind; + me.speed_horizontal_fps = math.cos(me.pitch * D2R) * me.rail_speed_into_wind; + me.speed_north_fps = math.cos(me.hdg * D2R) * me.speed_horizontal_fps; + me.speed_east_fps = math.sin(me.hdg * D2R) * me.speed_horizontal_fps; + #printf("Rail: ms_after_fps=%d ac_fps=%d", math.sqrt(me.speed_down_fps*me.speed_down_fps+math.pow(math.sqrt(me.speed_east_fps*me.speed_east_fps+me.speed_north_fps*me.speed_north_fps),2)),math.sqrt(getprop("velocities/speed-down-fps")*getprop("velocities/speed-down-fps")+math.pow(math.sqrt(getprop("velocities/speed-east-fps")*getprop("velocities/speed-east-fps")+getprop("velocities/speed-north-fps")*getprop("velocities/speed-north-fps")),2))); + } + if (me.alt_ft > me.maxAlt) { + me.maxAlt = me.alt_ft; + } + # Get target position. + if (me.Tgt != nil and me.t_coord != nil) { + if (!me.flareLock and !me.chaffLock) { + if (me.guidance != "gps" and (me.guidance != "gps-laser" or me.is_laser_painted(me.Tgt))) {# gps never updated inflight, gps-laser only when laser is online + me.t_coord = geo.Coord.new(me.Tgt.get_Coord());#in case multiple missiles use same Tgt we cannot rely on coords being different, so we extra create new. + } + if (me.t_coord == nil or !me.t_coord.is_defined()) { + # just to protect the multithreaded code for invalid pos. + print("Missile target has undefined coord!"); + me.Tgt = nil; + } else { + me.t_coord.alt();# TODO: once fixed in FG this line is no longer needed. + } + } else { + # we are chasing a flare, lets update the flares position. + if (me.flareLock) { + me.flarespeed_fps = me.flarespeed_fps - (25 * me.dt);#flare deacc. 15 kt per second. + } else { + me.flarespeed_fps = me.flarespeed_fps - (50 * me.dt);#chaff deacc. 30 kt per second. + } + if (me.flarespeed_fps < 0) { + me.flarespeed_fps = 0; + } + me.flare_speed_down_fps = -math.sin(me.flare_pitch * D2R) * me.flarespeed_fps; + me.flare_speed_horizontal_fps = math.cos(me.flare_pitch * D2R) * me.flarespeed_fps; + me.flare_alt_ft = me.t_coord.alt()*M2FT - (me.flare_speed_down_fps * me.dt); + me.flare_dist_h_m = me.flare_speed_horizontal_fps * me.dt * FT2M; + #me.t_coord.apply_course_distance(me.flare_hdg, me.flare_dist_h_m); + me.great = greatCircleMove(me.t_coord, me.flare_hdg, me.flare_dist_h_m*M2NM); + me.t_coord.set_latlon(me.great.lat, me.great.lon, me.flare_alt_ft * FT2M); + #me.t_coord.set_alt(me.flare_alt_ft * FT2M); + } + } + + # performance logging: + # + #var q = 0.5 * rho * me.old_speed_fps * me.old_speed_fps; + #setprop("logging/missile/dist-nm", me.ac_init.distance_to(me.coord)*M2NM); + #setprop("logging/missile/alt-m", me.alt_ft * FT2M); + #setprop("logging/missile/speed-m", me.speed_m*1000); + #setprop("logging/missile/drag-lbf", Cd * q * me.ref_area_sqft); + #setprop("logging/missile/thrust-lbf", thrust_lbf); + + me.setFirst(); + + me.printFlight("Pitch %.2f degs.", me.pitch); + + me.latN.setDoubleValue(me.coord.lat()); + me.lonN.setDoubleValue(me.coord.lon()); + me.altN.setDoubleValue(me.alt_ft); + if (!me.no_pitch or (me.rail and !me.rail_passed)) { + me.pitchN.setDoubleValue(me.pitch); + } else { + # for ejection seat + me.uprighter = me.pitchN.getValue(); + if (me.uprighter<89.92) { + me.uprighter += (90-me.uprighter)*me.dt*0.1; + } elsif (me.uprighter>90.08) { + me.uprighter -= (me.uprighter-90)*me.dt*0.1; + } else { + me.uprighter = 90.0; + } + me.pitchN.setDoubleValue(me.uprighter); + } + me.hdgN.setDoubleValue(me.hdg); + me.rollN.setDoubleValue(me.rollN.getValue()+me.lateralSpeed*me.dt); + + # log missiles to unicsv for visualizing flightpath in Google Earth + # + #setprop("/logging/missile/latitude-deg", me.coord.lat()); + #setprop("/logging/missile/longitude-deg", me.coord.lon()); + #setprop("/logging/missile/altitude-ft", alt_ft); + #setprop("/logging/missile/t-latitude-deg", me.t_coord.lat()); + #setprop("/logging/missile/t-longitude-deg", me.t_coord.lon()); + #setprop("/logging/missile/t-altitude-ft", me.t_coord.alt()*M2FT); + #setprop("/logging/missile/altitude-ft", me.alt_ft); + #setprop("/logging/missile/heading-deg", me.hdg); + #setprop("/logging/missile/pitch-deg", me.pitch); + + + if (me.tacview_support) { + if (tacview.starttime and math.mod(me.counter, 3) == 0) { + me.nme = me.type=="es"?"Parachutist":me.type; + me.extra = me.type=="es"?"|0|0|0":""; + thread.lock(tacview.mutexWrite); + tacview.write("#" ~ (systime() - tacview.starttime)~"\n"); + tacview.write(me.tacviewID~",T="~me.coord.lon()~"|"~me.coord.lat()~"|"~(me.alt_ft*FT2M)~me.extra~",Name="~me.nme~",Parent="~tacview.myplaneID~"\n");#,Type=Weapon+Missile + thread.unlock(tacview.mutexWrite); + } + } + + ############################## + #### Proximity detection.##### + ############################## + if (!me.rail or me.rail_passed) { + if ( !me.free ) { + me.g = me.steering_speed_G(me.hdg, me.pitch, me.track_signal_e, me.track_signal_h, me.old_speed_fps, me.dt); + } else { + me.g = 0; + } + + me.exploded = me.proximity_detection(); + + # + # check stats while flying: + # + me.printFlight("Mach %04.2f , time %05.1f s , thrust %05.1f lbf , G-force %05.2f", me.speed_m, me.life_time, me.thrust_lbf, me.g); + me.printFlight("Alt %07.1f ft , direct distance to target %04.1f NM", me.alt_ft, (me.Tgt!=nil and me.direct_dist_m!=nil)?me.direct_dist_m*M2NM:-1); + + if (me.exploded) { + me.printStats("%s max absolute %.2f Mach. Max relative %.2f Mach. Max alt %6d ft. Terminal %.2f mach.", me.type, me.maxMach, me.maxMach-me.startMach, me.maxAlt, me.speed_m); + me.printStats("%s max relative %d ft/s.", me.type, me.maxFPS-me.startFPS); + me.printStats(" Absolute %.2f Mach in stage 1.", me.maxMach1); + if (me.force_lbf_2 > 0) me.printStats(" Absolute %.2f Mach in stage 2.", me.maxMach2); + if (me.force_lbf_3 > 0) me.printStats(" Absolute %.2f Mach in stage 3.", me.maxMach3); + if (me.maxMach4 > 0) me.printStats(" Absolute %.2f mach propulsion end.", me.maxMach4); + me.printStats("%d seconds from launch to end", me.life_time); + me.printStats(" Fired at %s from %.2f Mach, %5d ft at %3d NM distance. Flew %.1f NM.", me.callsign, me.startMach, me.startAlt, me.startDist * M2NM, me.ac_init.direct_distance_to(me.coord)*M2NM); + # We exploded, and start the sound propagation towards the plane + me.sndSpeed = me.sound_fps; + me.sndDistance = 0; + me.elapsed_last_snd = systime(); + if (me.explodeSound) { + thread.lock(mutexTimer); + append(AIM.timerQueue, [me,me.sndPropagate,[],0]); + thread.unlock(mutexTimer); + } else { + thread.lock(mutexTimer); + append(AIM.timerQueue, [me,me.del,[],10]); + thread.unlock(mutexTimer); + } + AIM.setETA(nil); + return; + } + } + + if (me.Tgt == nil and me.rail and me.rail_pitch_deg==90 and !me.rail_passed) { + #for ejection seat to be oriented correct, wont be ran for missiles with target such as the frigate. + + # model of seat is loaded such that face is pointing in -Z FG coords. + + # Get the vector pointing up from aircraft + var a = me.myMath.eulerToCartesian3Z(-OurHdg.getValue(), OurPitch.getValue(), OurRoll.getValue()); + #printf("HPR: %0.4f %0.4f %0.4f",OurHdg.getValue(),OurPitch.getValue(),OurRoll.getValue()); + #printf(" UP: %0.4f %0.4f %0.4f",a[0],a[1],a[2]); + + # get the pitch and heading of that vector + var euler = me.myMath.cartesianToEuler(a); + me.pitch = euler[1]; + me.pitchN.setDoubleValue(me.pitch); + if (euler[0]!=nil) { + me.hdg = euler[0]; + } else { + # straight up or down + me.hdg = OurHdg.getValue(); + } + me.hdgN.setDoubleValue(me.hdg); + + # get vector pointing out from aircraft nose + var nose = me.myMath.eulerToCartesian3X(-OurHdg.getValue(), OurPitch.getValue(), OurRoll.getValue()); + + # get vector pointing perpendicular to seat travel direction (most upward possible) + var face = me.myMath.eulerToCartesian3Z(-me.hdg, me.pitch, 0); + + # convert to angle pointing out from face if pilot turns head without nodding and looks downward + face = me.myMath.product(-1,face); + + # get angle between face and aircraft-nose vectors + var turnFace = me.myMath.angleBetweenVectors(face,nose); + + if (me.myMath.angleBetweenVectors(nose,me.myMath.product(-1,me.myMath.eulerToCartesian3Z(-me.hdg, me.pitch, turnFace)))>me.myMath.angleBetweenVectors(nose,me.myMath.product(-1,me.myMath.eulerToCartesian3Z(-me.hdg, me.pitch, -turnFace)))) { + # if angle between aircraft nose and the face of pilot is greater than the roll of seat then the roll should be opposite + #print("looking1 "~me.myMath.cartesianToEuler(me.myMath.product(-1,me.myMath.eulerToCartesian3Z(-me.hdg, me.pitch, turnFace)))[0]); + turnFace *= -1; + #print("turned face"); + } else { + #turnFace *= -1; + } + + # roll the seat so pilot faces forward + me.rollN.setDoubleValue(turnFace); + #print("looking2 "~me.myMath.cartesianToEuler(me.myMath.product(-1,me.myMath.eulerToCartesian3Z(-me.hdg, me.pitch, turnFace)))[0]); + #printf("seat now at P:%d H:%d R:%d",me.pitch, me.hdg, turnFace); + } + if (!me.rail_passed and (!me.rail or me.rail_pos > me.rail_dist_m * M2FT)) { + me.rail_passed = 1; + me.printFlight("rail passed"); + } + + + # consume fuel + if (me.life_time > (me.drop_time + me.stage_1_duration + me.stage_gap_duration+me.stage_2_duration+me.stage_3_duration)) { + me.weight_current = me.weight_launch_lbm - me.weight_fuel_lbm; + } elsif (me.life_time > (me.drop_time + me.stage_1_duration+me.stage_gap_duration + me.stage_2_duration)) { + me.weight_current = me.weight_current - me.fuel_per_sec_3 * me.dt; + } elsif (me.life_time > (me.drop_time + me.stage_1_duration+me.stage_gap_duration)) { + me.weight_current = me.weight_current - me.fuel_per_sec_2 * me.dt; + } elsif (me.life_time > me.drop_time and me.life_time < (me.drop_time + me.stage_1_duration)) { + me.weight_current = me.weight_current - me.fuel_per_sec_1 * me.dt; + } + + me.mass = me.weight_current * LBM2SLUGS; + + # telemetry + me.sendTelemetry(); + + if (me.life_time - me.last_noti > me.noti_time and getprop("payload/armament/msg")) { + # notify in flight using Emesary. + me.last_noti = me.life_time; + thread.lock(mutexTimer); + var rdr = me.guidance=="radar"; + var semiRdr = (me.guidance=="semi-radar" and !me.semiLostLock) or (me.guidance=="command" and me.guiding);# Continous wave illuminator active on the target + append(AIM.timerQueue, [AIM, AIM.notifyInFlight, [me.latN.getValue(), me.lonN.getValue(), me.altN.getValue()*FT2M,rdr,semiRdr,me.typeID,me.type,me.unique_id,me.thrust_lbf>0,(me.free or me.lostLOS or me.tooLowSpeed or me.flareLock or me.chaffLock)?"":me.callsign, me.hdg, me.pitch, me.new_speed_fps, 0], -1]); + thread.unlock(mutexTimer); + } + + me.last_dt = me.dt; + + me.prevGuidance = me.guidance; + + if (me.counter > -1 and !me.ai.getNode("valid").getBoolValue()) { + # TODO: Why is this placed so late? Don't remember. + me.ai.getNode("valid").setBoolValue(1); + thread.lock(mutexTimer); + append(AIM.timerQueue, [me, me.setModelAdded, [], -1]); + thread.unlock(mutexTimer); + } + ############################################################################################################# + # + # + # + # MAIN FLIGHT LOOP END + # + # + # + ############################################################################################################# + } + }, + + handleMidFlightFunc: func { + if(me.mfFunction != nil) { + + me.settings = me.mfFunction({ time_s: me.life_time, + dist_m: me.dist_curr_direct, + dist_horz_m: me.dist_curr, + mach: me.speed_m, + speed_fps: me.old_speed_fps, + weapon_position: me.coord, + guidance: me.guidance, + guidanceLaw: me.guidanceLaw, + seeker_detect_range: me.detect_range_curr_nm, + seeker_fov: me.max_seeker_dev, + weapon_pitch: me.pitch, + weapon_heading: me.hdg, + callsign: me.callsign, + deviation_deg: me["fov_radial"], + hasTarget: me["Tgt"] != nil, + }); + if (me.settings["guidance"] != nil) { + me.guidance = me.settings.guidance; + me.printStats("Guidance switched to %s",me.guidance); + me.printExtendedStats(); + } + if (me.settings["guidanceLaw"] != nil) { + me.guidanceLaw = me.settings.guidanceLaw; + me.printStats("Guidance law switched to %s", me.guidanceLaw); + } + if (me.settings["altitude"] != nil) { + if (me.loft_alt != me.settings.altitude) me.printStats("Loft altitude switched to %d", me.settings.altitude); + me.loft_alt = me.settings.altitude; + } + if (me.settings["altitude_at"] != nil) { + # Altitude above target + me.settings.altitude_at+=me.Tgt.get_altitude(); + if (me.loft_alt != me.settings.altitude_at) me.printStats("Loft altitude switched to %d", me.settings.altitude_at); + me.loft_alt = me.settings.altitude_at; + } + if (me.settings["class"] != nil) { + me.class = me.settings.class; + me.target_air = find("A", me.class)==-1?0:1; + me.target_sea = find("M", me.class)==-1?0:1; + me.target_gnd = find("G", me.class)==-1?0:1; + me.target_pnt = find("P", me.class)==-1?0:1; + me.printStats("Class switched to %s", me.class); + } + if (me.settings["target"] != nil) { + if (me.settings.target == "nil") { + me.setNewTargetInFlight(nil); + me.printStats("Target removed"); + } elsif (me.settings.target == "closest") { + me.setNewTargetInFlight("closest"); + me.printStats("Seeker finding closest target to the GPS"); + } elsif (me.newLock(me.settings.target)) { + me.setNewTargetInFlight(me.settings.target); + me.printStats("Target switched to %s",me.callsign); + } else { + me.printStats("Target switch ignored, could not lock on %s",me.settings.target.get_Callsign()); + } + } + if (contains(me.settings, "remote_yaw")) { + me.remote_control_yaw = me.settings.remote_yaw; + } else { + me.remote_control_yaw = 0; + } + if (contains(me.settings, "remote_pitch")) { + me.remote_control_pitch = me.settings.remote_pitch; + } else { + me.remote_control_pitch = 0; + } + if (me.settings["abort_midflight_function"] != nil) { + me.mfFunction = nil; + } + } + }, + + sendTelemetry: func { + if (me.data) { + + me.eta = me.free or me.vert_closing_rate_fps == -1?-1:(me["t_go"]!=nil?me.t_go:(me.dist_curr*M2FT)/me.vert_closing_rate_fps); + if (me.eta < 0) me.eta = -1; + me.hit = 50;# in percent + if (me.life_time > me.drop_time+me.stage_1_duration + me.gnd_launch?(me.stage_2_duration + me.stage_gap_duration):0) { + # little less optimistic after reaching topspeed + if (me.selfdestruct_time-me.life_time < me.eta) { + # reduce alot if eta later than lifespan + me.hit -= 75; + } elsif (me.eta != -1 and (me.selfdestruct_time-me.life_time) != 0) { + # if its hitting late in life, then reduce + me.hit -= (me.eta / (me.selfdestruct_time-me.life_time)) * 25; + } + if (me.eta > 0) { + # penalty if eta is high + me.hit -= me.clamp(40*me.eta/(me.life_time*0.85), 0, 40); + } + if (me.eta < 0) { + # penalty if eta is incomputable + me.hit -= 75; + } + } + if (me.curr_deviation_h != nil and me.dist_curr > 50) { + # penalty for target being off-bore + me.hit -= math.abs(me.curr_deviation_h)/2.5; + } + if (me.guiding and me.t_speed_fps != nil and me.old_speed_fps > me.t_speed_fps and me.t_speed_fps != 0) { + # bonus for traveling faster than target + me.hit += me.clamp((me.old_speed_fps / me.t_speed_fps)*15,-25,50); + } + if (me.free or (me.gnd_launch and (me.chaffLock or me.flareLock))) { + # penalty for not longer guiding + me.hit -= 75; + } + me.hit = int(me.clamp(me.hit, 0, 90)); + me.ai.getNode("ETA").setIntValue(me.eta); + me.ai.getNode("hit").setIntValue(me.hit); + + if (me.gnd_launch) { + setprop("sam/impact"~me.ID,me.eta); + setprop("sam/hit"~me.ID,me.hit); + } + + if (me["prevETA"] != nil) { + if (me.prevETA < me.eta) { + # reset the lowest eta to allow it to increase. + AIM.setETA(nil); + } + AIM.setETA(me.eta, me["prevETA"]); + } + me.prevETA = me["eta"]; + } + }, + + getGPS: func(x, y, z, pitch, head=nil, roll=nil) { + # + # get Coord from body position. x,y,z must be in meters. + # derived from Vivian's code in AIModel/submodel.cxx. + # + me.ac = geo.aircraft_position(); + + if(x == 0 and y==0 and z==0) { + return geo.Coord.new(me.ac); + } + if (roll == nil) { + me.ac_roll = OurRoll.getValue(); + } else { + me.ac_roll = roll; + } + me.ac_pitch = pitch; + + if (head == nil) { + me.ac_hdg = OurHdg.getValue(); + } else { + me.ac_hdg = head; + } + + me.in = [0,0,0]; + me.trans = [[0,0,0],[0,0,0],[0,0,0]]; + me.out = [0,0,0]; + + me.in[0] = -x * M2FT; + me.in[1] = y * M2FT; + me.in[2] = z * M2FT; + # Pre-process trig functions: + me.cosRx = math.cos(-me.ac_roll * D2R); + me.sinRx = math.sin(-me.ac_roll * D2R); + me.cosRy = math.cos(-me.ac_pitch * D2R); + me.sinRy = math.sin(-me.ac_pitch * D2R); + me.cosRz = math.cos(me.ac_hdg * D2R); + me.sinRz = math.sin(me.ac_hdg * D2R); + # Set up the transform matrix: + me.trans[0][0] = me.cosRy * me.cosRz; + me.trans[0][1] = -1 * me.cosRx * me.sinRz + me.sinRx * me.sinRy * me.cosRz ; + me.trans[0][2] = me.sinRx * me.sinRz + me.cosRx * me.sinRy * me.cosRz; + me.trans[1][0] = me.cosRy * me.sinRz; + me.trans[1][1] = me.cosRx * me.cosRz + me.sinRx * me.sinRy * me.sinRz; + me.trans[1][2] = -1 * me.sinRx * me.cosRx + me.cosRx * me.sinRy * me.sinRz; + me.trans[2][0] = -1 * me.sinRy; + me.trans[2][1] = me.sinRx * me.cosRy; + me.trans[2][2] = me.cosRx * me.cosRy; + # Multiply the input and transform matrices: + me.out[0] = me.in[0] * me.trans[0][0] + me.in[1] * me.trans[0][1] + me.in[2] * me.trans[0][2]; + me.out[1] = me.in[0] * me.trans[1][0] + me.in[1] * me.trans[1][1] + me.in[2] * me.trans[1][2]; + me.out[2] = me.in[0] * me.trans[2][0] + me.in[1] * me.trans[2][1] + me.in[2] * me.trans[2][2]; + # Convert ft to degrees of latitude: + me.out[0] = me.out[0] / (366468.96 - 3717.12 * math.cos(me.ac.lat() * D2R)); + # Convert ft to degrees of longitude: + me.out[1] = me.out[1] / (365228.16 * math.cos(me.ac.lat() * D2R)); + # Set submodel initial position: + me.mlat = me.ac.lat() + me.out[0]; + me.mlon = me.ac.lon() + me.out[1]; + me.malt = (me.ac.alt() * M2FT) + me.out[2]; + + me.c = geo.Coord.new(); + me.c.set_latlon(me.mlat, me.mlon, me.malt * FT2M); + + return me.c; + }, + + drag: func (mach, N=nil) { + # Nikolai V. Chr.: Made the drag calc more in line with big missiles as opposed to small bullets. + # + # The old equations were based on curves for a conventional shell/bullet (no boat-tail), + # and derived from Davic Culps code in AIBallistic. + me.Cd0 = 0; + if (mach < 0.7) { + me.Cd0 = (0.0125 * mach + 0.20) * 5 * (me.Cd_base+me.Cd_delta*me.deploy); + } elsif (mach < 1.2 ) { + me.Cd0 = (0.3742 * math.pow(mach, 2) - 0.252 * mach + 0.0021 + 0.2 ) * 5 * (me.Cd_base+me.Cd_delta*me.deploy); + } else { + if (1) {# me.simple_drag + # https://www.desmos.com/calculator/77tfavmskq + me.Cd0 = (0.2965 * math.pow(mach, -1.1506) + 0.2) * 5 * (me.Cd_base+me.Cd_delta*me.deploy); + } else { + # https://www.desmos.com/calculator/nfu1cla7su + me.Cd0 = (0.2965 * math.pow(mach, -2.1506) + 0.073766412) * 8 * (me.Cd_base+me.Cd_delta*me.deploy); + } + } + + if (!me.simple_drag) { + if (me.vector_thrust and me.thrust_lbf>0) N=N*0.35; + if (mach < 1.1) { + me.Cdi = (me.Cd_base+me.Cd_delta*me.deploy)*N;# N = normal force in G + } else { + me.FN = N * me.mass * g_fps;# FN = normal force in LBF (me.mass is in slugs) + me.CN = 2*me.FN/(me.rho*me.old_speed_fps*me.old_speed_fps*me.ref_area_sqft);# Normal coefficient formula + me.CL = me.CN*math.cos(me.myG*1.5*D2R)-me.Cd0*math.sin(1.5*me.myG*D2R);# Lift coefficient formula (works best if G is kept under 60degs) + me.Cdi = (me.CL*me.CL)/(math.pi*me.wing_eff*me.wing_aspect_ratio);#Induced drag formula + } + #me.printFlightDetails("At M%04.2f %04.1fG %06dft, Cdi is %06.1f%% of Cd0.", mach, N, me.alt_ft, 100*me.Cdi/me.Cd0); + + me.Cd0 = me["thrust_lbf"] != nil and me.thrust_lbf>0?me.Cd0*me.Cd_plume:me.Cd0; + } else { + me.Cdi = 0;# Cdi is done in another method + me.Cd0 = me["thrust_lbf"] != nil and me.thrust_lbf>0?me.Cd0*me.Cd_plume:me.Cd0 + } + + return me.Cd0+me.Cdi; + }, + + maxG: func (rho, max_g_sealevel) { + # Nikolai V. Chr.: A function to determine max G-force depending on air density. + # + # density for 0ft and 50kft: + #print("0:"~rho_sndspeed(0)[0]); = 0.0023769 + #print("50k:"~rho_sndspeed(50000)[0]); = 0.00036159 + # + # Fact: An aim-9j can do 22G at sealevel, 13G at 50Kft + # 13G = 22G * 0.5909 + # + # extra/inter-polation: + # f(x) = y1 + ((x - x1) / (x2 - x1)) * (y2 - y1) + # calculate its performance at current air density: + if (me.vector_thrust and me.thrust_lbf==0) max_g_sealevel=max_g_sealevel*0.666; + return me.clamp(max_g_sealevel+((rho-0.0023769)/(0.00036159-0.0023769))*(max_g_sealevel*0.5909-max_g_sealevel),0.25,100); + }, + + extrapolate: func (x, x1, x2, y1, y2) { + return y1 + ((x - x1) / (x2 - x1)) * (y2 - y1); + }, + + thrust: func () { + # Determine the thrust at this moment. + # + # If dropped, then ignited after fall time of what is the equivalent of 7ft. + # If the rocket is 2 stage, then ignite the second stage when 1st has burned out. + # + me.thrust_lbf = 0;# pounds force (lbf) + if (me.engineEnabled) { + if (me.life_time > (me.drop_time + me.stage_1_duration + me.stage_gap_duration + me.stage_2_duration + me.stage_3_duration)) { + me.thrust_lbf = 0; + } elsif (me.life_time > me.stage_1_duration + me.stage_gap_duration + me.drop_time + me.stage_2_duration) { + me.thrust_lbf = me.getMilThrust(me.force_lbf_3, 3); + } elsif (me.life_time > me.stage_1_duration + me.stage_gap_duration + me.drop_time) { + me.thrust_lbf = me.getMilThrust(me.force_lbf_2, 2); + } elsif (me.life_time > me.drop_time and me.life_time < me.drop_time+me.stage_1_duration) { + me.thrust_lbf = me.getMilThrust(me.force_lbf_1, 1); + }else { + me.thrust_lbf = 0; + } + } + + #me.force_cutoff_s = 0;# seen charts of real (aim9m) that thrust dont stop instantly, but fades out. This term would say hwo long it takes to fade out. Need to rework fuel consumption first. Maybe in future. + #if (me.life_time > (me.drop_time + me.stage_1_duration + me.stage_2_duration-me.force_cutoff_s) and me.life_time < (me.drop_time + me.stage_1_duration + me.stage_2_duration)) { + # me.thrust_lbf = me.extrapolate(me.life_time - (me.drop_time + me.stage_1_duration + me.stage_2_duration - me.force_cutoff_s),0,me.force_cutoff_s,me.thrust_lbf,0); + #} + + if (me.thrust_lbf < 1) { + me.smoke_prop.setBoolValue(0); + } else { + me.smoke_prop.setBoolValue(1); + } + return me.thrust_lbf; + }, + + getMilThrust: func (staticSealevel, stage) { + if (stage == 1 and !me.stage_1_jet) return staticSealevel;# Its a rocket engine + if (stage == 2 and !me.stage_2_jet) return staticSealevel; + if (stage == 3 and !me.stage_3_jet) return staticSealevel; + + # Its a jet engine: + me.staticLevel = staticSealevel*math.pow(me.jet_effectiveness,me.alt_ft/10000);# for every 10000 ft reduce by 75% + if (me.speed_m > 0.5) { + me.lvl = me.staticLevel*me.extrapolate(me.speed_m, 0.5, 1.5, 0.9, 1.5); + } elsif (me.speed_m > 0.2) { + me.lvl = me.staticLevel*0.9; + } else { + me.lvl = me.staticLevel*me.extrapolate(me.speed_m, 0.0, 0.2, 1, 0.9); + } + return me.lvl; + }, + + speedChange: func (thrust_lbf, rho, Cd) { + # Calculate speed change from last update. + # + # Acceleration = thrust/mass - drag/mass; + + me.acc = thrust_lbf / me.mass; + me.q = 0.5 * rho * me.old_speed_fps * me.old_speed_fps;# dynamic pressure + me.drag_acc = (Cd * me.q * me.ref_area_sqft) / me.mass; + + # get total new speed change (minus gravity) + return me.acc*me.dt - me.drag_acc*me.dt; + }, + + energyBleed: func (gForce, altitude) { + if (!me.simple_drag) return 0; + if (me.steer_for_free) gForce = 0; + # Bleed of energy from pulling Gs. + # This is very inaccurate, but better than nothing. + # + # First we get the speedloss due to normal drag: + me.b300 = me.bleed32800at0g(); + me.b000 = me.bleed0at0g(); + # + # We then subtract the normal drag from the loss due to G and normal drag. + me.b325 = me.bleed32800at25g()-me.b300; + me.b025 = me.bleed0at25g()-me.b000; + me.b300 = 0; + me.b000 = 0; + # + # We now find what the speedloss will be at sealevel and 32800 ft. + me.speedLoss32800 = me.b300 + ((gForce-0)/(25-0))*(me.b325 - me.b300); + me.speedLoss0 = me.b000 + ((gForce-0)/(25-0))*(me.b025 - me.b000); + # + # We then inter/extra-polate that to the currect density-altitude. + me.speedLoss = me.speedLoss0 + ((altitude-0)/(32800-0))*(me.speedLoss32800-me.speedLoss0); + # + # For good measure the result is clamped to below zero. + me.speedLoss = math.min(me.speedLoss, 0); + me.energyBleedKt += me.speedLoss * FPS2KT; + me.speedLoss = me.speedLoss*(me.thrust_lbf>0 and me.vector_thrust?0.333:1);# vector thrust will only bleed 1/3 of the calculated loss. + me.steer_for_free = 0; + return me.speedLoss; + }, + + bleed32800at0g: func () { + me.loss_mps = 0 + ((me.last_dt - 0)/(15 - 0))*(-330 - 0); + return me.loss_mps*M2FT; + }, + + bleed32800at25g: func () { + me.loss_mps = 0 + ((me.last_dt - 0)/(3.5 - 0))*(-240 - 0); + return me.loss_mps*M2FT; + }, + + bleed0at0g: func () { + me.loss_mps = 0 + ((me.last_dt - 0)/(22 - 0))*(-950 - 0); + return me.loss_mps*M2FT; + }, + + bleed0at25g: func () { + me.loss_mps = 0 + ((me.last_dt - 0)/(7 - 0))*(-750 - 0); + return me.loss_mps*M2FT; + }, + + setFirst: func() { + if (me.smoke_prop.getValue() == 1 and me.life_time < first_in_air_max_sec) { + if (me.first or !first_in_air) { + # report position over MP for MP animation of smoke trail. + me.first = 1; + first_in_air = 1; + if (me.mpShow) { + me.mpLat.setDoubleValue(me.coord.lat()); + me.mpLon.setDoubleValue(me.coord.lon()); + me.mpAlt.setDoubleValue(me.coord.alt()); + me.mpAltft.setDoubleValue(me.coord.alt()*M2FT); + } + } + } elsif (me.first and (me.life_time >= first_in_air_max_sec or me.life_time > me.drop_time + me.stage_1_duration + me.stage_gap_duration + me.stage_2_duration)) { + # this weapon was reporting its position over MP, but now its fuel has used up. So allow for another to do that. + me.resetFirst(); + } + }, + + resetFirst: func() { + first_in_air = 0; + me.first = 0; + if (me.mpShow) { + me.mpLat.setDoubleValue(0.0); + me.mpLon.setDoubleValue(0.0); + me.mpAlt.setDoubleValue(0.0); + me.mpAltft.setDoubleValue(0.0); + } + }, + + limitG: func () { + # + # Here will be set the max angle of pitch and the max angle of heading to avoid G overload + # + me.myG = me.steering_speed_G(me.hdg, me.pitch, me.track_signal_e, me.track_signal_h, me.old_speed_fps, me.dt); + + me.max_g_current_observing = me.limitHalfGs?me.max_g_current*0.5:me.max_g_current; + + if(me.myG > me.max_g_current_observing) + { + me.MyCoef = me.overload_limiter(me.hdg, me.pitch, me.track_signal_e, me.track_signal_h, me.old_speed_fps, me.dt, me.max_g_current_observing); + + me.track_signal_h = me.MyCoef[0]; + me.track_signal_e = me.MyCoef[1]; + + me.myGnew = me.steering_speed_G(me.hdg, me.pitch, me.track_signal_e, me.track_signal_h, me.old_speed_fps, me.dt); + #me.printFlight(sprintf("G2 %.2f", myG)~sprintf(" - Coeff %.2f", MyCoef)); + if (!me.limitGs) { + me.printFlight("%s: Missile pulling approx max G: %06.3f/%06.3f (%06.3f)", me.type, me.myGnew, me.max_g_current, me.myG); + } + me.myG = me.myGnew; + } + if (me.limitGs and me.myG > me.max_g_current/2) { + # Save the horiz high performance maneuvering for later + me.track_signal_e = me.track_signal_e /2; + } + }, + + setRadarProperties: func (new_speed_fps) { + # + # Set missile radar properties for use in selection view, radar and HUD. + # + me.self = geo.aircraft_position(); + me.ai.getNode("radar/bearing-deg", 1).setDoubleValue(me.self.course_to(me.coord)); + me.ai.getNode("radar/elevation-deg", 1).setDoubleValue(me.getPitch(me.self, me.coord)); + me.ai.getNode("radar/range-nm", 1).setDoubleValue(me.self.distance_to(me.coord)*M2NM); + me.ai.getNode("velocities/true-airspeed-kt",1).setDoubleValue(new_speed_fps * FPS2KT); + me.ai.getNode("velocities/vertical-speed-fps",1).setDoubleValue(-me.speed_down_fps); + }, + + rear_aspect: func (munition_coord, test_contact) { + # + # If is heat-seeking rear-aspect-only missile, check if it has good view on engine(s) and can keep lock. + # + me.offset = me.aspectToExhaust(munition_coord, test_contact); + + if (me.offset < 45) { + # clear view of engine heat, keep the lock + me.rearAspect = 1; + } else { + # the greater angle away from clear engine view the greater chance of losing lock. + me.offset_away = me.offset - 45; + me.probability = me.offset_away/135; + me.probability = me.probability*2.5;# The higher the factor, the less chance to keep lock. + me.rearAspect = rand() > me.probability; + } + + me.printGuideDetails("Heatseeker deviation from full rear-aspect: "~sprintf("%05.1f", me.offset)~" deg, keep IR lock on engine: "~me.rearAspect); + + return me.rearAspect;# 1: keep lock, 0: lose lock + }, + + aspectToExhaust: func (munition_coord, test_contact) { + # return angle to viewing rear of target + me.vectorToEcho = me.myMath.eulerToCartesian2(-munition_coord.course_to(test_contact.get_Coord()), me.myMath.getPitch(munition_coord, test_contact.get_Coord())); + me.vectorEchoNose = me.myMath.eulerToCartesian3X(-test_contact.get_heading(), test_contact.get_Pitch(), test_contact.get_Roll()); + me.angleToRear = geo.normdeg180(me.myMath.angleBetweenVectors(me.vectorToEcho, me.vectorEchoNose)); + #me.printGuideDetails(sprintf("Angle to rear %d degs.", math.abs(me.angleToRear)); + return math.abs(me.angleToRear); + }, + + aspectToTop: func () { + # WIP: not used, and might never be + me.vectorEchoTop = me.myMath.eulerToCartesian3Z(-echoHeading, echoPitch, echoRoll); + me.view2D = me.myMath.projVectorOnPlane(me.vectorEchoTop, me.vectorToEcho); + me.angleToNose = geo.normdeg180(me.myMath.angleBetweenVectors(me.vectorEchoNose, me.view2D)+180); + me.angleToBelly = geo.normdeg180(me.myMath.angleBetweenVectors(me.vectorEchoTop, me.vectorToEcho)); + }, + + guide: func() { + # + # navigation and guidance + # + + me.raw_steer_signal_elev = 0; + me.raw_steer_signal_head = 0; + + me.guiding = 1; + + if (me.guidance == "sample") { + me.blep = me.Tgt.getLastGroundTrackBlep(); + if (me.blep == nil and me.newTargetAssigned) { + # TODO: Do not remember what this is for + me.t_coord_sampled = me.t_coord; + } elsif (me.blep == nil) { + me.free = 1; + me.guiding = 0; + } elsif (me.blep.getID() != me["blepID"]) { + thread.lock(me.blep.mutex); + me.blepID = me.blep.getID(); + thread.unlock(me.blep.mutex); + me.blepIDtime = me.life_time; + me.t_coord_sampled = me.t_coord; + } elsif (me["blepIDtime"] != nil) { + me.dtTrack = me.life_time - me.blepIDtime; + thread.lock(me.blep.mutex); + me.ecefVel = me.blep.getECEFVelocity(); + me.blep_coord = geo.Coord.new(me.blep.getCoord()); + thread.unlock(me.blep.mutex); + me.t_coord_sampled = geo.Coord.new(); + + # dead-reckon: + me.t_coord_sampled.set_xyz(me.blep_coord.x()+me.ecefVel[0]*me.dtTrack, me.blep_coord.y()+me.ecefVel[1]*me.dtTrack, me.blep_coord.z()+me.ecefVel[2]*me.dtTrack); + me.t_coord_sampled.set_alt(me.blep_coord.alt());# we don't dead-reackon alt due to curvature of earth + } else { + me.free = 1; + me.guiding = 0; + } + } else { + me.t_coord_sampled = me.t_coord; + } + if (me["t_coord_sampled"] == nil) { + # Without this, t_coord_sampled can possibly be undefined in maddog mode. + me.t_coord_sampled = me.t_coord; + } + + # Calculate current target elevation and azimut deviation. + me.t_alt = me.t_coord_sampled.alt()*M2FT; + #var t_alt_delta_m = (me.t_alt - me.alt_ft) * FT2M; + me.dist_curr = me.coord.distance_to(me.t_coord_sampled); + me.dist_curr_direct = me.coord.direct_distance_to(me.t_coord_sampled); + me.dist_curr_hypo = math.sqrt(me.dist_curr_direct*me.dist_curr_direct+math.pow(me.t_coord_sampled.alt()-me.coord.alt(),2)); + me.t_elev_deg = me.getPitch(me.coord, me.t_coord_sampled); + me.t_course = me.coord.course_to(me.t_coord_sampled); + me.curr_deviation_e = me.t_elev_deg - me.pitch; + me.curr_deviation_h = me.t_course - me.hdg; + + #var (t_course, me.dist_curr) = courseAndDistance(me.coord, me.t_coord); + #me.dist_curr = me.dist_curr * NM2M; + + me.curr_deviation_h = geo.normdeg180(me.curr_deviation_h); + + me.printFlightDetails("Elevation to target %05.2f degs, pitch deviation %05.2f degs, pitch %05.2f degs", me.t_elev_deg, me.curr_deviation_e, me.pitch); + me.printFlightDetails("Bearing to target %06.2f degs, heading deviation %06.2f degs, heading %06.2f degs", me.t_course, me.curr_deviation_h, me.hdg); + me.printFlightDetails("Altitude above launch platform = %07.1f ft", M2FT * (me.coord.alt()-me.ac.alt())); + me.printFlightDetails("Altitude. Target %07.1f. Missile %07.1f. Atan2 %04.1f degs", me.t_coord_sampled.alt()*M2FT, me.coord.alt()*M2FT, math.atan2( me.t_coord_sampled.alt()-me.coord.alt(), me.dist_curr ) * R2D); + + + + if (math.abs(me.curr_deviation_h) < 15) { + me.guidanceLawHorizInit = 0; + } + + me.checkForLOS(); + + me.checkForGuidance(); + + me.checkForSun(); + + me.checkForFlare(); + + me.checkForChaff(); + + me.canSeekerKeepUp(); + + me.cruiseAndLoft(); + + me.APN();# Proportional navigation + + #me.adjustToKeepLock(); + + me.track_signal_e = me.raw_steer_signal_elev * !me.free * me.guiding; + me.track_signal_h = me.raw_steer_signal_head * !me.free * me.guiding; + + me.printGuideDetails("%04.1f deg elevate command desired", me.track_signal_e); + me.printGuideDetails("%05.1f deg heading command desired", me.track_signal_h); + + # record some variables for next loop: + me.dist_last = me.dist_curr; + me.dist_direct_last = me.dist_curr_direct; + me.dist_last_hypo = me.dist_curr_hypo; + me.last_t_course = me.t_course; + me.last_t_elev_deg = me.t_elev_deg; + me.last_cruise_or_loft = me.cruise_or_loft; + + if (!(me.fovLost or me.lostLOS or me.radLostLock or me.semiLostLock or me.heatLostLock)) { + # me.tooLowSpeed not included in check on purpose + me.hasGuided = 1; + } + me.newTargetAssigned=0; + }, + + checkForFlare: func () { + # + # Check for being fooled by flare. + # + if (me.Tgt != nil and me.fovLost != 1 and me.guidance == "heat" and !me.flareLock and (me.life_time-me.flareTime) > 1) { + # the fov check is for loal missiles that should not lock onto flares from aircraft not in view. + # + # TODO: Use Richards Emissary for this. + # + me.flareNode = me.Tgt.getFlareNode(); + if (me.flareNode != nil) { + me.flareNumber = me.flareNode.getValue(); + if (me.flareNumber != nil and me.flareNumber != 0) { + if (me.flareNumber != me.flareLast) { + # target has released a new flare, lets check if it fools us + me.flareTime = me.life_time; + me.flareLast = me.flareNumber; + me.aspectDeg = me.aspectToExhaust(me.coord, me.Tgt) / 180; + me.flareLock = rand() < (1-me.flareResistance + ((1-me.flareResistance) * 0.5 * me.aspectDeg));# 50% extra chance to be fooled if front aspect + if (me.flareLock) { + # fooled by the flare + me.printStats(me.type~": Missile locked on flare from "~me.callsign); + me.flarespeed_fps = me.Tgt.get_Speed()*KT2FPS; + me.flare_hdg = me.Tgt.get_heading(); + me.flare_pitch = me.Tgt.get_Pitch(); + } else { + me.printStats(me.type~": Missile ignored flare from "~me.callsign); + } + } + } + } + } + }, + + checkForChaff: func () { + # + # Check for being fooled by chaff. + # + if (me.Tgt != nil and me.fovLost != 1 and (me.guidance == "radar" or me.guidance == "semi-radar" or me.guidance == "command" or me.guidance == "tvm") and !me.chaffLock and (me.life_time-me.chaffTime) > 1) { + # + # TODO: Use Richards Emissary for this. + # + me.chaffNode = me.Tgt.getChaffNode();#error + if (me.chaffNode != nil) { + me.chaffNumber = me.chaffNode.getValue(); + if (me.chaffNumber != nil and me.chaffNumber != 0) { + if (me.chaffNumber != me.chaffLast) {# problem here is MP interpolates to new values. Hence the timer. + # target has released a new chaff, lets check if it blinds us + me.chaffLast = me.chaffNumber; + me.chaffTime = me.life_time; + me.aspectDeg = me.aspectToExhaust(me.coord, me.Tgt) / 180;# 0 = viewing engine, 1 = front + me.redux = me.guidance == "semi-radar" or me.guidance == "command" or me.guidance == "tvm"?(me.gnd_launch?0.5:0.75):1; + me.chaffChance = (1-me.chaffResistance)*me.redux; + me.chaffLock = rand() < (me.chaffChance - (me.chaffChance * 0.5 * me.aspectDeg));# 50% less chance to be fooled if front aspect + + if (me.chaffLock) { + me.printStats(me.type~": Missile locked on chaff from "~me.callsign); + me.flarespeed_fps = me.Tgt.get_Speed()*KT2FPS; + me.flare_hdg = me.Tgt.get_heading(); + me.flare_pitch = me.Tgt.get_Pitch(); + me.chaffLockTime = me.life_time; + } else { + me.printStats(me.type~": Missile ignored chaff from "~me.callsign); + } + } + } + } + } + }, + + checkForSun: func () { + if (me.fovLost != 1 and me.guidance == "heat" and me.sun_enabled and getprop("/rendering/scene/diffuse/red") > 0.6) { + # test for heat seeker locked on to sun + me.sun_dev_e = me.getPitch(me.coord, me.sun) - me.pitch; + me.sun_dev_h = me.coord.course_to(me.sun) - me.hdg; + me.sun_dev_h = geo.normdeg180(me.sun_dev_h); + # now we check if the sun is behind the target, which is the direction the gyro seeker is pointed at: + me.sun_dev = math.sqrt((me.sun_dev_e-me.curr_deviation_e)*(me.sun_dev_e-me.curr_deviation_e)+(me.sun_dev_h-me.curr_deviation_h)*(me.sun_dev_h-me.curr_deviation_h)); + if (me.sun_dev < me.sun_lock) { + me.printStats(me.type~": Locked onto sun, lost target. "); + me.lock_on_sun = 1; + me.free = 1; + } + } + }, + + checkForLOS: func () { + if (pickingMethod and me.guidance != "gps" and me.guidance != "gps-laser" and me.guidance != "unguided" and me.guidance != "inertial" and me.guidance != "sample") { + me.xyz = {"x":me.coord.x(), "y":me.coord.y(), "z":me.coord.z()}; + me.directionLOS = {"x":me.t_coord.x()-me.coord.x(), "y":me.t_coord.y()-me.coord.y(), "z":me.t_coord.z()-me.coord.z()}; + + # Check for terrain between own weapon and target: + me.terrainGeod = get_cart_ground_intersection(me.xyz, me.directionLOS); + if (me.terrainGeod == nil) { + me.lostLOS = 0; + return; + } else { + me.terrain = geo.Coord.new(); + me.terrain.set_latlon(me.terrainGeod.lat, me.terrainGeod.lon, me.terrainGeod.elevation); + me.maxDist = me.coord.direct_distance_to(me.t_coord)-1;#-1 is to avoid z-fighting distance + me.terrainDist = me.coord.direct_distance_to(me.terrain); + if (me.terrainDist >= me.maxDist) { + me.lostLOS = 0; + return; + } + } + if (me.reaquire) { + if (!me.lostLOS) { + me.printStats(me.type~": Not guiding (lost line of sight, trying to reaquire)"); + } + me.lostLOS = 1; + me.guiding = 0; + return; + } else { + if (!me.lostLOS) { + me.printStats(me.type~": Gave up (lost line of sight)"); + } + me.lostLOS = 1; + me.free = 1; + return; + } + } + me.lostLOS = 0; + }, + + checkForGuidance: func () { + if(me.tooLowSpeed) { + me.guiding = 0; + } elsif ((me.guidance == "semi-radar" and !me.is_painted(me.Tgt)) or (me.guidance =="laser" and !me.is_laser_painted(me.Tgt)) ) { + # if its semi-radar guided and the target is no longer painted + me.guiding = 0; + if (me.reaquire) { + if (!me.semiLostLock) { + me.printStats(me.type~": Not guiding (lost radar reflection, trying to reaquire)"); + } + me.semiLostLock = 1; + } else { + me.printStats(me.type~": Not guiding (lost radar reflection, gave up)"); + me.free = 1; + } + } elsif ((me.guidance == "command" or me.guidance == "tvm") and (me.Tgt == nil or !me.Tgt.isCommandActive())) { + # if its command or TVM guided and the control no longer sends commands + me.guiding = 0; + me.printStats(me.type~": Not guiding (no commands from controller)"); + } elsif (me.guidance == "radiation" and !me.is_radiating_me(me.Tgt)) { + # if its radiation guided and the target is not illuminating us with radiation + me.guiding = 0; + if (me.reaquire) { + if (!me.radLostLock) { + me.printStats(me.type~": Not guiding (lost radiation, trying to reaquire)"); + } + me.radLostLock = 1; + } else { + me.printStats(me.type~": Not guiding (lost radiation, gave up)"); + me.free = 1; + } + } elsif (me.guidance != "gps" and me.guidance != "gps-laser" and me.guidance != "inertial" and me.guidance != "sample" and (me.dist_curr_direct*M2NM > me.detect_range_curr_nm or !me.FOV_check(me.hdg, me.pitch, me.curr_deviation_h, me.curr_deviation_e, me.max_seeker_dev, me.myMath))) { + # target is not in missile seeker view anymore + + if (!me.fovLost and me.detect_range_curr_nm != 0) { + me.normFOV = me.FOV_check_norm(me.hdg, me.pitch, me.curr_deviation_h, me.curr_deviation_e, me.max_seeker_dev, me.myMath); + me.printStats(me.type~": "~me.callsign~" is not in seeker view. (%d%% in view, %d%% in range)", me.normFOV*100, 100*me.dist_curr_direct*M2NM / me.detect_range_curr_nm);#~me.viewLost); + } elsif (!me.fovLost) { + me.normFOV = me.FOV_check_norm(me.hdg, me.pitch, me.curr_deviation_h, me.curr_deviation_e, me.max_seeker_dev, me.myMath); + me.printStats(me.type~": "~me.callsign~" is not in seeker view. (%d%% in view)", me.normFOV*100);#~me.viewLost); + } + if (!me.reaquire) { + me.free = 1; + } else { + me.fovLost = 1; + me.guiding = 0; + } + } elsif (!me.all_aspect and !me.rear_aspect(me.coord, me.Tgt)) { + me.guiding = 0; + if (!me.heatLostLock) { + me.printStats(me.type~": Missile lost heat lock, attempting to reaquire.."); + } + me.heatLostLock = 1; + } elsif (me.life_time < me.drop_time and !me.guideWhileDrop) { + me.guiding = 0; + } elsif (me.semiLostLock) { + me.printStats(me.type~": Reaquired reflection."); + me.semiLostLock = 0; + } elsif (me.radLostLock) { + me.printStats(me.type~": Reaquired radiation."); + me.radLostLock = 0; + } elsif (me.heatLostLock) { + me.printStats(me.type~": Regained heat lock."); + me.heatLostLock = 0; + } elsif (me.tooLowSpeed) { + me.printStats(me.type~": Gained speed and started guiding."); + me.tooLowSpeed = 0; + } elsif (me.fovLost) { + me.printStats(me.type~": Regained view of target."); + me.fovLost = 0; + } elsif (me.loal and me.maddog) { + me.printStats(me.type~": "~me.callsign~" is potential target. ("~me.Tgt.get_type()~","~me.class~")"); + } + if (me.speed_m >= me.min_speed_for_guiding) { + me.tooLowSpeedPass = 1; + if (me.tooLowSpeedTime == -1) { + me.tooLowSpeedTime = me.life_time; + me.normFOV = me.FOV_check_norm(me.hdg, me.pitch, me.curr_deviation_h, me.curr_deviation_e, me.max_seeker_dev, me.myMath); + me.printStats(me.type~": Passed minimum speed for guiding after %.1f seconds. Target %d%% inside view.", me.life_time, me.normFOV*100); + } + } + if (me.chaffLock and (me.guidance == "command" or me.guidance == "semi-radar" or me.guidance == "tvm") and (me.life_time - me.chaffLockTime) > (me.gnd_launch?4:6)) { + me.chaffLock = 0; + me.printStats(me.type~": Chaff dissipated, regained track."); + } + }, + + adjustToKeepLock: func { + if (me.guidance != "gps" and me.guidance != "gps-laser" and me.guidance != "inertial" and me.guidance != "sample") { + if (!me.FOV_check(me.hdg, me.pitch, me.curr_deviation_h+me.raw_steer_signal_head, me.curr_deviation_e+me.raw_steer_signal_elev, me.max_seeker_dev, me.myMath) and me.fov_radial != 0) { + # the commanded steer order will make the missile lose its lock, to prevent that we reduce the steering just enough so lock wont be lost. + me.factorKeep = me.max_seeker_dev/me.fov_radial; + me.raw_steer_signal_elev = (me.curr_deviation_e+me.raw_steer_signal_elev)*me.factorKeep-me.curr_deviation_e; + me.raw_steer_signal_head = (me.curr_deviation_h+me.raw_steer_signal_head)*me.factorKeep-me.curr_deviation_h; + } + } + }, + + canSeekerKeepUp: func () { + me.globalVectorToTarget = me.myMath.eulerToCartesian3X(-me.t_course, me.t_elev_deg, 0); + me.localVectorTarget = me.myMath.yawPitchVector(me.hdg, -me.pitch, me.globalVectorToTarget); + if (me.counter == me.counter_last+1 and !me.newTargetAssigned and me["localVectorSeeker"] != nil and (me.guidance == "heat" or me.guidance == "vision") and me.prevGuidance == me.guidance and me.prevTarget == me.Tgt) { + # calculate if the seeker can keep up with the angular change of the target + # + # missile own movement is subtracted from this change due to seeker being on gyroscope + # + if (!me.caged) { + # Gyro is stabilized + me.localVectorSeeker = me.myMath.yawPitchVector(me.last_track_h, -me.last_track_e, me.localVectorSeeker); + } + me.angleSeekerToTarget = me.myMath.angleBetweenVectors(me.localVectorSeeker, me.localVectorTarget); + me.deviation_per_sec = me.angleSeekerToTarget/me.dt; + + if (me.deviation_per_sec > me.angular_speed) { + if (me.angleSeekerToTarget < me.beam_width_deg) { + me.max_seekertrack = me.angular_speed * me.dt; + me.localVectorSeeker = me.myMath.rotateVectorTowardsVector(me.localVectorSeeker, me.localVectorTarget, me.max_seekertrack); + me.printStatsDetails("%s: %4.1f deg/s too fast angular change for seeker head. %5.2fnm to target. Target still in beam though: %4.2f/%4.2f degs.", me.type, me.deviation_per_sec, me.dist_curr_direct*M2NM, me.angleSeekerToTarget-me.max_seekertrack, me.beam_width_deg); + } else { + # lost lock due to angular speed limit could not keep target in beam + me.printStats("%s: %4.1f deg/s too fast angular change for seeker head to keep target in beam. %5.2fnm to target.", me.type, me.deviation_per_sec, me.dist_curr_direct*M2NM); + me.free = 1; + } + } else { + me.localVectorSeeker = me.localVectorTarget; + me.printStatsDetails("%s: %4.1f deg/s fine angular change for seeker head. %5.2fnm to target.", me.type, me.deviation_per_sec, me.dist_curr_direct*M2NM); + } + } else { + me.localVectorSeeker = me.localVectorTarget; + } + me.prevTarget = me.Tgt; + me.counter_last = me.counter;# since we use dt as time passed since last we were in this function, we need to be sure only 1 loop has passed. + }, + + cruiseAndLoft: func () { + # + # cruise, loft, cruise-missile + # + if (!me.guiding) { + return; + } + me.loft_angle = 15;# notice Shinobi used 26.5651 degs, but Raider1 found a source saying 10-20 degs. + me.cruise_or_loft = 0;# If true then this method handles the vertical component of guiding. + me.time_before_snap_up = me.drop_time * 3; + me.limitGs = 0; + me.limitHalfGs = 0; + + if (me.loft_alt != 0 and me.guidanceLaw == "direct-alt") { + me.t_alt_delta_ft = me.loft_alt - me.alt_ft; + if(me.t_alt_delta_ft < 0) { + me.printGuide("Moving down %5d ft M%.3f %.2fNM %d",-me.t_alt_delta_ft, me.speed_m, me.dist_curr*M2NM,me.alt_ft); + me.slope = me.clamp(me.t_alt_delta_ft / 300, -30, 0);# the lower the desired alt is, the steeper the slope, but not steeper than 30 + me.raw_steer_signal_elev = -me.pitch + me.clamp(math.atan2(me.t_alt_delta_ft, me.old_speed_fps * 15) * R2D, me.slope, 0); + } elsif (me.speed_m > 0.6) { + me.printGuide("Moving up %5d ft M%.3f %.2fNM %d", me.t_alt_delta_ft, me.speed_m, me.dist_curr*M2NM,me.alt_ft); + me.raw_steer_signal_elev = -me.pitch + math.atan2(me.t_alt_delta_ft, me.old_speed_fps * 75) * R2D; + } else { + #me.raw_steer_signal_elev = 0; + me.printGuide(" no move M%.3f %.2fNM %d", me.speed_m, me.dist_curr*M2NM,me.alt_ft); + me.attitudePN = (math.atan2(-(me.speed_down_fps+g_fps * me.dt), me.speed_horizontal_fps ) - math.atan2(-me.speed_down_fps, me.speed_horizontal_fps )) * R2D; + me.gravComp = - me.attitudePN; + #printf("Gravity compensation %0.2f degs", me.gravComp); + me.raw_steer_signal_elev = me.gravComp; + me.steer_for_free = 1;#due to having wings + } + me.cruise_or_loft = 1; + me.limitHalfGs = 1; + } elsif(me.loft_alt != 0 and !me.snapUp) { + # this is for Air to ground/sea cruise-missile (SCALP, Sea-Eagle, Taurus, Tomahawk, RB-15...) + + var code = 1;# 0 = old, 1 = new, 2 = angle + + if (code == 2) {# angle code + me.terrainStage += 1;# only 1 terrain check in each stage. + if (me.terrainStage > 5) { + me.terrainStage = 0; + } + if (me.terrainStage == 0) { + # down + me.terrainUnder = geo.elevation(me.coord.lat(),me.coord.lon()); + } elsif (me.terrainStage == 1) { + # level + me.geoPlus = me.nextGeoloc(me.coord.lat(), me.coord.lon(), me.hdg, me.old_speed_fps, 5, me.coord.alt()); + + xyz = {"x":me.coord.x(), "y":me.coord.y(), "z":me.coord.z()}; + dir = {"x":me.geoPlus.x()-me.coord.x(), "y":me.geoPlus.y()-me.coord.y(), "z":me.geoPlus.z()-me.coord.z()}; + me.groundIntersectResult = get_cart_ground_intersection(xyz, dir); + if(me.groundIntersectResult == nil) { + me.terrainLevel = 1000000; + } else { + GroundIntersectCoord.set_latlon(me.groundIntersectResult.lat, me.groundIntersectResult.lon, me.groundIntersectResult.elevation); + me.terrainLevel = me.coord.direct_distance_to(me.groundIntersectCoord); + } + } elsif (me.terrainStage == 2) { + # negative angle + me.geoPlus = me.nextGeoloc(me.coord.lat(), me.coord.lon(), me.hdg, me.old_speed_fps, 5, me.coord.alt()); + + xyz = {"x":me.coord.x(), "y":me.coord.y(), "z":me.coord.z()}; + dir = {"x":me.geoPlus.x()-me.coord.x(), "y":me.geoPlus.y()-me.coord.y(), "z":me.geoPlus.z()-me.coord.z()}; + me.groundIntersectResult = get_cart_ground_intersection(xyz, dir); + if(me.groundIntersectResult == nil) { + me.terrainLevel = 1000000; + } else { + GroundIntersectCoord.set_latlon(me.groundIntersectResult.lat, me.groundIntersectResult.lon, me.groundIntersectResult.elevation); + me.terrainLevel = me.coord.direct_distance_to(me.groundIntersectCoord); + } + } + + } elsif (code == 1) {# Shinobi's new code + #Variable declaration + var No_terrain = 0; + var distance_Target = 0; + var xyz = nil; + var dir = nil; + var GroundIntersectCoord = geo.Coord.new(); + var howmany = 0; + var altitude_step = 30; + + # Do terrain following for air/ground missile (but not anti-ship), or if explicitly set with me.follow + if (me.follow or (me.Tgt != nil and (me.Tgt.get_type() == SURFACE or me.Tgt.get_type() == POINT))) { + # detect terrain for use in terrain following + me.nextGroundElevationMem[1] -= 1; + #First we need origin coordinates we transorfm it in xyz + xyz = {"x":me.coord.x(), "y":me.coord.y(), "z":me.coord.z()}; + + #Then we need the coordinate of the future point at let say 20 dt + me.geoPlus4 = me.nextGeoloc(me.coord.lat(), me.coord.lon(), me.hdg, me.old_speed_fps, 5); + me.geoAlt = geo.elevation(me.geoPlus4.lat(),me.geoPlus4.lon()); + if (me.geoAlt != nil) { + me.geoPlus4.set_alt(me.geoAlt); + } + + #Loop + while(No_terrain != 1){ + howmany = howmany + 1; + #We finalize the vector + dir = {"x":me.geoPlus4.x()-me.coord.x(), "y":me.geoPlus4.y()-me.coord.y(), "z":me.geoPlus4.z()-me.coord.z()}; + #We measure distance to be sure that the ground intersection is closer than geoPlus4 + distance_Target = me.coord.direct_distance_to(me.geoPlus4); + # Check for terrain between own aircraft and other: + GroundIntersectResult = get_cart_ground_intersection(xyz, dir); + if(GroundIntersectResult == nil){ + No_terrain = 1; + #Checking if the distance to the intersection is before or after geoPlus4 + }else{ + GroundIntersectCoord.set_latlon(GroundIntersectResult.lat, GroundIntersectResult.lon, GroundIntersectResult.elevation); + # Factor 0.95 to account for error in the two distance computations. + # Otherwise falso positive obstacle detection occurs. + if(me.coord.direct_distance_to(GroundIntersectCoord) > 0.95 * distance_Target){ + No_terrain = 1; + }else{ + #Raising geoPlus4 altitude by 100 meters + me.geoPlus4.set_alt(me.geoPlus4.alt()+altitude_step); + #print("Alt too low :" ~ me.geoPlus4.alt() ~ "; Raising alt by 30 meters (100 feet)"); + } + } + + } + me.printGuideDetails("There was : " ~ howmany ~ " iteration of the ground loop"); + me.nextGroundElevation = me.geoPlus4.alt(); + + me.Daground = me.nextGroundElevation * M2FT; + } else { + me.Daground = 0;# zero for sealevel in case target is ship. Don't shoot A/S missiles over terrain. :) + } + + me.loft_alt_curr = me.loft_alt; + if (me.Tgt != nil and me.dist_curr < me.old_speed_fps * me.terminal_rise_time * FT2M and me.dist_curr > me.old_speed_fps * me.terminal_dive_time * FT2M) { + # the missile lofts a bit at the end to avoid PN to slam it into ground before target is reached. + # end here is between 2.5-4 seconds + me.loft_alt_curr = me.loft_alt*me.terminal_alt_factor; + } + if (me.Tgt == nil or me.dist_curr > me.old_speed_fps * me.terminal_dive_time * FT2M) {# need to give the missile time to do final navigation + # Here we do the actual steering over terrain + me.t_alt_delta_ft = (me.loft_alt_curr + me.Daground - me.alt_ft); + me.printGuideDetails("var t_alt_delta_m : "~me.t_alt_delta_ft*FT2M); + if(me.loft_alt_curr + me.Daground > me.alt_ft) { + me.printGuideDetails("Moving up"); + me.raw_steer_signal_elev = -me.pitch + math.atan2(me.t_alt_delta_ft, me.old_speed_fps * me.dt * 5) * R2D; + } else { + me.printGuideDetails("Moving down"); + me.slope = me.clamp(me.t_alt_delta_ft / 300, -7.5, 0);# the lower the desired alt is, the steeper the slope, but not steeper than 7.5 + me.raw_steer_signal_elev = -me.pitch + me.clamp(math.atan2(me.t_alt_delta_ft, me.old_speed_fps * me.dt * 5) * R2D, me.slope, 0); + } + me.cruise_or_loft = 1; + } + if (me.cruise_or_loft) { + me.printGuideDetails(" pitch "~me.pitch~" + me.raw_steer_signal_elev "~me.raw_steer_signal_elev); + } + } else {#Older code + # detect terrain for use in terrain following + me.nextGroundElevationMem[1] -= 1; + me.geoPlus2 = me.nextGeoloc(me.coord.lat(), me.coord.lon(), me.hdg, me.old_speed_fps, me.dt*5); + me.geoPlus3 = me.nextGeoloc(me.coord.lat(), me.coord.lon(), me.hdg, me.old_speed_fps, me.dt*10); + me.geoPlus4 = me.nextGeoloc(me.coord.lat(), me.coord.lon(), me.hdg, me.old_speed_fps, me.dt*20); + me.e1 = geo.elevation(me.coord.lat(), me.coord.lon());# This is done, to make sure is does not decline before it has passed obstacle. + me.e2 = geo.elevation(me.geoPlus2.lat(), me.geoPlus2.lon());# This is the main one. + me.e3 = geo.elevation(me.geoPlus3.lat(), me.geoPlus3.lon());# This is an extra, just in case there is an high cliff it needs longer time to climb. + me.e4 = geo.elevation(me.geoPlus4.lat(), me.geoPlus4.lon()); + if (me.e1 != nil) { + me.nextGroundElevation = me.e1; + } else { + me.printFlight(me.type~": nil terrain, blame terrasync! Cruise-missile keeping altitude."); + } + if (me.e2 != nil and me.e2 > me.nextGroundElevation) { + me.nextGroundElevation = me.e2; + if (me.e2 > me.nextGroundElevationMem[0] or me.nextGroundElevationMem[1] < 0) { + me.nextGroundElevationMem[0] = me.e2; + me.nextGroundElevationMem[1] = 5; + } + } + if (me.nextGroundElevationMem[0] > me.nextGroundElevation) { + me.nextGroundElevation = me.nextGroundElevationMem[0]; + } + if (me.e3 != nil and me.e3 > me.nextGroundElevation) { + me.nextGroundElevation = me.e3; + } + if (me.e4 != nil and me.e4 > me.nextGroundElevation) { + me.nextGroundElevation = me.e4; + } + + me.Daground = 0;# zero for sealevel in case target is ship. Don't shoot A/S missiles over terrain. :) + if(me.Tgt.get_type() == SURFACE or me.follow) { + me.Daground = me.nextGroundElevation * M2FT; + } + me.loft_alt_curr = me.loft_alt; + if (me.dist_curr < me.old_speed_fps * me.terminal_rise_time * FT2M and me.dist_curr > me.old_speed_fps * me.terminal_dive_time * FT2M) { + # the missile lofts a bit at the end to avoid APN to slam it into ground before target is reached. + # end here is between 2.5-4 seconds + me.loft_alt_curr = me.loft_alt*me.terminal_alt_factor; + } + if (me.dist_curr > me.old_speed_fps * me.terminal_dive_time * FT2M) {# need to give the missile time to do final navigation + # it's 1 or 2 seconds for this kinds of missiles... + me.t_alt_delta_ft = (me.loft_alt_curr + me.Daground - me.alt_ft); + me.printGuideDetails("var t_alt_delta_m : "~me.t_alt_delta_ft*FT2M); + if(me.loft_alt_curr + me.Daground > me.alt_ft) { + # 200 is for a very short reaction to terrain + me.printGuideDetails("Moving up"); + me.raw_steer_signal_elev = -me.pitch + math.atan2(me.t_alt_delta_ft, me.old_speed_fps * me.dt * 5) * R2D; + } else { + # that means a dive angle of 22.5° (a bit less + # coz me.alt is in feet) (I let this alt in feet on purpose (more this figure is low, more the future pitch is high) + me.printGuideDetails("Moving down"); + me.slope = me.clamp(me.t_alt_delta_ft / 300, -7.5, 0);# the lower the desired alt is, the steeper the slope. + me.raw_steer_signal_elev = -me.pitch + me.clamp(math.atan2(me.t_alt_delta_ft, me.old_speed_fps * me.dt * 5) * R2D, me.slope, 0); + } + me.cruise_or_loft = 1; + } + if (me.cruise_or_loft) { + me.printGuideDetails(" pitch "~me.pitch~" + me.raw_steer_signal_elev "~me.raw_steer_signal_elev); + } + } + #} elsif (me.rail == 1 and me.rail_forward == 0 and me.rotate_token == 0) { + # tube launched missile turns towards target + + # me.raw_steer_signal_elev = me.curr_deviation_e; + # me.printGuideDetails("Turning, desire "~me.t_elev_deg~" degs pitch."); + # me.cruise_or_loft = 1; + # me.limitGs = 1; + # if (math.abs(me.curr_deviation_e) < 20) { + # me.rotate_token = 1; + # me.printGuide("Is last turn, snap-up/PN takes it from here..") + # } + } elsif (me.snapUp and me.t_elev_deg > me.clamp(-50/me.speed_m,-30,-5) and me.dist_curr * M2NM > me.speed_m * 6 + and me.t_elev_deg < me.loft_angle #and me.t_elev_deg > -7.5 + and !me.dive_token) { + # lofting: due to target is more than 10 miles out and we havent reached + # our desired cruising alt, and the elevation to target is less than lofting angle. + # The -7.5 limit, is so the seeker don't lose track of target when lofting. + if (me.life_time < me.time_before_snap_up and me.coord.alt() * M2FT < me.loft_alt) { + me.printGuide("preparing for lofting"); + me.cruise_or_loft = 1; + } elsif (me.coord.alt() * M2FT < me.loft_alt) { + me.raw_steer_signal_elev = -me.pitch + me.loft_angle; + me.limitGs = 1; + me.printGuide("Lofting %04.1f degs, dev is %04.1f", me.loft_angle, me.raw_steer_signal_elev); + } else { + me.dive_token = 1; + me.printGuide("Stopped lofting"); + } + me.cruise_or_loft = 1; + } elsif (me.snapUp and me.coord.alt() > me.t_coord.alt() and me.last_cruise_or_loft + and me.t_elev_deg > me.clamp(-50/me.speed_m,-30,-5) and me.dist_curr * M2NM > me.speed_m * 5.5) { + # cruising: keeping altitude since target is below and more than -45 degs down + + me.ratio = (g_fps * me.dt)/me.old_speed_fps; + me.attitude = 0; + + if (me.ratio < 1 and me.ratio > -1) { + me.attitude = math.asin(me.ratio)*R2D; + } + + me.raw_steer_signal_elev = -me.pitch + me.attitude; + me.printGuideDetails("Cruising, desire "~me.attitude~" degs pitch."); + me.cruise_or_loft = 1; + me.limitGs = 1; + me.dive_token = 1; + } elsif (me.last_cruise_or_loft and math.abs(me.curr_deviation_e) > 25 and me.life_time > me.time_before_snap_up) { + # after cruising, point the missile in the general direction of the target, before PN starts guiding. + me.printGuide("Rotating toward target"); + me.raw_steer_signal_elev = me.curr_deviation_e; + me.cruise_or_loft = 1; + #me.limitGs = 1; + + # TODO: this needs to be worked on. + } + }, + + level: func () { + me.attitudePN = math.atan2(-(me.speed_down_fps+g_fps * me.dt), me.speed_horizontal_fps ) * R2D; + me.gravComp = me.pitch - me.attitudePN; + #printf("Gravity compensation %0.2f degs", me.gravComp); + me.track_signal_e = me.gravComp * !me.free; + me.track_signal_h = 0; + me.printGuide("Trying to keep current %04.1f deg pitch.", me.pitch); + }, + + level5: func () { + me.track_signal_e = (5-me.pitch) * !me.free; + me.track_signal_h = 0; + me.printGuide("Gyro keeping %04.1f deg pitch. Current is %04.1f deg.", 5, me.pitch); + }, + + pitchGyro: func () { + me.track_signal_e = (me.keepPitch-me.pitch) * !me.free; + me.track_signal_h = 0; + me.printGuide("Gyro keeping %04.1f deg pitch. Current is %04.1f deg.", me.keepPitch, me.pitch); + }, + + # Terrain following as standby guidance mode. + terrainFollow: func () { + me.cruiseAndLoft(); + me.track_signal_e = me.raw_steer_signal_elev * !me.free; + me.track_signal_h = me.raw_steer_signal_head * !me.free; + }, + + remoteControl: func () { + me.track_signal_e = me.remote_control_pitch * me.dt * !me.free; + me.track_signal_h = me.remote_control_yaw * me.dt * !me.free; + me.printGuide("Remote input: %04.1f deg/s pitch, %04.1f deg/s yaw.", + me.remote_control_pitch, me.remote_control_yaw); + }, + + remoteControlStabilized: func () { + me.keepPitch += me.remote_control_pitch * me.dt; + me.track_signal_e = (me.keepPitch - me.pitch) * !me.free; + me.track_signal_h = me.remote_control_yaw * me.dt * !me.free; + me.printGuide("Remote input: %04.1f deg/s pitch, %04.1f deg/s yaw.", + me.remote_control_pitch, me.remote_control_yaw); + }, + + APN: func () { + # + # guidance laws + # + if (me.guiding and !me.free and me.dist_last != nil and me.last_dt != 0 and me.newTargetAssigned==0) { + # augmented proportional navigation for heading # + ################################################# + + if (me.guidanceLaw == "direct" or (me.guidanceLaw == "LOS" and me.life_time < 4)) { + # pure pursuit + me.raw_steer_signal_head = me.curr_deviation_h; + if (!me.cruise_or_loft) { + me.raw_steer_signal_elev = me.curr_deviation_e; + me.attitudePN = (math.atan2(-(me.speed_down_fps+g_fps * me.dt), me.speed_horizontal_fps ) - math.atan2(-me.speed_down_fps, me.speed_horizontal_fps )) * R2D; + me.gravComp = - me.attitudePN; + #printf("Gravity compensation %0.2f degs", me.gravComp); + me.raw_steer_signal_elev += me.gravComp; + } + return; + } elsif (find("OPN", me.guidanceLaw)!=-1) { + me.apn = -1; + me.gpn = 1; + } elsif (find("APN", me.guidanceLaw)!=-1) { + me.apn = 1; + me.gpn = 1; + } elsif (find("GPN", me.guidanceLaw)!=-1) { + me.apn = 1; + me.gpn = wingedGuideFactor; + } else { + me.apn = 0; + me.gpn = 1; + } + + if (me["noise"]==nil or me["last"] == nil) { + me.noise = 1; + me.last = 0; + me.next = 0.10; + me.seed = rand()*me.seeker_filter; + } + if (me.life_time > 6) { + me.noise = 1; + } elsif (me.seeker_filter > 0 and me.guidance != "gps" and me.guidance != "gps-laser" and me.life_time-me.last > me.next) { + # PN noise. + me.sign = me.seed>0.85?(rand()>0.75?-1:1):1; + me.opnNoiseReduct = me.apn == -1?0.5:1; + me.noise = (1+me.seeker_filter*me.opnNoiseReduct)*rand(); + me.noise = me.sign*(me.noise + 1); # the noise factor + me.last = me.life_time; + me.next = me.seeker_filter*0.15*rand();# duration for this noise factor, till a new is computed. + } + + me.horz_closing_rate_fps = ((me.dist_last - me.dist_curr)*M2FT)/me.dt+me.horz_closing_rate_fps;#clamped due to cruise missiles that can fly slower than target. + me.horz_closing_rate_fps *= 0.5;# average over 2 frames + me.printGuideDetails("Horz closing rate: %05d ft/sec", me.horz_closing_rate_fps); + me.vert_closing_rate_fps = ((me.dist_direct_last - me.dist_curr_direct)*M2FT)/me.dt+me.vert_closing_rate_fps; + me.vert_closing_rate_fps *= 0.5; + me.printGuideDetails("Vert closing rate: %05d ft/sec", me.vert_closing_rate_fps); + # Note: Since PN will steer opposite at negative closing rate, we will later use only the absolute magnitudes. + # This is especially important before we really gain speed against a receding fast target. + + me.course_deviation = geo.normdeg180(me.t_course-me.last_t_course); + + me.line_of_sight_rate_rps = (D2R*me.course_deviation)/me.dt;#positive clockwise + + me.printGuideDetails("LOS rate: %06.4f rad/s", me.line_of_sight_rate_rps); + + me.t_velocity = me.myMath.getCartesianVelocity(-me.Tgt.get_heading(), me.Tgt.get_Pitch(), me.Tgt.get_Roll(), me.Tgt.get_uBody(), me.Tgt.get_vBody(), me.Tgt.get_wBody()); + + if ((!me.flareLock and !me.chaffLock) or me.t_heading == nil) { + me.euler = me.myMath.cartesianToEuler(me.t_velocity); + if (me.euler[0] != nil) { + me.t_heading = me.euler[0]; + } else { + me.t_heading = me.Tgt.get_heading(); + } + me.t_pitch = me.euler[1]; + me.t_speed_fps = me.myMath.magnitudeVector(me.t_velocity);#groundspeed + } elsif (me.flarespeed_fps != nil) { + me.t_speed_fps = me.flarespeed_fps;#true airspeed + } + + me.t_horz_speed_fps = math.sqrt(me.t_velocity[0]*me.t_velocity[0]+me.t_velocity[1]*me.t_velocity[1]); + me.t_LOS_norm_head_deg = me.t_course + 90;#when looking at target this direction will be 90 deg right of target + me.t_LOS_norm_speed_fps = math.cos((me.t_LOS_norm_head_deg - me.t_heading)*D2R)*me.t_horz_speed_fps; + + if (me.last_t_norm_speed == nil) { + me.last_t_norm_speed = me.t_LOS_norm_speed_fps; + } + + me.t_LOS_norm_acc_fps2 = (me.t_LOS_norm_speed_fps - me.last_t_norm_speed)/me.dt; + + me.last_t_norm_speed = me.t_LOS_norm_speed_fps; + + # time to go calc + me.t_away_norm_speed_fps = math.cos((me.t_course - me.t_heading)*D2R)*me.t_horz_speed_fps; + me.t_speed_vert_fps = me.t_velocity[2]; + me.m_speed_vert_fps = math.sin(me.pitch*D2R)*me.old_speed_horz_fps; + me.t_pos_z = (me.t_coord.alt()-me.coord.alt())*M2FT; + me.Vt = [me.t_away_norm_speed_fps,me.t_LOS_norm_speed_fps,me.t_speed_vert_fps]; + me.Vm = [me.old_speed_horz_fps,0,me.m_speed_vert_fps]; + me.Pm = [0,0,0]; + me.Pt = [me.dist_curr*M2FT,0,me.t_pos_z]; + me.V_tm = me.myMath.minus(me.Vt,me.Vm); + me.R_tm = me.myMath.minus(me.Pm,me.Pt); + me.t_go = me.myMath.dotProduct(me.R_tm,me.R_tm)/me.myMath.dotProduct(me.R_tm, me.V_tm); + #printf("time_to_go %.1f, closing %d",me.t_go,me.vert_closing_rate_fps); + + + + # Horizontal homing: + if (me.guidanceLaw == "LOS") { + + me.K1 = 2.5; + me.K2 = 10.0; + + me.R_m = me.ac_init.distance_to(me.coord)*M2FT; + me.course_to_missile = me.ac_init.course_to(me.coord); + me.course_to_target = me.ac_init.course_to(me.t_coord); + me.CREh_old_old = me.CREh_old; + me.CREh_old = me.CREh; + # cross range error: + me.CREh = me.R_m*math.sin(me.clamp(geo.normdeg180(me.course_to_target - me.course_to_missile),-89,89)*D2R); + me.CREh_dot = (me.CREh - me.CREh_old_old)/(me.dt+me.CRE_old_dt); + me.acc_lateral_fps2 = me.K1*me.CREh_dot + me.K2*me.CREh; + me.toBody = math.cos(geo.normdeg180(me.hdg-me.course_to_target)*D2R); + if (me.toBody==0) me.toBody=0.0001; + me.acc_lateral_fps2 /= me.toBody; + me.velocity_vector_length_fps = me.clamp(me.old_speed_horz_fps, 0.0001, 1000000); + me.commanded_lateral_vector_length_fps = me.acc_lateral_fps2*me.dt; + me.raw_steer_signal_head = R2D*me.commanded_lateral_vector_length_fps/me.velocity_vector_length_fps; + #me.raw_steer_signal_head = me.curr_deviation_h; + } elsif (me.apn == 1) { + # APN (constant best at 5, but the higher value the more sensitive to noise) + # Augmented proportional navigation. Takes target acc. into account. Invented for SAMs. + me.toBody = math.cos(me.curr_deviation_h*D2R);#convert perpendicular LOS acc. to perpendicular body acc. + if (me.toBody==0) me.toBody=0.00001; + # acceleration perpendicular to instantaneous line of sight in feet/sec^2: + me.acc_lateral_fps2 = me.pro_constant*me.line_of_sight_rate_rps*math.abs(me.horz_closing_rate_fps)+me.t_LOS_norm_acc_fps2*me.noise;# in some litterature the second pro_constant is replaced by t_go, but that will make the missile overcompensate. + me.acc_lateral_fps2 /= me.toBody; + #printf("vert acc = %.2f + %.2f G", me.pro_constant*me.line_of_sight_rate_up_rps*me.vert_closing_rate_fps/g_fps, (me.apn*me.pro_constant*me.t_LOS_elev_norm_acc/2)/g_fps); + me.velocity_vector_length_fps = me.clamp(me.old_speed_horz_fps, 0.0001, 1000000); + me.commanded_lateral_vector_length_fps = me.acc_lateral_fps2*me.dt; + me.raw_steer_signal_head = R2D*me.commanded_lateral_vector_length_fps/me.velocity_vector_length_fps; + } elsif (me.apn == 0) { + # PN (constant best at 3) + # Generalized Proportional navigation. + me.toBody = math.cos(me.curr_deviation_h*D2R);#convert perpendicular LOS acc. to perpendicular body acc. + if (me.toBody==0) me.toBody=0.00001; + me.acc_lateral_fps2 = me.pro_constant*me.line_of_sight_rate_rps*math.abs(me.horz_closing_rate_fps)*me.noise; + me.acc_lateral_fps2 /= me.toBody; + me.velocity_vector_length_fps = me.clamp(me.old_speed_horz_fps, 0.0001, 1000000); + me.commanded_lateral_vector_length_fps = me.acc_lateral_fps2*me.dt; + me.raw_steer_signal_head = R2D*me.commanded_lateral_vector_length_fps/me.velocity_vector_length_fps; + } else { + # PN [invented during WWII by Luke Chia‐Liu Yuan] + # Original Proportional navigation. + # Rearranging the equations gives Pure proportional navigation, which show that this law + # does not take missile alpha into account, and is therefore not very good in real life. + me.radians_lateral_per_sec = me.pro_constant*me.line_of_sight_rate_rps*me.noise; + me.raw_steer_signal_head = me.dt*me.radians_lateral_per_sec*R2D; + } + #printf("horz acc = %.1f + %.1f", proportionality_constant*line_of_sight_rate_rps*horz_closing_rate_fps, proportionality_constant*t_LOS_norm_acc/2); + + if (me.guidanceLawHorizInit) { + # pure horiz pursuit + me.raw_steer_signal_head = me.curr_deviation_h; + } + + # now translate that sideways acc to an angle: + + + + #printf("Proportional lead: %0.1f deg horz", -(me.curr_deviation_h-me.raw_steer_signal_head)); + + #me.print(sprintf("LOS-rate=%.2f rad/s - closing-rate=%.1f ft/s",line_of_sight_rate_rps,horz_closing_rate_fps)); + #me.print(sprintf("commanded-perpendicular-acceleration=%.1f ft/s^2", acc_lateral_fps2)); + #printf("horz leading by %.1f deg, commanding %.1f deg", me.curr_deviation_h, me.raw_steer_signal_head); + + if (!me.cruise_or_loft) { + me.fixed_aim = nil; + me.fixed_aim_time = nil; + if (find("PN",me.guidanceLaw) != -1 and size(me.guidanceLaw) > 3) { + me.extra = right(me.guidanceLaw, 4); + me.fixed_aim = num(left(me.extra, 2)); + me.fixed_aim_time = num(right(me.extra, 2)); + } + if (me.fixed_aim != nil and me.life_time < me.fixed_aim_time) { + me.raw_steer_signal_elev = me.curr_deviation_e+me.fixed_aim; + me.attitudePN = (math.atan2(-(me.speed_down_fps+g_fps * me.dt), me.speed_horizontal_fps ) - math.atan2(-me.speed_down_fps, me.speed_horizontal_fps )) * R2D; + me.gravComp = - me.attitudePN; + #printf("Gravity compensation %0.2f degs", me.gravComp); + me.raw_steer_signal_elev += me.gravComp; + } else { + # proportional navigation for elevation # + ######################################### + #me.print(me.guidanceLaw~" in fully control"); + + me.line_of_sight_rate_up_rps = (D2R*(me.t_elev_deg-me.last_t_elev_deg))/me.dt; + + # calculate target acc as normal to LOS line: (up acc is positive) + me.t_approach_bearing = me.t_course + 180; + + + # used to do this with trigonometry, but vector math is simpler to understand: (they give same result though) + me.t_LOS_elev_norm_speed = me.scalarProj(me.t_heading,me.t_pitch,me.t_speed_fps,me.t_approach_bearing,me.t_elev_deg*-1 +90); + + if (me.last_t_elev_norm_speed == nil) { + me.last_t_elev_norm_speed = me.t_LOS_elev_norm_speed; + } + + + me.t_LOS_elev_norm_acc = (me.t_LOS_elev_norm_speed - me.last_t_elev_norm_speed)/me.dt; + me.last_t_elev_norm_speed = me.t_LOS_elev_norm_speed; + #printf("Target acc. perpendicular to LOS (positive up): %.1f G.", me.t_LOS_elev_norm_acc/g_fps); + + # Vertical homing: + if (me.guidanceLaw == "LOS") { + me.R_m = me.ac_init.direct_distance_to(me.coord)*M2FT; + me.pitch_to_missile = me.myMath.getPitch(me.ac_init,me.coord); + me.pitch_to_target = me.myMath.getPitch(me.ac_init,me.t_coord); + me.CREv_old_old = me.CREv_old; + me.CREv_old = me.CREv; + # Cross range error + me.CREv = me.R_m*math.sin((me.pitch_to_target - me.pitch_to_missile)*D2R); + me.CREv_dot = (me.CREv - me.CREv_old_old)/(me.dt+me.CRE_old_dt); + me.acc_upwards_fps2 = me.K1*me.CREv_dot + me.K2*me.CREv; + # Convert perpendicular LOS acc. to perpendicular body acc. + me.toBody = math.cos((me.pitch - me.pitch_to_target)*D2R); + if (me.toBody==0) me.toBody=0.00001; + me.acc_upwards_fps2 /= me.toBody; + # Apply the acc. + me.velocity_vector_length_fps = me.clamp(me.old_speed_fps, 0.0001, 1000000); + me.commanded_upwards_vector_length_fps = me.acc_upwards_fps2*me.dt; + me.raw_steer_signal_elev = R2D*me.commanded_upwards_vector_length_fps/me.velocity_vector_length_fps; + } elsif (me.apn == 1) { + # APN (constant best at 5, but the higher value the more sensitive to noise) + # Augmented proportional navigation. Takes target acc. into account. Invented for SAMs. + me.toBody = math.cos(me.curr_deviation_e*D2R);#convert perpendicular LOS acc. to perpendicular body acc. + if (me.toBody==0) me.toBody=0.00001; + me.acc_upwards_fps2 = me.gpn*me.pro_constant*me.line_of_sight_rate_up_rps*math.abs(me.vert_closing_rate_fps)+me.t_LOS_elev_norm_acc*me.noise; + me.acc_upwards_fps2 /= me.toBody; + #printf("vert acc = %.2f + %.2f G", me.pro_constant*me.line_of_sight_rate_up_rps*me.vert_closing_rate_fps/g_fps, (me.apn*me.pro_constant*me.t_LOS_elev_norm_acc/2)/g_fps); + me.velocity_vector_length_fps = me.clamp(me.old_speed_fps, 0.0001, 1000000); + me.commanded_upwards_vector_length_fps = me.acc_upwards_fps2*me.dt; + me.raw_steer_signal_elev = R2D*me.commanded_upwards_vector_length_fps/me.velocity_vector_length_fps; + } elsif (me.apn == 0) { + # PN (constant best at 3) + # Generalized Proportional Navigation. + me.toBody = math.cos(me.curr_deviation_e*D2R);#convert perpendicular LOS acc. to perpendicular body acc. + if (me.toBody==0) me.toBody=0.00001; + me.acc_upwards_fps2 = me.pro_constant*me.line_of_sight_rate_up_rps*math.abs(me.vert_closing_rate_fps)*me.noise; + me.acc_upwards_fps2 /= me.toBody; + me.velocity_vector_length_fps = me.clamp(me.old_speed_fps, 0.0001, 1000000); + me.commanded_upwards_vector_length_fps = me.acc_upwards_fps2*me.dt; + me.raw_steer_signal_elev = R2D*me.commanded_upwards_vector_length_fps/me.velocity_vector_length_fps; + } elsif (me.apn == -1) { + # PN [invented during WWII by Luke Chia‐Liu Yuan] + # Original Proportional navigation. + # Rearranging the equations gives Pure proportional navigation, which show that this law + # does not take missile alpha into account, and is therefore not very good in real life. + me.radians_up_per_sec = me.pro_constant*me.line_of_sight_rate_up_rps*me.noise; + me.raw_steer_signal_elev = me.dt*me.radians_up_per_sec*R2D; + } + + # now compensate for the predicted gravity drop of attitude: + me.attitudePN = (math.atan2(-(me.speed_down_fps+g_fps * me.dt), me.speed_horizontal_fps ) - math.atan2(-me.speed_down_fps, me.speed_horizontal_fps )) * R2D; + me.gravComp = -me.attitudePN; + #printf("Gravity compensation %0.2f degs", me.gravComp); + me.raw_steer_signal_elev += me.gravComp; + + #printf("Proportional lead: %0.1f deg elev", -(me.curr_deviation_e-me.raw_steer_signal_elev)); + } + } + me.CRE_old_dt = me.dt; + } + }, + + scalarProj: func (head, pitch, magn, projHead, projPitch) { + head = head*D2R; + pitch = pitch*D2R; + projHead = projHead*D2R; + projPitch = projPitch*D2R; + + # Convert the 2 polar vectors to cartesian: + + # velocity vector of target + me.ax = magn * math.cos(pitch) * math.cos(-head);#north + me.ay = magn * math.cos(pitch) * math.sin(-head);#west + me.az = magn * math.sin(pitch); #up + + # vector pointing from target perpendicular to LOS + me.bx = 1 * math.cos(projPitch) * math.cos(-projHead);# north + me.by = 1 * math.cos(projPitch) * math.sin(-projHead);# west + me.bz = 1 * math.sin(projPitch); # up + + # the dot product is the scalar projection. And represent the target velocity perpendicular to LOS + me.result = (me.ax * me.bx + me.ay * me.by + me.az * me.bz)/1; + return me.result; + }, + + map: func (value, leftMin, leftMax, rightMin, rightMax) { + # Figure out how 'wide' each range is + var leftSpan = leftMax - leftMin; + var rightSpan = rightMax - rightMin; + + # Convert the left range into a 0-1 range (float) + var valueScaled = (value - leftMin) / leftSpan; + + # Convert the 0-1 range into a value in the right range. + return rightMin + (valueScaled * rightSpan); + }, + + proximity_detection: func { + + ####Ground interaction + me.ground = geo.elevation(me.coord.lat(), me.coord.lon()) or 0; + me.terrainImpact = 0; + if(me.ground > me.coord.alt()) { + me.event = "exploded"; + if(me.life_time < me.arming_time) { + me.event = "landed disarmed"; + #thread.lock(mutexTimer); + #append(AIM.timerQueue, [me,me.log,[me.typeLong~" landed disarmed."],0]); + #thread.unlock(mutexTimer); + } + if (me.Tgt != nil and me.direct_dist_m == nil) { + # maddog might go here + me.Tgt = nil; + #me.direct_dist_m = me.coord.direct_distance_to(me.Tgt.get_Coord()); + } + if ((me.Tgt != nil and me.direct_dist_m != nil) or me.Tgt == nil) { + me.terrainImpact = 1; + #me.explode("Hit terrain.", me.coord, me.direct_dist_m, me.event); + #return 1; + } + } + + if (me.Tgt != nil and me.t_coord != nil and me.guidance != "inertial") { + # Maintain an array of the coordinates of the missile and the tgt in the last 3 frames. + # (use xyz coord to avoid the strange behaviour of comparing geo coordinates). + for (var i=me.crc_frames_look_back; i >= 0; i-=1){ + me.crc_coord[i] = (i != 0) ? me.crc_coord[i-1] : me.coord.xyz(); + me.crc_t_coord[i] = (i != 0) ? me.crc_t_coord[i-1] : me.t_coord.xyz(); + me.crc_range[i] = (i != 0) ? me.crc_range[i-1] : me.myMath.magnitudeVector( + me.myMath.minus(me.crc_coord[0], + me.crc_t_coord[0])); + } + + if (me.crc_coord[1] == nil or me.crc_t_coord[1] == nil or me.crc_range[1] == nil) { + if (me.terrainImpact) { + me.coord.set_alt(me.ground); + me.explode("Hit terrain.", me.coord, me.direct_dist_m, me.event); + return 1; + } + return 0; # Wait for the buffer to fill at least once. + } + + if (me.life_time > me.arming_time) { + # Distance to target increase. + if (me.crc_range[0] > me.crc_range[1] and me.crc_range[0] < 250) { + # Compute the closest approach. + me.subframeClosestRangeCoord(); # Provides `me.crc_closestRange` and `me.crc_missileCoord`. + + me.explode("Passed target.", me.crc_missileCoord, me.crc_closestRange); + return 1; + } + if (me.life_time > me.selfdestruct_time or (me.destruct_when_free and me.free)) { + me.explode("Selfdestructed.", me.coord); + return 1; + } + } + me.direct_dist_m = me.crc_range[0]; + } elsif (me.life_time > me.selfdestruct_time) { + me.Tgt = nil; # make sure we dont in inertial mode with target go in and start checking distances. + me.explode("Selfdestructed.", me.coord); + return 1; + } + if (me.terrainImpact) { + me.coord.set_alt(me.ground); + me.explode("Hit terrain.", me.coord, me.direct_dist_m, me.event); + return 1; + } + return 0; + }, + + #! brief: Recursive function to compute the closest range in the past mfd frames. + #! param fei: The frame to compute first (0: current frame, 1: previous frame, ...). + #! param mfd: The maximum amount of frames available if needed. + #! input me.crc_coord: The coordinates of the missile in the last frames. + #! input me.crc_t_coord: The coordinates of the target in the last frames. + #! output me.crc_missileCoord: The coordinates of the missile when it was the closest to the target in the mfd+1 last frames. + #! output me.crc_closestRange: The range of the missile when it was the closest to the target in the mfd+1 last frames. + subframeClosestRangeCoord : func(fei=0, mfd=nil) { + # Handle default depth parameter (set it as me.crc_frames_look_back if default is needed). + if (mfd == nil) + mfd = me.crc_frames_look_back; + + # Prevent illegal parameter. + if(mfd < 1) + die("Argument exception: The mfd (Max Frames Depth) cannot be less than one."); + if(fei < 0) + die("Argument exception: The fei (Frames End Index) cannot be negative."); + + # Ensure the availability of the frame-end data. + if(me.crc_coord[fei] == nil or me.crc_t_coord[fei] == nil) + die("No coordinates available for the end of the frame."); + + # Indices for the coordinates at frame start (fsi) and frame end (fei); + var fsi = fei + 1; + + # Buffers used for unprocessed result, set to the frame-end values in case of unavailable frame-start data; + var missileCoord = me.crc_coord[fei]; + var targetCoord = me.crc_t_coord[fei]; + + # Check for availability of the frame-start data + if(me.crc_coord[fsi] != nil and me.crc_t_coord[fsi] != nil){ + # Get the origin coordinates and speed of the missile and it's target for the current frame. + # The units are in m for distances and frames for time. + var misCoord = me.crc_coord[fsi]; + var misSpeed = me.myMath.minus(me.crc_coord[fei], misCoord); + var tgtCoord = me.crc_t_coord[fsi]; + var tgtSpeed = me.myMath.minus(me.crc_t_coord[fei], tgtCoord); + + # Compute when the closest distance happened in time. + var t = call(func me.myMath.particleShortestDistTime(misCoord, misSpeed, tgtCoord, tgtSpeed), nil, var err = []); + # If an error is thrown, this is probably due to a null differential speed. + if (size(err)){ + t = 1; + print(err[0]); + } + + # If the time factor (in frames) is superior than 1, this mean that the missile is still closing. + if (t > 1) + t = 1; # Set it to 1 to prevent extrapolation (but it should still get closer). + # If it is negative, the closest range happened at one of the previous frame: + else if (t < 0) + if (mfd > 1) # If we can recursively compute the previous frame: + return me.subframeClosestRangeCoord(fei+1, mfd-1); # Return it's result instead, and stop here. + else + t = 0; # Set it to 0 to prevent extrapolation. + + # Compute (interpolate) the position of the missile and it's target when their range is the closest. + missileCoord = me.myMath.plus(misCoord, me.myMath.product(t, misSpeed)); + targetCoord = me.myMath.plus(tgtCoord, me.myMath.product(t, tgtSpeed)); + } + + # Return the minimum distance between the missile and the tgt, and the position of the missile at that time. + me.crc_closestRange = me.myMath.magnitudeVector(me.myMath.minus(targetCoord, missileCoord)); + me.crc_missileCoord = geo.Coord.new(); + me.crc_missileCoord.set_xyz(missileCoord[0], missileCoord[1], missileCoord[2]); + me.crc_missileCoord.alt();# TODO: once fixed in FG this line is no longer needed. + }, + + log: func (str) { + damage.damageLog.push(str); + }, + + notifyInFlight: func (lat,lon,alt,rdar,semiRdr,typeID,typ,unique,thrustOn,callsign, heading, pitch, speed, is_deleted=0) { + ## thrustON cannot be named 'thrust' as FG for some reason will then think its a function (probably fixed by the way call() now is used) + var msg = notifications.ArmamentInFlightNotification.new("mfly", unique, is_deleted?damage.DESTROY:damage.MOVE, 21+typeID); + if (lat != nil) { + msg.Position.set_latlon(lat,lon,alt); + } else { + msg.Position.set_latlon(0,0,0); + } + msg.Flags = rdar;#bit #0 + if (thrustOn) { + msg.Flags = bits.set(msg.Flags, 1);#bit #1 + } + if (semiRdr) { + msg.Flags = bits.set(msg.Flags, 2);#bit #2 + } + msg.IsDistinct = !is_deleted; + msg.RemoteCallsign = callsign; + msg.UniqueIndex = ""~typeID~unique; + msg.Pitch = pitch; + msg.Heading = heading; + msg.u_fps = speed; + #msg.isValid(); + notifications.geoBridgedTransmitter.NotifyAll(msg); +#print("fox2.nas: transmit in flight"); +#f14.debugRecipient.Receive(msg); + }, + + notifyCrater: func (lat,lon,alt,big,heading,static) { + var uni = int(rand()*15000000); + var msg = notifications.StaticNotification.new("stat", uni, 1, big); + + msg.Position.set_latlon(lat,lon,alt); + msg.IsDistinct = 0; + msg.Heading = heading; + notifications.hitBridgedTransmitter.NotifyAll(msg); +#print("fox2.nas: transmit crater"); +#f14.debugRecipient.Receive(msg); + damage.statics["obj_"~uni] = [static, lat,lon,alt, heading,big]; + }, + + notifyHit: func (RelativeAltitude, Distance, callsign, Bearing, reason, typeID, type, self) { + var msg = notifications.ArmamentNotification.new("mhit", 4, 21+typeID); + msg.RelativeAltitude = RelativeAltitude; + msg.Bearing = Bearing; + msg.Distance = Distance; + msg.RemoteCallsign = callsign; # RJHTODO: maybe handle flares / chaff + if (self) { + msg.Callsign = callsign; + msg.FromIncomingBridge = 1; + damage.damage_recipient.Receive(msg); + } + notifications.hitBridgedTransmitter.NotifyAll(msg); + me.log(sprintf("You hit %s with %s at %.1f meters.",callsign, type, Distance)); +#print("fox2.nas: transmit hit to ",callsign," reason:",reason); +#f14.debugRecipient.Receive(msg); + }, + + explode: func (reason, coordinates, range = nil, event = "exploded") { + var hitGround = 0; + if (reason == "Hit terrain.") { + hitGround = 1; + } + if (me.lock_on_sun) { + reason = "Locked onto sun."; + } elsif (me.flareLock) { + reason = "Locked onto flare."; + } elsif (me.chaffLock) { + reason = "Locked onto chaff."; + } + + me.coord = coordinates; # Set the current missile coordinates at the explosion point. + + if(getprop("payload/armament/msg")) { + thread.lock(mutexTimer); + append(AIM.timerQueue, [AIM, AIM.notifyInFlight, [me.coord.lat(), me.coord.lon(), me.coord.alt(),0,0,me.typeID,me.type,me.unique_id,0,"", me.hdg, me.pitch, 0, 0], -1]); + thread.unlock(mutexTimer); + } + + var wh_mass = (event == "exploded" and !me.inert) ? me.weight_whead_lbm : 0; #will report 0 mass if did not have time to arm + + thread.lock(mutexTimer); + append(AIM.timerQueue, [me,impact_report,[coordinates, wh_mass, "munition", me.type, me.new_speed_fps*FT2M],0]); + thread.unlock(mutexTimer); + + if (!me.inert) { + var phrase = nil; + var hitPrimaryTarget = 0; + if (me.Tgt != nil and !me.Tgt.isVirtual()) { + var tgtLabel = me.callsign; + if(me.flareLock) + tgtLabel ~= "'s flare"; + elsif (me.chaffLock) + tgtLabel ~= "'s chaff"; + if (range != nil and range < me.reportDist) { + phrase = sprintf(me.type ~ " " ~ event ~ ": %.1f meters from: " ~ tgtLabel, range); + if (!me.flareLock and !me.chaffLock) { + hitPrimaryTarget = 1; + } + } else { + phrase = me.type ~ " missed " ~ me.callsign ~ ": " ~ reason; + } + } elsif (me.Tgt == nil) { + phrase = sprintf(me.type ~ " " ~ event); + } + if (phrase != nil) { + me.printStats("%s time %.1f", phrase, me.life_time); + if(getprop("payload/armament/msg") and hitPrimaryTarget and wh_mass > 0){ + thread.lock(mutexTimer); + append(AIM.timerQueue, [AIM, AIM.notifyHit, [coordinates.alt() - me.t_coord.alt(),range,me.callsign,coordinates.course_to(me.t_coord),reason,me.typeID, me.typeLong, 0], -1]); + thread.unlock(mutexTimer); + } else { + thread.lock(mutexTimer); + append(AIM.timerQueue, [AIM, AIM.log, [phrase], 0]); + thread.unlock(mutexTimer); + } + } + if (me.multiHit and !me.multiExplosion(coordinates, event, wh_mass) and me.Tgt != nil and me.Tgt.isVirtual()) { + phrase = sprintf(me.type~" "~event); + me.printStats("%s Reason: %s time %.1f", phrase, reason, me.life_time); + thread.lock(mutexTimer); + append(AIM.timerQueue, [AIM, AIM.log, [phrase], 0]); + thread.unlock(mutexTimer); + } + } + + me.ai.getNode("valid", 1).setBoolValue(0); + thread.lock(mutexTimer); + append(AIM.timerQueue, [me, me.setModelRemoved, [], -1]); + thread.unlock(mutexTimer); + if (event == "exploded" and !me.inert and wh_mass > 0) { + me.animate_explosion(hitGround); + me.explodeSound = 1; + } else { + me.animate_dud(); + me.explodeSound = 0; + } + me.Tgt = nil; + }, + + multiExplosion: func (explode_coord, event, wh_mass) { + # hit everything that is nearby except for target itself. + me.sendout = 0; + foreach (me.testMe;me.contacts) { + if (!me.testMe.isValid() or me.testMe.isVirtual() or me.testMe.get_type() == ORDNANCE) { + continue; + } + var min_distance = me.testMe.get_Coord().direct_distance_to(explode_coord); + + if (min_distance < me.reportDist and (me.Tgt == nil or me.testMe.getUnique() != me.Tgt.getUnique())) { + var phrase = sprintf("%s %s: %.1f meters from: %s", me.type,event, min_distance, me.testMe.get_Callsign()); + me.printStats(phrase); + + if(getprop("payload/armament/msg") and wh_mass > 0){ + var cs = damage.processCallsign(me.testMe.get_Callsign()); + var cc = me.testMe.get_Coord(); + thread.lock(mutexTimer); + append(AIM.timerQueue, [AIM, AIM.notifyHit, [explode_coord.alt() - cc.alt(),min_distance,cs,explode_coord.course_to(cc),"mhit1",me.typeID, me.typeLong,0], -1]); + thread.unlock(mutexTimer); + } elsif (wh_mass > 0) { + thread.lock(mutexTimer); + append(AIM.timerQueue, [AIM, AIM.log, [phrase], 0]); + thread.unlock(mutexTimer); + } + + me.sendout = 1; + } + } + # Now check for hitting ourselves: + var min_distance = geo.aircraft_position().direct_distance_to(explode_coord); + if (min_distance < me.reportDist) { + # hitting oneself :) + var cs = damage.processCallsign(getprop("sim/multiplay/callsign")); + var phrase = sprintf("%s %s: %.1f meters from: %s", me.type,event, min_distance, cs);# if we mention ourself then we need to explicit add ourself as author. + me.printStats(phrase); + if (wh_mass > 0) { + thread.lock(mutexTimer); + append(AIM.timerQueue, [AIM, AIM.notifyHit, [explode_coord.alt() - geo.aircraft_position().alt(),min_distance,cs,explode_coord.course_to(geo.aircraft_position()),"mhit2",me.typeID, me.typeLong, 1], -1]); + thread.unlock(mutexTimer); + } + me.sendout = 1; + } + return me.sendout; + }, + + sendMessage: func (str) { + if (getprop("payload/armament/msg")) { + defeatSpamFilter(str); + } else { + setprop("/sim/messages/atc", str); + } + }, + + interpolate: func (start, end, fraction) { + #if (!start.is_defined()) print("start undefined:"); found the bug so these prints not needed anymore + #if (!end.is_defined()) print("end undefined:"); + me.xx = (start.x()*(1-fraction) + +end.x()*fraction); + me.yy = (start.y()*(1-fraction)+end.y()*fraction); + me.zz = (start.z()*(1-fraction)+end.z()*fraction); + + me.cc = geo.Coord.new(); + me.cc.set_xyz(me.xx,me.yy,me.zz); + + return me.cc; + }, + + getPitch: func (coord1, coord2) { + #pitch from coord1 to coord2 in degrees (takes curvature of earth into effect.) + return me.myMath.getPitch(coord1, coord2); + }, + + getPitch2: func (coord1, coord2) { + #pitch from coord1 to coord2 in degrees (assumes earth is flat) + me.flat_dist = coord1.distance_to(coord2); + me.flat_alt = coord2.alt()-coord1.alt(); + return math.atan2(me.flat_alt, me.flat_dist)*R2D; + }, + + ################################################################### + # non-multi-threaded loops for before flying. autostarted. + ################################################################### + + getContact: func { + if (me.noCommonTarget) { + return nil; + } + if (me.target_pnt and contactPoint != nil) { + return contactPoint; + } else { + return contact; + } + }, + + standby: func { + # looping in standby mode + if (deltaSec.getValue()==0) { + settimer(func me.standby(), 0.5); + } + if(me.seam_support and me.uncage_auto) { + me.caged = 1; + } + if (me.deleted or me.status == MISSILE_FLYING) return; + if (me.status == MISSILE_STARTING) { + me.printCode("Starting up missile"); + me.startup(); + return; + } + me.coolingSyst(); + me.reset_seeker(); + #print(me.type~" standby "~me.ID); + + settimer(func me.standby(), deltaSec.getValue()==0?0.5:0.25); + }, + + startup: func { + # looping in starting mode + #print("startup"); + if (deltaSec.getValue()==0) { + settimer(func me.startup(), 0.5); + } + if(me.seam_support and me.uncage_auto) { + me.caged = 1; + } + if (me.status != MISSILE_STARTING) { + me.standby(); + return; + } + if (me.ready_standby_time != 0 and getprop("sim/time/elapsed-sec") > (me.ready_standby_time+me.ready_time)) { + me.status = MISSILE_SEARCH; + me.search(); + return; + } + #print("Starting up"); + me.coolingSyst(); + me.reset_seeker(); + settimer(func me.startup(), deltaSec.getValue()==0?0.5:0.25); + }, + + coolingSyst: func { + if (me.coolable and me.status != MISSILE_FLYING) { + me.cool_elapsed = getprop("sim/time/elapsed-sec"); + if (me.cooling_last_time != 0) { + me.cool_delta_time = me.cool_elapsed - me.cooling_last_time; + if (me.cooling) { + me.cool_total_time += me.cool_delta_time; + if (me.cool_total_time > me.cool_duration) { + me.cooling = 0; + } else { + me.cool_curr_time = me.cool_delta_time+me.extrapolate(me.warm, 1, 0, 0, me.cool_time); + me.warm = me.clamp(me.extrapolate(me.cool_curr_time, 0, me.cool_time, 1, 0),0,1); + } + } + if (!me.cooling) { + me.cool_curr_time = me.cool_delta_time+me.extrapolate(me.warm, 0, 1, 0, me.cool_time*3);#takes longer to warm than to cool down + me.warm = me.clamp(me.extrapolate(me.cool_curr_time, 0, me.cool_time*3, 0, 1),0,1); + } + } + me.cooling_last_time = me.cool_elapsed; + me.detect_range_curr_nm = me.extrapolate(me.warm, 0, 1, me.cold_detect_range_nm, me.warm_detect_range_nm); + me.detect_range_curr_nm *= me.seam_scan?0.65:1;#GR1F-16CJ-34-1-1 page 1-402 + } else { + me.detect_range_curr_nm = (me.seam_scan?0.65:1)*me.max_fire_range_nm;#GR1F-16CJ-34-1-1 page 1-402 + } + }, + + checkForLock: func { + # call this only before firing + if (!(me.tagt.get_type() == AIR and me.tagt.get_Speed()<15) and ((me.guidance != "semi-radar" or me.is_painted(me.tagt)) and (me.guidance !="laser" or me.is_laser_painted(me.tagt))) + and (me.guidance != "radiation" or me.is_radiating_aircraft(me.tagt)) + and me.rng < me.max_fire_range_nm and me.rng > me.getCurrentMinFireRange(me.tagt) and me.FOV_check(OurHdg.getValue(),OurPitch.getValue(),me.total_horiz, me.total_elev, me.slave_to_radar or contactPoint==me.tagt?(me.guidance == "heat" or me.guidance == "vision"?math.min(me.max_seeker_dev, me.fcs_fov):me.fcs_fov):me.max_seeker_dev, vector.Math) + and (me.rng < me.detect_range_curr_nm or (me.guidance != "radar" and me.guidance != "semi-radar" and me.guidance != "tvm" and me.guidance != "sample" and me.guidance != "heat" and me.guidance != "vision" and me.guidance != "radiation")) + and (me.guidance != "heat" or (me.all_aspect or me.rear_aspect(geo.aircraft_position(), me.tagt))) + and me.checkForView()) { + return 1; + } + #me.printSearch("Lock did fail %d %d %d %d %d %d %d %d %d", + # !(me.tagt.get_type() == AIR and me.tagt.get_Speed()<15), + # ((me.guidance != "semi-radar" or me.is_painted(me.tagt) == 1) and (me.guidance !="laser" or me.is_laser_painted(me.tagt) == 1)), + # (me.guidance != "radiation" or me.is_radiating_aircraft(me.tagt) == 1), + # me.rng < me.max_fire_range_nm, + # me.rng > me.min_fire_range_nm, + # me.FOV_check(OurHdg.getValue(),OurPitch.getValue(),me.total_horiz, me.total_elev, me.slave_to_radar?math.min(me.max_seeker_dev, me.fcs_fov):me.max_seeker_dev, vector.Math), + # (me.rng < me.detect_range_curr_nm or (me.guidance != "radar" and me.guidance != "semi-radar" and me.guidance != "heat" and me.guidance != "vision" and me.guidance != "heat" and me.guidance != "radiation")), + # (me.guidance != "heat" or (me.all_aspect == 1 or me.rear_aspect(geo.aircraft_position(), me.tagt) == 1)), + # me.checkForView()); + return 0; + }, + + checkForView: func { + if (me.guidance != "gps-laser" and me.guidance != "gps" and me.guidance != "inertial" and me.guidance != "sample") { + me.launchCoord = geo.aircraft_position(); + if (!me.radarOrigin) { + me.geodPos = aircraftToCart({x:-me.radarX, y:me.radarY, z: -me.radarZ}); + me.launchCoord.set_xyz(me.geodPos.x, me.geodPos.y, me.geodPos.z); + } + + me.potentialCoord = me.tagt.get_Coord(); + me.xyz = {"x":me.launchCoord.x(), "y":me.launchCoord.y(), "z":me.launchCoord.z()}; + me.directionLOS = {"x":me.potentialCoord.x()-me.launchCoord.x(), "y":me.potentialCoord.y()-me.launchCoord.y(), "z":me.potentialCoord.z()-me.launchCoord.z()}; + + # Check for terrain between own weapon and target: + me.terrainGeod = get_cart_ground_intersection(me.xyz, me.directionLOS); + if (me.terrainGeod == nil) { + return 1; + } else { + me.terrain = geo.Coord.new(); + me.terrain.set_latlon(me.terrainGeod.lat, me.terrainGeod.lon, me.terrainGeod.elevation); + me.maxDist = me.launchCoord.direct_distance_to(me.potentialCoord)-1;#-1 is to avoid z-fighting distance + me.terrainDist = me.launchCoord.direct_distance_to(me.terrain); + if (me.terrainDist >= me.maxDist) { + return 1; + } + } + return 0; + } + return 1; + }, + + checkForViewInFlight: func (tagt) { + if (me.guidance != "gps-laser" and me.guidance != "gps" and me.guidance != "inertial" and me.guidance != "sample") { + me.launchCoord = me.coord; + me.potentialCoord = tagt.get_Coord(); + me.xyz = {"x":me.launchCoord.x(), "y":me.launchCoord.y(), "z":me.launchCoord.z()}; + me.directionLOS = {"x":me.potentialCoord.x()-me.launchCoord.x(), "y":me.potentialCoord.y()-me.launchCoord.y(), "z":me.potentialCoord.z()-me.launchCoord.z()}; + + # Check for terrain between own weapon and target: + me.terrainGeod = get_cart_ground_intersection(me.xyz, me.directionLOS); + if (me.terrainGeod == nil) { + return 1; + } else { + me.terrain = geo.Coord.new(); + me.terrain.set_latlon(me.terrainGeod.lat, me.terrainGeod.lon, me.terrainGeod.elevation); + me.maxDist = me.launchCoord.direct_distance_to(me.potentialCoord)-1;#-1 is to avoid z-fighting distance + me.terrainDist = me.launchCoord.direct_distance_to(me.terrain); + if (me.terrainDist >= me.maxDist) { + return 1; + } + } + return 0; + } + return 1; + }, + + checkForClassInFlight: func (newtgt) { + # call this only after firing + if(newtgt != nil and newtgt.isValid() and + ( (newtgt.get_type() == SURFACE and me.target_gnd) + or (newtgt.get_type() == AIR and me.target_air) + or (newtgt.get_type() == POINT and me.target_pnt) + or (newtgt.get_type() == MARINE and me.target_sea))) { + return 1; + } + #if(me.slaveContact != nil) printf("class failed %d %d %d",me.slaveContact.isValid() == 1,me.slaveContact.get_type() == AIR,me.target_air == 1); + return 0; + }, + + checkForClass: func { + # call this only before firing + if(me.slaveContact != nil and me.slaveContact.isValid() and + ( (me.slaveContact.get_type() == SURFACE and me.target_gnd) + or (me.slaveContact.get_type() == AIR and me.target_air) + or (me.slaveContact.get_type() == POINT and me.target_pnt) + or (me.slaveContact.get_type() == MARINE and me.target_sea))) { + return 1; + } + #if(me.slaveContact != nil) printf("class failed %d %d %d",me.slaveContact.isValid() == 1,me.slaveContact.get_type() == AIR,me.target_air == 1); + return 0; + }, + + newLock: func (tagt) { + # for switching to new lock during flight. + #reorder to gain performance + me.newlockgained = 0; + if (!tagt.isValid()) { + me.printStatsDetails("Test: invalid contact. Rejected."); + return 0; + } + me.printStatsDetails("Test starting on %s:",tagt.get_Callsign()); + me.newCoord = tagt.get_Coord(); + if (me.coord.direct_distance_to(me.newCoord)*M2NM > me.detect_range_curr_nm) { + me.printStatsDetails("Test: contact out of range. Rejected."); + return 0; + } + me.newlockgained = me.checkForClassInFlight(tagt); + if (!me.newlockgained) {me.printStatsDetails("Test: invalid type: %d. Rejected.",tagt.get_type());return 0;} + if (me.guidance == "laser") { + me.newlockgained = me.is_laser_painted(tagt); + if (!me.newlockgained){me.printStatsDetails("Test: no laser lock. Rejected.");return 0;} + } elsif (me.guidance == "semi-radar") { + me.newlockgained = me.is_painted(tagt); + if (!me.newlockgained) {me.printStatsDetails("Test: no radar paint. Rejected.");return 0;} + } elsif (me.guidance == "radiation") { + me.newlockgained = me.is_radiating_me(tagt); + if (!me.newlockgained) {me.printStatsDetails("Test: not radiating me. Rejected.");return 0;} + } elsif (me.guidance == "heat") { + me.newlockgained = me.all_aspect or me.rear_aspect(me.coord, tagt); + if (!me.newlockgained) {me.printStatsDetails("Test: no view of heat source. Rejected.");return 0;} + } + if (me.guidance != "gps-laser" and me.guidance != "gps" and me.guidance != "inertial" and me.guidance != "sample") { + me.new_elev_deg = me.getPitch(me.coord, me.newCoord); + me.new_course = me.coord.course_to(me.newCoord); + me.new_deviation_e = me.new_elev_deg - me.pitch; + me.new_deviation_h = me.new_course - me.hdg; + me.newlockgained = me.FOV_check(me.hdg, me.pitch, me.new_deviation_h, me.new_deviation_e, me.max_seeker_dev, me.myMath); + if (!me.newlockgained) {me.printStatsDetails("Test: not in FoV. Rejected.");return 0;} + } + me.newlockgained = me.checkForViewInFlight(tagt); + if (!me.newlockgained) {me.printStatsDetails("Test: terrain obscurre contact. Rejected.");return 0;} + else me.printStatsDetails("Test: contact approved."); + return me.newlockgained; + }, + + checkForClassInFlight: func (tact) { + # call this only after firing + if(tact != nil and tact.isValid() and + ( (tact.get_type() == SURFACE and me.target_gnd) + or (tact.get_type() == AIR and me.target_air) + or (tact.get_type() == POINT and me.target_pnt) + or (tact.get_type() == MARINE and me.target_sea))) { + return 1; + } + return 0; + }, + + search: func { + # looping in search mode + if (deltaSec.getValue()==0) { + settimer(func me.search(), 0.5); + } + if (me.deleted) { + return; + } elsif ( me.status == MISSILE_FLYING ) { + me.SwSoundVol.setDoubleValue(0); + me.SwSoundOnOff.setBoolValue(0); + return; + } elsif ( me.status == MISSILE_STANDBY or me.status == MISSILE_STARTING) { + # Stand by. + me.SwSoundVol.setDoubleValue(0); + me.SwSoundOnOff.setBoolValue(0); + #me.trackWeak = 1; + me.standby(); + return; + } elsif ( me.status == MISSILE_LOCK) { + # Locked. + me.printSearch("in search loop, but locked!"); + me.return_to_search(); + return; + } + + + + me.printSearch("searching"); + # search. + if(me.seam_support and me.uncage_auto) { + me.caged = 1; + } + me.coolingSyst(); + if (!me.caged) { + me.slaveContacts = nil; + if (size(me.contacts) == 0) { + me.slaveContacts = [me.getContact()]; + } else { + me.slaveContacts = me.contacts; + } + if (me.rosette_radius != 0 and me.guidance == "heat") { + # Only here for backwards compat. Uncaged and untracking it will not do a pattern, it will be horizon stabilized (TODO). + me.nutateSeeker(PATTERN_ROSETTE, me.command_dir_heading, me.command_dir_pitch, me.rosette_radius); + } else { + me.seeker_head_target = me.uncage_idle_heading+(rand()-0.5); + me.seeker_elev_target = me.uncage_idle_pitch+(rand()-0.5); + me.moveSeeker(); + } + foreach(me.slaveContact ; me.slaveContacts) { + if (me.checkForClass()) { + me.tagt = me.slaveContact; + me.rng = me.tagt.get_range(); + me.total_elev = deviation_normdeg(OurPitch.getValue(), me.tagt.getElevation()); # deg. + me.total_horiz = deviation_normdeg(OurHdg.getValue(), me.tagt.get_bearing()); # deg. + # Check if in range and in the seeker FOV. + if (me.checkForLock()) { + me.printSearch("uncaged-search ready for lock"); + + me.convertGlobalToSeekerViewDirection(me.tagt.get_bearing(), me.tagt.getElevation(), OurHdg.getValue(), OurPitch.getValue(), OurRoll.getValue()); + me.testSeeker(); + if (me.inBeam) { + me.printSearch("uncaged-search found a lock (%s %s)", me.tagt["getVirtualType"] != nil?me.tagt.getVirtualType():"orig", contactPoint!=nil); + me.goToLock(); + return; + } + } + } + } + me.Tgt = nil; + me.SwSoundVol.setDoubleValue(me.vol_search); + me.SwSoundOnOff.setBoolValue(1); + settimer(func me.search(), 0.05);# this mode needs to be a bit faster. + return; + } elsif (me.slave_to_radar) { + me.slaveContact = nil; + if (size(me.contacts) == 0) { + me.slaveContact = me.getContact(); + } else { + me.slaveContact = me.contacts[0]; + } + if (me.checkForClass()) { + me.printSearch("search found suitable contact"); + me.tagt = me.slaveContact; + me.rng = me.tagt.get_range(); + me.total_elev = deviation_normdeg(OurPitch.getValue(), me.tagt.getElevation()); # deg. + me.total_horiz = deviation_normdeg(OurHdg.getValue(), me.tagt.get_bearing()); # deg. + # Check if in range and in the seeker FOV. + if (me.checkForLock()) { + me.printSearch("rdr-slave-search ready for lock"); + me.convertGlobalToSeekerViewDirection(me.tagt.get_bearing(), me.tagt.getElevation(), OurHdg.getValue(), OurPitch.getValue(), OurRoll.getValue()); + if (me.seam_scan and me.guidance == "heat") { + me.nutateSeeker(me.oldPattern?PATTERN_DOUBLE_D:PATTERN_CIRCLE, me.seeker_head_target, me.seeker_elev_target); + } else { + me.moveSeeker(); + } + me.testSeeker(); + if (me.inBeam) { + me.printSearch("rdr-slave-search found a lock (%s %s)", me.tagt["getVirtualType"] != nil?me.tagt.getVirtualType():"orig", contactPoint!=nil); + me.goToLock(); + return; + } + } else { + # Radar locked, seekerhead nutates around a locked direction. + me.convertGlobalToSeekerViewDirection(me.tagt.get_bearing(), me.tagt.getElevation(), OurHdg.getValue(), OurPitch.getValue(), OurRoll.getValue()); + if (me.seam_scan and me.guidance == "heat") { + me.nutateSeeker(me.oldPattern?PATTERN_DOUBLE_D:PATTERN_CIRCLE, me.seeker_head_target, me.seeker_elev_target); + } else { + me.moveSeeker(); + } + if (DEBUG_SEARCH) { + # air target has speed + # fox1 is painted + # in range (max) + # in range (min) + # FOV + # in range (detect) + # Line of sight + me.printSearch("Lock failed %d %d %d %d %d %d %d", + !(me.tagt.get_type() == AIR and me.tagt.get_Speed()<15), + (me.guidance != "semi-radar" or me.is_painted(me.tagt)), + me.rng < me.max_fire_range_nm, + me.rng > me.getCurrentMinFireRange(me.tagt), + me.FOV_check(OurHdg.getValue(),OurPitch.getValue(),me.total_horiz, me.total_elev, me.fcs_fov, vector.Math), + me.rng < me.detect_range_curr_nm, + me.checkForView()); + } + } + } else { + # Radar slaved, no valid designation, seekerhead jitters around a idle direction. + me.seeker_elev_target = me.command_dir_pitch+(rand()-0.5)*(me.seam_scan and me.guidance == "heat"); + me.seeker_head_target = me.command_dir_heading+(rand()-0.5)*(me.seam_scan and me.guidance == "heat"); + me.moveSeeker(); + if (DEBUG_SEARCH and me.slaveContact != nil) { + var tpe = me.slaveContact.get_type(); + if (tpe==AIR) tpe="A"; + elsif (tpe==SURFACE) tpe="G"; + elsif (tpe==MARINE) tpe="M"; + elsif (tpe==POINT) tpe="P"; + else tpe ="?"; + me.printSearch("Class check failed: %s (weapon: %s)", tpe, me.class); + } + } + } elsif (!me.slave_to_radar) { + me.slaveContacts = nil; + if (size(me.contacts) == 0) { + me.slaveContacts = [me.getContact()]; + } else { + me.slaveContacts = me.contacts; + } + if (!me.seam_scan or me.guidance != "heat") { + me.seeker_elev_target = me.command_dir_pitch; + me.seeker_head_target = me.command_dir_heading; + me.moveSeeker(); + } else { + me.nutateSeeker(me.oldPattern?PATTERN_DOUBLE_D:PATTERN_CIRCLE, me.command_dir_heading, me.command_dir_pitch); + } + foreach(me.slaveContact ; me.slaveContacts) { + if (me.checkForClass()) { + me.tagt = me.slaveContact; + me.rng = me.tagt.get_range(); + + # Check if in range and in the seeker FOV. + me.total_elev = deviation_normdeg(OurPitch.getValue(), me.tagt.getElevation()); # deg. + me.total_horiz = deviation_normdeg(OurHdg.getValue(), me.tagt.get_bearing()); # deg. + if (me.checkForLock()) { + me.printSearch("bore/dir-search ready for lock"); + me.convertGlobalToSeekerViewDirection(me.tagt.get_bearing(), me.tagt.getElevation(), OurHdg.getValue(), OurPitch.getValue(), OurRoll.getValue()); + me.testSeeker(); + if (me.inBeam) { + me.printSearch("dir-search found a lock (%s %s)",me.tagt["getVirtualType"] != nil?me.tagt.getVirtualType():"orig", contactPoint!=nil); + me.goToLock(); + return; + } + } + } + } + } + me.Tgt = nil; + me.SwSoundVol.setDoubleValue(me.vol_search); + me.SwSoundOnOff.setBoolValue(1); + settimer(func me.search(), 0.05); + }, + + goToLock: func { + me.status = MISSILE_LOCK; + me.SwSoundOnOff.setBoolValue(1); + me.SwSoundVol.setDoubleValue(me.vol_track); + + me.Tgt = me.tagt; + + me.callsign = damage.processCallsign(me.Tgt.get_Callsign()); + + settimer(func me.update_lock(), 0.1); + }, + + convertGlobalToSeekerViewDirection: func (bearing, elevation, heading, pitch, roll) { + me.target_x = math.cos(bearing*D2R)*math.cos(elevation*D2R); + me.target_y = -math.sin(bearing*D2R)*math.cos(elevation*D2R); + me.target_z = math.sin(elevation*D2R); + me.target_vector = [me.target_x,me.target_y,me.target_z]; + me.rollLaunchvehicle = vector.Math.rollMatrix(-roll); + me.pitchLaunchvehicle = vector.Math.pitchMatrix(-pitch); + me.yawLaunchvehicle = vector.Math.yawMatrix(heading); + me.rotation = vector.Math.multiplyMatrices(me.rollLaunchvehicle, vector.Math.multiplyMatrices(me.pitchLaunchvehicle, me.yawLaunchvehicle)); + me.target_vector_from_seekers_view = vector.Math.multiplyMatrixWithVector(me.rotation, me.target_vector); + me.angles = vector.Math.cartesianToEuler(me.target_vector_from_seekers_view); + + me.seeker_head_target = me.angles[0]==nil?0:geo.normdeg180(me.angles[0]); + me.seeker_elev_target = me.angles[1]; + }, + + nutateSeeker: func (pattern, heading, pitch, radius = nil) { + me.pattern_elapsed = systime(); + + if (radius == nil and pattern == PATTERN_DOUBLE_D) radius = me.beam_width_deg; + elsif (radius == nil and pattern == PATTERN_CIRCLE) radius = me.beam_width_deg*0.40; + elsif (radius == nil and pattern == PATTERN_ROSETTE) radius = me.beam_width_deg*2.00; + + me.target_x = math.cos(heading*D2R)*math.cos(pitch*D2R); + me.target_y = -math.sin(heading*D2R)*math.cos(pitch*D2R); + me.target_z = math.sin(pitch*D2R); + + me.seeker_reset = [1,0,0]; + + me.meridian_factor = math.abs(pitch)>85?1:math.cos(pitch*D2R); + + if (math.sqrt(math.pow((me.seeker_head-heading)*me.meridian_factor,2)+math.pow(me.seeker_elev-pitch,2))>radius*1.2) { + me.seeker_head_target = heading; + me.seeker_elev_target = pitch; + me.moveSeeker(); + } elsif (vector.Math.angleBetweenVectors(me.seeker_reset, [me.target_x,me.target_y,me.target_z]) < (me.slave_to_radar?math.min(me.max_seeker_dev, me.fcs_fov):me.max_seeker_dev)) { + # TODO: check for seeker FOV of pattern also instead of just center of pattern. + # TODO: use proper high elevation math here too instead of feeble meridian factor. + if (pattern == PATTERN_ROSETTE) { + # rosette nutation + me.freq1 = me.angular_speed*0.23/radius; + me.freq2 = me.f1*0.4; + me.seeker_head = 0.5*radius*(math.cos(me.freq1*math.pi*2*me.pattern_elapsed)+math.cos(me.freq2*math.pi*2*me.pattern_elapsed))/me.meridian_factor+heading; + me.seeker_elev = 0.5*radius*(math.sin(me.freq1*math.pi*2*me.pattern_elapsed)-math.sin(me.freq2*math.pi*2*me.pattern_elapsed))+pitch; + } elsif (pattern == PATTERN_CIRCLE) { + # Standard nutation (CCW) + me.freq = math.min(me.angular_speed/(2*math.pi*radius), 1.0);# source for 1 hz: NAVAIR 01 245FDB-1T + me.seeker_head = radius*math.cos(me.freq*math.pi*2*me.pattern_elapsed)/me.meridian_factor+heading; + me.seeker_elev =-radius*math.sin(me.freq*math.pi*2*me.pattern_elapsed)+pitch; + } elsif (pattern == PATTERN_DOUBLE_D) { + # Is used by older AIM-9G/AIM-9H. 4 hz. 2.5 deg radius. + me.freq = 4.0; + me.doubleDmod = math.mod(me.pattern_elapsed,4); + if (me.doubleDmod >= 0 and me.doubleDmod < 1) { + me.seeker_head = radius*math.cos(math.pi*me.doubleDmod)/me.meridian_factor+heading; + me.seeker_elev =-radius*math.sin(math.pi*me.doubleDmod)+pitch; + } elsif (me.doubleDmod >= 1 and me.doubleDmod < 2) { + me.seeker_head = (2*radius*(me.doubleDmod-1)-radius)/me.meridian_factor+heading; + me.seeker_elev = pitch; + } elsif (me.doubleDmod >= 2 and me.doubleDmod < 3) { + me.seeker_head = radius*math.cos(math.pi*(me.doubleDmod-2))/me.meridian_factor+heading; + me.seeker_elev = radius*math.sin(math.pi*(me.doubleDmod-2))+pitch; + } elsif (me.doubleDmod >= 3) { + me.seeker_head = (2*radius*(me.doubleDmod-3)-radius)/me.meridian_factor+heading; + me.seeker_elev = pitch; + } + } + } + me.computeSeekerPos(); + }, + + moveSeeker: func { + # Build unit vector components for seeker and target location in aircraft frame: + me.target_x = math.cos(me.seeker_head_target*D2R)*math.cos(me.seeker_elev_target*D2R); + me.target_y = -math.sin(me.seeker_head_target*D2R)*math.cos(me.seeker_elev_target*D2R); + me.target_z = math.sin(me.seeker_elev_target*D2R); + + me.seeker_reset = [1,0,0]; + + if (me.guidance != "heat" and me.guidance != "vision") { + me.new_seeker_deviation = vector.Math.angleBetweenVectors(me.seeker_reset, [me.target_x,me.target_y,me.target_z]); + if (me.new_seeker_deviation < (me.slave_to_radar?me.fcs_fov:me.max_seeker_dev)) { + me.seeker_elev = me.seeker_elev_target; + me.seeker_head = me.seeker_head_target; + } + me.computeSeekerPos(); + return; + } + me.seeker_elapsed = systime(); + if (me.seeker_last_time != 0) { + me.seeker_time = me.seeker_elapsed - me.seeker_last_time; + me.seeker_max_move = me.seeker_time*me.angular_speed; + + # Build unit vector components for seeker and target location in aircraft frame: + me.seeker_x = math.cos(me.seeker_head*D2R)*math.cos(me.seeker_elev*D2R); + me.seeker_y = -math.sin(me.seeker_head*D2R)*math.cos(me.seeker_elev*D2R); + me.seeker_z = math.sin(me.seeker_elev*D2R); + + me.ideal_seeker_deviation = vector.Math.angleBetweenVectors([me.seeker_x,me.seeker_y,me.seeker_z],[me.target_x,me.target_y,me.target_z]); + me.ideal_total_seeker_deviation = vector.Math.angleBetweenVectors(me.seeker_reset, [me.target_x,me.target_y,me.target_z]); + + if (me.ideal_seeker_deviation > me.seeker_max_move) { + me.new_seeker_vector = vector.Math.rotateVectorTowardsVector([me.seeker_x,me.seeker_y,me.seeker_z],[me.target_x,me.target_y,me.target_z],me.seeker_max_move); + me.new_seeker_deviation = vector.Math.angleBetweenVectors(me.seeker_reset, me.new_seeker_vector); + + if (me.new_seeker_deviation < me.max_seeker_dev) { + me.new_seeker_pos = vector.Math.cartesianToEuler(me.new_seeker_vector); + me.seeker_head = me.new_seeker_pos[0]==nil?0:geo.normdeg180(me.new_seeker_pos[0]); + me.seeker_elev = me.new_seeker_pos[1]; + } + } elsif (me.ideal_total_seeker_deviation < me.max_seeker_dev) { + me.seeker_elev = me.seeker_elev_target; + me.seeker_head = me.seeker_head_target; + } + } + me.seeker_last_time = me.seeker_elapsed; + me.computeSeekerPos(); + }, + + testSeeker: func { + me.inBeam = 0; + + # Build unit vector components for seeker and target location in aircraft frame: + me.target_x = math.cos(me.seeker_head_target*D2R)*math.cos(me.seeker_elev_target*D2R); + me.target_y = -math.sin(me.seeker_head_target*D2R)*math.cos(me.seeker_elev_target*D2R); + me.target_z = math.sin(me.seeker_elev_target*D2R); + + me.seeker_x = math.cos(me.seeker_head*D2R)*math.cos(me.seeker_elev*D2R); + me.seeker_y = -math.sin(me.seeker_head*D2R)*math.cos(me.seeker_elev*D2R); + me.seeker_z = math.sin(me.seeker_elev*D2R); + + + # we measure the geodesic angle between where seeker is pointing and where the target is. + me.target_deviation = vector.Math.angleBetweenVectors([me.target_x,me.target_y,me.target_z],[me.seeker_x,me.seeker_y,me.seeker_z]); + + if (me.target_deviation < me.beam_width_deg) { + me.inBeam = 1; + #me.printSearch("in beam"); + } + }, + + computeSeekerPos: func { + # Compute HUD diamond position. + if ( use_fg_default_hud) { + var h_rad = (90 - me.seeker_head) * D2R; + var e_rad = (90 - me.seeker_elev) * D2R; + var devs = develev_to_devroll(h_rad, e_rad); + var combined_dev_deg = devs[0]; + var combined_dev_length = devs[1]; + var clamped = devs[2]; + if ( clamped and me.status == MISSILE_LOCK) { + SW_reticle_Blinker.blink(); + } else { + SW_reticle_Blinker.cont(); + } + HudReticleDeg.setDoubleValue(combined_dev_deg); + HudReticleDev.setDoubleValue(combined_dev_length); + } + }, + + update_lock: func() { + # + # Missile locked on target + # + if (deltaSec.getValue()==0) { + settimer(func me.update_lock(), 0.5); + } + if (me.status == MISSILE_FLYING) { + return; + } + if (me.Tgt == nil) { + me.printSearch("search commanded 1"); + me.return_to_search(); + return; + } + if (me.status == MISSILE_SEARCH) { + # Status = searching. + me.printSearch("search commanded 2"); + me.return_to_search(); + return; + } elsif ( me.status == MISSILE_STANDBY or me.status == MISSILE_STARTING) { + # Status = stand-by. + me.reset_seeker(); + me.SwSoundOnOff.setBoolValue(0); + me.SwSoundVol.setDoubleValue(0); + #me.trackWeak = 1; + me.standby(); + return; + } elsif (!me.Tgt.isValid()) { + # Lost of lock due to target disapearing: + # return to search mode. + me.printSearch("invalid"); + me.return_to_search(); + return; + } elsif (me.deleted) { + return; + } elsif (me.slave_to_radar and me.caged and me.getContact() != me.Tgt and !me.noCommonTarget) { + me.printSearch("target switch (%s to %s)", me.Tgt["getVirtualType"] != nil?me.Tgt.getVirtualType():"orig", me.getContact()==nil?"nil":(me.getContact()["getVirtualType"] != nil?me.getContact().getVirtualType():"orig")); + me.return_to_search(); + return; + } + me.printSearch("lock (caged:%d slave:%d point:%s same:%d noCommon:%d)",me.caged,me.slave_to_radar,contactPoint!=nil,me.getContact() == me.Tgt,me.noCommonTarget); + # Time interval since lock time or last track loop. + #if (me.status == MISSILE_LOCK) { + # Status = locked. Get target position relative to our aircraft. + + #} + + #me.time = props.globals.getNode("/sim/time/elapsed-sec", 1).getValue(); + + if(me.seam_support and me.uncage_auto) { + me.caged = 0; + } + me.coolingSyst(); + me.computeSeekerPos(); + if (me.status != MISSILE_STANDBY ) {#TODO: should this also check for starting up? + me.in_view = me.check_t_in_fov(); + + if (!me.in_view) { + me.printSearch("out of view"); + me.return_to_search(); + return; + } + + if (!me.caged or me.slave_to_radar) { + me.convertGlobalToSeekerViewDirection(me.Tgt.get_bearing(), me.Tgt.getElevation(), OurHdg.getValue(), OurPitch.getValue(), OurRoll.getValue()); + # Notice: seeker_xxxx_target is used both for denoting where seeker should move towards and where the target is. In this case its both: + me.moveSeeker(); + } elsif (!me.slave_to_radar) { + if (me.seam_scan and me.guidance == "heat") { + me.nutateSeeker(PATTERN_CIRCLE, me.command_dir_heading, me.command_dir_pitch); + } else { + me.seeker_elev_target = me.command_dir_pitch; + me.seeker_head_target = me.command_dir_heading; + # Notice: seeker_xxxx_target is used both for denoting where seeker should move towards and where the target is. In this case its the former: + me.moveSeeker(); + } + } + + # Notice: seeker_xxxx_target is used both for denoting where seeker should move towards and where the target is. In this case its the latter: + me.convertGlobalToSeekerViewDirection(me.Tgt.get_bearing(), me.Tgt.getElevation(), OurHdg.getValue(), OurPitch.getValue(), OurRoll.getValue()); + me.testSeeker(); + if (!me.inBeam or (me.guidance == "semi-radar" and !me.is_painted(me.Tgt))) { + me.printSearch("out of beam or no beam for fox 1"); + me.status = MISSILE_SEARCH; + me.Tgt = nil; + me.SwSoundOnOff.setBoolValue(1); + me.SwSoundVol.setDoubleValue(me.vol_search); + settimer(func me.search(), 0.1); + return; + } + + me.dist = geo.aircraft_position().direct_distance_to(me.Tgt.get_Coord()); + + me.SwSoundOnOff.setBoolValue(1); + me.SwSoundVol.setDoubleValue(me.vol_track); + + if (!me.noCommonTarget and me.slave_to_radar) { + me.slaveContact = nil; + if (size(me.contacts) == 0) { + me.slaveContact = me.getContact(); + } else { + me.slaveContact = me.contacts[0]; + } + if (me.slaveContact == nil or me.slaveContact != me.Tgt or (me.slaveContact.getUnique() != nil and me.Tgt.getUnique() != nil and me.slaveContact.getUnique() != me.Tgt.getUnique())) { + me.printSearch("Radar/TGP system lock updated, dropping this lock.."); + me.return_to_search(); + return; + } + } + + settimer(func me.update_lock(), deltaSec.getValue()==0?0.5:0.1); + return; + } + me.standby(); + return; + }, + + return_to_search: func { + me.status = MISSILE_SEARCH; + me.Tgt = nil; + me.SwSoundOnOff.setBoolValue(1); + me.SwSoundVol.setDoubleValue(me.vol_search); + #me.trackWeak = 1; + me.reset_seeker(); + settimer(func me.search(), 0.1); + }, + + ################################################################### + # end loops for before flying. + ################################################################### + + FOV_check: func (meHeading, mePitch, deviation_hori, deviation_elev, fov_radius, vect) { + # we measure the geodesic angle between current attitude and the attitude to target. We pass vector math since this method is called both during multi-threading and not. + me.meVector = vect.eulerToCartesian3X(-meHeading, mePitch, 0); + me.itVector = vect.eulerToCartesian3X(-(meHeading+deviation_hori), mePitch+deviation_elev, 0); + me.fov_radial = vect.angleBetweenVectors(me.meVector, me.itVector); + #me.fov_radial = math.sqrt(math.pow(deviation_hori,2)+math.pow(deviation_elev,2)); + if (me.fov_radial <= fov_radius) { + return 1; + } + # out of FOV + #if (me.status==MISSILE_FLYING) printf("1: %.1f out of %.1f, deviation %.1f, %.1f", me.fov_radial, fov_radius, deviation_hori, deviation_elev); + return 0; + }, + + FOV_check_norm: func (meHeading, mePitch, deviation_hori, deviation_elev, fov_radius,vect) { + # we measure the geodesic angle between current attitude and the attitude to target. + me.meVector = vect.eulerToCartesian3X(-meHeading, mePitch, 0); + me.itVector = vect.eulerToCartesian3X(-(meHeading+deviation_hori), mePitch+deviation_elev, 0); + me.fov_radial = vect.angleBetweenVectors(me.meVector, me.itVector); + #me.fov_radial = math.sqrt(math.pow(deviation_hori,2)+math.pow(deviation_elev,2)); + if (fov_radius == 0) return -1; + #if (me.status==MISSILE_FLYING) printf("2: %.1f out of %.1f, deviation %.1f, %.1f", me.fov_radial, fov_radius, deviation_hori, deviation_elev); + return me.fov_radial/fov_radius; + }, + + check_t_in_fov: func { + # called only before firing + me.total_elev = deviation_normdeg(OurPitch.getValue(), me.Tgt.getElevation()); # deg. + me.total_horiz = deviation_normdeg(OurHdg.getValue(), me.Tgt.get_bearing()); # deg. + # Check if in range and in the seeker FOV. + if (me.FOV_check(OurHdg.getValue(),OurPitch.getValue(),me.total_horiz, me.total_elev, me.slave_to_radar?(me.guidance == "heat" or me.guidance == "vision"?math.min(me.max_seeker_dev, me.fcs_fov):me.fcs_fov):me.max_seeker_dev, vector.Math) and me.Tgt.get_range() < me.max_fire_range_nm and me.Tgt.get_range() > me.getCurrentMinFireRange(me.Tgt) + and (me.Tgt.get_range() < me.detect_range_curr_nm or (me.guidance != "radar" and me.guidance != "semi-radar" and me.guidance != "tvm" and me.guidance != "sample" and me.guidance != "heat" and me.guidance != "vision" and me.guidance != "heat" and me.guidance != "radiation"))) { + return 1; + } + # Target out of FOV or range while still not launched, return to search loop. + return 0; + }, + + is_painted: func (target) { + if(target != nil) { + me.hasPaint = target.isPainted(); + if(me.hasPaint != nil and me.hasPaint) { + return 1; + } + } + return 0; + }, + + is_laser_painted: func (target) { + if(target != nil) { + me.hasPaint = target.isLaserPainted(); + if(me.hasPaint != nil and me.hasPaint) { + return 1; + } + } + return 0; + }, + + is_radiating_me: func (target) { + if(target != nil) { + me.seeMe = target.isRadiating(me.coord); + if (me.seeMe != nil and me.seeMe) { + return 1; + } + } + return 0; + }, + + is_radiating_aircraft: func (target) { + if(target != nil) { + me.seeMe = target.isRadiating(geo.aircraft_position()); + if (me.seeMe != nil and me.seeMe) { + return 1; + } + } + return 0; + }, + + reset_seeker: func { + #me.printSearch("Reset seeker"); + me.seeker_elev_target = 0; + me.seeker_head_target = 0; + me.moveSeeker(); + }, + + clamp_min_max: func (v, mm) { + if ( v < -mm ) { + v = -mm; + } elsif ( v > mm ) { + v = mm; + } + return(v); + }, + + clamp: func(v, min, max) { v < min ? min : v > max ? max : v }, + + animation_flags_props: func { + # Create animation flags properties. + var path_base = "payload/armament/"~me.type_lc~"/flags/"; + + var msl_path = path_base~"msl-id-" ~ me.ID; + me.msl_prop = props.globals.initNode( msl_path, 1, "BOOL", 1); + me.msl_prop.setBoolValue(1);# this is cause it might already exist, and so need to force value + + var smoke_path = path_base~"smoke-id-" ~ me.ID; + me.smoke_prop = props.globals.initNode( smoke_path, 0, "BOOL", 1); + + var explode_path = path_base~"explode-id-" ~ me.ID; + me.explode_prop = props.globals.initNode( explode_path, 0, "BOOL", 1); + + var explode_smoke_path = path_base~"explode-smoke-id-" ~ me.ID; + me.explode_smoke_prop = props.globals.initNode( explode_smoke_path, 0, "BOOL", 1); + + var explode_water_path = path_base~"explode-water-id-" ~ me.ID; + me.explode_water_prop = props.globals.initNode( explode_water_path, 0, "BOOL", 1); + + var explode_angle_path = path_base~"explode-angle"; + me.explode_angle_prop = props.globals.initNode( explode_angle_path, 0.0, "DOUBLE", 1); + + var explode_sound_path = "payload/armament/flags/explode-sound-on-" ~ me.ID;; + me.explode_sound_prop = props.globals.initNode( explode_sound_path, 0, "BOOL", 1); + + var explode_sound_vol_path = "payload/armament/flags/explode-sound-vol-" ~ me.ID;; + me.explode_sound_vol_prop = props.globals.initNode( explode_sound_vol_path, 0, "DOUBLE", 1); + + var deploy_path = path_base~"deploy-id-" ~ me.ID; + me.deploy_prop = props.globals.initNode(deploy_path, 0, "DOUBLE", 1); + }, + + animate_explosion: func (hitGround) { + # + # a last position update to where the explosion happened: + # + me.latN.setDoubleValue(me.coord.lat()); + me.lonN.setDoubleValue(me.coord.lon()); + me.altN.setDoubleValue(me.coord.alt()*M2FT); + me.pitchN.setDoubleValue(0);# this will make explosions from cluster bombs (like M90) align to ground 'sorta'. + me.rollN.setDoubleValue(0);# this will make explosions from cluster bombs (like M90) align to ground 'sorta'. + me.msl_prop.setBoolValue(0); + me.smoke_prop.setBoolValue(0); + var info = geodinfo(me.coord.lat(), me.coord.lon()); + + if (hitGround) { + if (info == nil) { + me.explode_water_prop.setBoolValue(0); + } elsif (info[1] == nil) { + #print ("Building hit!"); + } elsif (!info[1].solid) { + me.explode_water_prop.setBoolValue(1); + } else { + me.explode_water_prop.setBoolValue(0); + } + } else { + me.explode_water_prop.setBoolValue(0); + } + + #print (me.typeShort); + + me.explode_prop.setBoolValue(1); + me.explode_angle_prop.setDoubleValue((rand() - 0.5) * 50); + thread.lock(mutexTimer); + append(AIM.timerQueue, [me, func me.explode_prop.setBoolValue(0), [], 0.5]); + append(AIM.timerQueue, [me, func me.explode_smoke_prop.setBoolValue(1), [], 0.5]); + append(AIM.timerQueue, [me, func {me.explode_smoke_prop.setBoolValue(0);if (me.first and size(keys(AIM.flying))>1) {me.resetFirst();}}, [], 3]); + thread.unlock(mutexTimer); + if (info == nil or !hitGround or getprop("payload/armament/enable-craters") == nil or !getprop("payload/armament/enable-craters")) {return;}; + thread.lock(mutexTimer); + append(AIM.timerQueue, [me, func { + if (info[1] == nil) { + #print ("Building hit..smoking"); + var static = geo.put_model(getprop("payload/armament/models") ~ "bomb_hit_smoke.xml", me.coord.lat(), me.coord.lon()); + if(getprop("payload/armament/msg") and info[0] != nil) { + thread.lock(mutexTimer); + append(AIM.timerQueue, [AIM, AIM.notifyCrater, [me.coord.lat(), me.coord.lon(), info[0], 2, 0, static], 0]); + thread.unlock(mutexTimer); + } + } else if ((info[1] != nil) and info[1].solid) { + var crater_model = ""; + var siz = -1; + if (me.weight_whead_lbm < 850 and (me.target_sea or me.target_gnd)) { + crater_model = getprop("payload/armament/models") ~ "crater_small.xml"; + siz = 0; + #print("small crater"); + } elsif (me.target_sea or me.target_gnd) { + #print("big crater"); + siz = 1; + crater_model = getprop("payload/armament/models") ~ "crater_big.xml"; + } + + if (crater_model != "" and me.weight_whead_lbm > 150) { + var static = geo.put_model(crater_model, me.coord.lat(), me.coord.lon()); + #print("put crater"); + if(getprop("payload/armament/msg") and info[0] != nil) { + thread.lock(mutexTimer); + append(AIM.timerQueue, [AIM, AIM.notifyCrater, [me.coord.lat(), me.coord.lon(),info[0],siz, 0, static], 0]); + thread.unlock(mutexTimer); + } + } + } + }, [], 0.5]); + thread.unlock(mutexTimer); + }, + + animate_dud: func { + # + # a last position update to where the impact happened: + # + me.latN.setDoubleValue(me.coord.lat()); + me.lonN.setDoubleValue(me.coord.lon()); + me.altN.setDoubleValue(me.coord.alt()*M2FT); + #me.pitchN.setDoubleValue(0); uncomment this to let it lie flat on ground, instead of sticking its nose in it. + me.smoke_prop.setBoolValue(0); + }, + + sndPropagate: func { + var dt = deltaSec.getValue(); + if (dt == 0) { + #FG is likely paused + settimer(func me.sndPropagate(), 0.01); + return; + } + #dt = update_loop_time; + var elapsed = systime(); + if (me.elapsed_last_snd != 0) { + dt = (elapsed - me.elapsed_last_snd) * speedUp.getValue(); + } + me.elapsed_last_snd = elapsed; + + me.ac = geo.aircraft_position(); + var distance = me.coord.direct_distance_to(me.ac); + + me.sndDistance = me.sndDistance + (me.sndSpeed * dt) * FT2M; + if(me.sndDistance > distance) { + var volume = math.pow(math.e,(-.00025*(distance-1000))); + me.printStats(me.type~": Explosion heard "~distance~"m vol:"~volume); + me.explode_sound_vol_prop.setDoubleValue(volume); + me.explode_sound_prop.setBoolValue(1); + settimer( func me.explode_sound_prop.setBoolValue(0), 3); + settimer( func me.del(), 4); + return; + } elsif (me.sndDistance > 5000) { + settimer(func { me.del(); }, 4 ); + return;#TODO: I added this return recently, but not sure why it wasn't there.. + } else { + settimer(func me.sndPropagate(), 0.05); + return; + } + }, + + steering_speed_G_old: func(meHeading, mePitch,steering_e_deg, steering_h_deg, s_fps, dt) { + # Get G number from steering (e, h) in deg, speed in ft/s. + me.meVector = me.myMath.eulerToCartesian3X(-meHeading, mePitch, 0); + me.itVector = me.myMath.eulerToCartesian3X(-(meHeading+steering_h_deg), mePitch+steering_e_deg, 0); + me.steer_deg = me.myMath.angleBetweenVectors(me.meVector, me.itVector); + + # next speed vector + me.vector_next_x = math.cos(me.steer_deg*D2R)*s_fps; + me.vector_next_y = math.sin(me.steer_deg*D2R)*s_fps; + + # present speed vector + me.vector_now_x = s_fps; + me.vector_now_y = 0; + + # Delta velocity: subtract the vectors from each other and get the magnitude + me.dv = me.myMath.minus([me.vector_now_x,me.vector_now_y,0],[me.vector_next_x,me.vector_next_y,0]); + me.dv = me.myMath.magnitudeVector(me.dv); + + # calculate g-force + # dv/dt=a + me.g = (me.dv/dt) / g_fps; + + return me.g; + }, + + steering_speed_G: func(meHeading, mePitch, steering_e_deg, steering_h_deg, s_fps, dt) { + # Get G number from steering (e, h) in deg, speed in ft/s. + me.meVector = me.myMath.eulerToCartesian3X(-meHeading, mePitch, 0); + me.meVectorN= me.myMath.normalize(me.meVector); + me.meVector = me.myMath.product(s_fps, me.meVectorN);#velocity vector now + me.itVector = me.myMath.eulerToCartesian3X(-(meHeading+steering_h_deg), mePitch+steering_e_deg, 0); + me.itVector = me.myMath.normalize(me.itVector); + me.itVector = me.myMath.product(s_fps, me.itVector);#velocity vector if doing that steering + + # Delta lateral velocity + me.dv = me.myMath.minus(me.itVector, me.meVector); + me.dv = me.myMath.projVectorOnPlane(me.meVectorN, me.dv); + me.dv = me.myMath.magnitudeVector(me.dv); + + # calculate g-force + # dv/dt=a + me.g = (me.dv/dt) / g_fps; + + return me.g; + }, + + overload_limiter: func(meHeading, mePitch, steering_e_deg, steering_h_deg, s_fps, dt, gMax) { + # The missile desires to rotate a certain amount + # This function will limit that steering to prevent it from exceeding the max G it should be able to do at this air density + + if (gMax == 0 or (steering_e_deg == 0 and steering_h_deg == 0)) { + return [0,0]; + } + + # Get G number from steering (e, h) in deg, speed in ft/s. + me.meVector = me.myMath.eulerToCartesian3X(-meHeading, mePitch, 0); + me.meVectorN= me.myMath.normalize(me.meVector); + me.meVector = me.myMath.product(s_fps, me.meVectorN);#velocity vector now + me.itVector = me.myMath.eulerToCartesian3X(-(meHeading+steering_h_deg), mePitch+steering_e_deg, 0); + me.itVectorN= me.myMath.normalize(me.itVector); + me.itVector = me.myMath.product(s_fps, me.itVectorN);#velocity vector if doing that steering + + # Delta lateral velocity + me.dvAcc = me.myMath.minus(me.itVector, me.meVector); + me.dv = me.myMath.projVectorOnPlane(me.meVectorN, me.dvAcc); + me.dv = me.myMath.magnitudeVector(me.dv); + + # calculate g-force + # dv/dt=a + me.g_load = (me.dv/dt) / g_fps; + + me.exceed_g = gMax/me.g_load; + + if (me.exceed_g >= 1) { + return [steering_h_deg, steering_e_deg]; + } + + # Now do something that works okay for small desired steerings, but fails for big steerings. Hence the 0.9 factor. + me.dvAcc9 = me.myMath.product(me.exceed_g*0.9, me.dvAcc); + me.itVector = me.myMath.plus(me.dvAcc9, me.meVector); + + me.euler = me.myMath.cartesianToEuler(me.itVector); + + if (me.euler[0] == nil) { + me.euler[0] = meHeading; + } + + return [geo.normdeg180(me.euler[0]-meHeading), me.euler[1]-mePitch]; + }, + + max_G_Rotation_old: func(steering_e_deg, steering_h_deg, s_fps, dt, gMax) { + # The missile desires to rotate a certain amount + # This function will limit that steering to prevent it from exceeding the max G it should be able to do at this air density + me.guess = 1; + me.coef = 1; + me.lastgoodguess = 1; + + for(var i=1;i<25;i+=1){ + me.coef = me.coef/2; + me.new_g = me.steering_speed_G(me.hdg, me.pitch, steering_e_deg*me.guess, steering_h_deg*me.guess, s_fps, dt); + if (me.new_g < gMax) { + me.lastgoodguess = me.guess; + me.guess = me.guess + me.coef; + } else { + me.guess = me.guess - me.coef; + } + } + return me.lastgoodguess; + }, + + nextGeoloc: func(lat, lon, heading, speed, dt, alt=100) { + # lng & lat & heading, in degree, speed in fps + # this function should send back the futures lng lat + me.distanceN = speed * dt * FT2M; # should be a distance in meters + #me.print("distance ", distance); + # much simpler than trigo + me.NextGeo = geo.Coord.new().set_latlon(lat, lon, alt); + me.NextGeo.apply_course_distance(heading, me.distanceN); + return me.NextGeo; + }, + + rho_sndspeed: func(altitude) { + # Calculate density of air: rho + # at altitude (ft), using standard atmosphere, + # standard temperature T and pressure p. + + me.T = 0; + me.p = 0; + if (altitude < 36152) { + # curve fits for the troposphere + me.T = 59 - 0.00356 * altitude; + me.p = 2116 * math.pow( ((me.T + 459.7) / 518.6) , 5.256); + } elsif ( 36152 < altitude and altitude < 82345 ) { + # lower stratosphere + me.T = -70; + me.p = 473.1 * math.pow( math.e , 1.73 - (0.000048 * altitude) ); + } else { + # upper stratosphere + me.T = -205.05 + (0.00164 * altitude); + me.p = 51.97 * math.pow( ((me.T + 459.7) / 389.98) , -11.388); + } + + me.rho = me.p / (1718 * (me.T + 459.7)); + + # calculate the speed of sound at altitude + # a = sqrt ( g * R * (T + 459.7)) + # where: + # snd_speed in feet/s, + # g = specific heat ratio, which is usually equal to 1.4 + # R = specific gas constant, which equals 1716 ft-lb/slug/R + + me.snd_speed = math.sqrt( 1.4 * 1716 * (me.T + 459.7)); + return [me.rho, me.snd_speed]; + + }, + + printFlight: func { + if (DEBUG_FLIGHT) { + thread.lock(mutexTimer); + append(AIM.timerQueue, [nil, printff, arg, -1]); + thread.unlock(mutexTimer); + } + }, + + printFlightDetails: func { + if (DEBUG_FLIGHT_DETAILS) { + thread.lock(mutexTimer); + append(AIM.timerQueue, [nil, printff, arg, -1]); + thread.unlock(mutexTimer); + } + }, + + printStats: func { + if (DEBUG_STATS) { + thread.lock(mutexTimer); + append(AIM.timerQueue, [nil, printff, arg, -1]); + thread.unlock(mutexTimer); + } + }, + + printStatsDetails: func { + if (DEBUG_STATS_DETAILS) { + thread.lock(mutexTimer); + append(AIM.timerQueue, [nil, printff, arg, -1]); + thread.unlock(mutexTimer); + } + }, + + printGuide: func { + if (DEBUG_GUIDANCE) { + thread.lock(mutexTimer); + append(AIM.timerQueue, [nil, printff, arg, -1]); + thread.unlock(mutexTimer); + } + }, + + printGuideDetails: func { + if (DEBUG_GUIDANCE_DETAILS) { + thread.lock(mutexTimer); + append(AIM.timerQueue, [nil, printff, arg, -1]); + thread.unlock(mutexTimer); + } + }, + + printCode: func { + if (DEBUG_CODE) { + thread.lock(mutexTimer); + append(AIM.timerQueue, [nil, printff, arg, -1]); + thread.unlock(mutexTimer); + } + }, + + printSearch: func { + if (DEBUG_SEARCH) { + thread.lock(mutexTimer); + append(AIM.timerQueue, [nil, printff, arg, -1]); + thread.unlock(mutexTimer); + } + }, + + printAlways: func { + thread.lock(mutexTimer); + append(AIM.timerQueue, [nil, printff, arg, -1]); + thread.unlock(mutexTimer); + }, + + timerLoop: func { + thread.lock(mutexTimer); + AIM.tq = AIM.timerQueue; + AIM.timerQueue = []; + thread.unlock(mutexTimer); + foreach(var cmd; AIM.tq) { + AIM.timerCall(cmd); + } + }, + + timerCall: func (cmd) { + if (cmd != nil) { + if (cmd[3] == -1) { + call(cmd[1], cmd[2], cmd[0], nil, var err = []); + debug.printerror(err); + } else { + var code = "timer_"~rand(); + var tr = maketimer(cmd[3], cmd[0], func {call(cmd[1], cmd[2], cmd[0], nil, var err = []);debug.printerror(err);delete(AIM.timers, code);}); + tr.singleShot = 1; + tr.start(); + AIM.timers[code] = tr; + } + } + }, + + pop_front: func (vector) { + if (size(vector)==0) return [nil, vector]; + var new_vector = []; + var first = 1; + foreach (i;vector) { + if (first) continue; + append(new_vector, i); + } + return [vector[0],new_vector]; + }, + + timers: {}, + + timerQueue: [], + + active: {}, + flying: {}, + + setETA: func (eta, prev = -1) { + # Class method + thread.lock(mutexETA); + if (eta == -1 and prev == AIM.lowestETA) { + AIM.lowestETA = nil; + } elsif (eta == nil) { + AIM.lowestETA = nil; + } elsif (AIM.lowestETA == nil or eta < AIM.lowestETA and eta < 1800) { + AIM.lowestETA = eta; + } + thread.unlock(mutexETA); + }, + getETA: func { + # Class method + var retur = 0; + thread.lock(mutexETA); + retur = AIM.lowestETA; + thread.unlock(mutexETA); + return retur; + }, + + setModelAdded: func { + setprop("ai/models/model-added", me.ai.getPath()); + }, + + setModelRemoved: func { + setprop("ai/models/model-removed", me.ai.getPath()); + }, +}; +var backtrace = func(desc = nil, dump_vars = 1, skip_level = 0, levels = 3) { + var d = (desc == nil) ? "" : " '" ~ desc ~ "'"; + print(""); + print(_title("### backtrace" ~ d ~ " ###")); + skip_level += 1; + for (var i = skip_level; i virtual HUD screen. + var h_dev = eye_hud_m / ( math.sin(dev_rad) / math.cos(dev_rad) ); + var v_dev = eye_hud_m / ( math.sin(elev_rad) / math.cos(elev_rad) ); + # Angle between HUD center/top <-> HUD center/symbol position. + # -90° left, 0° up, 90° right, +/- 180° down. + var dev_deg = math.atan2( h_dev, v_dev ) * R2D; + # Correction with own a/c roll. + var combined_dev_deg = dev_deg; + # Lenght HUD center <-> symbol pos on the HUD: + var combined_dev_length = math.sqrt((h_dev*h_dev)+(v_dev*v_dev)); + # clamp and squeeze the top of the display area so the symbol follow the egg shaped HUD limits. + var abs_combined_dev_deg = math.abs( combined_dev_deg ); + var clamp = hud_radius_m; + if ( abs_combined_dev_deg >= 0 and abs_combined_dev_deg < 90 ) { + var coef = ( 90 - abs_combined_dev_deg ) * 0.00075; + if ( coef > 0.050 ) { coef = 0.050 } + clamp -= coef; + } + if ( combined_dev_length > clamp ) { + combined_dev_length = clamp; + clamped = 1; + } + var v = [combined_dev_deg, combined_dev_length, clamped]; + return(v); +} + +#was in radar +var deviation_normdeg = func(our_heading, target_bearing) { + var dev_norm = geo.normdeg180(target_bearing-our_heading); + return dev_norm; +} + +# +# this code make sure messages don't trigger the MP spam filter: + +var spams = 0; +var spamList = []; +var mutexMsg = thread.newlock(); +var mutexTimer = thread.newlock(); +var mutexETA = thread.newlock(); + +var defeatSpamFilter = func (str) { + thread.lock(mutexMsg); + spams += 1; + if (spams == 15) { + spams = 1; + } + str = str~":"; + for (var i = 1; i <= spams; i+=1) { + str = str~"."; + } + var myCallsign = getprop("sim/multiplay/callsign"); + if (myCallsign != nil and find(myCallsign, str) != -1) { + str = myCallsign~": "~str; + } + var newList = [str]; + for (var i = 0; i < size(spamList); i += 1) { + append(newList, spamList[i]); + } + spamList = newList; + thread.unlock(mutexMsg); +} + +var spamLoop = func { + thread.lock(mutexMsg); + var spam = pop(spamList); + thread.unlock(mutexMsg); + if (spam != nil) { + setprop("/sim/multiplay/chat", spam); + } + settimer(spamLoop, 1.20); +} + +var printff = func{ + var str = call(sprintf, arg,nil,nil,var err = []);#call to printf directly sometimes crashes FG + debug.printerror(err); + print(str); +} + +spamLoop(); +var timerLooper = maketimer(0, AIM, AIM.timerLoop); +timerLooper.start(); diff --git a/BUK-M2/Nasal/radar-logic.nas b/BUK-M2/Nasal/radar-logic.nas new file mode 100644 index 0000000..6b92c8b --- /dev/null +++ b/BUK-M2/Nasal/radar-logic.nas @@ -0,0 +1,427 @@ +var clamp = func(v, min, max) { v < min ? min : v > max ? max : v } +var encode3bits = func(first, second, third) { + var integer = first; + integer = integer + 2 * second; + integer = integer + 4 * third; + return integer; +} +var versionString = getprop("sim/version/flightgear"); +var version = split(".", versionString); +var major = num(version[0]); +var minor = num(version[1]); +var pica = num(version[2]); +var pickingMethod = 0; +if ((major == 2017 and minor == 2 and pica >= 1) or (major == 2017 and minor > 2) or major > 2017) { + pickingMethod = 1; +} + +var AIR = 0; +var MARINE = 1; +var SURFACE = 2; +var ORDNANCE = 3; + +var Contact = { + # For now only used in guided missiles, to make it compatible with Mirage 2000-5. + new: func(c, class) { + var obj = { parents : [Contact]}; +#debug.benchmark("radar process1", func { + obj.rdrProp = c.getNode("radar"); + obj.oriProp = c.getNode("orientation"); + obj.velProp = c.getNode("velocities"); + obj.posProp = c.getNode("position"); + obj.heading = obj.oriProp.getNode("true-heading-deg"); +#}); +#debug.benchmark("radar process2", func { + obj.alt = obj.posProp.getNode("altitude-ft"); + obj.lat = obj.posProp.getNode("latitude-deg"); + obj.lon = obj.posProp.getNode("longitude-deg"); +#}); +#debug.benchmark("radar process3", func { + #As it is a geo.Coord object, we have to update lat/lon/alt ->and alt is in meters + obj.coord = geo.Coord.new(); + obj.coord.set_latlon(obj.lat.getValue(), obj.lon.getValue(), obj.alt.getValue() * FT2M); +#}); +#debug.benchmark("radar process4", func { + obj.pitch = obj.oriProp.getNode("pitch-deg"); + obj.roll = obj.oriProp.getNode("roll-deg"); + obj.speed = obj.velProp.getNode("true-airspeed-kt"); + obj.vSpeed = obj.velProp.getNode("vertical-speed-fps"); + obj.callsign = c.getNode("callsign", 1); + obj.shorter = c.getNode("model-shorter"); + obj.orig_callsign = obj.callsign.getValue(); + obj.name = c.getNode("name"); + obj.sign = c.getNode("sign",1); + obj.valid = c.getNode("valid"); + obj.painted = c.getNode("painted"); + obj.unique = c.getNode("unique"); + obj.validTree = 0; +#}); +#debug.benchmark("radar process5", func { + #obj.transponderID = c.getNode("instrumentation/transponder/transmitted-id"); +#}); +#debug.benchmark("radar process6", func { + obj.acType = c.getNode("sim/model/ac-type"); + obj.type = c.getName(); + obj.index = c.getIndex(); + obj.string = "ai/models/" ~ obj.type ~ "[" ~ obj.index ~ "]"; + obj.shortString = obj.type ~ "[" ~ obj.index ~ "]"; +#}); +#debug.benchmark("radar process7", func { + obj.range = obj.rdrProp.getNode("range-nm"); + obj.bearing = obj.rdrProp.getNode("bearing-deg"); + obj.elevation = obj.rdrProp.getNode("elevation-deg"); + obj.ubody = obj.rdrProp.getNode("velocities/uBody-fps"); + obj.vbody = obj.rdrProp.getNode("velocities/vBody-fps"); + obj.wbody = obj.rdrProp.getNode("velocities/wBody-fps"); +#}); + obj.deviation = nil; + + obj.node = c; + obj.class = class; + + obj.polar = [0,0]; + obj.cartesian = [0,0]; + + return obj; + }, + + get_uBody: func { + var body = nil; + if (me.ubody != nil) { + body = me.ubody.getValue(); + } + if(body == nil) { + body = me.get_Speed()*KT2FPS; + } + return body; + }, + + get_vBody: func { + var body = nil; + if (me.ubody != nil) { + body = me.vbody.getValue(); + } + if(body == nil) { + body = 0; + } + return body; + }, + + get_wBody: func { + var body = nil; + if (me.ubody != nil) { + body = me.wbody.getValue(); + } + if(body == nil) { + body = 0; + } + return body; + }, + + isValid: func () { + var valid = me.valid.getValue(); + if (valid == nil) { + valid = 0; + } + if (me.callsign.getValue() != me.orig_callsign) { + valid = 0; + } + return valid; + }, + + isPainted: func () { + if (getprop("/carrier/sunk") == 1) { + return 0; + } + return isNotBehindTerrain(me.node)[0]; + }, + + isCommandActive: func { + if (getprop("/carrier/sunk") == 1) { + return 0; + } + return isNotBehindTerrain(me.node)[0]; + }, + + getUnique: func () { + if (me.unique == nil) { + me.unique = me.node.getNode("unique"); + } + if (me.unique == nil) { + return nil; + } + var u = me.unique.getValue(); + return u; + }, + + getElevation: func() { + var e = 0; + e = me.elevation.getValue(); + if(e == nil or e == 0) { + # AI/MP has no radar properties + var self = geo.aircraft_position(); + self.set_alt(self.alt()+fire_control.radar_elevation_above_terrain_m); + me.get_Coord(); + var angleInv = clamp(self.distance_to(me.coord)/self.direct_distance_to(me.coord), -1, 1); + e = (self.alt()>me.coord.alt()?-1:1)*math.acos(angleInv)*R2D; + } + return e; + }, + + getNode: func () { + return me.node; + }, + + getFlareNode: func () { + return me.node.getNode("rotors/main/blade[3]/flap-deg"); + }, + + getChaffNode: func () { + return me.node.getNode("rotors/main/blade[3]/position-deg"); + }, + + setPolar: func(dist, angle) { + me.polar = [dist,angle]; + }, + + setCartesian: func(x, y) { + me.cartesian = [x,y]; + }, + + remove: func(){ + if(me.validTree != 0){ + me.validTree.setValue(0); + } + }, + + get_Coord: func(){ + me.coord.set_latlon(me.lat.getValue(), me.lon.getValue(), me.alt.getValue() * FT2M); + var TgTCoord = geo.Coord.new(me.coord); + return TgTCoord; + }, + + get_Callsign: func(){ + var n = me.callsign.getValue(); + if(n != "" and n != nil) { + return n; + } + if (me.name == nil) { + me.name = me.getNode().getNode("name"); + } + if (me.name == nil) { + n = ""; + } else { + n = me.name.getValue(); + } + if(n != "" and n != nil) { + return n; + } + n = me.sign.getValue(); + if(n != "" and n != nil) { + return n; + } + return "UFO"; + }, + + get_model: func(){ + var n = ""; + if (me.shorter == nil) { + me.shorter = me.node.getNode("model-shorter"); + } + if (me.shorter != nil) { + n = me.shorter.getValue(); + } + if(n != "" and n != nil) { + return n; + } + n = me.sign.getValue(); + if(n != "" and n != nil) { + return n; + } + if (me.name == nil) { + me.name = me.getNode().getNode("name"); + } + if (me.name == nil) { + n = ""; + } else { + n = me.name.getValue(); + } + if(n != "" and n != nil) { + return n; + } + return me.get_Callsign(); + }, + + get_Speed: func(){ + # return true airspeed + var n = me.speed.getValue(); + return n; + }, + + get_Longitude: func(){ + var n = me.lon.getValue(); + return n; + }, + + get_Latitude: func(){ + var n = me.lat.getValue(); + return n; + }, + + get_Pitch: func(){ + var n = me.pitch.getValue(); + return n; + }, + + isVirtual: func(){ + return 0; + }, + + get_Roll: func(){ + var n = me.roll.getValue(); + return n; + }, + + get_heading : func(){ + var n = me.heading.getValue(); + if(n == nil) + { + n = 0; + } + return n; + }, + + get_bearing: func(){ + var n = 0; + n = me.bearing.getValue(); + if(n == nil or n == 0) { + # AI/MP has no radar properties + n = me.get_bearing_from_Coord(geo.aircraft_position()); + } + return n; + }, + + get_bearing_from_Coord: func(MyAircraftCoord){ + me.get_Coord(); + var myBearing = 0; + if(me.coord.is_defined()) { + myBearing = MyAircraftCoord.course_to(me.coord); + } + return myBearing; + }, + + get_reciprocal_bearing: func(){ + return geo.normdeg(me.get_bearing() + 180); + }, + + get_deviation: func(true_heading_ref, coord){ + me.deviation = - deviation_normdeg(true_heading_ref, me.get_bearing_from_Coord(coord)); + return me.deviation; + }, + + get_altitude: func(){ + #Return Alt in feet + return me.alt.getValue(); + }, + + get_Elevation_from_Coord: func(MyAircraftCoord) { + me.get_Coord(); + var value = (me.coord.alt() - MyAircraftCoord.alt()) / me.coord.direct_distance_to(MyAircraftCoord); + if (math.abs(value) > 1) { + # warning this else will fail if logged in as observer and see aircraft on other side of globe + return 0; + } + var myPitch = math.asin(value) * R2D; + return myPitch; + }, + + get_total_elevation_from_Coord: func(own_pitch, MyAircraftCoord){ + var myTotalElevation = - deviation_normdeg(own_pitch, me.get_Elevation_from_Coord(MyAircraftCoord)); + return myTotalElevation; + }, + + get_total_elevation: func(own_pitch) { + me.deviation = - deviation_normdeg(own_pitch, me.getElevation()); + return me.deviation; + }, + + get_range: func() { + var r = 0; + if(me.range == nil or me.range.getValue() == nil or me.range.getValue() == 0) { + # AI/MP has no radar properties + me.get_Coord(); + r = me.coord.direct_distance_to(geo.aircraft_position()) * M2NM; + } else { + r = me.range.getValue(); + } + return r; + }, + + get_range_from_Coord: func(MyAircraftCoord) { + var myCoord = me.get_Coord(); + var myDistance = 0; + if(myCoord.is_defined()) { + myDistance = MyAircraftCoord.direct_distance_to(myCoord) * M2NM; + } + return myDistance; + }, + + get_type: func () { + return me.class; + }, + + get_cartesian: func() { + return me.cartesian; + }, + + get_polar: func() { + return me.polar; + }, +}; + +var isNotBehindTerrain = func( mp ) { + var pos = mp.getNode("position"); + var alt = pos.getNode("altitude-ft").getValue(); + var lat = pos.getNode("latitude-deg").getValue(); + var lon = pos.getNode("longitude-deg").getValue(); + if(alt == nil or lat == nil or lon == nil) { + return [0,0]; # invisible and not in front of terrain + } + var aircraftPos = geo.Coord.new().set_latlon(lat, lon, alt*FT2M); + + var myPos = geo.aircraft_position(); + + myPos.set_alt(myPos.alt()+fire_control.radar_elevation_above_terrain_m); + + var target_distance = myPos.direct_distance_to(aircraftPos); + + call(func { + if (target_distance*0.001 > 3.57*(math.sqrt(myPos.alt())+math.sqrt(alt*FT2M))) { + # behind earth curvature + #print("behind earth curvature"); + return [0,0]; # invisible and not in front of terrain + } + },nil,nil,var err =[]); + + var xyz = {"x":myPos.x(), "y":myPos.y(), "z":myPos.z()}; + var dir = {"x":aircraftPos.x()-myPos.x(), "y":aircraftPos.y()-myPos.y(), "z":aircraftPos.z()-myPos.z()}; + + # Check for terrain between own aircraft and other: + v = get_cart_ground_intersection(xyz, dir); + if (v == nil) { + return [1,0]; # visible and not in front of terrain + #printf("No terrain, planes has clear view of each other"); + } else { + var terrain = geo.Coord.new(); + terrain.set_latlon(v.lat, v.lon, v.elevation); + var maxDist = myPos.direct_distance_to(aircraftPos); + var terrainDist = myPos.direct_distance_to(terrain); + if (terrainDist < maxDist-1) { + #printf("terrain found between me and aircraft %.1f meter away.", terrainDist); + return [0,0]; # visible and not in front of terrain + } else { + #print("The planes has clear view of each other"); + return [1,1]; # visible and in front of terrain + } + } +} \ No newline at end of file diff --git a/BUK-M2/Sounds/launch.wav b/BUK-M2/Sounds/launch.wav new file mode 100644 index 0000000000000000000000000000000000000000..0b3c83b44d3152aec73cceb2292bd395c09f1133 GIT binary patch literal 386516 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%0AB8$y8{X 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
;1MW#iUMi)d=fI77;!iL}YlH8bcm&4+` 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

ddmbQ38l5(Cp^ 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�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

hc@9PHkaeuTXz;oRa_1@tyM+yy&@-B1EffRnR= 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 KmgVEzQT+cBmsL0b literal 0 HcmV?d00001 diff --git a/BUK-M2/Sounds/sound.xml b/BUK-M2/Sounds/sound.xml new file mode 100644 index 0000000..31c9e6c --- /dev/null +++ b/BUK-M2/Sounds/sound.xml @@ -0,0 +1,25 @@ + + + + + + missile + Aircraft/BUK-M2/Sounds/launch.wav + once + + payload/armament/m317/sound-fire-on-off + + 50 + 15000 + + 0.01 + 0.01 + 0.01 + + + 1 + 1 + + + + diff --git a/BUK-M2/gui/dialogs/enemies.xml b/BUK-M2/gui/dialogs/enemies.xml new file mode 100644 index 0000000..67f39af --- /dev/null +++ b/BUK-M2/gui/dialogs/enemies.xml @@ -0,0 +1,348 @@ + + + enemies + false + vbox + true + true + 250 + 550 + + + hbox + 1 + + + + + + 1 + + + + + + + 25 + + + + 250 + 25 + + enemies/e1 + true + left + + dialog-apply + + + 1 + 0.5 + 0.5 + + + + enemies/opfor-switch + + + enemies/friend-switch + + + + + 250 + 25 + + enemies/e2 + true + left + + dialog-apply + + + 1 + 0.5 + 0.5 + + + + enemies/opfor-switch + + + enemies/friend-switch + + + + + 250 + 25 + + enemies/e3 + true + left + + dialog-apply + + + 1 + 0.5 + 0.5 + + + + enemies/opfor-switch + + + enemies/friend-switch + + + + + 250 + 25 + + enemies/e4 + true + left + + dialog-apply + + + 1 + 0.5 + 0.5 + + + + enemies/opfor-switch + + + enemies/friend-switch + + + + + 250 + 25 + + enemies/e5 + true + left + + dialog-apply + + + 1 + 0.5 + 0.5 + + + + enemies/opfor-switch + + + enemies/friend-switch + + + + + 250 + 25 + + enemies/e6 + true + left + + dialog-apply + + + 1 + 0.5 + 0.5 + + + + enemies/opfor-switch + + + enemies/friend-switch + + + + + 250 + 25 + + enemies/e7 + true + left + + dialog-apply + + + 1 + 0.5 + 0.5 + + + + enemies/opfor-switch + + + enemies/friend-switch + + + + + 250 + 25 + + enemies/e8 + true + left + + dialog-apply + + + 1 + 0.5 + 0.5 + + + + enemies/opfor-switch + + + enemies/friend-switch + + + + + 250 + 25 + + enemies/e9 + true + left + + dialog-apply + + + 1 + 0.5 + 0.5 + + + + enemies/opfor-switch + + + enemies/friend-switch + + + + + 250 + 25 + + enemies/e10 + true + left + + dialog-apply + + + 1 + 0.5 + 0.5 + + + + enemies/opfor-switch + + + enemies/friend-switch + + + + + 250 + 25 + + enemies/e11 + true + left + + dialog-apply + + + 1 + 0.5 + 0.5 + + + + enemies/opfor-switch + + + enemies/friend-switch + + + + + 250 + 25 + + enemies/e12 + true + left + + dialog-apply + + + 1 + 0.5 + 0.5 + + + + enemies/opfor-switch + + + enemies/friend-switch + + + + + 12 + 12 + /enemies/opfor-switch + + + dialog-apply + + + + 12 + 12 + /enemies/friend-switch + + + dialog-apply + + + \ No newline at end of file diff --git a/BUK-M2/gui/dialogs/prio.xml b/BUK-M2/gui/dialogs/prio.xml new file mode 100644 index 0000000..cabac21 --- /dev/null +++ b/BUK-M2/gui/dialogs/prio.xml @@ -0,0 +1,166 @@ + + + priority + false + vbox + true + false + 150 + 250 + + + 1 + hbox + + + + 1 + + + + table + + + right + 0 + 0 + + + 0 + 1 + priority0 + true + + nasal + + + + + + right + 1 + 0 + + + 1 + 1 + priority1 + true + + nasal + + + + + + right + 2 + 0 + + + 2 + 1 + priority2 + true + + nasal + + + + + + right + 3 + 0 + + + 3 + 1 + priority3 + true + + nasal + + + + + + right + 4 + 0 + + + 4 + 1 + priority4 + true + + nasal + + + + + + right + 5 + 0 + + + 5 + 1 + priority5 + true + + nasal + + + + + + right + 6 + 0 + + + 6 + 1 + priority6 + true + + nasal + + + + + 7 + 0 + 75 + 25 + + instrumentation/datalink/channel + true + right + + dialog-apply + + + 0.75 + 0.75 + 1.0 + + + + \ No newline at end of file