diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 00000000..e74d8c24 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,2 @@ +# Black +a47bef1f1336fd264d0b175f4421758339a30acb \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 70d466be..6c5955b8 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -28,7 +28,8 @@ We will usually need more information for debugging. Include as much of the foll - DCS Liberation save file (the `.liberation` file you save from the DCS Liberation window). By default these are located in your DCS saved games directory (`%USERPROFILE%/Saved Games/DCS`). - The generated mission file (the `.miz` file that you load in DCS to play the turn). By default these are located in your missions directory (`%USERPROFILE%/Saved Games/DCS/Missions`). -- A tacview track file, especially when demonstrating an issue with AI behavior. By default these are locaed in your Tacview tracks directory (`%USERPROFILE%/Documents/Tacview`). +- A tacview track file, especially when demonstrating an issue with AI behavior. By default these are located in your Tacview tracks directory (`%USERPROFILE%/Documents/Tacview`). +- The state.json file from the finished mission when the problem is related to results processing. By default these are located in your Liberation install directory. **Version information (please complete the following information):** - DCS Liberation [e.g. 2.3.1]: diff --git a/.github/workflows/black.yml b/.github/workflows/black.yml new file mode 100644 index 00000000..30465013 --- /dev/null +++ b/.github/workflows/black.yml @@ -0,0 +1,13 @@ +name: Lint + +on: [push, pull_request] + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v2 + - uses: psf/black@stable + with: + args: ". --check" \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..14d8171c --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,6 @@ +repos: + - repo: https://github.com/psf/black + rev: 20.8b1 + hooks: + - id: black + language_version: python3 \ No newline at end of file diff --git a/changelog.md b/changelog.md index f9ea6f22..2f5e9d14 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,38 @@ +# 2.5.0 + +Saves from 2.4 are not compatible with 2.5. + +## Features/Improvements + +* **[Engine]** DCS 2.7 Support +* **[UI]** Improved FOB menu, added a custom banner, and do not display aircraft recruitment menu +* **[Flight Planner]** Added AEW&C missions. (by siKruger) +* **[Kneeboard]** Added dark kneeboard option (by GvonH) +* **[Campaigns]** Multiple EWR sites may now be generated, and EWR sites may be generated outside bases (by SnappyComebacks) +* **[Mission Generation]** Cloudy and rainy (but not thunderstorm) weather will use the cloud presets from DCS 2.7. +* **[Plugins]** Added LotATC export plugin (by drsoran) +* **[Plugins]** Added Splash Damage Plugin (by Wheelijoe) +* **[Loadouts]** Replaced Litening with ATFLIR for all default F/A-18C loadouts. + +## Fixes + +* **[Flight Planner]** Front lines now project threat zones, so TARCAP/escorts will not be pruned for flights near the front. Packages may also route around the front line when practical. +* **[Flight Planner]** Fixed error when planning BAI at SAMs with dead subgroups. +* **[Flight Planner]** Mig-19 was not allowed for CAS roles fixed +* **[Flight Planner]** Increased size of navigation planning area to avoid plannign failures with distant waypoints. +* **[Flight Planner]** Fixed UI refresh when unchecking the "default loadout" box in the loadout editor. +* **[Objective names]** Fixed typos in objective name : ARMADILLLO -> ARMADILLO (by SnappyComebacks) +* **[Payloads]** F-86 Sabre was missing a custom payload +* **[Payloads]** Added GAR-8 period restrictions (by Mustang-25) +* **[Campaign]** Date now progresses. +* **[Campaign]** Added game over message when a coalition runs out of functioning airbases. +* **[Mission Generation]** Fixed "invalid face handle" error in kneeboard generation that occurred on some machines. + +## Regressions + +* **[Mod Support]** Stopped support for 2.5.5 Rafale Mode, and removed factions that were using it +* **[Mod Support]** Su-57 mod support might be out of date + # 2.4.3 ## Features/Improvements @@ -8,7 +43,6 @@ * **[Mods]** Updated C-130J mod data to version 6.4 * **[Mods]** Updated F-22A mod to latest version -* **[Payload]** Mirage-2000C : Added Eclair counter measures pod to all default loadouts # 2.4.2 diff --git a/game/data/aaa_db.py b/game/data/aaa_db.py index d7e7d101..fba276a3 100644 --- a/game/data/aaa_db.py +++ b/game/data/aaa_db.py @@ -2,20 +2,21 @@ from dcs.vehicles import AirDefence AAA_UNITS = [ AirDefence.SPAAA_Gepard, - AirDefence.SPAAA_ZSU_23_4_Shilka, - AirDefence.AAA_Vulcan_M163, - AirDefence.AAA_ZU_23_Closed, + AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish, + AirDefence.SPAAA_Vulcan_M163, + AirDefence.AAA_ZU_23_Closed_Emplacement, AirDefence.AAA_ZU_23_Emplacement, - AirDefence.AAA_ZU_23_on_Ural_375, - AirDefence.AAA_ZU_23_Insurgent_Closed, - AirDefence.AAA_ZU_23_Insurgent_on_Ural_375, + AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375, + AirDefence.AAA_ZU_23_Closed_Emplacement_Insurgent, + AirDefence.SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375, AirDefence.AAA_ZU_23_Insurgent, AirDefence.AAA_8_8cm_Flak_18, - AirDefence.AAA_Flak_38, + AirDefence.AAA_Flak_38_20mm, AirDefence.AAA_8_8cm_Flak_36, AirDefence.AAA_8_8cm_Flak_37, - AirDefence.AAA_Flak_Vierling_38, - AirDefence.AAA_Kdo_G_40, + AirDefence.AAA_Flak_Vierling_38_Quad_20mm, + AirDefence.AAA_SP_Kdo_G_40, AirDefence.AAA_8_8cm_Flak_41, - AirDefence.AAA_Bofors_40mm, + AirDefence.AAA_40mm_Bofors, + AirDefence.AAA_S_60_57mm, ] diff --git a/game/data/radar_db.py b/game/data/radar_db.py index 10e38f42..0dcf9cc2 100644 --- a/game/data/radar_db.py +++ b/game/data/radar_db.py @@ -1,6 +1,6 @@ from dcs.ships import ( - CGN_1144_2_Pyotr_Velikiy, - CG_1164_Moskva, + Battlecruiser_1144_2_Pyotr_Velikiy, + Cruiser_1164_Moskva, CVN_70_Carl_Vinson, CVN_71_Theodore_Roosevelt, CVN_72_Abraham_Lincoln, @@ -8,63 +8,63 @@ from dcs.ships import ( CVN_74_John_C__Stennis, CV_1143_5_Admiral_Kuznetsov, CV_1143_5_Admiral_Kuznetsov_2017, - FFG_11540_Neustrashimy, - FFL_1124_4_Grisha, - FF_1135M_Rezky, - FSG_1241_1MP_Molniya, + Frigate_11540_Neustrashimy, + Corvette_1124_4_Grisha, + Frigate_1135M_Rezky, + Corvette_1241_1_Molniya, LHA_1_Tarawa, - Oliver_Hazzard_Perry_class, - Ticonderoga_class, + FFG_Oliver_Hazzard_Perry, + CG_Ticonderoga, Type_052B_Destroyer, Type_052C_Destroyer, Type_054A_Frigate, - USS_Arleigh_Burke_IIa, + DDG_Arleigh_Burke_IIa, ) from dcs.vehicles import AirDefence UNITS_WITH_RADAR = [ # Radars - AirDefence.SAM_SA_15_Tor_9A331, - AirDefence.SAM_SA_11_Buk_CC_9S470M1, - AirDefence.SAM_Patriot_AMG_AN_MRC_137, - AirDefence.SAM_Patriot_ECS_AN_MSQ_104, + AirDefence.SAM_SA_15_Tor_Gauntlet, + AirDefence.SAM_SA_11_Buk_Gadfly_C2, + AirDefence.SAM_Patriot_CR__AMG_AN_MRC_137, + AirDefence.SAM_Patriot_ECS, AirDefence.SPAAA_Gepard, - AirDefence.AAA_Vulcan_M163, - AirDefence.SPAAA_ZSU_23_4_Shilka, + AirDefence.SPAAA_Vulcan_M163, + AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish, AirDefence.EWR_1L13, - AirDefence.SAM_SA_6_Kub_STR_9S91, - AirDefence.SAM_SA_10_S_300PS_TR_30N6, - AirDefence.SAM_SA_10_S_300PS_SR_5N66M, + AirDefence.SAM_SA_6_Kub_Long_Track_STR, + AirDefence.SAM_SA_10_S_300_Grumble_Flap_Lid_TR, + AirDefence.SAM_SA_10_S_300_Grumble_Clam_Shell_SR, AirDefence.EWR_55G6, - AirDefence.SAM_SA_10_S_300PS_SR_64H6E, - AirDefence.SAM_SA_11_Buk_SR_9S18M1, - AirDefence.CP_9S80M1_Sborka, - AirDefence.SAM_Hawk_TR_AN_MPQ_46, - AirDefence.SAM_Hawk_SR_AN_MPQ_50, - AirDefence.SAM_Patriot_STR_AN_MPQ_53, + AirDefence.SAM_SA_10_S_300_Grumble_Big_Bird_SR, + AirDefence.SAM_SA_11_Buk_Gadfly_Snow_Drift_SR, + AirDefence.MCC_SR_Sborka_Dog_Ear_SR, + AirDefence.SAM_Hawk_TR__AN_MPQ_46, + AirDefence.SAM_Hawk_SR__AN_MPQ_50, + AirDefence.SAM_Patriot_STR, AirDefence.SAM_Hawk_CWAR_AN_MPQ_55, - AirDefence.SAM_SR_P_19, + AirDefence.SAM_P19_Flat_Face_SR__SA_2_3, AirDefence.SAM_Roland_EWR, - AirDefence.SAM_SA_3_S_125_TR_SNR, - AirDefence.SAM_SA_2_TR_SNR_75_Fan_Song, + AirDefence.SAM_SA_3_S_125_Low_Blow_TR, + AirDefence.SAM_SA_2_S_75_Fan_Song_TR, AirDefence.HQ_7_Self_Propelled_STR, # Ships CVN_70_Carl_Vinson, - Oliver_Hazzard_Perry_class, - Ticonderoga_class, - FFL_1124_4_Grisha, + FFG_Oliver_Hazzard_Perry, + CG_Ticonderoga, + Corvette_1124_4_Grisha, CV_1143_5_Admiral_Kuznetsov, - FSG_1241_1MP_Molniya, - CG_1164_Moskva, - FFG_11540_Neustrashimy, - CGN_1144_2_Pyotr_Velikiy, - FF_1135M_Rezky, + Corvette_1241_1_Molniya, + Cruiser_1164_Moskva, + Frigate_11540_Neustrashimy, + Battlecruiser_1144_2_Pyotr_Velikiy, + Frigate_1135M_Rezky, CV_1143_5_Admiral_Kuznetsov_2017, CVN_74_John_C__Stennis, CVN_71_Theodore_Roosevelt, CVN_72_Abraham_Lincoln, CVN_73_George_Washington, - USS_Arleigh_Burke_IIa, + DDG_Arleigh_Burke_IIa, LHA_1_Tarawa, Type_052B_Destroyer, Type_054A_Frigate, diff --git a/game/data/weapons.py b/game/data/weapons.py index b42112fa..5fe60a3c 100644 --- a/game/data/weapons.py +++ b/game/data/weapons.py @@ -119,83 +119,151 @@ _WEAPON_FALLBACKS = [ # ADM-141 TALD (Weapons.ADM_141A, None), (Weapons.ADM_141A_, None), - (Weapons.ADM_141A__, None), - (Weapons.ADM_141B, None), + (Weapons.ADM_141A_TALD, None), + (Weapons.ADM_141B_TALD, None), # AGM-114K Hellfire (Weapons.AGM114x2_OH_58, Weapons.M260_HYDRA), # assuming OH-58 and not MQ-9 (Weapons.AGM_114K, None), # Only for RQ-1 - (Weapons.AGM_114K___4, Weapons.LAU_61___19_2_75__rockets_MK151_HE), + (Weapons.AGM_114K___4, Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE), # AGM-119 Penguin - (Weapons.AGM_119B_Penguin, Weapons.Mk_82), + (Weapons.AGM_119B_Penguin_ASM, Weapons.Mk_82), # AGM-122 Sidearm - (Weapons.AGM_122, None), # No known aircraft carries this (Weapons.AGM_122_Sidearm, Weapons.GBU_12), # outer pylons harrier - (Weapons.AGM_122_Sidearm_, Weapons.LAU_117_AGM_65E), # internal pylons harrier - # AGM-154 JSOW - (Weapons.AGM_154A, Weapons.GBU_12), - (Weapons.BRU_55___2_x_AGM_154A, Weapons.BRU_33___2_x_GBU_12), - (Weapons.BRU_57___2_x_AGM_154A, None), # doesn't exist on any aircraft yet - (Weapons.AGM_154B, Weapons.CBU_105), - (Weapons.AGM_154C, Weapons.GBU_12), - (Weapons.AGM_154C_4, Weapons.GBU_31_8), - (Weapons.BRU_55___2_x_AGM_154C, Weapons.BRU_33___2_x_GBU_12), - # AGM-45 Shrike - (Weapons.AGM_45A, None), - (Weapons.AGM_45B, Weapons.AGM_45A), - (Weapons.AGM_45B_, Weapons.AGM_45A), - # AGM-62 Walleye - (Weapons.AGM_62, Weapons.Mk_84), - # AGM-65 Maverick - (Weapons.AGM_65D, None), # doesn't exist - (Weapons.AGM_65E, None), # doesn't exist - (Weapons.AGM_65K, None), # doesn't exist - (Weapons.LAU_117_AGM_65A, None), # doesn't exist - (Weapons.LAU_117_AGM_65B, None), # doesn't exist ( - Weapons.LAU_117_AGM_65D, - Weapons.AGM_62, + Weapons.AGM_122_Sidearm_, + Weapons.LAU_117_with_AGM_65E___Maverick_E__Laser_ASM___Lg_Whd_, + ), # internal pylons harrier + # AGM-154 JSOW + (Weapons.AGM_154A___JSOW_CEB__CBU_type_, Weapons.GBU_12), + ( + Weapons.BRU_55_with_2_x_AGM_154A___JSOW_CEB__CBU_type_, + Weapons.BRU_33_with_2_x_GBU_12___500lb_Laser_Guided_Bomb, + ), + ( + Weapons.BRU_57_with_2_x_AGM_154A___JSOW_CEB__CBU_type_, + None, + ), # doesn't exist on any aircraft yet + (Weapons.AGM_154B___JSOW_Anti_Armour, Weapons.CBU_105___10_x_CEM__CBU_with_WCMD), + (Weapons.AGM_154C___JSOW_Unitary_BROACH, Weapons.GBU_12), + ( + Weapons.BRU_55_with_2_x_AGM_154C___JSOW_Unitary_BROACH, + Weapons.BRU_33_with_2_x_GBU_12___500lb_Laser_Guided_Bomb, + ), + # AGM-45 Shrike + (Weapons.AGM_45A_Shrike_ARM, None), + (Weapons.LAU_118a_with_AGM_45B_Shrike_ARM__Imp_, Weapons.AGM_45A_Shrike_ARM), + (Weapons.AGM_45B_Shrike_ARM__Imp_, Weapons.AGM_45A_Shrike_ARM), + # AGM-62 Walleye + (Weapons.AGM_62_Walleye_II___Guided_Weapon_Mk_5__TV_Guided_, Weapons.Mk_84), + # AGM-65 Maverick + ( + Weapons.LAU_117_with_AGM_65D___Maverick_D__IIR_ASM_, + Weapons.AGM_62_Walleye_II___Guided_Weapon_Mk_5__TV_Guided_, ), # Walleye is the predecessor to the maverick - (Weapons.LAU_117_AGM_65E, None), - (Weapons.LAU_117_AGM_65F, Weapons.LAU_117_AGM_65D), - (Weapons.LAU_117_AGM_65G, Weapons.LAU_117_AGM_65D), - (Weapons.LAU_117_AGM_65H, Weapons.LAU_117_AGM_65D), - (Weapons.LAU_117_AGM_65K, Weapons.LAU_117_AGM_65D), + (Weapons.LAU_117_with_AGM_65E___Maverick_E__Laser_ASM___Lg_Whd_, None), + (Weapons.LAU_117_AGM_65F, Weapons.LAU_117_with_AGM_65D___Maverick_D__IIR_ASM_), + (Weapons.LAU_117_AGM_65G, Weapons.LAU_117_with_AGM_65D___Maverick_D__IIR_ASM_), + (Weapons.LAU_117_AGM_65H, Weapons.LAU_117_with_AGM_65D___Maverick_D__IIR_ASM_), + ( + Weapons.LAU_117_with_AGM_65K___Maverick_K__CCD_Imp_ASM_, + Weapons.LAU_117_with_AGM_65D___Maverick_D__IIR_ASM_, + ), (Weapons.LAU_117_AGM_65L, None), - (Weapons.LAU_88_AGM_65D_2, None), - (Weapons.LAU_88_AGM_65D_2_, None), - (Weapons.LAU_88_AGM_65D_3, None), + (Weapons.LAU_88_with_2_x_AGM_65D___Maverick_D__IIR_ASM_, None), + (Weapons.LAU_88_with_2_x_AGM_65D___Maverick_D__IIR_ASM__, None), + (Weapons.LAU_88_with_3_x_AGM_65D___Maverick_D__IIR_ASM_, None), (Weapons.LAU_88_AGM_65D_ONE, None), - (Weapons.LAU_88_AGM_65E_2, Weapons.LAU_88_AGM_65D_2), - (Weapons.LAU_88_AGM_65E_2_, Weapons.LAU_88_AGM_65D_2_), - (Weapons.LAU_88_AGM_65E_3, Weapons.LAU_88_AGM_65D_3), - (Weapons.LAU_88_AGM_65H, Weapons.LAU_88_AGM_65D_2), - (Weapons.LAU_88_AGM_65H_2_L, Weapons.LAU_88_AGM_65D_2_), - (Weapons.LAU_88_AGM_65H_2_R, Weapons.LAU_88_AGM_65D_2_), - (Weapons.LAU_88_AGM_65H_3, Weapons.LAU_88_AGM_65D_3), - (Weapons.LAU_88_AGM_65K_2, Weapons.LAU_88_AGM_65D_2), - (Weapons.LAU_88_AGM_65K_2_, Weapons.LAU_88_AGM_65D_2_), - (Weapons.LAU_88_AGM_65K_3, Weapons.LAU_88_AGM_65D_3), + ( + Weapons.LAU_88_with_2_x_AGM_65E___Maverick_E__Laser_ASM___Lg_Whd_, + Weapons.LAU_88_with_2_x_AGM_65D___Maverick_D__IIR_ASM_, + ), + ( + Weapons.LAU_88_with_2_x_AGM_65E___Maverick_E__Laser_ASM___Lg_Whd__, + Weapons.LAU_88_with_2_x_AGM_65D___Maverick_D__IIR_ASM__, + ), + ( + Weapons.LAU_88_with_3_x_AGM_65E___Maverick_E__Laser_ASM___Lg_Whd_, + Weapons.LAU_88_with_3_x_AGM_65D___Maverick_D__IIR_ASM_, + ), + (Weapons.LAU_88_AGM_65H, Weapons.LAU_88_with_2_x_AGM_65D___Maverick_D__IIR_ASM_), + ( + Weapons.LAU_88_AGM_65H_2_L, + Weapons.LAU_88_with_2_x_AGM_65D___Maverick_D__IIR_ASM__, + ), + ( + Weapons.LAU_88_AGM_65H_2_R, + Weapons.LAU_88_with_2_x_AGM_65D___Maverick_D__IIR_ASM__, + ), + (Weapons.LAU_88_AGM_65H_3, Weapons.LAU_88_with_3_x_AGM_65D___Maverick_D__IIR_ASM_), + ( + Weapons.LAU_88_with_2_x_AGM_65K___Maverick_K__CCD_Imp_ASM_, + Weapons.LAU_88_with_2_x_AGM_65D___Maverick_D__IIR_ASM_, + ), + ( + Weapons.LAU_88_with_2_x_AGM_65K___Maverick_K__CCD_Imp_ASM__, + Weapons.LAU_88_with_2_x_AGM_65D___Maverick_D__IIR_ASM__, + ), + ( + Weapons.LAU_88_with_3_x_AGM_65K___Maverick_K__CCD_Imp_ASM_, + Weapons.LAU_88_with_3_x_AGM_65D___Maverick_D__IIR_ASM_, + ), # AGM-84 Harpoon - (Weapons.AGM_84, None), # doesn't exist - (Weapons.AGM_84A, Weapons.Mk_82), - (Weapons.AGM_84A_8, Weapons._27_Mk_82), - (Weapons.AGM_84D, Weapons.AGM_62), - (Weapons.AGM_84E, Weapons.LAU_117_AGM_65F), - (Weapons.AGM_84H, Weapons.AGM_84E), + (Weapons.AGM_84A_Harpoon_ASM, Weapons.Mk_82), + (Weapons._8_x_AGM_84A_Harpoon_ASM, Weapons._27_x_Mk_82___500lb_GP_Bombs_LD), + ( + Weapons.AGM_84D_Harpoon_AShM, + Weapons.AGM_62_Walleye_II___Guided_Weapon_Mk_5__TV_Guided_, + ), + ( + Weapons.AGM_84E_Harpoon_SLAM__Stand_Off_Land_Attack_Missile_, + Weapons.LAU_117_AGM_65F, + ), + ( + Weapons.AGM_84H_SLAM_ER__Expanded_Response_, + Weapons.AGM_84E_Harpoon_SLAM__Stand_Off_Land_Attack_Missile_, + ), # AGM-86 ALCM - (Weapons.AGM_86C, Weapons._27_Mk_82), - (Weapons.AGM_86C_20, Weapons._27_Mk_82), - (Weapons.AGM_86C_8, Weapons._27_Mk_82), - (Weapons.MER_6_AGM_86C, Weapons.MER_12_Mk_82), + (Weapons.AGM_86C_ALCM, Weapons._27_x_Mk_82___500lb_GP_Bombs_LD), + (Weapons._8_x_AGM_86C_ALCM, Weapons._27_x_Mk_82___500lb_GP_Bombs_LD), + ( + Weapons._6_x_AGM_86C_ALCM_on_MER, + Weapons.MER12_with_12_x_Mk_82___500lb_GP_Bombs_LD, + ), # AGM-88 HARM - (Weapons.AGM_88C, Weapons.AGM_65D), - (Weapons.AGM_88C_, Weapons.AGM_65D), + ( + Weapons.AGM_88C_HARM___High_Speed_Anti_Radiation_Missile, + Weapons.LAU_88_AGM_65D_ONE, + ), + ( + Weapons.AGM_88C_HARM___High_Speed_Anti_Radiation_Missile_, + Weapons.LAU_88_AGM_65D_ONE, + ), # AIM-120 AMRAAM - (Weapons.AIM_120B, Weapons.AIM_7MH), - (Weapons.LAU_115___AIM_120B, Weapons.LAU_115C_AIM_7MH), - (Weapons.LAU_115_2_LAU_127_AIM_120B, Weapons.LAU_115C_AIM_7MH), - (Weapons.AIM_120C, Weapons.AIM_120B), - (Weapons.LAU_115___AIM_120C, Weapons.LAU_115___AIM_120B), + (Weapons.AIM_120B_AMRAAM___Active_Rdr_AAM, Weapons.AIM_7MH), + ( + Weapons.LAU_115_with_1_x_LAU_127_AIM_120B_AMRAAM___Active_Rdr_AAM, + Weapons.LAU_115C_with_AIM_7MH_Sparrow_Semi_Active_Radar, + ), + ( + Weapons.LAU_115_with_1_x_LAU_127_AIM_120B_AMRAAM___Active_Rdr_AAM_, + Weapons.LAU_115C_with_AIM_7MH_Sparrow_Semi_Active_Radar, + ), + ( + Weapons.LAU_115_2_LAU_127_AIM_120B, + Weapons.LAU_115C_with_AIM_7MH_Sparrow_Semi_Active_Radar, + ), + ( + Weapons.AIM_120C_5_AMRAAM___Active_Rdr_AAM, + Weapons.AIM_120B_AMRAAM___Active_Rdr_AAM, + ), + ( + Weapons.LAU_115_with_1_x_LAU_127_AIM_120C_5_AMRAAM___Active_Rdr_AAM, + Weapons.LAU_115_with_1_x_LAU_127_AIM_120B_AMRAAM___Active_Rdr_AAM, + ), + ( + Weapons.LAU_115_with_1_x_LAU_127_AIM_120C_5_AMRAAM___Active_Rdr_AAM_, + Weapons.LAU_115_with_1_x_LAU_127_AIM_120B_AMRAAM___Active_Rdr_AAM_, + ), (Weapons.LAU_115_2_LAU_127_AIM_120C, Weapons.LAU_115_2_LAU_127_AIM_120B), # AIM-54 Phoenix (Weapons.AIM_54A_Mk47, None), @@ -208,22 +276,27 @@ _WEAPON_FALLBACKS = [ (Weapons.AIM_54C_Mk47_, Weapons.AIM_54A_Mk60_), (Weapons.AIM_54C_Mk47__, Weapons.AIM_54A_Mk60__), # AIM-7 Sparrow - (Weapons.AIM_7E, None), - (Weapons.AIM_7F, Weapons.AIM_7E), + (Weapons.AIM_7E_Sparrow_Semi_Active_Radar, None), + ( + Weapons.AIM_7F_Sparrow_Semi_Active_Radar, + Weapons.AIM_7E_Sparrow_Semi_Active_Radar, + ), (Weapons.AIM_7F_, None), - (Weapons.AIM_7F__, None), - (Weapons.AIM_7M, Weapons.AIM_7F), + (Weapons.AIM_7M, Weapons.AIM_7F_Sparrow_Semi_Active_Radar), (Weapons.AIM_7M_, Weapons.AIM_7F_), - (Weapons.AIM_7M__, Weapons.AIM_7F__), (Weapons.AIM_7MH, Weapons.AIM_7M), (Weapons.AIM_7MH_, Weapons.AIM_7M_), - (Weapons.AIM_7MH__, Weapons.AIM_7M__), - (Weapons.LAU_115C_AIM_7E, None), - (Weapons.LAU_115C_AIM_7F, Weapons.LAU_115C_AIM_7E), - (Weapons.LAU_115___AIM_7M, Weapons.LAU_115C_AIM_7F), - (Weapons.LAU_115C_AIM_7MH, Weapons.LAU_115___AIM_7M), + (Weapons.LAU_115C_with_AIM_7F_Sparrow_Semi_Active_Radar, None), + ( + Weapons.LAU_115_with_AIM_7M_Sparrow_Semi_Active_Radar, + Weapons.LAU_115C_with_AIM_7F_Sparrow_Semi_Active_Radar, + ), + ( + Weapons.LAU_115C_with_AIM_7MH_Sparrow_Semi_Active_Radar, + Weapons.LAU_115_with_AIM_7M_Sparrow_Semi_Active_Radar, + ), + (Weapons.LAU_115C_with_AIM_7E_Sparrow_Semi_Active_Radar, None), # AIM-9 Sidewinder - (Weapons.AIM_9L_Sidewinder_IR_AAM, None), (Weapons.AIM_9M_Sidewinder_IR_AAM, Weapons.AIM_9P5_Sidewinder_IR_AAM), (Weapons.AIM_9P5_Sidewinder_IR_AAM, Weapons.AIM_9P_Sidewinder_IR_AAM), (Weapons.AIM_9P_Sidewinder_IR_AAM, Weapons.AIM_9L_Sidewinder_IR_AAM), @@ -233,11 +306,11 @@ _WEAPON_FALLBACKS = [ (Weapons.LAU_105_1_AIM_9M_L, Weapons.LAU_105_1_AIM_9L_L), (Weapons.LAU_105_1_AIM_9M_R, Weapons.LAU_105_1_AIM_9L_R), (Weapons.LAU_105_2_AIM_9L, None), - (Weapons.LAU_105_2_AIM_9P5, Weapons.LAU_105___2_AIM_9P_Sidewinder_IR_AAM), - (Weapons.LAU_105___2_AIM_9M_Sidewinder_IR_AAM, Weapons.LAU_105_2_AIM_9L), + (Weapons.LAU_105_2_AIM_9P5, Weapons.LAU_105_with_2_x_AIM_9P_Sidewinder_IR_AAM), + (Weapons.LAU_105_with_2_x_AIM_9M_Sidewinder_IR_AAM, Weapons.LAU_105_2_AIM_9L), ( - Weapons.LAU_105___2_AIM_9P_Sidewinder_IR_AAM, - Weapons.LAU_105___2_AIM_9M_Sidewinder_IR_AAM, + Weapons.LAU_105_with_2_x_AIM_9P_Sidewinder_IR_AAM, + Weapons.LAU_105_with_2_x_AIM_9M_Sidewinder_IR_AAM, ), (Weapons.LAU_115_2_LAU_127_AIM_9L, None), (Weapons.LAU_115_2_LAU_127_AIM_9M, Weapons.LAU_115_2_LAU_127_AIM_9L), @@ -252,178 +325,301 @@ _WEAPON_FALLBACKS = [ (Weapons.LAU_138_AIM_9M, Weapons.LAU_138_AIM_9L), (Weapons.LAU_7_AIM_9L, None), (Weapons.LAU_7_AIM_9M, Weapons.LAU_7_AIM_9L), - (Weapons.LAU_7_AIM_9M_Sidewinder_IR_AAM, Weapons.LAU_7_AIM_9P5_Sidewinder_IR_AAM), - (Weapons.LAU_7_AIM_9P5_Sidewinder_IR_AAM, Weapons.LAU_7_AIM_9P_Sidewinder_IR_AAM), - (Weapons.LAU_7_AIM_9P_Sidewinder_IR_AAM, Weapons.LAU_7_AIM_9L), - (Weapons.LAU_7_AIM_9X_Sidewinder_IR_AAM, Weapons.LAU_7_AIM_9M_Sidewinder_IR_AAM), - (Weapons.LAU_7___2_AIM_9L_Sidewinder_IR_AAM, None), ( - Weapons.LAU_7___2_AIM_9M_Sidewinder_IR_AAM, - Weapons.LAU_7___2_AIM_9P5_Sidewinder_IR_AAM, + Weapons.LAU_7_with_AIM_9M_Sidewinder_IR_AAM, + Weapons.LAU_7_with_AIM_9P5_Sidewinder_IR_AAM, ), ( - Weapons.LAU_7___2_AIM_9P5_Sidewinder_IR_AAM, - Weapons.LAU_7___2_AIM_9P_Sidewinder_IR_AAM, + Weapons.LAU_7_with_AIM_9P5_Sidewinder_IR_AAM, + Weapons.LAU_7_with_AIM_9P_Sidewinder_IR_AAM, + ), + (Weapons.LAU_7_with_AIM_9P_Sidewinder_IR_AAM, Weapons.LAU_7_AIM_9L), + ( + Weapons.LAU_7_with_AIM_9X_Sidewinder_IR_AAM, + Weapons.LAU_7_with_AIM_9M_Sidewinder_IR_AAM, ), ( - Weapons.LAU_7___2_AIM_9P_Sidewinder_IR_AAM, - Weapons.LAU_7___2_AIM_9L_Sidewinder_IR_AAM, + Weapons.LAU_7_with_2_x_AIM_9M_Sidewinder_IR_AAM, + Weapons.LAU_7_with_2_x_AIM_9P5_Sidewinder_IR_AAM, + ), + ( + Weapons.LAU_7_with_2_x_AIM_9P5_Sidewinder_IR_AAM, + Weapons.LAU_7_with_2_x_AIM_9P_Sidewinder_IR_AAM, + ), + ( + Weapons.LAU_7_with_2_x_AIM_9P_Sidewinder_IR_AAM, + Weapons.LAU_7_with_2_x_AIM_9L_Sidewinder_IR_AAM, ), # ALQ ECM Pods - (Weapons.ALQ_131, None), - (Weapons.ALQ_184, Weapons.ALQ_131), + (Weapons.ALQ_131___ECM_Pod, None), + (Weapons.ALQ_184, Weapons.ALQ_131___ECM_Pod), (Weapons.AN_ALQ_164_DECM_Pod, None), # TGP Pods - (Weapons.AN_AAQ_28_LITENING_, None), - (Weapons.AN_AAQ_28_LITENING, Weapons.Lantirn_F_16), - (Weapons.AN_AAS_38_FLIR, None), - (Weapons.AN_ASQ_173_LST_SCAM, None), + (Weapons.AN_AAQ_28_LITENING___Targeting_Pod_, None), + (Weapons.AN_AAQ_28_LITENING___Targeting_Pod, Weapons.Lantirn_F_16), + (Weapons.AN_ASQ_228_ATFLIR___Targeting_Pod, None), + (Weapons.AN_ASQ_173_Laser_Spot_Tracker_Strike_CAMera__LST_SCAM_, None), (Weapons.AWW_13_DATALINK_POD, None), (Weapons.LANTIRN_Targeting_Pod, None), (Weapons.Lantirn_F_16, None), (Weapons.Lantirn_Target_Pod, None), (Weapons.Pavetack_F_111, None), # BLU-107 - (Weapons.BLU_107, None), - (Weapons.MER_6_BLU_107, Weapons.MER_6_Mk_82), + (Weapons.BLU_107___440lb_Anti_Runway_Penetrator_Bomb, None), + ( + Weapons.MER6_with_6_x_BLU_107___440lb_Anti_Runway_Penetrator_Bombs, + Weapons.MER6_with_6_x_Mk_82___500lb_GP_Bombs_LD, + ), # GBU-10 LGB (Weapons.DIS_GBU_10, Weapons.Mk_84), (Weapons.GBU_10, Weapons.Mk_84), - (Weapons.GBU_10_, Weapons.Mk_84), - (Weapons.GBU_10_2, Weapons.Mk_84), + (Weapons.BRU_42_with_2_x_GBU_10___2000lb_Laser_Guided_Bombs, Weapons.Mk_84), + (Weapons.DIS_GBU_10, Weapons.Mk_84), # GBU-12 LGB (Weapons.AUF2_GBU_12_x_2, None), - (Weapons.BRU_33___2_x_GBU_12, Weapons.BRU_33___2_x_Mk_82_), + ( + Weapons.BRU_33_with_2_x_GBU_12___500lb_Laser_Guided_Bomb, + Weapons.BRU_33_with_2_x_Mk_82___500lb_GP_Bomb_LD, + ), (Weapons.BRU_42_3_GBU_12, Weapons._3_Mk_82), (Weapons.DIS_GBU_12, Weapons.Mk_82), - (Weapons.DIS_GBU_12_DUAL, Weapons.BRU_33___2_x_Mk_82_), - (Weapons.DIS_GBU_12_DUAL_L, Weapons.BRU_33___2_x_Mk_82_), - (Weapons.DIS_GBU_12_DUAL_R, Weapons.BRU_33___2_x_Mk_82_), + ( + Weapons.DIS_GBU_12_DUAL_GDJ_II19_L, + Weapons.BRU_33_with_2_x_Mk_82___500lb_GP_Bomb_LD, + ), + ( + Weapons.DIS_GBU_12_DUAL_GDJ_II19_R, + Weapons.BRU_33_with_2_x_Mk_82___500lb_GP_Bomb_LD, + ), (Weapons.GBU_12, Weapons.Mk_82), - (Weapons.GBU_12_, Weapons.Mk_82_), - (Weapons.TER_9A___2_x_GBU_12, Weapons.TER_9A___2_x_Mk_82), - (Weapons.TER_9A___2_x_GBU_12_, Weapons.TER_9A___2_x_Mk_82_), - (Weapons._2xGBU_12, Weapons.Mk_82), - (Weapons._2xGBU_12_, Weapons.Mk_82_), + ( + Weapons.TER_9A_with_2_x_GBU_12___500lb_Laser_Guided_Bomb, + Weapons.TER_9A_with_2_x_Mk_82___500lb_GP_Bomb_LD, + ), + ( + Weapons.TER_9A_with_2_x_GBU_12___500lb_Laser_Guided_Bomb_, + Weapons.TER_9A_with_2_x_Mk_82___500lb_GP_Bomb_LD_, + ), (Weapons._2_GBU_12, Weapons._2_Mk_82), (Weapons._2_GBU_12_, Weapons._2_Mk_82_), - (Weapons._3_GBU_12, Weapons._3_Mk_82_), - # GBU-15 LGB - (Weapons.GBU_15, Weapons.Mk_84), # GBU-16 LGB - (Weapons.BRU_33___2_x_GBU_16, None), + (Weapons.BRU_33_with_2_x_GBU_16___1000lb_Laser_Guided_Bomb, None), (Weapons.DIS_GBU_16, Weapons.Mk_83), (Weapons.GBU_16, Weapons.Mk_83), - (Weapons.GBU_16_, Weapons.Mk_83_), + (Weapons.BRU_42_with_3_x_GBU_16___1000lb_Laser_Guided_Bombs, None), # GBU-24 LGB (Weapons.GBU_24, Weapons.GBU_10), - (Weapons.GBU_24_, Weapons.GBU_10_), - (Weapons.GBU_24__, Weapons.GBU_10_), + ( + Weapons.GBU_24_Paveway_III___2000lb_Laser_Guided_Bomb, + Weapons.GBU_16___1000lb_Laser_Guided_Bomb, + ), + ( + Weapons.GBU_24_Paveway_III___2000lb_Laser_Guided_Bomb_, + Weapons.GBU_10___2000lb_Laser_Guided_Bomb, + ), # GBU-27 LGB - (Weapons.GBU_24, Weapons.GBU_10), - (Weapons.GBU_24_, Weapons.GBU_10_), - (Weapons.GBU_24__, Weapons.GBU_10_), + ( + Weapons.GBU_27___2000lb_Laser_Guided_Penetrator_Bomb, + Weapons.GBU_16___1000lb_Laser_Guided_Bomb, + ), # GBU-28 LGB - (Weapons.GBU_28, Weapons.GBU_15), + (Weapons.GBU_28___5000lb_Laser_Guided_Penetrator_Bomb, None), # GBU-31 JDAM (Weapons.GBU_31V3B_8, Weapons.B_1B_Mk_84_8), (Weapons.GBU_31_8, Weapons.B_1B_Mk_84_8), - (Weapons.GBU_31_V_1_B, Weapons.GBU_24_), - (Weapons.GBU_31_V_2_B, Weapons.GBU_24_), - (Weapons.GBU_31_V_3_B, Weapons.GBU_24_), - (Weapons.GBU_31_V_4_B, Weapons.GBU_24_), + ( + Weapons.GBU_31_V_1_B___JDAM__2000lb_GPS_Guided_Bomb, + Weapons.GBU_24_Paveway_III___2000lb_Laser_Guided_Bomb, + ), + ( + Weapons.GBU_31_V_2_B___JDAM__2000lb_GPS_Guided_Bomb, + Weapons.GBU_24_Paveway_III___2000lb_Laser_Guided_Bomb, + ), + ( + Weapons.GBU_31_V_3_B___JDAM__2000lb_GPS_Guided_Penetrator_Bomb, + Weapons.GBU_24_Paveway_III___2000lb_Laser_Guided_Bomb, + ), + ( + Weapons.GBU_31_V_4_B___JDAM__2000lb_GPS_Guided_Penetrator_Bomb, + Weapons.GBU_24_Paveway_III___2000lb_Laser_Guided_Bomb, + ), # GBU-32 JDAM - (Weapons.GBU_32_V_2_B, Weapons.GBU_16), + (Weapons.GBU_32_V_2_B___JDAM__1000lb_GPS_Guided_Bomb, Weapons.GBU_16), # GBU-32 JDAM - (Weapons.BRU_55___2_x_GBU_38, Weapons.BRU_33___2_x_Mk_82_), - (Weapons.BRU_57___2_x_GBU_38, None), # Doesn't exist - (Weapons.GBU_38, Weapons.Mk_82), + ( + Weapons.BRU_55_with_2_x_GBU_38___JDAM__500lb_GPS_Guided_Bomb, + Weapons.BRU_33_with_2_x_Mk_82___500lb_GP_Bomb_LD, + ), + ( + Weapons.BRU_57_with_2_x_GBU_38___JDAM__500lb_GPS_Guided_Bomb, + None, + ), # Doesn't exist + (Weapons.GBU_38___JDAM__500lb_GPS_Guided_Bomb, Weapons.Mk_82), (Weapons.GBU_38_16, Weapons.MK_82_28), (Weapons._2_GBU_38, Weapons._2_Mk_82), (Weapons._2_GBU_38_, Weapons._2_Mk_82_), - (Weapons._3_GBU_38, Weapons._3_Mk_82_), + (Weapons._3_GBU_38, Weapons._3_Mk_82), # GBU-54 LJDAM - (Weapons.GBU_54_V_1_B, Weapons.GBU_38), + ( + Weapons.GBU_54B___LJDAM__500lb_Laser__GPS_Guided_Bomb_LD, + Weapons.GBU_38___JDAM__500lb_GPS_Guided_Bomb, + ), (Weapons._2_GBU_54_V_1_B, Weapons._2_GBU_38), (Weapons._2_GBU_54_V_1_B_, Weapons._2_GBU_38_), (Weapons._3_GBU_54_V_1_B, Weapons._3_GBU_38), # CBU-52 - (Weapons.CBU_52B, None), + (Weapons.CBU_52B___220_x_HE_Frag_bomblets, None), # CBU-87 CEM - (Weapons.CBU_87, Weapons.Mk_82), - (Weapons.TER_9A___2_x_CBU_87, Weapons.TER_9A___2_x_Mk_82), - (Weapons.TER_9A___2_x_CBU_87_, Weapons.TER_9A___2_x_Mk_82_), - (Weapons.TER_9A___3_x_CBU_87, Weapons.TER_9A___3_x_Mk_82), + (Weapons.CBU_87___202_x_CEM_Cluster_Bomb, Weapons.Mk_82), + ( + Weapons.TER_9A_with_2_x_CBU_87___202_x_Anti_Armor_Skeet_SFW_Cluster_Bomb, + Weapons.TER_9A_with_2_x_Mk_82___500lb_GP_Bomb_LD, + ), + ( + Weapons.TER_9A_with_2_x_CBU_87___202_x_Anti_Armor_Skeet_SFW_Cluster_Bomb_, + Weapons.TER_9A_with_2_x_Mk_82___500lb_GP_Bomb_LD, + ), + ( + Weapons.TER_9A_with_3_x_CBU_87___202_x_Anti_Armor_Skeet_SFW_Cluster_Bomb, + Weapons.TER_9A_with_3_x_Mk_82___500lb_GP_Bomb_LD, + ), # CBU-97 - (Weapons.CBU_97, Weapons.Mk_82), - (Weapons.TER_9A___2_x_CBU_97, Weapons.TER_9A___2_x_Mk_82), - (Weapons.TER_9A___2_x_CBU_97_, Weapons.TER_9A___2_x_Mk_82_), - (Weapons.TER_9A___3_x_CBU_97, Weapons.TER_9A___3_x_Mk_82), + (Weapons.CBU_97___10_x_CEM_Cluster_Bomb, Weapons.Mk_82), + ( + Weapons.TER_9A_with_2_x_CBU_97___10_x_Anti_Armor_Skeet_SFW_Cluster_Bomb, + Weapons.TER_9A_with_2_x_Mk_82___500lb_GP_Bomb_LD, + ), + ( + Weapons.TER_9A_with_2_x_CBU_97___10_x_Anti_Armor_Skeet_SFW_Cluster_Bomb_, + Weapons.TER_9A_with_2_x_Mk_82___500lb_GP_Bomb_LD_, + ), + ( + Weapons.TER_9A_with_3_x_CBU_97___10_x_Anti_Armor_Skeet_SFW_Cluster_Bomb, + Weapons.TER_9A_with_3_x_Mk_82___500lb_GP_Bomb_LD, + ), # CBU-99 (It's a bomb made in 1968, I'm not bothering right now with backups) # CBU-103 - (Weapons.BRU_57___2_x_CBU_103, None), # doesn't exist... - (Weapons.CBU_103, Weapons.CBU_87), + ( + Weapons.CBU_103___202_x_CEM__CBU_with_WCMD, + Weapons.CBU_87___202_x_CEM_Cluster_Bomb, + ), # CBU-105 - (Weapons.BRU_57___2_x_CBU_105, None), # doesn't exist... - (Weapons.CBU_105, Weapons.CBU_97), + (Weapons.CBU_105___10_x_CEM__CBU_with_WCMD, Weapons.CBU_97___10_x_CEM_Cluster_Bomb), ( - Weapons.LAU_131_pod___7_x_2_75__Hydra___Laser_Guided_Rkts_M151___HE_APKWS, - Weapons.LAU_131___7_2_75__rockets_M151__HE_, + Weapons.LAU_131_pod___7_x_2_75_Hydra__Laser_Guided_Rkts_M151__HE_APKWS, + Weapons.LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE, ), ( - Weapons.LAU_131_pod___7_x_2_75__Hydra___Laser_Guided_Rkts_M282___MPP_APKWS, - Weapons.LAU_131___7_2_75__rockets_M151__HE_, + Weapons.LAU_131_pod___7_x_2_75_Hydra__Laser_Guided_Rkts_M282__MPP_APKWS, + Weapons.LAU_131_pod___7_x_2_75_Hydra__UnGd_Rkts_M151__HE, ), ( - Weapons._3_x_LAU_131_pods___21_x_2_75__Hydra___Laser_Guided_M151___HE_APKWS, - Weapons.LAU_68_3___7_2_75__rockets_M151__HE_, + Weapons.BRU_42_with_3_x_LAU_131_pods___7_x_2_75_Hydra__Laser_Guided_Rkts_M151__HE_APKWS, + Weapons.BRU_42_with_3_x_LAU_68_pods___21_x_2_75_Hydra__UnGd_Rkts_M151__HE, ), ( - Weapons._3_x_LAU_131_pods___21_x_2_75__Hydra___Laser_Guided_M282___MPP_APKWS, - Weapons.LAU_68_3___7_2_75__rockets_M151__HE_, + Weapons.BRU_42_with_3_x_LAU_131_pods___7_x_2_75_Hydra__Laser_Guided_Rkts_M282__MPP_APKWS, + Weapons.BRU_42_with_3_x_LAU_68_pods___21_x_2_75_Hydra__UnGd_Rkts_M151__HE, ), # Russia # KAB-1500 - (Weapons.KAB_1500Kr, None), - (Weapons.KAB_1500LG_Pr, Weapons.KAB_1500Kr), - (Weapons.KAB_1500L, Weapons.KAB_1500LG_Pr), + (Weapons.KAB_1500Kr___1500kg_TV_Guided_Bomb, None), + ( + Weapons.KAB_1500LG_Pr___1500kg_Laser_Guided_Penetrator_Bomb, + Weapons.KAB_1500Kr___1500kg_TV_Guided_Bomb, + ), + ( + Weapons.KAB_1500L___1500kg_Laser_Guided_Bomb, + Weapons.KAB_1500LG_Pr___1500kg_Laser_Guided_Penetrator_Bomb, + ), # KAB-500 - (Weapons.KAB_500kr, Weapons.FAB_500_M62), - (Weapons.KAB_500L, Weapons.KAB_500kr), - (Weapons.KAB_500S, Weapons.KAB_500L), + (Weapons.KAB_500Kr___500kg_TV_Guided_Bomb, Weapons.FAB_500_M_62___500kg_GP_Bomb_LD), + ( + Weapons.KAB_500LG___500kg_Laser_Guided_Bomb, + Weapons.KAB_500Kr___500kg_TV_Guided_Bomb, + ), + ( + Weapons.KAB_500S___500kg_GPS_Guided_Bomb, + Weapons.KAB_500LG___500kg_Laser_Guided_Bomb, + ), # KH Series - (Weapons.Kh_22N, None), - (Weapons.Kh_23L, None), - (Weapons.Kh_25ML, None), - (Weapons.Kh_25ML_, None), - (Weapons.Kh_25ML__, None), - (Weapons.Kh_25MP, None), - (Weapons.Kh_25MPU, Weapons.Kh_25MP), - (Weapons.Kh_25MR, None), - (Weapons.Kh_25MR_, None), - (Weapons.Kh_28__AS_9_Kyle_, None), - (Weapons.Kh_29L, Weapons.Kh_25ML), - (Weapons.Kh_29L_, Weapons.Kh_25ML_), - (Weapons.Kh_29L__, Weapons.Kh_25ML__), - (Weapons.Kh_29T, Weapons.Kh_25MR), - (Weapons.Kh_29T_, Weapons.Kh_25MR_), - (Weapons.Kh_29T_, Weapons.Kh_25MR_), - (Weapons.Kh_31A, None), - (Weapons.Kh_31A_, None), - (Weapons.Kh_31A__, None), - (Weapons.Kh_31P, Weapons.Kh_25MP), - (Weapons.Kh_31P_, Weapons.Kh_25MP), - (Weapons.Kh_31P__, Weapons.Kh_25MP), - (Weapons.Kh_35, Weapons.Kh_31A), - (Weapons.Kh_35_, Weapons.Kh_31A_), - (Weapons.Kh_35_6, None), - (Weapons.Kh_41, None), - (Weapons.Kh_58U, Weapons.Kh_31P), - (Weapons.Kh_58U_, Weapons.Kh_31P_), - (Weapons.Kh_59M, Weapons.Kh_31A), - (Weapons.Kh_65, None), - (Weapons.Kh_65_6, None), - (Weapons.Kh_65_8, None), + (Weapons.Kh_22__AS_4_Kitchen____1000kg__AShM__IN__Act_Pas_Rdr, None), + (Weapons.Kh_23L_Grom__AS_7_Kerry____286kg__ASM__Laser_Guided, None), + (Weapons.Kh_25ML__AS_10_Karen____300kg__ASM__Semi_Act_Laser, None), + (Weapons.Kh_25ML__AS_10_Karen____300kg__ASM__Semi_Act_Laser_, None), + (Weapons.Kh_25ML__AS_10_Karen____300kg__ASM__Semi_Act_Laser__, None), + (Weapons.Kh_25MP__AS_12_Kegler____320kg__ARM__Pas_Rdr, None), + ( + Weapons.Kh_25MPU__Updated_AS_12_Kegler____320kg__ARM__IN__Pas_Rdr, + Weapons.Kh_25MP__AS_12_Kegler____320kg__ARM__Pas_Rdr, + ), + (Weapons.Kh_25MR__AS_10_Karen____300kg__ASM__10km__RC_Guided, None), + (Weapons.Kh_25MR__AS_10_Karen____300kg__ASM__RC_Guided, None), + (Weapons.Kh_28__AS_9_Kyle____720kg__ARM__Pas_Rdr, None), + ( + Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser, + Weapons.Kh_25ML__AS_10_Karen____300kg__ASM__Semi_Act_Laser, + ), + ( + Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser_, + Weapons.Kh_25ML__AS_10_Karen____300kg__ASM__Semi_Act_Laser_, + ), + ( + Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser__, + Weapons.Kh_25ML__AS_10_Karen____300kg__ASM__Semi_Act_Laser__, + ), + ( + Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided, + Weapons.Kh_25MR__AS_10_Karen____300kg__ASM__10km__RC_Guided, + ), + ( + Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided_, + Weapons.Kh_25MR__AS_10_Karen____300kg__ASM__RC_Guided, + ), + ( + Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided_, + Weapons.Kh_25MR__AS_10_Karen____300kg__ASM__RC_Guided, + ), + (Weapons.Kh_31A__AS_17_Krypton____610kg__AShM__IN__Act_Rdr, None), + (Weapons.Kh_31A__AS_17_Krypton____610kg__AShM__IN__Act_Rdr_, None), + (Weapons.Kh_31A__AS_17_Krypton____610kg__AShM__IN__Act_Rdr__, None), + ( + Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr, + Weapons.Kh_25MP__AS_12_Kegler____320kg__ARM__Pas_Rdr, + ), + ( + Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr_, + Weapons.Kh_25MP__AS_12_Kegler____320kg__ARM__Pas_Rdr, + ), + ( + Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr__, + Weapons.Kh_25MP__AS_12_Kegler____320kg__ARM__Pas_Rdr, + ), + ( + Weapons.Kh_35__AS_20_Kayak____520kg__AShM__IN__Act_Rdr, + Weapons.Kh_31A__AS_17_Krypton____610kg__AShM__IN__Act_Rdr, + ), + ( + Weapons.Kh_35__AS_20_Kayak____520kg__AShM__IN__Act_Rdr_, + Weapons.Kh_31A__AS_17_Krypton____610kg__AShM__IN__Act_Rdr_, + ), + (Weapons._6_x_Kh_35__AS_20_Kayak____520kg__AShM__IN__Act_Rdr, None), + (Weapons.Kh_41__SS_N_22_Sunburn____4500kg__AShM__IN__Act_Rdr, None), + ( + Weapons.Kh_58U__AS_11_Kilter____640kg__ARM__IN__Pas_Rdr, + Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr, + ), + ( + Weapons.Kh_58U__AS_11_Kilter____640kg__ARM__IN__Pas_Rdr_, + Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr_, + ), + ( + Weapons.Kh_59M__AS_18_Kazoo____930kg__ASM__IN, + Weapons.Kh_31A__AS_17_Krypton____610kg__AShM__IN__Act_Rdr, + ), + (Weapons.Kh_65__AS_15B_Kent____1250kg__ASM__IN__MCC, None), + (Weapons._6_x_Kh_65__AS_15B_Kent____1250kg__ASM__IN__MCC, None), + (Weapons._8_x_Kh_65__AS_15B_Kent____1250kg__ASM__IN__MCC, None), (Weapons.Kh_66_Grom__21__APU_68, None), # ECM (Weapons.L175V_Khibiny_ECM_pod, None), @@ -431,21 +627,33 @@ _WEAPON_FALLBACKS = [ (Weapons.R_13M, None), (Weapons.R_13M1, Weapons.R_13M), # R-24 - (Weapons.R_24R, None), - (Weapons.R_24T, None), + (Weapons.R_24R__AA_7_Apex_SA____Semi_Act_Rdr, None), + (Weapons.R_24T__AA_7_Apex_IR____Infra_Red, None), # R-27 - (Weapons.R_27T, Weapons.R_24T), - (Weapons.R_27R, Weapons.R_24R), - (Weapons.R_27ER, Weapons.R_27R), - (Weapons.R_27ET, Weapons.R_27T), + ( + Weapons.R_27T__AA_10_Alamo_B____Infra_Red, + Weapons.R_24T__AA_7_Apex_IR____Infra_Red, + ), + ( + Weapons.R_27R__AA_10_Alamo_A____Semi_Act_Rdr, + Weapons.R_24R__AA_7_Apex_SA____Semi_Act_Rdr, + ), + ( + Weapons.R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range, + Weapons.R_27R__AA_10_Alamo_A____Semi_Act_Rdr, + ), + ( + Weapons.R_27ET__AA_10_Alamo_D____IR_Extended_Range, + Weapons.R_27T__AA_10_Alamo_B____Infra_Red, + ), # R-33 - (Weapons.R_33, None), + (Weapons.R_33__AA_9_Amos____Semi_Act_Rdr, None), # R-3 (Weapons.R_3S, Weapons.R_13M), (Weapons.R_3R, Weapons.R_3S), # R-40 - (Weapons.R_40R, None), - (Weapons.R_40T, None), + (Weapons.R_40R__AA_6_Acrid____Semi_Act_Rdr, None), + (Weapons.R_40T__AA_6_Acrid____Infra_Red, None), # R-55 (Weapons.R_55, None), (Weapons.RS2US, None), @@ -453,28 +661,29 @@ _WEAPON_FALLBACKS = [ (Weapons.R_60, Weapons.R_13M1), (Weapons.R_60_x_2, Weapons.R_13M1), (Weapons.R_60_x_2_, Weapons.R_13M1), - (Weapons.APU_60_1_R_60M, Weapons.R_3S), (Weapons.R_60M, Weapons.R_60), - (Weapons.R_60M_, Weapons.R_60), - (Weapons.R_60M_2, Weapons.R_60M), - (Weapons.R_60M_2_, Weapons.R_60M), + (Weapons.APU_60_1M_with_R_60M__AA_8_Aphid____Infra_Red, Weapons.R_60), + (Weapons.APU_60_2M_with_2_x_R_60M__AA_8_Aphid____Infra_Red, Weapons.R_60M), + (Weapons.APU_60_2M_with_2_x_R_60M__AA_8_Aphid____Infra_Red_, Weapons.R_60M), (Weapons.R_60M_x_2, Weapons.R_60M), (Weapons.R_60M_x_2_, Weapons.R_60M), # R-73 - (Weapons.R_73, Weapons.R_60M), - (Weapons.R_73_, None), + (Weapons.R_73__AA_11_Archer____Infra_Red, Weapons.R_60M), + (Weapons.R_73__AA_11_Archer____Infra_Red_, None), # R-77 - (Weapons.R_77, Weapons.R_27ER), - (Weapons.R_77_, None), + ( + Weapons.R_77__AA_12_Adder____Active_Rdr, + Weapons.R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range, + ), + (Weapons.R_77__AA_12_Adder____Active_Rdr_, None), # UK # ALARM (Weapons.ALARM, None), - (Weapons.ALARM_2, None), # France # BLG-66 Belouga (Weapons.AUF2_BLG_66_AC_x_2, Weapons.AUF2_MK_82_x_2), (Weapons.BLG_66_AC_Belouga, Weapons.Mk_82), - (Weapons.BLG_66_AC_Belouga_, Weapons.Mk_82), + (Weapons.BLG_66_Belouga___290kg_CBU__151_Frag_Pen_bomblets, Weapons.Mk_82), # HOT-3 (Weapons.HOT3, None), (Weapons.HOT3_, None), @@ -500,83 +709,101 @@ WEAPON_INTRODUCTION_YEARS = { # ADM-141 TALD Weapon.from_pydcs(Weapons.ADM_141A): 1987, Weapon.from_pydcs(Weapons.ADM_141A_): 1987, - Weapon.from_pydcs(Weapons.ADM_141A__): 1987, - Weapon.from_pydcs(Weapons.ADM_141B): 1987, + Weapon.from_pydcs(Weapons.ADM_141A_TALD): 1987, + Weapon.from_pydcs(Weapons.ADM_141B_TALD): 1987, # AGM-114K Hellfire Weapon.from_pydcs(Weapons.AGM114x2_OH_58): 1993, Weapon.from_pydcs(Weapons.AGM_114K): 1993, Weapon.from_pydcs(Weapons.AGM_114K___4): 1993, # AGM-119 Penguin - Weapon.from_pydcs(Weapons.AGM_119B_Penguin): 1972, + Weapon.from_pydcs(Weapons.AGM_119B_Penguin_ASM): 1972, # AGM-122 Sidearm - Weapon.from_pydcs(Weapons.AGM_122): 1986, + Weapon.from_pydcs(Weapons.AGM_122_Sidearm___light_ARM): 1986, Weapon.from_pydcs(Weapons.AGM_122_Sidearm): 1986, Weapon.from_pydcs(Weapons.AGM_122_Sidearm_): 1986, # AGM-154 JSOW - Weapon.from_pydcs(Weapons.AGM_154A): 1998, - Weapon.from_pydcs(Weapons.BRU_55___2_x_AGM_154A): 1998, - Weapon.from_pydcs(Weapons.BRU_57___2_x_AGM_154A): 1998, - Weapon.from_pydcs(Weapons.AGM_154B): 2005, - Weapon.from_pydcs(Weapons.AGM_154C): 2005, - Weapon.from_pydcs(Weapons.AGM_154C_4): 2005, - Weapon.from_pydcs(Weapons.BRU_55___2_x_AGM_154C): 2005, + Weapon.from_pydcs(Weapons.AGM_154A___JSOW_CEB__CBU_type_): 1998, + Weapon.from_pydcs(Weapons.BRU_55_with_2_x_AGM_154A___JSOW_CEB__CBU_type_): 1998, + Weapon.from_pydcs(Weapons.BRU_57_with_2_x_AGM_154A___JSOW_CEB__CBU_type_): 1998, + Weapon.from_pydcs(Weapons.AGM_154B___JSOW_Anti_Armour): 2005, + Weapon.from_pydcs(Weapons.AGM_154C___JSOW_Unitary_BROACH): 2005, + Weapon.from_pydcs(Weapons._4_x_AGM_154C___JSOW_Unitary_BROACH): 2005, + Weapon.from_pydcs(Weapons.BRU_55_with_2_x_AGM_154C___JSOW_Unitary_BROACH): 2005, # AGM-45 Shrike - Weapon.from_pydcs(Weapons.AGM_45A): 1965, - Weapon.from_pydcs(Weapons.AGM_45B): 1970, - Weapon.from_pydcs(Weapons.AGM_45B_): 1970, + Weapon.from_pydcs(Weapons.AGM_45A_Shrike_ARM): 1965, + Weapon.from_pydcs(Weapons.AGM_45B_Shrike_ARM__Imp_): 1970, + Weapon.from_pydcs(Weapons.LAU_118a_with_AGM_45B_Shrike_ARM__Imp_): 1970, # AGM-62 Walleye - Weapon.from_pydcs(Weapons.AGM_62): 1972, + Weapon.from_pydcs(Weapons.AGM_62_Walleye_II___Guided_Weapon_Mk_5__TV_Guided_): 1972, # AGM-65 Maverick - Weapon.from_pydcs(Weapons.AGM_65D): 1983, - Weapon.from_pydcs(Weapons.AGM_65E): 1985, - Weapon.from_pydcs(Weapons.AGM_65K): 2007, + Weapon.from_pydcs(Weapons.LAU_88_AGM_65D_ONE): 1983, + Weapon.from_pydcs(Weapons.AGM_65E___Maverick_E__Laser_ASM___Lg_Whd_): 1985, + Weapon.from_pydcs(Weapons.AGM_65K___Maverick_K__CCD_Imp_ASM_): 2007, Weapon.from_pydcs(Weapons.LAU_117_AGM_65A): 1972, Weapon.from_pydcs(Weapons.LAU_117_AGM_65B): 1972, - Weapon.from_pydcs(Weapons.LAU_117_AGM_65D): 1986, - Weapon.from_pydcs(Weapons.LAU_117_AGM_65E): 1990, + Weapon.from_pydcs(Weapons.LAU_117_with_AGM_65D___Maverick_D__IIR_ASM_): 1986, + Weapon.from_pydcs( + Weapons.LAU_117_with_AGM_65E___Maverick_E__Laser_ASM___Lg_Whd_ + ): 1990, Weapon.from_pydcs(Weapons.LAU_117_AGM_65F): 1991, Weapon.from_pydcs(Weapons.LAU_117_AGM_65G): 1989, Weapon.from_pydcs(Weapons.LAU_117_AGM_65H): 2002, - Weapon.from_pydcs(Weapons.LAU_117_AGM_65K): 2002, + Weapon.from_pydcs(Weapons.LAU_117_with_AGM_65K___Maverick_K__CCD_Imp_ASM_): 2002, Weapon.from_pydcs(Weapons.LAU_117_AGM_65L): 1985, - Weapon.from_pydcs(Weapons.LAU_88_AGM_65D_2): 1983, - Weapon.from_pydcs(Weapons.LAU_88_AGM_65D_2_): 1983, - Weapon.from_pydcs(Weapons.LAU_88_AGM_65D_3): 1983, + Weapon.from_pydcs(Weapons.LAU_88_with_2_x_AGM_65D___Maverick_D__IIR_ASM_): 1983, + Weapon.from_pydcs(Weapons.LAU_88_with_2_x_AGM_65D___Maverick_D__IIR_ASM__): 1983, + Weapon.from_pydcs(Weapons.LAU_88_with_3_x_AGM_65D___Maverick_D__IIR_ASM_): 1983, Weapon.from_pydcs(Weapons.LAU_88_AGM_65D_ONE): 1983, - Weapon.from_pydcs(Weapons.LAU_88_AGM_65E_2): 1985, - Weapon.from_pydcs(Weapons.LAU_88_AGM_65E_2_): 1985, - Weapon.from_pydcs(Weapons.LAU_88_AGM_65E_3): 1985, + Weapon.from_pydcs( + Weapons.LAU_88_with_2_x_AGM_65E___Maverick_E__Laser_ASM___Lg_Whd_ + ): 1985, + Weapon.from_pydcs( + Weapons.LAU_88_with_2_x_AGM_65E___Maverick_E__Laser_ASM___Lg_Whd__ + ): 1985, + Weapon.from_pydcs( + Weapons.LAU_88_with_3_x_AGM_65E___Maverick_E__Laser_ASM___Lg_Whd_ + ): 1985, Weapon.from_pydcs(Weapons.LAU_88_AGM_65H): 2007, Weapon.from_pydcs(Weapons.LAU_88_AGM_65H_2_L): 2007, Weapon.from_pydcs(Weapons.LAU_88_AGM_65H_2_R): 2007, Weapon.from_pydcs(Weapons.LAU_88_AGM_65H_3): 2007, - Weapon.from_pydcs(Weapons.LAU_88_AGM_65K_2): 2007, - Weapon.from_pydcs(Weapons.LAU_88_AGM_65K_2_): 2007, - Weapon.from_pydcs(Weapons.LAU_88_AGM_65K_3): 2007, + Weapon.from_pydcs(Weapons.LAU_88_with_2_x_AGM_65K___Maverick_K__CCD_Imp_ASM_): 2007, + Weapon.from_pydcs( + Weapons.LAU_88_with_2_x_AGM_65K___Maverick_K__CCD_Imp_ASM__ + ): 2007, + Weapon.from_pydcs(Weapons.LAU_88_with_3_x_AGM_65K___Maverick_K__CCD_Imp_ASM_): 2007, # AGM-84 Harpoon Weapon.from_pydcs(Weapons.AGM_84): 1979, - Weapon.from_pydcs(Weapons.AGM_84A): 1979, - Weapon.from_pydcs(Weapons.AGM_84A_8): 1979, - Weapon.from_pydcs(Weapons.AGM_84D): 1979, - Weapon.from_pydcs(Weapons.AGM_84E): 1990, - Weapon.from_pydcs(Weapons.AGM_84E_SLAM): 1990, - Weapon.from_pydcs(Weapons.AGM_84H): 1998, + Weapon.from_pydcs(Weapons.AGM_84A_Harpoon_ASM): 1979, + Weapon.from_pydcs(Weapons._8_x_AGM_84A_Harpoon_ASM): 1979, + Weapon.from_pydcs(Weapons.AGM_84D_Harpoon_AShM): 1979, + Weapon.from_pydcs( + Weapons.AGM_84E_Harpoon_SLAM__Stand_Off_Land_Attack_Missile_ + ): 1990, + Weapon.from_pydcs( + Weapons.AGM_84E_Harpoon_SLAM__Stand_Off_Land_Attack_Missile__ + ): 1990, + Weapon.from_pydcs(Weapons.AGM_84H_SLAM_ER__Expanded_Response_): 1998, # AGM-86 ALCM - Weapon.from_pydcs(Weapons.AGM_86C): 1986, - Weapon.from_pydcs(Weapons.AGM_86C_20): 1986, - Weapon.from_pydcs(Weapons.AGM_86C_8): 1986, - Weapon.from_pydcs(Weapons.MER_6_AGM_86C): 1986, + Weapon.from_pydcs(Weapons.AGM_86C_ALCM): 1986, + Weapon.from_pydcs(Weapons._20_x_AGM_86C_ALCM): 1986, + Weapon.from_pydcs(Weapons._8_x_AGM_86C_ALCM): 1986, + Weapon.from_pydcs(Weapons._6_x_AGM_86C_ALCM_on_MER): 1986, # AGM-88 HARM - Weapon.from_pydcs(Weapons.AGM_88C): 1983, - Weapon.from_pydcs(Weapons.AGM_88C_): 1983, + Weapon.from_pydcs(Weapons.AGM_88C_HARM___High_Speed_Anti_Radiation_Missile): 1983, + Weapon.from_pydcs(Weapons.AGM_88C_HARM___High_Speed_Anti_Radiation_Missile_): 1983, # for future reference: 1983 is the A model IOC. B model in 1986 and C model in 1994. # AIM-120 AMRAAM - Weapon.from_pydcs(Weapons.AIM_120B): 1994, - Weapon.from_pydcs(Weapons.AIM_120C): 1996, + Weapon.from_pydcs(Weapons.AIM_120B_AMRAAM___Active_Rdr_AAM): 1994, + Weapon.from_pydcs(Weapons.AIM_120C_5_AMRAAM___Active_Rdr_AAM): 1996, Weapon.from_pydcs(Weapons.LAU_115_2_LAU_127_AIM_120B): 1994, - Weapon.from_pydcs(Weapons.LAU_115___AIM_120B): 1994, + Weapon.from_pydcs( + Weapons.LAU_115_with_1_x_LAU_127_AIM_120B_AMRAAM___Active_Rdr_AAM + ): 1994, Weapon.from_pydcs(Weapons.LAU_115_2_LAU_127_AIM_120C): 1996, - Weapon.from_pydcs(Weapons.LAU_115___AIM_120C): 1996, + Weapon.from_pydcs( + Weapons.LAU_115_with_1_x_LAU_127_AIM_120C_5_AMRAAM___Active_Rdr_AAM + ): 1996, # AIM-54 Phoenix Weapon.from_pydcs(Weapons.AIM_54A_Mk47): 1974, Weapon.from_pydcs(Weapons.AIM_54A_Mk47_): 1974, @@ -584,25 +811,24 @@ WEAPON_INTRODUCTION_YEARS = { Weapon.from_pydcs(Weapons.AIM_54A_Mk60): 1974, Weapon.from_pydcs(Weapons.AIM_54A_Mk60_): 1974, Weapon.from_pydcs(Weapons.AIM_54A_Mk60__): 1974, - Weapon.from_pydcs(Weapons.AIM_54C): 1974, + Weapon.from_pydcs(Weapons.AIM_54C_Mk47_Phoenix_IN__Semi_Active_Radar): 1974, Weapon.from_pydcs(Weapons.AIM_54C_Mk47): 1974, Weapon.from_pydcs(Weapons.AIM_54C_Mk47_): 1974, Weapon.from_pydcs(Weapons.AIM_54C_Mk47__): 1974, # AIM-7 Sparrow - Weapon.from_pydcs(Weapons.AIM_7E): 1963, - Weapon.from_pydcs(Weapons.AIM_7F): 1976, + Weapon.from_pydcs(Weapons.AIM_7E_Sparrow_Semi_Active_Radar): 1963, + Weapon.from_pydcs(Weapons.AIM_7F_Sparrow_Semi_Active_Radar): 1976, Weapon.from_pydcs(Weapons.AIM_7F_): 1976, - Weapon.from_pydcs(Weapons.AIM_7F__): 1976, + Weapon.from_pydcs(Weapons.AIM_7F): 1976, Weapon.from_pydcs(Weapons.AIM_7M): 1982, Weapon.from_pydcs(Weapons.AIM_7M_): 1982, - Weapon.from_pydcs(Weapons.AIM_7M__): 1982, + Weapon.from_pydcs(Weapons.LAU_115_with_AIM_7M_Sparrow_Semi_Active_Radar): 1982, Weapon.from_pydcs(Weapons.AIM_7MH): 1987, Weapon.from_pydcs(Weapons.AIM_7MH_): 1987, - Weapon.from_pydcs(Weapons.AIM_7MH__): 1987, - Weapon.from_pydcs(Weapons.LAU_115C_AIM_7E): 1963, - Weapon.from_pydcs(Weapons.LAU_115C_AIM_7F): 1976, - Weapon.from_pydcs(Weapons.LAU_115___AIM_7M): 1982, - Weapon.from_pydcs(Weapons.LAU_115C_AIM_7MH): 1987, + Weapon.from_pydcs(Weapons.LAU_115C_with_AIM_7MH_Sparrow_Semi_Active_Radar): 1987, + Weapon.from_pydcs(Weapons.LAU_115C_with_AIM_7E_Sparrow_Semi_Active_Radar): 1963, + Weapon.from_pydcs(Weapons.LAU_115C_with_AIM_7F_Sparrow_Semi_Active_Radar): 1976, + Weapon.from_pydcs(Weapons.LAU_115C_with_AIM_7MH_Sparrow_Semi_Active_Radar): 1987, # AIM-9 Sidewinder Weapon.from_pydcs(Weapons.AIM_9L_Sidewinder_IR_AAM): 1977, Weapon.from_pydcs(Weapons.AIM_9M_Sidewinder_IR_AAM): 1982, @@ -615,8 +841,8 @@ WEAPON_INTRODUCTION_YEARS = { Weapon.from_pydcs(Weapons.LAU_105_1_AIM_9M_R): 1982, Weapon.from_pydcs(Weapons.LAU_105_2_AIM_9L): 1977, Weapon.from_pydcs(Weapons.LAU_105_2_AIM_9P5): 1980, - Weapon.from_pydcs(Weapons.LAU_105___2_AIM_9M_Sidewinder_IR_AAM): 1982, - Weapon.from_pydcs(Weapons.LAU_105___2_AIM_9P_Sidewinder_IR_AAM): 1978, + Weapon.from_pydcs(Weapons.LAU_105_with_2_x_AIM_9M_Sidewinder_IR_AAM): 1982, + Weapon.from_pydcs(Weapons.LAU_105_with_2_x_AIM_9P_Sidewinder_IR_AAM): 1978, Weapon.from_pydcs(Weapons.LAU_115_2_LAU_127_AIM_9L): 1977, Weapon.from_pydcs(Weapons.LAU_115_2_LAU_127_AIM_9M): 1982, Weapon.from_pydcs(Weapons.LAU_115_2_LAU_127_AIM_9X): 2003, @@ -630,125 +856,157 @@ WEAPON_INTRODUCTION_YEARS = { Weapon.from_pydcs(Weapons.LAU_138_AIM_9M): 1982, Weapon.from_pydcs(Weapons.LAU_7_AIM_9L): 1977, Weapon.from_pydcs(Weapons.LAU_7_AIM_9M): 1982, - Weapon.from_pydcs(Weapons.LAU_7_AIM_9M_Sidewinder_IR_AAM): 1982, - Weapon.from_pydcs(Weapons.LAU_7_AIM_9P5_Sidewinder_IR_AAM): 1980, - Weapon.from_pydcs(Weapons.LAU_7_AIM_9P_Sidewinder_IR_AAM): 1978, - Weapon.from_pydcs(Weapons.LAU_7_AIM_9X_Sidewinder_IR_AAM): 2003, - Weapon.from_pydcs(Weapons.LAU_7___2_AIM_9L_Sidewinder_IR_AAM): 1977, - Weapon.from_pydcs(Weapons.LAU_7___2_AIM_9M_Sidewinder_IR_AAM): 1982, - Weapon.from_pydcs(Weapons.LAU_7___2_AIM_9P5_Sidewinder_IR_AAM): 1980, - Weapon.from_pydcs(Weapons.LAU_7___2_AIM_9P_Sidewinder_IR_AAM): 1978, + Weapon.from_pydcs(Weapons.LAU_7_with_AIM_9M_Sidewinder_IR_AAM): 1982, + Weapon.from_pydcs(Weapons.LAU_7_with_AIM_9P5_Sidewinder_IR_AAM): 1980, + Weapon.from_pydcs(Weapons.LAU_7_with_AIM_9P_Sidewinder_IR_AAM): 1978, + Weapon.from_pydcs(Weapons.LAU_7_with_AIM_9X_Sidewinder_IR_AAM): 2003, + Weapon.from_pydcs(Weapons.LAU_7_with_2_x_AIM_9L_Sidewinder_IR_AAM): 1977, + Weapon.from_pydcs(Weapons.LAU_7_with_2_x_AIM_9M_Sidewinder_IR_AAM): 1982, + Weapon.from_pydcs(Weapons.LAU_7_with_2_x_AIM_9P5_Sidewinder_IR_AAM): 1980, + Weapon.from_pydcs(Weapons.LAU_7_with_2_x_AIM_9P_Sidewinder_IR_AAM): 1978, # ALQ ECM Pods - Weapon.from_pydcs(Weapons.ALQ_131): 1970, + Weapon.from_pydcs(Weapons.ALQ_131___ECM_Pod): 1970, Weapon.from_pydcs(Weapons.ALQ_184): 1989, Weapon.from_pydcs(Weapons.AN_ALQ_164_DECM_Pod): 1984, # TGP Pods - Weapon.from_pydcs(Weapons.AN_AAQ_28_LITENING): 1995, - Weapon.from_pydcs(Weapons.AN_AAQ_28_LITENING_): 1995, - Weapon.from_pydcs(Weapons.AN_AAS_38_FLIR): 1993, - Weapon.from_pydcs(Weapons.AN_ASQ_173_LST_SCAM): 1993, + Weapon.from_pydcs(Weapons.AN_AAQ_28_LITENING___Targeting_Pod): 1995, + Weapon.from_pydcs(Weapons.AN_AAQ_28_LITENING___Targeting_Pod_): 1995, + Weapon.from_pydcs(Weapons.AN_ASQ_228_ATFLIR___Targeting_Pod): 1993, + Weapon.from_pydcs( + Weapons.AN_ASQ_173_Laser_Spot_Tracker_Strike_CAMera__LST_SCAM_ + ): 1993, Weapon.from_pydcs(Weapons.AWW_13_DATALINK_POD): 1967, Weapon.from_pydcs(Weapons.LANTIRN_Targeting_Pod): 1985, Weapon.from_pydcs(Weapons.Lantirn_F_16): 1985, Weapon.from_pydcs(Weapons.Lantirn_Target_Pod): 1985, Weapon.from_pydcs(Weapons.Pavetack_F_111): 1982, # BLU-107 - Weapon.from_pydcs(Weapons.BLU_107): 1983, - Weapon.from_pydcs(Weapons.MER_6_BLU_107): 1983, + Weapon.from_pydcs(Weapons.BLU_107___440lb_Anti_Runway_Penetrator_Bomb): 1983, + Weapon.from_pydcs( + Weapons.MER6_with_6_x_BLU_107___440lb_Anti_Runway_Penetrator_Bombs + ): 1983, # GBU-10 LGB Weapon.from_pydcs(Weapons.DIS_GBU_10): 1976, Weapon.from_pydcs(Weapons.GBU_10): 1976, - Weapon.from_pydcs(Weapons.GBU_10_): 1976, - Weapon.from_pydcs(Weapons.GBU_10_2): 1976, + Weapon.from_pydcs(Weapons.BRU_42_with_2_x_GBU_10___2000lb_Laser_Guided_Bombs): 1976, + Weapon.from_pydcs(Weapons.GBU_10___2000lb_Laser_Guided_Bomb): 1976, # GBU-12 LGB Weapon.from_pydcs(Weapons.AUF2_GBU_12_x_2): 1976, - Weapon.from_pydcs(Weapons.BRU_33___2_x_GBU_12): 1976, + Weapon.from_pydcs(Weapons.BRU_33_with_2_x_GBU_12___500lb_Laser_Guided_Bomb): 1976, Weapon.from_pydcs(Weapons.BRU_42_3_GBU_12): 1976, Weapon.from_pydcs(Weapons.DIS_GBU_12): 1976, - Weapon.from_pydcs(Weapons.DIS_GBU_12_DUAL): 1976, - Weapon.from_pydcs(Weapons.DIS_GBU_12_DUAL_L): 1976, - Weapon.from_pydcs(Weapons.DIS_GBU_12_DUAL_R): 1976, + Weapon.from_pydcs(Weapons.DIS_GBU_12_DUAL_GDJ_II19_L): 1976, + Weapon.from_pydcs(Weapons.DIS_GBU_12_DUAL_GDJ_II19_R): 1976, Weapon.from_pydcs(Weapons.GBU_12): 1976, - Weapon.from_pydcs(Weapons.GBU_12_): 1976, - Weapon.from_pydcs(Weapons.TER_9A___2_x_GBU_12): 1976, - Weapon.from_pydcs(Weapons.TER_9A___2_x_GBU_12_): 1976, - Weapon.from_pydcs(Weapons._2xGBU_12): 1976, - Weapon.from_pydcs(Weapons._2xGBU_12_): 1976, + Weapon.from_pydcs(Weapons.GBU_12): 1976, + Weapon.from_pydcs(Weapons.TER_9A_with_2_x_GBU_12___500lb_Laser_Guided_Bomb): 1976, + Weapon.from_pydcs(Weapons.TER_9A_with_2_x_GBU_12___500lb_Laser_Guided_Bomb_): 1976, Weapon.from_pydcs(Weapons._2_GBU_12): 1976, Weapon.from_pydcs(Weapons._2_GBU_12_): 1976, Weapon.from_pydcs(Weapons._3_GBU_12): 1976, - # GBU-15 LGB - Weapon.from_pydcs(Weapons.GBU_15): 1975, # GBU-16 LGB - Weapon.from_pydcs(Weapons.BRU_33___2_x_GBU_16): 1976, + Weapon.from_pydcs(Weapons.BRU_33_with_2_x_GBU_16___1000lb_Laser_Guided_Bomb): 1976, Weapon.from_pydcs(Weapons.DIS_GBU_16): 1976, Weapon.from_pydcs(Weapons.GBU_16): 1976, - Weapon.from_pydcs(Weapons.GBU_16_): 1976, + Weapon.from_pydcs(Weapons.GBU_16___1000lb_Laser_Guided_Bomb): 1976, Weapon.from_pydcs(Weapons._2_GBU_16): 1976, Weapon.from_pydcs(Weapons._2_GBU_16_): 1976, Weapon.from_pydcs(Weapons._3_GBU_16): 1976, - Weapon.from_pydcs(Weapons._3_GBU_16_): 1976, + Weapon.from_pydcs(Weapons.BRU_42_with_3_x_GBU_16___1000lb_Laser_Guided_Bombs): 1976, # GBU-24 LGB Weapon.from_pydcs(Weapons.GBU_24): 1986, - Weapon.from_pydcs(Weapons.GBU_24_): 1986, - Weapon.from_pydcs(Weapons.GBU_24__): 1986, + Weapon.from_pydcs(Weapons.GBU_24_Paveway_III___2000lb_Laser_Guided_Bomb): 1986, + Weapon.from_pydcs(Weapons.GBU_24_Paveway_III___2000lb_Laser_Guided_Bomb_): 1986, # GBU-27 LGB - Weapon.from_pydcs(Weapons.GBU_27): 1991, - Weapon.from_pydcs(Weapons.GBU_27_2): 1991, - Weapon.from_pydcs(Weapons.GBU_27_4): 1991, + Weapon.from_pydcs(Weapons.GBU_27___2000lb_Laser_Guided_Penetrator_Bomb): 1991, + Weapon.from_pydcs( + Weapons.BRU_42_with_2_x_GBU_27___2000lb_Laser_Guided_Penetrator_Bombs + ): 1991, # GBU-28 - Weapon.from_pydcs(Weapons.GBU_28): 1991, + Weapon.from_pydcs(Weapons.GBU_28___5000lb_Laser_Guided_Penetrator_Bomb): 1991, # GBU-31 JDAM Weapon.from_pydcs(Weapons.GBU_31V3B_8): 2001, Weapon.from_pydcs(Weapons.GBU_31_8): 2001, - Weapon.from_pydcs(Weapons.GBU_31_V_1_B): 2001, - Weapon.from_pydcs(Weapons.GBU_31_V_2_B): 2001, - Weapon.from_pydcs(Weapons.GBU_31_V_3_B): 2001, - Weapon.from_pydcs(Weapons.GBU_31_V_4_B): 2001, + Weapon.from_pydcs(Weapons.GBU_31_V_1_B___JDAM__2000lb_GPS_Guided_Bomb): 2001, + Weapon.from_pydcs(Weapons.GBU_31_V_2_B___JDAM__2000lb_GPS_Guided_Bomb): 2001, + Weapon.from_pydcs( + Weapons.GBU_31_V_3_B___JDAM__2000lb_GPS_Guided_Penetrator_Bomb + ): 2001, + Weapon.from_pydcs( + Weapons.GBU_31_V_4_B___JDAM__2000lb_GPS_Guided_Penetrator_Bomb + ): 2001, # GBU-32 JDAM - Weapon.from_pydcs(Weapons.GBU_32_V_2_B): 2002, + Weapon.from_pydcs(Weapons.GBU_32_V_2_B___JDAM__1000lb_GPS_Guided_Bomb): 2002, # GBU-38 JDAM - Weapon.from_pydcs(Weapons.BRU_55___2_x_GBU_38): 2005, - Weapon.from_pydcs(Weapons.BRU_57___2_x_GBU_38): 2005, - Weapon.from_pydcs(Weapons.GBU_38): 2005, + Weapon.from_pydcs( + Weapons.BRU_55_with_2_x_GBU_38___JDAM__500lb_GPS_Guided_Bomb + ): 2005, + Weapon.from_pydcs( + Weapons.BRU_57_with_2_x_GBU_38___JDAM__500lb_GPS_Guided_Bomb + ): 2005, + Weapon.from_pydcs(Weapons.GBU_38___JDAM__500lb_GPS_Guided_Bomb): 2005, Weapon.from_pydcs(Weapons.GBU_38_16): 2005, Weapon.from_pydcs(Weapons._2_GBU_38): 2005, Weapon.from_pydcs(Weapons._2_GBU_38_): 2005, Weapon.from_pydcs(Weapons._3_GBU_38): 2005, # GBU-54 LJDAM - Weapon.from_pydcs(Weapons.GBU_54_V_1_B): 2008, + Weapon.from_pydcs(Weapons.GBU_54B___LJDAM__500lb_Laser__GPS_Guided_Bomb_LD): 2008, Weapon.from_pydcs(Weapons._2_GBU_54_V_1_B): 2008, Weapon.from_pydcs(Weapons._2_GBU_54_V_1_B_): 2008, Weapon.from_pydcs(Weapons._3_GBU_54_V_1_B): 2008, # CBU-52 - Weapon.from_pydcs(Weapons.CBU_52B): 1970, + Weapon.from_pydcs(Weapons.CBU_52B___220_x_HE_Frag_bomblets): 1970, # CBU-87 CEM - Weapon.from_pydcs(Weapons.CBU_87): 1986, - Weapon.from_pydcs(Weapons.TER_9A___2_x_CBU_87): 1986, - Weapon.from_pydcs(Weapons.TER_9A___2_x_CBU_87_): 1986, - Weapon.from_pydcs(Weapons.TER_9A___3_x_CBU_87): 1986, + Weapon.from_pydcs(Weapons.CBU_87___202_x_CEM_Cluster_Bomb): 1986, + Weapon.from_pydcs( + Weapons.TER_9A_with_2_x_CBU_87___202_x_Anti_Armor_Skeet_SFW_Cluster_Bomb + ): 1986, + Weapon.from_pydcs( + Weapons.TER_9A_with_2_x_CBU_87___202_x_Anti_Armor_Skeet_SFW_Cluster_Bomb_ + ): 1986, + Weapon.from_pydcs( + Weapons.TER_9A_with_3_x_CBU_87___202_x_Anti_Armor_Skeet_SFW_Cluster_Bomb + ): 1986, # CBU-97 - Weapon.from_pydcs(Weapons.CBU_97): 1992, - Weapon.from_pydcs(Weapons.TER_9A___2_x_CBU_97): 1992, - Weapon.from_pydcs(Weapons.TER_9A___2_x_CBU_97_): 1992, - Weapon.from_pydcs(Weapons.TER_9A___3_x_CBU_97): 1992, + Weapon.from_pydcs(Weapons.CBU_97___10_x_CEM_Cluster_Bomb): 1992, + Weapon.from_pydcs( + Weapons.TER_9A_with_2_x_CBU_97___10_x_Anti_Armor_Skeet_SFW_Cluster_Bomb + ): 1992, + Weapon.from_pydcs( + Weapons.TER_9A_with_2_x_CBU_97___10_x_Anti_Armor_Skeet_SFW_Cluster_Bomb_ + ): 1992, + Weapon.from_pydcs( + Weapons.TER_9A_with_3_x_CBU_97___10_x_Anti_Armor_Skeet_SFW_Cluster_Bomb + ): 1992, # CBU-99 - Weapon.from_pydcs(Weapons.BRU_33___2_x_CBU_99): 1968, - Weapon.from_pydcs(Weapons.CBU_99): 1968, - Weapon.from_pydcs(Weapons.BRU_33___2_x_Mk_20_Rockeye): 1968, + Weapon.from_pydcs( + Weapons.BRU_33_with_2_x_CBU_99___490lbs__247_x_HEAT_Bomblets + ): 1968, + Weapon.from_pydcs( + Weapons.BRU_33_with_2_x_CBU_99___490lbs__247_x_HEAT_Bomblets + ): 1968, + Weapon.from_pydcs( + Weapons.BRU_33_with_2_x_CBU_99___490lbs__247_x_HEAT_Bomblets + ): 1968, Weapon.from_pydcs(Weapons.DIS_MK_20): 1968, - Weapon.from_pydcs(Weapons.DIS_MK_20_DUAL_L): 1968, - Weapon.from_pydcs(Weapons.DIS_MK_20_DUAL_R): 1968, - Weapon.from_pydcs(Weapons.HSAB_9_Mk_20_Rockeye): 1968, + Weapon.from_pydcs(Weapons.DIS_MK_20_DUAL_GDJ_II19_L): 1968, + Weapon.from_pydcs(Weapons.DIS_MK_20_DUAL_GDJ_II19_R): 1968, + Weapon.from_pydcs( + Weapons.HSAB_with_9_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets + ): 1968, Weapon.from_pydcs(Weapons.MAK79_2_MK_20): 1968, Weapon.from_pydcs(Weapons.MAK79_2_MK_20_): 1968, Weapon.from_pydcs(Weapons.MAK79_MK_20): 1968, Weapon.from_pydcs(Weapons.MAK79_MK_20_): 1968, - Weapon.from_pydcs(Weapons.MER_6_Mk_20_Rockeye): 1968, + Weapon.from_pydcs( + Weapons.MER6_with_6_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets + ): 1968, Weapon.from_pydcs(Weapons.Mk_20): 1968, - Weapon.from_pydcs(Weapons.Mk_20_): 1968, + Weapon.from_pydcs(Weapons.Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets): 1968, Weapon.from_pydcs(Weapons.Mk_20_18): 1968, - Weapon.from_pydcs(Weapons.Mk_20_Rockeye__6): 1968, + Weapon.from_pydcs( + Weapons._6_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets + ): 1968, Weapon.from_pydcs(Weapons._2_MK_20): 1968, Weapon.from_pydcs(Weapons._2_MK_20_): 1968, Weapon.from_pydcs(Weapons._2_MK_20__): 1968, @@ -757,72 +1015,98 @@ WEAPON_INTRODUCTION_YEARS = { Weapon.from_pydcs(Weapons._2_MK_20_____): 1968, Weapon.from_pydcs(Weapons._2_Mk_20_Rockeye): 1968, Weapon.from_pydcs(Weapons._2_Mk_20_Rockeye_): 1968, - Weapon.from_pydcs(Weapons._2_Mk_20_Rockeye__): 1968, - Weapon.from_pydcs(Weapons._3_Mk_20_Rockeye): 1968, - Weapon.from_pydcs(Weapons._3_Mk_20_Rockeye_): 1968, + Weapon.from_pydcs( + Weapons.MER2_with_2_x_Mk_20_Rockeye___490lbs_CBUs__247_x_HEAT_Bomblets + ): 1968, # CBU-103 - Weapon.from_pydcs(Weapons.BRU_57___2_x_CBU_103): 2000, - Weapon.from_pydcs(Weapons.CBU_103): 2000, + Weapon.from_pydcs(Weapons.BRU_57_with_2_x_CBU_103): 2000, + Weapon.from_pydcs(Weapons.CBU_103___202_x_CEM__CBU_with_WCMD): 2000, # CBU-105 - Weapon.from_pydcs(Weapons.BRU_57___2_x_CBU_105): 2000, - Weapon.from_pydcs(Weapons.CBU_105): 2000, + Weapon.from_pydcs(Weapons.BRU_57_with_2_x_CBU_105): 2000, + Weapon.from_pydcs(Weapons.CBU_105___10_x_CEM__CBU_with_WCMD): 2000, # APKWS Weapon.from_pydcs( - Weapons.LAU_131_pod___7_x_2_75__Hydra___Laser_Guided_Rkts_M151___HE_APKWS + Weapons.LAU_131_pod___7_x_2_75_Hydra__Laser_Guided_Rkts_M151__HE_APKWS ): 2016, Weapon.from_pydcs( - Weapons.LAU_131_pod___7_x_2_75__Hydra___Laser_Guided_Rkts_M282___MPP_APKWS + Weapons.LAU_131_pod___7_x_2_75_Hydra__Laser_Guided_Rkts_M282__MPP_APKWS ): 2016, Weapon.from_pydcs( - Weapons._3_x_LAU_131_pods___21_x_2_75__Hydra___Laser_Guided_M151___HE_APKWS + Weapons.BRU_42_with_3_x_LAU_131_pods___7_x_2_75_Hydra__Laser_Guided_Rkts_M151__HE_APKWS ): 2016, Weapon.from_pydcs( - Weapons._3_x_LAU_131_pods___21_x_2_75__Hydra___Laser_Guided_M282___MPP_APKWS + Weapons.BRU_42_with_3_x_LAU_131_pods___7_x_2_75_Hydra__Laser_Guided_Rkts_M282__MPP_APKWS ): 2016, # Russia # KAB-1500 - Weapon.from_pydcs(Weapons.KAB_1500Kr): 1985, - Weapon.from_pydcs(Weapons.KAB_1500L): 1995, - Weapon.from_pydcs(Weapons.KAB_1500LG_Pr): 1990, + Weapon.from_pydcs(Weapons.KAB_1500Kr___1500kg_TV_Guided_Bomb): 1985, + Weapon.from_pydcs(Weapons.KAB_1500L___1500kg_Laser_Guided_Bomb): 1995, + Weapon.from_pydcs( + Weapons.KAB_1500LG_Pr___1500kg_Laser_Guided_Penetrator_Bomb + ): 1990, # KAB-500 - Weapon.from_pydcs(Weapons.KAB_500kr): 1980, - Weapon.from_pydcs(Weapons.KAB_500L): 1995, - Weapon.from_pydcs(Weapons.KAB_500S): 2000, + Weapon.from_pydcs(Weapons.KAB_500Kr___500kg_TV_Guided_Bomb): 1980, + Weapon.from_pydcs(Weapons.KAB_500LG___500kg_Laser_Guided_Bomb): 1995, + Weapon.from_pydcs(Weapons.KAB_500S___500kg_GPS_Guided_Bomb): 2000, # Kh Series - Weapon.from_pydcs(Weapons.Kh_22N): 1962, - Weapon.from_pydcs(Weapons.Kh_23L): 1975, - Weapon.from_pydcs(Weapons.Kh_25ML): 1975, - Weapon.from_pydcs(Weapons.Kh_25ML_): 1975, - Weapon.from_pydcs(Weapons.Kh_25ML__): 1975, - Weapon.from_pydcs(Weapons.Kh_25MP): 1975, - Weapon.from_pydcs(Weapons.Kh_25MPU): 1980, - Weapon.from_pydcs(Weapons.Kh_25MPU_): 1980, - Weapon.from_pydcs(Weapons.Kh_25MPU__): 1980, - Weapon.from_pydcs(Weapons.Kh_25MR): 1975, - Weapon.from_pydcs(Weapons.Kh_25MR_): 1975, - Weapon.from_pydcs(Weapons.Kh_28__AS_9_Kyle_): 1973, - Weapon.from_pydcs(Weapons.Kh_29L): 1980, - Weapon.from_pydcs(Weapons.Kh_29L_): 1980, - Weapon.from_pydcs(Weapons.Kh_29L__): 1980, - Weapon.from_pydcs(Weapons.Kh_29T): 1980, - Weapon.from_pydcs(Weapons.Kh_29T_): 1980, - Weapon.from_pydcs(Weapons.Kh_29T__): 1980, - Weapon.from_pydcs(Weapons.Kh_31A): 1980, - Weapon.from_pydcs(Weapons.Kh_31A_): 1980, - Weapon.from_pydcs(Weapons.Kh_31A__): 1980, - Weapon.from_pydcs(Weapons.Kh_31P): 1980, - Weapon.from_pydcs(Weapons.Kh_31P_): 1980, - Weapon.from_pydcs(Weapons.Kh_31P__): 1980, - Weapon.from_pydcs(Weapons.Kh_35): 2003, - Weapon.from_pydcs(Weapons.Kh_35_): 2003, - Weapon.from_pydcs(Weapons.Kh_35_6): 2003, - Weapon.from_pydcs(Weapons.Kh_41): 1984, - Weapon.from_pydcs(Weapons.Kh_58U): 1985, - Weapon.from_pydcs(Weapons.Kh_58U_): 1985, - Weapon.from_pydcs(Weapons.Kh_59M): 1990, - Weapon.from_pydcs(Weapons.Kh_65): 1992, - Weapon.from_pydcs(Weapons.Kh_65_6): 1992, - Weapon.from_pydcs(Weapons.Kh_65_8): 1992, + Weapon.from_pydcs( + Weapons.Kh_22__AS_4_Kitchen____1000kg__AShM__IN__Act_Pas_Rdr + ): 1962, + Weapon.from_pydcs( + Weapons.Kh_23L_Grom__AS_7_Kerry____286kg__ASM__Laser_Guided + ): 1975, + Weapon.from_pydcs(Weapons.Kh_25ML__AS_10_Karen____300kg__ASM__Semi_Act_Laser): 1975, + Weapon.from_pydcs( + Weapons.Kh_25ML__AS_10_Karen____300kg__ASM__Semi_Act_Laser_ + ): 1975, + Weapon.from_pydcs( + Weapons.Kh_25ML__AS_10_Karen____300kg__ASM__Semi_Act_Laser__ + ): 1975, + Weapon.from_pydcs(Weapons.Kh_25MP__AS_12_Kegler____320kg__ARM__Pas_Rdr): 1975, + Weapon.from_pydcs( + Weapons.Kh_25MPU__Updated_AS_12_Kegler____320kg__ARM__IN__Pas_Rdr + ): 1980, + Weapon.from_pydcs( + Weapons.Kh_25MPU__Updated_AS_12_Kegler____320kg__ARM__IN__Pas_Rdr_ + ): 1980, + Weapon.from_pydcs( + Weapons.Kh_25MPU__Updated_AS_12_Kegler____320kg__ARM__IN__Pas_Rdr__ + ): 1980, + Weapon.from_pydcs( + Weapons.Kh_25MR__AS_10_Karen____300kg__ASM__10km__RC_Guided + ): 1975, + Weapon.from_pydcs(Weapons.Kh_25MR__AS_10_Karen____300kg__ASM__RC_Guided): 1975, + Weapon.from_pydcs(Weapons.Kh_28__AS_9_Kyle____720kg__ARM__Pas_Rdr): 1973, + Weapon.from_pydcs(Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser): 1980, + Weapon.from_pydcs(Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser_): 1980, + Weapon.from_pydcs( + Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser__ + ): 1980, + Weapon.from_pydcs(Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided): 1980, + Weapon.from_pydcs(Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided_): 1980, + Weapon.from_pydcs(Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided__): 1980, + Weapon.from_pydcs(Weapons.Kh_31A__AS_17_Krypton____610kg__AShM__IN__Act_Rdr): 1980, + Weapon.from_pydcs(Weapons.Kh_31A__AS_17_Krypton____610kg__AShM__IN__Act_Rdr_): 1980, + Weapon.from_pydcs( + Weapons.Kh_31A__AS_17_Krypton____610kg__AShM__IN__Act_Rdr__ + ): 1980, + Weapon.from_pydcs(Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr): 1980, + Weapon.from_pydcs(Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr_): 1980, + Weapon.from_pydcs(Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr__): 1980, + Weapon.from_pydcs(Weapons.Kh_35__AS_20_Kayak____520kg__AShM__IN__Act_Rdr): 2003, + Weapon.from_pydcs(Weapons.Kh_35__AS_20_Kayak____520kg__AShM__IN__Act_Rdr_): 2003, + Weapon.from_pydcs( + Weapons._6_x_Kh_35__AS_20_Kayak____520kg__AShM__IN__Act_Rdr + ): 2003, + Weapon.from_pydcs( + Weapons.Kh_41__SS_N_22_Sunburn____4500kg__AShM__IN__Act_Rdr + ): 1984, + Weapon.from_pydcs(Weapons.Kh_58U__AS_11_Kilter____640kg__ARM__IN__Pas_Rdr): 1985, + Weapon.from_pydcs(Weapons.Kh_58U__AS_11_Kilter____640kg__ARM__IN__Pas_Rdr_): 1985, + Weapon.from_pydcs(Weapons.Kh_59M__AS_18_Kazoo____930kg__ASM__IN): 1990, + Weapon.from_pydcs(Weapons.Kh_65__AS_15B_Kent____1250kg__ASM__IN__MCC): 1992, + Weapon.from_pydcs(Weapons._6_x_Kh_65__AS_15B_Kent____1250kg__ASM__IN__MCC): 1992, + Weapon.from_pydcs(Weapons._8_x_Kh_65__AS_15B_Kent____1250kg__ASM__IN__MCC): 1992, Weapon.from_pydcs(Weapons.Kh_66_Grom__21__APU_68): 1968, # ECM Weapon.from_pydcs(Weapons.L175V_Khibiny_ECM_pod): 1982, @@ -830,21 +1114,21 @@ WEAPON_INTRODUCTION_YEARS = { Weapon.from_pydcs(Weapons.R_13M): 1961, Weapon.from_pydcs(Weapons.R_13M1): 1965, # R-24 - Weapon.from_pydcs(Weapons.R_24R): 1981, - Weapon.from_pydcs(Weapons.R_24T): 1981, + Weapon.from_pydcs(Weapons.R_24R__AA_7_Apex_SA____Semi_Act_Rdr): 1981, + Weapon.from_pydcs(Weapons.R_24T__AA_7_Apex_IR____Infra_Red): 1981, # R-27 - Weapon.from_pydcs(Weapons.R_27ER): 1983, - Weapon.from_pydcs(Weapons.R_27ET): 1986, - Weapon.from_pydcs(Weapons.R_27R): 1983, - Weapon.from_pydcs(Weapons.R_27T): 1983, + Weapon.from_pydcs(Weapons.R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range): 1983, + Weapon.from_pydcs(Weapons.R_27ET__AA_10_Alamo_D____IR_Extended_Range): 1986, + Weapon.from_pydcs(Weapons.R_27R__AA_10_Alamo_A____Semi_Act_Rdr): 1983, + Weapon.from_pydcs(Weapons.R_27T__AA_10_Alamo_B____Infra_Red): 1983, # R-33 - Weapon.from_pydcs(Weapons.R_33): 1981, + Weapon.from_pydcs(Weapons.R_33__AA_9_Amos____Semi_Act_Rdr): 1981, # R-3 Weapon.from_pydcs(Weapons.R_3R): 1966, Weapon.from_pydcs(Weapons.R_3S): 1962, # R-40 - Weapon.from_pydcs(Weapons.R_40R): 1976, - Weapon.from_pydcs(Weapons.R_40T): 1976, + Weapon.from_pydcs(Weapons.R_40R__AA_6_Acrid____Semi_Act_Rdr): 1976, + Weapon.from_pydcs(Weapons.R_40T__AA_6_Acrid____Infra_Red): 1976, # R-55 Weapon.from_pydcs(Weapons.R_55): 1957, Weapon.from_pydcs(Weapons.RS2US): 1957, @@ -852,28 +1136,27 @@ WEAPON_INTRODUCTION_YEARS = { Weapon.from_pydcs(Weapons.R_60): 1973, Weapon.from_pydcs(Weapons.R_60_x_2): 1973, Weapon.from_pydcs(Weapons.R_60_x_2_): 1973, - Weapon.from_pydcs(Weapons.APU_60_1_R_60M): 1982, + Weapon.from_pydcs(Weapons.APU_60_1M_with_R_60M__AA_8_Aphid____Infra_Red): 1982, Weapon.from_pydcs(Weapons.R_60M): 1982, - Weapon.from_pydcs(Weapons.R_60M_): 1982, - Weapon.from_pydcs(Weapons.R_60M_2): 1982, - Weapon.from_pydcs(Weapons.R_60M_2_): 1982, + Weapon.from_pydcs(Weapons.R_60M__AA_8_Aphid____Infra_Red): 1982, + Weapon.from_pydcs(Weapons.APU_60_2M_with_2_x_R_60M__AA_8_Aphid____Infra_Red): 1982, + Weapon.from_pydcs(Weapons.APU_60_2M_with_2_x_R_60M__AA_8_Aphid____Infra_Red_): 1982, Weapon.from_pydcs(Weapons.R_60M_x_2): 1982, Weapon.from_pydcs(Weapons.R_60M_x_2_): 1982, # R-73 - Weapon.from_pydcs(Weapons.R_73): 1984, - Weapon.from_pydcs(Weapons.R_73_): 1984, + Weapon.from_pydcs(Weapons.R_73__AA_11_Archer____Infra_Red): 1984, + Weapon.from_pydcs(Weapons.R_73__AA_11_Archer____Infra_Red_): 1984, # R-77 - Weapon.from_pydcs(Weapons.R_77): 2002, - Weapon.from_pydcs(Weapons.R_77_): 2002, + Weapon.from_pydcs(Weapons.R_77__AA_12_Adder____Active_Rdr): 2002, + Weapon.from_pydcs(Weapons.R_77__AA_12_Adder____Active_Rdr_): 2002, # UK # ALARM Weapon.from_pydcs(Weapons.ALARM): 1990, - Weapon.from_pydcs(Weapons.ALARM_2): 1990, # France # BLG-66 Belouga Weapon.from_pydcs(Weapons.AUF2_BLG_66_AC_x_2): 1979, Weapon.from_pydcs(Weapons.BLG_66_AC_Belouga): 1979, - Weapon.from_pydcs(Weapons.BLG_66_AC_Belouga_): 1979, + Weapon.from_pydcs(Weapons.BLG_66_Belouga___290kg_CBU__151_Frag_Pen_bomblets): 1979, # HOT-3 Weapon.from_pydcs(Weapons.HOT3): 1998, Weapon.from_pydcs(Weapons.HOT3_): 1998, diff --git a/game/db.py b/game/db.py index 04a092b2..809a43b1 100644 --- a/game/db.py +++ b/game/db.py @@ -51,7 +51,6 @@ from dcs.planes import ( F_117A, F_14A_135_GR, F_14B, - F_111F, F_15C, F_15E, F_16A, @@ -116,8 +115,8 @@ from dcs.planes import ( I_16, ) from dcs.ships import ( - Armed_speedboat, - Bulk_cargo_ship_Yakushev, + Boat_Armed_Hi_speed, + Bulker_Yakushev, CVN_71_Theodore_Roosevelt, CVN_72_Abraham_Lincoln, CVN_73_George_Washington, @@ -125,7 +124,7 @@ from dcs.ships import ( CVN_75_Harry_S__Truman, CV_1143_5_Admiral_Kuznetsov, CV_1143_5_Admiral_Kuznetsov_2017, - Dry_cargo_ship_Ivanov, + Cargo_Ivanov, LHA_1_Tarawa, Tanker_Elnya_160, ship_map, @@ -174,16 +173,13 @@ from pydcs_extensions.a4ec.a4ec import A_4E_C from pydcs_extensions.f22a.f22a import F_22A from pydcs_extensions.hercules.hercules import Hercules from pydcs_extensions.mb339.mb339 import MB_339PAN -from pydcs_extensions.rafale.rafale import Rafale_A_S, Rafale_M, Rafale_B from pydcs_extensions.su57.su57 import Su_57 UNITINFOTEXT_PATH = Path("./resources/units/unit_info_text.json") plane_map["A-4E-C"] = A_4E_C +plane_map["F-22A"] = F_22A plane_map["MB-339PAN"] = MB_339PAN -plane_map["Rafale_M"] = Rafale_M -plane_map["Rafale_A_S"] = Rafale_A_S -plane_map["Rafale_B"] = Rafale_B plane_map["Su-57"] = Su_57 plane_map["Hercules"] = Hercules @@ -359,7 +355,7 @@ x_map = { } from this example `Identifier` should be used (which may or may not include category of the unit and dot + underscore characters). -For example, player accessible Hornet is called `FA_18C_hornet`, and MANPAD Igla is called `AirDefence.SAM_SA_18_Igla_S_MANPADS` +For example, player accessible Hornet is called `FA_18C_hornet`, and MANPAD Igla is called `AirDefence.MANPADS_SA_18_Igla_S_Grouse` """ # This should probably be much higher, but the AI doesn't rollover their budget @@ -452,7 +448,6 @@ PRICES = { Tu_160: 50, Tu_22M3: 40, Tu_95MS: 35, - F_111F: 21, # special IL_76MD: 30, An_26B: 25, @@ -480,15 +475,11 @@ PRICES = { MQ_9_Reaper: 12, RQ_1A_Predator: 6, WingLoong_I: 6, - # Modded - Rafale_M: 26, - Rafale_A_S: 26, - Rafale_B: 26, # armor Armor.APC_MTLB: 4, - Armor.FDDM_Grad: 4, - Armor.ARV_BRDM_2: 6, - Armor.ARV_BTR_RD: 6, + Artillery.Grad_MRL_FDDM__FC: 4, + Armor.IFV_BRDM_2: 6, + Armor.APC_BTR_RD: 6, Armor.APC_BTR_80: 8, Armor.APC_BTR_82A: 10, Armor.MBT_T_55: 18, @@ -502,147 +493,149 @@ PRICES = { Armor.IFV_BMP_3: 18, Armor.ZBD_04A: 12, Armor.ZTZ_96B: 30, - Armor.APC_Cobra: 4, + Armor.APC_Cobra__Scout: 4, Armor.APC_M113: 6, - Armor.APC_M1043_HMMWV_Armament: 2, - Armor.ATGM_M1045_HMMWV_TOW: 8, + Armor.APC_HMMWV__Scout: 2, + Armor.ATGM_HMMWV: 8, Armor.IFV_M2A2_Bradley: 12, - Armor.APC_M1126_Stryker_ICV: 10, - Armor.SPG_M1128_Stryker_MGS: 14, - Armor.ATGM_M1134_Stryker: 12, + Armor.IFV_M1126_Stryker_ICV: 10, + Armor.SPG_Stryker_MGS: 14, + Armor.ATGM_Stryker: 12, Armor.MBT_M60A3_Patton: 16, Armor.MBT_M1A2_Abrams: 25, Armor.MBT_Leclerc: 25, Armor.MBT_Leopard_1A3: 20, Armor.MBT_Leopard_2: 25, - Armor.MBT_Merkava_Mk__4: 25, - Armor.TPz_Fuchs: 5, + Armor.MBT_Merkava_IV: 25, + Armor.APC_TPz_Fuchs: 5, Armor.MBT_Challenger_II: 25, Armor.IFV_Marder: 10, - Armor.IFV_MCV_80: 10, + Armor.IFV_Warrior: 10, Armor.IFV_LAV_25: 7, - Artillery.MLRS_M270: 55, - Artillery.SPH_M109_Paladin: 25, - Artillery.SPH_2S9_Nona: 12, - Artillery.SPH_2S1_Gvozdika: 18, - Artillery.SPH_2S3_Akatsia: 24, - Artillery.SPH_2S19_Msta: 30, - Artillery.MLRS_BM_21_Grad: 15, - Artillery.MLRS_9K57_Uragan_BM_27: 50, - Artillery.MLRS_9A52_Smerch: 40, - Artillery._2B11_mortar: 4, - Artillery.SpGH_Dana: 26, - Unarmed.Transport_UAZ_469: 3, - Unarmed.Transport_Ural_375: 3, + Artillery.MLRS_M270_227mm: 55, + Artillery.SPH_M109_Paladin_155mm: 25, + Artillery.SPH_2S9_Nona_120mm_M: 12, + Artillery.SPH_2S1_Gvozdika_122mm: 18, + Artillery.SPH_2S3_Akatsia_152mm: 24, + Artillery.SPH_2S19_Msta_152mm: 30, + Artillery.MLRS_BM_21_Grad_122mm: 15, + Artillery.MLRS_BM_27_Uragan_220mm: 50, + Artillery.MLRS_9A52_Smerch_HE_300mm: 40, + Artillery.Mortar_2B11_120mm: 4, + Artillery.SPH_Dana_vz77_152mm: 26, + Artillery.PLZ_05: 25, + Unarmed.LUV_UAZ_469_Jeep: 3, + Unarmed.Truck_Ural_375: 3, Infantry.Infantry_M4: 1, - Infantry.Soldier_AK: 1, - Unarmed.Transport_M818: 3, + Infantry.Infantry_AK_74: 1, + Unarmed.Truck_M818_6x6: 3, # WW2 Armor.MT_Pz_Kpfw_V_Panther_Ausf_G: 24, - Armor.MT_Pz_Kpfw_IV_Ausf_H: 16, + Armor.MT_PzIV_H: 16, Armor.HT_Pz_Kpfw_VI_Tiger_I: 24, Armor.HT_Pz_Kpfw_VI_Ausf__B_Tiger_II: 26, - Armor.TD_Jagdpanther_G1: 18, - Armor.TD_Jagdpanzer_IV: 11, - Armor.Sd_Kfz_184_Elefant: 18, - Armor.APC_Sd_Kfz_251: 4, - Armor.AC_Sd_Kfz_234_2_Puma: 8, + Armor.SPG_Jagdpanther_G1: 18, + Armor.SPG_Jagdpanzer_IV: 11, + Armor.SPG_Sd_Kfz_184_Elefant: 18, + Armor.APC_Sd_Kfz_251_Halftrack: 4, + Armor.IFV_Sd_Kfz_234_2_Puma: 8, Armor.MT_M4_Sherman: 12, Armor.MT_M4A4_Sherman_Firefly: 16, Armor.CT_Cromwell_IV: 12, - Armor.M30_Cargo_Carrier: 2, - Armor.APC_M2A1: 4, + Unarmed.Carrier_M30_Cargo: 2, + Armor.APC_M2A1_Halftrack: 4, Armor.CT_Centaur_IV: 10, Armor.HIT_Churchill_VII: 16, - Armor.LAC_M8_Greyhound: 8, - Armor.TD_M10_GMC: 14, - Armor.StuG_III_Ausf__G: 12, - Armor.StuG_IV: 14, - Artillery.M12_GMC: 10, - Artillery.Sturmpanzer_IV_Brummbär: 10, - Armor.Daimler_Armoured_Car: 8, + Armor.Car_M8_Greyhound_Armored: 8, + Armor.SPG_M10_GMC: 14, + Armor.SPG_StuG_III_Ausf__G: 12, + Armor.SPG_StuG_IV: 14, + Artillery.SPG_M12_GMC_155mm: 10, + Artillery.SPG_Sturmpanzer_IV_Brummbar: 10, + Armor.Car_Daimler_Armored: 8, Armor.LT_Mk_VII_Tetrarch: 8, - Armor.M4_Tractor: 2, + Unarmed.Tractor_M4_Hi_Speed: 2, # ship CV_1143_5_Admiral_Kuznetsov: 100, CVN_74_John_C__Stennis: 100, LHA_1_Tarawa: 50, - Bulk_cargo_ship_Yakushev: 10, - Armed_speedboat: 10, - Dry_cargo_ship_Ivanov: 10, + Bulker_Yakushev: 10, + Boat_Armed_Hi_speed: 10, + Cargo_Ivanov: 10, Tanker_Elnya_160: 10, # Air Defence units - AirDefence.SAM_SA_19_Tunguska_2S6: 30, - AirDefence.SAM_SA_6_Kub_LN_2P25: 20, - AirDefence.SAM_SA_3_S_125_LN_5P73: 6, - AirDefence.SAM_SA_11_Buk_LN_9A310M1: 30, - AirDefence.SAM_SA_11_Buk_CC_9S470M1: 25, - AirDefence.SAM_SA_11_Buk_SR_9S18M1: 28, - AirDefence.SAM_SA_8_Osa_9A33: 28, - AirDefence.SAM_SA_15_Tor_9A331: 40, - AirDefence.SAM_SA_13_Strela_10M3_9A35M3: 16, - AirDefence.SAM_SA_9_Strela_1_9P31: 12, + AirDefence.SAM_SA_19_Tunguska_Grison: 30, + AirDefence.SAM_SA_6_Kub_Gainful_TEL: 20, + AirDefence.SAM_SA_3_S_125_Goa_LN: 6, + AirDefence.SAM_SA_11_Buk_Gadfly_Fire_Dome_TEL: 30, + AirDefence.SAM_SA_11_Buk_Gadfly_C2: 25, + AirDefence.SAM_SA_11_Buk_Gadfly_Snow_Drift_SR: 28, + AirDefence.SAM_SA_8_Osa_Gecko_TEL: 28, + AirDefence.SAM_SA_15_Tor_Gauntlet: 40, + AirDefence.SAM_SA_13_Strela_10M3_Gopher_TEL: 16, + AirDefence.SAM_SA_9_Strela_1_Gaskin_TEL: 12, AirDefence.SAM_SA_8_Osa_LD_9T217: 22, - AirDefence.SAM_Patriot_AMG_AN_MRC_137: 35, - AirDefence.SAM_Patriot_ECS_AN_MSQ_104: 30, + AirDefence.SAM_Patriot_CR__AMG_AN_MRC_137: 35, + AirDefence.SAM_Patriot_ECS: 30, AirDefence.SPAAA_Gepard: 24, - AirDefence.SAM_Hawk_PCP: 14, - AirDefence.AAA_Vulcan_M163: 10, + AirDefence.SAM_Hawk_Generator__PCP: 14, + AirDefence.SPAAA_Vulcan_M163: 10, AirDefence.SAM_Hawk_LN_M192: 8, AirDefence.SAM_Chaparral_M48: 16, - AirDefence.SAM_Linebacker_M6: 18, - AirDefence.SAM_Patriot_LN_M901: 15, - AirDefence.SAM_Avenger_M1097: 20, + AirDefence.SAM_Linebacker___Bradley_M6: 18, + AirDefence.SAM_Patriot_LN: 15, + AirDefence.SAM_Avenger__Stinger: 20, AirDefence.SAM_Patriot_EPP_III: 15, - AirDefence.SAM_Patriot_ICC: 18, + AirDefence.SAM_Patriot_C2_ICC: 18, AirDefence.SAM_Roland_ADS: 12, - AirDefence.Stinger_MANPADS: 6, - AirDefence.SAM_Stinger_comm_dsr: 4, - AirDefence.SAM_Stinger_comm: 4, - AirDefence.SPAAA_ZSU_23_4_Shilka: 10, - AirDefence.AAA_ZSU_57_2: 12, - AirDefence.AAA_ZU_23_Closed: 6, + AirDefence.MANPADS_Stinger: 6, + AirDefence.MANPADS_Stinger_C2_Desert: 4, + AirDefence.MANPADS_Stinger_C2: 4, + AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish: 10, + AirDefence.SPAAA_ZSU_57_2: 12, + AirDefence.AAA_ZU_23_Closed_Emplacement: 6, AirDefence.AAA_ZU_23_Emplacement: 6, - AirDefence.AAA_ZU_23_on_Ural_375: 7, - AirDefence.AAA_ZU_23_Insurgent_Closed: 6, - AirDefence.AAA_ZU_23_Insurgent_on_Ural_375: 7, + AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375: 7, + AirDefence.AAA_ZU_23_Closed_Emplacement_Insurgent: 6, + AirDefence.SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375: 7, AirDefence.AAA_ZU_23_Insurgent: 6, - AirDefence.SAM_SA_18_Igla_MANPADS: 10, - AirDefence.SAM_SA_18_Igla_comm: 8, - AirDefence.SAM_SA_18_Igla_S_MANPADS: 12, - AirDefence.SAM_SA_18_Igla_S_comm: 8, + AirDefence.MANPADS_SA_18_Igla_Grouse: 10, + AirDefence.MANPADS_SA_18_Igla_Grouse_C2: 8, + AirDefence.MANPADS_SA_18_Igla_S_Grouse: 12, + AirDefence.MANPADS_SA_18_Igla_S_Grouse_C2: 8, AirDefence.EWR_1L13: 30, - AirDefence.SAM_SA_6_Kub_STR_9S91: 22, + AirDefence.SAM_SA_6_Kub_Long_Track_STR: 22, AirDefence.EWR_55G6: 30, - AirDefence.CP_9S80M1_Sborka: 10, - AirDefence.SAM_Hawk_TR_AN_MPQ_46: 14, - AirDefence.SAM_Hawk_SR_AN_MPQ_50: 18, - AirDefence.SAM_Patriot_STR_AN_MPQ_53: 22, + AirDefence.MCC_SR_Sborka_Dog_Ear_SR: 10, + AirDefence.SAM_Hawk_TR__AN_MPQ_46: 14, + AirDefence.SAM_Hawk_SR__AN_MPQ_50: 18, + AirDefence.SAM_Patriot_STR: 22, AirDefence.SAM_Hawk_CWAR_AN_MPQ_55: 20, - AirDefence.SAM_SR_P_19: 14, + AirDefence.SAM_P19_Flat_Face_SR__SA_2_3: 14, AirDefence.SAM_Roland_EWR: 16, - AirDefence.SAM_SA_3_S_125_TR_SNR: 14, - AirDefence.SAM_SA_2_LN_SM_90: 8, - AirDefence.SAM_SA_2_TR_SNR_75_Fan_Song: 12, - AirDefence.Rapier_FSA_Launcher: 6, - AirDefence.Rapier_FSA_Optical_Tracker: 6, - AirDefence.Rapier_FSA_Blindfire_Tracker: 8, + AirDefence.SAM_SA_3_S_125_Low_Blow_TR: 14, + AirDefence.SAM_SA_2_S_75_Guideline_LN: 8, + AirDefence.SAM_SA_2_S_75_Fan_Song_TR: 12, + AirDefence.SAM_Rapier_LN: 6, + AirDefence.SAM_Rapier_Tracker: 6, + AirDefence.SAM_Rapier_Blindfire_TR: 8, AirDefence.HQ_7_Self_Propelled_LN: 20, AirDefence.HQ_7_Self_Propelled_STR: 24, AirDefence.AAA_8_8cm_Flak_18: 6, - AirDefence.AAA_Flak_38: 6, + AirDefence.AAA_Flak_38_20mm: 6, AirDefence.AAA_8_8cm_Flak_36: 8, AirDefence.AAA_8_8cm_Flak_37: 9, - AirDefence.AAA_Flak_Vierling_38: 5, - AirDefence.AAA_Kdo_G_40: 8, - AirDefence.Flak_Searchlight_37: 4, - AirDefence.Maschinensatz_33: 10, + AirDefence.AAA_Flak_Vierling_38_Quad_20mm: 5, + AirDefence.AAA_SP_Kdo_G_40: 8, + AirDefence.SL_Flakscheinwerfer_37: 4, + AirDefence.PU_Maschinensatz_33: 10, AirDefence.AAA_8_8cm_Flak_41: 10, AirDefence.EWR_FuMG_401_Freya_LZ: 25, - AirDefence.AAA_Bofors_40mm: 8, + AirDefence.AAA_40mm_Bofors: 8, + AirDefence.AAA_S_60_57mm: 8, AirDefence.AAA_M1_37mm: 7, - AirDefence.AAA_M45_Quadmount: 4, - AirDefence.AA_gun_QF_3_7: 10, + AirDefence.AAA_M45_Quadmount_HB_12_7mm: 4, + AirDefence.AAA_QF_3_7: 10, # FRENCH PACK MOD frenchpack.AMX_10RCR: 10, frenchpack.AMX_10RCR_SEPAR: 12, @@ -673,12 +666,12 @@ PRICES = { frenchpack.DIM__TOYOTA_DESERT: 2, frenchpack.DIM__KAMIKAZE: 6, # SA-10 - AirDefence.SAM_SA_10_S_300PS_CP_54K6: 18, - AirDefence.SAM_SA_10_S_300PS_TR_30N6: 24, - AirDefence.SAM_SA_10_S_300PS_SR_5N66M: 30, - AirDefence.SAM_SA_10_S_300PS_SR_64H6E: 30, - AirDefence.SAM_SA_10_S_300PS_LN_5P85C: 22, - AirDefence.SAM_SA_10_S_300PS_LN_5P85D: 22, + AirDefence.SAM_SA_10_S_300_Grumble_C2: 18, + AirDefence.SAM_SA_10_S_300_Grumble_Flap_Lid_TR: 24, + AirDefence.SAM_SA_10_S_300_Grumble_Clam_Shell_SR: 30, + AirDefence.SAM_SA_10_S_300_Grumble_Big_Bird_SR: 30, + AirDefence.SAM_SA_10_S_300_Grumble_TEL_C: 22, + AirDefence.SAM_SA_10_S_300_Grumble_TEL_D: 22, # High digit sams mod highdigitsams.AAA_SON_9_Fire_Can: 8, highdigitsams.AAA_100mm_KS_19: 10, @@ -771,7 +764,6 @@ UNIT_BY_TASK = { SpitfireLFMkIXCW, SpitfireLFMkIX, A_4E_C, - Rafale_M, SA342Mistral, ], CAS: [ @@ -785,7 +777,6 @@ UNIT_BY_TASK = { A_10C_2, A_20G, B_17G, - F_111F, B_1B, B_52H, F_117A, @@ -806,8 +797,6 @@ UNIT_BY_TASK = { P_47D_30bl1, P_47D_40, RQ_1A_Predator, - Rafale_A_S, - Rafale_B, S_3B, SA342L, SA342M, @@ -843,18 +832,18 @@ UNIT_BY_TASK = { Armor.APC_MTLB, Armor.APC_MTLB, Armor.APC_MTLB, - Armor.FDDM_Grad, - Armor.FDDM_Grad, - Armor.FDDM_Grad, - Armor.FDDM_Grad, - Armor.FDDM_Grad, - Armor.ARV_BRDM_2, - Armor.ARV_BRDM_2, - Armor.ARV_BRDM_2, - Armor.ARV_BTR_RD, - Armor.ARV_BTR_RD, - Armor.ARV_BTR_RD, - Armor.ARV_BTR_RD, + Artillery.Grad_MRL_FDDM__FC, + Artillery.Grad_MRL_FDDM__FC, + Artillery.Grad_MRL_FDDM__FC, + Artillery.Grad_MRL_FDDM__FC, + Artillery.Grad_MRL_FDDM__FC, + Armor.IFV_BRDM_2, + Armor.IFV_BRDM_2, + Armor.IFV_BRDM_2, + Armor.APC_BTR_RD, + Armor.APC_BTR_RD, + Armor.APC_BTR_RD, + Armor.APC_BTR_RD, Armor.APC_BTR_80, Armor.APC_BTR_80, Armor.APC_BTR_80, @@ -884,33 +873,33 @@ UNIT_BY_TASK = { Armor.MBT_T_80U, Armor.MBT_T_90, Armor.ZTZ_96B, - Armor.APC_Cobra, - Armor.APC_Cobra, - Armor.APC_Cobra, - Armor.APC_Cobra, + Armor.APC_Cobra__Scout, + Armor.APC_Cobra__Scout, + Armor.APC_Cobra__Scout, + Armor.APC_Cobra__Scout, Armor.APC_M113, Armor.APC_M113, Armor.APC_M113, Armor.APC_M113, - Armor.TPz_Fuchs, - Armor.TPz_Fuchs, - Armor.TPz_Fuchs, - Armor.TPz_Fuchs, - Armor.ATGM_M1045_HMMWV_TOW, - Armor.ATGM_M1045_HMMWV_TOW, - Armor.APC_M1043_HMMWV_Armament, - Armor.APC_M1043_HMMWV_Armament, + Armor.APC_TPz_Fuchs, + Armor.APC_TPz_Fuchs, + Armor.APC_TPz_Fuchs, + Armor.APC_TPz_Fuchs, + Armor.ATGM_HMMWV, + Armor.ATGM_HMMWV, + Armor.APC_HMMWV__Scout, + Armor.APC_HMMWV__Scout, Armor.IFV_M2A2_Bradley, Armor.IFV_M2A2_Bradley, - Armor.ATGM_M1134_Stryker, - Armor.ATGM_M1134_Stryker, - Armor.APC_M1126_Stryker_ICV, - Armor.APC_M1126_Stryker_ICV, - Armor.APC_M1126_Stryker_ICV, - Armor.SPG_M1128_Stryker_MGS, - Armor.IFV_MCV_80, - Armor.IFV_MCV_80, - Armor.IFV_MCV_80, + Armor.ATGM_Stryker, + Armor.ATGM_Stryker, + Armor.IFV_M1126_Stryker_ICV, + Armor.IFV_M1126_Stryker_ICV, + Armor.IFV_M1126_Stryker_ICV, + Armor.SPG_Stryker_MGS, + Armor.IFV_Warrior, + Armor.IFV_Warrior, + Armor.IFV_Warrior, Armor.IFV_LAV_25, Armor.IFV_LAV_25, Armor.IFV_Marder, @@ -926,92 +915,94 @@ UNIT_BY_TASK = { Armor.MBT_Leclerc, Armor.MBT_Leopard_2, Armor.MBT_Challenger_II, - Armor.MBT_Merkava_Mk__4, + Armor.MBT_Merkava_IV, Armor.MT_Pz_Kpfw_V_Panther_Ausf_G, - Armor.MT_Pz_Kpfw_IV_Ausf_H, + Armor.MT_PzIV_H, Armor.HT_Pz_Kpfw_VI_Tiger_I, Armor.HT_Pz_Kpfw_VI_Ausf__B_Tiger_II, - Armor.APC_Sd_Kfz_251, - Armor.APC_Sd_Kfz_251, - Armor.APC_Sd_Kfz_251, - Armor.APC_Sd_Kfz_251, - Armor.AC_Sd_Kfz_234_2_Puma, - Armor.AC_Sd_Kfz_234_2_Puma, + Armor.APC_Sd_Kfz_251_Halftrack, + Armor.APC_Sd_Kfz_251_Halftrack, + Armor.APC_Sd_Kfz_251_Halftrack, + Armor.APC_Sd_Kfz_251_Halftrack, + Armor.IFV_Sd_Kfz_234_2_Puma, + Armor.IFV_Sd_Kfz_234_2_Puma, Armor.MT_M4_Sherman, Armor.MT_M4A4_Sherman_Firefly, Armor.CT_Cromwell_IV, - Armor.M30_Cargo_Carrier, - Armor.M30_Cargo_Carrier, - Armor.APC_M2A1, - Armor.APC_M2A1, - Armor.APC_M2A1, - Armor.APC_M2A1, + Unarmed.Carrier_M30_Cargo, + Unarmed.Carrier_M30_Cargo, + Armor.APC_M2A1_Halftrack, + Armor.APC_M2A1_Halftrack, + Armor.APC_M2A1_Halftrack, + Armor.APC_M2A1_Halftrack, Armor.MT_Pz_Kpfw_V_Panther_Ausf_G, - Armor.MT_Pz_Kpfw_IV_Ausf_H, + Armor.MT_PzIV_H, Armor.HT_Pz_Kpfw_VI_Tiger_I, Armor.HT_Pz_Kpfw_VI_Ausf__B_Tiger_II, - Armor.TD_Jagdpanther_G1, - Armor.TD_Jagdpanzer_IV, - Armor.Sd_Kfz_184_Elefant, - Armor.APC_Sd_Kfz_251, - Armor.AC_Sd_Kfz_234_2_Puma, + Armor.SPG_Jagdpanther_G1, + Armor.SPG_Jagdpanzer_IV, + Armor.SPG_Sd_Kfz_184_Elefant, + Armor.APC_Sd_Kfz_251_Halftrack, + Armor.IFV_Sd_Kfz_234_2_Puma, Armor.MT_M4_Sherman, Armor.MT_M4A4_Sherman_Firefly, Armor.CT_Cromwell_IV, - Armor.M30_Cargo_Carrier, - Armor.M30_Cargo_Carrier, - Armor.M30_Cargo_Carrier, - Armor.APC_M2A1, - Armor.APC_M2A1, + Unarmed.Carrier_M30_Cargo, + Unarmed.Carrier_M30_Cargo, + Unarmed.Carrier_M30_Cargo, + Armor.APC_M2A1_Halftrack, + Armor.APC_M2A1_Halftrack, Armor.CT_Centaur_IV, Armor.CT_Centaur_IV, Armor.HIT_Churchill_VII, - Armor.LAC_M8_Greyhound, - Armor.LAC_M8_Greyhound, - Armor.TD_M10_GMC, - Armor.TD_M10_GMC, - Armor.StuG_III_Ausf__G, - Armor.StuG_IV, - Artillery.M12_GMC, - Artillery.Sturmpanzer_IV_Brummbär, - Armor.Daimler_Armoured_Car, + Armor.Car_M8_Greyhound_Armored, + Armor.Car_M8_Greyhound_Armored, + Armor.SPG_M10_GMC, + Armor.SPG_M10_GMC, + Armor.SPG_StuG_III_Ausf__G, + Armor.SPG_StuG_IV, + Artillery.SPG_M12_GMC_155mm, + Artillery.SPG_Sturmpanzer_IV_Brummbar, + Armor.Car_Daimler_Armored, Armor.LT_Mk_VII_Tetrarch, - Artillery.MLRS_M270, - Artillery.SPH_M109_Paladin, - Artillery.SPH_2S9_Nona, - Artillery.SPH_2S1_Gvozdika, - Artillery.SPH_2S3_Akatsia, - Artillery.SPH_2S19_Msta, - Artillery.MLRS_BM_21_Grad, - Artillery.MLRS_BM_21_Grad, - Artillery.MLRS_9K57_Uragan_BM_27, - Artillery.MLRS_9A52_Smerch, - Artillery.SpGH_Dana, - Artillery.M12_GMC, - Artillery.Sturmpanzer_IV_Brummbär, - AirDefence.AAA_ZU_23_on_Ural_375, - AirDefence.AAA_ZU_23_Insurgent_on_Ural_375, - AirDefence.AAA_ZSU_57_2, - AirDefence.SPAAA_ZSU_23_4_Shilka, - AirDefence.SAM_SA_8_Osa_9A33, - AirDefence.SAM_SA_9_Strela_1_9P31, - AirDefence.SAM_SA_13_Strela_10M3_9A35M3, - AirDefence.SAM_SA_15_Tor_9A331, - AirDefence.SAM_SA_19_Tunguska_2S6, + Artillery.MLRS_M270_227mm, + Artillery.SPH_M109_Paladin_155mm, + Artillery.SPH_2S9_Nona_120mm_M, + Artillery.SPH_2S1_Gvozdika_122mm, + Artillery.SPH_2S3_Akatsia_152mm, + Artillery.SPH_2S19_Msta_152mm, + Artillery.MLRS_BM_21_Grad_122mm, + Artillery.MLRS_BM_21_Grad_122mm, + Artillery.MLRS_BM_27_Uragan_220mm, + Artillery.MLRS_9A52_Smerch_HE_300mm, + Artillery.SPH_Dana_vz77_152mm, + Artillery.PLZ_05, + Artillery.SPG_M12_GMC_155mm, + Artillery.SPG_Sturmpanzer_IV_Brummbar, + AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375, + AirDefence.SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375, + AirDefence.SPAAA_ZSU_57_2, + AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish, + AirDefence.SAM_SA_8_Osa_Gecko_TEL, + AirDefence.SAM_SA_9_Strela_1_Gaskin_TEL, + AirDefence.SAM_SA_13_Strela_10M3_Gopher_TEL, + AirDefence.SAM_SA_15_Tor_Gauntlet, + AirDefence.SAM_SA_19_Tunguska_Grison, AirDefence.SPAAA_Gepard, - AirDefence.AAA_Vulcan_M163, - AirDefence.SAM_Linebacker_M6, + AirDefence.SPAAA_Vulcan_M163, + AirDefence.SAM_Linebacker___Bradley_M6, AirDefence.SAM_Chaparral_M48, - AirDefence.SAM_Avenger_M1097, + AirDefence.SAM_Avenger__Stinger, AirDefence.SAM_Roland_ADS, AirDefence.HQ_7_Self_Propelled_LN, AirDefence.AAA_8_8cm_Flak_18, AirDefence.AAA_8_8cm_Flak_36, AirDefence.AAA_8_8cm_Flak_37, AirDefence.AAA_8_8cm_Flak_41, - AirDefence.AAA_Bofors_40mm, + AirDefence.AAA_40mm_Bofors, + AirDefence.AAA_S_60_57mm, AirDefence.AAA_M1_37mm, - AirDefence.AA_gun_QF_3_7, + AirDefence.AAA_QF_3_7, frenchpack.DIM__TOYOTA_BLUE, frenchpack.DIM__TOYOTA_DESERT, frenchpack.DIM__TOYOTA_GREEN, @@ -1036,13 +1027,13 @@ UNIT_BY_TASK = { ], AirDefence: [], Reconnaissance: [ - Unarmed.Transport_M818, - Unarmed.Transport_Ural_375, - Unarmed.Transport_UAZ_469, + Unarmed.Truck_M818_6x6, + Unarmed.Truck_Ural_375, + Unarmed.LUV_UAZ_469_Jeep, ], Nothing: [ Infantry.Infantry_M4, - Infantry.Soldier_AK, + Infantry.Infantry_AK_74, ], Embarking: [], Carriage: [ @@ -1051,10 +1042,10 @@ UNIT_BY_TASK = { CV_1143_5_Admiral_Kuznetsov, ], CargoTransportation: [ - Dry_cargo_ship_Ivanov, - Bulk_cargo_ship_Yakushev, + Cargo_Ivanov, + Bulker_Yakushev, Tanker_Elnya_160, - Armed_speedboat, + Boat_Armed_Hi_speed, ], } @@ -1062,41 +1053,41 @@ UNIT_BY_TASK = { Units from AirDefense category of UNIT_BY_TASK that will be removed from use if "No SAM" option is checked at the start of the game """ SAM_BAN = [ - AirDefence.SAM_Linebacker_M6, - AirDefence.SAM_SA_9_Strela_1_9P31, - AirDefence.SAM_SA_8_Osa_9A33, - AirDefence.SAM_SA_19_Tunguska_2S6, - AirDefence.SAM_SA_6_Kub_LN_2P25, - AirDefence.SAM_SA_8_Osa_9A33, - AirDefence.SAM_SA_3_S_125_LN_5P73, - AirDefence.SAM_Hawk_PCP, - AirDefence.SAM_SA_2_LN_SM_90, - AirDefence.SAM_SA_11_Buk_LN_9A310M1, + AirDefence.SAM_Linebacker___Bradley_M6, + AirDefence.SAM_SA_9_Strela_1_Gaskin_TEL, + AirDefence.SAM_SA_8_Osa_Gecko_TEL, + AirDefence.SAM_SA_19_Tunguska_Grison, + AirDefence.SAM_SA_6_Kub_Gainful_TEL, + AirDefence.SAM_SA_8_Osa_Gecko_TEL, + AirDefence.SAM_SA_3_S_125_Goa_LN, + AirDefence.SAM_Hawk_Generator__PCP, + AirDefence.SAM_SA_2_S_75_Guideline_LN, + AirDefence.SAM_SA_11_Buk_Gadfly_Fire_Dome_TEL, ] """ Used to convert SAM site parts to the corresponding site """ SAM_CONVERT = { - AirDefence.SAM_SR_P_19: AirDefence.SAM_SA_3_S_125_LN_5P73, - AirDefence.SAM_SA_3_S_125_TR_SNR: AirDefence.SAM_SA_3_S_125_LN_5P73, - AirDefence.SAM_SA_3_S_125_LN_5P73: AirDefence.SAM_SA_3_S_125_LN_5P73, - AirDefence.SAM_SA_6_Kub_LN_2P25: AirDefence.SAM_SA_6_Kub_LN_2P25, - AirDefence.SAM_SA_6_Kub_STR_9S91: AirDefence.SAM_SA_6_Kub_LN_2P25, - AirDefence.SAM_SA_10_S_300PS_LN_5P85C: AirDefence.SAM_SA_10_S_300PS_LN_5P85C, - AirDefence.SAM_SA_10_S_300PS_SR_5N66M: AirDefence.SAM_SA_10_S_300PS_LN_5P85C, - AirDefence.SAM_SA_10_S_300PS_TR_30N6: AirDefence.SAM_SA_10_S_300PS_LN_5P85C, - AirDefence.SAM_SA_10_S_300PS_CP_54K6: AirDefence.SAM_SA_10_S_300PS_LN_5P85C, - AirDefence.SAM_SA_10_S_300PS_SR_64H6E: AirDefence.SAM_SA_10_S_300PS_CP_54K6, - AirDefence.SAM_Hawk_TR_AN_MPQ_46: AirDefence.SAM_Hawk_PCP, - AirDefence.SAM_Hawk_SR_AN_MPQ_50: AirDefence.SAM_Hawk_PCP, - AirDefence.SAM_Hawk_LN_M192: AirDefence.SAM_Hawk_PCP, + AirDefence.SAM_P19_Flat_Face_SR__SA_2_3: AirDefence.SAM_SA_3_S_125_Goa_LN, + AirDefence.SAM_SA_3_S_125_Low_Blow_TR: AirDefence.SAM_SA_3_S_125_Goa_LN, + AirDefence.SAM_SA_3_S_125_Goa_LN: AirDefence.SAM_SA_3_S_125_Goa_LN, + AirDefence.SAM_SA_6_Kub_Gainful_TEL: AirDefence.SAM_SA_6_Kub_Gainful_TEL, + AirDefence.SAM_SA_6_Kub_Long_Track_STR: AirDefence.SAM_SA_6_Kub_Gainful_TEL, + AirDefence.SAM_SA_10_S_300_Grumble_TEL_C: AirDefence.SAM_SA_10_S_300_Grumble_TEL_C, + AirDefence.SAM_SA_10_S_300_Grumble_Clam_Shell_SR: AirDefence.SAM_SA_10_S_300_Grumble_TEL_C, + AirDefence.SAM_SA_10_S_300_Grumble_Flap_Lid_TR: AirDefence.SAM_SA_10_S_300_Grumble_TEL_C, + AirDefence.SAM_SA_10_S_300_Grumble_C2: AirDefence.SAM_SA_10_S_300_Grumble_TEL_C, + AirDefence.SAM_SA_10_S_300_Grumble_Big_Bird_SR: AirDefence.SAM_SA_10_S_300_Grumble_C2, + AirDefence.SAM_Hawk_TR__AN_MPQ_46: AirDefence.SAM_Hawk_Generator__PCP, + AirDefence.SAM_Hawk_SR__AN_MPQ_50: AirDefence.SAM_Hawk_Generator__PCP, + AirDefence.SAM_Hawk_LN_M192: AirDefence.SAM_Hawk_Generator__PCP, "except": { # this radar is shared between the two S300's. if we attempt to find a SAM site at a base and can't find one # model, we can safely assume the other was deployed # well, perhaps not safely, but we'll make the assumption anyway :p - AirDefence.SAM_SA_10_S_300PS_TR_30N6: AirDefence.SAM_SA_10_S_300PS_CP_54K6, - AirDefence.SAM_SR_P_19: AirDefence.SAM_SA_2_LN_SM_90, + AirDefence.SAM_SA_10_S_300_Grumble_Flap_Lid_TR: AirDefence.SAM_SA_10_S_300_Grumble_C2, + AirDefence.SAM_P19_Flat_Face_SR__SA_2_3: AirDefence.SAM_SA_2_S_75_Guideline_LN, }, } @@ -1157,6 +1148,7 @@ COMMON_OVERRIDE = { Escort: "CAP", RunwayAttack: "RUNWAY_ATTACK", FighterSweep: "CAP", + AWACS: "AEW&C", } """ @@ -1225,7 +1217,6 @@ PLANE_PAYLOAD_OVERRIDES: Dict[Type[PlaneType], Dict[Type[Task], str]] = { F_14A_135_GR: COMMON_OVERRIDE, F_14B: COMMON_OVERRIDE, F_15C: COMMON_OVERRIDE, - F_111F: COMMON_OVERRIDE, F_22A: COMMON_OVERRIDE, F_16C_50: COMMON_OVERRIDE, JF_17: COMMON_OVERRIDE, @@ -1278,9 +1269,6 @@ PLANE_PAYLOAD_OVERRIDES: Dict[Type[PlaneType], Dict[Type[Task], str]] = { A_20G: COMMON_OVERRIDE, A_4E_C: COMMON_OVERRIDE, MB_339PAN: COMMON_OVERRIDE, - Rafale_M: COMMON_OVERRIDE, - Rafale_A_S: COMMON_OVERRIDE, - Rafale_B: COMMON_OVERRIDE, OH_58D: COMMON_OVERRIDE, F_16A: COMMON_OVERRIDE, MQ_9_Reaper: COMMON_OVERRIDE, @@ -1291,6 +1279,7 @@ PLANE_PAYLOAD_OVERRIDES: Dict[Type[PlaneType], Dict[Type[Task], str]] = { AH_64A: COMMON_OVERRIDE, SH_60B: COMMON_OVERRIDE, Hercules: COMMON_OVERRIDE, + F_86F_Sabre: COMMON_OVERRIDE, Su_25TM: { SEAD: "Kh-31P*2_Kh-25ML*4_R-73*2_L-081_MPS410", }, @@ -1374,8 +1363,8 @@ CARRIER_CAPABLE = [ AV8BNA, Su_33, A_4E_C, - Rafale_M, S_3B, + E_2C, UH_1H, Mi_8MT, Ka_50, @@ -1431,6 +1420,8 @@ def upgrade_to_supercarrier(unit, name: str): return CVN_73_George_Washington elif name == "CVN-75 Harry S. Truman": return CVN_75_Harry_S__Truman + elif name == "Carrier Strike Group 8": + return CVN_75_Harry_S__Truman else: return CVN_71_Theodore_Roosevelt elif unit == CV_1143_5_Admiral_Kuznetsov: @@ -1456,9 +1447,9 @@ def find_unittype(for_task: Task, country_name: str) -> List[Type[UnitType]]: MANPADS: List[VehicleType] = [ - AirDefence.SAM_SA_18_Igla_MANPADS, - AirDefence.SAM_SA_18_Igla_S_MANPADS, - AirDefence.Stinger_MANPADS, + AirDefence.MANPADS_SA_18_Igla_Grouse, + AirDefence.MANPADS_SA_18_Igla_S_Grouse, + AirDefence.MANPADS_Stinger, ] INFANTRY: List[VehicleType] = [ @@ -1467,28 +1458,28 @@ INFANTRY: List[VehicleType] = [ Infantry.Paratrooper_AKS, Infantry.Paratrooper_AKS, Infantry.Paratrooper_AKS, - Infantry.Soldier_RPG, + Infantry.Infantry_RPG, Infantry.Infantry_M4, Infantry.Infantry_M4, Infantry.Infantry_M4, Infantry.Infantry_M4, Infantry.Infantry_M4, - Infantry.Soldier_M249, - Artillery._2B11_mortar, - Infantry.Soldier_AK, - Infantry.Soldier_AK, - Infantry.Soldier_AK, - Infantry.Soldier_AK, - Infantry.Soldier_AK, + Infantry.Infantry_M249, + Artillery.Mortar_2B11_120mm, + Infantry.Infantry_AK_74, + Infantry.Infantry_AK_74, + Infantry.Infantry_AK_74, + Infantry.Infantry_AK_74, + Infantry.Infantry_AK_74, Infantry.Paratrooper_RPG_16, - Infantry.Georgian_soldier_with_M4, - Infantry.Georgian_soldier_with_M4, - Infantry.Georgian_soldier_with_M4, - Infantry.Georgian_soldier_with_M4, - Infantry.Infantry_Soldier_Rus, - Infantry.Infantry_Soldier_Rus, - Infantry.Infantry_Soldier_Rus, - Infantry.Infantry_Soldier_Rus, + Infantry.Infantry_M4_Georgia, + Infantry.Infantry_M4_Georgia, + Infantry.Infantry_M4_Georgia, + Infantry.Infantry_M4_Georgia, + Infantry.Infantry_AK_74_Rus, + Infantry.Infantry_AK_74_Rus, + Infantry.Infantry_AK_74_Rus, + Infantry.Infantry_AK_74_Rus, Infantry.Infantry_SMLE_No_4_Mk_1, Infantry.Infantry_SMLE_No_4_Mk_1, Infantry.Infantry_SMLE_No_4_Mk_1, @@ -1499,9 +1490,9 @@ INFANTRY: List[VehicleType] = [ Infantry.Infantry_M1_Garand, Infantry.Infantry_M1_Garand, Infantry.Infantry_M1_Garand, - Infantry.Infantry_Soldier_Insurgents, - Infantry.Infantry_Soldier_Insurgents, - Infantry.Infantry_Soldier_Insurgents, + Infantry.Insurgent_AK_74, + Infantry.Insurgent_AK_74, + Infantry.Insurgent_AK_74, ] diff --git a/game/factions/faction.py b/game/factions/faction.py index 4ed2ada6..b1cecc55 100644 --- a/game/factions/faction.py +++ b/game/factions/faction.py @@ -70,6 +70,9 @@ class Faction: # Possible Missile site generators for this faction missiles: List[str] = field(default_factory=list) + # Possible costal site generators for this faction + coastal_defenses: List[str] = field(default_factory=list) + # Required mods or asset packs requirements: Dict[str, str] = field(default_factory=dict) @@ -100,6 +103,9 @@ class Faction: # How many missiles group should we try to generate per CP on startup for this faction missiles_group_count: int = field(default=1) + # How many coastal group should we try to generate per CP on startup for this faction + coastal_group_count: int = field(default=1) + # Whether this faction has JTAC access has_jtac: bool = field(default=False) @@ -162,6 +168,7 @@ class Faction: faction.air_defenses.extend(json.get("shorads", [])) faction.missiles = json.get("missiles", []) + faction.coastal_defenses = json.get("coastal_defenses", []) faction.requirements = json.get("requirements", {}) faction.carrier_names = json.get("carrier_names", []) @@ -179,6 +186,7 @@ class Faction: faction.jtac_unit = None faction.navy_group_count = int(json.get("navy_group_count", 1)) faction.missiles_group_count = int(json.get("missiles_group_count", 0)) + faction.coastal_group_count = int(json.get("coastal_group_count", 0)) # Load doctrine doctrine = json.get("doctrine", "modern") diff --git a/game/game.py b/game/game.py index 743a5380..22598504 100644 --- a/game/game.py +++ b/game/game.py @@ -96,6 +96,7 @@ class Game: self.enemy_name = enemy_name self.enemy_country = db.FACTIONS[enemy_name].country self.turn = 0 + # NB: This is the *start* date. It is never updated. self.date = date(start_date.year, start_date.month, start_date.day) self.game_stats = GameStats() self.game_stats.update(self) @@ -152,7 +153,7 @@ class Game: def generate_conditions(self) -> Conditions: return Conditions.generate( - self.theater, self.date, self.current_turn_time_of_day, self.settings + self.theater, self.current_day, self.current_turn_time_of_day, self.settings ) def sanitize_sides(self): @@ -283,11 +284,18 @@ class Game: persistency.autosave(self) def check_win_loss(self): - captured_states = {i.captured for i in self.theater.controlpoints} - if True not in captured_states: + player_airbases = { + cp for cp in self.theater.player_points() if cp.runway_is_operational() + } + if not player_airbases: return TurnState.LOSS - if False not in captured_states: + + enemy_airbases = { + cp for cp in self.theater.enemy_points() if cp.runway_is_operational() + } + if not enemy_airbases: return TurnState.WIN + return TurnState.CONTINUE def initialize_turn(self) -> None: diff --git a/game/navmesh.py b/game/navmesh.py index bcef8191..193dd31e 100644 --- a/game/navmesh.py +++ b/game/navmesh.py @@ -21,6 +21,10 @@ from game.threatzones import ThreatZones from game.utils import nautical_miles +class NavMeshError(RuntimeError): + pass + + class NavMeshPoly: def __init__(self, ident: int, poly: Polygon, threatened: bool) -> None: self.ident = ident @@ -125,7 +129,7 @@ class NavMesh: path.append(current.world_point) previous = came_from[current] if previous is None: - raise RuntimeError( + raise NavMeshError( f"Could not reconstruct path to {destination} from {origin}" ) current = previous @@ -140,10 +144,12 @@ class NavMesh: def shortest_path(self, origin: Point, destination: Point) -> List[Point]: origin_poly = self.localize(origin) if origin_poly is None: - raise ValueError(f"Origin point {origin} is outside the navmesh") + raise NavMeshError(f"Origin point {origin} is outside the navmesh") destination_poly = self.localize(destination) if destination_poly is None: - raise ValueError(f"Origin point {destination} is outside the navmesh") + raise NavMeshError( + f"Destination point {destination} is outside the navmesh" + ) return self._shortest_path( NavPoint(self.dcs_to_shapely_point(origin), origin_poly), @@ -203,7 +209,7 @@ class NavMesh: # threatened airbases at the map edges have room to retreat from the # threat without running off the navmesh. return box(*LineString(points).bounds).buffer( - nautical_miles(100).meters, resolution=1 + nautical_miles(200).meters, resolution=1 ) @staticmethod diff --git a/game/operation/operation.py b/game/operation/operation.py index fc190510..271a99aa 100644 --- a/game/operation/operation.py +++ b/game/operation/operation.py @@ -166,6 +166,7 @@ class Operation: airgen: AircraftConflictGenerator, ): """Generates subscribed MissionInfoGenerator objects (currently kneeboards and briefings)""" + gens: List[MissionInfoGenerator] = [ KneeboardGenerator(cls.current_mission, cls.game), BriefingGenerator(cls.current_mission, cls.game), @@ -177,9 +178,8 @@ class Operation: for tanker in airsupportgen.air_support.tankers: gen.add_tanker(tanker) - if cls.player_awacs_enabled: - for awacs in airsupportgen.air_support.awacs: - gen.add_awacs(awacs) + for aewc in airsupportgen.air_support.awacs: + gen.add_awacs(aewc) for jtac in jtacs: gen.add_jtac(jtac) @@ -378,7 +378,9 @@ class Operation: cls.game, cls.radio_registry, cls.unit_map, + air_support=cls.airsupportgen.air_support, ) + cls.airgen.clear_parking_slots() cls.airgen.generate_flights( @@ -444,6 +446,8 @@ class Operation: "AWACs": {}, "JTACs": {}, "TargetPoints": {}, + "RedAA": {}, + "BlueAA": {}, } # type: ignore for tanker in airsupportgen.air_support.tankers: @@ -501,6 +505,26 @@ class Operation: }, } + for cp in cls.game.theater.controlpoints: + for ground_object in cp.ground_objects: + if ground_object.might_have_aa and not ground_object.is_dead: + for g in ground_object.groups: + threat_range = ground_object.threat_range(g) + + if not threat_range: + continue + + faction = "BlueAA" if cp.captured else "RedAA" + + luaData[faction][g.name] = { + "name": ground_object.name, + "range": threat_range.meters, + "position": { + "x": ground_object.position.x, + "y": ground_object.position.y, + }, + } + # set a LUA table with data from Liberation that we want to set # at the moment it contains Liberation's install path, and an overridable definition for the JTACAutoLase function # later, we'll add data about the units and points having been generated, in order to facilitate the configuration of the plugin lua scripts @@ -593,7 +617,33 @@ class Operation: -- list the aircraft carriers generated by Liberation -- dcsLiberation.Carriers = {} - -- later, we'll add more data to the table + -- list the Red AA generated by Liberation + dcsLiberation.RedAA = { + """ + for key in luaData["RedAA"]: + data = luaData["RedAA"][key] + name = data["name"] + radius = data["range"] + positionX = data["position"]["x"] + positionY = data["position"]["y"] + lua += f" {{dcsGroupName='{key}', name='{name}', range='{radius}', positionX='{positionX}', positionY='{positionY}' }}, \n" + lua += "}" + + lua += """ + + -- list the Blue AA generated by Liberation + dcsLiberation.BlueAA = { + """ + for key in luaData["BlueAA"]: + data = luaData["BlueAA"][key] + name = data["name"] + radius = data["range"] + positionX = data["position"]["x"] + positionY = data["position"]["y"] + lua += f" {{dcsGroupName='{key}', name='{name}', range='{radius}', positionX='{positionX}', positionY='{positionY}' }}, \n" + lua += "}" + + lua += """ """ diff --git a/game/point_with_heading.py b/game/point_with_heading.py new file mode 100644 index 00000000..fa322723 --- /dev/null +++ b/game/point_with_heading.py @@ -0,0 +1,15 @@ +from dcs import Point + + +class PointWithHeading(Point): + def __init__(self): + super(PointWithHeading, self).__init__(0, 0) + self.heading = 0 + + @staticmethod + def from_point(point: Point, heading: int): + p = PointWithHeading() + p.x = point.x + p.y = point.y + p.heading = heading + return p diff --git a/game/settings.py b/game/settings.py index 366fe613..0e6f968a 100644 --- a/game/settings.py +++ b/game/settings.py @@ -30,6 +30,8 @@ class Settings: automate_front_line_reinforcements: bool = False automate_aircraft_reinforcements: bool = False restrict_weapons_by_date: bool = False + disable_legacy_aewc: bool = False + generate_dark_kneeboard: bool = False # Performance oriented perf_red_alert_state: bool = True diff --git a/game/theater/base.py b/game/theater/base.py index 7ad7e762..5db7bba7 100644 --- a/game/theater/base.py +++ b/game/theater/base.py @@ -4,7 +4,7 @@ import math import typing from typing import Dict, Type -from dcs.task import CAP, CAS, Embarking, PinpointStrike, Task +from dcs.task import AWACS, CAP, CAS, Embarking, PinpointStrike, Task from dcs.unittype import FlyingType, UnitType, VehicleType from dcs.vehicles import AirDefence, Armor @@ -147,7 +147,12 @@ class Base: for_task = db.unit_task(unit_type) target_dict = None - if for_task == CAS or for_task == CAP or for_task == Embarking: + if ( + for_task == AWACS + or for_task == CAS + or for_task == CAP + or for_task == Embarking + ): target_dict = self.aircraft elif for_task == PinpointStrike: target_dict = self.armor diff --git a/game/theater/conflicttheater.py b/game/theater/conflicttheater.py index 5004de81..80194189 100644 --- a/game/theater/conflicttheater.py +++ b/game/theater/conflicttheater.py @@ -23,7 +23,7 @@ from dcs.planes import F_15C from dcs.ships import ( CVN_74_John_C__Stennis, LHA_1_Tarawa, - USS_Arleigh_Burke_IIa, + DDG_Arleigh_Burke_IIa, ) from dcs.statics import Fortification from dcs.terrain import ( @@ -55,6 +55,7 @@ from .controlpoint import ( Fob, ) from .landmap import Landmap, load_landmap, poly_contains +from ..point_with_heading import PointWithHeading from ..utils import Distance, meters, nautical_miles Numeric = Union[int, float] @@ -92,30 +93,33 @@ class MizCampaignLoader: LHA_UNIT_TYPE = LHA_1_Tarawa.id FRONT_LINE_UNIT_TYPE = Armor.APC_M113.id - FOB_UNIT_TYPE = Unarmed.CP_SKP_11_ATC_Mobile_Command_Post.id + FOB_UNIT_TYPE = Unarmed.Truck_SKP_11_Mobile_ATC.id + FARP_HELIPAD = "SINGLE_HELIPAD" EWR_UNIT_TYPE = AirDefence.EWR_55G6.id - SAM_UNIT_TYPE = AirDefence.SAM_SA_10_S_300PS_SR_64H6E.id - GARRISON_UNIT_TYPE = AirDefence.SAM_SA_19_Tunguska_2S6.id + SAM_UNIT_TYPE = AirDefence.SAM_SA_10_S_300_Grumble_Big_Bird_SR.id + GARRISON_UNIT_TYPE = AirDefence.SAM_SA_19_Tunguska_Grison.id OFFSHORE_STRIKE_TARGET_UNIT_TYPE = Fortification.Oil_platform.id - SHIP_UNIT_TYPE = USS_Arleigh_Burke_IIa.id - MISSILE_SITE_UNIT_TYPE = MissilesSS.SRBM_SS_1C_Scud_B_9K72_LN_9P117M.id - COASTAL_DEFENSE_UNIT_TYPE = MissilesSS.SS_N_2_Silkworm.id + SHIP_UNIT_TYPE = DDG_Arleigh_Burke_IIa.id + MISSILE_SITE_UNIT_TYPE = MissilesSS.SSM_SS_1C_Scud_B.id + COASTAL_DEFENSE_UNIT_TYPE = MissilesSS.AShM_SS_N_2_Silkworm.id # Multiple options for the required SAMs so campaign designers can more # accurately see the coverage of their IADS for the expected type. REQUIRED_LONG_RANGE_SAM_UNIT_TYPES = { - AirDefence.SAM_Patriot_LN_M901.id, - AirDefence.SAM_SA_10_S_300PS_LN_5P85C.id, - AirDefence.SAM_SA_10_S_300PS_LN_5P85D.id, + AirDefence.SAM_Patriot_LN.id, + AirDefence.SAM_SA_10_S_300_Grumble_TEL_C.id, + AirDefence.SAM_SA_10_S_300_Grumble_TEL_D.id, } REQUIRED_MEDIUM_RANGE_SAM_UNIT_TYPES = { AirDefence.SAM_Hawk_LN_M192.id, - AirDefence.SAM_SA_2_LN_SM_90.id, - AirDefence.SAM_SA_3_S_125_LN_5P73.id, + AirDefence.SAM_SA_2_S_75_Guideline_LN.id, + AirDefence.SAM_SA_3_S_125_Goa_LN.id, } + REQUIRED_EWR_UNIT_TYPE = AirDefence.EWR_1L13.id + BASE_DEFENSE_RADIUS = nautical_miles(2) def __init__(self, miz: Path, theater: ConflictTheater) -> None: @@ -245,6 +249,18 @@ class MizCampaignLoader: if group.units[0].type in self.REQUIRED_MEDIUM_RANGE_SAM_UNIT_TYPES: yield group + @property + def required_ewrs(self) -> Iterator[VehicleGroup]: + for group in self.red.vehicle_group: + if group.units[0].type in self.REQUIRED_EWR_UNIT_TYPE: + yield group + + @property + def helipads(self) -> Iterator[StaticGroup]: + for group in self.blue.static_group: + if group.units[0].type == self.FARP_HELIPAD: + yield group + @cached_property def control_points(self) -> Dict[int, ControlPoint]: control_points = {} @@ -270,7 +286,7 @@ class MizCampaignLoader: control_point.captured_invert = group.late_activation control_points[control_point.id] = control_point for group in self.lhas(blue): - # TODO: Name the LHA. + # TODO: Name the LHA.db control_point = Lha("lha", group.position, next(self.control_point_id)) control_point.captured = blue control_point.captured_invert = group.late_activation @@ -329,44 +345,81 @@ class MizCampaignLoader: for group in self.garrisons: closest, distance = self.objective_info(group) if distance < self.BASE_DEFENSE_RADIUS: - closest.preset_locations.base_garrisons.append(group.position) + closest.preset_locations.base_garrisons.append( + PointWithHeading.from_point(group.position, group.units[0].heading) + ) else: logging.warning(f"Found garrison unit too far from base: {group.name}") for group in self.sams: closest, distance = self.objective_info(group) if distance < self.BASE_DEFENSE_RADIUS: - closest.preset_locations.base_air_defense.append(group.position) + closest.preset_locations.base_air_defense.append( + PointWithHeading.from_point(group.position, group.units[0].heading) + ) else: - closest.preset_locations.strike_locations.append(group.position) + closest.preset_locations.strike_locations.append( + PointWithHeading.from_point(group.position, group.units[0].heading) + ) for group in self.ewrs: closest, distance = self.objective_info(group) - closest.preset_locations.ewrs.append(group.position) + if distance < self.BASE_DEFENSE_RADIUS: + closest.preset_locations.ewrs.append( + PointWithHeading.from_point(group.position, group.units[0].heading) + ) + else: + closest.preset_locations.ewrs.append( + PointWithHeading.from_point(group.position, group.units[0].heading) + ) for group in self.offshore_strike_targets: closest, distance = self.objective_info(group) - closest.preset_locations.offshore_strike_locations.append(group.position) + closest.preset_locations.offshore_strike_locations.append( + PointWithHeading.from_point(group.position, group.units[0].heading) + ) for group in self.ships: closest, distance = self.objective_info(group) - closest.preset_locations.ships.append(group.position) + closest.preset_locations.ships.append( + PointWithHeading.from_point(group.position, group.units[0].heading) + ) for group in self.missile_sites: closest, distance = self.objective_info(group) - closest.preset_locations.missile_sites.append(group.position) + closest.preset_locations.missile_sites.append( + PointWithHeading.from_point(group.position, group.units[0].heading) + ) for group in self.coastal_defenses: closest, distance = self.objective_info(group) - closest.preset_locations.coastal_defenses.append(group.position) + closest.preset_locations.coastal_defenses.append( + PointWithHeading.from_point(group.position, group.units[0].heading) + ) for group in self.required_long_range_sams: closest, distance = self.objective_info(group) - closest.preset_locations.required_long_range_sams.append(group.position) + closest.preset_locations.required_long_range_sams.append( + PointWithHeading.from_point(group.position, group.units[0].heading) + ) for group in self.required_medium_range_sams: closest, distance = self.objective_info(group) - closest.preset_locations.required_medium_range_sams.append(group.position) + closest.preset_locations.required_medium_range_sams.append( + PointWithHeading.from_point(group.position, group.units[0].heading) + ) + + for group in self.required_ewrs: + closest, distance = self.objective_info(group) + closest.preset_locations.required_ewrs.append( + PointWithHeading.from_point(group.position, group.units[0].heading) + ) + + for group in self.helipads: + closest, distance = self.objective_info(group) + closest.helipads.append( + PointWithHeading.from_point(group.position, group.units[0].heading) + ) def populate_theater(self) -> None: for control_point in self.control_points.values(): @@ -677,8 +730,8 @@ class PersianGulfTheater(ConflictTheater): terrain = persiangulf.PersianGulf() overview_image = "persiangulf.gif" reference_points = ( - ReferencePoint(persiangulf.Jiroft_Airport.position, Point(1692, 1343)), - ReferencePoint(persiangulf.Liwa_Airbase.position, Point(358, 3238)), + ReferencePoint(persiangulf.Jiroft.position, Point(1692, 1343)), + ReferencePoint(persiangulf.Liwa_AFB.position, Point(358, 3238)), ) landmap = load_landmap("resources\\gulflandmap.p") daytime_map = { @@ -811,6 +864,7 @@ class FrontLine(MissionTarget): def mission_types(self, for_player: bool) -> Iterator[FlightType]: yield from [ FlightType.CAS, + FlightType.AEWC, # TODO: FlightType.TROOP_TRANSPORT # TODO: FlightType.EVAC ] diff --git a/game/theater/controlpoint.py b/game/theater/controlpoint.py index 90bae500..f2a95200 100644 --- a/game/theater/controlpoint.py +++ b/game/theater/controlpoint.py @@ -4,7 +4,6 @@ import heapq import itertools import logging import random -import re from abc import ABC, abstractmethod from dataclasses import dataclass, field from enum import Enum @@ -28,6 +27,7 @@ from gen.ground_forces.combat_stance import CombatStance from gen.runways import RunwayAssigner, RunwayData from .base import Base from .missiontarget import MissionTarget +from game.point_with_heading import PointWithHeading from .theatergroundobject import ( BaseDefenseGroundObject, EwrGroundObject, @@ -77,38 +77,41 @@ class PresetLocations: """Defines the preset locations loaded from the campaign mission file.""" #: Locations used for spawning ground defenses for bases. - base_garrisons: List[Point] = field(default_factory=list) + base_garrisons: List[PointWithHeading] = field(default_factory=list) #: Locations used for spawning air defenses for bases. Used by SAMs, AAA, #: and SHORADs. - base_air_defense: List[Point] = field(default_factory=list) + base_air_defense: List[PointWithHeading] = field(default_factory=list) #: Locations used by EWRs. - ewrs: List[Point] = field(default_factory=list) + ewrs: List[PointWithHeading] = field(default_factory=list) #: Locations used by non-carrier ships. Carriers and LHAs are not random. - ships: List[Point] = field(default_factory=list) + ships: List[PointWithHeading] = field(default_factory=list) #: Locations used by coastal defenses. - coastal_defenses: List[Point] = field(default_factory=list) + coastal_defenses: List[PointWithHeading] = field(default_factory=list) #: Locations used by ground based strike objectives. - strike_locations: List[Point] = field(default_factory=list) + strike_locations: List[PointWithHeading] = field(default_factory=list) #: Locations used by offshore strike objectives. - offshore_strike_locations: List[Point] = field(default_factory=list) + offshore_strike_locations: List[PointWithHeading] = field(default_factory=list) #: Locations used by missile sites like scuds and V-2s. - missile_sites: List[Point] = field(default_factory=list) + missile_sites: List[PointWithHeading] = field(default_factory=list) #: Locations of long range SAMs which should always be spawned. - required_long_range_sams: List[Point] = field(default_factory=list) + required_long_range_sams: List[PointWithHeading] = field(default_factory=list) #: Locations of medium range SAMs which should always be spawned. - required_medium_range_sams: List[Point] = field(default_factory=list) + required_medium_range_sams: List[PointWithHeading] = field(default_factory=list) + + #: Locations of EWRs which should always be spawned. + required_ewrs: List[PointWithHeading] = field(default_factory=list) @staticmethod - def _random_from(points: List[Point]) -> Optional[Point]: + def _random_from(points: List[PointWithHeading]) -> Optional[PointWithHeading]: """Finds, removes, and returns a random position from the given list.""" if not points: return None @@ -116,7 +119,7 @@ class PresetLocations: points.remove(point) return point - def random_for(self, location_type: LocationType) -> Optional[Point]: + def random_for(self, location_type: LocationType) -> Optional[PointWithHeading]: """Returns a position suitable for the given location type. The location, if found, will be claimed by the caller and not available @@ -250,6 +253,7 @@ class ControlPoint(MissionTarget, ABC): self.connected_objectives: List[TheaterGroundObject] = [] self.base_defenses: List[BaseDefenseGroundObject] = [] self.preset_locations = PresetLocations() + self.helipads: List[PointWithHeading] = [] # TODO: Should be Airbase specific. self.size = size @@ -386,18 +390,19 @@ class ControlPoint(MissionTarget, ABC): # TODO: Should be Airbase specific. def clear_base_defenses(self) -> None: for base_defense in self.base_defenses: + p = PointWithHeading.from_point(base_defense.position, base_defense.heading) if isinstance(base_defense, EwrGroundObject): - self.preset_locations.ewrs.append(base_defense.position) + self.preset_locations.ewrs.append(p) elif isinstance(base_defense, SamGroundObject): - self.preset_locations.base_air_defense.append(base_defense.position) + self.preset_locations.base_air_defense.append(p) elif isinstance(base_defense, VehicleGroupGroundObject): - self.preset_locations.base_garrisons.append(base_defense.position) + self.preset_locations.base_garrisons.append(p) else: logging.error( "Could not determine preset location type for " f"{base_defense}. Assuming garrison type." ) - self.preset_locations.base_garrisons.append(base_defense.position) + self.preset_locations.base_garrisons.append(p) self.base_defenses = [] def capture_equipment(self, game: Game) -> None: @@ -633,6 +638,15 @@ class ControlPoint(MissionTarget, ABC): def income_per_turn(self) -> int: return 0 + def mission_types(self, for_player: bool) -> Iterator[FlightType]: + from gen.flights.flight import FlightType + + if self.is_friendly(for_player): + yield from [ + FlightType.AEWC, + ] + yield from super().mission_types(for_player) + @property def has_active_frontline(self) -> bool: return any(not c.is_friendly(self.captured) for c in self.connected_points) diff --git a/game/theater/start_generator.py b/game/theater/start_generator.py index 39905bb4..5316b9c8 100644 --- a/game/theater/start_generator.py +++ b/game/theater/start_generator.py @@ -13,7 +13,7 @@ from dcs.vehicles import AirDefence from game import Game, db from game.factions.faction import Faction -from game.theater import Carrier, Lha, LocationType +from game.theater import Carrier, Lha, LocationType, PointWithHeading from game.theater.theatergroundobject import ( BuildingGroundObject, CarrierGroundObject, @@ -23,9 +23,11 @@ from game.theater.theatergroundobject import ( SamGroundObject, ShipGroundObject, VehicleGroupGroundObject, + CoastalSiteGroundObject, ) from game.version import VERSION from gen import namegen +from gen.coastal.coastal_group_generator import generate_coastal_group from gen.defenses.armor_group_generator import generate_armor_group from gen.fleet.ship_group_generator import ( generate_carrier_group, @@ -35,10 +37,8 @@ from gen.fleet.ship_group_generator import ( from gen.locations.preset_location_finder import MizDataLocationFinder from gen.missiles.missiles_group_generator import generate_missile_group from gen.sam.airdefensegroupgenerator import AirDefenseRange -from gen.sam.sam_group_generator import ( - generate_anti_air_group, - generate_ewr_group, -) +from gen.sam.sam_group_generator import generate_anti_air_group +from gen.sam.ewr_group_generator import generate_ewr_group from . import ( ConflictTheater, ControlPoint, @@ -148,13 +148,13 @@ class LocationFinder: game.theater.terrain.name, control_point.full_name ) - def location_for(self, location_type: LocationType) -> Optional[Point]: + def location_for(self, location_type: LocationType) -> Optional[PointWithHeading]: position = self.control_point.preset_locations.random_for(location_type) if position is not None: return position logging.warning( - f"No campaign location for %s at %s", + f"No campaign location for %s Mat %s", location_type.value, self.control_point, ) @@ -178,7 +178,7 @@ class LocationFinder: ) return None - def random_from_miz_data(self, offshore: bool) -> Optional[Point]: + def random_from_miz_data(self, offshore: bool) -> Optional[PointWithHeading]: if offshore: locations = self.miz_data.offshore_locations else: @@ -186,11 +186,18 @@ class LocationFinder: if self.miz_data.offshore_locations: preset = random.choice(locations) locations.remove(preset) - return preset.position + return PointWithHeading.from_point(preset.position, preset.heading) return None - def random_position(self, location_type: LocationType) -> Optional[Point]: + def random_position( + self, location_type: LocationType + ) -> Optional[PointWithHeading]: # TODO: Flesh out preset locations so we never hit this case. + + if location_type == LocationType.Coastal: + # No coastal locations generated randomly + return None + logging.warning( "Falling back to random location for %s at %s", location_type.value, @@ -250,7 +257,7 @@ class LocationFinder: on_ground: bool, is_base_defense: bool, avoid_others: bool, - ) -> Optional[Point]: + ) -> Optional[PointWithHeading]: """ Find a valid ground object location :param on_ground: Whether it should be on ground or on sea (True = on @@ -263,7 +270,7 @@ class LocationFinder: near = self.control_point.position others = self.control_point.ground_objects - def is_valid(point: Optional[Point]) -> bool: + def is_valid(point: Optional[PointWithHeading]) -> bool: if point is None: return False @@ -294,7 +301,9 @@ class LocationFinder: for _ in range(300): # Check if on land or sea - p = near.random_point_within(max_range, min_range) + p = PointWithHeading.from_point( + near.random_point_within(max_range, min_range), random.randint(0, 360) + ) if is_valid(p): return p return None @@ -453,7 +462,11 @@ class BaseDefenseGenerator: group_id = self.game.next_group_id() g = EwrGroundObject( - namegen.random_objective_name(), group_id, position, self.control_point + namegen.random_objective_name(), + group_id, + position, + self.control_point, + True, ) group = generate_ewr_group(self.game, g, self.faction) @@ -590,11 +603,15 @@ class AirbaseGroundObjectGenerator(ControlPointGroundObjectGenerator): if self.faction.missiles: self.generate_missile_sites() + if self.faction.coastal_defenses: + self.generate_coastal_sites() + return True def generate_ground_points(self) -> None: """Generate ground objects and AA sites for the control point.""" skip_sams = self.generate_required_aa() + skip_ewrs = self.generate_required_ewr() if self.control_point.is_global: return @@ -611,6 +628,12 @@ class AirbaseGroundObjectGenerator(ControlPointGroundObjectGenerator): skip_sams -= 1 else: self.generate_aa_site() + # 1 in 4 additional objectives are EWR. + elif random.randint(0, 3) == 0: + if skip_ewrs > 0: + skip_ewrs -= 1 + else: + self.generate_ewr_site() else: self.generate_ground_point() @@ -642,6 +665,17 @@ class AirbaseGroundObjectGenerator(ControlPointGroundObjectGenerator): presets.required_medium_range_sams ) + def generate_required_ewr(self) -> int: + """Generates the EWR sites that are required by the campaign. + + Returns: + The number of EWR sites that were generated. + """ + presets = self.control_point.preset_locations + for position in presets.required_ewrs: + self.generate_ewr_at(position) + return len(presets.required_ewrs) + def generate_ground_point(self) -> None: try: category = random.choice(self.faction.building_set) @@ -719,6 +753,33 @@ class AirbaseGroundObjectGenerator(ControlPointGroundObjectGenerator): g.groups = groups self.control_point.connected_objectives.append(g) + def generate_ewr_site(self) -> None: + position = self.location_finder.location_for(LocationType.Ewr) + if position is None: + return + self.generate_ewr_at(position) + + def generate_ewr_at(self, position: Point) -> None: + group_id = self.game.next_group_id() + + g = EwrGroundObject( + namegen.random_objective_name(), + group_id, + position, + self.control_point, + for_airbase=False, + ) + group = generate_ewr_group(self.game, g, self.faction) + if group is None: + logging.error( + "Could not generate ewr group for %s at %s", + g.name, + self.control_point, + ) + return + g.groups = [group] + self.control_point.connected_objectives.append(g) + def generate_missile_sites(self) -> None: for i in range(self.faction.missiles_group_count): self.generate_missile_site() @@ -740,6 +801,31 @@ class AirbaseGroundObjectGenerator(ControlPointGroundObjectGenerator): self.control_point.connected_objectives.append(g) return + def generate_coastal_sites(self) -> None: + for i in range(self.faction.coastal_group_count): + self.generate_coastal_site() + + def generate_coastal_site(self) -> None: + position = self.location_finder.location_for(LocationType.Coastal) + if position is None: + return + + group_id = self.game.next_group_id() + + g = CoastalSiteGroundObject( + namegen.random_objective_name(), + group_id, + position, + self.control_point, + position.heading, + ) + group = generate_coastal_group(self.game, g, self.faction_name) + g.groups = [] + if group is not None: + g.groups.append(group) + self.control_point.connected_objectives.append(g) + return + class FobGroundObjectGenerator(AirbaseGroundObjectGenerator): def generate(self) -> bool: diff --git a/game/theater/theatergroundobject.py b/game/theater/theatergroundobject.py index 1dcfd3d5..c476a90b 100644 --- a/game/theater/theatergroundobject.py +++ b/game/theater/theatergroundobject.py @@ -344,6 +344,28 @@ class MissileSiteGroundObject(TheaterGroundObject): ) +class CoastalSiteGroundObject(TheaterGroundObject): + def __init__( + self, + name: str, + group_id: int, + position: Point, + control_point: ControlPoint, + heading, + ) -> None: + super().__init__( + name=name, + category="aa", + group_id=group_id, + position=position, + heading=heading, + control_point=control_point, + dcs_identifier="AA", + airbase_group=False, + sea_object=False, + ) + + class BaseDefenseGroundObject(TheaterGroundObject): """Base type for all base defenses.""" @@ -420,7 +442,12 @@ class VehicleGroupGroundObject(BaseDefenseGroundObject): class EwrGroundObject(BaseDefenseGroundObject): def __init__( - self, name: str, group_id: int, position: Point, control_point: ControlPoint + self, + name: str, + group_id: int, + position: Point, + control_point: ControlPoint, + for_airbase: bool, ) -> None: super().__init__( name=name, @@ -430,7 +457,7 @@ class EwrGroundObject(BaseDefenseGroundObject): heading=0, control_point=control_point, dcs_identifier="EWR", - airbase_group=True, + airbase_group=for_airbase, sea_object=False, ) diff --git a/game/threatzones.py b/game/threatzones.py index 865acf2f..85169f17 100644 --- a/game/threatzones.py +++ b/game/threatzones.py @@ -15,6 +15,7 @@ from shapely.ops import nearest_points, unary_union from game.theater import ControlPoint from game.utils import Distance, meters, nautical_miles +from gen import Conflict from gen.flights.closestairfields import ObjectiveDistanceCache from gen.flights.flight import Flight @@ -131,7 +132,7 @@ class ThreatZones: zone belongs to the player, it is the zone that will be avoided by the enemy and vice versa. """ - airbases = [] + air_threats = [] air_defenses = [] for control_point in game.theater.controlpoints: if control_point.captured != player: @@ -139,7 +140,7 @@ class ThreatZones: if control_point.runway_is_operational(): point = ShapelyPoint(control_point.position.x, control_point.position.y) cap_threat_range = cls.barcap_threat_range(game, control_point) - airbases.append(point.buffer(cap_threat_range.meters)) + air_threats.append(point.buffer(cap_threat_range.meters)) for tgo in control_point.ground_objects: for group in tgo.groups: @@ -151,8 +152,25 @@ class ThreatZones: threat_zone = point.buffer(threat_range.meters) air_defenses.append(threat_zone) + for front_line in game.theater.conflicts(player): + vector = Conflict.frontline_vector( + front_line.control_point_a, front_line.control_point_b, game.theater + ) + + start = vector[0] + end = vector[0].point_from_heading(vector[1], vector[2]) + + line = LineString( + [ + ShapelyPoint(start.x, start.y), + ShapelyPoint(end.x, end.y), + ] + ) + doctrine = game.faction_for(player).doctrine + air_threats.append(line.buffer(doctrine.cap_engagement_range.meters)) + return cls( - airbases=unary_union(airbases), air_defenses=unary_union(air_defenses) + airbases=unary_union(air_threats), air_defenses=unary_union(air_defenses) ) @staticmethod diff --git a/game/version.py b/game/version.py index a9c28681..4d54004e 100644 --- a/game/version.py +++ b/game/version.py @@ -2,7 +2,7 @@ from pathlib import Path def _build_version_string() -> str: - components = ["2.4.3"] + components = ["2.5"] build_number_path = Path("resources/buildnumber") if build_number_path.exists(): with build_number_path.open("r") as build_number_file: diff --git a/game/weather.py b/game/weather.py index c7d33c39..fc077634 100644 --- a/game/weather.py +++ b/game/weather.py @@ -3,11 +3,12 @@ from __future__ import annotations import datetime import logging import random -from dataclasses import dataclass +from dataclasses import dataclass, field from enum import Enum from typing import Optional, TYPE_CHECKING -from dcs.weather import Weather as PydcsWeather, Wind +from dcs.cloud_presets import Clouds as PydcsClouds +from dcs.weather import CloudPreset, Weather as PydcsWeather, Wind from game.settings import Settings from game.utils import Distance, meters @@ -36,6 +37,23 @@ class Clouds: density: int thickness: int precipitation: PydcsWeather.Preceptions + preset: Optional[CloudPreset] = field(default=None) + + @classmethod + def random_preset(cls, rain: bool) -> Clouds: + clouds = (p.value for p in PydcsClouds) + if rain: + presets = [p for p in clouds if "Rain" in p.name] + else: + presets = [p for p in clouds if "Rain" not in p.name] + preset = random.choice(presets) + return Clouds( + base=random.randint(preset.min_base, preset.max_base), + density=0, + thickness=0, + precipitation=PydcsWeather.Preceptions.None_, + preset=preset, + ) @dataclass(frozen=True) @@ -101,12 +119,11 @@ class ClearSkies(Weather): class Cloudy(Weather): def generate_clouds(self) -> Optional[Clouds]: - return Clouds( - base=self.random_cloud_base(), - density=random.randint(1, 8), - thickness=self.random_cloud_thickness(), - precipitation=PydcsWeather.Preceptions.None_, - ) + return Clouds.random_preset(rain=False) + + def generate_fog(self) -> Optional[Fog]: + # DCS 2.7 says to not use fog with the cloud presets. + return None def generate_wind(self) -> WindConditions: return self.random_wind(0, 4) @@ -114,12 +131,11 @@ class Cloudy(Weather): class Raining(Weather): def generate_clouds(self) -> Optional[Clouds]: - return Clouds( - base=self.random_cloud_base(), - density=random.randint(5, 8), - thickness=self.random_cloud_thickness(), - precipitation=PydcsWeather.Preceptions.Rain, - ) + return Clouds.random_preset(rain=True) + + def generate_fog(self) -> Optional[Fog]: + # DCS 2.7 says to not use fog with the cloud presets. + return None def generate_wind(self) -> WindConditions: return self.random_wind(0, 6) diff --git a/gen/aircraft.py b/gen/aircraft.py index 08744489..024a49c4 100644 --- a/gen/aircraft.py +++ b/gen/aircraft.py @@ -2,7 +2,7 @@ from __future__ import annotations import logging import random -from dataclasses import dataclass +from dataclasses import dataclass, field from datetime import timedelta from functools import cached_property from typing import Dict, List, Optional, TYPE_CHECKING, Type, Union @@ -41,6 +41,7 @@ from dcs.planes import ( ) from dcs.point import MovingPoint, PointAction from dcs.task import ( + AWACS, AntishipStrike, AttackGroup, Bombing, @@ -66,6 +67,8 @@ from dcs.task import ( Targets, Task, WeaponType, + AWACSTaskAction, + SetFrequencyCommand, ) from dcs.terrain.terrain import Airport, NoParkingSlotError from dcs.triggers import Event, TriggerOnce, TriggerRule @@ -87,10 +90,8 @@ from game.theater.controlpoint import ( from game.theater.theatergroundobject import TheaterGroundObject from game.unitmap import UnitMap from game.utils import Distance, meters, nautical_miles -from gen.airsupportgen import AirSupport from gen.ato import AirTaskingOrder, Package from gen.callsigns import create_group_callsign_from_unit -from gen.conflictgen import FRONTLINE_LENGTH from gen.flights.flight import ( Flight, FlightType, @@ -104,9 +105,12 @@ from .flights.flightplan import ( LoiterFlightPlan, PatrollingFlightPlan, SweepFlightPlan, + AwacsFlightPlan, ) from .flights.traveltime import GroundSpeed, TotEstimator from .naming import namegen +from .airsupportgen import AirSupport, AwacsInfo +from .callsigns import callsign_for_support_unit if TYPE_CHECKING: from game import Game @@ -134,6 +138,7 @@ TARGET_WAYPOINTS = ( FlightWaypointType.TARGET_SHIP, ) + # TODO: Get radio information for all the special cases. def get_fallback_channel(unit_type: UnitType) -> RadioFrequency: if unit_type in helicopter_map.values() and unit_type != UH_1H: @@ -318,6 +323,7 @@ class FlightData: intra_flight_channel: RadioFrequency, bingo_fuel: Optional[int], joker_fuel: Optional[int], + custom_name: Optional[str], ) -> None: self.package = package self.country = country @@ -335,6 +341,7 @@ class FlightData: self.bingo_fuel = bingo_fuel self.joker_fuel = joker_fuel self.callsign = create_group_callsign_from_unit(self.units[0]) + self.custom_name = custom_name @property def client_units(self) -> List[FlyingUnit]: @@ -649,6 +656,12 @@ AIRCRAFT_DATA: Dict[str, AircraftData] = { ), channel_namer=HueyChannelNamer, ), + "F-22A": AircraftData( + inter_flight_radio=get_radio("SCR-522"), + intra_flight_radio=get_radio("SCR-522"), + channel_allocator=None, + channel_namer=SCR522ChannelNamer, + ), } AIRCRAFT_DATA["A-10C_2"] = AIRCRAFT_DATA["A-10C"] AIRCRAFT_DATA["P-51D-30-NA"] = AIRCRAFT_DATA["P-51D"] @@ -663,6 +676,7 @@ class AircraftConflictGenerator: game: Game, radio_registry: RadioRegistry, unit_map: UnitMap, + air_support: AirSupport, ) -> None: self.m = mission self.game = game @@ -670,6 +684,7 @@ class AircraftConflictGenerator: self.radio_registry = radio_registry self.unit_map = unit_map self.flights: List[FlightData] = [] + self.air_support = air_support @cached_property def use_client(self) -> bool: @@ -784,7 +799,10 @@ class AircraftConflictGenerator: OptReactOnThreat(OptReactOnThreat.Values.EvadeFire) ) - channel = self.get_intra_flight_channel(unit_type) + if flight.flight_type == FlightType.AEWC: + channel = self.radio_registry.alloc_uhf() + else: + channel = self.get_intra_flight_channel(unit_type) group.set_frequency(channel.mhz) divert = None @@ -813,6 +831,7 @@ class AircraftConflictGenerator: intra_flight_channel=channel, bingo_fuel=flight.flight_plan.bingo_fuel, joker_fuel=flight.flight_plan.joker_fuel, + custom_name=flight.custom_name, ) ) @@ -820,6 +839,20 @@ class AircraftConflictGenerator: if unit_type in [Su_33, C_101EB, C_101CC]: self.set_reduced_fuel(flight, group, unit_type) + if isinstance(flight.flight_plan, AwacsFlightPlan): + callsign = callsign_for_support_unit(group) + + self.air_support.awacs.append( + AwacsInfo( + dcsGroupName=str(group.name), + callsign=callsign, + freq=channel, + depature_location=flight.departure.name, + end_time=flight.flight_plan.mission_departure_time, + start_time=flight.flight_plan.mission_start_time, + ) + ) + def _generate_at_airport( self, name: str, @@ -1344,6 +1377,33 @@ class AircraftConflictGenerator: restrict_jettison=True, ) + def configure_awacs( + self, + group: FlyingGroup, + package: Package, + flight: Flight, + dynamic_runways: Dict[str, RunwayData], + ) -> None: + group.task = AWACS.name + + if not isinstance(flight.flight_plan, AwacsFlightPlan): + logging.error( + f"Cannot configure AEW&C tasks for {flight} because it does not have an AEW&C flight plan." + ) + return + + self._setup_group(group, AWACS, package, flight, dynamic_runways) + + # Awacs task action + self.configure_behavior( + group, + react_on_threat=OptReactOnThreat.Values.EvadeFire, + roe=OptROE.Values.WeaponHold, + restrict_jettison=True, + ) + + group.points[0].tasks.append(AWACSTaskAction()) + def configure_escort( self, group: FlyingGroup, @@ -1380,6 +1440,8 @@ class AircraftConflictGenerator: self.configure_cap(group, package, flight, dynamic_runways) elif flight_type == FlightType.SWEEP: self.configure_sweep(group, package, flight, dynamic_runways) + elif flight_type == FlightType.AEWC: + self.configure_awacs(group, package, flight, dynamic_runways) elif flight_type in [FlightType.CAS, FlightType.BAI]: self.configure_cas(group, package, flight, dynamic_runways) elif flight_type == FlightType.DEAD: diff --git a/gen/airfields.py b/gen/airfields.py index d0bb4d54..2903e72d 100644 --- a/gen/airfields.py +++ b/gen/airfields.py @@ -383,8 +383,8 @@ AIRFIELD_DATA = { "31": ("IVZ", MHz(108, 750)), }, ), - # TODO : PERSIAN GULF MAP - "Liwa Airbase": AirfieldData( + # PERSIAN GULF MAP + "Liwa AFB": AirfieldData( theater="Persian Gulf", icao="OMLW", elevation=400, @@ -394,7 +394,7 @@ AIRFIELD_DATA = { vor=("OMLW", MHz(117, 400)), atc=AtcData(MHz(4, 225), MHz(39, 350), MHz(119, 300), MHz(250, 950)), ), - "Al Dhafra AB": AirfieldData( + "Al Dhafra AFB": AirfieldData( theater="Persian Gulf", icao="OMAM", elevation=52, @@ -402,50 +402,50 @@ AIRFIELD_DATA = { tacan=TacanChannel(96, TacanBand.X), tacan_callsign="MA", vor=("MA", MHz(114, 900)), - atc=AtcData(MHz(4, 250), MHz(39, 400), MHz(126, 500), MHz(251, 000)), + atc=AtcData(MHz(4, 300), MHz(39, 500), MHz(126, 500), MHz(251, 100)), ils={ "13": ("MMA", MHz(111, 100)), "31": ("IMA", MHz(109, 100)), }, ), - "Al-Bateen Airport": AirfieldData( + "Al-Bateen": AirfieldData( theater="Persian Gulf", icao="OMAD", elevation=11, runway_length=6808, vor=("ALB", MHz(114, 0)), - atc=AtcData(MHz(4, 25), MHz(38, 950), MHz(119, 900), MHz(250, 550)), + atc=AtcData(MHz(4, 75), MHz(39, 50), MHz(119, 900), MHz(250, 600)), ), - "Sas Al Nakheel Airport": AirfieldData( + "Sas Al Nakheel": AirfieldData( theater="Persian Gulf", icao="OMNK", elevation=9, runway_length=5387, vor=("SAS", MHz(128, 930)), - atc=AtcData(MHz(3, 975), MHz(38, 850), MHz(128, 900), MHz(250, 450)), + atc=AtcData(MHz(4, 0), MHz(38, 900), MHz(128, 900), MHz(250, 450)), ), - "Abu Dhabi International Airport": AirfieldData( + "Abu Dhabi Intl": AirfieldData( theater="Persian Gulf", icao="OMAA", elevation=91, runway_length=12817, vor=("ADV", MHz(114, 250)), - atc=AtcData(MHz(4, 000), MHz(38, 900), MHz(119, 200), MHz(250, 500)), + atc=AtcData(MHz(4, 50), MHz(39, 0), MHz(119, 200), MHz(250, 550)), ), - "Al Ain International Airport": AirfieldData( + "Al Ain Intl": AirfieldData( theater="Persian Gulf", icao="OMAL", elevation=813, runway_length=11267, vor=("ALN", MHz(112, 600)), - atc=AtcData(MHz(4, 75), MHz(39, 50), MHz(119, 850), MHz(250, 650)), + atc=AtcData(MHz(4, 125), MHz(39, 150), MHz(119, 850), MHz(250, 700)), ), "Al Maktoum Intl": AirfieldData( theater="Persian Gulf", icao="OMDW", elevation=123, runway_length=11500, - atc=AtcData(MHz(4, 300), MHz(39, 500), MHz(118, 650), MHz(251, 100)), + atc=AtcData(MHz(4, 350), MHz(39, 600), MHz(118, 600), MHz(251, 200)), ils={ "30": ("IJWA", MHz(109, 750)), "12": ("IMA", MHz(111, 750)), @@ -458,7 +458,7 @@ AIRFIELD_DATA = { runway_length=11865, tacan=TacanChannel(99, TacanBand.X), tacan_callsign="MIN", - atc=AtcData(MHz(3, 800), MHz(38, 500), MHz(121, 800), MHz(250, 100)), + atc=AtcData(MHz(3, 800), MHz(38, 500), MHz(118, 550), MHz(250, 100)), ils={ "27": ("IMNR", MHz(110, 750)), "9": ("IMNW", MHz(110, 700)), @@ -469,7 +469,7 @@ AIRFIELD_DATA = { icao="OMDB", elevation=16, runway_length=11018, - atc=AtcData(MHz(4, 275), MHz(39, 450), MHz(118, 750), MHz(251, 50)), + atc=AtcData(MHz(4, 325), MHz(39, 550), MHz(118, 750), MHz(251, 150)), ils={ "30": ("IDBL", MHz(110, 900)), "12": ("IDBR", MHz(110, 100)), @@ -480,7 +480,7 @@ AIRFIELD_DATA = { icao="OMSJ", elevation=98, runway_length=10535, - atc=AtcData(MHz(3, 850), MHz(38, 600), MHz(118, 600), MHz(252, 200)), + atc=AtcData(MHz(3, 850), MHz(38, 600), MHz(118, 600), MHz(250, 200)), ils={ "30": ("ISHW", MHz(111, 950)), "12": ("ISRE", MHz(108, 550)), @@ -492,18 +492,18 @@ AIRFIELD_DATA = { elevation=60, runway_length=9437, vor=("FJV", MHz(113, 800)), - atc=AtcData(MHz(4, 325), MHz(39, 550), MHz(124, 600), MHz(251, 150)), + atc=AtcData(MHz(4, 375), MHz(39, 650), MHz(124, 600), MHz(251, 250)), ils={ "29": ("IFJR", MHz(111, 500)), }, ), - "Ras AL Khaimah": AirfieldData( + "Ras Al Khaimah Intl": AirfieldData( theater="Persian Gulf", icao="OMRK", elevation=70, runway_length=8406, vor=("OMRK", MHz(113, 600)), - atc=AtcData(MHz(4, 150), MHz(39, 200), MHz(121, 600), MHz(250, 800)), + atc=AtcData(MHz(4, 200), MHz(39, 300), MHz(121, 600), MHz(250, 900)), ), "Khasab": AirfieldData( theater="Persian Gulf", @@ -516,7 +516,11 @@ AIRFIELD_DATA = { }, ), "Sir Abu Nuayr": AirfieldData( - theater="Persian Gulf", icao="OMSN", elevation=25, runway_length=2229 + theater="Persian Gulf", + icao="OMSN", + elevation=25, + runway_length=2229, + atc=AtcData(MHz(3, 900), MHz(38, 700), MHz(118, 0), MHz(250, 800)), ), "Sirri Island": AirfieldData( theater="Persian Gulf", @@ -526,7 +530,7 @@ AIRFIELD_DATA = { vor=("SIR", MHz(113, 750)), atc=AtcData(MHz(3, 875), MHz(38, 650), MHz(135, 50), MHz(250, 250)), ), - "Abu Musa Island Airport": AirfieldData( + "Abu Musa Island": AirfieldData( theater="Persian Gulf", icao="OIBA", elevation=16, @@ -555,13 +559,13 @@ AIRFIELD_DATA = { vor=("KHM", MHz(117, 100)), atc=AtcData(MHz(3, 825), MHz(38, 550), MHz(118, 50), MHz(250, 150)), ), - "Bandar-e-Jask airfield": AirfieldData( + "Bandar-e-Jask": AirfieldData( theater="Persian Gulf", icao="OIZJ", elevation=26, runway_length=6842, vor=("KHM", MHz(116, 300)), - atc=AtcData(MHz(3, 825), MHz(38, 550), MHz(118, 50), MHz(250, 150)), + atc=AtcData(MHz(4, 25), MHz(38, 950), MHz(118, 150), MHz(250, 500)), ), "Bandar Lengeh": AirfieldData( theater="Persian Gulf", @@ -569,26 +573,26 @@ AIRFIELD_DATA = { elevation=80, runway_length=7625, vor=("LEN", MHz(114, 800)), - atc=AtcData(MHz(4, 225), MHz(39, 350), MHz(121, 700), MHz(250, 950)), + atc=AtcData(MHz(4, 275), MHz(39, 450), MHz(121, 700), MHz(251, 50)), ), - "Kish International Airport": AirfieldData( + "Kish Intl": AirfieldData( theater="Persian Gulf", icao="OIBK", elevation=114, runway_length=10617, tacan=TacanChannel(112, TacanBand.X), tacan_callsign="KIH", - atc=AtcData(MHz(4, 50), MHz(39, 000), MHz(121, 650), MHz(250, 600)), + atc=AtcData(MHz(4, 100), MHz(39, 100), MHz(121, 650), MHz(250, 650)), ), - "Lavan Island Airport": AirfieldData( + "Lavan Island": AirfieldData( theater="Persian Gulf", icao="OIBV", elevation=75, runway_length=8234, vor=("LVA", MHz(116, 850)), - atc=AtcData(MHz(4, 100), MHz(39, 100), MHz(128, 550), MHz(250, 700)), + atc=AtcData(MHz(4, 150), MHz(39, 200), MHz(128, 550), MHz(250, 750)), ), - "Lar Airbase": AirfieldData( + "Lar": AirfieldData( theater="Persian Gulf", icao="OISL", elevation=2635, @@ -603,7 +607,7 @@ AIRFIELD_DATA = { runway_length=7300, tacan=TacanChannel(47, TacanBand.X), tacan_callsign="HDR", - atc=AtcData(MHz(4, 350), MHz(39, 600), MHz(123, 150), MHz(251, 200)), + atc=AtcData(MHz(4, 400), MHz(39, 700), MHz(123, 150), MHz(251, 300)), ils={ "8": ("IBHD", MHz(108, 900)), }, @@ -616,19 +620,19 @@ AIRFIELD_DATA = { tacan=TacanChannel(78, TacanBand.X), tacan_callsign="BND", vor=("BND", MHz(117, 200)), - atc=AtcData(MHz(4, 200), MHz(39, 300), MHz(118, 100), MHz(250, 900)), + atc=AtcData(MHz(4, 250), MHz(39, 401), MHz(118, 100), MHz(251, 0)), ils={ "21": ("IBND", MHz(333, 800)), }, ), - "Jiroft Airport": AirfieldData( + "Jiroft": AirfieldData( theater="Persian Gulf", icao="OIKJ", elevation=2664, runway_length=9160, atc=AtcData(MHz(4, 125), MHz(39, 120), MHz(136, 0), MHz(250, 750)), ), - "Kerman Airport": AirfieldData( + "Kerman": AirfieldData( theater="Persian Gulf", icao="OIKK", elevation=5746, @@ -636,9 +640,9 @@ AIRFIELD_DATA = { tacan=TacanChannel(97, TacanBand.X), tacan_callsign="KER", vor=("KER", MHz(112, 0)), - atc=AtcData(MHz(3, 900), MHz(38, 700), MHz(118, 250), MHz(250, 300)), + atc=AtcData(MHz(3, 925), MHz(38, 750), MHz(118, 250), MHz(250, 300)), ), - "Shiraz International Airport": AirfieldData( + "Shiraz Intl": AirfieldData( theater="Persian Gulf", icao="OISS", elevation=4878, @@ -646,7 +650,7 @@ AIRFIELD_DATA = { tacan=TacanChannel(94, TacanBand.X), tacan_callsign="SYZ1", vor=("SYZ", MHz(112, 0)), - atc=AtcData(MHz(3, 925), MHz(38, 750), MHz(121, 900), MHz(250, 350)), + atc=AtcData(MHz(3, 950), MHz(38, 800), MHz(121, 900), MHz(250, 350)), ), # Syria Map "Adana Sakirpasa": AirfieldData( @@ -655,7 +659,7 @@ AIRFIELD_DATA = { elevation=55, runway_length=8115, vor=("ADA", MHz(112, 700)), - atc=AtcData(MHz(4, 225), MHz(39, 350), MHz(121, 100), MHz(250, 900)), + atc=AtcData(MHz(4, 275), MHz(39, 450), MHz(121, 100), MHz(251, 0)), ils={ "05": ("IADA", MHz(108, 700)), }, @@ -668,7 +672,7 @@ AIRFIELD_DATA = { tacan=TacanChannel(21, TacanBand.X), tacan_callsign="DAN", vor=("DAN", MHz(108, 400)), - atc=AtcData(MHz(3, 850), MHz(38, 600), MHz(129, 400), MHz(360, 100)), + atc=AtcData(MHz(3, 900), MHz(38, 700), MHz(122, 100), MHz(360, 100)), ils={ "50": ("IDAN", MHz(109, 300)), "23": ("DANM", MHz(111, 700)), @@ -679,7 +683,7 @@ AIRFIELD_DATA = { icao="OS71", elevation=1614, runway_length=4648, - atc=AtcData(MHz(4, 125), MHz(39, 150), MHz(120, 600), MHz(250, 700)), + atc=AtcData(MHz(4, 175), MHz(39, 250), MHz(120, 600), MHz(250, 800)), ), "Hatay": AirfieldData( theater="Syria", @@ -687,7 +691,7 @@ AIRFIELD_DATA = { elevation=253, runway_length=9052, vor=("HTY", MHz(112, 500)), - atc=AtcData(MHz(3, 825), MHz(38, 550), MHz(128, 500), MHz(250, 150)), + atc=AtcData(MHz(3, 875), MHz(38, 650), MHz(128, 500), MHz(250, 250)), ils={ "22": ("IHTY", MHz(108, 150)), "04": ("IHAT", MHz(108, 900)), @@ -698,25 +702,21 @@ AIRFIELD_DATA = { icao="OS66", elevation=1200, runway_length=6662, - atc=AtcData(MHz(4, 275), MHz(39, 450), MHz(120, 500), MHz(251)), + atc=AtcData(MHz(4, 325), MHz(39, 550), MHz(120, 500), MHz(251, 100)), ), "Aleppo": AirfieldData( theater="Syria", icao="OSAP", elevation=1253, runway_length=8332, - atc=AtcData(MHz(4, 150), MHz(39, 200), MHz(119, 100), MHz(250, 750)), - ils={ - "50": ("IDAN", MHz(109, 300)), - "23": ("DANM", MHz(111, 700)), - }, + atc=AtcData(MHz(4, 200), MHz(39, 300), MHz(119, 100), MHz(250, 850)), ), "Jirah": AirfieldData( theater="Syria", icao="OS62", elevation=1170, runway_length=9090, - atc=AtcData(MHz(3, 875), MHz(38, 650), MHz(118, 100), MHz(250, 200)), + atc=AtcData(MHz(3, 925), MHz(38, 750), MHz(118, 100), MHz(250, 300)), ), "Taftanaz": AirfieldData( theater="Syria", @@ -729,14 +729,14 @@ AIRFIELD_DATA = { icao="OS59", elevation=1083, runway_length=9036, - atc=AtcData(MHz(4, 350), MHz(39, 600), MHz(118, 500), MHz(251, 150)), + atc=AtcData(MHz(4, 500), MHz(39, 900), MHz(122, 800), MHz(251, 450)), ), "Abu al-Dahur": AirfieldData( theater="Syria", icao="OS57", elevation=820, runway_length=8728, - atc=AtcData(MHz(3, 950), MHz(38, 800), MHz(122, 200), MHz(250, 350)), + atc=AtcData(MHz(4, 0), MHz(38, 900), MHz(122, 200), MHz(250, 450)), ), "Bassel Al-Assad": AirfieldData( theater="Syria", @@ -744,7 +744,7 @@ AIRFIELD_DATA = { elevation=93, runway_length=7305, vor=("LTK", MHz(114, 800)), - atc=AtcData(MHz(4), MHz(38, 900), MHz(118, 100), MHz(250, 450)), + atc=AtcData(MHz(4, 50), MHz(39, 0), MHz(118, 100), MHz(250, 550)), ils={ "17": ("IBA", MHz(109, 100)), }, @@ -754,28 +754,28 @@ AIRFIELD_DATA = { icao="OS58", elevation=983, runway_length=7957, - atc=AtcData(MHz(3, 800), MHz(38, 500), MHz(118, 50), MHz(250, 100)), + atc=AtcData(MHz(3, 850), MHz(38, 600), MHz(118, 50), MHz(250, 200)), ), "Rene Mouawad": AirfieldData( theater="Syria", icao="OLKA", elevation=14, runway_length=8614, - atc=AtcData(MHz(4, 325), MHz(39, 550), MHz(129, 500), MHz(251, 100)), + atc=AtcData(MHz(4, 375), MHz(39, 650), MHz(121, 0), MHz(251, 200)), ), "Al Quasayr": AirfieldData( theater="Syria", icao="OS70", elevation=1729, runway_length=8585, - atc=AtcData(MHz(4, 400), MHz(39, 700), MHz(119, 200), MHz(251, 250)), + atc=AtcData(MHz(4, 550), MHz(40, 0), MHz(119, 200), MHz(251, 550)), ), "Palmyra": AirfieldData( theater="Syria", icao="OSPR", elevation=1267, runway_length=8704, - atc=AtcData(MHz(4, 175), MHz(39, 250), MHz(121, 900), MHz(250, 800)), + atc=AtcData(MHz(4, 225), MHz(39, 350), MHz(121, 900), MHz(250, 900)), ), "Wujah Al Hajar": AirfieldData( theater="Syria", @@ -783,14 +783,14 @@ AIRFIELD_DATA = { elevation=619, runway_length=4717, vor=("CAK", MHz(116, 200)), - atc=AtcData(MHz(4, 425), MHz(39, 750), MHz(121, 500), MHz(251, 300)), + atc=AtcData(MHz(4, 575), MHz(40, 50), MHz(121, 500), MHz(251, 600)), ), "An Nasiriyah": AirfieldData( theater="Syria", icao="OS64", elevation=2746, runway_length=8172, - atc=AtcData(MHz(4, 450), MHz(39, 800), MHz(122, 300), MHz(251, 350)), + atc=AtcData(MHz(4, 600), MHz(40, 100), MHz(122, 300), MHz(251, 650)), ), "Rayak": AirfieldData( theater="Syria", @@ -798,7 +798,7 @@ AIRFIELD_DATA = { elevation=2934, runway_length=8699, vor=("HTY", MHz(124, 400)), - atc=AtcData(MHz(4, 300), MHz(39, 500), MHz(124, 400), MHz(251, 50)), + atc=AtcData(MHz(4, 350), MHz(39, 600), MHz(124, 400), MHz(251, 150)), ), "Beirut-Rafic Hariri": AirfieldData( theater="Syria", @@ -806,7 +806,7 @@ AIRFIELD_DATA = { elevation=39, runway_length=9463, vor=("KAD", MHz(112, 600)), - atc=AtcData(MHz(4, 475), MHz(39, 850), MHz(118, 900), MHz(251, 400)), + atc=AtcData(MHz(4, 675), MHz(40, 250), MHz(118, 900), MHz(251, 800)), ils={ "17": ("BIL", MHz(109, 500)), }, @@ -816,32 +816,32 @@ AIRFIELD_DATA = { icao="OS61", elevation=2066, runway_length=8902, - atc=AtcData(MHz(4, 550), MHz(40), MHz(120, 300), MHz(251, 550)), + atc=AtcData(MHz(4, 750), MHz(40, 400), MHz(120, 300), MHz(251, 950)), ), "Marj as Sultan North": AirfieldData( theater="Syria", elevation=2007, runway_length=268, - atc=AtcData(MHz(4, 25), MHz(38, 950), MHz(122, 700), MHz(250, 500)), + atc=AtcData(MHz(4, 75), MHz(38, 50), MHz(122, 700), MHz(250, 600)), ), "Marj as Sultan South": AirfieldData( theater="Syria", elevation=2007, runway_length=166, - atc=AtcData(MHz(4, 525), MHz(39, 950), MHz(122, 900), MHz(251, 500)), + atc=AtcData(MHz(4, 725), MHz(40, 350), MHz(122, 900), MHz(251, 900)), ), "Mezzeh": AirfieldData( theater="Syria", icao="OS67", elevation=2355, runway_length=7522, - atc=AtcData(MHz(4, 100), MHz(39, 100), MHz(120, 700), MHz(250, 650)), + atc=AtcData(MHz(4, 150), MHz(39, 200), MHz(120, 700), MHz(250, 750)), ), "Qabr as Sitt": AirfieldData( theater="Syria", elevation=2134, runway_length=489, - atc=AtcData(MHz(4, 200), MHz(39, 300), MHz(122, 600), MHz(250, 850)), + atc=AtcData(MHz(4, 250), MHz(39, 400), MHz(122, 600), MHz(250, 950)), ), "Damascus": AirfieldData( theater="Syria", @@ -849,7 +849,7 @@ AIRFIELD_DATA = { elevation=2007, runway_length=11423, vor=("DAM", MHz(116)), - atc=AtcData(MHz(4, 500), MHz(39, 900), MHz(118, 500), MHz(251, 450)), + atc=AtcData(MHz(4, 700), MHz(40, 300), MHz(118, 500), MHz(251, 850)), ils={ "24": ("IDA", MHz(109, 900)), }, @@ -859,42 +859,42 @@ AIRFIELD_DATA = { icao="OS63", elevation=2160, runway_length=7576, - atc=AtcData(MHz(4, 50), MHz(39), MHz(120, 800), MHz(250, 550)), + atc=AtcData(MHz(4, 100), MHz(39, 100), MHz(120, 800), MHz(250, 6550)), ), "Kiryat Shmona": AirfieldData( theater="Syria", icao="LLKS", elevation=328, runway_length=3258, - atc=AtcData(MHz(3, 975), MHz(38, 850), MHz(118, 400), MHz(250, 400)), + atc=AtcData(MHz(4, 25), MHz(38, 950), MHz(118, 400), MHz(250, 500)), ), "Khalkhalah": AirfieldData( theater="Syria", icao="OS69", elevation=2337, runway_length=8248, - atc=AtcData(MHz(3, 900), MHz(38, 700), MHz(122, 500), MHz(250, 250)), + atc=AtcData(MHz(3, 950), MHz(38, 800), MHz(122, 500), MHz(250, 350)), ), "Haifa": AirfieldData( theater="Syria", icao="LLHA", elevation=19, runway_length=3253, - atc=AtcData(MHz(3, 775), MHz(38, 450), MHz(127, 800), MHz(250, 50)), + atc=AtcData(MHz(3, 825), MHz(38, 550), MHz(127, 800), MHz(250, 150)), ), "Ramat David": AirfieldData( theater="Syria", icao="LLRD", elevation=105, runway_length=7037, - atc=AtcData(MHz(4, 250), MHz(39, 400), MHz(118, 600), MHz(250, 950)), + atc=AtcData(MHz(4, 300), MHz(39, 500), MHz(118, 600), MHz(251, 50)), ), "Megiddo": AirfieldData( theater="Syria", icao="LLMG", elevation=180, runway_length=6098, - atc=AtcData(MHz(4, 75), MHz(39, 50), MHz(119, 900), MHz(250, 600)), + atc=AtcData(MHz(4, 125), MHz(39, 150), MHz(119, 900), MHz(250, 700)), ), "Eyn Shemer": AirfieldData( theater="Syria", @@ -908,7 +908,66 @@ AIRFIELD_DATA = { icao="OJMF", elevation=2204, runway_length=8595, - atc=AtcData(MHz(3, 925), MHz(38, 750), MHz(118, 300), MHz(250, 300)), + atc=AtcData(MHz(3, 975), MHz(38, 850), MHz(118, 300), MHz(250, 400)), + ), + "Tha'lah": AirfieldData( + theater="Syria", + icao="OS60", + elevation=2381, + runway_length=8025, + atc=AtcData(MHz(4, 650), MHz(40, 200), MHz(122, 400), MHz(251, 750)), + ), + "Shayrat": AirfieldData( + theater="Syria", + icao="OS60", + elevation=2637, + runway_length=8553, + atc=AtcData(MHz(4, 450), MHz(39, 800), MHz(122, 200), MHz(251, 350)), + ), + "Tiyas": AirfieldData( + theater="Syria", + icao="OS72", + elevation=1797, + runway_length=9420, + atc=AtcData(MHz(4, 525), MHz(39, 950), MHz(120, 500), MHz(251, 500)), + ), + "Rosh Pina": AirfieldData( + theater="Syria", + icao="LLIB", + elevation=865, + runway_length=2711, + atc=AtcData(MHz(4, 400), MHz(39, 700), MHz(118, 450), MHz(251, 250)), + ), + "Sayqal": AirfieldData( + theater="Syria", + icao="OS68", + elevation=2273, + runway_length=8536, + atc=AtcData(MHz(4, 425), MHz(39, 750), MHz(120, 400), MHz(251, 300)), + ), + "H4": AirfieldData( + theater="Syria", + icao="OJHR", + elevation=2257, + runway_length=7179, + atc=AtcData(MHz(3, 800), MHz(38, 500), MHz(120, 400), MHz(250, 100)), + ), + "Naqoura": AirfieldData( + theater="Syria", + icao="", + elevation=378, + runway_length=0, + atc=AtcData(MHz(4, 625), MHz(40, 150), MHz(122, 000), MHz(251, 700)), + ), + "Gaziantep": AirfieldData( + theater="Syria", + icao="LTAJ", + elevation=2287, + runway_length=8871, + atc=AtcData(MHz(3, 775), MHz(38, 450), MHz(120, 100), MHz(250, 50)), + ils={ + "28": ("IGNP", MHz(109, 10)), + }, ), # NTTR "Mina Airport 3Q0": AirfieldData( @@ -1304,55 +1363,73 @@ AIRFIELD_DATA = { "Detling": AirfieldData( theater="Channel", elevation=623, - runway_length=2557, - atc=AtcData(MHz(3, 950), MHz(118, 400), MHz(38, 800), MHz(250, 400)), + runway_length=3482, + atc=AtcData(MHz(4, 50), MHz(118, 600), MHz(39, 0), MHz(250, 600)), ), "High Halden": AirfieldData( theater="Channel", elevation=104, runway_length=3296, - atc=AtcData(MHz(3, 750), MHz(118, 800), MHz(38, 400), MHz(250, 0)), + atc=AtcData(MHz(3, 800), MHz(118, 100), MHz(38, 500), MHz(250, 100)), ), "Lympne": AirfieldData( theater="Channel", elevation=351, - runway_length=2548, - atc=AtcData(MHz(3, 925), MHz(118, 350), MHz(38, 750), MHz(250, 350)), + runway_length=3054, + atc=AtcData(MHz(4, 25), MHz(118, 550), MHz(38, 950), MHz(250, 550)), ), "Hawkinge": AirfieldData( theater="Channel", elevation=524, runway_length=3013, - atc=AtcData(MHz(3, 900), MHz(118, 300), MHz(38, 700), MHz(250, 300)), + atc=AtcData(MHz(4, 0), MHz(118, 500), MHz(38, 900), MHz(250, 500)), ), "Manston": AirfieldData( theater="Channel", elevation=160, runway_length=8626, - atc=AtcData(MHz(3, 875), MHz(118, 250), MHz(38, 650), MHz(250, 250)), + atc=AtcData(MHz(3, 975), MHz(118, 250), MHz(38, 650), MHz(250, 250)), ), "Dunkirk Mardyck": AirfieldData( theater="Channel", elevation=16, runway_length=1737, - atc=AtcData(MHz(3, 850), MHz(118, 200), MHz(38, 600), MHz(250, 200)), + atc=AtcData(MHz(3, 950), MHz(118, 450), MHz(38, 850), MHz(250, 450)), ), "Saint Omer Longuenesse": AirfieldData( theater="Channel", elevation=219, runway_length=1929, - atc=AtcData(MHz(3, 825), MHz(118, 150), MHz(38, 550), MHz(250, 150)), + atc=AtcData(MHz(3, 925), MHz(118, 350), MHz(38, 750), MHz(250, 350)), ), "Merville Calonne": AirfieldData( theater="Channel", elevation=52, runway_length=7580, - atc=AtcData(MHz(3, 800), MHz(118, 100), MHz(38, 500), MHz(250, 100)), + atc=AtcData(MHz(3, 900), MHz(118, 300), MHz(38, 700), MHz(250, 300)), ), "Abbeville Drucat": AirfieldData( theater="Channel", elevation=183, runway_length=4726, + atc=AtcData(MHz(3, 875), MHz(118, 250), MHz(38, 650), MHz(250, 250)), + ), + "Eastchurch": AirfieldData( + theater="Channel", + elevation=30, + runway_length=2983, atc=AtcData(MHz(3, 775), MHz(118, 50), MHz(38, 450), MHz(250, 50)), ), + "Headcorn": AirfieldData( + theater="Channel", + elevation=114, + runway_length=3680, + atc=AtcData(MHz(3, 825), MHz(118, 150), MHz(38, 550), MHz(250, 150)), + ), + "Biggin Hill": AirfieldData( + theater="Channel", + elevation=552, + runway_length=3953, + atc=AtcData(MHz(3, 850), MHz(118, 200), MHz(38, 600), MHz(250, 200)), + ), } diff --git a/gen/airsupportgen.py b/gen/airsupportgen.py index 9cdd4a34..a0d9f75e 100644 --- a/gen/airsupportgen.py +++ b/gen/airsupportgen.py @@ -1,6 +1,7 @@ import logging from dataclasses import dataclass, field -from typing import List, Type, Tuple +from datetime import timedelta +from typing import List, Type, Tuple, Optional from dcs.mission import Mission, StartType from dcs.planes import IL_78M, KC130, KC135MPRS, KC_135 @@ -21,6 +22,7 @@ from .conflictgen import Conflict from .radios import RadioFrequency, RadioRegistry from .tacan import TacanBand, TacanChannel, TacanRegistry + TANKER_DISTANCE = 15000 TANKER_ALT = 4572 TANKER_HEADING_OFFSET = 45 @@ -36,6 +38,9 @@ class AwacsInfo: dcsGroupName: str callsign: str freq: RadioFrequency + depature_location: Optional[str] + start_time: Optional[timedelta] + end_time: Optional[timedelta] @dataclass @@ -163,37 +168,41 @@ class AirSupportConflictGenerator: TankerInfo(str(tanker_group.name), callsign, variant, freq, tacan) ) - possible_awacs = db.find_unittype(AWACS, self.conflict.attackers_side) + if not self.game.settings.disable_legacy_aewc: + possible_awacs = db.find_unittype(AWACS, self.conflict.attackers_side) - if len(possible_awacs) > 0: - awacs_unit = possible_awacs[0] - freq = self.radio_registry.alloc_uhf() + if len(possible_awacs) > 0: + awacs_unit = possible_awacs[0] + freq = self.radio_registry.alloc_uhf() - awacs_flight = self.mission.awacs_flight( - country=self.mission.country(self.game.player_country), - name=namegen.next_awacs_name( - self.mission.country(self.game.player_country) - ), - plane_type=awacs_unit, - altitude=AWACS_ALT, - airport=None, - position=self.conflict.position.random_point_within( - AWACS_DISTANCE, AWACS_DISTANCE - ), - frequency=freq.mhz, - start_type=StartType.Warm, - ) - awacs_flight.set_frequency(freq.mhz) - - awacs_flight.points[0].tasks.append(SetInvisibleCommand(True)) - awacs_flight.points[0].tasks.append(SetImmortalCommand(True)) - - self.air_support.awacs.append( - AwacsInfo( - str(awacs_flight.name), - callsign_for_support_unit(awacs_flight), - freq, + awacs_flight = self.mission.awacs_flight( + country=self.mission.country(self.game.player_country), + name=namegen.next_awacs_name( + self.mission.country(self.game.player_country) + ), + plane_type=awacs_unit, + altitude=AWACS_ALT, + airport=None, + position=self.conflict.position.random_point_within( + AWACS_DISTANCE, AWACS_DISTANCE + ), + frequency=freq.mhz, + start_type=StartType.Warm, ) - ) - else: - logging.warning("No AWACS for faction") + awacs_flight.set_frequency(freq.mhz) + + awacs_flight.points[0].tasks.append(SetInvisibleCommand(True)) + awacs_flight.points[0].tasks.append(SetImmortalCommand(True)) + + self.air_support.awacs.append( + AwacsInfo( + dcsGroupName=str(awacs_flight.name), + callsign=callsign_for_support_unit(awacs_flight), + freq=freq, + depature_location=None, + start_time=None, + end_time=None, + ) + ) + else: + logging.warning("No AWACS for faction") diff --git a/gen/ato.py b/gen/ato.py index f76e667a..da58430f 100644 --- a/gen/ato.py +++ b/gen/ato.py @@ -175,6 +175,7 @@ class Package: FlightType.SEAD, FlightType.TARCAP, FlightType.BARCAP, + FlightType.AEWC, FlightType.SWEEP, FlightType.ESCORT, ] diff --git a/gen/briefinggen.py b/gen/briefinggen.py index b1246c78..017c4e4e 100644 --- a/gen/briefinggen.py +++ b/gen/briefinggen.py @@ -20,6 +20,7 @@ from .ground_forces.combat_stance import CombatStance from .radios import RadioFrequency from .runways import RunwayData + if TYPE_CHECKING: from game import Game diff --git a/gen/coastal/coastal_group_generator.py b/gen/coastal/coastal_group_generator.py new file mode 100644 index 00000000..160712e0 --- /dev/null +++ b/gen/coastal/coastal_group_generator.py @@ -0,0 +1,31 @@ +import logging +import random +from game import db +from gen.coastal.silkworm import SilkwormGenerator + +COASTAL_MAP = { + "SilkwormGenerator": SilkwormGenerator, +} + + +def generate_coastal_group(game, ground_object, faction_name: str): + """ + This generate a coastal defenses group + :return: Nothing, but put the group reference inside the ground object + """ + faction = db.FACTIONS[faction_name] + if len(faction.coastal_defenses) > 0: + generators = faction.coastal_defenses + if len(generators) > 0: + gen = random.choice(generators) + if gen in COASTAL_MAP.keys(): + generator = COASTAL_MAP[gen](game, ground_object, faction) + generator.generate() + return generator.get_generated_group() + else: + logging.info( + "Unable to generate missile group, generator : " + + str(gen) + + "does not exists" + ) + return None diff --git a/gen/coastal/silkworm.py b/gen/coastal/silkworm.py new file mode 100644 index 00000000..baa751ad --- /dev/null +++ b/gen/coastal/silkworm.py @@ -0,0 +1,58 @@ +from dcs.vehicles import MissilesSS, Unarmed, AirDefence + +from gen.sam.group_generator import GroupGenerator + + +class SilkwormGenerator(GroupGenerator): + def __init__(self, game, ground_object, faction): + super(SilkwormGenerator, self).__init__(game, ground_object) + self.faction = faction + + def generate(self): + + positions = self.get_circular_position(5, launcher_distance=120, coverage=180) + + self.add_unit( + MissilesSS.AShM_Silkworm_SR, + "SR#0", + self.position.x, + self.position.y, + self.heading, + ) + + # Launchers + for i, p in enumerate(positions): + self.add_unit( + MissilesSS.AShM_SS_N_2_Silkworm, + "Missile#" + str(i), + p[0], + p[1], + self.heading, + ) + + # Commander + self.add_unit( + Unarmed.Truck_KAMAZ_43101, + "KAMAZ#0", + self.position.x - 35, + self.position.y - 20, + self.heading, + ) + + # Shorad + self.add_unit( + AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish, + "SHILKA#0", + self.position.x - 55, + self.position.y - 38, + self.heading, + ) + + # Shorad 2 + self.add_unit( + AirDefence.SAM_SA_9_Strela_1_Gaskin_TEL, + "STRELA#0", + self.position.x + 200, + self.position.y + 15, + 90, + ) diff --git a/gen/environmentgen.py b/gen/environmentgen.py index 9d645a1d..5e393e04 100644 --- a/gen/environmentgen.py +++ b/gen/environmentgen.py @@ -17,6 +17,7 @@ class EnvironmentGenerator: self.mission.weather.clouds_thickness = clouds.thickness self.mission.weather.clouds_density = clouds.density self.mission.weather.clouds_iprecptns = clouds.precipitation + self.mission.weather.clouds_preset = clouds.preset def set_fog(self, fog: Optional[Fog]) -> None: if fog is None: diff --git a/gen/fleet/carrier_group.py b/gen/fleet/carrier_group.py index 2ecf869f..318dbef2 100644 --- a/gen/fleet/carrier_group.py +++ b/gen/fleet/carrier_group.py @@ -2,50 +2,122 @@ import random from gen.sam.group_generator import ShipGroupGenerator +from dcs.ships import DDG_Arleigh_Burke_IIa, CG_Ticonderoga + class CarrierGroupGenerator(ShipGroupGenerator): def generate(self): - # Add carrier - if len(self.faction.aircraft_carrier) > 0: + # Carrier Strike Group 8 + if self.faction.carrier_names[0] == "Carrier Strike Group 8": carrier_type = random.choice(self.faction.aircraft_carrier) + self.add_unit( - carrier_type, "Carrier", self.position.x, self.position.y, self.heading + carrier_type, + "CVN-75 Harry S. Truman", + self.position.x, + self.position.y, + self.heading, ) + + # Add Arleigh Burke escort + self.add_unit( + DDG_Arleigh_Burke_IIa, + "USS Ramage", + self.position.x + 6482, + self.position.y + 6667, + self.heading, + ) + + self.add_unit( + DDG_Arleigh_Burke_IIa, + "USS Mitscher", + self.position.x - 7963, + self.position.y + 7037, + self.heading, + ) + + self.add_unit( + DDG_Arleigh_Burke_IIa, + "USS Forrest Sherman", + self.position.x - 7408, + self.position.y - 7408, + self.heading, + ) + + self.add_unit( + DDG_Arleigh_Burke_IIa, + "USS Lassen", + self.position.x + 8704, + self.position.y - 6296, + self.heading, + ) + + # Add Ticonderoga escort + if self.heading >= 180: + self.add_unit( + CG_Ticonderoga, + "USS Hué City", + self.position.x + 2222, + self.position.y - 3333, + self.heading, + ) + else: + self.add_unit( + CG_Ticonderoga, + "USS Hué City", + self.position.x - 3333, + self.position.y + 2222, + self.heading, + ) + + self.get_generated_group().points[0].speed = 20 + ################################################################################################## + # Add carrier for normal generation else: - return + if len(self.faction.aircraft_carrier) > 0: + carrier_type = random.choice(self.faction.aircraft_carrier) + self.add_unit( + carrier_type, + "Carrier", + self.position.x, + self.position.y, + self.heading, + ) + else: + return - # Add destroyers escort - if len(self.faction.destroyers) > 0: - dd_type = random.choice(self.faction.destroyers) - self.add_unit( - dd_type, - "DD1", - self.position.x + 2500, - self.position.y + 4500, - self.heading, - ) - self.add_unit( - dd_type, - "DD2", - self.position.x + 2500, - self.position.y - 4500, - self.heading, - ) + # Add destroyers escort + if len(self.faction.destroyers) > 0: + dd_type = random.choice(self.faction.destroyers) + self.add_unit( + dd_type, + "DD1", + self.position.x + 2500, + self.position.y + 4500, + self.heading, + ) + self.add_unit( + dd_type, + "DD2", + self.position.x + 2500, + self.position.y - 4500, + self.heading, + ) - self.add_unit( - dd_type, - "DD3", - self.position.x + 4500, - self.position.y + 8500, - self.heading, - ) - self.add_unit( - dd_type, - "DD4", - self.position.x + 4500, - self.position.y - 8500, - self.heading, - ) + self.add_unit( + dd_type, + "DD3", + self.position.x + 4500, + self.position.y + 8500, + self.heading, + ) + self.add_unit( + dd_type, + "DD4", + self.position.x + 4500, + self.position.y - 8500, + self.heading, + ) - self.get_generated_group().points[0].speed = 20 + self.get_generated_group().points[0].speed = 20 diff --git a/gen/fleet/dd_group.py b/gen/fleet/dd_group.py index 767eb52a..aed0ef96 100644 --- a/gen/fleet/dd_group.py +++ b/gen/fleet/dd_group.py @@ -6,7 +6,7 @@ from game.theater.theatergroundobject import TheaterGroundObject from gen.sam.group_generator import ShipGroupGenerator from dcs.unittype import ShipType -from dcs.ships import Oliver_Hazzard_Perry_class, USS_Arleigh_Burke_IIa +from dcs.ships import FFG_Oliver_Hazzard_Perry, DDG_Arleigh_Burke_IIa if TYPE_CHECKING: from game.game import Game @@ -46,7 +46,7 @@ class OliverHazardPerryGroupGenerator(DDGroupGenerator): self, game: Game, ground_object: TheaterGroundObject, faction: Faction ): super(OliverHazardPerryGroupGenerator, self).__init__( - game, ground_object, faction, Oliver_Hazzard_Perry_class + game, ground_object, faction, FFG_Oliver_Hazzard_Perry ) @@ -55,5 +55,5 @@ class ArleighBurkeGroupGenerator(DDGroupGenerator): self, game: Game, ground_object: TheaterGroundObject, faction: Faction ): super(ArleighBurkeGroupGenerator, self).__init__( - game, ground_object, faction, USS_Arleigh_Burke_IIa + game, ground_object, faction, DDG_Arleigh_Burke_IIa ) diff --git a/gen/fleet/ru_dd_group.py b/gen/fleet/ru_dd_group.py index e13c8bb2..be98274c 100644 --- a/gen/fleet/ru_dd_group.py +++ b/gen/fleet/ru_dd_group.py @@ -3,13 +3,13 @@ import random from typing import TYPE_CHECKING from dcs.ships import ( - FFL_1124_4_Grisha, - FSG_1241_1MP_Molniya, - FFG_11540_Neustrashimy, - FF_1135M_Rezky, - CG_1164_Moskva, - SSK_877, - SSK_641B, + Corvette_1124_4_Grisha, + Corvette_1241_1_Molniya, + Frigate_11540_Neustrashimy, + Frigate_1135M_Rezky, + Cruiser_1164_Moskva, + SSK_877V_Kilo, + SSK_641B_Tango, ) from gen.fleet.dd_group import DDGroupGenerator @@ -37,7 +37,9 @@ class RussianNavyGroupGenerator(ShipGroupGenerator): include_frigate = True if include_frigate: - frigate_type = random.choice([FFL_1124_4_Grisha, FSG_1241_1MP_Molniya]) + frigate_type = random.choice( + [Corvette_1124_4_Grisha, Corvette_1241_1_Molniya] + ) self.add_unit( frigate_type, "FF1", @@ -54,7 +56,7 @@ class RussianNavyGroupGenerator(ShipGroupGenerator): ) if include_dd: - dd_type = random.choice([FFG_11540_Neustrashimy, FF_1135M_Rezky]) + dd_type = random.choice([Frigate_11540_Neustrashimy, Frigate_1135M_Rezky]) self.add_unit( dd_type, "DD1", @@ -74,7 +76,11 @@ class RussianNavyGroupGenerator(ShipGroupGenerator): # Only include the Moskva for now, the Pyotry Velikiy is an unkillable monster. # See https://github.com/Khopa/dcs_liberation/issues/567 self.add_unit( - CG_1164_Moskva, "CC1", self.position.x, self.position.y, self.heading + Cruiser_1164_Moskva, + "CC1", + self.position.x, + self.position.y, + self.heading, ) self.get_generated_group().points[0].speed = 20 @@ -85,7 +91,7 @@ class GrishaGroupGenerator(DDGroupGenerator): self, game: Game, ground_object: TheaterGroundObject, faction: Faction ): super(GrishaGroupGenerator, self).__init__( - game, ground_object, faction, FFL_1124_4_Grisha + game, ground_object, faction, Corvette_1124_4_Grisha ) @@ -94,7 +100,7 @@ class MolniyaGroupGenerator(DDGroupGenerator): self, game: Game, ground_object: TheaterGroundObject, faction: Faction ): super(MolniyaGroupGenerator, self).__init__( - game, ground_object, faction, FSG_1241_1MP_Molniya + game, ground_object, faction, Corvette_1241_1_Molniya ) @@ -103,7 +109,7 @@ class KiloSubGroupGenerator(DDGroupGenerator): self, game: Game, ground_object: TheaterGroundObject, faction: Faction ): super(KiloSubGroupGenerator, self).__init__( - game, ground_object, faction, SSK_877 + game, ground_object, faction, SSK_877V_Kilo ) @@ -112,5 +118,5 @@ class TangoSubGroupGenerator(DDGroupGenerator): self, game: Game, ground_object: TheaterGroundObject, faction: Faction ): super(TangoSubGroupGenerator, self).__init__( - game, ground_object, faction, SSK_641B + game, ground_object, faction, SSK_641B_Tango ) diff --git a/gen/fleet/schnellboot.py b/gen/fleet/schnellboot.py index 83a83fdf..b1ab4e1d 100644 --- a/gen/fleet/schnellboot.py +++ b/gen/fleet/schnellboot.py @@ -1,6 +1,6 @@ import random -from dcs.ships import Schnellboot_type_S130 +from dcs.ships import Boat_Schnellboot_type_S130 from gen.sam.group_generator import ShipGroupGenerator @@ -10,7 +10,7 @@ class SchnellbootGroupGenerator(ShipGroupGenerator): for i in range(random.randint(2, 4)): self.add_unit( - Schnellboot_type_S130, + Boat_Schnellboot_type_S130, "Schnellboot" + str(i), self.position.x + i * random.randint(100, 250), self.position.y + (random.randint(100, 200) - 100), diff --git a/gen/fleet/ship_group_generator.py b/gen/fleet/ship_group_generator.py index cf495524..024d6e03 100644 --- a/gen/fleet/ship_group_generator.py +++ b/gen/fleet/ship_group_generator.py @@ -47,6 +47,7 @@ def generate_ship_group(game, ground_object, faction_name: str): gen = random.choice(faction.navy_generators) if gen in SHIP_MAP.keys(): generator = SHIP_MAP[gen](game, ground_object, faction) + print(generator.position) generator.generate() return generator.get_generated_group() else: diff --git a/gen/fleet/uboat.py b/gen/fleet/uboat.py index bb736d1e..b3ceb77d 100644 --- a/gen/fleet/uboat.py +++ b/gen/fleet/uboat.py @@ -1,6 +1,6 @@ import random -from dcs.ships import Uboat_VIIC_U_flak +from dcs.ships import U_boat_VIIC_U_flak from gen.sam.group_generator import ShipGroupGenerator @@ -10,7 +10,7 @@ class UBoatGroupGenerator(ShipGroupGenerator): for i in range(random.randint(1, 4)): self.add_unit( - Uboat_VIIC_U_flak, + U_boat_VIIC_U_flak, "Uboat" + str(i), self.position.x + i * random.randint(100, 250), self.position.y + (random.randint(100, 200) - 100), diff --git a/gen/flights/ai_flight_planner.py b/gen/flights/ai_flight_planner.py index 4dde50ce..944f2479 100644 --- a/gen/flights/ai_flight_planner.py +++ b/gen/flights/ai_flight_planner.py @@ -450,6 +450,22 @@ class ObjectiveFinder: c for c in self.game.theater.controlpoints if c.is_friendly(self.is_player) ) + def farthest_friendly_control_point(self) -> ControlPoint: + """ + Iterates over all friendly control points and find the one farthest away from the frontline + BUT! prefer Cvs. Everybody likes CVs! + """ + from_frontline = 0 + + for c in self.game.theater.controlpoints: + if c.is_carrier and c.is_friendly(self.is_player): + return c + if c.is_friendly(self.is_player) and c.has_frontline: + if c.distance_to(self.front_lines().__next__()) > from_frontline: + from_frontline = c.distance_to(self.front_lines().__next__()) + cp = c + return cp + def enemy_control_points(self) -> Iterator[ControlPoint]: """Iterates over all enemy control points.""" return ( @@ -507,6 +523,7 @@ class CoalitionMissionPlanner: MAX_OCA_RANGE = nautical_miles(150) MAX_SEAD_RANGE = nautical_miles(150) MAX_STRIKE_RANGE = nautical_miles(150) + MAX_AWEC_RANGE = nautical_miles(200) def __init__(self, game: Game, is_player: bool) -> None: self.game = game @@ -526,6 +543,13 @@ class CoalitionMissionPlanner: ensure that they can be planned again next turn even if all aircraft are eliminated this turn. """ + + # Find farthest, friendly CP for AEWC + cp = self.objective_finder.farthest_friendly_control_point() + yield ProposedMission( + cp, [ProposedFlight(FlightType.AEWC, 1, self.MAX_AWEC_RANGE)] + ) + # Find friendly CPs within 100 nmi from an enemy airfield, plan CAP. for cp in self.objective_finder.vulnerable_control_points(): # Plan three rounds of CAP to give ~90 minutes coverage. Spacing diff --git a/gen/flights/ai_flight_planner_db.py b/gen/flights/ai_flight_planner_db.py index 11ae08d3..d717bc86 100644 --- a/gen/flights/ai_flight_planner_db.py +++ b/gen/flights/ai_flight_planner_db.py @@ -12,8 +12,8 @@ from dcs.helicopters import ( OH_58D, SA342L, SA342M, - UH_1H, SH_60B, + UH_1H, ) from dcs.planes import ( AJS37, @@ -22,11 +22,14 @@ from dcs.planes import ( A_10C, A_10C_2, A_20G, + A_50, B_17G, B_1B, B_52H, Bf_109K_4, C_101CC, + E_2C, + E_3A, FA_18C_hornet, FW_190A8, FW_190D9, @@ -40,9 +43,11 @@ from dcs.planes import ( F_4E, F_5E_3, F_86F_Sabre, + I_16, JF_17, J_11A, Ju_88A4, + KJ_2000, L_39ZA, MQ_9_Reaper, M_2000C, @@ -54,7 +59,6 @@ from dcs.planes import ( MiG_27K, MiG_29A, MiG_29G, - MiG_29K, MiG_29S, MiG_31, Mirage_2000_5, @@ -88,13 +92,11 @@ from dcs.planes import ( from dcs.unittype import FlyingType from gen.flights.flight import FlightType - from pydcs_extensions.a4ec.a4ec import A_4E_C from pydcs_extensions.f22a.f22a import F_22A -from pydcs_extensions.mb339.mb339 import MB_339PAN -from pydcs_extensions.rafale.rafale import Rafale_A_S, Rafale_M, Rafale_B -from pydcs_extensions.su57.su57 import Su_57 from pydcs_extensions.hercules.hercules import Hercules +from pydcs_extensions.mb339.mb339 import MB_339PAN +from pydcs_extensions.su57.su57 import Su_57 # All aircraft lists are in priority order. Aircraft higher in the list will be # preferred over those lower in the list. @@ -111,14 +113,12 @@ CAP_CAPABLE = [ F_14B, F_14A_135_GR, MiG_25PD, - Rafale_M, Su_33, Su_30, Su_27, J_11A, F_15C, MiG_29S, - MiG_29K, MiG_29G, MiG_29A, F_16C_50, @@ -155,8 +155,8 @@ CAP_CAPABLE = [ # Used for CAS (Close air support) and BAI (Battlefield Interdiction) CAS_CAPABLE = [ A_10C_2, - A_10C, B_1B, + A_10C, F_14B, F_14A_135_GR, Su_25TM, @@ -165,8 +165,6 @@ CAS_CAPABLE = [ F_15E, F_16C_50, FA_18C_hornet, - Rafale_A_S, - Rafale_B, Tornado_GR4, Tornado_IDS, JF_17, @@ -180,6 +178,7 @@ CAS_CAPABLE = [ S_3B, Su_34, Su_30, + MiG_19P, MiG_29S, MiG_27K, MiG_29A, @@ -227,8 +226,6 @@ SEAD_CAPABLE = [ Tornado_IDS, Su_25T, Su_25TM, - Rafale_A_S, - Rafale_B, F_4E, A_4E_C, AV8BNA, @@ -276,8 +273,6 @@ STRIKE_CAPABLE = [ Tu_22M3, F_15E, AJS37, - Rafale_A_S, - Rafale_B, Tornado_GR4, F_16C_50, FA_18C_hornet, @@ -296,7 +291,6 @@ STRIKE_CAPABLE = [ Su_30, Su_27, MiG_29S, - MiG_29K, MiG_29G, MiG_29A, JF_17, @@ -333,8 +327,6 @@ ANTISHIP_CAPABLE = [ AJS37, Tu_22M3, FA_18C_hornet, - Rafale_A_S, - Rafale_B, Su_24M, Su_17M4, JF_17, @@ -369,6 +361,13 @@ TRANSPORT_CAPABLE = [ DRONES = [MQ_9_Reaper, RQ_1A_Predator, WingLoong_I] +AEWC_CAPABLE = [ + E_3A, + E_2C, + A_50, + KJ_2000, +] + def aircraft_for_task(task: FlightType) -> List[Type[FlyingType]]: cap_missions = (FlightType.BARCAP, FlightType.TARCAP) @@ -392,6 +391,8 @@ def aircraft_for_task(task: FlightType) -> List[Type[FlyingType]]: return STRIKE_CAPABLE elif task == FlightType.ESCORT: return CAP_CAPABLE + elif task == FlightType.AEWC: + return AEWC_CAPABLE else: logging.error(f"Unplannable flight type: {task}") return [] diff --git a/gen/flights/flight.py b/gen/flights/flight.py index 8a5985fc..bfcf9f28 100644 --- a/gen/flights/flight.py +++ b/gen/flights/flight.py @@ -20,6 +20,15 @@ if TYPE_CHECKING: class FlightType(Enum): + """Enumeration of mission types. + + The value of each enumeration is the name that will be shown in the UI. + + These values are persisted to the save game as well since they are a part of + each flight and thus a part of the ATO, so changing these values will break + save compat. + """ + TARCAP = "TARCAP" BARCAP = "BARCAP" CAS = "CAS" @@ -33,6 +42,7 @@ class FlightType(Enum): SWEEP = "Fighter sweep" OCA_RUNWAY = "OCA/Runway" OCA_AIRCRAFT = "OCA/Aircraft" + AEWC = "AEW&C" def __str__(self) -> str: return self.value diff --git a/gen/flights/flightplan.py b/gen/flights/flightplan.py index 8be4264a..2b929387 100644 --- a/gen/flights/flightplan.py +++ b/gen/flights/flightplan.py @@ -15,6 +15,8 @@ from datetime import timedelta from functools import cached_property from typing import Iterator, List, Optional, Set, TYPE_CHECKING, Tuple +from dcs.planes import E_3A, E_2C, A_50, KJ_2000 + from dcs.mapping import Point from dcs.unit import Unit from shapely.geometry import Point as ShapelyPoint @@ -29,7 +31,7 @@ from game.theater import ( TheaterGroundObject, ) from game.theater.theatergroundobject import EwrGroundObject -from game.utils import Distance, Speed, meters, nautical_miles +from game.utils import Distance, Speed, feet, meters, nautical_miles from .closestairfields import ObjectiveDistanceCache from .flight import Flight, FlightType, FlightWaypoint, FlightWaypointType from .traveltime import GroundSpeed, TravelTime @@ -278,11 +280,11 @@ class LoiterFlightPlan(FlightPlan): travel_time = super().travel_time_between_waypoints(a, b) if a != self.hold: return travel_time - try: - return travel_time + self.hold_duration - except AttributeError: - # Save compat for 2.3. - return travel_time + timedelta(minutes=5) + return travel_time + self.hold_duration + + @property + def mission_departure_time(self) -> timedelta: + raise NotImplementedError @dataclass(frozen=True) @@ -694,6 +696,45 @@ class SweepFlightPlan(LoiterFlightPlan): return self.sweep_end_time +@dataclass(frozen=True) +class AwacsFlightPlan(LoiterFlightPlan): + takeoff: FlightWaypoint + nav_to: List[FlightWaypoint] + nav_from: List[FlightWaypoint] + land: FlightWaypoint + divert: Optional[FlightWaypoint] + + def iter_waypoints(self) -> Iterator[FlightWaypoint]: + yield self.takeoff + yield from self.nav_to + yield self.hold + yield from self.nav_from + yield self.land + if self.divert is not None: + yield self.divert + + @property + def mission_start_time(self) -> Optional[timedelta]: + return self.takeoff_time() + + def tot_for_waypoint(self, waypoint: FlightWaypoint) -> Optional[timedelta]: + if waypoint == self.hold: + return self.package.time_over_target + return None + + @property + def tot_waypoint(self) -> Optional[FlightWaypoint]: + return self.hold + + @property + def push_time(self) -> timedelta: + return self.package.time_over_target + self.hold_duration + + @property + def mission_departure_time(self) -> timedelta: + return self.push_time + + @dataclass(frozen=True) class CustomFlightPlan(FlightPlan): custom_waypoints: List[FlightWaypoint] @@ -759,7 +800,17 @@ class FlightPlanBuilder: raise RuntimeError("Flight must be a part of the package") if self.package.waypoints is None: self.regenerate_package_waypoints() - flight.flight_plan = self.generate_flight_plan(flight, custom_targets) + + from game.navmesh import NavMeshError + + try: + flight.flight_plan = self.generate_flight_plan(flight, custom_targets) + except NavMeshError as ex: + color = "blue" if self.is_player else "red" + raise PlanningError( + f"Could not plan {color} {flight.flight_type.value} from " + f"{flight.departure} to {flight.package.target}" + ) from ex def generate_flight_plan( self, flight: Flight, custom_targets: Optional[List[Unit]] @@ -790,6 +841,8 @@ class FlightPlanBuilder: return self.generate_sweep(flight) elif task == FlightType.TARCAP: return self.generate_tarcap(flight) + elif task == FlightType.AEWC: + return self.generate_aewc(flight) raise PlanningError(f"{task} flight plan generation not implemented") def regenerate_package_waypoints(self) -> None: @@ -920,6 +973,47 @@ class FlightPlanBuilder: flight, location, FlightWaypointType.INGRESS_STRIKE, targets ) + def generate_aewc(self, flight: Flight) -> AwacsFlightPlan: + """Generate a AWACS flight at a given location. + + Args: + flight: The flight to generate the flight plan for. + """ + location = self.package.target + + start = self.aewc_orbit(location) + + # As high as possible to maximize detection and on-station time. + if flight.unit_type == E_2C: + patrol_alt = feet(30000) + elif flight.unit_type == E_3A: + patrol_alt = feet(35000) + elif flight.unit_type == A_50: + patrol_alt = feet(33000) + elif flight.unit_type == KJ_2000: + patrol_alt = feet(40000) + else: + patrol_alt = feet(25000) + + builder = WaypointBuilder(flight, self.game, self.is_player) + start = builder.orbit(start, patrol_alt) + + return AwacsFlightPlan( + package=self.package, + flight=flight, + takeoff=builder.takeoff(flight.departure), + nav_to=builder.nav_path( + flight.departure.position, start.position, patrol_alt + ), + nav_from=builder.nav_path( + start.position, flight.arrival.position, patrol_alt + ), + land=builder.land(flight.arrival), + divert=builder.divert(flight.divert), + hold=start, + hold_duration=timedelta(hours=4), + ) + def generate_bai(self, flight: Flight) -> StrikeFlightPlan: """Generates a BAI flight plan. @@ -933,7 +1027,8 @@ class FlightPlanBuilder: targets: List[StrikeTarget] = [] for group in location.groups: - targets.append(StrikeTarget(f"{group.name} at {location.name}", group)) + if group.units: + targets.append(StrikeTarget(f"{group.name} at {location.name}", group)) return self.strike_flightplan( flight, location, FlightWaypointType.INGRESS_BAI, targets @@ -1102,6 +1197,22 @@ class FlightPlanBuilder: start = end.point_from_heading(heading - 180, diameter) return start, end + def aewc_orbit(self, location: MissionTarget) -> Point: + # in threat zone + if self.threat_zones.threatened(location.position): + # Borderpoint + closest_boundary = self.threat_zones.closest_boundary(location.position) + + # Heading + Distance to border point + heading = location.position.heading_between_point(closest_boundary) + distance = location.position.distance_to_point(closest_boundary) + + return location.position.point_from_heading(heading, distance) + + # this Part is fine. No threat zone, just use our point + else: + return location.position + def racetrack_for_frontline( self, origin: Point, front_line: FrontLine ) -> Tuple[Point, Point]: diff --git a/gen/flights/waypointbuilder.py b/gen/flights/waypointbuilder.py index d9058538..53fad47c 100644 --- a/gen/flights/waypointbuilder.py +++ b/gen/flights/waypointbuilder.py @@ -14,7 +14,7 @@ from typing import ( from dcs.mapping import Point from dcs.unit import Unit -from dcs.unitgroup import VehicleGroup +from dcs.unitgroup import Group, VehicleGroup if TYPE_CHECKING: from game import Game @@ -32,7 +32,7 @@ from .flight import Flight, FlightWaypoint, FlightWaypointType @dataclass(frozen=True) class StrikeTarget: name: str - target: Union[VehicleGroup, TheaterGroundObject, Unit] + target: Union[VehicleGroup, TheaterGroundObject, Unit, Group] class WaypointBuilder: @@ -161,8 +161,10 @@ class WaypointBuilder: FlightWaypointType.JOIN, position.x, position.y, - meters(500) if self.is_helo else self.doctrine.ingress_altitude, + meters(80) if self.is_helo else self.doctrine.ingress_altitude, ) + if self.is_helo: + waypoint.alt_type = "RADIO" waypoint.pretty_name = "Join" waypoint.description = "Rendezvous with package" waypoint.name = "JOIN" @@ -173,8 +175,10 @@ class WaypointBuilder: FlightWaypointType.SPLIT, position.x, position.y, - meters(500) if self.is_helo else self.doctrine.ingress_altitude, + meters(80) if self.is_helo else self.doctrine.ingress_altitude, ) + if self.is_helo: + waypoint.alt_type = "RADIO" waypoint.pretty_name = "Split" waypoint.description = "Depart from package" waypoint.name = "SPLIT" @@ -190,8 +194,10 @@ class WaypointBuilder: ingress_type, position.x, position.y, - meters(500) if self.is_helo else self.doctrine.ingress_altitude, + meters(50) if self.is_helo else self.doctrine.ingress_altitude, ) + if self.is_helo: + waypoint.alt_type = "RADIO" waypoint.pretty_name = "INGRESS on " + objective.name waypoint.description = "INGRESS on " + objective.name waypoint.name = "INGRESS" @@ -204,8 +210,10 @@ class WaypointBuilder: FlightWaypointType.EGRESS, position.x, position.y, - meters(500) if self.is_helo else self.doctrine.ingress_altitude, + meters(50) if self.is_helo else self.doctrine.ingress_altitude, ) + if self.is_helo: + waypoint.alt_type = "RADIO" waypoint.pretty_name = "EGRESS from " + target.name waypoint.description = "EGRESS from " + target.name waypoint.name = "EGRESS" @@ -286,7 +294,7 @@ class WaypointBuilder: FlightWaypointType.CAS, position.x, position.y, - meters(500) if self.is_helo else meters(1000), + meters(50) if self.is_helo else meters(1000), ) waypoint.alt_type = "RADIO" waypoint.description = "Provide CAS" @@ -341,6 +349,21 @@ class WaypointBuilder: self.race_track_end(end, altitude), ) + @staticmethod + def orbit(start: Point, altitude: Distance) -> FlightWaypoint: + """Creates an circular orbit point. + + Args: + start: Position of the waypoint. + altitude: Altitude of the racetrack. + """ + + waypoint = FlightWaypoint(FlightWaypointType.LOITER, start.x, start.y, altitude) + waypoint.name = "ORBIT" + waypoint.description = "Anchor and hold at this point" + waypoint.pretty_name = "Orbit" + return waypoint + @staticmethod def sweep_start(position: Point, altitude: Distance) -> FlightWaypoint: """Creates a sweep start waypoint. @@ -407,8 +430,10 @@ class WaypointBuilder: FlightWaypointType.TARGET_GROUP_LOC, target.position.x, target.position.y, - meters(500) if self.is_helo else self.doctrine.ingress_altitude, + meters(50) if self.is_helo else self.doctrine.ingress_altitude, ) + if self.is_helo: + waypoint.alt_type = "RADIO" waypoint.name = "TARGET" waypoint.description = "Escort the package" waypoint.pretty_name = "Target area" diff --git a/gen/ground_forces/ai_ground_planner_db.py b/gen/ground_forces/ai_ground_planner_db.py index b34b055b..36c775de 100644 --- a/gen/ground_forces/ai_ground_planner_db.py +++ b/gen/ground_forces/ai_ground_planner_db.py @@ -14,16 +14,16 @@ TYPE_TANKS = [ Armor.MBT_Challenger_II, Armor.MBT_M1A2_Abrams, Armor.MBT_M60A3_Patton, - Armor.MBT_Merkava_Mk__4, + Armor.MBT_Merkava_IV, Armor.ZTZ_96B, # WW2 Armor.MT_Pz_Kpfw_V_Panther_Ausf_G, - Armor.MT_Pz_Kpfw_IV_Ausf_H, + Armor.MT_PzIV_H, Armor.HT_Pz_Kpfw_VI_Tiger_I, Armor.HT_Pz_Kpfw_VI_Ausf__B_Tiger_II, Armor.MT_M4_Sherman, Armor.MT_M4A4_Sherman_Firefly, - Armor.StuG_IV, + Armor.SPG_StuG_IV, Armor.CT_Centaur_IV, Armor.CT_Cromwell_IV, Armor.HIT_Churchill_VII, @@ -40,14 +40,14 @@ TYPE_TANKS = [ ] TYPE_ATGM = [ - Armor.ATGM_M1045_HMMWV_TOW, - Armor.ATGM_M1134_Stryker, + Armor.ATGM_HMMWV, + Armor.ATGM_Stryker, Armor.IFV_BMP_2, # WW2 (Tank Destroyers) - Armor.M30_Cargo_Carrier, - Armor.TD_Jagdpanzer_IV, - Armor.TD_Jagdpanther_G1, - Armor.TD_M10_GMC, + Unarmed.Carrier_M30_Cargo, + Armor.SPG_Jagdpanzer_IV, + Armor.SPG_Jagdpanther_G1, + Armor.SPG_M10_GMC, # Mods frenchpack.VBAE_CRAB_MMP, frenchpack.VAB_MEPHISTO, @@ -59,17 +59,17 @@ TYPE_IFV = [ Armor.IFV_BMP_2, Armor.IFV_BMP_1, Armor.IFV_Marder, - Armor.IFV_MCV_80, + Armor.IFV_Warrior, Armor.IFV_LAV_25, - Armor.SPG_M1128_Stryker_MGS, - Armor.AC_Sd_Kfz_234_2_Puma, + Armor.SPG_Stryker_MGS, + Armor.IFV_Sd_Kfz_234_2_Puma, Armor.IFV_M2A2_Bradley, Armor.IFV_BMD_1, Armor.ZBD_04A, # WW2 - Armor.AC_Sd_Kfz_234_2_Puma, - Armor.LAC_M8_Greyhound, - Armor.Daimler_Armoured_Car, + Armor.IFV_Sd_Kfz_234_2_Puma, + Armor.Car_M8_Greyhound_Armored, + Armor.Car_Daimler_Armored, # Mods frenchpack.ERC_90, frenchpack.VBAE_CRAB, @@ -77,23 +77,23 @@ TYPE_IFV = [ ] TYPE_APC = [ - Armor.APC_M1043_HMMWV_Armament, - Armor.APC_M1126_Stryker_ICV, + Armor.APC_HMMWV__Scout, + Armor.IFV_M1126_Stryker_ICV, Armor.APC_M113, Armor.APC_BTR_80, Armor.APC_BTR_82A, Armor.APC_MTLB, - Armor.APC_M2A1, - Armor.APC_Cobra, - Armor.APC_Sd_Kfz_251, - Armor.APC_AAV_7, - Armor.TPz_Fuchs, - Armor.ARV_BRDM_2, - Armor.ARV_BTR_RD, - Armor.FDDM_Grad, + Armor.APC_M2A1_Halftrack, + Armor.APC_Cobra__Scout, + Armor.APC_Sd_Kfz_251_Halftrack, + Armor.APC_AAV_7_Amphibious, + Armor.APC_TPz_Fuchs, + Armor.IFV_BRDM_2, + Armor.APC_BTR_RD, + Artillery.Grad_MRL_FDDM__FC, # WW2 - Armor.APC_M2A1, - Armor.APC_Sd_Kfz_251, + Armor.APC_M2A1_Halftrack, + Armor.APC_Sd_Kfz_251_Halftrack, # Mods frenchpack.VAB__50, frenchpack.VBL__50, @@ -101,80 +101,82 @@ TYPE_APC = [ ] TYPE_ARTILLERY = [ - Artillery.MLRS_9A52_Smerch, - Artillery.SPH_2S1_Gvozdika, - Artillery.SPH_2S3_Akatsia, - Artillery.MLRS_BM_21_Grad, - Artillery.MLRS_9K57_Uragan_BM_27, - Artillery.SPH_M109_Paladin, - Artillery.MLRS_M270, - Artillery.SPH_2S9_Nona, - Artillery.SpGH_Dana, - Artillery.SPH_2S19_Msta, - Artillery.MLRS_FDDM, + Artillery.MLRS_9A52_Smerch_HE_300mm, + Artillery.SPH_2S1_Gvozdika_122mm, + Artillery.SPH_2S3_Akatsia_152mm, + Artillery.MLRS_BM_21_Grad_122mm, + Artillery.MLRS_BM_27_Uragan_220mm, + Artillery.SPH_M109_Paladin_155mm, + Artillery.MLRS_M270_227mm, + Artillery.SPH_2S9_Nona_120mm_M, + Artillery.SPH_Dana_vz77_152mm, + Artillery.PLZ_05, + Artillery.SPH_2S19_Msta_152mm, + Artillery.MLRS_9A52_Smerch_CM_300mm, # WW2 - Artillery.Sturmpanzer_IV_Brummbär, - Artillery.M12_GMC, + Artillery.SPG_Sturmpanzer_IV_Brummbar, + Artillery.SPG_M12_GMC_155mm, ] TYPE_LOGI = [ - Unarmed.Transport_M818, - Unarmed.Transport_KAMAZ_43101, - Unarmed.Transport_Ural_375, - Unarmed.Transport_GAZ_66, - Unarmed.Transport_GAZ_3307, - Unarmed.Transport_GAZ_3308, - Unarmed.Transport_Ural_4320_31_Armored, - Unarmed.Transport_Ural_4320T, - Unarmed.Blitz_3_6_6700A, - Unarmed.Kübelwagen_82, - Unarmed.Sd_Kfz_7, - Unarmed.Sd_Kfz_2, - Unarmed.Willys_MB, - Unarmed.Land_Rover_109_S3, - Unarmed.Land_Rover_101_FC, + Unarmed.Truck_M818_6x6, + Unarmed.Truck_KAMAZ_43101, + Unarmed.Truck_Ural_375, + Unarmed.Truck_GAZ_66, + Unarmed.Truck_GAZ_3307, + Unarmed.Truck_GAZ_3308, + Unarmed.Truck_Ural_4320_31_Arm_d, + Unarmed.Truck_Ural_4320T, + Unarmed.Truck_Opel_Blitz, + Unarmed.LUV_Kubelwagen_82, + Unarmed.Carrier_Sd_Kfz_7_Tractor, + Unarmed.LUV_Kettenrad, + Unarmed.Car_Willys_Jeep, + Unarmed.LUV_Land_Rover_109, + Unarmed.Truck_Land_Rover_101_FC, # Mods frenchpack.VBL, frenchpack.VAB, ] TYPE_INFANTRY = [ - Infantry.Infantry_Soldier_Insurgents, - Infantry.Soldier_AK, + Infantry.Insurgent_AK_74, + Infantry.Infantry_AK_74, Infantry.Infantry_M1_Garand, Infantry.Infantry_Mauser_98, Infantry.Infantry_SMLE_No_4_Mk_1, - Infantry.Georgian_soldier_with_M4, - Infantry.Infantry_Soldier_Rus, + Infantry.Infantry_M4_Georgia, + Infantry.Infantry_AK_74_Rus, Infantry.Paratrooper_AKS, Infantry.Paratrooper_RPG_16, - Infantry.Soldier_M249, + Infantry.Infantry_M249, Infantry.Infantry_M4, - Infantry.Soldier_RPG, + Infantry.Infantry_RPG, ] TYPE_SHORAD = [ - AirDefence.AAA_ZU_23_on_Ural_375, - AirDefence.AAA_ZU_23_Insurgent_on_Ural_375, - AirDefence.AAA_ZSU_57_2, - AirDefence.SPAAA_ZSU_23_4_Shilka, - AirDefence.SAM_SA_8_Osa_9A33, - AirDefence.SAM_SA_9_Strela_1_9P31, - AirDefence.SAM_SA_13_Strela_10M3_9A35M3, - AirDefence.SAM_SA_15_Tor_9A331, - AirDefence.SAM_SA_19_Tunguska_2S6, + AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375, + AirDefence.SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375, + AirDefence.SPAAA_ZSU_57_2, + AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish, + AirDefence.SAM_SA_8_Osa_Gecko_TEL, + AirDefence.SAM_SA_9_Strela_1_Gaskin_TEL, + AirDefence.SAM_SA_13_Strela_10M3_Gopher_TEL, + AirDefence.SAM_SA_15_Tor_Gauntlet, + AirDefence.SAM_SA_19_Tunguska_Grison, AirDefence.SPAAA_Gepard, - AirDefence.AAA_Vulcan_M163, - AirDefence.SAM_Linebacker_M6, + AirDefence.SPAAA_Vulcan_M163, + AirDefence.SAM_Linebacker___Bradley_M6, AirDefence.SAM_Chaparral_M48, - AirDefence.SAM_Avenger_M1097, + AirDefence.SAM_Avenger__Stinger, AirDefence.SAM_Roland_ADS, AirDefence.HQ_7_Self_Propelled_LN, AirDefence.AAA_8_8cm_Flak_18, AirDefence.AAA_8_8cm_Flak_36, AirDefence.AAA_8_8cm_Flak_37, AirDefence.AAA_8_8cm_Flak_41, - AirDefence.AAA_Bofors_40mm, + AirDefence.AAA_40mm_Bofors, + AirDefence.AAA_S_60_57mm, AirDefence.AAA_M1_37mm, - AirDefence.AA_gun_QF_3_7, + AirDefence.AAA_QF_3_7, ] diff --git a/gen/groundobjectsgen.py b/gen/groundobjectsgen.py index cf7f371d..589bd960 100644 --- a/gen/groundobjectsgen.py +++ b/gen/groundobjectsgen.py @@ -11,9 +11,10 @@ import logging import random from typing import Dict, Iterator, Optional, TYPE_CHECKING, Type, List -from dcs import Mission, Point +from dcs import Mission, Point, unitgroup from dcs.country import Country -from dcs.statics import fortification_map, warehouse_map +from dcs.point import StaticPoint +from dcs.statics import fortification_map, warehouse_map, Warehouse from dcs.task import ( ActivateBeaconCommand, ActivateICLSCommand, @@ -21,7 +22,7 @@ from dcs.task import ( OptAlarmState, FireAtPoint, ) -from dcs.unit import Ship, Unit, Vehicle +from dcs.unit import Ship, Unit, Vehicle, SingleHeliPad, Static from dcs.unitgroup import Group, ShipGroup, StaticGroup, VehicleGroup from dcs.unittype import StaticType, UnitType from dcs.vehicles import vehicle_map @@ -47,7 +48,6 @@ from .tacan import TacanBand, TacanChannel, TacanRegistry if TYPE_CHECKING: from game import Game - FARP_FRONTLINE_DISTANCE = 10000 AA_CP_MIN_DISTANCE = 40000 @@ -402,20 +402,23 @@ class CarrierGenerator(GenericCarrierGenerator): def tacan_callsign(self) -> str: # TODO: Assign these properly. - return random.choice( - [ - "STE", - "CVN", - "CVH", - "CCV", - "ACC", - "ARC", - "GER", - "ABR", - "LIN", - "TRU", - ] - ) + if self.control_point.name == "Carrier Strike Group 8": + return "TRU" + else: + return random.choice( + [ + "STE", + "CVN", + "CVH", + "CCV", + "ACC", + "ARC", + "GER", + "ABR", + "LIN", + "TRU", + ] + ) class LhaGenerator(GenericCarrierGenerator): @@ -474,6 +477,48 @@ class ShipObjectGenerator(GenericGroundObjectGenerator): self._register_unit_group(group_def, group) +class HelipadGenerator: + """ + Generates helipads for given control point + """ + + def __init__( + self, + mission: Mission, + cp: ControlPoint, + game: Game, + radio_registry: RadioRegistry, + tacan_registry: TacanRegistry, + ): + self.m = mission + self.cp = cp + self.game = game + self.radio_registry = radio_registry + self.tacan_registry = tacan_registry + + def generate(self) -> None: + + if self.cp.captured: + country_name = self.game.player_country + else: + country_name = self.game.enemy_country + country = self.m.country(country_name) + + for i, helipad in enumerate(self.cp.helipads): + name = self.cp.name + "_helipad_" + str(i) + logging.info("Generating helipad : " + name) + pad = SingleHeliPad(name=self.m.string(name + "_unit")) + pad.position = Point(helipad.x, helipad.y) + pad.heading = helipad.heading + # pad.heliport_frequency = self.radio_registry.alloc_uhf() TODO : alloc radio & callsign + sg = unitgroup.StaticGroup(self.m.next_group_id(), self.m.string(name)) + sg.add_unit(pad) + sp = StaticPoint() + sp.position = pad.position + sg.add_point(sp) + country.add_static_group(sg) + + class GroundObjectsGenerator: """Creates DCS groups and statics for the theater during mission generation. @@ -507,6 +552,10 @@ class GroundObjectsGenerator: country_name = self.game.enemy_country country = self.m.country(country_name) + HelipadGenerator( + self.m, cp, self.game, self.radio_registry, self.tacan_registry + ).generate() + for ground_object in cp.ground_objects: if isinstance(ground_object, BuildingGroundObject): generator = BuildingSiteGenerator( diff --git a/gen/kneeboard.py b/gen/kneeboard.py index cfc8416e..8f809148 100644 --- a/gen/kneeboard.py +++ b/gen/kneeboard.py @@ -41,6 +41,7 @@ from .flights.flight import FlightWaypoint, FlightWaypointType from .radios import RadioFrequency from .runways import RunwayData + if TYPE_CHECKING: from game import Game @@ -48,17 +49,33 @@ if TYPE_CHECKING: class KneeboardPageWriter: """Creates kneeboard images.""" - def __init__(self, page_margin: int = 24, line_spacing: int = 12) -> None: - self.image = Image.new("RGB", (768, 1024), (0xFF, 0xFF, 0xFF)) + def __init__( + self, page_margin: int = 24, line_spacing: int = 12, dark_theme: bool = False + ) -> None: + if dark_theme: + self.foreground_fill = (215, 200, 200) + self.background_fill = (10, 5, 5) + else: + self.foreground_fill = (15, 15, 15) + self.background_fill = (255, 252, 252) + self.image = Image.new("RGB", (768, 1024), self.background_fill) # These font sizes create a relatively full page for current sorties. If # we start generating more complicated flight plans, or start including # more information in the comm ladder (the latter of which we should # probably do), we'll need to split some of this information off into a # second page. - self.title_font = ImageFont.truetype("arial.ttf", 32) - self.heading_font = ImageFont.truetype("arial.ttf", 24) - self.content_font = ImageFont.truetype("arial.ttf", 20) - self.table_font = ImageFont.truetype("resources/fonts/Inconsolata.otf", 20) + self.title_font = ImageFont.truetype( + "arial.ttf", 32, layout_engine=ImageFont.LAYOUT_BASIC + ) + self.heading_font = ImageFont.truetype( + "arial.ttf", 24, layout_engine=ImageFont.LAYOUT_BASIC + ) + self.content_font = ImageFont.truetype( + "arial.ttf", 20, layout_engine=ImageFont.LAYOUT_BASIC + ) + self.table_font = ImageFont.truetype( + "resources/fonts/Inconsolata.otf", 20, layout_engine=ImageFont.LAYOUT_BASIC + ) self.draw = ImageDraw.Draw(self.image) self.x = page_margin self.y = page_margin @@ -79,10 +96,10 @@ class KneeboardPageWriter: self.y += height + self.line_spacing def title(self, title: str) -> None: - self.text(title, font=self.title_font) + self.text(title, font=self.title_font, fill=self.foreground_fill) def heading(self, text: str) -> None: - self.text(text, font=self.heading_font) + self.text(text, font=self.heading_font, fill=self.foreground_fill) def table( self, cells: List[List[str]], headers: Optional[List[str]] = None @@ -90,7 +107,7 @@ class KneeboardPageWriter: if headers is None: headers = [] table = tabulate(cells, headers=headers, numalign="right") - self.text(table, font=self.table_font) + self.text(table, font=self.table_font, fill=self.foreground_fill) def write(self, path: Path) -> None: self.image.save(path) @@ -237,6 +254,7 @@ class BriefingPage(KneeboardPage): tankers: List[TankerInfo], jtacs: List[JtacInfo], start_time: datetime.datetime, + dark_kneeboard: bool, ) -> None: self.flight = flight self.comms = list(comms) @@ -244,11 +262,16 @@ class BriefingPage(KneeboardPage): self.tankers = tankers self.jtacs = jtacs self.start_time = start_time + self.dark_kneeboard = dark_kneeboard self.comms.append(CommInfo("Flight", self.flight.intra_flight_channel)) def write(self, path: Path) -> None: - writer = KneeboardPageWriter() - writer.title(f"{self.flight.callsign} Mission Info") + writer = KneeboardPageWriter(dark_theme=self.dark_kneeboard) + if self.flight.custom_name is not None: + custom_name_title = ' ("{}")'.format(self.flight.custom_name) + else: + custom_name_title = "" + writer.title(f"{self.flight.callsign} Mission Info{custom_name_title}") # TODO: Handle carriers. writer.heading("Airfield Info") @@ -281,6 +304,34 @@ class BriefingPage(KneeboardPage): ["Bingo", "Joker"], ) + # AEW&C + writer.heading("AEW&C") + aewc_ladder = [] + + for single_aewc in self.awacs: + + if single_aewc.depature_location is None: + dep = "-" + arr = "-" + else: + dep = self._format_time(single_aewc.start_time) + arr = self._format_time(single_aewc.end_time) + + aewc_ladder.append( + [ + str(single_aewc.callsign), + str(single_aewc.freq), + str(single_aewc.depature_location), + str(dep), + str(arr), + ] + ) + + writer.table( + aewc_ladder, + headers=["Callsign", "FREQ", "Depature", "ETD", "ETA"], + ) + # Package Section writer.heading("Comm ladder") comm_ladder = [] @@ -289,10 +340,6 @@ class BriefingPage(KneeboardPage): [comm.name, "", "", "", self.format_frequency(comm.freq)] ) - for a in self.awacs: - comm_ladder.append( - [a.callsign, "AWACS", "", "", self.format_frequency(a.freq)] - ) for tanker in self.tankers: comm_ladder.append( [ @@ -361,12 +408,21 @@ class BriefingPage(KneeboardPage): channel_name = namer.channel_name(channel.radio_id, channel.channel) return f"{channel_name} {frequency}" + def _format_time(self, time: Optional[datetime.timedelta]) -> str: + if time is None: + return "" + local_time = self.start_time + time + return local_time.strftime(f"%H:%M:%S") + class KneeboardGenerator(MissionInfoGenerator): """Creates kneeboard pages for each client flight in the mission.""" def __init__(self, mission: Mission, game: "Game") -> None: super().__init__(mission, game) + self.dark_kneeboard = self.game.settings.generate_dark_kneeboard and ( + self.mission.start_time.hour > 19 or self.mission.start_time.hour < 7 + ) def generate(self) -> None: """Generates a kneeboard per client flight.""" @@ -410,5 +466,6 @@ class KneeboardGenerator(MissionInfoGenerator): self.tankers, self.jtacs, self.mission.start_time, + self.dark_kneeboard, ), ] diff --git a/gen/locations/preset_control_point_locations.py b/gen/locations/preset_control_point_locations.py index 90ae8204..e4be5136 100644 --- a/gen/locations/preset_control_point_locations.py +++ b/gen/locations/preset_control_point_locations.py @@ -9,7 +9,7 @@ from gen.locations.preset_locations import PresetLocation class PresetControlPointLocations: """A repository of preset locations for a given control point""" - # List of possible ashore locations to generate objects (Represented in miz file by an APC_AAV_7) + # List of possible ashore locations to generate objects (Represented in miz file by an APC_AAV_7_Amphibious) ashore_locations: List[PresetLocation] = field(default_factory=list) # List of possible offshore locations to generate ship groups (Represented in miz file by an Oliver Hazard Perry) diff --git a/gen/locations/preset_location_finder.py b/gen/locations/preset_location_finder.py index 94202294..eb591ff9 100644 --- a/gen/locations/preset_location_finder.py +++ b/gen/locations/preset_location_finder.py @@ -44,7 +44,7 @@ class MizDataLocationFinder: for ship_group in m.country("USA").ship_group: if ( len(ship_group.units) > 0 - and ship_group.units[0].type == ships.Oliver_Hazzard_Perry_class.id + and ship_group.units[0].type == ships.FFG_Oliver_Hazzard_Perry.id ): offshore_locations.append( PresetLocation( @@ -68,7 +68,8 @@ class MizDataLocationFinder: for vehicle_group in m.country("Iran").vehicle_group: if ( len(vehicle_group.units) > 0 - and vehicle_group.units[0].type == MissilesSS.SS_N_2_Silkworm.id + and vehicle_group.units[0].type + == MissilesSS.AShM_SS_N_2_Silkworm.id ): antiship_locations.append( PresetLocation( diff --git a/gen/missiles/missiles_group_generator.py b/gen/missiles/missiles_group_generator.py index 0ea877c1..72251516 100644 --- a/gen/missiles/missiles_group_generator.py +++ b/gen/missiles/missiles_group_generator.py @@ -9,7 +9,7 @@ MISSILES_MAP = {"V1GroupGenerator": V1GroupGenerator, "ScudGenerator": ScudGener def generate_missile_group(game, ground_object, faction_name: str): """ - This generate a ship group + This generate a missiles group :return: Nothing, but put the group reference inside the ground object """ faction = db.FACTIONS[faction_name] diff --git a/gen/missiles/scud_site.py b/gen/missiles/scud_site.py index eb548c19..bf5be54b 100644 --- a/gen/missiles/scud_site.py +++ b/gen/missiles/scud_site.py @@ -14,21 +14,21 @@ class ScudGenerator(GroupGenerator): # Scuds self.add_unit( - MissilesSS.SRBM_SS_1C_Scud_B_9K72_LN_9P117M, + MissilesSS.SSM_SS_1C_Scud_B, "V1#0", self.position.x, self.position.y + random.randint(1, 8), self.heading, ) self.add_unit( - MissilesSS.SRBM_SS_1C_Scud_B_9K72_LN_9P117M, + MissilesSS.SSM_SS_1C_Scud_B, "V1#1", self.position.x + 50, self.position.y + random.randint(1, 8), self.heading, ) self.add_unit( - MissilesSS.SRBM_SS_1C_Scud_B_9K72_LN_9P117M, + MissilesSS.SSM_SS_1C_Scud_B, "V1#2", self.position.x + 100, self.position.y + random.randint(1, 8), @@ -37,7 +37,7 @@ class ScudGenerator(GroupGenerator): # Commander self.add_unit( - Unarmed.Transport_UAZ_469, + Unarmed.LUV_UAZ_469_Jeep, "Kubel#0", self.position.x - 35, self.position.y - 20, @@ -46,7 +46,7 @@ class ScudGenerator(GroupGenerator): # Shorad self.add_unit( - AirDefence.SPAAA_ZSU_23_4_Shilka, + AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish, "SHILKA#0", self.position.x - 55, self.position.y - 38, @@ -54,7 +54,7 @@ class ScudGenerator(GroupGenerator): ) self.add_unit( - AirDefence.SAM_SA_9_Strela_1_9P31, + AirDefence.SAM_SA_9_Strela_1_Gaskin_TEL, "STRELA#0", self.position.x + 200, self.position.y + 15, diff --git a/gen/missiles/v1_group.py b/gen/missiles/v1_group.py index bf1511a6..b1cdbe62 100644 --- a/gen/missiles/v1_group.py +++ b/gen/missiles/v1_group.py @@ -14,21 +14,21 @@ class V1GroupGenerator(GroupGenerator): # Ramps self.add_unit( - MissilesSS.V_1_ramp, + MissilesSS.SSM_V_1_Launcher, "V1#0", self.position.x, self.position.y + random.randint(1, 8), self.heading, ) self.add_unit( - MissilesSS.V_1_ramp, + MissilesSS.SSM_V_1_Launcher, "V1#1", self.position.x + 50, self.position.y + random.randint(1, 8), self.heading, ) self.add_unit( - MissilesSS.V_1_ramp, + MissilesSS.SSM_V_1_Launcher, "V1#2", self.position.x + 100, self.position.y + random.randint(1, 8), @@ -37,7 +37,7 @@ class V1GroupGenerator(GroupGenerator): # Commander self.add_unit( - Unarmed.Kübelwagen_82, + Unarmed.LUV_Kubelwagen_82, "Kubel#0", self.position.x - 35, self.position.y - 20, @@ -46,7 +46,7 @@ class V1GroupGenerator(GroupGenerator): # Self defense flak flak_unit = random.choice( - [AirDefence.AAA_Flak_Vierling_38, AirDefence.AAA_Flak_38] + [AirDefence.AAA_Flak_Vierling_38_Quad_20mm, AirDefence.AAA_Flak_38_20mm] ) self.add_unit( @@ -58,7 +58,7 @@ class V1GroupGenerator(GroupGenerator): ) self.add_unit( - Unarmed.Blitz_3_6_6700A, + Unarmed.Truck_Opel_Blitz, "Blitz#0", self.position.x + 200, self.position.y + 15, diff --git a/gen/naming.py b/gen/naming.py index 0f65d024..f1b14114 100644 --- a/gen/naming.py +++ b/gen/naming.py @@ -61,7 +61,7 @@ ANIMALS = [ "MAMBA", "DOLPHIN", "PHEASANT", - "ARMADILLLO", + "ARMADILLO", "RACOON", "ZEBRA", "COW", diff --git a/gen/sam/aaa_bofors.py b/gen/sam/aaa_bofors.py index 919ec249..54e06f63 100644 --- a/gen/sam/aaa_bofors.py +++ b/gen/sam/aaa_bofors.py @@ -27,7 +27,7 @@ class BoforsGenerator(AirDefenseGroupGenerator): for j in range(grid_y): index = index + 1 self.add_unit( - AirDefence.AAA_Bofors_40mm, + AirDefence.AAA_40mm_Bofors, "AAA#" + str(index), self.position.x + spacing * i, self.position.y + spacing * j, diff --git a/gen/sam/aaa_flak.py b/gen/sam/aaa_flak.py index d3386700..bec67196 100644 --- a/gen/sam/aaa_flak.py +++ b/gen/sam/aaa_flak.py @@ -8,12 +8,12 @@ from gen.sam.airdefensegroupgenerator import ( ) GFLAK = [ - AirDefence.AAA_Flak_Vierling_38, + AirDefence.AAA_Flak_Vierling_38_Quad_20mm, AirDefence.AAA_8_8cm_Flak_18, AirDefence.AAA_8_8cm_Flak_36, AirDefence.AAA_8_8cm_Flak_37, AirDefence.AAA_8_8cm_Flak_41, - AirDefence.AAA_Flak_38, + AirDefence.AAA_Flak_38_20mm, ] @@ -53,7 +53,7 @@ class FlakGenerator(AirDefenseGroupGenerator): search_pos = self.get_circular_position(random.randint(2, 3), 80) for index, pos in enumerate(search_pos): self.add_unit( - AirDefence.Flak_Searchlight_37, + AirDefence.SL_Flakscheinwerfer_37, "SearchLight#" + str(index), pos[0], pos[1], @@ -62,14 +62,14 @@ class FlakGenerator(AirDefenseGroupGenerator): # Support self.add_unit( - AirDefence.Maschinensatz_33, + AirDefence.PU_Maschinensatz_33, "MC33#", self.position.x - 20, self.position.y - 20, self.heading, ) self.add_unit( - AirDefence.AAA_Kdo_G_40, + AirDefence.AAA_SP_Kdo_G_40, "KDO#", self.position.x - 25, self.position.y - 20, @@ -78,7 +78,7 @@ class FlakGenerator(AirDefenseGroupGenerator): # Commander self.add_unit( - Unarmed.Kübelwagen_82, + Unarmed.LUV_Kubelwagen_82, "Kubel#", self.position.x - 35, self.position.y - 20, @@ -89,7 +89,7 @@ class FlakGenerator(AirDefenseGroupGenerator): for i in range(int(max(1, grid_x / 2))): for j in range(int(max(1, grid_x / 2))): self.add_unit( - Unarmed.Blitz_3_6_6700A, + Unarmed.Truck_Opel_Blitz, "BLITZ#" + str(index), self.position.x + 125 + 15 * i + random.randint(1, 5), self.position.y + 15 * j + random.randint(1, 5), diff --git a/gen/sam/aaa_flak18.py b/gen/sam/aaa_flak18.py index 8dfda229..5dec254a 100644 --- a/gen/sam/aaa_flak18.py +++ b/gen/sam/aaa_flak18.py @@ -34,7 +34,7 @@ class Flak18Generator(AirDefenseGroupGenerator): # Add a commander truck self.add_unit( - Unarmed.Blitz_3_6_6700A, + Unarmed.Truck_Opel_Blitz, "Blitz#", self.position.x - 35, self.position.y - 20, diff --git a/gen/sam/aaa_ww2_ally_flak.py b/gen/sam/aaa_ww2_ally_flak.py index 1d1d06f4..3dd6b715 100644 --- a/gen/sam/aaa_ww2_ally_flak.py +++ b/gen/sam/aaa_ww2_ally_flak.py @@ -21,7 +21,7 @@ class AllyWW2FlakGenerator(AirDefenseGroupGenerator): positions = self.get_circular_position(4, launcher_distance=30, coverage=360) for i, position in enumerate(positions): self.add_unit( - AirDefence.AA_gun_QF_3_7, + AirDefence.AAA_QF_3_7, "AA#" + str(i), position[0], position[1], @@ -41,7 +41,7 @@ class AllyWW2FlakGenerator(AirDefenseGroupGenerator): positions = self.get_circular_position(8, launcher_distance=90, coverage=360) for i, position in enumerate(positions): self.add_unit( - AirDefence.AAA_M45_Quadmount, + AirDefence.AAA_M45_Quadmount_HB_12_7mm, "AA#" + str(12 + i), position[0], position[1], @@ -50,28 +50,28 @@ class AllyWW2FlakGenerator(AirDefenseGroupGenerator): # Add a commander truck self.add_unit( - Unarmed.Willys_MB, + Unarmed.Car_Willys_Jeep, "CMD#1", self.position.x, self.position.y - 20, random.randint(0, 360), ) self.add_unit( - Armor.M30_Cargo_Carrier, + Unarmed.Carrier_M30_Cargo, "LOG#1", self.position.x, self.position.y + 20, random.randint(0, 360), ) self.add_unit( - Armor.M4_Tractor, + Unarmed.Tractor_M4_Hi_Speed, "LOG#2", self.position.x + 20, self.position.y, random.randint(0, 360), ) self.add_unit( - Unarmed.Bedford_MWD, + Unarmed.Truck_Bedford, "LOG#3", self.position.x - 20, self.position.y, diff --git a/gen/sam/aaa_zsu57.py b/gen/sam/aaa_zsu57.py index 3c877ee0..ad3c5eea 100644 --- a/gen/sam/aaa_zsu57.py +++ b/gen/sam/aaa_zsu57.py @@ -21,7 +21,7 @@ class ZSU57Generator(AirDefenseGroupGenerator): ) for i, position in enumerate(positions): self.add_unit( - AirDefence.AAA_ZSU_57_2, + AirDefence.SPAAA_ZSU_57_2, "SPAA#" + str(i), position[0], position[1], diff --git a/gen/sam/aaa_zu23_insurgent.py b/gen/sam/aaa_zu23_insurgent.py index 78ac4218..00e2f41f 100644 --- a/gen/sam/aaa_zu23_insurgent.py +++ b/gen/sam/aaa_zu23_insurgent.py @@ -27,7 +27,7 @@ class ZU23InsurgentGenerator(AirDefenseGroupGenerator): for j in range(grid_y): index = index + 1 self.add_unit( - AirDefence.AAA_ZU_23_Insurgent_Closed, + AirDefence.AAA_ZU_23_Closed_Emplacement_Insurgent, "AAA#" + str(index), self.position.x + spacing * i, self.position.y + spacing * j, diff --git a/gen/sam/cold_war_flak.py b/gen/sam/cold_war_flak.py index 81a184f7..7b11f618 100644 --- a/gen/sam/cold_war_flak.py +++ b/gen/sam/cold_war_flak.py @@ -12,13 +12,13 @@ from gen.sam.group_generator import GroupGenerator class EarlyColdWarFlakGenerator(AirDefenseGroupGenerator): """ This generator attempt to mimic an early cold-war era flak AAA site. - The Flak 18 88mm is used as the main long range gun and 2 Bofors 40mm guns provide short range protection. + The Flak 18 88mm is used as the main long range gun, S-60 is used as a mid range gun and 2 Bofors 40mm guns provide short range protection. This does not include search lights and telemeter computer (Kdo.G 40) because these are paid units only available in WW2 asset pack """ name = "Early Cold War Flak Site" - price = 58 + price = 74 def generate(self): @@ -37,25 +37,41 @@ class EarlyColdWarFlakGenerator(AirDefenseGroupGenerator): self.heading, ) - # Short range guns + # Medium range guns self.add_unit( - AirDefence.AAA_Bofors_40mm, + AirDefence.AAA_S_60_57mm, "SHO#1", self.position.x - 40, self.position.y - 40, self.heading + 180, ), self.add_unit( - AirDefence.AAA_Bofors_40mm, + AirDefence.AAA_S_60_57mm, "SHO#2", self.position.x + spacing * 2 + 40, self.position.y + spacing + 40, self.heading, ), + # Short range guns + self.add_unit( + AirDefence.AAA_ZU_23_Closed_Emplacement, + "SHO#3", + self.position.x - 80, + self.position.y - 40, + self.heading + 180, + ), + self.add_unit( + AirDefence.AAA_ZU_23_Closed_Emplacement, + "SHO#4", + self.position.x + spacing * 2 + 80, + self.position.y + spacing + 40, + self.heading, + ), + # Add a truck self.add_unit( - Unarmed.Transport_KAMAZ_43101, + Unarmed.Truck_KAMAZ_43101, "Truck#", self.position.x - 60, self.position.y - 20, @@ -70,7 +86,7 @@ class EarlyColdWarFlakGenerator(AirDefenseGroupGenerator): class ColdWarFlakGenerator(AirDefenseGroupGenerator): """ This generator attempt to mimic a cold-war era flak AAA site. - The Flak 18 88mm is used as the main long range gun while 2 Zu-23 guns provide short range protection. + The Flak 18 88mm is used as the main long range gun, 2 S-60 57mm gun improve mid range firepower, while 2 Zu-23 guns even provide short range protection. The site is also fitted with a P-19 radar for early detection. """ @@ -94,25 +110,41 @@ class ColdWarFlakGenerator(AirDefenseGroupGenerator): self.heading, ) - # Short range guns + # Medium range guns self.add_unit( - AirDefence.AAA_ZU_23_Closed, + AirDefence.AAA_S_60_57mm, "SHO#1", self.position.x - 40, self.position.y - 40, self.heading + 180, ), self.add_unit( - AirDefence.AAA_ZU_23_Closed, + AirDefence.AAA_S_60_57mm, "SHO#2", self.position.x + spacing * 2 + 40, self.position.y + spacing + 40, self.heading, ), + # Short range guns + self.add_unit( + AirDefence.AAA_ZU_23_Closed_Emplacement, + "SHO#3", + self.position.x - 80, + self.position.y - 40, + self.heading + 180, + ), + self.add_unit( + AirDefence.AAA_ZU_23_Closed_Emplacement, + "SHO#4", + self.position.x + spacing * 2 + 80, + self.position.y + spacing + 40, + self.heading, + ), + # Add a P19 Radar for EWR self.add_unit( - AirDefence.SAM_SR_P_19, + AirDefence.SAM_P19_Flat_Face_SR__SA_2_3, "SR#0", self.position.x - 60, self.position.y - 20, diff --git a/gen/sam/ewr_group_generator.py b/gen/sam/ewr_group_generator.py new file mode 100644 index 00000000..e576f5a8 --- /dev/null +++ b/gen/sam/ewr_group_generator.py @@ -0,0 +1,63 @@ +import random +from typing import List, Optional, Type + +from dcs.unitgroup import VehicleGroup + +from game import Game +from game.factions.faction import Faction +from game.theater.theatergroundobject import EwrGroundObject +from gen.sam.ewrs import ( + BigBirdGenerator, + BoxSpringGenerator, + DogEarGenerator, + FlatFaceGenerator, + HawkEwrGenerator, + PatriotEwrGenerator, + RolandEwrGenerator, + SnowDriftGenerator, + StraightFlushGenerator, + TallRackGenerator, +) +from gen.sam.group_generator import GroupGenerator + +EWR_MAP = { + "BoxSpringGenerator": BoxSpringGenerator, + "TallRackGenerator": TallRackGenerator, + "DogEarGenerator": DogEarGenerator, + "RolandEwrGenerator": RolandEwrGenerator, + "FlatFaceGenerator": FlatFaceGenerator, + "PatriotEwrGenerator": PatriotEwrGenerator, + "BigBirdGenerator": BigBirdGenerator, + "SnowDriftGenerator": SnowDriftGenerator, + "StraightFlushGenerator": StraightFlushGenerator, + "HawkEwrGenerator": HawkEwrGenerator, +} + + +def get_faction_possible_ewrs_generator( + faction: Faction, +) -> List[Type[GroupGenerator]]: + """ + Return the list of possible EWR generators for the given faction + :param faction: Faction name to search units for + """ + return [EWR_MAP[s] for s in faction.ewrs] + + +def generate_ewr_group( + game: Game, ground_object: EwrGroundObject, faction: Faction +) -> Optional[VehicleGroup]: + """Generates an early warning radar group. + + :param game: The Game. + :param ground_object: The ground object which will own the EWR group. + :param faction: Owner faction. + :return: The generated group, or None if one could not be generated. + """ + generators = get_faction_possible_ewrs_generator(faction) + if len(generators) > 0: + generator_class = random.choice(generators) + generator = generator_class(game, ground_object) + generator.generate() + return generator.get_generated_group() + return None diff --git a/gen/sam/ewrs.py b/gen/sam/ewrs.py index ef94f8b2..7164a09e 100644 --- a/gen/sam/ewrs.py +++ b/gen/sam/ewrs.py @@ -33,7 +33,7 @@ class DogEarGenerator(EwrGenerator): This is the SA-8 search radar, but used as an early warning radar. """ - unit_type = AirDefence.CP_9S80M1_Sborka + unit_type = AirDefence.MCC_SR_Sborka_Dog_Ear_SR class RolandEwrGenerator(EwrGenerator): @@ -51,7 +51,7 @@ class FlatFaceGenerator(EwrGenerator): This is the SA-3 search radar, but used as an early warning radar. """ - unit_type = AirDefence.SAM_SR_P_19 + unit_type = AirDefence.SAM_P19_Flat_Face_SR__SA_2_3 class PatriotEwrGenerator(EwrGenerator): @@ -60,7 +60,7 @@ class PatriotEwrGenerator(EwrGenerator): This is the Patriot search/track radar, but used as an early warning radar. """ - unit_type = AirDefence.SAM_Patriot_STR_AN_MPQ_53 + unit_type = AirDefence.SAM_Patriot_STR class BigBirdGenerator(EwrGenerator): @@ -69,7 +69,7 @@ class BigBirdGenerator(EwrGenerator): This is the SA-10 track radar, but used as an early warning radar. """ - unit_type = AirDefence.SAM_SA_10_S_300PS_SR_64H6E + unit_type = AirDefence.SAM_SA_10_S_300_Grumble_Big_Bird_SR class SnowDriftGenerator(EwrGenerator): @@ -78,7 +78,7 @@ class SnowDriftGenerator(EwrGenerator): This is the SA-11 search radar, but used as an early warning radar. """ - unit_type = AirDefence.SAM_SA_11_Buk_SR_9S18M1 + unit_type = AirDefence.SAM_SA_11_Buk_Gadfly_Snow_Drift_SR class StraightFlushGenerator(EwrGenerator): @@ -87,7 +87,7 @@ class StraightFlushGenerator(EwrGenerator): This is the SA-6 search/track radar, but used as an early warning radar. """ - unit_type = AirDefence.SAM_SA_6_Kub_STR_9S91 + unit_type = AirDefence.SAM_SA_6_Kub_Long_Track_STR class HawkEwrGenerator(EwrGenerator): @@ -96,4 +96,4 @@ class HawkEwrGenerator(EwrGenerator): This is the Hawk search radar, but used as an early warning radar. """ - unit_type = AirDefence.SAM_Hawk_SR_AN_MPQ_50 + unit_type = AirDefence.SAM_Hawk_SR__AN_MPQ_50 diff --git a/gen/sam/freya_ewr.py b/gen/sam/freya_ewr.py index af637b91..7e77bf1d 100644 --- a/gen/sam/freya_ewr.py +++ b/gen/sam/freya_ewr.py @@ -28,7 +28,7 @@ class FreyaGenerator(AirDefenseGroupGenerator): positions = self.get_circular_position(4, launcher_distance=50, coverage=360) for i, position in enumerate(positions): self.add_unit( - AirDefence.AAA_Flak_Vierling_38, + AirDefence.AAA_Flak_Vierling_38_Quad_20mm, "AA#" + str(i), position[0], position[1], @@ -47,37 +47,37 @@ class FreyaGenerator(AirDefenseGroupGenerator): # Command/Logi self.add_unit( - Unarmed.Kübelwagen_82, + Unarmed.LUV_Kubelwagen_82, "Kubel#1", self.position.x - 20, self.position.y - 20, self.heading, ) self.add_unit( - Unarmed.Sd_Kfz_7, + Unarmed.Carrier_Sd_Kfz_7_Tractor, "Sdkfz#1", self.position.x + 20, self.position.y + 22, self.heading, ) self.add_unit( - Unarmed.Sd_Kfz_2, + Unarmed.LUV_Kettenrad, "Sdkfz#2", self.position.x - 22, self.position.y + 20, self.heading, ) - # Maschinensatz_33 and Kdo.g 40 Telemeter + # PU_Maschinensatz_33 and Kdo.g 40 Telemeter self.add_unit( - AirDefence.Maschinensatz_33, + AirDefence.PU_Maschinensatz_33, "Energy#1", self.position.x + 20, self.position.y - 20, self.heading, ) self.add_unit( - AirDefence.AAA_Kdo_G_40, + AirDefence.AAA_SP_Kdo_G_40, "Telemeter#1", self.position.x + 20, self.position.y - 10, diff --git a/gen/sam/sam_avenger.py b/gen/sam/sam_avenger.py index 982b9471..45b07bc1 100644 --- a/gen/sam/sam_avenger.py +++ b/gen/sam/sam_avenger.py @@ -20,7 +20,7 @@ class AvengerGenerator(AirDefenseGroupGenerator): num_launchers = random.randint(2, 3) self.add_unit( - Unarmed.Transport_M818, + Unarmed.Truck_M818_6x6, "TRUCK", self.position.x, self.position.y, @@ -31,7 +31,7 @@ class AvengerGenerator(AirDefenseGroupGenerator): ) for i, position in enumerate(positions): self.add_unit( - AirDefence.SAM_Avenger_M1097, + AirDefence.SAM_Avenger__Stinger, "SPAA#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_chaparral.py b/gen/sam/sam_chaparral.py index a0b1ece2..fb4d6fee 100644 --- a/gen/sam/sam_chaparral.py +++ b/gen/sam/sam_chaparral.py @@ -20,7 +20,7 @@ class ChaparralGenerator(AirDefenseGroupGenerator): num_launchers = random.randint(2, 4) self.add_unit( - Unarmed.Transport_M818, + Unarmed.Truck_M818_6x6, "TRUCK", self.position.x, self.position.y, diff --git a/gen/sam/sam_gepard.py b/gen/sam/sam_gepard.py index df16df31..a8c6c861 100644 --- a/gen/sam/sam_gepard.py +++ b/gen/sam/sam_gepard.py @@ -33,7 +33,7 @@ class GepardGenerator(AirDefenseGroupGenerator): self.heading, ) self.add_unit( - Unarmed.Transport_M818, + Unarmed.Truck_M818_6x6, "TRUCK", self.position.x + 80, self.position.y, diff --git a/gen/sam/sam_group_generator.py b/gen/sam/sam_group_generator.py index 9d8545fb..e13f0f2c 100644 --- a/gen/sam/sam_group_generator.py +++ b/gen/sam/sam_group_generator.py @@ -6,7 +6,6 @@ from dcs.vehicles import AirDefence from game import Game from game.factions.faction import Faction -from game.theater import TheaterGroundObject from game.theater.theatergroundobject import SamGroundObject from gen.sam.aaa_bofors import BoforsGenerator from gen.sam.aaa_flak import FlakGenerator @@ -23,20 +22,7 @@ from gen.sam.cold_war_flak import ( ColdWarFlakGenerator, EarlyColdWarFlakGenerator, ) -from gen.sam.ewrs import ( - BigBirdGenerator, - BoxSpringGenerator, - DogEarGenerator, - FlatFaceGenerator, - HawkEwrGenerator, - PatriotEwrGenerator, - RolandEwrGenerator, - SnowDriftGenerator, - StraightFlushGenerator, - TallRackGenerator, -) from gen.sam.freya_ewr import FreyaGenerator -from gen.sam.group_generator import GroupGenerator from gen.sam.sam_avenger import AvengerGenerator from gen.sam.sam_chaparral import ChaparralGenerator from gen.sam.sam_gepard import GepardGenerator @@ -119,52 +105,39 @@ SAM_MAP: Dict[str, Type[AirDefenseGroupGenerator]] = { SAM_PRICES = { - AirDefence.SAM_Hawk_PCP: 35, + AirDefence.SAM_Hawk_Generator__PCP: 35, AirDefence.AAA_ZU_23_Emplacement: 10, - AirDefence.AAA_ZU_23_Closed: 10, - AirDefence.AAA_ZU_23_on_Ural_375: 10, - AirDefence.AAA_ZU_23_Insurgent_on_Ural_375: 10, - AirDefence.AAA_ZU_23_Insurgent_Closed: 10, + AirDefence.AAA_ZU_23_Closed_Emplacement: 10, + AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375: 10, + AirDefence.SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375: 10, + AirDefence.AAA_ZU_23_Closed_Emplacement_Insurgent: 10, AirDefence.AAA_ZU_23_Insurgent: 10, - AirDefence.SPAAA_ZSU_23_4_Shilka: 10, - AirDefence.AAA_Vulcan_M163: 15, - AirDefence.SAM_Linebacker_M6: 20, - AirDefence.Rapier_FSA_Launcher: 20, - AirDefence.SAM_Avenger_M1097: 22, + AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish: 10, + AirDefence.SPAAA_Vulcan_M163: 15, + AirDefence.SAM_Linebacker___Bradley_M6: 20, + AirDefence.SAM_Rapier_LN: 20, + AirDefence.SAM_Avenger__Stinger: 22, AirDefence.SPAAA_Gepard: 24, AirDefence.SAM_Roland_ADS: 40, - AirDefence.SAM_Patriot_LN_M901: 85, + AirDefence.SAM_Patriot_LN: 85, AirDefence.SAM_Patriot_EPP_III: 85, AirDefence.SAM_Chaparral_M48: 25, - AirDefence.AAA_Bofors_40mm: 15, + AirDefence.AAA_40mm_Bofors: 15, AirDefence.AAA_8_8cm_Flak_36: 15, - AirDefence.SAM_SA_2_LN_SM_90: 30, - AirDefence.SAM_SA_3_S_125_LN_5P73: 35, - AirDefence.SAM_SA_6_Kub_LN_2P25: 45, - AirDefence.SAM_SA_8_Osa_9A33: 30, - AirDefence.SAM_SA_9_Strela_1_9P31: 25, - AirDefence.SAM_SA_10_S_300PS_LN_5P85C: 80, - AirDefence.SAM_SA_10_S_300PS_CP_54K6: 80, - AirDefence.SAM_SA_11_Buk_LN_9A310M1: 60, - AirDefence.SAM_SA_13_Strela_10M3_9A35M3: 30, - AirDefence.SAM_SA_15_Tor_9A331: 40, - AirDefence.SAM_SA_19_Tunguska_2S6: 35, + AirDefence.SAM_SA_2_S_75_Guideline_LN: 30, + AirDefence.SAM_SA_3_S_125_Goa_LN: 35, + AirDefence.SAM_SA_6_Kub_Gainful_TEL: 45, + AirDefence.SAM_SA_8_Osa_Gecko_TEL: 30, + AirDefence.SAM_SA_9_Strela_1_Gaskin_TEL: 25, + AirDefence.SAM_SA_10_S_300_Grumble_TEL_C: 80, + AirDefence.SAM_SA_10_S_300_Grumble_C2: 80, + AirDefence.SAM_SA_11_Buk_Gadfly_Fire_Dome_TEL: 60, + AirDefence.SAM_SA_13_Strela_10M3_Gopher_TEL: 30, + AirDefence.SAM_SA_15_Tor_Gauntlet: 40, + AirDefence.SAM_SA_19_Tunguska_Grison: 35, AirDefence.HQ_7_Self_Propelled_LN: 35, } -EWR_MAP = { - "BoxSpringGenerator": BoxSpringGenerator, - "TallRackGenerator": TallRackGenerator, - "DogEarGenerator": DogEarGenerator, - "RolandEwrGenerator": RolandEwrGenerator, - "FlatFaceGenerator": FlatFaceGenerator, - "PatriotEwrGenerator": PatriotEwrGenerator, - "BigBirdGenerator": BigBirdGenerator, - "SnowDriftGenerator": SnowDriftGenerator, - "StraightFlushGenerator": StraightFlushGenerator, - "HawkEwrGenerator": HawkEwrGenerator, -} - def get_faction_possible_sams_generator( faction: Faction, @@ -176,14 +149,6 @@ def get_faction_possible_sams_generator( return [SAM_MAP[s] for s in faction.air_defenses] -def get_faction_possible_ewrs_generator(faction: Faction) -> List[Type[GroupGenerator]]: - """ - Return the list of possible SAM generator for the given faction - :param faction: Faction name to search units for - """ - return [EWR_MAP[s] for s in faction.ewrs] - - def _generate_anti_air_from( generators: Sequence[Type[AirDefenseGroupGenerator]], game: Game, @@ -236,22 +201,3 @@ def generate_anti_air_group( if groups: return groups return [] - - -def generate_ewr_group( - game: Game, ground_object: TheaterGroundObject, faction: Faction -) -> Optional[VehicleGroup]: - """Generates an early warning radar group. - - :param game: The Game. - :param ground_object: The ground object which will own the EWR group. - :param faction: Owner faction. - :return: The generated group, or None if one could not be generated. - """ - generators = get_faction_possible_ewrs_generator(faction) - if len(generators) > 0: - generator_class = random.choice(generators) - generator = generator_class(game, ground_object) - generator.generate() - return generator.get_generated_group() - return None diff --git a/gen/sam/sam_hawk.py b/gen/sam/sam_hawk.py index 651531c0..ab3332cd 100644 --- a/gen/sam/sam_hawk.py +++ b/gen/sam/sam_hawk.py @@ -19,21 +19,21 @@ class HawkGenerator(AirDefenseGroupGenerator): def generate(self): self.add_unit( - AirDefence.SAM_Hawk_SR_AN_MPQ_50, + AirDefence.SAM_Hawk_SR__AN_MPQ_50, "SR", self.position.x + 20, self.position.y, self.heading, ) self.add_unit( - AirDefence.SAM_Hawk_PCP, + AirDefence.SAM_Hawk_Generator__PCP, "PCP", self.position.x, self.position.y, self.heading, ) self.add_unit( - AirDefence.SAM_Hawk_TR_AN_MPQ_46, + AirDefence.SAM_Hawk_TR__AN_MPQ_46, "TR", self.position.x + 40, self.position.y, @@ -44,7 +44,7 @@ class HawkGenerator(AirDefenseGroupGenerator): aa_group = self.add_auxiliary_group("AA") self.add_unit_to_group( aa_group, - AirDefence.AAA_Vulcan_M163, + AirDefence.SPAAA_Vulcan_M163, "AAA", self.position + Point(20, 30), self.heading, diff --git a/gen/sam/sam_hq7.py b/gen/sam/sam_hq7.py index 06bba42f..bbe449a4 100644 --- a/gen/sam/sam_hq7.py +++ b/gen/sam/sam_hq7.py @@ -37,14 +37,14 @@ class HQ7Generator(AirDefenseGroupGenerator): aa_group = self.add_auxiliary_group("AA") self.add_unit_to_group( aa_group, - AirDefence.AAA_ZU_23_on_Ural_375, + AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375, "AAA1", self.position + Point(20, 30), self.heading, ) self.add_unit_to_group( aa_group, - AirDefence.AAA_ZU_23_on_Ural_375, + AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375, "AAA2", self.position - Point(20, 30), self.heading, diff --git a/gen/sam/sam_linebacker.py b/gen/sam/sam_linebacker.py index 1fa89ca2..f0393712 100644 --- a/gen/sam/sam_linebacker.py +++ b/gen/sam/sam_linebacker.py @@ -20,7 +20,7 @@ class LinebackerGenerator(AirDefenseGroupGenerator): num_launchers = random.randint(2, 4) self.add_unit( - Unarmed.Transport_M818, + Unarmed.Truck_M818_6x6, "TRUCK", self.position.x, self.position.y, @@ -31,7 +31,7 @@ class LinebackerGenerator(AirDefenseGroupGenerator): ) for i, position in enumerate(positions): self.add_unit( - AirDefence.SAM_Linebacker_M6, + AirDefence.SAM_Linebacker___Bradley_M6, "M6#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_patriot.py b/gen/sam/sam_patriot.py index 21f78b36..af17b712 100644 --- a/gen/sam/sam_patriot.py +++ b/gen/sam/sam_patriot.py @@ -20,28 +20,28 @@ class PatriotGenerator(AirDefenseGroupGenerator): def generate(self): # Command Post self.add_unit( - AirDefence.SAM_Patriot_STR_AN_MPQ_53, + AirDefence.SAM_Patriot_STR, "STR", self.position.x + 30, self.position.y + 30, self.heading, ) self.add_unit( - AirDefence.SAM_Patriot_AMG_AN_MRC_137, + AirDefence.SAM_Patriot_CR__AMG_AN_MRC_137, "MRC", self.position.x, self.position.y, self.heading, ) self.add_unit( - AirDefence.SAM_Patriot_ECS_AN_MSQ_104, + AirDefence.SAM_Patriot_ECS, "MSQ", self.position.x + 30, self.position.y, self.heading, ) self.add_unit( - AirDefence.SAM_Patriot_ICC, + AirDefence.SAM_Patriot_C2_ICC, "ICC", self.position.x + 60, self.position.y, @@ -61,7 +61,7 @@ class PatriotGenerator(AirDefenseGroupGenerator): ) for i, position in enumerate(positions): self.add_unit( - AirDefence.SAM_Patriot_LN_M901, + AirDefence.SAM_Patriot_LN, "LN#" + str(i), position[0], position[1], @@ -76,7 +76,11 @@ class PatriotGenerator(AirDefenseGroupGenerator): ) for i, (x, y, heading) in enumerate(positions): self.add_unit_to_group( - aa_group, AirDefence.AAA_Vulcan_M163, f"SPAAA#{i}", Point(x, y), heading + aa_group, + AirDefence.SPAAA_Vulcan_M163, + f"SPAAA#{i}", + Point(x, y), + heading, ) @classmethod diff --git a/gen/sam/sam_rapier.py b/gen/sam/sam_rapier.py index 1ff8f9ce..f869b17e 100644 --- a/gen/sam/sam_rapier.py +++ b/gen/sam/sam_rapier.py @@ -18,14 +18,14 @@ class RapierGenerator(AirDefenseGroupGenerator): def generate(self): self.add_unit( - AirDefence.Rapier_FSA_Blindfire_Tracker, + AirDefence.SAM_Rapier_Blindfire_TR, "BT", self.position.x, self.position.y, self.heading, ) self.add_unit( - AirDefence.Rapier_FSA_Optical_Tracker, + AirDefence.SAM_Rapier_Tracker, "OT", self.position.x + 20, self.position.y, @@ -39,7 +39,7 @@ class RapierGenerator(AirDefenseGroupGenerator): for i, position in enumerate(positions): self.add_unit( - AirDefence.Rapier_FSA_Launcher, + AirDefence.SAM_Rapier_LN, "LN#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_roland.py b/gen/sam/sam_roland.py index 26c1bcdf..8511e94a 100644 --- a/gen/sam/sam_roland.py +++ b/gen/sam/sam_roland.py @@ -30,7 +30,7 @@ class RolandGenerator(AirDefenseGroupGenerator): self.heading, ) self.add_unit( - Unarmed.Transport_M818, + Unarmed.Truck_M818_6x6, "TRUCK", self.position.x + 80, self.position.y, diff --git a/gen/sam/sam_sa10.py b/gen/sam/sam_sa10.py index b8731590..a0873223 100644 --- a/gen/sam/sam_sa10.py +++ b/gen/sam/sam_sa10.py @@ -1,7 +1,6 @@ import random from dcs.mapping import Point -from dcs.unittype import VehicleType from dcs.vehicles import AirDefence from game import Game @@ -18,18 +17,18 @@ class SA10Generator(AirDefenseGroupGenerator): This generate a SA-10 group """ - name = "SA-10/S-300PS Battery" + name = "SA-10/S-300PS Battery - With ZSU-23" price = 550 def __init__(self, game: Game, ground_object: SamGroundObject): super().__init__(game, ground_object) - self.sr1 = AirDefence.SAM_SA_10_S_300PS_SR_5N66M - self.sr2 = AirDefence.SAM_SA_10_S_300PS_SR_64H6E - self.cp = AirDefence.SAM_SA_10_S_300PS_CP_54K6 - self.tr1 = AirDefence.SAM_SA_10_S_300PS_TR_30N6 - self.tr2 = AirDefence.SAM_SA_10_S_300PS_TR_30N6 - self.ln1 = AirDefence.SAM_SA_10_S_300PS_LN_5P85C - self.ln2 = AirDefence.SAM_SA_10_S_300PS_LN_5P85D + self.sr1 = AirDefence.SAM_SA_10_S_300_Grumble_Clam_Shell_SR + self.sr2 = AirDefence.SAM_SA_10_S_300_Grumble_Big_Bird_SR + self.cp = AirDefence.SAM_SA_10_S_300_Grumble_C2 + self.tr1 = AirDefence.SAM_SA_10_S_300_Grumble_Flap_Lid_TR + self.tr2 = AirDefence.SAM_SA_10_S_300_Grumble_Flap_Lid_TR + self.ln1 = AirDefence.SAM_SA_10_S_300_Grumble_TEL_C + self.ln2 = AirDefence.SAM_SA_10_S_300_Grumble_TEL_D def generate(self): # Search Radar @@ -85,7 +84,7 @@ class SA10Generator(AirDefenseGroupGenerator): for i, (x, y, heading) in enumerate(positions): self.add_unit_to_group( aa_group, - AirDefence.SPAAA_ZSU_23_4_Shilka, + AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish, f"AA#{i}", Point(x, y), heading, @@ -93,6 +92,10 @@ class SA10Generator(AirDefenseGroupGenerator): class Tier2SA10Generator(SA10Generator): + + name = "SA-10/S-300PS Battery - With SA-15 PD" + price = 650 + def generate_defensive_groups(self) -> None: # Create AAA the way the main group does. super().generate_defensive_groups() @@ -106,7 +109,7 @@ class Tier2SA10Generator(SA10Generator): for i, (x, y, heading) in enumerate(positions): self.add_unit_to_group( pd_group, - AirDefence.SAM_SA_15_Tor_9A331, + AirDefence.SAM_SA_15_Tor_Gauntlet, f"PD#{i}", Point(x, y), heading, @@ -114,6 +117,10 @@ class Tier2SA10Generator(SA10Generator): class Tier3SA10Generator(SA10Generator): + + name = "SA-10/S-300PS Battery - With SA-15 PD & SA-19 SHORAD" + price = 750 + def generate_defensive_groups(self) -> None: # AAA for defending against close targets. aa_group = self.add_auxiliary_group("AA") @@ -124,7 +131,7 @@ class Tier3SA10Generator(SA10Generator): for i, (x, y, heading) in enumerate(positions): self.add_unit_to_group( aa_group, - AirDefence.SAM_SA_19_Tunguska_2S6, + AirDefence.SAM_SA_19_Tunguska_Grison, f"AA#{i}", Point(x, y), heading, @@ -139,7 +146,7 @@ class Tier3SA10Generator(SA10Generator): for i, (x, y, heading) in enumerate(positions): self.add_unit_to_group( pd_group, - AirDefence.SAM_SA_15_Tor_9A331, + AirDefence.SAM_SA_15_Tor_Gauntlet, f"PD#{i}", Point(x, y), heading, diff --git a/gen/sam/sam_sa11.py b/gen/sam/sam_sa11.py index adf0362e..6076d69a 100644 --- a/gen/sam/sam_sa11.py +++ b/gen/sam/sam_sa11.py @@ -18,14 +18,14 @@ class SA11Generator(AirDefenseGroupGenerator): def generate(self): self.add_unit( - AirDefence.SAM_SA_11_Buk_SR_9S18M1, + AirDefence.SAM_SA_11_Buk_Gadfly_Snow_Drift_SR, "SR", self.position.x + 20, self.position.y, self.heading, ) self.add_unit( - AirDefence.SAM_SA_11_Buk_CC_9S470M1, + AirDefence.SAM_SA_11_Buk_Gadfly_C2, "CC", self.position.x, self.position.y, @@ -39,7 +39,7 @@ class SA11Generator(AirDefenseGroupGenerator): for i, position in enumerate(positions): self.add_unit( - AirDefence.SAM_SA_11_Buk_LN_9A310M1, + AirDefence.SAM_SA_11_Buk_Gadfly_Fire_Dome_TEL, "LN#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_sa13.py b/gen/sam/sam_sa13.py index dec20085..76fc081f 100644 --- a/gen/sam/sam_sa13.py +++ b/gen/sam/sam_sa13.py @@ -18,14 +18,14 @@ class SA13Generator(AirDefenseGroupGenerator): def generate(self): self.add_unit( - Unarmed.Transport_UAZ_469, + Unarmed.LUV_UAZ_469_Jeep, "UAZ", self.position.x, self.position.y, self.heading, ) self.add_unit( - Unarmed.Transport_KAMAZ_43101, + Unarmed.Truck_KAMAZ_43101, "TRUCK", self.position.x + 40, self.position.y, @@ -38,7 +38,7 @@ class SA13Generator(AirDefenseGroupGenerator): ) for i, position in enumerate(positions): self.add_unit( - AirDefence.SAM_SA_13_Strela_10M3_9A35M3, + AirDefence.SAM_SA_13_Strela_10M3_Gopher_TEL, "LN#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_sa15.py b/gen/sam/sam_sa15.py index ffd45752..8eccbd58 100644 --- a/gen/sam/sam_sa15.py +++ b/gen/sam/sam_sa15.py @@ -16,21 +16,21 @@ class SA15Generator(AirDefenseGroupGenerator): def generate(self): self.add_unit( - AirDefence.SAM_SA_15_Tor_9A331, + AirDefence.SAM_SA_15_Tor_Gauntlet, "ADS", self.position.x, self.position.y, self.heading, ) self.add_unit( - Unarmed.Transport_UAZ_469, + Unarmed.LUV_UAZ_469_Jeep, "EWR", self.position.x + 40, self.position.y, self.heading, ) self.add_unit( - Unarmed.Transport_KAMAZ_43101, + Unarmed.Truck_KAMAZ_43101, "TRUCK", self.position.x + 80, self.position.y, diff --git a/gen/sam/sam_sa17.py b/gen/sam/sam_sa17.py index 52922646..49b864e9 100644 --- a/gen/sam/sam_sa17.py +++ b/gen/sam/sam_sa17.py @@ -17,14 +17,14 @@ class SA17Generator(AirDefenseGroupGenerator): def generate(self): self.add_unit( - AirDefence.SAM_SA_11_Buk_SR_9S18M1, + AirDefence.SAM_SA_11_Buk_Gadfly_Snow_Drift_SR, "SR", self.position.x + 20, self.position.y, self.heading, ) self.add_unit( - AirDefence.SAM_SA_11_Buk_CC_9S470M1, + AirDefence.SAM_SA_11_Buk_Gadfly_C2, "CC", self.position.x, self.position.y, diff --git a/gen/sam/sam_sa19.py b/gen/sam/sam_sa19.py index 02a3ff24..8583f490 100644 --- a/gen/sam/sam_sa19.py +++ b/gen/sam/sam_sa19.py @@ -21,7 +21,7 @@ class SA19Generator(AirDefenseGroupGenerator): if num_launchers == 1: self.add_unit( - AirDefence.SAM_SA_19_Tunguska_2S6, + AirDefence.SAM_SA_19_Tunguska_Grison, "LN#0", self.position.x, self.position.y, @@ -33,7 +33,7 @@ class SA19Generator(AirDefenseGroupGenerator): ) for i, position in enumerate(positions): self.add_unit( - AirDefence.SAM_SA_19_Tunguska_2S6, + AirDefence.SAM_SA_19_Tunguska_Grison, "LN#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_sa2.py b/gen/sam/sam_sa2.py index 4307371e..c34e697f 100644 --- a/gen/sam/sam_sa2.py +++ b/gen/sam/sam_sa2.py @@ -18,10 +18,14 @@ class SA2Generator(AirDefenseGroupGenerator): def generate(self): self.add_unit( - AirDefence.SAM_SR_P_19, "SR", self.position.x, self.position.y, self.heading + AirDefence.SAM_P19_Flat_Face_SR__SA_2_3, + "SR", + self.position.x, + self.position.y, + self.heading, ) self.add_unit( - AirDefence.SAM_SA_2_TR_SNR_75_Fan_Song, + AirDefence.SAM_SA_2_S_75_Fan_Song_TR, "TR", self.position.x + 20, self.position.y, @@ -35,7 +39,7 @@ class SA2Generator(AirDefenseGroupGenerator): for i, position in enumerate(positions): self.add_unit( - AirDefence.SAM_SA_2_LN_SM_90, + AirDefence.SAM_SA_2_S_75_Guideline_LN, "LN#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_sa3.py b/gen/sam/sam_sa3.py index eb689de5..7de69c59 100644 --- a/gen/sam/sam_sa3.py +++ b/gen/sam/sam_sa3.py @@ -18,10 +18,14 @@ class SA3Generator(AirDefenseGroupGenerator): def generate(self): self.add_unit( - AirDefence.SAM_SR_P_19, "SR", self.position.x, self.position.y, self.heading + AirDefence.SAM_P19_Flat_Face_SR__SA_2_3, + "SR", + self.position.x, + self.position.y, + self.heading, ) self.add_unit( - AirDefence.SAM_SA_3_S_125_TR_SNR, + AirDefence.SAM_SA_3_S_125_Low_Blow_TR, "TR", self.position.x + 20, self.position.y, @@ -35,7 +39,7 @@ class SA3Generator(AirDefenseGroupGenerator): for i, position in enumerate(positions): self.add_unit( - AirDefence.SAM_SA_3_S_125_LN_5P73, + AirDefence.SAM_SA_3_S_125_Goa_LN, "LN#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_sa6.py b/gen/sam/sam_sa6.py index eb084aa1..a1def06d 100644 --- a/gen/sam/sam_sa6.py +++ b/gen/sam/sam_sa6.py @@ -18,7 +18,7 @@ class SA6Generator(AirDefenseGroupGenerator): def generate(self): self.add_unit( - AirDefence.SAM_SA_6_Kub_STR_9S91, + AirDefence.SAM_SA_6_Kub_Long_Track_STR, "STR", self.position.x, self.position.y, @@ -32,7 +32,7 @@ class SA6Generator(AirDefenseGroupGenerator): for i, position in enumerate(positions): self.add_unit( - AirDefence.SAM_SA_6_Kub_LN_2P25, + AirDefence.SAM_SA_6_Kub_Gainful_TEL, "LN#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_sa8.py b/gen/sam/sam_sa8.py index 3bf14f2e..0ded6973 100644 --- a/gen/sam/sam_sa8.py +++ b/gen/sam/sam_sa8.py @@ -16,7 +16,7 @@ class SA8Generator(AirDefenseGroupGenerator): def generate(self): self.add_unit( - AirDefence.SAM_SA_8_Osa_9A33, + AirDefence.SAM_SA_8_Osa_Gecko_TEL, "OSA", self.position.x, self.position.y, diff --git a/gen/sam/sam_sa9.py b/gen/sam/sam_sa9.py index 0051a03a..85edfb60 100644 --- a/gen/sam/sam_sa9.py +++ b/gen/sam/sam_sa9.py @@ -18,14 +18,14 @@ class SA9Generator(AirDefenseGroupGenerator): def generate(self): self.add_unit( - Unarmed.Transport_UAZ_469, + Unarmed.LUV_UAZ_469_Jeep, "UAZ", self.position.x, self.position.y, self.heading, ) self.add_unit( - Unarmed.Transport_KAMAZ_43101, + Unarmed.Truck_KAMAZ_43101, "TRUCK", self.position.x + 40, self.position.y, @@ -38,7 +38,7 @@ class SA9Generator(AirDefenseGroupGenerator): ) for i, position in enumerate(positions): self.add_unit( - AirDefence.SAM_SA_9_Strela_1_9P31, + AirDefence.SAM_SA_9_Strela_1_Gaskin_TEL, "LN#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_vulcan.py b/gen/sam/sam_vulcan.py index 44364189..9ce2c04a 100644 --- a/gen/sam/sam_vulcan.py +++ b/gen/sam/sam_vulcan.py @@ -18,7 +18,7 @@ class VulcanGenerator(AirDefenseGroupGenerator): def generate(self): self.add_unit( - AirDefence.AAA_Vulcan_M163, + AirDefence.SPAAA_Vulcan_M163, "SPAAA", self.position.x, self.position.y, @@ -26,14 +26,14 @@ class VulcanGenerator(AirDefenseGroupGenerator): ) if random.randint(0, 1) == 1: self.add_unit( - AirDefence.AAA_Vulcan_M163, + AirDefence.SPAAA_Vulcan_M163, "SPAAA2", self.position.x, self.position.y, self.heading, ) self.add_unit( - Unarmed.Transport_M818, + Unarmed.Truck_M818_6x6, "TRUCK", self.position.x + 80, self.position.y, diff --git a/gen/sam/sam_zsu23.py b/gen/sam/sam_zsu23.py index aa70e54b..9caa1f01 100644 --- a/gen/sam/sam_zsu23.py +++ b/gen/sam/sam_zsu23.py @@ -24,7 +24,7 @@ class ZSU23Generator(AirDefenseGroupGenerator): ) for i, position in enumerate(positions): self.add_unit( - AirDefence.SPAAA_ZSU_23_4_Shilka, + AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish, "SPAA#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_zu23.py b/gen/sam/sam_zu23.py index b17367f4..0cd169a1 100644 --- a/gen/sam/sam_zu23.py +++ b/gen/sam/sam_zu23.py @@ -27,7 +27,7 @@ class ZU23Generator(AirDefenseGroupGenerator): for j in range(grid_y): index = index + 1 self.add_unit( - AirDefence.AAA_ZU_23_Closed, + AirDefence.AAA_ZU_23_Closed_Emplacement, "AAA#" + str(index), self.position.x + spacing * i, self.position.y + spacing * j, diff --git a/gen/sam/sam_zu23_ural.py b/gen/sam/sam_zu23_ural.py index 5f075f49..50e57a84 100644 --- a/gen/sam/sam_zu23_ural.py +++ b/gen/sam/sam_zu23_ural.py @@ -24,7 +24,7 @@ class ZU23UralGenerator(AirDefenseGroupGenerator): ) for i, position in enumerate(positions): self.add_unit( - AirDefence.AAA_ZU_23_on_Ural_375, + AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375, "SPAA#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_zu23_ural_insurgent.py b/gen/sam/sam_zu23_ural_insurgent.py index 3e8282e0..6c6f09ff 100644 --- a/gen/sam/sam_zu23_ural_insurgent.py +++ b/gen/sam/sam_zu23_ural_insurgent.py @@ -24,7 +24,7 @@ class ZU23UralInsurgentGenerator(AirDefenseGroupGenerator): ) for i, position in enumerate(positions): self.add_unit( - AirDefence.AAA_ZU_23_Insurgent_on_Ural_375, + AirDefence.SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375, "SPAA#" + str(i), position[0], position[1], diff --git a/pydcs b/pydcs index 42de2ec3..cd14f0a0 160000 --- a/pydcs +++ b/pydcs @@ -1 +1 @@ -Subproject commit 42de2ec352903d592ca123950b4b12a15ffa6544 +Subproject commit cd14f0a049d2bfdf1fa2e4e71f6258cd49040819 diff --git a/pydcs_extensions/a4ec/a4ec.py b/pydcs_extensions/a4ec/a4ec.py index 01e0c88f..6582ae94 100644 --- a/pydcs_extensions/a4ec/a4ec.py +++ b/pydcs_extensions/a4ec/a4ec.py @@ -6,98 +6,431 @@ from dcs.weapons_data import Weapons class WeaponsA4EC: - AN_M57__2__TER_ = {"clsid": "{AN-M57_TER_2_L}", "name": "AN-M57 *2 (TER)", "weight": 273.6} - AN_M57__2__TER__ = {"clsid": "{AN-M57_TER_2_R}", "name": "AN-M57 *2 (TER)", "weight": 273.6} - AN_M57__3__TER_ = {"clsid": "{AN-M57_TER_3_C}", "name": "AN-M57 *3 (TER)", "weight": 386.6} - AN_M57__5__MER_ = {"clsid": "{AN-M57_MER_5_L}", "name": "AN-M57 *5 (MER)", "weight": 664.8} - AN_M57__5__MER__ = {"clsid": "{AN-M57_MER_5_R}", "name": "AN-M57 *5 (MER)", "weight": 664.8} - AN_M57__6__MER_ = {"clsid": "{AN-M57_MER_6_C}", "name": "AN-M57 *6 (MER)", "weight": 777.8} + AN_M57__2__TER_ = { + "clsid": "{AN-M57_TER_2_L}", + "name": "AN-M57 *2 (TER)", + "weight": 273.6, + } + AN_M57__2__TER__ = { + "clsid": "{AN-M57_TER_2_R}", + "name": "AN-M57 *2 (TER)", + "weight": 273.6, + } + AN_M57__3__TER_ = { + "clsid": "{AN-M57_TER_3_C}", + "name": "AN-M57 *3 (TER)", + "weight": 386.6, + } + AN_M57__5__MER_ = { + "clsid": "{AN-M57_MER_5_L}", + "name": "AN-M57 *5 (MER)", + "weight": 664.8, + } + AN_M57__5__MER__ = { + "clsid": "{AN-M57_MER_5_R}", + "name": "AN-M57 *5 (MER)", + "weight": 664.8, + } + AN_M57__6__MER_ = { + "clsid": "{AN-M57_MER_6_C}", + "name": "AN-M57 *6 (MER)", + "weight": 777.8, + } AN_M66A2 = {"clsid": "{AN-M66A2}", "name": "AN-M66A2", "weight": 970.68688} AN_M81 = {"clsid": "{AN-M81}", "name": "AN-M81", "weight": 117.93392} - AN_M81__5__MER_ = {"clsid": "{AN-M81_MER_5_L}", "name": "AN-M81 *5 (MER)", "weight": 689.3} - AN_M81__5__MER__ = {"clsid": "{AN-M81_MER_5_R}", "name": "AN-M81 *5 (MER)", "weight": 689.3} - AN_M81__6__MER_ = {"clsid": "{AN-M81_MER_6_C}", "name": "AN-M81 *6 (MER)", "weight": 807.2} + AN_M81__5__MER_ = { + "clsid": "{AN-M81_MER_5_L}", + "name": "AN-M81 *5 (MER)", + "weight": 689.3, + } + AN_M81__5__MER__ = { + "clsid": "{AN-M81_MER_5_R}", + "name": "AN-M81 *5 (MER)", + "weight": 689.3, + } + AN_M81__6__MER_ = { + "clsid": "{AN-M81_MER_6_C}", + "name": "AN-M81 *6 (MER)", + "weight": 807.2, + } AN_M88 = {"clsid": "{AN-M88}", "name": "AN-M88", "weight": 98.0665904} - AN_M88__5__MER_ = {"clsid": "{AN-M88_MER_5_L}", "name": "AN-M88 *5 (MER)", "weight": 589.8} - AN_M88__5__MER__ = {"clsid": "{AN-M88_MER_5_R}", "name": "AN-M88 *5 (MER)", "weight": 589.8} - AN_M88__6__MER_ = {"clsid": "{AN-M88_MER_6_C}", "name": "AN-M88 *6 (MER)", "weight": 687.8} + AN_M88__5__MER_ = { + "clsid": "{AN-M88_MER_5_L}", + "name": "AN-M88 *5 (MER)", + "weight": 589.8, + } + AN_M88__5__MER__ = { + "clsid": "{AN-M88_MER_5_R}", + "name": "AN-M88 *5 (MER)", + "weight": 589.8, + } + AN_M88__6__MER_ = { + "clsid": "{AN-M88_MER_6_C}", + "name": "AN-M88 *6 (MER)", + "weight": 687.8, + } CBU_1_A = {"clsid": "{CBU-1/A}", "name": "CBU-1/A", "weight": 458.921706} - CBU_1_A__2 = {"clsid": "{CBU-1/A_TER_2_L}", "name": "CBU-1/A *2", "weight": 713.473056} - CBU_1_A__2_ = {"clsid": "{CBU-1/A_TER_2_R}", "name": "CBU-1/A *2", "weight": 713.473056} + CBU_1_A__2 = { + "clsid": "{CBU-1/A_TER_2_L}", + "name": "CBU-1/A *2", + "weight": 713.473056, + } + CBU_1_A__2_ = { + "clsid": "{CBU-1/A_TER_2_R}", + "name": "CBU-1/A *2", + "weight": 713.473056, + } CBU_2B_A = {"clsid": "{CBU-2B/A}", "name": "CBU-2B/A", "weight": 379.543106} - CBU_2B_A__2 = {"clsid": "{CBU-2B/A_TER_2_L}", "name": "CBU-2B/A *2", "weight": 806.686212} - CBU_2B_A__2_ = {"clsid": "{CBU-2B/A_TER_2_R}", "name": "CBU-2B/A *2", "weight": 806.686212} + CBU_2B_A__2 = { + "clsid": "{CBU-2B/A_TER_2_L}", + "name": "CBU-2B/A *2", + "weight": 806.686212, + } + CBU_2B_A__2_ = { + "clsid": "{CBU-2B/A_TER_2_R}", + "name": "CBU-2B/A *2", + "weight": 806.686212, + } CBU_2_A = {"clsid": "{CBU-2/A}", "name": "CBU-2/A", "weight": 343.822736} - CBU_2_A__2 = {"clsid": "{CBU-2/A_TER_2_L}", "name": "CBU-2/A *2", "weight": 735.245472} - CBU_2_A__2_ = {"clsid": "{CBU-2/A_TER_2_R}", "name": "CBU-2/A *2", "weight": 735.245472} - D_704_Refueling_Pod = {"clsid": "{D-704_BUDDY_POD}", "name": "D-704 Refueling Pod", "weight": 1234.532648} - Fuel_Tank_150_gallons = {"clsid": "{DFT-150gal}", "name": "Fuel Tank 150 gallons", "weight": 515.888512} - Fuel_Tank_300_gallons = {"clsid": "{DFT-300gal}", "name": "Fuel Tank 300 gallons", "weight": 991.407336} - Fuel_Tank_300_gallons_ = {"clsid": "{DFT-300gal_LR}", "name": "Fuel Tank 300 gallons", "weight": 998.664808} - Fuel_Tank_400_gallons = {"clsid": "{DFT-400gal}", "name": "Fuel Tank 400 gallons", "weight": 1320.06208} - LAU_10_2___4_ZUNI_MK_71 = {"clsid": "{LAU-10 ZUNI_TER_2_C}", "name": "LAU-10*2 - 4 ZUNI MK 71", "weight": 927.6} - LAU_10_2___4_ZUNI_MK_71_ = {"clsid": "{LAU-10 ZUNI_TER_2_L}", "name": "LAU-10*2 - 4 ZUNI MK 71", "weight": 927.6} - LAU_10_2___4_ZUNI_MK_71__ = {"clsid": "{LAU-10 ZUNI_TER_2_R}", "name": "LAU-10*2 - 4 ZUNI MK 71", "weight": 927.6} - LAU_10_3___4_ZUNI_MK_71 = {"clsid": "{LAU-10 ZUNI_TER_3_C}", "name": "LAU-10*3 - 4 ZUNI MK 71", "weight": 1367.6} - LAU_3_2___19_FFAR_M156_WP = {"clsid": "{LAU-3 FFAR WP156_TER_2_C}", "name": "LAU-3*2 - 19 FFAR M156 WP", "weight": 673.3414512} - LAU_3_2___19_FFAR_M156_WP_ = {"clsid": "{LAU-3 FFAR WP156_TER_2_L}", "name": "LAU-3*2 - 19 FFAR M156 WP", "weight": 673.3414512} - LAU_3_2___19_FFAR_M156_WP__ = {"clsid": "{LAU-3 FFAR WP156_TER_2_R}", "name": "LAU-3*2 - 19 FFAR M156 WP", "weight": 673.3414512} - LAU_3_2___19_FFAR_Mk1_HE = {"clsid": "{LAU-3 FFAR Mk1 HE_TER_2_C}", "name": "LAU-3*2 - 19 FFAR Mk1 HE", "weight": 618.184664} - LAU_3_2___19_FFAR_Mk1_HE_ = {"clsid": "{LAU-3 FFAR Mk1 HE_TER_2_L}", "name": "LAU-3*2 - 19 FFAR Mk1 HE", "weight": 618.184664} - LAU_3_2___19_FFAR_Mk1_HE__ = {"clsid": "{LAU-3 FFAR Mk1 HE_TER_2_R}", "name": "LAU-3*2 - 19 FFAR Mk1 HE", "weight": 618.184664} - LAU_3_2___19_FFAR_Mk5_HEAT = {"clsid": "{LAU-3 FFAR Mk5 HEAT_TER_2_C}", "name": "LAU-3*2 - 19 FFAR Mk5 HEAT", "weight": 619.9083136} - LAU_3_2___19_FFAR_Mk5_HEAT_ = {"clsid": "{LAU-3 FFAR Mk5 HEAT_TER_2_L}", "name": "LAU-3*2 - 19 FFAR Mk5 HEAT", "weight": 619.9083136} - LAU_3_2___19_FFAR_Mk5_HEAT__ = {"clsid": "{LAU-3 FFAR Mk5 HEAT_TER_2_R}", "name": "LAU-3*2 - 19 FFAR Mk5 HEAT", "weight": 619.9083136} - LAU_3_3___19_FFAR_M156_WP = {"clsid": "{LAU-3 FFAR WP156_TER_3_C}", "name": "LAU-3*3 - 19 FFAR M156 WP", "weight": 986.2121768} - LAU_3_3___19_FFAR_Mk1_HE = {"clsid": "{LAU-3 FFAR Mk1 HE_TER_3_C}", "name": "LAU-3*3 - 19 FFAR Mk1 HE", "weight": 903.476996} - LAU_3_3___19_FFAR_Mk5_HEAT = {"clsid": "{LAU-3 FFAR Mk5 HEAT_TER_3_C}", "name": "LAU-3*3 - 19 FFAR Mk5 HEAT", "weight": 906.0624704} - LAU_68_2___7_FFAR_M156_WP = {"clsid": "{LAU-68 FFAR WP156_TER_2_C}", "name": "LAU-68*2 - 7 FFAR M156 WP", "weight": 287.9121136} - LAU_68_2___7_FFAR_M156_WP_ = {"clsid": "{LAU-68 FFAR WP156_TER_2_L}", "name": "LAU-68*2 - 7 FFAR M156 WP", "weight": 287.9121136} - LAU_68_2___7_FFAR_M156_WP__ = {"clsid": "{LAU-68 FFAR WP156_TER_2_R}", "name": "LAU-68*2 - 7 FFAR M156 WP", "weight": 287.9121136} - LAU_68_2___7_FFAR_Mk1_HE = {"clsid": "{LAU-68 FFAR Mk1 HE_TER_2_C}", "name": "LAU-68*2 - 7 FFAR Mk1 HE", "weight": 267.591192} - LAU_68_2___7_FFAR_Mk1_HE_ = {"clsid": "{LAU-68 FFAR Mk1 HE_TER_2_L}", "name": "LAU-68*2 - 7 FFAR Mk1 HE", "weight": 267.591192} - LAU_68_2___7_FFAR_Mk1_HE__ = {"clsid": "{LAU-68 FFAR Mk1 HE_TER_2_R}", "name": "LAU-68*2 - 7 FFAR Mk1 HE", "weight": 267.591192} - LAU_68_2___7_FFAR_Mk5_HEAT = {"clsid": "{LAU-68 FFAR Mk5 HEAT_TER_2_C}", "name": "LAU-68*2 - 7 FFAR Mk5 HEAT", "weight": 268.2262208} - LAU_68_2___7_FFAR_Mk5_HEAT_ = {"clsid": "{LAU-68 FFAR Mk5 HEAT_TER_2_L}", "name": "LAU-68*2 - 7 FFAR Mk5 HEAT", "weight": 268.2262208} - LAU_68_2___7_FFAR_Mk5_HEAT__ = {"clsid": "{LAU-68 FFAR Mk5 HEAT_TER_2_R}", "name": "LAU-68*2 - 7 FFAR Mk5 HEAT", "weight": 268.2262208} - LAU_68_3___7_FFAR_M156_WP = {"clsid": "{LAU-68 FFAR WP156_TER_3_C}", "name": "LAU-68*3 - 7 FFAR M156 WP", "weight": 408.0681704} - LAU_68_3___7_FFAR_Mk1_HE = {"clsid": "{LAU-68 FFAR Mk1 HE_TER_3_C}", "name": "LAU-68*3 - 7 FFAR Mk1 HE", "weight": 377.586788} - LAU_68_3___7_FFAR_Mk5_HEAT = {"clsid": "{LAU-68 FFAR Mk5 HEAT_TER_3_C}", "name": "LAU-68*3 - 7 FFAR Mk5 HEAT", "weight": 378.5393312} + CBU_2_A__2 = { + "clsid": "{CBU-2/A_TER_2_L}", + "name": "CBU-2/A *2", + "weight": 735.245472, + } + CBU_2_A__2_ = { + "clsid": "{CBU-2/A_TER_2_R}", + "name": "CBU-2/A *2", + "weight": 735.245472, + } + D_704_Refueling_Pod = { + "clsid": "{D-704_BUDDY_POD}", + "name": "D-704 Refueling Pod", + "weight": 1234.532648, + } + Fuel_Tank_150_gallons = { + "clsid": "{DFT-150gal}", + "name": "Fuel Tank 150 gallons", + "weight": 515.888512, + } + Fuel_Tank_300_gallons = { + "clsid": "{DFT-300gal}", + "name": "Fuel Tank 300 gallons", + "weight": 991.407336, + } + Fuel_Tank_300_gallons_ = { + "clsid": "{DFT-300gal_LR}", + "name": "Fuel Tank 300 gallons", + "weight": 998.664808, + } + Fuel_Tank_400_gallons = { + "clsid": "{DFT-400gal}", + "name": "Fuel Tank 400 gallons", + "weight": 1320.06208, + } + LAU_10_2___4_ZUNI_MK_71 = { + "clsid": "{LAU-10 ZUNI_TER_2_C}", + "name": "LAU-10*2 - 4 ZUNI MK 71", + "weight": 927.6, + } + LAU_10_2___4_ZUNI_MK_71_ = { + "clsid": "{LAU-10 ZUNI_TER_2_L}", + "name": "LAU-10*2 - 4 ZUNI MK 71", + "weight": 927.6, + } + LAU_10_2___4_ZUNI_MK_71__ = { + "clsid": "{LAU-10 ZUNI_TER_2_R}", + "name": "LAU-10*2 - 4 ZUNI MK 71", + "weight": 927.6, + } + LAU_10_3___4_ZUNI_MK_71 = { + "clsid": "{LAU-10 ZUNI_TER_3_C}", + "name": "LAU-10*3 - 4 ZUNI MK 71", + "weight": 1367.6, + } + LAU_3_2___19_FFAR_M156_WP = { + "clsid": "{LAU-3 FFAR WP156_TER_2_C}", + "name": "LAU-3*2 - 19 FFAR M156 WP", + "weight": 673.3414512, + } + LAU_3_2___19_FFAR_M156_WP_ = { + "clsid": "{LAU-3 FFAR WP156_TER_2_L}", + "name": "LAU-3*2 - 19 FFAR M156 WP", + "weight": 673.3414512, + } + LAU_3_2___19_FFAR_M156_WP__ = { + "clsid": "{LAU-3 FFAR WP156_TER_2_R}", + "name": "LAU-3*2 - 19 FFAR M156 WP", + "weight": 673.3414512, + } + LAU_3_2___19_FFAR_Mk1_HE = { + "clsid": "{LAU-3 FFAR Mk1 HE_TER_2_C}", + "name": "LAU-3*2 - 19 FFAR Mk1 HE", + "weight": 618.184664, + } + LAU_3_2___19_FFAR_Mk1_HE_ = { + "clsid": "{LAU-3 FFAR Mk1 HE_TER_2_L}", + "name": "LAU-3*2 - 19 FFAR Mk1 HE", + "weight": 618.184664, + } + LAU_3_2___19_FFAR_Mk1_HE__ = { + "clsid": "{LAU-3 FFAR Mk1 HE_TER_2_R}", + "name": "LAU-3*2 - 19 FFAR Mk1 HE", + "weight": 618.184664, + } + LAU_3_2___19_FFAR_Mk5_HEAT = { + "clsid": "{LAU-3 FFAR Mk5 HEAT_TER_2_C}", + "name": "LAU-3*2 - 19 FFAR Mk5 HEAT", + "weight": 619.9083136, + } + LAU_3_2___19_FFAR_Mk5_HEAT_ = { + "clsid": "{LAU-3 FFAR Mk5 HEAT_TER_2_L}", + "name": "LAU-3*2 - 19 FFAR Mk5 HEAT", + "weight": 619.9083136, + } + LAU_3_2___19_FFAR_Mk5_HEAT__ = { + "clsid": "{LAU-3 FFAR Mk5 HEAT_TER_2_R}", + "name": "LAU-3*2 - 19 FFAR Mk5 HEAT", + "weight": 619.9083136, + } + LAU_3_3___19_FFAR_M156_WP = { + "clsid": "{LAU-3 FFAR WP156_TER_3_C}", + "name": "LAU-3*3 - 19 FFAR M156 WP", + "weight": 986.2121768, + } + LAU_3_3___19_FFAR_Mk1_HE = { + "clsid": "{LAU-3 FFAR Mk1 HE_TER_3_C}", + "name": "LAU-3*3 - 19 FFAR Mk1 HE", + "weight": 903.476996, + } + LAU_3_3___19_FFAR_Mk5_HEAT = { + "clsid": "{LAU-3 FFAR Mk5 HEAT_TER_3_C}", + "name": "LAU-3*3 - 19 FFAR Mk5 HEAT", + "weight": 906.0624704, + } + LAU_68_2___7_FFAR_M156_WP = { + "clsid": "{LAU-68 FFAR WP156_TER_2_C}", + "name": "LAU-68*2 - 7 FFAR M156 WP", + "weight": 287.9121136, + } + LAU_68_2___7_FFAR_M156_WP_ = { + "clsid": "{LAU-68 FFAR WP156_TER_2_L}", + "name": "LAU-68*2 - 7 FFAR M156 WP", + "weight": 287.9121136, + } + LAU_68_2___7_FFAR_M156_WP__ = { + "clsid": "{LAU-68 FFAR WP156_TER_2_R}", + "name": "LAU-68*2 - 7 FFAR M156 WP", + "weight": 287.9121136, + } + LAU_68_2___7_FFAR_Mk1_HE = { + "clsid": "{LAU-68 FFAR Mk1 HE_TER_2_C}", + "name": "LAU-68*2 - 7 FFAR Mk1 HE", + "weight": 267.591192, + } + LAU_68_2___7_FFAR_Mk1_HE_ = { + "clsid": "{LAU-68 FFAR Mk1 HE_TER_2_L}", + "name": "LAU-68*2 - 7 FFAR Mk1 HE", + "weight": 267.591192, + } + LAU_68_2___7_FFAR_Mk1_HE__ = { + "clsid": "{LAU-68 FFAR Mk1 HE_TER_2_R}", + "name": "LAU-68*2 - 7 FFAR Mk1 HE", + "weight": 267.591192, + } + LAU_68_2___7_FFAR_Mk5_HEAT = { + "clsid": "{LAU-68 FFAR Mk5 HEAT_TER_2_C}", + "name": "LAU-68*2 - 7 FFAR Mk5 HEAT", + "weight": 268.2262208, + } + LAU_68_2___7_FFAR_Mk5_HEAT_ = { + "clsid": "{LAU-68 FFAR Mk5 HEAT_TER_2_L}", + "name": "LAU-68*2 - 7 FFAR Mk5 HEAT", + "weight": 268.2262208, + } + LAU_68_2___7_FFAR_Mk5_HEAT__ = { + "clsid": "{LAU-68 FFAR Mk5 HEAT_TER_2_R}", + "name": "LAU-68*2 - 7 FFAR Mk5 HEAT", + "weight": 268.2262208, + } + LAU_68_3___7_FFAR_M156_WP = { + "clsid": "{LAU-68 FFAR WP156_TER_3_C}", + "name": "LAU-68*3 - 7 FFAR M156 WP", + "weight": 408.0681704, + } + LAU_68_3___7_FFAR_Mk1_HE = { + "clsid": "{LAU-68 FFAR Mk1 HE_TER_3_C}", + "name": "LAU-68*3 - 7 FFAR Mk1 HE", + "weight": 377.586788, + } + LAU_68_3___7_FFAR_Mk5_HEAT = { + "clsid": "{LAU-68 FFAR Mk5 HEAT_TER_3_C}", + "name": "LAU-68*3 - 7 FFAR Mk5 HEAT", + "weight": 378.5393312, + } MAK79_2_MK_20 = {"clsid": "{MAK79_MK20 2L}", "name": "MAK79 2 MK-20", "weight": 464} - MAK79_2_MK_20_ = {"clsid": "{MAK79_MK20 2R}", "name": "MAK79 2 MK-20", "weight": 464} + MAK79_2_MK_20_ = { + "clsid": "{MAK79_MK20 2R}", + "name": "MAK79 2 MK-20", + "weight": 464, + } MAK79_MK_20 = {"clsid": "{MAK79_MK20 1R}", "name": "MAK79 MK-20", "weight": 232} MAK79_MK_20_ = {"clsid": "{MAK79_MK20 1L}", "name": "MAK79 MK-20", "weight": 232} Mk4_HIPEG = {"clsid": "{Mk4 HIPEG}", "name": "Mk4 HIPEG", "weight": 612.35} - Mk_20__2__TER_ = {"clsid": "{Mk-20_TER_2_L}", "name": "Mk-20 *2 (TER)", "weight": 491.6} - Mk_20__2__TER__ = {"clsid": "{Mk-20_TER_2_R}", "name": "Mk-20 *2 (TER)", "weight": 491.6} - Mk_20__2__TER___ = {"clsid": "{Mk-20_TER_2_C}", "name": "Mk-20 *2 (TER)", "weight": 491.6} - Mk_20__3__TER_ = {"clsid": "{Mk-20_TER_3_C}", "name": "Mk-20 *3 (TER)", "weight": 713.6} + Mk_20__2__TER_ = { + "clsid": "{Mk-20_TER_2_L}", + "name": "Mk-20 *2 (TER)", + "weight": 491.6, + } + Mk_20__2__TER__ = { + "clsid": "{Mk-20_TER_2_R}", + "name": "Mk-20 *2 (TER)", + "weight": 491.6, + } + Mk_20__2__TER___ = { + "clsid": "{Mk-20_TER_2_C}", + "name": "Mk-20 *2 (TER)", + "weight": 491.6, + } + Mk_20__3__TER_ = { + "clsid": "{Mk-20_TER_3_C}", + "name": "Mk-20 *3 (TER)", + "weight": 713.6, + } Mk_77_mod_0 = {"clsid": "{mk77mod0}", "name": "Mk-77 mod 0", "weight": 340} Mk_77_mod_1 = {"clsid": "{mk77mod1}", "name": "Mk-77 mod 1", "weight": 230} - Mk_77_mod_1__2__TER_ = {"clsid": "{Mk-77 mod 1_TER_2_L}", "name": "Mk-77 mod 1 *2 (TER)", "weight": 507.6} - Mk_77_mod_1__2__TER__ = {"clsid": "{Mk-77 mod 1_TER_2_R}", "name": "Mk-77 mod 1 *2 (TER)", "weight": 507.6} - Mk_77_mod_1__2__TER___ = {"clsid": "{Mk-77 mod 1_TER_2_C}", "name": "Mk-77 mod 1 *2 (TER)", "weight": 507.6} - Mk_77_mod_1__4__MER_ = {"clsid": "{Mk-77 mod 1_MER_4_C}", "name": "Mk-77 mod 1 *4 (MER)", "weight": 1019.8} + Mk_77_mod_1__2__TER_ = { + "clsid": "{Mk-77 mod 1_TER_2_L}", + "name": "Mk-77 mod 1 *2 (TER)", + "weight": 507.6, + } + Mk_77_mod_1__2__TER__ = { + "clsid": "{Mk-77 mod 1_TER_2_R}", + "name": "Mk-77 mod 1 *2 (TER)", + "weight": 507.6, + } + Mk_77_mod_1__2__TER___ = { + "clsid": "{Mk-77 mod 1_TER_2_C}", + "name": "Mk-77 mod 1 *2 (TER)", + "weight": 507.6, + } + Mk_77_mod_1__4__MER_ = { + "clsid": "{Mk-77 mod 1_MER_4_C}", + "name": "Mk-77 mod 1 *4 (MER)", + "weight": 1019.8, + } Mk_81SE = {"clsid": "{MK-81SE}", "name": "Mk-81SE", "weight": 113.398} - Mk_81SE__5__MER_ = {"clsid": "{Mk-81SE_MER_5_L}", "name": "Mk-81SE *5 (MER)", "weight": 689.8} - Mk_81SE__5__MER__ = {"clsid": "{Mk-81SE_MER_5_R}", "name": "Mk-81SE *5 (MER)", "weight": 689.8} - Mk_81SE__6__MER_ = {"clsid": "{Mk-81SE_MER_6_C}", "name": "Mk-81SE *6 (MER)", "weight": 807.8} - Mk_81__5__MER_ = {"clsid": "{Mk-81_MER_5_L}", "name": "Mk-81 *5 (MER)", "weight": 689.8} - Mk_81__5__MER__ = {"clsid": "{Mk-81_MER_5_R}", "name": "Mk-81 *5 (MER)", "weight": 689.8} - Mk_81__6__MER_ = {"clsid": "{Mk-81_MER_6_C}", "name": "Mk-81 *6 (MER)", "weight": 807.8} - Mk_82_Snakeye__2__TER_ = {"clsid": "{Mk-82 Snakeye_TER_2_L}", "name": "Mk-82 Snakeye *2 (TER)", "weight": 529.6} - Mk_82_Snakeye__2__TER__ = {"clsid": "{Mk-82 Snakeye_TER_2_R}", "name": "Mk-82 Snakeye *2 (TER)", "weight": 529.6} - Mk_82_Snakeye__3__TER_ = {"clsid": "{Mk-82 Snakeye_TER_3_C}", "name": "Mk-82 Snakeye *3 (TER)", "weight": 770.6} - Mk_82_Snakeye__4__MER_ = {"clsid": "{Mk-82 Snakeye_MER_4_C}", "name": "Mk-82 Snakeye *4 (MER)", "weight": 1063.8} - Mk_82_Snakeye__6__MER_ = {"clsid": "{Mk-82 Snakeye_MER_6_C}", "name": "Mk-82 Snakeye *6 (MER)", "weight": 1545.8} - Mk_82__2__TER_ = {"clsid": "{Mk-82_TER_2_L}", "name": "Mk-82 *2 (TER)", "weight": 529.6} - Mk_82__2__TER__ = {"clsid": "{Mk-82_TER_2_R}", "name": "Mk-82 *2 (TER)", "weight": 529.6} - Mk_82__3__TER_ = {"clsid": "{Mk-82_TER_3_C}", "name": "Mk-82 *3 (TER)", "weight": 770.6} - Mk_82__4__MER_ = {"clsid": "{Mk-82_MER_4_C}", "name": "Mk-82 *4 (MER)", "weight": 1063.8} - Mk_82__6__MER_ = {"clsid": "{Mk-82_MER_6_C}", "name": "Mk-82 *6 (MER)", "weight": 1545.8} - Mk_83__2__TER_ = {"clsid": "{Mk-83_TER_2_C}", "name": "Mk-83 *2 (TER)", "weight": 941.6} - Mk_83__3__TER_ = {"clsid": "{Mk-83_TER_3_C}", "name": "Mk-83 *3 (TER)", "weight": 1388.6} - _3_LAU_61 = {"clsid": "{TER,LAU-61*3}", "name": "3*LAU-61", "weight": 98} + Mk_81SE__5__MER_ = { + "clsid": "{Mk-81SE_MER_5_L}", + "name": "Mk-81SE *5 (MER)", + "weight": 689.8, + } + Mk_81SE__5__MER__ = { + "clsid": "{Mk-81SE_MER_5_R}", + "name": "Mk-81SE *5 (MER)", + "weight": 689.8, + } + Mk_81SE__6__MER_ = { + "clsid": "{Mk-81SE_MER_6_C}", + "name": "Mk-81SE *6 (MER)", + "weight": 807.8, + } + Mk_81__5__MER_ = { + "clsid": "{Mk-81_MER_5_L}", + "name": "Mk-81 *5 (MER)", + "weight": 689.8, + } + Mk_81__5__MER__ = { + "clsid": "{Mk-81_MER_5_R}", + "name": "Mk-81 *5 (MER)", + "weight": 689.8, + } + Mk_81__6__MER_ = { + "clsid": "{Mk-81_MER_6_C}", + "name": "Mk-81 *6 (MER)", + "weight": 807.8, + } + Mk_82_Snakeye__2__TER_ = { + "clsid": "{Mk-82 Snakeye_TER_2_L}", + "name": "Mk-82 Snakeye *2 (TER)", + "weight": 529.6, + } + Mk_82_Snakeye__2__TER__ = { + "clsid": "{Mk-82 Snakeye_TER_2_R}", + "name": "Mk-82 Snakeye *2 (TER)", + "weight": 529.6, + } + Mk_82_Snakeye__3__TER_ = { + "clsid": "{Mk-82 Snakeye_TER_3_C}", + "name": "Mk-82 Snakeye *3 (TER)", + "weight": 770.6, + } + Mk_82_Snakeye__4__MER_ = { + "clsid": "{Mk-82 Snakeye_MER_4_C}", + "name": "Mk-82 Snakeye *4 (MER)", + "weight": 1063.8, + } + Mk_82_Snakeye__6__MER_ = { + "clsid": "{Mk-82 Snakeye_MER_6_C}", + "name": "Mk-82 Snakeye *6 (MER)", + "weight": 1545.8, + } + Mk_82__2__TER_ = { + "clsid": "{Mk-82_TER_2_L}", + "name": "Mk-82 *2 (TER)", + "weight": 529.6, + } + Mk_82__2__TER__ = { + "clsid": "{Mk-82_TER_2_R}", + "name": "Mk-82 *2 (TER)", + "weight": 529.6, + } + Mk_82__3__TER_ = { + "clsid": "{Mk-82_TER_3_C}", + "name": "Mk-82 *3 (TER)", + "weight": 770.6, + } + Mk_82__4__MER_ = { + "clsid": "{Mk-82_MER_4_C}", + "name": "Mk-82 *4 (MER)", + "weight": 1063.8, + } + Mk_82__6__MER_ = { + "clsid": "{Mk-82_MER_6_C}", + "name": "Mk-82 *6 (MER)", + "weight": 1545.8, + } + Mk_83__2__TER_ = { + "clsid": "{Mk-83_TER_2_C}", + "name": "Mk-83 *2 (TER)", + "weight": 941.6, + } + Mk_83__3__TER_ = { + "clsid": "{Mk-83_TER_3_C}", + "name": "Mk-83 *3 (TER)", + "weight": 1388.6, + } + _3_LAU_61 = ({"clsid": "{TER,LAU-61*3}", "name": "3*LAU-61", "weight": 98},) + Fuel_Tank_150_gallons__EMPTY_ = { + "clsid": "{DFT-150gal_EMPTY}", + "name": "Fuel_Tank_150_gallons__EMPTY", + "weight": 61.688512, + } + Fuel_Tank_300_gallons__EMPTY_ = { + "clsid": "{DFT-300gal_EMPTY}", + "name": "Fuel_Tank_300_gallons__EMPTY", + "weight": 83.007336, + } + Fuel_Tank_300_gallons__EMPTY__ = { + "clsid": "{DFT-300gal_LR_EMPTY}", + "name": "Fuel_Tank_300_gallons__EMPTY", + "weight": 90.264808, + } + Fuel_Tank_400_gallons__EMPTY_ = { + "clsid": "{DFT-400gal_EMPTY}", + "name": "Fuel_Tank_400_gallons__EMPTY", + "weight": 108.86208, + } + class A_4E_C(PlaneType): id = "A-4E-C" @@ -112,7 +445,7 @@ class A_4E_C(PlaneType): charge_total = 60 chaff_charge_size = 1 flare_charge_size = 1 - category = "Interceptor" #{78EFB7A2-FD52-4b57-A6A6-3BF0E1D6555F} + category = "Interceptor" # {78EFB7A2-FD52-4b57-A6A6-3BF0E1D6555F} radio_frequency = 254 panel_radio = { @@ -137,7 +470,7 @@ class A_4E_C(PlaneType): 7: 257, 14: 263, 19: 266, - 15: 261 + 15: 261, }, }, } @@ -153,7 +486,6 @@ class A_4E_C(PlaneType): } class Properties: - class HideECMPanel: id = "HideECMPanel" @@ -219,7 +551,6 @@ class A_4E_C(PlaneType): _14_seconds = 7 class Liveries: - class Georgia(Enum): Unmarked = "Unmarked" Community_A_4E = "Community A-4E" @@ -425,7 +756,9 @@ class A_4E_C(PlaneType): Aggressor_USN_TopGun = "Aggressor USN TopGun" Aggressor_USN_VF_126_Bandits = "Aggressor USN VF-126 Bandits" Aggressor_USN_VF_127_Royal_Blues = "Aggressor USN VF-127 Royal Blues" - Aggressor_USN_VFA_127_Cyclons__Forest = "Aggressor USN VFA-127 Cyclons (Forest)" + Aggressor_USN_VFA_127_Cyclons__Forest = ( + "Aggressor USN VFA-127 Cyclons (Forest)" + ) Aggressor_USN_VFA_127_Cyclons__Sea = "Aggressor USN VFA-127 Cyclons (Sea)" class USA(Enum): @@ -476,7 +809,9 @@ class A_4E_C(PlaneType): Trainer_USN_VC_8_Redtails = "Trainer USN VC-8 Redtails" Aggressor_USN_VF_126_Bandits = "Aggressor USN VF-126 Bandits" Aggressor_USN_VF_127_Royal_Blues = "Aggressor USN VF-127 Royal Blues" - Aggressor_USN_VFA_127_Cyclons__Forest = "Aggressor USN VFA-127 Cyclons (Forest)" + Aggressor_USN_VFA_127_Cyclons__Forest = ( + "Aggressor USN VFA-127 Cyclons (Forest)" + ) Aggressor_USN_VFA_127_Cyclons__Sea = "Aggressor USN VFA-127 Cyclons (Sea)" Trainer_USN_VT_7_Eagles = "Trainer USN VT-7 Eagles" @@ -515,268 +850,522 @@ class A_4E_C(PlaneType): Community_A_4E = "Community A-4E" Community_A_4E_II = "Community A-4E II" - class Pylon1: - LAU_10___4_ZUNI_MK_71 = (1, Weapons.LAU_10___4_ZUNI_MK_71) - LAU_3___19_FFAR_M156_WP = (1, Weapons.LAU_3___19_FFAR_M156_WP) - LAU_3___19_FFAR_Mk1_HE = (1, Weapons.LAU_3___19_FFAR_Mk1_HE) - LAU_3___19_FFAR_Mk5_HEAT = (1, Weapons.LAU_3___19_FFAR_Mk5_HEAT) - LAU_68___7_FFAR_M156_WP = (1, Weapons.LAU_68___7_FFAR_M156_WP) - LAU_68___7_FFAR_Mk1_HE = (1, Weapons.LAU_68___7_FFAR_Mk1_HE) - LAU_68___7_FFAR_Mk5_HEAT = (1, Weapons.LAU_68___7_FFAR_Mk5_HEAT) - AGM_45A = (1, Weapons.AGM_45A) -#ERRR {AGM12_B} - Mk_20 = (1, Weapons.Mk_20) - Mk_81 = (1, Weapons.Mk_81) - Mk_81SE = (1, WeaponsA4EC.Mk_81SE) - Mk_82 = (1, Weapons.Mk_82) - Mk_82_SnakeEye = (1, Weapons.Mk_82_SnakeEye) - Mk_77_mod_1 = (1, WeaponsA4EC.Mk_77_mod_1) - AN_M30A1 = (1, Weapons.AN_M30A1) - AN_M57 = (1, Weapons.AN_M57) - AN_M64 = (1, Weapons.AN_M64) - AN_M81 = (1, WeaponsA4EC.AN_M81) - AN_M88 = (1, WeaponsA4EC.AN_M88) - LAU_68___7_2_75__rockets_M257__Parachute_illumination_ = (1, Weapons.LAU_68___7_2_75__rockets_M257__Parachute_illumination_) - Smokewinder___red = (1, Weapons.Smokewinder___red) - Smokewinder___green = (1, Weapons.Smokewinder___green) - Smokewinder___blue = (1, Weapons.Smokewinder___blue) - Smokewinder___white = (1, Weapons.Smokewinder___white) - Smokewinder___yellow = (1, Weapons.Smokewinder___yellow) - Smokewinder___orange = (1, Weapons.Smokewinder___orange) -#ERRR + class Pylon1: + LAU_7_with_AIM_9B_Sidewinder_IR_AAM = ( + 1, + Weapons.LAU_7_with_AIM_9B_Sidewinder_IR_AAM, + ) + LAU_7_with_AIM_9P_Sidewinder_IR_AAM = ( + 1, + Weapons.LAU_7_with_AIM_9P_Sidewinder_IR_AAM, + ) + LAU_7_with_AIM_9P5_Sidewinder_IR_AAM = ( + 1, + Weapons.LAU_7_with_AIM_9P5_Sidewinder_IR_AAM, + ) + LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = ( + 1, + Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG, + ) + LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = ( + 1, + Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos, + ) + LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = ( + 1, + Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE, + ) + LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = ( + 1, + Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT, + ) + LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = ( + 1, + Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos, + ) + LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = ( + 1, + Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE, + ) + LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = ( + 1, + Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT, + ) + AGM_45A_Shrike_ARM = (1, Weapons.AGM_45A_Shrike_ARM) + # ERRR {AGM12_B} + Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets = ( + 1, + Weapons.Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets, + ) + Mk_81___250lb_GP_Bomb_LD = (1, Weapons.Mk_81___250lb_GP_Bomb_LD) + Mk_81SE = (1, WeaponsA4EC.Mk_81SE) + Mk_82___500lb_GP_Bomb_LD = (1, Weapons.Mk_82___500lb_GP_Bomb_LD) + Mk_82_Snakeye___500lb_GP_Bomb_HD = ( + 1, + Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD, + ) + Mk_77_mod_1 = (1, WeaponsA4EC.Mk_77_mod_1) + AN_M30A1___100lb_GP_Bomb_LD = (1, Weapons.AN_M30A1___100lb_GP_Bomb_LD) + AN_M57___250lb_GP_Bomb_LD = (1, Weapons.AN_M57___250lb_GP_Bomb_LD) + AN_M64___500lb_GP_Bomb_LD = (1, Weapons.AN_M64___500lb_GP_Bomb_LD) + AN_M81 = (1, WeaponsA4EC.AN_M81) + AN_M88 = (1, WeaponsA4EC.AN_M88) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum = ( + 1, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum, + ) + Smokewinder___red = (1, Weapons.Smokewinder___red) + Smokewinder___green = (1, Weapons.Smokewinder___green) + Smokewinder___blue = (1, Weapons.Smokewinder___blue) + Smokewinder___white = (1, Weapons.Smokewinder___white) + Smokewinder___yellow = (1, Weapons.Smokewinder___yellow) + Smokewinder___orange = (1, Weapons.Smokewinder___orange) + SUU_25_x_8_LUU_2___Target_Marker_Flares = ( + 1, + Weapons.SUU_25_x_8_LUU_2___Target_Marker_Flares, + ) - class Pylon2: - Fuel_Tank_300_gallons_ = (2, WeaponsA4EC.Fuel_Tank_300_gallons_) - Fuel_Tank_150_gallons = (2, WeaponsA4EC.Fuel_Tank_150_gallons) - LAU_7_GAR_8_Sidewinder_IR_AAM = (2, Weapons.LAU_7_GAR_8_Sidewinder_IR_AAM) - LAU_7_AIM_9P_Sidewinder_IR_AAM = (2, Weapons.LAU_7_AIM_9P_Sidewinder_IR_AAM) - LAU_7_AIM_9P5_Sidewinder_IR_AAM = (2, Weapons.LAU_7_AIM_9P5_Sidewinder_IR_AAM) - LAU_10___4_ZUNI_MK_71 = (2, Weapons.LAU_10___4_ZUNI_MK_71) - LAU_10_2___4_ZUNI_MK_71_ = (2, WeaponsA4EC.LAU_10_2___4_ZUNI_MK_71_) - LAU_3___19_FFAR_M156_WP = (2, Weapons.LAU_3___19_FFAR_M156_WP) - LAU_3___19_FFAR_Mk1_HE = (2, Weapons.LAU_3___19_FFAR_Mk1_HE) - LAU_3___19_FFAR_Mk5_HEAT = (2, Weapons.LAU_3___19_FFAR_Mk5_HEAT) - LAU_3_2___19_FFAR_M156_WP_ = (2, WeaponsA4EC.LAU_3_2___19_FFAR_M156_WP_) - LAU_3_2___19_FFAR_Mk1_HE_ = (2, WeaponsA4EC.LAU_3_2___19_FFAR_Mk1_HE_) - LAU_3_2___19_FFAR_Mk5_HEAT_ = (2, WeaponsA4EC.LAU_3_2___19_FFAR_Mk5_HEAT_) - LAU_68___7_FFAR_M156_WP = (2, Weapons.LAU_68___7_FFAR_M156_WP) - LAU_68___7_FFAR_Mk1_HE = (2, Weapons.LAU_68___7_FFAR_Mk1_HE) - LAU_68___7_FFAR_Mk5_HEAT = (2, Weapons.LAU_68___7_FFAR_Mk5_HEAT) - LAU_68_2___7_FFAR_M156_WP_ = (2, WeaponsA4EC.LAU_68_2___7_FFAR_M156_WP_) - LAU_68_2___7_FFAR_Mk1_HE_ = (2, WeaponsA4EC.LAU_68_2___7_FFAR_Mk1_HE_) - LAU_68_2___7_FFAR_Mk5_HEAT_ = (2, WeaponsA4EC.LAU_68_2___7_FFAR_Mk5_HEAT_) - AGM_45A = (2, Weapons.AGM_45A) -#ERRR {AGM12_C} -#ERRR {AGM12_B} - AGM_62 = (2, Weapons.AGM_62) - Mk_20 = (2, Weapons.Mk_20) - Mk_81 = (2, Weapons.Mk_81) - Mk_81SE = (2, WeaponsA4EC.Mk_81SE) - Mk_82 = (2, Weapons.Mk_82) - Mk_82_SnakeEye = (2, Weapons.Mk_82_SnakeEye) - Mk_83 = (2, Weapons.Mk_83) - Mk_84 = (2, Weapons.Mk_84) - M117 = (2, Weapons.M117) - Mk_77_mod_0 = (2, WeaponsA4EC.Mk_77_mod_0) - Mk_77_mod_1 = (2, WeaponsA4EC.Mk_77_mod_1) - AN_M30A1 = (2, Weapons.AN_M30A1) - AN_M57 = (2, Weapons.AN_M57) - AN_M64 = (2, Weapons.AN_M64) - AN_M65 = (2, Weapons.AN_M65) - AN_M81 = (2, WeaponsA4EC.AN_M81) - AN_M88 = (2, WeaponsA4EC.AN_M88) - CBU_1_A = (2, WeaponsA4EC.CBU_1_A) - CBU_2_A = (2, WeaponsA4EC.CBU_2_A) - CBU_2B_A = (2, WeaponsA4EC.CBU_2B_A) - CBU_1_A__2 = (2, WeaponsA4EC.CBU_1_A__2) - CBU_2_A__2 = (2, WeaponsA4EC.CBU_2_A__2) - CBU_2B_A__2 = (2, WeaponsA4EC.CBU_2B_A__2) - Mk_20__2__TER_ = (2, WeaponsA4EC.Mk_20__2__TER_) - Mk_81__5__MER_ = (2, WeaponsA4EC.Mk_81__5__MER_) - Mk_81SE__5__MER_ = (2, WeaponsA4EC.Mk_81SE__5__MER_) - Mk_82__2__TER_ = (2, WeaponsA4EC.Mk_82__2__TER_) - Mk_82_Snakeye__2__TER_ = (2, WeaponsA4EC.Mk_82_Snakeye__2__TER_) - AN_M57__5__MER_ = (2, WeaponsA4EC.AN_M57__5__MER_) - AN_M57__2__TER_ = (2, WeaponsA4EC.AN_M57__2__TER_) - AN_M81__5__MER_ = (2, WeaponsA4EC.AN_M81__5__MER_) - AN_M88__5__MER_ = (2, WeaponsA4EC.AN_M88__5__MER_) - Mk4_HIPEG = (2, WeaponsA4EC.Mk4_HIPEG) - Smokewinder___red = (2, Weapons.Smokewinder___red) - Smokewinder___green = (2, Weapons.Smokewinder___green) - Smokewinder___blue = (2, Weapons.Smokewinder___blue) - Smokewinder___white = (2, Weapons.Smokewinder___white) - Smokewinder___yellow = (2, Weapons.Smokewinder___yellow) - Smokewinder___orange = (2, Weapons.Smokewinder___orange) -#ERRR + # ERRR - class Pylon3: - Fuel_Tank_400_gallons = (3, WeaponsA4EC.Fuel_Tank_400_gallons) - Fuel_Tank_300_gallons = (3, WeaponsA4EC.Fuel_Tank_300_gallons) - Fuel_Tank_150_gallons = (3, WeaponsA4EC.Fuel_Tank_150_gallons) - D_704_Refueling_Pod = (3, WeaponsA4EC.D_704_Refueling_Pod) -#ERRR {3*LAU-61} - LAU_68_3___7_2_75__rockets_MK5__HE_ = (3, Weapons.LAU_68_3___7_2_75__rockets_MK5__HE_) - LAU_10___4_ZUNI_MK_71 = (3, Weapons.LAU_10___4_ZUNI_MK_71) - LAU_10_2___4_ZUNI_MK_71 = (3, WeaponsA4EC.LAU_10_2___4_ZUNI_MK_71) - LAU_10_3___4_ZUNI_MK_71 = (3, WeaponsA4EC.LAU_10_3___4_ZUNI_MK_71) - LAU_3___19_FFAR_M156_WP = (3, Weapons.LAU_3___19_FFAR_M156_WP) - LAU_3___19_FFAR_Mk1_HE = (3, Weapons.LAU_3___19_FFAR_Mk1_HE) - LAU_3___19_FFAR_Mk5_HEAT = (3, Weapons.LAU_3___19_FFAR_Mk5_HEAT) - LAU_3_2___19_FFAR_M156_WP = (3, WeaponsA4EC.LAU_3_2___19_FFAR_M156_WP) - LAU_3_2___19_FFAR_Mk1_HE = (3, WeaponsA4EC.LAU_3_2___19_FFAR_Mk1_HE) - LAU_3_2___19_FFAR_Mk5_HEAT = (3, WeaponsA4EC.LAU_3_2___19_FFAR_Mk5_HEAT) - LAU_3_3___19_FFAR_M156_WP = (3, WeaponsA4EC.LAU_3_3___19_FFAR_M156_WP) - LAU_3_3___19_FFAR_Mk1_HE = (3, WeaponsA4EC.LAU_3_3___19_FFAR_Mk1_HE) - LAU_3_3___19_FFAR_Mk5_HEAT = (3, WeaponsA4EC.LAU_3_3___19_FFAR_Mk5_HEAT) - LAU_68___7_FFAR_M156_WP = (3, Weapons.LAU_68___7_FFAR_M156_WP) - LAU_68___7_FFAR_Mk1_HE = (3, Weapons.LAU_68___7_FFAR_Mk1_HE) - LAU_68___7_FFAR_Mk5_HEAT = (3, Weapons.LAU_68___7_FFAR_Mk5_HEAT) - LAU_68_2___7_FFAR_M156_WP = (3, WeaponsA4EC.LAU_68_2___7_FFAR_M156_WP) - LAU_68_2___7_FFAR_Mk1_HE = (3, WeaponsA4EC.LAU_68_2___7_FFAR_Mk1_HE) - LAU_68_2___7_FFAR_Mk5_HEAT = (3, WeaponsA4EC.LAU_68_2___7_FFAR_Mk5_HEAT) - LAU_68_3___7_FFAR_M156_WP = (3, WeaponsA4EC.LAU_68_3___7_FFAR_M156_WP) - LAU_68_3___7_FFAR_Mk1_HE = (3, WeaponsA4EC.LAU_68_3___7_FFAR_Mk1_HE) - LAU_68_3___7_FFAR_Mk5_HEAT = (3, WeaponsA4EC.LAU_68_3___7_FFAR_Mk5_HEAT) -#ERRR {AGM12_B} - AGM_62 = (3, Weapons.AGM_62) - Mk_20 = (3, Weapons.Mk_20) - Mk_81 = (3, Weapons.Mk_81) - Mk_81SE = (3, WeaponsA4EC.Mk_81SE) - Mk_82 = (3, Weapons.Mk_82) - Mk_82_SnakeEye = (3, Weapons.Mk_82_SnakeEye) - Mk_83 = (3, Weapons.Mk_83) - Mk_84 = (3, Weapons.Mk_84) - M117 = (3, Weapons.M117) - Mk_77_mod_0 = (3, WeaponsA4EC.Mk_77_mod_0) - Mk_77_mod_1 = (3, WeaponsA4EC.Mk_77_mod_1) - AN_M30A1 = (3, Weapons.AN_M30A1) - AN_M57 = (3, Weapons.AN_M57) - AN_M64 = (3, Weapons.AN_M64) - AN_M65 = (3, Weapons.AN_M65) - AN_M66A2 = (3, WeaponsA4EC.AN_M66A2) - AN_M81 = (3, WeaponsA4EC.AN_M81) - AN_M88 = (3, WeaponsA4EC.AN_M88) - Mk_20__3__TER_ = (3, WeaponsA4EC.Mk_20__3__TER_) - Mk_20__2__TER___ = (3, WeaponsA4EC.Mk_20__2__TER___) - Mk_81__6__MER_ = (3, WeaponsA4EC.Mk_81__6__MER_) - Mk_81SE__6__MER_ = (3, WeaponsA4EC.Mk_81SE__6__MER_) - Mk_82__6__MER_ = (3, WeaponsA4EC.Mk_82__6__MER_) - Mk_82__4__MER_ = (3, WeaponsA4EC.Mk_82__4__MER_) - Mk_82__3__TER_ = (3, WeaponsA4EC.Mk_82__3__TER_) - Mk_82_Snakeye__6__MER_ = (3, WeaponsA4EC.Mk_82_Snakeye__6__MER_) - Mk_82_Snakeye__4__MER_ = (3, WeaponsA4EC.Mk_82_Snakeye__4__MER_) - Mk_82_Snakeye__3__TER_ = (3, WeaponsA4EC.Mk_82_Snakeye__3__TER_) - Mk_83__3__TER_ = (3, WeaponsA4EC.Mk_83__3__TER_) - Mk_83__2__TER_ = (3, WeaponsA4EC.Mk_83__2__TER_) - Mk_77_mod_1__2__TER___ = (3, WeaponsA4EC.Mk_77_mod_1__2__TER___) - AN_M57__6__MER_ = (3, WeaponsA4EC.AN_M57__6__MER_) - AN_M57__3__TER_ = (3, WeaponsA4EC.AN_M57__3__TER_) - AN_M81__6__MER_ = (3, WeaponsA4EC.AN_M81__6__MER_) - AN_M88__6__MER_ = (3, WeaponsA4EC.AN_M88__6__MER_) - Mk4_HIPEG = (3, WeaponsA4EC.Mk4_HIPEG) - Smokewinder___red = (3, Weapons.Smokewinder___red) - Smokewinder___green = (3, Weapons.Smokewinder___green) - Smokewinder___blue = (3, Weapons.Smokewinder___blue) - Smokewinder___white = (3, Weapons.Smokewinder___white) - Smokewinder___yellow = (3, Weapons.Smokewinder___yellow) - Smokewinder___orange = (3, Weapons.Smokewinder___orange) -#ERRR + class Pylon2: + Fuel_Tank_300_gallons_ = (2, WeaponsA4EC.Fuel_Tank_300_gallons_) + Fuel_Tank_300_gallons__EMPTY__ = ( + 2, + WeaponsA4EC.Fuel_Tank_300_gallons__EMPTY__, + ) + Fuel_Tank_150_gallons = (2, WeaponsA4EC.Fuel_Tank_150_gallons) + Fuel_Tank_150_gallons__EMPTY_ = ( + 2, + WeaponsA4EC.Fuel_Tank_150_gallons__EMPTY_, + ) + LAU_7_with_AIM_9B_Sidewinder_IR_AAM = ( + 2, + Weapons.LAU_7_with_AIM_9B_Sidewinder_IR_AAM, + ) + LAU_7_with_AIM_9P_Sidewinder_IR_AAM = ( + 2, + Weapons.LAU_7_with_AIM_9P_Sidewinder_IR_AAM, + ) + LAU_7_with_AIM_9P5_Sidewinder_IR_AAM = ( + 2, + Weapons.LAU_7_with_AIM_9P5_Sidewinder_IR_AAM, + ) + LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = ( + 2, + Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG, + ) + LAU_10_2___4_ZUNI_MK_71_ = (2, WeaponsA4EC.LAU_10_2___4_ZUNI_MK_71_) + LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = ( + 2, + Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos, + ) + LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = ( + 2, + Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE, + ) + LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = ( + 2, + Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT, + ) + LAU_3_2___19_FFAR_M156_WP_ = (2, WeaponsA4EC.LAU_3_2___19_FFAR_M156_WP_) + LAU_3_2___19_FFAR_Mk1_HE_ = (2, WeaponsA4EC.LAU_3_2___19_FFAR_Mk1_HE_) + LAU_3_2___19_FFAR_Mk5_HEAT_ = (2, WeaponsA4EC.LAU_3_2___19_FFAR_Mk5_HEAT_) + LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = ( + 2, + Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos, + ) + LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = ( + 2, + Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE, + ) + LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = ( + 2, + Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT, + ) + LAU_68_2___7_FFAR_M156_WP_ = (2, WeaponsA4EC.LAU_68_2___7_FFAR_M156_WP_) + LAU_68_2___7_FFAR_Mk1_HE_ = (2, WeaponsA4EC.LAU_68_2___7_FFAR_Mk1_HE_) + LAU_68_2___7_FFAR_Mk5_HEAT_ = (2, WeaponsA4EC.LAU_68_2___7_FFAR_Mk5_HEAT_) + AGM_45A_Shrike_ARM = (2, Weapons.AGM_45A_Shrike_ARM) + # ERRR {AGM12_C} + # ERRR {AGM12_B} + AGM_62_Walleye_II___Guided_Weapon_Mk_5__TV_Guided_ = ( + 2, + Weapons.AGM_62_Walleye_II___Guided_Weapon_Mk_5__TV_Guided_, + ) + Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets = ( + 2, + Weapons.Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets, + ) + Mk_81___250lb_GP_Bomb_LD = (2, Weapons.Mk_81___250lb_GP_Bomb_LD) + Mk_81SE = (2, WeaponsA4EC.Mk_81SE) + Mk_82___500lb_GP_Bomb_LD = (2, Weapons.Mk_82___500lb_GP_Bomb_LD) + Mk_82_Snakeye___500lb_GP_Bomb_HD = ( + 2, + Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD, + ) + Mk_83___1000lb_GP_Bomb_LD = (2, Weapons.Mk_83___1000lb_GP_Bomb_LD) + Mk_84___2000lb_GP_Bomb_LD = (2, Weapons.Mk_84___2000lb_GP_Bomb_LD) + M117___750lb_GP_Bomb_LD = (2, Weapons.M117___750lb_GP_Bomb_LD) + Mk_77_mod_0 = (2, WeaponsA4EC.Mk_77_mod_0) + Mk_77_mod_1 = (2, WeaponsA4EC.Mk_77_mod_1) + AN_M30A1___100lb_GP_Bomb_LD = (2, Weapons.AN_M30A1___100lb_GP_Bomb_LD) + AN_M57___250lb_GP_Bomb_LD = (2, Weapons.AN_M57___250lb_GP_Bomb_LD) + AN_M64___500lb_GP_Bomb_LD = (2, Weapons.AN_M64___500lb_GP_Bomb_LD) + AN_M65___1000lb_GP_Bomb_LD = (2, Weapons.AN_M65___1000lb_GP_Bomb_LD) + AN_M81 = (2, WeaponsA4EC.AN_M81) + AN_M88 = (2, WeaponsA4EC.AN_M88) + CBU_1_A = (2, WeaponsA4EC.CBU_1_A) + CBU_2_A = (2, WeaponsA4EC.CBU_2_A) + CBU_2B_A = (2, WeaponsA4EC.CBU_2B_A) + CBU_1_A__2 = (2, WeaponsA4EC.CBU_1_A__2) + CBU_2_A__2 = (2, WeaponsA4EC.CBU_2_A__2) + CBU_2B_A__2 = (2, WeaponsA4EC.CBU_2B_A__2) + Mk_20__2__TER_ = (2, WeaponsA4EC.Mk_20__2__TER_) + Mk_81__5__MER_ = (2, WeaponsA4EC.Mk_81__5__MER_) + Mk_81SE__5__MER_ = (2, WeaponsA4EC.Mk_81SE__5__MER_) + Mk_82__2__TER_ = (2, WeaponsA4EC.Mk_82__2__TER_) + Mk_82_Snakeye__2__TER_ = (2, WeaponsA4EC.Mk_82_Snakeye__2__TER_) + AN_M57__5__MER_ = (2, WeaponsA4EC.AN_M57__5__MER_) + AN_M57__2__TER_ = (2, WeaponsA4EC.AN_M57__2__TER_) + AN_M81__5__MER_ = (2, WeaponsA4EC.AN_M81__5__MER_) + AN_M88__5__MER_ = (2, WeaponsA4EC.AN_M88__5__MER_) + Mk4_HIPEG = (2, WeaponsA4EC.Mk4_HIPEG) + Smokewinder___red = (2, Weapons.Smokewinder___red) + Smokewinder___green = (2, Weapons.Smokewinder___green) + Smokewinder___blue = (2, Weapons.Smokewinder___blue) + Smokewinder___white = (2, Weapons.Smokewinder___white) + Smokewinder___yellow = (2, Weapons.Smokewinder___yellow) + Smokewinder___orange = (2, Weapons.Smokewinder___orange) + SUU_25_x_8_LUU_2___Target_Marker_Flares = ( + 2, + Weapons.SUU_25_x_8_LUU_2___Target_Marker_Flares, + ) - class Pylon4: - Fuel_Tank_300_gallons_ = (4, WeaponsA4EC.Fuel_Tank_300_gallons_) - Fuel_Tank_150_gallons = (4, WeaponsA4EC.Fuel_Tank_150_gallons) - LAU_7_GAR_8_Sidewinder_IR_AAM = (4, Weapons.LAU_7_GAR_8_Sidewinder_IR_AAM) - LAU_7_AIM_9P_Sidewinder_IR_AAM = (4, Weapons.LAU_7_AIM_9P_Sidewinder_IR_AAM) - LAU_7_AIM_9P5_Sidewinder_IR_AAM = (4, Weapons.LAU_7_AIM_9P5_Sidewinder_IR_AAM) - LAU_10___4_ZUNI_MK_71 = (4, Weapons.LAU_10___4_ZUNI_MK_71) - LAU_10_2___4_ZUNI_MK_71__ = (4, WeaponsA4EC.LAU_10_2___4_ZUNI_MK_71__) - LAU_3___19_FFAR_M156_WP = (4, Weapons.LAU_3___19_FFAR_M156_WP) - LAU_3___19_FFAR_Mk1_HE = (4, Weapons.LAU_3___19_FFAR_Mk1_HE) - LAU_3___19_FFAR_Mk5_HEAT = (4, Weapons.LAU_3___19_FFAR_Mk5_HEAT) - LAU_3_2___19_FFAR_M156_WP__ = (4, WeaponsA4EC.LAU_3_2___19_FFAR_M156_WP__) - LAU_3_2___19_FFAR_Mk1_HE__ = (4, WeaponsA4EC.LAU_3_2___19_FFAR_Mk1_HE__) - LAU_3_2___19_FFAR_Mk5_HEAT__ = (4, WeaponsA4EC.LAU_3_2___19_FFAR_Mk5_HEAT__) - LAU_68___7_FFAR_M156_WP = (4, Weapons.LAU_68___7_FFAR_M156_WP) - LAU_68___7_FFAR_Mk1_HE = (4, Weapons.LAU_68___7_FFAR_Mk1_HE) - LAU_68___7_FFAR_Mk5_HEAT = (4, Weapons.LAU_68___7_FFAR_Mk5_HEAT) - LAU_68_2___7_FFAR_M156_WP__ = (4, WeaponsA4EC.LAU_68_2___7_FFAR_M156_WP__) - LAU_68_2___7_FFAR_Mk1_HE__ = (4, WeaponsA4EC.LAU_68_2___7_FFAR_Mk1_HE__) - LAU_68_2___7_FFAR_Mk5_HEAT__ = (4, WeaponsA4EC.LAU_68_2___7_FFAR_Mk5_HEAT__) - AGM_45A = (4, Weapons.AGM_45A) -#ERRR {AGM12_C} -#ERRR {AGM12_B} - AGM_62 = (4, Weapons.AGM_62) - Mk_20 = (4, Weapons.Mk_20) - Mk_81 = (4, Weapons.Mk_81) - Mk_81SE = (4, WeaponsA4EC.Mk_81SE) - Mk_82 = (4, Weapons.Mk_82) - Mk_82_SnakeEye = (4, Weapons.Mk_82_SnakeEye) - Mk_83 = (4, Weapons.Mk_83) - Mk_84 = (4, Weapons.Mk_84) - M117 = (4, Weapons.M117) - Mk_77_mod_0 = (4, WeaponsA4EC.Mk_77_mod_0) - Mk_77_mod_1 = (4, WeaponsA4EC.Mk_77_mod_1) - AN_M30A1 = (4, Weapons.AN_M30A1) - AN_M57 = (4, Weapons.AN_M57) - AN_M64 = (4, Weapons.AN_M64) - AN_M65 = (4, Weapons.AN_M65) - AN_M81 = (4, WeaponsA4EC.AN_M81) - AN_M88 = (4, WeaponsA4EC.AN_M88) - CBU_1_A = (4, WeaponsA4EC.CBU_1_A) - CBU_2_A = (4, WeaponsA4EC.CBU_2_A) - CBU_2B_A = (4, WeaponsA4EC.CBU_2B_A) - CBU_1_A__2_ = (4, WeaponsA4EC.CBU_1_A__2_) - CBU_2_A__2_ = (4, WeaponsA4EC.CBU_2_A__2_) - CBU_2B_A__2_ = (4, WeaponsA4EC.CBU_2B_A__2_) - Mk_20__2__TER__ = (4, WeaponsA4EC.Mk_20__2__TER__) - Mk_81__5__MER__ = (4, WeaponsA4EC.Mk_81__5__MER__) - Mk_81SE__5__MER__ = (4, WeaponsA4EC.Mk_81SE__5__MER__) - Mk_82__2__TER__ = (4, WeaponsA4EC.Mk_82__2__TER__) - Mk_82_Snakeye__2__TER__ = (4, WeaponsA4EC.Mk_82_Snakeye__2__TER__) - AN_M57__5__MER__ = (4, WeaponsA4EC.AN_M57__5__MER__) - AN_M57__2__TER__ = (4, WeaponsA4EC.AN_M57__2__TER__) - AN_M81__5__MER__ = (4, WeaponsA4EC.AN_M81__5__MER__) - AN_M88__5__MER__ = (4, WeaponsA4EC.AN_M88__5__MER__) - Mk4_HIPEG = (4, WeaponsA4EC.Mk4_HIPEG) - Smokewinder___red = (4, Weapons.Smokewinder___red) - Smokewinder___green = (4, Weapons.Smokewinder___green) - Smokewinder___blue = (4, Weapons.Smokewinder___blue) - Smokewinder___white = (4, Weapons.Smokewinder___white) - Smokewinder___yellow = (4, Weapons.Smokewinder___yellow) - Smokewinder___orange = (4, Weapons.Smokewinder___orange) -#ERRR + # ERRR - class Pylon5: - LAU_10___4_ZUNI_MK_71 = (5, Weapons.LAU_10___4_ZUNI_MK_71) - LAU_3___19_FFAR_M156_WP = (5, Weapons.LAU_3___19_FFAR_M156_WP) - LAU_3___19_FFAR_Mk1_HE = (5, Weapons.LAU_3___19_FFAR_Mk1_HE) - LAU_3___19_FFAR_Mk5_HEAT = (5, Weapons.LAU_3___19_FFAR_Mk5_HEAT) - LAU_68___7_FFAR_M156_WP = (5, Weapons.LAU_68___7_FFAR_M156_WP) - LAU_68___7_FFAR_Mk1_HE = (5, Weapons.LAU_68___7_FFAR_Mk1_HE) - LAU_68___7_FFAR_Mk5_HEAT = (5, Weapons.LAU_68___7_FFAR_Mk5_HEAT) - AGM_45A = (5, Weapons.AGM_45A) -#ERRR {AGM12_B} - Mk_20 = (5, Weapons.Mk_20) - Mk_81 = (5, Weapons.Mk_81) - Mk_81SE = (5, WeaponsA4EC.Mk_81SE) - Mk_82 = (5, Weapons.Mk_82) - Mk_82_SnakeEye = (5, Weapons.Mk_82_SnakeEye) - Mk_77_mod_1 = (5, WeaponsA4EC.Mk_77_mod_1) - AN_M30A1 = (5, Weapons.AN_M30A1) - AN_M57 = (5, Weapons.AN_M57) - AN_M64 = (5, Weapons.AN_M64) - AN_M81 = (5, WeaponsA4EC.AN_M81) - AN_M88 = (5, WeaponsA4EC.AN_M88) - LAU_68___7_2_75__rockets_M257__Parachute_illumination_ = (5, Weapons.LAU_68___7_2_75__rockets_M257__Parachute_illumination_) - Smokewinder___red = (5, Weapons.Smokewinder___red) - Smokewinder___green = (5, Weapons.Smokewinder___green) - Smokewinder___blue = (5, Weapons.Smokewinder___blue) - Smokewinder___white = (5, Weapons.Smokewinder___white) - Smokewinder___yellow = (5, Weapons.Smokewinder___yellow) - Smokewinder___orange = (5, Weapons.Smokewinder___orange) -#ERRR + class Pylon3: + Fuel_Tank_400_gallons = (3, WeaponsA4EC.Fuel_Tank_400_gallons) + Fuel_Tank_300_gallons = (3, WeaponsA4EC.Fuel_Tank_300_gallons) + Fuel_Tank_150_gallons = (3, WeaponsA4EC.Fuel_Tank_150_gallons) + Fuel_Tank_400_gallons__EMPTY_ = ( + 3, + WeaponsA4EC.Fuel_Tank_400_gallons__EMPTY_, + ) + Fuel_Tank_300_gallons__EMPTY_ = ( + 3, + WeaponsA4EC.Fuel_Tank_300_gallons__EMPTY_, + ) + Fuel_Tank_150_gallons__EMPTY_ = ( + 3, + WeaponsA4EC.Fuel_Tank_150_gallons__EMPTY_, + ) + # ERRR {3*LAU-61} + BRU_42_with_3_x_LAU_68_pods___21_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT = ( + 3, + Weapons.BRU_42_with_3_x_LAU_68_pods___21_x_2_75_Hydra__UnGd_Rkts_Mk5__HEAT, + ) + LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = ( + 3, + Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG, + ) + LAU_10_2___4_ZUNI_MK_71 = (3, WeaponsA4EC.LAU_10_2___4_ZUNI_MK_71) + LAU_10_3___4_ZUNI_MK_71 = (3, WeaponsA4EC.LAU_10_3___4_ZUNI_MK_71) + LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = ( + 3, + Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos, + ) + LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = ( + 3, + Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE, + ) + LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = ( + 3, + Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT, + ) + LAU_3_2___19_FFAR_M156_WP = (3, WeaponsA4EC.LAU_3_2___19_FFAR_M156_WP) + LAU_3_2___19_FFAR_Mk1_HE = (3, WeaponsA4EC.LAU_3_2___19_FFAR_Mk1_HE) + LAU_3_2___19_FFAR_Mk5_HEAT = (3, WeaponsA4EC.LAU_3_2___19_FFAR_Mk5_HEAT) + LAU_3_3___19_FFAR_M156_WP = (3, WeaponsA4EC.LAU_3_3___19_FFAR_M156_WP) + LAU_3_3___19_FFAR_Mk1_HE = (3, WeaponsA4EC.LAU_3_3___19_FFAR_Mk1_HE) + LAU_3_3___19_FFAR_Mk5_HEAT = (3, WeaponsA4EC.LAU_3_3___19_FFAR_Mk5_HEAT) + LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = ( + 3, + Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos, + ) + LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = ( + 3, + Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE, + ) + LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = ( + 3, + Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT, + ) + LAU_68_2___7_FFAR_M156_WP = (3, WeaponsA4EC.LAU_68_2___7_FFAR_M156_WP) + LAU_68_2___7_FFAR_Mk1_HE = (3, WeaponsA4EC.LAU_68_2___7_FFAR_Mk1_HE) + LAU_68_2___7_FFAR_Mk5_HEAT = (3, WeaponsA4EC.LAU_68_2___7_FFAR_Mk5_HEAT) + LAU_68_3___7_FFAR_M156_WP = (3, WeaponsA4EC.LAU_68_3___7_FFAR_M156_WP) + LAU_68_3___7_FFAR_Mk1_HE = (3, WeaponsA4EC.LAU_68_3___7_FFAR_Mk1_HE) + LAU_68_3___7_FFAR_Mk5_HEAT = (3, WeaponsA4EC.LAU_68_3___7_FFAR_Mk5_HEAT) + # ERRR {AGM12_B} + AGM_62_Walleye_II___Guided_Weapon_Mk_5__TV_Guided_ = ( + 3, + Weapons.AGM_62_Walleye_II___Guided_Weapon_Mk_5__TV_Guided_, + ) + Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets = ( + 3, + Weapons.Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets, + ) + Mk_81___250lb_GP_Bomb_LD = (3, Weapons.Mk_81___250lb_GP_Bomb_LD) + Mk_81SE = (3, WeaponsA4EC.Mk_81SE) + Mk_82___500lb_GP_Bomb_LD = (3, Weapons.Mk_82___500lb_GP_Bomb_LD) + Mk_82_Snakeye___500lb_GP_Bomb_HD = ( + 3, + Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD, + ) + Mk_83___1000lb_GP_Bomb_LD = (3, Weapons.Mk_83___1000lb_GP_Bomb_LD) + Mk_84___2000lb_GP_Bomb_LD = (3, Weapons.Mk_84___2000lb_GP_Bomb_LD) + M117___750lb_GP_Bomb_LD = (3, Weapons.M117___750lb_GP_Bomb_LD) + Mk_77_mod_0 = (3, WeaponsA4EC.Mk_77_mod_0) + Mk_77_mod_1 = (3, WeaponsA4EC.Mk_77_mod_1) + AN_M30A1___100lb_GP_Bomb_LD = (3, Weapons.AN_M30A1___100lb_GP_Bomb_LD) + AN_M57___250lb_GP_Bomb_LD = (3, Weapons.AN_M57___250lb_GP_Bomb_LD) + AN_M64___500lb_GP_Bomb_LD = (3, Weapons.AN_M64___500lb_GP_Bomb_LD) + AN_M65___1000lb_GP_Bomb_LD = (3, Weapons.AN_M65___1000lb_GP_Bomb_LD) + AN_M66A2 = (3, WeaponsA4EC.AN_M66A2) + AN_M81 = (3, WeaponsA4EC.AN_M81) + AN_M88 = (3, WeaponsA4EC.AN_M88) + Mk_20__3__TER_ = (3, WeaponsA4EC.Mk_20__3__TER_) + Mk_20__2__TER___ = (3, WeaponsA4EC.Mk_20__2__TER___) + Mk_81__6__MER_ = (3, WeaponsA4EC.Mk_81__6__MER_) + Mk_81SE__6__MER_ = (3, WeaponsA4EC.Mk_81SE__6__MER_) + Mk_82__6__MER_ = (3, WeaponsA4EC.Mk_82__6__MER_) + Mk_82__4__MER_ = (3, WeaponsA4EC.Mk_82__4__MER_) + Mk_82__3__TER_ = (3, WeaponsA4EC.Mk_82__3__TER_) + Mk_82_Snakeye__6__MER_ = (3, WeaponsA4EC.Mk_82_Snakeye__6__MER_) + Mk_82_Snakeye__4__MER_ = (3, WeaponsA4EC.Mk_82_Snakeye__4__MER_) + Mk_82_Snakeye__3__TER_ = (3, WeaponsA4EC.Mk_82_Snakeye__3__TER_) + Mk_83__3__TER_ = (3, WeaponsA4EC.Mk_83__3__TER_) + Mk_83__2__TER_ = (3, WeaponsA4EC.Mk_83__2__TER_) + Mk_77_mod_1__2__TER___ = (3, WeaponsA4EC.Mk_77_mod_1__2__TER___) + AN_M57__6__MER_ = (3, WeaponsA4EC.AN_M57__6__MER_) + AN_M57__3__TER_ = (3, WeaponsA4EC.AN_M57__3__TER_) + AN_M81__6__MER_ = (3, WeaponsA4EC.AN_M81__6__MER_) + AN_M88__6__MER_ = (3, WeaponsA4EC.AN_M88__6__MER_) + Mk4_HIPEG = (3, WeaponsA4EC.Mk4_HIPEG) + Smokewinder___red = (3, Weapons.Smokewinder___red) + Smokewinder___green = (3, Weapons.Smokewinder___green) + Smokewinder___blue = (3, Weapons.Smokewinder___blue) + Smokewinder___white = (3, Weapons.Smokewinder___white) + Smokewinder___yellow = (3, Weapons.Smokewinder___yellow) + Smokewinder___orange = (3, Weapons.Smokewinder___orange) + SUU_25_x_8_LUU_2___Target_Marker_Flares = ( + 3, + Weapons.SUU_25_x_8_LUU_2___Target_Marker_Flares, + ) + + # ERRR + + class Pylon4: + Fuel_Tank_300_gallons_ = (4, WeaponsA4EC.Fuel_Tank_300_gallons_) + Fuel_Tank_300_gallons__EMPTY__ = ( + 4, + WeaponsA4EC.Fuel_Tank_300_gallons__EMPTY__, + ) + Fuel_Tank_150_gallons = (4, WeaponsA4EC.Fuel_Tank_150_gallons) + Fuel_Tank_150_gallons__EMPTY_ = ( + 4, + WeaponsA4EC.Fuel_Tank_150_gallons__EMPTY_, + ) + LAU_7_with_AIM_9B_Sidewinder_IR_AAM = ( + 4, + Weapons.LAU_7_with_AIM_9B_Sidewinder_IR_AAM, + ) + LAU_7_with_AIM_9P_Sidewinder_IR_AAM = ( + 4, + Weapons.LAU_7_with_AIM_9P_Sidewinder_IR_AAM, + ) + LAU_7_with_AIM_9P5_Sidewinder_IR_AAM = ( + 4, + Weapons.LAU_7_with_AIM_9P5_Sidewinder_IR_AAM, + ) + LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = ( + 4, + Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG, + ) + LAU_10_2___4_ZUNI_MK_71__ = (4, WeaponsA4EC.LAU_10_2___4_ZUNI_MK_71__) + LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = ( + 4, + Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos, + ) + LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = ( + 4, + Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE, + ) + LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = ( + 4, + Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT, + ) + LAU_3_2___19_FFAR_M156_WP__ = (4, WeaponsA4EC.LAU_3_2___19_FFAR_M156_WP__) + LAU_3_2___19_FFAR_Mk1_HE__ = (4, WeaponsA4EC.LAU_3_2___19_FFAR_Mk1_HE__) + LAU_3_2___19_FFAR_Mk5_HEAT__ = (4, WeaponsA4EC.LAU_3_2___19_FFAR_Mk5_HEAT__) + LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = ( + 4, + Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos, + ) + LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = ( + 4, + Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE, + ) + LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = ( + 4, + Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT, + ) + LAU_68_2___7_FFAR_M156_WP__ = (4, WeaponsA4EC.LAU_68_2___7_FFAR_M156_WP__) + LAU_68_2___7_FFAR_Mk1_HE__ = (4, WeaponsA4EC.LAU_68_2___7_FFAR_Mk1_HE__) + LAU_68_2___7_FFAR_Mk5_HEAT__ = (4, WeaponsA4EC.LAU_68_2___7_FFAR_Mk5_HEAT__) + AGM_45A_Shrike_ARM = (4, Weapons.AGM_45A_Shrike_ARM) + # ERRR {AGM12_C} + # ERRR {AGM12_B} + AGM_62_Walleye_II___Guided_Weapon_Mk_5__TV_Guided_ = ( + 4, + Weapons.AGM_62_Walleye_II___Guided_Weapon_Mk_5__TV_Guided_, + ) + Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets = ( + 4, + Weapons.Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets, + ) + Mk_81___250lb_GP_Bomb_LD = (4, Weapons.Mk_81___250lb_GP_Bomb_LD) + Mk_81SE = (4, WeaponsA4EC.Mk_81SE) + Mk_82___500lb_GP_Bomb_LD = (4, Weapons.Mk_82___500lb_GP_Bomb_LD) + Mk_82_Snakeye___500lb_GP_Bomb_HD = ( + 4, + Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD, + ) + Mk_83___1000lb_GP_Bomb_LD = (4, Weapons.Mk_83___1000lb_GP_Bomb_LD) + Mk_84___2000lb_GP_Bomb_LD = (4, Weapons.Mk_84___2000lb_GP_Bomb_LD) + M117___750lb_GP_Bomb_LD = (4, Weapons.M117___750lb_GP_Bomb_LD) + Mk_77_mod_0 = (4, WeaponsA4EC.Mk_77_mod_0) + Mk_77_mod_1 = (4, WeaponsA4EC.Mk_77_mod_1) + AN_M30A1___100lb_GP_Bomb_LD = (4, Weapons.AN_M30A1___100lb_GP_Bomb_LD) + AN_M57___250lb_GP_Bomb_LD = (4, Weapons.AN_M57___250lb_GP_Bomb_LD) + AN_M64___500lb_GP_Bomb_LD = (4, Weapons.AN_M64___500lb_GP_Bomb_LD) + AN_M65___1000lb_GP_Bomb_LD = (4, Weapons.AN_M65___1000lb_GP_Bomb_LD) + AN_M81 = (4, WeaponsA4EC.AN_M81) + AN_M88 = (4, WeaponsA4EC.AN_M88) + CBU_1_A = (4, WeaponsA4EC.CBU_1_A) + CBU_2_A = (4, WeaponsA4EC.CBU_2_A) + CBU_2B_A = (4, WeaponsA4EC.CBU_2B_A) + CBU_1_A__2_ = (4, WeaponsA4EC.CBU_1_A__2_) + CBU_2_A__2_ = (4, WeaponsA4EC.CBU_2_A__2_) + CBU_2B_A__2_ = (4, WeaponsA4EC.CBU_2B_A__2_) + Mk_20__2__TER__ = (4, WeaponsA4EC.Mk_20__2__TER__) + Mk_81__5__MER__ = (4, WeaponsA4EC.Mk_81__5__MER__) + Mk_81SE__5__MER__ = (4, WeaponsA4EC.Mk_81SE__5__MER__) + Mk_82__2__TER__ = (4, WeaponsA4EC.Mk_82__2__TER__) + Mk_82_Snakeye__2__TER__ = (4, WeaponsA4EC.Mk_82_Snakeye__2__TER__) + AN_M57__5__MER__ = (4, WeaponsA4EC.AN_M57__5__MER__) + AN_M57__2__TER__ = (4, WeaponsA4EC.AN_M57__2__TER__) + AN_M81__5__MER__ = (4, WeaponsA4EC.AN_M81__5__MER__) + AN_M88__5__MER__ = (4, WeaponsA4EC.AN_M88__5__MER__) + Mk4_HIPEG = (4, WeaponsA4EC.Mk4_HIPEG) + Smokewinder___red = (4, Weapons.Smokewinder___red) + Smokewinder___green = (4, Weapons.Smokewinder___green) + Smokewinder___blue = (4, Weapons.Smokewinder___blue) + Smokewinder___white = (4, Weapons.Smokewinder___white) + Smokewinder___yellow = (4, Weapons.Smokewinder___yellow) + Smokewinder___orange = (4, Weapons.Smokewinder___orange) + SUU_25_x_8_LUU_2___Target_Marker_Flares = ( + 4, + Weapons.SUU_25_x_8_LUU_2___Target_Marker_Flares, + ) + + # ERRR + + class Pylon5: + LAU_7_with_AIM_9B_Sidewinder_IR_AAM = ( + 5, + Weapons.LAU_7_with_AIM_9B_Sidewinder_IR_AAM, + ) + LAU_7_with_AIM_9P_Sidewinder_IR_AAM = ( + 5, + Weapons.LAU_7_with_AIM_9P_Sidewinder_IR_AAM, + ) + LAU_7_with_AIM_9P5_Sidewinder_IR_AAM = ( + 5, + Weapons.LAU_7_with_AIM_9P5_Sidewinder_IR_AAM, + ) + LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = ( + 5, + Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG, + ) + LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = ( + 5, + Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos, + ) + LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = ( + 5, + Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk1__HE, + ) + LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = ( + 5, + Weapons.LAU_3_pod___19_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT, + ) + LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos = ( + 5, + Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_M156__Wht_Phos, + ) + LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE = ( + 5, + Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk1__HE, + ) + LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT = ( + 5, + Weapons.LAU_68_pod___7_x_2_75_FFAR__UnGd_Rkts_Mk5__HEAT, + ) + AGM_45A_Shrike_ARM = (5, Weapons.AGM_45A_Shrike_ARM) + # ERRR {AGM12_B} + Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets = ( + 5, + Weapons.Mk_20_Rockeye___490lbs_CBU__247_x_HEAT_Bomblets, + ) + Mk_81___250lb_GP_Bomb_LD = (5, Weapons.Mk_81___250lb_GP_Bomb_LD) + Mk_81SE = (5, WeaponsA4EC.Mk_81SE) + Mk_82___500lb_GP_Bomb_LD = (5, Weapons.Mk_82___500lb_GP_Bomb_LD) + Mk_82_Snakeye___500lb_GP_Bomb_HD = ( + 5, + Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD, + ) + Mk_77_mod_1 = (5, WeaponsA4EC.Mk_77_mod_1) + AN_M30A1___100lb_GP_Bomb_LD = (5, Weapons.AN_M30A1___100lb_GP_Bomb_LD) + AN_M57___250lb_GP_Bomb_LD = (5, Weapons.AN_M57___250lb_GP_Bomb_LD) + AN_M64___500lb_GP_Bomb_LD = (5, Weapons.AN_M64___500lb_GP_Bomb_LD) + AN_M81 = (5, WeaponsA4EC.AN_M81) + AN_M88 = (5, WeaponsA4EC.AN_M88) + LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum = ( + 5, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum, + ) + Smokewinder___red = (5, Weapons.Smokewinder___red) + Smokewinder___green = (5, Weapons.Smokewinder___green) + Smokewinder___blue = (5, Weapons.Smokewinder___blue) + Smokewinder___white = (5, Weapons.Smokewinder___white) + Smokewinder___yellow = (5, Weapons.Smokewinder___yellow) + Smokewinder___orange = (5, Weapons.Smokewinder___orange) + SUU_25_x_8_LUU_2___Target_Marker_Flares = ( + 5, + Weapons.SUU_25_x_8_LUU_2___Target_Marker_Flares, + ) + + # ERRR pylons = {1, 2, 3, 4, 5} - tasks = [task.CAP, task.CAS, task.SEAD, task.GroundAttack, task.AFAC, task.Refueling] - task_default = task.CAS \ No newline at end of file + tasks = [ + task.CAP, + task.CAS, + task.SEAD, + task.GroundAttack, + task.AFAC, + task.Refueling, + ] + task_default = task.CAS diff --git a/pydcs_extensions/f22a/f22a.py b/pydcs_extensions/f22a/f22a.py index 5736933f..97e331f1 100644 --- a/pydcs_extensions/f22a/f22a.py +++ b/pydcs_extensions/f22a/f22a.py @@ -24,7 +24,7 @@ class F_22A(PlaneType): chaff_charge_size = 1 flare_charge_size = 2 eplrs = True - category = "Interceptor" #{78EFB7A2-FD52-4b57-A6A6-3BF0E1D6555F} + category = "Interceptor" # {78EFB7A2-FD52-4b57-A6A6-3BF0E1D6555F} radio_frequency = 127.5 property_defaults = { @@ -36,7 +36,6 @@ class F_22A(PlaneType): id = "BAY_DOOR_OPTION" class Liveries: - class USSR(Enum): default = "default" _154_wg = "154 wg" @@ -1767,15 +1766,15 @@ class F_22A(PlaneType): Fuel_tank_610_gal = (2, Weapons.Fuel_tank_610_gal) class Pylon3: - AIM_120C = (3, Weapons.AIM_120C) + AIM_120C = (3, Weapons.AIM_120C_5_AMRAAM___Active_Rdr_AAM) AIM_120D = (3, F22AWeapons.AIM_120D) class Pylon4: - AIM_120C = (4, Weapons.AIM_120C) + AIM_120C = (4, Weapons.AIM_120C_5_AMRAAM___Active_Rdr_AAM) AIM_120D = (4, F22AWeapons.AIM_120D) class Pylon5: - AIM_120C = (5, Weapons.AIM_120C) + AIM_120C = (5, Weapons.AIM_120C_5_AMRAAM___Active_Rdr_AAM) AIM_120D = (5, F22AWeapons.AIM_120D) class Pylon6: @@ -1786,15 +1785,15 @@ class F_22A(PlaneType): Smokewinder___yellow = (6, Weapons.Smokewinder___yellow) class Pylon7: - AIM_120C = (7, Weapons.AIM_120C) + AIM_120C = (7, Weapons.AIM_120C_5_AMRAAM___Active_Rdr_AAM) AIM_120D = (7, F22AWeapons.AIM_120D) class Pylon8: - AIM_120C = (8, Weapons.AIM_120C) + AIM_120C = (8, Weapons.AIM_120C_5_AMRAAM___Active_Rdr_AAM) AIM_120D = (8, F22AWeapons.AIM_120D) class Pylon9: - AIM_120C = (9, Weapons.AIM_120C) + AIM_120C = (9, Weapons.AIM_120C_5_AMRAAM___Active_Rdr_AAM) AIM_120D = (9, F22AWeapons.AIM_120D) class Pylon10: @@ -1806,5 +1805,11 @@ class F_22A(PlaneType): pylons = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11} - tasks = [task.CAP, task.Escort, task.FighterSweep, task.Intercept, task.Reconnaissance] + tasks = [ + task.CAP, + task.Escort, + task.FighterSweep, + task.Intercept, + task.Reconnaissance, + ] task_default = task.CAP diff --git a/pydcs_extensions/frenchpack/frenchpack.py b/pydcs_extensions/frenchpack/frenchpack.py index 2d5f5433..2f02f9e0 100644 --- a/pydcs_extensions/frenchpack/frenchpack.py +++ b/pydcs_extensions/frenchpack/frenchpack.py @@ -3,6 +3,7 @@ # from dcs import unittype + class AMX_10RCR(unittype.VehicleType): id = "AMX10RCR" name = "AMX-10RCR" @@ -150,8 +151,10 @@ class DIM__KAMIKAZE(unittype.VehicleType): air_weapon_dist = 50 eplrs = True + ## FORTIFICATION + class _FIELD_HIDE(unittype.VehicleType): id = "FieldHL" name = "*FIELD HIDE" @@ -159,6 +162,7 @@ class _FIELD_HIDE(unittype.VehicleType): threat_range = 0 air_weapon_dist = 0 + class _FIELD_HIDE_SMALL(unittype.VehicleType): id = "HARRIERH" name = "*FIELD HIDE SMALL" @@ -166,6 +170,7 @@ class _FIELD_HIDE_SMALL(unittype.VehicleType): threat_range = 0 air_weapon_dist = 0 + class SmokeD1(unittype.VehicleType): id = "SmokeD1" name = "SmokeD1" @@ -173,6 +178,7 @@ class SmokeD1(unittype.VehicleType): threat_range = 0 air_weapon_dist = 0 + class SmokeD3(unittype.VehicleType): id = "SmokeD3" name = "SmokeD3" @@ -189,6 +195,7 @@ class TRM_2000(unittype.VehicleType): air_weapon_dist = 0 eplrs = True + class TRM_2000_Fuel(unittype.VehicleType): id = "TRM2000_Citerne" name = "TRM-2000 Fuel" @@ -197,6 +204,7 @@ class TRM_2000_Fuel(unittype.VehicleType): air_weapon_dist = 0 eplrs = True + class VAB_MEDICAL(unittype.VehicleType): id = "VABH" name = "VAB MEDICAL" @@ -205,6 +213,7 @@ class VAB_MEDICAL(unittype.VehicleType): air_weapon_dist = 0 eplrs = True + class VAB(unittype.VehicleType): id = "VAB_RADIO" name = "VAB" @@ -213,6 +222,7 @@ class VAB(unittype.VehicleType): air_weapon_dist = 0 eplrs = True + class VBL(unittype.VehicleType): id = "VBL-Radio" name = "VBL" @@ -221,6 +231,7 @@ class VBL(unittype.VehicleType): air_weapon_dist = 0 eplrs = True + class Tracma_TD_1500(unittype.VehicleType): id = "Tracma" name = "Tracma TD 1500" @@ -228,8 +239,10 @@ class Tracma_TD_1500(unittype.VehicleType): threat_range = 0 air_weapon_dist = 0 + ## AIRDEFENCE + class SMOKE_SAM_IR(unittype.VehicleType): id = "SMOKESAM" name = "SMOKE SAM IR" @@ -238,6 +251,7 @@ class SMOKE_SAM_IR(unittype.VehicleType): air_weapon_dist = 20000 eplrs = True + class _53T2(unittype.VehicleType): id = "AA20" name = "53T2" @@ -245,6 +259,7 @@ class _53T2(unittype.VehicleType): threat_range = 2000 air_weapon_dist = 2000 + class TRM_2000_53T2(unittype.VehicleType): id = "TRM2000_AA20" name = "TRM-2000 53T2" @@ -253,6 +268,7 @@ class TRM_2000_53T2(unittype.VehicleType): air_weapon_dist = 2000 eplrs = True + class TRM_2000_PAMELA(unittype.VehicleType): id = "TRMMISTRAL" name = "TRM-2000 PAMELA" @@ -261,8 +277,10 @@ class TRM_2000_PAMELA(unittype.VehicleType): air_weapon_dist = 10000 eplrs = True + ## INFANTRY + class Infantry_Soldier_JTAC(unittype.VehicleType): id = "JTACFP" name = "Infantry Soldier JTAC" @@ -270,8 +288,10 @@ class Infantry_Soldier_JTAC(unittype.VehicleType): threat_range = 500 air_weapon_dist = 500 + ## ARTILERY + class MO_120_RT(unittype.VehicleType): id = "M120" name = "MO 120 RT" @@ -279,10 +299,11 @@ class MO_120_RT(unittype.VehicleType): threat_range = 15000 air_weapon_dist = 15000 + class VAB_MORTIER(unittype.VehicleType): id = "VAB_MORTIER" name = "VAB MORTIER" detection_range = 0 threat_range = 15000 air_weapon_dist = 15000 - eplrs = True \ No newline at end of file + eplrs = True diff --git a/pydcs_extensions/hercules/hercules.py b/pydcs_extensions/hercules/hercules.py index 0d1b9a6a..611b0eb0 100644 --- a/pydcs_extensions/hercules/hercules.py +++ b/pydcs_extensions/hercules/hercules.py @@ -1056,7 +1056,7 @@ class Hercules(PlaneType): class Pylon2: LAU_68___7_2_75__rockets_M257__Parachute_illumination_ = ( 2, - Weapons.LAU_68___7_2_75__rockets_M257__Parachute_illumination_, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum, ) Smokewinder___red = (2, Weapons.Smokewinder___red) Smokewinder___green = (2, Weapons.Smokewinder___green) @@ -1064,13 +1064,13 @@ class Hercules(PlaneType): Smokewinder___white = (2, Weapons.Smokewinder___white) Smokewinder___yellow = (2, Weapons.Smokewinder___yellow) Smokewinder___orange = (2, Weapons.Smokewinder___orange) - MER_6_Mk_82 = (2, Weapons.MER_6_Mk_82) + MER_6_Mk_82 = (2, Weapons.MER6_with_6_x_Mk_82___500lb_GP_Bombs_LD) Herc_Ext_Fuel_Tank = (2, HerculesWeapons.Herc_Ext_Fuel_Tank) class Pylon3: LAU_68___7_2_75__rockets_M257__Parachute_illumination_ = ( 3, - Weapons.LAU_68___7_2_75__rockets_M257__Parachute_illumination_, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum, ) Smokewinder___red = (3, Weapons.Smokewinder___red) Smokewinder___green = (3, Weapons.Smokewinder___green) @@ -1078,13 +1078,13 @@ class Hercules(PlaneType): Smokewinder___white = (3, Weapons.Smokewinder___white) Smokewinder___yellow = (3, Weapons.Smokewinder___yellow) Smokewinder___orange = (3, Weapons.Smokewinder___orange) - MER_6_Mk_82 = (3, Weapons.MER_6_Mk_82) + MER_6_Mk_82 = (3, Weapons.MER6_with_6_x_Mk_82___500lb_GP_Bombs_LD) Herc_Ext_Fuel_Tank = (3, HerculesWeapons.Herc_Ext_Fuel_Tank) class Pylon4: LAU_68___7_2_75__rockets_M257__Parachute_illumination_ = ( 4, - Weapons.LAU_68___7_2_75__rockets_M257__Parachute_illumination_, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum, ) Smokewinder___red = (4, Weapons.Smokewinder___red) Smokewinder___green = (4, Weapons.Smokewinder___green) @@ -1092,13 +1092,13 @@ class Hercules(PlaneType): Smokewinder___white = (4, Weapons.Smokewinder___white) Smokewinder___yellow = (4, Weapons.Smokewinder___yellow) Smokewinder___orange = (4, Weapons.Smokewinder___orange) - MER_6_Mk_82 = (4, Weapons.MER_6_Mk_82) + MER_6_Mk_82 = (4, Weapons.MER6_with_6_x_Mk_82___500lb_GP_Bombs_LD) Herc_Ext_Fuel_Tank = (4, HerculesWeapons.Herc_Ext_Fuel_Tank) class Pylon5: LAU_68___7_2_75__rockets_M257__Parachute_illumination_ = ( 5, - Weapons.LAU_68___7_2_75__rockets_M257__Parachute_illumination_, + Weapons.LAU_68_pod___7_x_2_75_Hydra__UnGd_Rkts_M257__Para_Illum, ) Smokewinder___red = (5, Weapons.Smokewinder___red) Smokewinder___green = (5, Weapons.Smokewinder___green) @@ -1106,7 +1106,7 @@ class Hercules(PlaneType): Smokewinder___white = (5, Weapons.Smokewinder___white) Smokewinder___yellow = (5, Weapons.Smokewinder___yellow) Smokewinder___orange = (5, Weapons.Smokewinder___orange) - MER_6_Mk_82 = (5, Weapons.MER_6_Mk_82) + MER_6_Mk_82 = (5, Weapons.MER6_with_6_x_Mk_82___500lb_GP_Bombs_LD) Herc_Ext_Fuel_Tank = (5, HerculesWeapons.Herc_Ext_Fuel_Tank) class Pylon6: diff --git a/pydcs_extensions/highdigitsams/highdigitsams.py b/pydcs_extensions/highdigitsams/highdigitsams.py index a3cc4de7..a7e365dd 100644 --- a/pydcs_extensions/highdigitsams/highdigitsams.py +++ b/pydcs_extensions/highdigitsams/highdigitsams.py @@ -335,4 +335,3 @@ class _34Ya6E_Gazetchik_E_decoy(unittype.VehicleType): detection_range = 20000 threat_range = 0 air_weapon_dist = 0 - diff --git a/pydcs_extensions/mb339/mb339.py b/pydcs_extensions/mb339/mb339.py index 39a63f76..896a33b0 100644 --- a/pydcs_extensions/mb339/mb339.py +++ b/pydcs_extensions/mb339/mb339.py @@ -7,32 +7,104 @@ from dcs.weapons_data import Weapons class MB_339PAN_Weapons: ARF8M3_TP = {"clsid": "{ARF8M3_TP}", "name": "ARF8M3 TP", "weight": None} - BRD_4_250_4_MK_76_2_ARF_8M3TP_ = {"clsid": "{BRD-4-250}", "name": "BRD-4-250(4*MK.76+2*ARF-8M3TP)", "weight": 137.6} + BRD_4_250_4_MK_76_2_ARF_8M3TP_ = { + "clsid": "{BRD-4-250}", + "name": "BRD-4-250(4*MK.76+2*ARF-8M3TP)", + "weight": 137.6, + } Color_Oil_Tank = {"clsid": "{COLOR-TANK}", "name": "Color Oil Tank", "weight": 183} Empty_Pylon = {"clsid": "{VOID-PYLON-MB339A}", "name": "Empty Pylon", "weight": 20} - Fuel_Tank_330lt = {"clsid": "{FUEL-SUBAL_TANK-330}", "name": "Fuel Tank 330lt", "weight": 315} + Fuel_Tank_330lt = { + "clsid": "{FUEL-SUBAL_TANK-330}", + "name": "Fuel Tank 330lt", + "weight": 315, + } GunPod_AN_M3 = {"clsid": "{MB339-AN-M3_L}", "name": "GunPod AN/M3", "weight": 75} GunPod_AN_M3_ = {"clsid": "{MB339-AN-M3_R}", "name": "GunPod AN/M3", "weight": 75} - GunPod_DEFA553 = {"clsid": "{MB339-DEFA553_L}", "name": "GunPod DEFA553", "weight": 190} - GunPod_DEFA553_ = {"clsid": "{MB339-DEFA553_R}", "name": "GunPod DEFA553", "weight": 190} - LAU_10___4_ZUNI_MK_71___ = {"clsid": "{LAU-10}", "name": "LAU-10 - 4 ZUNI MK 71", "weight": 308} - LR_25___25_ARF_8M3_API_ = {"clsid": "{LR-25API}", "name": "LR-25 - 25 ARF/8M3(API)", "weight": 141} - LR_25___25_ARF_8M3_HEI_ = {"clsid": "{LR-25HEI}", "name": "LR-25 - 25 ARF/8M3(HEI)", "weight": 161} + GunPod_DEFA553 = { + "clsid": "{MB339-DEFA553_L}", + "name": "GunPod DEFA553", + "weight": 190, + } + GunPod_DEFA553_ = { + "clsid": "{MB339-DEFA553_R}", + "name": "GunPod DEFA553", + "weight": 190, + } + LAU_10___4_ZUNI_MK_71___ = { + "clsid": "{LAU-10}", + "name": "LAU-10 - 4 ZUNI MK 71", + "weight": 308, + } + LR_25___25_ARF_8M3_API_ = { + "clsid": "{LR-25API}", + "name": "LR-25 - 25 ARF/8M3(API)", + "weight": 141, + } + LR_25___25_ARF_8M3_HEI_ = { + "clsid": "{LR-25HEI}", + "name": "LR-25 - 25 ARF/8M3(HEI)", + "weight": 161, + } MAK79_2_MK_20 = {"clsid": "{MAK79_MK20 2L}", "name": "MAK79 2 MK-20", "weight": 464} - MAK79_2_MK_20_ = {"clsid": "{MAK79_MK20 2R}", "name": "MAK79 2 MK-20", "weight": 464} + MAK79_2_MK_20_ = { + "clsid": "{MAK79_MK20 2R}", + "name": "MAK79 2 MK-20", + "weight": 464, + } MAK79_MK_20 = {"clsid": "{MAK79_MK20 1R}", "name": "MAK79 MK-20", "weight": 232} MAK79_MK_20_ = {"clsid": "{MAK79_MK20 1L}", "name": "MAK79 MK-20", "weight": 232} - MB339_Black_Smoke = {"clsid": "{SMOKE-BLACK-MB339}", "name": "MB339 Black Smoke", "weight": 1} - MB339_Green_Smoke = {"clsid": "{SMOKE-GREEN-MB339}", "name": "MB339 Green Smoke", "weight": 1} - MB339_ORANGE_Smoke = {"clsid": "{SMOKE-ORANGE-MB339}", "name": "MB339 ORANGE Smoke", "weight": 1} - MB339_Red_Smoke = {"clsid": "{SMOKE-RED-MB339}", "name": "MB339 Red Smoke", "weight": 1} - MB339_White_Smoke = {"clsid": "{SMOKE-WHITE-MB339}", "name": "MB339 White Smoke", "weight": 1} - MB339_YELLOW_Smoke = {"clsid": "{SMOKE-YELLOW-MB339}", "name": "MB339 YELLOW Smoke", "weight": 1} + MB339_Black_Smoke = { + "clsid": "{SMOKE-BLACK-MB339}", + "name": "MB339 Black Smoke", + "weight": 1, + } + MB339_Green_Smoke = { + "clsid": "{SMOKE-GREEN-MB339}", + "name": "MB339 Green Smoke", + "weight": 1, + } + MB339_ORANGE_Smoke = { + "clsid": "{SMOKE-ORANGE-MB339}", + "name": "MB339 ORANGE Smoke", + "weight": 1, + } + MB339_Red_Smoke = { + "clsid": "{SMOKE-RED-MB339}", + "name": "MB339 Red Smoke", + "weight": 1, + } + MB339_White_Smoke = { + "clsid": "{SMOKE-WHITE-MB339}", + "name": "MB339 White Smoke", + "weight": 1, + } + MB339_YELLOW_Smoke = { + "clsid": "{SMOKE-YELLOW-MB339}", + "name": "MB339 YELLOW Smoke", + "weight": 1, + } MK76 = {"clsid": "{MK76}", "name": "MK76", "weight": 11.3} - Tip_Fuel_Tank_500lt = {"clsid": "{FUEL-TIP-TANK-500-L}", "name": "Tip Fuel Tank 500lt", "weight": 471} - Tip_Fuel_Tank_500lt_ = {"clsid": "{FUEL-TIP-TANK-500-R}", "name": "Tip Fuel Tank 500lt", "weight": 471} - Tip_Fuel_Tank_Ellittici_320lt = {"clsid": "{FUEL-TIP-ELLITTIC-L}", "name": "Tip Fuel Tank Ellittici 320lt", "weight": 314.2} - Tip_Fuel_Tank_Ellittici_320lt_ = {"clsid": "{FUEL-TIP-ELLITTIC-R}", "name": "Tip Fuel Tank Ellittici 320lt", "weight": 314.2} + Tip_Fuel_Tank_500lt = { + "clsid": "{FUEL-TIP-TANK-500-L}", + "name": "Tip Fuel Tank 500lt", + "weight": 471, + } + Tip_Fuel_Tank_500lt_ = { + "clsid": "{FUEL-TIP-TANK-500-R}", + "name": "Tip Fuel Tank 500lt", + "weight": 471, + } + Tip_Fuel_Tank_Ellittici_320lt = { + "clsid": "{FUEL-TIP-ELLITTIC-L}", + "name": "Tip Fuel Tank Ellittici 320lt", + "weight": 314.2, + } + Tip_Fuel_Tank_Ellittici_320lt_ = { + "clsid": "{FUEL-TIP-ELLITTIC-R}", + "name": "Tip Fuel Tank Ellittici 320lt", + "weight": 314.2, + } class MB_339PAN(PlaneType): @@ -43,7 +115,7 @@ class MB_339PAN(PlaneType): length = 12.13 fuel_max = 626 max_speed = 763.2 - category = "Interceptor" #{78EFB7A2-FD52-4b57-A6A6-3BF0E1D6555F} + category = "Interceptor" # {78EFB7A2-FD52-4b57-A6A6-3BF0E1D6555F} radio_frequency = 124 panel_radio = { @@ -68,7 +140,7 @@ class MB_339PAN(PlaneType): 7: 262, 14: 266, 19: 268, - 15: 265 + 15: 265, }, }, 2: { @@ -102,7 +174,7 @@ class MB_339PAN(PlaneType): 28: 257, 23: 260, 29: 253, - 15: 265 + 15: 265, }, }, } @@ -113,7 +185,6 @@ class MB_339PAN(PlaneType): } class Properties: - class SoloFlight: id = "SoloFlight" @@ -127,7 +198,6 @@ class MB_339PAN(PlaneType): Equally_Responsible = -2 class Liveries: - class Georgia(Enum): MB339AA__ARMADA____Crippa = "MB339AA 'ARMADA' - Crippa" MB339AA__ARMADA____Yellow_Band = "MB339AA 'ARMADA' - Yellow Band" @@ -370,7 +440,10 @@ class MB_339PAN(PlaneType): class Pylon1: Tip_Fuel_Tank_500lt = (1, MB_339PAN_Weapons.Tip_Fuel_Tank_500lt) - Tip_Fuel_Tank_Ellittici_320lt = (1, MB_339PAN_Weapons.Tip_Fuel_Tank_Ellittici_320lt) + Tip_Fuel_Tank_Ellittici_320lt = ( + 1, + MB_339PAN_Weapons.Tip_Fuel_Tank_Ellittici_320lt, + ) class Pylon2: Empty_Pylon = (2, MB_339PAN_Weapons.Empty_Pylon) @@ -386,7 +459,10 @@ class MB_339PAN(PlaneType): LR_25___25_ARF_8M3_API_ = (3, MB_339PAN_Weapons.LR_25___25_ARF_8M3_API_) Mk_82 = (3, Weapons.Mk_82) LAU_10___4_ZUNI_MK_71___ = (3, MB_339PAN_Weapons.LAU_10___4_ZUNI_MK_71___) - BRD_4_250_4_MK_76_2_ARF_8M3TP_ = (3, MB_339PAN_Weapons.BRD_4_250_4_MK_76_2_ARF_8M3TP_) + BRD_4_250_4_MK_76_2_ARF_8M3TP_ = ( + 3, + MB_339PAN_Weapons.BRD_4_250_4_MK_76_2_ARF_8M3TP_, + ) Matra_Type_155_Rocket_Pod = (3, Weapons.Matra_Type_155_Rocket_Pod) class Pylon4: @@ -427,7 +503,10 @@ class MB_339PAN(PlaneType): Mk_82 = (8, Weapons.Mk_82) LAU_10___4_ZUNI_MK_71___ = (8, MB_339PAN_Weapons.LAU_10___4_ZUNI_MK_71___) Matra_Type_155_Rocket_Pod = (8, Weapons.Matra_Type_155_Rocket_Pod) - BRD_4_250_4_MK_76_2_ARF_8M3TP_ = (8, MB_339PAN_Weapons.BRD_4_250_4_MK_76_2_ARF_8M3TP_) + BRD_4_250_4_MK_76_2_ARF_8M3TP_ = ( + 8, + MB_339PAN_Weapons.BRD_4_250_4_MK_76_2_ARF_8M3TP_, + ) class Pylon9: Empty_Pylon = (9, MB_339PAN_Weapons.Empty_Pylon) @@ -438,9 +517,18 @@ class MB_339PAN(PlaneType): class Pylon10: Tip_Fuel_Tank_500lt_ = (10, MB_339PAN_Weapons.Tip_Fuel_Tank_500lt_) - Tip_Fuel_Tank_Ellittici_320lt_ = (10, MB_339PAN_Weapons.Tip_Fuel_Tank_Ellittici_320lt_) + Tip_Fuel_Tank_Ellittici_320lt_ = ( + 10, + MB_339PAN_Weapons.Tip_Fuel_Tank_Ellittici_320lt_, + ) pylons = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} - tasks = [task.GroundAttack, task.RunwayAttack, task.CAS, task.AntishipStrike, task.Reconnaissance] - task_default = task.Nothing \ No newline at end of file + tasks = [ + task.GroundAttack, + task.RunwayAttack, + task.CAS, + task.AntishipStrike, + task.Reconnaissance, + ] + task_default = task.Nothing diff --git a/pydcs_extensions/mod_units.py b/pydcs_extensions/mod_units.py index 5dd1e93c..df011480 100644 --- a/pydcs_extensions/mod_units.py +++ b/pydcs_extensions/mod_units.py @@ -3,11 +3,16 @@ from pydcs_extensions.f22a.f22a import F_22A from pydcs_extensions.hercules.hercules import Hercules from pydcs_extensions.highdigitsams import highdigitsams from pydcs_extensions.mb339.mb339 import MB_339PAN -from pydcs_extensions.rafale.rafale import Rafale_M, Rafale_A_S, Rafale_B from pydcs_extensions.su57.su57 import Su_57 import pydcs_extensions.frenchpack.frenchpack as frenchpack -MODDED_AIRPLANES = [A_4E_C, MB_339PAN, Rafale_A_S, Rafale_M, Rafale_B, Su_57, F_22A, Hercules] +MODDED_AIRPLANES = [ + A_4E_C, + MB_339PAN, + Su_57, + F_22A, + Hercules, +] MODDED_VEHICLES = [ frenchpack._FIELD_HIDE, frenchpack._FIELD_HIDE_SMALL, @@ -84,5 +89,5 @@ MODDED_VEHICLES = [ highdigitsams.SAM_SA_24_Igla_S_manpad, highdigitsams.SAM_SA_14_Strela_3_manpad, highdigitsams.Polyana_D4M1_C2_node, - highdigitsams._34Ya6E_Gazetchik_E_decoy -] \ No newline at end of file + highdigitsams._34Ya6E_Gazetchik_E_decoy, +] diff --git a/pydcs_extensions/rafale/rafale.py b/pydcs_extensions/rafale/rafale.py deleted file mode 100644 index 458a6e8e..00000000 --- a/pydcs_extensions/rafale/rafale.py +++ /dev/null @@ -1,2980 +0,0 @@ -from enum import Enum - -from dcs import task -from dcs.planes import PlaneType -from dcs.weapons_data import Weapons - -class RafaleWeapons: - SCALP = {"clsid": "{SCALP}", "name": "SCALP", "weight": None} - AS_30L = {"clsid": "{AS_30L}", "name": "AS_30L", "weight": 292} - Exocet = {"clsid": "{Exocet}", "name": "Exocet", "weight": 640} - Thales_RBE2 = {"clsid": "{Thales_RBE2}", "name": "Thales_RBE2", "weight": 1.4789} - Thales_RBE2_ = {"clsid": "{Thales_RBE2}", "name": "Thales_RBE2", "weight": 1.4789} - DAMOCLES = {"clsid": "{DAMOCLES}", "name": "DAMOCLES", "weight": 265} - DAMOCLES_ = {"clsid": "{DAMOCLES}", "name": "DAMOCLES", "weight": 265} - DAMOCLES__ = {"clsid": "{DAMOCLES}", "name": "DAMOCLES", "weight": 265} - _2300_PTB_RAF = {"clsid": "{2300-PTB RAF}", "name": "2300-PTB RAF", "weight": 70} - _2300_PTB_RAF_ = {"clsid": "{2300-PTB RAF}", "name": "2300-PTB RAF", "weight": 70} - PTB_1500 = {"clsid": "{PTB-1500}", "name": "PTB-1500", "weight": 70} - RPL_711 = {"clsid": "{RPL 711}", "name": "RPL 711", "weight": 70} - RPL_711_ = {"clsid": "{RPL 711}", "name": "RPL 711", "weight": 70} - RPL_711__ = {"clsid": "{RPL 711}", "name": "RPL 711", "weight": 70} - RPL_711___ = {"clsid": "{PTB-1500}", "name": "RPL 711", "weight": 50} - RPL_751 = {"clsid": "{RPL-751}", "name": "RPL-751", "weight": 50} - RPL751 = {"clsid": "{RPL751}", "name": "RPL751", "weight": 70} - RPL751_ = {"clsid": "{RPL751}", "name": "RPL751", "weight": 70} - RPL751__ = {"clsid": "{RPL751}", "name": "RPL751", "weight": 70} - METEOR = {"clsid": "{RAFALE_MBDA_METEOR}", "name": "METEOR", "weight": 199} - METEOR_x2 = {"clsid": "{LAU-115_2xLAU-127_MBDA_METEOR}", "name": "METEOR x2", "weight": 445} - GBU_49 = {"clsid": "{GBU_49}", "name": "GBU_49", "weight": 525} - GBU12PII = {"clsid": "{GBU12PII}", "name": "GBU12PII", "weight": 525} - AASM_250 = {"clsid": "{AASM_250}", "name": "AASM_250", "weight": 250} - AASM_250_L = {"clsid": "{AASM_250_L}", "name": "AASM_250_L", "weight": 500} - AASM_250_R = {"clsid": "{AASM_250_R}", "name": "AASM_250_R", "weight": 500} - AASM_250_RIGHT = {"clsid": "{AASM_250_RIGHT}", "name": "AASM_250_RIGHT", "weight": 250} - _2_GBU_54_V_1_B = {"clsid": "{BRU-70A_2*GBU-54_LEFT}", "name": "2 GBU-54(V)1/B", "weight": 566} - _2_GBU_54_V_1_B_ = {"clsid": "{BRU-70A_2*GBU-54_RIGHT}", "name": "2 GBU-54(V)1/B", "weight": 566} - _3_GBU_54_V_1_B = {"clsid": "{BRU-70A_3*GBU-54}", "name": "3 GBU-54(V)1/B", "weight": 819} - - -class Rafale_A_S(PlaneType): - id = "Rafale_A_S" - flyable = True - height = 5.28 - width = 10.13 - length = 15.96 - fuel_max = 5000 - max_speed = 2001.996 - chaff = 48 - flare = 48 - charge_total = 96 - chaff_charge_size = 1 - flare_charge_size = 1 - category = "Interceptor" #{78EFB7A2-FD52-4b57-A6A6-3BF0E1D6555F} - radio_frequency = 127.5 - - class Liveries: - - class USSR(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Georgia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Venezuela(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Australia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Israel(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Combined_Joint_Task_Forces_Blue(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Sudan(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Norway(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Romania(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Iran(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Ukraine(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Libya(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Belgium(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Slovakia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Greece(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class UK(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Third_Reich(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Hungary(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Abkhazia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Morocco(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class United_Nations_Peacekeepers(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Switzerland(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class SouthOssetia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Vietnam(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class China(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Yemen(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Kuwait(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Serbia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Oman(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class India(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Egypt(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class TheNetherlands(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Poland(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Syria(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Finland(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Kazakhstan(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Denmark(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Sweden(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Croatia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class CzechRepublic(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class GDR(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Yugoslavia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Bulgaria(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class SouthKorea(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Tunisia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Combined_Joint_Task_Forces_Red(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Lebanon(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Portugal(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Cuba(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Insurgents(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class SaudiArabia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class France(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class USA(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Honduras(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Qatar(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Russia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class United_Arab_Emirates(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Italian_Social_Republi(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Austria(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Bahrain(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Italy(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Chile(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Turkey(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Philippines(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Algeria(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Pakistan(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Malaysia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Indonesia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Iraq(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Germany(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class South_Africa(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Jordan(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Mexico(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class USAFAggressors(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Brazil(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Spain(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Belarus(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Canada(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class NorthKorea(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Ethiopia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Japan(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Thailand(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Pylon1: - Smokewinder___red = (1, Weapons.Smokewinder___red) - Smokewinder___green = (1, Weapons.Smokewinder___green) - Smokewinder___blue = (1, Weapons.Smokewinder___blue) - Smokewinder___white = (1, Weapons.Smokewinder___white) - Smokewinder___yellow = (1, Weapons.Smokewinder___yellow) - Smokewinder___orange = (1, Weapons.Smokewinder___orange) - AIM_9M_Sidewinder_IR_AAM = (1, Weapons.AIM_9M_Sidewinder_IR_AAM) - AIM_9P_Sidewinder_IR_AAM = (1, Weapons.AIM_9P_Sidewinder_IR_AAM) - R_550_Magic_2 = (1, Weapons.R_550_Magic_2) - - class Pylon2: - AASM_250_L = (2, RafaleWeapons.AASM_250_L) - GBU_49 = (2, RafaleWeapons.GBU_49) - MER_2_MK_82 = (2, Weapons.MER_2_MK_82) - _3_Mk_82 = (2, Weapons._3_Mk_82) - GBU12PII = (2, RafaleWeapons.GBU12PII) - Mk_20 = (2, Weapons.Mk_20) - _3_Mk_20_Rockeye = (2, Weapons._3_Mk_20_Rockeye) - Mk_84 = (2, Weapons.Mk_84) - GBU_24 = (2, Weapons.GBU_24) - LAU_131___7_2_75__rockets_M151__HE_ = (2, Weapons.LAU_131___7_2_75__rockets_M151__HE_) - LAU3_HE151 = (2, Weapons.LAU3_HE151) - LAU3_WP156 = (2, Weapons.LAU3_WP156) - LAU3_HE5 = (2, Weapons.LAU3_HE5) - SCALP = (2, RafaleWeapons.SCALP) - AS_30L = (2, RafaleWeapons.AS_30L) - AGM_88C_ = (2, Weapons.AGM_88C_) - - class Pylon3: - GBU_49 = (3, RafaleWeapons.GBU_49) - GBU_24 = (3, Weapons.GBU_24) - GBU12PII = (3, RafaleWeapons.GBU12PII) - MER_2_MK_82 = (3, Weapons.MER_2_MK_82) - _3_Mk_82 = (3, Weapons._3_Mk_82) - AGM_88C_ = (3, Weapons.AGM_88C_) - LAU3_HE151 = (3, Weapons.LAU3_HE151) - LAU3_WP156 = (3, Weapons.LAU3_WP156) - LAU_131x3_HYDRA_70_M151 = (3, Weapons.LAU_131x3_HYDRA_70_M151) - AS_30L = (3, RafaleWeapons.AS_30L) - RPL_711__ = (3, RafaleWeapons.RPL_711__) - RPL751__ = (3, RafaleWeapons.RPL751__) - - class Pylon4: - AIM_9M_Sidewinder_IR_AAM = (4, Weapons.AIM_9M_Sidewinder_IR_AAM) - AIM_9P_Sidewinder_IR_AAM = (4, Weapons.AIM_9P_Sidewinder_IR_AAM) - MICA_IR = (4, Weapons.MICA_IR) - LAU_10___4_ZUNI_MK_71 = (4, Weapons.LAU_10___4_ZUNI_MK_71) - LAU_61___19_2_75__rockets_MK151_HE = (4, Weapons.LAU_61___19_2_75__rockets_MK151_HE) - LAU3_HE151 = (4, Weapons.LAU3_HE151) - - class Pylon5: - GBU12PII = (5, RafaleWeapons.GBU12PII) - RPL_711__ = (5, RafaleWeapons.RPL_711__) - RPL751__ = (5, RafaleWeapons.RPL751__) - Mercury_LLTV_Pod = (5, Weapons.Mercury_LLTV_Pod) - SCALP = (5, RafaleWeapons.SCALP) - Exocet = (5, RafaleWeapons.Exocet) - GBU_49 = (5, RafaleWeapons.GBU_49) - - class Pylon6: - LAU_10___4_ZUNI_MK_71 = (6, Weapons.LAU_10___4_ZUNI_MK_71) - LAU_61___19_2_75__rockets_MK151_HE = (6, Weapons.LAU_61___19_2_75__rockets_MK151_HE) - AIM_9M_Sidewinder_IR_AAM = (6, Weapons.AIM_9M_Sidewinder_IR_AAM) - AIM_9P_Sidewinder_IR_AAM = (6, Weapons.AIM_9P_Sidewinder_IR_AAM) - MICA_IR = (6, Weapons.MICA_IR) - LAU3_HE151 = (6, Weapons.LAU3_HE151) - - class Pylon7: - AN_AAQ_28_LITENING = (7, Weapons.AN_AAQ_28_LITENING) - DAMOCLES__ = (7, RafaleWeapons.DAMOCLES__) - Thales_RBE2_ = (7, RafaleWeapons.Thales_RBE2_) - - class Pylon8: - GBU_49 = (8, RafaleWeapons.GBU_49) - GBU_24 = (8, Weapons.GBU_24) - GBU12PII = (8, RafaleWeapons.GBU12PII) - MER_2_MK_82 = (8, Weapons.MER_2_MK_82) - _3_Mk_20_Rockeye = (8, Weapons._3_Mk_20_Rockeye) - _3_Mk_82 = (8, Weapons._3_Mk_82) - LAU3_HE151 = (8, Weapons.LAU3_HE151) - LAU3_WP156 = (8, Weapons.LAU3_WP156) - LAU_131x3_HYDRA_70_M151 = (8, Weapons.LAU_131x3_HYDRA_70_M151) - AS_30L = (8, RafaleWeapons.AS_30L) - AGM_88C_ = (8, Weapons.AGM_88C_) - RPL_711__ = (8, RafaleWeapons.RPL_711__) - RPL751__ = (8, RafaleWeapons.RPL751__) - - class Pylon9: - AASM_250_R = (9, RafaleWeapons.AASM_250_R) - GBU_49 = (9, RafaleWeapons.GBU_49) - GBU_24 = (9, Weapons.GBU_24) - MER_2_MK_82 = (9, Weapons.MER_2_MK_82) - GBU12PII = (9, RafaleWeapons.GBU12PII) - _3_Mk_20_Rockeye = (9, Weapons._3_Mk_20_Rockeye) - Mk_84 = (9, Weapons.Mk_84) - _3_Mk_82 = (9, Weapons._3_Mk_82) - AGM_88C_ = (9, Weapons.AGM_88C_) - LAU_131___7_2_75__rockets_M151__HE_ = (9, Weapons.LAU_131___7_2_75__rockets_M151__HE_) - LAU3_HE151 = (9, Weapons.LAU3_HE151) - LAU3_WP156 = (9, Weapons.LAU3_WP156) - LAU3_HE5 = (9, Weapons.LAU3_HE5) - SCALP = (9, RafaleWeapons.SCALP) - AS_30L = (9, RafaleWeapons.AS_30L) - - class Pylon10: - R_550_Magic_2 = (10, Weapons.R_550_Magic_2) - AIM_9M_Sidewinder_IR_AAM = (10, Weapons.AIM_9M_Sidewinder_IR_AAM) - AIM_9P_Sidewinder_IR_AAM = (10, Weapons.AIM_9P_Sidewinder_IR_AAM) - Smokewinder___red = (10, Weapons.Smokewinder___red) - Smokewinder___green = (10, Weapons.Smokewinder___green) - Smokewinder___blue = (10, Weapons.Smokewinder___blue) - Smokewinder___white = (10, Weapons.Smokewinder___white) - Smokewinder___yellow = (10, Weapons.Smokewinder___yellow) - Smokewinder___orange = (10, Weapons.Smokewinder___orange) - - pylons = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} - - tasks = [task.CAP, task.Escort, task.FighterSweep, task.GroundAttack, task.CAS, task.AFAC, task.RunwayAttack, task.AntishipStrike, task.SEAD, task.PinpointStrike] - task_default = task.CAP - - -class Rafale_M(PlaneType): - id = "Rafale_M" - flyable = True - height = 5.28 - width = 10.13 - length = 15.96 - fuel_max = 5000 - max_speed = 2001.996 - chaff = 48 - flare = 48 - charge_total = 96 - chaff_charge_size = 1 - flare_charge_size = 1 - category = "Interceptor" #{78EFB7A2-FD52-4b57-A6A6-3BF0E1D6555F} - radio_frequency = 127.5 - - class Liveries: - - class USSR(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Georgia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Venezuela(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Australia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Israel(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Combined_Joint_Task_Forces_Blue(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Sudan(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Norway(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Romania(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Iran(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Ukraine(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Libya(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Belgium(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Slovakia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Greece(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class UK(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Third_Reich(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Hungary(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Abkhazia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Morocco(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class United_Nations_Peacekeepers(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Switzerland(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class SouthOssetia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Vietnam(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class China(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Yemen(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Kuwait(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Serbia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Oman(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class India(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Egypt(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class TheNetherlands(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Poland(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Syria(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Finland(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Kazakhstan(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Denmark(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Sweden(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Croatia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class CzechRepublic(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class GDR(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Yugoslavia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Bulgaria(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class SouthKorea(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Tunisia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Combined_Joint_Task_Forces_Red(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Lebanon(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Portugal(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Cuba(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Insurgents(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class SaudiArabia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class France(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class USA(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Honduras(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Qatar(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Russia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class United_Arab_Emirates(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Italian_Social_Republi(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Austria(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Bahrain(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Italy(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Chile(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Turkey(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Philippines(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Algeria(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Pakistan(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Malaysia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Indonesia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Iraq(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Germany(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class South_Africa(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Jordan(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Mexico(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class USAFAggressors(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Brazil(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Spain(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Belarus(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Canada(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class NorthKorea(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Ethiopia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Japan(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Thailand(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - _04_11f_tiger_meet = "04 11f tiger meet" - _05_brazil = "05 brazil" - _07_marine_tiger_2014 = "07 marine tiger 2014" - _08_flottile_12_f_90_ans = "08 flottile 12-f.90 ans" - _09_marine_mat_17f = "09 marine mat 17f" - - class Pylon1: - Smokewinder___red = (1, Weapons.Smokewinder___red) - Smokewinder___green = (1, Weapons.Smokewinder___green) - Smokewinder___blue = (1, Weapons.Smokewinder___blue) - Smokewinder___white = (1, Weapons.Smokewinder___white) - Smokewinder___yellow = (1, Weapons.Smokewinder___yellow) - Smokewinder___orange = (1, Weapons.Smokewinder___orange) - R_550_Magic_2 = (1, Weapons.R_550_Magic_2) - AIM_9M_Sidewinder_IR_AAM = (1, Weapons.AIM_9M_Sidewinder_IR_AAM) - AIM_9P_Sidewinder_IR_AAM = (1, Weapons.AIM_9P_Sidewinder_IR_AAM) - - class Pylon2: - Mk_84 = (2, Weapons.Mk_84) - MER_2_MK_83 = (2, Weapons.MER_2_MK_83) - MER_2_MK_82 = (2, Weapons.MER_2_MK_82) - _3_Mk_82 = (2, Weapons._3_Mk_82) - LAU_131___7_2_75__rockets_M151__HE_ = (2, Weapons.LAU_131___7_2_75__rockets_M151__HE_) - LAU3_HE151 = (2, Weapons.LAU3_HE151) - LAU3_WP156 = (2, Weapons.LAU3_WP156) - LAU3_HE5 = (2, Weapons.LAU3_HE5) - MICA_IR = (2, Weapons.MICA_IR) - AIM_7M = (2, Weapons.AIM_7M) - AIM_120B = (2, Weapons.AIM_120B) - AIM_120C = (2, Weapons.AIM_120C) - LAU_115_2_LAU_127_AIM_120C = (2, Weapons.LAU_115_2_LAU_127_AIM_120C) - Super_530D = (2, Weapons.Super_530D) - METEOR = (2, RafaleWeapons.METEOR) - AASM_250 = (2, RafaleWeapons.AASM_250) - - class Pylon3: - Mk_84 = (3, Weapons.Mk_84) - MER_2_MK_83 = (3, Weapons.MER_2_MK_83) - MER_2_MK_82 = (3, Weapons.MER_2_MK_82) - _3_Mk_82 = (3, Weapons._3_Mk_82) - LAU3_HE151 = (3, Weapons.LAU3_HE151) - LAU3_WP156 = (3, Weapons.LAU3_WP156) - LAU_131x3_HYDRA_70_M151 = (3, Weapons.LAU_131x3_HYDRA_70_M151) - MICA_IR = (3, Weapons.MICA_IR) - AIM_7M = (3, Weapons.AIM_7M) - AIM_120B = (3, Weapons.AIM_120B) - AIM_120C = (3, Weapons.AIM_120C) - Super_530D = (3, Weapons.Super_530D) - RPL_711__ = (3, RafaleWeapons.RPL_711__) - RPL751__ = (3, RafaleWeapons.RPL751__) - METEOR = (3, RafaleWeapons.METEOR) - - class Pylon4: - MICA_IR = (4, Weapons.MICA_IR) - AIM_9M_Sidewinder_IR_AAM = (4, Weapons.AIM_9M_Sidewinder_IR_AAM) - AIM_9P_Sidewinder_IR_AAM = (4, Weapons.AIM_9P_Sidewinder_IR_AAM) - LAU3_WP156 = (4, Weapons.LAU3_WP156) - LAU_10___4_ZUNI_MK_71 = (4, Weapons.LAU_10___4_ZUNI_MK_71) - LAU_61___19_2_75__rockets_MK151_HE = (4, Weapons.LAU_61___19_2_75__rockets_MK151_HE) - Mk_82 = (4, Weapons.Mk_82) - - class Pylon5: - RPL_711__ = (5, RafaleWeapons.RPL_711__) - RPL751__ = (5, RafaleWeapons.RPL751__) - MICA_IR = (5, Weapons.MICA_IR) - AIM_7M = (5, Weapons.AIM_7M) - AIM_120B = (5, Weapons.AIM_120B) - AIM_120C = (5, Weapons.AIM_120C) - Super_530D = (5, Weapons.Super_530D) - METEOR = (5, RafaleWeapons.METEOR) - - class Pylon6: - MICA_IR = (6, Weapons.MICA_IR) - AIM_9M_Sidewinder_IR_AAM = (6, Weapons.AIM_9M_Sidewinder_IR_AAM) - AIM_9P_Sidewinder_IR_AAM = (6, Weapons.AIM_9P_Sidewinder_IR_AAM) - LAU3_WP156 = (6, Weapons.LAU3_WP156) - LAU_10___4_ZUNI_MK_71 = (6, Weapons.LAU_10___4_ZUNI_MK_71) - LAU_61___19_2_75__rockets_MK151_HE = (6, Weapons.LAU_61___19_2_75__rockets_MK151_HE) - Mk_82 = (6, Weapons.Mk_82) - - class Pylon7: - AN_AAQ_28_LITENING = (7, Weapons.AN_AAQ_28_LITENING) - DAMOCLES__ = (7, RafaleWeapons.DAMOCLES__) - - class Pylon8: - Mk_84 = (8, Weapons.Mk_84) - MER_2_MK_83 = (8, Weapons.MER_2_MK_83) - MER_2_MK_82 = (8, Weapons.MER_2_MK_82) - _3_Mk_82 = (8, Weapons._3_Mk_82) - LAU3_HE151 = (8, Weapons.LAU3_HE151) - LAU3_WP156 = (8, Weapons.LAU3_WP156) - LAU_131x3_HYDRA_70_M151 = (8, Weapons.LAU_131x3_HYDRA_70_M151) - MICA_IR = (8, Weapons.MICA_IR) - AIM_7M = (8, Weapons.AIM_7M) - AIM_120B = (8, Weapons.AIM_120B) - AIM_120C = (8, Weapons.AIM_120C) - Super_530D = (8, Weapons.Super_530D) - RPL_711__ = (8, RafaleWeapons.RPL_711__) - RPL751__ = (8, RafaleWeapons.RPL751__) - METEOR = (8, RafaleWeapons.METEOR) - - class Pylon9: - METEOR = (9, RafaleWeapons.METEOR) - Mk_84 = (9, Weapons.Mk_84) - MER_2_MK_83 = (9, Weapons.MER_2_MK_83) - MER_2_MK_82 = (9, Weapons.MER_2_MK_82) - _3_Mk_82 = (9, Weapons._3_Mk_82) - LAU_131___7_2_75__rockets_M151__HE_ = (9, Weapons.LAU_131___7_2_75__rockets_M151__HE_) - LAU3_HE151 = (9, Weapons.LAU3_HE151) - LAU3_WP156 = (9, Weapons.LAU3_WP156) - LAU3_HE5 = (9, Weapons.LAU3_HE5) - MICA_IR = (9, Weapons.MICA_IR) - AIM_7M = (9, Weapons.AIM_7M) - AIM_120B = (9, Weapons.AIM_120B) - AIM_120C = (9, Weapons.AIM_120C) - LAU_115_2_LAU_127_AIM_120C = (9, Weapons.LAU_115_2_LAU_127_AIM_120C) - Super_530D = (9, Weapons.Super_530D) - AASM_250_RIGHT = (9, RafaleWeapons.AASM_250_RIGHT) - - class Pylon10: - R_550_Magic_2 = (10, Weapons.R_550_Magic_2) - AIM_9M_Sidewinder_IR_AAM = (10, Weapons.AIM_9M_Sidewinder_IR_AAM) - AIM_9P_Sidewinder_IR_AAM = (10, Weapons.AIM_9P_Sidewinder_IR_AAM) - Smokewinder___red = (10, Weapons.Smokewinder___red) - Smokewinder___green = (10, Weapons.Smokewinder___green) - Smokewinder___blue = (10, Weapons.Smokewinder___blue) - Smokewinder___white = (10, Weapons.Smokewinder___white) - Smokewinder___yellow = (10, Weapons.Smokewinder___yellow) - Smokewinder___orange = (10, Weapons.Smokewinder___orange) - - pylons = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} - - tasks = [task.CAP, task.Escort, task.FighterSweep, task.GroundAttack, task.CAS, task.AFAC, task.RunwayAttack, task.AntishipStrike, task.Reconnaissance, task.Intercept] - task_default = task.CAP - - -class Rafale_B(PlaneType): - id = "Rafale_B" - flyable = True - height = 5.28 - width = 10.13 - length = 15.96 - fuel_max = 5000 - max_speed = 2001.996 - chaff = 48 - flare = 48 - charge_total = 96 - chaff_charge_size = 1 - flare_charge_size = 1 - category = "Interceptor" #{78EFB7A2-FD52-4b57-A6A6-3BF0E1D6555F} - radio_frequency = 127.5 - - class Liveries: - - class USSR(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Georgia(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Venezuela(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Australia(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Israel(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Combined_Joint_Task_Forces_Blue(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Sudan(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Norway(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Romania(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Iran(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Ukraine(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Libya(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Belgium(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Slovakia(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Greece(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class UK(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Third_Reich(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Hungary(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Abkhazia(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Morocco(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class United_Nations_Peacekeepers(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Switzerland(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class SouthOssetia(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Vietnam(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class China(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Yemen(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Kuwait(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Serbia(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Oman(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class India(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Egypt(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class TheNetherlands(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Poland(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Syria(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Finland(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Kazakhstan(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Denmark(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Sweden(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Croatia(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class CzechRepublic(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class GDR(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Yugoslavia(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Bulgaria(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class SouthKorea(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Tunisia(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Combined_Joint_Task_Forces_Red(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Lebanon(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Portugal(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Cuba(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Insurgents(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class SaudiArabia(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class France(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class USA(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Honduras(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Qatar(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Russia(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class United_Arab_Emirates(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Italian_Social_Republi(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Austria(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Bahrain(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Italy(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Chile(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Turkey(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Philippines(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Algeria(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Pakistan(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Malaysia(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Indonesia(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Iraq(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Germany(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class South_Africa(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Jordan(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Mexico(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class USAFAggressors(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Brazil(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Spain(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Belarus(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Canada(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class NorthKorea(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Ethiopia(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Japan(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Thailand(Enum): - _01_rafale_b_lafayette = "01 rafale b lafayette" - _02_rafale_b_mt_de_marsan = "02 rafale b mt de marsan" - _03_standard = "03 standard" - - class Pylon1: - Smokewinder___red = (1, Weapons.Smokewinder___red) - Smokewinder___green = (1, Weapons.Smokewinder___green) - Smokewinder___blue = (1, Weapons.Smokewinder___blue) - Smokewinder___white = (1, Weapons.Smokewinder___white) - Smokewinder___yellow = (1, Weapons.Smokewinder___yellow) - Smokewinder___orange = (1, Weapons.Smokewinder___orange) - AIM_9M_Sidewinder_IR_AAM = (1, Weapons.AIM_9M_Sidewinder_IR_AAM) - AIM_9P_Sidewinder_IR_AAM = (1, Weapons.AIM_9P_Sidewinder_IR_AAM) - R_550_Magic_2 = (1, Weapons.R_550_Magic_2) - - class Pylon2: - AASM_250_L = (2, RafaleWeapons.AASM_250_L) - GBU_49 = (2, RafaleWeapons.GBU_49) - MER_2_MK_82 = (2, Weapons.MER_2_MK_82) - _3_Mk_82 = (2, Weapons._3_Mk_82) - GBU12PII = (2, RafaleWeapons.GBU12PII) - Mk_20 = (2, Weapons.Mk_20) - _3_Mk_20_Rockeye = (2, Weapons._3_Mk_20_Rockeye) - Mk_84 = (2, Weapons.Mk_84) - GBU_24 = (2, Weapons.GBU_24) - LAU_131___7_2_75__rockets_M151__HE_ = (2, Weapons.LAU_131___7_2_75__rockets_M151__HE_) - LAU3_HE151 = (2, Weapons.LAU3_HE151) - LAU3_WP156 = (2, Weapons.LAU3_WP156) - LAU3_HE5 = (2, Weapons.LAU3_HE5) - SCALP = (2, RafaleWeapons.SCALP) - AS_30L = (2, RafaleWeapons.AS_30L) - AGM_88C_ = (2, Weapons.AGM_88C_) - - class Pylon3: - GBU_49 = (3, RafaleWeapons.GBU_49) - GBU_24 = (3, Weapons.GBU_24) - GBU12PII = (3, RafaleWeapons.GBU12PII) - MER_2_MK_82 = (3, Weapons.MER_2_MK_82) - _3_Mk_82 = (3, Weapons._3_Mk_82) - AGM_88C_ = (3, Weapons.AGM_88C_) - LAU3_HE151 = (3, Weapons.LAU3_HE151) - LAU3_WP156 = (3, Weapons.LAU3_WP156) - LAU_131x3_HYDRA_70_M151 = (3, Weapons.LAU_131x3_HYDRA_70_M151) - AS_30L = (3, RafaleWeapons.AS_30L) - RPL_711__ = (3, RafaleWeapons.RPL_711__) - RPL751__ = (3, RafaleWeapons.RPL751__) - Mk_84 = (3, Weapons.Mk_84) - - class Pylon4: - AIM_9M_Sidewinder_IR_AAM = (4, Weapons.AIM_9M_Sidewinder_IR_AAM) - AIM_9P_Sidewinder_IR_AAM = (4, Weapons.AIM_9P_Sidewinder_IR_AAM) - MICA_IR = (4, Weapons.MICA_IR) - LAU_10___4_ZUNI_MK_71 = (4, Weapons.LAU_10___4_ZUNI_MK_71) - LAU_61___19_2_75__rockets_MK151_HE = (4, Weapons.LAU_61___19_2_75__rockets_MK151_HE) - LAU3_HE151 = (4, Weapons.LAU3_HE151) - - class Pylon5: - GBU12PII = (5, RafaleWeapons.GBU12PII) - Mk_84 = (5, Weapons.Mk_84) - RPL_711__ = (5, RafaleWeapons.RPL_711__) - RPL751__ = (5, RafaleWeapons.RPL751__) - Mercury_LLTV_Pod = (5, Weapons.Mercury_LLTV_Pod) - SCALP = (5, RafaleWeapons.SCALP) - Exocet = (5, RafaleWeapons.Exocet) - GBU_49 = (5, RafaleWeapons.GBU_49) - MER_2_MK_83 = (5, Weapons.MER_2_MK_83) - MER_2_MK_82 = (5, Weapons.MER_2_MK_82) - - class Pylon6: - LAU_10___4_ZUNI_MK_71 = (6, Weapons.LAU_10___4_ZUNI_MK_71) - LAU_61___19_2_75__rockets_MK151_HE = (6, Weapons.LAU_61___19_2_75__rockets_MK151_HE) - AIM_9M_Sidewinder_IR_AAM = (6, Weapons.AIM_9M_Sidewinder_IR_AAM) - AIM_9P_Sidewinder_IR_AAM = (6, Weapons.AIM_9P_Sidewinder_IR_AAM) - MICA_IR = (6, Weapons.MICA_IR) - LAU3_HE151 = (6, Weapons.LAU3_HE151) - - class Pylon7: - AN_AAQ_28_LITENING = (7, Weapons.AN_AAQ_28_LITENING) - DAMOCLES__ = (7, RafaleWeapons.DAMOCLES__) - Thales_RBE2_ = (7, RafaleWeapons.Thales_RBE2_) - - class Pylon8: - GBU_49 = (8, RafaleWeapons.GBU_49) - GBU_24 = (8, Weapons.GBU_24) - GBU12PII = (8, RafaleWeapons.GBU12PII) - MER_2_MK_82 = (8, Weapons.MER_2_MK_82) - _3_Mk_20_Rockeye = (8, Weapons._3_Mk_20_Rockeye) - _3_Mk_82 = (8, Weapons._3_Mk_82) - Mk_84 = (8, Weapons.Mk_84) - LAU3_HE151 = (8, Weapons.LAU3_HE151) - LAU3_WP156 = (8, Weapons.LAU3_WP156) - LAU_131x3_HYDRA_70_M151 = (8, Weapons.LAU_131x3_HYDRA_70_M151) - AS_30L = (8, RafaleWeapons.AS_30L) - AGM_88C_ = (8, Weapons.AGM_88C_) - RPL_711__ = (8, RafaleWeapons.RPL_711__) - RPL751__ = (8, RafaleWeapons.RPL751__) - - class Pylon9: - AASM_250_R = (9, RafaleWeapons.AASM_250_R) - GBU_49 = (9, RafaleWeapons.GBU_49) - GBU_24 = (9, Weapons.GBU_24) - MER_2_MK_82 = (9, Weapons.MER_2_MK_82) - GBU12PII = (9, RafaleWeapons.GBU12PII) - _3_Mk_20_Rockeye = (9, Weapons._3_Mk_20_Rockeye) - Mk_84 = (9, Weapons.Mk_84) - _3_Mk_82 = (9, Weapons._3_Mk_82) - AGM_88C_ = (9, Weapons.AGM_88C_) - LAU_131___7_2_75__rockets_M151__HE_ = (9, Weapons.LAU_131___7_2_75__rockets_M151__HE_) - LAU3_HE151 = (9, Weapons.LAU3_HE151) - LAU3_WP156 = (9, Weapons.LAU3_WP156) - LAU3_HE5 = (9, Weapons.LAU3_HE5) - SCALP = (9, RafaleWeapons.SCALP) - AS_30L = (9, RafaleWeapons.AS_30L) - - class Pylon10: - R_550_Magic_2 = (10, Weapons.R_550_Magic_2) - AIM_9M_Sidewinder_IR_AAM = (10, Weapons.AIM_9M_Sidewinder_IR_AAM) - AIM_9P_Sidewinder_IR_AAM = (10, Weapons.AIM_9P_Sidewinder_IR_AAM) - Smokewinder___red = (10, Weapons.Smokewinder___red) - Smokewinder___green = (10, Weapons.Smokewinder___green) - Smokewinder___blue = (10, Weapons.Smokewinder___blue) - Smokewinder___white = (10, Weapons.Smokewinder___white) - Smokewinder___yellow = (10, Weapons.Smokewinder___yellow) - Smokewinder___orange = (10, Weapons.Smokewinder___orange) - - pylons = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} - - tasks = [task.CAP, task.Escort, task.FighterSweep, task.GroundAttack, task.CAS, task.AFAC, task.RunwayAttack, task.AntishipStrike, task.SEAD, task.PinpointStrike] - task_default = task.GroundAttack - - -class Rafale_M_NOUNOU(PlaneType): - id = "Rafale_M_NOUNOU" - group_size_max = 1 - height = 5.28 - width = 10.13 - length = 15.96 - fuel_max = 4500 - max_speed = 2001.996 - chaff = 48 - flare = 48 - charge_total = 96 - chaff_charge_size = 1 - flare_charge_size = 1 - tacan = True - category = "Tankers" #{8A302789-A55D-4897-B647-66493FA6826F} - radio_frequency = 127.5 - - class Liveries: - - class USSR(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Georgia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Venezuela(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Australia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Israel(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Combined_Joint_Task_Forces_Blue(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Sudan(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Norway(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Romania(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Iran(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Ukraine(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Libya(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Belgium(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Slovakia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Greece(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class UK(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Third_Reich(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Hungary(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Abkhazia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Morocco(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class United_Nations_Peacekeepers(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Switzerland(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class SouthOssetia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Vietnam(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class China(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Yemen(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Kuwait(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Serbia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Oman(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class India(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Egypt(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class TheNetherlands(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Poland(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Syria(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Finland(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Kazakhstan(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Denmark(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Sweden(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Croatia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class CzechRepublic(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class GDR(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Yugoslavia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Bulgaria(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class SouthKorea(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Tunisia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Combined_Joint_Task_Forces_Red(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Lebanon(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Portugal(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Cuba(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Insurgents(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class SaudiArabia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class France(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class USA(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Honduras(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Qatar(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Russia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class United_Arab_Emirates(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Italian_Social_Republi(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Austria(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Bahrain(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Italy(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Chile(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Turkey(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Philippines(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Algeria(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Pakistan(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Malaysia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Indonesia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Iraq(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Germany(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class South_Africa(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Jordan(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Mexico(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class USAFAggressors(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Brazil(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Spain(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Belarus(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Canada(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class NorthKorea(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Ethiopia(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Japan(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Thailand(Enum): - _01_marine_12_f = "01 marine 12 f" - _02_rafale_export = "02 rafale export" - _03_black_derive_11f = "03 black derive 11f" - - class Pylon1: - MICA_IR = (1, Weapons.MICA_IR) - R_550_Magic_2 = (1, Weapons.R_550_Magic_2) - - class Pylon3: - RPL_751 = (3, RafaleWeapons.RPL_751) - RPL_711___ = (3, RafaleWeapons.RPL_711___) - - class Pylon8: - RPL_751 = (8, RafaleWeapons.RPL_751) - RPL_711___ = (8, RafaleWeapons.RPL_711___) - - class Pylon10: - MICA_IR = (10, Weapons.MICA_IR) - R_550_Magic_2 = (10, Weapons.R_550_Magic_2) - - class Pylon11: - Smokewinder___green = (11, Weapons.Smokewinder___green) - Smokewinder___blue = (11, Weapons.Smokewinder___blue) - Smokewinder___orange = (11, Weapons.Smokewinder___orange) - Smoke_Generator___red_ = (11, Weapons.Smoke_Generator___red_) - Smoke_Generator___blue_ = (11, Weapons.Smoke_Generator___blue_) - Smoke_Generator___white_ = (11, Weapons.Smoke_Generator___white_) - - pylons = {1, 3, 8, 10, 11} - - tasks = [task.Refueling] - task_default = task.Refueling - diff --git a/pydcs_extensions/su57/su57.py b/pydcs_extensions/su57/su57.py index a586222e..fa3ce0a2 100644 --- a/pydcs_extensions/su57/su57.py +++ b/pydcs_extensions/su57/su57.py @@ -11,7 +11,11 @@ class Su57Weapons: RVV_BD = {"clsid": "{RVV-BD}", "name": "RVV-BD", "weight": 600} RVV_L = {"clsid": "{RVV-L}", "name": "RVV-L", "weight": 748} RVV_M = {"clsid": "{RVV-M}", "name": "RVV-M", "weight": 190} - Su_57_Fuel_Tank = {"clsid": "{SU_57Tank}", "name": "Su-57 Fuel Tank", "weight": 1561.421} + Su_57_Fuel_Tank = { + "clsid": "{SU_57Tank}", + "name": "Su-57 Fuel Tank", + "weight": 1561.421, + } class Su_57(PlaneType): @@ -27,10 +31,9 @@ class Su_57(PlaneType): charge_total = 200 chaff_charge_size = 1 flare_charge_size = 1 - category = "Interceptor" #{78EFB7A2-FD52-4b57-A6A6-3BF0E1D6555F} + category = "Interceptor" # {78EFB7A2-FD52-4b57-A6A6-3BF0E1D6555F} class Liveries: - class USSR(Enum): _22 = "22" _20 = "20" @@ -1508,7 +1511,7 @@ class Su_57(PlaneType): _15 = "15" class Pylon1: - R_73 = (1, Weapons.R_73) + R_73__AA_11_Archer____Infra_Red = (1, Weapons.R_73__AA_11_Archer____Infra_Red) RVV_AE = (1, Su57Weapons.RVV_AE) RVV_M = (1, Su57Weapons.RVV_M) Smoke_Generator___red = (1, Weapons.Smoke_Generator___red) @@ -1519,33 +1522,26 @@ class Su_57(PlaneType): Smoke_Generator___orange = (1, Weapons.Smoke_Generator___orange) class Pylon2: - R_27R = (2, Weapons.R_27R) - R_27ER = (2, Weapons.R_27ER) - R_27T = (2, Weapons.R_27T) - R_27ET = (2, Weapons.R_27ET) - R_77 = (2, Weapons.R_77) - R_73 = (2, Weapons.R_73) - Kh_31P = (2, Weapons.Kh_31P) - Kh_31A = (2, Weapons.Kh_31A) - Kh_29L = (2, Weapons.Kh_29L) - Kh_29T = (2, Weapons.Kh_29T) - Kh_59M = (2, Weapons.Kh_59M) - MER_6_FAB_100 = (2, Weapons.MER_6_FAB_100) - B_8M1___20_S_8KOM = (2, Weapons.B_8M1___20_S_8KOM) - B_13L___5_S_13_OF = (2, Weapons.B_13L___5_S_13_OF) - S_25_OFM = (2, Weapons.S_25_OFM) - BetAB_500 = (2, Weapons.BetAB_500) - KMGU_2___96_AO_2_5RT = (2, Weapons.KMGU_2___96_AO_2_5RT) - KMGU_2___96_PTAB_2_5KO = (2, Weapons.KMGU_2___96_PTAB_2_5KO) - FAB_250 = (2, Weapons.FAB_250) - RBK_250_PTAB_2_5M = (2, Weapons.RBK_250_PTAB_2_5M) - FAB_500_M62 = (2, Weapons.FAB_500_M62) - RBK_500_255_PTAB_10_5 = (2, Weapons.RBK_500_255_PTAB_10_5) - KAB_500L = (2, Weapons.KAB_500L) - KAB_500kr = (2, Weapons.KAB_500kr) - FAB_1500_M54 = (2, Weapons.FAB_1500_M54) - KAB_1500L = (2, Weapons.KAB_1500L) - MER_6_FAB_250 = (2, Weapons.MER_6_FAB_250) + R_27R__AA_10_Alamo_A____Semi_Act_Rdr = ( + 2, + Weapons.R_27R__AA_10_Alamo_A____Semi_Act_Rdr, + ) + R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range = ( + 2, + Weapons.R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range, + ) + R_27T = (2, Weapons.R_27T__AA_10_Alamo_B____Infra_Red) + R_27ET__AA_10_Alamo_D____IR_Extended_Range = ( + 2, + Weapons.R_27ET__AA_10_Alamo_D____IR_Extended_Range, + ) + R_77__AA_12_Adder____Active_Rdr = (2, Weapons.R_77__AA_12_Adder____Active_Rdr) + R_73__AA_11_Archer____Infra_Red = (2, Weapons.R_73__AA_11_Archer____Infra_Red) + Kh_31P = (2, Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr) + Kh_31A = (2, Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr) + Kh_29L = (2, Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser) + Kh_29T = (2, Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided) + Kh_59M = (2, Weapons.Kh_59M__AS_18_Kazoo____930kg__ASM__IN) RVV_BD = (2, Su57Weapons.RVV_BD) RVV_AE = (2, Su57Weapons.RVV_AE) RVV_M = (2, Su57Weapons.RVV_M) @@ -1562,7 +1558,7 @@ class Su_57(PlaneType): Smoke_Generator___orange = (2, Weapons.Smoke_Generator___orange) class Pylon3: - R_73 = (3, Weapons.R_73) + R_73__AA_11_Archer____Infra_Red = (3, Weapons.R_73__AA_11_Archer____Infra_Red) Smoke_Generator___red = (3, Weapons.Smoke_Generator___red) Smoke_Generator___green = (3, Weapons.Smoke_Generator___green) Smoke_Generator___blue = (3, Weapons.Smoke_Generator___blue) @@ -1571,33 +1567,29 @@ class Su_57(PlaneType): Smoke_Generator___orange = (3, Weapons.Smoke_Generator___orange) class Pylon4: - R_27R = (4, Weapons.R_27R) - R_27ER = (4, Weapons.R_27ER) - R_27T = (4, Weapons.R_27T) - R_27ET = (4, Weapons.R_27ET) - R_77 = (4, Weapons.R_77) - R_73 = (4, Weapons.R_73) - Kh_31P = (4, Weapons.Kh_31P) - Kh_31A = (4, Weapons.Kh_31A) - Kh_29L = (4, Weapons.Kh_29L) - Kh_29T = (4, Weapons.Kh_29T) - Kh_59M = (4, Weapons.Kh_59M) - MER_6_FAB_100 = (4, Weapons.MER_6_FAB_100) - B_8M1___20_S_8KOM = (4, Weapons.B_8M1___20_S_8KOM) - B_13L___5_S_13_OF = (4, Weapons.B_13L___5_S_13_OF) - S_25_OFM = (4, Weapons.S_25_OFM) - BetAB_500 = (4, Weapons.BetAB_500) - KMGU_2___96_AO_2_5RT = (4, Weapons.KMGU_2___96_AO_2_5RT) - KMGU_2___96_PTAB_2_5KO = (4, Weapons.KMGU_2___96_PTAB_2_5KO) - FAB_250 = (4, Weapons.FAB_250) - RBK_250_PTAB_2_5M = (4, Weapons.RBK_250_PTAB_2_5M) - FAB_500_M62 = (4, Weapons.FAB_500_M62) - RBK_500_255_PTAB_10_5 = (4, Weapons.RBK_500_255_PTAB_10_5) - KAB_500L = (4, Weapons.KAB_500L) - KAB_500kr = (4, Weapons.KAB_500kr) - FAB_1500_M54 = (4, Weapons.FAB_1500_M54) - KAB_1500L = (4, Weapons.KAB_1500L) - MER_6_FAB_250 = (4, Weapons.MER_6_FAB_250) + R_27R__AA_10_Alamo_A____Semi_Act_Rdr = ( + 4, + Weapons.R_27R__AA_10_Alamo_A____Semi_Act_Rdr, + ) + R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range = ( + 4, + Weapons.R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range, + ) + R_27T__AA_10_Alamo_B____Infra_Red = ( + 4, + Weapons.R_27T__AA_10_Alamo_B____Infra_Red, + ) + R_27ET__AA_10_Alamo_D____IR_Extended_Range = ( + 4, + Weapons.R_27ET__AA_10_Alamo_D____IR_Extended_Range, + ) + R_77__AA_12_Adder____Active_Rdr = (4, Weapons.R_77__AA_12_Adder____Active_Rdr) + R_73__AA_11_Archer____Infra_Red = (4, Weapons.R_73__AA_11_Archer____Infra_Red) + Kh_31P = (4, Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr) + Kh_31A = (4, Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr) + Kh_29L = (4, Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser) + Kh_29T = (4, Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided) + Kh_59M = (4, Weapons.Kh_59M__AS_18_Kazoo____930kg__ASM__IN) RVV_BD = (4, Su57Weapons.RVV_BD) RVV_AE = (4, Su57Weapons.RVV_AE) RVV_M = (4, Su57Weapons.RVV_M) @@ -1607,57 +1599,50 @@ class Su_57(PlaneType): Kh_59MK2 = (4, Su57Weapons.Kh_59MK2) class Pylon5: - R_77 = (5, Weapons.R_77) + R_77__AA_12_Adder____Active_Rdr = (5, Weapons.R_77__AA_12_Adder____Active_Rdr) RVV_AE = (5, Su57Weapons.RVV_AE) RVV_M = (5, Su57Weapons.RVV_M) Kh_59MK2 = (5, Su57Weapons.Kh_59MK2) class Pylon6: - R_77 = (6, Weapons.R_77) + R_77__AA_12_Adder____Active_Rdr = (6, Weapons.R_77__AA_12_Adder____Active_Rdr) RVV_AE = (6, Su57Weapons.RVV_AE) RVV_M = (6, Su57Weapons.RVV_M) Kh_59MK2 = (6, Su57Weapons.Kh_59MK2) class Pylon7: - R_77 = (7, Weapons.R_77) + R_77__AA_12_Adder____Active_Rdr = (7, Weapons.R_77__AA_12_Adder____Active_Rdr) RVV_AE = (7, Su57Weapons.RVV_AE) RVV_M = (7, Su57Weapons.RVV_M) Kh_59MK2 = (7, Su57Weapons.Kh_59MK2) class Pylon8: - R_77 = (8, Weapons.R_77) + R_77__AA_12_Adder____Active_Rdr = (8, Weapons.R_77__AA_12_Adder____Active_Rdr) RVV_AE = (8, Su57Weapons.RVV_AE) RVV_M = (8, Su57Weapons.RVV_M) Kh_59MK2 = (8, Su57Weapons.Kh_59MK2) class Pylon9: - R_27R = (9, Weapons.R_27R) - R_27ER = (9, Weapons.R_27ER) - R_27T = (9, Weapons.R_27T) - R_27ET = (9, Weapons.R_27ET) - R_77 = (9, Weapons.R_77) - R_73 = (9, Weapons.R_73) - Kh_31P = (9, Weapons.Kh_31P) - Kh_31A = (9, Weapons.Kh_31A) - Kh_29L = (9, Weapons.Kh_29L) - Kh_29T = (9, Weapons.Kh_29T) - Kh_59M = (9, Weapons.Kh_59M) - MER_6_FAB_100 = (9, Weapons.MER_6_FAB_100) - B_8M1___20_S_8KOM = (9, Weapons.B_8M1___20_S_8KOM) - B_13L___5_S_13_OF = (9, Weapons.B_13L___5_S_13_OF) - S_25_OFM = (9, Weapons.S_25_OFM) - BetAB_500 = (9, Weapons.BetAB_500) - KMGU_2___96_AO_2_5RT = (9, Weapons.KMGU_2___96_AO_2_5RT) - KMGU_2___96_PTAB_2_5KO = (9, Weapons.KMGU_2___96_PTAB_2_5KO) - FAB_250 = (9, Weapons.FAB_250) - RBK_250_PTAB_2_5M = (9, Weapons.RBK_250_PTAB_2_5M) - FAB_500_M62 = (9, Weapons.FAB_500_M62) - RBK_500_255_PTAB_10_5 = (9, Weapons.RBK_500_255_PTAB_10_5) - KAB_500L = (9, Weapons.KAB_500L) - KAB_500kr = (9, Weapons.KAB_500kr) - FAB_1500_M54 = (9, Weapons.FAB_1500_M54) - KAB_1500L = (9, Weapons.KAB_1500L) - MER_6_FAB_250 = (9, Weapons.MER_6_FAB_250) + R_27R__AA_10_Alamo_A____Semi_Act_Rdr = ( + 9, + Weapons.R_27R__AA_10_Alamo_A____Semi_Act_Rdr, + ) + R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range = ( + 9, + Weapons.R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range, + ) + R_27T = (9, Weapons.R_27T__AA_10_Alamo_B____Infra_Red) + R_27ET__AA_10_Alamo_D____IR_Extended_Range = ( + 9, + Weapons.R_27ET__AA_10_Alamo_D____IR_Extended_Range, + ) + R_77__AA_12_Adder____Active_Rdr = (9, Weapons.R_77__AA_12_Adder____Active_Rdr) + R_73__AA_11_Archer____Infra_Red = (9, Weapons.R_73__AA_11_Archer____Infra_Red) + Kh_31P = (9, Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr) + Kh_31A = (9, Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr) + Kh_29L = (9, Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser) + Kh_29T = (9, Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided) + Kh_59M = (9, Weapons.Kh_59M__AS_18_Kazoo____930kg__ASM__IN) RVV_BD = (9, Su57Weapons.RVV_BD) RVV_AE = (9, Su57Weapons.RVV_AE) RVV_M = (9, Su57Weapons.RVV_M) @@ -1667,7 +1652,7 @@ class Su_57(PlaneType): Kh_59MK2 = (9, Su57Weapons.Kh_59MK2) class Pylon10: - R_73 = (10, Weapons.R_73) + R_73__AA_11_Archer____Infra_Red = (10, Weapons.R_73__AA_11_Archer____Infra_Red) Smoke_Generator___red = (10, Weapons.Smoke_Generator___red) Smoke_Generator___green = (10, Weapons.Smoke_Generator___green) Smoke_Generator___blue = (10, Weapons.Smoke_Generator___blue) @@ -1676,35 +1661,28 @@ class Su_57(PlaneType): Smoke_Generator___orange = (10, Weapons.Smoke_Generator___orange) class Pylon11: - R_27R = (11, Weapons.R_27R) - R_27ER = (11, Weapons.R_27ER) - R_27T = (11, Weapons.R_27T) - R_27ET = (11, Weapons.R_27ET) - R_77 = (11, Weapons.R_77) - R_73 = (11, Weapons.R_73) - Kh_31P = (11, Weapons.Kh_31P) - Kh_31A = (11, Weapons.Kh_31A) - Kh_29L = (11, Weapons.Kh_29L) - Kh_29T = (11, Weapons.Kh_29T) - Kh_59M = (11, Weapons.Kh_59M) - MER_6_FAB_100 = (11, Weapons.MER_6_FAB_100) - B_8M1___20_S_8KOM = (11, Weapons.B_8M1___20_S_8KOM) - B_13L___5_S_13_OF = (11, Weapons.B_13L___5_S_13_OF) - S_25_OFM = (11, Weapons.S_25_OFM) - BetAB_500 = (11, Weapons.BetAB_500) - KMGU_2___96_AO_2_5RT = (11, Weapons.KMGU_2___96_AO_2_5RT) - KMGU_2___96_PTAB_2_5KO = (11, Weapons.KMGU_2___96_PTAB_2_5KO) - FAB_250 = (11, Weapons.FAB_250) - RBK_250_PTAB_2_5M = (11, Weapons.RBK_250_PTAB_2_5M) - FAB_500_M62 = (11, Weapons.FAB_500_M62) - RBK_500_255_PTAB_10_5 = (11, Weapons.RBK_500_255_PTAB_10_5) - KAB_500L = (11, Weapons.KAB_500L) - KAB_500kr = (11, Weapons.KAB_500kr) - FAB_1500_M54 = (11, Weapons.FAB_1500_M54) - KAB_1500L = (11, Weapons.KAB_1500L) - MER_6_FAB_250 = (11, Weapons.MER_6_FAB_250) -#ERRR {R-33} - RVV_BD = (11,Su57Weapons.RVV_BD) + R_27R__AA_10_Alamo_A____Semi_Act_Rdr = ( + 11, + Weapons.R_27R__AA_10_Alamo_A____Semi_Act_Rdr, + ) + R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range = ( + 11, + Weapons.R_27ER__AA_10_Alamo_C____Semi_Act_Extended_Range, + ) + R_27T = (11, Weapons.R_27T__AA_10_Alamo_B____Infra_Red) + R_27ET__AA_10_Alamo_D____IR_Extended_Range = ( + 11, + Weapons.R_27ET__AA_10_Alamo_D____IR_Extended_Range, + ) + R_77__AA_12_Adder____Active_Rdr = (11, Weapons.R_77__AA_12_Adder____Active_Rdr) + R_73__AA_11_Archer____Infra_Red = (11, Weapons.R_73__AA_11_Archer____Infra_Red) + Kh_31P = (11, Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr) + Kh_31A = (11, Weapons.Kh_31P__AS_17_Krypton____600kg__ARM__IN__Pas_Rdr) + Kh_29L = (11, Weapons.Kh_29L__AS_14_Kedge____657kg__ASM__Semi_Act_Laser) + Kh_29T = (11, Weapons.Kh_29T__AS_14_Kedge____670kg__ASM__TV_Guided) + Kh_59M = (11, Weapons.Kh_59M__AS_18_Kazoo____930kg__ASM__IN) + # ERRR {R-33} + RVV_BD = (11, Su57Weapons.RVV_BD) RVV_AE = (11, Su57Weapons.RVV_AE) RVV_M = (11, Su57Weapons.RVV_M) RVV_L = (11, Su57Weapons.RVV_L) @@ -1720,7 +1698,7 @@ class Su_57(PlaneType): Kh_59MK2 = (11, Su57Weapons.Kh_59MK2) class Pylon12: - R_73 = (12, Weapons.R_73) + R_73__AA_11_Archer____Infra_Red = (12, Weapons.R_73__AA_11_Archer____Infra_Red) RVV_AE = (12, Su57Weapons.RVV_AE) RVV_M = (12, Su57Weapons.RVV_M) Smoke_Generator___red = (12, Weapons.Smoke_Generator___red) @@ -1732,5 +1710,15 @@ class Su_57(PlaneType): pylons = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12} - tasks = [task.CAP, task.Intercept, task.Escort, task.FighterSweep, task.AFAC, task.GroundAttack, task.RunwayAttack, task.AntishipStrike, task.CAS] + tasks = [ + task.CAP, + task.Intercept, + task.Escort, + task.FighterSweep, + task.AFAC, + task.GroundAttack, + task.RunwayAttack, + task.AntishipStrike, + task.CAS, + ] task_default = task.CAP diff --git a/qt_ui/uiconstants.py b/qt_ui/uiconstants.py index 7c7170fa..e34515e0 100644 --- a/qt_ui/uiconstants.py +++ b/qt_ui/uiconstants.py @@ -147,12 +147,16 @@ def load_icons(): "./resources/ui/ground_assets/" + category + "_blue.png" ) ICONS["destroyed"] = QPixmap("./resources/ui/ground_assets/destroyed.png") + ICONS["EWR"] = QPixmap("./resources/ui/ground_assets/ewr.png") + ICONS["EWR_blue"] = QPixmap("./resources/ui/ground_assets/ewr_blue.png") ICONS["ship"] = QPixmap("./resources/ui/ground_assets/ship.png") ICONS["ship_blue"] = QPixmap("./resources/ui/ground_assets/ship_blue.png") ICONS["missile"] = QPixmap("./resources/ui/ground_assets/missile.png") ICONS["missile_blue"] = QPixmap("./resources/ui/ground_assets/missile_blue.png") ICONS["nothreat"] = QPixmap("./resources/ui/ground_assets/nothreat.png") ICONS["nothreat_blue"] = QPixmap("./resources/ui/ground_assets/nothreat_blue.png") + ICONS["coastal"] = QPixmap("./resources/ui/ground_assets/coastal.png") + ICONS["coastal_blue"] = QPixmap("./resources/ui/ground_assets/coastal_blue.png") ICONS["Generator"] = QPixmap( "./resources/ui/misc/" + get_theme_icons() + "/generator.png" diff --git a/qt_ui/widgets/QConditionsWidget.py b/qt_ui/widgets/QConditionsWidget.py index 661905f4..23abedb0 100644 --- a/qt_ui/widgets/QConditionsWidget.py +++ b/qt_ui/widgets/QConditionsWidget.py @@ -7,7 +7,7 @@ from PySide2.QtWidgets import ( QLabel, QVBoxLayout, ) -from dcs.weather import Weather as PydcsWeather +from dcs.weather import CloudPreset, Weather as PydcsWeather import qt_ui.uiconstants as CONST from game.utils import mps @@ -162,7 +162,7 @@ class QWeatherWidget(QGroupBox): self.turn = turn self.conditions = conditions - self.updateForecast() + self.update_forecast() self.updateWinds() def updateWinds(self): @@ -186,55 +186,76 @@ class QWeatherWidget(QGroupBox): self.windFL26SpeedLabel.setText(f"{int(windFL26Speed.knots)}kts") self.windFL26DirLabel.setText(f"{windFL26Dir}º") - def updateForecast(self): + def update_forecast_from_preset(self, preset: CloudPreset) -> None: + self.forecastFog.setText("No fog") + if "Rain" in preset.name: + self.forecastRain.setText("Rain") + self.update_forecast_icons("rain") + else: + self.forecastRain.setText("No rain") + self.update_forecast_icons("partly-cloudy") + + # We get a description like the following for the cloud preset. + # + # 09 ##Two Layer Broken/Scattered \nMETAR:BKN 7.5/10 SCT 20/22 FEW41 + # + # The second line is probably interesting but doesn't fit into the widget + # currently, so for now just extract the first line. + self.forecastClouds.setText(preset.description.splitlines()[0].split("##")[1]) + + def update_forecast(self): """Updates the Forecast Text and icon with the current conditions wind info.""" - icon = [] + if ( + self.conditions.weather.clouds + and self.conditions.weather.clouds.preset is not None + ): + self.update_forecast_from_preset(self.conditions.weather.clouds.preset) + return + if self.conditions.weather.clouds is None: - cloudDensity = 0 + cloud_density = 0 precipitation = None else: - cloudDensity = self.conditions.weather.clouds.density + cloud_density = self.conditions.weather.clouds.density precipitation = self.conditions.weather.clouds.precipitation - fog = self.conditions.weather.fog or None - is_night = self.conditions.time_of_day == TimeOfDay.Night - time = "night" if is_night else "day" - - if cloudDensity <= 0: + if not cloud_density: self.forecastClouds.setText("Sunny") - icon = [time, "clear"] - - if cloudDensity > 0 and cloudDensity < 3: + weather_type = "clear" + elif cloud_density < 3: self.forecastClouds.setText("Partly Cloudy") - icon = [time, "partly-cloudy"] - - if cloudDensity >= 3 and cloudDensity < 5: + weather_type = "partly-cloudy" + elif cloud_density < 5: self.forecastClouds.setText("Mostly Cloudy") - icon = [time, "partly-cloudy"] - - if cloudDensity >= 5: + weather_type = "partly-cloudy" + else: self.forecastClouds.setText("Totally Cloudy") - icon = [time, "partly-cloudy"] + weather_type = "partly-cloudy" if precipitation == PydcsWeather.Preceptions.Rain: self.forecastRain.setText("Rain") - icon = [time, "rain"] - + weather_type = "rain" elif precipitation == PydcsWeather.Preceptions.Thunderstorm: self.forecastRain.setText("Thunderstorm") - icon = [time, "thunderstorm"] - + weather_type = "thunderstorm" else: - self.forecastRain.setText("No Rain") + self.forecastRain.setText("No rain") - if not fog: + if not self.conditions.weather.fog is not None: self.forecastFog.setText("No fog") else: - visibility = round(fog.visibility.nautical_miles, 1) + visibility = round(self.conditions.weather.fog.visibility.nautical_miles, 1) self.forecastFog.setText(f"Fog vis: {visibility}nm") - icon = [time, ("cloudy" if cloudDensity > 1 else None), "fog"] + if cloud_density > 1: + weather_type = "cloudy-fog" + else: + weather_type = "fog" - icon_key = "Weather_{}".format("-".join(filter(None.__ne__, icon))) + self.update_forecast_icons(weather_type) + + def update_forecast_icons(self, weather_type: str) -> None: + time = "night" if self.conditions.time_of_day == TimeOfDay.Night else "day" + icon_key = f"Weather_{time}-{weather_type}" icon = CONST.ICONS.get(icon_key) or CONST.ICONS["Weather_night-partly-cloudy"] self.weather_icon.setPixmap(icon) diff --git a/qt_ui/widgets/combos/QAircraftTypeSelector.py b/qt_ui/widgets/combos/QAircraftTypeSelector.py index 5946fdcb..5afa3761 100644 --- a/qt_ui/widgets/combos/QAircraftTypeSelector.py +++ b/qt_ui/widgets/combos/QAircraftTypeSelector.py @@ -90,6 +90,12 @@ class QAircraftTypeSelector(QComboBox): f"{db.unit_get_expanded_info(self.country, aircraft, 'name')}", userData=aircraft, ) + elif mission_type in [FlightType.AEWC]: + if aircraft in gen.flights.ai_flight_planner_db.AEWC_CAPABLE: + self.addItem( + f"{db.unit_get_expanded_info(self.country, aircraft, 'name')}", + userData=aircraft, + ) current_aircraft_index = self.findData(current_aircraft) if current_aircraft_index != -1: self.setCurrentIndex(current_aircraft_index) diff --git a/qt_ui/widgets/map/QLiberationMap.py b/qt_ui/widgets/map/QLiberationMap.py index 2be5e520..d8b5f206 100644 --- a/qt_ui/widgets/map/QLiberationMap.py +++ b/qt_ui/widgets/map/QLiberationMap.py @@ -495,6 +495,7 @@ class QLiberationMap(QGraphicsView): package = Package(target) flight = Flight( package, + self.game.player_country if player else self.game.enemy_country, F_16C_50, 2, task, @@ -914,35 +915,48 @@ class QLiberationMap(QGraphicsView): SMALL_LINE = 2 dist = self.distance_to_pixels(nautical_miles(scale_distance_nm)) - self.scene().addRect( - POS_X, - POS_Y - PADDING, - PADDING * 2 + dist, - BIG_LINE * 2 + 3 * PADDING, - pen=CONST.COLORS["black"], - brush=CONST.COLORS["black"], - ) l = self.scene().addLine( POS_X + PADDING, POS_Y + BIG_LINE * 2, POS_X + PADDING + dist, POS_Y + BIG_LINE * 2, ) + l.setPen(CONST.COLORS["black"]) + + lw = self.scene().addLine( + POS_X + PADDING + 1, + POS_Y + BIG_LINE * 2 + 1, + POS_X + PADDING + dist + 1, + POS_Y + BIG_LINE * 2 + 1, + ) + lw.setPen(CONST.COLORS["white"]) text = self.scene().addText( "0nm", font=QFont("Trebuchet MS", 6, weight=5, italic=False) ) text.setPos(POS_X, POS_Y + BIG_LINE * 2) - text.setDefaultTextColor(Qt.white) + text.setDefaultTextColor(Qt.black) + + text_white = self.scene().addText( + "0nm", font=QFont("Trebuchet MS", 6, weight=5, italic=False) + ) + text_white.setPos(POS_X + 1, POS_Y + BIG_LINE * 2) + text_white.setDefaultTextColor(Qt.white) text2 = self.scene().addText( str(scale_distance_nm) + "nm", font=QFont("Trebuchet MS", 6, weight=5, italic=False), ) text2.setPos(POS_X + dist, POS_Y + BIG_LINE * 2) - text2.setDefaultTextColor(Qt.white) + text2.setDefaultTextColor(Qt.black) + + text2_white = self.scene().addText( + str(scale_distance_nm) + "nm", + font=QFont("Trebuchet MS", 6, weight=5, italic=False), + ) + text2_white.setPos(POS_X + dist + 1, POS_Y + BIG_LINE * 2) + text2_white.setDefaultTextColor(Qt.white) - l.setPen(CONST.COLORS["white"]) for i in range(number_of_points + 1): d = float(i) / float(number_of_points) if i == 0 or i == number_of_points: @@ -956,7 +970,15 @@ class QLiberationMap(QGraphicsView): POS_X + PADDING + d * dist, POS_Y + BIG_LINE - h, ) - l.setPen(CONST.COLORS["white"]) + l.setPen(CONST.COLORS["black"]) + + lw = self.scene().addLine( + POS_X + PADDING + d * dist + 1, + POS_Y + BIG_LINE * 2, + POS_X + PADDING + d * dist + 1, + POS_Y + BIG_LINE - h, + ) + lw.setPen(CONST.COLORS["white"]) def wheelEvent(self, event: QWheelEvent): if event.angleDelta().y() > 0: diff --git a/qt_ui/widgets/map/QMapGroundObject.py b/qt_ui/widgets/map/QMapGroundObject.py index 4d8b5a3a..10c52d09 100644 --- a/qt_ui/widgets/map/QMapGroundObject.py +++ b/qt_ui/widgets/map/QMapGroundObject.py @@ -9,7 +9,10 @@ from game import Game from game.data.building_data import FORTIFICATION_BUILDINGS from game.db import REWARDS from game.theater import ControlPoint, TheaterGroundObject -from game.theater.theatergroundobject import MissileSiteGroundObject +from game.theater.theatergroundobject import ( + MissileSiteGroundObject, + CoastalSiteGroundObject, +) from qt_ui.windows.groundobject.QGroundObjectMenu import QGroundObjectMenu from .QMapObject import QMapObject from ...displayoptions import DisplayOptions @@ -85,6 +88,8 @@ class QMapGroundObject(QMapObject): cat = "ship" if isinstance(self.ground_object, MissileSiteGroundObject): cat = "missile" + if isinstance(self.ground_object, CoastalSiteGroundObject): + cat = "coastal" rect = QRect( option.rect.x() + 2, diff --git a/qt_ui/windows/QUnitInfoWindow.py b/qt_ui/windows/QUnitInfoWindow.py index 541f208b..cd87a07f 100644 --- a/qt_ui/windows/QUnitInfoWindow.py +++ b/qt_ui/windows/QUnitInfoWindow.py @@ -48,6 +48,9 @@ class QUnitInfoWindow(QDialog): header = QLabel(self) header.setGeometry(0, 0, 720, 360) + + pixmap = None + if ( dcs.planes.plane_map.get(self.unit_type.id) is not None or dcs.helicopters.helicopter_map.get(self.unit_type.id) is not None diff --git a/qt_ui/windows/basemenu/QBaseMenu2.py b/qt_ui/windows/basemenu/QBaseMenu2.py index 65b49710..a4793b97 100644 --- a/qt_ui/windows/basemenu/QBaseMenu2.py +++ b/qt_ui/windows/basemenu/QBaseMenu2.py @@ -172,6 +172,8 @@ class QBaseMenu2(QDialog): return "./resources/ui/carrier.png" elif self.cp.cptype == ControlPointType.LHA_GROUP: return "./resources/ui/lha.png" + elif self.cp.cptype == ControlPointType.FOB: + return "./resources/ui/fob.png" else: return "./resources/ui/airbase.png" diff --git a/qt_ui/windows/basemenu/QBaseMenuTabs.py b/qt_ui/windows/basemenu/QBaseMenuTabs.py index b33cc733..c6c35603 100644 --- a/qt_ui/windows/basemenu/QBaseMenuTabs.py +++ b/qt_ui/windows/basemenu/QBaseMenuTabs.py @@ -1,6 +1,6 @@ from PySide2.QtWidgets import QTabWidget -from game.theater import ControlPoint, OffMapSpawn +from game.theater import ControlPoint, OffMapSpawn, Fob from qt_ui.models import GameModel from qt_ui.windows.basemenu.airfield.QAirfieldCommand import QAirfieldCommand from qt_ui.windows.basemenu.base_defenses.QBaseDefensesHQ import QBaseDefensesHQ @@ -19,14 +19,26 @@ class QBaseMenuTabs(QTabWidget): self.intel = QIntelInfo(cp, game_model.game) self.addTab(self.intel, "Intel") else: - self.airfield_command = QAirfieldCommand(cp, game_model) - self.addTab(self.airfield_command, "Airfield Command") - if cp.is_carrier: - self.base_defenses_hq = QBaseDefensesHQ(cp, game_model.game) - self.addTab(self.base_defenses_hq, "Fleet") - elif not isinstance(cp, OffMapSpawn): - self.ground_forces_hq = QGroundForcesHQ(cp, game_model) - self.addTab(self.ground_forces_hq, "Ground Forces HQ") - self.base_defenses_hq = QBaseDefensesHQ(cp, game_model.game) - self.addTab(self.base_defenses_hq, "Base Defenses") + if cp: + if isinstance(cp, Fob): + self.ground_forces_hq = QGroundForcesHQ(cp, game_model) + self.addTab(self.ground_forces_hq, "Ground Forces HQ") + if cp.helipads: + self.airfield_command = QAirfieldCommand(cp, game_model) + self.addTab(self.airfield_command, "Heliport") + self.base_defenses_hq = QBaseDefensesHQ(cp, game_model.game) + self.addTab(self.base_defenses_hq, "Base Defenses") + else: + + self.airfield_command = QAirfieldCommand(cp, game_model) + self.addTab(self.airfield_command, "Airfield Command") + + if cp.is_carrier: + self.base_defenses_hq = QBaseDefensesHQ(cp, game_model.game) + self.addTab(self.base_defenses_hq, "Fleet") + elif not isinstance(cp, OffMapSpawn): + self.ground_forces_hq = QGroundForcesHQ(cp, game_model) + self.addTab(self.ground_forces_hq, "Ground Forces HQ") + self.base_defenses_hq = QBaseDefensesHQ(cp, game_model.game) + self.addTab(self.base_defenses_hq, "Base Defenses") diff --git a/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py b/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py index a9551694..53f6cf69 100644 --- a/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py +++ b/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py @@ -12,11 +12,12 @@ from PySide2.QtWidgets import ( QVBoxLayout, QWidget, ) -from dcs.task import CAP, CAS +from dcs.helicopters import helicopter_map +from dcs.task import CAP, CAS, AWACS from dcs.unittype import FlyingType, UnitType from game import db -from game.theater import ControlPoint +from game.theater import ControlPoint, ControlPointType from qt_ui.models import GameModel from qt_ui.uiconstants import ICONS from qt_ui.windows.basemenu.QRecruitBehaviour import QRecruitBehaviour @@ -45,7 +46,7 @@ class QAircraftRecruitmentMenu(QFrame, QRecruitBehaviour): def init_ui(self): main_layout = QVBoxLayout() - tasks = [CAP, CAS] + tasks = [CAP, CAS, AWACS] scroll_content = QWidget() task_box_layout = QGridLayout() @@ -63,6 +64,11 @@ class QAircraftRecruitmentMenu(QFrame, QRecruitBehaviour): continue if self.cp.is_lha and unit not in db.LHA_CAPABLE: continue + if ( + self.cp.cptype in [ControlPointType.FOB, ControlPointType.FARP] + and unit not in helicopter_map.values() + ): + continue unit_types.add(unit) sorted_units = sorted( diff --git a/qt_ui/windows/mission/flight/payload/QLoadoutEditor.py b/qt_ui/windows/mission/flight/payload/QLoadoutEditor.py index 4d675e42..9d70e82a 100644 --- a/qt_ui/windows/mission/flight/payload/QLoadoutEditor.py +++ b/qt_ui/windows/mission/flight/payload/QLoadoutEditor.py @@ -43,4 +43,4 @@ class QLoadoutEditor(QGroupBox): self.flight.use_custom_loadout = self.isChecked() if not self.isChecked(): for i in self.findChildren(QPylonEditor): - i.default_loadout(i.pylon.number) + i.default_loadout() diff --git a/qt_ui/windows/mission/flight/payload/QPylonEditor.py b/qt_ui/windows/mission/flight/payload/QPylonEditor.py index eb0314cb..8591b7d6 100644 --- a/qt_ui/windows/mission/flight/payload/QPylonEditor.py +++ b/qt_ui/windows/mission/flight/payload/QPylonEditor.py @@ -81,6 +81,10 @@ class QPylonEditor(QComboBox): ) ) else: - self.setCurrentText( - weapons_data.weapon_ids.get(pylon_default_weapon).get("name") - ) + weapon = weapons_data.weapon_ids.get(pylon_default_weapon) + if weapon is not None: + self.setCurrentText( + weapons_data.weapon_ids.get(pylon_default_weapon).get("name") + ) + else: + self.setCurrentText(pylon_default_weapon) diff --git a/qt_ui/windows/newgame/QNewGameWizard.py b/qt_ui/windows/newgame/QNewGameWizard.py index 4b990b26..0ff28d59 100644 --- a/qt_ui/windows/newgame/QNewGameWizard.py +++ b/qt_ui/windows/newgame/QNewGameWizard.py @@ -483,11 +483,11 @@ class DifficultyAndAutomationOptions(QtWidgets.QWizardPage): economy_layout = QtWidgets.QVBoxLayout() economy_group.setLayout(economy_layout) - player_income = TenthsSpinSlider("Player income multiplier", 1, 50, 10) + player_income = TenthsSpinSlider("Player income multiplier", 0, 50, 10) self.registerField("player_income_multiplier", player_income.spinner) economy_layout.addLayout(player_income) - enemy_income = TenthsSpinSlider("Enemy income multiplier", 1, 50, 10) + enemy_income = TenthsSpinSlider("Enemy income multiplier", 0, 50, 10) self.registerField("enemy_income_multiplier", enemy_income.spinner) economy_layout.addLayout(enemy_income) diff --git a/qt_ui/windows/settings/QSettingsWindow.py b/qt_ui/windows/settings/QSettingsWindow.py index 10e9dec5..7432c341 100644 --- a/qt_ui/windows/settings/QSettingsWindow.py +++ b/qt_ui/windows/settings/QSettingsWindow.py @@ -213,14 +213,14 @@ class QSettingsWindow(QDialog): self.player_income = TenthsSpinSlider( "Player income multiplier", - 1, + 0, 50, int(self.game.settings.player_income_multiplier * 10), ) self.player_income.spinner.valueChanged.connect(self.applySettings) self.enemy_income = TenthsSpinSlider( "Enemy income multiplier", - 1, + 0, 50, int(self.game.settings.enemy_income_multiplier * 10), ) @@ -347,6 +347,26 @@ class QSettingsWindow(QDialog): general_layout.addWidget(restrict_weapons_label, 0, 0) general_layout.addWidget(restrict_weapons, 0, 1, Qt.AlignRight) + def set_old_awec(value: bool) -> None: + self.game.settings.disable_legacy_aewc = value + + old_awac = QCheckBox() + old_awac.setChecked(self.game.settings.disable_legacy_aewc) + old_awac.toggled.connect(set_old_awec) + + old_awec_info = ( + "If checked, the invulnerable friendly AEW&C aircraft that begins " + "the mission in the air will not be spawned. AEW&C missions must " + "be planned in the ATO and will take time to arrive on-station." + ) + + old_awac.setToolTip(old_awec_info) + old_awac_label = QLabel("Disable invulnerable, always-available AEW&C (WIP)") + old_awac_label.setToolTip(old_awec_info) + + general_layout.addWidget(old_awac_label, 1, 0) + general_layout.addWidget(old_awac, 1, 1, Qt.AlignRight) + automation = QGroupBox("HQ Automation") campaign_layout.addWidget(automation) @@ -402,6 +422,12 @@ class QSettingsWindow(QDialog): self.generate_marks.setChecked(self.game.settings.generate_marks) self.generate_marks.toggled.connect(self.applySettings) + self.generate_dark_kneeboard = QCheckBox() + self.generate_dark_kneeboard.setChecked( + self.game.settings.generate_dark_kneeboard + ) + self.generate_dark_kneeboard.toggled.connect(self.applySettings) + self.never_delay_players = QCheckBox() self.never_delay_players.setChecked( self.game.settings.never_delay_player_flights @@ -416,19 +442,40 @@ class QSettingsWindow(QDialog): self.gameplayLayout.addWidget(self.supercarrier, 0, 1, Qt.AlignRight) self.gameplayLayout.addWidget(QLabel("Put Objective Markers on Map"), 1, 0) self.gameplayLayout.addWidget(self.generate_marks, 1, 1, Qt.AlignRight) - self.gameplayLayout.addWidget(QLabel("Never delay player flights"), 2, 0) - self.gameplayLayout.addWidget(self.never_delay_players, 2, 1, Qt.AlignRight) + + dark_kneeboard_label = QLabel( + "Generate Dark Kneeboard
" + "Dark kneeboard for night missions.
" + "This will likely make the kneeboard on the pilot leg unreadable.
" + ) + self.gameplayLayout.addWidget(dark_kneeboard_label, 2, 0) + self.gameplayLayout.addWidget(self.generate_dark_kneeboard, 2, 1, Qt.AlignRight) + + spawn_players_immediately_tooltip = ( + "Always spawns player aircraft immediately, even if their start time is " + "more than 10 minutes after the start of the mission. This does " + "not alter the timing of your mission. Your TOT will not change. This " + "option only allows the player to wait on the ground." + ) + spawn_immediately_label = QLabel( + "Player flights ignore TOT and spawn immediately
" + "Does not adjust package waypoint times.
" + "Should not be used if players have runway or in-air starts.
" + ) + spawn_immediately_label.setToolTip(spawn_players_immediately_tooltip) + self.gameplayLayout.addWidget(spawn_immediately_label, 3, 0) + self.gameplayLayout.addWidget(self.never_delay_players, 3, 1, Qt.AlignRight) start_type_label = QLabel( - "Default start type for AI aircraft:
Warning: " - + "Any option other than Cold breaks OCA/Aircraft missions." + "Default start type for AI aircraft
Warning: " + "Any option other than Cold breaks OCA/Aircraft missions." ) start_type_label.setToolTip(START_TYPE_TOOLTIP) start_type = StartTypeComboBox(self.game.settings) start_type.setCurrentText(self.game.settings.default_start_type) - self.gameplayLayout.addWidget(start_type_label, 3, 0) - self.gameplayLayout.addWidget(start_type, 3, 1) + self.gameplayLayout.addWidget(start_type_label, 4, 0) + self.gameplayLayout.addWidget(start_type, 4, 1) self.performance = QGroupBox("Performance") self.performanceLayout = QGridLayout() @@ -596,6 +643,10 @@ class QSettingsWindow(QDialog): self.game.settings.supercarrier = self.supercarrier.isChecked() + self.game.settings.generate_dark_kneeboard = ( + self.generate_dark_kneeboard.isChecked() + ) + self.game.settings.perf_red_alert_state = self.red_alert.isChecked() self.game.settings.perf_smoke_gen = self.smoke.isChecked() self.game.settings.perf_artillery = self.arti.isChecked() diff --git a/requirements.txt b/requirements.txt index 702ac87f..de19d500 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,10 +1,31 @@ -Pyside2>=5.15.2 -pyinstaller==3.6 - -Pillow~=7.2.0 -tabulate~=0.8.7 - +altgraph==0.17 +appdirs==1.4.4 +black==20.8b1 +cfgv==3.2.0 +click==7.1.2 +distlib==0.3.1 +filelock==3.0.12 +future==0.18.2 +identify==1.5.13 +Jinja2==2.11.3 +MarkupSafe==1.1.1 mypy==0.782 mypy-extensions==0.4.3 -jinja2>=2.11.2 -shapely==1.7.1 +nodeenv==1.5.0 +pathspec==0.8.1 +pefile==2019.4.18 +Pillow==8.1.1 +pre-commit==2.10.1 +PyInstaller==3.6 +PySide2==5.15.2 +pywin32-ctypes==0.2.0 +PyYAML==5.4.1 +regex==2020.11.13 +Shapely==1.7.1 +shiboken2==5.15.2 +six==1.15.0 +tabulate==0.8.7 +toml==0.10.2 +typed-ast==1.4.2 +typing-extensions==3.7.4.3 +virtualenv==20.4.2 \ No newline at end of file diff --git a/resources/briefing/templates/briefingtemplate_CN.j2 b/resources/briefing/templates/briefingtemplate_CN.j2 index 505d7122..5b4e38cc 100644 --- a/resources/briefing/templates/briefingtemplate_CN.j2 +++ b/resources/briefing/templates/briefingtemplate_CN.j2 @@ -73,6 +73,7 @@ DCS Liberation 第 {{ game.turn }} 回合 --------------------------------------------------{% endfor %} +{%- if allied_flights_by_departure|length > 0 %} 其他友军单位飞行计划: ==================== {% for dep in allied_flights_by_departure %} @@ -82,7 +83,9 @@ DCS Liberation 第 {{ game.turn }} 回合 {{ flight.flight_type }} {{ flight.units[0].type }} x {{flight.size}}, departing in {{ flight.departure_delay }}, {{ flight.package.target.name}} {% endfor %} {% endfor %} +{% endif %} +{%- if dynamic_runways|length > 0 %} 航母及FARPs: ==================== {% for runway in dynamic_runways %} @@ -94,12 +97,17 @@ TACAN : {{ runway.tacan }} {{ runway.tacan_callsign }} {% endif %} {% endfor %} +{% endif %} +{%- if awacs|length > 0 %} AWACS: ==================== {% for i in awacs %}{{ i.callsign }} -- 频率 : {{i.freq.mhz}} {% endfor %} +{% endif %} +{%- if jtacs|length > 0 %} JTACS [F-10 菜单] : ==================== {% for jtac in jtacs %}前线 {{ jtac.region }} -- 激光编码 : {{ jtac.code }} {% endfor %} +{% endif %} diff --git a/resources/briefing/templates/briefingtemplate_EN.j2 b/resources/briefing/templates/briefingtemplate_EN.j2 index 7ec4341d..ce5b7220 100644 --- a/resources/briefing/templates/briefingtemplate_EN.j2 +++ b/resources/briefing/templates/briefingtemplate_EN.j2 @@ -73,6 +73,7 @@ Your flights: --------------------------------------------------{% endfor %} +{%- if allied_flights_by_departure|length > 0 %} Planned ally flights: ==================== {% for dep in allied_flights_by_departure %} @@ -82,7 +83,9 @@ Planned ally flights: {{ flight.flight_type }} {{ flight.units[0].type }} x {{flight.size}}, departing in {{ flight.departure_delay }}, {{ flight.package.target.name}} {% endfor %} {% endfor %} +{% endif %} +{%- if dynamic_runways|length > 0 %} Carriers and FARPs: ==================== {% for runway in dynamic_runways %} @@ -94,12 +97,17 @@ TACAN : {{ runway.tacan }} {{ runway.tacan_callsign }} {% endif %} {% endfor %} +{% endif %} +{%- if awacs|length > 0 %} AWACS: ==================== {% for i in awacs %}{{ i.callsign }} -- Freq : {{i.freq.mhz}} {% endfor %} +{% endif %} +{%- if jtacs|length > 0 %} JTACS [F-10 Menu] : ==================== {% for jtac in jtacs %}Frontline {{ jtac.region }} -- Code : {{ jtac.code }} -{% endfor %} \ No newline at end of file +{% endfor %} +{% endif %} \ No newline at end of file diff --git a/resources/briefing/templates/briefingtemplate_FR.j2 b/resources/briefing/templates/briefingtemplate_FR.j2 index 993d417c..61cf6b2e 100644 --- a/resources/briefing/templates/briefingtemplate_FR.j2 +++ b/resources/briefing/templates/briefingtemplate_FR.j2 @@ -73,6 +73,7 @@ Vols : --------------------------------------------------{% endfor %} +{%- if allied_flights_by_departure|length > 0 %} Vols alliés prévus : ==================== {% for dep in allied_flights_by_departure %} @@ -82,7 +83,9 @@ Vols alliés prévus : {{ flight.flight_type }} {{ flight.units[0].type }} x {{flight.size}}, départ dans {{ flight.departure_delay }}, {{ flight.package.target.name}} {% endfor %} {% endfor %} +{% endif %} +{%- if dynamic_runways|length > 0 %} Porte-avions et FARPS : ======================= {% for runway in dynamic_runways %} @@ -92,14 +95,19 @@ RADIO : {{ runway.atc }} TACAN : {{ runway.tacan }} {{ runway.tacan_callsign }} {% if runway.icls %}Channel ICLS : {{ runway.icls }} {% endif %} +{% endif %} {% endfor %} +{%- if awacs|length > 0 %} AWACS: ==================== {% for i in awacs %}{{ i.callsign }} -- Fréq : {{i.freq.mhz}} {% endfor %} +{% endif %} +{%- if jtacs|length > 0 %} JTACS [Menu F-10] : ==================== {% for jtac in jtacs %}Ligne de front {{ jtac.region }} -- Code : {{ jtac.code }} -{% endfor %} \ No newline at end of file +{% endfor %} +{% endif %} \ No newline at end of file diff --git a/resources/campaigns/black_sea.miz b/resources/campaigns/black_sea.miz index 287ea1cb..c77e79ad 100644 Binary files a/resources/campaigns/black_sea.miz and b/resources/campaigns/black_sea.miz differ diff --git a/resources/campaigns/black_sea_lite.miz b/resources/campaigns/black_sea_lite.miz index 4c6297ab..71a6a285 100644 Binary files a/resources/campaigns/black_sea_lite.miz and b/resources/campaigns/black_sea_lite.miz differ diff --git a/resources/campaigns/desert_war.miz b/resources/campaigns/desert_war.miz index a1044bac..fedbf10a 100644 Binary files a/resources/campaigns/desert_war.miz and b/resources/campaigns/desert_war.miz differ diff --git a/resources/campaigns/emirates.miz b/resources/campaigns/emirates.miz index 949e6575..2dba325a 100644 Binary files a/resources/campaigns/emirates.miz and b/resources/campaigns/emirates.miz differ diff --git a/resources/campaigns/golan_heights_lite.miz b/resources/campaigns/golan_heights_lite.miz index 03f20d87..b7ca6ab4 100644 Binary files a/resources/campaigns/golan_heights_lite.miz and b/resources/campaigns/golan_heights_lite.miz differ diff --git a/resources/campaigns/invasion_of_iran.miz b/resources/campaigns/invasion_of_iran.miz index ac7ed7f6..ea4a51b4 100644 Binary files a/resources/campaigns/invasion_of_iran.miz and b/resources/campaigns/invasion_of_iran.miz differ diff --git a/resources/campaigns/invasion_of_iran_lite.miz b/resources/campaigns/invasion_of_iran_lite.miz index 5c0b2aad..7791cc97 100644 Binary files a/resources/campaigns/invasion_of_iran_lite.miz and b/resources/campaigns/invasion_of_iran_lite.miz differ diff --git a/resources/customized_payloads/F-86F Sabre.lua b/resources/customized_payloads/F-86F Sabre.lua new file mode 100644 index 00000000..db63458c --- /dev/null +++ b/resources/customized_payloads/F-86F Sabre.lua @@ -0,0 +1,248 @@ +local unitPayloads = { + ["name"] = "F-86F Sabre", + ["payloads"] = { + [1] = { + ["name"] = "CAS", + ["pylons"] = { + [1] = { + ["CLSID"] = "{HVARx2}", + ["num"] = 7, + }, + [2] = { + ["CLSID"] = "{HVARx2}", + ["num"] = 4, + }, + [3] = { + ["CLSID"] = "{PTB_200_F86F35}", + ["num"] = 1, + }, + [4] = { + ["CLSID"] = "{PTB_200_F86F35}", + ["num"] = 10, + }, + [5] = { + ["CLSID"] = "{HVARx2}", + ["num"] = 3, + }, + [6] = { + ["CLSID"] = "{HVARx2}", + ["num"] = 8, + }, + }, + ["tasks"] = { + }, + }, + [2] = { + ["name"] = "CAP", + ["pylons"] = { + [1] = { + ["CLSID"] = "{GAR-8}", + ["num"] = 6, + }, + [2] = { + ["CLSID"] = "{GAR-8}", + ["num"] = 5, + }, + [3] = { + ["CLSID"] = "{PTB_120_F86F35}", + ["num"] = 7, + }, + [4] = { + ["CLSID"] = "{PTB_120_F86F35}", + ["num"] = 4, + }, + }, + ["tasks"] = { + }, + }, + [3] = { + ["name"] = "SEAD", + ["pylons"] = { + [1] = { + ["CLSID"] = "{PTB_200_F86F35}", + ["num"] = 10, + }, + [2] = { + ["CLSID"] = "{PTB_200_F86F35}", + ["num"] = 1, + }, + [3] = { + ["CLSID"] = "{HVARx2}", + ["num"] = 4, + }, + [4] = { + ["CLSID"] = "{HVARx2}", + ["num"] = 3, + }, + [5] = { + ["CLSID"] = "{HVARx2}", + ["num"] = 7, + }, + [6] = { + ["CLSID"] = "{HVARx2}", + ["num"] = 8, + }, + }, + ["tasks"] = { + }, + }, + [4] = { + ["name"] = "ANTISHIP", + ["pylons"] = { + [1] = { + ["CLSID"] = "{00F5DAC4-0466-4122-998F-B1A298E34113}", + ["num"] = 7, + }, + [2] = { + ["CLSID"] = "{00F5DAC4-0466-4122-998F-B1A298E34113}", + ["num"] = 4, + }, + [3] = { + ["CLSID"] = "{PTB_200_F86F35}", + ["num"] = 1, + }, + [4] = { + ["CLSID"] = "{PTB_200_F86F35}", + ["num"] = 10, + }, + }, + ["tasks"] = { + }, + }, + [5] = { + ["name"] = "STRIKE", + ["pylons"] = { + [1] = { + ["CLSID"] = "{PTB_200_F86F35}", + ["num"] = 10, + }, + [2] = { + ["CLSID"] = "{PTB_200_F86F35}", + ["num"] = 1, + }, + [3] = { + ["CLSID"] = "{00F5DAC4-0466-4122-998F-B1A298E34113}", + ["num"] = 7, + }, + [4] = { + ["CLSID"] = "{00F5DAC4-0466-4122-998F-B1A298E34113}", + ["num"] = 4, + }, + }, + ["tasks"] = { + }, + }, + [6] = { + ["name"] = "INTERCEPT", + ["pylons"] = { + [1] = { + ["CLSID"] = "{PTB_120_F86F35}", + ["num"] = 7, + }, + [2] = { + ["CLSID"] = "{PTB_120_F86F35}", + ["num"] = 4, + }, + [3] = { + ["CLSID"] = "{GAR-8}", + ["num"] = 6, + }, + [4] = { + ["CLSID"] = "{GAR-8}", + ["num"] = 5, + }, + }, + ["tasks"] = { + }, + }, + [7] = { + ["name"] = "RUNWAY_ATTACK", + ["pylons"] = { + [1] = { + ["CLSID"] = "{PTB_200_F86F35}", + ["num"] = 10, + }, + [2] = { + ["CLSID"] = "{PTB_200_F86F35}", + ["num"] = 1, + }, + [3] = { + ["CLSID"] = "{00F5DAC4-0466-4122-998F-B1A298E34113}", + ["num"] = 7, + }, + [4] = { + ["CLSID"] = "{00F5DAC4-0466-4122-998F-B1A298E34113}", + ["num"] = 4, + }, + }, + ["tasks"] = { + }, + }, + [8] = { + ["name"] = "BAI", + ["pylons"] = { + [1] = { + ["CLSID"] = "{PTB_200_F86F35}", + ["num"] = 10, + }, + [2] = { + ["CLSID"] = "{PTB_200_F86F35}", + ["num"] = 1, + }, + [3] = { + ["CLSID"] = "{HVARx2}", + ["num"] = 8, + }, + [4] = { + ["CLSID"] = "{HVARx2}", + ["num"] = 7, + }, + [5] = { + ["CLSID"] = "{HVARx2}", + ["num"] = 4, + }, + [6] = { + ["CLSID"] = "{HVARx2}", + ["num"] = 3, + }, + }, + ["tasks"] = { + }, + }, + [9] = { + ["name"] = "OCA", + ["pylons"] = { + [1] = { + ["CLSID"] = "{PTB_200_F86F35}", + ["num"] = 10, + }, + [2] = { + ["CLSID"] = "{PTB_200_F86F35}", + ["num"] = 1, + }, + [3] = { + ["CLSID"] = "{HVARx2}", + ["num"] = 8, + }, + [4] = { + ["CLSID"] = "{HVARx2}", + ["num"] = 7, + }, + [5] = { + ["CLSID"] = "{HVARx2}", + ["num"] = 4, + }, + [6] = { + ["CLSID"] = "{HVARx2}", + ["num"] = 3, + }, + }, + ["tasks"] = { + }, + }, + }, + ["tasks"] = { + }, + ["unitType"] = "F-86F Sabre", +} +return unitPayloads diff --git a/resources/customized_payloads/FA-18C_hornet.lua b/resources/customized_payloads/FA-18C_hornet.lua index 085c0fcb..f3020cef 100644 --- a/resources/customized_payloads/FA-18C_hornet.lua +++ b/resources/customized_payloads/FA-18C_hornet.lua @@ -17,26 +17,22 @@ local unitPayloads = { ["num"] = 6, }, [4] = { - ["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}", + ["CLSID"] = "{AN_ASQ_228}", ["num"] = 4, }, [5] = { - ["CLSID"] = "{A111396E-D3E8-4b9c-8AC9-2432489304D5}", - ["num"] = 5, - }, - [6] = { ["CLSID"] = "LAU_117_AGM_65F", ["num"] = 3, }, - [7] = { + [6] = { ["CLSID"] = "LAU_117_AGM_65F", ["num"] = 2, }, - [8] = { + [7] = { ["CLSID"] = "{5CE2FF2A-645A-4197-B48D-8720AC69394F}", ["num"] = 1, }, - [9] = { + [8] = { ["CLSID"] = "{5CE2FF2A-645A-4197-B48D-8720AC69394F}", ["num"] = 9, }, @@ -61,26 +57,22 @@ local unitPayloads = { ["num"] = 6, }, [4] = { - ["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}", + ["CLSID"] = "{AN_ASQ_228}", ["num"] = 4, }, [5] = { - ["CLSID"] = "{A111396E-D3E8-4b9c-8AC9-2432489304D5}", - ["num"] = 5, - }, - [6] = { ["CLSID"] = "{F16A4DE0-116C-4A71-97F0-2CF85B0313EC}", ["num"] = 3, }, - [7] = { + [6] = { ["CLSID"] = "{F16A4DE0-116C-4A71-97F0-2CF85B0313EC}", ["num"] = 2, }, - [8] = { + [7] = { ["CLSID"] = "{5CE2FF2A-645A-4197-B48D-8720AC69394F}", ["num"] = 1, }, - [9] = { + [8] = { ["CLSID"] = "{5CE2FF2A-645A-4197-B48D-8720AC69394F}", ["num"] = 9, }, @@ -137,38 +129,34 @@ local unitPayloads = { ["name"] = "STRIKE", ["pylons"] = { [1] = { - ["CLSID"] = "{BRU55_2*GBU-38}", - ["num"] = 7, - }, - [2] = { - ["CLSID"] = "{BRU33_2X_MK-83}", - ["num"] = 8, - }, - [3] = { - ["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}", - ["num"] = 6, - }, - [4] = { - ["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}", - ["num"] = 4, - }, - [5] = { - ["CLSID"] = "{FPU_8A_FUEL_TANK}", - ["num"] = 5, - }, - [6] = { - ["CLSID"] = "{BRU55_2*GBU-38}", - ["num"] = 3, - }, - [7] = { - ["CLSID"] = "{BRU33_2X_MK-83}", - ["num"] = 2, - }, - [8] = { ["CLSID"] = "{5CE2FF2A-645A-4197-B48D-8720AC69394F}", ["num"] = 1, }, - [9] = { + [2] = { + ["CLSID"] = "{GBU_31_V_2B}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{FPU_8A_FUEL_TANK}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{AN_ASQ_228}", + ["num"] = 4, + }, + [5] = { + ["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}", + ["num"] = 6, + }, + [6] = { + ["CLSID"] = "{FPU_8A_FUEL_TANK}", + ["num"] = 7, + }, + [7] = { + ["CLSID"] = "{GBU_31_V_2B}", + ["num"] = 8, + }, + [8] = { ["CLSID"] = "{5CE2FF2A-645A-4197-B48D-8720AC69394F}", ["num"] = 9, }, @@ -189,30 +177,26 @@ local unitPayloads = { ["num"] = 7, }, [3] = { - ["CLSID"] = "{A111396E-D3E8-4b9c-8AC9-2432489304D5}", - ["num"] = 5, - }, - [4] = { ["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}", ["num"] = 6, }, - [5] = { - ["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}", + [4] = { + ["CLSID"] = "{AN_ASQ_228}", ["num"] = 4, }, - [6] = { + [5] = { ["CLSID"] = "{5CE2FF2A-645A-4197-B48D-8720AC69394F}", ["num"] = 1, }, - [7] = { + [6] = { ["CLSID"] = "{5CE2FF2A-645A-4197-B48D-8720AC69394F}", ["num"] = 9, }, - [8] = { + [7] = { ["CLSID"] = "{AGM_84D}", ["num"] = 3, }, - [9] = { + [8] = { ["CLSID"] = "{AGM_84D}", ["num"] = 2, }, diff --git a/resources/factions/NATO_Desert_Storm.json b/resources/factions/NATO_Desert_Storm.json index d108f6d6..7b9743b9 100644 --- a/resources/factions/NATO_Desert_Storm.json +++ b/resources/factions/NATO_Desert_Storm.json @@ -36,30 +36,30 @@ ], "frontline_units": [ "MBT_M1A2_Abrams", - "ATGM_M1134_Stryker", + "ATGM_Stryker", "IFV_M2A2_Bradley", - "APC_M1126_Stryker_ICV", + "IFV_M1126_Stryker_ICV", "IFV_LAV_25", - "APC_M1043_HMMWV_Armament", - "ATGM_M1045_HMMWV_TOW", - "TPz_Fuchs", - "IFV_MCV_80", + "APC_HMMWV__Scout", + "ATGM_HMMWV", + "APC_TPz_Fuchs", + "IFV_Warrior", "MBT_Challenger_II", "MBT_M60A3_Patton", - "SPG_M1128_Stryker_MGS", - "SAM_Avenger_M1097" + "SPG_Stryker_MGS", + "SAM_Avenger__Stinger" ], "artillery_units": [ - "MLRS_M270", - "SPH_M109_Paladin" + "MLRS_M270_227mm", + "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "Stinger_MANPADS" + "Infantry_M249", + "MANPADS_Stinger" ], "air_defenses": [ "AvengerGenerator", @@ -80,10 +80,10 @@ "LHA_1_Tarawa" ], "destroyers": [ - "Oliver_Hazzard_Perry_class" + "FFG_Oliver_Hazzard_Perry" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "requirements": {}, "carrier_names": [ diff --git a/resources/factions/allies_1944.json b/resources/factions/allies_1944.json index abefb69e..c8cc8d30 100644 --- a/resources/factions/allies_1944.json +++ b/resources/factions/allies_1944.json @@ -17,23 +17,23 @@ "frontline_units": [ "MT_M4A4_Sherman_Firefly", "MT_M4_Sherman", - "APC_M2A1", + "APC_M2A1_Halftrack", "CT_Cromwell_IV", "CT_Centaur_IV", "HIT_Churchill_VII", - "LAC_M8_Greyhound", - "TD_M10_GMC", - "Daimler_Armoured_Car", + "Car_M8_Greyhound_Armored", + "SPG_M10_GMC", + "Car_Daimler_Armored", "LT_Mk_VII_Tetrarch", - "AA_gun_QF_3_7", - "AAA_Bofors_40mm" + "AAA_QF_3_7", + "AAA_40mm_Bofors" ], "artillery_units": [ - "M12_GMC" + "SPG_M12_GMC_155mm" ], "logistics_units": [ - "Bedford_MWD", - "CCKW_353" + "Truck_Bedford", + "Truck_GMC_Jimmy_6x6_Truck" ], "infantry_units": [ "Infantry_SMLE_No_4_Mk_1", diff --git a/resources/factions/allies_1944_free.json b/resources/factions/allies_1944_free.json index cbc68708..0fce2438 100644 --- a/resources/factions/allies_1944_free.json +++ b/resources/factions/allies_1944_free.json @@ -15,13 +15,13 @@ ], "frontline_units": [ "MT_M4_Sherman", - "APC_M2A1", - "AAA_Bofors_40mm" + "APC_M2A1_Halftrack", + "AAA_40mm_Bofors" ], "artillery_units": [ ], "logistics_units": [ - "Bedford_MWD" + "Truck_Bedford" ], "infantry_units": [ "Paratrooper_AKS" diff --git a/resources/factions/australia_2005.json b/resources/factions/australia_2005.json index 36968b09..00cec1de 100644 --- a/resources/factions/australia_2005.json +++ b/resources/factions/australia_2005.json @@ -21,17 +21,17 @@ "MBT_Leopard_1A3", "APC_M113", "IFV_LAV_25", - "IFV_MCV_80" + "IFV_Warrior" ], "artillery_units": [ ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "Stinger_MANPADS" + "Infantry_M249", + "MANPADS_Stinger" ], "air_defenses": [ "HawkGenerator", @@ -46,7 +46,7 @@ "LHA_1_Tarawa" ], "destroyers": [ - "USS_Arleigh_Burke_IIa" + "DDG_Arleigh_Burke_IIa" ], "cruisers": [ ], diff --git a/resources/factions/bluefor_coldwar.json b/resources/factions/bluefor_coldwar.json index fc3795d7..bf5322a8 100644 --- a/resources/factions/bluefor_coldwar.json +++ b/resources/factions/bluefor_coldwar.json @@ -17,7 +17,8 @@ ], "awacs": [ "C_130", - "E_3A" + "E_3A", + "E_2C" ], "tankers": [ "KC_135", @@ -29,14 +30,14 @@ "SAM_Chaparral_M48" ], "artillery_units": [ - "SPH_M109_Paladin" + "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Infantry_M249" ], "air_defenses": [ "ChaparralGenerator", @@ -54,10 +55,10 @@ "LHA_1_Tarawa" ], "destroyers": [ - "USS_Arleigh_Burke_IIa" + "DDG_Arleigh_Burke_IIa" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "requirements": {}, "carrier_names": [ diff --git a/resources/factions/bluefor_coldwar_a4.json b/resources/factions/bluefor_coldwar_a4.json index 85144509..407a0acf 100644 --- a/resources/factions/bluefor_coldwar_a4.json +++ b/resources/factions/bluefor_coldwar_a4.json @@ -18,7 +18,8 @@ ], "awacs": [ "C_130", - "E_3A" + "E_3A", + "E_2C" ], "tankers": [ "KC_135", @@ -30,14 +31,14 @@ "SAM_Chaparral_M48" ], "artillery_units": [ - "SPH_M109_Paladin" + "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Infantry_M249" ], "air_defenses": [ "ChaparralGenerator", @@ -55,10 +56,10 @@ "LHA_1_Tarawa" ], "destroyers": [ - "USS_Arleigh_Burke_IIa" + "DDG_Arleigh_Burke_IIa" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "requirements": { "Community A-4E": "https://heclak.github.io/community-a4e-c/" diff --git a/resources/factions/bluefor_coldwar_a4_mb339.json b/resources/factions/bluefor_coldwar_a4_mb339.json index 127c922d..1fdbdad8 100644 --- a/resources/factions/bluefor_coldwar_a4_mb339.json +++ b/resources/factions/bluefor_coldwar_a4_mb339.json @@ -19,7 +19,8 @@ ], "awacs": [ "C_130", - "E_3A" + "E_3A", + "E_2C" ], "tankers": [ "KC_135", @@ -31,14 +32,14 @@ "SAM_Chaparral_M48" ], "artillery_units": [ - "SPH_M109_Paladin" + "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Infantry_M249" ], "air_defenses": [ "ChaparralGenerator", @@ -56,10 +57,10 @@ "LHA_1_Tarawa" ], "destroyers": [ - "USS_Arleigh_Burke_IIa" + "DDG_Arleigh_Burke_IIa" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "requirements": { "MB-339A/PAN by Frecce Tricolori Virtuali": "http://www.freccetricolorivirtuali.net/", diff --git a/resources/factions/bluefor_modern.json b/resources/factions/bluefor_modern.json index 14590cc4..81e93e6e 100644 --- a/resources/factions/bluefor_modern.json +++ b/resources/factions/bluefor_modern.json @@ -28,7 +28,8 @@ "B_1B" ], "awacs": [ - "E_3A" + "E_3A", + "E_2C" ], "tankers": [ "KC_135", @@ -37,27 +38,27 @@ "frontline_units": [ "MBT_M1A2_Abrams", "MBT_Leopard_2", - "MBT_Merkava_Mk__4", - "ATGM_M1134_Stryker", + "MBT_Merkava_IV", + "ATGM_Stryker", "IFV_M2A2_Bradley", "IFV_Marder", "IFV_LAV_25", - "APC_M1043_HMMWV_Armament", - "ATGM_M1045_HMMWV_TOW", - "SAM_Linebacker_M6", - "SAM_Avenger_M1097" + "APC_HMMWV__Scout", + "ATGM_HMMWV", + "SAM_Linebacker___Bradley_M6", + "SAM_Avenger__Stinger" ], "artillery_units": [ - "MLRS_M270", - "SPH_M109_Paladin" + "MLRS_M270_227mm", + "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "Stinger_MANPADS" + "Infantry_M249", + "MANPADS_Stinger" ], "air_defenses": [ "AvengerGenerator", @@ -74,10 +75,10 @@ "LHA_1_Tarawa" ], "destroyers": [ - "USS_Arleigh_Burke_IIa" + "DDG_Arleigh_Burke_IIa" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "requirements": {}, "carrier_names": [ diff --git a/resources/factions/canada_2005.json b/resources/factions/canada_2005.json index 3312dbac..0775dff5 100644 --- a/resources/factions/canada_2005.json +++ b/resources/factions/canada_2005.json @@ -20,18 +20,18 @@ "MBT_Leopard_2", "IFV_LAV_25", "APC_M113", - "IFV_MCV_80", - "SAM_Avenger_M1097" + "IFV_Warrior", + "SAM_Avenger__Stinger" ], "artillery_units": [ ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "Stinger_MANPADS" + "Infantry_M249", + "MANPADS_Stinger" ], "air_defenses": [ "AvengerGenerator", @@ -45,10 +45,10 @@ "helicopter_carrier": [ ], "destroyers": [ - "USS_Arleigh_Burke_IIa" + "DDG_Arleigh_Burke_IIa" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "requirements": {}, "carrier_names": [ diff --git a/resources/factions/china_2010.json b/resources/factions/china_2010.json index cc592f1d..1f47c779 100644 --- a/resources/factions/china_2010.json +++ b/resources/factions/china_2010.json @@ -26,18 +26,19 @@ "HQ_7_Self_Propelled_LN" ], "artillery_units": [ - "MLRS_9A52_Smerch", - "SPH_2S9_Nona" + "MLRS_9A52_Smerch_HE_300mm", + "PLZ_05", + "SPH_2S9_Nona_120mm_M" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ "Paratrooper_AKS", - "Infantry_Soldier_Rus", + "Infantry_AK_74_Rus", "Paratrooper_RPG_16", - "SAM_SA_18_Igla_S_MANPADS" + "MANPADS_SA_18_Igla_S_Grouse" ], "air_defenses": [ "HQ7Generator", @@ -57,6 +58,10 @@ "BoxSpringGenerator", "TallRackGenerator" ], + "coastal_defenses": [ + "SilkwormGenerator" + ], + "coastal_group_count": 2, "aircraft_carrier": [ "CV_1143_5_Admiral_Kuznetsov" ], diff --git a/resources/factions/dprk_1950_fictional.json b/resources/factions/dprk_1950_fictional.json new file mode 100644 index 00000000..29251c1b --- /dev/null +++ b/resources/factions/dprk_1950_fictional.json @@ -0,0 +1,59 @@ +{ + "country": "North Korea", + "name": "North Korea 1950, fictional", + "authors": "BenBenBeartrax", + "description": "

Fictional DPRK (North Korea) army around 1955, during the Korean War, with some WW2 planes added in place of their post-war counterparts.

", + "aircrafts": [ + "MiG_15bis", + "I_16", + "FW_190A8", + "FW_190D9", + "Bf_109K_4" + ], + "awacs": [ + ], + "tankers": [ + ], + "frontline_units": [ + "IFV_BRDM_2", + "Grad_MRL_FDDM__FC", + "APC_MTLB", + "MBT_T_55", + "SPAAA_ZU_23_2_Mounted_Ural_375", + "AAA_8_8cm_Flak_18" + ], + "artillery_units": [ + "MLRS_BM_21_Grad_122mm" + ], + "logistics_units": [ + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" + ], + "infantry_units": [ + "Infantry_AK_74_Rus", + "Infantry_RPG" + ], + "air_defenses": [ + "FlakGenerator", + "EarlyColdWarFlakGenerator" + ], + "aircraft_carrier": [ + ], + "helicopter_carrier": [ + ], + "helicopter_carrier_names": [ + ], + "destroyers": [ + ], + "cruisers": [ + ], + "requirements": { + "WW2 Asset Pack": "https://www.digitalcombatsimulator.com/en/products/other/wwii_assets_pack/" + }, + "carrier_names": [ + ], + "navy_generators": [ + ], + "has_jtac": false, + "doctrine": "ww2" +} diff --git a/resources/factions/france_1985_frenchpack.json b/resources/factions/france_1985_frenchpack.json index 3837fbc1..86bad8bc 100644 --- a/resources/factions/france_1985_frenchpack.json +++ b/resources/factions/france_1985_frenchpack.json @@ -34,16 +34,16 @@ "SAM_Roland_ADS" ], "artillery_units": [ - "MLRS_M270", - "SPH_M109_Paladin" + "MLRS_M270_227mm", + "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "Stinger_MANPADS" + "Infantry_M249", + "MANPADS_Stinger" ], "air_defenses": [ "RolandGenerator", @@ -54,10 +54,10 @@ "LHA_1_Tarawa" ], "destroyers": [ - "USS_Arleigh_Burke_IIa" + "DDG_Arleigh_Burke_IIa" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "requirements": { "frenchpack V3.5": "https://forums.eagle.ru/showthread.php?t=279974" diff --git a/resources/factions/france_1995.json b/resources/factions/france_1995.json index 25b897ac..30d3e440 100644 --- a/resources/factions/france_1995.json +++ b/resources/factions/france_1995.json @@ -19,26 +19,26 @@ ], "frontline_units": [ "MBT_Leclerc", - "TPz_Fuchs", - "APC_Cobra", - "ATGM_M1134_Stryker", + "APC_TPz_Fuchs", + "APC_Cobra__Scout", + "ATGM_Stryker", "IFV_LAV_25", - "APC_M1043_HMMWV_Armament", - "ATGM_M1045_HMMWV_TOW", + "APC_HMMWV__Scout", + "ATGM_HMMWV", "SAM_Roland_ADS" ], "artillery_units": [ - "MLRS_M270", - "SPH_M109_Paladin" + "MLRS_M270_227mm", + "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "Stinger_MANPADS", - "_2B11_mortar" + "Infantry_M249", + "MANPADS_Stinger", + "Mortar_2B11_120mm" ], "air_defenses": [ "RolandGenerator", @@ -53,11 +53,11 @@ "LHA_1_Tarawa" ], "destroyers": [ - "USS_Arleigh_Burke_IIa", - "Oliver_Hazzard_Perry_class" + "DDG_Arleigh_Burke_IIa", + "FFG_Oliver_Hazzard_Perry" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "requirements": {}, "carrier_names": [ diff --git a/resources/factions/france_2005_frenchpack.json b/resources/factions/france_2005_frenchpack.json index f9e0dca7..bae4fbf3 100644 --- a/resources/factions/france_2005_frenchpack.json +++ b/resources/factions/france_2005_frenchpack.json @@ -11,7 +11,8 @@ "SA342Mistral" ], "awacs": [ - "E_3A" + "E_3A", + "E_2C" ], "tankers": [ "KC_135", @@ -35,16 +36,16 @@ "SAM_Roland_ADS" ], "artillery_units": [ - "MLRS_M270", - "SPH_M109_Paladin" + "MLRS_M270_227mm", + "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "Stinger_MANPADS" + "Infantry_M249", + "MANPADS_Stinger" ], "air_defenses": [ "RolandGenerator", @@ -57,10 +58,10 @@ "LHA_1_Tarawa" ], "destroyers": [ - "USS_Arleigh_Burke_IIa" + "DDG_Arleigh_Burke_IIa" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "requirements": { "frenchpack V3.5": "https://forums.eagle.ru/showthread.php?t=279974" diff --git a/resources/factions/france_2005_modded.json b/resources/factions/france_2005_modded.json deleted file mode 100644 index dd0929fc..00000000 --- a/resources/factions/france_2005_modded.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "country": "France", - "name": "France 2005 (Modded)", - "authors": "Khopa", - "description": "

France in the mid, late 2000s, using the Rafale mod, and Frenchpack's units.

", - "aircrafts": [ - "M_2000C", - "Mirage_2000_5", - "Rafale_M", - "Rafale_A_S", - "Rafale_B", - "SA342M", - "SA342L", - "SA342Mistral" - ], - "awacs": [ - "E_3A" - ], - "tankers": [ - "KC_135", - "KC130" - ], - "frontline_units": [ - "AMX_10RCR", - "AMX_10RCR_SEPAR", - "ERC_90", - "TRM_2000_PAMELA", - "VAB__50", - "VAB_MEPHISTO", - "VAB_T20_13", - "VAB_T20_13", - "VBL__50", - "VBL_AANF1", - "VBAE_CRAB", - "VBAE_CRAB_MMP", - "AMX_30B2", - "Leclerc_Serie_XXI", - "SAM_Roland_ADS" - ], - "artillery_units": [ - "MLRS_M270", - "SPH_M109_Paladin" - ], - "logistics_units": [ - "Transport_M818" - ], - "infantry_units": [ - "Infantry_M4", - "Soldier_M249", - "Stinger_MANPADS" - ], - "air_defenses": [ - "RolandGenerator", - "HawkGenerator" - ], - "ewrs": [ - "HawkEwrGenerator" - ], - "aircraft_carrier": [ - "CVN_74_John_C__Stennis" - ], - "helicopter_carrier": [ - "LHA_1_Tarawa" - ], - "destroyers": [ - "USS_Arleigh_Burke_IIa" - ], - "cruisers": [ - "Ticonderoga_class" - ], - "requirements": { - "frenchpack V3.5": "https://forums.eagle.ru/showthread.php?t=279974", - "RAFALE 2.5.6": "https://forums.eagle.ru/forum/english/dcs-world-topics/mods-and-apps/dcs-mods/7135261-download-rafales-pack-2-5-6-55960-and-openbeta-2-5-6-57530-by-cuesta-brothers" - }, - "carrier_names": [ - "R91 Charles de Gaulle" - ], - "helicopter_carrier_names": [ - "R97 Jeanne d'Arc", - "L9013 Mistral", - "L9014 Tonerre", - "L9015 Dixmude" - ], - "navy_generators": [ - "ArleighBurkeGroupGenerator" - ], - "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} diff --git a/resources/factions/gdr_1985.json b/resources/factions/gdr_1985.json index 07131110..9eee25a1 100644 --- a/resources/factions/gdr_1985.json +++ b/resources/factions/gdr_1985.json @@ -17,23 +17,23 @@ "frontline_units": [ "IFV_BMP_1", "IFV_BMP_2", - "ARV_BRDM_2", + "IFV_BRDM_2", "APC_MTLB", "MBT_T_55", "MBT_T_72B" ], "artillery_units": [ - "MLRS_BM_21_Grad", - "SPH_2S1_Gvozdika" + "MLRS_BM_21_Grad_122mm", + "SPH_2S1_Gvozdika_122mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ - "Infantry_Soldier_Rus", - "Soldier_RPG", - "_2B11_mortar" + "Infantry_AK_74_Rus", + "Infantry_RPG", + "Mortar_2B11_120mm" ], "air_defenses": [ "ColdWarFlakGenerator", @@ -54,7 +54,7 @@ "helicopter_carrier": [], "destroyers": [], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "requirements": {}, "carrier_names": [], diff --git a/resources/factions/georgia_2008.json b/resources/factions/georgia_2008.json index 0d861108..b1250008 100644 --- a/resources/factions/georgia_2008.json +++ b/resources/factions/georgia_2008.json @@ -13,26 +13,26 @@ "frontline_units": [ "APC_BTR_80", "APC_MTLB", - "APC_Cobra", + "APC_Cobra__Scout", "IFV_BMP_1", "IFV_BMP_2", "MBT_T_72B", "MBT_T_55", - "SAM_SA_13_Strela_10M3_9A35M3" + "SAM_SA_13_Strela_10M3_Gopher_TEL" ], "artillery_units": [ - "MLRS_BM_21_Grad", - "SPH_2S1_Gvozdika", - "SPH_2S3_Akatsia" + "MLRS_BM_21_Grad_122mm", + "SPH_2S1_Gvozdika_122mm", + "SPH_2S3_Akatsia_152mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ "Paratrooper_AKS", "Paratrooper_RPG_16", - "SAM_SA_18_Igla_S_MANPADS" + "MANPADS_SA_18_Igla_S_Grouse" ], "air_defenses": [ "SA3Generator", diff --git a/resources/factions/germany_1942.json b/resources/factions/germany_1942.json index 1a84e1ff..927152d5 100644 --- a/resources/factions/germany_1942.json +++ b/resources/factions/germany_1942.json @@ -10,20 +10,20 @@ "Ju_88A4" ], "frontline_units": [ - "MT_Pz_Kpfw_IV_Ausf_H", - "APC_Sd_Kfz_251", - "AC_Sd_Kfz_234_2_Puma", - "TD_Jagdpanzer_IV", + "MT_PzIV_H", + "APC_Sd_Kfz_251_Halftrack", + "IFV_Sd_Kfz_234_2_Puma", + "SPG_Jagdpanzer_IV", "AAA_8_8cm_Flak_18" ], "artillery_units": [ - "Sturmpanzer_IV_Brummbär" + "SPG_Sturmpanzer_IV_Brummbar" ], "logistics_units": [ - "Blitz_3_6_6700A", - "Kübelwagen_82", - "Sd_Kfz_7", - "Sd_Kfz_2" + "Truck_Opel_Blitz", + "LUV_Kubelwagen_82", + "Carrier_Sd_Kfz_7_Tractor", + "LUV_Kettenrad" ], "infantry_units": [ "Infantry_Mauser_98" diff --git a/resources/factions/germany_1944.json b/resources/factions/germany_1944.json index e9d5ad78..a607adfa 100644 --- a/resources/factions/germany_1944.json +++ b/resources/factions/germany_1944.json @@ -11,27 +11,27 @@ ], "frontline_units": [ "MT_Pz_Kpfw_V_Panther_Ausf_G", - "MT_Pz_Kpfw_IV_Ausf_H", + "MT_PzIV_H", "HT_Pz_Kpfw_VI_Tiger_I", "HT_Pz_Kpfw_VI_Ausf__B_Tiger_II", - "APC_Sd_Kfz_251", - "AC_Sd_Kfz_234_2_Puma", - "Sd_Kfz_184_Elefant", - "TD_Jagdpanther_G1", - "TD_Jagdpanzer_IV", - "StuG_III_Ausf__G", - "StuG_IV", + "APC_Sd_Kfz_251_Halftrack", + "IFV_Sd_Kfz_234_2_Puma", + "SPG_Sd_Kfz_184_Elefant", + "SPG_Jagdpanther_G1", + "SPG_Jagdpanzer_IV", + "SPG_StuG_III_Ausf__G", + "SPG_StuG_IV", "AAA_8_8cm_Flak_18", "AAA_8_8cm_Flak_41" ], "artillery_units": [ - "Sturmpanzer_IV_Brummbär" + "SPG_Sturmpanzer_IV_Brummbar" ], "logistics_units": [ - "Blitz_3_6_6700A", - "Kübelwagen_82", - "Sd_Kfz_7", - "Sd_Kfz_2" + "Truck_Opel_Blitz", + "LUV_Kubelwagen_82", + "Carrier_Sd_Kfz_7_Tractor", + "LUV_Kettenrad" ], "infantry_units": [ "Infantry_Mauser_98" diff --git a/resources/factions/germany_1944_free.json b/resources/factions/germany_1944_free.json index a27417aa..6145a374 100644 --- a/resources/factions/germany_1944_free.json +++ b/resources/factions/germany_1944_free.json @@ -9,17 +9,17 @@ "Bf_109K_4" ], "frontline_units": [ - "MT_Pz_Kpfw_IV_Ausf_H", - "APC_Sd_Kfz_251", + "MT_PzIV_H", + "APC_Sd_Kfz_251_Halftrack", "AAA_8_8cm_Flak_18" ], "artillery_units": [ ], "logistics_units": [ - "Blitz_3_6_6700A" + "Truck_Opel_Blitz" ], "infantry_units": [ - "Infantry_Soldier_Rus" + "Infantry_AK_74_Rus" ], "air_defenses": [ "Flak18Generator" diff --git a/resources/factions/germany_1990.json b/resources/factions/germany_1990.json index c5275de1..0190d101 100644 --- a/resources/factions/germany_1990.json +++ b/resources/factions/germany_1990.json @@ -19,7 +19,7 @@ "KC130" ], "frontline_units": [ - "TPz_Fuchs", + "APC_TPz_Fuchs", "MBT_Leopard_1A3", "MBT_Leopard_2", "IFV_Marder", @@ -28,13 +28,13 @@ "artillery_units": [ ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "_2B11_mortar", - "Stinger_MANPADS" + "Infantry_M249", + "Mortar_2B11_120mm", + "MANPADS_Stinger" ], "air_defenses": [ "GepardGenerator", @@ -50,10 +50,10 @@ "helicopter_carrier": [ ], "destroyers": [ - "Oliver_Hazzard_Perry_class" + "FFG_Oliver_Hazzard_Perry" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "requirements": {}, "carrier_names": [ diff --git a/resources/factions/greece_2005.json b/resources/factions/greece_2005.json index 21bf75ad..a390525a 100644 --- a/resources/factions/greece_2005.json +++ b/resources/factions/greece_2005.json @@ -18,22 +18,22 @@ "MBT_Leopard_2", "MBT_Leopard_1A3", "MBT_M60A3_Patton", - "APC_M1043_HMMWV_Armament", - "ATGM_M1045_HMMWV_TOW", + "APC_HMMWV__Scout", + "ATGM_HMMWV", "APC_M113", "IFV_BMP_1" ], "artillery_units": [ - "SPH_M109_Paladin", - "MLRS_M270" + "SPH_M109_Paladin_155mm", + "MLRS_M270_227mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "Stinger_MANPADS" + "Infantry_M249", + "MANPADS_Stinger" ], "air_defenses": [ "HawkGenerator", diff --git a/resources/factions/india_2010.json b/resources/factions/india_2010.json index 609fe738..8ea8c8c9 100644 --- a/resources/factions/india_2010.json +++ b/resources/factions/india_2010.json @@ -23,20 +23,20 @@ "MBT_T_90", "MBT_T_72B", "IFV_BMP_2", - "SAM_SA_19_Tunguska_2S6" + "SAM_SA_19_Tunguska_Grison" ], "artillery_units": [ - "MLRS_9K57_Uragan_BM_27", - "SPH_2S19_Msta" + "MLRS_BM_27_Uragan_220mm", + "SPH_2S19_Msta_152mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ "Infantry_M4", "Paratrooper_RPG_16", - "SAM_SA_18_Igla_S_MANPADS" + "MANPADS_SA_18_Igla_S_Grouse" ], "air_defenses": [ "SA3Generator", @@ -63,7 +63,7 @@ "helicopter_carrier_names": [ ], "destroyers": [ - "FF_1135M_Rezky" + "Frigate_1135M_Rezky" ], "cruisers": [ ], diff --git a/resources/factions/insurgents.json b/resources/factions/insurgents.json index f31a5966..773ea181 100644 --- a/resources/factions/insurgents.json +++ b/resources/factions/insurgents.json @@ -6,24 +6,24 @@ "aircrafts": [ ], "frontline_units": [ - "APC_Cobra", + "APC_Cobra__Scout", "APC_MTLB", - "ARV_BRDM_2", - "AAA_ZU_23_Insurgent_on_Ural_375" + "IFV_BRDM_2", + "SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375" ], "artillery_units": [ - "MLRS_BM_21_Grad", - "SPH_2S19_Msta" + "MLRS_BM_21_Grad_122mm", + "SPH_2S19_Msta_152mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ - "Infantry_Soldier_Insurgents", - "Soldier_RPG", - "_2B11_mortar", - "SAM_SA_18_Igla_MANPADS" + "Insurgent_AK_74", + "Infantry_RPG", + "Mortar_2B11_120mm", + "MANPADS_SA_18_Igla_Grouse" ], "air_defenses": [ "SA9Generator", diff --git a/resources/factions/insurgents_hard.json b/resources/factions/insurgents_hard.json index f824e1c7..086385cd 100644 --- a/resources/factions/insurgents_hard.json +++ b/resources/factions/insurgents_hard.json @@ -6,29 +6,29 @@ "aircrafts": [ ], "frontline_units": [ - "ATGM_M1045_HMMWV_TOW", - "APC_M1043_HMMWV_Armament", - "ARV_BRDM_2", + "ATGM_HMMWV", + "APC_HMMWV__Scout", + "IFV_BRDM_2", "APC_BTR_80", - "ARV_BTR_RD", + "APC_BTR_RD", "IFV_BMP_1", "MBT_T_55", - "AAA_ZU_23_Insurgent_on_Ural_375", - "AAA_ZSU_57_2" + "SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375", + "SPAAA_ZSU_57_2" ], "artillery_units": [ - "MLRS_BM_21_Grad", - "SPH_2S19_Msta" + "MLRS_BM_21_Grad_122mm", + "SPH_2S19_Msta_152mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ - "Infantry_Soldier_Insurgents", - "Soldier_RPG", - "_2B11_mortar", - "SAM_SA_18_Igla_MANPADS" + "Insurgent_AK_74", + "Infantry_RPG", + "Mortar_2B11_120mm", + "MANPADS_SA_18_Igla_Grouse" ], "air_defenses": [ "SA9Generator", diff --git a/resources/factions/insurgents_modded.json b/resources/factions/insurgents_modded.json index 296ee8b5..cca23cf7 100644 --- a/resources/factions/insurgents_modded.json +++ b/resources/factions/insurgents_modded.json @@ -10,20 +10,20 @@ "DIM__TOYOTA_DESERT", "DIM__TOYOTA_GREEN", "DIM__KAMIKAZE", - "AAA_ZU_23_Insurgent_on_Ural_375" + "SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375" ], "artillery_units": [ - "MLRS_BM_21_Grad", - "SPH_2S19_Msta" + "MLRS_BM_21_Grad_122mm", + "SPH_2S19_Msta_152mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ - "Infantry_Soldier_Insurgents", - "Soldier_RPG", - "SAM_SA_18_Igla_MANPADS" + "Insurgent_AK_74", + "Infantry_RPG", + "MANPADS_SA_18_Igla_Grouse" ], "air_defenses": [ "SA9Generator", diff --git a/resources/factions/iran_1988.json b/resources/factions/iran_1988.json index 406bd9ab..21fa2707 100644 --- a/resources/factions/iran_1988.json +++ b/resources/factions/iran_1988.json @@ -21,22 +21,23 @@ "APC_BTR_80", "MBT_M60A3_Patton", "IFV_BMP_1", - "SPAAA_ZSU_23_4_Shilka", - "AAA_ZSU_57_2" + "SPAAA_ZSU_23_4_Shilka_Gun_Dish", + "SPAAA_ZSU_57_2", + "SPAAA_ZU_23_2_Mounted_Ural_375" ], "artillery_units": [ - "MLRS_BM_21_Grad", - "SPH_2S1_Gvozdika" + "MLRS_BM_21_Grad_122mm", + "SPH_2S1_Gvozdika_122mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ "Paratrooper_AKS", - "Infantry_Soldier_Insurgents", - "Soldier_RPG", - "SAM_SA_18_Igla_S_MANPADS" + "Insurgent_AK_74", + "Infantry_RPG", + "MANPADS_SA_18_Igla_S_Grouse" ], "air_defenses": [ "HawkGenerator", @@ -45,7 +46,7 @@ "ZSU57Generator", "ZSU23Generator", "ZU23Generator", - "ZU23UralGenerator" + "ColdWarFlakGenerator" ], "ewrs": [ "TallRackGenerator" @@ -57,10 +58,10 @@ "helicopter_carrier_names": [ ], "destroyers": [ - "FF_1135M_Rezky" + "Frigate_1135M_Rezky" ], "cruisers": [ - "FSG_1241_1MP_Molniya" + "Corvette_1241_1_Molniya" ], "requirements": {}, "carrier_names": [ @@ -69,6 +70,10 @@ "ScudGenerator" ], "missiles_group_count": 1, + "coastal_defenses": [ + "SilkwormGenerator" + ], + "coastal_group_count": 2, "navy_generators": [ "GrishaGroupGenerator", "MolniyaGroupGenerator" diff --git a/resources/factions/iran_2015.json b/resources/factions/iran_2015.json index 9f3d8870..15a0771e 100644 --- a/resources/factions/iran_2015.json +++ b/resources/factions/iran_2015.json @@ -28,22 +28,22 @@ "MBT_M60A3_Patton", "IFV_BMP_1", "MBT_T_72B", - "SPAAA_ZSU_23_4_Shilka", - "AAA_ZSU_57_2" + "SPAAA_ZSU_23_4_Shilka_Gun_Dish", + "SPAAA_ZSU_57_2" ], "artillery_units": [ - "MLRS_BM_21_Grad", - "SPH_2S19_Msta" + "MLRS_BM_21_Grad_122mm", + "SPH_2S19_Msta_152mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ "Paratrooper_AKS", - "Infantry_Soldier_Insurgents", + "Insurgent_AK_74", "Paratrooper_RPG_16", - "SAM_SA_18_Igla_S_MANPADS" + "MANPADS_SA_18_Igla_S_Grouse" ], "air_defenses": [ "HawkGenerator", @@ -67,10 +67,10 @@ "helicopter_carrier_names": [ ], "destroyers": [ - "FF_1135M_Rezky" + "Frigate_1135M_Rezky" ], "cruisers": [ - "FSG_1241_1MP_Molniya" + "Corvette_1241_1_Molniya" ], "requirements": {}, "carrier_names": [ @@ -79,6 +79,10 @@ "ScudGenerator" ], "missiles_group_count": 1, + "coastal_defenses": [ + "SilkwormGenerator" + ], + "coastal_group_count": 3, "navy_generators": [ "GrishaGroupGenerator", "MolniyaGroupGenerator" diff --git a/resources/factions/iraq_1991.json b/resources/factions/iraq_1991.json index 82562c1a..25376a66 100644 --- a/resources/factions/iraq_1991.json +++ b/resources/factions/iraq_1991.json @@ -30,23 +30,23 @@ "MBT_T_55", "MBT_T_72B", "APC_BTR_80", - "ARV_BRDM_2", - "SPH_2S1_Gvozdika", - "AAA_ZSU_57_2", - "SPAAA_ZSU_23_4_Shilka" + "IFV_BRDM_2", + "SPH_2S1_Gvozdika_122mm", + "SPAAA_ZSU_57_2", + "SPAAA_ZSU_23_4_Shilka_Gun_Dish" ], "artillery_units": [ - "MLRS_BM_21_Grad" + "MLRS_BM_21_Grad_122mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ "Paratrooper_AKS", - "Infantry_Soldier_Rus", + "Infantry_AK_74_Rus", "Paratrooper_RPG_16", - "SAM_SA_18_Igla_MANPADS" + "MANPADS_SA_18_Igla_Grouse" ], "air_defenses": [ "ColdWarFlakGenerator", diff --git a/resources/factions/israel_1948.json b/resources/factions/israel_1948.json index 5f296689..4d81443e 100644 --- a/resources/factions/israel_1948.json +++ b/resources/factions/israel_1948.json @@ -13,15 +13,15 @@ ], "frontline_units": [ "MT_M4A4_Sherman_Firefly", - "APC_M2A1", + "APC_M2A1_Halftrack", "MT_M4_Sherman", - "LAC_M8_Greyhound", - "AAA_Bofors_40mm" + "Car_M8_Greyhound_Armored", + "AAA_40mm_Bofors" ], "artillery_units": [ ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_SMLE_No_4_Mk_1" diff --git a/resources/factions/israel_1973.json b/resources/factions/israel_1973.json index 36bef190..da572305 100644 --- a/resources/factions/israel_1973.json +++ b/resources/factions/israel_1973.json @@ -17,7 +17,7 @@ ], "frontline_units": [ "MT_M4_Sherman", - "APC_M2A1", + "APC_M2A1_Halftrack", "MBT_M60A3_Patton", "APC_M113", "SAM_Chaparral_M48" @@ -25,11 +25,11 @@ "artillery_units": [ ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Infantry_M249" ], "air_defenses": [ "BoforsGenerator", diff --git a/resources/factions/israel_1982.json b/resources/factions/israel_1982.json index 5c910edd..a938461a 100644 --- a/resources/factions/israel_1982.json +++ b/resources/factions/israel_1982.json @@ -22,17 +22,17 @@ "frontline_units": [ "APC_M113", "MBT_M60A3_Patton", - "MBT_Merkava_Mk__4", - "AAA_Vulcan_M163" + "MBT_Merkava_IV", + "SPAAA_Vulcan_M163" ], "artillery_units": [ ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Infantry_M249" ], "air_defenses": [ "ChaparralGenerator", diff --git a/resources/factions/israel_2000.json b/resources/factions/israel_2000.json index 0cab7580..5d8d5b60 100644 --- a/resources/factions/israel_2000.json +++ b/resources/factions/israel_2000.json @@ -21,22 +21,22 @@ ], "frontline_units": [ "APC_M113", - "APC_M1043_HMMWV_Armament", - "ATGM_M1045_HMMWV_TOW", - "MBT_Merkava_Mk__4", - "AAA_Vulcan_M163" + "APC_HMMWV__Scout", + "ATGM_HMMWV", + "MBT_Merkava_IV", + "SPAAA_Vulcan_M163" ], "artillery_units": [ - "SPH_M109_Paladin", - "MLRS_M270" + "SPH_M109_Paladin_155mm", + "MLRS_M270_227mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "Stinger_MANPADS" + "Infantry_M249", + "MANPADS_Stinger" ], "air_defenses": [ "ChaparralGenerator", diff --git a/resources/factions/italy_1990.json b/resources/factions/italy_1990.json index 1f0250da..cacea593 100644 --- a/resources/factions/italy_1990.json +++ b/resources/factions/italy_1990.json @@ -19,18 +19,18 @@ "frontline_units": [ "MBT_Leopard_1A3", "APC_M113", - "SAM_Avenger_M1097" + "SAM_Avenger__Stinger" ], "artillery_units": [ - "SPH_M109_Paladin" + "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "Stinger_MANPADS" + "Infantry_M249", + "MANPADS_Stinger" ], "air_defenses": [ "AvengerGenerator", @@ -45,10 +45,10 @@ "LHA_1_Tarawa" ], "destroyers": [ - "Oliver_Hazzard_Perry_class" + "FFG_Oliver_Hazzard_Perry" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "requirements": { }, diff --git a/resources/factions/italy_1990_mb339.json b/resources/factions/italy_1990_mb339.json index 00cc2914..f658078b 100644 --- a/resources/factions/italy_1990_mb339.json +++ b/resources/factions/italy_1990_mb339.json @@ -20,18 +20,18 @@ "frontline_units": [ "MBT_Leopard_1A3", "APC_M113", - "SAM_Avenger_M1097" + "SAM_Avenger__Stinger" ], "artillery_units": [ - "SPH_M109_Paladin" + "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "Stinger_MANPADS" + "Infantry_M249", + "MANPADS_Stinger" ], "air_defenses": [ "AvengerGenerator", @@ -46,10 +46,10 @@ "LHA_1_Tarawa" ], "destroyers": [ - "Oliver_Hazzard_Perry_class" + "FFG_Oliver_Hazzard_Perry" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "requirements": { "MB-339A/PAN by Frecce Tricolori Virtuali": "http://www.freccetricolorivirtuali.net/" diff --git a/resources/factions/japan_2005.json b/resources/factions/japan_2005.json index 88f57175..892e1ed7 100644 --- a/resources/factions/japan_2005.json +++ b/resources/factions/japan_2005.json @@ -18,25 +18,25 @@ "KC130" ], "frontline_units": [ - "MBT_Merkava_Mk__4", + "MBT_Merkava_IV", "MBT_M1A2_Abrams", "IFV_Marder", - "TPz_Fuchs", + "APC_TPz_Fuchs", "IFV_LAV_25", - "APC_M1043_HMMWV_Armament", + "APC_HMMWV__Scout", "SPAAA_Gepard" ], "artillery_units": [ - "SPH_M109_Paladin", - "MLRS_M270", - "Stinger_MANPADS" + "SPH_M109_Paladin_155mm", + "MLRS_M270_227mm", + "MANPADS_Stinger" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Infantry_M249" ], "air_defenses": [ "GepardGenerator", @@ -52,10 +52,10 @@ "LHA_1_Tarawa" ], "destroyers": [ - "USS_Arleigh_Burke_IIa" + "DDG_Arleigh_Burke_IIa" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "requirements": { }, diff --git a/resources/factions/libya_2011.json b/resources/factions/libya_2011.json index dd758824..10ef96a2 100644 --- a/resources/factions/libya_2011.json +++ b/resources/factions/libya_2011.json @@ -18,23 +18,23 @@ ], "frontline_units": [ "IFV_BMP_1", - "ARV_BRDM_2", + "IFV_BRDM_2", "MBT_T_72B", "MBT_T_55", - "SPAAA_ZSU_23_4_Shilka", - "SAM_SA_8_Osa_9A33" + "SPAAA_ZSU_23_4_Shilka_Gun_Dish", + "SAM_SA_8_Osa_Gecko_TEL" ], "artillery_units": [ - "MLRS_BM_21_Grad" + "MLRS_BM_21_Grad_122mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ - "Infantry_Soldier_Insurgents", + "Insurgent_AK_74", "Paratrooper_RPG_16", - "SAM_SA_18_Igla_MANPADS" + "MANPADS_SA_18_Igla_Grouse" ], "air_defenses": [ "HQ7Generator", @@ -62,10 +62,10 @@ ], "missiles_group_count": 1, "destroyers": [ - "FF_1135M_Rezky" + "Frigate_1135M_Rezky" ], "cruisers": [ - "FSG_1241_1MP_Molniya" + "Corvette_1241_1_Molniya" ], "requirements": {}, "carrier_names": [ diff --git a/resources/factions/netherlands_1990.json b/resources/factions/netherlands_1990.json index 26462102..cf4735f9 100644 --- a/resources/factions/netherlands_1990.json +++ b/resources/factions/netherlands_1990.json @@ -18,17 +18,17 @@ "frontline_units": [ "APC_M113", "MBT_Leopard_1A3", - "SAM_Avenger_M1097" + "SAM_Avenger__Stinger" ], "artillery_units": [ ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "Stinger_MANPADS" + "Infantry_M249", + "MANPADS_Stinger" ], "air_defenses": [ "AvengerGenerator", diff --git a/resources/factions/north_korea_2000.json b/resources/factions/north_korea_2000.json index 794852d4..565ab250 100644 --- a/resources/factions/north_korea_2000.json +++ b/resources/factions/north_korea_2000.json @@ -19,29 +19,29 @@ "IL_78M" ], "frontline_units": [ - "ARV_BRDM_2", + "IFV_BRDM_2", "APC_BTR_80", "IFV_BMP_1", "MBT_T_55", "MBT_T_72B", "MBT_T_80U", - "AAA_ZSU_57_2", - "SAM_SA_9_Strela_1_9P31" + "SPAAA_ZSU_57_2", + "SAM_SA_9_Strela_1_Gaskin_TEL" ], "artillery_units": [ - "MLRS_BM_21_Grad", - "MLRS_9K57_Uragan_BM_27", - "SPH_2S19_Msta" + "MLRS_BM_21_Grad_122mm", + "MLRS_BM_27_Uragan_220mm", + "SPH_2S19_Msta_152mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ "Paratrooper_AKS", - "Infantry_Soldier_Rus", + "Infantry_AK_74_Rus", "Paratrooper_RPG_16", - "SAM_SA_18_Igla_S_MANPADS" + "MANPADS_SA_18_Igla_S_Grouse" ], "air_defenses": [ "SA2Generator", diff --git a/resources/factions/pakistan_2015.json b/resources/factions/pakistan_2015.json index 32e1495d..1c8c7ef7 100644 --- a/resources/factions/pakistan_2015.json +++ b/resources/factions/pakistan_2015.json @@ -27,18 +27,18 @@ "HQ_7_Self_Propelled_LN" ], "artillery_units": [ - "MLRS_9A52_Smerch", - "SPH_2S9_Nona" + "MLRS_9A52_Smerch_HE_300mm", + "SPH_2S9_Nona_120mm_M" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ "Paratrooper_AKS", - "Infantry_Soldier_Rus", + "Infantry_AK_74_Rus", "Paratrooper_RPG_16", - "Stinger_MANPADS" + "MANPADS_Stinger" ], "air_defenses": [ "HQ7Generator", diff --git a/resources/factions/pmc_russian.json b/resources/factions/pmc_russian.json index 3b20801a..aa273736 100644 --- a/resources/factions/pmc_russian.json +++ b/resources/factions/pmc_russian.json @@ -10,22 +10,22 @@ "Ka_50" ], "frontline_units": [ - "APC_Cobra", + "APC_Cobra__Scout", "APC_BTR_80", - "ARV_BRDM_2", - "SAM_SA_13_Strela_10M3_9A35M3" + "IFV_BRDM_2", + "SAM_SA_13_Strela_10M3_Gopher_TEL" ], "artillery_units": [ - "SPH_2S19_Msta" + "SPH_2S19_Msta_152mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ "Paratrooper_AKS", "Paratrooper_RPG_16", - "SAM_SA_18_Igla_S_MANPADS" + "MANPADS_SA_18_Igla_S_Grouse" ], "air_defenses": [ "SA9Generator", diff --git a/resources/factions/pmc_us.json b/resources/factions/pmc_us.json index 0c46beca..293a4b9d 100644 --- a/resources/factions/pmc_us.json +++ b/resources/factions/pmc_us.json @@ -10,20 +10,20 @@ "SA342M" ], "frontline_units": [ - "APC_M1043_HMMWV_Armament", - "IFV_MCV_80", + "APC_HMMWV__Scout", + "IFV_Warrior", "IFV_LAV_25", - "SAM_Avenger_M1097" + "SAM_Avenger__Stinger" ], "artillery_units": [ ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "Stinger_MANPADS" + "Infantry_M249", + "MANPADS_Stinger" ], "air_defenses": [ "AvengerGenerator" diff --git a/resources/factions/pmc_us_with_mb339.json b/resources/factions/pmc_us_with_mb339.json index e4f706e1..8ffdf832 100644 --- a/resources/factions/pmc_us_with_mb339.json +++ b/resources/factions/pmc_us_with_mb339.json @@ -11,20 +11,20 @@ "SA342M" ], "frontline_units": [ - "APC_M1043_HMMWV_Armament", - "IFV_MCV_80", + "APC_HMMWV__Scout", + "IFV_Warrior", "IFV_LAV_25", - "SAM_Avenger_M1097" + "SAM_Avenger__Stinger" ], "artillery_units": [ ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "Stinger_MANPADS" + "Infantry_M249", + "MANPADS_Stinger" ], "air_defenses": [ "AvengerGenerator" diff --git a/resources/factions/poland_2010.json b/resources/factions/poland_2010.json index 5090d6e7..35256cfc 100644 --- a/resources/factions/poland_2010.json +++ b/resources/factions/poland_2010.json @@ -13,29 +13,29 @@ "KC130" ], "frontline_units": [ - "APC_M1043_HMMWV_Armament", - "ATGM_M1045_HMMWV_TOW", - "APC_M1126_Stryker_ICV", - "ARV_BRDM_2", + "APC_HMMWV__Scout", + "ATGM_HMMWV", + "IFV_M1126_Stryker_ICV", + "IFV_BRDM_2", "IFV_BMP_1", "APC_MTLB", "MBT_Leopard_2", "MBT_T_72B3" ], "artillery_units": [ - "MLRS_BM_21_Grad", - "SPH_2S1_Gvozdika", - "SpGH_Dana" + "MLRS_BM_21_Grad_122mm", + "SPH_2S1_Gvozdika_122mm", + "SPH_Dana_vz77_152mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ "Paratrooper_AKS", - "Infantry_Soldier_Rus", - "Soldier_RPG", - "SAM_SA_18_Igla_S_MANPADS" + "Infantry_AK_74_Rus", + "Infantry_RPG", + "MANPADS_SA_18_Igla_S_Grouse" ], "air_defenses": [ "SA6Generator", diff --git a/resources/factions/redfor_china_2010.json b/resources/factions/redfor_china_2010.json index ab7ce609..c7b1fe0d 100644 --- a/resources/factions/redfor_china_2010.json +++ b/resources/factions/redfor_china_2010.json @@ -40,26 +40,26 @@ "MBT_T_72B3", "MBT_T_80U", "MBT_T_90", - "SAM_SA_19_Tunguska_2S6", + "SAM_SA_19_Tunguska_Grison", "ZBD_04A", "ZTZ_96B" ], "artillery_units": [ - "MLRS_9A52_Smerch", - "MLRS_9K57_Uragan_BM_27", - "SPH_2S9_Nona", - "SPH_2S19_Msta" + "MLRS_9A52_Smerch_HE_300mm", + "MLRS_BM_27_Uragan_220mm", + "SPH_2S9_Nona_120mm_M", + "SPH_2S19_Msta_152mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ - "_2B11_mortar", - "Infantry_Soldier_Rus", + "Mortar_2B11_120mm", + "Infantry_AK_74_Rus", "Paratrooper_AKS", "Paratrooper_RPG_16", - "SAM_SA_18_Igla_MANPADS" + "MANPADS_SA_18_Igla_Grouse" ], "air_defenses": [ "HQ7Generator", @@ -103,12 +103,12 @@ "Wudang Shan" ], "destroyers": [ - "FF_1135M_Rezky", + "Frigate_1135M_Rezky", "Type_052B_Destroyer", "Type_052C_Destroyer" ], "cruiser": [ - "FSG_1241_1MP_Molniya", + "Corvette_1241_1_Molniya", "Type_054A_Frigate" ], "requirements": {}, diff --git a/resources/factions/redfor_russia_2010.json b/resources/factions/redfor_russia_2010.json index 363139ec..e195e8d5 100644 --- a/resources/factions/redfor_russia_2010.json +++ b/resources/factions/redfor_russia_2010.json @@ -40,26 +40,26 @@ "MBT_T_72B3", "MBT_T_80U", "MBT_T_90", - "SAM_SA_19_Tunguska_2S6", + "SAM_SA_19_Tunguska_Grison", "ZBD_04A", "ZTZ_96B" ], "artillery_units": [ - "MLRS_9A52_Smerch", - "MLRS_9K57_Uragan_BM_27", - "SPH_2S9_Nona", - "SPH_2S19_Msta" + "MLRS_9A52_Smerch_HE_300mm", + "MLRS_BM_27_Uragan_220mm", + "SPH_2S9_Nona_120mm_M", + "SPH_2S19_Msta_152mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ - "_2B11_mortar", - "Infantry_Soldier_Rus", + "Mortar_2B11_120mm", + "Infantry_AK_74_Rus", "Paratrooper_AKS", "Paratrooper_RPG_16", - "SAM_SA_18_Igla_MANPADS" + "MANPADS_SA_18_Igla_Grouse" ], "air_defenses": [ "HQ7Generator", @@ -94,12 +94,12 @@ "Mitrofan Moskalenko" ], "destroyers": [ - "FF_1135M_Rezky", + "Frigate_1135M_Rezky", "Type_052B_Destroyer", "Type_052C_Destroyer" ], "cruisers": [ - "FSG_1241_1MP_Molniya", + "Corvette_1241_1_Molniya", "Type_054A_Frigate" ], "requirements": {}, diff --git a/resources/factions/russia_1955.json b/resources/factions/russia_1955.json index d7cfff94..a3964056 100644 --- a/resources/factions/russia_1955.json +++ b/resources/factions/russia_1955.json @@ -13,23 +13,24 @@ "IL_78M" ], "frontline_units": [ - "ARV_BRDM_2", - "FDDM_Grad", + "IFV_BRDM_2", + "Grad_MRL_FDDM__FC", "APC_MTLB", "MBT_T_55", - "AAA_ZU_23_on_Ural_375", - "AAA_8_8cm_Flak_18" + "SPAAA_ZU_23_2_Mounted_Ural_375", + "AAA_8_8cm_Flak_18", + "AAA_S_60_57mm" ], "artillery_units": [ - "MLRS_BM_21_Grad" + "MLRS_BM_21_Grad_122mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ - "Infantry_Soldier_Rus", - "Soldier_RPG" + "Infantry_AK_74_Rus", + "Infantry_RPG" ], "air_defenses": [ "EarlyColdWarFlakGenerator" diff --git a/resources/factions/russia_1965.json b/resources/factions/russia_1965.json index 1c764a45..49b21bcc 100644 --- a/resources/factions/russia_1965.json +++ b/resources/factions/russia_1965.json @@ -17,25 +17,26 @@ "IL_78M" ], "frontline_units": [ - "ARV_BRDM_2", + "IFV_BRDM_2", "APC_BTR_80", - "ARV_BTR_RD", + "APC_BTR_RD", "IFV_BMD_1", "IFV_BMP_1", "MBT_T_55", - "AAA_ZU_23_on_Ural_375", - "AAA_ZSU_57_2" + "SPAAA_ZU_23_2_Mounted_Ural_375", + "SPAAA_ZSU_57_2", + "AAA_S_60_57mm" ], "artillery_units": [ - "MLRS_BM_21_Grad" + "MLRS_BM_21_Grad_122mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ - "Infantry_Soldier_Rus", - "Soldier_RPG" + "Infantry_AK_74_Rus", + "Infantry_RPG" ], "air_defenses": [ "EarlyColdWarFlakGenerator", diff --git a/resources/factions/russia_1970_limited_air.json b/resources/factions/russia_1970_limited_air.json index 9043ad72..5ab6a703 100644 --- a/resources/factions/russia_1970_limited_air.json +++ b/resources/factions/russia_1970_limited_air.json @@ -10,25 +10,25 @@ "Mi_24V" ], "frontline_units": [ - "ARV_BRDM_2", + "IFV_BRDM_2", "APC_BTR_80", "IFV_BMD_1", "IFV_BMP_1", "MBT_T_55", - "AAA_ZSU_57_2" + "SPAAA_ZSU_57_2" ], "artillery_units": [ - "MLRS_BM_21_Grad", - "SPH_2S9_Nona", - "SPH_2S1_Gvozdika" + "MLRS_BM_21_Grad_122mm", + "SPH_2S9_Nona_120mm_M", + "SPH_2S1_Gvozdika_122mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ - "Infantry_Soldier_Rus", - "Soldier_RPG" + "Infantry_AK_74_Rus", + "Infantry_RPG" ], "air_defenses": [ "SA2Generator", diff --git a/resources/factions/russia_1975.json b/resources/factions/russia_1975.json index 4fbbf059..d931e313 100644 --- a/resources/factions/russia_1975.json +++ b/resources/factions/russia_1975.json @@ -23,26 +23,26 @@ "IL_78M" ], "frontline_units": [ - "ARV_BRDM_2", + "IFV_BRDM_2", "APC_BTR_80", "IFV_BMD_1", "IFV_BMP_1", "MBT_T_55", - "SAM_SA_8_Osa_9A33" + "SAM_SA_8_Osa_Gecko_TEL" ], "artillery_units": [ - "MLRS_BM_21_Grad", - "SPH_2S9_Nona", - "SPH_2S1_Gvozdika" + "MLRS_BM_21_Grad_122mm", + "SPH_2S9_Nona_120mm_M", + "SPH_2S1_Gvozdika_122mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ - "Infantry_Soldier_Rus", - "Soldier_RPG", - "_2B11_mortar" + "Infantry_AK_74_Rus", + "Infantry_RPG", + "Mortar_2B11_120mm" ], "air_defenses": [ "ColdWarFlakGenerator", diff --git a/resources/factions/russia_1990.json b/resources/factions/russia_1990.json index 497cfb93..4237b95c 100644 --- a/resources/factions/russia_1990.json +++ b/resources/factions/russia_1990.json @@ -32,22 +32,22 @@ "IFV_BMP_2", "MBT_T_72B", "MBT_T_80U", - "SAM_SA_13_Strela_10M3_9A35M3" + "SAM_SA_13_Strela_10M3_Gopher_TEL" ], "artillery_units": [ - "MLRS_9K57_Uragan_BM_27", - "SPH_2S19_Msta" + "MLRS_BM_27_Uragan_220mm", + "SPH_2S19_Msta_152mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ "Paratrooper_AKS", - "Infantry_Soldier_Rus", + "Infantry_AK_74_Rus", "Paratrooper_RPG_16", - "_2B11_mortar", - "SAM_SA_18_Igla_S_MANPADS" + "Mortar_2B11_120mm", + "MANPADS_SA_18_Igla_S_Grouse" ], "air_defenses": [ "SA2Generator", @@ -78,10 +78,10 @@ "helicopter_carrier_names": [ ], "destroyers": [ - "FF_1135M_Rezky" + "Frigate_1135M_Rezky" ], "cruisers": [ - "FSG_1241_1MP_Molniya" + "Corvette_1241_1_Molniya" ], "requirements": {}, "carrier_names": [ diff --git a/resources/factions/russia_2010.json b/resources/factions/russia_2010.json index 13e2fbe9..1d9ccf97 100644 --- a/resources/factions/russia_2010.json +++ b/resources/factions/russia_2010.json @@ -38,22 +38,22 @@ "MBT_T_90", "MBT_T_80U", "MBT_T_72B3", - "SAM_SA_19_Tunguska_2S6" + "SAM_SA_19_Tunguska_Grison" ], "artillery_units": [ - "MLRS_9K57_Uragan_BM_27", - "SPH_2S19_Msta" + "MLRS_BM_27_Uragan_220mm", + "SPH_2S19_Msta_152mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ "Paratrooper_AKS", - "Infantry_Soldier_Rus", + "Infantry_AK_74_Rus", "Paratrooper_RPG_16", - "_2B11_mortar", - "SAM_SA_18_Igla_MANPADS" + "Mortar_2B11_120mm", + "MANPADS_SA_18_Igla_Grouse" ], "air_defenses": [ "SA8Generator", @@ -81,10 +81,10 @@ "helicopter_carrier_names": [ ], "destroyers": [ - "FF_1135M_Rezky" + "Frigate_1135M_Rezky" ], "cruisers": [ - "FSG_1241_1MP_Molniya" + "Corvette_1241_1_Molniya" ], "requirements": {}, "carrier_names": [ diff --git a/resources/factions/russia_2010_hds.json b/resources/factions/russia_2010_hds.json index 7e632c5f..751bf335 100644 --- a/resources/factions/russia_2010_hds.json +++ b/resources/factions/russia_2010_hds.json @@ -38,22 +38,22 @@ "MBT_T_90", "MBT_T_80U", "MBT_T_72B3", - "SAM_SA_19_Tunguska_2S6" + "SAM_SA_19_Tunguska_Grison" ], "artillery_units": [ - "MLRS_9K57_Uragan_BM_27", - "SPH_2S19_Msta" + "MLRS_BM_27_Uragan_220mm", + "SPH_2S19_Msta_152mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ "Paratrooper_AKS", - "Infantry_Soldier_Rus", + "Infantry_AK_74_Rus", "Paratrooper_RPG_16", - "_2B11_mortar", - "SAM_SA_18_Igla_MANPADS" + "Mortar_2B11_120mm", + "MANPADS_SA_18_Igla_Grouse" ], "air_defenses": [ "SA17Generator", @@ -78,10 +78,10 @@ "helicopter_carrier_names": [ ], "destroyers": [ - "FF_1135M_Rezky" + "Frigate_1135M_Rezky" ], "cruisers": [ - "FSG_1241_1MP_Molniya" + "Corvette_1241_1_Molniya" ], "requirements": { "High Digit SAMs": "https://github.com/Auranis/HighDigitSAMs/releases"}, "carrier_names": [ diff --git a/resources/factions/russia_2020.json b/resources/factions/russia_2020.json index 730ecbf2..9f134ebe 100644 --- a/resources/factions/russia_2020.json +++ b/resources/factions/russia_2020.json @@ -36,21 +36,21 @@ "MBT_T_90", "MBT_T_80U", "MBT_T_72B", - "SAM_SA_19_Tunguska_2S6" + "SAM_SA_19_Tunguska_Grison" ], "artillery_units": [ - "MLRS_9K57_Uragan_BM_27", - "SPH_2S19_Msta" + "MLRS_BM_27_Uragan_220mm", + "SPH_2S19_Msta_152mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ "Paratrooper_AKS", - "Infantry_Soldier_Rus", + "Infantry_AK_74_Rus", "Paratrooper_RPG_16", - "SAM_SA_18_Igla_S_MANPADS" + "MANPADS_SA_18_Igla_S_Grouse" ], "air_defenses": [ "SA8Generator", @@ -77,10 +77,10 @@ "helicopter_carrier_names": [ ], "destroyers": [ - "FF_1135M_Rezky" + "Frigate_1135M_Rezky" ], "cruisers": [ - "FSG_1241_1MP_Molniya" + "Corvette_1241_1_Molniya" ], "requirements": { "SU-57 Felon By CubanAce Simulations": "https://www.digitalcombatsimulator.com/fr/files/2539621/" diff --git a/resources/factions/soviet_union_1943.json b/resources/factions/soviet_union_1943.json index 3b0bb9a5..3be02dd0 100644 --- a/resources/factions/soviet_union_1943.json +++ b/resources/factions/soviet_union_1943.json @@ -9,17 +9,17 @@ ], "frontline_units": [ "MT_M4_Sherman", - "APC_M2A1", - "Daimler_Armoured_Car", + "APC_M2A1_Halftrack", + "Car_Daimler_Armored", "LT_Mk_VII_Tetrarch", - "AAA_Bofors_40mm" + "AAA_40mm_Bofors" ], "artillery_units": [ - "MLRS_BM_21_Grad" + "MLRS_BM_21_Grad_122mm" ], "logistics_units": [ - "Bedford_MWD", - "CCKW_353" + "Truck_Bedford", + "Truck_GMC_Jimmy_6x6_Truck" ], "infantry_units": [ "Infantry_SMLE_No_4_Mk_1" diff --git a/resources/factions/spain_1990.json b/resources/factions/spain_1990.json index b736b672..344ea866 100644 --- a/resources/factions/spain_1990.json +++ b/resources/factions/spain_1990.json @@ -21,16 +21,16 @@ "MBT_M60A3_Patton", "MBT_Leopard_2", "APC_M113", - "SAM_Avenger_M1097" + "SAM_Avenger__Stinger" ], "artillery_units": [ ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Infantry_M249" ], "air_defenses": [ "AvengerGenerator", @@ -48,10 +48,10 @@ "LHA_1_Tarawa" ], "destroyers": [ - "Oliver_Hazzard_Perry_class" + "FFG_Oliver_Hazzard_Perry" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "requirements": {}, "carrier_names": [ diff --git a/resources/factions/sweden_1970.json b/resources/factions/sweden_1970.json index 41a79c1e..30bcdcb7 100644 --- a/resources/factions/sweden_1970.json +++ b/resources/factions/sweden_1970.json @@ -16,19 +16,19 @@ "KC130" ], "frontline_units": [ - "IFV_MCV_80", + "IFV_Warrior", "MBT_Leopard_2", - "APC_M1126_Stryker_ICV", + "IFV_M1126_Stryker_ICV", "SAM_Chaparral_M48" ], "artillery_units": [ ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Infantry_M249" ], "air_defenses": [ "ChaparralGenerator", diff --git a/resources/factions/sweden_1990.json b/resources/factions/sweden_1990.json index e6c20950..2ea024b9 100644 --- a/resources/factions/sweden_1990.json +++ b/resources/factions/sweden_1990.json @@ -15,20 +15,20 @@ "KC130" ], "frontline_units": [ - "IFV_MCV_80", + "IFV_Warrior", "MBT_Leopard_2", - "APC_M1126_Stryker_ICV", - "SAM_Avenger_M1097" + "IFV_M1126_Stryker_ICV", + "SAM_Avenger__Stinger" ], "artillery_units": [ ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "Stinger_MANPADS" + "Infantry_M249", + "MANPADS_Stinger" ], "air_defenses": [ "AvengerGenerator", diff --git a/resources/factions/syria_1948.json b/resources/factions/syria_1948.json index 3ff2e29d..79cd7438 100644 --- a/resources/factions/syria_1948.json +++ b/resources/factions/syria_1948.json @@ -8,17 +8,17 @@ "SpitfireLFMkIXCW" ], "frontline_units": [ - "AC_Sd_Kfz_234_2_Puma", - "APC_Sd_Kfz_251", - "MT_Pz_Kpfw_IV_Ausf_H", + "IFV_Sd_Kfz_234_2_Puma", + "APC_Sd_Kfz_251_Halftrack", + "MT_PzIV_H", "MT_M4_Sherman", - "AAA_Bofors_40mm" + "AAA_40mm_Bofors" ], "artillery_units": [ ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ "Infantry_SMLE_No_4_Mk_1" diff --git a/resources/factions/syria_1967.json b/resources/factions/syria_1967.json index b84c590f..b2e93159 100644 --- a/resources/factions/syria_1967.json +++ b/resources/factions/syria_1967.json @@ -17,23 +17,24 @@ "IL_78M" ], "frontline_units": [ - "ARV_BRDM_2", - "MT_Pz_Kpfw_IV_Ausf_H", + "IFV_BRDM_2", + "MT_PzIV_H", "MBT_T_55", - "AAA_ZU_23_on_Ural_375", - "AAA_ZSU_57_2" + "SPAAA_ZU_23_2_Mounted_Ural_375", + "SPAAA_ZSU_57_2", + "AAA_S_60_57mm" ], "artillery_units": [ - "MLRS_BM_21_Grad" + "MLRS_BM_21_Grad_122mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ "Paratrooper_AKS", - "Infantry_Soldier_Rus", - "Soldier_RPG" + "Infantry_AK_74_Rus", + "Infantry_RPG" ], "air_defenses": [ "SA2Generator", diff --git a/resources/factions/syria_1967_with_ww2_weapons.json b/resources/factions/syria_1967_with_ww2_weapons.json index 46b6bb34..34fbaf1d 100644 --- a/resources/factions/syria_1967_with_ww2_weapons.json +++ b/resources/factions/syria_1967_with_ww2_weapons.json @@ -18,24 +18,25 @@ "IL_78M" ], "frontline_units": [ - "ARV_BRDM_2", + "IFV_BRDM_2", "MBT_T_55", - "MT_Pz_Kpfw_IV_Ausf_H", - "StuG_III_Ausf__G", - "TD_Jagdpanzer_IV", - "AAA_ZSU_57_2" + "MT_PzIV_H", + "SPG_StuG_III_Ausf__G", + "SPG_Jagdpanzer_IV", + "SPAAA_ZSU_57_2", + "AAA_S_60_57mm" ], "artillery_units": [ - "MLRS_BM_21_Grad" + "MLRS_BM_21_Grad_122mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ "Paratrooper_AKS", - "Infantry_Soldier_Rus", - "Soldier_RPG" + "Infantry_AK_74_Rus", + "Infantry_RPG" ], "air_defenses": [ "EarlyColdWarFlakGenerator", diff --git a/resources/factions/syria_1973.json b/resources/factions/syria_1973.json index 83af1f67..302283fe 100644 --- a/resources/factions/syria_1973.json +++ b/resources/factions/syria_1973.json @@ -20,20 +20,21 @@ "IFV_BMP_1", "APC_MTLB", "MBT_T_55", - "AAA_ZU_23_on_Ural_375", - "AAA_ZSU_57_2" + "SPAAA_ZU_23_2_Mounted_Ural_375", + "SPAAA_ZSU_57_2", + "AAA_S_60_57mm" ], "artillery_units": [ - "MLRS_BM_21_Grad" + "MLRS_BM_21_Grad_122mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ "Paratrooper_AKS", - "Infantry_Soldier_Rus", - "Soldier_RPG" + "Infantry_AK_74_Rus", + "Infantry_RPG" ], "air_defenses": [ "EarlyColdWarFlakGenerator", diff --git a/resources/factions/syria_1982.json b/resources/factions/syria_1982.json index ab74b0de..d8beda8e 100644 --- a/resources/factions/syria_1982.json +++ b/resources/factions/syria_1982.json @@ -22,19 +22,20 @@ "APC_MTLB", "MBT_T_55", "MBT_T_72B", - "AAA_ZU_23_on_Ural_375", - "AAA_ZSU_57_2" + "SPAAA_ZU_23_2_Mounted_Ural_375", + "SPAAA_ZSU_57_2", + "AAA_S_60_57mm" ], "artillery_units": [ - "MLRS_BM_21_Grad" + "MLRS_BM_21_Grad_122mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ "Paratrooper_AKS", - "Infantry_Soldier_Rus", + "Infantry_AK_74_Rus", "Paratrooper_RPG_16" ], "air_defenses": [ diff --git a/resources/factions/syria_2011.json b/resources/factions/syria_2011.json index 25d94f56..ae2211a5 100644 --- a/resources/factions/syria_2011.json +++ b/resources/factions/syria_2011.json @@ -26,29 +26,29 @@ "IFV_BMP_1", "IFV_BMP_2", "APC_BTR_80", - "ARV_BRDM_2", + "IFV_BRDM_2", "APC_MTLB", - "APC_Cobra", + "APC_Cobra__Scout", "MBT_T_55", "MBT_T_72B", "MBT_T_90", - "AAA_ZSU_57_2" + "SPAAA_ZSU_57_2" ], "artillery_units": [ - "MLRS_9K57_Uragan_BM_27", - "SPH_2S9_Nona", - "MLRS_BM_21_Grad", - "SPH_2S1_Gvozdika" + "MLRS_BM_27_Uragan_220mm", + "SPH_2S9_Nona_120mm_M", + "MLRS_BM_21_Grad_122mm", + "SPH_2S1_Gvozdika_122mm" ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ "Paratrooper_AKS", - "Infantry_Soldier_Rus", + "Infantry_AK_74_Rus", "Paratrooper_RPG_16", - "SAM_SA_18_Igla_S_MANPADS" + "MANPADS_SA_18_Igla_S_Grouse" ], "air_defenses": [ "ColdWarFlakGenerator", diff --git a/resources/factions/turkey_2005.json b/resources/factions/turkey_2005.json index 4aad1c46..f5c7847c 100644 --- a/resources/factions/turkey_2005.json +++ b/resources/factions/turkey_2005.json @@ -20,21 +20,21 @@ "MBT_Leopard_2", "MBT_Leopard_1A3", "MBT_M60A3_Patton", - "APC_Cobra", + "APC_Cobra__Scout", "APC_BTR_80", - "SAM_Avenger_M1097" + "SAM_Avenger__Stinger" ], "artillery_units": [ - "SPH_M109_Paladin" + "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", + "Infantry_M249", "Paratrooper_AKS", - "SAM_SA_18_Igla_S_MANPADS" + "MANPADS_SA_18_Igla_S_Grouse" ], "air_defenses": [ "AvengerGenerator", diff --git a/resources/factions/uae_2005.json b/resources/factions/uae_2005.json index bff684e0..265e2dfb 100644 --- a/resources/factions/uae_2005.json +++ b/resources/factions/uae_2005.json @@ -18,18 +18,18 @@ ], "frontline_units": [ "MBT_Leclerc", - "TPz_Fuchs", + "APC_TPz_Fuchs", "IFV_BMP_3" ], "artillery_units": [ ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "SAM_SA_18_Igla_S_MANPADS" + "Infantry_M249", + "MANPADS_SA_18_Igla_S_Grouse" ], "air_defenses": [ "HawkGenerator", diff --git a/resources/factions/uk_1944.json b/resources/factions/uk_1944.json index 418e2d79..32f44303 100644 --- a/resources/factions/uk_1944.json +++ b/resources/factions/uk_1944.json @@ -17,19 +17,19 @@ "frontline_units": [ "MT_M4A4_Sherman_Firefly", "MT_M4_Sherman", - "APC_M2A1", + "APC_M2A1_Halftrack", "CT_Cromwell_IV", "CT_Centaur_IV", "HIT_Churchill_VII", - "Daimler_Armoured_Car", + "Car_Daimler_Armored", "LT_Mk_VII_Tetrarch", - "AAA_Bofors_40mm" + "AAA_40mm_Bofors" ], "artillery_units": [ ], "logistics_units": [ - "Bedford_MWD", - "CCKW_353" + "Truck_Bedford", + "Truck_GMC_Jimmy_6x6_Truck" ], "infantry_units": [ "Infantry_SMLE_No_4_Mk_1" diff --git a/resources/factions/uk_1990.json b/resources/factions/uk_1990.json index 2522d20b..9f88bb79 100644 --- a/resources/factions/uk_1990.json +++ b/resources/factions/uk_1990.json @@ -19,23 +19,23 @@ ], "frontline_units": [ "MBT_Challenger_II", - "IFV_MCV_80", - "APC_M1043_HMMWV_Armament", - "ATGM_M1045_HMMWV_TOW", - "SAM_Avenger_M1097" + "IFV_Warrior", + "APC_HMMWV__Scout", + "ATGM_HMMWV", + "SAM_Avenger__Stinger" ], "artillery_units": [ - "MLRS_M270", - "SPH_M109_Paladin" + "MLRS_M270_227mm", + "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "_2B11_mortar", - "Stinger_MANPADS" + "Infantry_M249", + "Mortar_2B11_120mm", + "MANPADS_Stinger" ], "air_defenses": [ "AvengerGenerator", @@ -52,10 +52,10 @@ "LHA_1_Tarawa" ], "destroyers": [ - "Oliver_Hazzard_Perry_class" + "FFG_Oliver_Hazzard_Perry" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "requirements": {}, "carrier_names": [ diff --git a/resources/factions/ukraine_2010.json b/resources/factions/ukraine_2010.json index b92f90c6..9ecceb81 100644 --- a/resources/factions/ukraine_2010.json +++ b/resources/factions/ukraine_2010.json @@ -20,25 +20,25 @@ "IL_78M" ], "frontline_units": [ - "APC_M1043_HMMWV_Armament", + "APC_HMMWV__Scout", "IFV_BMP_3", "IFV_BMP_2", "APC_BTR_80", "MBT_T_80U", "MBT_T_72B", - "SAM_SA_13_Strela_10M3_9A35M3" + "SAM_SA_13_Strela_10M3_Gopher_TEL" ], "artillery_units": [ ], "logistics_units": [ - "Transport_Ural_375", - "Transport_UAZ_469" + "Truck_Ural_375", + "LUV_UAZ_469_Jeep" ], "infantry_units": [ "Paratrooper_AKS", - "Infantry_Soldier_Rus", + "Infantry_AK_74_Rus", "Paratrooper_RPG_16", - "SAM_SA_18_Igla_S_MANPADS" + "MANPADS_SA_18_Igla_S_Grouse" ], "air_defenses": [ "SA3Generator", diff --git a/resources/factions/unc_1950_fictional.json b/resources/factions/unc_1950_fictional.json new file mode 100644 index 00000000..dae56d1f --- /dev/null +++ b/resources/factions/unc_1950_fictional.json @@ -0,0 +1,41 @@ +{ + "country": "USA", + "name": "United Nations Command 1950, fictional", + "authors": "BenBenBeartrax", + "description": "

Fictional United Nations Command around 1955 during the Korean War, with some WW2 planes added in place of their post-war counterparts.

", + "aircrafts": [ + "F_86F_Sabre", + "P_51D", + "P_51D_30_NA", + "B_17G", + "A_20G", + "P_47D_40" + ], + "frontline_units": [ + "MT_M4_Sherman", + "MBT_M60A3_Patton", + "APC_M2A1_Halftrack", + "Car_M8_Greyhound_Armored", + "AAA_40mm_Bofors" + ], + "artillery_units": [ + "SPG_M12_GMC_155mm" + ], + "logistics_units": [ + "Truck_M818_6x6" + ], + "infantry_units": [ + "Infantry_M4" + ], + "air_defenses": [ + "AllyWW2FlakGenerator", + "BoforsGenerator", + "EarlyColdWarFlakGenerator" + ], + "has_jtac": false, + "doctrine": "ww2", + "building_set": "ww2ally", + "requirements": { + "WW2 Asset Pack": "https://www.digitalcombatsimulator.com/en/products/other/wwii_assets_pack/" + } +} \ No newline at end of file diff --git a/resources/factions/us_aggressors.json b/resources/factions/us_aggressors.json index 31595c5f..ef43854b 100644 --- a/resources/factions/us_aggressors.json +++ b/resources/factions/us_aggressors.json @@ -22,7 +22,8 @@ "Su_27" ], "awacs": [ - "E_3A" + "E_3A", + "E_2C" ], "tankers": [ "KC_135", @@ -31,22 +32,22 @@ "frontline_units": [ "MBT_M1A2_Abrams", "MBT_Leopard_2", - "ATGM_M1134_Stryker", + "ATGM_Stryker", "IFV_M2A2_Bradley", "IFV_LAV_25", - "APC_M1043_HMMWV_Armament", - "SAM_Avenger_M1097" + "APC_HMMWV__Scout", + "SAM_Avenger__Stinger" ], "artillery_units": [ - "MLRS_M270", - "SPH_M109_Paladin" + "MLRS_M270_227mm", + "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Infantry_M249" ], "air_defenses": [ "AvengerGenerator", diff --git a/resources/factions/usa_1944.json b/resources/factions/usa_1944.json index bdece25a..7b846324 100644 --- a/resources/factions/usa_1944.json +++ b/resources/factions/usa_1944.json @@ -16,16 +16,16 @@ "frontline_units": [ "MT_M4A4_Sherman_Firefly", "MT_M4_Sherman", - "APC_M2A1", - "LAC_M8_Greyhound", - "TD_M10_GMC", - "AA_gun_QF_3_7" + "APC_M2A1_Halftrack", + "Car_M8_Greyhound_Armored", + "SPG_M10_GMC", + "AAA_QF_3_7" ], "artillery_units": [ - "M12_GMC" + "SPG_M12_GMC_155mm" ], "logistics_units": [ - "CCKW_353" + "Truck_GMC_Jimmy_6x6_Truck" ], "infantry_units": [ "Infantry_M1_Garand" diff --git a/resources/factions/usa_1955.json b/resources/factions/usa_1955.json index 1c2a1ec8..df202d6a 100644 --- a/resources/factions/usa_1955.json +++ b/resources/factions/usa_1955.json @@ -12,14 +12,14 @@ "frontline_units": [ "MT_M4_Sherman", "MBT_M60A3_Patton", - "APC_M2A1", - "AAA_Bofors_40mm" + "APC_M2A1_Halftrack", + "AAA_40mm_Bofors" ], "artillery_units": [ - "M12_GMC" + "SPG_M12_GMC_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4" diff --git a/resources/factions/usa_1960.json b/resources/factions/usa_1960.json index e9d7c4c7..0548300f 100644 --- a/resources/factions/usa_1960.json +++ b/resources/factions/usa_1960.json @@ -13,12 +13,12 @@ "frontline_units": [ "MBT_M60A3_Patton", "APC_M113", - "AAA_Vulcan_M163" + "SPAAA_Vulcan_M163" ], "artillery_units": [ ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4" diff --git a/resources/factions/usa_1965.json b/resources/factions/usa_1965.json index e107e90a..e252c371 100644 --- a/resources/factions/usa_1965.json +++ b/resources/factions/usa_1965.json @@ -15,17 +15,17 @@ "frontline_units": [ "MBT_M60A3_Patton", "APC_M113", - "AAA_Vulcan_M163" + "SPAAA_Vulcan_M163" ], "artillery_units": [ - "SPH_M109_Paladin" + "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Infantry_M249" ], "air_defenses": [ "ChaparralGenerator", diff --git a/resources/factions/usa_1975.json b/resources/factions/usa_1975.json index 13093f04..c1e894bb 100644 --- a/resources/factions/usa_1975.json +++ b/resources/factions/usa_1975.json @@ -18,17 +18,17 @@ "MBT_M60A3_Patton", "APC_M113", "SAM_Chaparral_M48", - "AAA_Vulcan_M163" + "SPAAA_Vulcan_M163" ], "artillery_units": [ - "SPH_M109_Paladin" + "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Infantry_M249" ], "air_defenses": [ "ChaparralGenerator", diff --git a/resources/factions/usa_1990.json b/resources/factions/usa_1990.json index f33fbdb1..b9c203ea 100644 --- a/resources/factions/usa_1990.json +++ b/resources/factions/usa_1990.json @@ -21,7 +21,8 @@ "F_117A" ], "awacs": [ - "E_3A" + "E_3A", + "E_2C" ], "tankers": [ "KC_135", @@ -29,26 +30,26 @@ ], "frontline_units": [ "MBT_M1A2_Abrams", - "ATGM_M1134_Stryker", - "APC_M1126_Stryker_ICV", + "ATGM_Stryker", + "IFV_M1126_Stryker_ICV", "IFV_M2A2_Bradley", "IFV_LAV_25", - "APC_M1043_HMMWV_Armament", - "ATGM_M1045_HMMWV_TOW", - "SAM_Avenger_M1097" + "APC_HMMWV__Scout", + "ATGM_HMMWV", + "SAM_Avenger__Stinger" ], "artillery_units": [ - "MLRS_M270", - "SPH_M109_Paladin" + "MLRS_M270_227mm", + "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "Stinger_MANPADS", - "_2B11_mortar" + "Infantry_M249", + "MANPADS_Stinger", + "Mortar_2B11_120mm" ], "air_defenses": [ "AvengerGenerator", @@ -66,11 +67,11 @@ "LHA_1_Tarawa" ], "destroyers": [ - "Oliver_Hazzard_Perry_class", - "USS_Arleigh_Burke_IIa" + "FFG_Oliver_Hazzard_Perry", + "DDG_Arleigh_Burke_IIa" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "requirements": {}, "carrier_names": [ diff --git a/resources/factions/usa_2005.json b/resources/factions/usa_2005.json index f7a5f912..50255813 100644 --- a/resources/factions/usa_2005.json +++ b/resources/factions/usa_2005.json @@ -21,7 +21,8 @@ "B_1B" ], "awacs": [ - "E_3A" + "E_3A", + "E_2C" ], "tankers": [ "KC_135", @@ -29,28 +30,28 @@ ], "frontline_units": [ "MBT_M1A2_Abrams", - "ATGM_M1134_Stryker", - "APC_M1126_Stryker_ICV", + "ATGM_Stryker", + "IFV_M1126_Stryker_ICV", "IFV_M2A2_Bradley", "IFV_LAV_25", - "APC_M1043_HMMWV_Armament", - "ATGM_M1045_HMMWV_TOW", - "SAM_Avenger_M1097", - "SAM_Linebacker_M6", - "SPG_M1128_Stryker_MGS" + "APC_HMMWV__Scout", + "ATGM_HMMWV", + "SAM_Avenger__Stinger", + "SAM_Linebacker___Bradley_M6", + "SPG_Stryker_MGS" ], "artillery_units": [ - "MLRS_M270", - "SPH_M109_Paladin" + "MLRS_M270_227mm", + "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "Stinger_MANPADS", - "_2B11_mortar" + "Infantry_M249", + "MANPADS_Stinger", + "Mortar_2B11_120mm" ], "air_defenses": [ "AvengerGenerator", @@ -67,10 +68,10 @@ "LHA_1_Tarawa" ], "destroyers": [ - "USS_Arleigh_Burke_IIa" + "DDG_Arleigh_Burke_IIa" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "requirements": {}, "carrier_names": [ diff --git a/resources/factions/usa_2005_c130.json b/resources/factions/usa_2005_c130.json index 8164ec23..9546bd55 100644 --- a/resources/factions/usa_2005_c130.json +++ b/resources/factions/usa_2005_c130.json @@ -22,7 +22,8 @@ "Hercules" ], "awacs": [ - "E_3A" + "E_3A", + "E_2C" ], "tankers": [ "KC_135", @@ -30,27 +31,27 @@ ], "frontline_units": [ "MBT_M1A2_Abrams", - "ATGM_M1134_Stryker", - "APC_M1126_Stryker_ICV", + "ATGM_Stryker", + "IFV_M1126_Stryker_ICV", "IFV_M2A2_Bradley", "IFV_LAV_25", - "APC_M1043_HMMWV_Armament", - "ATGM_M1045_HMMWV_TOW", - "SAM_Avenger_M1097", - "SAM_Linebacker_M6" + "APC_HMMWV__Scout", + "ATGM_HMMWV", + "SAM_Avenger__Stinger", + "SAM_Linebacker___Bradley_M6" ], "artillery_units": [ - "MLRS_M270", - "SPH_M109_Paladin" + "MLRS_M270_227mm", + "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "Stinger_MANPADS", - "_2B11_mortar" + "Infantry_M249", + "MANPADS_Stinger", + "Mortar_2B11_120mm" ], "air_defenses": [ "AvengerGenerator", @@ -67,10 +68,10 @@ "LHA_1_Tarawa" ], "destroyers": [ - "USS_Arleigh_Burke_IIa" + "DDG_Arleigh_Burke_IIa" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "requirements": { "C-130J-30 Super Hercules Mod by Anubis": "https://forums.eagle.ru/topic/252075-dcs-super-hercules-mod-by-anubis/" diff --git a/resources/factions/usa_2005_modded.json b/resources/factions/usa_2005_modded.json index e71f74a1..cc8ca114 100644 --- a/resources/factions/usa_2005_modded.json +++ b/resources/factions/usa_2005_modded.json @@ -22,7 +22,8 @@ "F_22A" ], "awacs": [ - "E_3A" + "E_3A", + "E_2C" ], "tankers": [ "KC_135", @@ -30,27 +31,27 @@ ], "frontline_units": [ "MBT_M1A2_Abrams", - "ATGM_M1134_Stryker", - "APC_M1126_Stryker_ICV", + "ATGM_Stryker", + "IFV_M1126_Stryker_ICV", "IFV_M2A2_Bradley", "IFV_LAV_25", - "APC_M1043_HMMWV_Armament", - "ATGM_M1045_HMMWV_TOW", - "SAM_Avenger_M1097", - "SAM_Linebacker_M6" + "APC_HMMWV__Scout", + "ATGM_HMMWV", + "SAM_Avenger__Stinger", + "SAM_Linebacker___Bradley_M6" ], "artillery_units": [ - "MLRS_M270", - "SPH_M109_Paladin" + "MLRS_M270_227mm", + "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "Stinger_MANPADS", - "_2B11_mortar" + "Infantry_M249", + "MANPADS_Stinger", + "Mortar_2B11_120mm" ], "air_defenses": [ "AvengerGenerator", @@ -68,10 +69,10 @@ "LHA_1_Tarawa" ], "destroyers": [ - "USS_Arleigh_Burke_IIa" + "DDG_Arleigh_Burke_IIa" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "carrier_names": [ "CVN-71 Theodore Roosevelt", diff --git a/resources/factions/usn_1985.json b/resources/factions/usn_1985.json index 08230c1d..0f65fcb6 100644 --- a/resources/factions/usn_1985.json +++ b/resources/factions/usn_1985.json @@ -21,21 +21,21 @@ "frontline_units": [ "MBT_M60A3_Patton", "APC_M113", - "APC_M1025_HMMWV", - "AAA_Vulcan_M163" + "APC_HMMWV__Scout", + "SPAAA_Vulcan_M163" ], "artillery_units": [ - "SPH_M109_Paladin", - "MLRS_M270" + "SPH_M109_Paladin_155mm", + "MLRS_M270_227mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249", - "_2B11_mortar", - "Stinger_MANPADS" + "Infantry_M249", + "Mortar_2B11_120mm", + "MANPADS_Stinger" ], "air_defenses": [ "ChaparralGenerator", @@ -49,10 +49,10 @@ "LHA_1_Tarawa" ], "destroyers": [ - "Oliver_Hazzard_Perry_class" + "FFG_Oliver_Hazzard_Perry" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "carrier_names": [ "CVN-71 Theodore Roosevelt", diff --git a/resources/plugins/lotatc/LotAtcExport-config.lua b/resources/plugins/lotatc/LotAtcExport-config.lua new file mode 100644 index 00000000..494be5f1 --- /dev/null +++ b/resources/plugins/lotatc/LotAtcExport-config.lua @@ -0,0 +1,58 @@ +------------------------------------------------------------------------------------------------------------------------------------------------------------- +-- configuration file for the LotATC Export script +-- +-- This configuration is tailored for a mission generated by DCS Liberation +-- see https://github.com/Khopa/dcs_liberation +------------------------------------------------------------------------------------------------------------------------------------------------------------- + +-- LotATC Export plugin - configuration +logger:info("DCSLiberation|LotATC Export plugin - configuration") + +local function discoverLotAtcDrawingsPath() + -- establish a search pattern into the following modes + -- 1. Environment variable LOTATC_DRAWINGS_DIR, to support server exporting with auto load from LotATC + -- 2. DCS saved games folder as configured in DCS Liberation + + local drawingEnvDir = os.getenv("LOTATC_DRAWINGS_DIR") + if drawingEnvDir then + return drawingEnvDir + else + return lfs.writedir()..[[\Mods\services\LotAtc\userdb\drawings\]] + end +end + +if dcsLiberation then + logger:info("DCSLiberation|LotATC Export plugin - configuration dcsLiberation") + + local exportRedAA = true + local exportBlueAA = false + local exportSymbols = true + + -- retrieve specific options values + if dcsLiberation.plugins then + logger:info("DCSLiberation|LotATC Export plugin - configuration dcsLiberation.plugins") + + if dcsLiberation.plugins.lotatc then + logger:info("DCSLiberation|LotATC Export plugin - dcsLiberation.plugins.lotatcExport") + + exportRedAA = dcsLiberation.plugins.lotatc.exportRedAA + logger:info(string.format("DCSLiberation|LotATC Export plugin - exportRedAA = %s",tostring(exportRedAA))) + + exportBlueAA = dcsLiberation.plugins.lotatc.exportBlueAA + logger:info(string.format("DCSLiberation|LotATC Export plugin - exportBlueAA = %s",tostring(exportBlueAA))) + + exportBlueAA = dcsLiberation.plugins.lotatc.exportSymbols + logger:info(string.format("DCSLiberation|LotATC Export plugin - exportSymbols = %s",tostring(exportSymbols))) + end + end + + -- actual configuration code + if LotAtcExportConfig then + LotAtcExportConfig.exportRedAA = exportRedAA + LotAtcExportConfig.exportBlueAA = exportBlueAA + LotAtcExportConfig.exportSymbols = exportSymbols + LotAtcExportConfig.drawingBasePath = discoverLotAtcDrawingsPath() + + LotatcExport() + end +end diff --git a/resources/plugins/lotatc/LotAtcExport.lua b/resources/plugins/lotatc/LotAtcExport.lua new file mode 100644 index 00000000..c4785243 --- /dev/null +++ b/resources/plugins/lotatc/LotAtcExport.lua @@ -0,0 +1,253 @@ +--[[ +Export script for LotATC drawings + +Allows to export certain DCS Liberation objects as predefined drawing in LotATC. + +This script runs at mission startup and generates a drawing JSON file to be imported +in LotATC. +]] + +LotAtcExportConfig = { + ["exportRedAA"] = false, + ["exportBlueAA"] = false, + ["exportSymbols"] = false, + ["exportVersion"] = "2.2.0", + ["drawingBasePath"] = nil, + ["redColor"] = "#7FE32000", + ["blueColor"] = "#7F0084FF" +} + +local function factionName(isFriend) + if isFriend then + return "BLUE" + else + return "RED" + end +end + +local function uuid() + local random = math.random + local template ='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx' + return string.gsub(template, '[xy]', function (c) + local v = (c == 'x') and random(0, 0xf) or random(8, 0xb) + return string.format('%x', v) + end) +end + +local function ends_with(str, ending) + return ending == "" or str:sub(-#ending) == ending + end + +local function combine(path1, path2) + if not ends_with(path1, "\\") then + path1 = path1 .. "\\" + end + + return path1 .. path2 +end + +local function lotatcExport_get_aa_nato_name(unit, isFriend) + if not redIADS or not blueIADS then + return nil + end + + -- logger:info(string.format("DCSLiberation|LotATC Export plugin - try get NATO name for unit %s", unit.dcsGroupName)) + + local iads = redIADS + if isFriend then + iads = blueIADS + end + + local samSite = iads:getSAMSiteByGroupName(unit.dcsGroupName) + if samSite and samSite.natoName then + -- logger:info(string.format("DCSLiberation|LotATC Export plugin - NATO name is %s", samSite.natoName)) + return samSite.natoName + else + return nil + end +end + +local function lotatcExport_get_name(unit, isFriend) + local classification = "SAM" + + if string.find(unit.dcsGroupName, "|EWR|", 1, true) then + classification = "EWR" + elseif string.find(unit.dcsGroupName, "|AA", 1, true) then + classification = "AAA" + end + + local natoName = lotatcExport_get_aa_nato_name(unit, isFriend) + + local name = nil + if not natoName then + name = string.format("%s|%s", unit.name, classification) + else + name = string.format("%s|%s|%s", unit.name, classification, natoName) + end + + return name, classification +end + +local function lotatc_write_json(filename, json) + logger:info(string.format("DCSLiberation|LotATC Export plugin - writing %s", filename)) + + local function Write() + local fp = io.open(filename, 'w') + if fp then + fp:write(json) + fp:close() + end + end + + if pcall(Write) then + else + logger:error("Unable to write LotATC export file to %s", filename) + end +end + +local function lotatcExport_threat_circles_for_faction(faction, color, isFriend) + local drawings = {} + + for _,aa in pairs(faction) do + logger:info(string.format("DCSLiberation|LotATC Export plugin - exporting threat circle for %s", aa.dcsGroupName)) + + local convLat, convLon = coord.LOtoLL({x = aa.positionX, y = 0, z = aa.positionY}) + + local name = lotatcExport_get_name(aa, isFriend) + + table.insert(drawings, + { + ["author"] = "DCSLiberation", + ["brushStyle"] = 1, + ["color"] = color, + ["colorBg"] = "#00000000", + ["id"] = string.format("{%s}", uuid()), + ["longitude"] = convLon, + ["latitude"] = convLat, + ["radius"] = tonumber(aa.range), + ["lineWidth"] = 2, + ["name"] = name, + ["shared"] = true, + ["timestamp"] = "", + ["type"] = "circle", + ["text"] = name, + ["font"] = { + ["color"] = color, + ["font"] = "Lato" + } + }) + end + + local lotatcData = { + ["name"] = "Threat Circles " .. factionName(isFriend), + ["enable"] = "true", + ["version"] = LotAtcExportConfig.exportVersion, + ["drawings"] = drawings + } + + local drawings_json = json:encode(lotatcData) + return drawings_json +end + +local function lotatcExport_symbols_for_faction(faction, color, isFriend) + local drawings = {} + + for _,aa in pairs(faction) do + logger:info(string.format("DCSLiberation|LotATC Export plugin - exporting AA symbol for %s", aa.dcsGroupName)) + + local convLat, convLon = coord.LOtoLL({x = aa.positionX, y = 0, z = aa.positionY}) + + local name = lotatcExport_get_name(aa, isFriend) + + local classification = "hostile" + if isFriend then + classification = "friend" + end + + local sub_dimension = "none" + + if string.find(aa.dcsGroupName, "|EWR|", 1, true) then + sub_dimension = "ew" + end + + table.insert(drawings, + { + ["author"] = "DCSLiberation", + ["brushStyle"] = 1, + ["classification"] = { + ["classification"] = classification, + ["dimension"] = "land_unit", + ["sub_dimension"] = sub_dimension + }, + ["color"] = color, + ["colorBg"] = "#33FF0000", + ["font"] = { + ["color"] = color, + ["font"] = "Lato" + }, + ["id"] = string.format("{%s}", uuid()), + ["longitude"] = convLon, + ["latitude"] = convLat, + ["lineWidth"] = 2, + ["name"] = name, + ["shared"] = true, + ["timestamp"] = "", + ["type"] = "symbol", + ["text"] = name + }) + end + + local lotatcData = { + ["name"] = "Threat Symbols " .. factionName(isFriend), + ["enable"] = "true", + ["version"] = LotAtcExportConfig.exportVersion, + ["drawings"] = drawings, + } + + local drawings_json = json:encode(lotatcData) + return drawings_json +end + +local function lotatc_export_faction(faction, color, factionPath, isFriend) + local exportBasePathFaction = combine(LotAtcExportConfig.drawingBasePath, factionPath) + lfs.mkdir(exportBasePathFaction) + + local exportFileName = combine(exportBasePathFaction, "threatZones.json") + local json = lotatcExport_threat_circles_for_faction(faction, color, isFriend) + lotatc_write_json(exportFileName, json) + + if LotAtcExportConfig.exportSymbols then + exportFileName = combine(exportBasePathFaction, "threatSymbols.json") + json = lotatcExport_symbols_for_faction(faction, color, isFriend); + lotatc_write_json(exportFileName, json) + end +end + +function LotatcExport() + + if not json then + local message = "Unable to export LotATC drawings, JSON library is not loaded!" + logger:error(message) + return + end + + if not LotAtcExportConfig.drawingBasePath then + local message = "No writable export path for LotATC drawings. Set environment variable LOTATC_DRAWINGS_DIR pointing to your export path." + logger:error(message) + return + end + + local message = "Export LotATC drawings to "..LotAtcExportConfig.drawingBasePath + logger:info(message) + + -- The RED AA is exported to the blue folder and vice versa. If a BLUE GCI connects he/she + -- wants to see the RED AA. + + if LotAtcExportConfig.exportRedAA then + lotatc_export_faction(dcsLiberation.RedAA, LotAtcExportConfig.redColor, [[blue\]], false) + end + + if LotAtcExportConfig.exportBlueAA then + lotatc_export_faction(dcsLiberation.BlueAA, LotAtcExportConfig.blueColor, [[red\]], true) + end +end diff --git a/resources/plugins/lotatc/plugin.json b/resources/plugins/lotatc/plugin.json new file mode 100644 index 00000000..13af401d --- /dev/null +++ b/resources/plugins/lotatc/plugin.json @@ -0,0 +1,33 @@ +{ + "nameInUI": "LotATC Export", + "defaultValue": false, + "specificOptions": [ + { + "nameInUI": "Export RED AA", + "mnemonic": "exportRedAA", + "defaultValue": true + }, + { + "nameInUI": "Export BLUE AA", + "mnemonic": "exportBlueAA", + "defaultValue": false + }, + { + "nameInUI": "Export AA Symbols", + "mnemonic": "exportSymbols", + "defaultValue": true + } + ], + "scriptsWorkOrders": [ + { + "file": "LotAtcExport.lua", + "mnemonic": "LotAtcExport-script" + } + ], + "configurationWorkOrders": [ + { + "file": "LotAtcExport-config.lua", + "mnemonic": "LotAtcExport-config" + } + ] +} \ No newline at end of file diff --git a/resources/plugins/plugins.json b/resources/plugins/plugins.json index 9b415eea..ba5c338e 100644 --- a/resources/plugins/plugins.json +++ b/resources/plugins/plugins.json @@ -3,5 +3,7 @@ "jtacautolase", "skynetiads", "ewrs", - "herculescargo" + "herculescargo", + "splashdamage", + "lotatc" ] diff --git a/resources/plugins/splashdamage/LICENSE.md b/resources/plugins/splashdamage/LICENSE.md new file mode 100644 index 00000000..29f81d81 --- /dev/null +++ b/resources/plugins/splashdamage/LICENSE.md @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/resources/plugins/splashdamage/SplashDamage.lua b/resources/plugins/splashdamage/SplashDamage.lua new file mode 100644 index 00000000..442cf004 --- /dev/null +++ b/resources/plugins/splashdamage/SplashDamage.lua @@ -0,0 +1,228 @@ +--[[ + +2 October 2020 +FrozenDroid: +- Added error handling to all event handler and scheduled functions. Lua script errors can no longer bring the server down. +- Added some extra checks to which weapons to handle, make sure they actually have a warhead (how come S-8KOM's don't have a warhead field...?) +28 October 2020 +FrozenDroid: +- Uncommented error logging, actually made it an error log which shows a message box on error. +- Fixed the too restrictive weapon filter (took out the HE warhead requirement) +--]] + + +local weaponDamageEnable = 1 +local killRangeMultiplier = 0.3 +local staticDamageRangeMultiplier = 0.1 +local stunRangeMultiplier = 1.0 + +local suppressedGroups = {} +local tracked_weapons = {} +local USearchArray = {} +WpnHandler = {} + +local function getDistance(point1, point2) + + local x1 = point1.x + local y1 = point1.y + local z1 = point1.z + local x2 = point2.x + local y2 = point2.y + local z2 = point2.z + local dX = math.abs(x1-x2) + local dZ = math.abs(z1-z2) + local distance = math.sqrt(dX*dX + dZ*dZ) + + return distance + +end + +local function getDistance3D(point1, point2) + + local x1 = point1.x + local y1 = point1.y + local z1 = point1.z + local x2 = point2.x + local y2 = point2.y + local z2 = point2.z + + local dX = math.abs(x1-x2) + local dY = math.abs(y1-y2) + local dZ = math.abs(z1-z2) + local distance = math.sqrt(dX*dX + dZ*dZ + dY*dY) + + return distance + +end + +local function suppress(suppArray) + + suppressedGroups[suppArray[1]:getName()] = {["SuppGroup"] = suppArray[1], ["SuppTime"] = suppArray[2]} + if suppArray[1]:getController() then + suppArray[1]:getController():setOnOff(false) +-- env.info("Group: "..suppArray[1]:getName().." suppressed") + end + +end + +local function unSuppress(unSuppGroup) +-- env.info("In unSuppress") + if unSuppGroup:isExist() and unSuppGroup:getController() then + unSuppGroup:getController():setOnOff(true) + -- env.info("Got controller") + -- env.info("Suppressed group removed from table") + suppressedGroups[unSuppGroup:getName()] = nil + end +end + +local function ifFoundS(foundItem, impactPoint) +-- trigger.action.outText("Found Static", 10) +-- env.info("Found static in kill range") + local point1 = foundItem:getPoint() + point1.y = point1.y + 2 + local point2 = impactPoint + point2.y = point2.y + 2 + if land.isVisible(point1, point2) == true then +-- env.info("Static"..foundItem:getID().. "Destroyed by script") + trigger.action.explosion(point1, 5) + end +end + +local function ifFoundU(foundItem, USearchArray) + +-- env.info("Found Unit") + local point1 = foundItem:getPoint() +-- env.info("Got point") + point1.y = point1.y + 5 + local point2 = USearchArray.point + point2.y = point2.y + 5 + if land.isVisible(point1, point2) == true then +-- env.info("is visible LOS") + local distanceFrom = getDistance(point1, point2) +-- env.info("got distance: "..distanceFrom) + if distanceFrom < USearchArray.exMass*killRangeMultiplier then + trigger.action.explosion(foundItem:getPoint(), 1) + -- env.info("Unit: "..foundItem:getName().." was destroyed by script") + -- else + -- local suppTimer = math.random(30,100) + -- local suppArray = {foundItem:getGroup(), suppTimer} + -- suppress(suppArray) + end + end + +end + +local function track_wpns() +-- env.info("Weapon Track Start") + for wpn_id_, wpnData in pairs(tracked_weapons) do + + if wpnData.wpn:isExist() then -- just update position and direction. + wpnData.pos = wpnData.wpn:getPosition().p + wpnData.dir = wpnData.wpn:getPosition().x + wpnData.exMass = wpnData.wpn:getDesc().warhead.explosiveMass + --wpnData.lastIP = land.getIP(wpnData.pos, wpnData.dir, 50) + else -- wpn no longer exists, must be dead. +-- trigger.action.outText("Weapon impacted, mass of weapon warhead is " .. wpnData.exMass, 2) + local ip = land.getIP(wpnData.pos, wpnData.dir, 20) -- terrain intersection point with weapon's nose. Only search out 20 meters though. + local impactPoint + if not ip then -- use last calculated IP + impactPoint = wpnData.pos +-- trigger.action.outText("Impact Point:\nPos X: " .. impactPoint.x .. "\nPos Z: " .. impactPoint.z, 2) + else -- use intersection point + impactPoint = ip +-- trigger.action.outText("Impact Point:\nPos X: " .. impactPoint.x .. "\nPos Z: " .. impactPoint.z, 2) + end + local staticRadius = wpnData.exMass*staticDamageRangeMultiplier +-- trigger.action.outText("Static Radius :"..staticRadius, 10) + local VolS = + { + id = world.VolumeType.SPHERE, + params = + { + point = impactPoint, + radius = staticRadius + } + } + local VolU = + { + id = world.VolumeType.SPHERE, + params = + { + point = impactPoint, + radius = wpnData.exMass*stunRangeMultiplier + } + } +-- env.info("Static search radius: " ..wpnData.exMass*staticDamageRangeMultiplier) +-- env.warning("Begin Search") +-- trigger.action.outText("Beginning Searches", 10) + world.searchObjects(Object.Category.STATIC, VolS, ifFoundS,impactPoint) + USearchArray = {["point"] = impactPoint, ["exMass"] = wpnData.exMass} + world.searchObjects(Object.Category.UNIT, VolU, ifFoundU, USearchArray) +-- env.warning("Finished Search") + tracked_weapons[wpn_id_] = nil -- remove from tracked weapons first. + end + end +-- env.info("Weapon Track End") +end + +local function checkSuppression() +-- env.info("Checking suppression") + for i, group in pairs(suppressedGroups) do +-- env.info("Check group exists, #".. i) + if group.SuppGroup:isExist() then +-- env.info("It does") + group.SuppTime = group.SuppTime - 10 + if group.SuppTime < 1 then +-- env.info("SuppTime < 1") + unSuppress(group.SuppGroup) + end + else + suppressedGroups[group.SuppGroup:getName()] = nil + end + end +-- env.info("Ending suppression check") +end + +function onWpnEvent(event) + if event.id == world.event.S_EVENT_SHOT then + if event.weapon then + local ordnance = event.weapon + local weapon_desc = ordnance:getDesc() + if (weapon_desc.category == 3 or weapon_desc.category == 2 or weapon_desc.category == 1) and not (weapon_desc.missileCategory == 1 or weapon_desc.missileCategory == 2 or weapon_desc.missileCategory == 3) and weapon_desc.warhead and weapon_desc.warhead.explosiveMass and event.initiator then + tracked_weapons[event.weapon.id_] = { wpn = ordnance, init = event.initiator:getName(), pos = ordnance:getPoint(), dir = ordnance:getPosition().x, exMass = weapon_desc.warhead.explosiveMass } +-- env.info("Tracking " .. event.initiator:getName()) + end + end + end +end + +function WpnHandler:onEvent(event) + protectedCall(onWpnEvent, event) +end + +function protectedCall(...) + local status, retval = pcall(...) + if not status then + env.error("Splash damage script error... gracefully caught! " .. retval, true) + end +end + +if (weaponDamageEnable == 1) then + timer.scheduleFunction(function() + protectedCall(track_wpns) + return timer.getTime() + 1 + end, + {}, + timer.getTime() + 0.5 + ) + + timer.scheduleFunction(function() + protectedCall(checkSuppression) + return timer.getTime() + 1 + end, + {}, + timer.getTime() + 10 + ) + + world.addEventHandler(WpnHandler) +end diff --git a/resources/plugins/splashdamage/plugin.json b/resources/plugins/splashdamage/plugin.json new file mode 100644 index 00000000..b0953d62 --- /dev/null +++ b/resources/plugins/splashdamage/plugin.json @@ -0,0 +1,12 @@ +{ + "nameInUI": "Splash Damage", + "defaultValue": false, + "specificOptions": [], + "scriptsWorkOrders": [ + { + "file": "SplashDamage.lua", + "mnemonic": "Splash Damage" + } + ], + "configurationWorkOrders": [] +} \ No newline at end of file diff --git a/resources/stylesheets/style-dcs.css b/resources/stylesheets/style-dcs.css index ae829133..22945244 100644 --- a/resources/stylesheets/style-dcs.css +++ b/resources/stylesheets/style-dcs.css @@ -600,4 +600,26 @@ QGroupBox[style="IntelSummary"] QLabel { margin: 0px; font-size: 9px; line-height: 9px; +} + +QCalendarWidget +{ + background-color:#ff0000; + border: 1px solid black; +} + +QCalendarWidget QAbstractItemView +{ + background-color:#699245; + border: 1px solid black; +} + +QCalendarWidget QWidget { + color: #B7C0C6; +} + +QCalendarWidget QTableView{ + border-width: 2px; + background-color:lightgrey; + border: 1px solid black; } \ No newline at end of file diff --git a/resources/tools/generate_frontlines.py b/resources/tools/generate_frontlines.py index c1346bc9..46f429fe 100644 --- a/resources/tools/generate_frontlines.py +++ b/resources/tools/generate_frontlines.py @@ -12,14 +12,17 @@ Terrain = Union[Caucasus, PersianGulf, Syria, Nevada, Normandy, TheChannel] SAVE_PATH = Path("resources/frontlines") + def validate_miz(file_path: Path) -> bool: return bool(file_path.suffix == ".miz" and file_path.exists()) + def validate_airports(airports: Tuple[int], terrain: Terrain): for airport in airports: if terrain.airport_by_id(airport) is None: print(f"Cannot load airport for invalid id {airport}") + def load_files(files) -> List[Mission]: missions = [] for file in files: @@ -31,26 +34,30 @@ def load_files(files) -> List[Mission]: print(f"Error: {file} doesn't look like a valid mission file.") return missions + def create_frontline_dict(mission: Mission) -> Dict[str, Dict]: frontline_dict = {} for group in mission.country("USA").vehicle_group: - groupname = str(group.name).replace(group.name.id, "").replace(":","") + groupname = str(group.name).replace(group.name.id, "").replace(":", "") control_points = groupname.split("|") frontline_dict[groupname] = { "points": [(i.position.x, i.position.y) for i in group.points], - "start_cp": int(control_points[0]) - } + "start_cp": int(control_points[0]), + } return frontline_dict + def process_missions(missions: List[Mission]) -> None: for mission in missions: frontline_dict = create_frontline_dict(mission) write_json(frontline_dict, mission.terrain.name.lower()) + def write_json(frontline_dict: Dict[str, Dict], terrain_name: str) -> None: with open(SAVE_PATH.joinpath(terrain_name + ".json"), "w") as file: json.dump(frontline_dict, file) + if __name__ == "__main__": parser = argparse.ArgumentParser( description="Process a miz file to create json descriptions of multi-segment frontlines" @@ -69,6 +76,3 @@ if __name__ == "__main__": # frontline_dict = create_frontline_dict(missions[0]) print("Done") - - - diff --git a/resources/tools/generate_groundobject_templates.py b/resources/tools/generate_groundobject_templates.py index fce50a0f..6e443aea 100644 --- a/resources/tools/generate_groundobject_templates.py +++ b/resources/tools/generate_groundobject_templates.py @@ -13,7 +13,10 @@ def load_templates(): groups = {} # type: typing.Dict[str, typing.Dict[int, typing.List[Static]]] - for static_group in temp_mis.country("USA").static_group + temp_mis.country("USAF Aggressors").static_group: + for static_group in ( + temp_mis.country("USA").static_group + + temp_mis.country("USAF Aggressors").static_group + ): for static in static_group.units: static_name = str(static.name).split()[0] tpl_name, tpl_idx = static_name[:-1], int(static_name[-1]) @@ -34,13 +37,19 @@ def load_templates(): a = aa b = bb - center = a.position.point_from_heading(a.position.heading_between_point(b.position), dist / 2) + center = a.position.point_from_heading( + a.position.heading_between_point(b.position), dist / 2 + ) for static in static_groups: - tpls[category_name][idx].append({ - "type": static.type, - "offset": Point(center.x - static.position.x, center.y - static.position.y), - "heading": static.heading, - }) + tpls[category_name][idx].append( + { + "type": static.type, + "offset": Point( + center.x - static.position.x, center.y - static.position.y + ), + "heading": static.heading, + } + ) tpls["aa"] = {0: [{"type": "AA", "offset": Point(0, 0), "heading": 0}]} return tpls diff --git a/resources/tools/generate_landmap.py b/resources/tools/generate_landmap.py index a23c7fd1..b61bcc80 100644 --- a/resources/tools/generate_landmap.py +++ b/resources/tools/generate_landmap.py @@ -11,7 +11,8 @@ from game.theater.landmap import Landmap @singledispatch def to_multipoly(obj) -> MultiPolygon: raise NotImplementedError( - f"to_multipoly not implemented for {obj.__class__.__name__}") + f"to_multipoly not implemented for {obj.__class__.__name__}" + ) @to_multipoly.register @@ -28,8 +29,7 @@ def _multipoly_to_multipoly(obj: MultiPolygon) -> MultiPolygon: def _geometry_collection_to_multipoly(obj: GeometryCollection) -> MultiPolygon: if obj.is_empty: return MultiPolygon() - raise RuntimeError( - f"Not sure how to convert collection to multipoly: {obj.wkt}") + raise RuntimeError(f"Not sure how to convert collection to multipoly: {obj.wkt}") for terrain in ["cau", "nev", "syria", "channel", "normandy", "gulf"]: @@ -61,6 +61,11 @@ for terrain in ["cau", "nev", "syria", "channel", "normandy", "gulf"]: with open("../{}landmap.p".format(terrain), "wb") as f: print(len(inclusion_zones), len(exclusion_zones), len(seas_zones)) - pickle.dump(Landmap(to_multipoly(unary_union(inclusion_zones)), - to_multipoly(unary_union(exclusion_zones)), - to_multipoly(unary_union(seas_zones))), f) + pickle.dump( + Landmap( + to_multipoly(unary_union(inclusion_zones)), + to_multipoly(unary_union(exclusion_zones)), + to_multipoly(unary_union(seas_zones)), + ), + f, + ) diff --git a/resources/tools/import_beacons.py b/resources/tools/import_beacons.py index 8e1506ce..9342f9a1 100644 --- a/resources/tools/import_beacons.py +++ b/resources/tools/import_beacons.py @@ -70,13 +70,19 @@ def beacons_from_terrain(dcs_path: Path, path: Path) -> Iterable[Beacon]: with cd(dcs_path): lua = lupa.LuaRuntime() - lua.execute(textwrap.dedent("""\ + lua.execute( + textwrap.dedent( + """\ function module(name) end - """)) + """ + ) + ) - bind_gettext = lua.eval(textwrap.dedent("""\ + bind_gettext = lua.eval( + textwrap.dedent( + """\ function(py_gettext) package.preload["i_18n"] = function() return { @@ -85,16 +91,20 @@ def beacons_from_terrain(dcs_path: Path, path: Path) -> Iterable[Beacon]: end end - """)) + """ + ) + ) try: translator = gettext.translation( - "messages", path / "l10n", languages=["en"]) + "messages", path / "l10n", languages=["en"] + ) def translate(message_name: str) -> str: if not message_name: return message_name return translator.gettext(message_name) + except FileNotFoundError: # TheChannel has no locale data for English. def translate(message_name: str) -> str: @@ -126,7 +136,7 @@ def beacons_from_terrain(dcs_path: Path, path: Path) -> Iterable[Beacon]: beacon["callsign"], beacon_type, convert_lua_frequency(beacon["frequency"]), - getattr(beacon, "channel", None) + getattr(beacon, "channel", None), ) @@ -152,9 +162,10 @@ class Importer: def export_beacons(self, terrain: str, beacons: Iterable[Beacon]) -> None: terrain_py_path = self.export_dir / f"{terrain.lower()}.json" import json - terrain_py_path.write_text(json.dumps([ - dataclasses.asdict(b) for b in beacons - ], indent=True)) + + terrain_py_path.write_text( + json.dumps([dataclasses.asdict(b) for b in beacons], indent=True) + ) def parse_args() -> argparse.Namespace: @@ -169,13 +180,14 @@ def parse_args() -> argparse.Namespace: "--export-to", type=resolved_path, default=EXPORT_DIR, - help="Output directory for generated JSON files.") + help="Output directory for generated JSON files.", + ) parser.add_argument( "dcs_path", metavar="DCS_PATH", type=resolved_path, - help="Path to DCS installation." + help="Path to DCS installation.", ) return parser.parse_args() diff --git a/resources/tools/mkrelease.py b/resources/tools/mkrelease.py index a76029b9..5d70e86d 100644 --- a/resources/tools/mkrelease.py +++ b/resources/tools/mkrelease.py @@ -36,7 +36,13 @@ def _zip_dir(archieve, path): def _mk_archieve(): - path = os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, "build", "dcs_liberation_{}.zip".format(VERSION)) + path = os.path.join( + os.path.dirname(__file__), + os.pardir, + os.pardir, + "build", + "dcs_liberation_{}.zip".format(VERSION), + ) if os.path.exists(path): print("version already exists") return @@ -46,9 +52,9 @@ def _mk_archieve(): except FileNotFoundError: pass os.system("pyinstaller.exe --clean pyinstaller.spec") - #archieve = ZipFile(path, "w") - #archieve.writestr("dcs_liberation.bat", "cd dist\\dcs_liberation\r\nliberation_main \"%UserProfile%\\Saved Games\" \"{}\"".format(VERSION)) - #_zip_dir(archieve, "./dist/dcs_liberation") + # archieve = ZipFile(path, "w") + # archieve.writestr("dcs_liberation.bat", "cd dist\\dcs_liberation\r\nliberation_main \"%UserProfile%\\Saved Games\" \"{}\"".format(VERSION)) + # _zip_dir(archieve, "./dist/dcs_liberation") _mk_archieve() diff --git a/resources/ui/fob.png b/resources/ui/fob.png new file mode 100644 index 00000000..a64ae073 Binary files /dev/null and b/resources/ui/fob.png differ diff --git a/resources/ui/ground_assets/coastal.png b/resources/ui/ground_assets/coastal.png new file mode 100644 index 00000000..6a6740c8 Binary files /dev/null and b/resources/ui/ground_assets/coastal.png differ diff --git a/resources/ui/ground_assets/coastal_blue.png b/resources/ui/ground_assets/coastal_blue.png new file mode 100644 index 00000000..5c9e16b1 Binary files /dev/null and b/resources/ui/ground_assets/coastal_blue.png differ diff --git a/resources/ui/ground_assets/ewr.png b/resources/ui/ground_assets/ewr.png new file mode 100644 index 00000000..1f902ac2 Binary files /dev/null and b/resources/ui/ground_assets/ewr.png differ diff --git a/resources/ui/ground_assets/ewr_blue.png b/resources/ui/ground_assets/ewr_blue.png new file mode 100644 index 00000000..e4b01cc2 Binary files /dev/null and b/resources/ui/ground_assets/ewr_blue.png differ diff --git a/resources/ui/units/aircrafts/banners/E-2C_24.jpg b/resources/ui/units/aircrafts/banners/E-2C_24.jpg new file mode 100644 index 00000000..bf8e8073 Binary files /dev/null and b/resources/ui/units/aircrafts/banners/E-2C_24.jpg differ diff --git a/resources/ui/units/aircrafts/banners/F-22A_24.jpg b/resources/ui/units/aircrafts/banners/F-22A_24.jpg new file mode 100644 index 00000000..15d6071a Binary files /dev/null and b/resources/ui/units/aircrafts/banners/F-22A_24.jpg differ diff --git a/resources/ui/units/aircrafts/icons/F-22A_24.jpg b/resources/ui/units/aircrafts/icons/F-22A_24.jpg new file mode 100644 index 00000000..22df550a Binary files /dev/null and b/resources/ui/units/aircrafts/icons/F-22A_24.jpg differ diff --git a/resources/ui/units/vehicles/icons/PLZ-05_24.jpg b/resources/ui/units/vehicles/icons/PLZ-05_24.jpg new file mode 100644 index 00000000..c10e5fba Binary files /dev/null and b/resources/ui/units/vehicles/icons/PLZ-05_24.jpg differ diff --git a/resources/ui/units/vehicles/icons/S-60_24.jpg b/resources/ui/units/vehicles/icons/S-60_24.jpg new file mode 100644 index 00000000..09a32ea4 Binary files /dev/null and b/resources/ui/units/vehicles/icons/S-60_24.jpg differ diff --git a/resources/units/unit_info_text.json b/resources/units/unit_info_text.json index 11349ea0..93f302d5 100644 --- a/resources/units/unit_info_text.json +++ b/resources/units/unit_info_text.json @@ -156,6 +156,16 @@ "year-of-variant-introduction": "1980" } }], + "E-2C": [{ + "default": { + "name": "E-2C Hawkeye", + "text": "The Northrop Grumman E-2 Hawkeye is an American all-weather, carrier-capable tactical airborne early warning (AEW) aircraft.", + "country-of-origin": "USA", + "manufacturer": "Northrop Grumman", + "role": "AEW&C", + "year-of-variant-introduction": "1973" + } + }], "F-4E": [{ "default": { "name": "F-4E Phantom II", diff --git a/tests/resources/invalid_faction_country.json b/tests/resources/invalid_faction_country.json index 84579ab0..245c66f1 100644 --- a/tests/resources/invalid_faction_country.json +++ b/tests/resources/invalid_faction_country.json @@ -26,23 +26,23 @@ ], "frontline_units": [ "MBT_M1A2_Abrams", - "ATGM_M1134_Stryker", - "APC_M1126_Stryker_ICV", + "ATGM_Stryker", + "IFV_M1126_Stryker_ICV", "IFV_M2A2_Bradley", "IFV_LAV_25", - "APC_M1043_HMMWV_Armament", - "ATGM_M1045_HMMWV_TOW" + "APC_HMMWV__Scout", + "ATGM_HMMWV" ], "artillery_units": [ - "MLRS_M270", - "SPH_M109_Paladin" + "MLRS_M270_227mm", + "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Infantry_M249" ], "shorads": [ "AvengerGenerator" @@ -57,11 +57,11 @@ "LHA_1_Tarawa" ], "destroyers": [ - "Oliver_Hazzard_Perry_class", - "USS_Arleigh_Burke_IIa" + "FFG_Oliver_Hazzard_Perry", + "DDG_Arleigh_Burke_IIa" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "requirements": {"mod": "Some mod is required"}, "carrier_names": [ diff --git a/tests/resources/valid_faction.json b/tests/resources/valid_faction.json index b540cc55..c31b2c8a 100644 --- a/tests/resources/valid_faction.json +++ b/tests/resources/valid_faction.json @@ -28,23 +28,23 @@ ], "frontline_units": [ "MBT_M1A2_Abrams", - "ATGM_M1134_Stryker", - "APC_M1126_Stryker_ICV", + "ATGM_Stryker", + "IFV_M1126_Stryker_ICV", "IFV_M2A2_Bradley", "IFV_LAV_25", - "APC_M1043_HMMWV_Armament", - "ATGM_M1045_HMMWV_TOW" + "APC_HMMWV__Scout", + "ATGM_HMMWV" ], "artillery_units": [ - "MLRS_M270", - "SPH_M109_Paladin" + "MLRS_M270_227mm", + "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Transport_M818" + "Truck_M818_6x6" ], "infantry_units": [ "Infantry_M4", - "Soldier_M249" + "Infantry_M249" ], "shorads": [ "AvengerGenerator" @@ -59,11 +59,11 @@ "LHA_1_Tarawa" ], "destroyers": [ - "Oliver_Hazzard_Perry_class", - "USS_Arleigh_Burke_IIa" + "FFG_Oliver_Hazzard_Perry", + "DDG_Arleigh_Burke_IIa" ], "cruisers": [ - "Ticonderoga_class" + "CG_Ticonderoga" ], "requirements": {"mod": "Some mod is required"}, "carrier_names": [ diff --git a/tests/test_factions.py b/tests/test_factions.py index bc6d7af3..5b65abb5 100644 --- a/tests/test_factions.py +++ b/tests/test_factions.py @@ -16,6 +16,7 @@ from dcs.planes import ( F_117A, MQ_9_Reaper, E_3A, + E_2C, KC130, KC_135, A_10C, @@ -24,9 +25,9 @@ from dcs.planes import ( from dcs.ships import ( CVN_74_John_C__Stennis, LHA_1_Tarawa, - Oliver_Hazzard_Perry_class, - USS_Arleigh_Burke_IIa, - Ticonderoga_class, + FFG_Oliver_Hazzard_Perry, + DDG_Arleigh_Burke_IIa, + CG_Ticonderoga, ) from dcs.vehicles import Armor, Unarmed, Infantry, Artillery @@ -67,6 +68,7 @@ class TestFactionLoader(unittest.TestCase): self.assertEqual(len(faction.awacs), 1) self.assertIn(E_3A, faction.awacs) + self.assertIn(E_2C, faction.awacs) self.assertEqual(len(faction.tankers), 2) self.assertIn(KC_135, faction.tankers) @@ -76,20 +78,20 @@ class TestFactionLoader(unittest.TestCase): self.assertEqual(faction.jtac_unit, MQ_9_Reaper) self.assertIn(Armor.MBT_M1A2_Abrams, faction.frontline_units) - self.assertIn(Armor.ATGM_M1134_Stryker, faction.frontline_units) - self.assertIn(Armor.APC_M1126_Stryker_ICV, faction.frontline_units) + self.assertIn(Armor.ATGM_Stryker, faction.frontline_units) + self.assertIn(Armor.IFV_M1126_Stryker_ICV, faction.frontline_units) self.assertIn(Armor.IFV_M2A2_Bradley, faction.frontline_units) self.assertIn(Armor.IFV_LAV_25, faction.frontline_units) - self.assertIn(Armor.APC_M1043_HMMWV_Armament, faction.frontline_units) - self.assertIn(Armor.ATGM_M1045_HMMWV_TOW, faction.frontline_units) + self.assertIn(Armor.APC_HMMWV__Scout, faction.frontline_units) + self.assertIn(Armor.ATGM_HMMWV, faction.frontline_units) - self.assertIn(Artillery.MLRS_M270, faction.artillery_units) - self.assertIn(Artillery.SPH_M109_Paladin, faction.artillery_units) + self.assertIn(Artillery.MLRS_M270_227mm, faction.artillery_units) + self.assertIn(Artillery.SPH_M109_Paladin_155mm, faction.artillery_units) - self.assertIn(Unarmed.Transport_M818, faction.logistics_units) + self.assertIn(Unarmed.Truck_M818_6x6, faction.logistics_units) self.assertIn(Infantry.Infantry_M4, faction.infantry_units) - self.assertIn(Infantry.Soldier_M249, faction.infantry_units) + self.assertIn(Infantry.Infantry_M249, faction.infantry_units) self.assertIn("AvengerGenerator", faction.air_defenses) @@ -97,9 +99,9 @@ class TestFactionLoader(unittest.TestCase): self.assertIn(CVN_74_John_C__Stennis, faction.aircraft_carrier) self.assertIn(LHA_1_Tarawa, faction.helicopter_carrier) - self.assertIn(Oliver_Hazzard_Perry_class, faction.destroyers) - self.assertIn(USS_Arleigh_Burke_IIa, faction.destroyers) - self.assertIn(Ticonderoga_class, faction.cruisers) + self.assertIn(FFG_Oliver_Hazzard_Perry, faction.destroyers) + self.assertIn(DDG_Arleigh_Burke_IIa, faction.destroyers) + self.assertIn(CG_Ticonderoga, faction.cruisers) self.assertIn("mod", faction.requirements.keys()) self.assertIn("Some mod is required", faction.requirements.values())