diff --git a/changelog.md b/changelog.md index aa23a742..ede6521d 100644 --- a/changelog.md +++ b/changelog.md @@ -4,12 +4,34 @@ Saves from 3.x are not compatible with 4.0. ## Features/Improvements -* **[Flight Planner]** Added ability to plan Tankers. +* **[Campaign]** Squadrons now have a maximum size and killed pilots replenish at a limited rate. +* **[Campaign]** Added an option to disable levelling up of AI pilots. * **[Campaign AI]** AI will plan Tanker flights. +* **[Campaign AI]** Removed max distance for AEW&C auto planning. +* **[Economy]** Adjusted prices for aircraft to balance out some price inconsistencies. * **[Factions]** Added more tankers to factions. +* **[Flight Planner]** Added ability to plan Tankers. +* **[Mods]** Added support for the Gripen mod. +* **[Mission Generation]** Added support for "Neutral Dot" label options. +* **[UI]** Ctrl click and shift click now buy or sell 5 or 10 units respectively. +* **[UI]** Multiple waypoints can now be deleted simultaneously if multiple waypoints are selected. +* **[UI]** Carriers and LHAs now match the colour of airfields, and their destination icons are translucent. +* **[UI]** Updated intel box text for first turn. ## Fixes +* **[Campaign AI]** Fix procurement for factions that lack some unit types. +* **[Campaign AI]** Improved pruning of unplannable missions which should improve turn cycle time and prevent the auto-planner from quitting early. +* **[Mission Generation]** Fixed problem with mission load when control point name contained an apostrophe. +* **[Mission Generation]** Fixed EWR group names so they contribute to Skynet again. +* **[Mission Generation]** Fixed duplicate name error when generating convoys and cargo ships when creating manual transfers after loading a game. +* **[UI]** Made non-interactive map elements less obstructive. +* **[UI]** Added support for Neutral Dot difficulty label +* **[UI]** Clear skies at night no longer described as "Sunny" by the weather widget. +* **[UI]** Removed ability to buy (useless) ground units at carriers and LHAs. +* **[UI]** Fixed enable/disable of buy/sell buttons. +* **[UI]** EWRs now appear in the custom waypoint list. + # 3.0.0 Saves from 2.5 are not compatible with 3.0. diff --git a/game/data/aaa_db.py b/game/data/aaa_db.py deleted file mode 100644 index 3008011e..00000000 --- a/game/data/aaa_db.py +++ /dev/null @@ -1,22 +0,0 @@ -from dcs.vehicles import AirDefence - -AAA_UNITS = [ - AirDefence.SPAAA_Gepard, - AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish, - AirDefence.SPAAA_Vulcan_M163, - AirDefence.AAA_ZU_23_Closed_Emplacement, - AirDefence.AAA_ZU_23_Emplacement, - AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375, - AirDefence.AAA_ZU_23_Insurgent_Closed_Emplacement, - AirDefence.SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375, - AirDefence.AAA_ZU_23_Insurgent_Emplacement, - AirDefence.AAA_8_8cm_Flak_18, - AirDefence.AAA_Flak_38_20mm, - AirDefence.AAA_8_8cm_Flak_36, - AirDefence.AAA_8_8cm_Flak_37, - 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_S_60_57mm, -] diff --git a/game/data/alic.py b/game/data/alic.py index 84436837..f7700425 100644 --- a/game/data/alic.py +++ b/game/data/alic.py @@ -4,35 +4,35 @@ from dcs.vehicles import AirDefence class AlicCodes: CODES = { - AirDefence.EWR_1L13.id: 101, - AirDefence.EWR_55G6.id: 102, - AirDefence.SAM_SA_10_S_300_Grumble_Clam_Shell_SR.id: 103, - AirDefence.SAM_SA_10_S_300_Grumble_Big_Bird_SR.id: 104, - AirDefence.SAM_SA_11_Buk_Gadfly_Snow_Drift_SR.id: 107, - AirDefence.SAM_SA_6_Kub_Straight_Flush_STR.id: 108, - AirDefence.MCC_SR_Sborka_Dog_Ear_SR.id: 109, - AirDefence.SAM_SA_10_S_300_Grumble_Flap_Lid_TR.id: 110, - AirDefence.SAM_SA_11_Buk_Gadfly_Fire_Dome_TEL.id: 115, - AirDefence.SAM_SA_8_Osa_Gecko_TEL.id: 117, - AirDefence.SAM_SA_13_Strela_10M3_Gopher_TEL.id: 118, - AirDefence.SAM_SA_15_Tor_Gauntlet.id: 119, - AirDefence.SAM_SA_19_Tunguska_Grison.id: 120, - AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish.id: 121, - AirDefence.SAM_P19_Flat_Face_SR__SA_2_3.id: 122, - AirDefence.SAM_SA_3_S_125_Low_Blow_TR.id: 123, - AirDefence.SAM_Rapier_Blindfire_TR.id: 124, - AirDefence.SAM_Rapier_LN.id: 125, - AirDefence.SAM_SA_2_S_75_Fan_Song_TR.id: 126, - AirDefence.HQ_7_Self_Propelled_LN.id: 127, - AirDefence.HQ_7_Self_Propelled_STR.id: 128, - AirDefence.SAM_Roland_ADS.id: 201, - AirDefence.SAM_Patriot_STR.id: 202, - AirDefence.SAM_Hawk_SR__AN_MPQ_50.id: 203, - AirDefence.SAM_Hawk_TR__AN_MPQ_46.id: 204, - AirDefence.SAM_Roland_EWR.id: 205, - AirDefence.SAM_Hawk_CWAR_AN_MPQ_55.id: 206, - AirDefence.SPAAA_Gepard.id: 207, - AirDefence.SPAAA_Vulcan_M163.id: 208, + AirDefence._1L13_EWR.id: 101, + AirDefence._55G6_EWR.id: 102, + AirDefence.S_300PS_40B6MD_sr.id: 103, + AirDefence.S_300PS_64H6E_sr.id: 104, + AirDefence.SA_11_Buk_SR_9S18M1.id: 107, + AirDefence.Kub_1S91_str.id: 108, + AirDefence.Dog_Ear_radar.id: 109, + AirDefence.S_300PS_40B6M_tr.id: 110, + AirDefence.SA_11_Buk_LN_9A310M1.id: 115, + AirDefence.Osa_9A33_ln.id: 117, + AirDefence.Strela_10M3.id: 118, + AirDefence.Tor_9A331.id: 119, + AirDefence._2S6_Tunguska.id: 120, + AirDefence.ZSU_23_4_Shilka.id: 121, + AirDefence.P_19_s_125_sr.id: 122, + AirDefence.Snr_s_125_tr.id: 123, + AirDefence.Rapier_fsa_blindfire_radar.id: 124, + AirDefence.Rapier_fsa_launcher.id: 125, + AirDefence.SNR_75V.id: 126, + AirDefence.HQ_7_LN_SP.id: 127, + AirDefence.HQ_7_STR_SP.id: 128, + AirDefence.Roland_ADS.id: 201, + AirDefence.Patriot_str.id: 202, + AirDefence.Hawk_sr.id: 203, + AirDefence.Hawk_tr.id: 204, + AirDefence.Roland_Radar.id: 205, + AirDefence.Hawk_cwar.id: 206, + AirDefence.Gepard.id: 207, + AirDefence.Vulcan.id: 208, } @classmethod diff --git a/game/data/groundunitclass.py b/game/data/groundunitclass.py index 4b2f6e58..e435267f 100644 --- a/game/data/groundunitclass.py +++ b/game/data/groundunitclass.py @@ -1,239 +1,17 @@ +from __future__ import annotations + from enum import unique, Enum -from typing import Type - -from dcs.vehicles import AirDefence, Infantry, Unarmed, Artillery, Armor -from dcs.unittype import VehicleType - -from pydcs_extensions.frenchpack import frenchpack @unique class GroundUnitClass(Enum): - Tank = ( - "Tank", - ( - Armor.MBT_T_55, - Armor.MBT_T_72B, - Armor.MBT_T_72B3, - Armor.MBT_T_80U, - Armor.MBT_T_90, - Armor.MBT_Leopard_2A4, - Armor.MBT_Leopard_2A4_Trs, - Armor.MBT_Leopard_2A5, - Armor.MBT_Leopard_2A6M, - Armor.MBT_Leopard_1A3, - Armor.MBT_Leclerc, - Armor.MBT_Challenger_II, - Armor.MBT_Chieftain_Mk_3, - Armor.MBT_M1A2_Abrams, - Armor.MBT_M60A3_Patton, - Armor.MBT_Merkava_IV, - Armor.ZTZ_96B, - # WW2 - # Axis - Armor.Tk_PzIV_H, - Armor.SPG_Sturmpanzer_IV_Brummbar, - Armor.MT_Pz_Kpfw_V_Panther_Ausf_G, - Armor.HT_Pz_Kpfw_VI_Tiger_I, - Armor.HT_Pz_Kpfw_VI_Ausf__B_Tiger_II, - # Allies - Armor.Tk_M4_Sherman, - Armor.CT_Centaur_IV, - Armor.CT_Cromwell_IV, - Armor.HIT_Churchill_VII, - # Mods - frenchpack.DIM__TOYOTA_BLUE, - frenchpack.DIM__TOYOTA_GREEN, - frenchpack.DIM__TOYOTA_DESERT, - frenchpack.DIM__KAMIKAZE, - frenchpack.AMX_30B2, - frenchpack.Leclerc_Serie_XXI, - ), - ) - - Atgm = ( - "ATGM", - ( - Armor.ATGM_HMMWV, - Armor.ATGM_VAB_Mephisto, - Armor.ATGM_Stryker, - Armor.IFV_BMP_2, - # WW2 (Tank Destroyers) - # Axxis - Armor.SPG_StuG_III_Ausf__G, - Armor.SPG_StuG_IV, - Armor.SPG_Jagdpanzer_IV, - Armor.SPG_Jagdpanther_G1, - Armor.SPG_Sd_Kfz_184_Elefant, - # Allies - Armor.SPG_M10_GMC, - Armor.MT_M4A4_Sherman_Firefly, - # Mods - frenchpack.VBAE_CRAB_MMP, - frenchpack.VAB_MEPHISTO, - frenchpack.TRM_2000_PAMELA, - ), - ) - - Ifv = ( - "IFV", - ( - Armor.IFV_BMP_3, - Armor.IFV_BMP_2, - Armor.IFV_BMP_1, - Armor.IFV_Marder, - Armor.IFV_Warrior, - Armor.SPG_Stryker_MGS, - Armor.IFV_M2A2_Bradley, - Armor.IFV_BMD_1, - Armor.ZBD_04A, - # Mods - frenchpack.VBAE_CRAB, - frenchpack.VAB_T20_13, - ), - ) - - Apc = ( - "APC", - ( - Armor.IFV_M1126_Stryker_ICV, - Armor.APC_M113, - Armor.APC_BTR_80, - Armor.IFV_BTR_82A, - Armor.APC_MTLB, - Armor.APC_AAV_7_Amphibious, - Armor.APC_TPz_Fuchs, - Armor.APC_BTR_RD, - # WW2 - Armor.APC_M2A1_Halftrack, - Armor.APC_Sd_Kfz_251_Halftrack, - # Mods - frenchpack.VAB__50, - frenchpack.VBL__50, - frenchpack.VBL_AANF1, - ), - ) - - Artillery = ( - "Artillery", - ( - Artillery.Grad_MRL_FDDM__FC, - Artillery.MLRS_9A52_Smerch_HE_300mm, - Artillery.SPH_2S1_Gvozdika_122mm, - Artillery.SPH_2S3_Akatsia_152mm, - Artillery.MLRS_BM_21_Grad_122mm, - Artillery.MLRS_9K57_Uragan_BM_27_220mm, - Artillery.SPH_M109_Paladin_155mm, - Artillery.MLRS_M270_227mm, - Artillery.SPM_2S9_Nona_120mm_M, - Artillery.SPH_Dana_vz77_152mm, - Artillery.SPH_T155_Firtina_155mm, - Artillery.PLZ_05, - Artillery.SPH_2S19_Msta_152mm, - Artillery.MLRS_9A52_Smerch_CM_300mm, - # WW2 - Artillery.SPG_M12_GMC_155mm, - ), - ) - - Logistics = ( - "Logistics", - ( - Unarmed.Carrier_M30_Cargo, - 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, - ), - ) - - Recon = ( - "Recon", - ( - Armor.Scout_HMMWV, - Armor.Scout_Cobra, - Armor.LT_PT_76, - Armor.IFV_LAV_25, - Armor.Scout_BRDM_2, - # WW2 - Armor.LT_Mk_VII_Tetrarch, - Armor.IFV_Sd_Kfz_234_2_Puma, - Armor.Car_M8_Greyhound_Armored, - Armor.Car_Daimler_Armored, - # Mods - frenchpack.ERC_90, - frenchpack.AMX_10RCR, - frenchpack.AMX_10RCR_SEPAR, - ), - ) - - Infantry = ( - "Infantry", - ( - Infantry.Insurgent_AK_74, - Infantry.Infantry_AK_74, - Infantry.Infantry_M1_Garand, - Infantry.Infantry_Mauser_98, - Infantry.Infantry_SMLE_No_4_Mk_1, - Infantry.Infantry_M4_Georgia, - Infantry.Infantry_AK_74_Rus, - Infantry.Paratrooper_AKS, - Infantry.Paratrooper_RPG_16, - Infantry.Infantry_M249, - Infantry.Infantry_M4, - Infantry.Infantry_RPG, - ), - ) - - Shorads = ( - "SHORADS", - ( - 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.SPAAA_Vulcan_M163, - AirDefence.SAM_Linebacker___Bradley_M6, - AirDefence.SAM_Chaparral_M48, - 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_S_60_57mm, - AirDefence.AAA_M1_37mm, - AirDefence.AAA_QF_3_7, - ), - ) - - def __init__( - self, class_name: str, unit_list: tuple[Type[VehicleType], ...] - ) -> None: - self.class_name = class_name - self.unit_list = unit_list - - def __contains__(self, unit_type: Type[VehicleType]) -> bool: - return unit_type in self.unit_list + Tank = "Tank" + Atgm = "ATGM" + Ifv = "IFV" + Apc = "APC" + Artillery = "Artillery" + Logistics = "Logistics" + Recon = "Recon" + Infantry = "Infantry" + Shorads = "SHORADS" + Manpads = "MANPADS" diff --git a/game/data/radar_db.py b/game/data/radar_db.py index 9bd384af..7cd7403d 100644 --- a/game/data/radar_db.py +++ b/game/data/radar_db.py @@ -1,108 +1,108 @@ from dcs.ships import ( - Battlecruiser_1144_2_Pyotr_Velikiy, - Cruiser_1164_Moskva, - CVN_70_Carl_Vinson, - CVN_71_Theodore_Roosevelt, - CVN_72_Abraham_Lincoln, - CVN_73_George_Washington, - CVN_74_John_C__Stennis, - CV_1143_5_Admiral_Kuznetsov, - CV_1143_5_Admiral_Kuznetsov_2017, - Frigate_11540_Neustrashimy, - Corvette_1124_4_Grisha, - Frigate_1135M_Rezky, - Corvette_1241_1_Molniya, - LHA_1_Tarawa, - FFG_Oliver_Hazzard_Perry, - CG_Ticonderoga, - Type_052B_Destroyer, - Type_052C_Destroyer, - Type_054A_Frigate, - DDG_Arleigh_Burke_IIa, + PIOTR, + MOSCOW, + VINSON, + CVN_71, + CVN_72, + CVN_73, + Stennis, + KUZNECOW, + CV_1143_5, + NEUSTRASH, + ALBATROS, + REZKY, + MOLNIYA, + LHA_Tarawa, + PERRY, + TICONDEROG, + Type_052B, + Type_052C, + Type_054A, + USS_Arleigh_Burke_IIa, ) from dcs.vehicles import AirDefence TELARS = { - AirDefence.SAM_SA_19_Tunguska_Grison, - AirDefence.SAM_SA_11_Buk_Gadfly_Fire_Dome_TEL, - AirDefence.SAM_SA_8_Osa_Gecko_TEL, - AirDefence.SAM_SA_15_Tor_Gauntlet, - AirDefence.SAM_Roland_ADS, + AirDefence._2S6_Tunguska, + AirDefence.SA_11_Buk_SR_9S18M1, + AirDefence.Osa_9A33_ln, + AirDefence.Tor_9A331, + AirDefence.Roland_ADS, } TRACK_RADARS = { - AirDefence.SAM_SA_6_Kub_Straight_Flush_STR, - AirDefence.SAM_SA_3_S_125_Low_Blow_TR, - AirDefence.SAM_SA_10_S_300_Grumble_Flap_Lid_TR, - AirDefence.SAM_Hawk_TR__AN_MPQ_46, - AirDefence.SAM_Patriot_STR, - AirDefence.SAM_SA_2_S_75_Fan_Song_TR, - AirDefence.SAM_Rapier_Blindfire_TR, - AirDefence.HQ_7_Self_Propelled_STR, + AirDefence.Kub_1S91_str, + AirDefence.Snr_s_125_tr, + AirDefence.S_300PS_40B6M_tr, + AirDefence.Hawk_tr, + AirDefence.Patriot_str, + AirDefence.SNR_75V, + AirDefence.Rapier_fsa_blindfire_radar, + AirDefence.HQ_7_STR_SP, } LAUNCHER_TRACKER_PAIRS = { - AirDefence.SAM_SA_6_Kub_Gainful_TEL: AirDefence.SAM_SA_6_Kub_Straight_Flush_STR, - AirDefence.SAM_SA_3_S_125_Goa_LN: AirDefence.SAM_SA_3_S_125_Low_Blow_TR, - AirDefence.SAM_SA_10_S_300_Grumble_TEL_D: 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_Flap_Lid_TR, - AirDefence.SAM_Hawk_LN_M192: AirDefence.SAM_Hawk_TR__AN_MPQ_46, - AirDefence.SAM_Patriot_LN: AirDefence.SAM_Patriot_STR, - AirDefence.SAM_SA_2_S_75_Guideline_LN: AirDefence.SAM_SA_2_S_75_Fan_Song_TR, - AirDefence.SAM_Rapier_LN: AirDefence.SAM_Rapier_Blindfire_TR, - AirDefence.HQ_7_Self_Propelled_LN: AirDefence.HQ_7_Self_Propelled_STR, + AirDefence.Kub_2P25_ln: AirDefence.Kub_1S91_str, + AirDefence._5p73_s_125_ln: AirDefence.Snr_s_125_tr, + AirDefence.S_300PS_5P85C_ln: AirDefence.S_300PS_40B6M_tr, + AirDefence.S_300PS_5P85D_ln: AirDefence.S_300PS_40B6M_tr, + AirDefence.Hawk_ln: AirDefence.Hawk_tr, + AirDefence.Patriot_ln: AirDefence.Patriot_str, + AirDefence.S_75M_Volhov: AirDefence.SNR_75V, + AirDefence.Rapier_fsa_launcher: AirDefence.Rapier_fsa_blindfire_radar, + AirDefence.HQ_7_LN_SP: AirDefence.HQ_7_STR_SP, } UNITS_WITH_RADAR = { # Radars - AirDefence.SAM_SA_19_Tunguska_Grison, - AirDefence.SAM_SA_11_Buk_Gadfly_Fire_Dome_TEL, - AirDefence.SAM_SA_8_Osa_Gecko_TEL, - AirDefence.SAM_SA_15_Tor_Gauntlet, - AirDefence.SPAAA_Gepard, - AirDefence.SPAAA_Vulcan_M163, - AirDefence.SAM_Roland_ADS, - AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish, - AirDefence.EWR_1L13, - AirDefence.SAM_SA_6_Kub_Straight_Flush_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_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_P19_Flat_Face_SR__SA_2_3, - AirDefence.SAM_Roland_EWR, - AirDefence.SAM_SA_3_S_125_Low_Blow_TR, - AirDefence.SAM_SA_2_S_75_Fan_Song_TR, - AirDefence.SAM_Rapier_Blindfire_TR, - AirDefence.HQ_7_Self_Propelled_LN, - AirDefence.HQ_7_Self_Propelled_STR, - AirDefence.EWR_FuMG_401_Freya_LZ, - AirDefence.EWR_FuSe_65_Würzburg_Riese, + AirDefence._2S6_Tunguska, + AirDefence.SA_11_Buk_LN_9A310M1, + AirDefence.Osa_9A33_ln, + AirDefence.Tor_9A331, + AirDefence.Gepard, + AirDefence.Vulcan, + AirDefence.Roland_ADS, + AirDefence.ZSU_23_4_Shilka, + AirDefence._1L13_EWR, + AirDefence.Kub_1S91_str, + AirDefence.S_300PS_40B6M_tr, + AirDefence.S_300PS_40B6MD_sr, + AirDefence._55G6_EWR, + AirDefence.S_300PS_64H6E_sr, + AirDefence.SA_11_Buk_SR_9S18M1, + AirDefence.Dog_Ear_radar, + AirDefence.Hawk_tr, + AirDefence.Hawk_sr, + AirDefence.Patriot_str, + AirDefence.Hawk_cwar, + AirDefence.P_19_s_125_sr, + AirDefence.Roland_Radar, + AirDefence.Snr_s_125_tr, + AirDefence.SNR_75V, + AirDefence.Rapier_fsa_blindfire_radar, + AirDefence.HQ_7_LN_SP, + AirDefence.HQ_7_STR_SP, + AirDefence.FuMG_401, + AirDefence.FuSe_65, # Ships - CVN_70_Carl_Vinson, - FFG_Oliver_Hazzard_Perry, - CG_Ticonderoga, - Corvette_1124_4_Grisha, - CV_1143_5_Admiral_Kuznetsov, - 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, - DDG_Arleigh_Burke_IIa, - LHA_1_Tarawa, - Type_052B_Destroyer, - Type_054A_Frigate, - Type_052C_Destroyer, + VINSON, + PERRY, + TICONDEROG, + ALBATROS, + KUZNECOW, + MOLNIYA, + MOSCOW, + NEUSTRASH, + PIOTR, + REZKY, + CV_1143_5, + Stennis, + CVN_71, + CVN_72, + CVN_73, + USS_Arleigh_Burke_IIa, + LHA_Tarawa, + Type_052B, + Type_054A, + Type_052C, } diff --git a/game/data/weapons.py b/game/data/weapons.py index 7aa21beb..668cc028 100644 --- a/game/data/weapons.py +++ b/game/data/weapons.py @@ -5,12 +5,12 @@ import inspect import logging from collections import defaultdict from dataclasses import dataclass -from typing import Dict, Iterator, Optional, Set, Tuple, Type, Union, cast +from typing import Dict, Iterator, Optional, Set, Tuple, Union, cast from dcs.unitgroup import FlyingGroup -from dcs.unittype import FlyingType from dcs.weapons_data import Weapons, weapon_ids +from game.dcs.aircrafttype import AircraftType PydcsWeapon = Dict[str, Union[int, str]] PydcsWeaponAssignment = Tuple[int, PydcsWeapon] @@ -97,12 +97,12 @@ class Pylon: yield weapon @classmethod - def for_aircraft(cls, aircraft: Type[FlyingType], number: int) -> Pylon: + def for_aircraft(cls, aircraft: AircraftType, number: int) -> Pylon: # In pydcs these are all arbitrary inner classes of the aircraft type. # The only way to identify them is by their name. pylons = [ v - for v in aircraft.__dict__.values() + for v in aircraft.dcs_unit_type.__dict__.values() if inspect.isclass(v) and v.__name__.startswith("Pylon") ] @@ -121,8 +121,8 @@ class Pylon: return cls(number, allowed) @classmethod - def iter_pylons(cls, aircraft: Type[FlyingType]) -> Iterator[Pylon]: - for pylon in sorted(list(aircraft.pylons)): + def iter_pylons(cls, aircraft: AircraftType) -> Iterator[Pylon]: + for pylon in sorted(list(aircraft.dcs_unit_type.pylons)): yield cls.for_aircraft(aircraft, pylon) diff --git a/game/db.py b/game/db.py index db9d8c26..2561e6cd 100644 --- a/game/db.py +++ b/game/db.py @@ -1,144 +1,37 @@ -import json from datetime import datetime from enum import Enum -from pathlib import Path -from typing import List, Optional, Type, Union +from typing import Optional, Type, Union from dcs.countries import country_dict from dcs.helicopters import ( - AH_1W, - AH_64A, - AH_64D, - CH_47D, - CH_53E, - Ka_50, - Mi_24V, - Mi_26, - Mi_28N, - Mi_8MT, OH_58D, - SA342L, - SA342M, - SA342Minigun, - SA342Mistral, - SH_60B, - UH_1H, - UH_60A, helicopter_map, ) from dcs.mapping import Point # mypy can't resolve these if they're wildcard imports for some reason. from dcs.planes import ( - AJS37, - AV8BNA, - A_10A, - A_10C, - A_10C_2, - A_20G, - A_50, - An_26B, - An_30M, B_17G, - B_1B, - B_52H, - Bf_109K_4, - C_101CC, - C_130, - C_17A, - E_3A, - E_2C, FA_18C_hornet, - FW_190A8, - FW_190D9, - F_117A, - F_14A_135_GR, - F_14B, - F_15C, - F_15E, - F_16A, F_16C_50, - F_4E, - F_5E_3, - F_86F_Sabre, - IL_76MD, - IL_78M, - JF_17, - J_11A, Ju_88A4, - KC130, - KC_135, - KC135MPRS, - KJ_2000, - L_39ZA, - MQ_9_Reaper, - M_2000C, - MiG_15bis, - MiG_19P, - MiG_21Bis, - MiG_23MLD, - MiG_25PD, - MiG_27K, - MiG_29A, - MiG_29G, - MiG_29S, - MiG_31, - Mirage_2000_5, - P_47D_30, - P_47D_30bl1, - P_47D_40, - P_51D, P_51D_30_NA, - RQ_1A_Predator, - S_3B, - S_3B_Tanker, - SpitfireLFMkIX, - SpitfireLFMkIXCW, - Su_17M4, - Su_24M, - Su_24MR, - Su_25, - Su_25T, - Su_27, - Su_30, - Su_33, - Su_34, - Tornado_GR4, - Tornado_IDS, - Tu_160, - Tu_22M3, - Tu_95MS, - WingLoong_I, - Yak_40, plane_map, - I_16, - Tu_142, ) from dcs.ships import ( - Boat_Armed_Hi_speed, - Bulker_Yakushev, - CVN_71_Theodore_Roosevelt, - CVN_72_Abraham_Lincoln, - CVN_73_George_Washington, - CVN_74_John_C__Stennis, - CVN_75_Harry_S__Truman, - CV_1143_5_Admiral_Kuznetsov, - CV_1143_5_Admiral_Kuznetsov_2017, - Cargo_Ivanov, - LHA_1_Tarawa, - Tanker_Elnya_160, ship_map, + Stennis, + KUZNECOW, + CVN_71, + CVN_75, + CVN_73, + CVN_72, + CV_1143_5, ) from dcs.terrain.terrain import Airport -from dcs.unit import Ship, Unit, Vehicle from dcs.unitgroup import ShipGroup, StaticGroup -from dcs.unittype import FlyingType, UnitType, VehicleType +from dcs.unittype import UnitType from dcs.vehicles import ( - AirDefence, - Armor, - Artillery, - Infantry, - Unarmed, vehicle_map, ) @@ -154,8 +47,6 @@ from pydcs_extensions.jas39.jas39 import JAS39Gripen, JAS39Gripen_AG from pydcs_extensions.mb339.mb339 import MB_339PAN 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 @@ -344,374 +235,6 @@ For example, player accessible Hornet is called `FA_18C_hornet`, and MANPAD Igla # to be cheap enough to repair with a single turn's income. RUNWAY_REPAIR_COST = 100 -""" -Prices for the aircraft. -This defines both price for the player (although only aircraft listed in CAP/CAS/Transport/Armor/AirDefense roles will be purchasable) -and prioritization for the enemy (i.e. less important bases will receive units with lower price) -""" -PRICES = { - # fighter - MiG_23MLD: 13, - Su_27: 18, - Su_33: 22, - MiG_29A: 18, - MiG_29S: 20, - MiG_29G: 18, - MiG_25PD: 20, - MiG_31: 30, - J_11A: 26, - JF_17: 20, - Su_30: 24, - Su_57: 40, - SpitfireLFMkIX: 14, - SpitfireLFMkIXCW: 14, - I_16: 10, - Bf_109K_4: 14, - FW_190D9: 16, - FW_190A8: 14, - A_20G: 22, - Ju_88A4: 24, - F_5E_3: 8, - MiG_15bis: 4, - MiG_19P: 6, - F_86F_Sabre: 4, - MiG_21Bis: 8, - F_4E: 10, - AJS37: 12, - C_101CC: 6, - A_4E_C: 8, - MB_339PAN: 6, - AV8BNA: 14, - M_2000C: 16, - Mirage_2000_5: 20, - FA_18C_hornet: 22, - F_15C: 22, - F_15E: 24, - F_16C_50: 20, - F_16A: 14, - F_14A_135_GR: 20, - F_14B: 24, - F_22A: 40, - Tornado_IDS: 20, - Tornado_GR4: 20, - JAS39Gripen: 26, - # bomber - Su_17M4: 10, - Su_25: 15, - Su_25T: 18, - L_39ZA: 10, - Su_34: 24, - Su_24M: 20, - Su_24MR: 24, - MiG_27K: 20, - A_10A: 16, - A_10C: 22, - A_10C_2: 24, - S_3B: 10, - JAS39Gripen_AG: 26, - # heli - Ka_50: 13, - SA342M: 8, - SA342L: 5, - SA342Minigun: 4, - SA342Mistral: 8, - UH_1H: 4, - Mi_8MT: 5, - Mi_24V: 18, - Mi_28N: 24, - AH_1W: 20, - AH_64A: 24, - AH_64D: 30, - OH_58D: 6, - SH_60B: 6, - CH_47D: 4, - CH_53E: 4, - UH_60A: 4, - Mi_26: 4, - # Bombers - B_52H: 35, - B_1B: 50, - F_117A: 100, - Tu_160: 50, - Tu_22M3: 40, - Tu_95MS: 35, - Tu_142: 35, - # special - IL_76MD: 30, - An_26B: 25, - An_30M: 25, - Yak_40: 25, - S_3B_Tanker: 20, - IL_78M: 25, - KC_135: 25, - KC130: 25, - KC135MPRS: 25, - A_50: 50, - KJ_2000: 50, - E_3A: 50, - E_2C: 50, - C_130: 25, - Hercules: 25, - C_17A: 20, - # WW2 - P_51D_30_NA: 18, - P_51D: 16, - P_47D_30: 17, - P_47D_30bl1: 16, - P_47D_40: 18, - B_17G: 30, - # Drones - MQ_9_Reaper: 12, - RQ_1A_Predator: 6, - WingLoong_I: 6, - # armor - Armor.APC_MTLB: 4, - Artillery.Grad_MRL_FDDM__FC: 4, - Armor.Scout_BRDM_2: 6, - Armor.APC_BTR_RD: 6, - Armor.APC_BTR_80: 8, - Armor.IFV_BTR_82A: 10, - Armor.MBT_T_55: 18, - Armor.MBT_T_72B: 20, - Armor.MBT_T_72B3: 25, - Armor.MBT_T_80U: 25, - Armor.MBT_T_90: 30, - Armor.IFV_BMD_1: 8, - Armor.IFV_BMP_1: 14, - Armor.IFV_BMP_2: 16, - Armor.IFV_BMP_3: 18, - Armor.LT_PT_76: 9, - Armor.ZBD_04A: 12, - Armor.ZTZ_96B: 30, - Armor.Scout_Cobra: 4, - Armor.APC_M113: 6, - Armor.Scout_HMMWV: 2, - Armor.ATGM_HMMWV: 8, - Armor.ATGM_VAB_Mephisto: 12, - Armor.IFV_M2A2_Bradley: 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: 18, - Armor.MBT_Leopard_2A4: 20, - Armor.MBT_Leopard_2A4_Trs: 20, - Armor.MBT_Leopard_2A5: 22, - Armor.MBT_Leopard_2A6M: 25, - Armor.MBT_Merkava_IV: 25, - Armor.APC_TPz_Fuchs: 5, - Armor.MBT_Challenger_II: 25, - Armor.MBT_Chieftain_Mk_3: 20, - Armor.IFV_Marder: 10, - Armor.IFV_Warrior: 10, - Armor.IFV_LAV_25: 7, - Artillery.MLRS_M270_227mm: 55, - Artillery.SPH_M109_Paladin_155mm: 25, - Artillery.SPM_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_9K57_Uragan_BM_27_220mm: 50, - Artillery.MLRS_9A52_Smerch_HE_300mm: 40, - Artillery.Mortar_2B11_120mm: 4, - Artillery.SPH_Dana_vz77_152mm: 26, - Artillery.PLZ_05: 25, - Artillery.SPH_T155_Firtina_155mm: 28, - Unarmed.LUV_UAZ_469_Jeep: 3, - Unarmed.Truck_Ural_375: 3, - Infantry.Infantry_M4: 1, - Infantry.Infantry_AK_74: 1, - Unarmed.Truck_M818_6x6: 3, - # WW2 - Armor.MT_Pz_Kpfw_V_Panther_Ausf_G: 24, - Armor.Tk_PzIV_H: 16, - Armor.HT_Pz_Kpfw_VI_Tiger_I: 24, - Armor.HT_Pz_Kpfw_VI_Ausf__B_Tiger_II: 26, - 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.Tk_M4_Sherman: 12, - Armor.MT_M4A4_Sherman_Firefly: 16, - Armor.CT_Cromwell_IV: 12, - Unarmed.Carrier_M30_Cargo: 2, - Armor.APC_M2A1_Halftrack: 4, - Armor.CT_Centaur_IV: 10, - Armor.HIT_Churchill_VII: 16, - 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, - Armor.SPG_Sturmpanzer_IV_Brummbar: 10, - Armor.Car_Daimler_Armored: 8, - Armor.LT_Mk_VII_Tetrarch: 8, - Unarmed.Tractor_M4_Hi_Speed: 2, - Unarmed.Carrier_Sd_Kfz_7_Tractor: 1, - Unarmed.LUV_Kettenrad: 1, - Unarmed.LUV_Kubelwagen_82: 1, - Unarmed.Truck_Opel_Blitz: 1, - Unarmed.Truck_Bedford: 1, - Unarmed.Truck_GMC_Jimmy_6x6_Truck: 1, - # ship - CV_1143_5_Admiral_Kuznetsov: 100, - CVN_74_John_C__Stennis: 100, - LHA_1_Tarawa: 50, - Bulker_Yakushev: 10, - Boat_Armed_Hi_speed: 10, - Cargo_Ivanov: 10, - Tanker_Elnya_160: 10, - # Air Defence units - 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_CR__AMG_AN_MRC_137: 35, - AirDefence.SAM_Patriot_ECS: 30, - AirDefence.SPAAA_Gepard: 24, - AirDefence.SAM_Hawk_Platoon_Command_Post__PCP: 14, - AirDefence.SPAAA_Vulcan_M163: 10, - AirDefence.SAM_Hawk_LN_M192: 8, - AirDefence.SAM_Chaparral_M48: 16, - 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_C2_ICC: 18, - AirDefence.SAM_Roland_ADS: 12, - 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.SPAAA_ZU_23_2_Mounted_Ural_375: 7, - AirDefence.AAA_ZU_23_Insurgent_Closed_Emplacement: 6, - AirDefence.SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375: 7, - AirDefence.AAA_ZU_23_Insurgent_Emplacement: 6, - 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_Straight_Flush_STR: 22, - AirDefence.EWR_55G6: 30, - 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_P19_Flat_Face_SR__SA_2_3: 14, - AirDefence.SAM_Roland_EWR: 16, - 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_20mm: 6, - AirDefence.AAA_8_8cm_Flak_36: 8, - AirDefence.AAA_8_8cm_Flak_37: 9, - 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_S_60_57mm: 8, - AirDefence.AAA_M1_37mm: 7, - 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, - frenchpack.ERC_90: 12, - frenchpack.MO_120_RT: 10, - frenchpack._53T2: 4, - frenchpack.TRM_2000: 4, - frenchpack.TRM_2000_Fuel: 4, - frenchpack.TRM_2000_53T2: 8, - frenchpack.TRM_2000_PAMELA: 14, - frenchpack.VAB_MEDICAL: 8, - frenchpack.VAB: 6, - frenchpack.VAB__50: 4, - frenchpack.VAB_T20_13: 6, - frenchpack.VAB_MEPHISTO: 8, - frenchpack.VAB_MORTIER: 10, - frenchpack.VBL__50: 4, - frenchpack.VBL_AANF1: 2, - frenchpack.VBL: 1, - frenchpack.VBAE_CRAB: 8, - frenchpack.VBAE_CRAB_MMP: 12, - frenchpack.AMX_30B2: 18, - frenchpack.Tracma_TD_1500: 2, - frenchpack.Infantry_Soldier_JTAC: 1, - frenchpack.Leclerc_Serie_XXI: 35, - frenchpack.DIM__TOYOTA_BLUE: 2, - frenchpack.DIM__TOYOTA_GREEN: 2, - frenchpack.DIM__TOYOTA_DESERT: 2, - frenchpack.DIM__KAMIKAZE: 6, - # SA-10 - 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, - highdigitsams.SAM_SA_10B_S_300PS_54K6_CP: 20, - highdigitsams.SAM_SA_10B_S_300PS_5P85SE_LN: 24, - highdigitsams.SAM_SA_10B_S_300PS_5P85SU_LN: 24, - highdigitsams.SAM_SA_10__5V55RUD__S_300PS_LN_5P85CE: 24, - highdigitsams.SAM_SA_10__5V55RUD__S_300PS_LN_5P85DE: 24, - highdigitsams.SAM_SA_10B_S_300PS_30N6_TR: 26, - highdigitsams.SAM_SA_10B_S_300PS_40B6M_TR: 26, - highdigitsams.SAM_SA_10B_S_300PS_40B6MD_SR: 32, - highdigitsams.SAM_SA_10B_S_300PS_64H6E_SR: 32, - highdigitsams.SAM_SA_12_S_300V_9S457_CP: 22, - highdigitsams.SAM_SA_12_S_300V_9A82_LN: 26, - highdigitsams.SAM_SA_12_S_300V_9A83_LN: 26, - highdigitsams.SAM_SA_12_S_300V_9S15_SR: 34, - highdigitsams.SAM_SA_12_S_300V_9S19_SR: 34, - highdigitsams.SAM_SA_12_S_300V_9S32_TR: 28, - highdigitsams.SAM_SA_20_S_300PMU1_CP_54K6: 26, - highdigitsams.SAM_SA_20_S_300PMU1_TR_30N6E: 30, - highdigitsams.SAM_SA_20_S_300PMU1_TR_30N6E_truck: 32, - highdigitsams.SAM_SA_20_S_300PMU1_SR_5N66E: 38, - highdigitsams.SAM_SA_20_S_300PMU1_SR_64N6E: 38, - highdigitsams.SAM_SA_20_S_300PMU1_LN_5P85CE: 28, - highdigitsams.SAM_SA_20_S_300PMU1_LN_5P85DE: 28, - highdigitsams.SAM_SA_20B_S_300PMU2_CP_54K6E2: 27, - highdigitsams.SAM_SA_20B_S_300PMU2_TR_92H6E_truck: 33, - highdigitsams.SAM_SA_20B_S_300PMU2_SR_64N6E2: 40, - highdigitsams.SAM_SA_20B_S_300PMU2_LN_5P85SE2: 30, - highdigitsams.SAM_SA_23_S_300VM_9S457ME_CP: 30, - highdigitsams.SAM_SA_23_S_300VM_9S15M2_SR: 45, - highdigitsams.SAM_SA_23_S_300VM_9S19M2_SR: 45, - highdigitsams.SAM_SA_23_S_300VM_9S32ME_TR: 35, - highdigitsams.SAM_SA_23_S_300VM_9A83ME_LN: 32, - highdigitsams.SAM_SA_23_S_300VM_9A82ME_LN: 32, - highdigitsams.SAM_SA_17_Buk_M1_2_LN_9A310M1_2: 40, -} - """ Units separated by country. country : DCS Country name @@ -790,44 +313,6 @@ REWARDS = { "derrick": 8, } -CARRIER_CAPABLE = [ - FA_18C_hornet, - F_14A_135_GR, - F_14B, - AV8BNA, - Su_33, - A_4E_C, - S_3B, - S_3B_Tanker, - E_2C, - UH_1H, - Mi_8MT, - Ka_50, - AH_1W, - OH_58D, - UH_60A, - SH_60B, - SA342L, - SA342M, - SA342Minigun, - SA342Mistral, -] - -LHA_CAPABLE = [ - AV8BNA, - UH_1H, - Mi_8MT, - Ka_50, - AH_1W, - OH_58D, - UH_60A, - SH_60B, - SA342L, - SA342M, - SA342Minigun, - SA342Mistral, -] - """ ---------- END OF CONFIGURATION SECTION """ @@ -836,124 +321,25 @@ StartingPosition = Union[ShipGroup, StaticGroup, Airport, Point] def upgrade_to_supercarrier(unit, name: str): - if unit == CVN_74_John_C__Stennis: + if unit == Stennis: if name == "CVN-71 Theodore Roosevelt": - return CVN_71_Theodore_Roosevelt + return CVN_71 elif name == "CVN-72 Abraham Lincoln": - return CVN_72_Abraham_Lincoln + return CVN_72 elif name == "CVN-73 George Washington": - return CVN_73_George_Washington + return CVN_73 elif name == "CVN-75 Harry S. Truman": - return CVN_75_Harry_S__Truman + return CVN_75 elif name == "Carrier Strike Group 8": - return CVN_75_Harry_S__Truman + return CVN_75 else: - return CVN_71_Theodore_Roosevelt - elif unit == CV_1143_5_Admiral_Kuznetsov: - return CV_1143_5_Admiral_Kuznetsov_2017 + return CVN_71 + elif unit == KUZNECOW: + return CV_1143_5 else: return unit -MANPADS: List[Type[VehicleType]] = [ - AirDefence.MANPADS_SA_18_Igla_Grouse, - AirDefence.MANPADS_SA_18_Igla_S_Grouse, - AirDefence.MANPADS_Stinger, -] - -INFANTRY: List[VehicleType] = [ - Infantry.Paratrooper_AKS, - Infantry.Paratrooper_AKS, - Infantry.Paratrooper_AKS, - Infantry.Paratrooper_AKS, - Infantry.Paratrooper_AKS, - Infantry.Infantry_RPG, - Infantry.Infantry_M4, - Infantry.Infantry_M4, - Infantry.Infantry_M4, - Infantry.Infantry_M4, - Infantry.Infantry_M4, - 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.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, - Infantry.Infantry_Mauser_98, - Infantry.Infantry_Mauser_98, - Infantry.Infantry_Mauser_98, - Infantry.Infantry_Mauser_98, - Infantry.Infantry_M1_Garand, - Infantry.Infantry_M1_Garand, - Infantry.Infantry_M1_Garand, - Infantry.Insurgent_AK_74, - Infantry.Insurgent_AK_74, - Infantry.Insurgent_AK_74, -] - - -def find_manpad(country_name: str) -> List[VehicleType]: - return [x for x in MANPADS if x in FACTIONS[country_name].infantry_units] - - -def find_infantry(country_name: str, allow_manpad: bool = False) -> List[VehicleType]: - if allow_manpad: - inf = INFANTRY + MANPADS - else: - inf = INFANTRY - return [x for x in inf if x in FACTIONS[country_name].infantry_units] - - -def unit_type_name(unit_type) -> str: - return unit_type.id and unit_type.id or unit_type.name - - -def unit_type_name_2(unit_type) -> str: - return unit_type.name and unit_type.name or unit_type.id - - -def unit_get_expanded_info(country_name: str, unit_type, request_type: str) -> str: - original_name = unit_type.name and unit_type.name or unit_type.id - default_value = None - faction_value = None - with UNITINFOTEXT_PATH.open("r", encoding="utf-8") as fdata: - data = json.load(fdata) - type_exists = data.get(original_name) - if type_exists is not None: - for faction in type_exists: - if default_value is None: - default_exists = faction.get("default") - if default_exists is not None: - default_value = default_exists.get(request_type) - if faction_value is None: - faction_exists = faction.get(country_name) - if faction_exists is not None: - faction_value = faction_exists.get(request_type) - if default_value is None: - if request_type == "text": - return "WIP - This unit doesn't have any description text yet." - if request_type == "name": - return original_name - else: - return "Unknown" - if faction_value is None: - return default_value - return faction_value - - def unit_type_from_name(name: str) -> Optional[Type[UnitType]]: if name in vehicle_map: return vehicle_map[name] @@ -967,22 +353,6 @@ def unit_type_from_name(name: str) -> Optional[Type[UnitType]]: return None -def flying_type_from_name(name: str) -> Optional[Type[FlyingType]]: - unit_type = plane_map.get(name) - if unit_type is not None: - return unit_type - return helicopter_map.get(name) - - -def unit_type_of(unit: Unit) -> UnitType: - if isinstance(unit, Vehicle): - return vehicle_map[unit.type] - elif isinstance(unit, Ship): - return ship_map[unit.type] - else: - return unit.type - - def country_id_from_name(name): for k, v in country_dict.items(): if v.name == name: @@ -1000,39 +370,3 @@ F_16C_50.Liveries = DefaultLiveries P_51D_30_NA.Liveries = DefaultLiveries Ju_88A4.Liveries = DefaultLiveries B_17G.Liveries = DefaultLiveries - -# List of airframes that rely on their gun as a primary weapon. We confiscate bullets -# from most AI air-to-ground missions since they aren't smart enough to RTB when they're -# out of everything other than bullets (DCS does not have an all-but-gun winchester -# option) and we don't want to be attacking fully functional Tors with a Vulcan. -# -# These airframes are the exceptions. They probably should be using their gun regardless -# of the mission type. -GUN_RELIANT_AIRFRAMES: List[Type[FlyingType]] = [ - AH_1W, - AH_64A, - AH_64D, - A_10A, - A_10C, - A_10C_2, - A_20G, - Bf_109K_4, - FW_190A8, - FW_190D9, - F_86F_Sabre, - Ju_88A4, - Ka_50, - MiG_15bis, - MiG_19P, - Mi_24V, - Mi_28N, - P_47D_30, - P_47D_30bl1, - P_47D_40, - P_51D, - P_51D_30_NA, - SpitfireLFMkIX, - SpitfireLFMkIXCW, - Su_25, - Su_25T, -] diff --git a/game/dcs/aircrafttype.py b/game/dcs/aircrafttype.py new file mode 100644 index 00000000..1ed162b0 --- /dev/null +++ b/game/dcs/aircrafttype.py @@ -0,0 +1,212 @@ +from __future__ import annotations + +import logging +from collections import defaultdict +from dataclasses import dataclass +from functools import cached_property +from pathlib import Path +from typing import ClassVar, Type, Iterator, TYPE_CHECKING, Optional, Any + +import yaml +from dcs.helicopters import helicopter_map +from dcs.planes import plane_map +from dcs.unittype import FlyingType + +from game.dcs.unittype import UnitType +from game.radio.channels import ( + ChannelNamer, + RadioChannelAllocator, + CommonRadioChannelAllocator, + HueyChannelNamer, + SCR522ChannelNamer, + ViggenChannelNamer, + ViperChannelNamer, + TomcatChannelNamer, + MirageChannelNamer, + SingleRadioChannelNamer, + FarmerRadioChannelAllocator, + SCR522RadioChannelAllocator, + ViggenRadioChannelAllocator, + NoOpChannelAllocator, +) +from game.utils import Speed, kph + +if TYPE_CHECKING: + from gen.aircraft import FlightData + from gen import AirSupport, RadioFrequency, RadioRegistry + from gen.radios import Radio + + +@dataclass(frozen=True) +class RadioConfig: + inter_flight: Optional[Radio] + intra_flight: Optional[Radio] + channel_allocator: Optional[RadioChannelAllocator] + channel_namer: Type[ChannelNamer] + + @classmethod + def from_data(cls, data: dict[str, Any]) -> RadioConfig: + return RadioConfig( + cls.make_radio(data.get("inter_flight", None)), + cls.make_radio(data.get("intra_flight", None)), + cls.make_allocator(data.get("channels", {})), + cls.make_namer(data.get("channels", {})), + ) + + @classmethod + def make_radio(cls, name: Optional[str]) -> Optional[Radio]: + from gen.radios import get_radio + + if name is None: + return None + return get_radio(name) + + @classmethod + def make_allocator(cls, data: dict[str, Any]) -> Optional[RadioChannelAllocator]: + try: + alloc_type = data["type"] + except KeyError: + return None + allocator_type: Type[RadioChannelAllocator] = { + "SCR-522": SCR522RadioChannelAllocator, + "common": CommonRadioChannelAllocator, + "farmer": FarmerRadioChannelAllocator, + "noop": NoOpChannelAllocator, + "viggen": ViggenRadioChannelAllocator, + }[alloc_type] + return allocator_type.from_cfg(data) + + @classmethod + def make_namer(cls, config: dict[str, Any]) -> Type[ChannelNamer]: + return { + "SCR-522": SCR522ChannelNamer, + "default": ChannelNamer, + "huey": HueyChannelNamer, + "mirage": MirageChannelNamer, + "single": SingleRadioChannelNamer, + "tomcat": TomcatChannelNamer, + "viggen": ViggenChannelNamer, + "viper": ViperChannelNamer, + }[config.get("namer", "default")] + + +@dataclass(frozen=True) +class AircraftType(UnitType[FlyingType]): + carrier_capable: bool + lha_capable: bool + always_keeps_gun: bool + intra_flight_radio: Optional[Radio] + channel_allocator: Optional[RadioChannelAllocator] + channel_namer: Type[ChannelNamer] + + _by_name: ClassVar[dict[str, AircraftType]] = {} + _by_unit_type: ClassVar[dict[Type[FlyingType], list[AircraftType]]] = defaultdict( + list + ) + _loaded: ClassVar[bool] = False + + def __str__(self) -> str: + return self.name + + @property + def dcs_id(self) -> str: + return self.dcs_unit_type.id + + @property + def flyable(self) -> bool: + return self.dcs_unit_type.flyable + + @cached_property + def max_speed(self) -> Speed: + return kph(self.dcs_unit_type.max_speed) + + def alloc_flight_radio(self, radio_registry: RadioRegistry) -> RadioFrequency: + from gen.radios import ChannelInUseError, MHz + + if self.intra_flight_radio is not None: + return radio_registry.alloc_for_radio(self.intra_flight_radio) + + freq = MHz(self.dcs_unit_type.radio_frequency) + try: + radio_registry.reserve(freq) + except ChannelInUseError: + pass + return freq + + def assign_channels_for_flight( + self, flight: FlightData, air_support: AirSupport + ) -> None: + if self.channel_allocator is not None: + self.channel_allocator.assign_channels_for_flight(flight, air_support) + + def channel_name(self, radio_id: int, channel_id: int) -> str: + return self.channel_namer.channel_name(radio_id, channel_id) + + @classmethod + def register(cls, aircraft_type: AircraftType) -> None: + cls._by_name[aircraft_type.name] = aircraft_type + cls._by_unit_type[aircraft_type.dcs_unit_type].append(aircraft_type) + + @classmethod + def named(cls, name: str) -> AircraftType: + if not cls._loaded: + cls._load_all() + return cls._by_name[name] + + @classmethod + def for_dcs_type(cls, dcs_unit_type: Type[FlyingType]) -> Iterator[AircraftType]: + yield from cls._by_unit_type[dcs_unit_type] + + @staticmethod + def _each_unit_type() -> Iterator[Type[FlyingType]]: + yield from helicopter_map.values() + yield from plane_map.values() + + @classmethod + def _load_all(cls) -> None: + for unit_type in cls._each_unit_type(): + for data in cls._each_variant_of(unit_type): + cls.register(data) + cls._loaded = True + + @classmethod + def _each_variant_of(cls, aircraft: Type[FlyingType]) -> Iterator[AircraftType]: + data_path = Path("resources/units/aircraft") / f"{aircraft.id}.yaml" + if not data_path.exists(): + logging.warning(f"No data for {aircraft.id}; it will not be available") + return + + with data_path.open() as data_file: + data = yaml.safe_load(data_file) + + try: + price = data["price"] + except KeyError as ex: + raise KeyError(f"Missing required price field: {data_path}") from ex + + radio_config = RadioConfig.from_data(data.get("radios", {})) + + try: + introduction = data["introduced"] + if introduction is None: + introduction = "N/A" + except KeyError: + introduction = "No data." + + for variant in data.get("variants", [aircraft.id]): + yield AircraftType( + dcs_unit_type=aircraft, + name=variant, + description=data.get("description", "No data."), + year_introduced=introduction, + country_of_origin=data.get("origin", "No data."), + manufacturer=data.get("manufacturer", "No data."), + role=data.get("role", "No data."), + price=price, + carrier_capable=data.get("carrier_capable", False), + lha_capable=data.get("lha_capable", False), + always_keeps_gun=data.get("always_keeps_gun", False), + intra_flight_radio=radio_config.intra_flight, + channel_allocator=radio_config.channel_allocator, + channel_namer=radio_config.channel_namer, + ) diff --git a/game/dcs/groundunittype.py b/game/dcs/groundunittype.py new file mode 100644 index 00000000..ff03702d --- /dev/null +++ b/game/dcs/groundunittype.py @@ -0,0 +1,95 @@ +from __future__ import annotations + +import logging +from collections import defaultdict +from dataclasses import dataclass +from pathlib import Path +from typing import Type, Optional, ClassVar, Iterator + +import yaml +from dcs.unittype import VehicleType +from dcs.vehicles import vehicle_map + +from game.data.groundunitclass import GroundUnitClass +from game.dcs.unittype import UnitType + + +@dataclass(frozen=True) +class GroundUnitType(UnitType[VehicleType]): + unit_class: Optional[GroundUnitClass] + spawn_weight: int + + _by_name: ClassVar[dict[str, GroundUnitType]] = {} + _by_unit_type: ClassVar[ + dict[Type[VehicleType], list[GroundUnitType]] + ] = defaultdict(list) + _loaded: ClassVar[bool] = False + + def __str__(self) -> str: + return self.name + + @property + def dcs_id(self) -> str: + return self.dcs_unit_type.id + + @classmethod + def register(cls, aircraft_type: GroundUnitType) -> None: + cls._by_name[aircraft_type.name] = aircraft_type + cls._by_unit_type[aircraft_type.dcs_unit_type].append(aircraft_type) + + @classmethod + def named(cls, name: str) -> GroundUnitType: + if not cls._loaded: + cls._load_all() + return cls._by_name[name] + + @classmethod + def for_dcs_type(cls, dcs_unit_type: Type[VehicleType]) -> Iterator[GroundUnitType]: + yield from cls._by_unit_type[dcs_unit_type] + + @staticmethod + def _each_unit_type() -> Iterator[Type[VehicleType]]: + yield from vehicle_map.values() + + @classmethod + def _load_all(cls) -> None: + for unit_type in cls._each_unit_type(): + for data in cls._each_variant_of(unit_type): + cls.register(data) + cls._loaded = True + + @classmethod + def _each_variant_of(cls, vehicle: Type[VehicleType]) -> Iterator[GroundUnitType]: + data_path = Path("resources/units/ground_units") / f"{vehicle.id}.yaml" + if not data_path.exists(): + logging.warning(f"No data for {vehicle.id}; it will not be available") + return + + with data_path.open() as data_file: + data = yaml.safe_load(data_file) + + try: + introduction = data["introduced"] + if introduction is None: + introduction = "N/A" + except KeyError: + introduction = "No data." + + class_name = data.get("class") + unit_class: Optional[GroundUnitClass] = None + if class_name is not None: + unit_class = GroundUnitClass(class_name) + + for variant in data.get("variants", [vehicle.id]): + yield GroundUnitType( + dcs_unit_type=vehicle, + unit_class=unit_class, + spawn_weight=data.get("spawn_weight", 0), + name=variant, + description=data.get("description", "No data."), + year_introduced=introduction, + country_of_origin=data.get("origin", "No data."), + manufacturer=data.get("manufacturer", "No data."), + role=data.get("role", "No data."), + price=data.get("price", 1), + ) diff --git a/game/dcs/unittype.py b/game/dcs/unittype.py new file mode 100644 index 00000000..25181a66 --- /dev/null +++ b/game/dcs/unittype.py @@ -0,0 +1,26 @@ +from dataclasses import dataclass +from functools import cached_property +from typing import TypeVar, Generic, Type + +from dcs.unittype import UnitType as DcsUnitType + +DcsUnitTypeT = TypeVar("DcsUnitTypeT", bound=DcsUnitType) + + +@dataclass(frozen=True) +class UnitType(Generic[DcsUnitTypeT]): + dcs_unit_type: Type[DcsUnitTypeT] + name: str + description: str + year_introduced: str + country_of_origin: str + manufacturer: str + role: str + price: int + + def __str__(self) -> str: + return self.name + + @cached_property + def eplrs_capable(self) -> bool: + return getattr(self.dcs_unit_type, "eplrs", False) diff --git a/game/debriefing.py b/game/debriefing.py index 88c9f8ae..59c795db 100644 --- a/game/debriefing.py +++ b/game/debriefing.py @@ -14,13 +14,12 @@ from typing import ( Dict, Iterator, List, - Type, TYPE_CHECKING, ) -from dcs.unittype import FlyingType, UnitType - from game import db +from game.dcs.aircrafttype import AircraftType +from game.dcs.groundunittype import GroundUnitType from game.theater import Airfield, ControlPoint from game.transfers import CargoShip from game.unitmap import ( @@ -49,8 +48,8 @@ class AirLosses: def losses(self) -> Iterator[FlyingUnit]: return itertools.chain(self.player, self.enemy) - def by_type(self, player: bool) -> Dict[Type[FlyingType], int]: - losses_by_type: Dict[Type[FlyingType], int] = defaultdict(int) + def by_type(self, player: bool) -> Dict[AircraftType, int]: + losses_by_type: Dict[AircraftType, int] = defaultdict(int) losses = self.player if player else self.enemy for loss in losses: losses_by_type[loss.flight.unit_type] += 1 @@ -182,8 +181,8 @@ class Debriefing: def casualty_count(self, control_point: ControlPoint) -> int: return len([x for x in self.front_line_losses if x.origin == control_point]) - def front_line_losses_by_type(self, player: bool) -> Dict[Type[UnitType], int]: - losses_by_type: Dict[Type[UnitType], int] = defaultdict(int) + def front_line_losses_by_type(self, player: bool) -> dict[GroundUnitType, int]: + losses_by_type: dict[GroundUnitType, int] = defaultdict(int) if player: losses = self.ground_losses.player_front_line else: @@ -192,8 +191,8 @@ class Debriefing: losses_by_type[loss.unit_type] += 1 return losses_by_type - def convoy_losses_by_type(self, player: bool) -> Dict[Type[UnitType], int]: - losses_by_type: Dict[Type[UnitType], int] = defaultdict(int) + def convoy_losses_by_type(self, player: bool) -> dict[GroundUnitType, int]: + losses_by_type: dict[GroundUnitType, int] = defaultdict(int) if player: losses = self.ground_losses.player_convoy else: @@ -202,8 +201,8 @@ class Debriefing: losses_by_type[loss.unit_type] += 1 return losses_by_type - def cargo_ship_losses_by_type(self, player: bool) -> Dict[Type[UnitType], int]: - losses_by_type: Dict[Type[UnitType], int] = defaultdict(int) + def cargo_ship_losses_by_type(self, player: bool) -> dict[GroundUnitType, int]: + losses_by_type: dict[GroundUnitType, int] = defaultdict(int) if player: ships = self.ground_losses.player_cargo_ships else: @@ -213,8 +212,8 @@ class Debriefing: losses_by_type[unit_type] += count return losses_by_type - def airlift_losses_by_type(self, player: bool) -> Dict[Type[UnitType], int]: - losses_by_type: Dict[Type[UnitType], int] = defaultdict(int) + def airlift_losses_by_type(self, player: bool) -> dict[GroundUnitType, int]: + losses_by_type: dict[GroundUnitType, int] = defaultdict(int) if player: losses = self.ground_losses.player_airlifts else: diff --git a/game/event/event.py b/game/event/event.py index df63d34b..1fb0230f 100644 --- a/game/event/event.py +++ b/game/event/event.py @@ -14,6 +14,7 @@ from game.operation.operation import Operation from game.theater import ControlPoint from gen import AirTaskingOrder from gen.ground_forces.combat_stance import CombatStance +from ..dcs.groundunittype import GroundUnitType from ..unitmap import UnitMap if TYPE_CHECKING: @@ -122,7 +123,7 @@ class Event: def commit_air_losses(self, debriefing: Debriefing) -> None: for loss in debriefing.air_losses.losses: - if ( + if loss.pilot is not None and ( not loss.pilot.player or not self.game.settings.invulnerable_player_pilots ): @@ -439,7 +440,7 @@ class Event: # Also transfer pending deliveries. for unit_type, count in source.pending_unit_deliveries.units.items(): - if not issubclass(unit_type, VehicleType): + if not isinstance(unit_type, GroundUnitType): continue if count <= 0: # Don't transfer *sales*... diff --git a/game/factions/faction.py b/game/factions/faction.py index cdb75ed0..0a4b2548 100644 --- a/game/factions/faction.py +++ b/game/factions/faction.py @@ -1,15 +1,13 @@ from __future__ import annotations -from game.data.groundunitclass import GroundUnitClass +import itertools import logging from dataclasses import dataclass, field -from typing import Optional, Dict, Type, List, Any, cast, Iterator +from typing import Optional, Dict, Type, List, Any, Iterator import dcs from dcs.countries import country_dict -from dcs.planes import plane_map -from dcs.unittype import FlyingType, ShipType, VehicleType, UnitType -from dcs.vehicles import Armor, Unarmed, Infantry, Artillery, AirDefence +from dcs.unittype import ShipType, UnitType from game.data.building_data import ( WW2_ALLIES_BUILDINGS, @@ -23,7 +21,9 @@ from game.data.doctrine import ( COLDWAR_DOCTRINE, WWII_DOCTRINE, ) -from pydcs_extensions.mod_units import MODDED_VEHICLES, MODDED_AIRPLANES +from game.data.groundunitclass import GroundUnitClass +from game.dcs.aircrafttype import AircraftType +from game.dcs.groundunittype import GroundUnitType @dataclass @@ -45,25 +45,25 @@ class Faction: description: str = field(default="") # Available aircraft - aircrafts: List[Type[FlyingType]] = field(default_factory=list) + aircrafts: List[AircraftType] = field(default_factory=list) # Available awacs aircraft - awacs: List[Type[FlyingType]] = field(default_factory=list) + awacs: List[AircraftType] = field(default_factory=list) # Available tanker aircraft - tankers: List[Type[FlyingType]] = field(default_factory=list) + tankers: List[AircraftType] = field(default_factory=list) # Available frontline units - frontline_units: List[Type[VehicleType]] = field(default_factory=list) + frontline_units: List[GroundUnitType] = field(default_factory=list) # Available artillery units - artillery_units: List[Type[VehicleType]] = field(default_factory=list) + artillery_units: List[GroundUnitType] = field(default_factory=list) # Infantry units used - infantry_units: List[Type[VehicleType]] = field(default_factory=list) + infantry_units: List[GroundUnitType] = field(default_factory=list) # Logistics units used - logistics_units: List[Type[VehicleType]] = field(default_factory=list) + logistics_units: List[GroundUnitType] = field(default_factory=list) # Possible SAMS site generators for this faction air_defenses: List[str] = field(default_factory=list) @@ -114,7 +114,7 @@ class Faction: has_jtac: bool = field(default=False) # Unit to use as JTAC for this faction - jtac_unit: Optional[Type[FlyingType]] = field(default=None) + jtac_unit: Optional[AircraftType] = field(default=None) # doctrine doctrine: Doctrine = field(default=MODERN_DOCTRINE) @@ -123,7 +123,7 @@ class Faction: building_set: List[str] = field(default_factory=list) # List of default livery overrides - liveries_overrides: Dict[Type[UnitType], List[str]] = field(default_factory=dict) + liveries_overrides: Dict[AircraftType, List[str]] = field(default_factory=dict) #: Set to True if the faction should force the "Unrestricted satnav" option #: for the mission. This option enables GPS for capable aircraft regardless @@ -134,15 +134,11 @@ class Faction: #: both will use it. unrestricted_satnav: bool = False - def has_access_to_unittype(self, unitclass: GroundUnitClass) -> bool: - has_access = False - for vehicle in unitclass.unit_list: - if vehicle in self.frontline_units: + def has_access_to_unittype(self, unit_class: GroundUnitClass) -> bool: + for vehicle in itertools.chain(self.frontline_units, self.artillery_units): + if vehicle.unit_class is unit_class: return True - if vehicle in self.artillery_units: - return True - - return has_access + return False @classmethod def from_json(cls: Type[Faction], json: Dict[str, Any]) -> Faction: @@ -163,18 +159,26 @@ class Faction: faction.authors = json.get("authors", "") faction.description = json.get("description", "") - faction.aircrafts = load_all_aircraft(json.get("aircrafts", [])) - faction.awacs = load_all_aircraft(json.get("awacs", [])) - faction.tankers = load_all_aircraft(json.get("tankers", [])) + faction.aircrafts = [AircraftType.named(n) for n in json.get("aircrafts", [])] + faction.awacs = [AircraftType.named(n) for n in json.get("awacs", [])] + faction.tankers = [AircraftType.named(n) for n in json.get("tankers", [])] faction.aircrafts = list( set(faction.aircrafts + faction.awacs + faction.tankers) ) - faction.frontline_units = load_all_vehicles(json.get("frontline_units", [])) - faction.artillery_units = load_all_vehicles(json.get("artillery_units", [])) - faction.infantry_units = load_all_vehicles(json.get("infantry_units", [])) - faction.logistics_units = load_all_vehicles(json.get("logistics_units", [])) + faction.frontline_units = [ + GroundUnitType.named(n) for n in json.get("frontline_units", []) + ] + faction.artillery_units = [ + GroundUnitType.named(n) for n in json.get("artillery_units", []) + ] + faction.infantry_units = [ + GroundUnitType.named(n) for n in json.get("infantry_units", []) + ] + faction.logistics_units = [ + GroundUnitType.named(n) for n in json.get("logistics_units", []) + ] faction.ewrs = json.get("ewrs", []) @@ -198,7 +202,7 @@ class Faction: faction.has_jtac = json.get("has_jtac", False) jtac_name = json.get("jtac_unit", None) if jtac_name is not None: - faction.jtac_unit = load_aircraft(jtac_name) + faction.jtac_unit = AircraftType.named(jtac_name) else: faction.jtac_unit = None faction.navy_group_count = int(json.get("navy_group_count", 1)) @@ -232,93 +236,33 @@ class Faction: # Load liveries override faction.liveries_overrides = {} liveries_overrides = json.get("liveries_overrides", {}) - for k, v in liveries_overrides.items(): - k = load_aircraft(k) - if k is not None: - faction.liveries_overrides[k] = [s.lower() for s in v] + for name, livery in liveries_overrides.items(): + aircraft = AircraftType.named(name) + faction.liveries_overrides[aircraft] = [s.lower() for s in livery] faction.unrestricted_satnav = json.get("unrestricted_satnav", False) return faction @property - def all_units(self) -> List[Type[UnitType]]: - return ( - self.infantry_units - + self.aircrafts - + self.awacs - + self.artillery_units - + self.frontline_units - + self.tankers - + self.logistics_units - ) - - @property - def ground_units(self) -> Iterator[Type[VehicleType]]: + def ground_units(self) -> Iterator[GroundUnitType]: yield from self.artillery_units yield from self.frontline_units yield from self.logistics_units - -def unit_loader(unit: str, class_repository: List[Any]) -> Optional[Type[UnitType]]: - """ - Find unit by name - :param unit: Unit name as string - :param class_repository: Repository of classes (Either a module, a class, or a list of classes) - :return: The unit as a PyDCS type - """ - if unit is None: - return None - elif unit in plane_map.keys(): - return plane_map[unit] - else: - for mother_class in class_repository: - if getattr(mother_class, unit, None) is not None: - return getattr(mother_class, unit) - if type(mother_class) is list: - for m in mother_class: - if m.__name__ == unit: - return m - logging.error(f"FACTION ERROR : Unable to find {unit} in pydcs") - return None - - -def load_aircraft(name: str) -> Optional[Type[FlyingType]]: - return cast( - Optional[FlyingType], - unit_loader(name, [dcs.planes, dcs.helicopters, MODDED_AIRPLANES]), - ) - - -def load_all_aircraft(data) -> List[Type[FlyingType]]: - items = [] - for name in data: - item = load_aircraft(name) - if item is not None: - items.append(item) - return items - - -def load_vehicle(name: str) -> Optional[Type[VehicleType]]: - return cast( - Optional[FlyingType], - unit_loader( - name, [Infantry, Unarmed, Armor, AirDefence, Artillery, MODDED_VEHICLES] - ), - ) - - -def load_all_vehicles(data) -> List[Type[VehicleType]]: - items = [] - for name in data: - item = load_vehicle(name) - if item is not None: - items.append(item) - return items + def infantry_with_class( + self, unit_class: GroundUnitClass + ) -> Iterator[GroundUnitType]: + for unit in self.infantry_units: + if unit.unit_class is unit_class: + yield unit def load_ship(name: str) -> Optional[Type[ShipType]]: - return cast(Optional[FlyingType], unit_loader(name, [dcs.ships])) + if (ship := getattr(dcs.ships, name, None)) is not None: + return ship + logging.error(f"FACTION ERROR : Unable to find {name} in dcs.ships") + return None def load_all_ships(data) -> List[Type[ShipType]]: diff --git a/game/game.py b/game/game.py index 266fd073..88adc369 100644 --- a/game/game.py +++ b/game/game.py @@ -17,6 +17,7 @@ from game import db from game.inventory import GlobalAircraftInventory from game.models.game_stats import GameStats from game.plugins import LuaPluginManager +from gen import naming from gen.ato import AirTaskingOrder from gen.conflictgen import Conflict from gen.flights.ai_flight_planner import CoalitionMissionPlanner @@ -119,6 +120,7 @@ class Game: self.enemy_budget = enemy_budget self.current_unit_id = 0 self.current_group_id = 0 + self.name_generator = naming.namegen self.conditions = self.generate_conditions() @@ -311,6 +313,14 @@ class Game: raise RuntimeError(f"{event} was passed when an Event type was expected") def on_load(self, game_still_initializing: bool = False) -> None: + if not hasattr(self, "name_generator"): + self.name_generator = naming.namegen + # Hack: Replace the global name generator state with the state from the save + # game. + # + # We need to persist this state so that names generated after game load don't + # conflict with those generated before exit. + naming.namegen = self.name_generator LuaPluginManager.load_settings(self.settings) ObjectiveDistanceCache.set_theater(self.theater) self.compute_conflicts_position() @@ -338,11 +348,14 @@ class Game: # one hop ahead. ControlPoint.process_turn handles unit deliveries. self.transfers.perform_transfers() - # Needs to happen *before* planning transfers so we don't cancel the + # Needs to happen *before* planning transfers so we don't cancel them. self.reset_ato() for control_point in self.theater.controlpoints: control_point.process_turn(self) + self.blue_air_wing.replenish() + self.red_air_wing.replenish() + if not skipped and self.turn > 1: for cp in self.theater.player_points(): cp.base.affect_strength(+PLAYER_BASE_STRENGTH_RECOVERY) diff --git a/game/inventory.py b/game/inventory.py index 651b80a8..4014c05c 100644 --- a/game/inventory.py +++ b/game/inventory.py @@ -6,6 +6,7 @@ from typing import Dict, Iterable, Iterator, Set, Tuple, TYPE_CHECKING, Type from dcs.unittype import FlyingType +from game.dcs.aircrafttype import AircraftType from gen.flights.flight import Flight if TYPE_CHECKING: @@ -17,9 +18,9 @@ class ControlPointAircraftInventory: def __init__(self, control_point: ControlPoint) -> None: self.control_point = control_point - self.inventory: Dict[Type[FlyingType], int] = defaultdict(int) + self.inventory: Dict[AircraftType, int] = defaultdict(int) - def add_aircraft(self, aircraft: Type[FlyingType], count: int) -> None: + def add_aircraft(self, aircraft: AircraftType, count: int) -> None: """Adds aircraft to the inventory. Args: @@ -28,7 +29,7 @@ class ControlPointAircraftInventory: """ self.inventory[aircraft] += count - def remove_aircraft(self, aircraft: Type[FlyingType], count: int) -> None: + def remove_aircraft(self, aircraft: AircraftType, count: int) -> None: """Removes aircraft from the inventory. Args: @@ -42,12 +43,12 @@ class ControlPointAircraftInventory: available = self.inventory[aircraft] if available < count: raise ValueError( - f"Cannot remove {count} {aircraft.id} from " + f"Cannot remove {count} {aircraft} from " f"{self.control_point.name}. Only have {available}." ) self.inventory[aircraft] -= count - def available(self, aircraft: Type[FlyingType]) -> int: + def available(self, aircraft: AircraftType) -> int: """Returns the number of available aircraft of the given type. Args: @@ -59,14 +60,14 @@ class ControlPointAircraftInventory: return 0 @property - def types_available(self) -> Iterator[Type[FlyingType]]: + def types_available(self) -> Iterator[AircraftType]: """Iterates over all available aircraft types.""" for aircraft, count in self.inventory.items(): if count > 0: yield aircraft @property - def all_aircraft(self) -> Iterator[Tuple[Type[FlyingType], int]]: + def all_aircraft(self) -> Iterator[Tuple[AircraftType, int]]: """Iterates over all available aircraft types, including amounts.""" for aircraft, count in self.inventory.items(): if count > 0: @@ -107,9 +108,9 @@ class GlobalAircraftInventory: return self.inventories[control_point] @property - def available_types_for_player(self) -> Iterator[Type[FlyingType]]: + def available_types_for_player(self) -> Iterator[AircraftType]: """Iterates over all aircraft types available to the player.""" - seen: Set[Type[FlyingType]] = set() + seen: Set[AircraftType] = set() for control_point, inventory in self.inventories.items(): if control_point.captured: for aircraft in inventory.types_available: diff --git a/game/operation/operation.py b/game/operation/operation.py index 20d54c3e..c63c61f2 100644 --- a/game/operation/operation.py +++ b/game/operation/operation.py @@ -17,7 +17,7 @@ from dcs.triggers import TriggerStart from game.plugins import LuaPluginManager from game.theater.theatergroundobject import TheaterGroundObject from gen import Conflict, FlightType, VisualGenerator, Bullseye -from gen.aircraft import AIRCRAFT_DATA, AircraftConflictGenerator, FlightData +from gen.aircraft import AircraftConflictGenerator, FlightData from gen.airfields import AIRFIELD_DATA from gen.airsupportgen import AirSupport, AirSupportConflictGenerator from gen.armor import GroundConflictGenerator, JtacInfo @@ -229,23 +229,7 @@ class Operation: for flight in flights: if not flight.client_units: continue - cls.assign_channels_to_flight(flight, air_support) - - @staticmethod - def assign_channels_to_flight(flight: FlightData, air_support: AirSupport) -> None: - """Assigns preset radio channels for a client flight.""" - airframe = flight.aircraft_type - - try: - aircraft_data = AIRCRAFT_DATA[airframe.id] - except KeyError: - logging.warning(f"No aircraft data for {airframe.id}") - return - - if aircraft_data.channel_allocator is not None: - aircraft_data.channel_allocator.assign_channels_for_flight( - flight, air_support - ) + flight.aircraft_type.assign_channels_for_flight(flight, air_support) @classmethod def _create_tacan_registry( @@ -608,8 +592,7 @@ class Operation: zone = data["zone"] laserCode = data["laserCode"] dcsUnit = data["dcsUnit"] - lua += f" {{dcsGroupName='{dcsGroupName}', callsign='{callsign}', zone='{zone}', laserCode='{laserCode}', dcsUnit='{dcsUnit}' }}, \n" - # lua += f" {{name='{dcsGroupName}', description='JTAC {callsign} ', information='Laser:{laserCode}', jtac={laserCode} }}, \n" + lua += f" {{dcsGroupName='{dcsGroupName}', callsign='{callsign}', zone={repr(zone)}, laserCode='{laserCode}', dcsUnit='{dcsUnit}' }}, \n" lua += "}" # Process the Target Points diff --git a/game/procurement.py b/game/procurement.py index 021014ce..2e2c0e79 100644 --- a/game/procurement.py +++ b/game/procurement.py @@ -3,12 +3,12 @@ from __future__ import annotations import math import random from dataclasses import dataclass -from typing import Iterator, List, Optional, TYPE_CHECKING, Tuple, Type - -from dcs.unittype import FlyingType, VehicleType +from typing import Iterator, List, Optional, TYPE_CHECKING, Tuple from game import db from game.data.groundunitclass import GroundUnitClass +from game.dcs.aircrafttype import AircraftType +from game.dcs.groundunittype import GroundUnitType from game.factions.faction import Faction from game.theater import ControlPoint, MissionTarget from game.utils import Distance @@ -59,6 +59,18 @@ class ProcurementAi: def calculate_ground_unit_budget_share(self) -> float: armor_investment = 0 aircraft_investment = 0 + + # faction has no ground units + if ( + len(self.faction.artillery_units) == 0 + and len(self.faction.frontline_units) == 0 + ): + return 0 + + # faction has no planes + if len(self.faction.aircrafts) == 0: + return 1 + for cp in self.owned_points: cp_ground_units = cp.allocated_ground_units(self.game.transfers) armor_investment += cp_ground_units.total_value @@ -113,7 +125,7 @@ class ProcurementAi: if available % 2 == 0: continue inventory.remove_aircraft(aircraft, 1) - total += db.PRICES[aircraft] + total += aircraft.price return total def repair_runways(self, budget: float) -> float: @@ -135,12 +147,17 @@ class ProcurementAi: def affordable_ground_unit_of_class( self, budget: float, unit_class: GroundUnitClass - ) -> Optional[Type[VehicleType]]: + ) -> Optional[GroundUnitType]: faction_units = set(self.faction.frontline_units) | set( self.faction.artillery_units ) - of_class = set(unit_class.unit_list) & faction_units - affordable_units = [u for u in of_class if db.PRICES[u] <= budget] + of_class = {u for u in faction_units if u.unit_class is unit_class} + + # faction has no access to needed unit type, take a random unit + if not of_class: + of_class = faction_units + + affordable_units = [u for u in of_class if u.price <= budget] if not affordable_units: return None return random.choice(affordable_units) @@ -162,7 +179,7 @@ class ProcurementAi: # Can't afford any more units. break - budget -= db.PRICES[unit] + budget -= unit.price cp.pending_unit_deliveries.order({unit: 1}) return budget @@ -198,12 +215,12 @@ class ProcurementAi: airbase: ControlPoint, number: int, max_price: float, - ) -> Optional[Type[FlyingType]]: - best_choice: Optional[Type[FlyingType]] = None + ) -> Optional[AircraftType]: + best_choice: Optional[AircraftType] = None for unit in aircraft_for_task(task): if unit not in self.faction.aircrafts: continue - if db.PRICES[unit] * number > max_price: + if unit.price * number > max_price: continue if not airbase.can_operate(unit): continue @@ -224,7 +241,7 @@ class ProcurementAi: def affordable_aircraft_for( self, request: AircraftProcurementRequest, airbase: ControlPoint, budget: float - ) -> Optional[Type[FlyingType]]: + ) -> Optional[AircraftType]: return self._affordable_aircraft_for_task( request.task_capability, airbase, request.number, budget ) @@ -242,7 +259,7 @@ class ProcurementAi: # able to operate expensive aircraft. continue - budget -= db.PRICES[unit] * request.number + budget -= unit.price * request.number airbase.pending_unit_deliveries.order({unit: request.number}) return budget, True return budget, False @@ -343,9 +360,9 @@ class ProcurementAi: class_cost = 0 total_cost = 0 for unit_type, count in allocations.all.items(): - cost = db.PRICES[unit_type] * count + cost = unit_type.price * count total_cost += cost - if unit_type in unit_class: + if unit_type.unit_class is unit_class: class_cost += cost if not total_cost: return 0 diff --git a/game/radio/channels.py b/game/radio/channels.py new file mode 100644 index 00000000..83df8e6c --- /dev/null +++ b/game/radio/channels.py @@ -0,0 +1,298 @@ +from __future__ import annotations + +from dataclasses import dataclass +from typing import Optional, Any, TYPE_CHECKING + +if TYPE_CHECKING: + from gen import FlightData, AirSupport + + +class RadioChannelAllocator: + """Base class for radio channel allocators.""" + + def assign_channels_for_flight( + self, flight: FlightData, air_support: AirSupport + ) -> None: + """Assigns mission frequencies to preset channels for the flight.""" + raise NotImplementedError + + @classmethod + def from_cfg(cls, cfg: dict[str, Any]) -> RadioChannelAllocator: + return cls() + + @classmethod + def name(cls) -> str: + raise NotImplementedError + + +@dataclass(frozen=True) +class CommonRadioChannelAllocator(RadioChannelAllocator): + """Radio channel allocator suitable for most aircraft. + + Most of the aircraft with preset channels available have one or more radios + with 20 or more channels available (typically per-radio, but this is not the + case for the JF-17). + """ + + #: Index of the radio used for intra-flight communications. Matches the + #: index of the panel_radio field of the pydcs.dcs.planes object. + inter_flight_radio_index: Optional[int] + + #: Index of the radio used for intra-flight communications. Matches the + #: index of the panel_radio field of the pydcs.dcs.planes object. + intra_flight_radio_index: Optional[int] + + def assign_channels_for_flight( + self, flight: FlightData, air_support: AirSupport + ) -> None: + if self.intra_flight_radio_index is not None: + flight.assign_channel( + self.intra_flight_radio_index, 1, flight.intra_flight_channel + ) + + if self.inter_flight_radio_index is None: + return + + # For cases where the inter-flight and intra-flight radios share presets + # (the JF-17 only has one set of channels, even though it can use two + # channels simultaneously), start assigning inter-flight channels at 2. + radio_id = self.inter_flight_radio_index + if self.intra_flight_radio_index == radio_id: + first_channel = 2 + else: + first_channel = 1 + + last_channel = flight.num_radio_channels(radio_id) + channel_alloc = iter(range(first_channel, last_channel + 1)) + + if flight.departure.atc is not None: + flight.assign_channel(radio_id, next(channel_alloc), flight.departure.atc) + + # TODO: If there ever are multiple AWACS, limit to mission relevant. + for awacs in air_support.awacs: + flight.assign_channel(radio_id, next(channel_alloc), awacs.freq) + + if flight.arrival != flight.departure and flight.arrival.atc is not None: + flight.assign_channel(radio_id, next(channel_alloc), flight.arrival.atc) + + try: + # TODO: Skip incompatible tankers. + for tanker in air_support.tankers: + flight.assign_channel(radio_id, next(channel_alloc), tanker.freq) + + if flight.divert is not None and flight.divert.atc is not None: + flight.assign_channel(radio_id, next(channel_alloc), flight.divert.atc) + except StopIteration: + # Any remaining channels are nice-to-haves, but not necessary for + # the few aircraft with a small number of channels available. + pass + + @classmethod + def from_cfg(cls, cfg: dict[str, Any]) -> CommonRadioChannelAllocator: + return CommonRadioChannelAllocator( + inter_flight_radio_index=cfg["inter_flight_radio_index"], + intra_flight_radio_index=cfg["intra_flight_radio_index"], + ) + + @classmethod + def name(cls) -> str: + return "common" + + +@dataclass(frozen=True) +class NoOpChannelAllocator(RadioChannelAllocator): + """Channel allocator for aircraft that don't support preset channels.""" + + def assign_channels_for_flight( + self, flight: FlightData, air_support: AirSupport + ) -> None: + pass + + @classmethod + def name(cls) -> str: + return "noop" + + +@dataclass(frozen=True) +class FarmerRadioChannelAllocator(RadioChannelAllocator): + """Preset channel allocator for the MiG-19P.""" + + def assign_channels_for_flight( + self, flight: FlightData, air_support: AirSupport + ) -> None: + # The Farmer only has 6 preset channels. It also only has a VHF radio, + # and currently our ATC data and AWACS are only in the UHF band. + radio_id = 1 + flight.assign_channel(radio_id, 1, flight.intra_flight_channel) + # TODO: Assign 4-6 to VHF frequencies of departure, arrival, and divert. + # TODO: Assign 2 and 3 to AWACS if it is VHF. + + @classmethod + def name(cls) -> str: + return "farmer" + + +@dataclass(frozen=True) +class ViggenRadioChannelAllocator(RadioChannelAllocator): + """Preset channel allocator for the AJS37.""" + + def assign_channels_for_flight( + self, flight: FlightData, air_support: AirSupport + ) -> None: + # The Viggen's preset channels are handled differently from other + # aircraft. The aircraft automatically configures channels for every + # allied flight in the game (including AWACS) and for every airfield. As + # such, we don't need to allocate any of those. There are seven presets + # we can modify, however: three channels for the main radio intended for + # communication with wingmen, and four emergency channels for the backup + # radio. We'll set the first channel of the main radio to the + # intra-flight channel, and the first three emergency channels to each + # of the flight plan's airfields. The fourth emergency channel is always + # the guard channel. + radio_id = 1 + flight.assign_channel(radio_id, 1, flight.intra_flight_channel) + if flight.departure.atc is not None: + flight.assign_channel(radio_id, 4, flight.departure.atc) + if flight.arrival.atc is not None: + flight.assign_channel(radio_id, 5, flight.arrival.atc) + # TODO: Assign divert to 6 when we support divert airfields. + + @classmethod + def name(cls) -> str: + return "viggen" + + +@dataclass(frozen=True) +class SCR522RadioChannelAllocator(RadioChannelAllocator): + """Preset channel allocator for the SCR522 WW2 radios. (4 channels)""" + + def assign_channels_for_flight( + self, flight: FlightData, air_support: AirSupport + ) -> None: + radio_id = 1 + flight.assign_channel(radio_id, 1, flight.intra_flight_channel) + if flight.departure.atc is not None: + flight.assign_channel(radio_id, 2, flight.departure.atc) + if flight.arrival.atc is not None: + flight.assign_channel(radio_id, 3, flight.arrival.atc) + + # TODO : Some GCI on Channel 4 ? + + @classmethod + def name(cls) -> str: + return "SCR-522" + + +class ChannelNamer: + """Base class allowing channel name customization per-aircraft. + + Most aircraft will want to customize this behavior, but the default is + reasonable for any aircraft with numbered radios. + """ + + @staticmethod + def channel_name(radio_id: int, channel_id: int) -> str: + """Returns the name of the channel for the given radio and channel.""" + return f"COMM{radio_id} Ch {channel_id}" + + @classmethod + def name(cls) -> str: + return "default" + + +class SingleRadioChannelNamer(ChannelNamer): + """Channel namer for the aircraft with only a single radio. + + Aircraft like the MiG-19P and the MiG-21bis only have a single radio, so + it's not necessary for us to name the radio when naming the channel. + """ + + @staticmethod + def channel_name(radio_id: int, channel_id: int) -> str: + return f"Ch {channel_id}" + + @classmethod + def name(cls) -> str: + return "single" + + +class HueyChannelNamer(ChannelNamer): + """Channel namer for the UH-1H.""" + + @staticmethod + def channel_name(radio_id: int, channel_id: int) -> str: + return f"COM3 Ch {channel_id}" + + @classmethod + def name(cls) -> str: + return "huey" + + +class MirageChannelNamer(ChannelNamer): + """Channel namer for the M-2000.""" + + @staticmethod + def channel_name(radio_id: int, channel_id: int) -> str: + radio_name = ["V/UHF", "UHF"][radio_id - 1] + return f"{radio_name} Ch {channel_id}" + + @classmethod + def name(cls) -> str: + return "mirage" + + +class TomcatChannelNamer(ChannelNamer): + """Channel namer for the F-14.""" + + @staticmethod + def channel_name(radio_id: int, channel_id: int) -> str: + radio_name = ["UHF", "VHF/UHF"][radio_id - 1] + return f"{radio_name} Ch {channel_id}" + + @classmethod + def name(cls) -> str: + return "tomcat" + + +class ViggenChannelNamer(ChannelNamer): + """Channel namer for the AJS37.""" + + @staticmethod + def channel_name(radio_id: int, channel_id: int) -> str: + if channel_id >= 4: + channel_letter = "EFGH"[channel_id - 4] + return f"FR 24 {channel_letter}" + return f"FR 22 Special {channel_id}" + + @classmethod + def name(cls) -> str: + return "viggen" + + +class ViperChannelNamer(ChannelNamer): + """Channel namer for the F-16.""" + + @staticmethod + def channel_name(radio_id: int, channel_id: int) -> str: + return f"COM{radio_id} Ch {channel_id}" + + @classmethod + def name(cls) -> str: + return "viper" + + +class SCR522ChannelNamer(ChannelNamer): + """ + Channel namer for P-51 & P-47D + """ + + @staticmethod + def channel_name(radio_id: int, channel_id: int) -> str: + if channel_id > 3: + return "?" + else: + return f"Button " + "ABCD"[channel_id - 1] + + @classmethod + def name(cls) -> str: + return "SCR-522" diff --git a/game/settings.py b/game/settings.py index 90723a55..622ebde0 100644 --- a/game/settings.py +++ b/game/settings.py @@ -20,6 +20,7 @@ class Settings: # Difficulty settings player_skill: str = "Good" enemy_skill: str = "Average" + ai_pilot_levelling: bool = True enemy_vehicle_skill: str = "Average" map_coalition_visibility: ForcedOptions.Views = ForcedOptions.Views.All labels: str = "Full" @@ -33,6 +34,15 @@ class Settings: player_income_multiplier: float = 1.0 enemy_income_multiplier: float = 1.0 + #: The maximum number of pilots a squadron can have at one time. Changing this after + #: the campaign has started will have no immediate effect; pilots already in the + #: squadron will not be removed if the limit is lowered and pilots will not be + #: immediately created if the limit is raised. + squadron_pilot_limit: int = 24 + + #: The number of pilots a squadron can replace per turn. + squadron_replenishment_rate: int = 4 + default_start_type: str = "Cold" # Mission specific diff --git a/game/squadrons.py b/game/squadrons.py index 4e550465..0f6097a2 100644 --- a/game/squadrons.py +++ b/game/squadrons.py @@ -8,7 +8,6 @@ from dataclasses import dataclass, field from enum import unique, Enum from pathlib import Path from typing import ( - Type, Tuple, TYPE_CHECKING, Optional, @@ -17,10 +16,9 @@ from typing import ( ) import yaml -from dcs.unittype import FlyingType from faker import Faker -from game.db import flying_type_from_name +from game.dcs.aircrafttype import AircraftType from game.settings import AutoAtoBehavior if TYPE_CHECKING: @@ -76,14 +74,23 @@ class Pilot: @dataclass class Squadron: name: str - nickname: str + nickname: Optional[str] country: str role: str - aircraft: Type[FlyingType] + aircraft: AircraftType livery: Optional[str] mission_types: tuple[FlightType, ...] - pilots: list[Pilot] - available_pilots: list[Pilot] = field(init=False, hash=False, compare=False) + + #: The pool of pilots that have not yet been assigned to the squadron. This only + #: happens when a preset squadron defines more preset pilots than the squadron limit + #: allows. This pool will be consumed before random pilots are generated. + pilot_pool: list[Pilot] + + current_roster: list[Pilot] = field(default_factory=list, init=False, hash=False) + available_pilots: list[Pilot] = field( + default_factory=list, init=False, hash=False, compare=False + ) + auto_assignable_mission_types: set[FlightType] = field( init=False, hash=False, compare=False ) @@ -95,18 +102,19 @@ class Squadron: player: bool def __post_init__(self) -> None: - self.available_pilots = list(self.active_pilots) + if any(p.status is not PilotStatus.Active for p in self.pilot_pool): + raise ValueError("Squadrons can only be created with active pilots.") + self._recruit_pilots(self.game.settings.squadron_pilot_limit) self.auto_assignable_mission_types = set(self.mission_types) def __str__(self) -> str: + if self.nickname is None: + return self.name return f'{self.name} "{self.nickname}"' def claim_available_pilot(self) -> Optional[Pilot]: - # No pilots available, so the preference is irrelevant. Create a new pilot and - # return it. if not self.available_pilots: - self.enlist_new_pilots(1) - return self.available_pilots.pop() + return None # For opfor, so player/AI option is irrelevant. if not self.player: @@ -127,11 +135,12 @@ class Squadron: # No pilot was found that matched the user's preference. # # If they chose to *never* assign players and only players remain in the pool, - # we cannot fill the slot with the available pilots. Recruit a new one. + # we cannot fill the slot with the available pilots. # - # If they prefer players and we're out of players, just return an AI pilot. + # If they only *prefer* players and we're out of players, just return an AI + # pilot. if not prefer_players: - self.enlist_new_pilots(1) + return None return self.available_pilots.pop() def claim_pilot(self, pilot: Pilot) -> None: @@ -151,23 +160,45 @@ class Squadron: # repopulating the same size flight from the same squadron. self.available_pilots.extend(reversed(pilots)) - def enlist_new_pilots(self, count: int) -> None: - new_pilots = [Pilot(self.faker.name()) for _ in range(count)] - self.pilots.extend(new_pilots) + def _recruit_pilots(self, count: int) -> None: + new_pilots = self.pilot_pool[:count] + self.pilot_pool = self.pilot_pool[count:] + count -= len(new_pilots) + new_pilots.extend([Pilot(self.faker.name()) for _ in range(count)]) + self.current_roster.extend(new_pilots) self.available_pilots.extend(new_pilots) + def replenish_lost_pilots(self) -> None: + replenish_count = min( + self.game.settings.squadron_replenishment_rate, + self.number_of_unfilled_pilot_slots, + ) + if replenish_count > 0: + self._recruit_pilots(replenish_count) + def return_all_pilots(self) -> None: self.available_pilots = list(self.active_pilots) + @staticmethod + def send_on_leave(pilot: Pilot) -> None: + pilot.send_on_leave() + + def return_from_leave(self, pilot: Pilot): + if not self.has_unfilled_pilot_slots: + raise RuntimeError( + f"Cannot return {pilot} from leave because {self} is full" + ) + pilot.return_from_leave() + @property def faker(self) -> Faker: return self.game.faker_for(self.player) def _pilots_with_status(self, status: PilotStatus) -> list[Pilot]: - return [p for p in self.pilots if p.status == status] + return [p for p in self.current_roster if p.status == status] def _pilots_without_status(self, status: PilotStatus) -> list[Pilot]: - return [p for p in self.pilots if p.status != status] + return [p for p in self.current_roster if p.status != status] @property def active_pilots(self) -> list[Pilot]: @@ -178,27 +209,44 @@ class Squadron: return self._pilots_with_status(PilotStatus.OnLeave) @property - def number_of_pilots_including_dead(self) -> int: - return len(self.pilots) + def number_of_pilots_including_inactive(self) -> int: + return len(self.current_roster) @property - def number_of_living_pilots(self) -> int: - return len(self._pilots_without_status(PilotStatus.Dead)) + def number_of_unfilled_pilot_slots(self) -> int: + return self.game.settings.squadron_pilot_limit - len(self.active_pilots) + + @property + def number_of_available_pilots(self) -> int: + return len(self.available_pilots) + + @property + def has_available_pilots(self) -> bool: + return bool(self.available_pilots) + + @property + def has_unfilled_pilot_slots(self) -> bool: + return self.number_of_unfilled_pilot_slots > 0 + + def can_auto_assign(self, task: FlightType) -> bool: + return task in self.auto_assignable_mission_types def pilot_at_index(self, index: int) -> Pilot: - return self.pilots[index] + return self.current_roster[index] @classmethod def from_yaml(cls, path: Path, game: Game, player: bool) -> Squadron: from gen.flights.ai_flight_planner_db import tasks_for_aircraft from gen.flights.flight import FlightType - with path.open() as squadron_file: + with path.open(encoding="utf8") as squadron_file: data = yaml.safe_load(squadron_file) - unit_type = flying_type_from_name(data["aircraft"]) - if unit_type is None: - raise KeyError(f"Could not find any aircraft with the ID {unit_type}") + name = data["aircraft"] + try: + unit_type = AircraftType.named(name) + except KeyError as ex: + raise KeyError(f"Could not find any aircraft named {name}") from ex pilots = [Pilot(n, player=False) for n in data.get("pilots", [])] pilots.extend([Pilot(n, player=True) for n in data.get("players", [])]) @@ -215,13 +263,13 @@ class Squadron: return Squadron( name=data["name"], - nickname=data["nickname"], + nickname=data.get("nickname"), country=data["country"], role=data["role"], aircraft=unit_type, livery=data.get("livery"), mission_types=tuple(mission_types), - pilots=pilots, + pilot_pool=pilots, game=game, player=player, ) @@ -245,8 +293,8 @@ class SquadronLoader: yield Path(persistency.base_path()) / "Liberation/Squadrons" yield Path("resources/squadrons") - def load(self) -> dict[Type[FlyingType], list[Squadron]]: - squadrons: dict[Type[FlyingType], list[Squadron]] = defaultdict(list) + def load(self) -> dict[AircraftType, list[Squadron]]: + squadrons: dict[AircraftType, list[Squadron]] = defaultdict(list) country = self.game.country_for(self.player) faction = self.game.faction_for(self.player) any_country = country.startswith("Combined Joint Task Forces ") @@ -311,13 +359,13 @@ class AirWing: aircraft=aircraft, livery=None, mission_types=tuple(tasks_for_aircraft(aircraft)), - pilots=[], + pilot_pool=[], game=game, player=player, ) ] - def squadrons_for(self, aircraft: Type[FlyingType]) -> Sequence[Squadron]: + def squadrons_for(self, aircraft: AircraftType) -> Sequence[Squadron]: return self.squadrons[aircraft] def squadrons_for_task(self, task: FlightType) -> Iterator[Squadron]: @@ -325,7 +373,14 @@ class AirWing: if task in squadron.mission_types: yield squadron - def squadron_for(self, aircraft: Type[FlyingType]) -> Squadron: + def auto_assignable_for_task_with_type( + self, aircraft: AircraftType, task: FlightType + ) -> Iterator[Squadron]: + for squadron in self.squadrons_for(aircraft): + if squadron.can_auto_assign(task) and squadron.has_available_pilots: + yield squadron + + def squadron_for(self, aircraft: AircraftType) -> Squadron: return self.squadrons_for(aircraft)[0] def iter_squadrons(self) -> Iterator[Squadron]: @@ -334,6 +389,10 @@ class AirWing: def squadron_at_index(self, index: int) -> Squadron: return list(self.iter_squadrons())[index] + def replenish(self) -> None: + for squadron in self.iter_squadrons(): + squadron.replenish_lost_pilots() + def reset(self) -> None: for squadron in self.iter_squadrons(): squadron.return_all_pilots() diff --git a/game/theater/base.py b/game/theater/base.py index 15d14f85..4547e3d3 100644 --- a/game/theater/base.py +++ b/game/theater/base.py @@ -1,11 +1,10 @@ import itertools import logging -import typing -from typing import Dict, Type +from typing import Any -from dcs.unittype import FlyingType, VehicleType, UnitType - -from game.db import PRICES +from game.dcs.aircrafttype import AircraftType +from game.dcs.groundunittype import GroundUnitType +from game.dcs.unittype import UnitType BASE_MAX_STRENGTH = 1 BASE_MIN_STRENGTH = 0 @@ -13,8 +12,8 @@ BASE_MIN_STRENGTH = 0 class Base: def __init__(self): - self.aircraft: Dict[Type[FlyingType], int] = {} - self.armor: Dict[Type[VehicleType], int] = {} + self.aircraft: dict[AircraftType, int] = {} + self.armor: dict[GroundUnitType, int] = {} self.strength = 1 @property @@ -29,13 +28,10 @@ class Base: def total_armor_value(self) -> int: total = 0 for unit_type, count in self.armor.items(): - try: - total += PRICES[unit_type] * count - except KeyError: - logging.exception(f"No price found for {unit_type.id}") + total += unit_type.price * count return total - def total_units_of_type(self, unit_type) -> int: + def total_units_of_type(self, unit_type: UnitType) -> int: return sum( [ c @@ -44,43 +40,40 @@ class Base: ] ) - def commission_units(self, units: typing.Dict[typing.Type[UnitType], int]): + def commission_units(self, units: dict[Any, int]): for unit_type, unit_count in units.items(): if unit_count <= 0: continue - if issubclass(unit_type, VehicleType): - target_dict = self.armor - elif issubclass(unit_type, FlyingType): + target_dict: dict[Any, int] + if isinstance(unit_type, AircraftType): target_dict = self.aircraft + elif isinstance(unit_type, GroundUnitType): + target_dict = self.armor else: - logging.error( - f"Unexpected unit type of {unit_type}: " - f"{unit_type.__module__}.{unit_type.__name__}" - ) + logging.error(f"Unexpected unit type of {unit_type}") return target_dict[unit_type] = target_dict.get(unit_type, 0) + unit_count - def commit_losses(self, units_lost: typing.Dict[typing.Any, int]): - + def commit_losses(self, units_lost: dict[Any, int]): for unit_type, count in units_lost.items(): - + target_dict: dict[Any, int] if unit_type in self.aircraft: - target_array = self.aircraft + target_dict = self.aircraft elif unit_type in self.armor: - target_array = self.armor + target_dict = self.armor else: print("Base didn't find event type {}".format(unit_type)) continue - if unit_type not in target_array: + if unit_type not in target_dict: print("Base didn't find event type {}".format(unit_type)) continue - target_array[unit_type] = max(target_array[unit_type] - count, 0) - if target_array[unit_type] == 0: - del target_array[unit_type] + target_dict[unit_type] = max(target_dict[unit_type] - count, 0) + if target_dict[unit_type] == 0: + del target_dict[unit_type] def affect_strength(self, amount): self.strength += amount diff --git a/game/theater/conflicttheater.py b/game/theater/conflicttheater.py index 4883396b..d075a20c 100644 --- a/game/theater/conflicttheater.py +++ b/game/theater/conflicttheater.py @@ -16,10 +16,10 @@ from dcs.country import Country from dcs.mapping import Point from dcs.planes import F_15C from dcs.ships import ( - Bulker_Handy_Wind, - CVN_74_John_C__Stennis, - DDG_Arleigh_Burke_IIa, - LHA_1_Tarawa, + HandyWind, + Stennis, + USS_Arleigh_Burke_IIa, + LHA_Tarawa, ) from dcs.statics import Fortification, Warehouse from dcs.terrain import ( @@ -78,53 +78,53 @@ class MizCampaignLoader: OFF_MAP_UNIT_TYPE = F_15C.id - CV_UNIT_TYPE = CVN_74_John_C__Stennis.id - LHA_UNIT_TYPE = LHA_1_Tarawa.id - FRONT_LINE_UNIT_TYPE = Armor.APC_M113.id - SHIPPING_LANE_UNIT_TYPE = Bulker_Handy_Wind.id + CV_UNIT_TYPE = Stennis.id + LHA_UNIT_TYPE = LHA_Tarawa.id + FRONT_LINE_UNIT_TYPE = Armor.M_113.id + SHIPPING_LANE_UNIT_TYPE = HandyWind.id - FOB_UNIT_TYPE = Unarmed.Truck_SKP_11_Mobile_ATC.id + FOB_UNIT_TYPE = Unarmed.SKP_11.id FARP_HELIPAD = "SINGLE_HELIPAD" OFFSHORE_STRIKE_TARGET_UNIT_TYPE = Fortification.Oil_platform.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 + SHIP_UNIT_TYPE = USS_Arleigh_Burke_IIa.id + MISSILE_SITE_UNIT_TYPE = MissilesSS.Scud_B.id + COASTAL_DEFENSE_UNIT_TYPE = MissilesSS.Hy_launcher.id # Multiple options for air defenses so campaign designers can more accurately see # the coverage of their IADS for the expected type. LONG_RANGE_SAM_UNIT_TYPES = { - 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, + AirDefence.Patriot_ln.id, + AirDefence.S_300PS_5P85C_ln.id, + AirDefence.S_300PS_5P85D_ln.id, } MEDIUM_RANGE_SAM_UNIT_TYPES = { - AirDefence.SAM_Hawk_LN_M192.id, - AirDefence.SAM_SA_2_S_75_Guideline_LN.id, - AirDefence.SAM_SA_3_S_125_Goa_LN.id, + AirDefence.Hawk_ln.id, + AirDefence.S_75M_Volhov.id, + AirDefence._5p73_s_125_ln.id, } SHORT_RANGE_SAM_UNIT_TYPES = { - AirDefence.SAM_Avenger__Stinger.id, - AirDefence.SAM_Rapier_LN.id, - AirDefence.SAM_SA_19_Tunguska_Grison.id, - AirDefence.SAM_SA_9_Strela_1_Gaskin_TEL.id, + AirDefence.M1097_Avenger.id, + AirDefence.Rapier_fsa_launcher.id, + AirDefence._2S6_Tunguska.id, + AirDefence.Strela_1_9P31.id, } AAA_UNIT_TYPES = { - AirDefence.AAA_8_8cm_Flak_18.id, - AirDefence.SPAAA_Vulcan_M163.id, - AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish.id, + AirDefence.Flak18.id, + AirDefence.Vulcan.id, + AirDefence.ZSU_23_4_Shilka.id, } - EWR_UNIT_TYPE = AirDefence.EWR_1L13.id + EWR_UNIT_TYPE = AirDefence._1L13_EWR.id - ARMOR_GROUP_UNIT_TYPE = Armor.MBT_M1A2_Abrams.id + ARMOR_GROUP_UNIT_TYPE = Armor.M_1_Abrams.id FACTORY_UNIT_TYPE = Fortification.Workshop_A.id - AMMUNITION_DEPOT_UNIT_TYPE = Warehouse.Ammunition_depot.id + AMMUNITION_DEPOT_UNIT_TYPE = Warehouse._Ammunition_depot.id STRIKE_TARGET_UNIT_TYPE = Fortification.Tech_combine.id diff --git a/game/theater/controlpoint.py b/game/theater/controlpoint.py index 57ed2957..40496133 100644 --- a/game/theater/controlpoint.py +++ b/game/theater/controlpoint.py @@ -16,7 +16,6 @@ from typing import ( Optional, Set, TYPE_CHECKING, - Type, Union, Sequence, Iterable, @@ -25,14 +24,13 @@ from typing import ( from dcs.mapping import Point from dcs.ships import ( - CVN_74_John_C__Stennis, - CV_1143_5_Admiral_Kuznetsov, - LHA_1_Tarawa, - Type_071_Amphibious_Transport_Dock, + Stennis, + KUZNECOW, + LHA_Tarawa, + Type_071, ) from dcs.terrain.terrain import Airport, ParkingSlot from dcs.unit import Unit -from dcs.unittype import FlyingType, VehicleType from game import db from game.point_with_heading import PointWithHeading @@ -48,6 +46,8 @@ from .theatergroundobject import ( ) from ..db import PRICES from ..helipad import Helipad +from ..dcs.aircrafttype import AircraftType +from ..dcs.groundunittype import GroundUnitType from ..utils import nautical_miles from ..weather import Conditions @@ -126,19 +126,19 @@ class PresetLocations: @dataclass(frozen=True) class AircraftAllocations: - present: dict[Type[FlyingType], int] - ordered: dict[Type[FlyingType], int] - transferring: dict[Type[FlyingType], int] + present: dict[AircraftType, int] + ordered: dict[AircraftType, int] + transferring: dict[AircraftType, int] @property def total_value(self) -> int: total: int = 0 for unit_type, count in self.present.items(): - total += PRICES[unit_type] * count + total += unit_type.price * count for unit_type, count in self.ordered.items(): - total += PRICES[unit_type] * count + total += unit_type.price * count for unit_type, count in self.transferring.items(): - total += PRICES[unit_type] * count + total += unit_type.price * count return total @@ -161,13 +161,13 @@ class AircraftAllocations: @dataclass(frozen=True) class GroundUnitAllocations: - present: dict[Type[VehicleType], int] - ordered: dict[Type[VehicleType], int] - transferring: dict[Type[VehicleType], int] + present: dict[GroundUnitType, int] + ordered: dict[GroundUnitType, int] + transferring: dict[GroundUnitType, int] @property - def all(self) -> dict[Type[VehicleType], int]: - combined: dict[Type[VehicleType], int] = defaultdict(int) + def all(self) -> dict[GroundUnitType, int]: + combined: dict[GroundUnitType, int] = defaultdict(int) for unit_type, count in itertools.chain( self.present.items(), self.ordered.items(), self.transferring.items() ): @@ -178,11 +178,11 @@ class GroundUnitAllocations: def total_value(self) -> int: total: int = 0 for unit_type, count in self.present.items(): - total += PRICES[unit_type] * count + total += unit_type.price * count for unit_type, count in self.ordered.items(): - total += PRICES[unit_type] * count + total += unit_type.price * count for unit_type, count in self.transferring.items(): - total += PRICES[unit_type] * count + total += unit_type.price * count return total @@ -510,14 +510,14 @@ class ControlPoint(MissionTarget, ABC): for group in g.groups: for u in group.units: if db.unit_type_from_name(u.type) in [ - CVN_74_John_C__Stennis, - CV_1143_5_Admiral_Kuznetsov, + Stennis, + KUZNECOW, ]: return group.name elif g.dcs_identifier == "LHA": for group in g.groups: for u in group.units: - if db.unit_type_from_name(u.type) in [LHA_1_Tarawa]: + if db.unit_type_from_name(u.type) in [LHA_Tarawa]: return group.name return None @@ -568,24 +568,16 @@ class ControlPoint(MissionTarget, ABC): destination.control_point.base.commission_units({unit_type: 1}) destination = heapq.heappushpop(destinations, destination) - def capture_aircraft( - self, game: Game, airframe: Type[FlyingType], count: int - ) -> None: - try: - value = PRICES[airframe] * count - except KeyError: - logging.exception(f"Unknown price for {airframe.id}") - return - + def capture_aircraft(self, game: Game, airframe: AircraftType, count: int) -> None: + value = airframe.price * count game.adjust_budget(value, player=not self.captured) game.message( - f"No valid retreat destination in range of {self.name} for " - f"{airframe.id}. {count} aircraft have been captured and sold for " - f"${value}M." + f"No valid retreat destination in range of {self.name} for {airframe}" + f"{count} aircraft have been captured and sold for ${value}M." ) def aircraft_retreat_destination( - self, game: Game, airframe: Type[FlyingType] + self, game: Game, airframe: AircraftType ) -> Optional[ControlPoint]: closest = ObjectiveDistanceCache.get_closest_airfields(self) # TODO: Should be airframe dependent. @@ -603,10 +595,10 @@ class ControlPoint(MissionTarget, ABC): return None def _retreat_air_units( - self, game: Game, airframe: Type[FlyingType], count: int + self, game: Game, airframe: AircraftType, count: int ) -> None: while count: - logging.debug(f"Retreating {count} {airframe.id} from {self.name}") + logging.debug(f"Retreating {count} {airframe} from {self.name}") destination = self.aircraft_retreat_destination(game, airframe) if destination is None: self.capture_aircraft(game, airframe, count) @@ -642,16 +634,16 @@ class ControlPoint(MissionTarget, ABC): self.base.set_strength_to_minimum() @abstractmethod - def can_operate(self, aircraft: Type[FlyingType]) -> bool: + def can_operate(self, aircraft: AircraftType) -> bool: ... - def aircraft_transferring(self, game: Game) -> dict[Type[FlyingType], int]: + def aircraft_transferring(self, game: Game) -> dict[AircraftType, int]: if self.captured: ato = game.blue_ato else: ato = game.red_ato - transferring: defaultdict[Type[FlyingType], int] = defaultdict(int) + transferring: defaultdict[AircraftType, int] = defaultdict(int) for package in ato.packages: for flight in package.flights: if flight.departure == flight.arrival: @@ -716,7 +708,7 @@ class ControlPoint(MissionTarget, ABC): def allocated_aircraft(self, game: Game) -> AircraftAllocations: on_order = {} for unit_bought, count in self.pending_unit_deliveries.units.items(): - if issubclass(unit_bought, FlyingType): + if isinstance(unit_bought, AircraftType): on_order[unit_bought] = count return AircraftAllocations( @@ -728,10 +720,10 @@ class ControlPoint(MissionTarget, ABC): ) -> GroundUnitAllocations: on_order = {} for unit_bought, count in self.pending_unit_deliveries.units.items(): - if issubclass(unit_bought, VehicleType): + if isinstance(unit_bought, GroundUnitType): on_order[unit_bought] = count - transferring: dict[Type[VehicleType], int] = defaultdict(int) + transferring: dict[GroundUnitType, int] = defaultdict(int) for transfer in transfers: if transfer.destination == self: for unit_type, count in transfer.units.items(): @@ -828,7 +820,7 @@ class Airfield(ControlPoint): self.airport = airport self._runway_status = RunwayStatus() - def can_operate(self, aircraft: FlyingType) -> bool: + def can_operate(self, aircraft: AircraftType) -> bool: # TODO: Allow helicopters. # Need to implement ground spawns so the helos don't use the runway. # TODO: Allow harrier. @@ -940,10 +932,10 @@ class NavalControlPoint(ControlPoint, ABC): for group in self.find_main_tgo().groups: for u in group.units: if db.unit_type_from_name(u.type) in [ - CVN_74_John_C__Stennis, - LHA_1_Tarawa, - CV_1143_5_Admiral_Kuznetsov, - Type_071_Amphibious_Transport_Dock, + Stennis, + LHA_Tarawa, + KUZNECOW, + Type_071, ]: return True return False @@ -1012,8 +1004,8 @@ class Carrier(NavalControlPoint): def is_carrier(self): return True - def can_operate(self, aircraft: FlyingType) -> bool: - return aircraft in db.CARRIER_CAPABLE + def can_operate(self, aircraft: AircraftType) -> bool: + return aircraft.carrier_capable @property def total_aircraft_parking(self) -> int: @@ -1046,8 +1038,8 @@ class Lha(NavalControlPoint): def is_lha(self) -> bool: return True - def can_operate(self, aircraft: FlyingType) -> bool: - return aircraft in db.LHA_CAPABLE + def can_operate(self, aircraft: AircraftType) -> bool: + return aircraft.lha_capable @property def total_aircraft_parking(self) -> int: @@ -1086,7 +1078,7 @@ class OffMapSpawn(ControlPoint): def total_aircraft_parking(self) -> int: return 1000 - def can_operate(self, aircraft: FlyingType) -> bool: + def can_operate(self, aircraft: AircraftType) -> bool: return True @property diff --git a/game/theater/theatergroundobject.py b/game/theater/theatergroundobject.py index e4ff3bca..df637cbc 100644 --- a/game/theater/theatergroundobject.py +++ b/game/theater/theatergroundobject.py @@ -597,7 +597,8 @@ class EwrGroundObject(TheaterGroundObject): @property def group_name(self) -> str: # Prefix the group names with the side color so Skynet can find them. - return f"{self.faction_color}|{super().group_name}" + # Use Group Id and uppercase EWR + return f"{self.faction_color}|EWR|{self.group_id}" def mission_types(self, for_player: bool) -> Iterator[FlightType]: from gen.flights.flight import FlightType diff --git a/game/transfers.py b/game/transfers.py index 8d26113a..5543d572 100644 --- a/game/transfers.py +++ b/game/transfers.py @@ -12,14 +12,14 @@ from typing import ( List, Optional, TYPE_CHECKING, - Type, TypeVar, Sequence, ) from dcs.mapping import Point -from dcs.unittype import FlyingType, VehicleType +from game.dcs.aircrafttype import AircraftType +from game.dcs.groundunittype import GroundUnitType from game.procurement import AircraftProcurementRequest from game.squadrons import Squadron from game.theater import ControlPoint, MissionTarget @@ -29,7 +29,7 @@ from game.theater.transitnetwork import ( ) from game.utils import meters, nautical_miles from gen.ato import Package -from gen.flights.ai_flight_planner_db import TRANSPORT_CAPABLE +from gen.flights.ai_flight_planner_db import TRANSPORT_CAPABLE, aircraft_for_task from gen.flights.closestairfields import ObjectiveDistanceCache from gen.flights.flight import Flight, FlightType from gen.flights.flightplan import FlightPlanBuilder @@ -72,7 +72,7 @@ class TransferOrder: player: bool = field(init=False) #: The units being transferred. - units: Dict[Type[VehicleType], int] + units: Dict[GroundUnitType, int] transport: Optional[Transport] = field(default=None) @@ -89,7 +89,7 @@ class TransferOrder: def kill_all(self) -> None: self.units.clear() - def kill_unit(self, unit_type: Type[VehicleType]) -> None: + def kill_unit(self, unit_type: GroundUnitType) -> None: if unit_type not in self.units or not self.units[unit_type]: raise KeyError(f"{self.destination} has no {unit_type} remaining") self.units[unit_type] -= 1 @@ -98,7 +98,7 @@ class TransferOrder: def size(self) -> int: return sum(c for c in self.units.values()) - def iter_units(self) -> Iterator[Type[VehicleType]]: + def iter_units(self) -> Iterator[GroundUnitType]: for unit_type, count in self.units.items(): for _ in range(count): yield unit_type @@ -156,7 +156,7 @@ class Airlift(Transport): self.flight = flight @property - def units(self) -> Dict[Type[VehicleType], int]: + def units(self) -> Dict[GroundUnitType, int]: return self.transfer.units @property @@ -191,9 +191,9 @@ class AirliftPlanner: self.package = Package(target=next_stop, auto_asap=True) def compatible_with_mission( - self, unit_type: Type[FlyingType], airfield: ControlPoint + self, unit_type: AircraftType, airfield: ControlPoint ) -> bool: - if not unit_type in TRANSPORT_CAPABLE: + if unit_type not in aircraft_for_task(FlightType.TRANSPORT): return False if not self.transfer.origin.can_operate(unit_type): return False @@ -201,7 +201,7 @@ class AirliftPlanner: return False # Cargo planes have no maximum range. - if not unit_type.helicopter: + if not unit_type.dcs_unit_type.helicopter: return True # A helicopter that is transport capable and able to operate at both bases. Need @@ -227,36 +227,42 @@ class AirliftPlanner: distance_cache = ObjectiveDistanceCache.get_closest_airfields( self.transfer.position ) + air_wing = self.game.air_wing_for(self.for_player) for cp in distance_cache.closest_airfields: if cp.captured != self.for_player: continue inventory = self.game.aircraft_inventory.for_control_point(cp) for unit_type, available in inventory.all_aircraft: - squadrons = [ - s - for s in self.game.air_wing_for(self.for_player).squadrons_for( - unit_type - ) - if FlightType.TRANSPORT in s.auto_assignable_mission_types - ] - if not squadrons: - continue - squadron = squadrons[0] - if self.compatible_with_mission(unit_type, cp): - while available and self.transfer.transport is None: - flight_size = self.create_airlift_flight(squadron, inventory) - available -= flight_size + squadrons = air_wing.auto_assignable_for_task_with_type( + unit_type, FlightType.TRANSPORT + ) + for squadron in squadrons: + if self.compatible_with_mission(unit_type, cp): + while ( + available + and squadron.has_available_pilots + and self.transfer.transport is None + ): + flight_size = self.create_airlift_flight( + squadron, inventory + ) + available -= flight_size if self.package.flights: self.game.ato_for(self.for_player).add_package(self.package) def create_airlift_flight( self, squadron: Squadron, inventory: ControlPointAircraftInventory ) -> int: - available = inventory.available(squadron.aircraft) - capacity_each = 1 if squadron.aircraft.helicopter else 2 + available_aircraft = inventory.available(squadron.aircraft) + capacity_each = 1 if squadron.aircraft.dcs_unit_type.helicopter else 2 required = math.ceil(self.transfer.size / capacity_each) - flight_size = min(required, available, squadron.aircraft.group_size_max) + flight_size = min( + required, + available_aircraft, + squadron.aircraft.dcs_unit_type.group_size_max, + squadron.number_of_available_pilots, + ) capacity = flight_size * capacity_each if capacity < self.transfer.size: @@ -308,7 +314,7 @@ class MultiGroupTransport(MissionTarget, Transport): transfer.transport = None self.transfers.remove(transfer) - def kill_unit(self, unit_type: Type[VehicleType]) -> None: + def kill_unit(self, unit_type: GroundUnitType) -> None: for transfer in self.transfers: try: transfer.kill_unit(unit_type) @@ -331,13 +337,18 @@ class MultiGroupTransport(MissionTarget, Transport): return sum(sum(t.units.values()) for t in self.transfers) @property - def units(self) -> Dict[Type[VehicleType], int]: - units: Dict[Type[VehicleType], int] = defaultdict(int) + def units(self) -> dict[GroundUnitType, int]: + units: Dict[GroundUnitType, int] = defaultdict(int) for transfer in self.transfers: for unit_type, count in transfer.units.items(): units[unit_type] += count return units + def iter_units(self) -> Iterator[GroundUnitType]: + for unit_type, count in self.units.items(): + for _ in range(count): + yield unit_type + @property def player_owned(self) -> bool: return self.origin.captured diff --git a/game/unitdelivery.py b/game/unitdelivery.py index fd250825..4de3addf 100644 --- a/game/unitdelivery.py +++ b/game/unitdelivery.py @@ -3,12 +3,11 @@ from __future__ import annotations import logging from collections import defaultdict from dataclasses import dataclass -from typing import Dict, Optional, TYPE_CHECKING, Type - -from dcs.unittype import UnitType, VehicleType +from typing import Dict, Optional, TYPE_CHECKING, Any from game.theater import ControlPoint -from .db import PRICES +from .dcs.groundunittype import GroundUnitType +from .dcs.unittype import UnitType from .theater.transitnetwork import ( NoPathError, TransitNetwork, @@ -29,16 +28,16 @@ class PendingUnitDeliveries: self.destination = destination # Maps unit type to order quantity. - self.units: Dict[Type[UnitType], int] = defaultdict(int) + self.units: Dict[UnitType, int] = defaultdict(int) def __str__(self) -> str: return f"Pending delivery to {self.destination}" - def order(self, units: Dict[Type[UnitType], int]) -> None: + def order(self, units: Dict[UnitType, int]) -> None: for k, v in units.items(): self.units[k] += v - def sell(self, units: Dict[Type[UnitType], int]) -> None: + def sell(self, units: Dict[UnitType, int]) -> None: for k, v in units.items(): self.units[k] -= v @@ -46,24 +45,20 @@ class PendingUnitDeliveries: self.refund(game, self.units) self.units = defaultdict(int) - def refund(self, game: Game, units: Dict[Type[UnitType], int]) -> None: + def refund(self, game: Game, units: Dict[UnitType, int]) -> None: for unit_type, count in units.items(): - try: - price = PRICES[unit_type] - except KeyError: - logging.error(f"Could not refund {unit_type.id}, price unknown") - continue + logging.info(f"Refunding {count} {unit_type} at {self.destination.name}") + game.adjust_budget( + unit_type.price * count, player=self.destination.captured + ) - logging.info(f"Refunding {count} {unit_type.id} at {self.destination.name}") - game.adjust_budget(price * count, player=self.destination.captured) - - def pending_orders(self, unit_type: Type[UnitType]) -> int: + def pending_orders(self, unit_type: UnitType) -> int: pending_units = self.units.get(unit_type) if pending_units is None: pending_units = 0 return pending_units - def available_next_turn(self, unit_type: Type[UnitType]) -> int: + def available_next_turn(self, unit_type: UnitType) -> int: current_units = self.destination.base.total_units_of_type(unit_type) return self.pending_orders(unit_type) + current_units @@ -77,15 +72,14 @@ class PendingUnitDeliveries: self.refund_all(game) return - bought_units: Dict[Type[UnitType], int] = {} - units_needing_transfer: Dict[Type[VehicleType], int] = {} - sold_units: Dict[Type[UnitType], int] = {} + bought_units: Dict[UnitType, int] = {} + units_needing_transfer: Dict[GroundUnitType, int] = {} + sold_units: Dict[UnitType, int] = {} for unit_type, count in self.units.items(): coalition = "Ally" if self.destination.captured else "Enemy" - name = unit_type.id - + d: dict[Any, int] if ( - issubclass(unit_type, VehicleType) + isinstance(unit_type, GroundUnitType) and self.destination != ground_unit_source ): source = ground_unit_source @@ -97,11 +91,11 @@ class PendingUnitDeliveries: if count >= 0: d[unit_type] = count game.message( - f"{coalition} reinforcements: {name} x {count} at {source}" + f"{coalition} reinforcements: {unit_type} x {count} at {source}" ) else: sold_units[unit_type] = -count - game.message(f"{coalition} sold: {name} x {-count} at {source}") + game.message(f"{coalition} sold: {unit_type} x {-count} at {source}") self.units = defaultdict(int) self.destination.base.commission_units(bought_units) @@ -112,7 +106,7 @@ class PendingUnitDeliveries: self.create_transfer(game, ground_unit_source, units_needing_transfer) def create_transfer( - self, game: Game, source: ControlPoint, units: Dict[Type[VehicleType], int] + self, game: Game, source: ControlPoint, units: Dict[GroundUnitType, int] ) -> None: game.transfers.new_transfer(TransferOrder(source, self.destination, units)) diff --git a/game/unitmap.py b/game/unitmap.py index c1778091..98793991 100644 --- a/game/unitmap.py +++ b/game/unitmap.py @@ -2,13 +2,12 @@ import itertools import math from dataclasses import dataclass -from typing import Dict, Optional, Type +from typing import Dict, Optional from dcs.unit import Unit from dcs.unitgroup import FlyingGroup, Group, VehicleGroup -from dcs.unittype import VehicleType -from game import db +from game.dcs.groundunittype import GroundUnitType from game.squadrons import Pilot from game.theater import Airfield, ControlPoint, TheaterGroundObject from game.theater.theatergroundobject import BuildingGroundObject, SceneryGroundObject @@ -19,12 +18,12 @@ from gen.flights.flight import Flight @dataclass(frozen=True) class FlyingUnit: flight: Flight - pilot: Pilot + pilot: Optional[Pilot] @dataclass(frozen=True) class FrontLineUnit: - unit_type: Type[VehicleType] + unit_type: GroundUnitType origin: ControlPoint @@ -37,13 +36,13 @@ class GroundObjectUnit: @dataclass(frozen=True) class ConvoyUnit: - unit_type: Type[VehicleType] + unit_type: GroundUnitType convoy: Convoy @dataclass(frozen=True) class AirliftUnits: - cargo: tuple[Type[VehicleType], ...] + cargo: tuple[GroundUnitType, ...] transfer: TransferOrder @@ -70,8 +69,6 @@ class UnitMap: name = str(unit.name) if name in self.aircraft: raise RuntimeError(f"Duplicate unit name: {name}") - if pilot is None: - raise ValueError(f"{name} has no pilot assigned") self.aircraft[name] = FlyingUnit(flight, pilot) if flight.cargo is not None: self.add_airlift_units(group, flight.cargo) @@ -87,20 +84,15 @@ class UnitMap: def airfield(self, name: str) -> Optional[Airfield]: return self.airfields.get(name, None) - def add_front_line_units(self, group: Group, origin: ControlPoint) -> None: + def add_front_line_units( + self, group: Group, origin: ControlPoint, unit_type: GroundUnitType + ) -> None: for unit in group.units: # The actual name is a String (the pydcs translatable string), which # doesn't define __eq__. name = str(unit.name) if name in self.front_line_units: raise RuntimeError(f"Duplicate front line unit: {name}") - unit_type = db.unit_type_from_name(unit.type) - if unit_type is None: - raise RuntimeError(f"Unknown unit type: {unit.type}") - if not issubclass(unit_type, VehicleType): - raise RuntimeError( - f"{name} is a {unit_type.__name__}, expected a VehicleType" - ) self.front_line_units[name] = FrontLineUnit(unit_type, origin) def front_line_unit(self, name: str) -> Optional[FrontLineUnit]: @@ -143,19 +135,12 @@ class UnitMap: return self.ground_object_units.get(name, None) def add_convoy_units(self, group: Group, convoy: Convoy) -> None: - for unit in group.units: + for unit, unit_type in zip(group.units, convoy.iter_units()): # The actual name is a String (the pydcs translatable string), which # doesn't define __eq__. name = str(unit.name) if name in self.convoys: raise RuntimeError(f"Duplicate convoy unit: {name}") - unit_type = db.unit_type_from_name(unit.type) - if unit_type is None: - raise RuntimeError(f"Unknown unit type: {unit.type}") - if not issubclass(unit_type, VehicleType): - raise RuntimeError( - f"{name} is a {unit_type.__name__}, expected a VehicleType" - ) self.convoys[name] = ConvoyUnit(unit_type, convoy) def convoy_unit(self, name: str) -> Optional[ConvoyUnit]: diff --git a/game/utils.py b/game/utils.py index a35a41cd..0bd1f79c 100644 --- a/game/utils.py +++ b/game/utils.py @@ -58,6 +58,10 @@ class Distance: def from_nautical_miles(cls, value: float) -> Distance: return cls(value * NM_TO_METERS) + @classmethod + def inf(cls) -> Distance: + return cls.from_meters(math.inf) + def __add__(self, other: Distance) -> Distance: return meters(self.meters + other.meters) diff --git a/game/version.py b/game/version.py index 3da26c96..cd2f1ffa 100644 --- a/game/version.py +++ b/game/version.py @@ -2,7 +2,7 @@ from pathlib import Path def _build_version_string() -> str: - components = ["4.0"] + components = ["4.0.0"] build_number_path = Path("resources/buildnumber") if build_number_path.exists(): with build_number_path.open("r") as build_number_file: @@ -70,9 +70,9 @@ VERSION = _build_version_string() #: Version 4.2 #: * Adds support for AAA objectives. Place with any of the following units (either red #: or blue): -#: * AAA_8_8cm_Flak_18, -#: * SPAAA_Vulcan_M163, -#: * SPAAA_ZSU_23_4_Shilka_Gun_Dish, +#: * Flak18, +#: * Vulcan, +#: * ZSU_23_4_Shilka, #: #: Version 5.0 #: * Ammunition Depots objective locations are now predetermined using the "Ammunition @@ -87,4 +87,7 @@ VERSION = _build_version_string() #: Version 6.0 #: * Random objective generation no is longer supported. Fixed objective locations were #: added in 4.1. -CAMPAIGN_FORMAT_VERSION = (6, 0) +#: +#: Version 6.1 +#: * Support for new Syrian airfields in DCS 2.7.2.7910.1 (Cyprus update). +CAMPAIGN_FORMAT_VERSION = (6, 1) diff --git a/gen/aircraft.py b/gen/aircraft.py index 7e55ae20..c3121c8d 100644 --- a/gen/aircraft.py +++ b/gen/aircraft.py @@ -12,30 +12,17 @@ from dcs.action import AITaskPush, ActivateGroup from dcs.condition import CoalitionHasAirdrome, TimeAfter from dcs.country import Country from dcs.flyingunit import FlyingUnit -from dcs.helicopters import UH_1H, helicopter_map from dcs.mapping import Point from dcs.mission import Mission, StartType from dcs.planes import ( AJS37, B_17G, B_52H, - Bf_109K_4, C_101CC, C_101EB, - FW_190A8, - FW_190D9, F_14B, - I_16, JF_17, - Ju_88A4, - P_47D_30, - P_47D_30bl1, - P_47D_40, - P_51D, - P_51D_30_NA, PlaneType, - SpitfireLFMkIX, - SpitfireLFMkIXCW, Su_33, Tu_22M3, ) @@ -76,12 +63,12 @@ from dcs.terrain.terrain import Airport, NoParkingSlotError from dcs.triggers import Event, TriggerOnce, TriggerRule from dcs.unit import Unit, Skill from dcs.unitgroup import FlyingGroup, ShipGroup, StaticGroup -from dcs.unittype import FlyingType, UnitType +from dcs.unittype import FlyingType from game import db from game.data.cap_capabilities_db import GUNFIGHTERS from game.data.weapons import Pylon -from game.db import GUN_RELIANT_AIRFRAMES +from game.dcs.aircrafttype import AircraftType from game.factions.faction import Faction from game.settings import Settings from game.squadrons import Pilot @@ -105,7 +92,7 @@ from gen.flights.flight import ( FlightWaypoint, FlightWaypointType, ) -from gen.radios import MHz, Radio, RadioFrequency, RadioRegistry, get_radio +from gen.radios import RadioFrequency, RadioRegistry from gen.runways import RunwayData from gen.tacan import TacanBand, TacanRegistry from .airsupportgen import AirSupport, AwacsInfo, TankerInfo @@ -131,16 +118,6 @@ RTB_ALTITUDE = meters(800) RTB_DISTANCE = 5000 HELI_ALT = 500 -# Note that fallback radio channels will *not* be reserved. It's possible that -# flights using these will overlap with other channels. This is because we would -# need to make sure we fell back to a frequency that is not used by any beacon -# or ATC, which we don't have the information to predict. Deal with the minor -# annoyance for now since we'll be fleshing out radio info soon enough. -ALLIES_WW2_CHANNEL = MHz(124) -GERMAN_WW2_CHANNEL = MHz(40) -HELICOPTER_CHANNEL = MHz(127) -UHF_FALLBACK_CHANNEL = MHz(251) - TARGET_WAYPOINTS = ( FlightWaypointType.TARGET_GROUP_LOC, FlightWaypointType.TARGET_POINT, @@ -148,121 +125,6 @@ TARGET_WAYPOINTS = ( ) -# 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: - return HELICOPTER_CHANNEL - - german_ww2_aircraft = [ - Bf_109K_4, - FW_190A8, - FW_190D9, - Ju_88A4, - ] - - if unit_type in german_ww2_aircraft: - return GERMAN_WW2_CHANNEL - - allied_ww2_aircraft = [ - I_16, - P_47D_30, - P_47D_30bl1, - P_47D_40, - P_51D, - P_51D_30_NA, - SpitfireLFMkIX, - SpitfireLFMkIXCW, - ] - - if unit_type in allied_ww2_aircraft: - return ALLIES_WW2_CHANNEL - - return UHF_FALLBACK_CHANNEL - - -class ChannelNamer: - """Base class allowing channel name customization per-aircraft. - - Most aircraft will want to customize this behavior, but the default is - reasonable for any aircraft with numbered radios. - """ - - @staticmethod - def channel_name(radio_id: int, channel_id: int) -> str: - """Returns the name of the channel for the given radio and channel.""" - return f"COMM{radio_id} Ch {channel_id}" - - -class SingleRadioChannelNamer(ChannelNamer): - """Channel namer for the aircraft with only a single radio. - - Aircraft like the MiG-19P and the MiG-21bis only have a single radio, so - it's not necessary for us to name the radio when naming the channel. - """ - - @staticmethod - def channel_name(radio_id: int, channel_id: int) -> str: - return f"Ch {channel_id}" - - -class HueyChannelNamer(ChannelNamer): - """Channel namer for the UH-1H.""" - - @staticmethod - def channel_name(radio_id: int, channel_id: int) -> str: - return f"COM3 Ch {channel_id}" - - -class MirageChannelNamer(ChannelNamer): - """Channel namer for the M-2000.""" - - @staticmethod - def channel_name(radio_id: int, channel_id: int) -> str: - radio_name = ["V/UHF", "UHF"][radio_id - 1] - return f"{radio_name} Ch {channel_id}" - - -class TomcatChannelNamer(ChannelNamer): - """Channel namer for the F-14.""" - - @staticmethod - def channel_name(radio_id: int, channel_id: int) -> str: - radio_name = ["UHF", "VHF/UHF"][radio_id - 1] - return f"{radio_name} Ch {channel_id}" - - -class ViggenChannelNamer(ChannelNamer): - """Channel namer for the AJS37.""" - - @staticmethod - def channel_name(radio_id: int, channel_id: int) -> str: - if channel_id >= 4: - channel_letter = "EFGH"[channel_id - 4] - return f"FR 24 {channel_letter}" - return f"FR 22 Special {channel_id}" - - -class ViperChannelNamer(ChannelNamer): - """Channel namer for the F-16.""" - - @staticmethod - def channel_name(radio_id: int, channel_id: int) -> str: - return f"COM{radio_id} Ch {channel_id}" - - -class SCR522ChannelNamer(ChannelNamer): - """ - Channel namer for P-51 & P-47D - """ - - @staticmethod - def channel_name(radio_id: int, channel_id: int) -> str: - if channel_id > 3: - return "?" - else: - return f"Button " + "ABCD"[channel_id - 1] - - @dataclass(frozen=True) class ChannelAssignment: radio_id: int @@ -276,9 +138,6 @@ class FlightData: #: The package that the flight belongs to. package: Package - #: The country that the flight belongs to. - country: str - flight_type: FlightType #: All units in the flight. @@ -319,7 +178,7 @@ class FlightData: def __init__( self, package: Package, - country: str, + aircraft_type: AircraftType, flight_type: FlightType, units: List[FlyingUnit], size: int, @@ -335,7 +194,7 @@ class FlightData: custom_name: Optional[str], ) -> None: self.package = package - self.country = country + self.aircraft_type = aircraft_type self.flight_type = flight_type self.units = units self.size = size @@ -357,11 +216,6 @@ class FlightData: """List of playable units in the flight.""" return [u for u in self.units if u.is_human()] - @property - def aircraft_type(self) -> FlyingType: - """Returns the type of aircraft in this flight.""" - return self.units[0].unit_type - def num_radio_channels(self, radio_id: int) -> int: """Returns the number of preset channels for the given radio.""" # Note: pydcs only initializes the radio presets for client slots. @@ -387,302 +241,6 @@ class FlightData: ) -class RadioChannelAllocator: - """Base class for radio channel allocators.""" - - def assign_channels_for_flight( - self, flight: FlightData, air_support: AirSupport - ) -> None: - """Assigns mission frequencies to preset channels for the flight.""" - raise NotImplementedError - - -@dataclass(frozen=True) -class CommonRadioChannelAllocator(RadioChannelAllocator): - """Radio channel allocator suitable for most aircraft. - - Most of the aircraft with preset channels available have one or more radios - with 20 or more channels available (typically per-radio, but this is not the - case for the JF-17). - """ - - #: Index of the radio used for intra-flight communications. Matches the - #: index of the panel_radio field of the pydcs.dcs.planes object. - inter_flight_radio_index: Optional[int] - - #: Index of the radio used for intra-flight communications. Matches the - #: index of the panel_radio field of the pydcs.dcs.planes object. - intra_flight_radio_index: Optional[int] - - def assign_channels_for_flight( - self, flight: FlightData, air_support: AirSupport - ) -> None: - if self.intra_flight_radio_index is not None: - flight.assign_channel( - self.intra_flight_radio_index, 1, flight.intra_flight_channel - ) - - if self.inter_flight_radio_index is None: - return - - # For cases where the inter-flight and intra-flight radios share presets - # (the JF-17 only has one set of channels, even though it can use two - # channels simultaneously), start assigning inter-flight channels at 2. - radio_id = self.inter_flight_radio_index - if self.intra_flight_radio_index == radio_id: - first_channel = 2 - else: - first_channel = 1 - - last_channel = flight.num_radio_channels(radio_id) - channel_alloc = iter(range(first_channel, last_channel + 1)) - - if flight.departure.atc is not None: - flight.assign_channel(radio_id, next(channel_alloc), flight.departure.atc) - - # TODO: If there ever are multiple AWACS, limit to mission relevant. - for awacs in air_support.awacs: - flight.assign_channel(radio_id, next(channel_alloc), awacs.freq) - - if flight.arrival != flight.departure and flight.arrival.atc is not None: - flight.assign_channel(radio_id, next(channel_alloc), flight.arrival.atc) - - try: - # TODO: Skip incompatible tankers. - for tanker in air_support.tankers: - flight.assign_channel(radio_id, next(channel_alloc), tanker.freq) - - if flight.divert is not None and flight.divert.atc is not None: - flight.assign_channel(radio_id, next(channel_alloc), flight.divert.atc) - except StopIteration: - # Any remaining channels are nice-to-haves, but not necessary for - # the few aircraft with a small number of channels available. - pass - - -@dataclass(frozen=True) -class NoOpChannelAllocator(RadioChannelAllocator): - """Channel allocator for aircraft that don't support preset channels.""" - - def assign_channels_for_flight( - self, flight: FlightData, air_support: AirSupport - ) -> None: - pass - - -@dataclass(frozen=True) -class FarmerRadioChannelAllocator(RadioChannelAllocator): - """Preset channel allocator for the MiG-19P.""" - - def assign_channels_for_flight( - self, flight: FlightData, air_support: AirSupport - ) -> None: - # The Farmer only has 6 preset channels. It also only has a VHF radio, - # and currently our ATC data and AWACS are only in the UHF band. - radio_id = 1 - flight.assign_channel(radio_id, 1, flight.intra_flight_channel) - # TODO: Assign 4-6 to VHF frequencies of departure, arrival, and divert. - # TODO: Assign 2 and 3 to AWACS if it is VHF. - - -@dataclass(frozen=True) -class ViggenRadioChannelAllocator(RadioChannelAllocator): - """Preset channel allocator for the AJS37.""" - - def assign_channels_for_flight( - self, flight: FlightData, air_support: AirSupport - ) -> None: - # The Viggen's preset channels are handled differently from other - # aircraft. The aircraft automatically configures channels for every - # allied flight in the game (including AWACS) and for every airfield. As - # such, we don't need to allocate any of those. There are seven presets - # we can modify, however: three channels for the main radio intended for - # communication with wingmen, and four emergency channels for the backup - # radio. We'll set the first channel of the main radio to the - # intra-flight channel, and the first three emergency channels to each - # of the flight plan's airfields. The fourth emergency channel is always - # the guard channel. - radio_id = 1 - flight.assign_channel(radio_id, 1, flight.intra_flight_channel) - if flight.departure.atc is not None: - flight.assign_channel(radio_id, 4, flight.departure.atc) - if flight.arrival.atc is not None: - flight.assign_channel(radio_id, 5, flight.arrival.atc) - # TODO: Assign divert to 6 when we support divert airfields. - - -@dataclass(frozen=True) -class SCR522RadioChannelAllocator(RadioChannelAllocator): - """Preset channel allocator for the SCR522 WW2 radios. (4 channels)""" - - def assign_channels_for_flight( - self, flight: FlightData, air_support: AirSupport - ) -> None: - radio_id = 1 - flight.assign_channel(radio_id, 1, flight.intra_flight_channel) - if flight.departure.atc is not None: - flight.assign_channel(radio_id, 2, flight.departure.atc) - if flight.arrival.atc is not None: - flight.assign_channel(radio_id, 3, flight.arrival.atc) - - # TODO : Some GCI on Channel 4 ? - - -@dataclass(frozen=True) -class AircraftData: - """Additional aircraft data not exposed by pydcs.""" - - #: The type of radio used for inter-flight communications. - inter_flight_radio: Radio - - #: The type of radio used for intra-flight communications. - intra_flight_radio: Radio - - #: The radio preset channel allocator, if the aircraft supports channel - #: presets. If the aircraft does not support preset channels, this will be - #: None. - channel_allocator: Optional[RadioChannelAllocator] - - #: Defines how channels should be named when printed in the kneeboard. - channel_namer: Type[ChannelNamer] = ChannelNamer - - -# Indexed by the id field of the pydcs PlaneType. -AIRCRAFT_DATA: Dict[str, AircraftData] = { - "A-10C": AircraftData( - inter_flight_radio=get_radio("AN/ARC-164"), - # VHF for intraflight is not accepted anymore by DCS - # (see https://forums.eagle.ru/showthread.php?p=4499738). - intra_flight_radio=get_radio("AN/ARC-164"), - channel_allocator=NoOpChannelAllocator(), - ), - "AJS37": AircraftData( - # The AJS37 has somewhat unique radio configuration. Two backup radio - # (FR 24) can only operate simultaneously with the main radio in guard - # mode. As such, we only use the main radio for both inter- and intra- - # flight communication. - inter_flight_radio=get_radio("FR 22"), - intra_flight_radio=get_radio("FR 22"), - channel_allocator=ViggenRadioChannelAllocator(), - channel_namer=ViggenChannelNamer, - ), - "AV8BNA": AircraftData( - inter_flight_radio=get_radio("AN/ARC-210"), - intra_flight_radio=get_radio("AN/ARC-210"), - channel_allocator=CommonRadioChannelAllocator( - inter_flight_radio_index=2, intra_flight_radio_index=1 - ), - ), - "F-14B": AircraftData( - inter_flight_radio=get_radio("AN/ARC-159"), - intra_flight_radio=get_radio("AN/ARC-182"), - channel_allocator=CommonRadioChannelAllocator( - inter_flight_radio_index=1, intra_flight_radio_index=2 - ), - channel_namer=TomcatChannelNamer, - ), - "F-16C_50": AircraftData( - inter_flight_radio=get_radio("AN/ARC-164"), - intra_flight_radio=get_radio("AN/ARC-222"), - # COM2 is the AN/ARC-222, which is the VHF radio we want to use for - # intra-flight communication to leave COM1 open for UHF inter-flight. - channel_allocator=CommonRadioChannelAllocator( - inter_flight_radio_index=1, intra_flight_radio_index=2 - ), - channel_namer=ViperChannelNamer, - ), - "FA-18C_hornet": AircraftData( - inter_flight_radio=get_radio("AN/ARC-210"), - intra_flight_radio=get_radio("AN/ARC-210"), - # DCS will clobber channel 1 of the first radio compatible with the - # flight's assigned frequency. Since the F/A-18's two radios are both - # AN/ARC-210s, radio 1 will be compatible regardless of which frequency - # is assigned, so we must use radio 1 for the intra-flight radio. - channel_allocator=CommonRadioChannelAllocator( - inter_flight_radio_index=2, intra_flight_radio_index=1 - ), - ), - "JF-17": AircraftData( - inter_flight_radio=get_radio("R&S M3AR UHF"), - intra_flight_radio=get_radio("R&S M3AR VHF"), - channel_allocator=CommonRadioChannelAllocator( - inter_flight_radio_index=1, intra_flight_radio_index=1 - ), - # Same naming pattern as the Viper, so just reuse that. - channel_namer=ViperChannelNamer, - ), - "Ka-50": AircraftData( - inter_flight_radio=get_radio("R-800L1"), - intra_flight_radio=get_radio("R-800L1"), - # The R-800L1 doesn't have preset channels, and the other radio is for - # communications with FAC and ground units, which don't currently have - # radios assigned, so no channels to configure. - channel_allocator=NoOpChannelAllocator(), - ), - "M-2000C": AircraftData( - inter_flight_radio=get_radio("TRT ERA 7000 V/UHF"), - intra_flight_radio=get_radio("TRT ERA 7200 UHF"), - channel_allocator=CommonRadioChannelAllocator( - inter_flight_radio_index=1, intra_flight_radio_index=2 - ), - channel_namer=MirageChannelNamer, - ), - "MiG-15bis": AircraftData( - inter_flight_radio=get_radio("RSI-6K HF"), - intra_flight_radio=get_radio("RSI-6K HF"), - channel_allocator=NoOpChannelAllocator(), - ), - "MiG-19P": AircraftData( - inter_flight_radio=get_radio("RSIU-4V"), - intra_flight_radio=get_radio("RSIU-4V"), - channel_allocator=FarmerRadioChannelAllocator(), - channel_namer=SingleRadioChannelNamer, - ), - "MiG-21Bis": AircraftData( - inter_flight_radio=get_radio("RSIU-5V"), - intra_flight_radio=get_radio("RSIU-5V"), - channel_allocator=CommonRadioChannelAllocator( - inter_flight_radio_index=1, intra_flight_radio_index=1 - ), - channel_namer=SingleRadioChannelNamer, - ), - "P-51D": AircraftData( - inter_flight_radio=get_radio("SCR522"), - intra_flight_radio=get_radio("SCR522"), - channel_allocator=CommonRadioChannelAllocator( - inter_flight_radio_index=1, intra_flight_radio_index=1 - ), - channel_namer=SCR522ChannelNamer, - ), - "UH-1H": AircraftData( - inter_flight_radio=get_radio("AN/ARC-51BX"), - # Ideally this would use the AN/ARC-131 because that radio is supposed - # to be used for flight comms, but DCS won't allow it as the flight's - # frequency, nor will it allow the AN/ARC-134. - intra_flight_radio=get_radio("AN/ARC-51BX"), - channel_allocator=CommonRadioChannelAllocator( - inter_flight_radio_index=1, intra_flight_radio_index=1 - ), - 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, - ), - "JAS39Gripen": AircraftData( - inter_flight_radio=get_radio("R&S Series 6000"), - intra_flight_radio=get_radio("R&S Series 6000"), - channel_allocator=None, - ), -} -AIRCRAFT_DATA["A-10C_2"] = AIRCRAFT_DATA["A-10C"] -AIRCRAFT_DATA["P-51D-30-NA"] = AIRCRAFT_DATA["P-51D"] -AIRCRAFT_DATA["P-47D-30"] = AIRCRAFT_DATA["P-51D"] -AIRCRAFT_DATA["JAS39Gripen_AG"] = AIRCRAFT_DATA["JAS39Gripen"] - - class AircraftConflictGenerator: def __init__( self, @@ -718,21 +276,6 @@ class AircraftConflictGenerator: total += flight.client_count return total - def get_intra_flight_channel(self, airframe: UnitType) -> RadioFrequency: - """Allocates an intra-flight channel to a group. - - Args: - airframe: The type of aircraft a channel should be allocated for. - - Returns: - The frequency of the intra-flight channel. - """ - try: - aircraft_data = AIRCRAFT_DATA[airframe.id] - return self.radio_registry.alloc_for_radio(aircraft_data.intra_flight_radio) - except KeyError: - return get_fallback_channel(airframe) - @staticmethod def _start_type(start_type: str) -> StartType: if start_type == "Runway": @@ -762,7 +305,10 @@ class AircraftConflictGenerator: current_level = levels.index(base_skill) missions_for_skill_increase = 4 increase = pilot.record.missions_flown // missions_for_skill_increase - new_level = min(current_level + increase, len(levels) - 1) + capped_increase = min(current_level + increase, len(levels) - 1) + new_level = (capped_increase, current_level)[ + self.game.settings.ai_pilot_levelling + ] return levels[new_level] def set_skill(self, unit: FlyingUnit, pilot: Optional[Pilot], blue: bool) -> None: @@ -838,7 +384,7 @@ class AircraftConflictGenerator: ): channel = self.radio_registry.alloc_uhf() else: - channel = self.get_intra_flight_channel(unit_type) + channel = flight.unit_type.alloc_flight_radio(self.radio_registry) group.set_frequency(channel.mhz) divert = None @@ -848,7 +394,7 @@ class AircraftConflictGenerator: self.flights.append( FlightData( package=package, - country=self.game.faction_for(player=flight.departure.captured).country, + aircraft_type=flight.unit_type, flight_type=flight.flight_type, units=group.units, size=len(group.units), @@ -894,12 +440,11 @@ class AircraftConflictGenerator: callsign = callsign_for_support_unit(group) tacan = self.tacan_registy.alloc_for_band(TacanBand.Y) - variant = db.unit_type_name(flight.flight_plan.flight.unit_type) self.air_support.tankers.append( TankerInfo( group_name=str(group.name), callsign=callsign, - variant=variant, + variant=flight.unit_type.name, freq=channel, tacan=tacan, start_time=flight.flight_plan.patrol_start_time, @@ -958,7 +503,7 @@ class AircraftConflictGenerator: group = self.m.flight_group( country=side, name=name, - aircraft_type=flight.unit_type, + aircraft_type=flight.unit_type.dcs_unit_type, airport=None, position=pos, altitude=alt.meters, @@ -1092,7 +637,7 @@ class AircraftConflictGenerator: control_point: Airfield, country: Country, faction: Faction, - aircraft: Type[FlyingType], + aircraft: AircraftType, number: int, ) -> None: for _ in range(number): @@ -1114,7 +659,7 @@ class AircraftConflictGenerator: group = self._generate_at_airport( name=namegen.next_aircraft_name(country, control_point.id, flight), side=country, - unit_type=aircraft, + unit_type=aircraft.dcs_unit_type, count=1, start_type="Cold", airport=control_point.airport, @@ -1188,7 +733,7 @@ class AircraftConflictGenerator: group = self._generate_at_group( name=name, side=country, - unit_type=flight.unit_type, + unit_type=flight.unit_type.dcs_unit_type, count=flight.count, start_type=flight.start_type, at=self.m.find_group(group_name), @@ -1269,7 +814,7 @@ class AircraftConflictGenerator: if flight.client_count > 0: return True - return flight.unit_type in GUN_RELIANT_AIRFRAMES + return flight.unit_type.always_keeps_gun def configure_behavior( self, @@ -1308,9 +853,8 @@ class AircraftConflictGenerator: @staticmethod def configure_eplrs(group: FlyingGroup, flight: Flight) -> None: - if hasattr(flight.unit_type, "eplrs"): - if flight.unit_type.eplrs: - group.points[0].tasks.append(EPLRS(group.id)) + if flight.unit_type.eplrs_capable: + group.points[0].tasks.append(EPLRS(group.id)) def configure_cap( self, diff --git a/gen/airfields.py b/gen/airfields.py index 52ee18ff..7d499cf1 100644 --- a/gen/airfields.py +++ b/gen/airfields.py @@ -966,7 +966,96 @@ AIRFIELD_DATA = { runway_length=8871, atc=AtcData(MHz(3, 775), MHz(38, 450), MHz(120, 100), MHz(250, 50)), ils={ - "28": ("IGNP", MHz(109, 10)), + "28": ("IGNP", MHz(109, 100)), + }, + ), + "Gecitkale": AirfieldData( + theater="Syria", + icao="LCGK", + elevation=147, + runway_length=8156, + vor=("GKE", MHz(114, 300)), + atc=AtcData(MHz(3, 775), MHz(4, 800), MHz(40, 500), MHz(252, 50)), + ), + "Kingsfield": AirfieldData( + theater="Syria", + icao="CY-0004", + elevation=270, + runway_length=3069, + atc=AtcData(MHz(4, 650), MHz(40, 200), MHz(121), MHz(251, 750)), + ), + "Larnaca": AirfieldData( + theater="Syria", + icao="LCRE", + elevation=16, + runway_length=8009, + vor=("LCA", MHz(112, 80)), + atc=AtcData(MHz(4, 700), MHz(40, 300), MHz(121, 200), MHz(251, 850)), + ils={ + "22": ("ILC", MHz(110, 300)), + }, + ), + "Ercan": AirfieldData( + theater="Syria", + icao="LCEN", + elevation=383, + runway_length=7559, + vor=("ECN", MHz(117)), + atc=AtcData(MHz(4, 750), MHz(40, 400), MHz(120, 200), MHz(251, 950)), + ), + "Lakatamia": AirfieldData( + theater="Syria", + icao="CY-0001", + elevation=757, + runway_length=1230, + atc=AtcData(MHz(4, 725), MHz(40, 350), MHz(120, 200), MHz(251, 900)), + ), + "Nicosia": AirfieldData( + theater="Syria", + icao="LCNC", + elevation=716, + runway_length=0, + ), + "Pinarbashi": AirfieldData( + theater="Syria", + icao="CY-0003", + elevation=770, + runway_length=3364, + atc=AtcData(MHz(4, 825), MHz(40, 550), MHz(121), MHz(252, 100)), + ), + "Akrotiri": AirfieldData( + theater="Syria", + icao="LCRA", + elevation=62, + runway_length=8276, + tacan=TacanChannel(107, TacanBand.X), + tacan_callsign="AKR", + vor=("AKR", MHz(116)), + atc=AtcData(MHz(4, 625), MHz(40, 150), MHz(128), MHz(251, 700)), + ils={ + "28": ("IAK", MHz(109, 700)), + }, + ), + "Paphos": AirfieldData( + theater="Syria", + icao="LCPH", + elevation=40, + runway_length=8425, + vor=("PHA", MHz(117, 900)), + atc=AtcData(MHz(4, 675), MHz(40, 250), MHz(119, 900), MHz(251, 800)), + ils={ + "29": ("IPA", MHz(108, 900)), + }, + ), + "Gazipasa": AirfieldData( + theater="Syria", + icao="LTFG", + elevation=36, + runway_length=6885, + vor=("GZP", MHz(114, 200)), + atc=AtcData(MHz(4, 600), MHz(40, 100), MHz(119, 250), MHz(251, 650)), + ils={ + "8": ("IGZP", MHz(108, 500)), }, ), # NTTR diff --git a/gen/airsupportgen.py b/gen/airsupportgen.py index c3f97791..875a0e58 100644 --- a/gen/airsupportgen.py +++ b/gen/airsupportgen.py @@ -103,14 +103,13 @@ class AirSupportConflictGenerator: ) if not self.game.settings.disable_legacy_tanker: - fallback_tanker_number = 0 for i, tanker_unit_type in enumerate( self.game.faction_for(player=True).tankers ): - alt, airspeed = self._get_tanker_params(tanker_unit_type) - variant = db.unit_type_name(tanker_unit_type) + # TODO: Make loiter altitude a property of the unit type. + alt, airspeed = self._get_tanker_params(tanker_unit_type.dcs_unit_type) freq = self.radio_registry.alloc_uhf() tacan = self.tacan_registry.alloc_for_band(TacanBand.Y) tanker_heading = ( @@ -175,7 +174,7 @@ class AirSupportConflictGenerator: TankerInfo( str(tanker_group.name), callsign, - variant, + tanker_unit_type.name, freq, tacan, blue=True, diff --git a/gen/armor.py b/gen/armor.py index 3b9f93ee..bae64166 100644 --- a/gen/armor.py +++ b/gen/armor.py @@ -10,7 +10,6 @@ from dcs.action import AITaskPush from dcs.condition import GroupLifeLess, Or, TimeAfter, UnitDamaged from dcs.country import Country from dcs.mapping import Point -from dcs.planes import MQ_9_Reaper from dcs.point import PointAction from dcs.task import ( EPLRS, @@ -26,18 +25,18 @@ from dcs.task import ( from dcs.triggers import Event, TriggerOnce from dcs.unit import Vehicle from dcs.unitgroup import VehicleGroup -from dcs.unittype import VehicleType -from game import db + +from game.data.groundunitclass import GroundUnitClass +from game.dcs.aircrafttype import AircraftType +from game.dcs.groundunittype import GroundUnitType +from game.theater.controlpoint import ControlPoint from game.unitmap import UnitMap from game.utils import heading_sum, opposite_heading -from game.theater.controlpoint import ControlPoint - from gen.ground_forces.ai_ground_planner import ( DISTANCE_FROM_FRONTLINE, CombatGroup, CombatGroupRole, ) - from .callsigns import callsign_for_support_unit from .conflictgen import Conflict from .ground_forces.combat_stance import CombatStance @@ -174,14 +173,14 @@ class GroundConflictGenerator: n = "JTAC" + str(self.conflict.blue_cp.id) + str(self.conflict.red_cp.id) code = 1688 - len(self.jtacs) - utype = MQ_9_Reaper - if self.game.player_faction.jtac_unit is not None: - utype = self.game.player_faction.jtac_unit + utype = self.game.player_faction.jtac_unit + if self.game.player_faction.jtac_unit is None: + utype = AircraftType.named("MQ-9 Reaper") jtac = self.mission.flight_group( country=self.mission.country(self.game.player_country), name=n, - aircraft_type=utype, + aircraft_type=utype.dcs_unit_type, position=position[0], airport=None, altitude=5000, @@ -225,23 +224,22 @@ class GroundConflictGenerator: else: cp = self.conflict.red_cp - if is_player: - faction = self.game.player_name - else: - faction = self.game.enemy_name + faction = self.game.faction_for(is_player) # Disable infantry unit gen if disabled if not self.game.settings.perf_infantry: if self.game.settings.manpads: # 50% of armored units protected by manpad if random.choice([True, False]): - manpads = db.find_manpad(faction) - if len(manpads) > 0: - u = random.choice(manpads) + manpads = list(faction.infantry_with_class(GroundUnitClass.Manpads)) + if manpads: + u = random.choices( + manpads, weights=[m.spawn_weight for m in manpads] + )[0] self.mission.vehicle_group( side, namegen.next_infantry_name(side, cp.id, u), - u, + u.dcs_unit_type, position=infantry_position, group_size=1, heading=forward_heading, @@ -249,30 +247,38 @@ class GroundConflictGenerator: ) return - possible_infantry_units = db.find_infantry( - faction, allow_manpad=self.game.settings.manpads + possible_infantry_units = set( + faction.infantry_with_class(GroundUnitClass.Infantry) ) - if len(possible_infantry_units) == 0: + if self.game.settings.manpads: + possible_infantry_units |= set( + faction.infantry_with_class(GroundUnitClass.Manpads) + ) + if not possible_infantry_units: return - u = random.choice(possible_infantry_units) + infantry_choices = list(possible_infantry_units) + units = random.choices( + infantry_choices, + weights=[u.spawn_weight for u in infantry_choices], + k=INFANTRY_GROUP_SIZE, + ) self.mission.vehicle_group( side, - namegen.next_infantry_name(side, cp.id, u), - u, + namegen.next_infantry_name(side, cp.id, units[0]), + units[0].dcs_unit_type, position=infantry_position, group_size=1, heading=forward_heading, move_formation=PointAction.OffRoad, ) - for i in range(INFANTRY_GROUP_SIZE): - u = random.choice(possible_infantry_units) + for unit in units[1:]: position = infantry_position.random_point_within(55, 5) self.mission.vehicle_group( side, - namegen.next_infantry_name(side, cp.id, u), - u, + namegen.next_infantry_name(side, cp.id, unit), + unit.dcs_unit_type, position=position, group_size=1, heading=forward_heading, @@ -312,7 +318,7 @@ class GroundConflictGenerator: ) artillery_trigger.add_condition(TimeAfter(seconds=random.randint(1, 45) * 60)) # TODO: Update to fire at group instead of point - fire_task = FireAtPoint(target, len(gen_group.units) * 10, 100) + fire_task = FireAtPoint(target, gen_group.size * 10, 100) fire_task.number = 2 if stance != CombatStance.RETREAT else 1 dcs_group.add_trigger_action(fire_task) artillery_trigger.add_action(AITaskPush(dcs_group.id, len(dcs_group.tasks))) @@ -502,7 +508,7 @@ class GroundConflictGenerator: return for dcs_group, group in ally_groups: - if hasattr(group.units[0], "eplrs") and group.units[0].eplrs: + if group.unit_type.eplrs_capable: dcs_group.points[0].tasks.append(EPLRS(dcs_group.id)) if group.role == CombatGroupRole.ARTILLERY: @@ -673,7 +679,7 @@ class GroundConflictGenerator: Search the enemy groups for a potential target suitable to an artillery unit """ # TODO: Update to return a list of groups instead of a single point - rng = group.units[0].threat_range + rng = getattr(group.unit_type.dcs_unit_type, "threat_range", 0) if not enemy_groups: return None for _ in range(10): @@ -690,7 +696,7 @@ class GroundConflictGenerator: """ For artilery group, decide the distance from frontline with the range of the unit """ - rg = group.units[0].threat_range - 7500 + rg = getattr(group.unit_type.dcs_unit_type, "threat_range", 0) - 7500 if rg > DISTANCE_FROM_FRONTLINE[CombatGroupRole.ARTILLERY][1]: rg = random.randint( DISTANCE_FROM_FRONTLINE[CombatGroupRole.ARTILLERY][0], @@ -723,7 +729,7 @@ class GroundConflictGenerator: def _generate_groups( self, - groups: List[CombatGroup], + groups: list[CombatGroup], frontline_vector: Tuple[Point, int, int], is_player: bool, ) -> List[Tuple[VehicleGroup, CombatGroup]]: @@ -754,10 +760,9 @@ class GroundConflictGenerator: if final_position is not None: g = self._generate_group( self.mission.country(country), - group.units[0], - len(group.units), + group.unit_type, + group.size, final_position, - distance_from_frontline, heading=opposite_heading(spawn_heading), ) if is_player: @@ -781,10 +786,9 @@ class GroundConflictGenerator: def _generate_group( self, side: Country, - unit: VehicleType, + unit_type: GroundUnitType, count: int, at: Point, - distance_from_frontline, move_formation: PointAction = PointAction.OffRoad, heading=0, ) -> VehicleGroup: @@ -794,18 +798,17 @@ class GroundConflictGenerator: else: cp = self.conflict.red_cp - logging.info("armorgen: {} for {}".format(unit, side.id)) group = self.mission.vehicle_group( side, - namegen.next_unit_name(side, cp.id, unit), - unit, + namegen.next_unit_name(side, cp.id, unit_type), + unit_type.dcs_unit_type, position=at, group_size=count, heading=heading, move_formation=move_formation, ) - self.unit_map.add_front_line_units(group, cp) + self.unit_map.add_front_line_units(group, cp, unit_type) for c in range(count): vehicle: Vehicle = group.units[c] diff --git a/gen/cargoshipgen.py b/gen/cargoshipgen.py index e3161a42..9de370b9 100644 --- a/gen/cargoshipgen.py +++ b/gen/cargoshipgen.py @@ -4,7 +4,7 @@ import itertools from typing import TYPE_CHECKING from dcs import Mission -from dcs.ships import Bulker_Handy_Wind +from dcs.ships import HandyWind from dcs.unitgroup import ShipGroup from game.transfers import CargoShip @@ -35,7 +35,7 @@ class CargoShipGenerator: group = self.mission.ship_group( country, ship.name, - Bulker_Handy_Wind, + HandyWind, position=waypoints[0], group_size=1, ) diff --git a/gen/coastal/silkworm.py b/gen/coastal/silkworm.py index baa751ad..4198e004 100644 --- a/gen/coastal/silkworm.py +++ b/gen/coastal/silkworm.py @@ -13,7 +13,7 @@ class SilkwormGenerator(GroupGenerator): positions = self.get_circular_position(5, launcher_distance=120, coverage=180) self.add_unit( - MissilesSS.AShM_Silkworm_SR, + MissilesSS.Silkworm_SR, "SR#0", self.position.x, self.position.y, @@ -23,7 +23,7 @@ class SilkwormGenerator(GroupGenerator): # Launchers for i, p in enumerate(positions): self.add_unit( - MissilesSS.AShM_SS_N_2_Silkworm, + MissilesSS.Silkworm_SR, "Missile#" + str(i), p[0], p[1], @@ -32,7 +32,7 @@ class SilkwormGenerator(GroupGenerator): # Commander self.add_unit( - Unarmed.Truck_KAMAZ_43101, + Unarmed.KAMAZ_Truck, "KAMAZ#0", self.position.x - 35, self.position.y - 20, @@ -41,7 +41,7 @@ class SilkwormGenerator(GroupGenerator): # Shorad self.add_unit( - AirDefence.SPAAA_ZSU_23_4_Shilka_Gun_Dish, + AirDefence.ZSU_23_4_Shilka, "SHILKA#0", self.position.x - 55, self.position.y - 38, @@ -50,7 +50,7 @@ class SilkwormGenerator(GroupGenerator): # Shorad 2 self.add_unit( - AirDefence.SAM_SA_9_Strela_1_Gaskin_TEL, + AirDefence.Strela_1_9P31, "STRELA#0", self.position.x + 200, self.position.y + 15, diff --git a/gen/convoygen.py b/gen/convoygen.py index 9c904009..303c286f 100644 --- a/gen/convoygen.py +++ b/gen/convoygen.py @@ -1,15 +1,15 @@ from __future__ import annotations import itertools -from typing import Dict, TYPE_CHECKING, Type +from typing import TYPE_CHECKING from dcs import Mission from dcs.mapping import Point from dcs.point import PointAction from dcs.unit import Vehicle from dcs.unitgroup import VehicleGroup -from dcs.unittype import VehicleType +from game.dcs.groundunittype import GroundUnitType from game.transfers import Convoy from game.unitmap import UnitMap from game.utils import kph @@ -50,7 +50,7 @@ class ConvoyGenerator: self, name: str, position: Point, - units: Dict[Type[VehicleType], int], + units: dict[GroundUnitType, int], for_player: bool, ) -> VehicleGroup: country = self.mission.country( @@ -63,7 +63,7 @@ class ConvoyGenerator: group = self.mission.vehicle_group( country, name, - main_unit_type, + main_unit_type.dcs_unit_type, position=position, group_size=main_unit_count, move_formation=PointAction.OnRoad, @@ -76,7 +76,7 @@ class ConvoyGenerator: for unit_type, count in unit_types[1:]: for i in range(count): v = self.mission.vehicle( - f"{name} Unit #{next(unit_name_counter)}", unit_type + f"{name} Unit #{next(unit_name_counter)}", unit_type.dcs_unit_type ) v.position.x = position.x v.position.y = next(y) diff --git a/gen/defenses/armor_group_generator.py b/gen/defenses/armor_group_generator.py index fe429e72..fc549ca9 100644 --- a/gen/defenses/armor_group_generator.py +++ b/gen/defenses/armor_group_generator.py @@ -1,8 +1,11 @@ import random -from dcs.vehicles import Armor +from dcs.unitgroup import VehicleGroup -from game import db +from game import db, Game +from game.data.groundunitclass import GroundUnitClass +from game.dcs.groundunittype import GroundUnitType +from game.theater.theatergroundobject import VehicleGroupGroundObject from gen.defenses.armored_group_generator import ( ArmoredGroupGenerator, FixedSizeArmorGroupGenerator, @@ -14,8 +17,14 @@ def generate_armor_group(faction: str, game, ground_object): This generate a group of ground units :return: Generated group """ + armor_types = ( + GroundUnitClass.Apc, + GroundUnitClass.Atgm, + GroundUnitClass.Ifv, + GroundUnitClass.Tank, + ) possible_unit = [ - u for u in db.FACTIONS[faction].frontline_units if u in Armor.__dict__.values() + u for u in db.FACTIONS[faction].frontline_units if u.unit_class in armor_types ] if len(possible_unit) > 0: unit_type = random.choice(possible_unit) @@ -23,7 +32,9 @@ def generate_armor_group(faction: str, game, ground_object): return None -def generate_armor_group_of_type(game, ground_object, unit_type): +def generate_armor_group_of_type( + game: Game, ground_object: VehicleGroupGroundObject, unit_type: GroundUnitType +) -> VehicleGroup: """ This generate a group of ground units of given type :return: Generated group @@ -33,7 +44,12 @@ def generate_armor_group_of_type(game, ground_object, unit_type): return generator.get_generated_group() -def generate_armor_group_of_type_and_size(game, ground_object, unit_type, size: int): +def generate_armor_group_of_type_and_size( + game: Game, + ground_object: VehicleGroupGroundObject, + unit_type: GroundUnitType, + size: int, +) -> VehicleGroup: """ This generate a group of ground units of given type and size :return: Generated group diff --git a/gen/defenses/armored_group_generator.py b/gen/defenses/armored_group_generator.py index e25f5c74..f68b520b 100644 --- a/gen/defenses/armored_group_generator.py +++ b/gen/defenses/armored_group_generator.py @@ -1,15 +1,22 @@ import random +from game import Game +from game.dcs.groundunittype import GroundUnitType +from game.theater.theatergroundobject import VehicleGroupGroundObject from gen.sam.group_generator import GroupGenerator class ArmoredGroupGenerator(GroupGenerator): - def __init__(self, game, ground_object, unit_type): - super(ArmoredGroupGenerator, self).__init__(game, ground_object) + def __init__( + self, + game: Game, + ground_object: VehicleGroupGroundObject, + unit_type: GroundUnitType, + ) -> None: + super().__init__(game, ground_object) self.unit_type = unit_type - def generate(self): - + def generate(self) -> None: grid_x = random.randint(2, 3) grid_y = random.randint(1, 2) @@ -20,7 +27,7 @@ class ArmoredGroupGenerator(GroupGenerator): for j in range(grid_y): index = index + 1 self.add_unit( - self.unit_type, + self.unit_type.dcs_unit_type, "Armor#" + str(index), self.position.x + spacing * i, self.position.y + spacing * j, @@ -29,8 +36,14 @@ class ArmoredGroupGenerator(GroupGenerator): class FixedSizeArmorGroupGenerator(GroupGenerator): - def __init__(self, game, ground_object, unit_type, size): - super(FixedSizeArmorGroupGenerator, self).__init__(game, ground_object) + def __init__( + self, + game: Game, + ground_object: VehicleGroupGroundObject, + unit_type: GroundUnitType, + size: int, + ) -> None: + super().__init__(game, ground_object) self.unit_type = unit_type self.size = size @@ -41,7 +54,7 @@ class FixedSizeArmorGroupGenerator(GroupGenerator): for i in range(self.size): index = index + 1 self.add_unit( - self.unit_type, + self.unit_type.dcs_unit_type, "Armor#" + str(index), self.position.x + spacing * i, self.position.y, diff --git a/gen/fleet/carrier_group.py b/gen/fleet/carrier_group.py index 318dbef2..4200caca 100644 --- a/gen/fleet/carrier_group.py +++ b/gen/fleet/carrier_group.py @@ -2,7 +2,7 @@ import random from gen.sam.group_generator import ShipGroupGenerator -from dcs.ships import DDG_Arleigh_Burke_IIa, CG_Ticonderoga +from dcs.ships import USS_Arleigh_Burke_IIa, TICONDEROG class CarrierGroupGenerator(ShipGroupGenerator): @@ -22,7 +22,7 @@ class CarrierGroupGenerator(ShipGroupGenerator): # Add Arleigh Burke escort self.add_unit( - DDG_Arleigh_Burke_IIa, + USS_Arleigh_Burke_IIa, "USS Ramage", self.position.x + 6482, self.position.y + 6667, @@ -30,7 +30,7 @@ class CarrierGroupGenerator(ShipGroupGenerator): ) self.add_unit( - DDG_Arleigh_Burke_IIa, + USS_Arleigh_Burke_IIa, "USS Mitscher", self.position.x - 7963, self.position.y + 7037, @@ -38,7 +38,7 @@ class CarrierGroupGenerator(ShipGroupGenerator): ) self.add_unit( - DDG_Arleigh_Burke_IIa, + USS_Arleigh_Burke_IIa, "USS Forrest Sherman", self.position.x - 7408, self.position.y - 7408, @@ -46,7 +46,7 @@ class CarrierGroupGenerator(ShipGroupGenerator): ) self.add_unit( - DDG_Arleigh_Burke_IIa, + USS_Arleigh_Burke_IIa, "USS Lassen", self.position.x + 8704, self.position.y - 6296, @@ -56,7 +56,7 @@ class CarrierGroupGenerator(ShipGroupGenerator): # Add Ticonderoga escort if self.heading >= 180: self.add_unit( - CG_Ticonderoga, + TICONDEROG, "USS Hué City", self.position.x + 2222, self.position.y - 3333, @@ -64,7 +64,7 @@ class CarrierGroupGenerator(ShipGroupGenerator): ) else: self.add_unit( - CG_Ticonderoga, + TICONDEROG, "USS Hué City", self.position.x - 3333, self.position.y + 2222, diff --git a/gen/fleet/cn_dd_group.py b/gen/fleet/cn_dd_group.py index 0878e61b..91c710a0 100644 --- a/gen/fleet/cn_dd_group.py +++ b/gen/fleet/cn_dd_group.py @@ -5,9 +5,9 @@ from typing import TYPE_CHECKING from dcs.ships import ( - Type_052C_Destroyer, - Type_052B_Destroyer, - Type_054A_Frigate, + Type_052C, + Type_052B, + Type_054A, ) from game.factions.faction import Faction @@ -30,14 +30,14 @@ class ChineseNavyGroupGenerator(ShipGroupGenerator): if include_frigate: self.add_unit( - Type_054A_Frigate, + Type_054A, "FF1", self.position.x + 1200, self.position.y + 900, self.heading, ) self.add_unit( - Type_054A_Frigate, + Type_054A, "FF2", self.position.x + 1200, self.position.y - 900, @@ -45,7 +45,7 @@ class ChineseNavyGroupGenerator(ShipGroupGenerator): ) if include_dd: - dd_type = random.choice([Type_052C_Destroyer, Type_052B_Destroyer]) + dd_type = random.choice([Type_052C, Type_052B]) self.add_unit( dd_type, "DD1", @@ -69,5 +69,5 @@ class Type54GroupGenerator(DDGroupGenerator): self, game: Game, ground_object: TheaterGroundObject, faction: Faction ): super(Type54GroupGenerator, self).__init__( - game, ground_object, faction, Type_054A_Frigate + game, ground_object, faction, Type_054A ) diff --git a/gen/fleet/dd_group.py b/gen/fleet/dd_group.py index aed0ef96..db5dd0dd 100644 --- a/gen/fleet/dd_group.py +++ b/gen/fleet/dd_group.py @@ -1,12 +1,12 @@ from __future__ import annotations -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Type from game.factions.faction import Faction from game.theater.theatergroundobject import TheaterGroundObject from gen.sam.group_generator import ShipGroupGenerator from dcs.unittype import ShipType -from dcs.ships import FFG_Oliver_Hazzard_Perry, DDG_Arleigh_Burke_IIa +from dcs.ships import PERRY, USS_Arleigh_Burke_IIa if TYPE_CHECKING: from game.game import Game @@ -18,7 +18,7 @@ class DDGroupGenerator(ShipGroupGenerator): game: Game, ground_object: TheaterGroundObject, faction: Faction, - ddtype: ShipType, + ddtype: Type[ShipType], ): super(DDGroupGenerator, self).__init__(game, ground_object, faction) self.ddtype = ddtype @@ -46,7 +46,7 @@ class OliverHazardPerryGroupGenerator(DDGroupGenerator): self, game: Game, ground_object: TheaterGroundObject, faction: Faction ): super(OliverHazardPerryGroupGenerator, self).__init__( - game, ground_object, faction, FFG_Oliver_Hazzard_Perry + game, ground_object, faction, PERRY ) @@ -55,5 +55,5 @@ class ArleighBurkeGroupGenerator(DDGroupGenerator): self, game: Game, ground_object: TheaterGroundObject, faction: Faction ): super(ArleighBurkeGroupGenerator, self).__init__( - game, ground_object, faction, DDG_Arleigh_Burke_IIa + game, ground_object, faction, USS_Arleigh_Burke_IIa ) diff --git a/gen/fleet/lacombattanteII.py b/gen/fleet/lacombattanteII.py index 9d1ba6e1..7de47da1 100644 --- a/gen/fleet/lacombattanteII.py +++ b/gen/fleet/lacombattanteII.py @@ -1,4 +1,4 @@ -from dcs.ships import FAC_La_Combattante_IIa +from dcs.ships import La_Combattante_II from game.factions.faction import Faction from game.theater import TheaterGroundObject @@ -8,5 +8,5 @@ from gen.fleet.dd_group import DDGroupGenerator class LaCombattanteIIGroupGenerator(DDGroupGenerator): def __init__(self, game, ground_object: TheaterGroundObject, faction: Faction): super(LaCombattanteIIGroupGenerator, self).__init__( - game, ground_object, faction, FAC_La_Combattante_IIa + game, ground_object, faction, La_Combattante_II ) diff --git a/gen/fleet/ru_dd_group.py b/gen/fleet/ru_dd_group.py index bbd7b176..8ec15d26 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 ( - Corvette_1124_4_Grisha, - Corvette_1241_1_Molniya, - Frigate_11540_Neustrashimy, - Frigate_1135M_Rezky, - Cruiser_1164_Moskva, - SSK_877V_Kilo, - SSK_641B_Tango, + ALBATROS, + MOLNIYA, + NEUSTRASH, + REZKY, + MOSCOW, + KILO, + SOM, ) from gen.fleet.dd_group import DDGroupGenerator @@ -37,9 +37,7 @@ class RussianNavyGroupGenerator(ShipGroupGenerator): include_frigate = True if include_frigate: - frigate_type = random.choice( - [Corvette_1124_4_Grisha, Corvette_1241_1_Molniya] - ) + frigate_type = random.choice([ALBATROS, MOLNIYA]) self.add_unit( frigate_type, "FF1", @@ -56,7 +54,7 @@ class RussianNavyGroupGenerator(ShipGroupGenerator): ) if include_dd: - dd_type = random.choice([Frigate_11540_Neustrashimy, Frigate_1135M_Rezky]) + dd_type = random.choice([NEUSTRASH, REZKY]) self.add_unit( dd_type, "DD1", @@ -76,7 +74,7 @@ class RussianNavyGroupGenerator(ShipGroupGenerator): # Only include the Moskva for now, the Pyotry Velikiy is an unkillable monster. # See https://github.com/dcs-liberation/dcs_liberation/issues/567 self.add_unit( - Cruiser_1164_Moskva, + MOSCOW, "CC1", self.position.x, self.position.y, @@ -91,7 +89,7 @@ class GrishaGroupGenerator(DDGroupGenerator): self, game: Game, ground_object: TheaterGroundObject, faction: Faction ): super(GrishaGroupGenerator, self).__init__( - game, ground_object, faction, Corvette_1124_4_Grisha + game, ground_object, faction, ALBATROS ) @@ -100,7 +98,7 @@ class MolniyaGroupGenerator(DDGroupGenerator): self, game: Game, ground_object: TheaterGroundObject, faction: Faction ): super(MolniyaGroupGenerator, self).__init__( - game, ground_object, faction, Corvette_1241_1_Molniya + game, ground_object, faction, MOLNIYA ) @@ -108,15 +106,11 @@ class KiloSubGroupGenerator(DDGroupGenerator): def __init__( self, game: Game, ground_object: TheaterGroundObject, faction: Faction ): - super(KiloSubGroupGenerator, self).__init__( - game, ground_object, faction, SSK_877V_Kilo - ) + super(KiloSubGroupGenerator, self).__init__(game, ground_object, faction, KILO) class TangoSubGroupGenerator(DDGroupGenerator): def __init__( self, game: Game, ground_object: TheaterGroundObject, faction: Faction ): - super(TangoSubGroupGenerator, self).__init__( - game, ground_object, faction, SSK_641B_Tango - ) + super(TangoSubGroupGenerator, self).__init__(game, ground_object, faction, SOM) diff --git a/gen/fleet/schnellboot.py b/gen/fleet/schnellboot.py index b1ab4e1d..83a83fdf 100644 --- a/gen/fleet/schnellboot.py +++ b/gen/fleet/schnellboot.py @@ -1,6 +1,6 @@ import random -from dcs.ships import Boat_Schnellboot_type_S130 +from dcs.ships import 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( - Boat_Schnellboot_type_S130, + 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/uboat.py b/gen/fleet/uboat.py index b3ceb77d..6333021f 100644 --- a/gen/fleet/uboat.py +++ b/gen/fleet/uboat.py @@ -1,6 +1,6 @@ import random -from dcs.ships import U_boat_VIIC_U_flak +from dcs.ships import Uboat_VIIC 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( - U_boat_VIIC_U_flak, + Uboat_VIIC, "Uboat" + str(i), self.position.x + i * random.randint(100, 250), self.position.y + (random.randint(100, 200) - 100), diff --git a/gen/fleet/ww2lst.py b/gen/fleet/ww2lst.py index db7deb69..7ed63fbe 100644 --- a/gen/fleet/ww2lst.py +++ b/gen/fleet/ww2lst.py @@ -1,6 +1,6 @@ import random -from dcs.ships import LS_Samuel_Chase, LST_Mk_II +from dcs.ships import USS_Samuel_Chase, LST_Mk2 from gen.sam.group_generator import ShipGroupGenerator @@ -10,7 +10,7 @@ class WW2LSTGroupGenerator(ShipGroupGenerator): # Add LS Samuel Chase self.add_unit( - LS_Samuel_Chase, + USS_Samuel_Chase, "SamuelChase", self.position.x, self.position.y, @@ -19,7 +19,7 @@ class WW2LSTGroupGenerator(ShipGroupGenerator): for i in range(1, random.randint(3, 4)): self.add_unit( - LST_Mk_II, + LST_Mk2, "LST" + str(i), self.position.x + i * random.randint(800, 1200), self.position.y, diff --git a/gen/flights/ai_flight_planner.py b/gen/flights/ai_flight_planner.py index 2ba8cfec..6f9b47aa 100644 --- a/gen/flights/ai_flight_planner.py +++ b/gen/flights/ai_flight_planner.py @@ -17,14 +17,10 @@ from typing import ( Set, TYPE_CHECKING, Tuple, - Type, TypeVar, - Union, ) -from dcs.unittype import FlyingType - -from game.factions.faction import Faction +from game.dcs.aircrafttype import AircraftType from game.infos.information import Information from game.procurement import AircraftProcurementRequest from game.profiling import logged_duration, MultiEventTracer @@ -167,8 +163,6 @@ class AircraftAllocator: flight.max_distance ) - # Prefer using squadrons with pilots first - best_understaffed: Optional[Tuple[ControlPoint, Squadron]] = None for airfield in airfields_in_range: if not airfield.is_friendly(self.is_player): continue @@ -180,24 +174,14 @@ class AircraftAllocator: continue # Valid location with enough aircraft available. Find a squadron to fit # the role. - for squadron in self.air_wing.squadrons_for(aircraft): - if task not in squadron.auto_assignable_mission_types: - continue - if len(squadron.available_pilots) >= flight.num_aircraft: + squadrons = self.air_wing.auto_assignable_for_task_with_type( + aircraft, task + ) + for squadron in squadrons: + if squadron.number_of_available_pilots >= flight.num_aircraft: inventory.remove_aircraft(aircraft, flight.num_aircraft) return airfield, squadron - - # A compatible squadron that doesn't have enough pilots. Remember it - # as a fallback in case we find no better choices. - if best_understaffed is None: - best_understaffed = airfield, squadron - - if best_understaffed is not None: - airfield, squadron = best_understaffed - self.global_inventory.for_control_point(airfield).remove_aircraft( - squadron.aircraft, flight.num_aircraft - ) - return best_understaffed + return None class PackageBuilder: @@ -256,7 +240,7 @@ class PackageBuilder: return True def find_divert_field( - self, aircraft: Type[FlyingType], arrival: ControlPoint + self, aircraft: AircraftType, arrival: ControlPoint ) -> Optional[ControlPoint]: divert_limit = nautical_miles(150) for airfield in self.closest_airfields.operational_airfields_within( @@ -600,7 +584,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) + MAX_AWEC_RANGE = Distance.inf() MAX_TANKER_RANGE = nautical_miles(200) def __init__(self, game: Game, is_player: bool) -> None: @@ -629,33 +613,18 @@ class CoalitionMissionPlanner: return True return False - def critical_missions(self) -> Iterator[ProposedMission]: - """Identifies the most important missions to plan this turn. - - Non-critical missions that cannot be fulfilled will create purchase - orders for the next turn. Critical missions will create a purchase order - unless the mission can be doubly fulfilled. In other words, the AI will - attempt to have *double* the aircraft it needs for these missions to - ensure that they can be planned again next turn even if all aircraft are - eliminated this turn. - """ - - # Find farthest, friendly CP for AEWC. - yield ProposedMission( - self.objective_finder.farthest_friendly_control_point(), - [ProposedFlight(FlightType.AEWC, 1, self.MAX_AWEC_RANGE)], - # Supports all the early CAP flights, so should be in the air ASAP. - asap=True, - ) - - yield ProposedMission( - self.objective_finder.closest_friendly_control_point(), - [ProposedFlight(FlightType.REFUELING, 1, self.MAX_TANKER_RANGE)], + @property + def oca_aircraft_plannable(self) -> bool: + return ( + self.air_wing_can_plan(FlightType.OCA_AIRCRAFT) + and self.game.settings.default_start_type == "Cold" ) + def propose_barcap(self) -> Iterator[ProposedMission]: # Find friendly CPs within 100 nmi from an enemy airfield, plan CAP. for cp in self.objective_finder.vulnerable_control_points(): - # Plan CAP in such a way, that it is established during the whole desired mission length + # Plan CAP in such a way, that it is established during the whole desired + # mission length. for _ in range( 0, int(self.game.settings.desired_player_mission_duration.total_seconds()), @@ -668,36 +637,31 @@ class CoalitionMissionPlanner: ], ) + def propose_cas(self) -> Iterator[ProposedMission]: # Find front lines, plan CAS. for front_line in self.objective_finder.front_lines(): - yield ProposedMission( - front_line, - [ - ProposedFlight(FlightType.CAS, 2, self.MAX_CAS_RANGE), - # This is *not* an escort because front lines don't create a threat - # zone. Generating threat zones from front lines causes the front - # line to push back BARCAPs as it gets closer to the base. While - # front lines do have the same problem of potentially pulling - # BARCAPs off bases to engage a front line TARCAP, that's probably - # the one time where we do want that. - # - # TODO: Use intercepts and extra TARCAPs to cover bases near fronts. - # We don't have intercept missions yet so this isn't something we - # can do today, but we should probably return to having the front - # line project a threat zone (so that strike missions will route - # around it) and instead *not plan* a BARCAP at bases near the - # front, since there isn't a place to put a barrier. Instead, the - # aircraft that would have been a BARCAP could be used as additional - # interceptors and TARCAPs which will defend the base but won't be - # trying to avoid front line contacts. - ProposedFlight(FlightType.TARCAP, 2, self.MAX_CAP_RANGE), - ], - ) - - def propose_missions(self) -> Iterator[ProposedMission]: - """Identifies and iterates over potential mission in priority order.""" - yield from self.critical_missions() + flights = [ProposedFlight(FlightType.CAS, 2, self.MAX_CAS_RANGE)] + if self.air_wing_can_plan(FlightType.TARCAP): + # This is *not* an escort because front lines don't create a threat + # zone. Generating threat zones from front lines causes the front + # line to push back BARCAPs as it gets closer to the base. While + # front lines do have the same problem of potentially pulling + # BARCAPs off bases to engage a front line TARCAP, that's probably + # the one time where we do want that. + # + # TODO: Use intercepts and extra TARCAPs to cover bases near fronts. + # We don't have intercept missions yet so this isn't something we + # can do today, but we should probably return to having the front + # line project a threat zone (so that strike missions will route + # around it) and instead *not plan* a BARCAP at bases near the + # front, since there isn't a place to put a barrier. Instead, the + # aircraft that would have been a BARCAP could be used as additional + # interceptors and TARCAPs which will defend the base but won't be + # trying to avoid front line contacts. + flights.append(ProposedFlight(FlightType.TARCAP, 2, self.MAX_CAP_RANGE)) + yield ProposedMission(front_line, flights) + def propose_dead(self) -> Iterator[ProposedMission]: # Find enemy SAM sites with ranges that cover friendly CPs, front lines, # or objects, plan DEAD. # Find enemy SAM sites with ranges that extend to within 50 nmi of @@ -722,7 +686,10 @@ class CoalitionMissionPlanner: else: flights.append( ProposedFlight( - FlightType.SEAD_ESCORT, 2, self.MAX_SEAD_RANGE, EscortType.Sead + FlightType.SEAD_ESCORT, + 2, + self.MAX_SEAD_RANGE, + EscortType.Sead, ) ) # TODO: Max escort range. @@ -733,6 +700,7 @@ class CoalitionMissionPlanner: ) yield ProposedMission(sam, flights) + def propose_convoy_interdiction(self) -> Iterator[ProposedMission]: # These will only rarely get planned. When a convoy is travelling multiple legs, # they're targetable after the first leg. The reason for this is that # procurement happens *after* mission planning so that the missions that could @@ -761,6 +729,7 @@ class CoalitionMissionPlanner: ], ) + def propose_shipping_interdiction(self) -> Iterator[ProposedMission]: for ship in self.objective_finder.cargo_ships(): yield ProposedMission( ship, @@ -776,6 +745,7 @@ class CoalitionMissionPlanner: ], ) + def propose_naval_strikes(self) -> Iterator[ProposedMission]: for group in self.objective_finder.threatening_ships(): yield ProposedMission( group, @@ -791,6 +761,7 @@ class CoalitionMissionPlanner: ], ) + def propose_bai(self) -> Iterator[ProposedMission]: for group in self.objective_finder.threatening_vehicle_groups(): yield ProposedMission( group, @@ -806,16 +777,25 @@ class CoalitionMissionPlanner: ], ) + def propose_oca_strikes(self) -> Iterator[ProposedMission]: for target in self.objective_finder.oca_targets(min_aircraft=20): - flights = [ - ProposedFlight(FlightType.OCA_RUNWAY, 2, self.MAX_OCA_RANGE), - ] - if self.game.settings.default_start_type == "Cold": + flights = [] + if self.air_wing_can_plan(FlightType.OCA_RUNWAY): + flights.append( + ProposedFlight(FlightType.OCA_RUNWAY, 2, self.MAX_OCA_RANGE) + ) + if self.oca_aircraft_plannable: # Only schedule if the default start type is Cold. If the player # has set anything else there are no targets to hit. flights.append( ProposedFlight(FlightType.OCA_AIRCRAFT, 2, self.MAX_OCA_RANGE) ) + if not flights: + raise RuntimeError( + "Attempted planning of OCA strikes but neither OCA/Runway nor " + f"OCA/Aircraft are plannable for {self.faction.name} with the " + "current game settings." + ) flights.extend( [ # TODO: Max escort range. @@ -829,7 +809,7 @@ class CoalitionMissionPlanner: ) yield ProposedMission(target, flights) - # Plan strike missions. + def propose_building_strikes(self) -> Iterator[ProposedMission]: for target in self.objective_finder.strike_targets(): yield ProposedMission( target, @@ -848,6 +828,48 @@ class CoalitionMissionPlanner: ], ) + def propose_missions(self) -> Iterator[ProposedMission]: + """Identifies and iterates over potential mission in priority order.""" + # Find farthest, friendly CP for AEWC. + if self.air_wing_can_plan(FlightType.AEWC): + yield ProposedMission( + self.objective_finder.farthest_friendly_control_point(), + [ProposedFlight(FlightType.AEWC, 1, self.MAX_AWEC_RANGE)], + # Supports all the early CAP flights, so should be in the air ASAP. + asap=True, + ) + + if self.air_wing_can_plan(FlightType.REFUELING): + yield ProposedMission( + self.objective_finder.closest_friendly_control_point(), + [ProposedFlight(FlightType.REFUELING, 1, self.MAX_TANKER_RANGE)], + ) + + if self.air_wing_can_plan(FlightType.BARCAP): + yield from self.propose_barcap() + + if self.air_wing_can_plan(FlightType.CAS): + yield from self.propose_cas() + + if self.air_wing_can_plan(FlightType.DEAD): + yield from self.propose_dead() + + if self.air_wing_can_plan(FlightType.BAI): + yield from self.propose_convoy_interdiction() + + if self.air_wing_can_plan(FlightType.ANTISHIP): + yield from self.propose_shipping_interdiction() + yield from self.propose_naval_strikes() + + if self.air_wing_can_plan(FlightType.BAI): + yield from self.propose_bai() + + if self.air_wing_can_plan(FlightType.OCA_RUNWAY) or self.oca_aircraft_plannable: + yield from self.propose_oca_strikes() + + if self.air_wing_can_plan(FlightType.STRIKE): + yield from self.propose_building_strikes() + def plan_missions(self) -> None: """Identifies and plans mission for the turn.""" player = "Blue" if self.is_player else "Red" @@ -856,18 +878,13 @@ class CoalitionMissionPlanner: for proposed_mission in self.propose_missions(): self.plan_mission(proposed_mission, tracer) - with logged_duration(f"{player} reserve mission planning"): - with MultiEventTracer() as tracer: - for critical_mission in self.critical_missions(): - self.plan_mission(critical_mission, tracer, reserves=True) - with logged_duration(f"{player} mission scheduling"): self.stagger_missions() for cp in self.objective_finder.friendly_control_points(): inventory = self.game.aircraft_inventory.for_control_point(cp) for aircraft, available in inventory.all_aircraft: - self.message("Unused aircraft", f"{available} {aircraft.id} from {cp}") + self.message("Unused aircraft", f"{available} {aircraft} from {cp}") def plan_flight( self, diff --git a/gen/flights/ai_flight_planner_db.py b/gen/flights/ai_flight_planner_db.py index 36486434..50bff5a0 100644 --- a/gen/flights/ai_flight_planner_db.py +++ b/gen/flights/ai_flight_planner_db.py @@ -8,6 +8,7 @@ from dcs.helicopters import ( CH_47D, CH_53E, Ka_50, + Mi_24P, Mi_24V, Mi_26, Mi_28N, @@ -104,6 +105,7 @@ from dcs.planes import ( ) from dcs.unittype import FlyingType +from game.dcs.aircrafttype import AircraftType from gen.flights.flight import FlightType from pydcs_extensions.a4ec.a4ec import A_4E_C from pydcs_extensions.f22a.f22a import F_22A @@ -208,6 +210,7 @@ CAS_CAPABLE = [ SA342L, Ka_50, Mi_28N, + Mi_24P, Mi_24V, Mi_8MT, UH_1H, @@ -415,7 +418,7 @@ REFUELING_CAPABALE = [ ] -def aircraft_for_task(task: FlightType) -> List[Type[FlyingType]]: +def dcs_types_for_task(task: FlightType) -> list[Type[FlyingType]]: cap_missions = (FlightType.BARCAP, FlightType.TARCAP, FlightType.SWEEP) if task in cap_missions: return CAP_CAPABLE @@ -450,7 +453,15 @@ def aircraft_for_task(task: FlightType) -> List[Type[FlyingType]]: return [] -def tasks_for_aircraft(aircraft: Type[FlyingType]) -> list[FlightType]: +def aircraft_for_task(task: FlightType) -> list[AircraftType]: + dcs_types = dcs_types_for_task(task) + types: list[AircraftType] = [] + for dcs_type in dcs_types: + types.extend(AircraftType.for_dcs_type(dcs_type)) + return types + + +def tasks_for_aircraft(aircraft: AircraftType) -> list[FlightType]: tasks = [] for task in FlightType: if aircraft in aircraft_for_task(task): diff --git a/gen/flights/flight.py b/gen/flights/flight.py index fa087045..68a57707 100644 --- a/gen/flights/flight.py +++ b/gen/flights/flight.py @@ -1,16 +1,15 @@ from __future__ import annotations -from dataclasses import dataclass from datetime import timedelta from enum import Enum -from typing import List, Optional, TYPE_CHECKING, Type, Union +from typing import List, Optional, TYPE_CHECKING, Union from dcs.mapping import Point from dcs.point import MovingPoint, PointAction from dcs.unit import Unit -from dcs.unittype import FlyingType from game import db +from game.dcs.aircrafttype import AircraftType from game.squadrons import Pilot, Squadron from game.theater.controlpoint import ControlPoint, MissionTarget from game.utils import Distance, meters @@ -302,7 +301,7 @@ class Flight: return self.roster.player_count @property - def unit_type(self) -> Type[FlyingType]: + def unit_type(self) -> AircraftType: return self.squadron.aircraft @property @@ -327,13 +326,11 @@ class Flight: self.roster.clear() def __repr__(self): - name = db.unit_type_name(self.unit_type) if self.custom_name: - return f"{self.custom_name} {self.count} x {name}" - return f"[{self.flight_type}] {self.count} x {name}" + return f"{self.custom_name} {self.count} x {self.unit_type}" + return f"[{self.flight_type}] {self.count} x {self.unit_type}" def __str__(self): - name = db.unit_get_expanded_info(self.country, self.unit_type, "name") if self.custom_name: - return f"{self.custom_name} {self.count} x {name}" - return f"[{self.flight_type}] {self.count} x {name}" + return f"{self.custom_name} {self.count} x {self.unit_type}" + return f"[{self.flight_type}] {self.count} x {self.unit_type}" diff --git a/gen/flights/loadouts.py b/gen/flights/loadouts.py index 845f7751..0a51245a 100644 --- a/gen/flights/loadouts.py +++ b/gen/flights/loadouts.py @@ -1,11 +1,10 @@ from __future__ import annotations import datetime -from typing import Optional, List, Iterator, Type, TYPE_CHECKING, Mapping - -from dcs.unittype import FlyingType +from typing import Optional, List, Iterator, TYPE_CHECKING, Mapping from game.data.weapons import Weapon, Pylon +from game.dcs.aircrafttype import AircraftType if TYPE_CHECKING: from gen.flights.flight import Flight @@ -27,9 +26,7 @@ class Loadout: def derive_custom(self, name: str) -> Loadout: return Loadout(name, self.pylons, self.date, is_custom=True) - def degrade_for_date( - self, unit_type: Type[FlyingType], date: datetime.date - ) -> Loadout: + def degrade_for_date(self, unit_type: AircraftType, date: datetime.date) -> Loadout: if self.date is not None and self.date <= date: return Loadout(self.name, self.pylons, self.date) @@ -61,7 +58,7 @@ class Loadout: # {"CLSID": class ID, "num": pylon number} # "tasks": List (as a dict) of task IDs the payload is used by. # } - payloads = flight.unit_type.load_payloads() + payloads = flight.unit_type.dcs_unit_type.load_payloads() for payload in payloads.values(): name = payload["name"] pylons = payload["pylons"] @@ -126,8 +123,8 @@ class Loadout: for name in cls.default_loadout_names_for(flight): # This operation is cached, but must be called before load_by_name will # work. - flight.unit_type.load_payloads() - payload = flight.unit_type.loadout_by_name(name) + flight.unit_type.dcs_unit_type.load_payloads() + payload = flight.unit_type.dcs_unit_type.loadout_by_name(name) if payload is not None: return Loadout( name, diff --git a/gen/flights/traveltime.py b/gen/flights/traveltime.py index 6b787f95..25e28ef9 100644 --- a/gen/flights/traveltime.py +++ b/gen/flights/traveltime.py @@ -25,16 +25,13 @@ if TYPE_CHECKING: class GroundSpeed: @classmethod def for_flight(cls, flight: Flight, altitude: Distance) -> Speed: - if not issubclass(flight.unit_type, FlyingType): - raise TypeError("Flight has non-flying unit") - # TODO: Expose both a cruise speed and target speed. # The cruise speed can be used for ascent, hold, join, and RTB to save # on fuel, but mission speed will be fast enough to keep the flight # safer. # DCS's max speed is in kph at 0 MSL. - max_speed = kph(flight.unit_type.max_speed) + max_speed = flight.unit_type.max_speed if max_speed > SPEED_OF_SOUND_AT_SEA_LEVEL: # Aircraft is supersonic. Limit to mach 0.85 to conserve fuel and # account for heavily loaded jets. diff --git a/gen/forcedoptionsgen.py b/gen/forcedoptionsgen.py index bbae0eb2..d18db095 100644 --- a/gen/forcedoptionsgen.py +++ b/gen/forcedoptionsgen.py @@ -32,6 +32,8 @@ class ForcedOptionsGenerator: self.mission.forced_options.labels = ForcedOptions.Labels.Abbreviate elif self.game.settings.labels == "Dot Only": self.mission.forced_options.labels = ForcedOptions.Labels.DotOnly + elif self.game.settings.labels == "Neutral Dot": + self.mission.forced_options.labels = ForcedOptions.Labels.NeutralDot elif self.game.settings.labels == "Off": self.mission.forced_options.labels = ForcedOptions.Labels.None_ diff --git a/gen/ground_forces/ai_ground_planner.py b/gen/ground_forces/ai_ground_planner.py index 75fb1bea..045c4b39 100644 --- a/gen/ground_forces/ai_ground_planner.py +++ b/gen/ground_forces/ai_ground_planner.py @@ -3,11 +3,9 @@ import random from enum import Enum from typing import Dict, List -from dcs.unittype import VehicleType - -from game.theater import ControlPoint - from game.data.groundunitclass import GroundUnitClass +from game.dcs.groundunittype import GroundUnitType +from game.theater import ControlPoint from gen.ground_forces.combat_stance import CombatStance MAX_COMBAT_GROUP_PER_CP = 10 @@ -48,17 +46,19 @@ GROUP_SIZES_BY_COMBAT_STANCE = { class CombatGroup: - def __init__(self, role: CombatGroupRole): - self.units: List[VehicleType] = [] + def __init__( + self, role: CombatGroupRole, unit_type: GroundUnitType, size: int + ) -> None: + self.unit_type = unit_type + self.size = size self.role = role self.assigned_enemy_cp = None self.start_position = None def __str__(self): - s = "" - s += "ROLE : " + str(self.role) + "\n" - if len(self.units) > 0: - s += "UNITS " + self.units[0].name + " * " + str(len(self.units)) + s = f"ROLE : {self.role}\n" + if self.size: + s += f"UNITS {self.unit_type} * {self.size}" return s @@ -97,28 +97,29 @@ class GroundPlanner: # Create combat groups and assign them randomly to each enemy CP for unit_type in self.cp.base.armor: - if unit_type in GroundUnitClass.Tank: + unit_class = unit_type.unit_class + if unit_class is GroundUnitClass.Tank: collection = self.tank_groups role = CombatGroupRole.TANK - elif unit_type in GroundUnitClass.Apc: + elif unit_class is GroundUnitClass.Apc: collection = self.apc_group role = CombatGroupRole.APC - elif unit_type in GroundUnitClass.Artillery: + elif unit_class is GroundUnitClass.Artillery: collection = self.art_group role = CombatGroupRole.ARTILLERY - elif unit_type in GroundUnitClass.Ifv: + elif unit_class is GroundUnitClass.Ifv: collection = self.ifv_group role = CombatGroupRole.IFV - elif unit_type in GroundUnitClass.Logistics: + elif unit_class is GroundUnitClass.Logistics: collection = self.logi_groups role = CombatGroupRole.LOGI - elif unit_type in GroundUnitClass.Atgm: + elif unit_class is GroundUnitClass.Atgm: collection = self.atgm_group role = CombatGroupRole.ATGM - elif unit_type in GroundUnitClass.Shorads: + elif unit_class is GroundUnitClass.Shorads: collection = self.shorad_groups role = CombatGroupRole.SHORAD - elif unit_type in GroundUnitClass.Recon: + elif unit_class is GroundUnitClass.Recon: collection = self.recon_groups role = CombatGroupRole.RECON else: @@ -137,17 +138,17 @@ class GroundPlanner: while available > 0: if role == CombatGroupRole.SHORAD: - n = 1 + count = 1 else: - n = random.choice(group_size_choice) - if n > available: + count = random.choice(group_size_choice) + if count > available: if available >= 2: - n = 2 + count = 2 else: - n = 1 - available -= n + count = 1 + available -= count - group = CombatGroup(role) + group = CombatGroup(role, unit_type, count) if len(self.connected_enemy_cp) > 0: enemy_cp = random.choice(self.connected_enemy_cp).id self.units_per_cp[enemy_cp].append(group) @@ -155,9 +156,6 @@ class GroundPlanner: else: self.reserve.append(group) group.assigned_enemy_cp = "__reserve__" - - for i in range(n): - group.units.append(unit_type) collection.append(group) if remaining_available_frontline_units == 0: diff --git a/gen/kneeboard.py b/gen/kneeboard.py index 71544a26..62fd9d25 100644 --- a/gen/kneeboard.py +++ b/gen/kneeboard.py @@ -32,15 +32,15 @@ from typing import Dict, List, Optional, TYPE_CHECKING, Tuple, Iterator from PIL import Image, ImageDraw, ImageFont from dcs.mission import Mission from dcs.unit import Unit -from dcs.unittype import FlyingType from tabulate import tabulate from game.data.alic import AlicCodes from game.db import unit_type_from_name +from game.dcs.aircrafttype import AircraftType from game.theater import ConflictTheater, TheaterGroundObject, LatLon from game.theater.bullseye import Bullseye from game.utils import meters -from .aircraft import AIRCRAFT_DATA, FlightData +from .aircraft import FlightData from .airsupportgen import AwacsInfo, TankerInfo from .briefinggen import CommInfo, JtacInfo, MissionInfoGenerator from .flights.flight import FlightWaypoint, FlightWaypointType, FlightType @@ -142,7 +142,8 @@ class KneeboardPage: """Writes the kneeboard page to the given path.""" raise NotImplementedError - def format_ll(self, ll: LatLon) -> str: + @staticmethod + def format_ll(ll: LatLon) -> str: ns = "N" if ll.latitude >= 0 else "S" ew = "E" if ll.longitude >= 0 else "W" return f"{ll.latitude:.4}°{ns} {ll.longitude:.4}°{ew}" @@ -355,8 +356,9 @@ class BriefingPage(KneeboardPage): if channel is None: return str(frequency) - namer = AIRCRAFT_DATA[self.flight.aircraft_type.id].channel_namer - channel_name = namer.channel_name(channel.radio_id, channel.channel) + channel_name = self.flight.aircraft_type.channel_name( + channel.radio_id, channel.channel + ) return f"{channel_name}\n{frequency}" @@ -452,9 +454,10 @@ class SupportPage(KneeboardPage): if channel is None: return str(frequency) - namer = AIRCRAFT_DATA[self.flight.aircraft_type.id].channel_namer - channel_name = namer.channel_name(channel.radio_id, channel.channel) - return f"{channel_name} {frequency}" + channel_name = self.flight.aircraft_type.channel_name( + channel.radio_id, channel.channel + ) + return f"{channel_name}\n{frequency}" def _format_time(self, time: Optional[datetime.timedelta]) -> str: if time is None: @@ -565,14 +568,14 @@ class KneeboardGenerator(MissionInfoGenerator): temp_dir = Path("kneeboards") temp_dir.mkdir(exist_ok=True) for aircraft, pages in self.pages_by_airframe().items(): - aircraft_dir = temp_dir / aircraft.id + aircraft_dir = temp_dir / aircraft.dcs_unit_type.id aircraft_dir.mkdir(exist_ok=True) for idx, page in enumerate(pages): page_path = aircraft_dir / f"page{idx:02}.png" page.write(page_path) - self.mission.add_aircraft_kneeboard(aircraft, page_path) + self.mission.add_aircraft_kneeboard(aircraft.dcs_unit_type, page_path) - def pages_by_airframe(self) -> Dict[FlyingType, List[KneeboardPage]]: + def pages_by_airframe(self) -> Dict[AircraftType, List[KneeboardPage]]: """Returns a list of kneeboard pages per airframe in the mission. Only client flights will be included, but because DCS does not support @@ -583,7 +586,7 @@ class KneeboardGenerator(MissionInfoGenerator): A dict mapping aircraft types to the list of kneeboard pages for that aircraft. """ - all_flights: Dict[FlyingType, List[KneeboardPage]] = defaultdict(list) + all_flights: Dict[AircraftType, List[KneeboardPage]] = defaultdict(list) for flight in self.flights: if not flight.client_units: continue diff --git a/gen/missiles/scud_site.py b/gen/missiles/scud_site.py index bf5be54b..67c9a0ad 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.SSM_SS_1C_Scud_B, + MissilesSS.Scud_B, "V1#0", self.position.x, self.position.y + random.randint(1, 8), self.heading, ) self.add_unit( - MissilesSS.SSM_SS_1C_Scud_B, + MissilesSS.Scud_B, "V1#1", self.position.x + 50, self.position.y + random.randint(1, 8), self.heading, ) self.add_unit( - MissilesSS.SSM_SS_1C_Scud_B, + MissilesSS.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.LUV_UAZ_469_Jeep, + Unarmed.UAZ_469, "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_Gun_Dish, + AirDefence.ZSU_23_4_Shilka, "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_Gaskin_TEL, + AirDefence.Strela_1_9P31, "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 b1cdbe62..60c94db8 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.SSM_V_1_Launcher, + MissilesSS.V1_launcher, "V1#0", self.position.x, self.position.y + random.randint(1, 8), self.heading, ) self.add_unit( - MissilesSS.SSM_V_1_Launcher, + MissilesSS.V1_launcher, "V1#1", self.position.x + 50, self.position.y + random.randint(1, 8), self.heading, ) self.add_unit( - MissilesSS.SSM_V_1_Launcher, + MissilesSS.V1_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.LUV_Kubelwagen_82, + Unarmed.Kubelwagen_82, "Kubel#0", self.position.x - 35, self.position.y - 20, @@ -45,9 +45,7 @@ class V1GroupGenerator(GroupGenerator): ) # Self defense flak - flak_unit = random.choice( - [AirDefence.AAA_Flak_Vierling_38_Quad_20mm, AirDefence.AAA_Flak_38_20mm] - ) + flak_unit = random.choice([AirDefence.Flak38, AirDefence.Flak30]) self.add_unit( flak_unit, @@ -58,7 +56,7 @@ class V1GroupGenerator(GroupGenerator): ) self.add_unit( - Unarmed.Truck_Opel_Blitz, + Unarmed.Blitz_36_6700A, "Blitz#0", self.position.x + 200, self.position.y + 15, diff --git a/gen/naming.py b/gen/naming.py index dad364dc..df56ab64 100644 --- a/gen/naming.py +++ b/gen/naming.py @@ -3,10 +3,9 @@ import time from typing import List from dcs.country import Country -from dcs.unittype import UnitType - -from game import db +from game.dcs.aircrafttype import AircraftType +from game.dcs.unittype import UnitType from gen.flights.flight import Flight ALPHA_MILITARY = [ @@ -290,14 +289,14 @@ class NameGenerator: country.id, cls.aircraft_number, parent_base_id, - db.unit_type_name(flight.unit_type), + flight.unit_type.name, ) @classmethod def next_unit_name(cls, country: Country, parent_base_id: int, unit_type: UnitType): cls.number += 1 return "unit|{}|{}|{}|{}|".format( - country.id, cls.number, parent_base_id, db.unit_type_name(unit_type) + country.id, cls.number, parent_base_id, unit_type.name ) @classmethod @@ -309,7 +308,7 @@ class NameGenerator: country.id, cls.infantry_number, parent_base_id, - db.unit_type_name(unit_type), + unit_type.name, ) @classmethod @@ -318,11 +317,9 @@ class NameGenerator: return "awacs|{}|{}|0|".format(country.id, cls.number) @classmethod - def next_tanker_name(cls, country: Country, unit_type: UnitType): + def next_tanker_name(cls, country: Country, unit_type: AircraftType): cls.number += 1 - return "tanker|{}|{}|0|{}".format( - country.id, cls.number, db.unit_type_name(unit_type) - ) + return "tanker|{}|{}|0|{}".format(country.id, cls.number, unit_type.name) @classmethod def next_carrier_name(cls, country: Country): diff --git a/gen/radios.py b/gen/radios.py index 333647df..22968397 100644 --- a/gen/radios.py +++ b/gen/radios.py @@ -153,7 +153,7 @@ def get_radio(name: str) -> Radio: for radio in RADIOS: if radio.name == name: return radio - raise KeyError + raise KeyError(f"Unknown radio: {name}") class RadioRegistry: diff --git a/gen/sam/aaa_bofors.py b/gen/sam/aaa_bofors.py index 6af41922..8c76f7f4 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.Bofors40, "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 25b9e274..f918e48a 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_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_20mm, + AirDefence.Flak38, + AirDefence.Flak18, + AirDefence.Flak36, + AirDefence.Flak37, + AirDefence.Flak41, + AirDefence.Flak30, ] @@ -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.SL_Flakscheinwerfer_37, + AirDefence.Flakscheinwerfer_37, "SearchLight#" + str(index), pos[0], pos[1], @@ -62,14 +62,14 @@ class FlakGenerator(AirDefenseGroupGenerator): # Support self.add_unit( - AirDefence.PU_Maschinensatz_33, + AirDefence.Maschinensatz_33, "MC33#", self.position.x - 20, self.position.y - 20, self.heading, ) self.add_unit( - AirDefence.AAA_SP_Kdo_G_40, + AirDefence.KDO_Mod40, "KDO#", self.position.x - 25, self.position.y - 20, @@ -78,7 +78,7 @@ class FlakGenerator(AirDefenseGroupGenerator): # Commander self.add_unit( - Unarmed.LUV_Kubelwagen_82, + Unarmed.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.Truck_Opel_Blitz, + Unarmed.Blitz_36_6700A, "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 26b44f82..91f81f15 100644 --- a/gen/sam/aaa_flak18.py +++ b/gen/sam/aaa_flak18.py @@ -25,7 +25,7 @@ class Flak18Generator(AirDefenseGroupGenerator): for j in range(2): index = index + 1 self.add_unit( - AirDefence.AAA_8_8cm_Flak_18, + AirDefence.Flak18, "AAA#" + str(index), self.position.x + spacing * i + random.randint(1, 5), self.position.y + spacing * j + random.randint(1, 5), @@ -34,7 +34,7 @@ class Flak18Generator(AirDefenseGroupGenerator): # Add a commander truck self.add_unit( - Unarmed.Truck_Opel_Blitz, + Unarmed.Blitz_36_6700A, "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 c9ace380..415bdab3 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.AAA_QF_3_7, + AirDefence.QF_37_AA, "AA#" + str(i), position[0], position[1], @@ -31,7 +31,7 @@ class AllyWW2FlakGenerator(AirDefenseGroupGenerator): positions = self.get_circular_position(8, launcher_distance=60, coverage=360) for i, position in enumerate(positions): self.add_unit( - AirDefence.AAA_M1_37mm, + AirDefence.M1_37mm, "AA#" + str(4 + 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_HB_12_7mm, + AirDefence.M45_Quadmount, "AA#" + str(12 + i), position[0], position[1], @@ -50,28 +50,28 @@ class AllyWW2FlakGenerator(AirDefenseGroupGenerator): # Add a commander truck self.add_unit( - Unarmed.Car_Willys_Jeep, + Unarmed.Willys_MB, "CMD#1", self.position.x, self.position.y - 20, random.randint(0, 360), ) self.add_unit( - Unarmed.Carrier_M30_Cargo, + Unarmed.M30_CC, "LOG#1", self.position.x, self.position.y + 20, random.randint(0, 360), ) self.add_unit( - Unarmed.Tractor_M4_Hi_Speed, + Unarmed.M4_Tractor, "LOG#2", self.position.x + 20, self.position.y, random.randint(0, 360), ) self.add_unit( - Unarmed.Truck_Bedford, + Unarmed.Bedford_MWD, "LOG#3", self.position.x - 20, self.position.y, diff --git a/gen/sam/aaa_zsu57.py b/gen/sam/aaa_zsu57.py index c87bf63d..4648e90b 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.SPAAA_ZSU_57_2, + AirDefence.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 96cd1d71..5ca97638 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_Emplacement, + AirDefence.ZU_23_Closed_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 1ea3a724..6c0bdf40 100644 --- a/gen/sam/cold_war_flak.py +++ b/gen/sam/cold_war_flak.py @@ -29,7 +29,7 @@ class EarlyColdWarFlakGenerator(AirDefenseGroupGenerator): for j in range(2): index = index + 1 self.add_unit( - AirDefence.AAA_8_8cm_Flak_18, + AirDefence.Flak18, "AAA#" + str(index), self.position.x + spacing * i + random.randint(1, 5), self.position.y + spacing * j + random.randint(1, 5), @@ -38,14 +38,14 @@ class EarlyColdWarFlakGenerator(AirDefenseGroupGenerator): # Medium range guns self.add_unit( - AirDefence.AAA_S_60_57mm, + AirDefence.S_60_Type59_Artillery, "SHO#1", self.position.x - 40, self.position.y - 40, self.heading + 180, ), self.add_unit( - AirDefence.AAA_S_60_57mm, + AirDefence.S_60_Type59_Artillery, "SHO#2", self.position.x + spacing * 2 + 40, self.position.y + spacing + 40, @@ -54,14 +54,14 @@ class EarlyColdWarFlakGenerator(AirDefenseGroupGenerator): # Short range guns self.add_unit( - AirDefence.AAA_ZU_23_Closed_Emplacement, + AirDefence.ZU_23_Emplacement_Closed, "SHO#3", self.position.x - 80, self.position.y - 40, self.heading + 180, ), self.add_unit( - AirDefence.AAA_ZU_23_Closed_Emplacement, + AirDefence.ZU_23_Emplacement_Closed, "SHO#4", self.position.x + spacing * 2 + 80, self.position.y + spacing + 40, @@ -70,7 +70,7 @@ class EarlyColdWarFlakGenerator(AirDefenseGroupGenerator): # Add a truck self.add_unit( - Unarmed.Truck_KAMAZ_43101, + Unarmed.KAMAZ_Truck, "Truck#", self.position.x - 60, self.position.y - 20, @@ -102,7 +102,7 @@ class ColdWarFlakGenerator(AirDefenseGroupGenerator): for j in range(2): index = index + 1 self.add_unit( - AirDefence.AAA_8_8cm_Flak_18, + AirDefence.Flak18, "AAA#" + str(index), self.position.x + spacing * i + random.randint(1, 5), self.position.y + spacing * j + random.randint(1, 5), @@ -111,14 +111,14 @@ class ColdWarFlakGenerator(AirDefenseGroupGenerator): # Medium range guns self.add_unit( - AirDefence.AAA_S_60_57mm, + AirDefence.S_60_Type59_Artillery, "SHO#1", self.position.x - 40, self.position.y - 40, self.heading + 180, ), self.add_unit( - AirDefence.AAA_S_60_57mm, + AirDefence.S_60_Type59_Artillery, "SHO#2", self.position.x + spacing * 2 + 40, self.position.y + spacing + 40, @@ -127,14 +127,14 @@ class ColdWarFlakGenerator(AirDefenseGroupGenerator): # Short range guns self.add_unit( - AirDefence.AAA_ZU_23_Closed_Emplacement, + AirDefence.ZU_23_Emplacement_Closed, "SHO#3", self.position.x - 80, self.position.y - 40, self.heading + 180, ), self.add_unit( - AirDefence.AAA_ZU_23_Closed_Emplacement, + AirDefence.ZU_23_Emplacement_Closed, "SHO#4", self.position.x + spacing * 2 + 80, self.position.y + spacing + 40, @@ -143,7 +143,7 @@ class ColdWarFlakGenerator(AirDefenseGroupGenerator): # Add a P19 Radar for EWR self.add_unit( - AirDefence.SAM_P19_Flat_Face_SR__SA_2_3, + AirDefence.P_19_s_125_sr, "SR#0", self.position.x - 60, self.position.y - 20, diff --git a/gen/sam/ewrs.py b/gen/sam/ewrs.py index 0c529cf8..df27e6ad 100644 --- a/gen/sam/ewrs.py +++ b/gen/sam/ewrs.py @@ -1,3 +1,5 @@ +from typing import Type + from dcs.vehicles import AirDefence from dcs.unittype import VehicleType @@ -5,7 +7,7 @@ from gen.sam.group_generator import GroupGenerator class EwrGenerator(GroupGenerator): - unit_type: VehicleType + unit_type: Type[VehicleType] @classmethod def name(cls) -> str: @@ -25,13 +27,13 @@ class EwrGenerator(GroupGenerator): class BoxSpringGenerator(EwrGenerator): """1L13 "Box Spring" EWR.""" - unit_type = AirDefence.EWR_1L13 + unit_type = AirDefence._1L13_EWR class TallRackGenerator(EwrGenerator): """55G6 "Tall Rack" EWR.""" - unit_type = AirDefence.EWR_55G6 + unit_type = AirDefence._55G6_EWR class DogEarGenerator(EwrGenerator): @@ -40,7 +42,7 @@ class DogEarGenerator(EwrGenerator): This is the SA-8 search radar, but used as an early warning radar. """ - unit_type = AirDefence.MCC_SR_Sborka_Dog_Ear_SR + unit_type = AirDefence.Dog_Ear_radar class RolandEwrGenerator(EwrGenerator): @@ -49,7 +51,7 @@ class RolandEwrGenerator(EwrGenerator): This is the Roland search radar, but used as an early warning radar. """ - unit_type = AirDefence.SAM_Roland_EWR + unit_type = AirDefence.Roland_Radar class FlatFaceGenerator(EwrGenerator): @@ -58,7 +60,7 @@ class FlatFaceGenerator(EwrGenerator): This is the SA-3 search radar, but used as an early warning radar. """ - unit_type = AirDefence.SAM_P19_Flat_Face_SR__SA_2_3 + unit_type = AirDefence.P_19_s_125_sr class PatriotEwrGenerator(EwrGenerator): @@ -67,7 +69,7 @@ class PatriotEwrGenerator(EwrGenerator): This is the Patriot search/track radar, but used as an early warning radar. """ - unit_type = AirDefence.SAM_Patriot_STR + unit_type = AirDefence.Patriot_str class BigBirdGenerator(EwrGenerator): @@ -76,7 +78,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_300_Grumble_Big_Bird_SR + unit_type = AirDefence.S_300PS_64H6E_sr class SnowDriftGenerator(EwrGenerator): @@ -85,7 +87,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_Gadfly_Snow_Drift_SR + unit_type = AirDefence.SA_11_Buk_SR_9S18M1 class StraightFlushGenerator(EwrGenerator): @@ -94,7 +96,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_Straight_Flush_STR + unit_type = AirDefence.Kub_1S91_str class HawkEwrGenerator(EwrGenerator): @@ -103,4 +105,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.Hawk_sr diff --git a/gen/sam/freya_ewr.py b/gen/sam/freya_ewr.py index 7e77bf1d..917767fb 100644 --- a/gen/sam/freya_ewr.py +++ b/gen/sam/freya_ewr.py @@ -18,7 +18,7 @@ class FreyaGenerator(AirDefenseGroupGenerator): # TODO : would be better with the Concrete structure that is supposed to protect it self.add_unit( - AirDefence.EWR_FuMG_401_Freya_LZ, + AirDefence.FuMG_401, "EWR#1", self.position.x, self.position.y, @@ -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_Quad_20mm, + AirDefence.Flak38, "AA#" + str(i), position[0], position[1], @@ -38,7 +38,7 @@ class FreyaGenerator(AirDefenseGroupGenerator): positions = self.get_circular_position(4, launcher_distance=100, coverage=360) for i, position in enumerate(positions): self.add_unit( - AirDefence.AAA_8_8cm_Flak_18, + AirDefence.Flak18, "AA#" + str(4 + i), position[0], position[1], @@ -47,58 +47,58 @@ class FreyaGenerator(AirDefenseGroupGenerator): # Command/Logi self.add_unit( - Unarmed.LUV_Kubelwagen_82, + Unarmed.Kubelwagen_82, "Kubel#1", self.position.x - 20, self.position.y - 20, self.heading, ) self.add_unit( - Unarmed.Carrier_Sd_Kfz_7_Tractor, + Unarmed.Sd_Kfz_7, "Sdkfz#1", self.position.x + 20, self.position.y + 22, self.heading, ) self.add_unit( - Unarmed.LUV_Kettenrad, + Unarmed.Sd_Kfz_2, "Sdkfz#2", self.position.x - 22, self.position.y + 20, self.heading, ) - # PU_Maschinensatz_33 and Kdo.g 40 Telemeter + # Maschinensatz_33 and Kdo.g 40 Telemeter self.add_unit( - AirDefence.PU_Maschinensatz_33, + AirDefence.Maschinensatz_33, "Energy#1", self.position.x + 20, self.position.y - 20, self.heading, ) self.add_unit( - AirDefence.AAA_SP_Kdo_G_40, + AirDefence.KDO_Mod40, "Telemeter#1", self.position.x + 20, self.position.y - 10, self.heading, ) self.add_unit( - Infantry.Infantry_Mauser_98, + Infantry.Soldier_mauser98, "Inf#1", self.position.x + 20, self.position.y - 14, self.heading, ) self.add_unit( - Infantry.Infantry_Mauser_98, + Infantry.Soldier_mauser98, "Inf#2", self.position.x + 20, self.position.y - 22, self.heading, ) self.add_unit( - Infantry.Infantry_Mauser_98, + Infantry.Soldier_mauser98, "Inf#3", self.position.x + 20, self.position.y - 24, diff --git a/gen/sam/sam_avenger.py b/gen/sam/sam_avenger.py index 45b07bc1..b778cc62 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.Truck_M818_6x6, + Unarmed.M_818, "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__Stinger, + AirDefence.M1097_Avenger, "SPAA#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_chaparral.py b/gen/sam/sam_chaparral.py index fb4d6fee..465ba0bd 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.Truck_M818_6x6, + Unarmed.M_818, "TRUCK", self.position.x, self.position.y, @@ -31,7 +31,7 @@ class ChaparralGenerator(AirDefenseGroupGenerator): ) for i, position in enumerate(positions): self.add_unit( - AirDefence.SAM_Chaparral_M48, + AirDefence.M48_Chaparral, "SPAA#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_gepard.py b/gen/sam/sam_gepard.py index a8c6c861..669781df 100644 --- a/gen/sam/sam_gepard.py +++ b/gen/sam/sam_gepard.py @@ -18,7 +18,7 @@ class GepardGenerator(AirDefenseGroupGenerator): def generate(self): self.add_unit( - AirDefence.SPAAA_Gepard, + AirDefence.Gepard, "SPAAA", self.position.x, self.position.y, @@ -26,14 +26,14 @@ class GepardGenerator(AirDefenseGroupGenerator): ) if random.randint(0, 1) == 1: self.add_unit( - AirDefence.SPAAA_Gepard, + AirDefence.Gepard, "SPAAA2", self.position.x, self.position.y, self.heading, ) self.add_unit( - Unarmed.Truck_M818_6x6, + Unarmed.M_818, "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 a4968830..3db1b70a 100644 --- a/gen/sam/sam_group_generator.py +++ b/gen/sam/sam_group_generator.py @@ -2,7 +2,6 @@ import random from typing import Dict, Iterable, List, Optional, Sequence, Set, Type from dcs.unitgroup import VehicleGroup -from dcs.vehicles import AirDefence from game import Game from game.factions.faction import Faction @@ -104,41 +103,6 @@ SAM_MAP: Dict[str, Type[AirDefenseGroupGenerator]] = { } -SAM_PRICES = { - AirDefence.SAM_Hawk_Platoon_Command_Post__PCP: 35, - AirDefence.AAA_ZU_23_Emplacement: 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_Insurgent_Closed_Emplacement: 10, - AirDefence.AAA_ZU_23_Insurgent_Emplacement: 10, - 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: 85, - AirDefence.SAM_Patriot_EPP_III: 85, - AirDefence.SAM_Chaparral_M48: 25, - AirDefence.AAA_Bofors_40mm: 15, - AirDefence.AAA_8_8cm_Flak_36: 15, - 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, -} - - def get_faction_possible_sams_generator( faction: Faction, ) -> List[Type[AirDefenseGroupGenerator]]: diff --git a/gen/sam/sam_hawk.py b/gen/sam/sam_hawk.py index f07f8872..01e463e1 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.Hawk_sr, "SR", self.position.x + 20, self.position.y, self.heading, ) self.add_unit( - AirDefence.SAM_Hawk_Platoon_Command_Post__PCP, + AirDefence.Hawk_pcp, "PCP", self.position.x, self.position.y, self.heading, ) self.add_unit( - AirDefence.SAM_Hawk_TR__AN_MPQ_46, + AirDefence.Hawk_tr, "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.SPAAA_Vulcan_M163, + AirDefence.Vulcan, "AAA", self.position + Point(20, 30), self.heading, @@ -57,7 +57,7 @@ class HawkGenerator(AirDefenseGroupGenerator): for i, position in enumerate(positions): self.add_unit( - AirDefence.SAM_Hawk_LN_M192, + AirDefence.Hawk_ln, "LN#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_hq7.py b/gen/sam/sam_hq7.py index bbe449a4..d05aecd8 100644 --- a/gen/sam/sam_hq7.py +++ b/gen/sam/sam_hq7.py @@ -19,14 +19,14 @@ class HQ7Generator(AirDefenseGroupGenerator): def generate(self): self.add_unit( - AirDefence.HQ_7_Self_Propelled_STR, + AirDefence.HQ_7_STR_SP, "STR", self.position.x, self.position.y, self.heading, ) self.add_unit( - AirDefence.HQ_7_Self_Propelled_LN, + AirDefence.HQ_7_LN_SP, "LN", self.position.x + 20, self.position.y, @@ -37,14 +37,14 @@ class HQ7Generator(AirDefenseGroupGenerator): aa_group = self.add_auxiliary_group("AA") self.add_unit_to_group( aa_group, - AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375, + AirDefence.Ural_375_ZU_23, "AAA1", self.position + Point(20, 30), self.heading, ) self.add_unit_to_group( aa_group, - AirDefence.SPAAA_ZU_23_2_Mounted_Ural_375, + AirDefence.Ural_375_ZU_23, "AAA2", self.position - Point(20, 30), self.heading, @@ -57,7 +57,7 @@ class HQ7Generator(AirDefenseGroupGenerator): ) for i, position in enumerate(positions): self.add_unit( - AirDefence.HQ_7_Self_Propelled_LN, + AirDefence.HQ_7_LN_SP, "LN#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_linebacker.py b/gen/sam/sam_linebacker.py index f0393712..b140b138 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.Truck_M818_6x6, + Unarmed.M_818, "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___Bradley_M6, + AirDefence.M6_Linebacker, "M6#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_patriot.py b/gen/sam/sam_patriot.py index af17b712..21f6cd18 100644 --- a/gen/sam/sam_patriot.py +++ b/gen/sam/sam_patriot.py @@ -20,35 +20,35 @@ class PatriotGenerator(AirDefenseGroupGenerator): def generate(self): # Command Post self.add_unit( - AirDefence.SAM_Patriot_STR, + AirDefence.Patriot_str, "STR", self.position.x + 30, self.position.y + 30, self.heading, ) self.add_unit( - AirDefence.SAM_Patriot_CR__AMG_AN_MRC_137, + AirDefence.Patriot_AMG, "MRC", self.position.x, self.position.y, self.heading, ) self.add_unit( - AirDefence.SAM_Patriot_ECS, + AirDefence.Patriot_ECS, "MSQ", self.position.x + 30, self.position.y, self.heading, ) self.add_unit( - AirDefence.SAM_Patriot_C2_ICC, + AirDefence.Patriot_cp, "ICC", self.position.x + 60, self.position.y, self.heading, ) self.add_unit( - AirDefence.SAM_Patriot_EPP_III, + AirDefence.Patriot_EPP, "EPP", self.position.x, self.position.y + 30, @@ -61,7 +61,7 @@ class PatriotGenerator(AirDefenseGroupGenerator): ) for i, position in enumerate(positions): self.add_unit( - AirDefence.SAM_Patriot_LN, + AirDefence.Patriot_ln, "LN#" + str(i), position[0], position[1], @@ -77,7 +77,7 @@ class PatriotGenerator(AirDefenseGroupGenerator): for i, (x, y, heading) in enumerate(positions): self.add_unit_to_group( aa_group, - AirDefence.SPAAA_Vulcan_M163, + AirDefence.Vulcan, f"SPAAA#{i}", Point(x, y), heading, diff --git a/gen/sam/sam_rapier.py b/gen/sam/sam_rapier.py index f869b17e..0e361459 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.SAM_Rapier_Blindfire_TR, + AirDefence.Rapier_fsa_blindfire_radar, "BT", self.position.x, self.position.y, self.heading, ) self.add_unit( - AirDefence.SAM_Rapier_Tracker, + AirDefence.Rapier_fsa_optical_tracker_unit, "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.SAM_Rapier_LN, + AirDefence.Rapier_fsa_launcher, "LN#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_roland.py b/gen/sam/sam_roland.py index 8511e94a..4a88cfd4 100644 --- a/gen/sam/sam_roland.py +++ b/gen/sam/sam_roland.py @@ -16,21 +16,21 @@ class RolandGenerator(AirDefenseGroupGenerator): def generate(self): self.add_unit( - AirDefence.SAM_Roland_EWR, + AirDefence.Roland_Radar, "EWR", self.position.x + 40, self.position.y, self.heading, ) self.add_unit( - AirDefence.SAM_Roland_ADS, + AirDefence.Roland_ADS, "ADS", self.position.x, self.position.y, self.heading, ) self.add_unit( - Unarmed.Truck_M818_6x6, + Unarmed.M_818, "TRUCK", self.position.x + 80, self.position.y, diff --git a/gen/sam/sam_sa10.py b/gen/sam/sam_sa10.py index a0873223..6daf8bfb 100644 --- a/gen/sam/sam_sa10.py +++ b/gen/sam/sam_sa10.py @@ -22,13 +22,13 @@ class SA10Generator(AirDefenseGroupGenerator): def __init__(self, game: Game, ground_object: SamGroundObject): super().__init__(game, ground_object) - 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 + self.sr1 = AirDefence.S_300PS_40B6MD_sr + self.sr2 = AirDefence.S_300PS_64H6E_sr + self.cp = AirDefence.S_300PS_54K6_cp + self.tr1 = AirDefence.S_300PS_40B6M_tr + self.tr2 = AirDefence.S_300PS_40B6M_tr + self.ln1 = AirDefence.S_300PS_5P85C_ln + self.ln2 = AirDefence.S_300PS_5P85D_ln def generate(self): # Search Radar @@ -84,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_Gun_Dish, + AirDefence.ZSU_23_4_Shilka, f"AA#{i}", Point(x, y), heading, @@ -109,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_Gauntlet, + AirDefence.Tor_9A331, f"PD#{i}", Point(x, y), heading, @@ -131,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_Grison, + AirDefence._2S6_Tunguska, f"AA#{i}", Point(x, y), heading, @@ -146,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_Gauntlet, + AirDefence.Tor_9A331, f"PD#{i}", Point(x, y), heading, diff --git a/gen/sam/sam_sa11.py b/gen/sam/sam_sa11.py index 6076d69a..7fec37c2 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_Gadfly_Snow_Drift_SR, + AirDefence.SA_11_Buk_SR_9S18M1, "SR", self.position.x + 20, self.position.y, self.heading, ) self.add_unit( - AirDefence.SAM_SA_11_Buk_Gadfly_C2, + AirDefence.SA_11_Buk_CC_9S470M1, "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_Gadfly_Fire_Dome_TEL, + AirDefence.SA_11_Buk_LN_9A310M1, "LN#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_sa13.py b/gen/sam/sam_sa13.py index 76fc081f..0fbe1af0 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.LUV_UAZ_469_Jeep, + Unarmed.UAZ_469, "UAZ", self.position.x, self.position.y, self.heading, ) self.add_unit( - Unarmed.Truck_KAMAZ_43101, + Unarmed.KAMAZ_Truck, "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_Gopher_TEL, + AirDefence.Strela_10M3, "LN#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_sa15.py b/gen/sam/sam_sa15.py index 8eccbd58..3dcb881a 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_Gauntlet, + AirDefence.Tor_9A331, "ADS", self.position.x, self.position.y, self.heading, ) self.add_unit( - Unarmed.LUV_UAZ_469_Jeep, + Unarmed.UAZ_469, "EWR", self.position.x + 40, self.position.y, self.heading, ) self.add_unit( - Unarmed.Truck_KAMAZ_43101, + Unarmed.KAMAZ_Truck, "TRUCK", self.position.x + 80, self.position.y, diff --git a/gen/sam/sam_sa17.py b/gen/sam/sam_sa17.py index 49b864e9..093044b8 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_Gadfly_Snow_Drift_SR, + AirDefence.SA_11_Buk_SR_9S18M1, "SR", self.position.x + 20, self.position.y, self.heading, ) self.add_unit( - AirDefence.SAM_SA_11_Buk_Gadfly_C2, + AirDefence.SA_11_Buk_CC_9S470M1, "CC", self.position.x, self.position.y, diff --git a/gen/sam/sam_sa19.py b/gen/sam/sam_sa19.py index 8583f490..caac1f7c 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_Grison, + AirDefence._2S6_Tunguska, "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_Grison, + AirDefence._2S6_Tunguska, "LN#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_sa2.py b/gen/sam/sam_sa2.py index c34e697f..4b7341df 100644 --- a/gen/sam/sam_sa2.py +++ b/gen/sam/sam_sa2.py @@ -18,14 +18,14 @@ class SA2Generator(AirDefenseGroupGenerator): def generate(self): self.add_unit( - AirDefence.SAM_P19_Flat_Face_SR__SA_2_3, + AirDefence.P_19_s_125_sr, "SR", self.position.x, self.position.y, self.heading, ) self.add_unit( - AirDefence.SAM_SA_2_S_75_Fan_Song_TR, + AirDefence.SNR_75V, "TR", self.position.x + 20, self.position.y, @@ -39,7 +39,7 @@ class SA2Generator(AirDefenseGroupGenerator): for i, position in enumerate(positions): self.add_unit( - AirDefence.SAM_SA_2_S_75_Guideline_LN, + AirDefence.S_75M_Volhov, "LN#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_sa3.py b/gen/sam/sam_sa3.py index 7de69c59..1a95de12 100644 --- a/gen/sam/sam_sa3.py +++ b/gen/sam/sam_sa3.py @@ -18,14 +18,14 @@ class SA3Generator(AirDefenseGroupGenerator): def generate(self): self.add_unit( - AirDefence.SAM_P19_Flat_Face_SR__SA_2_3, + AirDefence.P_19_s_125_sr, "SR", self.position.x, self.position.y, self.heading, ) self.add_unit( - AirDefence.SAM_SA_3_S_125_Low_Blow_TR, + AirDefence.Snr_s_125_tr, "TR", self.position.x + 20, self.position.y, @@ -39,7 +39,7 @@ class SA3Generator(AirDefenseGroupGenerator): for i, position in enumerate(positions): self.add_unit( - AirDefence.SAM_SA_3_S_125_Goa_LN, + AirDefence._5p73_s_125_ln, "LN#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_sa6.py b/gen/sam/sam_sa6.py index 25746651..fa72b24a 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_Straight_Flush_STR, + AirDefence.Kub_1S91_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_Gainful_TEL, + AirDefence.Kub_2P25_ln, "LN#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_sa8.py b/gen/sam/sam_sa8.py index 0ded6973..3ab28dfc 100644 --- a/gen/sam/sam_sa8.py +++ b/gen/sam/sam_sa8.py @@ -16,14 +16,14 @@ class SA8Generator(AirDefenseGroupGenerator): def generate(self): self.add_unit( - AirDefence.SAM_SA_8_Osa_Gecko_TEL, + AirDefence.Osa_9A33_ln, "OSA", self.position.x, self.position.y, self.heading, ) self.add_unit( - AirDefence.SAM_SA_8_Osa_LD_9T217, + AirDefence.SA_8_Osa_LD_9T217, "LD", self.position.x + 20, self.position.y, diff --git a/gen/sam/sam_sa9.py b/gen/sam/sam_sa9.py index 85edfb60..fccc7973 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.LUV_UAZ_469_Jeep, + Unarmed.UAZ_469, "UAZ", self.position.x, self.position.y, self.heading, ) self.add_unit( - Unarmed.Truck_KAMAZ_43101, + Unarmed.KAMAZ_Truck, "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_Gaskin_TEL, + AirDefence.Strela_1_9P31, "LN#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_vulcan.py b/gen/sam/sam_vulcan.py index 24998c4f..2d057dc0 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.SPAAA_Vulcan_M163, + AirDefence.Vulcan, "SPAAA", self.position.x, self.position.y, @@ -26,14 +26,14 @@ class VulcanGenerator(AirDefenseGroupGenerator): ) if random.randint(0, 1) == 1: self.add_unit( - AirDefence.SPAAA_Vulcan_M163, + AirDefence.Vulcan, "SPAAA2", self.position.x, self.position.y, self.heading, ) self.add_unit( - Unarmed.Truck_M818_6x6, + Unarmed.M_818, "TRUCK", self.position.x + 80, self.position.y, diff --git a/gen/sam/sam_zsu23.py b/gen/sam/sam_zsu23.py index 5be3de8d..708ae5c6 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_Gun_Dish, + AirDefence.ZSU_23_4_Shilka, "SPAA#" + str(i), position[0], position[1], diff --git a/gen/sam/sam_zu23.py b/gen/sam/sam_zu23.py index 9cb43ab2..6a1b41cb 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_Emplacement, + AirDefence.ZU_23_Emplacement_Closed, "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 af5f85db..4f97d6f3 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.SPAAA_ZU_23_2_Mounted_Ural_375, + AirDefence.Ural_375_ZU_23, "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 91ca4a66..d0ab8405 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.SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375, + AirDefence.Ural_375_ZU_23_Insurgent, "SPAA#" + str(i), position[0], position[1], diff --git a/pydcs b/pydcs index 53632aa7..a459d8e1 160000 --- a/pydcs +++ b/pydcs @@ -1 +1 @@ -Subproject commit 53632aa7a8749c67eba371aaea95bfef73f43cdc +Subproject commit a459d8e1b0bd59bbd7f35390d7ad1bedc0caf76b diff --git a/qt_ui/models.py b/qt_ui/models.py index 0bf5920f..dd214e84 100644 --- a/qt_ui/models.py +++ b/qt_ui/models.py @@ -143,7 +143,7 @@ class PackageModel(QAbstractListModel): @staticmethod def icon_for_flight(flight: Flight) -> Optional[QIcon]: """Returns the icon that should be displayed for the flight.""" - name = db.unit_type_name(flight.unit_type) + name = flight.unit_type.dcs_id if name in AIRCRAFT_ICONS: return QIcon(AIRCRAFT_ICONS[name]) return None @@ -402,7 +402,7 @@ class AirWingModel(QAbstractListModel): @staticmethod def icon_for_squadron(squadron: Squadron) -> Optional[QIcon]: """Returns the icon that should be displayed for the squadron.""" - name = db.unit_type_name(squadron.aircraft) + name = squadron.aircraft.dcs_id if name in AIRCRAFT_ICONS: return QIcon(AIRCRAFT_ICONS[name]) return None @@ -424,7 +424,7 @@ class SquadronModel(QAbstractListModel): self.squadron = squadron def rowCount(self, parent: QModelIndex = QModelIndex()) -> int: - return self.squadron.number_of_pilots_including_dead + return self.squadron.number_of_pilots_including_inactive def data(self, index: QModelIndex, role: int = Qt.DisplayRole) -> Any: if not index.isValid(): @@ -462,9 +462,9 @@ class SquadronModel(QAbstractListModel): pilot = self.pilot_at_index(index) self.beginResetModel() if pilot.on_leave: - pilot.return_from_leave() + self.squadron.return_from_leave(pilot) else: - pilot.send_on_leave() + self.squadron.send_on_leave(pilot) self.endResetModel() def is_auto_assignable(self, task: FlightType) -> bool: diff --git a/qt_ui/uiconstants.py b/qt_ui/uiconstants.py index 19bc1945..30ee7adf 100644 --- a/qt_ui/uiconstants.py +++ b/qt_ui/uiconstants.py @@ -13,7 +13,7 @@ URLS: Dict[str, str] = { "Issues": "https://github.com/dcs-liberation/dcs_liberation/issues", } -LABELS_OPTIONS = ["Full", "Abbreviated", "Dot Only", "Off"] +LABELS_OPTIONS = ["Full", "Abbreviated", "Dot Only", "Neutral Dot", "Off"] SKILL_OPTIONS = ["Average", "Good", "High", "Excellent"] AIRCRAFT_BANNERS: Dict[str, QPixmap] = {} diff --git a/qt_ui/widgets/QIntelBox.py b/qt_ui/widgets/QIntelBox.py index a31e8448..cd22b898 100644 --- a/qt_ui/widgets/QIntelBox.py +++ b/qt_ui/widgets/QIntelBox.py @@ -123,6 +123,10 @@ class QIntelBox(QGroupBox): ) self.economic_strength.setText(self.economic_strength_text()) + if self.game.turn == 0: + self.air_strength.setText("gathering intel") + self.ground_strength.setText("gathering intel") + def open_details_window(self) -> None: self.details_window = IntelWindow(self.game) self.details_window.show() diff --git a/qt_ui/widgets/combos/QAircraftTypeSelector.py b/qt_ui/widgets/combos/QAircraftTypeSelector.py index b7949aa2..80dfa5b0 100644 --- a/qt_ui/widgets/combos/QAircraftTypeSelector.py +++ b/qt_ui/widgets/combos/QAircraftTypeSelector.py @@ -30,10 +30,7 @@ class QAircraftTypeSelector(QComboBox): self.clear() for aircraft in aircraft_types: if aircraft in aircraft_for_task(mission_type): - self.addItem( - f"{db.unit_get_expanded_info(self.country, aircraft, 'name')}", - userData=aircraft, - ) + self.addItem(f"{aircraft}", 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/combos/QArrivalAirfieldSelector.py b/qt_ui/widgets/combos/QArrivalAirfieldSelector.py index e4075f57..79a3aa9b 100644 --- a/qt_ui/widgets/combos/QArrivalAirfieldSelector.py +++ b/qt_ui/widgets/combos/QArrivalAirfieldSelector.py @@ -1,9 +1,10 @@ """Combo box for selecting a departure airfield.""" -from typing import Iterable, Type +from typing import Iterable, Optional from PySide2.QtWidgets import QComboBox from dcs.unittype import FlyingType +from game.dcs.aircrafttype import AircraftType from game.theater.controlpoint import ControlPoint @@ -17,7 +18,7 @@ class QArrivalAirfieldSelector(QComboBox): def __init__( self, destinations: Iterable[ControlPoint], - aircraft: Type[FlyingType], + aircraft: Optional[AircraftType], optional_text: str, ) -> None: super().__init__() @@ -27,7 +28,7 @@ class QArrivalAirfieldSelector(QComboBox): self.rebuild_selector() self.setCurrentIndex(0) - def change_aircraft(self, aircraft: FlyingType) -> None: + def change_aircraft(self, aircraft: Optional[FlyingType]) -> None: if self.aircraft == aircraft: return self.aircraft = aircraft @@ -35,6 +36,8 @@ class QArrivalAirfieldSelector(QComboBox): def rebuild_selector(self) -> None: self.clear() + if self.aircraft is None: + return for destination in self.destinations: if destination.can_operate(self.aircraft): self.addItem(destination.name, destination) diff --git a/qt_ui/widgets/combos/QOriginAirfieldSelector.py b/qt_ui/widgets/combos/QOriginAirfieldSelector.py index 75342fd1..9453a45c 100644 --- a/qt_ui/widgets/combos/QOriginAirfieldSelector.py +++ b/qt_ui/widgets/combos/QOriginAirfieldSelector.py @@ -1,10 +1,11 @@ """Combo box for selecting a departure airfield.""" -from typing import Iterable, Type +from typing import Iterable, Optional from PySide2.QtCore import Signal from PySide2.QtWidgets import QComboBox from dcs.unittype import FlyingType +from game.dcs.aircrafttype import AircraftType from game.inventory import GlobalAircraftInventory from game.theater.controlpoint import ControlPoint @@ -22,7 +23,7 @@ class QOriginAirfieldSelector(QComboBox): self, global_inventory: GlobalAircraftInventory, origins: Iterable[ControlPoint], - aircraft: Type[FlyingType], + aircraft: Optional[AircraftType], ) -> None: super().__init__() self.global_inventory = global_inventory @@ -32,7 +33,7 @@ class QOriginAirfieldSelector(QComboBox): self.currentIndexChanged.connect(self.index_changed) self.setSizeAdjustPolicy(self.AdjustToContents) - def change_aircraft(self, aircraft: FlyingType) -> None: + def change_aircraft(self, aircraft: Optional[FlyingType]) -> None: if self.aircraft == aircraft: return self.aircraft = aircraft @@ -40,6 +41,8 @@ class QOriginAirfieldSelector(QComboBox): def rebuild_selector(self) -> None: self.clear() + if self.aircraft is None: + return for origin in self.origins: if not origin.can_operate(self.aircraft): continue diff --git a/qt_ui/widgets/combos/QPredefinedWaypointSelectionComboBox.py b/qt_ui/widgets/combos/QPredefinedWaypointSelectionComboBox.py index 12e3d55e..32b01bd6 100644 --- a/qt_ui/widgets/combos/QPredefinedWaypointSelectionComboBox.py +++ b/qt_ui/widgets/combos/QPredefinedWaypointSelectionComboBox.py @@ -109,9 +109,9 @@ class QPredefinedWaypointSelectionComboBox(QFilteredComboBox): self.include_friendly and cp.captured ): for ground_object in cp.ground_objects: - if ( - not ground_object.is_dead - and ground_object.dcs_identifier == "AA" + if not ground_object.is_dead and ( + ground_object.dcs_identifier == "AA" + or ground_object.dcs_identifier == "EWR" ): for g in ground_object.groups: for j, u in enumerate(g.units): diff --git a/qt_ui/widgets/map/mapmodel.py b/qt_ui/widgets/map/mapmodel.py index 79aa0d70..969726fc 100644 --- a/qt_ui/widgets/map/mapmodel.py +++ b/qt_ui/widgets/map/mapmodel.py @@ -10,7 +10,8 @@ from dcs.unit import Unit from dcs.vehicles import vehicle_map from shapely.geometry import LineString, Point as ShapelyPoint, Polygon, MultiPolygon -from game import Game, db +from game import Game +from game.dcs.groundunittype import GroundUnitType from game.navmesh import NavMesh from game.profiling import logged_duration from game.theater import ( @@ -191,12 +192,6 @@ class GroundObjectJs(QObject): self.game = game self.theater = game.theater self.buildings = self.theater.find_ground_objects_by_obj_name(self.tgo.obj_name) - - if self.tgo.is_friendly(to_player=True): - self.country = game.player_country - else: - self.country = game.enemy_country - self.dialog: Optional[QGroundObjectMenu] = None @Slot() @@ -223,14 +218,20 @@ class GroundObjectJs(QObject): def category(self) -> str: return self.tgo.category - def make_unit_name(self, unit: Unit, dead: bool) -> str: + @staticmethod + def make_unit_name(unit: Unit, dead: bool) -> str: dead_label = " [DEAD]" if dead else "" unit_display_name = unit.type - unit_type = vehicle_map.get(unit.type) - if unit_type is not None: - unit_display_name = db.unit_get_expanded_info( - self.country, unit_type, "name" - ) + dcs_unit_type = vehicle_map.get(unit.type) + if dcs_unit_type is not None: + # TODO: Make the TGO contain GroundUnitType instead of the pydcs Group. + # This is a hack because we can't know which variant was used. + try: + unit_display_name = next( + GroundUnitType.for_dcs_type(dcs_unit_type) + ).name + except StopIteration: + pass return f"Unit #{unit.id} - {unit_display_name}{dead_label}" @Property(list, notify=unitsChanged) diff --git a/qt_ui/windows/AirWingDialog.py b/qt_ui/windows/AirWingDialog.py index 80c6443a..ac666e0e 100644 --- a/qt_ui/windows/AirWingDialog.py +++ b/qt_ui/windows/AirWingDialog.py @@ -1,7 +1,7 @@ from __future__ import annotations from dataclasses import dataclass -from typing import Optional, Type, Iterator +from typing import Optional, Iterator from PySide2.QtCore import ( QItemSelectionModel, @@ -20,9 +20,7 @@ from PySide2.QtWidgets import ( QTableWidgetItem, QWidget, ) -from dcs.unittype import FlyingType -from game import db from game.inventory import ControlPointAircraftInventory from game.squadrons import Squadron from gen.flights.flight import Flight @@ -42,20 +40,18 @@ class SquadronDelegate(TwoColumnRowDelegate): def text_for(self, index: QModelIndex, row: int, column: int) -> str: if (row, column) == (0, 0): - return self.air_wing_model.data(index, Qt.DisplayRole) + return self.squadron(index).name elif (row, column) == (0, 1): squadron = self.air_wing_model.data(index, AirWingModel.SquadronRole) - return db.unit_get_expanded_info( - squadron.country, squadron.aircraft, "name" - ) + return squadron.aircraft.name elif (row, column) == (1, 0): - return self.squadron(index).nickname + return self.squadron(index).nickname or "" elif (row, column) == (1, 1): squadron = self.squadron(index) - alive = squadron.number_of_living_pilots active = len(squadron.active_pilots) available = len(squadron.available_pilots) - return f"{alive} pilots, {active} active, {available} unassigned" + on_leave = len(squadron.pilots_on_leave) + return f"{active} active, {available} unassigned, {on_leave} on leave" return "" @@ -111,7 +107,6 @@ class AircraftInventoryData: @classmethod def from_flight(cls, flight: Flight) -> Iterator[AircraftInventoryData]: - unit_type_name = cls.format_unit_type(flight.unit_type, flight.country) num_units = flight.count flight_type = flight.flight_type.value target = flight.package.target.name @@ -125,7 +120,7 @@ class AircraftInventoryData: player = "Player" if pilot.player else "AI" yield AircraftInventoryData( flight.departure.name, - unit_type_name, + flight.unit_type.name, flight_type, target, pilot_name, @@ -134,24 +129,19 @@ class AircraftInventoryData: @classmethod def each_from_inventory( - cls, inventory: ControlPointAircraftInventory, country: str + cls, inventory: ControlPointAircraftInventory ) -> Iterator[AircraftInventoryData]: for unit_type, num_units in inventory.all_aircraft: - unit_type_name = cls.format_unit_type(unit_type, country) for _ in range(0, num_units): yield AircraftInventoryData( inventory.control_point.name, - unit_type_name, + unit_type.name, "Idle", "N/A", "N/A", "N/A", ) - @staticmethod - def format_unit_type(aircraft: Type[FlyingType], country: str) -> str: - return db.unit_get_expanded_info(country, aircraft, "name") - class AirInventoryView(QWidget): def __init__(self, game_model: GameModel) -> None: @@ -201,9 +191,7 @@ class AirInventoryView(QWidget): game = self.game_model.game for control_point, inventory in game.aircraft_inventory.inventories.items(): if control_point.captured: - yield from AircraftInventoryData.each_from_inventory( - inventory, game.country_for(player=True) - ) + yield from AircraftInventoryData.each_from_inventory(inventory) def get_data(self, only_unallocated: bool) -> Iterator[AircraftInventoryData]: yield from self.iter_unallocated_aircraft() diff --git a/qt_ui/windows/QDebriefingWindow.py b/qt_ui/windows/QDebriefingWindow.py index 86e59e0d..20e01cc3 100644 --- a/qt_ui/windows/QDebriefingWindow.py +++ b/qt_ui/windows/QDebriefingWindow.py @@ -11,7 +11,6 @@ from PySide2.QtWidgets import ( QVBoxLayout, ) -from game import db from game.debriefing import Debriefing @@ -22,35 +21,21 @@ class LossGrid(QGridLayout): def __init__(self, debriefing: Debriefing, player: bool) -> None: super().__init__() - if player: - country = debriefing.player_country - else: - country = debriefing.enemy_country - + self.add_loss_rows(debriefing.air_losses.by_type(player), lambda u: u.name) self.add_loss_rows( - debriefing.air_losses.by_type(player), - lambda u: db.unit_get_expanded_info(country, u, "name"), + debriefing.front_line_losses_by_type(player), lambda u: str(u) ) self.add_loss_rows( - debriefing.front_line_losses_by_type(player), - lambda u: db.unit_type_name(u), - ) - self.add_loss_rows( - debriefing.convoy_losses_by_type(player), - lambda u: f"{db.unit_type_name(u)} from convoy", + debriefing.convoy_losses_by_type(player), lambda u: f"{u} from convoy" ) self.add_loss_rows( debriefing.cargo_ship_losses_by_type(player), - lambda u: f"{db.unit_type_name(u)} from cargo ship", + lambda u: f"{u} from cargo ship", ) self.add_loss_rows( - debriefing.airlift_losses_by_type(player), - lambda u: f"{db.unit_type_name(u)} from airlift", - ) - self.add_loss_rows( - debriefing.building_losses_by_type(player), - lambda u: u, + debriefing.airlift_losses_by_type(player), lambda u: f"{u} from airlift" ) + self.add_loss_rows(debriefing.building_losses_by_type(player), lambda u: u) # TODO: Display dead ground object units and runways. diff --git a/qt_ui/windows/QUnitInfoWindow.py b/qt_ui/windows/QUnitInfoWindow.py index aaadd06d..a87ce597 100644 --- a/qt_ui/windows/QUnitInfoWindow.py +++ b/qt_ui/windows/QUnitInfoWindow.py @@ -1,49 +1,37 @@ -import logging -from typing import Type +from __future__ import annotations -from PySide2 import QtCore from PySide2.QtCore import Qt -from PySide2.QtGui import QIcon, QMovie, QPixmap +from PySide2.QtGui import QIcon from PySide2.QtWidgets import ( QDialog, QGridLayout, - QGroupBox, - QHBoxLayout, QLabel, - QMessageBox, - QPushButton, QTextBrowser, QFrame, ) -from jinja2 import Environment, FileSystemLoader, select_autoescape -from dcs.unittype import UnitType, FlyingType, VehicleType -import dcs -from qt_ui.uiconstants import AIRCRAFT_BANNERS, VEHICLE_BANNERS - -from game.game import Game -from game import db import gen.flights.ai_flight_planner_db +from game.dcs.aircrafttype import AircraftType +from game.dcs.groundunittype import GroundUnitType +from game.dcs.unittype import UnitType +from game.game import Game from gen.flights.flight import FlightType +from qt_ui.uiconstants import AIRCRAFT_BANNERS, VEHICLE_BANNERS class QUnitInfoWindow(QDialog): - def __init__(self, game: Game, unit_type: Type[UnitType]) -> None: - super(QUnitInfoWindow, self).__init__() + def __init__(self, game: Game, unit_type: UnitType) -> None: + super().__init__() self.setModal(True) self.game = game self.unit_type = unit_type - self.setWindowTitle( - f"Unit Info: {db.unit_get_expanded_info(self.game.player_country, self.unit_type, 'name')}" - ) + self.name = unit_type.name + self.setWindowTitle(f"Unit Info: {self.name}") self.setWindowIcon(QIcon("./resources/icon.png")) self.setMinimumHeight(570) self.setMaximumWidth(640) self.setWindowFlags(Qt.WindowStaysOnTopHint) - self.initUi() - - def initUi(self): self.layout = QGridLayout() header = QLabel(self) @@ -51,13 +39,10 @@ class QUnitInfoWindow(QDialog): 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 - ): - pixmap = AIRCRAFT_BANNERS.get(self.unit_type.id) - elif dcs.vehicles.vehicle_map.get(self.unit_type.id) is not None: - pixmap = VEHICLE_BANNERS.get(self.unit_type.id) + if isinstance(self.unit_type, AircraftType): + pixmap = AIRCRAFT_BANNERS.get(self.unit_type.dcs_id) + elif isinstance(self.unit_type, GroundUnitType): + pixmap = VEHICLE_BANNERS.get(self.unit_type.dcs_id) if pixmap is None: pixmap = AIRCRAFT_BANNERS.get("Missing") header.setPixmap(pixmap.scaled(header.width(), header.height())) @@ -71,22 +56,20 @@ class QUnitInfoWindow(QDialog): self.details_grid_layout.setMargin(0) self.name_box = QLabel( - f"Name: {db.unit_get_expanded_info(self.game.player_country, self.unit_type, 'manufacturer')} {db.unit_get_expanded_info(self.game.player_country, self.unit_type, 'name')}" + f"Name: {unit_type.manufacturer} {unit_type.name}" ) self.name_box.setProperty("style", "info-element") self.country_box = QLabel( - f"Country of Origin: {db.unit_get_expanded_info(self.game.player_country, self.unit_type, 'country-of-origin')}" + f"Country of Origin: {unit_type.country_of_origin}" ) self.country_box.setProperty("style", "info-element") - self.role_box = QLabel( - f"Role: {db.unit_get_expanded_info(self.game.player_country, self.unit_type, 'role')}" - ) + self.role_box = QLabel(f"Role: {unit_type.role}") self.role_box.setProperty("style", "info-element") self.year_box = QLabel( - f"Variant Introduction: {db.unit_get_expanded_info(self.game.player_country, self.unit_type, 'year-of-variant-introduction')}" + f"Variant Introduction: {unit_type.year_introduced}" ) self.year_box.setProperty("style", "info-element") @@ -100,10 +83,7 @@ class QUnitInfoWindow(QDialog): self.gridLayout.addWidget(self.details_grid, 1, 0) # If it's an aircraft, include the task list. - 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 - ): + if isinstance(unit_type, AircraftType): self.tasks_box = QLabel( f"In-Game Tasks: {self.generateAircraftTasks()}" ) @@ -113,9 +93,7 @@ class QUnitInfoWindow(QDialog): # Finally, add the description box. self.details_text = QTextBrowser() self.details_text.setProperty("style", "info-desc") - self.details_text.setText( - db.unit_get_expanded_info(self.game.player_country, self.unit_type, "text") - ) + self.details_text.setText(unit_type.description) self.gridLayout.addWidget(self.details_text, 3, 0) self.layout.addLayout(self.gridLayout, 1, 0) @@ -123,26 +101,27 @@ class QUnitInfoWindow(QDialog): def generateAircraftTasks(self) -> str: aircraft_tasks = "" - if self.unit_type in gen.flights.ai_flight_planner_db.CAP_CAPABLE: + unit_type = self.unit_type.dcs_unit_type + if unit_type in gen.flights.ai_flight_planner_db.CAP_CAPABLE: aircraft_tasks = ( aircraft_tasks + f"{FlightType.BARCAP}, {FlightType.ESCORT}, {FlightType.INTERCEPTION}, {FlightType.SWEEP}, {FlightType.TARCAP}, " ) - if self.unit_type in gen.flights.ai_flight_planner_db.CAS_CAPABLE: + if unit_type in gen.flights.ai_flight_planner_db.CAS_CAPABLE: aircraft_tasks = ( aircraft_tasks + f"{FlightType.CAS}, {FlightType.BAI}, {FlightType.OCA_AIRCRAFT}, " ) - if self.unit_type in gen.flights.ai_flight_planner_db.SEAD_CAPABLE: + if unit_type in gen.flights.ai_flight_planner_db.SEAD_CAPABLE: aircraft_tasks = aircraft_tasks + f"{FlightType.SEAD}, " - if self.unit_type in gen.flights.ai_flight_planner_db.DEAD_CAPABLE: + if unit_type in gen.flights.ai_flight_planner_db.DEAD_CAPABLE: aircraft_tasks = aircraft_tasks + f"{FlightType.DEAD}, " - if self.unit_type in gen.flights.ai_flight_planner_db.ANTISHIP_CAPABLE: + if unit_type in gen.flights.ai_flight_planner_db.ANTISHIP_CAPABLE: aircraft_tasks = aircraft_tasks + f"{FlightType.ANTISHIP}, " - if self.unit_type in gen.flights.ai_flight_planner_db.RUNWAY_ATTACK_CAPABLE: + if unit_type in gen.flights.ai_flight_planner_db.RUNWAY_ATTACK_CAPABLE: aircraft_tasks = aircraft_tasks + f"{FlightType.OCA_RUNWAY}, " - if self.unit_type in gen.flights.ai_flight_planner_db.STRIKE_CAPABLE: + if unit_type in gen.flights.ai_flight_planner_db.STRIKE_CAPABLE: aircraft_tasks = aircraft_tasks + f"{FlightType.STRIKE}, " - if self.unit_type in gen.flights.ai_flight_planner_db.REFUELING_CAPABALE: + if unit_type in gen.flights.ai_flight_planner_db.REFUELING_CAPABALE: aircraft_tasks = aircraft_tasks + f"{FlightType.REFUELING}, " return aircraft_tasks[:-2] diff --git a/qt_ui/windows/SquadronDialog.py b/qt_ui/windows/SquadronDialog.py index 31cf5587..a932caee 100644 --- a/qt_ui/windows/SquadronDialog.py +++ b/qt_ui/windows/SquadronDialog.py @@ -178,7 +178,9 @@ class SquadronDialog(QDialog): if self.check_disabled_button_states(self.toggle_leave_button, index): return pilot = self.squadron_model.pilot_at_index(index) - self.toggle_leave_button.setEnabled(True) + self.toggle_leave_button.setEnabled( + not pilot.on_leave or self.squadron_model.squadron.has_unfilled_pilot_slots + ) self.toggle_leave_button.setText( "Return from leave" if pilot.on_leave else "Send on leave" ) diff --git a/qt_ui/windows/basemenu/DepartingConvoysMenu.py b/qt_ui/windows/basemenu/DepartingConvoysMenu.py index 8c1e67bd..1dd4b46c 100644 --- a/qt_ui/windows/basemenu/DepartingConvoysMenu.py +++ b/qt_ui/windows/basemenu/DepartingConvoysMenu.py @@ -10,7 +10,6 @@ from PySide2.QtWidgets import ( QWidget, ) -from game import db from game.theater import ControlPoint from game.transfers import MultiGroupTransport from qt_ui.dialogs import Dialog @@ -19,7 +18,7 @@ from qt_ui.uiconstants import VEHICLES_ICONS class DepartingConvoyInfo(QGroupBox): - def __init__(self, convoy: MultiGroupTransport, game_model: GameModel) -> None: + def __init__(self, convoy: MultiGroupTransport) -> None: super().__init__(f"{convoy.name} to {convoy.destination}") self.convoy = convoy @@ -31,17 +30,14 @@ class DepartingConvoyInfo(QGroupBox): for idx, (unit_type, count) in enumerate(convoy.units.items()): icon = QLabel() - if unit_type.id in VEHICLES_ICONS.keys(): - icon.setPixmap(VEHICLES_ICONS[unit_type.id]) + if unit_type.dcs_id in VEHICLES_ICONS.keys(): + icon.setPixmap(VEHICLES_ICONS[unit_type.dcs_id]) else: icon.setText("" + unit_type.id[:8] + "") icon.setProperty("style", "icon-armor") unit_layout.addWidget(icon, idx, 0) - unit_display_name = db.unit_get_expanded_info( - game_model.game.enemy_country, unit_type, "name" - ) unit_layout.addWidget( - QLabel(f"{count} x {unit_display_name}"), + QLabel(f"{count} x {unit_type.name}"), idx, 1, ) @@ -68,7 +64,6 @@ class DepartingConvoysList(QFrame): def __init__(self, cp: ControlPoint, game_model: GameModel): super().__init__() self.cp = cp - self.game_model = game_model self.setMinimumWidth(500) layout = QVBoxLayout() @@ -79,11 +74,11 @@ class DepartingConvoysList(QFrame): scroll_content.setLayout(task_box_layout) for convoy in game_model.game.transfers.convoys.departing_from(cp): - group_info = DepartingConvoyInfo(convoy, game_model) + group_info = DepartingConvoyInfo(convoy) task_box_layout.addWidget(group_info) for cargo_ship in game_model.game.transfers.cargo_ships.departing_from(cp): - group_info = DepartingConvoyInfo(cargo_ship, game_model) + group_info = DepartingConvoyInfo(cargo_ship) task_box_layout.addWidget(group_info) scroll_content.setLayout(task_box_layout) diff --git a/qt_ui/windows/basemenu/NewUnitTransferDialog.py b/qt_ui/windows/basemenu/NewUnitTransferDialog.py index 57288d5f..9689c9fd 100644 --- a/qt_ui/windows/basemenu/NewUnitTransferDialog.py +++ b/qt_ui/windows/basemenu/NewUnitTransferDialog.py @@ -20,10 +20,10 @@ from PySide2.QtWidgets import ( QVBoxLayout, QWidget, ) -from dcs.task import PinpointStrike from dcs.unittype import UnitType -from game import Game, db +from game import Game +from game.dcs.groundunittype import GroundUnitType from game.theater import ControlPoint from game.transfers import TransferOrder from qt_ui.models import GameModel @@ -63,12 +63,7 @@ class UnitTransferList(QFrame): task_box_layout = QGridLayout() scroll_content.setLayout(task_box_layout) - units_column = sorted( - cp.base.armor, - key=lambda u: db.unit_get_expanded_info( - self.game_model.game.player_country, u, "name" - ), - ) + units_column = sorted(cp.base.armor, key=lambda u: u.name) count = 0 for count, unit_type in enumerate(units_column): @@ -169,9 +164,7 @@ class ScrollingUnitTransferGrid(QFrame): unit_types = set(self.game_model.game.faction_for(player=True).ground_units) sorted_units = sorted( {u for u in unit_types if self.cp.base.total_units_of_type(u)}, - key=lambda u: db.unit_get_expanded_info( - self.game_model.game.player_country, u, "name" - ), + key=lambda u: u.name, ) for row, unit_type in enumerate(sorted_units): self.add_unit_row(unit_type, task_box_layout, row) @@ -190,7 +183,7 @@ class ScrollingUnitTransferGrid(QFrame): def add_unit_row( self, - unit_type: Type[UnitType], + unit_type: GroundUnitType, layout: QGridLayout, row: int, ) -> None: @@ -203,13 +196,7 @@ class ScrollingUnitTransferGrid(QFrame): origin_inventory = self.cp.base.total_units_of_type(unit_type) - unit_name = QLabel( - "" - + db.unit_get_expanded_info( - self.game_model.game.player_country, unit_type, "name" - ) - + "" - ) + unit_name = QLabel(f"{unit_type.name}") unit_name.setSizePolicy( QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) ) diff --git a/qt_ui/windows/basemenu/QBaseMenuTabs.py b/qt_ui/windows/basemenu/QBaseMenuTabs.py index a8389e95..38640f24 100644 --- a/qt_ui/windows/basemenu/QBaseMenuTabs.py +++ b/qt_ui/windows/basemenu/QBaseMenuTabs.py @@ -29,6 +29,6 @@ class QBaseMenuTabs(QTabWidget): else: self.airfield_command = QAirfieldCommand(cp, game_model) self.addTab(self.airfield_command, "Airfield Command") - if not isinstance(cp, OffMapSpawn): + if cp.can_deploy_ground_units: self.ground_forces_hq = QGroundForcesHQ(cp, game_model) self.addTab(self.ground_forces_hq, "Ground Forces HQ") diff --git a/qt_ui/windows/basemenu/QRecruitBehaviour.py b/qt_ui/windows/basemenu/QRecruitBehaviour.py index a9209521..5eb7534a 100644 --- a/qt_ui/windows/basemenu/QRecruitBehaviour.py +++ b/qt_ui/windows/basemenu/QRecruitBehaviour.py @@ -1,36 +1,100 @@ -import logging -from typing import Type +from __future__ import annotations +import logging +from PySide2.QtCore import Qt from PySide2.QtWidgets import ( QGroupBox, QHBoxLayout, QLabel, - QLayout, QPushButton, QSizePolicy, QSpacerItem, + QGridLayout, + QApplication, ) -from dcs.unittype import UnitType -from game import db +from game.dcs.unittype import UnitType from game.theater import ControlPoint from game.unitdelivery import PendingUnitDeliveries from qt_ui.models import GameModel from qt_ui.windows.GameUpdateSignal import GameUpdateSignal from qt_ui.windows.QUnitInfoWindow import QUnitInfoWindow +from enum import Enum + + +class RecruitType(Enum): + BUY = 0 + SELL = 1 + + +class PurchaseGroup(QGroupBox): + def __init__(self, unit_type: UnitType, recruiter: QRecruitBehaviour) -> None: + super().__init__() + self.unit_type = unit_type + self.recruiter = recruiter + + self.setProperty("style", "buy-box") + self.setMaximumHeight(36) + self.setMinimumHeight(36) + layout = QHBoxLayout() + self.setLayout(layout) + + self.sell_button = QPushButton("-") + self.sell_button.setProperty("style", "btn-sell") + self.sell_button.setDisabled(not recruiter.enable_sale(unit_type)) + self.sell_button.setMinimumSize(16, 16) + self.sell_button.setMaximumSize(16, 16) + self.sell_button.setSizePolicy( + QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) + ) + + self.sell_button.clicked.connect( + lambda: self.recruiter.recruit_handler(RecruitType.SELL, self.unit_type) + ) + + self.amount_bought = QLabel() + self.amount_bought.setSizePolicy( + QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) + ) + + self.buy_button = QPushButton("+") + self.buy_button.setProperty("style", "btn-buy") + self.buy_button.setDisabled(not recruiter.enable_purchase(unit_type)) + self.buy_button.setMinimumSize(16, 16) + self.buy_button.setMaximumSize(16, 16) + + self.buy_button.clicked.connect( + lambda: self.recruiter.recruit_handler(RecruitType.BUY, self.unit_type) + ) + self.buy_button.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) + + layout.addWidget(self.sell_button) + layout.addWidget(self.amount_bought) + layout.addWidget(self.buy_button) + + self.update_state() + + @property + def pending_units(self) -> int: + return self.recruiter.pending_deliveries.units.get(self.unit_type, 0) + + def update_state(self) -> None: + self.buy_button.setEnabled(self.recruiter.enable_purchase(self.unit_type)) + self.sell_button.setEnabled(self.recruiter.enable_sale(self.unit_type)) + self.amount_bought.setText(f"{self.pending_units}") class QRecruitBehaviour: game_model: GameModel cp: ControlPoint + purchase_groups: dict[UnitType, PurchaseGroup] existing_units_labels = None - bought_amount_labels = None maximum_units = -1 BUDGET_FORMAT = "Available Budget: ${:.2f}M" def __init__(self) -> None: - self.bought_amount_labels = {} self.existing_units_labels = {} + self.purchase_groups = {} self.update_available_budget() @property @@ -38,7 +102,7 @@ class QRecruitBehaviour: return self.cp.pending_unit_deliveries @property - def budget(self) -> int: + def budget(self) -> float: return self.game_model.game.budget @budget.setter @@ -47,10 +111,10 @@ class QRecruitBehaviour: def add_purchase_row( self, - unit_type: Type[UnitType], - layout: QLayout, + unit_type: UnitType, + layout: QGridLayout, row: int, - ) -> int: + ) -> None: exist = QGroupBox() exist.setProperty("style", "buy-box") exist.setMaximumHeight(36) @@ -59,15 +123,8 @@ class QRecruitBehaviour: exist.setLayout(existLayout) existing_units = self.cp.base.total_units_of_type(unit_type) - scheduled_units = self.pending_deliveries.units.get(unit_type, 0) - unitName = QLabel( - "" - + db.unit_get_expanded_info( - self.game_model.game.player_country, unit_type, "name" - ) - + "" - ) + unitName = QLabel(f"{unit_type.name}") unitName.setSizePolicy( QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) ) @@ -75,49 +132,13 @@ class QRecruitBehaviour: existing_units = QLabel(str(existing_units)) existing_units.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) - amount_bought = QLabel("{}".format(str(scheduled_units))) - amount_bought.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) - self.existing_units_labels[unit_type] = existing_units - self.bought_amount_labels[unit_type] = amount_bought - price = QLabel("$ {:02d} m".format(db.PRICES[unit_type])) + price = QLabel(f"$ {unit_type.price} M") price.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) - buysell = QGroupBox() - buysell.setProperty("style", "buy-box") - buysell.setMaximumHeight(36) - buysell.setMinimumHeight(36) - buysellayout = QHBoxLayout() - buysell.setLayout(buysellayout) - - buy = QPushButton("+") - buy.setProperty("style", "btn-buy") - buy.setDisabled(not self.enable_purchase(unit_type)) - buy.setMinimumSize(16, 16) - buy.setMaximumSize(16, 16) - - def on_buy(): - self.buy(unit_type) - buy.setDisabled(not self.enable_purchase(unit_type)) - sell.setDisabled(not self.enable_sale(unit_type)) - - buy.clicked.connect(on_buy) - buy.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) - - sell = QPushButton("-") - sell.setProperty("style", "btn-sell") - sell.setDisabled(not self.enable_sale(unit_type)) - sell.setMinimumSize(16, 16) - sell.setMaximumSize(16, 16) - sell.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) - - def on_sell(): - self.sell(unit_type) - sell.setDisabled(not self.enable_sale(unit_type)) - buy.setDisabled(not self.enable_purchase(unit_type)) - - sell.clicked.connect(on_sell) + purchase_group = PurchaseGroup(unit_type, self) + self.purchase_groups[unit_type] = purchase_group info = QGroupBox() info.setProperty("style", "buy-box") @@ -143,64 +164,68 @@ class QRecruitBehaviour: ) existLayout.addWidget(price) - buysellayout.addWidget(sell) - buysellayout.addWidget(amount_bought) - buysellayout.addWidget(buy) - infolayout.addWidget(unitInfo) layout.addWidget(exist, row, 1) - layout.addWidget(buysell, row, 2) + layout.addWidget(purchase_group, row, 2) layout.addWidget(info, row, 3) - return row + 1 - - def _update_count_label(self, unit_type: Type[UnitType]): - - self.bought_amount_labels[unit_type].setText( - "{}".format( - unit_type in self.pending_deliveries.units - and "{}".format(self.pending_deliveries.units[unit_type]) - or "0" - ) - ) - - self.existing_units_labels[unit_type].setText( - "{}".format(self.cp.base.total_units_of_type(unit_type)) - ) - def update_available_budget(self) -> None: GameUpdateSignal.get_instance().updateBudget(self.game_model.game) - def buy(self, unit_type: Type[UnitType]): + def recruit_handler(self, recruit_type: RecruitType, unit_type: UnitType) -> None: + # Lookup if Keyboard Modifiers were pressed + # Shift = 10 times + # CTRL = 5 Times + modifiers = QApplication.keyboardModifiers() + if modifiers == Qt.ShiftModifier: + amount = 10 + elif modifiers == Qt.ControlModifier: + amount = 5 + else: + amount = 1 + + for i in range(amount): + if recruit_type == RecruitType.SELL: + if not self.sell(unit_type): + return + elif recruit_type == RecruitType.BUY: + if not self.buy(unit_type): + return + + def buy(self, unit_type: UnitType) -> bool: + if not self.enable_purchase(unit_type): - logging.error(f"Purchase of {unit_type.id} not allowed at {self.cp.name}") - return + logging.error(f"Purchase of {unit_type} not allowed at {self.cp.name}") + return False - price = db.PRICES[unit_type] self.pending_deliveries.order({unit_type: 1}) - self.budget -= price - self._update_count_label(unit_type) + self.budget -= unit_type.price + self.update_purchase_controls() self.update_available_budget() + return True - def sell(self, unit_type): + def sell(self, unit_type: UnitType) -> bool: if self.pending_deliveries.available_next_turn(unit_type) > 0: - price = db.PRICES[unit_type] - self.budget += price + self.budget += unit_type.price self.pending_deliveries.sell({unit_type: 1}) if self.pending_deliveries.units[unit_type] == 0: del self.pending_deliveries.units[unit_type] - self._update_count_label(unit_type) + self.update_purchase_controls() self.update_available_budget() - - def enable_purchase(self, unit_type: Type[UnitType]) -> bool: - price = db.PRICES[unit_type] - return self.budget >= price - - def enable_sale(self, unit_type: Type[UnitType]) -> bool: return True - def info(self, unit_type): + def update_purchase_controls(self) -> None: + for group in self.purchase_groups.values(): + group.update_state() + + def enable_purchase(self, unit_type: UnitType) -> bool: + return self.budget >= unit_type.price + + def enable_sale(self, unit_type: UnitType) -> bool: + return True + + def info(self, unit_type: UnitType) -> None: self.info_window = QUnitInfoWindow(self.game_model.game, unit_type) self.info_window.show() diff --git a/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py b/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py index b5a6e7fe..c5edcdbc 100644 --- a/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py +++ b/qt_ui/windows/basemenu/airfield/QAircraftRecruitmentMenu.py @@ -1,5 +1,5 @@ import logging -from typing import Set, Type +from typing import Set from PySide2.QtCore import Qt from PySide2.QtWidgets import ( @@ -13,9 +13,8 @@ from PySide2.QtWidgets import ( QWidget, ) from dcs.helicopters import helicopter_map -from dcs.unittype import FlyingType, UnitType -from game import db +from game.dcs.aircrafttype import AircraftType from game.theater import ControlPoint, ControlPointType from qt_ui.models import GameModel from qt_ui.uiconstants import ICONS @@ -27,7 +26,7 @@ class QAircraftRecruitmentMenu(QFrame, QRecruitBehaviour): QFrame.__init__(self) self.cp = cp self.game_model = game_model - + self.purchase_groups = {} self.bought_amount_labels = {} self.existing_units_labels = {} @@ -39,22 +38,17 @@ class QAircraftRecruitmentMenu(QFrame, QRecruitBehaviour): self.hangar_status = QHangarStatus(game_model, self.cp) - self.init_ui() - - def init_ui(self): main_layout = QVBoxLayout() scroll_content = QWidget() task_box_layout = QGridLayout() row = 0 - unit_types: Set[Type[FlyingType]] = set() + unit_types: Set[AircraftType] = set() for unit_type in self.game_model.game.player_faction.aircrafts: - if not issubclass(unit_type, FlyingType): - raise RuntimeError(f"Non-flying aircraft found in faction: {unit_type}") - if self.cp.is_carrier and unit_type not in db.CARRIER_CAPABLE: + if self.cp.is_carrier and not unit_type.carrier_capable: continue - if self.cp.is_lha and unit_type not in db.LHA_CAPABLE: + if self.cp.is_lha and not unit_type.lha_capable: continue if ( self.cp.cptype in [ControlPointType.FOB, ControlPointType.FARP] @@ -65,15 +59,13 @@ class QAircraftRecruitmentMenu(QFrame, QRecruitBehaviour): sorted_units = sorted( unit_types, - key=lambda u: db.unit_get_expanded_info( - self.game_model.game.player_country, u, "name" - ), + key=lambda u: u.name, ) - for unit_type in sorted_units: - row = self.add_purchase_row(unit_type, task_box_layout, row) - stretch = QVBoxLayout() - stretch.addStretch() - task_box_layout.addLayout(stretch, row, 0) + for row, unit_type in enumerate(sorted_units): + self.add_purchase_row(unit_type, task_box_layout, row) + stretch = QVBoxLayout() + stretch.addStretch() + task_box_layout.addLayout(stretch, row, 0) scroll_content.setLayout(task_box_layout) scroll = QScrollArea() @@ -85,33 +77,30 @@ class QAircraftRecruitmentMenu(QFrame, QRecruitBehaviour): main_layout.addWidget(scroll) self.setLayout(main_layout) - def enable_purchase(self, unit_type: Type[UnitType]) -> bool: + def enable_purchase(self, unit_type: AircraftType) -> bool: if not super().enable_purchase(unit_type): return False - if not issubclass(unit_type, FlyingType): - return False if not self.cp.can_operate(unit_type): return False return True - def enable_sale(self, unit_type: Type[UnitType]) -> bool: - if not issubclass(unit_type, FlyingType): - return False + def enable_sale(self, unit_type: AircraftType) -> bool: if not self.cp.can_operate(unit_type): return False return True - def buy(self, unit_type): + def buy(self, unit_type: AircraftType) -> bool: if self.maximum_units > 0: if self.cp.unclaimed_parking(self.game_model.game) <= 0: logging.debug(f"No space for additional aircraft at {self.cp}.") QMessageBox.warning( self, "No space for additional aircraft", - f"There is no parking space left at {self.cp.name} to accommodate another plane.", + f"There is no parking space left at {self.cp.name} to accommodate " + "another plane.", QMessageBox.Ok, ) - return + return False # If we change our mind about selling, we want the aircraft to be put # back in the inventory immediately. elif self.pending_deliveries.units.get(unit_type, 0) < 0: @@ -121,8 +110,9 @@ class QAircraftRecruitmentMenu(QFrame, QRecruitBehaviour): super().buy(unit_type) self.hangar_status.update_label() + return True - def sell(self, unit_type: UnitType): + def sell(self, unit_type: AircraftType) -> bool: # Don't need to remove aircraft from the inventory if we're canceling # orders. if self.pending_deliveries.units.get(unit_type, 0) <= 0: @@ -134,15 +124,17 @@ class QAircraftRecruitmentMenu(QFrame, QRecruitBehaviour): QMessageBox.critical( self, "Could not sell aircraft", - f"Attempted to sell one {unit_type.id} at {self.cp.name} " + f"Attempted to sell one {unit_type} at {self.cp.name} " "but none are available. Are all aircraft currently " "assigned to a mission?", QMessageBox.Ok, ) - return + return False super().sell(unit_type) self.hangar_status.update_label() + return True + class QHangarStatus(QHBoxLayout): def __init__(self, game_model: GameModel, control_point: ControlPoint) -> None: diff --git a/qt_ui/windows/basemenu/ground_forces/QArmorRecruitmentMenu.py b/qt_ui/windows/basemenu/ground_forces/QArmorRecruitmentMenu.py index 3f104e7d..898d1cc4 100644 --- a/qt_ui/windows/basemenu/ground_forces/QArmorRecruitmentMenu.py +++ b/qt_ui/windows/basemenu/ground_forces/QArmorRecruitmentMenu.py @@ -1,5 +1,3 @@ -from typing import Type - from PySide2.QtCore import Qt from PySide2.QtWidgets import ( QFrame, @@ -8,9 +6,8 @@ from PySide2.QtWidgets import ( QVBoxLayout, QWidget, ) -from dcs.unittype import UnitType -from game import db +from game.dcs.groundunittype import GroundUnitType from game.theater import ControlPoint from qt_ui.models import GameModel from qt_ui.windows.basemenu.QRecruitBehaviour import QRecruitBehaviour @@ -21,7 +18,7 @@ class QArmorRecruitmentMenu(QFrame, QRecruitBehaviour): QFrame.__init__(self) self.cp = cp self.game_model = game_model - + self.purchase_groups = {} self.bought_amount_labels = {} self.existing_units_labels = {} @@ -38,13 +35,9 @@ class QArmorRecruitmentMenu(QFrame, QRecruitBehaviour): unit_types = list( set(self.game_model.game.faction_for(player=True).ground_units) ) - unit_types.sort( - key=lambda u: db.unit_get_expanded_info( - self.game_model.game.player_country, u, "name" - ) - ) - for unit_type in unit_types: - row = self.add_purchase_row(unit_type, task_box_layout, row) + unit_types.sort(key=lambda u: u.name) + for row, unit_type in enumerate(unit_types): + self.add_purchase_row(unit_type, task_box_layout, row) stretch = QVBoxLayout() stretch.addStretch() task_box_layout.addLayout(stretch, row, 0) @@ -58,10 +51,10 @@ class QArmorRecruitmentMenu(QFrame, QRecruitBehaviour): main_layout.addWidget(scroll) self.setLayout(main_layout) - def enable_purchase(self, unit_type: Type[UnitType]) -> bool: + def enable_purchase(self, unit_type: GroundUnitType) -> bool: if not super().enable_purchase(unit_type): return False return self.cp.has_ground_unit_source(self.game_model.game) - def enable_sale(self, unit_type: Type[UnitType]) -> bool: + def enable_sale(self, unit_type: GroundUnitType) -> bool: return self.pending_deliveries.pending_orders(unit_type) > 0 diff --git a/qt_ui/windows/basemenu/intel/QIntelInfo.py b/qt_ui/windows/basemenu/intel/QIntelInfo.py index cc9c3ca6..c8bf03e8 100644 --- a/qt_ui/windows/basemenu/intel/QIntelInfo.py +++ b/qt_ui/windows/basemenu/intel/QIntelInfo.py @@ -11,7 +11,7 @@ from PySide2.QtWidgets import ( QWidget, ) -from game import Game, db +from game import Game from game.theater import ControlPoint @@ -28,10 +28,8 @@ class QIntelInfo(QFrame): units_by_task: dict[str, dict[str, int]] = defaultdict(lambda: defaultdict(int)) for unit_type, count in self.cp.base.aircraft.items(): if count: - name = db.unit_get_expanded_info( - self.game.enemy_country, unit_type, "name" - ) - units_by_task[unit_type.task_default.name][name] += count + task_type = unit_type.dcs_unit_type.task_default.name + units_by_task[task_type][unit_type.name] += count units_by_task = { task: units_by_task[task] for task in sorted(units_by_task.keys()) @@ -40,10 +38,7 @@ class QIntelInfo(QFrame): front_line_units = defaultdict(int) for unit_type, count in self.cp.base.armor.items(): if count: - name = db.unit_get_expanded_info( - self.game.enemy_country, unit_type, "name" - ) - front_line_units[name] += count + front_line_units[unit_type.name] += count units_by_task["Front line units"] = front_line_units for task, unit_types in units_by_task.items(): diff --git a/qt_ui/windows/finances/QFinancesMenu.py b/qt_ui/windows/finances/QFinancesMenu.py index ea008c10..4ef8b281 100644 --- a/qt_ui/windows/finances/QFinancesMenu.py +++ b/qt_ui/windows/finances/QFinancesMenu.py @@ -26,12 +26,16 @@ class QHorizontalSeparationLine(QFrame): class FinancesLayout(QGridLayout): - def __init__(self, game: Game, player: bool) -> None: + def __init__(self, game: Game, player: bool, total_at_top: bool = False) -> None: super().__init__() self.row = itertools.count(0) income = Income(game, player) + if total_at_top: + self.add_total(game, income, player) + self.add_line() + control_points = reversed( sorted(income.control_points, key=lambda c: c.income_per_turn) ) @@ -44,18 +48,19 @@ class FinancesLayout(QGridLayout): for building in buildings: self.add_building(building) - self.add_line() + if not total_at_top: + self.add_line() + self.add_total(game, income, player) + def add_total(self, game, income, player): self.add_row( middle=f"Income multiplier: {income.multiplier:.1f}", right=f"{income.total}M", ) - if player: budget = game.budget else: budget = game.enemy_budget - self.add_row(middle="Balance", right=f"{budget}M") self.setRowStretch(next(self.row), 1) diff --git a/qt_ui/windows/groundobject/QGroundObjectMenu.py b/qt_ui/windows/groundobject/QGroundObjectMenu.py index d1fed719..7bb20c0f 100644 --- a/qt_ui/windows/groundobject/QGroundObjectMenu.py +++ b/qt_ui/windows/groundobject/QGroundObjectMenu.py @@ -20,7 +20,8 @@ from dcs import vehicles from game import Game, db from game.data.building_data import FORTIFICATION_BUILDINGS -from game.db import PRICES, REWARDS, unit_type_of +from game.db import REWARDS +from game.dcs.groundunittype import GroundUnitType from game.theater import ControlPoint, TheaterGroundObject from game.theater.theatergroundobject import ( VehicleGroupGroundObject, @@ -108,17 +109,21 @@ class QGroundObjectMenu(QDialog): for g in self.ground_object.groups: if not hasattr(g, "units_losts"): g.units_losts = [] - for u in g.units: - unit_display_name = u.type - unit_type = vehicles.vehicle_map.get(u.type) - if unit_type is not None: - unit_display_name = db.unit_get_expanded_info( - self.game.enemy_country, unit_type, "name" - ) + for unit in g.units: + unit_display_name = unit.type + dcs_unit_type = vehicles.vehicle_map.get(unit.type) + if dcs_unit_type is not None: + # Hack: Don't know which variant is used. + try: + unit_display_name = next( + GroundUnitType.for_dcs_type(dcs_unit_type) + ).name + except StopIteration: + pass self.intelLayout.addWidget( QLabel( "Unit #" - + str(u.id) + + str(unit.id) + " - " + str(unit_display_name) + "" @@ -128,26 +133,29 @@ class QGroundObjectMenu(QDialog): ) i = i + 1 - for u in g.units_losts: + for unit in g.units_losts: + dcs_unit_type = vehicles.vehicle_map.get(unit.type) + if dcs_unit_type is None: + continue - utype = unit_type_of(u) - if utype in PRICES: - price = PRICES[utype] - else: - price = 6 + # Hack: Don't know which variant is used. + + try: + unit_type = next(GroundUnitType.for_dcs_type(dcs_unit_type)) + name = unit_type.name + price = unit_type.price + except StopIteration: + name = dcs_unit_type.name + price = 0 self.intelLayout.addWidget( - QLabel( - "Unit #" + str(u.id) + " - " + str(u.type) + " [DEAD]" - ), - i, - 0, + QLabel(f"Unit #{unit.id} - {name} [DEAD]"), i, 0 ) if self.cp.captured: - repair = QPushButton("Repair [" + str(price) + "M]") + repair = QPushButton(f"Repair [{price}M]") repair.setProperty("style", "btn-success") repair.clicked.connect( - lambda u=u, g=g, p=price: self.repair_unit(g, u, p) + lambda u=unit, g=g, p=unit_type.price: self.repair_unit(g, u, p) ) self.intelLayout.addWidget(repair, i, 1) i = i + 1 @@ -217,13 +225,12 @@ class QGroundObjectMenu(QDialog): def update_total_value(self): total_value = 0 - for group in self.ground_object.groups: - for u in group.units: - utype = unit_type_of(u) - if utype in PRICES: - total_value = total_value + PRICES[utype] - else: - total_value = total_value + 1 + if not self.ground_object.purchasable: + return + for u in self.ground_object.units: + # Hack: Unknown variant. + unit_type = next(GroundUnitType.for_dcs_type(vehicles.vehicle_map[u.type])) + total_value += unit_type.price if self.sell_all_button is not None: self.sell_all_button.setText("Disband (+$" + str(self.total_value) + "M)") self.total_value = total_value @@ -340,10 +347,7 @@ class QBuyGroupForGroundObjectDialog(QDialog): # Armored units for unit in set(faction.ground_units): - self.buyArmorCombo.addItem( - db.unit_type_name_2(unit) + " [$" + str(db.PRICES[unit]) + "M]", - userData=unit, - ) + self.buyArmorCombo.addItem(f"{unit} [${unit.price}M]", userData=unit) self.buyArmorCombo.currentIndexChanged.connect(self.armorComboChanged) self.amount.setMinimum(2) @@ -404,33 +408,19 @@ class QBuyGroupForGroundObjectDialog(QDialog): ) def armorComboChanged(self, index): - self.buyArmorButton.setText( - "Buy [$" - + str(db.PRICES[self.buyArmorCombo.itemData(index)] * self.amount.value()) - + "M][-$" - + str(self.current_group_value) - + "M]" - ) + unit_type = self.buyArmorCombo.itemData(self.buyArmorCombo.currentIndex()) + price = unit_type.price * self.amount.value() + self.buyArmorButton.setText(f"Buy [${price}M][-${self.current_group_value}M]") def amountComboChanged(self): - self.buyArmorButton.setText( - "Buy [$" - + str( - db.PRICES[ - self.buyArmorCombo.itemData(self.buyArmorCombo.currentIndex()) - ] - * self.amount.value() - ) - + "M][-$" - + str(self.current_group_value) - + "M]" - ) + unit_type = self.buyArmorCombo.itemData(self.buyArmorCombo.currentIndex()) + price = unit_type.price * self.amount.value() + self.buyArmorButton.setText(f"Buy [${price}M][-${self.current_group_value}M]") def buyArmor(self): logging.info("Buying Armor ") utype = self.buyArmorCombo.itemData(self.buyArmorCombo.currentIndex()) - logging.info(utype) - price = db.PRICES[utype] * self.amount.value() - self.current_group_value + price = utype.price * self.amount.value() - self.current_group_value if price > self.game.budget: self.error_money() self.close() diff --git a/qt_ui/windows/intel.py b/qt_ui/windows/intel.py index 74203adf..619938cf 100644 --- a/qt_ui/windows/intel.py +++ b/qt_ui/windows/intel.py @@ -15,7 +15,7 @@ from PySide2.QtWidgets import ( QWidget, ) -from game.game import Game, db +from game.game import Game from qt_ui.uiconstants import ICONS from qt_ui.windows.finances.QFinancesMenu import FinancesLayout @@ -45,7 +45,7 @@ class ScrollingFrame(QFrame): class EconomyIntelTab(ScrollingFrame): def __init__(self, game: Game, player: bool) -> None: super().__init__() - self.addLayout(FinancesLayout(game, player=player)) + self.addLayout(FinancesLayout(game, player=player, total_at_top=True)) class IntelTableLayout(QGridLayout): @@ -84,10 +84,7 @@ class AircraftIntelLayout(IntelTableLayout): for airframe, count in base.aircraft.items(): if not count: continue - self.add_row( - db.unit_get_expanded_info(game.enemy_country, airframe, "name"), - count, - ) + self.add_row(airframe.name, count) self.add_spacer() self.add_row("Total", total) @@ -114,7 +111,7 @@ class ArmyIntelLayout(IntelTableLayout): for vehicle, count in base.armor.items(): if not count: continue - self.add_row(vehicle.id, count) + self.add_row(vehicle.name, count) self.add_spacer() self.add_row("Total", total) diff --git a/qt_ui/windows/mission/QFlightItem.py b/qt_ui/windows/mission/QFlightItem.py index d8d9cb44..42f1d47f 100644 --- a/qt_ui/windows/mission/QFlightItem.py +++ b/qt_ui/windows/mission/QFlightItem.py @@ -1,6 +1,5 @@ from PySide2.QtGui import QStandardItem, QIcon -from game import db from gen.ato import Package from gen.flights.flight import Flight from gen.flights.traveltime import TotEstimator @@ -14,11 +13,8 @@ class QFlightItem(QStandardItem): self.package = package self.flight = flight - if ( - db.unit_type_name(self.flight.unit_type).replace("/", " ") - in AIRCRAFT_ICONS.keys() - ): - icon = QIcon((AIRCRAFT_ICONS[db.unit_type_name(self.flight.unit_type)])) + if self.flight.unit_type.dcs_id in AIRCRAFT_ICONS: + icon = QIcon((AIRCRAFT_ICONS[self.flight.unit_type.dcs_id])) self.setIcon(icon) self.setEditable(False) estimator = TotEstimator(self.package) diff --git a/qt_ui/windows/mission/flight/settings/QFlightTypeTaskInfo.py b/qt_ui/windows/mission/flight/settings/QFlightTypeTaskInfo.py index c05a0fa6..32324676 100644 --- a/qt_ui/windows/mission/flight/settings/QFlightTypeTaskInfo.py +++ b/qt_ui/windows/mission/flight/settings/QFlightTypeTaskInfo.py @@ -1,6 +1,5 @@ -from PySide2.QtWidgets import QLabel, QHBoxLayout, QGroupBox, QSpinBox, QGridLayout +from PySide2.QtWidgets import QLabel, QGroupBox, QGridLayout -from game import db from qt_ui.uiconstants import AIRCRAFT_ICONS @@ -12,10 +11,8 @@ class QFlightTypeTaskInfo(QGroupBox): layout = QGridLayout() self.aircraft_icon = QLabel() - if db.unit_type_name(self.flight.unit_type) in AIRCRAFT_ICONS: - self.aircraft_icon.setPixmap( - AIRCRAFT_ICONS[db.unit_type_name(self.flight.unit_type)] - ) + if self.flight.unit_type.dcs_id in AIRCRAFT_ICONS: + self.aircraft_icon.setPixmap(AIRCRAFT_ICONS[self.flight.unit_type.dcs_id]) self.task = QLabel("Task:") self.task_type = QLabel(str(flight.flight_type)) diff --git a/qt_ui/windows/mission/flight/waypoints/QFlightWaypointTab.py b/qt_ui/windows/mission/flight/waypoints/QFlightWaypointTab.py index b38ab146..440d3f9b 100644 --- a/qt_ui/windows/mission/flight/waypoints/QFlightWaypointTab.py +++ b/qt_ui/windows/mission/flight/waypoints/QFlightWaypointTab.py @@ -90,10 +90,15 @@ class QFlightWaypointTab(QFrame): self.setLayout(layout) def on_delete_waypoint(self): - wpt = self.flight_waypoint_list.selectionModel().currentIndex().row() - if wpt > 0: - self.delete_waypoint(self.flight.flight_plan.waypoints[wpt]) - self.flight_waypoint_list.update_list() + waypoints = [] + for ( + selected_row + ) in self.flight_waypoint_list.selectionModel().selectedIndexes(): + if selected_row.row() > 0: + waypoints.append(self.flight.flight_plan.waypoints[selected_row.row()]) + for waypoint in waypoints: + self.delete_waypoint(waypoint) + self.flight_waypoint_list.update_list() self.on_change() def delete_waypoint(self, waypoint: FlightWaypoint) -> None: diff --git a/qt_ui/windows/settings/QSettingsWindow.py b/qt_ui/windows/settings/QSettingsWindow.py index 4c3ee0e0..dc1392c4 100644 --- a/qt_ui/windows/settings/QSettingsWindow.py +++ b/qt_ui/windows/settings/QSettingsWindow.py @@ -509,13 +509,79 @@ class QSettingsWindow(QDialog): old_tanker.setToolTip(old_tanker_info) old_tanker_label = QLabel( - "Spawn invulnerable, always-available Tanker aircraft (deprecated)." + "Spawn invulnerable, always-available Tanker aircraft (deprecated)" ) old_tanker_label.setToolTip(old_tanker_info) general_layout.addWidget(old_tanker_label, 2, 0) general_layout.addWidget(old_tanker, 2, 1, Qt.AlignRight) + def set_squadron_pilot_limit(value: int) -> None: + self.game.settings.squadron_pilot_limit = value + + pilot_limit = QSpinBox() + pilot_limit.setMinimum(12) + pilot_limit.setMaximum(72) + pilot_limit.setValue(self.game.settings.squadron_pilot_limit) + pilot_limit.valueChanged.connect(set_squadron_pilot_limit) + + pilot_limit_info = ( + "Sets the maximum number of pilots a squadron may have active. " + "Changing this value will not have an immediate effect, but will alter " + "replenishment for future turns." + ) + + pilot_limit.setToolTip(pilot_limit_info) + pilot_limit_label = QLabel("Maximum number of pilots per squadron") + pilot_limit_label.setToolTip(pilot_limit_info) + + general_layout.addWidget(pilot_limit_label, 3, 0) + general_layout.addWidget(pilot_limit, 3, 1, Qt.AlignRight) + + def set_squadron_replenishment_rate(value: int) -> None: + self.game.settings.squadron_replenishment_rate = value + + squadron_replenishment_rate = QSpinBox() + squadron_replenishment_rate.setMinimum(1) + squadron_replenishment_rate.setMaximum(20) + squadron_replenishment_rate.setValue( + self.game.settings.squadron_replenishment_rate + ) + squadron_replenishment_rate.valueChanged.connect( + set_squadron_replenishment_rate + ) + + squadron_replenishment_rate_info = ( + "Sets the maximum number of pilots that will be recruited to each squadron " + "at the end of each turn. Squadrons will not recruit new pilots beyond the " + "pilot limit, but each squadron with room for more pilots will recruit " + "this many pilots each turn up to the limit." + ) + + squadron_replenishment_rate.setToolTip(squadron_replenishment_rate_info) + squadron_replenishment_rate_label = QLabel("Squadron pilot replenishment rate") + squadron_replenishment_rate_label.setToolTip(squadron_replenishment_rate_info) + + general_layout.addWidget(squadron_replenishment_rate_label, 4, 0) + general_layout.addWidget(squadron_replenishment_rate, 4, 1, Qt.AlignRight) + + ai_pilot_levelling = QCheckBox() + ai_pilot_levelling.setChecked(self.game.settings.ai_pilot_levelling) + ai_pilot_levelling.toggled.connect(self.applySettings) + + ai_pilot_levelling_info = ( + "Set whether or not AI pilots will level up after completing a number of" + " sorties. Since pilot level affects the AI skill, you may wish to disable" + " this, lest you face an Ace!" + ) + + ai_pilot_levelling.setToolTip(ai_pilot_levelling_info) + ai_pilot_levelling_label = QLabel("Allow AI pilot levelling") + ai_pilot_levelling_label.setToolTip(ai_pilot_levelling_info) + + general_layout.addWidget(ai_pilot_levelling_label, 5, 0) + general_layout.addWidget(ai_pilot_levelling, 5, 1, Qt.AlignRight) + campaign_layout.addWidget(HqAutomationSettingsBox(self.game)) def initGeneratorLayout(self): diff --git a/resources/campaigns/First_Lebanon_War.json b/resources/campaigns/First_Lebanon_War.json new file mode 100644 index 00000000..07fde1a9 --- /dev/null +++ b/resources/campaigns/First_Lebanon_War.json @@ -0,0 +1,11 @@ +{ + "name": "Syria - First Lebanon War", + "theater": "Syria", + "authors": "Mustang25", + "recommended_player_faction": "Israel 1982", + "recommended_enemy_faction": "Syria 1982", + "description": "

1100HRS, 06 June 1982: H-hour for Operation Peace for Galilee.

Objective: Push North towards Beirut and into the Bekaa Valley, eliminating or displacing any PLO and Syrian resistance. Airbases and their surrounding infrastructure in Syria are not the main objective but are still viable strategic targets.

Background: Years of PLO encroachment into the UN neutral zone and their resulting terror attacks against Israelis have pushed tension along the border to a breaking point. On June 3, the attempted assassination of Israeli Ambassador, Shlomo Argov by gunmen with ties to the PLO have finally pushed the Israelis to action.

Recommended Starting Budget:

$1500m for recommended factions, $$2000m for modern scenarios

Income Multiplier:

Blue: 1.0x

Red: 0.7x-1.0x

", + "miz": "First_Lebanon_War_v3.0.2.miz", + "version": "6.0", + "performance": 2 + } diff --git a/resources/campaigns/First_Lebanon_War_v3.0.2.miz b/resources/campaigns/First_Lebanon_War_v3.0.2.miz new file mode 100644 index 00000000..2c1c85bc Binary files /dev/null and b/resources/campaigns/First_Lebanon_War_v3.0.2.miz differ diff --git a/resources/campaigns/around_the_mountain.json b/resources/campaigns/around_the_mountain.json deleted file mode 100644 index 5578e551..00000000 --- a/resources/campaigns/around_the_mountain.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "Caucasus - Around The Mountain", - "theater": "Caucasus", - "authors": "Dillie", - "recommended_player_faction": "Russia 2010", - "recommended_enemy_faction": "USA 1990", - "description": "

Scenario from Russia to Georgia in two Frontlines.

", - "version": "6.0", - "miz": "around_the_mountain.miz", - "performance": 2 -} \ No newline at end of file diff --git a/resources/campaigns/around_the_mountain.miz b/resources/campaigns/around_the_mountain.miz deleted file mode 100644 index 9a1774bd..00000000 Binary files a/resources/campaigns/around_the_mountain.miz and /dev/null differ diff --git a/resources/campaigns/battle_of_abu_dhabi.miz b/resources/campaigns/battle_of_abu_dhabi.miz index 3633d627..a3c11d5e 100644 Binary files a/resources/campaigns/battle_of_abu_dhabi.miz and b/resources/campaigns/battle_of_abu_dhabi.miz differ diff --git a/resources/campaigns/inherent_resolve.json b/resources/campaigns/inherent_resolve.json index 66f74d5e..5c3203df 100644 --- a/resources/campaigns/inherent_resolve.json +++ b/resources/campaigns/inherent_resolve.json @@ -5,7 +5,7 @@ "recommended_player_faction": "USA 2005", "recommended_enemy_faction": "Insurgents (Hard)", "description": "

In this scenario, you start from Jordan, and have to fight your way through eastern Syria.

", - "version": "6.0", + "version": "6.1", "miz": "inherent_resolve.miz", "performance": 2 } \ No newline at end of file diff --git a/resources/campaigns/inherent_resolve.miz b/resources/campaigns/inherent_resolve.miz index 3c16bace..61599952 100644 Binary files a/resources/campaigns/inherent_resolve.miz and b/resources/campaigns/inherent_resolve.miz differ diff --git a/resources/campaigns/northern_russia.miz b/resources/campaigns/northern_russia.miz index b8ea54ad..aa21fbe4 100644 Binary files a/resources/campaigns/northern_russia.miz and b/resources/campaigns/northern_russia.miz differ diff --git a/resources/campaigns/operation_allied_sword.json b/resources/campaigns/operation_allied_sword.json index 173a8a73..2da3badc 100644 --- a/resources/campaigns/operation_allied_sword.json +++ b/resources/campaigns/operation_allied_sword.json @@ -2,8 +2,6 @@ "name": "Syria - Operation Allied Sword", "theater": "Syria", "authors": "Fuzzle", - "recommended_player_faction": "Israel-USN 2005 (Allied Sword)", - "recommended_enemy_faction": "Syria-Lebanon 2005 (Allied Sword)", "description": "

In this fictional scenario, a US/Israeli coalition must push north from the Israeli border, through Syria and Lebanon to Aleppo.

Backstory: A Syrian-Lebanese joint force (with Russian materiel support) has attacked Israel, attmepting to cross the northern border. With the arrival of a US carrier group, Israel prepares its counterattack. The US Navy will handle the Beirut region's coastal arena, while the IAF will push through Damascus and the inland mountain ranges.

", "version": "6.0", "miz": "operation_allied_sword.miz", diff --git a/resources/caulandmap.p b/resources/caulandmap.p index c5076169..5b053f1d 100644 Binary files a/resources/caulandmap.p and b/resources/caulandmap.p differ diff --git a/resources/customized_payloads/F-16C_50.lua b/resources/customized_payloads/F-16C_50.lua index 8d9b3fbf..61f30508 100644 --- a/resources/customized_payloads/F-16C_50.lua +++ b/resources/customized_payloads/F-16C_50.lua @@ -131,40 +131,40 @@ local unitPayloads = { }, }, [4] = { - ["name"] = "STRIKE", + ["name"] = "Liberation Strike", ["pylons"] = { [1] = { - ["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}", - ["num"] = 7, - }, - [2] = { - ["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}", - ["num"] = 4, - }, - [3] = { - ["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}", - ["num"] = 6, - }, - [4] = { - ["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}", - ["num"] = 3, - }, - [5] = { - ["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}", - ["num"] = 2, - }, - [6] = { - ["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}", - ["num"] = 8, - }, - [7] = { ["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}", ["num"] = 9, }, - [8] = { + [2] = { ["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}", ["num"] = 1, }, + [3] = { + ["CLSID"] = "{5CE2FF2A-645A-4197-B48D-8720AC69394F}", + ["num"] = 2, + }, + [4] = { + ["CLSID"] = "{5CE2FF2A-645A-4197-B48D-8720AC69394F}", + ["num"] = 8, + }, + [5] = { + ["CLSID"] = "{F376DBEE-4CAE-41BA-ADD9-B2910AC95DEC}", + ["num"] = 6, + }, + [6] = { + ["CLSID"] = "{F376DBEE-4CAE-41BA-ADD9-B2910AC95DEC}", + ["num"] = 4, + }, + [7] = { + ["CLSID"] = "{GBU-31}", + ["num"] = 3, + }, + [8] = { + ["CLSID"] = "{GBU-31}", + ["num"] = 7, + }, [9] = { ["CLSID"] = "", ["num"] = 5, @@ -175,6 +175,7 @@ local unitPayloads = { }, }, ["tasks"] = { + [1] = 33, }, }, [5] = { diff --git a/resources/customized_payloads/Mi-24P.lua b/resources/customized_payloads/Mi-24P.lua new file mode 100644 index 00000000..fad0d383 --- /dev/null +++ b/resources/customized_payloads/Mi-24P.lua @@ -0,0 +1,217 @@ +local unitPayloads = { + ["name"] = "Mi-24P", + ["payloads"] = { + [1] = { + ["displayName"] = "Liberation CAS", + ["name"] = "Liberation CAS", + ["pylons"] = { + [1] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 6, + }, + [2] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 1, + }, + [3] = { + ["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}", + ["num"] = 4, + }, + [4] = { + ["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}", + ["num"] = 3, + }, + [5] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 5, + }, + [6] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 2, + }, + }, + ["tasks"] = { + [1] = 31, + [2] = 18, + [3] = 32, + }, + }, + [2] = { + ["displayName"] = "Liberation BAI", + ["name"] = "Liberation BAI", + ["pylons"] = { + [1] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 6, + }, + [2] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 1, + }, + [3] = { + ["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}", + ["num"] = 4, + }, + [4] = { + ["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}", + ["num"] = 3, + }, + [5] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 5, + }, + [6] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 2, + }, + }, + ["tasks"] = { + [1] = 31, + [2] = 18, + [3] = 32, + }, + }, + [3] = { + ["displayName"] = "Liberation Strike", + ["name"] = "Liberation Strike", + ["pylons"] = { + [1] = { + ["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}", + ["num"] = 4, + }, + [2] = { + ["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}", + ["num"] = 3, + }, + [3] = { + ["CLSID"] = "{3C612111-C7AD-476E-8A8E-2485812F4E5C}", + ["num"] = 2, + }, + [4] = { + ["CLSID"] = "{3C612111-C7AD-476E-8A8E-2485812F4E5C}", + ["num"] = 5, + }, + [5] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 1, + }, + [6] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 6, + }, + }, + ["tasks"] = { + [1] = 31, + }, + }, + [4] = { + ["displayName"] = "Liberation Antiship", + ["name"] = "Liberation Antiship", + ["pylons"] = { + [1] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 6, + }, + [2] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 1, + }, + [3] = { + ["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}", + ["num"] = 4, + }, + [4] = { + ["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}", + ["num"] = 3, + }, + [5] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 5, + }, + [6] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 2, + }, + }, + ["tasks"] = { + [1] = 31, + [2] = 18, + [3] = 32, + }, + }, + [5] = { + ["displayName"] = "Liberation SEAD", + ["name"] = "Liberation SEAD", + ["pylons"] = { + [1] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 6, + }, + [2] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 1, + }, + [3] = { + ["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}", + ["num"] = 4, + }, + [4] = { + ["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}", + ["num"] = 3, + }, + [5] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 5, + }, + [6] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 2, + }, + }, + ["tasks"] = { + [1] = 31, + [2] = 18, + [3] = 32, + }, + }, + [6] = { + ["displayName"] = "Liberation DEAD", + ["name"] = "Liberation DEAD", + ["pylons"] = { + [1] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 6, + }, + [2] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 1, + }, + [3] = { + ["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}", + ["num"] = 4, + }, + [4] = { + ["CLSID"] = "{6A4B9E69-64FE-439a-9163-3A87FB6A4D81}", + ["num"] = 3, + }, + [5] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 5, + }, + [6] = { + ["CLSID"] = "{B919B0F4-7C25-455E-9A02-CEA51DB895E3}", + ["num"] = 2, + }, + }, + ["tasks"] = { + [1] = 31, + [2] = 18, + [3] = 32, + }, + }, + }, + ["tasks"] = { + }, + ["unitType"] = "Mi-24P", +} +return unitPayloads diff --git a/resources/dcs/beacons/syria.json b/resources/dcs/beacons/syria.json index d5ee97cd..13baa75c 100644 --- a/resources/dcs/beacons/syria.json +++ b/resources/dcs/beacons/syria.json @@ -139,6 +139,20 @@ "hertz": 117700000, "channel": null }, + { + "name": "MUT", + "callsign": "MUT", + "beacon_type": 4, + "hertz": 112300000, + "channel": null + }, + { + "name": "DHEKELIA", + "callsign": "DKA", + "beacon_type": 10, + "hertz": 343000, + "channel": null + }, { "name": "", "callsign": "IADA", @@ -157,7 +171,7 @@ "name": "ADANA", "callsign": "ADN", "beacon_type": 11, - "hertz": 395000000, + "hertz": 395000, "channel": null }, { @@ -167,6 +181,41 @@ "hertz": 112700000, "channel": null }, + { + "name": "", + "callsign": "IAK", + "beacon_type": 14, + "hertz": 109700000, + "channel": null + }, + { + "name": "", + "callsign": "IAK", + "beacon_type": 15, + "hertz": 109700000, + "channel": null + }, + { + "name": "Akrotiri", + "callsign": "AKR", + "beacon_type": 6, + "hertz": 116000000, + "channel": 107 + }, + { + "name": "Akrotiri", + "callsign": "AKR", + "beacon_type": 3, + "hertz": 116000000, + "channel": 107 + }, + { + "name": "AKROTIRI", + "callsign": "AK", + "beacon_type": 10, + "hertz": 365000, + "channel": null + }, { "name": "KALDE", "callsign": "KAD", @@ -220,7 +269,7 @@ "name": "BEIRUT", "callsign": "BOD", "beacon_type": 11, - "hertz": 351000000, + "hertz": 351000, "channel": null }, { @@ -255,14 +304,14 @@ "name": "DAMASCUS", "callsign": "DAL", "beacon_type": 11, - "hertz": 342000000, + "hertz": 342000, "channel": null }, { "name": "ABYAD", "callsign": "ABD", "beacon_type": 10, - "hertz": 264000, + "hertz": 264, "channel": null }, { @@ -272,6 +321,69 @@ "hertz": 111100000, "channel": null }, + { + "name": "ERCAN", + "callsign": "ECN", + "beacon_type": 4, + "hertz": 117000000, + "channel": null + }, + { + "name": "", + "callsign": "IGNP", + "beacon_type": 14, + "hertz": 109100000, + "channel": null + }, + { + "name": "", + "callsign": "IGNP", + "beacon_type": 15, + "hertz": 109100000, + "channel": null + }, + { + "name": "", + "callsign": "IGZP", + "beacon_type": 14, + "hertz": 108500000, + "channel": null + }, + { + "name": "", + "callsign": "IGZP", + "beacon_type": 15, + "hertz": 108500000, + "channel": null + }, + { + "name": "ALANYA/GAZIPASA", + "callsign": "GZP", + "beacon_type": 4, + "hertz": 114200000, + "channel": null + }, + { + "name": "GAZIPASA/ALANYA", + "callsign": "GZP", + "beacon_type": 10, + "hertz": 316000, + "channel": null + }, + { + "name": "FAMAGUSTA_GECITKALE", + "callsign": "GKE", + "beacon_type": 4, + "hertz": 114300000, + "channel": null + }, + { + "name": "GECITKALE", + "callsign": "GKE", + "beacon_type": 10, + "hertz": 435000, + "channel": null + }, { "name": "HATAY", "callsign": "HTY", @@ -317,8 +429,8 @@ { "name": "INCIRLIC", "callsign": "DAN", - "beacon_type": 6, - "hertz": 108400000, + "beacon_type": 5, + "hertz": null, "channel": 21 }, { @@ -349,6 +461,34 @@ "hertz": 111700000, "channel": null }, + { + "name": "", + "callsign": "ILC", + "beacon_type": 14, + "hertz": 110300000, + "channel": null + }, + { + "name": "Larnaca", + "callsign": "LCA", + "beacon_type": 4, + "hertz": 112800000, + "channel": null + }, + { + "name": "", + "callsign": "ILC", + "beacon_type": 15, + "hertz": 110300000, + "channel": null + }, + { + "name": "Larnaca", + "callsign": "LCA", + "beacon_type": 9, + "hertz": 432000, + "channel": null + }, { "name": "", "callsign": "IBA", @@ -373,8 +513,8 @@ { "name": "LATAKIA", "callsign": "LTK", - "beacon_type": 11, - "hertz": 414000000, + "beacon_type": 9, + "hertz": 414000, "channel": null }, { @@ -391,6 +531,41 @@ "hertz": 337000, "channel": null }, + { + "name": "Pafos", + "callsign": "PHA", + "beacon_type": 10, + "hertz": 328000, + "channel": null + }, + { + "name": "", + "callsign": "IPA", + "beacon_type": 15, + "hertz": 108900000, + "channel": null + }, + { + "name": "", + "callsign": "IPA", + "beacon_type": 14, + "hertz": 108900000, + "channel": null + }, + { + "name": "Pafos", + "callsign": "IPA", + "beacon_type": 3, + "hertz": 108900000, + "channel": null + }, + { + "name": "Pafos", + "callsign": "PHA", + "beacon_type": 4, + "hertz": 117900000, + "channel": null + }, { "name": "RAMATDAVID", "callsign": "RMD", @@ -398,6 +573,27 @@ "hertz": 368000, "channel": null }, + { + "name": "RAMATDAVID", + "callsign": "RMD", + "beacon_type": 6, + "hertz": 113700000, + "channel": 84 + }, + { + "name": "", + "callsign": "RMD", + "beacon_type": 14, + "hertz": 111100000, + "channel": null + }, + { + "name": "", + "callsign": "RMD", + "beacon_type": 15, + "hertz": 111100000, + "channel": null + }, { "name": "Cheka", "callsign": "CAK", diff --git a/resources/factions/Israel-USN_2005_Allied_Sword.json b/resources/factions/Israel-USN_2005_Allied_Sword.json deleted file mode 100644 index ee7d8b67..00000000 --- a/resources/factions/Israel-USN_2005_Allied_Sword.json +++ /dev/null @@ -1,109 +0,0 @@ -{ - "country": "Israel", - "name": "Israel-USN 2005 (Allied Sword)", - "authors": "Fuzzle", - "description": "

A joint US Navy/Israeli modern faction for use with the Operation Allied Sword scenario.

", - "aircrafts": [ - "F_4E", - "F_15C", - "F_15E", - "F_16C_50", - "F_14B", - "FA_18C_hornet", - "AV8BNA", - "AH_1W", - "AH_64D", - "S_3B", - "SH_60B", - "UH_1H" - ], - "awacs": [ - "E_2C" - ], - "tankers": [ - "KC_135", - "KC130", - "S_3B_Tanker" - ], - "frontline_units": [ - "APC_M113", - "APC_HMMWV__Scout", - "ATGM_HMMWV", - "MBT_Merkava_IV", - "SPAAA_Vulcan_M163" - ], - "artillery_units": [ - "SPH_M109_Paladin_155mm", - "MLRS_M270_227mm" - ], - "logistics_units": [ - "Truck_M818_6x6" - ], - "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger" - ], - "air_defenses": [ - "ChaparralGenerator", - "HawkGenerator", - "VulcanGenerator", - "PatriotGenerator" - ], - "ewrs": [ - "HawkEwrGenerator" - ], - "aircraft_carrier": [ - "CVN_74_John_C__Stennis" - ], - "helicopter_carrier": [ - "LHA_1_Tarawa" - ], - "destroyers": [ - "DDG_Arleigh_Burke_IIa" - ], - "cruisers": [ - "CG_Ticonderoga" - ], - "requirements": { - }, - "carrier_names": [ - "CVN-71 Theodore Roosevelt", - "CVN-72 Abraham Lincoln", - "CVN-73 George Washington", - "CVN-74 John C. Stennis", - "CVN-75 Harry S. Truman" - ], - "helicopter_carrier_names": [ - "LHA-1 Tarawa", - "LHA-2 Saipan", - "LHA-3 Belleau Wood", - "LHA-4 Nassau", - "LHA-5 Peleliu" - ], - "navy_generators": [ - "ArleighBurkeGroupGenerator", - "OliverHazardPerryGroupGenerator" - - ], - "has_jtac": true, - "jtac_unit": "MQ_9_Reaper", - "doctrine": "modern", - "liveries_overrides": { - "F_14B": [ - "VF-142 Ghostriders" - ], - "FA_18C_hornet": [ - "VMFA-251 high visibility" - ], - "AV8BNA": [ - "VMAT-542" - ], - "AH_1W": [ - "Marines" - ], - "UH_1H": [ - "US NAVY" - ] - } -} diff --git a/resources/factions/NATO_Desert_Storm.json b/resources/factions/NATO_Desert_Storm.json index 785a86ef..60edc2c5 100644 --- a/resources/factions/NATO_Desert_Storm.json +++ b/resources/factions/NATO_Desert_Storm.json @@ -4,64 +4,64 @@ "authors": "Hawkmoon", "description": "

A faction to recreate the actual unit lineup during Desert Storm as closely as possible

", "aircrafts": [ - "F_15C", - "F_14A_135_GR", - "F_14B", - "F_15E", - "F_16C_50", - "FA_18C_hornet", - "A_10A", - "AV8BNA", - "UH_1H", - "AH_64A", - "B_52H", - "B_1B", - "Tornado_IDS", - "F_4E", - "F_117A", - "M_2000C", - "S_3B", - "SA342M", - "SA342L", - "SA342Mistral", - "OH_58D" + "A-10A Thunderbolt II", + "AH-64A Apache", + "AV-8B Harrier II Night Attack", + "B-1B Lancer", + "B-52H Stratofortress", + "F-117A Nighthawk", + "F-14A Tomcat (Block 135-GR Late)", + "F-14B Tomcat", + "F-15C Eagle", + "F-15E Strike Eagle", + "F-16CM Fighting Falcon (Block 50)", + "F-4E Phantom II", + "F/A-18C Hornet (Lot 20)", + "Mirage 2000C", + "OH-58D Kiowa Warrior", + "S-3B Viking", + "SA 342L Gazelle", + "SA 342M Gazelle", + "SA 342M Gazelle Mistral", + "Tornado IDS", + "UH-1H Iroquois" ], "awacs": [ - "E_3A", - "E_2C" + "E-2C Hawkeye", + "E-3A" ], "tankers": [ - "KC_135", - "KC130", + "KC-130", + "KC-135 Stratotanker", "S-3B Tanker" ], "frontline_units": [ - "MBT_M1A2_Abrams", - "ATGM_Stryker", - "IFV_M2A2_Bradley", - "IFV_M1126_Stryker_ICV", - "IFV_LAV_25", - "Scout_HMMWV", - "ATGM_HMMWV", - "APC_TPz_Fuchs", - "IFV_Warrior", - "MBT_Challenger_II", - "MBT_M60A3_Patton", - "SPG_Stryker_MGS", - "SAM_Avenger__Stinger", - "ATGM_VAB_Mephisto" + "FV4034 Challenger 2", + "FV510 Warrior", + "LAV-25", + "M1043 HMMWV (M2 HMG)", + "M1045 HMMWV (BGM-71 TOW)", + "M1097 Heavy HMMWV Avenger", + "M1126 Stryker ICV (M2 HMG)", + "M1128 Stryker Mobile Gun System", + "M1134 Stryker ATGM (BGM-71 TOW)", + "M1A2 Abrams", + "M2A2 Bradley", + "M60A3 \"Patton\"", + "TPz Fuchs", + "VAB Mephisto" ], "artillery_units": [ - "MLRS_M270_227mm", - "SPH_M109_Paladin_155mm" + "M109A6 Paladin", + "M270 Multiple Launch Rocket System" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger" ], "air_defenses": [ "AvengerGenerator", @@ -76,16 +76,16 @@ "PatriotEwrGenerator" ], "aircraft_carrier": [ - "CVN_74_John_C__Stennis" + "Stennis" ], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "FFG_Oliver_Hazzard_Perry" + "PERRY" ], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "requirements": {}, "carrier_names": [ @@ -99,5 +99,5 @@ "OliverHazardPerryGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/Syria-Lebanon_2005_Allied_Sword.json b/resources/factions/Syria-Lebanon_2005_Allied_Sword.json deleted file mode 100644 index 49c41677..00000000 --- a/resources/factions/Syria-Lebanon_2005_Allied_Sword.json +++ /dev/null @@ -1,105 +0,0 @@ -{ - "country": "Combined Joint Task Forces Red", - "name": "Syria-Lebanon 2005 (Allied Sword)", - "authors": "Fuzzle", - "description": "

Syria-Lebanon alliance in a modern setting with several imported Russian assets. Designed for use with the Allied Sword scenario.

", - "aircrafts": [ - "MiG_23MLD", - "MiG_25PD", - "MiG_29S", - "Su_17M4", - "Su_24M", - "Su_30", - "Su_34", - "L_39ZA", - "Tu_22M3", - "Mi_24V", - "Mi_8MT", - "SA342M", - "SA342L" - ], - "awacs": [ - "A_50" - ], - "tankers": [ - "IL_78M" - ], - "frontline_units": [ - "IFV_BMP_1", - "IFV_BMP_2", - "APC_BTR_80", - "IFV_BRDM_2", - "APC_MTLB", - "APC_Cobra__Scout", - "MBT_T_55", - "MBT_T_72B", - "MBT_T_90", - "SPAAA_ZSU_57_2" - ], - "artillery_units": [ - "MLRS_BM_27_Uragan_220mm", - "SPH_2S9_Nona_120mm_M", - "MLRS_BM_21_Grad_122mm", - "SPH_2S1_Gvozdika_122mm" - ], - "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" - ], - "infantry_units": [ - "Paratrooper_AKS", - "Infantry_AK_74_Rus", - "Paratrooper_RPG_16", - "MANPADS_SA_18_Igla_S_Grouse" - ], - "air_defenses": [ - "ColdWarFlakGenerator", - "SA2Generator", - "SA3Generator", - "SA6Generator", - "SA8Generator", - "SA9Generator", - "SA10Generator", - "SA11Generator", - "SA13Generator", - "SA19Generator", - "ZSU23Generator", - "ZU23Generator", - "ZU23UralGenerator", - "ZSU57Generator" - ], - "ewrs": [ - "BoxSpringGenerator", - "TallRackGenerator" - ], - "missiles": [ - "ScudGenerator" - ], - "missiles_group_count": 2, - "coastal_defenses": [ - "SilkwormGenerator" - ], - "coastal_group_count": 4, - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ - ], - "destroyers": [ - "Frigate_1135M_Rezky", - "Corvette_1241_1_Molniya" - ], - "cruisers": [ - ], - "requirements": {}, - "carrier_names": [ - ], - "coastal_group_count": 8, - "navy_generators": [ - "GrishaGroupGenerator", - "MolniyaGroupGenerator", - "RussianNavyGroupGenerator", - "LaCombattanteIIGroupGenerator" - ] -} diff --git a/resources/factions/allies_1940.json b/resources/factions/allies_1940.json index 1d590b00..3fc24f1f 100644 --- a/resources/factions/allies_1940.json +++ b/resources/factions/allies_1940.json @@ -4,47 +4,40 @@ "authors": "Khopa", "description": "

A generic WW2 ally factions for 1940 Battle of France or Battle of England.

", "aircrafts": [ - "SpitfireLFMkIX", - "SpitfireLFMkIXCW", - "A_20G" + "Boston Mk.III", + "Spitfire LF Mk IX", + "Spitfire LF Mk IX (Clipped Wings)" ], "frontline_units": [ - "APC_M2A1_Halftrack", - "HIT_Churchill_VII", - "Car_Daimler_Armored", - "LT_Mk_VII_Tetrarch", - "AAA_QF_3_7", - "AAA_Bofors_40mm" - ], - "artillery_units": [ + "A17 Light Tank Mk VII Tetrarch", + "A22 Infantry Tank MK IV Churchill VII", + "Daimler Armoured Car Mk I", + "M2A1 Half-Track", + "QF 3.7-inch AA Gun", + "QF 40 mm Mark III" ], + "artillery_units": [], "logistics_units": [ - "Truck_Bedford", - "Truck_GMC_Jimmy_6x6_Truck" + "Truck Bedford", + "Truck GMC \"Jimmy\" 6x6 Truck" ], "infantry_units": [ - "Infantry_SMLE_No_4_Mk_1", - "Infantry_M1_Garand" + "Infantry M1 Garand", + "Infantry SMLE No.4 Mk-1" ], "air_defenses": [ "AllyWW2FlakGenerator", "BoforsGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "destroyers": [], + "cruisers": [], "requirements": { "WW2 Asset Pack": "https://www.digitalcombatsimulator.com/en/products/other/wwii_assets_pack/" }, - "carrier_names": [ - ], - "helicopter_carrier_names": [ - ], + "carrier_names": [], + "helicopter_carrier_names": [], "navy_generators": [ "WW2LSTGroupGenerator" ], @@ -52,4 +45,4 @@ "has_jtac": false, "doctrine": "ww2", "building_set": "ww2ally" -} +} \ No newline at end of file diff --git a/resources/factions/allies_1944.json b/resources/factions/allies_1944.json index 98f2a5ec..33e93911 100644 --- a/resources/factions/allies_1944.json +++ b/resources/factions/allies_1944.json @@ -4,60 +4,54 @@ "authors": "Khopa", "description": "

A generic WW2 ally factions, with all their WW2 units.

", "aircrafts": [ - "P_51D", - "P_51D_30_NA", - "P_47D_30", - "P_47D_30bl1", - "P_47D_40", - "SpitfireLFMkIX", - "SpitfireLFMkIXCW", - "A_20G", - "B_17G" + "A-20G Havoc", + "B-17G Flying Fortress", + "P-47D-30 Thunderbolt (Early)", + "P-47D-30 Thunderbolt (Late)", + "P-47D-40 Thunderbolt", + "P-51D-25-NA Mustang", + "P-51D-30-NA Mustang", + "Spitfire LF Mk IX", + "Spitfire LF Mk IX (Clipped Wings)" ], "frontline_units": [ - "MT_M4A4_Sherman_Firefly", - "Tk_M4_Sherman", - "APC_M2A1_Halftrack", - "CT_Cromwell_IV", - "CT_Centaur_IV", - "HIT_Churchill_VII", - "Car_M8_Greyhound_Armored", - "SPG_M10_GMC", - "Car_Daimler_Armored", - "LT_Mk_VII_Tetrarch", - "AAA_QF_3_7", - "AAA_Bofors_40mm" + "A17 Light Tank Mk VII Tetrarch", + "A22 Infantry Tank MK IV Churchill VII", + "A27L Cruiser Tank MK VIII Centaur IV", + "A27M Cruiser Tank MK VIII Cromwell IV", + "Bofors 40 mm Gun", + "Daimler Armoured Car Mk I", + "M10 3-inch Gun Motor Carriage", + "M2A1 Half-Track", + "M4A2(75) Sherman", + "M4A4 Sherman Firefly", + "M8 Greyhound Light Armored Car", + "QF 3.7-inch AA Gun" ], "artillery_units": [ - "SPG_M12_GMC_155mm" + "M12 Gun Motor Carriage" ], "logistics_units": [ - "Truck_Bedford", - "Truck_GMC_Jimmy_6x6_Truck" + "Truck Bedford", + "Truck GMC \"Jimmy\" 6x6 Truck" ], "infantry_units": [ - "Infantry_SMLE_No_4_Mk_1", - "Infantry_M1_Garand" + "Infantry M1 Garand", + "Infantry SMLE No.4 Mk-1" ], "air_defenses": [ "AllyWW2FlakGenerator", "BoforsGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "destroyers": [], + "cruisers": [], "requirements": { "WW2 Asset Pack": "https://www.digitalcombatsimulator.com/en/products/other/wwii_assets_pack/" }, - "carrier_names": [ - ], - "helicopter_carrier_names": [ - ], + "carrier_names": [], + "helicopter_carrier_names": [], "navy_generators": [ "WW2LSTGroupGenerator" ], @@ -65,4 +59,4 @@ "has_jtac": false, "doctrine": "ww2", "building_set": "ww2ally" -} +} \ No newline at end of file diff --git a/resources/factions/allies_1944_free.json b/resources/factions/allies_1944_free.json index 7e4e7fc9..a148b3f9 100644 --- a/resources/factions/allies_1944_free.json +++ b/resources/factions/allies_1944_free.json @@ -4,49 +4,40 @@ "authors": "Khopa", "description": "

A generic WW2 ally faction that does not requires the paid WW2 asset pack.

", "aircrafts": [ - "P_51D", - "P_51D_30_NA", - "P_47D_30", - "P_47D_30bl1", - "P_47D_40", - "SpitfireLFMkIX", - "SpitfireLFMkIXCW", - "A_20G" + "A-20G Havoc", + "P-47D-30 Thunderbolt (Early)", + "P-47D-30 Thunderbolt (Late)", + "P-47D-40 Thunderbolt", + "P-51D-25-NA Mustang", + "P-51D-30-NA Mustang", + "Spitfire LF Mk IX", + "Spitfire LF Mk IX (Clipped Wings)" ], "frontline_units": [ - "Tk_M4_Sherman", - "APC_M2A1_Halftrack", - "AAA_Bofors_40mm" - ], - "artillery_units": [ + "Bofors 40 mm Gun", + "M2A1 Half-Track", + "M4A2(75) Sherman" ], + "artillery_units": [], "logistics_units": [ - "Truck_Bedford" + "Truck Bedford" ], "infantry_units": [ - "Paratrooper_AKS" + "Paratrooper AKS" ], "air_defenses": [ "BoforsGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], - "requirements": { - }, - "carrier_names": [ - ], - "helicopter_carrier_names": [ - ], - "navy_generators": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "destroyers": [], + "cruisers": [], + "requirements": {}, + "carrier_names": [], + "helicopter_carrier_names": [], + "navy_generators": [], "navy_group_count": 0, "has_jtac": false, "doctrine": "ww2", "building_set": "ww2free" -} +} \ No newline at end of file diff --git a/resources/factions/australia_2005.json b/resources/factions/australia_2005.json index efca64d4..fbb7a648 100644 --- a/resources/factions/australia_2005.json +++ b/resources/factions/australia_2005.json @@ -4,34 +4,33 @@ "authors": "Khopa", "description": "

The Australian army in 2005.

Some units might not be accurate, but were picked to represent at best this army.

", "aircrafts": [ - "FA_18C_hornet", - "UH_1H", - "SH_60B", - "AH_1W" + "AH-1W SuperCobra", + "F/A-18C Hornet (Lot 20)", + "SH-60B Seahawk", + "UH-1H Iroquois" ], "awacs": [ - "E_3A" + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "MBT_M1A2_Abrams", - "MBT_Leopard_1A3", - "APC_M113", - "IFV_LAV_25", - "IFV_Warrior" - ], - "artillery_units": [ + "FV510 Warrior", + "LAV-25", + "Leopard 1A3", + "M113", + "M1A2 Abrams" ], + "artillery_units": [], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger" ], "air_defenses": [ "HawkGenerator", @@ -40,19 +39,16 @@ "ewrs": [ "HawkEwrGenerator" ], - "aircraft_carrier": [ - ], + "aircraft_carrier": [], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "DDG_Arleigh_Burke_IIa" - ], - "cruisers": [ + "USS_Arleigh_Burke_IIa" ], + "cruisers": [], "requirements": {}, - "carrier_names": [ - ], + "carrier_names": [], "helicopter_carrier_names": [ "HMAS Canberra", "HMAS Adelaide" @@ -61,11 +57,11 @@ "ArleighBurkeGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper", + "jtac_unit": "MQ-9 Reaper", "liveries_overrides": { - "FA_18C_hornet": [ + "F/A-18C Hornet (Lot 20)": [ "Australian 75th Squadron", "Australian 77th Squadron" ] } -} +} \ No newline at end of file diff --git a/resources/factions/australia_2005_c130.json b/resources/factions/australia_2005_c130.json index ae5ecb18..868f6696 100644 --- a/resources/factions/australia_2005_c130.json +++ b/resources/factions/australia_2005_c130.json @@ -4,35 +4,34 @@ "authors": "Khopa, SpaceEnthusiast", "description": "

The Australian army in 2005.

Some units might not be accurate, but were picked to represent at best this army.

", "aircrafts": [ - "FA_18C_hornet", - "UH_1H", - "SH_60B", - "AH_1W", - "Hercules" + "AH-1W SuperCobra", + "C-130J-30 Super Hercules", + "F/A-18C Hornet (Lot 20)", + "SH-60B Seahawk", + "UH-1H Iroquois" ], "awacs": [ - "E_3A" + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "MBT_M1A2_Abrams", - "MBT_Leopard_1A3", - "APC_M113", - "IFV_LAV_25", - "IFV_Warrior" - ], - "artillery_units": [ + "FV510 Warrior", + "LAV-25", + "Leopard 1A3", + "M113", + "M1A2 Abrams" ], + "artillery_units": [], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger" ], "air_defenses": [ "HawkGenerator", @@ -41,21 +40,18 @@ "ewrs": [ "HawkEwrGenerator" ], - "aircraft_carrier": [ - ], + "aircraft_carrier": [], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "DDG_Arleigh_Burke_IIa" - ], - "cruisers": [ + "USS_Arleigh_Burke_IIa" ], + "cruisers": [], "requirements": { "C-130J-30 Super Hercules Mod by Anubis": "https://forums.eagle.ru/topic/252075-dcs-super-hercules-mod-by-anubis/" }, - "carrier_names": [ - ], + "carrier_names": [], "helicopter_carrier_names": [ "HMAS Canberra", "HMAS Adelaide" @@ -64,11 +60,11 @@ "ArleighBurkeGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper", + "jtac_unit": "MQ-9 Reaper", "liveries_overrides": { - "FA_18C_hornet": [ + "F/A-18C Hornet (Lot 20)": [ "Australian 75th Squadron", "Australian 77th Squadron" ] } -} +} \ No newline at end of file diff --git a/resources/factions/bluefor_coldwar.json b/resources/factions/bluefor_coldwar.json index bf5322a8..7d9392dc 100644 --- a/resources/factions/bluefor_coldwar.json +++ b/resources/factions/bluefor_coldwar.json @@ -4,40 +4,40 @@ "authors": "Khopa", "description": "

A generic bluefor coldwar faction.

", "aircrafts": [ - "F_14A_135_GR", - "F_14B", - "F_4E", - "F_5E_3", - "A_10A", - "AJS37", - "UH_1H", - "SA342M", - "SA342L", - "B_52H" + "A-10A Thunderbolt II", + "AJS-37 Viggen", + "B-52H Stratofortress", + "F-14A Tomcat (Block 135-GR Late)", + "F-14B Tomcat", + "F-4E Phantom II", + "F-5E Tiger II", + "SA 342L Gazelle", + "SA 342M Gazelle", + "UH-1H Iroquois" ], "awacs": [ - "C_130", - "E_3A", - "E_2C" + "C-130", + "E-2C Hawkeye", + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "MBT_M60A3_Patton", - "APC_M113", - "SAM_Chaparral_M48" + "M113", + "M48 Chaparral", + "M60A3 \"Patton\"" ], "artillery_units": [ - "SPH_M109_Paladin_155mm" + "M109A6 Paladin" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249" + "Infantry M249", + "Infantry M4" ], "air_defenses": [ "ChaparralGenerator", @@ -49,16 +49,16 @@ "HawkEwrGenerator" ], "aircraft_carrier": [ - "CVN_74_John_C__Stennis" + "Stennis" ], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "DDG_Arleigh_Burke_IIa" + "USS_Arleigh_Burke_IIa" ], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "requirements": {}, "carrier_names": [ @@ -78,6 +78,6 @@ "ArleighBurkeGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper", + "jtac_unit": "MQ-9 Reaper", "doctrine": "coldwar" -} +} \ No newline at end of file diff --git a/resources/factions/bluefor_coldwar_a4.json b/resources/factions/bluefor_coldwar_a4.json index 407a0acf..07612aae 100644 --- a/resources/factions/bluefor_coldwar_a4.json +++ b/resources/factions/bluefor_coldwar_a4.json @@ -4,41 +4,41 @@ "authors": "Khopa", "description": "

A generic bluefor coldwar faction. (With the A-4E-C mod)

", "aircrafts": [ - "F_14A_135_GR", - "F_14B", - "F_4E", - "F_5E_3", - "A_10A", - "AJS37", - "UH_1H", - "SA342M", - "SA342L", - "A_4E_C", - "B_52H" + "A-10A Thunderbolt II", + "A-4E Skyhawk", + "AJS-37 Viggen", + "B-52H Stratofortress", + "F-14A Tomcat (Block 135-GR Late)", + "F-14B Tomcat", + "F-4E Phantom II", + "F-5E Tiger II", + "SA 342L Gazelle", + "SA 342M Gazelle", + "UH-1H Iroquois" ], "awacs": [ - "C_130", - "E_3A", - "E_2C" + "C-130", + "E-2C Hawkeye", + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "MBT_M60A3_Patton", - "APC_M113", - "SAM_Chaparral_M48" + "M113", + "M48 Chaparral", + "M60A3 \"Patton\"" ], "artillery_units": [ - "SPH_M109_Paladin_155mm" + "M109A6 Paladin" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249" + "Infantry M249", + "Infantry M4" ], "air_defenses": [ "ChaparralGenerator", @@ -50,16 +50,16 @@ "HawkEwrGenerator" ], "aircraft_carrier": [ - "CVN_74_John_C__Stennis" + "Stennis" ], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "DDG_Arleigh_Burke_IIa" + "USS_Arleigh_Burke_IIa" ], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "requirements": { "Community A-4E": "https://heclak.github.io/community-a4e-c/" @@ -81,6 +81,6 @@ "ArleighBurkeGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper", + "jtac_unit": "MQ-9 Reaper", "doctrine": "coldwar" -} +} \ No newline at end of file diff --git a/resources/factions/bluefor_coldwar_a4_mb339.json b/resources/factions/bluefor_coldwar_a4_mb339.json index 1fdbdad8..23893280 100644 --- a/resources/factions/bluefor_coldwar_a4_mb339.json +++ b/resources/factions/bluefor_coldwar_a4_mb339.json @@ -4,42 +4,42 @@ "authors": "Khopa", "description": "

A generic bluefor coldwar faction. (With the A-4E-C and the MB-339 mods)

", "aircrafts": [ - "F_14A_135_GR", - "F_14B", - "F_4E", - "F_5E_3", - "A_10A", - "AJS37", - "UH_1H", - "SA342M", - "SA342L", - "A_4E_C", - "MB_339PAN", - "B_52H" + "A-10A Thunderbolt II", + "A-4E Skyhawk", + "AJS-37 Viggen", + "B-52H Stratofortress", + "F-14A Tomcat (Block 135-GR Late)", + "F-14B Tomcat", + "F-4E Phantom II", + "F-5E Tiger II", + "MB-339PAN", + "SA 342L Gazelle", + "SA 342M Gazelle", + "UH-1H Iroquois" ], "awacs": [ - "C_130", - "E_3A", - "E_2C" + "C-130", + "E-2C Hawkeye", + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "MBT_M60A3_Patton", - "APC_M113", - "SAM_Chaparral_M48" + "M113", + "M48 Chaparral", + "M60A3 \"Patton\"" ], "artillery_units": [ - "SPH_M109_Paladin_155mm" + "M109A6 Paladin" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249" + "Infantry M249", + "Infantry M4" ], "air_defenses": [ "ChaparralGenerator", @@ -51,16 +51,16 @@ "HawkEwrGenerator" ], "aircraft_carrier": [ - "CVN_74_John_C__Stennis" + "Stennis" ], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "DDG_Arleigh_Burke_IIa" + "USS_Arleigh_Burke_IIa" ], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "requirements": { "MB-339A/PAN by Frecce Tricolori Virtuali": "http://www.freccetricolorivirtuali.net/", @@ -83,6 +83,6 @@ "ArleighBurkeGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper", + "jtac_unit": "MQ-9 Reaper", "doctrine": "coldwar" -} +} \ No newline at end of file diff --git a/resources/factions/bluefor_modern.json b/resources/factions/bluefor_modern.json index 8f0ac073..9a5089ab 100644 --- a/resources/factions/bluefor_modern.json +++ b/resources/factions/bluefor_modern.json @@ -4,64 +4,64 @@ "authors": "Khopa", "description": "

A generic bluefor modern faction. This also includes many redfor units and is meant to be a faction that has access to most modern flyable modules.

", "aircrafts": [ - "F_14B", - "F_15C", - "F_15E", - "F_16C_50", - "FA_18C_hornet", - "JF_17", - "M_2000C", - "F_5E_3", - "Su_27", - "Su_25T", - "A_10A", - "A_10C", - "A_10C_2", - "AV8BNA", - "AJS37", - "UH_1H", - "AH_64D", - "Ka_50", - "SA342M", - "SA342L", - "B_52H", - "B_1B" + "A-10A Thunderbolt II", + "A-10C Thunderbolt II (Suite 3)", + "A-10C Thunderbolt II (Suite 7)", + "AH-64D Apache Longbow", + "AJS-37 Viggen", + "AV-8B Harrier II Night Attack", + "B-1B Lancer", + "B-52H Stratofortress", + "F-14B Tomcat", + "F-15C Eagle", + "F-15E Strike Eagle", + "F-16CM Fighting Falcon (Block 50)", + "F-5E Tiger II", + "F/A-18C Hornet (Lot 20)", + "JF-17 Thunder", + "Ka-50 Hokum", + "Mirage 2000C", + "SA 342L Gazelle", + "SA 342M Gazelle", + "Su-25T Frogfoot", + "Su-27 Flanker-B", + "UH-1H Iroquois" ], "awacs": [ - "E_3A", - "E_2C" + "E-2C Hawkeye", + "E-3A" ], "tankers": [ - "KC_135", - "KC135MPRS", - "KC130", + "KC-130", + "KC-135 Stratotanker", + "KC-135 Stratotanker MPRS", "S-3B Tanker" ], "frontline_units": [ - "MBT_M1A2_Abrams", - "MBT_Leopard_2A6M", - "MBT_Merkava_IV", - "ATGM_Stryker", - "IFV_M2A2_Bradley", - "IFV_Marder", - "IFV_LAV_25", - "Scout_HMMWV", - "ATGM_HMMWV", - "SAM_Linebacker___Bradley_M6", - "SAM_Avenger__Stinger", - "ATGM_VAB_Mephisto" + "LAV-25", + "Leopard 2", + "M1043 HMMWV (M2 HMG)", + "M1045 HMMWV (BGM-71 TOW)", + "M1097 Heavy HMMWV Avenger", + "M1134 Stryker ATGM (BGM-71 TOW)", + "M1A2 Abrams", + "M2A2 Bradley", + "M6 Linebacker", + "Marder 1A3", + "Merkava Mk IV", + "VAB Mephisto" ], "artillery_units": [ - "MLRS_M270_227mm", - "SPH_M109_Paladin_155mm" + "M109A6 Paladin", + "M270 Multiple Launch Rocket System" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger" ], "air_defenses": [ "AvengerGenerator", @@ -72,16 +72,16 @@ "PatriotEwrGenerator" ], "aircraft_carrier": [ - "CVN_74_John_C__Stennis" + "Stennis" ], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "DDG_Arleigh_Burke_IIa" + "USS_Arleigh_Burke_IIa" ], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "requirements": {}, "carrier_names": [ @@ -101,6 +101,6 @@ "ArleighBurkeGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper", + "jtac_unit": "MQ-9 Reaper", "unrestricted_satnav": true -} +} \ No newline at end of file diff --git a/resources/factions/canada_2005.json b/resources/factions/canada_2005.json index 6ef74e66..44761af1 100644 --- a/resources/factions/canada_2005.json +++ b/resources/factions/canada_2005.json @@ -3,37 +3,39 @@ "name": "Canada 2005", "authors": "Khopa", "description": "

Canada in the 2000s, an F/A-18C Hornet focused faction.

", - "locales": ["en_US", "fr_CA"], + "locales": [ + "en_US", + "fr_CA" + ], "aircrafts": [ - "FA_18C_hornet", - "UH_1H", - "AH_1W" + "AH-1W SuperCobra", + "CF-188 Hornet", + "UH-1H Iroquois" ], "awacs": [ - "E_3A" + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "MBT_Leopard_1A3", - "MBT_Leopard_2A4", - "MBT_Leopard_2A6M", - "IFV_LAV_25", - "APC_M113", - "IFV_Warrior", - "SAM_Avenger__Stinger" - ], - "artillery_units": [ + "FV510 Warrior", + "LAV-25", + "Leopard 1A3", + "Leopard 2", + "Leopard 2A4", + "M1097 Heavy HMMWV Avenger", + "M113" ], + "artillery_units": [], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger" ], "air_defenses": [ "AvengerGenerator", @@ -42,30 +44,26 @@ "ewrs": [ "HawkEwrGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], "destroyers": [ - "DDG_Arleigh_Burke_IIa" + "USS_Arleigh_Burke_IIa" ], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "requirements": {}, - "carrier_names": [ - ], - "helicopter_carrier_names": [ - ], + "carrier_names": [], + "helicopter_carrier_names": [], "navy_generators": [ "ArleighBurkeGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper", + "jtac_unit": "MQ-9 Reaper", "liveries_overrides": { - "FA_18C_hornet": [ + "CF-188 Hornet": [ "Canada 409th Squadron", "Canada 425th Squadron" ] } -} +} \ No newline at end of file diff --git a/resources/factions/canada_2005_c130.json b/resources/factions/canada_2005_c130.json index 6f1b7657..872fb5a2 100644 --- a/resources/factions/canada_2005_c130.json +++ b/resources/factions/canada_2005_c130.json @@ -3,38 +3,40 @@ "name": "Canada 2005 (With C-130)", "authors": "Khopa, SpaceEnthusiast", "description": "

Canada in the 2000s, an F/A-18C Hornet focused faction.

", - "locales": ["en_US", "fr_CA"], + "locales": [ + "en_US", + "fr_CA" + ], "aircrafts": [ - "FA_18C_hornet", - "UH_1H", - "AH_1W", - "Hercules" + "AH-1W SuperCobra", + "C-130J-30 Super Hercules", + "CF-188 Hornet", + "UH-1H Iroquois" ], "awacs": [ - "E_3A" + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "MBT_Leopard_1A3", - "MBT_Leopard_2A4", - "MBT_Leopard_2A6M", - "IFV_LAV_25", - "APC_M113", - "IFV_Warrior", - "SAM_Avenger__Stinger" - ], - "artillery_units": [ + "FV510 Warrior", + "LAV-25", + "Leopard 1A3", + "Leopard 2", + "Leopard 2A4", + "M1097 Heavy HMMWV Avenger", + "M113" ], + "artillery_units": [], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger" ], "air_defenses": [ "AvengerGenerator", @@ -43,35 +45,31 @@ "ewrs": [ "HawkEwrGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], "destroyers": [ - "DDG_Arleigh_Burke_IIa" + "USS_Arleigh_Burke_IIa" ], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "requirements": { "C-130J-30 Super Hercules Mod by Anubis": "https://forums.eagle.ru/topic/252075-dcs-super-hercules-mod-by-anubis/" }, - "carrier_names": [ - ], - "helicopter_carrier_names": [ - ], + "carrier_names": [], + "helicopter_carrier_names": [], "navy_generators": [ "ArleighBurkeGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper", + "jtac_unit": "MQ-9 Reaper", "liveries_overrides": { - "FA_18C_hornet": [ + "CF-188 Hornet": [ "Canada 409th Squadron", "Canada 425th Squadron" ], - "Hercules": [ + "C-130J-30 Super Hercules": [ "Royal Canadian AF CC-130J" ] } -} +} \ No newline at end of file diff --git a/resources/factions/china_2010.json b/resources/factions/china_2010.json index 740b96d2..fa91b93e 100644 --- a/resources/factions/china_2010.json +++ b/resources/factions/china_2010.json @@ -3,43 +3,45 @@ "name": "China 2010", "authors": "Khopa", "description": "

China in the late 2000s, early 2010s.

", - "locales": ["zh_CN"], + "locales": [ + "zh_CN" + ], "aircrafts": [ - "MiG_21Bis", - "Su_30", - "Su_33", - "J_11A", - "JF_17", - "Mi_8MT", - "Mi_28N" + "FC-1 Fierce Dragon", + "J-11A Flanker-L", + "J-15 Flanker X-2", + "J-7B", + "Mi-28N Havoc", + "Mi-8MTV2 Hip", + "Su-30MKK Flanker-G" ], "awacs": [ - "KJ_2000" + "KJ-2000" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "ZTZ_96B", - "MBT_T_55", - "ZBD_04A", - "IFV_BMP_1", - "HQ_7_Self_Propelled_LN" + "BMP-1", + "HQ-7 Launcher", + "T-55A", + "Type 04A (ZBD-04A)", + "Type 96B (ZTZ-96B)" ], "artillery_units": [ - "MLRS_9A52_Smerch_HE_300mm", - "PLZ_05", - "SPM_2S9_Nona_120mm_M" + "2S9 Nona-S", + "BM-30 Smerch (9M55K5 HE Rockets)", + "PLZ-05" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Paratrooper_AKS", - "Infantry_AK_74_Rus", - "Paratrooper_RPG_16", - "MANPADS_SA_18_Igla_S_Grouse" + "Infantry AK-74 Rus", + "MANPADS SA-18 Igla-S \"Grouse\"", + "Paratrooper AKS", + "Paratrooper RPG-16" ], "air_defenses": [ "HQ7Generator", @@ -64,7 +66,7 @@ ], "coastal_group_count": 2, "aircraft_carrier": [ - "CV_1143_5_Admiral_Kuznetsov" + "KUZNECOW" ], "carrier_names": [ "001 Liaoning", @@ -83,16 +85,16 @@ "Wudang Shan" ], "destroyers": [ - "Type_052B_Destroyer", - "Type_052C_Destroyer" + "Type_052B", + "Type_052C" ], "cruiser": [ - "Type_054A_Frigate" + "Type_054A" ], "requirements": {}, "navy_generators": [ "Type54GroupGenerator" ], "has_jtac": true, - "jtac_unit": "WingLoong_I" -} + "jtac_unit": "WingLoong-I" +} \ No newline at end of file diff --git a/resources/factions/dprk_1950_fictional.json b/resources/factions/dprk_1950_fictional.json index 428212d9..7b224904 100644 --- a/resources/factions/dprk_1950_fictional.json +++ b/resources/factions/dprk_1950_fictional.json @@ -4,56 +4,47 @@ "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": [ + "Bf 109 K-4 Kurf\u00fcrst", + "Fw 190 A-8 Anton", + "Fw 190 D-9 Dora", + "I-16 Ishak", + "MiG-15bis Fagot" ], + "awacs": [], + "tankers": [], "frontline_units": [ - "Scout_BRDM_2", - "Grad_MRL_FDDM__FC", - "APC_MTLB", - "MBT_T_55", - "SPAAA_ZU_23_2_Mounted_Ural_375", - "AAA_8_8cm_Flak_18" + "8.8 cm Flak 18", + "BRDM-2", + "Grad MRL FDDM (FC)", + "MT-LB", + "T-55A", + "ZU-23 on Ural-375" ], "artillery_units": [ - "MLRS_BM_21_Grad_122mm" + "BM-21 Grad" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Infantry_AK_74_Rus", - "Infantry_RPG" + "Infantry AK-74 Rus", + "Infantry RPG" ], "air_defenses": [ "FlakGenerator", "EarlyColdWarFlakGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "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": [ - ], + "carrier_names": [], + "navy_generators": [], "has_jtac": false, "doctrine": "ww2" -} +} \ No newline at end of file diff --git a/resources/factions/france_1985_frenchpack.json b/resources/factions/france_1985_frenchpack.json index 3d30195d..f443f1c4 100644 --- a/resources/factions/france_1985_frenchpack.json +++ b/resources/factions/france_1985_frenchpack.json @@ -3,45 +3,47 @@ "name": "France 1985 (Frenchpack)", "authors": "Colonel Panic", "description": "

1980s French equipment using FrenchPack.

", - "locales": ["fr_FR"], + "locales": [ + "fr_FR" + ], "doctrine": "coldwar", "aircrafts": [ - "M_2000C", - "SA342M", - "SA342L", - "SA342Mistral" + "Mirage 2000C", + "SA 342L Gazelle", + "SA 342M Gazelle", + "SA 342M Gazelle Mistral" ], "awacs": [ - "E_3A" + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "AMX_10RCR", - "AMX_10RCR_SEPAR", - "ERC_90", - "TRM_2000_PAMELA", - "VAB__50", - "ATGM_VAB_Mephisto", - "VAB_T20_13", - "VBL__50", - "VBL_AANF1", - "AMX_30B2", - "SAM_Roland_ADS" + "AMX.30B2", + "Leclerc S\u00e9ries 2", + "Leclerc S\u00e9ries 2", + "Pamela", + "Panhard", + "Roland 2 (Marder Chassis)", + "VAB .50", + "VAB Mephisto", + "VAB T20/13", + "VBL .50", + "VBL AANF1" ], "artillery_units": [ - "MLRS_M270_227mm", - "SPH_M109_Paladin_155mm" + "M109A6 Paladin", + "M270 Multiple Launch Rocket System" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger" ], "air_defenses": [ "RolandGenerator", @@ -49,13 +51,13 @@ ], "aircraft_carrier": [], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "DDG_Arleigh_Burke_IIa" + "USS_Arleigh_Burke_IIa" ], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "requirements": { "frenchpack V3.5": "https://forums.eagle.ru/showthread.php?t=279974" @@ -73,5 +75,5 @@ "ArleighBurkeGroupGenerator" ], "has_jtac": true, - "jtac_unit": "SA342L" -} + "jtac_unit": "SA 342L Gazelle" +} \ No newline at end of file diff --git a/resources/factions/france_1995.json b/resources/factions/france_1995.json index 5278dd32..87c73a8a 100644 --- a/resources/factions/france_1995.json +++ b/resources/factions/france_1995.json @@ -3,41 +3,43 @@ "name": "France 1995", "authors": "Khopa", "description": "

France in the late 90s before Rafale introduction. A Mirage-2000 centric faction choice.

", - "locales": ["fr_FR"], + "locales": [ + "fr_FR" + ], "aircrafts": [ - "M_2000C", - "Mirage_2000_5", - "SA342M", - "SA342L", - "SA342Mistral" + "Mirage 2000-5", + "Mirage 2000C", + "SA 342L Gazelle", + "SA 342M Gazelle", + "SA 342M Gazelle Mistral" ], "awacs": [ - "E_3A" + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "MBT_Leclerc", - "APC_TPz_Fuchs", - "Scout_Cobra", - "IFV_LAV_25", - "ATGM_VAB_Mephisto", - "SAM_Roland_ADS" + "Cobra", + "LAV-25", + "Leclerc S\u00e9ries 2", + "Roland 2 (Marder Chassis)", + "TPz Fuchs", + "VAB Mephisto" ], "artillery_units": [ - "MLRS_M270_227mm", - "SPH_M109_Paladin_155mm" + "M109A6 Paladin", + "M270 Multiple Launch Rocket System" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger", - "Mortar_2B11_120mm" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger", + "Mortar 2B11 120mm" ], "air_defenses": [ "RolandGenerator", @@ -46,21 +48,19 @@ "ewrs": [ "HawkEwrGenerator" ], - "aircraft_carrier": [ - ], + "aircraft_carrier": [], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "DDG_Arleigh_Burke_IIa", - "FFG_Oliver_Hazzard_Perry" + "USS_Arleigh_Burke_IIa", + "PERRY" ], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "requirements": {}, - "carrier_names": [ - ], + "carrier_names": [], "helicopter_carrier_names": [ "Jeanne d'Arc" ], @@ -69,5 +69,5 @@ "OliverHazardPerryGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/france_2005_frenchpack.json b/resources/factions/france_2005_frenchpack.json index 2cfcff15..eee15cb0 100644 --- a/resources/factions/france_2005_frenchpack.json +++ b/resources/factions/france_2005_frenchpack.json @@ -3,66 +3,68 @@ "name": "France 2005 (Frenchpack)", "authors": "HerrTom", "description": "

French equipment using the Frenchpack, but without the Rafale mod.

", - "locales": ["fr_FR"], + "locales": [ + "fr_FR" + ], "aircrafts": [ - "M_2000C", - "Mirage_2000_5", - "SA342M", - "SA342L", - "SA342Mistral" + "Mirage 2000-5", + "Mirage 2000C", + "SA 342L Gazelle", + "SA 342M Gazelle", + "SA 342M Gazelle Mistral" ], "awacs": [ - "E_3A", - "E_2C" + "E-2C Hawkeye", + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "AMX_10RCR", - "AMX_10RCR_SEPAR", - "ERC_90", - "TRM_2000_PAMELA", - "VAB__50", - "VAB_T20_13", - "VAB_T20_13", - "VBL__50", - "VBL_AANF1", - "VBAE_CRAB", - "VBAE_CRAB_MMP", - "AMX_30B2", - "Leclerc_Serie_XXI", - "SAM_Roland_ADS", - "ATGM_VAB_Mephisto" + "AMX.30B2", + "Leclerc S\u00e9ries 2", + "Leclerc S\u00e9ries 2", + "Leclerc_XXI", + "Pamela", + "Panhard", + "Roland 2 (Marder Chassis)", + "VAB .50", + "VAB Mephisto", + "VAB T20/13", + "VAB T20/13", + "VBAE CRAB", + "VBAE CRAB MMP", + "VBL .50", + "VBL AANF1" ], "artillery_units": [ - "MLRS_M270_227mm", - "SPH_M109_Paladin_155mm" + "M109A6 Paladin", + "M270 Multiple Launch Rocket System" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger" ], "air_defenses": [ "RolandGenerator", "HawkGenerator" ], "aircraft_carrier": [ - "CVN_74_John_C__Stennis" + "Stennis" ], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "DDG_Arleigh_Burke_IIa" + "USS_Arleigh_Burke_IIa" ], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "requirements": { "frenchpack V3.5": "https://forums.eagle.ru/showthread.php?t=279974" @@ -80,5 +82,5 @@ "ArleighBurkeGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/gdr_1985.json b/resources/factions/gdr_1985.json index e68897bd..45eacc60 100644 --- a/resources/factions/gdr_1985.json +++ b/resources/factions/gdr_1985.json @@ -3,38 +3,41 @@ "name": "German Democratic Republic 1985", "authors": "Colonel Panic", "description": "

The German Democratic Republic in 1985.

", - "locales": ["de_DE"], + "locales": [ + "de_DE" + ], "doctrine": "coldwar", "aircrafts": [ - "MiG_21Bis", - "MiG_23MLD", - "Su_17M4", - "L_39ZA", - "Mi_8MT", - "Mi_24V" + "L-39ZA Albatros", + "Mi-24V Hind-E", + "Mi-24P Hind-F", + "Mi-8MTV2 Hip", + "MiG-21bis Fishbed-N", + "MiG-23MLD Flogger-K", + "Su-17M4 Fitter-K" ], "awacs": [], "tankers": [], "frontline_units": [ - "IFV_BMP_1", - "IFV_BMP_2", - "Scout_BRDM_2", - "APC_MTLB", - "MBT_T_55", - "MBT_T_72B" + "BMP-1", + "BMP-2", + "BRDM-2", + "MT-LB", + "T-55A", + "T-72B with Kontakt-1 ERA" ], "artillery_units": [ - "MLRS_BM_21_Grad_122mm", - "SPH_2S1_Gvozdika_122mm" + "2S1 Gvozdika", + "BM-21 Grad" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Infantry_AK_74_Rus", - "Infantry_RPG", - "Mortar_2B11_120mm" + "Infantry AK-74 Rus", + "Infantry RPG", + "Mortar 2B11 120mm" ], "air_defenses": [ "ColdWarFlakGenerator", @@ -55,12 +58,12 @@ "helicopter_carrier": [], "destroyers": [], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "requirements": {}, "carrier_names": [], "helicopter_carrier_names": [], "navy_generators": [], "has_jtac": true, - "jtac_unit": "Mi_8MT" -} + "jtac_unit": "Mi-8MTV2 Hip" +} \ No newline at end of file diff --git a/resources/factions/georgia_2008.json b/resources/factions/georgia_2008.json index f1937456..a2f0bbac 100644 --- a/resources/factions/georgia_2008.json +++ b/resources/factions/georgia_2008.json @@ -4,35 +4,36 @@ "authors": "HerrTom", "description": "

A faction that represents Georgia during the South Ossetian War. They will have a lot more aircraft than historically, and no real A2A capability.

", "aircrafts": [ - "L_39ZA", - "Su_25", - "Mi_8MT", - "Mi_24V", - "UH_1H" + "L-39ZA Albatros", + "Mi-24V Hind-E", + "Mi-24P Hind-F", + "Mi-8MTV2 Hip", + "Su-25 Frogfoot", + "UH-1H Iroquois" ], "frontline_units": [ - "APC_BTR_80", - "APC_MTLB", - "Scout_Cobra", - "IFV_BMP_1", - "IFV_BMP_2", - "MBT_T_72B", - "MBT_T_55", - "SAM_SA_13_Strela_10M3_Gopher_TEL" + "BMP-1", + "BMP-2", + "BTR-80", + "Cobra", + "MT-LB", + "SA-13 Gopher (9K35 Strela-10M3)", + "T-55A", + "T-72B with Kontakt-1 ERA" ], "artillery_units": [ - "MLRS_BM_21_Grad_122mm", - "SPH_2S1_Gvozdika_122mm", - "SPH_2S3_Akatsia_152mm" + "2S1 Gvozdika", + "2S3 Akatsiya", + "BM-21 Grad" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Paratrooper_AKS", - "Paratrooper_RPG_16", - "MANPADS_SA_18_Igla_S_Grouse" + "MANPADS SA-18 Igla-S \"Grouse\"", + "Paratrooper AKS", + "Paratrooper RPG-16" ], "air_defenses": [ "SA3Generator", @@ -46,9 +47,9 @@ "ZU23UralGenerator" ], "navy_generators": [ - "LaCombattanteIIGroupGenerator" + "LaCombattanteIIGroupGenerator" ], "requirements": {}, "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/germany_1940.json b/resources/factions/germany_1940.json index b18211c8..7617a90d 100644 --- a/resources/factions/germany_1940.json +++ b/resources/factions/germany_1940.json @@ -3,48 +3,43 @@ "name": "Germany 1940", "authors": "Khopa", "description": "

Germany 1940, Early german faction for Battle of France, or Battle of England.

", - "locales": ["de_DE"], + "locales": [ + "de_DE" + ], "aircrafts": [ - "FW_190A8", - "FW_190D9", - "Bf_109K_4", - "Ju_88A4" + "Bf 109 K-4 Kurf\u00fcrst", + "Fw 190 A-8 Anton", + "Fw 190 D-9 Dora", + "Ju 88 A-4" ], "frontline_units": [ - "Tk_PzIV_H", - "APC_Sd_Kfz_251_Halftrack", - "IFV_Sd_Kfz_234_2_Puma", - "AAA_8_8cm_Flak_18" - ], - "artillery_units": [ + "8.8 cm Flak 18", + "Panzerkampfwagen IV Ausf. H", + "Sd.Kfz.234/2 Puma", + "Sd.Kfz.251 \"Hanomag\"" ], + "artillery_units": [], "logistics_units": [ - "Truck_Opel_Blitz", - "LUV_Kubelwagen_82", - "Carrier_Sd_Kfz_7_Tractor", - "LUV_Kettenrad" + "LUV Kettenrad", + "LUV Kubelwagen 82", + "Sd.Kfz.7 Tractor", + "Truck Opel Blitz" ], "infantry_units": [ - "Infantry_Mauser_98" + "Infantry Mauser 98" ], "air_defenses": [ "FlakGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "destroyers": [], + "cruisers": [], "requirements": { "WW2 Asset Pack": "https://www.digitalcombatsimulator.com/en/products/other/wwii_assets_pack/" }, - "carrier_names": [ - ], - "helicopter_carrier_names": [ - ], + "carrier_names": [], + "helicopter_carrier_names": [], "navy_generators": [ "UBoatGroupGenerator", "SchnellbootGroupGenerator" @@ -53,4 +48,4 @@ "has_jtac": false, "doctrine": "ww2", "building_set": "ww2germany" -} +} \ No newline at end of file diff --git a/resources/factions/germany_1942.json b/resources/factions/germany_1942.json index ee8e1a03..ed8be28c 100644 --- a/resources/factions/germany_1942.json +++ b/resources/factions/germany_1942.json @@ -3,51 +3,46 @@ "name": "Germany 1942", "authors": "Khopa", "description": "

Germany 1942, is a faction that does not use the late war german units such as the Tiger tank, so it's a bit easier to perform CAS against them.

", - "locales": ["de_DE"], + "locales": [ + "de_DE" + ], "aircrafts": [ - "FW_190A8", - "FW_190D9", - "Bf_109K_4", - "Ju_88A4" + "Bf 109 K-4 Kurf\u00fcrst", + "Fw 190 A-8 Anton", + "Fw 190 D-9 Dora", + "Ju 88 A-4" ], "frontline_units": [ - "Tk_PzIV_H", - "APC_Sd_Kfz_251_Halftrack", - "IFV_Sd_Kfz_234_2_Puma", - "SPG_Jagdpanzer_IV", - "AAA_8_8cm_Flak_18", - "SPG_Sturmpanzer_IV_Brummbar" - ], - "artillery_units": [ + "8.8 cm Flak 18", + "Jagdpanzer IV", + "Panzerkampfwagen IV Ausf. H", + "Sd.Kfz.234/2 Puma", + "Sd.Kfz.251 \"Hanomag\"", + "Sturmpanzer IV Brummb\u00e4r" ], + "artillery_units": [], "logistics_units": [ - "Truck_Opel_Blitz", - "LUV_Kubelwagen_82", - "Carrier_Sd_Kfz_7_Tractor", - "LUV_Kettenrad" + "LUV Kettenrad", + "LUV Kubelwagen 82", + "Sd.Kfz.7 Tractor", + "Truck Opel Blitz" ], "infantry_units": [ - "Infantry_Mauser_98" + "Infantry Mauser 98" ], "air_defenses": [ "FlakGenerator", "FreyaGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "destroyers": [], + "cruisers": [], "requirements": { "WW2 Asset Pack": "https://www.digitalcombatsimulator.com/en/products/other/wwii_assets_pack/" }, - "carrier_names": [ - ], - "helicopter_carrier_names": [ - ], + "carrier_names": [], + "helicopter_carrier_names": [], "navy_generators": [ "UBoatGroupGenerator", "SchnellbootGroupGenerator" @@ -56,4 +51,4 @@ "has_jtac": false, "doctrine": "ww2", "building_set": "ww2germany" -} +} \ No newline at end of file diff --git a/resources/factions/germany_1944.json b/resources/factions/germany_1944.json index f9b68cc9..535ec070 100644 --- a/resources/factions/germany_1944.json +++ b/resources/factions/germany_1944.json @@ -3,59 +3,54 @@ "name": "Germany 1944", "authors": "Khopa", "description": "

Late war Germany with access to all the late-war ground units such as the Tiger and Tiger II tanks.

", - "locales": ["de_DE"], + "locales": [ + "de_DE" + ], "aircrafts": [ - "FW_190A8", - "FW_190D9", - "Bf_109K_4", - "Ju_88A4" + "Bf 109 K-4 Kurf\u00fcrst", + "Fw 190 A-8 Anton", + "Fw 190 D-9 Dora", + "Ju 88 A-4" ], "frontline_units": [ - "MT_Pz_Kpfw_V_Panther_Ausf_G", - "Tk_PzIV_H", - "HT_Pz_Kpfw_VI_Tiger_I", - "HT_Pz_Kpfw_VI_Ausf__B_Tiger_II", - "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", - "SPG_Sturmpanzer_IV_Brummbar" - ], - "artillery_units": [ + "8.8 cm Flak 18", + "8.8 cm Flak 41", + "Jagdpanther G1", + "Jagdpanzer IV", + "Panzerkampfwagen IV Ausf. H", + "Panzerkampfwagen Tiger Ausf. B Tiger II", + "Panzerkampfwagen V Panther Ausf. G", + "Panzerkampfwagen VI Tiger Ausf. E", + "Sd.Kfz.184 Elefant", + "Sd.Kfz.234/2 Puma", + "Sd.Kfz.251 \"Hanomag\"", + "Sturmgesch\u00fctz III Ausf. G", + "Sturmgesch\u00fctz IV", + "Sturmpanzer IV Brummb\u00e4r" ], + "artillery_units": [], "logistics_units": [ - "Truck_Opel_Blitz", - "LUV_Kubelwagen_82", - "Carrier_Sd_Kfz_7_Tractor", - "LUV_Kettenrad" + "LUV Kettenrad", + "LUV Kubelwagen 82", + "Sd.Kfz.7 Tractor", + "Truck Opel Blitz" ], "infantry_units": [ - "Infantry_Mauser_98" + "Infantry Mauser 98" ], "air_defenses": [ "FlakGenerator", "FreyaGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "destroyers": [], + "cruisers": [], "requirements": { "WW2 Asset Pack": "https://www.digitalcombatsimulator.com/en/products/other/wwii_assets_pack/" }, - "carrier_names": [ - ], - "helicopter_carrier_names": [ - ], + "carrier_names": [], + "helicopter_carrier_names": [], "navy_generators": [ "SchnellbootGroupGenerator" ], @@ -67,4 +62,4 @@ "has_jtac": false, "doctrine": "ww2", "building_set": "ww2germany" -} +} \ No newline at end of file diff --git a/resources/factions/germany_1944_free.json b/resources/factions/germany_1944_free.json index 676eae2f..14b487b0 100644 --- a/resources/factions/germany_1944_free.json +++ b/resources/factions/germany_1944_free.json @@ -3,49 +3,41 @@ "name": "Germany 1944 (Free)", "authors": "Khopa", "description": "

WW2 germany faction that does not require the WW2 asset pack.

", - "locales": ["de_DE"], + "locales": [ + "de_DE" + ], "aircrafts": [ - "FW_190A8", - "FW_190D9", - "Bf_109K_4" + "Bf 109 K-4 Kurf\u00fcrst", + "Fw 190 A-8 Anton", + "Fw 190 D-9 Dora" ], "frontline_units": [ - "Tk_PzIV_H", - "APC_Sd_Kfz_251_Halftrack", - "AAA_8_8cm_Flak_18" - ], - "artillery_units": [ + "8.8 cm Flak 18", + "Panzerkampfwagen IV Ausf. H", + "Sd.Kfz.251 \"Hanomag\"" ], + "artillery_units": [], "logistics_units": [ - "Truck_Opel_Blitz" + "Truck Opel Blitz" ], "infantry_units": [ - "Infantry_AK_74_Rus" + "Infantry AK-74 Rus" ], "air_defenses": [ "Flak18Generator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], - "requirements": { - }, - "carrier_names": [ - ], - "helicopter_carrier_names": [ - ], - "navy_generators": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "destroyers": [], + "cruisers": [], + "requirements": {}, + "carrier_names": [], + "helicopter_carrier_names": [], + "navy_generators": [], "navy_group_count": 0, - "missiles": [ - ], + "missiles": [], "missiles_group_count": 0, "has_jtac": false, "doctrine": "ww2", "building_set": "ww2free" -} +} \ No newline at end of file diff --git a/resources/factions/germany_1990.json b/resources/factions/germany_1990.json index f1368613..588a4a13 100644 --- a/resources/factions/germany_1990.json +++ b/resources/factions/germany_1990.json @@ -3,39 +3,40 @@ "name": "Germany 1990", "authors": "Khopa", "description": "

1990s reunited Germany.

", - "locales": ["de_DE"], + "locales": [ + "de_DE" + ], "aircrafts": [ - "MiG_29G", - "Tornado_IDS", - "F_4E", - "UH_1H", - "SA342M", - "SA342L" + "F-4F Phantom II", + "MiG-29G Fulcrum-A", + "SA 342L Gazelle", + "SA 342M Gazelle", + "Tornado IDS", + "UH-1D Iroquois" ], "awacs": [ - "E_3A" + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "APC_TPz_Fuchs", - "MBT_Leopard_1A3", - "MBT_Leopard_2A4", - "IFV_Marder", - "SPAAA_Gepard" - ], - "artillery_units": [ + "Flakpanzer Gepard", + "Leopard 1A3", + "Leopard 2A4", + "Marder 1A3", + "TPz Fuchs" ], + "artillery_units": [], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "Mortar_2B11_120mm", - "MANPADS_Stinger" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger", + "Mortar 2B11 120mm" ], "air_defenses": [ "GepardGenerator", @@ -46,25 +47,21 @@ "ewrs": [ "PatriotEwrGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], "destroyers": [ - "FFG_Oliver_Hazzard_Perry" + "PERRY" ], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "requirements": {}, - "carrier_names": [ - ], - "helicopter_carrier_names": [ - ], + "carrier_names": [], + "helicopter_carrier_names": [], "navy_generators": [ "OliverHazardPerryGroupGenerator", "LaCombattanteIIGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/greece_2005.json b/resources/factions/greece_2005.json index 0356a339..9a4dc897 100644 --- a/resources/factions/greece_2005.json +++ b/resources/factions/greece_2005.json @@ -3,53 +3,59 @@ "name": "Greece 2005", "authors": "Malakhit", "description": "

Hellenic army in the mid/late 2000s.

", - "locales": ["el_GR"], + "locales": [ + "el_GR" + ], "aircrafts": [ - "F_16C_50", - "F_4E", - "M_2000C", - "Mirage_2000_5", - "UH_1H", - "AH_64A" + "AH-64A Apache", + "C-130", + "F-16CM Fighting Falcon (Block 50)", + "F-4E Phantom II", + "Mirage 2000-5", + "Mirage 2000C", + "UH-1H Iroquois" + ], + "awacs": [ + "E-3A" ], "tankers": [ - "KC130" + "KC-130" ], "frontline_units": [ - "MBT_Leopard_2A4", - "MBT_Leopard_1A3", - "MBT_M60A3_Patton", - "Scout_HMMWV", - "ATGM_HMMWV", - "APC_M113", - "IFV_BMP_1" + "BMP-1", + "Leopard 1A3", + "Leopard 2A4", + "M1043 HMMWV (M2 HMG)", + "M1045 HMMWV (BGM-71 TOW)", + "M113", + "M60A3 \"Patton\"" ], "artillery_units": [ - "SPH_M109_Paladin_155mm", - "MLRS_M270_227mm" + "M109A6 Paladin", + "M270 Multiple Launch Rocket System" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger" ], "air_defenses": [ "HawkGenerator", + "PatriotGenerator", "SA8Generator", "SA10Generator", "SA15Generator", "ZU23Generator" ], "ewrs": [ - "HawkEwrGenerator", "FlatFaceGenerator" ], "navy_generators": [ - "LaCombattanteIIGroupGenerator" + "LaCombattanteIIGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/india_2010.json b/resources/factions/india_2010.json index b91aab32..9ef3630d 100644 --- a/resources/factions/india_2010.json +++ b/resources/factions/india_2010.json @@ -3,41 +3,43 @@ "name": "India 2010", "authors": "Khopa", "description": "

Indian faction in the late 2000s.

", - "locales": ["en_IN"], + "locales": [ + "en_IN" + ], "aircrafts": [ - "Mirage_2000_5", - "M_2000C", - "MiG_27K", - "MiG_21Bis", - "MiG_29S", - "Su_30", - "AH_64A", - "Mi_8MT" + "AH-64A Apache", + "Mi-8MTV2 Hip", + "MiG-21bis Fishbed-N", + "MiG-27K Flogger-J2", + "MiG-29S Fulcrum-C", + "Mirage 2000-5", + "Mirage 2000C", + "Su-30 Flanker-C" ], "awacs": [ - "A_50" + "A-50" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "MBT_T_90", - "MBT_T_72B", - "IFV_BMP_2", - "SAM_SA_19_Tunguska_Grison" + "BMP-2", + "SA-19 Grison (2K22 Tunguska)", + "T-72B with Kontakt-1 ERA", + "T-90A" ], "artillery_units": [ - "MLRS_9K57_Uragan_BM_27_220mm", - "SPH_2S19_Msta_152mm" + "2S19 Msta-S", + "BM-27 Uragan" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Infantry_M4", - "Paratrooper_RPG_16", - "MANPADS_SA_18_Igla_S_Grouse" + "Infantry M4", + "MANPADS SA-18 Igla-S \"Grouse\"", + "Paratrooper RPG-16" ], "air_defenses": [ "SA3Generator", @@ -57,17 +59,14 @@ "TallRackGenerator" ], "aircraft_carrier": [ - "CV_1143_5_Admiral_Kuznetsov" - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ + "KUZNECOW" ], + "helicopter_carrier": [], + "helicopter_carrier_names": [], "destroyers": [ - "Frigate_1135M_Rezky" - ], - "cruisers": [ + "REZKY" ], + "cruisers": [], "requirements": {}, "carrier_names": [ "INS Vikramaditya" @@ -77,5 +76,5 @@ "MolniyaGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/insurgents.json b/resources/factions/insurgents.json index cbf7b3b3..540d73d9 100644 --- a/resources/factions/insurgents.json +++ b/resources/factions/insurgents.json @@ -3,28 +3,27 @@ "name": "Insurgents", "authors": "Khopa", "description": "

Insurgents faction.

", - "aircrafts": [ - ], + "aircrafts": [], "frontline_units": [ - "Scout_Cobra", - "APC_MTLB", - "Scout_BRDM_2", - "LT_PT_76", - "SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375" + "BRDM-2", + "Cobra", + "MT-LB", + "PT-76", + "ZU-23 on Ural-375" ], "artillery_units": [ - "MLRS_BM_21_Grad_122mm", - "SPH_2S19_Msta_152mm" + "2S19 Msta-S", + "BM-21 Grad" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Insurgent_AK_74", - "Infantry_RPG", - "Mortar_2B11_120mm", - "MANPADS_SA_18_Igla_Grouse" + "Infantry RPG", + "Insurgent AK-74", + "MANPADS SA-18 Igla \"Grouse\"", + "Mortar 2B11 120mm" ], "air_defenses": [ "SA9Generator", @@ -32,4 +31,4 @@ "ZU23Generator", "ZU23UralInsurgentGenerator" ] -} +} \ No newline at end of file diff --git a/resources/factions/insurgents_hard.json b/resources/factions/insurgents_hard.json index 14825184..11aa5e5f 100644 --- a/resources/factions/insurgents_hard.json +++ b/resources/factions/insurgents_hard.json @@ -3,33 +3,32 @@ "name": "Insurgents (Hard)", "authors": "Khopa", "description": "

Insurgents faction.

", - "aircrafts": [ - ], + "aircrafts": [], "frontline_units": [ - "ATGM_HMMWV", - "Scout_HMMWV", - "Scout_BRDM_2", - "APC_BTR_80", - "APC_BTR_RD", - "LT_PT_76", - "IFV_BMP_1", - "MBT_T_55", - "SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375", - "SPAAA_ZSU_57_2" + "BMP-1", + "BRDM-2", + "BTR-80", + "BTR-D", + "M1043 HMMWV (M2 HMG)", + "M1045 HMMWV (BGM-71 TOW)", + "PT-76", + "T-55A", + "ZSU-57-2 'Sparka'", + "ZU-23 on Ural-375" ], "artillery_units": [ - "MLRS_BM_21_Grad_122mm", - "SPH_2S19_Msta_152mm" + "2S19 Msta-S", + "BM-21 Grad" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Insurgent_AK_74", - "Infantry_RPG", - "Mortar_2B11_120mm", - "MANPADS_SA_18_Igla_Grouse" + "Infantry RPG", + "Insurgent AK-74", + "MANPADS SA-18 Igla \"Grouse\"", + "Mortar 2B11 120mm" ], "air_defenses": [ "SA9Generator", @@ -37,4 +36,4 @@ "ZU23Generator", "ZU23UralInsurgentGenerator" ] -} +} \ No newline at end of file diff --git a/resources/factions/insurgents_modded.json b/resources/factions/insurgents_modded.json index cca23cf7..4e39c517 100644 --- a/resources/factions/insurgents_modded.json +++ b/resources/factions/insurgents_modded.json @@ -3,27 +3,26 @@ "name": "Insurgents (Modded)", "authors": "Khopa", "description": "

Insurgents faction using the modded insurgents units from the frenchpack mods.

", - "aircrafts": [ - ], + "aircrafts": [], "frontline_units": [ - "DIM__TOYOTA_BLUE", - "DIM__TOYOTA_DESERT", - "DIM__TOYOTA_GREEN", - "DIM__KAMIKAZE", - "SPAAA_ZU_23_2_Insurgent_Mounted_Ural_375" + "DIM' KAMIKAZE", + "DIM' TOYOTA BLUE", + "DIM' TOYOTA DESERT", + "DIM' TOYOTA GREEN", + "ZU-23 on Ural-375" ], "artillery_units": [ - "MLRS_BM_21_Grad_122mm", - "SPH_2S19_Msta_152mm" + "2S19 Msta-S", + "BM-21 Grad" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Insurgent_AK_74", - "Infantry_RPG", - "MANPADS_SA_18_Igla_Grouse" + "Infantry RPG", + "Insurgent AK-74", + "MANPADS SA-18 Igla \"Grouse\"" ], "air_defenses": [ "SA9Generator", @@ -33,4 +32,4 @@ "requirements": { "frenchpack V3.5": "https://forums.eagle.ru/showthread.php?t=279974" } -} +} \ No newline at end of file diff --git a/resources/factions/iran_1988.json b/resources/factions/iran_1988.json index e21e1b61..3fd5e69b 100644 --- a/resources/factions/iran_1988.json +++ b/resources/factions/iran_1988.json @@ -3,43 +3,45 @@ "name": "Iran 1988", "authors": "Malakhit", "description": "

Iran at the end of the Iran-Iraq war

", - "locales": ["fa_IR"], + "locales": [ + "fa_IR" + ], "aircrafts": [ - "MiG_21Bis", - "F_4E", - "F_5E_3", - "F_14A_135_GR", - "AH_1W" + "AH-1J SeaCobra", + "F-14A Tomcat (Block 135-GR Late)", + "F-4E Phantom II", + "F-5E Tiger II", + "MiG-21bis Fishbed-N" ], "awacs": [ - "A_50" + "A-50" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "APC_M113", - "APC_BTR_80", - "MBT_M60A3_Patton", - "MBT_Chieftain_Mk_3", - "IFV_BMP_1", - "SPAAA_ZSU_23_4_Shilka_Gun_Dish", - "SPAAA_ZSU_57_2", - "SPAAA_ZU_23_2_Mounted_Ural_375" + "Chieftain Mk.3", + "BMP-1", + "BTR-80", + "M113", + "M60A3 \"Patton\"", + "ZSU-23-4 Shilka", + "ZSU-57-2 'Sparka'", + "ZU-23 on Ural-375" ], "artillery_units": [ - "MLRS_BM_21_Grad_122mm", - "SPH_2S1_Gvozdika_122mm" + "2S1 Gvozdika", + "BM-21 Grad" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Paratrooper_AKS", - "Insurgent_AK_74", - "Infantry_RPG", - "MANPADS_SA_18_Igla_S_Grouse" + "Infantry RPG", + "Insurgent AK-74", + "MANPADS SA-18 Igla-S \"Grouse\"", + "Paratrooper AKS" ], "air_defenses": [ "HawkGenerator", @@ -53,21 +55,17 @@ "ewrs": [ "TallRackGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "helicopter_carrier_names": [], "destroyers": [ - "Frigate_1135M_Rezky" + "REZKY" ], "cruisers": [ - "Corvette_1241_1_Molniya" + "MOLNIYA" ], "requirements": {}, - "carrier_names": [ - ], + "carrier_names": [], "missiles": [ "ScudGenerator" ], @@ -81,5 +79,5 @@ "MolniyaGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/iran_2015.json b/resources/factions/iran_2015.json index f6c8cdd7..31837abc 100644 --- a/resources/factions/iran_2015.json +++ b/resources/factions/iran_2015.json @@ -3,49 +3,52 @@ "name": "Iran 2015", "authors": "Khopa", "description": "

Iranian 2010s faction

", - "locales": ["fa_IR"], + "locales": [ + "fa_IR" + ], "aircrafts": [ - "MiG_21Bis", - "MiG_29A", - "F_4E", - "F_5E_3", - "F_14A_135_GR", - "Su_17M4", - "Su_24M", - "Su_25", - "Su_25T", - "Mi_28N", - "Mi_24V" + "F-14A Tomcat (Block 135-GR Late)", + "F-4E Phantom II", + "F-5E Tiger II", + "Mi-24V Hind-E", + "Mi-24P Hind-F", + "Mi-28N Havoc", + "MiG-21bis Fishbed-N", + "MiG-29A Fulcrum-A", + "Su-22M4 Fitter-K", + "Su-24MK Fencer-D", + "Su-25 Frogfoot", + "Su-25T Frogfoot" ], "awacs": [ - "A_50" + "A-50" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "APC_M113", - "APC_BTR_80", - "MBT_M60A3_Patton", - "MBT_Chieftain_Mk_3", - "IFV_BMP_1", - "MBT_T_72B", - "SPAAA_ZSU_23_4_Shilka_Gun_Dish", - "SPAAA_ZSU_57_2" + "Chieftain Mk.3", + "BMP-1", + "BTR-80", + "M113", + "M60A3 \"Patton\"", + "T-72B with Kontakt-1 ERA", + "ZSU-23-4 Shilka", + "ZSU-57-2 'Sparka'" ], "artillery_units": [ - "MLRS_BM_21_Grad_122mm", - "SPH_2S19_Msta_152mm" + "2S19 Msta-S", + "BM-21 Grad" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Paratrooper_AKS", - "Insurgent_AK_74", - "Paratrooper_RPG_16", - "MANPADS_SA_18_Igla_S_Grouse" + "Insurgent AK-74", + "MANPADS SA-18 Igla-S \"Grouse\"", + "Paratrooper AKS", + "Paratrooper RPG-16" ], "air_defenses": [ "HawkGenerator", @@ -62,21 +65,17 @@ "ewrs": [ "TallRackGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "helicopter_carrier_names": [], "destroyers": [ - "Frigate_1135M_Rezky" + "REZKY" ], "cruisers": [ - "Corvette_1241_1_Molniya" + "MOLNIYA" ], "requirements": {}, - "carrier_names": [ - ], + "carrier_names": [], "missiles": [ "ScudGenerator" ], @@ -91,5 +90,5 @@ "LaCombattanteIIGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/iraq_1991.json b/resources/factions/iraq_1991.json index ecb9579d..01f2acc6 100644 --- a/resources/factions/iraq_1991.json +++ b/resources/factions/iraq_1991.json @@ -4,51 +4,52 @@ "authors": "Hawkmoon", "description": "

Iraq forces during desert Storm

", "aircrafts": [ - "MiG_19P", - "MiG_21Bis", - "MiG_23MLD", - "MiG_25PD", - "Su_17M4", - "Mi_8MT", - "Su-25", - "Su-24M", - "Tu_22M3", - "L_39ZA", - "Mi_24V", - "MiG_29A", - "SA342M" + "L-39ZA Albatros", + "Mi-24V Hind-E", + "Mi-24P Hind-F", + "Mi-8MTV2 Hip", + "MiG-19P Farmer-B", + "MiG-21bis Fishbed-N", + "MiG-23ML Flogger-G", + "MiG-25PD Foxbat-E", + "MiG-29A Fulcrum-A", + "SA 342M Gazelle", + "Su-22M4 Fitter-K", + "Su-24M Fencer-D", + "Su-25 Frogfoot", + "Tu-22M3 Backfire-C" ], "awacs": [ - "A_50" + "A-50" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "IFV_BMP_1", - "APC_MTLB", - "MBT_T_55", - "MBT_T_72B", - "MBT_Chieftain_Mk_3", - "APC_BTR_80", - "Scout_BRDM_2", - "LT_PT_76", - "SPH_2S1_Gvozdika_122mm", - "SPAAA_ZSU_57_2", - "SPAAA_ZSU_23_4_Shilka_Gun_Dish" + "2S1 Gvozdika", + "Chieftain Mk.3", + "BMP-1", + "BRDM-2", + "BTR-80", + "MT-LB", + "PT-76", + "T-55A", + "T-72B with Kontakt-1 ERA", + "ZSU-23-4 Shilka", + "ZSU-57-2 'Sparka'" ], "artillery_units": [ - "MLRS_BM_21_Grad_122mm" + "BM-21 Grad" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Paratrooper_AKS", - "Infantry_AK_74_Rus", - "Paratrooper_RPG_16", - "MANPADS_SA_18_Igla_Grouse" + "Infantry AK-74 Rus", + "MANPADS SA-18 Igla \"Grouse\"", + "Paratrooper AKS", + "Paratrooper RPG-16" ], "air_defenses": [ "ColdWarFlakGenerator", @@ -70,20 +71,14 @@ "ScudGenerator" ], "missiles_group_count": 1, - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "helicopter_carrier_names": [], + "destroyers": [], + "cruisers": [], "requirements": {}, - "carrier_names": [ - ], + "carrier_names": [], "navy_generators": [ "GrishaGroupGenerator" ] -} +} \ No newline at end of file diff --git a/resources/factions/israel_1948.json b/resources/factions/israel_1948.json index e6282682..0d40cb1d 100644 --- a/resources/factions/israel_1948.json +++ b/resources/factions/israel_1948.json @@ -3,51 +3,45 @@ "name": "Israel 1948", "authors": "Khopa", "description": "

Israel during the 1948 Arab-Israeli war.

", - "locales": ["he_IL"], + "locales": [ + "he_IL" + ], "aircrafts": [ - "SpitfireLFMkIXCW", - "SpitfireLFMkIX", - "P_51D", - "P_51D_30_NA", - "Bf_109K_4", - "B_17G" + "B-17G Flying Fortress", + "Bf 109 K-4 Kurf\u00fcrst", + "P-51D-25-NA Mustang", + "P-51D-30-NA Mustang", + "Spitfire LF Mk IX", + "Spitfire LF Mk IX (Clipped Wings)" ], "frontline_units": [ - "MT_M4A4_Sherman_Firefly", - "APC_M2A1_Halftrack", - "Tk_M4_Sherman", - "Car_M8_Greyhound_Armored", - "AAA_Bofors_40mm" - ], - "artillery_units": [ + "Bofors 40 mm Gun", + "M2A1 Half-Track", + "M4A2(75) Sherman", + "M4A4 Sherman Firefly", + "M8 Greyhound Light Armored Car" ], + "artillery_units": [], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_SMLE_No_4_Mk_1" + "Infantry SMLE No.4 Mk-1" ], "air_defenses": [ "BoforsGenerator", "EarlyColdWarFlakGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "destroyers": [], + "cruisers": [], "requirements": { "WW2 Asset Pack": "https://www.digitalcombatsimulator.com/en/products/other/wwii_assets_pack/" }, - "carrier_names": [ - ], - "helicopter_carrier_names": [ - ], - "navy_generators": [ - ], + "carrier_names": [], + "helicopter_carrier_names": [], + "navy_generators": [], "has_jtac": false, "doctrine": "ww2" -} +} \ No newline at end of file diff --git a/resources/factions/israel_1973.json b/resources/factions/israel_1973.json index 6b852dd9..f2e05b05 100644 --- a/resources/factions/israel_1973.json +++ b/resources/factions/israel_1973.json @@ -3,34 +3,35 @@ "name": "Israel 1973", "authors": "Khopa", "description": "

Israel during the 1973 Yom Kippur War.

", - "locales": ["he_IL"], + "locales": [ + "he_IL" + ], "aircrafts": [ - "F_4E", - "A_4E_C", - "UH_1H" + "A-4E Skyhawk", + "F-4E Phantom II", + "UH-1H Iroquois" ], "awacs": [ - "E_2C" + "E-2C Hawkeye" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "Tk_M4_Sherman", - "APC_M2A1_Halftrack", - "MBT_M60A3_Patton", - "APC_M113", - "SAM_Chaparral_M48" - ], - "artillery_units": [ + "M113", + "M2A1 Half-Track", + "M48 Chaparral", + "M4A2(75) Sherman", + "M60A3 \"Patton\"" ], + "artillery_units": [], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249" + "Infantry M249", + "Infantry M4" ], "air_defenses": [ "BoforsGenerator", @@ -41,23 +42,16 @@ "ewrs": [ "HawkEwrGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "destroyers": [], + "cruisers": [], "requirements": { "Community A-4E": "https://heclak.github.io/community-a4e-c/" }, - "carrier_names": [ - ], - "helicopter_carrier_names": [ - ], - "navy_generators": [ - ], + "carrier_names": [], + "helicopter_carrier_names": [], + "navy_generators": [], "has_jtac": false, "doctrine": "coldwar" -} +} \ No newline at end of file diff --git a/resources/factions/israel_1982.json b/resources/factions/israel_1982.json index 2d8323d0..09514446 100644 --- a/resources/factions/israel_1982.json +++ b/resources/factions/israel_1982.json @@ -3,37 +3,38 @@ "name": "Israel 1982", "authors": "Khopa", "description": "

Israel during the 1982 war with Lebanon.

", - "locales": ["he_IL"], + "locales": [ + "he_IL" + ], "aircrafts": [ - "F_4E", - "A_4E_C", - "F_15C", - "F_16A", - "F_16C_50", - "UH_1H", - "AH_1W" + "A-4E Skyhawk", + "AH-1W SuperCobra", + "F-15C Eagle", + "F-16A", + "F-16CM Fighting Falcon (Block 50)", + "F-4E Phantom II", + "UH-1H Iroquois" ], "awacs": [ - "E_2C" + "E-2C Hawkeye" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "APC_M113", - "MBT_M60A3_Patton", - "MBT_Merkava_IV", - "SPAAA_Vulcan_M163" - ], - "artillery_units": [ + "M113", + "M163 Vulcan Air Defense System", + "M60A3 \"Patton\"", + "Merkava Mk IV" ], + "artillery_units": [], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249" + "Infantry M249", + "Infantry M4" ], "air_defenses": [ "ChaparralGenerator", @@ -43,23 +44,16 @@ "ewrs": [ "HawkEwrGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "destroyers": [], + "cruisers": [], "requirements": { "Community A-4E": "https://heclak.github.io/community-a4e-c/" }, - "carrier_names": [ - ], - "helicopter_carrier_names": [ - ], - "navy_generators": [ - ], + "carrier_names": [], + "helicopter_carrier_names": [], + "navy_generators": [], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/israel_2000.json b/resources/factions/israel_2000.json index 57d2c842..565a9e96 100644 --- a/resources/factions/israel_2000.json +++ b/resources/factions/israel_2000.json @@ -3,41 +3,43 @@ "name": "Israel 2000", "authors": "Khopa", "description": "

Modern Israeli faction.

", - "locales": ["he_IL"], + "locales": [ + "he_IL" + ], "aircrafts": [ - "F_4E", - "F_15C", - "F_15E", - "F_16C_50", - "UH_1H", - "AH_1W", - "AH_64D" + "AH-1W SuperCobra", + "AH-64D Apache Longbow", + "F-15C Eagle", + "F-15E Strike Eagle", + "F-16CM Fighting Falcon (Block 50)", + "F-4E Phantom II", + "UH-1H Iroquois" ], "awacs": [ - "E_2C" + "E-2C Hawkeye" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "APC_M113", - "Scout_HMMWV", - "ATGM_HMMWV", - "MBT_Merkava_IV", - "SPAAA_Vulcan_M163" + "M1043 HMMWV (M2 HMG)", + "M1045 HMMWV (BGM-71 TOW)", + "M113", + "M163 Vulcan Air Defense System", + "Merkava Mk IV" ], "artillery_units": [ - "SPH_M109_Paladin_155mm", - "MLRS_M270_227mm" + "M109A6 Paladin", + "M270 Multiple Launch Rocket System" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger" ], "air_defenses": [ "ChaparralGenerator", @@ -48,23 +50,16 @@ "ewrs": [ "HawkEwrGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], - "requirements": { - }, - "carrier_names": [ - ], - "helicopter_carrier_names": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "destroyers": [], + "cruisers": [], + "requirements": {}, + "carrier_names": [], + "helicopter_carrier_names": [], "navy_generators": [ "ArleighBurkeGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/israel_2012.json b/resources/factions/israel_2012.json index 19512551..e9656488 100644 --- a/resources/factions/israel_2012.json +++ b/resources/factions/israel_2012.json @@ -3,42 +3,44 @@ "name": "Israel 2012'ish", "authors": "Headiii", "description": "

A more modern Israeli faction with fictional Imports.

", - "locales": ["he_IL"], + "locales": [ + "he_IL" + ], "aircrafts": [ - "A_10C", - "F_15C", - "F_15E", - "F_16C_50", - "FA_18C_hornet", - "M_2000C", - "UH_1H", - "AH_64D" + "A-10C Thunderbolt II (Suite 3)", + "AH-64D Apache Longbow", + "F-15C Eagle", + "F-15E Strike Eagle", + "F-16CM Fighting Falcon (Block 50)", + "F/A-18C Hornet (Lot 20)", + "Mirage 2000C", + "UH-1H Iroquois" ], "awacs": [ - "E_2C" + "E-2C Hawkeye" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "APC_M113", - "Scout_HMMWV", - "ATGM_HMMWV", - "MBT_Merkava_IV", - "SPAAA_Vulcan_M163" + "M1043 HMMWV (M2 HMG)", + "M1045 HMMWV (BGM-71 TOW)", + "M113", + "M163 Vulcan Air Defense System", + "Merkava Mk IV" ], "artillery_units": [ - "SPH_M109_Paladin_155mm", - "MLRS_M270_227mm" + "M109A6 Paladin", + "M270 Multiple Launch Rocket System" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger" ], "air_defenses": [ "ChaparralGenerator", @@ -49,52 +51,45 @@ "ewrs": [ "HawkEwrGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], - "requirements": { - }, - "carrier_names": [ - ], - "helicopter_carrier_names": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "destroyers": [], + "cruisers": [], + "requirements": {}, + "carrier_names": [], + "helicopter_carrier_names": [], "navy_generators": [ "ArleighBurkeGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper", + "jtac_unit": "MQ-9 Reaper", "liveries_overrides": { - "A_10C": [ + "A-10C Thunderbolt II (Suite 3)": [ "Fictional Israel 115 Sqn Flying Dragon" ], - "F_15C": [ - "390th Fighter SQN" + "F-15C Eagle": [ + "390th Fighter SQN" ], - "F_15E":[ - "IDF No 69 Hammers Squadron" + "F-15E Strike Eagle": [ + "IDF No 69 Hammers Squadron" ], - "F_16C_50": [ + "F-16CM Fighting Falcon (Block 50)": [ "IAF_101st_squadron", "IAF_110th_Squadron", "IAF_115th_Aggressors_Squadron", "IAF_117th_Squadron" ], - "UH_1H": [ + "UH-1H Iroquois": [ "Israel Army" ], - "AH_64D":[ + "AH-64D Apache Longbow": [ "ah-64_d_isr" ], - "FA_18C_hornet": [ + "F/A-18C Hornet (Lot 20)": [ "Fictional Israel Air Force" ], - "M_2000C": [ + "Mirage 2000C": [ "UAE Air Force" ] } -} +} \ No newline at end of file diff --git a/resources/factions/italy_1990.json b/resources/factions/italy_1990.json index 20618885..f528a81b 100644 --- a/resources/factions/italy_1990.json +++ b/resources/factions/italy_1990.json @@ -3,35 +3,37 @@ "name": "Italy 1990", "authors": "Khopa", "description": "

Italy in the 90s.

", - "locales": ["it_IT"], + "locales": [ + "it_IT" + ], "aircrafts": [ - "Tornado_IDS", - "AV8BNA", - "UH_1H", - "AH_1W" + "AH-1W SuperCobra", + "AV-8B Harrier II Night Attack", + "Tornado IDS", + "UH-1H Iroquois" ], "awacs": [ - "E_3A" + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "MBT_Leopard_1A3", - "APC_M113", - "SAM_Avenger__Stinger" + "Leopard 1A3", + "M1097 Heavy HMMWV Avenger", + "M113" ], "artillery_units": [ - "SPH_M109_Paladin_155mm" + "M109A6 Paladin" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger" ], "air_defenses": [ "AvengerGenerator", @@ -40,21 +42,18 @@ "ewrs": [ "HawkEwrGenerator" ], - "aircraft_carrier": [ - ], + "aircraft_carrier": [], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "FFG_Oliver_Hazzard_Perry" + "PERRY" ], "cruisers": [ - "CG_Ticonderoga" - ], - "requirements": { - }, - "carrier_names": [ + "TICONDEROG" ], + "requirements": {}, + "carrier_names": [], "helicopter_carrier_names": [ "Giuseppe Garibaldi", "Cavour" @@ -63,5 +62,5 @@ "OliverHazardPerryGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/italy_1990_mb339.json b/resources/factions/italy_1990_mb339.json index 7700704e..8ffb80ac 100644 --- a/resources/factions/italy_1990_mb339.json +++ b/resources/factions/italy_1990_mb339.json @@ -3,36 +3,38 @@ "name": "Italy 1990 (With MB339)", "authors": "Khopa", "description": "

Italy in the 90s, with the MB339 mod.

", - "locales": ["it_IT"], + "locales": [ + "it_IT" + ], "aircrafts": [ - "Tornado_IDS", - "AV8BNA", - "MB_339PAN", - "UH_1H", - "AH_1W" + "AH-1W SuperCobra", + "AV-8B Harrier II Night Attack", + "MB-339PAN", + "Tornado IDS", + "UH-1H Iroquois" ], "awacs": [ - "E_3A" + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "MBT_Leopard_1A3", - "APC_M113", - "SAM_Avenger__Stinger" + "Leopard 1A3", + "M1097 Heavy HMMWV Avenger", + "M113" ], "artillery_units": [ - "SPH_M109_Paladin_155mm" + "M109A6 Paladin" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger" ], "air_defenses": [ "AvengerGenerator", @@ -41,22 +43,20 @@ "ewrs": [ "HawkEwrGenerator" ], - "aircraft_carrier": [ - ], + "aircraft_carrier": [], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "FFG_Oliver_Hazzard_Perry" + "PERRY" ], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "requirements": { "MB-339A/PAN by Frecce Tricolori Virtuali": "http://www.freccetricolorivirtuali.net/" }, - "carrier_names": [ - ], + "carrier_names": [], "helicopter_carrier_names": [ "Giuseppe Garibaldi", "Cavour" @@ -65,5 +65,5 @@ "OliverHazardPerryGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/japan_2005.json b/resources/factions/japan_2005.json index 7d860b05..a3bd9fcc 100644 --- a/resources/factions/japan_2005.json +++ b/resources/factions/japan_2005.json @@ -3,41 +3,43 @@ "name": "Japan 2005", "authors": "Khopa", "description": "

Japanese self defense force, F-15C standing as F-15J, and F-16 as Mitsubishi F-2.

Ground units were also chosen to fit the existing vehicles of the japanese forces

", - "locales": ["ja_JP"], + "locales": [ + "ja_JP" + ], "aircrafts": [ - "F_15C", - "F_16C_50", - "F_4E", - "AH_1W", - "AH_64D" + "AH-1W SuperCobra", + "AH-64D Apache Longbow", + "F-15J Eagle", + "F-2A", + "F-4EJ Kai Phantom II" ], "awacs": [ - "E_2C" + "E-2C Hawkeye" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "MBT_Merkava_IV", - "MBT_M1A2_Abrams", - "IFV_Marder", - "APC_TPz_Fuchs", - "IFV_LAV_25", - "Scout_HMMWV", - "SPAAA_Gepard" + "Flakpanzer Gepard", + "LAV-25", + "M1043 HMMWV (M2 HMG)", + "M1A2 Abrams", + "Marder 1A3", + "Merkava Mk IV", + "TPz Fuchs" ], "artillery_units": [ - "SPH_M109_Paladin_155mm", - "MLRS_M270_227mm", - "MANPADS_Stinger" + "M109A6 Paladin", + "M270 Multiple Launch Rocket System", + "MANPADS Stinger" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249" + "Infantry M249", + "Infantry M4" ], "air_defenses": [ "GepardGenerator", @@ -47,21 +49,18 @@ "ewrs": [ "PatriotEwrGenerator" ], - "aircraft_carrier": [ - ], + "aircraft_carrier": [], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "DDG_Arleigh_Burke_IIa" + "USS_Arleigh_Burke_IIa" ], "cruisers": [ - "CG_Ticonderoga" - ], - "requirements": { - }, - "carrier_names": [ + "TICONDEROG" ], + "requirements": {}, + "carrier_names": [], "helicopter_carrier_names": [ "Hyuga", "Ise" @@ -70,5 +69,5 @@ "ArleighBurkeGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/jordan_2010.json b/resources/factions/jordan_2010.json deleted file mode 100644 index 1f0d1c82..00000000 --- a/resources/factions/jordan_2010.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "country": "Jordan", - "name": "Jordan 2010", - "authors": "Starfire", - "description": "

Royal Jordanian Armed Forces early 21st century

", - "aircrafts": [ - "F_5E_3", - "C_101CC", - "SA342M", - "SA342L" - ], - "frontline_units": [ - "MBT_Challenger_II", - "MBT_M60A3_Patton", - "IFV_Marder", - "IFV_BMP_2", - "APC_M113", - "APC_M1043_HMMWV_Armament", - "ATGM_M1045_HMMWV_TOW" - ], - "artillery_units": [ - "MLRS_M270", - "SPH_M109_Paladin" - ], - "logistics_units": [ - "Transport_M818" - ], - "infantry_units": [ - "Infantry_M4", - "Soldier_M249", - "SAM_SA_18_Igla_S_MANPADS" - ], - "air_defenses": [ - "SA8Generator", - "SA13Generator", - "VulcanGenerator", - "ZU23Generator", - "HawkGenerator" - ], - "ewrs": [ - "HawkEwrGenerator" - ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], - "requirements": { - }, - "carrier_names": [ - ], - "helicopter_carrier_names": [ - ], - "navy_generators": [ - ], - "has_jtac": false, - "doctrine": "coldwar" -} diff --git a/resources/factions/libya_2011.json b/resources/factions/libya_2011.json index cf6b45cd..029541ea 100644 --- a/resources/factions/libya_2011.json +++ b/resources/factions/libya_2011.json @@ -4,38 +4,39 @@ "authors": "Khopa", "description": "

Gaddafi's Lybian forces during the 2011 international intervention

", "aircrafts": [ - "MiG_21Bis", - "MiG_23MLD", - "Su_17M4", - "Su_24M", - "Mi_24V" + "Mi-24V Hind-E", + "Mi-24P Hind-F", + "MiG-21bis Fishbed-N", + "MiG-23MLD Flogger-K", + "Su-17M4 Fitter-K", + "Su-24M Fencer-D" ], "awacs": [ - "A_50" + "A-50" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "IFV_BMP_1", - "Scout_BRDM_2", - "MBT_T_72B", - "MBT_T_55", - "LT_PT_76", - "SPAAA_ZSU_23_4_Shilka_Gun_Dish", - "SAM_SA_8_Osa_Gecko_TEL" + "BMP-1", + "BRDM-2", + "PT-76", + "SAM SA-8 Osa \"Gecko\" TEL", + "T-55A", + "T-72B with Kontakt-1 ERA", + "ZSU-23-4 Shilka" ], "artillery_units": [ - "MLRS_BM_21_Grad_122mm" + "BM-21 Grad" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Insurgent_AK_74", - "Paratrooper_RPG_16", - "MANPADS_SA_18_Igla_Grouse" + "Insurgent AK-74", + "MANPADS SA-18 Igla \"Grouse\"", + "Paratrooper RPG-16" ], "air_defenses": [ "HQ7Generator", @@ -52,26 +53,24 @@ "BoxSpringGenerator", "TallRackGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "helicopter_carrier_names": [], "missiles": [ "ScudGenerator" ], "missiles_group_count": 1, "destroyers": [ - "Frigate_1135M_Rezky" + "REZKY" ], "cruisers": [ - "Corvette_1241_1_Molniya" + "MOLNIYA" ], "requirements": {}, - "carrier_names": [ - ], + "carrier_names": [], "navy_generators": [ - "GrishaGroupGenerator", "MolniyaGroupGenerator", "LaCombattanteIIGroupGenerator" + "GrishaGroupGenerator", + "MolniyaGroupGenerator", + "LaCombattanteIIGroupGenerator" ] -} +} \ No newline at end of file diff --git a/resources/factions/netherlands_1990.json b/resources/factions/netherlands_1990.json index feb9d43e..7ef783eb 100644 --- a/resources/factions/netherlands_1990.json +++ b/resources/factions/netherlands_1990.json @@ -3,33 +3,34 @@ "name": "Netherlands 1990", "authors": "Khopa", "description": "

Netherlands forces in the 90s.

", - "locales": ["nl_NL"], + "locales": [ + "nl_NL" + ], "aircrafts": [ - "F_16C_50", - "F_5E_3", - "AH_64A" + "AH-64A Apache", + "F-16CM Fighting Falcon (Block 50)", + "F-5E Tiger II" ], "awacs": [ - "E_3A" + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "APC_M113", - "MBT_Leopard_1A3", - "SAM_Avenger__Stinger" - ], - "artillery_units": [ + "Leopard 1A3", + "M1097 Heavy HMMWV Avenger", + "M113" ], + "artillery_units": [], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger" ], "air_defenses": [ "AvengerGenerator", @@ -41,22 +42,16 @@ "ewrs": [ "PatriotEwrGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "destroyers": [], + "cruisers": [], "requirements": {}, - "carrier_names": [ - ], - "helicopter_carrier_names": [ - ], + "carrier_names": [], + "helicopter_carrier_names": [], "navy_generators": [ "OliverHazardPerryGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/north_korea_2000.json b/resources/factions/north_korea_2000.json index ffd01032..3c5033bc 100644 --- a/resources/factions/north_korea_2000.json +++ b/resources/factions/north_korea_2000.json @@ -4,45 +4,46 @@ "authors": "Khopa", "description": "

North Korean army in the 2000s.

", "aircrafts": [ - "MiG_15bis", - "MiG_19P", - "MiG_21Bis", - "MiG_23MLD", - "MiG_29A", - "Mi_8MT", - "Mi_24V" + "Mi-24V Hind-E", + "Mi-24P Hind-F", + "Mi-8MTV2 Hip", + "MiG-15bis Fagot", + "MiG-19P Farmer-B", + "MiG-21bis Fishbed-N", + "MiG-23MLD Flogger-K", + "MiG-29A Fulcrum-A" ], "awacs": [ - "A_50" + "A-50" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "Scout_BRDM_2", - "APC_BTR_80", - "IFV_BMP_1", - "MBT_T_55", - "MBT_T_72B", - "MBT_T_80U", - "LT_PT_76", - "SPAAA_ZSU_57_2", - "SAM_SA_9_Strela_1_Gaskin_TEL" + "BMP-1", + "BRDM-2", + "BTR-80", + "PT-76", + "SA-9 Strela", + "T-55A", + "T-72B with Kontakt-1 ERA", + "T-80UD", + "ZSU-57-2 'Sparka'" ], "artillery_units": [ - "MLRS_BM_21_Grad_122mm", - "MLRS_9K57_Uragan_BM_27_220mm", - "SPH_2S19_Msta_152mm" + "2S19 Msta-S", + "BM-21 Grad", + "BM-27 Uragan" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Paratrooper_AKS", - "Infantry_AK_74_Rus", - "Paratrooper_RPG_16", - "MANPADS_SA_18_Igla_S_Grouse" + "Infantry AK-74 Rus", + "MANPADS SA-18 Igla-S \"Grouse\"", + "Paratrooper AKS", + "Paratrooper RPG-16" ], "air_defenses": [ "SA2Generator", @@ -58,19 +59,13 @@ "BoxSpringGenerator", "TallRackGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "helicopter_carrier_names": [], + "destroyers": [], + "cruisers": [], "requirements": {}, - "carrier_names": [ - ], + "carrier_names": [], "missiles": [ "ScudGenerator" ], @@ -80,4 +75,4 @@ "MolniyaGroupGenerator" ], "has_jtac": false -} +} \ No newline at end of file diff --git a/resources/factions/pakistan_2015.json b/resources/factions/pakistan_2015.json index c8e2b4b3..570bf52e 100644 --- a/resources/factions/pakistan_2015.json +++ b/resources/factions/pakistan_2015.json @@ -4,41 +4,41 @@ "authors": "Khopa", "description": "

Pakistan circa 2015 for JF-17 and F-16 enthusiasts.

", "aircrafts": [ - "JF_17", - "F_16C_50", - "MiG_21Bis", - "MiG_19P", - "Mi_8MT", - "UH_1H", - "AH_1W" + "AH-1W SuperCobra", + "F-16CM Fighting Falcon (Block 50)", + "JF-17 Thunder", + "Mi-8MTV2 Hip", + "MiG-19P Farmer-B", + "MiG-21bis Fishbed-N", + "UH-1H Iroquois" ], "awacs": [ - "KJ_2000" + "KJ-2000" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "MBT_T_80U", - "MBT_T_55", - "ZBD_04A", - "APC_BTR_80", - "APC_M113", - "HQ_7_Self_Propelled_LN" + "BTR-80", + "HQ-7 Launcher", + "M113", + "T-55A", + "T-80UD", + "Type 04A (ZBD-04A)" ], "artillery_units": [ - "MLRS_9A52_Smerch_HE_300mm", - "SPM_2S9_Nona_120mm_M" + "2S9 Nona-S", + "BM-30 Smerch (9M55K5 HE Rockets)" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Paratrooper_AKS", - "Infantry_AK_74_Rus", - "Paratrooper_RPG_16", - "MANPADS_Stinger" + "Infantry AK-74 Rus", + "MANPADS Stinger", + "Paratrooper AKS", + "Paratrooper RPG-16" ], "air_defenses": [ "HQ7Generator", @@ -52,23 +52,17 @@ "BoxSpringGenerator", "TallRackGenerator" ], - "aircraft_carrier": [ - ], - "carrier_names": [ - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ - ], - "destroyers": [ - ], - "cruiser": [ - ], + "aircraft_carrier": [], + "carrier_names": [], + "helicopter_carrier": [], + "helicopter_carrier_names": [], + "destroyers": [], + "cruiser": [], "requirements": {}, "navy_generators": [ "Type54GroupGenerator", "OliverHazardPerryGroupGenerator" ], "has_jtac": true, - "jtac_unit": "WingLoong_I" -} + "jtac_unit": "WingLoong-I" +} \ No newline at end of file diff --git a/resources/factions/pmc_russian.json b/resources/factions/pmc_russian.json index 14061dd4..df108c39 100644 --- a/resources/factions/pmc_russian.json +++ b/resources/factions/pmc_russian.json @@ -3,33 +3,36 @@ "name": "Private Military Company - Russian", "authors": "Khopa", "description": "

A private military company using Russian units.

", - "locales": ["ru_RU"], + "locales": [ + "ru_RU" + ], "aircrafts": [ - "L_39ZA", - "Mi_8MT", - "Mi_24V", - "Ka_50" + "Ka-50 Hokum", + "L-39ZA Albatros", + "Mi-24V Hind-E", + "Mi-24P Hind-F", + "Mi-8MTV2 Hip" ], "frontline_units": [ - "Scout_Cobra", - "APC_BTR_80", - "Scout_BRDM_2", - "SAM_SA_13_Strela_10M3_Gopher_TEL" + "BRDM-2", + "BTR-80", + "Cobra", + "SA-13 Gopher (9K35 Strela-10M3)" ], "artillery_units": [ - "SPH_2S19_Msta_152mm" + "2S19 Msta-S" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Paratrooper_AKS", - "Paratrooper_RPG_16", - "MANPADS_SA_18_Igla_S_Grouse" + "MANPADS SA-18 Igla-S \"Grouse\"", + "Paratrooper AKS", + "Paratrooper RPG-16" ], "air_defenses": [ "SA9Generator", "SA13Generator" ] -} +} \ No newline at end of file diff --git a/resources/factions/pmc_us.json b/resources/factions/pmc_us.json index 8957f5db..e3802ef6 100644 --- a/resources/factions/pmc_us.json +++ b/resources/factions/pmc_us.json @@ -4,30 +4,29 @@ "authors": "Khopa", "description": "

A private military company using western units.

", "aircrafts": [ - "C_101CC", - "UH_1H", - "Mi_8MT", - "SA342M" + "C-101CC Aviojet", + "Mi-8MTV2 Hip", + "SA 342M Gazelle", + "UH-1H Iroquois" ], "frontline_units": [ - "Scout_HMMWV", - "IFV_Warrior", - "IFV_LAV_25", - "SAM_Avenger__Stinger" - ], - "artillery_units": [ + "FV510 Warrior", + "LAV-25", + "M1043 HMMWV (M2 HMG)", + "M1097 Heavy HMMWV Avenger" ], + "artillery_units": [], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger" ], "air_defenses": [ "AvengerGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/pmc_us_with_mb339.json b/resources/factions/pmc_us_with_mb339.json index 1e9867d5..6de74108 100644 --- a/resources/factions/pmc_us_with_mb339.json +++ b/resources/factions/pmc_us_with_mb339.json @@ -4,27 +4,26 @@ "authors": "Khopa", "description": "

A private military company using western units (And using the MB339 mod).

", "aircrafts": [ - "MB_339PAN", - "C_101CC", - "UH_1H", - "Mi_8MT", - "SA342M" + "C-101CC Aviojet", + "MB-339PAN", + "Mi-8MTV2 Hip", + "SA 342M Gazelle", + "UH-1H Iroquois" ], "frontline_units": [ - "Scout_HMMWV", - "IFV_Warrior", - "IFV_LAV_25", - "SAM_Avenger__Stinger" - ], - "artillery_units": [ + "FV510 Warrior", + "LAV-25", + "M1043 HMMWV (M2 HMG)", + "M1097 Heavy HMMWV Avenger" ], + "artillery_units": [], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger" ], "air_defenses": [ "AvengerGenerator" @@ -33,5 +32,5 @@ "MB-339A/PAN by Frecce Tricolori Virtuali": "http://www.freccetricolorivirtuali.net/" }, "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/poland_2010.json b/resources/factions/poland_2010.json index d37e55dc..7b092d9e 100644 --- a/resources/factions/poland_2010.json +++ b/resources/factions/poland_2010.json @@ -3,40 +3,42 @@ "name": "Poland 2010", "authors": "Malakhit", "description": "

Polish army in the 2010s.

", - "locales": ["pl_PL"], + "locales": [ + "pl_PL" + ], "aircrafts": [ - "Su_17M4", - "MiG_29A", - "F_16C_50", - "Mi_8MT" + "F-16CM Fighting Falcon (Block 50)", + "Mi-8MTV2 Hip", + "MiG-29A Fulcrum-A", + "Su-22M4 Fitter-K" ], "tankers": [ - "KC130" + "KC-130" ], "frontline_units": [ - "Scout_HMMWV", - "ATGM_HMMWV", - "IFV_M1126_Stryker_ICV", - "Scout_BRDM_2", - "IFV_BMP_1", - "APC_MTLB", - "MBT_Leopard_2A6M", - "MBT_T_72B3" + "BMP-1", + "BRDM-2", + "Leopard 2", + "M1043 HMMWV (M2 HMG)", + "M1045 HMMWV (BGM-71 TOW)", + "M1126 Stryker ICV (M2 HMG)", + "MT-LB", + "T-72B3 model 2011" ], "artillery_units": [ - "MLRS_BM_21_Grad_122mm", - "SPH_2S1_Gvozdika_122mm", - "SPH_Dana_vz77_152mm" + "2S1 Gvozdika", + "BM-21 Grad", + "SpGH DANA" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Paratrooper_AKS", - "Infantry_AK_74_Rus", - "Infantry_RPG", - "MANPADS_SA_18_Igla_S_Grouse" + "Infantry AK-74 Rus", + "Infantry RPG", + "MANPADS SA-18 Igla-S \"Grouse\"", + "Paratrooper AKS" ], "air_defenses": [ "SA6Generator", @@ -54,4 +56,4 @@ "MolniyaGroupGenerator", "OliverHazardPerryGroupGenerator" ] -} +} \ No newline at end of file diff --git a/resources/factions/redfor_china_2010.json b/resources/factions/redfor_china_2010.json index 9acd9203..b8cc7c7d 100644 --- a/resources/factions/redfor_china_2010.json +++ b/resources/factions/redfor_china_2010.json @@ -4,62 +4,63 @@ "authors": "Robert Peary", "description": "

Combined Redfor under China's leadership in the late 2000s, early 2010s.

", "aircrafts": [ - "J_11A", - "JF_17", - "Ka_50", - "L_39ZA", - "Mi_8MT", - "Mi_24V", - "Mi_28N", - "MiG_21Bis", - "MiG_29S", - "MiG_31", - "Su_24M", - "Su_25", - "Su_25T", - "Su_27", - "Su_30", - "Su_33", - "Su_34", - "Tu_22M3" + "FC-1 Fierce Dragon", + "J-11A Flanker-L", + "J-15 Flanker X-2", + "J-7B", + "Ka-50 Hokum", + "L-39ZA Albatros", + "Mi-24V Hind-E", + "Mi-24P Hind-F", + "Mi-28N Havoc", + "Mi-8MTV2 Hip", + "MiG-29S Fulcrum-C", + "MiG-31 Foxhound", + "Su-24M Fencer-D", + "Su-25 Frogfoot", + "Su-25T Frogfoot", + "Su-27 Flanker-B", + "Su-30MKK Flanker-G", + "Su-34 Fullback", + "Tu-22M3 Backfire-C" ], "awacs": [ - "KJ_2000" + "KJ-2000" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "APC_BTR_80", - "IFV_BTR_82A", - "HQ_7_Self_Propelled_LN", - "IFV_BMP_1", - "IFV_BMP_2", - "IFV_BMP_3", - "MBT_T_55", - "MBT_T_72B3", - "MBT_T_80U", - "MBT_T_90", - "SAM_SA_19_Tunguska_Grison", - "ZBD_04A", - "ZTZ_96B" + "BMP-1", + "BMP-2", + "BMP-3", + "BTR-80", + "BTR-82A", + "HQ-7 Launcher", + "SA-19 Grison (2K22 Tunguska)", + "T-55A", + "T-72B3 model 2011", + "T-80UD", + "T-90A", + "Type 04A (ZBD-04A)", + "Type 96B (ZTZ-96B)" ], "artillery_units": [ - "MLRS_9A52_Smerch_HE_300mm", - "MLRS_9K57_Uragan_BM_27_220mm", - "SPM_2S9_Nona_120mm_M", - "SPH_2S19_Msta_152mm" + "2S19 Msta-S", + "2S9 Nona-S", + "BM-27 Uragan", + "BM-30 Smerch (9M55K5 HE Rockets)" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Mortar_2B11_120mm", - "Infantry_AK_74_Rus", - "Paratrooper_AKS", - "Paratrooper_RPG_16", - "MANPADS_SA_18_Igla_Grouse" + "Infantry AK-74 Rus", + "MANPADS SA-18 Igla \"Grouse\"", + "Mortar 2B11 120mm", + "Paratrooper AKS", + "Paratrooper RPG-16" ], "air_defenses": [ "HQ7Generator", @@ -84,7 +85,7 @@ "TallRackGenerator" ], "aircraft_carrier": [ - "CV_1143_5_Admiral_Kuznetsov" + "KUZNECOW" ], "carrier_names": [ "001 Liaoning", @@ -103,18 +104,18 @@ "Wudang Shan" ], "destroyers": [ - "Frigate_1135M_Rezky", - "Type_052B_Destroyer", - "Type_052C_Destroyer" + "REZKY", + "Type_052B", + "Type_052C" ], "cruiser": [ - "Corvette_1241_1_Molniya", - "Type_054A_Frigate" + "MOLNIYA", + "Type_054A" ], "requirements": {}, "navy_generators": [ "Type54GroupGenerator" ], "has_jtac": true, - "jtac_unit": "WingLoong_I" -} + "jtac_unit": "WingLoong-I" +} \ No newline at end of file diff --git a/resources/factions/redfor_russia_2010.json b/resources/factions/redfor_russia_2010.json index 1703388b..9041f92a 100644 --- a/resources/factions/redfor_russia_2010.json +++ b/resources/factions/redfor_russia_2010.json @@ -3,64 +3,67 @@ "name": "Redfor (Russia) 2010", "authors": "Robert Peary", "description": "

Combined Redfor under Russia's leadership in the late 2000s, early 2010s.

", - "locales": ["ru_RU"], + "locales": [ + "ru_RU" + ], "aircrafts": [ - "J_11A", - "JF_17", - "Ka_50", - "L_39ZA", - "Mi_8MT", - "Mi_24V", - "Mi_28N", - "MiG_21Bis", - "MiG_29S", - "MiG_31", - "Su_24M", - "Su_25", - "Su_25T", - "Su_27", - "Su_30", - "Su_33", - "Su_34", - "Tu_22M3" + "J-11A Flanker-L", + "JF-17 Thunder", + "Ka-50 Hokum", + "L-39ZA Albatros", + "Mi-24V Hind-E", + "Mi-24P Hind-F", + "Mi-28N Havoc", + "Mi-8MTV2 Hip", + "MiG-21bis Fishbed-N", + "MiG-29S Fulcrum-C", + "MiG-31 Foxhound", + "Su-24M Fencer-D", + "Su-25 Frogfoot", + "Su-25T Frogfoot", + "Su-27 Flanker-B", + "Su-30 Flanker-C", + "Su-33 Flanker-D", + "Su-34 Fullback", + "Tu-22M3 Backfire-C" ], "awacs": [ - "A_50" + "A-50" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "APC_BTR_80", - "IFV_BTR_82A", - "HQ_7_Self_Propelled_LN", - "IFV_BMP_1", - "IFV_BMP_2", - "IFV_BMP_3", - "MBT_T_55", - "MBT_T_72B3", - "MBT_T_80U", - "MBT_T_90", - "SAM_SA_19_Tunguska_Grison", - "ZBD_04A", - "ZTZ_96B" + "BMP-1", + "BMP-2", + "BMP-3", + "BTR-80", + "BTR-82A", + "HQ-7 Launcher", + "SA-19 Grison (2K22 Tunguska)", + "T-55A", + "T-72B3 model 2011", + "T-80UD", + "T-90A", + "Type 04A (ZBD-04A)", + "Type 96B (ZTZ-96B)" ], "artillery_units": [ - "MLRS_9A52_Smerch_HE_300mm", - "MLRS_9K57_Uragan_BM_27_220mm", - "SPM_2S9_Nona_120mm_M", - "SPH_2S19_Msta_152mm" + "2S19 Msta-S", + "2S9 Nona-S", + "BM-27 Uragan", + "BM-30 Smerch (9M55K5 HE Rockets)" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Mortar_2B11_120mm", - "Infantry_AK_74_Rus", - "Paratrooper_AKS", - "Paratrooper_RPG_16", - "MANPADS_SA_18_Igla_Grouse" + "Infantry AK-74 Rus", + "MANPADS SA-18 Igla \"Grouse\"", + "Mortar 2B11 120mm", + "Paratrooper AKS", + "Paratrooper RPG-16" ], "air_defenses": [ "HQ7Generator", @@ -85,7 +88,7 @@ "TallRackGenerator" ], "aircraft_carrier": [ - "CV_1143_5_Admiral_Kuznetsov" + "KUZNECOW" ], "helicopter_carrier": [ "Type_071_Amphibious_Transport_Dock" @@ -95,13 +98,13 @@ "Mitrofan Moskalenko" ], "destroyers": [ - "Frigate_1135M_Rezky", - "Type_052B_Destroyer", - "Type_052C_Destroyer" + "REZKY", + "Type_052B", + "Type_052C" ], "cruisers": [ - "Corvette_1241_1_Molniya", - "Type_054A_Frigate" + "MOLNIYA", + "Type_054A" ], "requirements": {}, "carrier_names": [ @@ -112,5 +115,5 @@ "KiloSubGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/russia_1955.json b/resources/factions/russia_1955.json index ec107246..0416a069 100644 --- a/resources/factions/russia_1955.json +++ b/resources/factions/russia_1955.json @@ -3,55 +3,50 @@ "name": "Russia 1955", "authors": "Khopa", "description": "

Soviet army around 1955, during the Korean War

", - "locales": ["ru_RU"], + "locales": [ + "ru_RU" + ], "aircrafts": [ - "MiG_15bis" + "MiG-15bis Fagot" ], "awacs": [ - "A_50" + "A-50" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "Scout_BRDM_2", - "Grad_MRL_FDDM__FC", - "APC_MTLB", - "MBT_T_55", - "LT_PT_76", - "SPAAA_ZU_23_2_Mounted_Ural_375", - "AAA_8_8cm_Flak_18", - "AAA_S_60_57mm" + "8.8 cm Flak 18", + "BRDM-2", + "Grad MRL FDDM (FC)", + "MT-LB", + "PT-76", + "S-60 57mm", + "T-55A", + "ZU-23 on Ural-375" ], "artillery_units": [ - "MLRS_BM_21_Grad_122mm" + "BM-21 Grad" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Infantry_AK_74_Rus", - "Infantry_RPG" + "Infantry AK-74 Rus", + "Infantry RPG" ], "air_defenses": [ "EarlyColdWarFlakGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "helicopter_carrier_names": [], + "destroyers": [], + "cruisers": [], "requirements": {}, - "carrier_names": [ - ], - "navy_generators": [ - ], + "carrier_names": [], + "navy_generators": [], "has_jtac": false, "doctrine": "coldwar" -} +} \ No newline at end of file diff --git a/resources/factions/russia_1965.json b/resources/factions/russia_1965.json index cd506c36..72100e25 100644 --- a/resources/factions/russia_1965.json +++ b/resources/factions/russia_1965.json @@ -3,42 +3,44 @@ "name": "Russia 1965", "authors": "Khopa", "description": "

Soviet army in the 60s, ideal to fly the Mig-19 or the Mig-21.

", - "locales": ["ru_RU"], + "locales": [ + "ru_RU" + ], "aircrafts": [ - "MiG_15bis", - "MiG_19P", - "MiG_21Bis", - "Mi_8MT", - "Tu_95MS" + "Mi-8MTV2 Hip", + "MiG-15bis Fagot", + "MiG-19P Farmer-B", + "MiG-21bis Fishbed-N", + "Tu-95MS Bear-H" ], "awacs": [ - "A_50" + "A-50" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "Scout_BRDM_2", - "APC_BTR_80", - "APC_BTR_RD", - "IFV_BMD_1", - "IFV_BMP_1", - "LT_PT_76", - "MBT_T_55", - "SPAAA_ZU_23_2_Mounted_Ural_375", - "SPAAA_ZSU_57_2", - "AAA_S_60_57mm" + "BMD-1", + "BMP-1", + "BRDM-2", + "BTR-80", + "BTR-D", + "PT-76", + "S-60 57mm", + "T-55A", + "ZSU-57-2 'Sparka'", + "ZU-23 on Ural-375" ], "artillery_units": [ - "MLRS_BM_21_Grad_122mm" + "BM-21 Grad" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Infantry_AK_74_Rus", - "Infantry_RPG" + "Infantry AK-74 Rus", + "Infantry RPG" ], "air_defenses": [ "EarlyColdWarFlakGenerator", @@ -52,21 +54,14 @@ "ewrs": [ "FlatFaceGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "helicopter_carrier_names": [], + "destroyers": [], + "cruisers": [], "requirements": {}, - "carrier_names": [ - ], - "navy_generators": [ - ], + "carrier_names": [], + "navy_generators": [], "has_jtac": false, "doctrine": "coldwar" -} +} \ No newline at end of file diff --git a/resources/factions/russia_1970_limited_air.json b/resources/factions/russia_1970_limited_air.json index 735c2a88..9bab53dc 100644 --- a/resources/factions/russia_1970_limited_air.json +++ b/resources/factions/russia_1970_limited_air.json @@ -3,34 +3,36 @@ "name": "Russia 1970 Limited Air", "authors": "Starfire", "description": "

1970 Soviet Russia, with limited air units intended for a Viggen campaign.

", - "locales": ["ru_RU"], + "locales": [ + "ru_RU" + ], "aircrafts": [ - "MiG_19P", - "MiG_21Bis", - "Mi_8MT", - "Mi_24V" + "Mi-24V Hind-E", + "Mi-8MTV2 Hip", + "MiG-19P Farmer-B", + "MiG-21bis Fishbed-N" ], "frontline_units": [ - "Scout_BRDM_2", - "APC_BTR_80", - "IFV_BMD_1", - "IFV_BMP_1", - "LT_PT_76", - "MBT_T_55", - "SPAAA_ZSU_57_2" + "BMD-1", + "BMP-1", + "BRDM-2", + "BTR-80", + "PT-76", + "T-55A", + "ZSU-57-2 'Sparka'" ], "artillery_units": [ - "MLRS_BM_21_Grad_122mm", - "SPM_2S9_Nona_120mm_M", - "SPH_2S1_Gvozdika_122mm" + "2S1 Gvozdika", + "2S9 Nona-S", + "BM-21 Grad" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Infantry_AK_74_Rus", - "Infantry_RPG" + "Infantry AK-74 Rus", + "Infantry RPG" ], "air_defenses": [ "SA2Generator", @@ -48,26 +50,20 @@ "ewrs": [ "FlatFaceGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "helicopter_carrier_names": [], + "destroyers": [], + "cruisers": [], "missiles": [ "ScudGenerator" ], "missiles_group_count": 1, "requirements": {}, - "carrier_names": [ - ], + "carrier_names": [], "navy_generators": [ - "RussianNavyGroupGenerator" + "RussianNavyGroupGenerator" ], "has_jtac": false, "doctrine": "coldwar" -} +} \ No newline at end of file diff --git a/resources/factions/russia_1975.json b/resources/factions/russia_1975.json index 387bebf2..1f456259 100644 --- a/resources/factions/russia_1975.json +++ b/resources/factions/russia_1975.json @@ -3,48 +3,51 @@ "name": "Russia 1975", "authors": "Khopa", "description": "

Soviet army in the late 70s, using their prototype Mig-29A.

", - "locales": ["ru_RU"], + "locales": [ + "ru_RU" + ], "aircrafts": [ - "MiG_21Bis", - "MiG_23MLD", - "MiG_25PD", - "MiG_29A", - "Su_17M4", - "Su_24M", - "Su_25", - "Mi_8MT", - "Mi_24V", - "Tu_95MS", - "Tu_142" + "Mi-24V Hind-E", + "Mi-24P Hind-F", + "Mi-8MTV2 Hip", + "MiG-21bis Fishbed-N", + "MiG-23MLD Flogger-K", + "MiG-25PD Foxbat-E", + "MiG-29A Fulcrum-A", + "Su-17M4 Fitter-K", + "Su-24M Fencer-D", + "Su-25 Frogfoot", + "Tu-142 Bear-F", + "Tu-95MS Bear-H" ], "awacs": [ - "A_50" + "A-50" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "Scout_BRDM_2", - "APC_BTR_80", - "IFV_BMD_1", - "IFV_BMP_1", - "LT_PT_76", - "MBT_T_55", - "SAM_SA_8_Osa_Gecko_TEL" + "BMD-1", + "BMP-1", + "BRDM-2", + "BTR-80", + "PT-76", + "SAM SA-8 Osa \"Gecko\" TEL", + "T-55A" ], "artillery_units": [ - "MLRS_BM_21_Grad_122mm", - "SPM_2S9_Nona_120mm_M", - "SPH_2S1_Gvozdika_122mm" + "2S1 Gvozdika", + "2S9 Nona-S", + "BM-21 Grad" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Infantry_AK_74_Rus", - "Infantry_RPG", - "Mortar_2B11_120mm" + "Infantry AK-74 Rus", + "Infantry RPG", + "Mortar 2B11 120mm" ], "air_defenses": [ "ColdWarFlakGenerator", @@ -62,23 +65,17 @@ "ewrs": [ "FlatFaceGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "helicopter_carrier_names": [], + "destroyers": [], + "cruisers": [], "missiles": [ "ScudGenerator" ], "missiles_group_count": 1, "requirements": {}, - "carrier_names": [ - ], + "carrier_names": [], "navy_generators": [ "MolniyaGroupGenerator" ], diff --git a/resources/factions/russia_1990.json b/resources/factions/russia_1990.json index 7f0f561f..22afa47f 100644 --- a/resources/factions/russia_1990.json +++ b/resources/factions/russia_1990.json @@ -3,52 +3,55 @@ "name": "Russia 1990", "authors": "Khopa", "description": "

Soviet/Russian army in the 90s.

", - "locales": ["ru_RU"], + "locales": [ + "ru_RU" + ], "aircrafts": [ - "MiG_25PD", - "MiG_29S", - "MiG_31", - "Su_24M", - "Su_25", - "Su_25T", - "Su_27", - "Su_33", - "Ka_50", - "Mi_8MT", - "Mi_24V", - "Tu_22M3", - "Tu_95MS", - "Tu_142", - "Tu_160" + "Ka-50 Hokum", + "Mi-24V Hind-E", + "Mi-24P Hind-F", + "Mi-8MTV2 Hip", + "MiG-25PD Foxbat-E", + "MiG-29S Fulcrum-C", + "MiG-31 Foxhound", + "Su-24M Fencer-D", + "Su-25 Frogfoot", + "Su-25T Frogfoot", + "Su-27 Flanker-B", + "Su-33 Flanker-D", + "Tu-142 Bear-F", + "Tu-160 Blackjack", + "Tu-22M3 Backfire-C", + "Tu-95MS Bear-H" ], "awacs": [ - "A_50" + "A-50" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "APC_BTR_80", - "IFV_BMP_1", - "IFV_BMP_2", - "MBT_T_72B", - "MBT_T_80U", - "SAM_SA_13_Strela_10M3_Gopher_TEL" + "BMP-1", + "BMP-2", + "BTR-80", + "SA-13 Gopher (9K35 Strela-10M3)", + "T-72B with Kontakt-1 ERA", + "T-80UD" ], "artillery_units": [ - "MLRS_9K57_Uragan_BM_27_220mm", - "SPH_2S19_Msta_152mm" + "2S19 Msta-S", + "BM-27 Uragan" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Paratrooper_AKS", - "Infantry_AK_74_Rus", - "Paratrooper_RPG_16", - "Mortar_2B11_120mm", - "MANPADS_SA_18_Igla_S_Grouse" + "Infantry AK-74 Rus", + "MANPADS SA-18 Igla-S \"Grouse\"", + "Mortar 2B11 120mm", + "Paratrooper AKS", + "Paratrooper RPG-16" ], "air_defenses": [ "SA2Generator", @@ -72,17 +75,15 @@ "TallRackGenerator" ], "aircraft_carrier": [ - "CV_1143_5_Admiral_Kuznetsov" - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ + "KUZNECOW" ], + "helicopter_carrier": [], + "helicopter_carrier_names": [], "destroyers": [ - "Frigate_1135M_Rezky" + "REZKY" ], "cruisers": [ - "Corvette_1241_1_Molniya" + "MOLNIYA" ], "requirements": {}, "carrier_names": [ @@ -93,5 +94,5 @@ "RussianNavyGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/russia_2010.json b/resources/factions/russia_2010.json index 624ced64..791e2b67 100644 --- a/resources/factions/russia_2010.json +++ b/resources/factions/russia_2010.json @@ -3,58 +3,61 @@ "name": "Russia 2010", "authors": "Khopa", "description": "

Russian army in the early 2010s.

", - "locales": ["ru_RU"], + "locales": [ + "ru_RU" + ], "aircrafts": [ - "MiG_29S", - "MiG_31", - "Su_24M", - "Su_25", - "Su_25T", - "Su_27", - "Su_30", - "Su_33", - "Su_34", - "L_39ZA", - "Mi_8MT", - "Mi_24V", - "Mi_28N", - "Ka_50", - "Tu_22M3", - "Tu_95MS", - "Tu_142", - "Tu_160" + "Ka-50 Hokum", + "L-39ZA Albatros", + "Mi-24V Hind-E", + "Mi-24P Hind-F", + "Mi-28N Havoc", + "Mi-8MTV2 Hip", + "MiG-29S Fulcrum-C", + "MiG-31 Foxhound", + "Su-24M Fencer-D", + "Su-25 Frogfoot", + "Su-25T Frogfoot", + "Su-27 Flanker-B", + "Su-30 Flanker-C", + "Su-33 Flanker-D", + "Su-34 Fullback", + "Tu-142 Bear-F", + "Tu-160 Blackjack", + "Tu-22M3 Backfire-C", + "Tu-95MS Bear-H" ], "awacs": [ - "A_50" + "A-50" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "IFV_BMP_1", - "IFV_BMP_2", - "IFV_BMP_3", - "APC_BTR_80", - "IFV_BTR_82A", - "MBT_T_90", - "MBT_T_80U", - "MBT_T_72B3", - "SAM_SA_19_Tunguska_Grison" + "BMP-1", + "BMP-2", + "BMP-3", + "BTR-80", + "BTR-82A", + "SA-19 Grison (2K22 Tunguska)", + "T-72B3 model 2011", + "T-80UD", + "T-90A" ], "artillery_units": [ - "MLRS_9K57_Uragan_BM_27_220mm", - "SPH_2S19_Msta_152mm" + "2S19 Msta-S", + "BM-27 Uragan" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Paratrooper_AKS", - "Infantry_AK_74_Rus", - "Paratrooper_RPG_16", - "Mortar_2B11_120mm", - "MANPADS_SA_18_Igla_Grouse" + "Infantry AK-74 Rus", + "MANPADS SA-18 Igla \"Grouse\"", + "Mortar 2B11 120mm", + "Paratrooper AKS", + "Paratrooper RPG-16" ], "air_defenses": [ "SA8Generator", @@ -75,17 +78,15 @@ "TallRackGenerator" ], "aircraft_carrier": [ - "CV_1143_5_Admiral_Kuznetsov" - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ + "KUZNECOW" ], + "helicopter_carrier": [], + "helicopter_carrier_names": [], "destroyers": [ - "Frigate_1135M_Rezky" + "REZKY" ], "cruisers": [ - "Corvette_1241_1_Molniya" + "MOLNIYA" ], "requirements": {}, "carrier_names": [ @@ -95,5 +96,5 @@ "RussianNavyGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/russia_2010_hds.json b/resources/factions/russia_2010_hds.json index 62eb94bf..f61612b4 100644 --- a/resources/factions/russia_2010_hds.json +++ b/resources/factions/russia_2010_hds.json @@ -3,58 +3,61 @@ "name": "Russia 2010 (High Digit SAMs)", "authors": "Khopa", "description": "

Russian army in the early 2010s, featuring the High Digit SAMs mod units.

", - "locales": ["ru_RU"], + "locales": [ + "ru_RU" + ], "aircrafts": [ - "MiG_29S", - "MiG_31", - "Su_24M", - "Su_25", - "Su_25T", - "Su_27", - "Su_30", - "Su_33", - "Su_34", - "L_39ZA", - "Mi_8MT", - "Mi_24V", - "Mi_28N", - "Ka_50", - "Tu_22M3", - "Tu_95MS", - "Tu_142", - "Tu_160" + "Ka-50 Hokum", + "L-39ZA Albatros", + "Mi-24V Hind-E", + "Mi-24P Hind-F", + "Mi-28N Havoc", + "Mi-8MTV2 Hip", + "MiG-29S Fulcrum-C", + "MiG-31 Foxhound", + "Su-24M Fencer-D", + "Su-25 Frogfoot", + "Su-25T Frogfoot", + "Su-27 Flanker-B", + "Su-30 Flanker-C", + "Su-33 Flanker-D", + "Su-34 Fullback", + "Tu-142 Bear-F", + "Tu-160 Blackjack", + "Tu-22M3 Backfire-C", + "Tu-95MS Bear-H" ], "awacs": [ - "A_50" + "A-50" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "IFV_BMP_1", - "IFV_BMP_2", - "IFV_BMP_3", - "APC_BTR_80", - "IFV_BTR_82A", - "MBT_T_90", - "MBT_T_80U", - "MBT_T_72B3", - "SAM_SA_19_Tunguska_Grison" + "BMP-1", + "BMP-2", + "BMP-3", + "BTR-80", + "BTR-82A", + "SA-19 Grison (2K22 Tunguska)", + "T-72B3 model 2011", + "T-80UD", + "T-90A" ], "artillery_units": [ - "MLRS_9K57_Uragan_BM_27_220mm", - "SPH_2S19_Msta_152mm" + "2S19 Msta-S", + "BM-27 Uragan" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Paratrooper_AKS", - "Infantry_AK_74_Rus", - "Paratrooper_RPG_16", - "Mortar_2B11_120mm", - "MANPADS_SA_18_Igla_Grouse" + "Infantry AK-74 Rus", + "MANPADS SA-18 Igla \"Grouse\"", + "Mortar 2B11 120mm", + "Paratrooper AKS", + "Paratrooper RPG-16" ], "air_defenses": [ "SA17Generator", @@ -72,19 +75,19 @@ "TallRackGenerator" ], "aircraft_carrier": [ - "CV_1143_5_Admiral_Kuznetsov" - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ + "KUZNECOW" ], + "helicopter_carrier": [], + "helicopter_carrier_names": [], "destroyers": [ - "Frigate_1135M_Rezky" + "REZKY" ], "cruisers": [ - "Corvette_1241_1_Molniya" + "MOLNIYA" ], - "requirements": { "High Digit SAMs": "https://github.com/Auranis/HighDigitSAMs/releases"}, + "requirements": { + "High Digit SAMs": "https://github.com/Auranis/HighDigitSAMs/releases" + }, "carrier_names": [ "Admiral Kuznetsov" ], @@ -92,5 +95,5 @@ "RussianNavyGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/russia_2020.json b/resources/factions/russia_2020.json index 8d437dbf..d20fa37f 100644 --- a/resources/factions/russia_2020.json +++ b/resources/factions/russia_2020.json @@ -3,55 +3,58 @@ "name": "Russia 2020 (Modded)", "authors": "Khopa", "description": "

Russia in 2020, using the Su-57 mod by Cubanace.

", - "locales": ["ru_RU"], + "locales": [ + "ru_RU" + ], "aircrafts": [ - "MiG_29S", - "MiG_31", - "Su_24M", - "Su_25", - "Su_25T", - "Su_27", - "Su_30", - "Su_33", - "Su_34", - "Su_57", - "L_39ZA", - "Mi_8MT", - "Mi_24V", - "Mi_28N", - "Ka_50", - "Tu_22M3", - "Tu_95MS", - "Tu_142", - "Tu_160" + "Ka-50 Hokum", + "L-39ZA Albatros", + "Mi-24V Hind-E", + "Mi-24P Hind-F", + "Mi-28N Havoc", + "Mi-8MTV2 Hip", + "MiG-29S Fulcrum-C", + "MiG-31 Foxhound", + "Su-24M Fencer-D", + "Su-25 Frogfoot", + "Su-25T Frogfoot", + "Su-27 Flanker-B", + "Su-30 Flanker-C", + "Su-33 Flanker-D", + "Su-34 Fullback", + "Su-57 Felon", + "Tu-142 Bear-F", + "Tu-160 Blackjack", + "Tu-22M3 Backfire-C", + "Tu-95MS Bear-H" ], "awacs": [ - "A_50" + "A-50" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "IFV_BMP_2", - "IFV_BMP_3", - "MBT_T_90", - "MBT_T_80U", - "MBT_T_72B", - "SAM_SA_19_Tunguska_Grison" + "BMP-2", + "BMP-3", + "SA-19 Grison (2K22 Tunguska)", + "T-72B with Kontakt-1 ERA", + "T-80UD", + "T-90A" ], "artillery_units": [ - "MLRS_9K57_Uragan_BM_27_220mm", - "SPH_2S19_Msta_152mm" + "2S19 Msta-S", + "BM-27 Uragan" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Paratrooper_AKS", - "Infantry_AK_74_Rus", - "Paratrooper_RPG_16", - "MANPADS_SA_18_Igla_S_Grouse" + "Infantry AK-74 Rus", + "MANPADS SA-18 Igla-S \"Grouse\"", + "Paratrooper AKS", + "Paratrooper RPG-16" ], "air_defenses": [ "SA8Generator", @@ -71,17 +74,15 @@ "TallRackGenerator" ], "aircraft_carrier": [ - "CV_1143_5_Admiral_Kuznetsov" - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ + "KUZNECOW" ], + "helicopter_carrier": [], + "helicopter_carrier_names": [], "destroyers": [ - "Frigate_1135M_Rezky" + "REZKY" ], "cruisers": [ - "Corvette_1241_1_Molniya" + "MOLNIYA" ], "requirements": { "SU-57 Felon By CubanAce Simulations": "https://www.digitalcombatsimulator.com/fr/files/2539621/" @@ -93,5 +94,5 @@ "RussianNavyGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/soviet_union_1943.json b/resources/factions/soviet_union_1943.json index f47687b2..20d95dad 100644 --- a/resources/factions/soviet_union_1943.json +++ b/resources/factions/soviet_union_1943.json @@ -3,50 +3,45 @@ "name": "Soviet Union 1943", "authors": "Khopa", "description": "

Soviet Union in 1943. Featuring the I16, and using some allies units to represent either lend leased vehicles or soviet equivalent vehicles. BM-21 is used to represent BM-13

", - "locales": ["ru_RU"], + "locales": [ + "ru_RU" + ], "aircrafts": [ - "SpitfireLFMkIX", - "I_16" + "I-16 Ishak", + "Spitfire LF Mk IX" ], "frontline_units": [ - "Tk_M4_Sherman", - "APC_M2A1_Halftrack", - "Car_Daimler_Armored", - "LT_Mk_VII_Tetrarch", - "AAA_Bofors_40mm" + "A17 Light Tank Mk VII Tetrarch", + "Bofors 40 mm Gun", + "Daimler Armoured Car Mk I", + "M2A1 Half-Track", + "M4A2(75) Sherman" ], "artillery_units": [ - "MLRS_BM_21_Grad_122mm" + "BM-21 Grad" ], "logistics_units": [ - "Truck_Bedford", - "Truck_GMC_Jimmy_6x6_Truck" + "Truck Bedford", + "Truck GMC \"Jimmy\" 6x6 Truck" ], "infantry_units": [ - "Infantry_SMLE_No_4_Mk_1" + "Infantry SMLE No.4 Mk-1" ], "air_defenses": [ "AllyWW2FlakGenerator", "BoforsGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "destroyers": [], + "cruisers": [], "requirements": { "WW2 Asset Pack": "https://www.digitalcombatsimulator.com/en/products/other/wwii_assets_pack/" }, - "carrier_names": [ - ], - "helicopter_carrier_names": [ - ], - "navy_generators": [ - ], + "carrier_names": [], + "helicopter_carrier_names": [], + "navy_generators": [], "has_jtac": false, "doctrine": "ww2", "building_set": "ww2ally" -} +} \ No newline at end of file diff --git a/resources/factions/spain_1990.json b/resources/factions/spain_1990.json index 728f2384..13ed6812 100644 --- a/resources/factions/spain_1990.json +++ b/resources/factions/spain_1990.json @@ -3,35 +3,36 @@ "name": "Spain 1990", "authors": "Khopa", "description": "

Spain in the 90s

", - "locales": ["es_ES"], + "locales": [ + "es_ES" + ], "aircrafts": [ - "FA_18C_hornet", - "AV8BNA", - "F_5E_3", - "C_101CC", - "UH_1H" + "AV-8B Harrier II Night Attack", + "C-101CC Aviojet", + "EF-18A+ Hornet", + "F-5E Tiger II", + "UH-1H Iroquois" ], "awacs": [ - "E_3A" + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "MBT_M60A3_Patton", - "MBT_Leopard_2A4", - "APC_M113", - "SAM_Avenger__Stinger" - ], - "artillery_units": [ + "Leopard 2A4", + "M1097 Heavy HMMWV Avenger", + "M113", + "M60A3 \"Patton\"" ], + "artillery_units": [], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249" + "Infantry M249", + "Infantry M4" ], "air_defenses": [ "AvengerGenerator", @@ -43,16 +44,16 @@ "PatriotEwrGenerator" ], "aircraft_carrier": [ - "CVN_74_John_C__Stennis" + "Stennis" ], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "FFG_Oliver_Hazzard_Perry" + "PERRY" ], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "requirements": {}, "carrier_names": [ @@ -65,22 +66,22 @@ "OliverHazardPerryGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper", + "jtac_unit": "MQ-9 Reaper", "liveries_overrides": { - "FA_18C_hornet": [ + "EF-18A+ Hornet": [ "Spain 111th Escuadron C.15-73", "Spain 111th Escuadron C.15-88", - "Spain 121th Escuadron C.15-45", - "Spain 121th Escuadron C.15-50", - "Spain 121th Escuadron C.15-60", - "Spain 151th Escuadron C.15-14", - "Spain 151th Escuadron C.15-18", - "Spain 151th Escuadron C.15-23", - "Spain 151th Escuadron C.15-24", - "Spain 211th Escuadron C.15-76", - "Spain 211th Escuadron C.15-77", - "Spain 462th Escuadron C.15-79", - "Spain 462th Escuadron C.15-90" + "Spain 121th Escuadron C.15-45", + "Spain 121th Escuadron C.15-50", + "Spain 121th Escuadron C.15-60", + "Spain 151th Escuadron C.15-14", + "Spain 151th Escuadron C.15-18", + "Spain 151th Escuadron C.15-23", + "Spain 151th Escuadron C.15-24", + "Spain 211th Escuadron C.15-76", + "Spain 211th Escuadron C.15-77", + "Spain 462th Escuadron C.15-79", + "Spain 462th Escuadron C.15-90" ] } -} +} \ No newline at end of file diff --git a/resources/factions/sweden_1970.json b/resources/factions/sweden_1970.json index 18554128..dbef6f47 100644 --- a/resources/factions/sweden_1970.json +++ b/resources/factions/sweden_1970.json @@ -3,37 +3,38 @@ "name": "Sweden 1970s Alternate Universe", "authors": "Starfire", "description": "

Sweden 1970

Since we do not yet have Heatblur's AI Draken, this faction includes the Mirage 2000C in order to provide Sweden with some form of A2A capability.

", - "locales": ["sv_SE"], + "locales": [ + "sv_SE" + ], "aircrafts": [ - "AJS37", - "M_2000C", - "UH_1H" + "AJS-37 Viggen", + "Mirage 2000C", + "UH-1H Iroquois" ], "awacs": [ - "E_3A" + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "IFV_Warrior", - "MBT_Leopard_2A4", - "IFV_M1126_Stryker_ICV", - "SAM_Chaparral_M48" - ], - "artillery_units": [ + "FV510 Warrior", + "Leopard 2A4", + "M1126 Stryker ICV (M2 HMG)", + "M48 Chaparral" ], + "artillery_units": [], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249" + "Infantry M249", + "Infantry M4" ], "air_defenses": [ - "ChaparralGenerator", - "EarlyColdWarFlakGenerator", + "ChaparralGenerator", + "EarlyColdWarFlakGenerator", "HawkGenerator", "VulcanGenerator" ], @@ -45,4 +46,4 @@ ], "has_jtac": false, "doctrine": "coldwar" - } +} \ No newline at end of file diff --git a/resources/factions/sweden_1990.json b/resources/factions/sweden_1990.json index 18da3260..7a4ade3b 100644 --- a/resources/factions/sweden_1990.json +++ b/resources/factions/sweden_1990.json @@ -3,33 +3,34 @@ "name": "Sweden 1990", "authors": "Khopa", "description": "

Sweden in the 90s.

Note : Since we're missing the Draken and the Air-to-Air variant of the Viggen, this faction will struggle in air-to-air scenarios.

", - "locales": ["sv_SE"], + "locales": [ + "sv_SE" + ], "aircrafts": [ - "AJS37", - "UH_1H" + "AJS-37 Viggen", + "UH-1H Iroquois" ], "awacs": [ - "E_3A" + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "IFV_Warrior", - "MBT_Leopard_2A4", - "IFV_M1126_Stryker_ICV", - "SAM_Avenger__Stinger" - ], - "artillery_units": [ + "FV510 Warrior", + "Leopard 2A4", + "M1097 Heavy HMMWV Avenger", + "M1126 Stryker ICV (M2 HMG)" ], + "artillery_units": [], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger" ], "air_defenses": [ "AvengerGenerator", @@ -42,5 +43,5 @@ "OliverHazardPerryGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/sweden_2002_with_gripen.json b/resources/factions/sweden_2002_with_gripen.json index 25af4e24..a4a406b7 100644 --- a/resources/factions/sweden_2002_with_gripen.json +++ b/resources/factions/sweden_2002_with_gripen.json @@ -3,35 +3,36 @@ "name": "Sweden 2002", "authors": "Khopa (updated with Gripen by bgreman)", "description": "

Sweden in 2002 after the addition of the Gripen-C.

", - "locales": ["sv_SE"], + "locales": [ + "sv_SE" + ], "aircrafts": [ - "AJS37", - "JAS39Gripen", - "JAS39Gripen_AG", - "UH_1H" + "AJS-37 Viggen", + "JAS 39 Gripen", + "JAS 39 Gripen A/G", + "UH-1H Iroquois" ], "awacs": [ - "E_3A" + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "IFV_Warrior", - "MBT_Leopard_2A4", - "IFV_M1126_Stryker_ICV", - "SAM_Avenger__Stinger" - ], - "artillery_units": [ + "FV510 Warrior", + "Leopard 2A4", + "M1097 Heavy HMMWV Avenger", + "M1126 Stryker ICV (M2 HMG)" ], + "artillery_units": [], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger" ], "air_defenses": [ "AvengerGenerator", @@ -47,5 +48,5 @@ "JAS39 Gripen Mod by Community": "https://github.com/whisky-actual/Community-JAS-39-C" }, "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/syria_1948.json b/resources/factions/syria_1948.json index ad05776d..7ced06e0 100644 --- a/resources/factions/syria_1948.json +++ b/resources/factions/syria_1948.json @@ -4,44 +4,38 @@ "authors": "Khopa", "description": "

Syria and Arab armies in the 1948 war against Israel.

", "aircrafts": [ - "SpitfireLFMkIX", - "SpitfireLFMkIXCW" + "Spitfire LF Mk IX", + "Spitfire LF Mk IX (Clipped Wings)" ], "frontline_units": [ - "IFV_Sd_Kfz_234_2_Puma", - "APC_Sd_Kfz_251_Halftrack", - "Tk_PzIV_H", - "Tk_M4_Sherman", - "AAA_Bofors_40mm" - ], - "artillery_units": [ + "Bofors 40 mm Gun", + "M4A2(75) Sherman", + "Panzerkampfwagen IV Ausf. H", + "Sd.Kfz.234/2 Puma", + "Sd.Kfz.251 \"Hanomag\"" ], + "artillery_units": [], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Infantry_SMLE_No_4_Mk_1" + "Infantry SMLE No.4 Mk-1" ], "air_defenses": [ "FlakGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], - "carrier_names": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "helicopter_carrier_names": [], + "destroyers": [], + "cruisers": [], + "carrier_names": [], "navy_generators": [ "SchnellbootGroupGenerator" - ], "requirements": { - "WW2 Asset Pack": "https://www.digitalcombatsimulator.com/en/products/other/wwii_assets_pack/" + ], + "requirements": { + "WW2 Asset Pack": "https://www.digitalcombatsimulator.com/en/products/other/wwii_assets_pack/" }, "doctrine": "ww2" -} +} \ No newline at end of file diff --git a/resources/factions/syria_1967.json b/resources/factions/syria_1967.json index cab0ceb8..af738f84 100644 --- a/resources/factions/syria_1967.json +++ b/resources/factions/syria_1967.json @@ -4,38 +4,38 @@ "authors": "Khopa", "description": "

Syria and Arab armies in the 1967 6 days war against Israel.

", "aircrafts": [ - "MiG_15bis", - "MiG_19P", - "MiG_21Bis", - "Su_17M4", - "Mi_8MT" + "Mi-8MTV2 Hip", + "MiG-15bis Fagot", + "MiG-19P Farmer-B", + "MiG-21bis Fishbed-N", + "Su-17M4 Fitter-K" ], "awacs": [ - "A_50" + "A-50" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "Scout_BRDM_2", - "Tk_PzIV_H", - "MBT_T_55", - "LT_PT_76", - "SPAAA_ZU_23_2_Mounted_Ural_375", - "SPAAA_ZSU_57_2", - "AAA_S_60_57mm" + "BRDM-2", + "PT-76", + "Panzerkampfwagen IV Ausf. H", + "S-60 57mm", + "T-55A", + "ZSU-57-2 'Sparka'", + "ZU-23 on Ural-375" ], "artillery_units": [ - "MLRS_BM_21_Grad_122mm" + "BM-21 Grad" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Paratrooper_AKS", - "Infantry_AK_74_Rus", - "Infantry_RPG" + "Infantry AK-74 Rus", + "Infantry RPG", + "Paratrooper AKS" ], "air_defenses": [ "SA2Generator", @@ -48,21 +48,15 @@ "ewrs": [ "FlatFaceGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "helicopter_carrier_names": [], + "destroyers": [], + "cruisers": [], "requirements": {}, - "carrier_names": [ - ], + "carrier_names": [], "navy_generators": [ "GrishaGroupGenerator" ], "doctrine": "coldwar" -} +} \ No newline at end of file diff --git a/resources/factions/syria_1967_with_ww2_weapons.json b/resources/factions/syria_1967_with_ww2_weapons.json index cda98f1d..aeaaa789 100644 --- a/resources/factions/syria_1967_with_ww2_weapons.json +++ b/resources/factions/syria_1967_with_ww2_weapons.json @@ -4,40 +4,39 @@ "authors": "Khopa", "description": "

Syria and Arab armies in the 1967 6 days war against Israel. Using WW2 units to be more accurate (Yes, Syria used Panzer IV, Stug III and Jagdpanzer IV during this war)

", "aircrafts": [ - "MiG_15bis", - "MiG_19P", - "MiG_21Bis", - - "Su_17M4", - "Mi_8MT" + "Mi-8MTV2 Hip", + "MiG-15bis Fagot", + "MiG-19P Farmer-B", + "MiG-21bis Fishbed-N", + "Su-17M4 Fitter-K" ], "awacs": [ - "A_50" + "A-50" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "Scout_BRDM_2", - "MBT_T_55", - "LT_PT_76", - "Tk_PzIV_H", - "SPG_StuG_III_Ausf__G", - "SPG_Jagdpanzer_IV", - "SPAAA_ZSU_57_2", - "AAA_S_60_57mm" + "BRDM-2", + "Jagdpanzer IV", + "PT-76", + "Panzerkampfwagen IV Ausf. H", + "S-60 57mm", + "Sturmgesch\u00fctz III Ausf. G", + "T-55A", + "ZSU-57-2 'Sparka'" ], "artillery_units": [ - "MLRS_BM_21_Grad_122mm" + "BM-21 Grad" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Paratrooper_AKS", - "Infantry_AK_74_Rus", - "Infantry_RPG" + "Infantry AK-74 Rus", + "Infantry RPG", + "Paratrooper AKS" ], "air_defenses": [ "EarlyColdWarFlakGenerator", @@ -51,22 +50,17 @@ "ewrs": [ "FlatFaceGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], - "carrier_names": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "helicopter_carrier_names": [], + "destroyers": [], + "cruisers": [], + "carrier_names": [], "navy_generators": [ "GrishaGroupGenerator" - ], "requirements": { - "WW2 Asset Pack": "https://www.digitalcombatsimulator.com/en/products/other/wwii_assets_pack/" + ], + "requirements": { + "WW2 Asset Pack": "https://www.digitalcombatsimulator.com/en/products/other/wwii_assets_pack/" }, "doctrine": "coldwar" -} +} \ No newline at end of file diff --git a/resources/factions/syria_1973.json b/resources/factions/syria_1973.json index f5467de4..dfedce53 100644 --- a/resources/factions/syria_1973.json +++ b/resources/factions/syria_1973.json @@ -2,40 +2,40 @@ "country": "Syria", "name": "Syria 1973", "authors": "Khopa", - "description": "

Syria and Arab armies during the Yom Kippur War

" , + "description": "

Syria and Arab armies during the Yom Kippur War

", "aircrafts": [ - "MiG_21Bis", - "MiG_19P", - "MiG_15bis", - "Su_17M4", - "Mi_8MT" + "Mi-8MTV2 Hip", + "MiG-15bis Fagot", + "MiG-19P Farmer-B", + "MiG-21bis Fishbed-N", + "Su-17M4 Fitter-K" ], "awacs": [ - "A_50" + "A-50" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "IFV_BMP_1", - "APC_MTLB", - "MBT_T_55", - "LT_PT_76", - "SPAAA_ZU_23_2_Mounted_Ural_375", - "SPAAA_ZSU_57_2", - "AAA_S_60_57mm" + "BMP-1", + "MT-LB", + "PT-76", + "S-60 57mm", + "T-55A", + "ZSU-57-2 'Sparka'", + "ZU-23 on Ural-375" ], "artillery_units": [ - "MLRS_BM_21_Grad_122mm" + "BM-21 Grad" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Paratrooper_AKS", - "Infantry_AK_74_Rus", - "Infantry_RPG" + "Infantry AK-74 Rus", + "Infantry RPG", + "Paratrooper AKS" ], "air_defenses": [ "EarlyColdWarFlakGenerator", @@ -56,21 +56,15 @@ "ScudGenerator" ], "missiles_group_count": 1, - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "helicopter_carrier_names": [], + "destroyers": [], + "cruisers": [], "requirements": {}, - "carrier_names": [ - ], + "carrier_names": [], "navy_generators": [ "GrishaGroupGenerator" ], "doctrine": "coldwar" -} +} \ No newline at end of file diff --git a/resources/factions/syria_1982.json b/resources/factions/syria_1982.json index 022fe6ea..04267623 100644 --- a/resources/factions/syria_1982.json +++ b/resources/factions/syria_1982.json @@ -4,40 +4,40 @@ "authors": "Khopa", "description": "

Syria and Arab armies in the 1982 invasion of Lebanon

", "aircrafts": [ - "MiG_19P", - "MiG_21Bis", - "MiG_23MLD", - "MiG_25PD", - "Su_17M4", - "Mi_8MT" + "Mi-8MTV2 Hip", + "MiG-19P Farmer-B", + "MiG-21bis Fishbed-N", + "MiG-23MLD Flogger-K", + "MiG-25PD Foxbat-E", + "Su-17M4 Fitter-K" ], "awacs": [ - "A_50" + "A-50" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "IFV_BMP_1", - "APC_MTLB", - "MBT_T_55", - "LT_PT_76", - "MBT_T_72B", - "SPAAA_ZU_23_2_Mounted_Ural_375", - "SPAAA_ZSU_57_2", - "AAA_S_60_57mm" + "BMP-1", + "MT-LB", + "PT-76", + "S-60 57mm", + "T-55A", + "T-72B with Kontakt-1 ERA", + "ZSU-57-2 'Sparka'", + "ZU-23 on Ural-375" ], "artillery_units": [ - "MLRS_BM_21_Grad_122mm" + "BM-21 Grad" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Paratrooper_AKS", - "Infantry_AK_74_Rus", - "Paratrooper_RPG_16" + "Infantry AK-74 Rus", + "Paratrooper AKS", + "Paratrooper RPG-16" ], "air_defenses": [ "ColdWarFlakGenerator", @@ -60,20 +60,14 @@ "ScudGenerator" ], "missiles_group_count": 1, - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "helicopter_carrier_names": [], + "destroyers": [], + "cruisers": [], "requirements": {}, - "carrier_names": [ - ], + "carrier_names": [], "navy_generators": [ "GrishaGroupGenerator" ] -} +} \ No newline at end of file diff --git a/resources/factions/syria_2011.json b/resources/factions/syria_2011.json index c5a3e375..4e3d46fd 100644 --- a/resources/factions/syria_2011.json +++ b/resources/factions/syria_2011.json @@ -4,52 +4,53 @@ "authors": "Khopa", "description": "

Syrian Arab Army at the start of the Syrian Civil War.

", "aircrafts": [ - "MiG_21Bis", - "MiG_23MLD", - "MiG_25PD", - "MiG_29S", - "Su_17M4", - "Su_24M", - "L_39ZA", - "Mi_24V", - "Mi_8MT", - "SA342M", - "SA342L" + "L-39ZA Albatros", + "Mi-24V Hind-E", + "Mi-24P Hind-F", + "Mi-8MTV2 Hip", + "MiG-21bis Fishbed-N", + "MiG-23MLD Flogger-K", + "MiG-25PD Foxbat-E", + "MiG-29S Fulcrum-C", + "SA 342L Gazelle", + "SA 342M Gazelle", + "Su-17M4 Fitter-K", + "Su-24M Fencer-D" ], "awacs": [ - "A_50" + "A-50" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "IFV_BMP_1", - "IFV_BMP_2", - "APC_BTR_80", - "Scout_BRDM_2", - "LT_PT_76", - "APC_MTLB", - "Scout_Cobra", - "MBT_T_55", - "MBT_T_72B", - "MBT_T_90", - "SPAAA_ZSU_57_2" + "BMP-1", + "BMP-2", + "BRDM-2", + "BTR-80", + "Cobra", + "MT-LB", + "PT-76", + "T-55A", + "T-72B with Kontakt-1 ERA", + "T-90A", + "ZSU-57-2 'Sparka'" ], "artillery_units": [ - "MLRS_9K57_Uragan_BM_27_220mm", - "SPM_2S9_Nona_120mm_M", - "MLRS_BM_21_Grad_122mm", - "SPH_2S1_Gvozdika_122mm" + "2S1 Gvozdika", + "2S9 Nona-S", + "BM-21 Grad", + "BM-27 Uragan" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Paratrooper_AKS", - "Infantry_AK_74_Rus", - "Paratrooper_RPG_16", - "MANPADS_SA_18_Igla_S_Grouse" + "Infantry AK-74 Rus", + "MANPADS SA-18 Igla-S \"Grouse\"", + "Paratrooper AKS", + "Paratrooper RPG-16" ], "air_defenses": [ "ColdWarFlakGenerator", @@ -75,20 +76,15 @@ "ScudGenerator" ], "missiles_group_count": 1, - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "helicopter_carrier_names": [], + "destroyers": [], + "cruisers": [], "requirements": {}, - "carrier_names": [ - ], + "carrier_names": [], "navy_generators": [ - "GrishaGroupGenerator", "MolniyaGroupGenerator" + "GrishaGroupGenerator", + "MolniyaGroupGenerator" ] -} +} \ No newline at end of file diff --git a/resources/factions/syria_2012.json b/resources/factions/syria_2012.json index f5c5f3cb..21750851 100644 --- a/resources/factions/syria_2012.json +++ b/resources/factions/syria_2012.json @@ -4,53 +4,54 @@ "authors": "Headiii", "description": "

Syrian Army with more modern Imports and supported by a Russian Expeditionary Force.

", "aircrafts": [ - "MiG_23MLD", - "MiG_25PD", - "MiG_29S", - "Su_24M", - "Su_25", - "Su_30", - "Su_34", - "L_39ZA", - "Mi_24V", - "Mi_8MT", - "SA342M", - "SA342L" + "L-39ZA Albatros", + "Mi-24V Hind-E", + "Mi-24P Hind-F", + "Mi-8MTV2 Hip", + "MiG-23MLD Flogger-K", + "MiG-25PD Foxbat-E", + "MiG-29S Fulcrum-C", + "SA 342L Gazelle", + "SA 342M Gazelle", + "Su-24M Fencer-D", + "Su-25 Frogfoot", + "Su-30 Flanker-C", + "Su-34 Fullback" ], "awacs": [ - "A_50" + "A-50" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "IFV_BMP_1", - "IFV_BMP_2", - "APC_BTR_80", - "Scout_BRDM_2", - "LT_PT_76", - "APC_MTLB", - "Scout_Cobra", - "MBT_T_55", - "MBT_T_72B", - "MBT_T_90", - "SPAAA_ZSU_57_2" + "BMP-1", + "BMP-2", + "BRDM-2", + "BTR-80", + "Cobra", + "MT-LB", + "PT-76", + "T-55A", + "T-72B with Kontakt-1 ERA", + "T-90A", + "ZSU-57-2 'Sparka'" ], "artillery_units": [ - "MLRS_9K57_Uragan_BM_27_220mm", - "SPM_2S9_Nona_120mm_M", - "MLRS_BM_21_Grad_122mm", - "SPH_2S1_Gvozdika_122mm" + "2S1 Gvozdika", + "2S9 Nona-S", + "BM-21 Grad", + "BM-27 Uragan" ], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Paratrooper_AKS", - "Infantry_AK_74_Rus", - "Paratrooper_RPG_16", - "MANPADS_SA_18_Igla_S_Grouse" + "Infantry AK-74 Rus", + "MANPADS SA-18 Igla-S \"Grouse\"", + "Paratrooper AKS", + "Paratrooper RPG-16" ], "air_defenses": [ "ColdWarFlakGenerator", @@ -76,21 +77,15 @@ "ScudGenerator" ], "missiles_group_count": 1, - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "helicopter_carrier_names": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "helicopter_carrier_names": [], + "destroyers": [], + "cruisers": [], "requirements": {}, - "carrier_names": [ - ], + "carrier_names": [], "navy_generators": [ "GrishaGroupGenerator", "MolniyaGroupGenerator" ] -} +} \ No newline at end of file diff --git a/resources/factions/turkey_2005.json b/resources/factions/turkey_2005.json index 16343880..07999814 100644 --- a/resources/factions/turkey_2005.json +++ b/resources/factions/turkey_2005.json @@ -3,39 +3,47 @@ "name": "Turkey 2005", "authors": "Khopa", "description": "

Turkish army in the mid/late 2000s.

", - "locales": ["tr_TR"], + "locales": [ + "tr_TR" + ], "aircrafts": [ - "F_16C_50", - "F_4E", - "UH_1H", - "AH_1W" + "AH-1W SuperCobra", + "C-130", + "CH-47D", + "F-16CM Fighting Falcon (Block 50)", + "F-4E Phantom II", + "OH-58D Kiowa Warrior", + "UH-1H Iroquois", + "UH-60A" ], "awacs": [ - "E_3A" + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-135 Stratotanker" ], "frontline_units": [ - "MBT_Leopard_2A4_Trs", - "MBT_Leopard_1A3", - "MBT_M60A3_Patton", - "Scout_Cobra", - "APC_BTR_80", - "SAM_Avenger__Stinger" + "BTR-80", + "Cobra", + "Leopard 1A3", + "Leopard 2A4 Trs", + "M1097 Heavy HMMWV Avenger", + "M113", + "M60A3 \"Patton\"" ], "artillery_units": [ - "SPH_T155_Firtina_155mm" + "Firtina", + "M109A6 Paladin", + "M270 Multiple Launch Rocket System" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "Paratrooper_AKS", - "MANPADS_SA_18_Igla_S_Grouse" + "Infantry M249", + "Infantry M4", + "MANPADS SA-18 Igla-S \"Grouse\"", + "Paratrooper AKS" ], "air_defenses": [ "AvengerGenerator", @@ -51,5 +59,5 @@ "OliverHazardPerryGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/uae_2005.json b/resources/factions/uae_2005.json index 265e2dfb..b4b725b0 100644 --- a/resources/factions/uae_2005.json +++ b/resources/factions/uae_2005.json @@ -4,32 +4,31 @@ "authors": "Khopa", "description": "

UAR army in the 2000s.

", "aircrafts": [ - "M_2000C", - "Mirage_2000_5", - "F_16C_50", - "AH_64D" + "AH-64D Apache Longbow", + "F-16CM Fighting Falcon (Block 50)", + "Mirage 2000-5", + "Mirage 2000C" ], "awacs": [ - "E_3A" + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "MBT_Leclerc", - "APC_TPz_Fuchs", - "IFV_BMP_3" - ], - "artillery_units": [ + "BMP-3", + "Leclerc S\u00e9ries 2", + "TPz Fuchs" ], + "artillery_units": [], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_SA_18_Igla_S_Grouse" + "Infantry M249", + "Infantry M4", + "MANPADS SA-18 Igla-S \"Grouse\"" ], "air_defenses": [ "HawkGenerator", @@ -39,11 +38,10 @@ "HawkEwrGenerator" ], "requirements": {}, - "carrier_names": [ - ], + "carrier_names": [], "navy_generators": [ "OliverHazardPerryGroupGenerator" ], "has_jtac": true, - "jtac_unit": "WingLoong_I" -} + "jtac_unit": "WingLoong-I" +} \ No newline at end of file diff --git a/resources/factions/uae_2015.json b/resources/factions/uae_2015.json index 10bc290c..58568c21 100644 --- a/resources/factions/uae_2015.json +++ b/resources/factions/uae_2015.json @@ -4,36 +4,35 @@ "authors": "Khopa", "description": "

UAE army in the 2010s.

", "aircrafts": [ - "AH_64D", - "C_130", - "C_17A", - "CH_47D", - "F_16C_50", - "M_2000C", - "Mirage_2000_5", - "UH_60A" + "AH-64D Apache Longbow", + "C-130", + "C-17A", + "CH-47D", + "F-16CM Fighting Falcon (Block 50)", + "Mirage 2000-5", + "Mirage 2000C", + "UH-60A" ], "awacs": [ - "E_3A" + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "MBT_Leclerc", - "APC_TPz_Fuchs", - "IFV_BMP_3" - ], - "artillery_units": [ + "BMP-3", + "Leclerc S\u00e9ries 2", + "TPz Fuchs" ], + "artillery_units": [], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_SA_18_Igla_S_Grouse" + "Infantry M249", + "Infantry M4", + "MANPADS SA-18 Igla-S \"Grouse\"" ], "air_defenses": [ "HawkGenerator", @@ -44,11 +43,10 @@ "PatriotEwrGenerator" ], "requirements": {}, - "carrier_names": [ - ], + "carrier_names": [], "navy_generators": [ "OliverHazardPerryGroupGenerator" ], "has_jtac": true, - "jtac_unit": "WingLoong_I" -} + "jtac_unit": "WingLoong-I" +} \ No newline at end of file diff --git a/resources/factions/uk_1944.json b/resources/factions/uk_1944.json index 2a1aa650..0d46a014 100644 --- a/resources/factions/uk_1944.json +++ b/resources/factions/uk_1944.json @@ -3,57 +3,52 @@ "name": "United Kingdom 1944", "authors": "Khopa", "description": "

United Kingdom army in 1944.

", - "locales": ["en_UK"], + "locales": [ + "en_UK" + ], "aircrafts": [ - "P_51D", - "P_51D_30_NA", - "P_47D_30", - "P_47D_30bl1", - "P_47D_40", - "SpitfireLFMkIX", - "SpitfireLFMkIXCW", - "A_20G", - "B_17G" + "Boston Mk.III", + "Fortress Mk.III", + "Mustang Mk.IV (Early)", + "Mustang Mk.IV (Late)", + "Spitfire LF Mk IX", + "Spitfire LF Mk IX (Clipped Wings)", + "Thunderbolt Mk.II (Early)", + "Thunderbolt Mk.II (Late)", + "Thunderbolt Mk.II (Mid)" ], "frontline_units": [ - "MT_M4A4_Sherman_Firefly", - "Tk_M4_Sherman", - "APC_M2A1_Halftrack", - "CT_Cromwell_IV", - "CT_Centaur_IV", - "HIT_Churchill_VII", - "Car_Daimler_Armored", - "LT_Mk_VII_Tetrarch", - "AAA_Bofors_40mm" - ], - "artillery_units": [ + "A17 Light Tank Mk VII Tetrarch", + "A22 Infantry Tank MK IV Churchill VII", + "A27L Cruiser Tank MK VIII Centaur IV", + "A27M Cruiser Tank MK VIII Cromwell IV", + "Daimler Armoured Car Mk I", + "M2A1 Half-Track", + "QF 40 mm Mark III", + "Sherman Firefly VC", + "Sherman III" ], + "artillery_units": [], "logistics_units": [ - "Truck_Bedford", - "Truck_GMC_Jimmy_6x6_Truck" + "Truck Bedford", + "Truck GMC \"Jimmy\" 6x6 Truck" ], "infantry_units": [ - "Infantry_SMLE_No_4_Mk_1" + "Infantry SMLE No.4 Mk-1" ], "air_defenses": [ "AllyWW2FlakGenerator", "BoforsGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "destroyers": [], + "cruisers": [], "requirements": { "WW2 Asset Pack": "https://www.digitalcombatsimulator.com/en/products/other/wwii_assets_pack/" }, - "carrier_names": [ - ], - "helicopter_carrier_names": [ - ], + "carrier_names": [], + "helicopter_carrier_names": [], "navy_generators": [ "WW2LSTGroupGenerator" ], @@ -61,4 +56,4 @@ "has_jtac": false, "doctrine": "ww2", "building_set": "ww2ally" -} +} \ No newline at end of file diff --git a/resources/factions/uk_1990.json b/resources/factions/uk_1990.json index 92b386ca..38ae53d2 100644 --- a/resources/factions/uk_1990.json +++ b/resources/factions/uk_1990.json @@ -3,41 +3,43 @@ "name": "United Kingdom 1990", "authors": "Khopa", "description": "

United Kingdom Army in the 1990s.

", - "locales": ["en_UK"], + "locales": [ + "en_UK" + ], "aircrafts": [ - "Tornado_GR4", - "AV8BNA", - "F_4E", - "SA342M", - "AH_64A" + "AH-64A Apache", + "AV-8B Harrier II Night Attack", + "Gazelle AH.1", + "Phantom F.3", + "Tornado GR4" ], "awacs": [ - "E_3A" + "E-3A" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "MBT_Challenger_II", - "MBT_Chieftain_Mk_3", - "IFV_Warrior", - "Scout_HMMWV", - "ATGM_HMMWV", - "SAM_Avenger__Stinger" + "Chieftain Mk.3", + "FV4034 Challenger 2", + "FV510 Warrior", + "M1043 HMMWV (M2 HMG)", + "M1045 HMMWV (BGM-71 TOW)", + "M1097 Heavy HMMWV Avenger" ], "artillery_units": [ - "MLRS_M270_227mm", - "SPH_M109_Paladin_155mm" + "M109A6 Paladin", + "M270 Multiple Launch Rocket System" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "Mortar_2B11_120mm", - "MANPADS_Stinger" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger", + "Mortar 2B11 120mm" ], "air_defenses": [ "AvengerGenerator", @@ -48,20 +50,19 @@ "HawkEwrGenerator" ], "aircraft_carrier": [ - "CVN_74_John_C__Stennis" + "Stennis" ], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "FFG_Oliver_Hazzard_Perry" + "PERRY" ], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "requirements": {}, - "carrier_names": [ - ], + "carrier_names": [], "helicopter_carrier_names": [ "HMS Invincible", "HMS Illustrious", @@ -72,5 +73,5 @@ "ArleighBurkeGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper" -} + "jtac_unit": "MQ-9 Reaper" +} \ No newline at end of file diff --git a/resources/factions/ukraine_2010.json b/resources/factions/ukraine_2010.json index 644b9799..e379cdcc 100644 --- a/resources/factions/ukraine_2010.json +++ b/resources/factions/ukraine_2010.json @@ -4,41 +4,41 @@ "authors": "Khopa", "description": "

Ukrainian army in the 2010s.

", "aircrafts": [ - "Su_25", - "Su_25T", - "Su_24M", - "Su_27", - "MiG_29S", - "L_39ZA", - "Mi_8MT", - "Mi_24V" + "L-39ZA Albatros", + "Mi-24V Hind-E", + "Mi-24P Hind-F", + "Mi-8MTV2 Hip", + "MiG-29S Fulcrum-C", + "Su-24M Fencer-D", + "Su-25 Frogfoot", + "Su-25T Frogfoot", + "Su-27 Flanker-B" ], "awacs": [ - "A_50" + "A-50" ], "tankers": [ - "IL_78M" + "IL-78M" ], "frontline_units": [ - "Scout_HMMWV", - "IFV_BMP_3", - "IFV_BMP_2", - "APC_BTR_80", - "MBT_T_80U", - "MBT_T_72B", - "SAM_SA_13_Strela_10M3_Gopher_TEL" - ], - "artillery_units": [ + "BMP-2", + "BMP-3", + "BTR-80", + "M1043 HMMWV (M2 HMG)", + "SA-13 Gopher (9K35 Strela-10M3)", + "T-72B with Kontakt-1 ERA", + "T-80UD" ], + "artillery_units": [], "logistics_units": [ - "Truck_Ural_375", - "LUV_UAZ_469_Jeep" + "LUV UAZ-469 Jeep", + "Truck Ural-375" ], "infantry_units": [ - "Paratrooper_AKS", - "Infantry_AK_74_Rus", - "Paratrooper_RPG_16", - "MANPADS_SA_18_Igla_S_Grouse" + "Infantry AK-74 Rus", + "MANPADS SA-18 Igla-S \"Grouse\"", + "Paratrooper AKS", + "Paratrooper RPG-16" ], "air_defenses": [ "SA3Generator", @@ -67,4 +67,4 @@ "navy_generators": [ "GrishaGroupGenerator" ] -} +} \ No newline at end of file diff --git a/resources/factions/unc_1950_fictional.json b/resources/factions/unc_1950_fictional.json index 7651897b..22fe3170 100644 --- a/resources/factions/unc_1950_fictional.json +++ b/resources/factions/unc_1950_fictional.json @@ -4,28 +4,28 @@ "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" + "A-20G Havoc", + "B-17G Flying Fortress", + "F-86F Sabre", + "P-47D-40 Thunderbolt", + "P-51D-25-NA Mustang", + "P-51D-30-NA Mustang" ], "frontline_units": [ - "Tk_M4_Sherman", - "MBT_M60A3_Patton", - "APC_M2A1_Halftrack", - "Car_M8_Greyhound_Armored", - "AAA_Bofors_40mm" + "Bofors 40 mm Gun", + "M2A1 Half-Track", + "M4A2(75) Sherman", + "M60A3 \"Patton\"", + "M8 Greyhound Light Armored Car" ], "artillery_units": [ - "SPG_M12_GMC_155mm" + "M12 Gun Motor Carriage" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4" + "Infantry M4" ], "air_defenses": [ "AllyWW2FlakGenerator", @@ -36,6 +36,6 @@ "doctrine": "ww2", "building_set": "ww2ally", "requirements": { - "WW2 Asset Pack": "https://www.digitalcombatsimulator.com/en/products/other/wwii_assets_pack/" + "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 d8dc6f9e..6ddb89a6 100644 --- a/resources/factions/us_aggressors.json +++ b/resources/factions/us_aggressors.json @@ -3,54 +3,56 @@ "name": "USAF Aggressors", "authors": "Khopa", "description": "

USAF aggresors.

", - "locales": ["en_US"], + "locales": [ + "en_US" + ], "aircrafts": [ - "F_15C", - "F_15E", - "F_14B", - "FA_18C_hornet", - "F_16C_50", - "A_10A", - "A_10C", - "AV8BNA", - "UH_1H", - "SH_60B", - "AH_64D", - "Ka_50", - "B_52H", - "B_1B", - "F_117A", - "Su_27" + "A-10A Thunderbolt II", + "A-10C Thunderbolt II (Suite 3)", + "AH-64D Apache Longbow", + "AV-8B Harrier II Night Attack", + "B-1B Lancer", + "B-52H Stratofortress", + "F-117A Nighthawk", + "F-14B Tomcat", + "F-15C Eagle", + "F-15E Strike Eagle", + "F-16CM Fighting Falcon (Block 50)", + "F/A-18C Hornet (Lot 20)", + "Ka-50 Hokum", + "SH-60B Seahawk", + "Su-27 Flanker-B", + "UH-1H Iroquois" ], "awacs": [ - "E_3A", - "E_2C" + "E-2C Hawkeye", + "E-3A" ], "tankers": [ - "KC_135", - "KC135MPRS", - "KC130", + "KC-130", + "KC-135 Stratotanker", + "KC-135 Stratotanker MPRS", "S-3B Tanker" ], "frontline_units": [ - "MBT_M1A2_Abrams", - "MBT_Leopard_2A4", - "ATGM_Stryker", - "IFV_M2A2_Bradley", - "IFV_LAV_25", - "Scout_HMMWV", - "SAM_Avenger__Stinger" + "LAV-25", + "Leopard 2A4", + "M1043 HMMWV (M2 HMG)", + "M1097 Heavy HMMWV Avenger", + "M1134 Stryker ATGM (BGM-71 TOW)", + "M1A2 Abrams", + "M2A2 Bradley" ], "artillery_units": [ - "MLRS_M270_227mm", - "SPH_M109_Paladin_155mm" + "M109A6 Paladin", + "M270 Multiple Launch Rocket System" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249" + "Infantry M249", + "Infantry M4" ], "air_defenses": [ "AvengerGenerator", @@ -65,24 +67,25 @@ "OliverHazardPerryGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper", + "jtac_unit": "MQ-9 Reaper", "liveries_overrides": { - "FA_18C_hornet": [ - "NSAWC brown splinter", + "F/A-18C Hornet (Lot 20)": [ "NAWDC black", + "NSAWC brown splinter", "VFC-12" ], - "F_15C": [ + "F-15C Eagle": [ "65th Aggressor SQN (WA) MiG", "65th Aggressor SQN (WA) MiG", "65th Aggressor SQN (WA) SUPER_Flanker" ], - "F_16C_50": [ + "F-16CM Fighting Falcon (Block 50)": [ + "64th_aggressor_squadron_ghost", "usaf 64th aggressor sqn - shark", - "usaf 64th aggressor sqn-splinter", - "64th_aggressor_squadron_ghost" - ], "F_14B": [ + "usaf 64th aggressor sqn-splinter" + ], + "F-14B Tomcat": [ "vf-74 adversary" ] } -} +} \ No newline at end of file diff --git a/resources/factions/usa_1944.json b/resources/factions/usa_1944.json index 107051dd..7237b9e0 100644 --- a/resources/factions/usa_1944.json +++ b/resources/factions/usa_1944.json @@ -3,53 +3,49 @@ "name": "USA 1944", "authors": "Khopa", "description": "

US army in 1944, western front.

", - "locales": ["en_US"], + "locales": [ + "en_US" + ], "aircrafts": [ - "P_51D", - "P_51D_30_NA", - "P_47D_30", - "P_47D_30bl1", - "P_47D_40", - "SpitfireLFMkIX", - "A_20G", - "B_17G" + "A-20G Havoc", + "B-17G Flying Fortress", + "P-47D-30 Thunderbolt (Early)", + "P-47D-30 Thunderbolt (Late)", + "P-47D-40 Thunderbolt", + "P-51D-25-NA Mustang", + "P-51D-30-NA Mustang", + "Spitfire LF Mk IX" ], "frontline_units": [ - "MT_M4A4_Sherman_Firefly", - "Tk_M4_Sherman", - "APC_M2A1_Halftrack", - "Car_M8_Greyhound_Armored", - "SPG_M10_GMC", - "AAA_QF_3_7" + "M10 3-inch Gun Motor Carriage", + "M2A1 Half-Track", + "M4A2(75) Sherman", + "M4A4 Sherman Firefly", + "M8 Greyhound Light Armored Car", + "QF 3.7-inch AA Gun" ], "artillery_units": [ - "SPG_M12_GMC_155mm" + "M12 Gun Motor Carriage" ], "logistics_units": [ - "Truck_GMC_Jimmy_6x6_Truck" + "Truck GMC \"Jimmy\" 6x6 Truck" ], "infantry_units": [ - "Infantry_M1_Garand" + "Infantry M1 Garand" ], "air_defenses": [ "AllyWW2FlakGenerator", "BoforsGenerator" ], - "aircraft_carrier": [ - ], - "helicopter_carrier": [ - ], - "destroyers": [ - ], - "cruisers": [ - ], + "aircraft_carrier": [], + "helicopter_carrier": [], + "destroyers": [], + "cruisers": [], "requirements": { "WW2 Asset Pack": "https://www.digitalcombatsimulator.com/en/products/other/wwii_assets_pack/" }, - "carrier_names": [ - ], - "helicopter_carrier_names": [ - ], + "carrier_names": [], + "helicopter_carrier_names": [], "navy_generators": [ "WW2LSTGroupGenerator" ], @@ -57,4 +53,4 @@ "has_jtac": false, "doctrine": "ww2", "building_set": "ww2ally" -} +} \ No newline at end of file diff --git a/resources/factions/usa_1955.json b/resources/factions/usa_1955.json index cb767293..7fb38cbb 100644 --- a/resources/factions/usa_1955.json +++ b/resources/factions/usa_1955.json @@ -3,28 +3,30 @@ "name": "USA 1955", "authors": "Khopa", "description": "

US army in the 50s, circa Korean War.

", - "locales": ["en_US"], + "locales": [ + "en_US" + ], "aircrafts": [ - "B_52H", - "C_130", - "F_86F_Sabre", - "P_51D", - "P_51D_30_NA" + "B-52H Stratofortress", + "C-130", + "F-86F Sabre", + "P-51D-25-NA Mustang", + "P-51D-30-NA Mustang" ], "frontline_units": [ - "Tk_M4_Sherman", - "MBT_M60A3_Patton", - "APC_M2A1_Halftrack", - "AAA_Bofors_40mm" + "Bofors 40 mm Gun", + "M2A1 Half-Track", + "M4A2(75) Sherman", + "M60A3 \"Patton\"" ], "artillery_units": [ - "SPG_M12_GMC_155mm" + "M12 Gun Motor Carriage" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4" + "Infantry M4" ], "air_defenses": [ "BoforsGenerator", @@ -33,6 +35,6 @@ "doctrine": "ww2", "building_set": "ww2ally", "requirements": { - "WW2 Asset Pack": "https://www.digitalcombatsimulator.com/en/products/other/wwii_assets_pack/" + "WW2 Asset Pack": "https://www.digitalcombatsimulator.com/en/products/other/wwii_assets_pack/" } -} +} \ No newline at end of file diff --git a/resources/factions/usa_1960.json b/resources/factions/usa_1960.json index f15a8685..ed8b1a74 100644 --- a/resources/factions/usa_1960.json +++ b/resources/factions/usa_1960.json @@ -3,27 +3,28 @@ "name": "USA 1960", "authors": "Khopa", "description": "

US army in the 60s, pre-Vietnam war.

", - "locales": ["en_US"], + "locales": [ + "en_US" + ], "aircrafts": [ - "B_52H", - "C_130", - "F_86F_Sabre", - "P_51D", - "P_51D_30_NA", - "UH_1H" + "B-52H Stratofortress", + "C-130", + "F-86F Sabre", + "P-51D-25-NA Mustang", + "P-51D-30-NA Mustang", + "UH-1H Iroquois" ], "frontline_units": [ - "MBT_M60A3_Patton", - "APC_M113", - "SPAAA_Vulcan_M163" - ], - "artillery_units": [ + "M113", + "M163 Vulcan Air Defense System", + "M60A3 \"Patton\"" ], + "artillery_units": [], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4" + "Infantry M4" ], "air_defenses": [ "EarlyColdWarFlakGenerator", diff --git a/resources/factions/usa_1965.json b/resources/factions/usa_1965.json index ebab742c..ac220f8d 100644 --- a/resources/factions/usa_1965.json +++ b/resources/factions/usa_1965.json @@ -3,36 +3,38 @@ "name": "USA 1965", "authors": "Khopa", "description": "

US army in the late 60s, during Vietnam war.

", - "locales": ["en_US"], + "locales": [ + "en_US" + ], "aircrafts": [ - "B_52H", - "CH_47D", - "C_130", - "F_4E", - "F_5E_3", - "UH_1H" + "B-52H Stratofortress", + "C-130", + "CH-47D", + "F-4E Phantom II", + "F-5E Tiger II", + "UH-1H Iroquois" ], "awacs": [ - "E_2C" + "E-2C Hawkeye" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "MBT_M60A3_Patton", - "APC_M113", - "SPAAA_Vulcan_M163" + "M113", + "M163 Vulcan Air Defense System", + "M60A3 \"Patton\"" ], "artillery_units": [ - "SPH_M109_Paladin_155mm" + "M109A6 Paladin" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249" + "Infantry M249", + "Infantry M4" ], "air_defenses": [ "ChaparralGenerator", diff --git a/resources/factions/usa_1975.json b/resources/factions/usa_1975.json index 747245e1..83474451 100644 --- a/resources/factions/usa_1975.json +++ b/resources/factions/usa_1975.json @@ -3,40 +3,42 @@ "name": "USA 1975", "authors": "Khopa", "description": "

US army in the 70s at the end of the war in Vietnam.

", - "locales": ["en_US"], + "locales": [ + "en_US" + ], "aircrafts": [ - "B_52H", - "CH_47D", - "CH_53E", - "C_130", - "F_14A_135_GR", - "F_4E", - "F_5E_3", - "S_3B", - "UH_1H" + "B-52H Stratofortress", + "C-130", + "CH-47D", + "CH-53E", + "F-14A Tomcat (Block 135-GR Late)", + "F-4E Phantom II", + "F-5E Tiger II", + "S-3B Viking", + "UH-1H Iroquois" ], "awacs": [ - "E_2C" + "E-2C Hawkeye" ], "tankers": [ - "KC_135", - "KC130" + "KC-130", + "KC-135 Stratotanker" ], "frontline_units": [ - "MBT_M60A3_Patton", - "APC_M113", - "SAM_Chaparral_M48", - "SPAAA_Vulcan_M163" + "M113", + "M163 Vulcan Air Defense System", + "M48 Chaparral", + "M60A3 \"Patton\"" ], "artillery_units": [ - "SPH_M109_Paladin_155mm" + "M109A6 Paladin" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249" + "Infantry M249", + "Infantry M4" ], "air_defenses": [ "ChaparralGenerator", diff --git a/resources/factions/usa_1990.json b/resources/factions/usa_1990.json index dcb59b8f..0519f175 100644 --- a/resources/factions/usa_1990.json +++ b/resources/factions/usa_1990.json @@ -3,60 +3,62 @@ "name": "USA 1990", "authors": "Khopa", "description": "

US army in the 90s, Gulf War/Desert Storm.

", - "locales": ["en_US"], + "locales": [ + "en_US" + ], "aircrafts": [ - "AH_64A", - "AV8BNA", - "A_10A", - "B_1B", - "B_52H", - "CH_47D", - "CH_53E", - "C_130", - "FA_18C_hornet", - "F_117A", - "F_14A_135_GR", - "F_14B", - "F_15C", - "F_15E", - "F_16C_50", - "SH_60B", - "SH_60B", - "S_3B", - "UH_1H", - "UH_60A" + "A-10A Thunderbolt II", + "AH-64A Apache", + "AV-8B Harrier II Night Attack", + "B-1B Lancer", + "B-52H Stratofortress", + "C-130", + "CH-47D", + "CH-53E", + "F-117A Nighthawk", + "F-14A Tomcat (Block 135-GR Late)", + "F-14B Tomcat", + "F-15C Eagle", + "F-15E Strike Eagle", + "F-16CM Fighting Falcon (Block 50)", + "F/A-18C Hornet (Lot 20)", + "S-3B Viking", + "SH-60B Seahawk", + "SH-60B Seahawk", + "UH-1H Iroquois", + "UH-60A" ], "awacs": [ - "E_3A", - "E_2C" + "E-2C Hawkeye", + "E-3A" ], "tankers": [ - "KC_135", - "KC130", + "KC-130", + "KC-135 Stratotanker", "S-3B Tanker" ], "frontline_units": [ - "MBT_M1A2_Abrams", - "ATGM_Stryker", - "IFV_M1126_Stryker_ICV", - "IFV_M2A2_Bradley", - "IFV_LAV_25", - "Scout_HMMWV", - "ATGM_HMMWV", - "SAM_Avenger__Stinger" + "LAV-25", + "M1043 HMMWV (M2 HMG)", + "M1045 HMMWV (BGM-71 TOW)", + "M1097 Heavy HMMWV Avenger", + "M1126 Stryker ICV (M2 HMG)", + "M1134 Stryker ATGM (BGM-71 TOW)", + "M1A2 Abrams", + "M2A2 Bradley" ], "artillery_units": [ - "MLRS_M270_227mm", - "SPH_M109_Paladin_155mm" + "M109A6 Paladin", + "M270 Multiple Launch Rocket System" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger", - "Mortar_2B11_120mm" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger", + "Mortar 2B11 120mm" ], "air_defenses": [ "AvengerGenerator", @@ -68,17 +70,17 @@ "PatriotEwrGenerator" ], "aircraft_carrier": [ - "CVN_74_John_C__Stennis" + "Stennis" ], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "FFG_Oliver_Hazzard_Perry", - "DDG_Arleigh_Burke_IIa" + "PERRY", + "USS_Arleigh_Burke_IIa" ], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "requirements": {}, "carrier_names": [ @@ -100,16 +102,16 @@ "ArleighBurkeGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper", + "jtac_unit": "MQ-9 Reaper", "liveries_overrides": { - "FA_18C_hornet": [ - "VFA-37", + "F/A-18C Hornet (Lot 20)": [ "VFA-106", "VFA-113", "VFA-122", "VFA-131", "VFA-192", "VFA-34", + "VFA-37", "VFA-83", "VFA-87", "VFA-97", @@ -121,4 +123,4 @@ "VMFA-323" ] } -} +} \ No newline at end of file diff --git a/resources/factions/usa_2005.json b/resources/factions/usa_2005.json index 957555d3..b2afc54c 100644 --- a/resources/factions/usa_2005.json +++ b/resources/factions/usa_2005.json @@ -3,63 +3,65 @@ "name": "USA 2005", "authors": "Khopa", "description": "

USA in the 2000s.

", - "locales": ["en_US"], + "locales": [ + "en_US" + ], "aircrafts": [ - "AH_64D", - "AV8BNA", - "A_10C", - "A_10C_2", - "B_1B", - "B_52H", - "CH_47D", - "CH_53E", - "C_130", - "C_17A", - "FA_18C_hornet", - "F_117A", - "F_14B", - "F_15C", - "F_15E", - "F_16C_50", - "SH_60B", - "S_3B", - "UH_1H", - "UH_60A" + "A-10C Thunderbolt II (Suite 3)", + "A-10C Thunderbolt II (Suite 7)", + "AH-64D Apache Longbow", + "AV-8B Harrier II Night Attack", + "B-1B Lancer", + "B-52H Stratofortress", + "C-130", + "C-17A", + "CH-47D", + "CH-53E", + "F-117A Nighthawk", + "F-14B Tomcat", + "F-15C Eagle", + "F-15E Strike Eagle", + "F-16CM Fighting Falcon (Block 50)", + "F/A-18C Hornet (Lot 20)", + "S-3B Viking", + "SH-60B Seahawk", + "UH-1H Iroquois", + "UH-60A" ], "awacs": [ - "E_3A", - "E_2C" + "E-2C Hawkeye", + "E-3A" ], "tankers": [ - "KC_135", - "KC135MPRS", - "KC130", + "KC-130", + "KC-135 Stratotanker", + "KC-135 Stratotanker MPRS", "S-3B Tanker" ], "frontline_units": [ - "MBT_M1A2_Abrams", - "ATGM_Stryker", - "IFV_M1126_Stryker_ICV", - "IFV_M2A2_Bradley", - "IFV_LAV_25", - "Scout_HMMWV", - "ATGM_HMMWV", - "SAM_Avenger__Stinger", - "SAM_Linebacker___Bradley_M6", - "SPG_Stryker_MGS" + "LAV-25", + "M1043 HMMWV (M2 HMG)", + "M1045 HMMWV (BGM-71 TOW)", + "M1097 Heavy HMMWV Avenger", + "M1126 Stryker ICV (M2 HMG)", + "M1128 Stryker Mobile Gun System", + "M1134 Stryker ATGM (BGM-71 TOW)", + "M1A2 Abrams", + "M2A2 Bradley", + "M6 Linebacker" ], "artillery_units": [ - "MLRS_M270_227mm", - "SPH_M109_Paladin_155mm" + "M109A6 Paladin", + "M270 Multiple Launch Rocket System" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger", - "Mortar_2B11_120mm" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger", + "Mortar 2B11 120mm" ], "air_defenses": [ "AvengerGenerator", @@ -70,16 +72,16 @@ "PatriotEwrGenerator" ], "aircraft_carrier": [ - "CVN_74_John_C__Stennis" + "Stennis" ], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "DDG_Arleigh_Burke_IIa" + "USS_Arleigh_Burke_IIa" ], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "requirements": {}, "carrier_names": [ @@ -101,16 +103,16 @@ "OliverHazardPerryGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper", + "jtac_unit": "MQ-9 Reaper", "liveries_overrides": { - "FA_18C_hornet": [ - "VFA-37", + "F/A-18C Hornet (Lot 20)": [ "VFA-106", "VFA-113", "VFA-122", "VFA-131", "VFA-192", "VFA-34", + "VFA-37", "VFA-83", "VFA-87", "VFA-97", @@ -122,4 +124,4 @@ "VMFA-323" ] } -} +} \ No newline at end of file diff --git a/resources/factions/usa_2005_c130.json b/resources/factions/usa_2005_c130.json index 3523a6c9..d59e133e 100644 --- a/resources/factions/usa_2005_c130.json +++ b/resources/factions/usa_2005_c130.json @@ -3,63 +3,65 @@ "name": "USA 2005 (With C-130)", "authors": "Khopa", "description": "

USA in the 2000s.

", - "locales": ["en_US"], + "locales": [ + "en_US" + ], "aircrafts": [ - "AH_64D", - "AV8BNA", - "A_10C", - "A_10C_2", - "B_1B", - "B_52H", - "CH_47D", - "CH_53E", - "C_130", - "C_17A", - "FA_18C_hornet", - "F_117A", - "F_14B", - "F_15C", - "F_15E", - "F_16C_50", - "Hercules", - "SH_60B", - "S_3B", - "UH_1H", - "UH_60A" + "A-10C Thunderbolt II (Suite 3)", + "A-10C Thunderbolt II (Suite 7)", + "AH-64D Apache Longbow", + "AV-8B Harrier II Night Attack", + "B-1B Lancer", + "B-52H Stratofortress", + "C-130", + "C-130J-30 Super Hercules", + "C-17A", + "CH-47D", + "CH-53E", + "F-117A Nighthawk", + "F-14B Tomcat", + "F-15C Eagle", + "F-15E Strike Eagle", + "F-16CM Fighting Falcon (Block 50)", + "F/A-18C Hornet (Lot 20)", + "S-3B Viking", + "SH-60B Seahawk", + "UH-1H Iroquois", + "UH-60A" ], "awacs": [ - "E_3A", - "E_2C" + "E-2C Hawkeye", + "E-3A" ], "tankers": [ - "KC_135", - "KC135MPRS", - "KC130", + "KC-130", + "KC-135 Stratotanker", + "KC-135 Stratotanker MPRS", "S-3B Tanker" ], "frontline_units": [ - "MBT_M1A2_Abrams", - "ATGM_Stryker", - "IFV_M1126_Stryker_ICV", - "IFV_M2A2_Bradley", - "IFV_LAV_25", - "Scout_HMMWV", - "ATGM_HMMWV", - "SAM_Avenger__Stinger", - "SAM_Linebacker___Bradley_M6" + "LAV-25", + "M1043 HMMWV (M2 HMG)", + "M1045 HMMWV (BGM-71 TOW)", + "M1097 Heavy HMMWV Avenger", + "M1126 Stryker ICV (M2 HMG)", + "M1134 Stryker ATGM (BGM-71 TOW)", + "M1A2 Abrams", + "M2A2 Bradley", + "M6 Linebacker" ], "artillery_units": [ - "MLRS_M270_227mm", - "SPH_M109_Paladin_155mm" + "M109A6 Paladin", + "M270 Multiple Launch Rocket System" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger", - "Mortar_2B11_120mm" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger", + "Mortar 2B11 120mm" ], "air_defenses": [ "AvengerGenerator", @@ -70,16 +72,16 @@ "PatriotEwrGenerator" ], "aircraft_carrier": [ - "CVN_74_John_C__Stennis" + "Stennis" ], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "DDG_Arleigh_Burke_IIa" + "USS_Arleigh_Burke_IIa" ], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "requirements": { "C-130J-30 Super Hercules Mod by Anubis": "https://forums.eagle.ru/topic/252075-dcs-super-hercules-mod-by-anubis/" @@ -103,16 +105,16 @@ "OliverHazardPerryGroupGenerator" ], "has_jtac": true, - "jtac_unit": "MQ_9_Reaper", + "jtac_unit": "MQ-9 Reaper", "liveries_overrides": { - "FA_18C_hornet": [ - "VFA-37", + "F/A-18C Hornet (Lot 20)": [ "VFA-106", "VFA-113", "VFA-122", "VFA-131", "VFA-192", "VFA-34", + "VFA-37", "VFA-83", "VFA-87", "VFA-97", @@ -124,4 +126,4 @@ "VMFA-323" ] } -} +} \ No newline at end of file diff --git a/resources/factions/usa_2005_modded.json b/resources/factions/usa_2005_modded.json index 821e832e..1ba82e75 100644 --- a/resources/factions/usa_2005_modded.json +++ b/resources/factions/usa_2005_modded.json @@ -3,58 +3,60 @@ "name": "USA 2005 Modded", "authors": "Khopa", "description": "

USA 2005 with the Raptor mod, with the F-22 mod by Grinelli Designs.

", - "locales": ["en_US"], + "locales": [ + "en_US" + ], "aircrafts": [ - "F_15C", - "F_15E", - "F_14B", - "FA_18C_hornet", - "F_16C_50", - "A_10C", - "A_10C_2", - "AV8BNA", - "UH_1H", - "S_3B", - "SH_60B", - "AH_64D", - "B_52H", - "B_1B", - "F_117A", - "F_22A" + "A-10C Thunderbolt II (Suite 3)", + "A-10C Thunderbolt II (Suite 7)", + "AH-64D Apache Longbow", + "AV-8B Harrier II Night Attack", + "B-1B Lancer", + "B-52H Stratofortress", + "F-117A Nighthawk", + "F-14B Tomcat", + "F-15C Eagle", + "F-15E Strike Eagle", + "F-16CM Fighting Falcon (Block 50)", + "F-22A Raptor", + "F/A-18C Hornet (Lot 20)", + "S-3B Viking", + "SH-60B Seahawk", + "UH-1H Iroquois" ], "awacs": [ - "E_3A", - "E_2C" + "E-2C Hawkeye", + "E-3A" ], "tankers": [ - "KC_135", - "KC135MPRS", - "KC130", + "KC-130", + "KC-135 Stratotanker", + "KC-135 Stratotanker MPRS", "S-3B Tanker" ], "frontline_units": [ - "MBT_M1A2_Abrams", - "ATGM_Stryker", - "IFV_M1126_Stryker_ICV", - "IFV_M2A2_Bradley", - "IFV_LAV_25", - "Scout_HMMWV", - "ATGM_HMMWV", - "SAM_Avenger__Stinger", - "SAM_Linebacker___Bradley_M6" + "LAV-25", + "M1043 HMMWV (M2 HMG)", + "M1045 HMMWV (BGM-71 TOW)", + "M1097 Heavy HMMWV Avenger", + "M1126 Stryker ICV (M2 HMG)", + "M1134 Stryker ATGM (BGM-71 TOW)", + "M1A2 Abrams", + "M2A2 Bradley", + "M6 Linebacker" ], "artillery_units": [ - "MLRS_M270_227mm", - "SPH_M109_Paladin_155mm" + "M109A6 Paladin", + "M270 Multiple Launch Rocket System" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "MANPADS_Stinger", - "Mortar_2B11_120mm" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger", + "Mortar 2B11 120mm" ], "air_defenses": [ "AvengerGenerator", @@ -66,16 +68,16 @@ "PatriotEwrGenerator" ], "aircraft_carrier": [ - "CVN_74_John_C__Stennis" + "Stennis" ], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "DDG_Arleigh_Burke_IIa" + "USS_Arleigh_Burke_IIa" ], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "carrier_names": [ "CVN-71 Theodore Roosevelt", @@ -98,16 +100,16 @@ "F-22A mod by Grinnelli Designs": "https://bestf22modever.com" }, "has_jtac": true, - "jtac_unit": "MQ_9_Reaper", + "jtac_unit": "MQ-9 Reaper", "liveries_overrides": { - "FA_18C_hornet": [ - "VFA-37", + "F/A-18C Hornet (Lot 20)": [ "VFA-106", "VFA-113", "VFA-122", "VFA-131", "VFA-192", "VFA-34", + "VFA-37", "VFA-83", "VFA-87", "VFA-97", @@ -119,4 +121,4 @@ "VMFA-323" ] } -} +} \ No newline at end of file diff --git a/resources/factions/usn_1985.json b/resources/factions/usn_1985.json index 1b50eb12..05ccf915 100644 --- a/resources/factions/usn_1985.json +++ b/resources/factions/usn_1985.json @@ -3,40 +3,42 @@ "name": "US Navy 1985", "authors": "HerrTom", "description": "

Highway to the Danger Zone! For Tomcat lovers.

", - "locales": ["en_US"], + "locales": [ + "en_US" + ], "aircrafts": [ - "AH_1W", - "F_4E", - "F_14A_135_GR", - "F_14B", - "S_3B", - "SH_60B", - "UH_1H" + "AH-1W SuperCobra", + "F-14A Tomcat (Block 135-GR Late)", + "F-14B Tomcat", + "F-4E Phantom II", + "S-3B Viking", + "SH-60B Seahawk", + "UH-1H Iroquois" ], "awacs": [ - "E_2C" + "E-2C Hawkeye" ], "tankers": [ "S-3B Tanker" ], "frontline_units": [ - "MBT_M60A3_Patton", - "APC_M113", - "Scout_HMMWV", - "SPAAA_Vulcan_M163" + "M1043 HMMWV (M2 HMG)", + "M113", + "M163 Vulcan Air Defense System", + "M60A3 \"Patton\"" ], "artillery_units": [ - "SPH_M109_Paladin_155mm", - "MLRS_M270_227mm" + "M109A6 Paladin", + "M270 Multiple Launch Rocket System" ], "logistics_units": [ - "Truck_M818_6x6" + "Truck M818 6x6" ], "infantry_units": [ - "Infantry_M4", - "Infantry_M249", - "Mortar_2B11_120mm", - "MANPADS_Stinger" + "Infantry M249", + "Infantry M4", + "MANPADS Stinger", + "Mortar 2B11 120mm" ], "air_defenses": [ "ChaparralGenerator", @@ -44,16 +46,16 @@ "VulcanGenerator" ], "aircraft_carrier": [ - "CVN_74_John_C__Stennis" + "Stennis" ], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "FFG_Oliver_Hazzard_Perry" + "PERRY" ], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "carrier_names": [ "CVN-71 Theodore Roosevelt", @@ -75,17 +77,17 @@ "requirements": {}, "doctrine": "coldwar", "liveries_overrides": { - "FA_18C_hornet": [ - "VFA-37", + "F/A-18C Hornet (Lot 20)": [ "VFA-106", "VFA-113", "VFA-122", "VFA-131", "VFA-192", "VFA-34", + "VFA-37", "VFA-83", "VFA-87", "VFA-97" ] } -} +} \ No newline at end of file diff --git a/resources/squadrons/hornet/VFA-113.yaml b/resources/squadrons/hornet/VFA-113.yaml index d895e982..b59d32a8 100644 --- a/resources/squadrons/hornet/VFA-113.yaml +++ b/resources/squadrons/hornet/VFA-113.yaml @@ -3,7 +3,7 @@ name: VFA-113 nickname: Stingers country: USA role: Strike Fighter -aircraft: FA-18C_hornet +aircraft: F/A-18C Hornet (Lot 20) livery: VFA-113 mission_types: - Anti-ship diff --git a/resources/squadrons/hornet/VFA-192.yaml b/resources/squadrons/hornet/VFA-192.yaml index 3e3f161a..7ca4c4b5 100644 --- a/resources/squadrons/hornet/VFA-192.yaml +++ b/resources/squadrons/hornet/VFA-192.yaml @@ -3,7 +3,7 @@ name: VFA-192 nickname: Golden Dragons country: USA role: Strike Fighter -aircraft: FA-18C_hornet +aircraft: F/A-18C Hornet (Lot 20) livery: VFA-192 mission_types: - Anti-ship diff --git a/resources/squadrons/m2000-5/ADA_EscadronDeChasse_1-2_Cigognes.yaml b/resources/squadrons/m2000-5/ADA_EscadronDeChasse_1-2_Cigognes.yaml new file mode 100644 index 00000000..113cea5c --- /dev/null +++ b/resources/squadrons/m2000-5/ADA_EscadronDeChasse_1-2_Cigognes.yaml @@ -0,0 +1,13 @@ +--- +name: Escadron de chasse 1/2 +nickname: Cigognes +country: France +role: Fighter +aircraft: Mirage 2000-5 +livery: ec1_2 spa12 `cigogne a ailes ouvertes` +mission_types: + - BARCAP + - Escort + - Intercept + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/m2000-5/ADA_EscadronDeChasse_2-2_CoteDOr.yaml b/resources/squadrons/m2000-5/ADA_EscadronDeChasse_2-2_CoteDOr.yaml new file mode 100644 index 00000000..67d07228 --- /dev/null +++ b/resources/squadrons/m2000-5/ADA_EscadronDeChasse_2-2_CoteDOr.yaml @@ -0,0 +1,13 @@ +--- +name: Escadron de chasse 2/2 +nickname: Côte d'Or +country: France +role: Fighter +aircraft: Mirage 2000-5 +livery: ec2_2 `cote d'or` spa57 `mouette` +mission_types: + - BARCAP + - Escort + - Intercept + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/m2000c/ADA_EscadronDeChasse_1-12_Cambresis.yaml b/resources/squadrons/m2000c/ADA_EscadronDeChasse_1-12_Cambresis.yaml new file mode 100644 index 00000000..4f9131e6 --- /dev/null +++ b/resources/squadrons/m2000c/ADA_EscadronDeChasse_1-12_Cambresis.yaml @@ -0,0 +1,13 @@ +--- +name: Escadron de chasse 1/12 +nickname: Cambrésis +country: France +role: Fighter +aircraft: Mirage 2000C +livery: Cambresis +mission_types: + - BARCAP + - Escort + - Intercept + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/m2000c/ADA_EscadronDeChasse_1-30_Alsace.yaml b/resources/squadrons/m2000c/ADA_EscadronDeChasse_1-30_Alsace.yaml new file mode 100644 index 00000000..e8a3be50 --- /dev/null +++ b/resources/squadrons/m2000c/ADA_EscadronDeChasse_1-30_Alsace.yaml @@ -0,0 +1,13 @@ +--- +name: Escadron de chasse 1/30 +nickname: Alsace +country: France +role: Fighter +aircraft: Mirage 2000C +livery: AdA Alsace LF-2 +mission_types: + - BARCAP + - Escort + - Intercept + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/m2000c/ADA_EscadronDeChasse_2-5_IleDeFrance.yaml b/resources/squadrons/m2000c/ADA_EscadronDeChasse_2-5_IleDeFrance.yaml new file mode 100644 index 00000000..27440586 --- /dev/null +++ b/resources/squadrons/m2000c/ADA_EscadronDeChasse_2-5_IleDeFrance.yaml @@ -0,0 +1,13 @@ +--- +name: Escadron de chasse 2/5 +nickname: Île De France +country: France +role: Fighter +aircraft: Mirage 2000C +livery: AdA_Chasse_2_5 +mission_types: + - BARCAP + - Escort + - Intercept + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/sa342/ALAT_1er_RHC.yaml b/resources/squadrons/sa342/ALAT_1er_RHC.yaml new file mode 100644 index 00000000..78218c74 --- /dev/null +++ b/resources/squadrons/sa342/ALAT_1er_RHC.yaml @@ -0,0 +1,9 @@ +--- +name: 1er régiment d'hélicoptères de combat +nickname: +country: France +role: Anti-Aircraft Helicopter +aircraft: SA 342M Gazelle Mistral +livery: Combat +mission_types: + - TARCAP diff --git a/resources/squadrons/sa342/ALAT_3eme_RHC.yaml b/resources/squadrons/sa342/ALAT_3eme_RHC.yaml new file mode 100644 index 00000000..ce4da5e4 --- /dev/null +++ b/resources/squadrons/sa342/ALAT_3eme_RHC.yaml @@ -0,0 +1,12 @@ +--- +name: 3ème régiment d'hélicoptères de combat +nickname: Grand 3 +country: France +role: Anti-Tank Helicopter +aircraft: SA 342M Gazelle +livery: Combat +mission_types: + - Anti-ship + - CAS + - OCA/Aircraft + - Strike diff --git a/resources/squadrons/sa342/ALAT_5eme_RHC.yaml b/resources/squadrons/sa342/ALAT_5eme_RHC.yaml new file mode 100644 index 00000000..0af3bb80 --- /dev/null +++ b/resources/squadrons/sa342/ALAT_5eme_RHC.yaml @@ -0,0 +1,10 @@ +--- +name: 5ème régiment d'hélicoptères de combat +nickname: Le régiment du Béarn +country: France +role: Combat Helicopter +aircraft: SA 342L Gazelle +livery: Combat +mission_types: + - CAS + - OCA/Aircraft diff --git a/resources/squadrons/sa342/ALAT_DOAS.yaml b/resources/squadrons/sa342/ALAT_DOAS.yaml new file mode 100644 index 00000000..a10b6748 --- /dev/null +++ b/resources/squadrons/sa342/ALAT_DOAS.yaml @@ -0,0 +1,9 @@ +--- +name: Détachement ALAT des opérations spéciales +nickname: DOAS +country: France +role: Combat Helicopter +aircraft: SA342Minigun +livery: Combat +mission_types: + - CAS diff --git a/resources/squadrons/viper/191-Filo.yaml b/resources/squadrons/viper/191-Filo.yaml new file mode 100644 index 00000000..3a57adf4 --- /dev/null +++ b/resources/squadrons/viper/191-Filo.yaml @@ -0,0 +1,21 @@ +--- +name: 191. Filo +nickname: Kobra +country: Turkey +role: Strike Fighter +aircraft: F-16CM Fighting Falcon (Block 50) +livery: THK_191_Filo +mission_types: + - BAI + - BARCAP + - CAS + - DEAD + - Escort + - Intercept + - OCA/Aircraft + - OCA/Runway + - SEAD + - SEAD Escort + - Strike + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/viper/HAF 335 Tiger Squadron.yaml b/resources/squadrons/viper/HAF 335 Tiger Squadron.yaml new file mode 100644 index 00000000..3369aa86 --- /dev/null +++ b/resources/squadrons/viper/HAF 335 Tiger Squadron.yaml @@ -0,0 +1,21 @@ +--- +name: 335 Squadron +nickname: Tiger +country: Greece +role: Multirole Fighter +aircraft: F-16CM Fighting Falcon (Block 50) +livery: HAF_335_Tiger +mission_types: + - BAI + - BARCAP + - CAS + - DEAD + - Escort + - Intercept + - OCA/Aircraft + - OCA/Runway + - SEAD + - SEAD Escort + - Strike + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/viper/HAF 336 Olympus Squadron.yaml b/resources/squadrons/viper/HAF 336 Olympus Squadron.yaml new file mode 100644 index 00000000..f3d3b616 --- /dev/null +++ b/resources/squadrons/viper/HAF 336 Olympus Squadron.yaml @@ -0,0 +1,21 @@ +--- +name: 336 Squadron +nickname: Olympus +country: Greece +role: Multirole Fighter +aircraft: F-16CM Fighting Falcon (Block 50) +livery: HAF_336_Olympus +mission_types: + - BAI + - BARCAP + - CAS + - DEAD + - Escort + - Intercept + - OCA/Aircraft + - OCA/Runway + - SEAD + - SEAD Escort + - Strike + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/viper/HAF 337 Ghost Squadron.yaml b/resources/squadrons/viper/HAF 337 Ghost Squadron.yaml new file mode 100644 index 00000000..ab8e27ab --- /dev/null +++ b/resources/squadrons/viper/HAF 337 Ghost Squadron.yaml @@ -0,0 +1,21 @@ +--- +name: 337 Squadron +nickname: Ghost +country: Greece +role: Multirole Fighter +aircraft: F-16CM Fighting Falcon (Block 50) +livery: HAF_337_Ghost +mission_types: + - BAI + - BARCAP + - CAS + - DEAD + - Escort + - Intercept + - OCA/Aircraft + - OCA/Runway + - SEAD + - SEAD Escort + - Strike + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/viper/HAF 340 Fox Squadron.yaml b/resources/squadrons/viper/HAF 340 Fox Squadron.yaml new file mode 100644 index 00000000..3a51e53d --- /dev/null +++ b/resources/squadrons/viper/HAF 340 Fox Squadron.yaml @@ -0,0 +1,21 @@ +--- +name: 340 Squadron +nickname: Fox +country: Greece +role: Multirole Fighter +aircraft: F-16CM Fighting Falcon (Block 50) +livery: HAF_340_Fox +mission_types: + - BAI + - BARCAP + - CAS + - DEAD + - Escort + - Intercept + - OCA/Aircraft + - OCA/Runway + - SEAD + - SEAD Escort + - Strike + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/viper/HAF 341 Arrow Squadron.yaml b/resources/squadrons/viper/HAF 341 Arrow Squadron.yaml new file mode 100644 index 00000000..e7cc344b --- /dev/null +++ b/resources/squadrons/viper/HAF 341 Arrow Squadron.yaml @@ -0,0 +1,21 @@ +--- +name: 341 Squadron +nickname: Arrow +country: Greece +role: Multirole Fighter +aircraft: F-16CM Fighting Falcon (Block 50) +livery: HAF_341_Arrow +mission_types: + - BAI + - BARCAP + - CAS + - DEAD + - Escort + - Intercept + - OCA/Aircraft + - OCA/Runway + - SEAD + - SEAD Escort + - Strike + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/viper/HAF 343 Star Squadron.yaml b/resources/squadrons/viper/HAF 343 Star Squadron.yaml new file mode 100644 index 00000000..642c5c2d --- /dev/null +++ b/resources/squadrons/viper/HAF 343 Star Squadron.yaml @@ -0,0 +1,21 @@ +--- +name: 343 Squadron +nickname: Star +country: Greece +role: Multirole Fighter +aircraft: F-16CM Fighting Falcon (Block 50) +livery: HAF_343_Star +mission_types: + - BAI + - BARCAP + - CAS + - DEAD + - Escort + - Intercept + - OCA/Aircraft + - OCA/Runway + - SEAD + - SEAD Escort + - Strike + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/viper/HAF 346 Jason Squadron.yaml b/resources/squadrons/viper/HAF 346 Jason Squadron.yaml new file mode 100644 index 00000000..b04df679 --- /dev/null +++ b/resources/squadrons/viper/HAF 346 Jason Squadron.yaml @@ -0,0 +1,21 @@ +--- +name: 346 Squadron +nickname: Jason +country: Greece +role: Multirole Fighter +aircraft: F-16CM Fighting Falcon (Block 50) +livery: HAF_346_Jason +mission_types: + - BAI + - BARCAP + - CAS + - DEAD + - Escort + - Intercept + - OCA/Aircraft + - OCA/Runway + - SEAD + - SEAD Escort + - Strike + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/viper/HAF 347 Perseus Squadron.yaml b/resources/squadrons/viper/HAF 347 Perseus Squadron.yaml new file mode 100644 index 00000000..0604de10 --- /dev/null +++ b/resources/squadrons/viper/HAF 347 Perseus Squadron.yaml @@ -0,0 +1,21 @@ +--- +name: 347 Squadron +nickname: Perseus +country: Greece +role: Multirole Fighter +aircraft: F-16CM Fighting Falcon (Block 50) +livery: HAF_347_Perseus +mission_types: + - BAI + - BARCAP + - CAS + - DEAD + - Escort + - Intercept + - OCA/Aircraft + - OCA/Runway + - SEAD + - SEAD Escort + - Strike + - Fighter sweep + - TARCAP diff --git a/resources/squadrons/viper/HAF_330_Thunder_squadron.yaml b/resources/squadrons/viper/HAF_330_Thunder_squadron.yaml new file mode 100644 index 00000000..80d5c08a --- /dev/null +++ b/resources/squadrons/viper/HAF_330_Thunder_squadron.yaml @@ -0,0 +1,21 @@ +--- +name: 330 Squadron +nickname: Thunder +country: Greece +role: Multirole Fighter +aircraft: F-16CM Fighting Falcon (Block 50) +livery: HAF_ 330_Thunder +mission_types: + - BAI + - BARCAP + - CAS + - DEAD + - Escort + - Intercept + - OCA/Aircraft + - OCA/Runway + - SEAD + - SEAD Escort + - Strike + - Fighter sweep + - TARCAP diff --git a/resources/syrialandmap.p b/resources/syrialandmap.p index f39fb3bb..1a2a5fa4 100644 Binary files a/resources/syrialandmap.p and b/resources/syrialandmap.p differ diff --git a/resources/tools/cau_terrain.miz b/resources/tools/cau_terrain.miz index 5211c374..a0a53f08 100644 Binary files a/resources/tools/cau_terrain.miz and b/resources/tools/cau_terrain.miz differ diff --git a/resources/tools/syria_terrain.miz b/resources/tools/syria_terrain.miz index a50e4e92..f169d31c 100644 Binary files a/resources/tools/syria_terrain.miz and b/resources/tools/syria_terrain.miz differ diff --git a/resources/ui/ground_assets/cv_blue_alive.svg b/resources/ui/ground_assets/cv_blue_alive.svg index 4ae3a57c..b7b50fda 100644 --- a/resources/ui/ground_assets/cv_blue_alive.svg +++ b/resources/ui/ground_assets/cv_blue_alive.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/resources/ui/ground_assets/cv_blue_damaged.svg b/resources/ui/ground_assets/cv_blue_damaged.svg index 33b0c0bb..81cb15af 100644 --- a/resources/ui/ground_assets/cv_blue_damaged.svg +++ b/resources/ui/ground_assets/cv_blue_damaged.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/resources/ui/ground_assets/cv_blue_destination.svg b/resources/ui/ground_assets/cv_blue_destination.svg index 9e4ae54f..29f56749 100644 --- a/resources/ui/ground_assets/cv_blue_destination.svg +++ b/resources/ui/ground_assets/cv_blue_destination.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/resources/ui/ground_assets/cv_blue_destroyed.svg b/resources/ui/ground_assets/cv_blue_destroyed.svg index 55ef5cc2..ca7ffb57 100644 --- a/resources/ui/ground_assets/cv_blue_destroyed.svg +++ b/resources/ui/ground_assets/cv_blue_destroyed.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/resources/ui/ground_assets/cv_red_alive.svg b/resources/ui/ground_assets/cv_red_alive.svg index b71d1366..36c385b3 100644 --- a/resources/ui/ground_assets/cv_red_alive.svg +++ b/resources/ui/ground_assets/cv_red_alive.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/resources/ui/ground_assets/cv_red_damaged.svg b/resources/ui/ground_assets/cv_red_damaged.svg index 22e50f5f..af08402c 100644 --- a/resources/ui/ground_assets/cv_red_damaged.svg +++ b/resources/ui/ground_assets/cv_red_damaged.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/resources/ui/ground_assets/cv_red_destination.svg b/resources/ui/ground_assets/cv_red_destination.svg index 3e92f8e3..32d06bc2 100644 --- a/resources/ui/ground_assets/cv_red_destination.svg +++ b/resources/ui/ground_assets/cv_red_destination.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/resources/ui/ground_assets/cv_red_destroyed.svg b/resources/ui/ground_assets/cv_red_destroyed.svg index b8a8e243..2c0ebb05 100644 --- a/resources/ui/ground_assets/cv_red_destroyed.svg +++ b/resources/ui/ground_assets/cv_red_destroyed.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/resources/ui/ground_assets/lha_blue_alive.svg b/resources/ui/ground_assets/lha_blue_alive.svg index e01cc213..e23f553e 100644 --- a/resources/ui/ground_assets/lha_blue_alive.svg +++ b/resources/ui/ground_assets/lha_blue_alive.svg @@ -1 +1 @@ -LHA \ No newline at end of file +LHA \ No newline at end of file diff --git a/resources/ui/ground_assets/lha_blue_damaged.svg b/resources/ui/ground_assets/lha_blue_damaged.svg index 4aeffeeb..28acacdb 100644 --- a/resources/ui/ground_assets/lha_blue_damaged.svg +++ b/resources/ui/ground_assets/lha_blue_damaged.svg @@ -1 +1 @@ -LHA \ No newline at end of file +LHA \ No newline at end of file diff --git a/resources/ui/ground_assets/lha_blue_destination.svg b/resources/ui/ground_assets/lha_blue_destination.svg index ff80f36a..36869350 100644 --- a/resources/ui/ground_assets/lha_blue_destination.svg +++ b/resources/ui/ground_assets/lha_blue_destination.svg @@ -1 +1 @@ -LHA \ No newline at end of file +LHA \ No newline at end of file diff --git a/resources/ui/ground_assets/lha_blue_destroyed.svg b/resources/ui/ground_assets/lha_blue_destroyed.svg index 2d0092c3..57f7440a 100644 --- a/resources/ui/ground_assets/lha_blue_destroyed.svg +++ b/resources/ui/ground_assets/lha_blue_destroyed.svg @@ -1 +1 @@ -LHA \ No newline at end of file +LHA \ No newline at end of file diff --git a/resources/ui/ground_assets/lha_red_alive.svg b/resources/ui/ground_assets/lha_red_alive.svg index f3960157..4291cd24 100644 --- a/resources/ui/ground_assets/lha_red_alive.svg +++ b/resources/ui/ground_assets/lha_red_alive.svg @@ -1 +1 @@ -LHA \ No newline at end of file +LHA \ No newline at end of file diff --git a/resources/ui/ground_assets/lha_red_damaged.svg b/resources/ui/ground_assets/lha_red_damaged.svg index 4c3c6aa3..51929837 100644 --- a/resources/ui/ground_assets/lha_red_damaged.svg +++ b/resources/ui/ground_assets/lha_red_damaged.svg @@ -1 +1 @@ -LHA \ No newline at end of file +LHA \ No newline at end of file diff --git a/resources/ui/ground_assets/lha_red_destination.svg b/resources/ui/ground_assets/lha_red_destination.svg index 9ef1411b..9c971136 100644 --- a/resources/ui/ground_assets/lha_red_destination.svg +++ b/resources/ui/ground_assets/lha_red_destination.svg @@ -1 +1 @@ -LHA \ No newline at end of file +LHA \ No newline at end of file diff --git a/resources/ui/ground_assets/lha_red_destroyed.svg b/resources/ui/ground_assets/lha_red_destroyed.svg index 87ff95ac..d8da7a5e 100644 --- a/resources/ui/ground_assets/lha_red_destroyed.svg +++ b/resources/ui/ground_assets/lha_red_destroyed.svg @@ -1 +1 @@ -LHA \ No newline at end of file +LHA \ No newline at end of file diff --git a/resources/ui/map/map.js b/resources/ui/map/map.js index 5a8dee3d..87c3a4c7 100644 --- a/resources/ui/map/map.js +++ b/resources/ui/map/map.js @@ -398,6 +398,7 @@ class ControlPoint { zIndexOffset: 1000, draggable: this.cp.mobile, autoPan: true, + opacity: 0.5, }) .on("dragstart", () => { this.secondaryMarker.addTo(controlPointsLayer); @@ -428,6 +429,7 @@ class ControlPoint { return L.polyline([this.cp.position, destination], { color: Colors.Green, weight: 1, + interactive: false, }); } @@ -519,6 +521,7 @@ class TheaterGroundObject { color: detectionColor, fill: false, weight: 1, + interactive: false, }).addTo(detectionLayer); }); @@ -528,6 +531,7 @@ class TheaterGroundObject { color: threatColor, fill: false, weight: 2, + interactive: false, }).addTo(threatLayer); }); } @@ -737,12 +741,15 @@ class Flight { const color = this.flight.blue ? Colors.Blue : Colors.Red; const layer = this.flightPlanLayer(); if (this.flight.selected) { - this.path = L.polyline(path, { color: Colors.Highlight }) + this.path = L.polyline(path, { + color: Colors.Highlight, + interactive: false, + }) .addTo(selectedFlightPlansLayer) .addTo(layer) .addTo(allFlightPlansLayer); } else { - this.path = L.polyline(path, { color: color }) + this.path = L.polyline(path, { color: color, interactive: false }) .addTo(layer) .addTo(allFlightPlansLayer); } @@ -760,6 +767,7 @@ class Flight { this.commitBoundary = L.polyline(this.flight.commitBoundary, { color: Colors.Highlight, weight: 1, + interactive: false, }) .addTo(selectedFlightPlansLayer) .addTo(this.flightPlanLayer()) @@ -819,6 +827,7 @@ function _drawThreatZones(zones, layer, player) { fill: true, fillOpacity: 0.4, noClip: true, + interactive: false, }).addTo(layer); } } @@ -874,6 +883,7 @@ function drawNavmesh(zones, layer) { color: "#000000", weight: 1, fill: false, + interactive: false, }).addTo(layer); } } @@ -896,6 +906,7 @@ function drawMapZones() { color: "#344455", fillColor: "#344455", fillOpacity: 1, + interactive: false, }).addTo(seaZones); } @@ -904,6 +915,7 @@ function drawMapZones() { color: "#969696", fillColor: "#4b4b4b", fillOpacity: 1, + interactive: false, }).addTo(inclusionZones); } @@ -912,6 +924,7 @@ function drawMapZones() { color: "#969696", fillColor: "#303030", fillOpacity: 1, + interactive: false, }).addTo(exclusionZones); } } @@ -923,7 +936,8 @@ function drawUnculledZones() { L.circle(zone.position, { radius: zone.radius, color: "#b4ff8c", - stroke: false, + fill: false, + interactive: false, }).addTo(unculledZones); } } diff --git a/resources/ui/templates/factiontemplate_EN.j2 b/resources/ui/templates/factiontemplate_EN.j2 index 92e37d85..6bdcde27 100644 --- a/resources/ui/templates/factiontemplate_EN.j2 +++ b/resources/ui/templates/factiontemplate_EN.j2 @@ -8,7 +8,7 @@ Available aircrafts:
diff --git a/resources/ui/templates/factiontemplate_FR.j2 b/resources/ui/templates/factiontemplate_FR.j2 index 90639c99..110c9298 100644 --- a/resources/ui/templates/factiontemplate_FR.j2 +++ b/resources/ui/templates/factiontemplate_FR.j2 @@ -8,7 +8,7 @@ Aéronefs disponibles :
diff --git a/resources/ui/units/aircrafts/banners/Mi-24P_24.jpg b/resources/ui/units/aircrafts/banners/Mi-24P_24.jpg new file mode 100644 index 00000000..fd912f70 Binary files /dev/null and b/resources/ui/units/aircrafts/banners/Mi-24P_24.jpg differ diff --git a/resources/ui/units/aircrafts/icons/Mi-24P_24.jpg b/resources/ui/units/aircrafts/icons/Mi-24P_24.jpg new file mode 100644 index 00000000..97efd518 Binary files /dev/null and b/resources/ui/units/aircrafts/icons/Mi-24P_24.jpg differ diff --git a/resources/units/aircraft/A-10A.yaml b/resources/units/aircraft/A-10A.yaml new file mode 100644 index 00000000..3702018b --- /dev/null +++ b/resources/units/aircraft/A-10A.yaml @@ -0,0 +1,17 @@ +always_keeps_gun: true +description: The A-10A Thunderbolt II, also known as the Warthog, is a 'flying gun'. + The aircraft was used extensively during Operation Desert Storm, in support of NATO + operations in response to the Kosovo crisis, in Operation Enduring Freedom in Afghanistan + and in Operation Iraqi Freedom. The A-10A is a high-survivability and versatile + aircraft, popular with pilots for the 'get home' effectiveness.The mission of the + aircraft is ground attack against tanks, armored vehicles and installations, and + close air support of ground forces. The Warthog is famous for its massive 30mm cannon, + but it can also be armed with Maverick guided missiles and several types of bombs + and rockets. +introduced: 1977 +manufacturer: Fairchild Republic +origin: USA +price: 12 +role: Close Air Support/Attack +variants: + A-10A Thunderbolt II: {} diff --git a/resources/units/aircraft/A-10C.yaml b/resources/units/aircraft/A-10C.yaml new file mode 100644 index 00000000..521b5d84 --- /dev/null +++ b/resources/units/aircraft/A-10C.yaml @@ -0,0 +1,20 @@ +always_keeps_gun: true +description: + The A-10C Thunderbolt II, also known as the Warthog, is a 'flying gun'. + The A-10C is a high-survivability and versatile aircraft, popular with pilots for + the 'get home' effectiveness.The mission of the aircraft is ground attack against + tanks, armored vehicles and installations, and close air support of ground forces. + The Warthog is famous for its massive 30mm cannon, but it can also be armed with + Maverick guided missiles and several types of bombs and rockets. +introduced: 2005 +manufacturer: Fairchild Republic +origin: USA +price: 18 +role: Close Air Support/Attack +variants: + A-10C Thunderbolt II (Suite 3): {} +radios: + # VHF for intraflight is not accepted anymore by DCS + # (see https://forums.eagle.ru/showthread.php?p=4499738). + intra_flight: AN/ARC-164 + inter_flight: AN/ARC-164 diff --git a/resources/units/aircraft/A-10C_2.yaml b/resources/units/aircraft/A-10C_2.yaml new file mode 100644 index 00000000..d491bf71 --- /dev/null +++ b/resources/units/aircraft/A-10C_2.yaml @@ -0,0 +1,20 @@ +always_keeps_gun: true +description: + The A-10C Thunderbolt II, also known as the Warthog, is a 'flying gun'. + The A-10C is a high-survivability and versatile aircraft, popular with pilots for + the 'get home' effectiveness.The mission of the aircraft is ground attack against + tanks, armored vehicles and installations, and close air support of ground forces. + The Warthog is famous for its massive 30mm cannon, but it can also be armed with + Maverick guided missiles and several types of bombs and rockets. +introduced: 2012 +manufacturer: Fairchild Republic +origin: USA +price: 20 +role: Close Air Support/Attack +variants: + A-10C Thunderbolt II (Suite 7): {} +radios: + # VHF for intraflight is not accepted anymore by DCS + # (see https://forums.eagle.ru/showthread.php?p=4499738). + intra_flight: AN/ARC-164 + inter_flight: AN/ARC-164 diff --git a/resources/units/aircraft/A-20G.yaml b/resources/units/aircraft/A-20G.yaml new file mode 100644 index 00000000..6bbc527e --- /dev/null +++ b/resources/units/aircraft/A-20G.yaml @@ -0,0 +1,17 @@ +always_keeps_gun: true +description: The Douglas A-20 Havoc (company designation DB-7) is an American medium + bomber, attack aircraft, night intruder, night fighter, and reconnaissance aircraft + of World War II. Designed to meet an Army Air Corps requirement for a bomber, it + was ordered by France for their air force before the USAAC decided it would also + meet their requirements. French DB-7s were the first to see combat; after the fall + of France the bomber, under the service name Boston continued with the Royal Air + Force. From 1941, night fighter and intruder versions were given the service name + Havoc. In 1942 USAAF A-20s saw combat in North Africa. +introduced: 1943 +manufacturer: Douglas +origin: USA +price: 12 +role: Medium Bomber/Attack +variants: + A-20G Havoc: {} + Boston Mk.III: {} diff --git a/resources/units/aircraft/A-4E-C.yaml b/resources/units/aircraft/A-4E-C.yaml new file mode 100644 index 00000000..e5dd1fae --- /dev/null +++ b/resources/units/aircraft/A-4E-C.yaml @@ -0,0 +1,15 @@ +carrier_capable: true +description: The Skyhawk is a relatively lightweight aircraft, with a maximum takeoff + weight of 24,500 pounds (11,100 kg), and has a top speed of 670 miles per hour (1,080 + km/h). The aircraft's five hardpoints support a variety of missiles, bombs, and + other munitions. Skyhawks played key roles in the Vietnam War, the Yom Kippur War, + and the Falklands War. Sixty years after the aircraft's first flight in 1954, some + of the 2,960 produced (through February 1979)[1] remain in service with the Argentine + Air Force and the Brazilian Naval Aviation. +introduced: 1962 +manufacturer: Douglas +origin: USA +price: 7 +role: Carrier-based Attack/Light Fighter +variants: + A-4E Skyhawk: {} diff --git a/resources/units/aircraft/A-50.yaml b/resources/units/aircraft/A-50.yaml new file mode 100644 index 00000000..b7de7170 --- /dev/null +++ b/resources/units/aircraft/A-50.yaml @@ -0,0 +1,4 @@ +description: The A-50 is an AWACS plane. +price: 50 +variants: + A-50: null diff --git a/resources/units/aircraft/AH-1W.yaml b/resources/units/aircraft/AH-1W.yaml new file mode 100644 index 00000000..24c4c3a8 --- /dev/null +++ b/resources/units/aircraft/AH-1W.yaml @@ -0,0 +1,17 @@ +always_keeps_gun: true +carrier_capable: true +description: The AH-1 Cobra was developed in the mid-1960s as an interim gunship for + the U.S. Army for use during the Vietnam War. The Cobra shared the proven transmission, + rotor system, and the T53 turboshaft engine of the UH-1 'Huey'. By June 1967, the + first AH-1G HueyCobras had been delivered. Bell built 1,116 AH-1Gs for the U.S. + Army between 1967 and 1973, and the Cobras chalked up over a million operational + hours in Vietnam. +introduced: 1986 +lha_capable: true +manufacturer: Bell +origin: USA +price: 14 +role: Attack +variants: + AH-1J SeaCobra: {} + AH-1W SuperCobra: {} diff --git a/resources/units/aircraft/AH-64A.yaml b/resources/units/aircraft/AH-64A.yaml new file mode 100644 index 00000000..aeee4b0a --- /dev/null +++ b/resources/units/aircraft/AH-64A.yaml @@ -0,0 +1,18 @@ +always_keeps_gun: true +description: The legendary 'Apache' is an US twin-turboshaft attack helicopter for + a crew of two. It features a nose-mounted sensor suite for target acquisition and + night vision systems. It is armed with a 30 mm (1.18 in) M230 chain gun carried + between the main landing gear, under the aircraft's forward fuselage, and four hardpoints + mounted on stub-wing pylons for carrying armament and stores, typically a mixture + of AGM-114 Hellfire missiles and Hydra 70 rocket pods. The AH-64 has significant + systems redundancy to improve combat survivability. American AH-64s have served + in conflicts in Panama, the Persian Gulf, Kosovo, Afghanistan, and Iraq. Israel + used the Apache in its military conflicts in Lebanon and the Gaza Strip. British + and Dutch Apaches have seen deployments in wars in Afghanistan and Iraq. +introduced: 1986 +manufacturer: Boeing +origin: USA +price: 16 +role: Attack +variants: + AH-64A Apache: {} diff --git a/resources/units/aircraft/AH-64D.yaml b/resources/units/aircraft/AH-64D.yaml new file mode 100644 index 00000000..6043da0f --- /dev/null +++ b/resources/units/aircraft/AH-64D.yaml @@ -0,0 +1,18 @@ +always_keeps_gun: true +description: The legendary 'Apache' is an US twin-turboshaft attack helicopter for + a crew of two. It features a nose-mounted sensor suite for target acquisition and + night vision systems. It is armed with a 30 mm (1.18 in) M230 chain gun carried + between the main landing gear, under the aircraft's forward fuselage, and four hardpoints + mounted on stub-wing pylons for carrying armament and stores, typically a mixture + of AGM-114 Hellfire missiles and Hydra 70 rocket pods. The AH-64 has significant + systems redundancy to improve combat survivability. American AH-64s have served + in conflicts in Panama, the Persian Gulf, Kosovo, Afghanistan, and Iraq. Israel + used the Apache in its military conflicts in Lebanon and the Gaza Strip. British + and Dutch Apaches have seen deployments in wars in Afghanistan and Iraq. +introduced: 2003 +manufacturer: Boeing +origin: USA +price: 20 +role: Attack +variants: + AH-64D Apache Longbow: {} diff --git a/resources/units/aircraft/AJS37.yaml b/resources/units/aircraft/AJS37.yaml new file mode 100644 index 00000000..a4aa0fdb --- /dev/null +++ b/resources/units/aircraft/AJS37.yaml @@ -0,0 +1,31 @@ +description: + "The AJS-37 Viggen is a Swedish double-delta supersonic attack aircraft\ + \ from the late Cold War. It was the backbone of the Swedish Air Force during the\ + \ Cold war, serving as the main attack and anti-ship platform. The AJS is the 90\u2019\ + s upgrade of this 70's era aircraft, adding several advanced weapons and systems\ + \ functionalities. The aircraft was designed around the pilot, with an excellent\ + \ man-machine interface, supporting the pilot through the smart use of autopilot\ + \ systems, radar and HUD symbology in order to deliver the ordnance onto targets\ + \ from treetop level with high speed attack runs.\n\nThe aircraft is armed with\ + \ multiple weapon systems ranging from programmable stand-off weapons such as the\ + \ RB-15F antiship missile to the BK90 Cluster munitions dispenser to various bombs,\ + \ rockets and missiles for a wide range of target types. The aircraft can also carry\ + \ gun pods and the Sidewinder series of infrared-guided missiles for air defence\ + \ and self-protection purposes." +introduced: 1993 +manufacturer: Saab +origin: Sweden +price: 15 +role: Attack/Reconnaissance +variants: + AJS-37 Viggen: {} +radios: + # The AJS37 has somewhat unique radio configuration. Two backup radio + # (FR 24) can only operate simultaneously with the main radio in guard + # mode. As such, we only use the main radio for both inter- and intra- + # flight communication. + intra_flight: FR 22 + inter_flight: FR 22 + channels: + type: viggen + namer: viggen diff --git a/resources/units/aircraft/AV8BNA.yaml b/resources/units/aircraft/AV8BNA.yaml new file mode 100644 index 00000000..7e4fec82 --- /dev/null +++ b/resources/units/aircraft/AV8BNA.yaml @@ -0,0 +1,38 @@ +carrier_capable: true +description: + 'The AV-8B project was born in the early 1970''s as an effort to address + the operational inadequacies of the AV-8A first generation Harrier, aimed to dramatically + improve the capabilities and performance of the early AV-8A''s. The AV-8B made its + maiden flight in November 1981 and entered service with the United States Marine + Corps in January 1985. It later evolved into the AV-8B N/A (Night Attack) and AV-8B + Harrier II Plus. + + + First flight of a modified AV-8B in the night attack configuration was on June 26th, + 1987. Deliveries to the USMC began in September of 1989 to VMA-214 at Yuma, Arizona. + Follow-up units based out of Yuma received their Night Attack AV-8Bs by the end + of 1992.The AV-8B N/A variant (originally known as the AV-8D) had its first operational + development in 1984 and included use of the NAVFLIR (Navigation Forward-Looking + Infrared camera, consisting of a GEC-Marconi FLIR system mounted in the nose) for + night operations. Additionally, GEC Cat''s Eyes night vision goggles were provided + to the pilot as well as a revised cockpit with color MFDs, a wider field-of-view + HUD display, a color CRT digital moving map, and a complete "heads-down" operation + capability. The AV-8B N/A also sports four Tracor ALE-39 countermeasures dispensers + along the top of the rear fuselage, in addition to two ALE-39 dispensers along the + lower rear of the fuselage. The AV-8B N/A also fields an updated version of the + Rolls-Royce Pegasus 11-61 (F402-RR-408) vectored-thrust turbofan engine.' +introduced: 1989 +lha_capable: true +manufacturer: McDonnell Douglas +origin: USA/UK +price: 15 +role: V/STOL Attack +variants: + AV-8B Harrier II Night Attack: {} +radios: + intra_flight: AN/ARC-210 + inter_flight: AN/ARC-210 + channels: + type: common + intra_flight_radio_index: 1 + inter_flight_radio_index: 2 diff --git a/resources/units/aircraft/An-26B.yaml b/resources/units/aircraft/An-26B.yaml new file mode 100644 index 00000000..4ed84aa7 --- /dev/null +++ b/resources/units/aircraft/An-26B.yaml @@ -0,0 +1,4 @@ +description: The An-26B is a military transport aircraft. +price: 15 +variants: + An-26B: null diff --git a/resources/units/aircraft/An-30M.yaml b/resources/units/aircraft/An-30M.yaml new file mode 100644 index 00000000..dd20c07a --- /dev/null +++ b/resources/units/aircraft/An-30M.yaml @@ -0,0 +1,4 @@ +description: The An-30M is a military transport aircraft. +price: 15 +variants: + An-30M: null diff --git a/resources/units/aircraft/B-17G.yaml b/resources/units/aircraft/B-17G.yaml new file mode 100644 index 00000000..9b75e708 --- /dev/null +++ b/resources/units/aircraft/B-17G.yaml @@ -0,0 +1,21 @@ +description: The B-17 was primarily employed by the USAAF in the daylight strategic + bombing campaign of World War II against German industrial, military and civilian + targets. The United States Eighth Air Force, based at many airfields in central, + eastern and southern England, and the Fifteenth Air Force, based in Italy, complemented + the RAF Bomber Command's night-time area bombing in the Combined Bomber Offensive + to help secure air superiority over the cities, factories and battlefields of Western + Europe in preparation for the invasion of France in 1944.it was a relatively fast, + high-flying, long-range bomber with heavy defensive armament at the expense of bombload. + It developed a reputation for toughness based upon stories and photos of badly damaged + B-17s safely returning to base. The B-17 dropped more bombs than any other U.S. + aircraft in World War II. Of approximately 1.5 million tons of bombs dropped on + Nazi Germany and its occupied territories by U.S. aircraft, over 640,000 tons were + dropped from B-17s. +introduced: 1943 +manufacturer: Boeing +origin: USA +price: 16 +role: Heavy Bomber +variants: + B-17G Flying Fortress: {} + Fortress Mk.III: {} diff --git a/resources/units/aircraft/B-1B.yaml b/resources/units/aircraft/B-1B.yaml new file mode 100644 index 00000000..0d34fb01 --- /dev/null +++ b/resources/units/aircraft/B-1B.yaml @@ -0,0 +1,16 @@ +description: The Rockwell B-1 Lancer is a supersonic variable-sweep wing, heavy bomber + used by the United States Air Force. It is commonly called the 'Bone' (from 'B-One').It + is one of three strategic bombers in the U.S. Air Force fleet as of 2021, the other + two being the B-2 Spirit and the B-52 Stratofortress. It first served in combat + during Operation Desert Fox in 1998 and again during the NATO action in Kosovo the + following year. The B-1B has supported U.S. and NATO military forces in Afghanistan + and Iraq. The Air Force had 62 B-1Bs in service as of 2016. The Northrop Grumman + B-21 Raider is to begin replacing the B-1B after 2025; all B-1s are planned to be + retired by 2036. +introduced: 1986 +manufacturer: Rockwell +origin: USA +price: 45 +role: Supersonic Strategic Bomber +variants: + B-1B Lancer: {} diff --git a/resources/units/aircraft/B-52H.yaml b/resources/units/aircraft/B-52H.yaml new file mode 100644 index 00000000..65aa01c0 --- /dev/null +++ b/resources/units/aircraft/B-52H.yaml @@ -0,0 +1,12 @@ +description: The Boeing B-52 Stratofortress is capable of carrying up to 70,000 pounds + (32,000 kg) of weapons, and has a typical combat range of more than 8,800 miles + (14,080 km) without aerial refueling. The B-52 completed sixty years of continuous + service with its original operator in 2015. After being upgraded between 2013 and + 2015, the last airplanes are expected to serve into the 2050s. +introduced: 1961 +manufacturer: Boeing +origin: USA +price: 35 +role: Strategic Bomber +variants: + B-52H Stratofortress: {} diff --git a/resources/units/aircraft/Bf-109K-4.yaml b/resources/units/aircraft/Bf-109K-4.yaml new file mode 100644 index 00000000..2bb67bc1 --- /dev/null +++ b/resources/units/aircraft/Bf-109K-4.yaml @@ -0,0 +1,18 @@ +always_keeps_gun: true +description: "The BF 109 series was, along with the Focke-Wulf Fw 190, the backbone\ + \ of the Luftwaffe's fighter force. The Bf 109 first saw operational service in\ + \ 1937 during the Spanish Civil War and was still in service at the dawn of the\ + \ jet age at the end of World War II in 1945. The final production version of the\ + \ Bf 109 was the K series or Kurf\xFCrst, introduced in late 1944, powered by the\ + \ DB 605D engine with up to 2,000 PS (1,973 HP). Though externally akin to the late\ + \ production Bf 109G series, a large number of internal changes and aerodynamic\ + \ improvements were incorporated that improved its effectiveness and remedied flaws,\ + \ keeping it competitive with the latest Allied and Soviet fighters. The Bf 109's\ + \ outstanding rate of climb was superior to many Allied adversaries including the\ + \ P-51D Mustang, Spitfire Mk. XIV and Hawker Tempest Mk. V." +introduced: 1944 +manufacturer: Messerschmitt +price: 4 +role: Fighter +variants: + "Bf 109 K-4 Kurf\xFCrst": {} diff --git a/resources/units/aircraft/C-101CC.yaml b/resources/units/aircraft/C-101CC.yaml new file mode 100644 index 00000000..263966d9 --- /dev/null +++ b/resources/units/aircraft/C-101CC.yaml @@ -0,0 +1,11 @@ +description: The C-101CC Aviojet, with its 7 hard-points and uprated engine, is a + versatile light attack aircraft that has seen combat with the Honduras Air Force + against drug traffickers. It is also in service with the Jordanian and Chilean air + forces. +introduced: 1980 +manufacturer: CASA +origin: Spain +price: 8 +role: Light Attack +variants: + C-101CC Aviojet: {} diff --git a/resources/units/aircraft/C-130.yaml b/resources/units/aircraft/C-130.yaml new file mode 100644 index 00000000..4efe0d0a --- /dev/null +++ b/resources/units/aircraft/C-130.yaml @@ -0,0 +1,4 @@ +description: The C-130 is a military transport aircraft. +price: 15 +variants: + C-130: null diff --git a/resources/units/aircraft/C-17A.yaml b/resources/units/aircraft/C-17A.yaml new file mode 100644 index 00000000..a121e07b --- /dev/null +++ b/resources/units/aircraft/C-17A.yaml @@ -0,0 +1,4 @@ +description: The C-17 is a military transport aircraft. +price: 18 +variants: + C-17A: null diff --git a/resources/units/aircraft/CH-47D.yaml b/resources/units/aircraft/CH-47D.yaml new file mode 100644 index 00000000..69c44b1b --- /dev/null +++ b/resources/units/aircraft/CH-47D.yaml @@ -0,0 +1,4 @@ +description: The CH-47D is a transport helicopter. +price: 4 +variants: + CH-47D: null diff --git a/resources/units/aircraft/CH-53E.yaml b/resources/units/aircraft/CH-53E.yaml new file mode 100644 index 00000000..8456be99 --- /dev/null +++ b/resources/units/aircraft/CH-53E.yaml @@ -0,0 +1,4 @@ +description: The CH-53 is a military transport helicopter. +price: 4 +variants: + CH-53E: null diff --git a/resources/units/aircraft/E-2C.yaml b/resources/units/aircraft/E-2C.yaml new file mode 100644 index 00000000..dcc0b9fc --- /dev/null +++ b/resources/units/aircraft/E-2C.yaml @@ -0,0 +1,10 @@ +carrier_capable: true +description: The Northrop Grumman E-2 Hawkeye is an American all-weather, carrier-capable + tactical airborne early warning (AEW) aircraft. +introduced: 1973 +manufacturer: Northrop Grumman +origin: USA +price: 50 +role: AEW&C +variants: + E-2C Hawkeye: {} diff --git a/resources/units/aircraft/E-3A.yaml b/resources/units/aircraft/E-3A.yaml new file mode 100644 index 00000000..8d51bdda --- /dev/null +++ b/resources/units/aircraft/E-3A.yaml @@ -0,0 +1,4 @@ +description: The E-3A is a AWACS aicraft. +price: 50 +variants: + E-3A: null diff --git a/resources/units/aircraft/F-117A.yaml b/resources/units/aircraft/F-117A.yaml new file mode 100644 index 00000000..c4c12674 --- /dev/null +++ b/resources/units/aircraft/F-117A.yaml @@ -0,0 +1,18 @@ +description: The Lockheed F-117 Nighthawk is a semi-retired American single-seat, + twin-engine stealth attack aircraft that was developed by Lockheed's secretive Skunk + Works division and operated by the United States Air Force (USAF). It was the first + operational aircraft to be designed around stealth technology. The F-117 was widely + publicized for its role in the Persian Gulf War of 1991. Although it was commonly + referred to as the 'Stealth Fighter', it was strictly a ground-attack aircraft. + F-117s took part in the conflict in Yugoslavia, where one was shot down and another + damaged by surface-to-air missiles (SAM) in 1999. The U.S. Air Force retired the + F-117 in April 2008, primarily due to the fielding of the F-22 Raptor. Despite the + type's retirement, a portion of the fleet has been kept in airworthy condition, + and Nighthawks have been observed flying in 2020. +introduced: 1983 +manufacturer: Lockheed +origin: USA +price: 35 +role: Stealth Attack +variants: + F-117A Nighthawk: {} diff --git a/resources/units/aircraft/F-14A-135-GR.yaml b/resources/units/aircraft/F-14A-135-GR.yaml new file mode 100644 index 00000000..eb593105 --- /dev/null +++ b/resources/units/aircraft/F-14A-135-GR.yaml @@ -0,0 +1,33 @@ +carrier_capable: true +description: + "The Grumman F-14 Tomcat is a two-crew, variable wing-geometry, maritime\ + \ air superiority fighter that served with the US Navy for 32 years and continues\ + \ to serve with the IRIAF in Iran. The F-14 was the US Navy's frontline fighter\ + \ from the 1970s to the mid-2000s. Over the course of its long service it also became\ + \ one of the US Navy\u2019s premier precision ground-attack platform and its lone\ + \ airborne reconnaissance asset.\n\nNoteworthy features of the Tomcat are its swing-wing\ + \ configuration, two-man crew, and the powerful AN/AWG-9 Weapons Control System\ + \ (WCS) and radar. The AWG-9 allows employment of the long-range AIM-54 Phoenix\ + \ air-to-air missile, and the LANTIRN targeting pod allows precision ground strikes\ + \ using laser-guided bombs. The F-14 Tomcat was present in several historic events\ + \ that include the two Gulf of Sidra incidents, Operations Desert Storm Iraqi Freedom,\ + \ the Yugoslavian conflict, and Operation Enduring Freedom over Afghanistan. It\ + \ was also immortalized in the iconic motion picture, Top Gun, and starred in several\ + \ other feature films including The Final Countdown, Executive Decision, and others.\n\ + \nThe Tomcat was also played a vital role in the Iran-Iraq war of the 1980s, where\ + \ is flew for the Islamic Republic of Iran Air Force." +introduced: 1984 +manufacturer: Grumman +origin: USA +price: 22 +role: Carrier-based Air-Superiority Fighter/Fighter Bomber +variants: + F-14A Tomcat (Block 135-GR Late): {} +radios: + intra_flight: AN/ARC-182 + inter_flight: AN/ARC-159 + channels: + type: common + namer: tomcat + intra_flight_radio_index: 2 + inter_flight_radio_index: 1 diff --git a/resources/units/aircraft/F-14B.yaml b/resources/units/aircraft/F-14B.yaml new file mode 100644 index 00000000..a6244a4a --- /dev/null +++ b/resources/units/aircraft/F-14B.yaml @@ -0,0 +1,33 @@ +carrier_capable: true +description: + "The Grumman F-14 Tomcat is a two-crew, variable wing-geometry, maritime\ + \ air superiority fighter that served with the US Navy for 32 years and continues\ + \ to serve with the IRIAF in Iran. The F-14 was the US Navy's frontline fighter\ + \ from the 1970s to the mid-2000s. Over the course of its long service it also became\ + \ one of the US Navy\u2019s premier precision ground-attack platform and its lone\ + \ airborne reconnaissance asset.\n\nNoteworthy features of the Tomcat are its swing-wing\ + \ configuration, two-man crew, and the powerful AN/AWG-9 Weapons Control System\ + \ (WCS) and radar. The AWG-9 allows employment of the long-range AIM-54 Phoenix\ + \ air-to-air missile, and the LANTIRN targeting pod allows precision ground strikes\ + \ using laser-guided bombs. The F-14 Tomcat was present in several historic events\ + \ that include the two Gulf of Sidra incidents, Operations Desert Storm Iraqi Freedom,\ + \ the Yugoslavian conflict, and Operation Enduring Freedom over Afghanistan. It\ + \ was also immortalized in the iconic motion picture, Top Gun, and starred in several\ + \ other feature films including The Final Countdown, Executive Decision, and others.\n\ + \nThe Tomcat was also played a vital role in the Iran-Iraq war of the 1980s, where\ + \ is flew for the Islamic Republic of Iran Air Force." +introduced: 1987 +manufacturer: Grumman +origin: USA +price: 26 +role: Carrier-based Air-Superiority Fighter/Fighter Bomber +variants: + F-14B Tomcat: {} +radios: + intra_flight: AN/ARC-182 + inter_flight: AN/ARC-159 + channels: + type: common + namer: tomcat + intra_flight_radio_index: 2 + inter_flight_radio_index: 1 diff --git a/resources/units/aircraft/F-15C.yaml b/resources/units/aircraft/F-15C.yaml new file mode 100644 index 00000000..36f39a11 --- /dev/null +++ b/resources/units/aircraft/F-15C.yaml @@ -0,0 +1,12 @@ +description: The F-15 has often been labeled as the greatest U.S. fighter aircraft + from the 1970s until the early 21st century. The F-15C is a pure fighter with outstanding + performance and has scored over 100 air-to-air victories without suffering any confirmed + losses. +introduced: 1978 +manufacturer: McDonnell Douglas +origin: USA +price: 20 +role: Air-Superiority Fighter +variants: + F-15C Eagle: {} + F-15J Eagle: {} diff --git a/resources/units/aircraft/F-15E.yaml b/resources/units/aircraft/F-15E.yaml new file mode 100644 index 00000000..3a80a4cb --- /dev/null +++ b/resources/units/aircraft/F-15E.yaml @@ -0,0 +1,10 @@ +description: The F-15 has often been labeled as the greatest U.S. fighter aircraft + from the 1970s until the early 21st century. The F-15E is a multirole fighter and + exceeds in CAS operations. It served worldwide without suffering any confirmed losses. +introduced: 1988 +manufacturer: McDonnell Douglas +origin: USA +price: 24 +role: Multirole Strike Fighter +variants: + F-15E Strike Eagle: {} diff --git a/resources/units/aircraft/F-16A.yaml b/resources/units/aircraft/F-16A.yaml new file mode 100644 index 00000000..99c2c2e5 --- /dev/null +++ b/resources/units/aircraft/F-16A.yaml @@ -0,0 +1,4 @@ +description: The early verison of the F-16. It flew in Desert Storm. +price: 15 +variants: + F-16A: null diff --git a/resources/units/aircraft/F-16C_50.yaml b/resources/units/aircraft/F-16C_50.yaml new file mode 100644 index 00000000..9e5b3740 --- /dev/null +++ b/resources/units/aircraft/F-16C_50.yaml @@ -0,0 +1,42 @@ +description: + "The F-16C is a single seat, single engine multirole fighter that was + developed in the 1970s. More than 4,500 units were manufactured and are operated + today by 26 countries where the aircraft performs numerous missions that include + air superiority, close air support, precision bombing, air defense suppression, + reconnaissance and more. Few other aircraft can match its versatility, maneuverability, + firepower, and huge production numbers. + + + Nicknamed the Viper by its pilots, the F-16 was designed with a reclined seating + position for high G tolerance and a single-piece bubble canopy for exceptional visibility + and comfort. Its lightweight and powerful F-110-GE-129 engines provide a greater + than 1:1 thrust ratio. + + + Housed in the nose of the Viper is a multifunction APG-68(V)5 radar. The aircraft + can also be equipped with multiple sensors such as the LITENING targeting pod and + HARM Targeting System (HTS). + + + The Viper is armed for air-to-air combat with Sidewinders, AMRAAMs, and an internal + 20mm 6-barrel Gatling gun. It can also be loaded with a wide range of air-to-ground + weapons that include general purpose bombs, rockets, canister munition, Mavericks, + laser- and GPS-guided bombs, and more" +introduced: 1991 +manufacturer: General Dynamics +origin: USA +price: 22 +role: Multirole Fighter +variants: + F-16CM Fighting Falcon (Block 50): {} + F-2A: {} +radios: + intra_flight: AN/ARC-222 + inter_flight: AN/ARC-164 + channels: + type: common + namer: viper + # COM2 is the AN/ARC-222, which is the VHF radio we want to use for + # intra-flight communication to leave COM1 open for UHF inter-flight. + intra_flight_radio_index: 2 + inter_flight_radio_index: 1 diff --git a/resources/units/aircraft/F-22A.yaml b/resources/units/aircraft/F-22A.yaml new file mode 100644 index 00000000..f3979d04 --- /dev/null +++ b/resources/units/aircraft/F-22A.yaml @@ -0,0 +1,19 @@ +description: + The F-22A is an American single-seat, twin-engine, all-weather stealth + tactical fighter aircraft developed exclusively for the United States Air Force + (USAF). The result of the USAF's Advanced Tactical Fighter (ATF) program, the aircraft + was designed primarily as an air superiority fighter, but also has ground attack, + electronic warfare, and signal intelligence capabilities. Currently it is viewed + as the most advanced fighter in the world. +introduced: 2005 +manufacturer: Lockheed Martin +origin: USA +price: 40 +role: Stealth Air-Superiority Fighter +variants: + F-22A Raptor: {} +radios: + # I seriously doubt this is using the Mustang's radio but this is what was + # here before. + intra_flight: SCR-522 + inter_flight: SCR-522 diff --git a/resources/units/aircraft/F-4E.yaml b/resources/units/aircraft/F-4E.yaml new file mode 100644 index 00000000..1d74d1dd --- /dev/null +++ b/resources/units/aircraft/F-4E.yaml @@ -0,0 +1,19 @@ +description: Proving highly adaptable, the F-4 entered service with the Navy in 1961 + before it was adopted by the United States Marine Corps and the United States Air + Force, and by the mid-1960s it had become a major part of their air arms. Phantom + production ran from 1958 to 1981 with a total of 5,195 aircraft built, making it + the most produced American supersonic military aircraft in history, and cementing + its position as an iconic combat aircraft of the Cold War. The F-4 was used extensively + during the Vietnam War. It served as the principal air superiority fighter for the + U.S. Air Force, Navy, and Marine Corps and became important in the ground-attack + and aerial reconnaissance roles late in the war. +introduced: 1968 +manufacturer: McDonnell Douglas +origin: USA +price: 10 +role: Fighter-Bomber +variants: + F-4E Phantom II: {} + F-4EJ Kai Phantom II: {} + F-4F Phantom II: {} + Phantom F.3: {} diff --git a/resources/units/aircraft/F-5E-3.yaml b/resources/units/aircraft/F-5E-3.yaml new file mode 100644 index 00000000..8f957a9a --- /dev/null +++ b/resources/units/aircraft/F-5E-3.yaml @@ -0,0 +1,24 @@ +description: "The F-5E was developed by Northrop Corporation in early 1970s. The light\ + \ tactical fighter is an upgraded version based on previous F-5A developments. The\ + \ F-5s' combat role encompasses air superiority, ground support, and ground attack.\ + \ Given its mission flexibility, ease of operation, and low cost, the Tiger II has,\ + \ and continues to serve, air forces across the globe.\n\nThe F-5\u0415 is armed\ + \ with two 20-mm \u041C39-\u04103 cannons with 280 rounds per each cannon. The cannons\ + \ are located in the nose section, forward of the cockpit. Special deflectors are\ + \ used to avoid compressor stall conditions caused by hot gas ingestion as a bi-product\ + \ of operating the M-39-A3. Each cannon is capable of firing at a rate of 1500 to\ + \ 1700 rounds per minute.\n\nEach wingtip incorporates a launcher rail capable of\ + \ firing AIM-9 infrared-guided missiles.\n\nFive hard points (one centerline pylon\ + \ and four underwing pylons) allow the aircraft to carry different types of air-to-ground\ + \ weapons (bombs, cluster munitions, and rockets) 6,400 pounds (about 3000 kg) in\ + \ total. In addition, illumination ammunition and cargo containers can be attached.\ + \ To increase flight duration and range, external fuel tanks can be attached to\ + \ three hard points (a centerline pylon and two inboard pylons). Maneuverability\ + \ and speed can be maximized in combat by jettisoning all external stores." +introduced: 1975 +manufacturer: Northrop +origin: USA +price: 12 +role: Light Fighter +variants: + F-5E Tiger II: {} diff --git a/resources/units/aircraft/F-86F Sabre.yaml b/resources/units/aircraft/F-86F Sabre.yaml new file mode 100644 index 00000000..e0031770 --- /dev/null +++ b/resources/units/aircraft/F-86F Sabre.yaml @@ -0,0 +1,15 @@ +always_keeps_gun: true +description: "The North American F-86F Sabre was the most capable western fighter\ + \ of the early- to mid-1950s. This swept wing, single engine jet was the most important\ + \ western aircraft of the Korean War and often tangled with Russian-made MiG-15s\ + \ over the infamous \u201CMiG Alley\u201D. It was a hard struggle not only for the\ + \ Korean sky, but also between two excellent aircraft builders of the East and West.\ + \ In addition to its primary role as an air-to-air fighter, the Sabre could also\ + \ carry bombs and air-to-ground rockets to attack ground targets." +introduced: 1953 +manufacturer: North American +origin: USA +price: 8 +role: Fighter +variants: + F-86F Sabre: {} diff --git a/resources/units/aircraft/FA-18C_hornet.yaml b/resources/units/aircraft/FA-18C_hornet.yaml new file mode 100644 index 00000000..06f616d2 --- /dev/null +++ b/resources/units/aircraft/FA-18C_hornet.yaml @@ -0,0 +1,38 @@ +carrier_capable: true +description: + 'The F/A-18C Hornet is twin engine, supersonic fighter that is flown + by a single pilot in a "glass cockpit". It combines extreme maneuverability , a + deadly arsenal of weapons, and the ability to operate from an aircraft carrier. + Operated by several nations, this multi-role fighter has been instrumental in conflicts + from 1986 to today. + + + The Hornet is equipped with a large suite of sensors that includes a radar, targeting + pod, and a helmet mounted sight. In addition to its internal 20mm cannon, the Hornet + can be armed with a large assortment of unguided bombs and rockets, laser and GPS-guided + bombs, air-to-surface missiles of all sorts, and both radar and infrared-guided + air-to-air missiles. + + + The Hornet is also known for its extreme, slow-speed maneuverability in a dogfight. + Although incredibly deadly, the Hornet is also a very easy aircraft to fly.' +introduced: 1987 +manufacturer: McDonnell Douglas +origin: USA +price: 24 +role: Carrier-based Multirole Fighter +variants: + CF-188 Hornet: {} + EF-18A+ Hornet: {} + F/A-18C Hornet (Lot 20): {} +radios: + intra_flight: AN/ARC-210 + inter_flight: AN/ARC-210 + channels: + type: common + # DCS will clobber channel 1 of the first radio compatible with the flight's + # assigned frequency. Since the F/A-18's two radios are both AN/ARC-210s, + # radio 1 will be compatible regardless of which frequency is assigned, so + # we must use radio 1 for the intra-flight radio. + intra_flight_radio_index: 1 + inter_flight_radio_index: 2 diff --git a/resources/units/aircraft/FW-190A8.yaml b/resources/units/aircraft/FW-190A8.yaml new file mode 100644 index 00000000..b0e4fb4a --- /dev/null +++ b/resources/units/aircraft/FW-190A8.yaml @@ -0,0 +1,29 @@ +always_keeps_gun: true +description: 'Designed for the German Luftwaffe by famed aircraft designer Kurt Tank + in the late-1930s, the Fw 190 was the backbone of the Luftwaffe in both fighter + and attack bomber roles. Powered by a large radial engine, the A version of the + Focke-Wulf 190 was superior in many ways to the Bf 109s and Spitfires at the time + of its introduction. In fact, this led to the development of the Mk.IX version of + the Spitfire. + + + Many of the Luftwaffe''s aces racked up their impressive kill counts in the Fw 190 + A due to its impressive fire power, excellent low to medium altitude performance, + durability, and ease of flying. It saw action on both the eastern and western fronts + where it was both respected and feared by allied pilots. Armament included two fuselage-mounted + 13-mm MG 131 machine guns and four wing-mounted MG 151/20E 20mm cannons. The Anton + could also be loaded with unguided rockets and bombs. + + + The A-8 version of the Fw 190 entered production in February 1944, and it was powered + by a BMW 801 D-2 radial engine. In addition to excellent low- and medium-altitude + performance, the engine was also very rugged. Along with the F-8 version, it also + had thicker armor around the engine. The engine also received the C3 injection system + that provided an emergency boost of 1,980 PS in short durations.' +introduced: 1944 +manufacturer: Focke-Wulf +origin: Germany +price: 3 +role: Fighter +variants: + Fw 190 A-8 Anton: {} diff --git a/resources/units/aircraft/FW-190D9.yaml b/resources/units/aircraft/FW-190D9.yaml new file mode 100644 index 00000000..9b63d889 --- /dev/null +++ b/resources/units/aircraft/FW-190D9.yaml @@ -0,0 +1,18 @@ +always_keeps_gun: true +description: "The Focke-Wulf Fw 190 is widely regarded as Germany's best fighter aircraft\ + \ of World War II. Its appearance in the skies over France in August 1941 was a\ + \ rude shock to the Allies, as it was clearly superior to any other plane. For nearly\ + \ a year, the Fw 190 was the unmatched champion of the air war in Europe. The Fw\ + \ 190 had speed and high altitude performance as its two great assets.\n\nThe development\ + \ of advanced allied fighters resulted in the Fw 190 D\u20139 variant which first\ + \ saw service in September 1944. This variant had a larger nose that housed a more\ + \ powerful Junkers Jumo engine that produced 2,100 hp with the MW-50 boost system.\ + \ The D-9 was designed for high altitude aerial combat and is a worthy adversary\ + \ to the P-51D Mustang." +introduced: 1944 +manufacturer: Focke-Wulf +origin: Germany +price: 5 +role: Fighter +variants: + Fw 190 D-9 Dora: {} diff --git a/resources/units/aircraft/Hercules.yaml b/resources/units/aircraft/Hercules.yaml new file mode 100644 index 00000000..070409fa --- /dev/null +++ b/resources/units/aircraft/Hercules.yaml @@ -0,0 +1,11 @@ +description: The Lockheed Martin C-130J Super Hercules is a four-engine turboprop + military transport aircraft. The C-130J is a comprehensive update of the Lockheed + C-130 Hercules, with new engines, flight deck, and other systems. As of February + 2018, 400 C-130J aircraft have been delivered to 17 nations. +introduced: 1999 +manufacturer: Lockheed +origin: USA +price: 18 +role: Transport +variants: + C-130J-30 Super Hercules: {} diff --git a/resources/units/aircraft/I-16.yaml b/resources/units/aircraft/I-16.yaml new file mode 100644 index 00000000..a68fe733 --- /dev/null +++ b/resources/units/aircraft/I-16.yaml @@ -0,0 +1,17 @@ +description: "I-16 - Soviet single-engine monoplane fighter of 1930s created by aircraft\ + \ designer Nikolai Polikarpov\u2019s design bureau. It was the one of the world\u2019\ + s first fighters with landing gear retraction system. It was I-16 which stood the\ + \ air fighting against famous Messerschmitt Bf 109.\n\nOver a period of its history\ + \ I-16 was upgraded a lot. New modifications of aircraft were created and adopted\ + \ almost every year. I-16 type 24 was further development of I-16 type 18.\n\nIt\ + \ is one of the most famous fighters taking part in World War II. It was different\ + \ from all its \u201Ccontemporaries\u201D in configuration and flight characteristics.\ + \ Its uniqueness and distinction were defined by minimum size, dome-shaped fuselage,\ + \ small wing, dorsal spine." +introduced: 1935 +manufacturer: Polikarpov +origin: USSR/Russia +price: 2 +role: Fighter +variants: + I-16 Ishak: {} diff --git a/resources/units/aircraft/IL-76MD.yaml b/resources/units/aircraft/IL-76MD.yaml new file mode 100644 index 00000000..97020aca --- /dev/null +++ b/resources/units/aircraft/IL-76MD.yaml @@ -0,0 +1,3 @@ +price: 20 +variants: + IL-76MD: null diff --git a/resources/units/aircraft/IL-78M.yaml b/resources/units/aircraft/IL-78M.yaml new file mode 100644 index 00000000..a07be082 --- /dev/null +++ b/resources/units/aircraft/IL-78M.yaml @@ -0,0 +1,3 @@ +price: 20 +variants: + IL-78M: null diff --git a/resources/units/aircraft/J-11A.yaml b/resources/units/aircraft/J-11A.yaml new file mode 100644 index 00000000..2c26fc33 --- /dev/null +++ b/resources/units/aircraft/J-11A.yaml @@ -0,0 +1,12 @@ +description: The Shenyang J-11 (NATO reporting name Flanker-L) is a twin-engine jet + fighter whose airframe is based on the Soviet-designed Sukhoi Su-27. It is manufactured + by the Shenyang Aircraft Corporation (SAC). The aircraft is operated by the People's + Liberation Army Air Force (PLAAF) and the People's Liberation Army Naval Air Force + (PLANAF). +introduced: 1998 +manufacturer: Shenyang +origin: China +price: 22 +role: Air-Superiority Fighter +variants: + J-11A Flanker-L: {} diff --git a/resources/units/aircraft/JAS39Gripen.yaml b/resources/units/aircraft/JAS39Gripen.yaml new file mode 100644 index 00000000..0c74a8e9 --- /dev/null +++ b/resources/units/aircraft/JAS39Gripen.yaml @@ -0,0 +1,16 @@ +description: + The Saab JAS 39 Gripen is a light single-engine multirole fighter aircraft + manufactured by the Swedish aerospace company Saab AB. The Gripen has a delta wing + and canard configuration with relaxed stability design and fly-by-wire flight controls. + Various versions have been built, grouped as A-, C- and E-series. This is the AA + Version, since the Mod for this aircraft splitted it in an AA and AG Version. +introduced: 2002 +manufacturer: Saab AB +origin: Sweden +price: 21 +role: Fighter +variants: + JAS 39 Gripen: {} +radios: + intra_flight: R&S Series 6000 + inter_flight: R&S Series 6000 diff --git a/resources/units/aircraft/JAS39Gripen_AG.yaml b/resources/units/aircraft/JAS39Gripen_AG.yaml new file mode 100644 index 00000000..241126f1 --- /dev/null +++ b/resources/units/aircraft/JAS39Gripen_AG.yaml @@ -0,0 +1,16 @@ +description: + The Saab JAS 39 Gripen is a light single-engine multirole fighter aircraft + manufactured by the Swedish aerospace company Saab AB. The Gripen has a delta wing + and canard configuration with relaxed stability design and fly-by-wire flight controls. + Various versions have been built, grouped as A-, C- and E-series. This is the AG + Version, since the Mod for this aircraft splitted it in an AA and AG Version. +introduced: 2002 +manufacturer: Saab AB +origin: Sweden +price: 20 +role: Attack +variants: + JAS 39 Gripen A/G: {} +radios: + intra_flight: R&S Series 6000 + inter_flight: R&S Series 6000 diff --git a/resources/units/aircraft/JF-17.yaml b/resources/units/aircraft/JF-17.yaml new file mode 100644 index 00000000..00f8a7f5 --- /dev/null +++ b/resources/units/aircraft/JF-17.yaml @@ -0,0 +1,35 @@ +description: + "JF-17 is a single seat, single engine, multirole light fighter that\ + \ was joint developed by AVIC Chengdu and Pakistan Aeronautical Complex (PAC). The\ + \ design phase of JF-17 \"Thunder\" finished at May 31st, 2002, and the maiden flight\ + \ was made on August 25th, 2003. The first plane delivered to PAF (Pakistan Air\ + \ Force) in 2007. Currently several different blocks of JF-17s are in service in\ + \ Pakistan and Myanmar air forces. There are also several countries interested in\ + \ purchasing this fighter jet. On February 27th, 2019, \"Thunder\" has withstood\ + \ the test of actual combat and helped PAF win an appreciable victory.\n\n\"Thunder\"\ + \ is a type of fighter that specifically tailored for PAF. The development plan\ + \ of her predecessor can even be traced back to 1985. At first, PAF was only looking\ + \ for a fighter that can replace Shenyang J-6 (Chinese version of Mig-19), but they\ + \ were not satisfied with Chengdu\u2019s J-7M. After more than 20 years of development,\ + \ the final product \"Thunder\" becomes completely different from J-7M.\n\n\"Thunder\"\ + \ has a bubble canopy of great view, pretty strake-wing layout and advanced avionics.\ + \ KLJ-7 radar provides excellent air to ground capability. WMD-7 targeting pod can\ + \ help \"Thunder\" searching for targets in combat." +introduced: 2007 +manufacturer: PAC/CAC +origin: Pakistan/China +price: 24 +role: Multirole Fighter +variants: + FC-1 Fierce Dragon: + introduced: null + JF-17 Thunder: {} +radios: + intra_flight: R&S M3AR VHF + inter_flight: R&S M3AR UHF + channels: + type: common + # Same naming pattern as the Viper, so just reuse that. + namer: viper + intra_flight_radio_index: 1 + inter_flight_radio_index: 1 diff --git a/resources/units/aircraft/Ju-88A4.yaml b/resources/units/aircraft/Ju-88A4.yaml new file mode 100644 index 00000000..381a1bc0 --- /dev/null +++ b/resources/units/aircraft/Ju-88A4.yaml @@ -0,0 +1,20 @@ +always_keeps_gun: true +description: The Junkers Ju 88 is a German World War II Luftwaffe twin-engined multirole + combat aircraft. Junkers Aircraft and Motor Works (JFM) designed the plane in the + mid-1930s as a so-called Schnellbomber ('fast bomber') that would be too fast for + fighters of its era to intercept. It suffered from technical problems during its + development and early operational periods but became one of the most versatile combat + aircraft of the war. Like a number of other Luftwaffe bombers, it served as a bomber, + dive bomber, night fighter, torpedo bomber, reconnaissance aircraft, heavy fighter + and at the end of the war, as a flying bomb. Despite a protracted development, it + became one of the Luftwaffe's most important aircraft. The assembly line ran constantly + from 1936 to 1945 and more than 15,000 Ju 88s were built in dozens of variants, + more than any other twin-engine German aircraft of the period. Throughout production + the basic structure of the aircraft remained unchanged. +introduced: 1940 +manufacturer: Junkers +origin: Germany +price: 14 +role: Tactical/Torpedo Bomber +variants: + Ju 88 A-4: {} diff --git a/resources/units/aircraft/KC-135.yaml b/resources/units/aircraft/KC-135.yaml new file mode 100644 index 00000000..3aa3f31a --- /dev/null +++ b/resources/units/aircraft/KC-135.yaml @@ -0,0 +1,9 @@ +description: The Boeing KC-135 Stratotanker is a military aerial refueling aircraft + that was developed from the Boeing 367-80 prototype, alongside the Boeing 707 airliner. +introduced: 1957 +manufacturer: Beoing +origin: USA +price: 25 +role: Tanker +variants: + KC-135 Stratotanker: {} diff --git a/resources/units/aircraft/KC130.yaml b/resources/units/aircraft/KC130.yaml new file mode 100644 index 00000000..04b429aa --- /dev/null +++ b/resources/units/aircraft/KC130.yaml @@ -0,0 +1,9 @@ +description: The Lockheed Martin (previously Lockheed) KC-130 is a family of the extended-range + tanker version of the C-130 Hercules transport aircraft modified for aerial refueling. +introduced: 1962 +manufacturer: Lockheed Martin +origin: USA +price: 25 +role: Tanker +variants: + KC-130: {} diff --git a/resources/units/aircraft/KC135MPRS.yaml b/resources/units/aircraft/KC135MPRS.yaml new file mode 100644 index 00000000..63b379e8 --- /dev/null +++ b/resources/units/aircraft/KC135MPRS.yaml @@ -0,0 +1,11 @@ +description: The Boeing KC-135 Stratotanker is a military aerial refueling aircraft + that was developed from the Boeing 367-80 prototype, alongside the Boeing 707 airliner. This + model has the Multi-point Refueling System modification, allowing for probe and + drogue refuelling. +introduced: 1994 +manufacturer: Boeing +origin: USA +price: 25 +role: Tanker +variants: + KC-135 Stratotanker MPRS: {} diff --git a/resources/units/aircraft/KJ-2000.yaml b/resources/units/aircraft/KJ-2000.yaml new file mode 100644 index 00000000..04f29793 --- /dev/null +++ b/resources/units/aircraft/KJ-2000.yaml @@ -0,0 +1,3 @@ +price: 50 +variants: + KJ-2000: null diff --git a/resources/units/aircraft/Ka-50.yaml b/resources/units/aircraft/Ka-50.yaml new file mode 100644 index 00000000..e595531e --- /dev/null +++ b/resources/units/aircraft/Ka-50.yaml @@ -0,0 +1,22 @@ +always_keeps_gun: true +carrier_capable: true +description: + "The Ka-50 Black Shark (NATO reporting name: Hokum) is a unique and deadly + single-seat, Russian attack helicopter that has seen combat in the Northern Caucasus. + It combines a high performance dual rotor system with a deadly weapons payload of + guided missiles, rockets, bombs, and a 30mm cannon. The Ka-50 is also unique in + that it has an ejection seat." +introduced: 1995 +lha_capable: true +manufacturer: Kamov +origin: USSR/Russia +price: 20 +role: Attack +variants: + Ka-50 Hokum: {} +radios: + intra_flight: R-800L1 + inter_flight: R-800L1 + # The R-800L1 doesn't have preset channels, and the other radio is for + # communications with FAC and ground units, which don't currently have + # radios assigned, so no channels to configure. diff --git a/resources/units/aircraft/L-39ZA.yaml b/resources/units/aircraft/L-39ZA.yaml new file mode 100644 index 00000000..b5f0d778 --- /dev/null +++ b/resources/units/aircraft/L-39ZA.yaml @@ -0,0 +1,13 @@ +description: "Two seat Jet trainer aircraft L-39C is intended for basic and advanced\ + \ pilot training in visual and instrument flight rules weather conditions, day and\ + \ night and also for combat use against air and ground targets. Its development\ + \ started in the middle 60s of the last century by the Czech \u201CAero Vodochody\u201D\ + . In the 70s the aircraft has entered service and is still in the operational use\ + \ in over 30 countries worldwide." +introduced: 1977 +manufacturer: Aero +origin: Czechoslovakia +price: 10 +role: Light Attack +variants: + L-39ZA Albatros: {} diff --git a/resources/units/aircraft/M-2000C.yaml b/resources/units/aircraft/M-2000C.yaml new file mode 100644 index 00000000..25f3a543 --- /dev/null +++ b/resources/units/aircraft/M-2000C.yaml @@ -0,0 +1,24 @@ +description: + The M-2000C is a multi-role, French-designed, 4th generation fighter. + It was designed in the 1970s as a lightweight fighter and in excess of 600 M-2000C + aircraft have been built. The M2000C is a single-engine fighter will a low-set delta + wing with no horizontal tail. It has excellent maneuverability given its relaxed + stability and fly-by-wire flight control system. The M2000C also includes a multi-mode + RDI radar that is capable tracking and engaging targets at beyond visual ranges. + In addition to engaging other aircraft with cannon and missiles, the M2000C can + also engage ground targets with cannon, rockets and bombs. +introduced: 1983 +manufacturer: Dassault +origin: France +price: 17 +role: Multirole Fighter +variants: + Mirage 2000C: {} +radios: + intra_flight: TRT ERA 7200 UHF + inter_flight: TRT ERA 7000 V/UHF + channels: + type: common + namer: mirage + intra_flight_radio_index: 2 + inter_flight_radio_index: 1 diff --git a/resources/units/aircraft/MB-339PAN.yaml b/resources/units/aircraft/MB-339PAN.yaml new file mode 100644 index 00000000..4f838ffa --- /dev/null +++ b/resources/units/aircraft/MB-339PAN.yaml @@ -0,0 +1,9 @@ +description: The Aermacchi MB-339 is a military jet trainer and light attack aircraft + designed and manufactured by Italian aviation company Aermacchi. +introduced: 1982 +manufacturer: Aermacchi +origin: Italy +price: 8 +role: Aerobatic +variants: + MB-339PAN: {} diff --git a/resources/units/aircraft/MQ-9 Reaper.yaml b/resources/units/aircraft/MQ-9 Reaper.yaml new file mode 100644 index 00000000..9b0a338b --- /dev/null +++ b/resources/units/aircraft/MQ-9 Reaper.yaml @@ -0,0 +1,3 @@ +price: 10 +variants: + MQ-9 Reaper: null diff --git a/resources/units/aircraft/Mi-24P.yaml b/resources/units/aircraft/Mi-24P.yaml new file mode 100644 index 00000000..355619c0 --- /dev/null +++ b/resources/units/aircraft/Mi-24P.yaml @@ -0,0 +1,22 @@ +always_keeps_gun: true +description: "The Mil Mi-24 (Russian: \u041C\u0438\u043B\u044C \u041C\u0438-24; NATO\ + \ reporting name: Hind) is a large helicopter gunship, attack helicopter and low-capacity\ + \ troop transport with room for eight passengers. It is produced by Mil Moscow Helicopter\ + \ Plant and has been operated since 1972 by the Soviet Air Force and its successors,\ + \ along with 48 other nations. Soviet pilots called the Mi-24 the 'flying tank'\ + \ (Russian: \u043B\u0435\u0442\u0430\u044E\u0449\u0438\u0439 \u0442\u0430\u043D\u043A\ + , romanized: letayushchiy tank), a term used historically with the famous World\ + \ War II Soviet Il-2 Shturmovik armored ground attack aircraft. More common unofficial\ + \ nicknames were 'Galina' (or 'Galya'), 'Crocodile' (Russian: \u041A\u0440\u043E\ + \u043A\u043E\u0434\u0438\u043B, romanized: Krokodil), due to the helicopter's camouflage\ + \ scheme, and 'Drinking Glass' (Russian: \u0421\u0442\u0430\u043A\u0430\u043D, romanized:\ + \ Stakan), because of the flat glass plates that surround earlier Mi-24 variants'\ + \ cockpits. It served to a great success in the Afghanistan war, until the Taliban\ + \ where equipped with Stinger Missiles from the CIA." +introduced: 1981 +manufacturer: Mil +origin: USSR/Russia +price: 14 +role: Attack/Transport +variants: + Mi-24P Hind-F: {} diff --git a/resources/units/aircraft/Mi-24V.yaml b/resources/units/aircraft/Mi-24V.yaml new file mode 100644 index 00000000..8d1ed18f --- /dev/null +++ b/resources/units/aircraft/Mi-24V.yaml @@ -0,0 +1,22 @@ +always_keeps_gun: true +description: "The Mil Mi-24 (Russian: \u041C\u0438\u043B\u044C \u041C\u0438-24; NATO\ + \ reporting name: Hind) is a large helicopter gunship, attack helicopter and low-capacity\ + \ troop transport with room for eight passengers. It is produced by Mil Moscow Helicopter\ + \ Plant and has been operated since 1972 by the Soviet Air Force and its successors,\ + \ along with 48 other nations. Soviet pilots called the Mi-24 the 'flying tank'\ + \ (Russian: \u043B\u0435\u0442\u0430\u044E\u0449\u0438\u0439 \u0442\u0430\u043D\u043A\ + , romanized: letayushchiy tank), a term used historically with the famous World\ + \ War II Soviet Il-2 Shturmovik armored ground attack aircraft. More common unofficial\ + \ nicknames were 'Galina' (or 'Galya'), 'Crocodile' (Russian: \u041A\u0440\u043E\ + \u043A\u043E\u0434\u0438\u043B, romanized: Krokodil), due to the helicopter's camouflage\ + \ scheme, and 'Drinking Glass' (Russian: \u0421\u0442\u0430\u043A\u0430\u043D, romanized:\ + \ Stakan), because of the flat glass plates that surround earlier Mi-24 variants'\ + \ cockpits. It served to a great success in the Afghanistan war, until the Taliban\ + \ where equiped with Stinger Misseles from the CIA." +introduced: 1976 +manufacturer: Mil +origin: USSR/Russia +price: 14 +role: Attack/Transport +variants: + Mi-24V Hind-E: {} diff --git a/resources/units/aircraft/Mi-26.yaml b/resources/units/aircraft/Mi-26.yaml new file mode 100644 index 00000000..894aaa06 --- /dev/null +++ b/resources/units/aircraft/Mi-26.yaml @@ -0,0 +1,3 @@ +price: 4 +variants: + Mi-26: null diff --git a/resources/units/aircraft/Mi-28N.yaml b/resources/units/aircraft/Mi-28N.yaml new file mode 100644 index 00000000..78c7777a --- /dev/null +++ b/resources/units/aircraft/Mi-28N.yaml @@ -0,0 +1,13 @@ +always_keeps_gun: true +description: The Mil Mi-28 (NATO reporting name 'Havoc') is a Russian all-weather, + day-night, military tandem, two-seat anti-armor attack helicopter. It is an attack + helicopter with no intended secondary transport capability, better optimized than + the Mil Mi-24 gunship for the role. It carries a single gun in an undernose barbette, + plus external loads carried on pylons beneath stub wings. +introduced: 2009 +manufacturer: Mil +origin: USSR/Russia +price: 16 +role: Attack +variants: + Mi-28N Havoc: {} diff --git a/resources/units/aircraft/Mi-8MT.yaml b/resources/units/aircraft/Mi-8MT.yaml new file mode 100644 index 00000000..95ec5e8f --- /dev/null +++ b/resources/units/aircraft/Mi-8MT.yaml @@ -0,0 +1,12 @@ +carrier_capable: true +description: The Mil Mi-8MTV2 is an upgraded version of one of the most widely produced + helicopters in history and a combat transport and fire support veteran of countless + operations around the world. +introduced: 1981 +lha_capable: true +manufacturer: Mil +origin: USSR/Russia +price: 5 +role: Transport/Light Attack +variants: + Mi-8MTV2 Hip: {} diff --git a/resources/units/aircraft/MiG-15bis.yaml b/resources/units/aircraft/MiG-15bis.yaml new file mode 100644 index 00000000..af72ffa7 --- /dev/null +++ b/resources/units/aircraft/MiG-15bis.yaml @@ -0,0 +1,22 @@ +always_keeps_gun: true +description: + Developed in the years immediately following World War II, the MiG-15bis + was a first-generation jet fighter designed by the Mikoyan-Gurevich design bureau + of the Soviet Union. The MiG-15bis is a single engine, swept-wing jet that saw over + 15,000 copies produced. The MiG-15 gained fame in the skies over Korea where it + battled the F-86 Sabre and other allied aircraft. It proved an excellent match to + the Sabre, and it often came down to the skill of the pilot that determined who + made it home and who was left dangling from a parachute. Having an excellent thrust-to-weight + ratio and good climbing characteristics, the MiG-15bis was also armed with two NR-23 + 23mm cannons and a single, powerful N-37 37mm cannon. Not surprisingly, it is considered + by many as one of the deadliest fighters of the era. +introduced: 1950 +manufacturer: Mikoyan-Gurevich +origin: USSR/Russia +price: 8 +role: Fighter +variants: + MiG-15bis Fagot: {} +radios: + intra_flight: RSI-6K HF + inter_flight: RSI-6K HF diff --git a/resources/units/aircraft/MiG-19P.yaml b/resources/units/aircraft/MiG-19P.yaml new file mode 100644 index 00000000..3182c3bc --- /dev/null +++ b/resources/units/aircraft/MiG-19P.yaml @@ -0,0 +1,28 @@ +always_keeps_gun: true +description: + "The MiG-19P Farmer was designed by the legendary Mikoyan Design Bureau\ + \ in the Early 1950\u2019s. The MiG-19 fighter was the Soviet Union\u2019s first\ + \ true supersonic Interceptor that could exceed Mach 1 in level flight.\n\nDesigned\ + \ to take on enemy fighters and bombers at any time of day or night and in any weather\ + \ condition, the Farmer was equipped with the RP-5 lzumrud radar in the nose and\ + \ armed with two NR-30 30mm cannons in the wing roots. The Farmer is also able to\ + \ carry an array of ground attack weapons that includes S-5M rockets and various\ + \ general-purpose bombs. It is a lethal interceptor with conventional ground attack\ + \ capabilities." +introduced: 1955 +manufacturer: Mikoyan-Gurevich +origin: USSR/Russia +price: 10 +role: Fighter +variants: + J-6A: + introduced: 1962 + manufacturer: Shenyang + origin: China + MiG-19P Farmer-B: {} +radios: + intra_flight: RSIU-4V + inter_flight: RSIU-4V + channels: + type: farmer + namer: single diff --git a/resources/units/aircraft/MiG-21Bis.yaml b/resources/units/aircraft/MiG-21Bis.yaml new file mode 100644 index 00000000..4b3faf28 --- /dev/null +++ b/resources/units/aircraft/MiG-21Bis.yaml @@ -0,0 +1,27 @@ +description: + The MiG-21bis is a delta wing, supersonic, fighter-interceptor jet aircraft. + Much like the AK-47 became the everyman's rifle, the MiG-21 has been operated by + more than 40 countries worldwide, and has enjoyed the longest production run of + any modern jet fighter to date. The MiG-21, in all of its variants, has fought in + wars stretching all the way from the Vietnam War in the 1960's to the modern day + Syrian Civil War. Owing to its unique blend of versatility, ruggedness and maintainability, + the MiG-21 remains in active service to this very day. +introduced: 1972 +manufacturer: Mikoyan-Gurevich +origin: USSR/Russia +price: 12 +role: Fighter +variants: + J-7B: + introduced: 1992 + manufacturer: Chengdu + origin: China + MiG-21bis Fishbed-N: {} +radios: + intra_flight: RSIU-5V + inter_flight: RSIU-5V + channels: + type: common + namer: single + intra_flight_radio_index: 1 + inter_flight_radio_index: 1 diff --git a/resources/units/aircraft/MiG-23MLD.yaml b/resources/units/aircraft/MiG-23MLD.yaml new file mode 100644 index 00000000..3e7fde1d --- /dev/null +++ b/resources/units/aircraft/MiG-23MLD.yaml @@ -0,0 +1,20 @@ +description: "The Mikoyan-Gurevich MiG-23 (Russian: \u041C\u0438\u043A\u043E\u044F\ + \u043D \u0438 \u0413\u0443\u0440\u0435\u0432\u0438\u0447 \u041C\u0438\u0413-23;\ + \ NATO reporting name: Flogger) is a variable-geometry fighter aircraft, designed\ + \ by the Mikoyan-Gurevich design bureau in the Soviet Union. It is a third-generation\ + \ jet fighter, the world's most-produced variable-geometry aircraft, along with\ + \ similar Soviet aircraft such as the Su-17 'Fitter'. It was the first Soviet fighter\ + \ to field a look-down/shoot-down radar, the RP-23 Sapfir, and one of the first\ + \ to be armed with beyond-visual-range missiles. Production started in 1969 and\ + \ reached large numbers with over 5,000 aircraft built, making it the most produced\ + \ variable-sweep wing aircraft in history. Today the MiG-23 remains in limited service\ + \ with some export customers." +introduced: 1982 +manufacturer: Mikoyan-Gurevich +origin: USSR/Russia +price: 12 +role: Fighter +variants: + MiG-23ML Flogger-G: + introduced: 1981 + MiG-23MLD Flogger-K: {} diff --git a/resources/units/aircraft/MiG-25PD.yaml b/resources/units/aircraft/MiG-25PD.yaml new file mode 100644 index 00000000..ed5b0e43 --- /dev/null +++ b/resources/units/aircraft/MiG-25PD.yaml @@ -0,0 +1,28 @@ +description: "The Mikoyan-Gurevich MiG-25 (Russian: \u041C\u0438\u043A\u043E\u044F\ + \u043D \u0438 \u0413\u0443\u0440\u0435\u0432\u0438\u0447 \u041C\u0438\u0413-25;\ + \ NATO reporting name: Foxbat) is a supersonic interceptor and reconnaissance aircraft\ + \ that was among the fastest military aircraft to enter service. It was designed\ + \ by the Soviet Union's Mikoyan-Gurevich bureau and is one of the few combat aircraft\ + \ built primarily using stainless steel. It was the last plane designed by Mikhail\ + \ Gurevich before his retirement. The first prototype flew in 1964, and the aircraft\ + \ entered service in 1970. The MiG-25 was theoretically capable of a maximum speed\ + \ exceeding Mach 3 and a ceiling of 27 km (89,000 ft). Its high speed was problematic:\ + \ although sufficient thrust was available to reach Mach 3.2, a limit of Mach 2.83\ + \ had to be imposed as the engines tended to overspeed and overheat at higher air\ + \ speeds, possibly damaging them beyond repair. The MiG-25 features powerful radar\ + \ and four air-to-air missiles. When first seen in reconnaissance photography, the\ + \ large wings suggested an enormous and highly maneuverable fighter, at a time when\ + \ U.S. design theories were also evolving towards higher maneuverability due to\ + \ combat performance in the Vietnam War. The appearance of the MiG-25 sparked serious\ + \ concern in the West and prompted dramatic increases in performance for the McDonnell\ + \ Douglas F-15 Eagle, then under development in the late 1960s. The capabilities\ + \ of the MiG-25 were better understood by the west in 1976 when Soviet pilot Viktor\ + \ Belenko defected in a MiG-25 to the United States via Japan. It turned out that\ + \ the aircraft's weight necessitated its large wings." +introduced: 1979 +manufacturer: Mikoyan-Gurevich +origin: USSR/Russia +price: 17 +role: Interceptor +variants: + MiG-25PD Foxbat-E: {} diff --git a/resources/units/aircraft/MiG-25RBT.yaml b/resources/units/aircraft/MiG-25RBT.yaml new file mode 100644 index 00000000..99d65253 --- /dev/null +++ b/resources/units/aircraft/MiG-25RBT.yaml @@ -0,0 +1,28 @@ +description: "The Mikoyan-Gurevich MiG-25 (Russian: \u041C\u0438\u043A\u043E\u044F\ + \u043D \u0438 \u0413\u0443\u0440\u0435\u0432\u0438\u0447 \u041C\u0438\u0413-25;\ + \ NATO reporting name: Foxbat) is a supersonic interceptor and reconnaissance aircraft\ + \ that was among the fastest military aircraft to enter service. It was designed\ + \ by the Soviet Union's Mikoyan-Gurevich bureau and is one of the few combat aircraft\ + \ built primarily using stainless steel. It was the last plane designed by Mikhail\ + \ Gurevich before his retirement. The first prototype flew in 1964, and the aircraft\ + \ entered service in 1970. The MiG-25 was theoretically capable of a maximum speed\ + \ exceeding Mach 3 and a ceiling of 27 km (89,000 ft). Its high speed was problematic:\ + \ although sufficient thrust was available to reach Mach 3.2, a limit of Mach 2.83\ + \ had to be imposed as the engines tended to overspeed and overheat at higher air\ + \ speeds, possibly damaging them beyond repair. The MiG-25 features powerful radar\ + \ and four air-to-air missiles. When first seen in reconnaissance photography, the\ + \ large wings suggested an enormous and highly maneuverable fighter, at a time when\ + \ U.S. design theories were also evolving towards higher maneuverability due to\ + \ combat performance in the Vietnam War. The appearance of the MiG-25 sparked serious\ + \ concern in the West and prompted dramatic increases in performance for the McDonnell\ + \ Douglas F-15 Eagle, then under development in the late 1960s. The capabilities\ + \ of the MiG-25 were better understood by the west in 1976 when Soviet pilot Viktor\ + \ Belenko defected in a MiG-25 to the United States via Japan. It turned out that\ + \ the aircraft's weight necessitated its large wings." +introduced: 1970 +manufacturer: Mikoyan-Gurevich +origin: USSR/Russia +price: 17 +role: Strike Fighter +variants: + MiG-25RBT Foxbat-B: {} diff --git a/resources/units/aircraft/MiG-27K.yaml b/resources/units/aircraft/MiG-27K.yaml new file mode 100644 index 00000000..77cf359a --- /dev/null +++ b/resources/units/aircraft/MiG-27K.yaml @@ -0,0 +1,17 @@ +description: "The Mikoyan MiG-27 (Russian: \u041C\u0438\u043A\u043E\u044F\u043D \u041C\ + \u0438\u0413-27; NATO reporting name: Flogger-D/J) is a variable-sweep ground-attack\ + \ aircraft, originally built by the Mikoyan-Gurevich design bureau in the Soviet\ + \ Union and later licence-produced in India by Hindustan Aeronautics as the Bahadur\ + \ ('Valiant'). It is based on the Mikoyan-Gurevich MiG-23 fighter aircraft, but\ + \ optimised for air-to-ground attack. Unlike the MiG-23, the MiG-27 did not have\ + \ widespread use outside Russia, as most countries opted for the Mikoyan-Gurevich\ + \ MiG-23BN and Sukhoi Su-22 instead. It remains in service only with the Kazakh\ + \ Air Forces in the ground attack role. All Russian, Indian and Ukrainian MiG-27s\ + \ have been retired." +introduced: 1975 +manufacturer: Mikoyan +origin: USSR/Russia +price: 15 +role: Attack +variants: + MiG-27K Flogger-J2: {} diff --git a/resources/units/aircraft/MiG-29A.yaml b/resources/units/aircraft/MiG-29A.yaml new file mode 100644 index 00000000..8678e4bd --- /dev/null +++ b/resources/units/aircraft/MiG-29A.yaml @@ -0,0 +1,28 @@ +description: 'The MiG-29 "Fulcrum" is a Russian-designed, twin-engine, supersonic + fighter. First operational in the early 1980s, the Fulcrum is a "light weight" fighter, + comparable to the American F/A-18 Hornet and F-16. Designed to work in conjunction + with the larger Su-27 Flanker, the MiG-29 is armed with an internal 30mm cannon + and both infrared and radar guided air-to-air missiles. For air-to-ground tasks, + the MiG-29 can be armed with a large array of unguided bombs and rockets. + + + In addition to a sophisticated pulse doppler radar, the MiG-29 is also equipped + with a passive Infrared Search and Track (IRST) sensor that allows the Fulcrum to + detect and target enemy aircraft just based on target infrared emissions. This allows + the MiG-29 to make stealthy attacks with no warning! + + + The Fulcrum is a highly-maneuverable fighter in a dogfight, and when paired with + the helmet mounted sight and the AA-11 "Archer" air-to-air missile, it is a very + lethal adversary. + + + The MiG-29 has also been widely exported and has served in many countries that include + Germany, Iran, Ukraine, and Poland.' +introduced: 1983 +manufacturer: Mikoyan +origin: USSR/Russia +price: 15 +role: Multirole Fighter +variants: + MiG-29A Fulcrum-A: {} diff --git a/resources/units/aircraft/MiG-29G.yaml b/resources/units/aircraft/MiG-29G.yaml new file mode 100644 index 00000000..b3ad36f5 --- /dev/null +++ b/resources/units/aircraft/MiG-29G.yaml @@ -0,0 +1,28 @@ +description: 'The MiG-29 "Fulcrum" is a Russian-designed, twin-engine, supersonic + fighter. First operational in the early 1980s, the Fulcrum is a "light weight" fighter, + comparable to the American F/A-18 Hornet and F-16. Designed to work in conjunction + with the larger Su-27 Flanker, the MiG-29 is armed with an internal 30mm cannon + and both infrared and radar guided air-to-air missiles. For air-to-ground tasks, + the MiG-29 can be armed with a large array of unguided bombs and rockets. + + + In addition to a sophisticated pulse doppler radar, the MiG-29 is also equipped + with a passive Infrared Search and Track (IRST) sensor that allows the Fulcrum to + detect and target enemy aircraft just based on target infrared emissions. This allows + the MiG-29 to make stealthy attacks with no warning! + + + The Fulcrum is a highly-maneuverable fighter in a dogfight, and when paired with + the helmet mounted sight and the AA-11 "Archer" air-to-air missile, it is a very + lethal adversary. + + + The MiG-29 has also been widely exported and has served in many countries that include + Germany, Iran, Ukraine, and Poland.' +introduced: 1993 +manufacturer: Mikoyan +origin: USSR/Russia +price: 18 +role: Multirole Fighter +variants: + MiG-29G Fulcrum-A: {} diff --git a/resources/units/aircraft/MiG-29S.yaml b/resources/units/aircraft/MiG-29S.yaml new file mode 100644 index 00000000..c8168c2a --- /dev/null +++ b/resources/units/aircraft/MiG-29S.yaml @@ -0,0 +1,28 @@ +description: 'The MiG-29 "Fulcrum" is a Russian-designed, twin-engine, supersonic + fighter. First operational in the early 1980s, the Fulcrum is a "light weight" fighter, + comparable to the American F/A-18 Hornet and F-16. Designed to work in conjunction + with the larger Su-27 Flanker, the MiG-29 is armed with an internal 30mm cannon + and both infrared and radar guided air-to-air missiles. For air-to-ground tasks, + the MiG-29 can be armed with a large array of unguided bombs and rockets. + + + In addition to a sophisticated pulse doppler radar, the MiG-29 is also equipped + with a passive Infrared Search and Track (IRST) sensor that allows the Fulcrum to + detect and target enemy aircraft just based on target infrared emissions. This allows + the MiG-29 to make stealthy attacks with no warning! + + + The Fulcrum is a highly-maneuverable fighter in a dogfight, and when paired with + the helmet mounted sight and the AA-11 "Archer" air-to-air missile, it is a very + lethal adversary. + + + The MiG-29 has also been widely exported and has served in many countries that include + Germany, Iran, Ukraine, and Poland.' +introduced: 1983 +manufacturer: Mikoyan +origin: USSR/Russia +price: 19 +role: Multirole Fighter +variants: + MiG-29S Fulcrum-C: {} diff --git a/resources/units/aircraft/MiG-31.yaml b/resources/units/aircraft/MiG-31.yaml new file mode 100644 index 00000000..753404fd --- /dev/null +++ b/resources/units/aircraft/MiG-31.yaml @@ -0,0 +1,18 @@ +description: "The Mikoyan MiG-31 (Russian: \u041C\u0438\u043A\u043E\u044F\u043D \u041C\ + \u0438\u0413-31; NATO reporting name: Foxhound) is a supersonic interceptor aircraft\ + \ that was developed for use by the Soviet Air Forces. The aircraft was designed\ + \ by the Mikoyan design bureau as a replacement for the earlier MiG-25 \"Foxbat\"\ + ; the MiG-31 is based on and shares design elements with the MiG-25. The MiG-31\ + \ is among the fastest combat jets in the world. It continues to be operated by\ + \ the Russian Air Force and the Kazakhstan Air Force following the end of the Cold\ + \ War and the collapse of the Soviet Union in 1991. The Russian Defence Ministry\ + \ expects the MiG-31 to remain in service until 2030 or beyond and was confirmed\ + \ in 2020 when an announcement was made to extend the service lifetime from 2,500\ + \ to 3,500 hours on the existing airframes." +introduced: 1981 +manufacturer: Mikoyan +origin: USSR/Russia +price: 24 +role: Interceptor +variants: + MiG-31 Foxhound: {} diff --git a/resources/units/aircraft/Mirage 2000-5.yaml b/resources/units/aircraft/Mirage 2000-5.yaml new file mode 100644 index 00000000..2d18c338 --- /dev/null +++ b/resources/units/aircraft/Mirage 2000-5.yaml @@ -0,0 +1,15 @@ +description: "The Dassault Mirage 2000 is a French multirole, single-engined, fourth-generation\ + \ jet fighter manufactured by Dassault Aviation. It was designed in the late 1970s\ + \ as a lightweight fighter to replace the Mirage III for the French Air Force (Arm\xE9\ + e de l'air). The Mirage 2000 evolved into a multirole aircraft with several variants\ + \ developed, with sales to a number of nations. It was later developed into the\ + \ Mirage 2000N and 2000D strike variants, the improved Mirage 2000-5, and several\ + \ export variants. Over 600 aircraft were built and it has been in service with\ + \ 9 nations." +introduced: 1997 +manufacturer: Dassault +origin: France +price: 18 +role: Multirole Fighter +variants: + Mirage 2000-5: {} diff --git a/resources/units/aircraft/OH-58D.yaml b/resources/units/aircraft/OH-58D.yaml new file mode 100644 index 00000000..d12d25b4 --- /dev/null +++ b/resources/units/aircraft/OH-58D.yaml @@ -0,0 +1,18 @@ +carrier_capable: true +description: The Bell OH-58 Kiowa is a family of single-engine, single-rotor, military + helicopters used for observation, utility, and direct fire support. Bell Helicopter + manufactured the OH-58 for the United States Army based on its Model 206A JetRanger + helicopter. The OH-58 was in continuous U.S. Army service from 1969 to 2017, when + it was replaced in these roles by the Boeing AH-64 Apache and Eurocopter UH-72 Lakota. + The latest model, the OH-58D Kiowa Warrior, is primarily operated in an armed reconnaissance + role in support of ground troops. The OH-58 has been exported to Austria, Canada, + Croatia, the Dominican Republic, Taiwan, Saudi Arabia, and Greece. It has also been + produced under license in Australia. +introduced: 1983 +lha_capable: true +manufacturer: Bell +origin: USA +price: 6 +role: Light Attack/Forward Air Control +variants: + OH-58D Kiowa Warrior: {} diff --git a/resources/units/aircraft/P-47D-30.yaml b/resources/units/aircraft/P-47D-30.yaml new file mode 100644 index 00000000..f1a25fd7 --- /dev/null +++ b/resources/units/aircraft/P-47D-30.yaml @@ -0,0 +1,32 @@ +always_keeps_gun: true +description: + "The P-47 Thunderbolt, nicknamed the Jug, served the United States Army + Air Forces (USAAF) in World War II with distinction. In total 15,636 were built + between 1941 and 1945. France, the United Kingdom, the Soviet Union, Mexico and + Brazil also operated the P-47. It was armed with an impressive eight .50-caliber + machine guns with 425 rounds per gun. In addition the Jug was armed with bombs and + rockets and it excelled in the ground attack role. The P-47 also served in the bomber + escort role before the introduction of the P-51 Mustang which had longer range. + + + Powered by an R-2800-59 Double Wasp turbocharged radial engine, the aircraft enjoyed + exceptional power and durability. The Jug substantial weight gave it tremendous + dive speed acceleration but the aircraft suffered from quite low Mach limits and + hence the aircraft was equipped with dive flaps to avoid dangerous effects of compressibility. + The bubble canopy of the D version of the P-47 provided excellent all round visibility." +introduced: 1944 +manufacturer: Republic +origin: USA +price: 5 +role: Fighter-Bomber +variants: + P-47D-30 Thunderbolt (Late): {} + Thunderbolt Mk.II (Mid): {} +radios: + intra_flight: SCR522 + inter_flight: SCR522 + channels: + type: common + namer: SCR-522 + intra_flight_radio_index: 1 + inter_flight_radio_index: 1 diff --git a/resources/units/aircraft/P-47D-30bl1.yaml b/resources/units/aircraft/P-47D-30bl1.yaml new file mode 100644 index 00000000..d9849538 --- /dev/null +++ b/resources/units/aircraft/P-47D-30bl1.yaml @@ -0,0 +1,32 @@ +always_keeps_gun: true +description: + "The P-47 Thunderbolt, nicknamed the Jug, served the United States Army + Air Forces (USAAF) in World War II with distinction. In total 15,636 were built + between 1941 and 1945. France, the United Kingdom, the Soviet Union, Mexico and + Brazil also operated the P-47. It was armed with an impressive eight .50-caliber + machine guns with 425 rounds per gun. In addition the Jug was armed with bombs and + rockets and it excelled in the ground attack role. The P-47 also served in the bomber + escort role before the introduction of the P-51 Mustang which had longer range. + + + Powered by an R-2800-59 Double Wasp turbocharged radial engine, the aircraft enjoyed + exceptional power and durability. The Jug substantial weight gave it tremendous + dive speed acceleration but the aircraft suffered from quite low Mach limits and + hence the aircraft was equipped with dive flaps to avoid dangerous effects of compressibility. + The bubble canopy of the D version of the P-47 provided excellent all round visibility." +introduced: 1944 +manufacturer: Republic +origin: USA +price: 5 +role: Fighter-Bomber +variants: + P-47D-30 Thunderbolt (Early): {} + Thunderbolt Mk.II (Early): {} +radios: + intra_flight: SCR522 + inter_flight: SCR522 + channels: + type: common + namer: SCR-522 + intra_flight_radio_index: 1 + inter_flight_radio_index: 1 diff --git a/resources/units/aircraft/P-47D-40.yaml b/resources/units/aircraft/P-47D-40.yaml new file mode 100644 index 00000000..323b7ee9 --- /dev/null +++ b/resources/units/aircraft/P-47D-40.yaml @@ -0,0 +1,32 @@ +always_keeps_gun: true +description: + "The P-47 Thunderbolt, nicknamed the Jug, served the United States Army + Air Forces (USAAF) in World War II with distinction. In total 15,636 were built + between 1941 and 1945. France, the United Kingdom, the Soviet Union, Mexico and + Brazil also operated the P-47. It was armed with an impressive eight .50-caliber + machine guns with 425 rounds per gun. In addition the Jug was armed with bombs and + rockets and it excelled in the ground attack role. The P-47 also served in the bomber + escort role before the introduction of the P-51 Mustang which had longer range. + + + Powered by an R-2800-59 Double Wasp turbocharged radial engine, the aircraft enjoyed + exceptional power and durability. The Jug substantial weight gave it tremendous + dive speed acceleration but the aircraft suffered from quite low Mach limits and + hence the aircraft was equipped with dive flaps to avoid dangerous effects of compressibility. + The bubble canopy of the D version of the P-47 provided excellent all round visibility." +introduced: 1944 +manufacturer: Republic +origin: USA +price: 6 +role: Fighter-Bomber +variants: + P-47D-40 Thunderbolt: {} + Thunderbolt Mk.II (Late): {} +radios: + intra_flight: SCR522 + inter_flight: SCR522 + channels: + type: common + namer: SCR-522 + intra_flight_radio_index: 1 + inter_flight_radio_index: 1 diff --git a/resources/units/aircraft/P-51D-30-NA.yaml b/resources/units/aircraft/P-51D-30-NA.yaml new file mode 100644 index 00000000..62921aa3 --- /dev/null +++ b/resources/units/aircraft/P-51D-30-NA.yaml @@ -0,0 +1,33 @@ +always_keeps_gun: true +description: + The North American Aviation P-51 Mustang is an American long-range, single-seat + fighter and fighter-bomber used during World War II and the Korean War, among other + conflicts. From late 1943, P-51Bs and P-51Cs (supplemented by P-51Ds from mid-1944) + were used by the USAAF's Eighth Air Force to escort bombers in raids over Germany, + while the RAF's Second Tactical Air Force and the USAAF's Ninth Air Force used the + Merlin-powered Mustangs as fighter-bombers, roles in which the Mustang helped ensure + Allied air superiority in 1944. The P-51 was also used by Allied air forces in the + North African, Mediterranean, Italian, and Pacific theaters. During World War II, + Mustang pilots claimed to have destroyed 4,950 enemy aircraft. At the start of the + Korean War, the Mustang, by then redesignated F-51, was the main fighter of the + United States until jet fighters, including North American's F-86, took over this + role; the Mustang then became a specialized fighter-bomber. Despite the advent of + jet fighters, the Mustang remained in service with some air forces until the early + 1980s. After the Korean War, Mustangs became popular civilian warbirds and air racing + aircraft. +introduced: 1944 +manufacturer: North American +origin: USA +price: 5 +role: Fighter +variants: + Mustang Mk.IV (Late): {} + P-51D-30-NA Mustang: {} +radios: + intra_flight: SCR522 + inter_flight: SCR522 + channels: + type: common + namer: SCR-522 + intra_flight_radio_index: 1 + inter_flight_radio_index: 1 diff --git a/resources/units/aircraft/P-51D.yaml b/resources/units/aircraft/P-51D.yaml new file mode 100644 index 00000000..2eac353e --- /dev/null +++ b/resources/units/aircraft/P-51D.yaml @@ -0,0 +1,33 @@ +always_keeps_gun: true +description: + The North American Aviation P-51 Mustang is an American long-range, single-seat + fighter and fighter-bomber used during World War II and the Korean War, among other + conflicts. From late 1943, P-51Bs and P-51Cs (supplemented by P-51Ds from mid-1944) + were used by the USAAF's Eighth Air Force to escort bombers in raids over Germany, + while the RAF's Second Tactical Air Force and the USAAF's Ninth Air Force used the + Merlin-powered Mustangs as fighter-bombers, roles in which the Mustang helped ensure + Allied air superiority in 1944. The P-51 was also used by Allied air forces in the + North African, Mediterranean, Italian, and Pacific theaters. During World War II, + Mustang pilots claimed to have destroyed 4,950 enemy aircraft. At the start of the + Korean War, the Mustang, by then redesignated F-51, was the main fighter of the + United States until jet fighters, including North American's F-86, took over this + role; the Mustang then became a specialized fighter-bomber. Despite the advent of + jet fighters, the Mustang remained in service with some air forces until the early + 1980s. After the Korean War, Mustangs became popular civilian warbirds and air racing + aircraft. +introduced: 1944 +manufacturer: North American +origin: USA +price: 4 +role: Fighter +variants: + Mustang Mk.IV (Early): {} + P-51D-25-NA Mustang: {} +radios: + intra_flight: SCR522 + inter_flight: SCR522 + channels: + type: common + namer: SCR-522 + intra_flight_radio_index: 1 + inter_flight_radio_index: 1 diff --git a/resources/units/aircraft/RQ-1A Predator.yaml b/resources/units/aircraft/RQ-1A Predator.yaml new file mode 100644 index 00000000..64476469 --- /dev/null +++ b/resources/units/aircraft/RQ-1A Predator.yaml @@ -0,0 +1,3 @@ +price: 6 +variants: + RQ-1A Predator: null diff --git a/resources/units/aircraft/S-3B Tanker.yaml b/resources/units/aircraft/S-3B Tanker.yaml new file mode 100644 index 00000000..5153b8d0 --- /dev/null +++ b/resources/units/aircraft/S-3B Tanker.yaml @@ -0,0 +1,19 @@ +carrier_capable: true +description: The Lockheed S-3 Viking is a 4-crew, twin-engine turbofan-powered jet + aircraft that was used by the U.S. Navy (USN) primarily for anti-submarine warfare. + In the late 1990s, the S-3B's mission focus shifted to surface warfare and aerial + refueling. The Viking also provided electronic warfare and surface surveillance + capabilities to a carrier battle group. A carrier-based, subsonic, all-weather, + long-range, multi-mission aircraft, it carried automated weapon systems and was + capable of extended missions with in-flight refueling. Because of its characteristic + sound, it was nicknamed the "War Hoover" after the vacuum cleaner brand. The S-3 + was phased out from front-line fleet service aboard aircraft carriers in January + 2009, with its missions taken over by aircraft like the P-3C Orion, P-8 Poseidon, + Sikorsky SH-60 Seahawk and Boeing F/A-18E/F Super Hornet +introduced: 1984 +manufacturer: Lockheed +origin: USA +price: 20 +role: Carrier-based Tanker +variants: + S-3B Tanker: {} diff --git a/resources/units/aircraft/S-3B.yaml b/resources/units/aircraft/S-3B.yaml new file mode 100644 index 00000000..ddcd4f65 --- /dev/null +++ b/resources/units/aircraft/S-3B.yaml @@ -0,0 +1,19 @@ +carrier_capable: true +description: The Lockheed S-3 Viking is a 4-crew, twin-engine turbofan-powered jet + aircraft that was used by the U.S. Navy (USN) primarily for anti-submarine warfare. + In the late 1990s, the S-3B's mission focus shifted to surface warfare and aerial + refueling. The Viking also provided electronic warfare and surface surveillance + capabilities to a carrier battle group. A carrier-based, subsonic, all-weather, + long-range, multi-mission aircraft, it carried automated weapon systems and was + capable of extended missions with in-flight refueling. Because of its characteristic + sound, it was nicknamed the "War Hoover" after the vacuum cleaner brand. The S-3 + was phased out from front-line fleet service aboard aircraft carriers in January + 2009, with its missions taken over by aircraft like the P-3C Orion, P-8 Poseidon, + Sikorsky SH-60 Seahawk and Boeing F/A-18E/F Super Hornet +introduced: 1984 +manufacturer: Lockheed +origin: USA +price: 10 +role: Carrier-based Attack +variants: + S-3B Viking: {} diff --git a/resources/units/aircraft/SA342L.yaml b/resources/units/aircraft/SA342L.yaml new file mode 100644 index 00000000..3f9a3d99 --- /dev/null +++ b/resources/units/aircraft/SA342L.yaml @@ -0,0 +1,17 @@ +carrier_capable: true +description: "The SA342 Gazelle is a light scout/attack and transport helicopter.\ + \ It was introduced in 1968 as a result of cooperation between A\xE9rospatiale and\ + \ Westland Aircraft. Operated by 23 countries, the Gazelle has served in combat\ + \ operations across the world including the 1991 Gulf War, 1982 Lebanon War, Syria,\ + \ and other conflicts.\n\nThe Gazelle is powered by a single turbine engine that\ + \ is connected to three glass-fiber reinforced plastic main rotor blades with a\ + \ bearingless main rotor developed by B\xF6lkow GmbH. It is also the first helicopter\ + \ which features the famous Fenestron tail rotor." +introduced: 1977 +lha_capable: true +manufacturer: "A\xE9rospatiale" +origin: France +price: 5 +role: Light Attack +variants: + SA 342L Gazelle: {} diff --git a/resources/units/aircraft/SA342M.yaml b/resources/units/aircraft/SA342M.yaml new file mode 100644 index 00000000..46166e4a --- /dev/null +++ b/resources/units/aircraft/SA342M.yaml @@ -0,0 +1,20 @@ +carrier_capable: true +description: "The SA342 Gazelle is a light scout/attack and transport helicopter.\ + \ It was introduced in 1968 as a result of cooperation between A\xE9rospatiale and\ + \ Westland Aircraft. Operated by 23 countries, the Gazelle has served in combat\ + \ operations across the world including the 1991 Gulf War, 1982 Lebanon War, Syria,\ + \ and other conflicts.\n\nThe Gazelle is powered by a single turbine engine that\ + \ is connected to three glass-fiber reinforced plastic main rotor blades with a\ + \ bearingless main rotor developed by B\xF6lkow GmbH. It is also the first helicopter\ + \ which features the famous Fenestron tail rotor." +introduced: 1977 +lha_capable: true +manufacturer: "A\xE9rospatiale" +origin: France +price: 8 +role: Light Attack +variants: + Gazelle AH.1: + introduced: 1974 + manufacturer: Westland + SA 342M Gazelle: {} diff --git a/resources/units/aircraft/SA342Minigun.yaml b/resources/units/aircraft/SA342Minigun.yaml new file mode 100644 index 00000000..14d44082 --- /dev/null +++ b/resources/units/aircraft/SA342Minigun.yaml @@ -0,0 +1,3 @@ +price: 4 +variants: + SA342Minigun: null diff --git a/resources/units/aircraft/SA342Mistral.yaml b/resources/units/aircraft/SA342Mistral.yaml new file mode 100644 index 00000000..1fc101ec --- /dev/null +++ b/resources/units/aircraft/SA342Mistral.yaml @@ -0,0 +1,17 @@ +carrier_capable: true +description: "The SA342 Gazelle is a light scout/attack and transport helicopter.\ + \ It was introduced in 1968 as a result of cooperation between A\xE9rospatiale and\ + \ Westland Aircraft. Operated by 23 countries, the Gazelle has served in combat\ + \ operations across the world including the 1991 Gulf War, 1982 Lebanon War, Syria,\ + \ and other conflicts.\n\nThe Gazelle is powered by a single turbine engine that\ + \ is connected to three glass-fiber reinforced plastic main rotor blades with a\ + \ bearingless main rotor developed by B\xF6lkow GmbH. It is also the first helicopter\ + \ which features the famous Fenestron tail rotor." +introduced: 1977 +lha_capable: true +manufacturer: "A\xE9rospatiale" +origin: France +price: 8 +role: Light Attack +variants: + SA 342M Gazelle Mistral: {} diff --git a/resources/units/aircraft/SH-60B.yaml b/resources/units/aircraft/SH-60B.yaml new file mode 100644 index 00000000..cbe61c7d --- /dev/null +++ b/resources/units/aircraft/SH-60B.yaml @@ -0,0 +1,20 @@ +carrier_capable: true +description: The Sikorsky SH-60/MH-60 Seahawk (or Sea Hawk) is a twin turboshaft engine, + multi-mission United States Navy helicopter based on the United States Army UH-60 + Black Hawk and a member of the Sikorsky S-70 family. The most significant modifications + are the folding main rotor and a hinged tail to reduce its footprint aboard ships. + The U.S. Navy uses the H-60 airframe under the model designations SH-60B, SH-60F, + HH-60H, MH-60R, and MH-60S. Able to deploy aboard any air-capable frigate, destroyer, + cruiser, fast combat support ship, amphibious assault ship, Littoral combat ship + or aircraft carrier, the Seahawk can handle anti-submarine warfare (ASW), anti-surface + warfare (ASUW), naval special warfare (NSW) insertion, search and rescue (SAR), + combat search and rescue (CSAR), vertical replenishment (VERTREP), and medical evacuation + (MEDEVAC). +introduced: 1984 +lha_capable: true +manufacturer: Sikorsky +origin: USA +price: 6 +role: Transport/Anti-Ship +variants: + SH-60B Seahawk: {} diff --git a/resources/units/aircraft/SpitfireLFMkIX.yaml b/resources/units/aircraft/SpitfireLFMkIX.yaml new file mode 100644 index 00000000..662a9196 --- /dev/null +++ b/resources/units/aircraft/SpitfireLFMkIX.yaml @@ -0,0 +1,42 @@ +always_keeps_gun: true +description: 'The British Spitfire is one of the most iconic fighter aircraft of World + War II. Most famous for its role in the Battle of Britain, the Spitfire served as + Britain''s primary fighter during the entirety of the war. The Spitfire combines + graceful lines, eye-watering dogfight performance, and heavy firepower in its later + variants. + + + The Spitfire Mk IX was originally developed as a stopgap measure as a response to + the appearance of the Focke-Wulf FW 190A. + + + The Spitfire IX is powered by the Merlin 66. This engine produces its best performance + at slightly lower altitudes than the older Merlin 61. Spitfires equipped with this + engine were designated LF Mk IX. This was the most numerous version of the Mk IX, + with 4,010 produced. The majority of Mk IXs of all types used the standard "c" wing, + which would often carry two 20mm cannon and four .303in machine guns. + + + The Mk IX was a significant improvement on the Mk V. It had a top speed of 409 mph + at 28,000 feet, an increase of 40 miles per hour. Its service ceiling rose from + 36,200 feet to 43,000 feet. It could climb at 4,000 feet per minute. In July 1942, + an early Mk IX was flown against a captured Fw 190A, and the two aircraft were discovered + to have very similar capabilities. The RAF had its answer to the Fw 190 problem. + + + The Mk IX replaced the Mk V from June 1942. It allowed the RAF to go back onto the + offensive in occupied Europe, and resume the "circus", "ramrod" and "rodeo" raids. + Its first combat success came on 30 July 1942, when a Spitfire Mk IX shot down a + Fw 190. Amongst other notable achievements, the Mk IX took part in the highest altitude + combat of the Second World War, when it intercepted a Ju 86R at 43,000 feet over + Southampton on 12 September 1942. On 5 October 1944 Spitfire Mk IXs of 401 Squadron + were the first allied aircraft to shoot down an Me 262 Jet. The Mk IX remained in + service until the end of the war, even after the appearance of the Griffon powered + Mk XIV.' +introduced: 1943 +manufacturer: Supermarine +origin: UK +price: 3 +role: Fighter +variants: + Spitfire LF Mk IX: {} diff --git a/resources/units/aircraft/SpitfireLFMkIXCW.yaml b/resources/units/aircraft/SpitfireLFMkIXCW.yaml new file mode 100644 index 00000000..a47b7e22 --- /dev/null +++ b/resources/units/aircraft/SpitfireLFMkIXCW.yaml @@ -0,0 +1,42 @@ +always_keeps_gun: true +description: 'The British Spitfire is one of the most iconic fighter aircraft of World + War II. Most famous for its role in the Battle of Britain, the Spitfire served as + Britain''s primary fighter during the entirety of the war. The Spitfire combines + graceful lines, eye-watering dogfight performance, and heavy firepower in its later + variants. + + + The Spitfire Mk IX was originally developed as a stopgap measure as a response to + the appearance of the Focke-Wulf FW 190A. + + + The Spitfire IX is powered by the Merlin 66. This engine produces its best performance + at slightly lower altitudes than the older Merlin 61. Spitfires equipped with this + engine were designated LF Mk IX. This was the most numerous version of the Mk IX, + with 4,010 produced. The majority of Mk IXs of all types used the standard "c" wing, + which would often carry two 20mm cannon and four .303in machine guns. + + + The Mk IX was a significant improvement on the Mk V. It had a top speed of 409 mph + at 28,000 feet, an increase of 40 miles per hour. Its service ceiling rose from + 36,200 feet to 43,000 feet. It could climb at 4,000 feet per minute. In July 1942, + an early Mk IX was flown against a captured Fw 190A, and the two aircraft were discovered + to have very similar capabilities. The RAF had its answer to the Fw 190 problem. + + + The Mk IX replaced the Mk V from June 1942. It allowed the RAF to go back onto the + offensive in occupied Europe, and resume the "circus", "ramrod" and "rodeo" raids. + Its first combat success came on 30 July 1942, when a Spitfire Mk IX shot down a + Fw 190. Amongst other notable achievements, the Mk IX took part in the highest altitude + combat of the Second World War, when it intercepted a Ju 86R at 43,000 feet over + Southampton on 12 September 1942. On 5 October 1944 Spitfire Mk IXs of 401 Squadron + were the first allied aircraft to shoot down an Me 262 Jet. The Mk IX remained in + service until the end of the war, even after the appearance of the Griffon powered + Mk XIV.' +introduced: 1943 +manufacturer: Supermarine +origin: UK +price: 3 +role: Fighter +variants: + Spitfire LF Mk IX (Clipped Wings): {} diff --git a/resources/units/aircraft/Su-17M4.yaml b/resources/units/aircraft/Su-17M4.yaml new file mode 100644 index 00000000..f88547fb --- /dev/null +++ b/resources/units/aircraft/Su-17M4.yaml @@ -0,0 +1,17 @@ +description: The Sukhoi Su-17 (izdeliye S-32) is a variable-sweep wing fighter-bomber + developed for the Soviet military. Its NATO reporting name is "Fitter". Developed + from the Sukhoi Su-7, the Su-17 was the first variable-sweep wing aircraft to enter + Soviet service. Two subsequent Sukhoi aircraft, the Su-20 and Su-22, have usually + been regarded as variants of the Su-17. The Su-17 has had a long career and has + been operated by many other air forces of including the Russian Federation, other + former Soviet republics, the former Warsaw Pact, countries in the Arab world, Angola + and Peru. +introduced: 1981 +manufacturer: Sukhoi +origin: USSR/Russia +price: 10 +role: Fighter-Bomber +variants: + Su-17M4 Fitter-K: {} + Su-22M4 Fitter-K: + introduced: 1983 diff --git a/resources/units/aircraft/Su-24M.yaml b/resources/units/aircraft/Su-24M.yaml new file mode 100644 index 00000000..c165e0e6 --- /dev/null +++ b/resources/units/aircraft/Su-24M.yaml @@ -0,0 +1,16 @@ +description: 'The Sukhoi Su-24 (NATO reporting name: Fencer) is a supersonic, all-weather + attack aircraft developed in the Soviet Union. The aircraft has a variable-sweep + wing, twin-engines and a side-by-side seating arrangement for its crew of two. It + was the first of the USSR''s aircraft to carry an integrated digital navigation/attack + system. It remains in service with the Russian Air Force, Syrian Air Force, Ukrainian + Air Force, Azerbaijan Air Force , Iraqi Air Force and various air forces to which + it was exported.' +introduced: 1983 +manufacturer: Sukhoi +origin: USSR/Russia +price: 14 +role: Attack +variants: + Su-24M Fencer-D: {} + Su-24MK Fencer-D: + introduced: 1988 diff --git a/resources/units/aircraft/Su-24MR.yaml b/resources/units/aircraft/Su-24MR.yaml new file mode 100644 index 00000000..9117c278 --- /dev/null +++ b/resources/units/aircraft/Su-24MR.yaml @@ -0,0 +1,3 @@ +price: 15 +variants: + Su-24MR: null diff --git a/resources/units/aircraft/Su-25.yaml b/resources/units/aircraft/Su-25.yaml new file mode 100644 index 00000000..7287262f --- /dev/null +++ b/resources/units/aircraft/Su-25.yaml @@ -0,0 +1,14 @@ +always_keeps_gun: true +description: The Su-25 'Grach' (Rook), NATO callsigned 'Frogfoot', is a dedicated + strike attack aircraft designed for the close air support and anti-tank roles. The + Su-25 has seen combat in several conflicts during its more than 30 years in service. + The Su-25 combines excellent pilot protection and high speed compared to most dedicated + attack aircraft. It can be armed with a variety of weapon systems including guided + missiles, bombs, rockets, and its internal 30mm cannon. +introduced: 1981 +manufacturer: Sukhoi +origin: USSR/Russia +price: 11 +role: Close Air Support/Attack +variants: + Su-25 Frogfoot: {} diff --git a/resources/units/aircraft/Su-25T.yaml b/resources/units/aircraft/Su-25T.yaml new file mode 100644 index 00000000..b4523739 --- /dev/null +++ b/resources/units/aircraft/Su-25T.yaml @@ -0,0 +1,14 @@ +always_keeps_gun: true +description: The Su-25 'Grach' (Rook), NATO callsigned 'Frogfoot', is a dedicated + strike attack aircraft designed for the close air support and anti-tank roles. The + Su-25 has seen combat in several conflicts during its more than 30 years in service. + The Su-25 combines excellent pilot protection and high speed compared to most dedicated + attack aircraft. It can be armed with a variety of weapon systems including guided + missiles, bombs, rockets, and its internal 30mm cannon. +introduced: 1990 +manufacturer: Sukhoi +origin: USSR/Russia +price: 18 +role: Close Air Support/Attack +variants: + Su-25T Frogfoot: {} diff --git a/resources/units/aircraft/Su-27.yaml b/resources/units/aircraft/Su-27.yaml new file mode 100644 index 00000000..cadef3cc --- /dev/null +++ b/resources/units/aircraft/Su-27.yaml @@ -0,0 +1,17 @@ +description: The Su-27, NATO codename Flanker, is one of the pillars of modern-day + Russian combat aviation. Built to counter the American F-15 Eagle, the Flanker is + a twin-engine, supersonic, highly manoeuvrable air superiority fighter. The Flanker + is equally capable of engaging targets well beyond visual range as it is in a dogfight + given its amazing slow speed and high angle attack manoeuvrability. Using its radar + and stealthy infrared search and track system, the Flanker can employ a wide array + of radar and infrared guided missiles. The Flanker also includes a helmet-mounted + sight that allows you to simply look at a target to lock it up! In addition to its + powerful air-to-air capabilities, the Flanker can also be armed with bombs and unguided + rockets to fulfil a secondary ground attack role. +introduced: 1985 +manufacturer: Sukhoi +origin: USSR/Russia +price: 18 +role: Air-Superiority Fighter +variants: + Su-27 Flanker-B: {} diff --git a/resources/units/aircraft/Su-30.yaml b/resources/units/aircraft/Su-30.yaml new file mode 100644 index 00000000..ad93e33a --- /dev/null +++ b/resources/units/aircraft/Su-30.yaml @@ -0,0 +1,17 @@ +description: "The Sukhoi Su-30 (Russian: \u0421\u0443\u0445\u043E\u0439 \u0421\u0443\ + -30; NATO reporting name: Flanker-C/G/H) is a twin-engine, two-seat supermaneuverable\ + \ fighter aircraft developed in the Soviet Union by Russia's Sukhoi Aviation Corporation.\ + \ It is a multirole fighter for all-weather, air-to-air and air-to-surface deep\ + \ interdiction missions. 630 numbers have been build." +introduced: 1996 +manufacturer: Sukhoi +origin: USSR/Russia +price: 23 +role: Multirole Fighter +variants: + Su-30 Flanker-C: {} + Su-30MKK Flanker-G: + introduced: 2000 + manufacturer: Sukhoi + origin: USSR/Russia + role: Multirole Fighter diff --git a/resources/units/aircraft/Su-33.yaml b/resources/units/aircraft/Su-33.yaml new file mode 100644 index 00000000..63a5f29f --- /dev/null +++ b/resources/units/aircraft/Su-33.yaml @@ -0,0 +1,29 @@ +carrier_capable: true +description: 'The Su-33 has been the backbone of Russian aircraft carrier aviation + since the late 1990s and is an all-weather fighter capable of engaging both air + and surface targets. Based on the powerful Su-27 "Flanker", the Su-33 is a navalized + version suited for operations aboard the Admiral Kuznetsov aircraft carrier. Changes + to the Su-33 include strengthened landing gear, folding wings, more powerful engines, + and the very visible canards. + + + The Su-33 is equipped with a powerful pulse doppler radar and an Infrared Search + and Track (IRST) for engaging aerial targets with a wide range of radar- and infrared-guided + missiles and its internal cannon. For air-to-surface attack, the Su-33 can be armed + with many types of unguided bombs, rockets, and cluster munitions. + + + Despite its large size, the Su-33 is very capable in a dogfight when combined with + its integral helmet-mounted sight and off-boresight missiles.' +introduced: 1998 +manufacturer: Sukhoi +origin: USSR/Russia +price: 22 +role: Carrier-based Multirole Fighter +variants: + J-15 Flanker X-2: + introduced: 2013 + manufacturer: Shenyang + origin: China + role: Carrier-based Multirole Fighter + Su-33 Flanker-D: {} diff --git a/resources/units/aircraft/Su-34.yaml b/resources/units/aircraft/Su-34.yaml new file mode 100644 index 00000000..37d5a4e1 --- /dev/null +++ b/resources/units/aircraft/Su-34.yaml @@ -0,0 +1,20 @@ +description: "The Sukhoi Su-34 (Russian: \u0421\u0443\u0445\u043E\u0439 \u0421\u0443\ + -34; NATO reporting name: Fullback) is a Soviet-origin Russian twin-engine, twin-seat,\ + \ all-weather supersonic medium-range fighter-bomber/strike aircraft. It first flew\ + \ in 1990, intended for the Soviet Air Forces, and it entered service in 2014 with\ + \ the Russian Air Force. Based on the Sukhoi Su-27 Flanker air superiority fighter,\ + \ the Su-34 has an armored cockpit for side-by-side seating of its two-person crew.\ + \ The Su-34 is designed primarily for tactical deployment against ground and naval\ + \ targets (tactical bombing/attack/interdiction roles, including against small and\ + \ mobile targets) on solo and group missions in daytime and at night, under favourable\ + \ and adverse weather conditions and in a hostile environment with counter-fire\ + \ and electronic Warfare (EW) counter-measures deployed, as well as for aerial reconnaissance.\ + \ The Su-34 will eventually replace the Su-24 tactical strike fighter and the Tu-22M3\ + \ long-distance bomber." +introduced: 2014 +manufacturer: Sukhoi +origin: USSR/Russia +price: 26 +role: Fighter-Bomber/Strike Fighter +variants: + Su-34 Fullback: {} diff --git a/resources/units/aircraft/Su-57.yaml b/resources/units/aircraft/Su-57.yaml new file mode 100644 index 00000000..039a33f5 --- /dev/null +++ b/resources/units/aircraft/Su-57.yaml @@ -0,0 +1,14 @@ +description: "The Sukhoi Su-57 (Russian: \u0421\u0443\u0445\u043E\u0439 \u0421\u0443\ + -57; NATO reporting name: Felon) is a single-seat, twin-engine stealth multirole\ + \ fighter developed by Sukhoi for the Russian Aerospace Forces. According to Sukhoi,\ + \ the multirole fighter is designed to have supercruise, supermaneuverability, stealth,\ + \ and integrated avionics to overcome the previous generations fighter aircraft\ + \ as well as ground and naval defences. The Su-57 is intended to succeed the MiG-29\ + \ and Su-27 in the Russian Air Force and entered service in December 2020." +introduced: 2020 +manufacturer: Sukhoi +origin: Russia +price: 40 +role: Stealth Air-Superiority Fighter +variants: + Su-57 Felon: {} diff --git a/resources/units/aircraft/Tornado GR4.yaml b/resources/units/aircraft/Tornado GR4.yaml new file mode 100644 index 00000000..5ddd0d0a --- /dev/null +++ b/resources/units/aircraft/Tornado GR4.yaml @@ -0,0 +1,13 @@ +description: 'The Panavia Tornado is a family of twin-engine, variable-sweep wing + multirole combat aircraft, jointly developed and manufactured by Italy, the United + Kingdom and West Germany. There are three primary Tornado variants: the Tornado + IDS (interdictor/strike) fighter-bomber, the suppression of enemy air defences Tornado + ECR (electronic combat/reconnaissance) and the Tornado ADV (air defence variant) + interceptor aircraft.' +introduced: 1996 +manufacturer: Panavia +origin: UK/Italy/West Germany +price: 17 +role: Strike Fighter +variants: + Tornado GR4: {} diff --git a/resources/units/aircraft/Tornado IDS.yaml b/resources/units/aircraft/Tornado IDS.yaml new file mode 100644 index 00000000..17318c88 --- /dev/null +++ b/resources/units/aircraft/Tornado IDS.yaml @@ -0,0 +1,13 @@ +description: 'The Panavia Tornado is a family of twin-engine, variable-sweep wing + multirole combat aircraft, jointly developed and manufactured by Italy, the United + Kingdom and West Germany. There are three primary Tornado variants: the Tornado + IDS (interdictor/strike) fighter-bomber, the suppression of enemy air defences Tornado + ECR (electronic combat/reconnaissance) and the Tornado ADV (air defence variant) + interceptor aircraft.' +introduced: 1979 +manufacturer: Panavia +origin: UK/Italy/West Germany +price: 17 +role: Strike Fighter +variants: + Tornado IDS: {} diff --git a/resources/units/aircraft/Tu-142.yaml b/resources/units/aircraft/Tu-142.yaml new file mode 100644 index 00000000..100f1686 --- /dev/null +++ b/resources/units/aircraft/Tu-142.yaml @@ -0,0 +1,16 @@ +description: "The Tupolev Tu-142 (Russian: \u0422\u0443\u043F\u043E\u043B\u0435\u0432\ + \ \u0422\u0443-142; NATO reporting name: Bear F/J) is a Soviet/Russian maritime\ + \ reconnaissance and anti-submarine warfare (ASW) aircraft derived from the Tu-95\ + \ turboprop strategic bomber. A specialised communications variant designated Tu-142MR\ + \ was tasked with long-range communications duties with Soviet ballistic missile\ + \ submarines. The Tu-142 was designed by the Tupolev design bureau, and manufactured\ + \ by the Kuibyshev Aviation and Taganrog Machinery Plants from 1968 to 1994. Formerly\ + \ operated by the Soviet Navy and Ukrainian Air Force, the Tu-142 currently serves\ + \ with the Russian Navy." +introduced: 1972 +manufacturer: Tupolev +origin: USSR/Russia +price: 35 +role: Maritime Patrol/Anti-Ship +variants: + Tu-142 Bear-F: {} diff --git a/resources/units/aircraft/Tu-160.yaml b/resources/units/aircraft/Tu-160.yaml new file mode 100644 index 00000000..fb5b877a --- /dev/null +++ b/resources/units/aircraft/Tu-160.yaml @@ -0,0 +1,16 @@ +description: "The Tupolev Tu-160 (Russian: \u0422\u0443\u043F\u043E\u043B\u0435\u0432\ + \ \u0422\u0443-160 \u0411\u0435\u043B\u044B\u0439 \u043B\u0435\u0431\u0435\u0434\ + \u044C, romanized: Belyj Lebe\u010F, lit.\u2009'White Swan'; NATO reporting name:\ + \ Blackjack) is a supersonic, variable-sweep wing heavy strategic bomber designed\ + \ by the Tupolev Design Bureau in the Soviet Union in the 1970s. It is the largest\ + \ and heaviest Mach 2+ supersonic military aircraft ever built and next to the experimental\ + \ XB-70 Valkyrie in overall length. As of 2021, it is the largest and heaviest combat\ + \ aircraft, the fastest bomber in use and the largest and heaviest variable-sweep\ + \ wing airplane ever flown." +introduced: 1987 +manufacturer: Tupolev +origin: USSR/Russia +price: 45 +role: Supersonic Strategic Bomber +variants: + Tu-160 Blackjack: {} diff --git a/resources/units/aircraft/Tu-22M3.yaml b/resources/units/aircraft/Tu-22M3.yaml new file mode 100644 index 00000000..5d31110d --- /dev/null +++ b/resources/units/aircraft/Tu-22M3.yaml @@ -0,0 +1,16 @@ +description: "The Tupolev Tu-22M (Russian: \u0422\u0443\u043F\u043E\u043B\u0435\u0432\ + \ \u0422\u0443-22\u041C; NATO reporting name: Backfire) is a supersonic, variable-sweep\ + \ wing, long-range strategic and maritime strike bomber developed by the Tupolev\ + \ Design Bureau in the 1960s. According to some sources, the bomber was believed\ + \ to be designated Tu-26 at one time. During the Cold War, the Tu-22M was operated\ + \ by the Soviet Air Forces (VVS) in a missile carrier strategic bombing role, and\ + \ by the Soviet Naval Aviation (Aviacija Vojenno-Morskogo Flota, AVMF) in a long-range\ + \ maritime anti-shipping role. Significant numbers remain in service with the Russian\ + \ Air Force, and as of 2014 more than 100 Tu-22Ms are in use." +introduced: 1983 +manufacturer: Tupolev +origin: USSR/Russia +price: 40 +role: Strategic/Maritime Strike Bomber +variants: + Tu-22M3 Backfire-C: {} diff --git a/resources/units/aircraft/Tu-95MS.yaml b/resources/units/aircraft/Tu-95MS.yaml new file mode 100644 index 00000000..74c076c7 --- /dev/null +++ b/resources/units/aircraft/Tu-95MS.yaml @@ -0,0 +1,17 @@ +description: "The Tupolev Tu-95 (Russian: \u0422\u0443\u043F\u043E\u043B\u0435\u0432\ + \ \u0422\u0443-95; NATO reporting name: \"Bear\") is a large, four-engine turboprop-powered\ + \ strategic bomber and missile platform. First flown in 1952, the Tu-95 entered\ + \ service with the Long-Range Aviation of the Soviet Air Forces in 1956 and is expected\ + \ to serve the Russian Aerospace Forces until at least 2040. A development of the\ + \ bomber for maritime patrol is designated Tu-142, while a passenger airliner derivative\ + \ was called Tu-114. The aircraft has four Kuznetsov NK-12 engines with contra-rotating\ + \ propellers. It is the only propeller-powered strategic bomber still in operational\ + \ use today. The Tu-95 is one of the loudest military aircraft, particularly because\ + \ the tips of the propeller blades move faster than the speed of sound" +introduced: 1981 +manufacturer: Tupolev +origin: USSR/Russia +price: 35 +role: Strategic Bomber +variants: + Tu-95MS Bear-H: {} diff --git a/resources/units/aircraft/UH-1H.yaml b/resources/units/aircraft/UH-1H.yaml new file mode 100644 index 00000000..8adf5933 --- /dev/null +++ b/resources/units/aircraft/UH-1H.yaml @@ -0,0 +1,25 @@ +carrier_capable: true +description: + The UH-1 Iroquois, better known as the Huey, is one of the most iconic + helicopters in the world. Indispensable in the Vietnam War, the Huey continues to + serve in both military and civilian roles around the globe today. +introduced: 1967 +lha_capable: true +manufacturer: Bell +origin: USA +price: 4 +role: Transport/Light Attack +variants: + UH-1D Iroquois: {} + UH-1H Iroquois: {} +radios: + # Ideally this would use the AN/ARC-131 because that radio is supposed + # to be used for flight comms, but DCS won't allow it as the flight's + # frequency, nor will it allow the AN/ARC-134. + intra_flight: AN/ARC-51BX + inter_flight: AN/ARC-51BX + channels: + type: common + namer: huey + intra_flight_radio_index: 1 + inter_flight_radio_index: 1 diff --git a/resources/units/aircraft/UH-60A.yaml b/resources/units/aircraft/UH-60A.yaml new file mode 100644 index 00000000..b99814f2 --- /dev/null +++ b/resources/units/aircraft/UH-60A.yaml @@ -0,0 +1,3 @@ +price: 4 +variants: + UH-60A: null diff --git a/resources/units/aircraft/WingLoong-I.yaml b/resources/units/aircraft/WingLoong-I.yaml new file mode 100644 index 00000000..7e7e023e --- /dev/null +++ b/resources/units/aircraft/WingLoong-I.yaml @@ -0,0 +1,3 @@ +price: 8 +variants: + WingLoong-I: null diff --git a/resources/units/aircraft/Yak-40.yaml b/resources/units/aircraft/Yak-40.yaml new file mode 100644 index 00000000..d56a2b65 --- /dev/null +++ b/resources/units/aircraft/Yak-40.yaml @@ -0,0 +1,3 @@ +price: 25 +variants: + Yak-40: null diff --git a/resources/units/ground_units/1L13 EWR.yaml b/resources/units/ground_units/1L13 EWR.yaml new file mode 100644 index 00000000..2223c0a6 --- /dev/null +++ b/resources/units/ground_units/1L13 EWR.yaml @@ -0,0 +1,3 @@ +price: 30 +variants: + EWR 1L13: null diff --git a/resources/units/ground_units/2B11 mortar.yaml b/resources/units/ground_units/2B11 mortar.yaml new file mode 100644 index 00000000..837fda51 --- /dev/null +++ b/resources/units/ground_units/2B11 mortar.yaml @@ -0,0 +1,5 @@ +class: Infantry +price: 0 +spawn_weight: 1 +variants: + Mortar 2B11 120mm: null diff --git a/resources/units/ground_units/2S6 Tunguska.yaml b/resources/units/ground_units/2S6 Tunguska.yaml new file mode 100644 index 00000000..5d9bee0b --- /dev/null +++ b/resources/units/ground_units/2S6 Tunguska.yaml @@ -0,0 +1,14 @@ +class: SHORADS +description: "The 2K22 Tunguska (Russian: 2\u041A22 '\u0422\u0443\u043D\u0433\u0443\ + \u0441\u043A\u0430') is a Russian tracked self-propelled anti-aircraft weapon armed\ + \ with a surface-to-air gun and missile system. It is designed to provide day and\ + \ night protection for infantry and tank regiments against low-flying aircraft,\ + \ helicopters, and cruise missiles in all weather conditions. The NATO reporting\ + \ name for the missile used by the weapon system is SA-19 \"Grison\"." +introduced: 1982 +manufacturer: Ulyanovsk +origin: USSR/Russia +price: 30 +role: Self-Propelled Anti-Aircraft System +variants: + SA-19 Grison (2K22 Tunguska): {} diff --git a/resources/units/ground_units/55G6 EWR.yaml b/resources/units/ground_units/55G6 EWR.yaml new file mode 100644 index 00000000..26fd3244 --- /dev/null +++ b/resources/units/ground_units/55G6 EWR.yaml @@ -0,0 +1,3 @@ +price: 30 +variants: + EWR 55G6: null diff --git a/resources/units/ground_units/5p73 s-125 ln.yaml b/resources/units/ground_units/5p73 s-125 ln.yaml new file mode 100644 index 00000000..ed544423 --- /dev/null +++ b/resources/units/ground_units/5p73 s-125 ln.yaml @@ -0,0 +1,3 @@ +price: 6 +variants: + SAM SA-3 S-125 "Goa" LN: null diff --git a/resources/units/ground_units/AA20.yaml b/resources/units/ground_units/AA20.yaml new file mode 100644 index 00000000..01ab88a9 --- /dev/null +++ b/resources/units/ground_units/AA20.yaml @@ -0,0 +1,3 @@ +price: 4 +variants: + 53T2: null diff --git a/resources/units/ground_units/AAV7.yaml b/resources/units/ground_units/AAV7.yaml new file mode 100644 index 00000000..58a28c32 --- /dev/null +++ b/resources/units/ground_units/AAV7.yaml @@ -0,0 +1,18 @@ +class: APC +description: "The Assault Amphibious Vehicle (AAV)\u2014official designation AAVP-7A1\ + \ (formerly known as Landing Vehicle, Tracked, Personnel-7 abbr. LVTP-7)\u2014is\ + \ a fully tracked amphibious landing vehicle manufactured by U.S. Combat Systems\ + \ (previously by United Defense, a former division of FMC Corporation). The AAV-P7/A1\ + \ is the current amphibious troop transport of the United States Marine Corps. It\ + \ is used by U.S. Marine Corps Assault Amphibian Battalions to land the surface\ + \ assault elements of the landing force and their equipment in a single lift from\ + \ assault shipping during amphibious operations to inland objectives and to conduct\ + \ mechanized operations and related combat support in subsequent mechanized operations\ + \ ashore. It is also operated by other forces." +introduced: 1971 +manufacturer: United Defense +origin: USA +price: 10 +role: Amphibious Armoured Personnel Carrier +variants: + AAVP-7A1 'Amtrac': {} diff --git a/resources/units/ground_units/AMX-30B2.yaml b/resources/units/ground_units/AMX-30B2.yaml new file mode 100644 index 00000000..df67a60c --- /dev/null +++ b/resources/units/ground_units/AMX-30B2.yaml @@ -0,0 +1,11 @@ +class: Tank +description: 'The AMX-30 is a main battle tank designed by Ateliers de construction + d''Issy-les-Moulineaux (AMX, then GIAT) and first delivered to the French Army in + August 1965. ' +introduced: 1965 +manufacturer: GIAT Industries +origin: France +price: 18 +role: Main Battle Tank +variants: + AMX.30B2: {} diff --git a/resources/units/ground_units/AMX10RCR.yaml b/resources/units/ground_units/AMX10RCR.yaml new file mode 100644 index 00000000..536dca0f --- /dev/null +++ b/resources/units/ground_units/AMX10RCR.yaml @@ -0,0 +1,11 @@ +class: Recon +description: The AMX-10 RC is a reconnaissance vehicle built by GIAT. Over 240 are + in service in the French Army. In addition, 108 vehicles were sold to Morocco and + 12 to Qatar. RC stands for Roues-Canon, or wheeled gun. +introduced: 1970 +manufacturer: GIAT Industries +origin: France +price: 10 +role: Recon Vehicle +variants: + "Leclerc S\xE9ries 2": {} diff --git a/resources/units/ground_units/BMD-1.yaml b/resources/units/ground_units/BMD-1.yaml new file mode 100644 index 00000000..d81e4360 --- /dev/null +++ b/resources/units/ground_units/BMD-1.yaml @@ -0,0 +1,15 @@ +class: IFV +description: "The BMD-1 is a Soviet airborne amphibious tracked infantry fighting\ + \ vehicle, which was introduced in 1969 and first seen by the West in 1970. BMD\ + \ stands for Boyevaya Mashina Desanta (\u0411\u043E\u0435\u0432\u0430\u044F \u041C\ + \u0430\u0448\u0438\u043D\u0430 \u0414\u0435\u0441\u0430\u043D\u0442\u0430, which\ + \ literally translates to \"Combat Vehicle of the Airborne\"). It can be dropped\ + \ by parachute and although it resembles the BMP-1 it is in fact much smaller. The\ + \ BMD-1 was used as an IFV by the Soviet Army's airborne divisions." +introduced: 1969 +manufacturer: Volgograd +origin: USSR/Russia +price: 8 +role: Airborne Amphibious Infantry Fighting Vehicle +variants: + BMD-1: {} diff --git a/resources/units/ground_units/BMP-1.yaml b/resources/units/ground_units/BMP-1.yaml new file mode 100644 index 00000000..298bae44 --- /dev/null +++ b/resources/units/ground_units/BMP-1.yaml @@ -0,0 +1,15 @@ +class: IFV +description: "The BMD-1 is a Soviet airborne amphibious tracked infantry fighting\ + \ vehicle, which was introduced in 1969 and first seen by the West in 1970. BMD\ + \ stands for Boyevaya Mashina Desanta (\u0411\u043E\u0435\u0432\u0430\u044F \u041C\ + \u0430\u0448\u0438\u043D\u0430 \u0414\u0435\u0441\u0430\u043D\u0442\u0430, which\ + \ literally translates to \"Combat Vehicle of the Airborne\"). It can be dropped\ + \ by parachute and although it resembles the BMP-1 it is in fact much smaller. The\ + \ BMD-1 was used as an IFV by the Soviet Army's airborne divisions. " +introduced: 1966 +manufacturer: Kurganmashzavod +origin: USSR/Russia +price: 14 +role: Amphibious Infantry Fighting Vehicle +variants: + BMP-1: {} diff --git a/resources/units/ground_units/BMP-2.yaml b/resources/units/ground_units/BMP-2.yaml new file mode 100644 index 00000000..38aaa309 --- /dev/null +++ b/resources/units/ground_units/BMP-2.yaml @@ -0,0 +1,13 @@ +class: IFV +description: "The BMP-2 (Boyevaya Mashina Pekhoty, Russian: \u0411\u043E\u0435\u0432\ + \u0430\u044F \u041C\u0430\u0448\u0438\u043D\u0430 \u041F\u0435\u0445\u043E\u0442\ + \u044B, literally \"infantry combat vehicle\") is a second-generation, amphibious\ + \ infantry fighting vehicle introduced in the 1980s in the Soviet Union, following\ + \ on from the BMP-1 of the 1960s." +introduced: 1980 +manufacturer: Kurganmashzavod +origin: USSR/Russia +price: 16 +role: Amphibious Infantry Fighting Vehicle +variants: + BMP-2: {} diff --git a/resources/units/ground_units/BMP-3.yaml b/resources/units/ground_units/BMP-3.yaml new file mode 100644 index 00000000..0be071d9 --- /dev/null +++ b/resources/units/ground_units/BMP-3.yaml @@ -0,0 +1,12 @@ +class: IFV +description: "The BMP-3 is a Soviet and Russian infantry fighting vehicle, successor\ + \ to the BMP-1 and BMP-2. The abbreviation BMP stands for boevaya mashina pehoty\ + \ (\u0431\u043E\u0435\u0432\u0430\u044F \u043C\u0430\u0448\u0438\u043D\u0430 \u043F\ + \u0435\u0445\u043E\u0442\u044B, literally \"infantry combat vehicle\")." +introduced: 1987 +manufacturer: Kurganmashzavod +origin: USSR/Russia +price: 18 +role: Amphibious Infantry Fighting Vehicle +variants: + BMP-3: {} diff --git a/resources/units/ground_units/BRDM-2.yaml b/resources/units/ground_units/BRDM-2.yaml new file mode 100644 index 00000000..227b799a --- /dev/null +++ b/resources/units/ground_units/BRDM-2.yaml @@ -0,0 +1,16 @@ +class: Recon +description: "The PT-76 is a Soviet amphibious light tank that was introduced in the\ + \ early 1950s and soon became the standard reconnaissance tank of the Soviet Army\ + \ and the other Warsaw Pact armed forces. It was widely exported to other friendly\ + \ states, like India, Iraq, Syria, North Korea and North Vietnam. Overall, some\ + \ 25 countries used the PT-76. The tank's full name is Floating Tank\u201376 (\u043F\ + \u043B\u0430\u0432\u0430\u044E\u0449\u0438\u0439 \u0442\u0430\u043D\u043A, plavayushchiy\ + \ tank, or \u041F\u0422-76). 76 stands for the caliber of the main armament: the\ + \ 76.2 mm D-56T series rifled tank gun." +introduced: 1962 +manufacturer: GAZ +origin: USSR/Russia +price: 6 +role: Amphibious Armoured Car +variants: + BRDM-2: {} diff --git a/resources/units/ground_units/BTR-80.yaml b/resources/units/ground_units/BTR-80.yaml new file mode 100644 index 00000000..21b1b149 --- /dev/null +++ b/resources/units/ground_units/BTR-80.yaml @@ -0,0 +1,14 @@ +class: APC +description: "The BTR-80 (Russian: \u0431\u0440\u043E\u043D\u0435\u0442\u0440\u0430\ + \u043D\u0441\u043F\u043E\u0440\u0442\u0451\u0440, romanized: Bronyetransportyor,\ + \ literally \"Armoured Transporter\") is an 8\xD78 wheeled amphibious armoured personnel\ + \ carrier (APC) designed in the USSR. It was adopted in 1985 and replaced the previous\ + \ vehicles, the BTR-60 and BTR-70, in the Soviet Army. It was first deployed during\ + \ the Soviet\u2013Afghan War." +introduced: 1986 +manufacturer: Arzamas +origin: USSR/Russia +price: 8 +role: Amphibious Armoured Personnel Carrier +variants: + BTR-80: {} diff --git a/resources/units/ground_units/BTR-82A.yaml b/resources/units/ground_units/BTR-82A.yaml new file mode 100644 index 00000000..a0a43a71 --- /dev/null +++ b/resources/units/ground_units/BTR-82A.yaml @@ -0,0 +1,14 @@ +class: APC +description: "The BTR-80 (Russian: \u0431\u0440\u043E\u043D\u0435\u0442\u0440\u0430\ + \u043D\u0441\u043F\u043E\u0440\u0442\u0451\u0440, romanized: Bronyetransportyor,\ + \ literally \"Armoured Transporter\") is an 8\xD78 wheeled amphibious armoured personnel\ + \ carrier (APC) designed in the USSR. It was adopted in 1985 and replaced the previous\ + \ vehicles, the BTR-60 and BTR-70, in the Soviet Army. It was first deployed during\ + \ the Soviet\u2013Afghan War. This is a modernized Version of the BTR 80." +introduced: 2013 +manufacturer: Arzamas +origin: Russia +price: 10 +role: Amphibious Armoured Personnel Carrier +variants: + BTR-82A: {} diff --git a/resources/units/ground_units/BTR_D.yaml b/resources/units/ground_units/BTR_D.yaml new file mode 100644 index 00000000..4db1d055 --- /dev/null +++ b/resources/units/ground_units/BTR_D.yaml @@ -0,0 +1,14 @@ +class: APC +description: "The BTR-D is a Soviet airborne multi-purpose tracked armoured personnel\ + \ carrier which was introduced in 1974 and first seen by the West in 1979 during\ + \ the Soviet\u2013Afghan War. BTR-D stands for Bronetransportyor Desanta (\u0411\ + \u0422\u0420-\u0414, \u0411\u0440\u043E\u043D\u0435\u0442\u0440\u0430\u043D\u0441\ + \u043F\u043E\u0440\u0442\u0435\u0440 \u0414\u0435\u0441\u0430\u043D\u0442\u0430\ + , literally \"armoured transporter of the Airborne\")" +introduced: 1974 +manufacturer: Volgograd +origin: USSR/Russia +price: 6 +role: Airborne Amphibious Armoured Personnel Carrier +variants: + BTR-D: {} diff --git a/resources/units/ground_units/Bedford_MWD.yaml b/resources/units/ground_units/Bedford_MWD.yaml new file mode 100644 index 00000000..154e0c2e --- /dev/null +++ b/resources/units/ground_units/Bedford_MWD.yaml @@ -0,0 +1,3 @@ +price: 1 +variants: + Truck Bedford: null diff --git a/resources/units/ground_units/Blitz_36-6700A.yaml b/resources/units/ground_units/Blitz_36-6700A.yaml new file mode 100644 index 00000000..f93b5485 --- /dev/null +++ b/resources/units/ground_units/Blitz_36-6700A.yaml @@ -0,0 +1,3 @@ +price: 1 +variants: + Truck Opel Blitz: null diff --git a/resources/units/ground_units/CCKW_353.yaml b/resources/units/ground_units/CCKW_353.yaml new file mode 100644 index 00000000..25664a9b --- /dev/null +++ b/resources/units/ground_units/CCKW_353.yaml @@ -0,0 +1,3 @@ +price: 1 +variants: + Truck GMC "Jimmy" 6x6 Truck: null diff --git a/resources/units/ground_units/Centaur_IV.yaml b/resources/units/ground_units/Centaur_IV.yaml new file mode 100644 index 00000000..d6edf81c --- /dev/null +++ b/resources/units/ground_units/Centaur_IV.yaml @@ -0,0 +1,13 @@ +class: Tank +description: 'The Cromwell tank, officially Tank, Cruiser, Mk VIII, Cromwell (A27M), + was one of the series of cruiser tanks fielded by Britain in the Second World War. + Named after the English Civil War leader Oliver Cromwell, the Cromwell was the first + tank put into service by the British to combine high speed from a powerful and reliable + engine (the Rolls-Royce Meteor), and reasonable armour. ' +introduced: 1944 +manufacturer: Leyland +origin: UK +price: 10 +role: Cruiser Tank +variants: + A27L Cruiser Tank MK VIII Centaur IV: {} diff --git a/resources/units/ground_units/Challenger2.yaml b/resources/units/ground_units/Challenger2.yaml new file mode 100644 index 00000000..66d87316 --- /dev/null +++ b/resources/units/ground_units/Challenger2.yaml @@ -0,0 +1,14 @@ +class: Tank +description: The FV4034 Challenger 2 is a third generation British main battle tank + (MBT) in service with the armies of the United Kingdom and Oman. It has seen operational + service in Bosnia and Herzegovina, Kosovo and Iraq. To date, the only time the + tank has been destroyed during operations was by another Challenger 2 in a "blue + on blue" (friendly fire) incident at Basra in 2003 when the destroyed tank had its + hatch open at the time of the incident. +introduced: 1998 +manufacturer: Vickers Defence Systems +origin: UK +price: 25 +role: Main Battle Tank +variants: + FV4034 Challenger 2: {} diff --git a/resources/units/ground_units/Chieftain_mk3.yaml b/resources/units/ground_units/Chieftain_mk3.yaml new file mode 100644 index 00000000..a464c6f8 --- /dev/null +++ b/resources/units/ground_units/Chieftain_mk3.yaml @@ -0,0 +1,11 @@ +class: Tank +description: + The FV4201 Chieftain was the main battle tank of the United Kingdom during + the 1960s, 1970s and 1980s. +introduced: 1966 +manufacturer: Leyland Motors +origin: UK +price: 20 +role: Main Battle Tank +variants: + Chieftain Mk.3: {} diff --git a/resources/units/ground_units/Churchill_VII.yaml b/resources/units/ground_units/Churchill_VII.yaml new file mode 100644 index 00000000..1993d45e --- /dev/null +++ b/resources/units/ground_units/Churchill_VII.yaml @@ -0,0 +1,13 @@ +class: Tank +description: The Tank, Infantry, Mk IV (A22) Churchill was a British heavy infantry + tank used in the Second World War, best known for its heavy armour, large longitudinal + chassis with all-around tracks with multiple bogies, its ability to climb steep + slopes, and its use as the basis of many specialist vehicles. It was one of the + heaviest Allied tanks of the war. +introduced: 1944 +manufacturer: Vauxhall Motors +origin: UK +price: 16 +role: Infantry Tank +variants: + A22 Infantry Tank MK IV Churchill VII: {} diff --git a/resources/units/ground_units/Cobra.yaml b/resources/units/ground_units/Cobra.yaml new file mode 100644 index 00000000..88558117 --- /dev/null +++ b/resources/units/ground_units/Cobra.yaml @@ -0,0 +1,10 @@ +class: Recon +description: 'The Cobra (Turkish: Kobra) is an armoured tactical vehicle developed + by Turkish firm Otokar.' +introduced: 1997 +manufacturer: Otokar +origin: Turkey +price: 4 +role: Recon +variants: + Cobra: {} diff --git a/resources/units/ground_units/Cromwell_IV.yaml b/resources/units/ground_units/Cromwell_IV.yaml new file mode 100644 index 00000000..1b680399 --- /dev/null +++ b/resources/units/ground_units/Cromwell_IV.yaml @@ -0,0 +1,13 @@ +class: Tank +description: 'The Cromwell tank, officially Tank, Cruiser, Mk VIII, Cromwell (A27M), + was one of the series of cruiser tanks fielded by Britain in the Second World War. + Named after the English Civil War leader Oliver Cromwell, the Cromwell was the first + tank put into service by the British to combine high speed from a powerful and reliable + engine (the Rolls-Royce Meteor), and reasonable armour. ' +introduced: 1944 +manufacturer: Birmingham Railway Carriage and Wagon Company +origin: UK +price: 12 +role: Cruiser Tank +variants: + A27M Cruiser Tank MK VIII Cromwell IV: {} diff --git a/resources/units/ground_units/Daimler_AC.yaml b/resources/units/ground_units/Daimler_AC.yaml new file mode 100644 index 00000000..6aee8a19 --- /dev/null +++ b/resources/units/ground_units/Daimler_AC.yaml @@ -0,0 +1,14 @@ +class: Recon +description: The Daimler Armoured Car was a successful British armoured car design + of the Second World War that continued in service into the 1950s. It was designed + for armed reconnaissance and liaison purposes. During the postwar era, it doubled + as an internal security vehicle in a number of countries. Former British Daimler + armoured cars were exported to various Commonwealth of Nations member states throughout + the 1950s and 1960s. In 2012, some were still being operated by the Qatari Army. +introduced: 1941 +manufacturer: Daimler +origin: UK +price: 8 +role: Recon +variants: + Daimler Armoured Car Mk I: {} diff --git a/resources/units/ground_units/Dog Ear radar.yaml b/resources/units/ground_units/Dog Ear radar.yaml new file mode 100644 index 00000000..3d476b20 --- /dev/null +++ b/resources/units/ground_units/Dog Ear radar.yaml @@ -0,0 +1,3 @@ +price: 10 +variants: + MCC-SR Sborka "Dog Ear" SR: null diff --git a/resources/units/ground_units/ERC.yaml b/resources/units/ground_units/ERC.yaml new file mode 100644 index 00000000..dda29194 --- /dev/null +++ b/resources/units/ground_units/ERC.yaml @@ -0,0 +1,10 @@ +class: Recon +description: "The Panhard ERC (Engin \xE0 Roues, Canon) is a French six-wheeled armoured\ + \ car which is highly mobile and amphibious with an option of being NBC-proof." +introduced: 1975 +manufacturer: GIAT Industries +origin: France +price: 12 +role: Recon Vehicle +variants: + Panhard: {} diff --git a/resources/units/ground_units/Elefant_SdKfz_184.yaml b/resources/units/ground_units/Elefant_SdKfz_184.yaml new file mode 100644 index 00000000..82febebe --- /dev/null +++ b/resources/units/ground_units/Elefant_SdKfz_184.yaml @@ -0,0 +1,13 @@ +class: ATGM +description: "The Elefant (German for \"elephant\") was a heavy tank destroyer used\ + \ by German Wehrmacht Panzerj\xE4ger during World War II. Ninety-one units were\ + \ built in 1943 under the name Ferdinand, after its designer Ferdinand Porsche,\ + \ using tank hulls produced for the Tiger I tank design abandoned in favour of a\ + \ Henschel design." +introduced: 1944 +manufacturer: Porsche/Nibelungenwerk +origin: Germany +price: 18 +role: Tank Destroyer +variants: + Sd.Kfz.184 Elefant: {} diff --git a/resources/units/ground_units/Fire Can radar.yaml b/resources/units/ground_units/Fire Can radar.yaml new file mode 100644 index 00000000..a452a546 --- /dev/null +++ b/resources/units/ground_units/Fire Can radar.yaml @@ -0,0 +1,3 @@ +price: 8 +variants: + AAA SON-9 Fire Can: null diff --git a/resources/units/ground_units/Flakscheinwerfer_37.yaml b/resources/units/ground_units/Flakscheinwerfer_37.yaml new file mode 100644 index 00000000..3b67868a --- /dev/null +++ b/resources/units/ground_units/Flakscheinwerfer_37.yaml @@ -0,0 +1,3 @@ +price: 4 +variants: + SL Flakscheinwerfer 37: null diff --git a/resources/units/ground_units/FuMG-401.yaml b/resources/units/ground_units/FuMG-401.yaml new file mode 100644 index 00000000..ab820aa4 --- /dev/null +++ b/resources/units/ground_units/FuMG-401.yaml @@ -0,0 +1,3 @@ +price: 25 +variants: + EWR FuMG-401 Freya LZ: null diff --git a/resources/units/ground_units/GAZ-3307.yaml b/resources/units/ground_units/GAZ-3307.yaml new file mode 100644 index 00000000..38dbecc2 --- /dev/null +++ b/resources/units/ground_units/GAZ-3307.yaml @@ -0,0 +1,3 @@ +price: 2 +variants: + Truck GAZ-3307: null diff --git a/resources/units/ground_units/GAZ-3308.yaml b/resources/units/ground_units/GAZ-3308.yaml new file mode 100644 index 00000000..4fb930af --- /dev/null +++ b/resources/units/ground_units/GAZ-3308.yaml @@ -0,0 +1,3 @@ +price: 1 +variants: + Truck GAZ-3308: null diff --git a/resources/units/ground_units/GAZ-66.yaml b/resources/units/ground_units/GAZ-66.yaml new file mode 100644 index 00000000..9c58aa20 --- /dev/null +++ b/resources/units/ground_units/GAZ-66.yaml @@ -0,0 +1,3 @@ +price: 1 +variants: + Truck GAZ-66: null diff --git a/resources/units/ground_units/Gepard.yaml b/resources/units/ground_units/Gepard.yaml new file mode 100644 index 00000000..2974d188 --- /dev/null +++ b/resources/units/ground_units/Gepard.yaml @@ -0,0 +1,16 @@ +class: SHORADS +description: The Flugabwehrkanonenpanzer Gepard ("anti-aircraft cannon tank Cheetah", + better known as the Flakpanzer Gepard) is an all-weather-capable German self-propelled + anti-aircraft gun (SPAAG).[1] It was developed in the 1960s and fielded in the 1970s, + and has been upgraded several times with the latest electronics. It constituted + a cornerstone of the air defence of the German Army (Bundeswehr) and a number of + other NATO countries. In Germany, the Gepard was phased out in late 2010 and replaced + by Wiesel 2 Ozelot Leichtes Flugabwehrsystem (LeFlaSys) with four FIM-92 Stinger + or LFK NG missile launchers. +introduced: 1976 +manufacturer: Krauss-Maffei +origin: West Germany +price: 24 +role: Self-Propelled Anti-Aircraft Gun +variants: + Flakpanzer Gepard: {} diff --git a/resources/units/ground_units/Grad-URAL.yaml b/resources/units/ground_units/Grad-URAL.yaml new file mode 100644 index 00000000..e37f9b21 --- /dev/null +++ b/resources/units/ground_units/Grad-URAL.yaml @@ -0,0 +1,10 @@ +class: Artillery +description: "The BM-21 \"Grad\" (Russian: \u0411\u041C-21 \"\u0413\u0440\u0430\u0434\ + \", lit.\u2009'hail') is a Soviet truck-mounted 122 mm multiple rocket launcher." +introduced: 1963 +manufacturer: Splav +origin: USSR/Russia +price: 15 +role: Multiple-Launch Rocket System +variants: + BM-21 Grad: {} diff --git a/resources/units/ground_units/Grad_FDDM.yaml b/resources/units/ground_units/Grad_FDDM.yaml new file mode 100644 index 00000000..a6e46954 --- /dev/null +++ b/resources/units/ground_units/Grad_FDDM.yaml @@ -0,0 +1,3 @@ +price: 4 +variants: + Grad MRL FDDM (FC): null diff --git a/resources/units/ground_units/HQ-7_LN_SP.yaml b/resources/units/ground_units/HQ-7_LN_SP.yaml new file mode 100644 index 00000000..c99cabba --- /dev/null +++ b/resources/units/ground_units/HQ-7_LN_SP.yaml @@ -0,0 +1,13 @@ +class: SHORADS +description: "The HQ-7 (FM-80) (Chinese: \u7EA2\u65D7; pinyin: h\xF3ng q\xED, \"red\ + \ flag\" or \"red banner\") is a Chinese short-range air defense missile reverse\ + \ engineered from the French Crotale. The missile is deployed on both ships and\ + \ land-based vehicles. China revealed the export version, FM-80, in the 1989 Dubai\ + \ Air Show. Unit cost is around $162,000 per launcher and $24,500 per missile." +introduced: 1983 +manufacturer: Academy for Defense +origin: China +price: 20 +role: Shorad +variants: + HQ-7 Launcher: {} diff --git a/resources/units/ground_units/HQ-7_STR_SP.yaml b/resources/units/ground_units/HQ-7_STR_SP.yaml new file mode 100644 index 00000000..972936b8 --- /dev/null +++ b/resources/units/ground_units/HQ-7_STR_SP.yaml @@ -0,0 +1,3 @@ +price: 24 +variants: + HQ-7 Self-Propelled STR: null diff --git a/resources/units/ground_units/Hawk cwar.yaml b/resources/units/ground_units/Hawk cwar.yaml new file mode 100644 index 00000000..22d21d10 --- /dev/null +++ b/resources/units/ground_units/Hawk cwar.yaml @@ -0,0 +1,3 @@ +price: 20 +variants: + SAM Hawk CWAR AN/MPQ-55: null diff --git a/resources/units/ground_units/Hawk ln.yaml b/resources/units/ground_units/Hawk ln.yaml new file mode 100644 index 00000000..6e08793b --- /dev/null +++ b/resources/units/ground_units/Hawk ln.yaml @@ -0,0 +1,3 @@ +price: 8 +variants: + SAM Hawk LN M192: null diff --git a/resources/units/ground_units/Hawk pcp.yaml b/resources/units/ground_units/Hawk pcp.yaml new file mode 100644 index 00000000..d1706171 --- /dev/null +++ b/resources/units/ground_units/Hawk pcp.yaml @@ -0,0 +1,3 @@ +price: 14 +variants: + SAM Hawk Platoon Command Post (PCP): null diff --git a/resources/units/ground_units/Hawk sr.yaml b/resources/units/ground_units/Hawk sr.yaml new file mode 100644 index 00000000..7e90769c --- /dev/null +++ b/resources/units/ground_units/Hawk sr.yaml @@ -0,0 +1,3 @@ +price: 18 +variants: + SAM Hawk SR (AN/MPQ-50): null diff --git a/resources/units/ground_units/Hawk tr.yaml b/resources/units/ground_units/Hawk tr.yaml new file mode 100644 index 00000000..67810543 --- /dev/null +++ b/resources/units/ground_units/Hawk tr.yaml @@ -0,0 +1,3 @@ +price: 14 +variants: + SAM Hawk TR (AN/MPQ-46): null diff --git a/resources/units/ground_units/Infantry AK Ins.yaml b/resources/units/ground_units/Infantry AK Ins.yaml new file mode 100644 index 00000000..3bdaebd5 --- /dev/null +++ b/resources/units/ground_units/Infantry AK Ins.yaml @@ -0,0 +1,5 @@ +class: Infantry +price: 0 +spawn_weight: 3 +variants: + Insurgent AK-74: null diff --git a/resources/units/ground_units/Infantry AK.yaml b/resources/units/ground_units/Infantry AK.yaml new file mode 100644 index 00000000..183ec4f4 --- /dev/null +++ b/resources/units/ground_units/Infantry AK.yaml @@ -0,0 +1,5 @@ +class: Infantry +price: 0 +spawn_weight: 4 +variants: + Infantry AK-74 Rus: null diff --git a/resources/units/ground_units/JTACFP.yaml b/resources/units/ground_units/JTACFP.yaml new file mode 100644 index 00000000..d269ae85 --- /dev/null +++ b/resources/units/ground_units/JTACFP.yaml @@ -0,0 +1,3 @@ +price: 1 +variants: + Infantry Soldier JTAC: null diff --git a/resources/units/ground_units/JagdPz_IV.yaml b/resources/units/ground_units/JagdPz_IV.yaml new file mode 100644 index 00000000..d5c3e294 --- /dev/null +++ b/resources/units/ground_units/JagdPz_IV.yaml @@ -0,0 +1,10 @@ +class: ATGM +description: The Jagdpanzer IV, Sd.Kfz. 162, was a German tank destroyer based on + the Panzer IV chassis. +introduced: 1944 +manufacturer: Vomag +origin: Germany +price: 11 +role: Tank Destroyer +variants: + Jagdpanzer IV: {} diff --git a/resources/units/ground_units/Jagdpanther_G1.yaml b/resources/units/ground_units/Jagdpanther_G1.yaml new file mode 100644 index 00000000..ea1e009d --- /dev/null +++ b/resources/units/ground_units/Jagdpanther_G1.yaml @@ -0,0 +1,12 @@ +class: ATGM +description: 'The Jagdpanther (German: "hunting Panther"), Sd.Kfz. 173, was a tank + destroyer (Jagdpanzer, a self-propelled anti-tank gun) built by Germany during World + War II. The Jagdpanther combined the 8.8 cm Pak 43 anti-tank gun, similar to the + main gun of the Tiger II, and the armor and suspension of the Panther chassis.' +introduced: 1944 +manufacturer: MIAG/MNH/MBA +origin: Germany +price: 18 +role: Tank Destroyer +variants: + Jagdpanther G1: {} diff --git a/resources/units/ground_units/KAMAZ Truck.yaml b/resources/units/ground_units/KAMAZ Truck.yaml new file mode 100644 index 00000000..0c80c5c7 --- /dev/null +++ b/resources/units/ground_units/KAMAZ Truck.yaml @@ -0,0 +1,3 @@ +price: 1 +variants: + Truck KAMAZ 43101: null diff --git a/resources/units/ground_units/KDO_Mod40.yaml b/resources/units/ground_units/KDO_Mod40.yaml new file mode 100644 index 00000000..0433e2ce --- /dev/null +++ b/resources/units/ground_units/KDO_Mod40.yaml @@ -0,0 +1,3 @@ +price: 8 +variants: + AAA SP Kdo.G.40: null diff --git a/resources/units/ground_units/KS19.yaml b/resources/units/ground_units/KS19.yaml new file mode 100644 index 00000000..6a8151f8 --- /dev/null +++ b/resources/units/ground_units/KS19.yaml @@ -0,0 +1,3 @@ +price: 10 +variants: + AAA 100mm KS-19: null diff --git a/resources/units/ground_units/Kamikaze.yaml b/resources/units/ground_units/Kamikaze.yaml new file mode 100644 index 00000000..1e9359de --- /dev/null +++ b/resources/units/ground_units/Kamikaze.yaml @@ -0,0 +1,3 @@ +price: 6 +variants: + DIM' KAMIKAZE: null diff --git a/resources/units/ground_units/Kub 1S91 str.yaml b/resources/units/ground_units/Kub 1S91 str.yaml new file mode 100644 index 00000000..0ac8d956 --- /dev/null +++ b/resources/units/ground_units/Kub 1S91 str.yaml @@ -0,0 +1,3 @@ +price: 22 +variants: + SAM SA-6 Kub "Straight Flush" STR: null diff --git a/resources/units/ground_units/Kub 2P25 ln.yaml b/resources/units/ground_units/Kub 2P25 ln.yaml new file mode 100644 index 00000000..ca5d835f --- /dev/null +++ b/resources/units/ground_units/Kub 2P25 ln.yaml @@ -0,0 +1,3 @@ +price: 20 +variants: + SAM SA-6 Kub "Gainful" TEL: null diff --git a/resources/units/ground_units/Kubelwagen_82.yaml b/resources/units/ground_units/Kubelwagen_82.yaml new file mode 100644 index 00000000..68ef1bd9 --- /dev/null +++ b/resources/units/ground_units/Kubelwagen_82.yaml @@ -0,0 +1,3 @@ +price: 1 +variants: + LUV Kubelwagen 82: null diff --git a/resources/units/ground_units/LAV-25.yaml b/resources/units/ground_units/LAV-25.yaml new file mode 100644 index 00000000..094d413b --- /dev/null +++ b/resources/units/ground_units/LAV-25.yaml @@ -0,0 +1,11 @@ +class: Recon +description: The LAV-25 (Light Armored Vehicle) is an eight-wheeled amphibious armored + reconnaissance vehicle built by General Dynamics Land Systems and used by the United + States Marine Corps and the United States Army. +introduced: 1983 +manufacturer: General Dynamics +origin: USA +price: 7 +role: Amphibious Armoured Car +variants: + LAV-25: {} diff --git a/resources/units/ground_units/Land_Rover_101_FC.yaml b/resources/units/ground_units/Land_Rover_101_FC.yaml new file mode 100644 index 00000000..02b98679 --- /dev/null +++ b/resources/units/ground_units/Land_Rover_101_FC.yaml @@ -0,0 +1,3 @@ +price: 1 +variants: + Truck Land Rover 101 FC: null diff --git a/resources/units/ground_units/Land_Rover_109_S3.yaml b/resources/units/ground_units/Land_Rover_109_S3.yaml new file mode 100644 index 00000000..2c878f04 --- /dev/null +++ b/resources/units/ground_units/Land_Rover_109_S3.yaml @@ -0,0 +1,3 @@ +price: 1 +variants: + LUV Land Rover 109: null diff --git a/resources/units/ground_units/Leclerc.yaml b/resources/units/ground_units/Leclerc.yaml new file mode 100644 index 00000000..045d017d --- /dev/null +++ b/resources/units/ground_units/Leclerc.yaml @@ -0,0 +1,17 @@ +class: Tank +description: "The Leclerc tank (French: char Leclerc) is a main battle tank (MBT)\ + \ built by GIAT, now Nexter of France. It was named in honour of General Philippe\ + \ Leclerc de Hauteclocque, who led the French element of the drive towards Paris\ + \ while in command of the Free French 2nd Armoured Division (2e DB) in World War\ + \ II. The designation AMX-56 \u2013 while very popular \u2013 is incorrect. During\ + \ the Iron spear exercise, October 2019, Leclerc tanks crewed by the Lynx 6 Tactical\ + \ Inter-Service Sub-Group (S-GTIA) participated in an inter-alliance exercise and\ + \ surpassed the American M1A2 Abrams, German, Spanish and Norwegian Leopard 2s,\ + \ Italian Ariete C1 and Polish P91." +introduced: 1993 +manufacturer: GIAT Industries +origin: France +price: 25 +role: Main Battle Tank +variants: + "Leclerc S\xE9ries 2": {} diff --git a/resources/units/ground_units/Leclerc_XXI.yaml b/resources/units/ground_units/Leclerc_XXI.yaml new file mode 100644 index 00000000..53efc0ed --- /dev/null +++ b/resources/units/ground_units/Leclerc_XXI.yaml @@ -0,0 +1,17 @@ +class: Tank +description: "The Leclerc tank (French: char Leclerc) is a main battle tank (MBT)\ + \ built by GIAT, now Nexter of France. It was named in honour of General Philippe\ + \ Leclerc de Hauteclocque, who led the French element of the drive towards Paris\ + \ while in command of the Free French 2nd Armoured Division (2e DB) in World War\ + \ II. The designation AMX-56 \u2013 while very popular \u2013 is incorrect. During\ + \ the Iron spear exercise, October 2019, Leclerc tanks crewed by the Lynx 6 Tactical\ + \ Inter-Service Sub-Group (S-GTIA) participated in an inter-alliance exercise and\ + \ surpassed the American M1A2 Abrams, German, Spanish and Norwegian Leopard 2s,\ + \ Italian Ariete C1 and Polish P91." +introduced: 2001 +manufacturer: GIAT Industries +origin: France +price: 35 +role: Main Battle Tank +variants: + Leclerc_XXI: {} diff --git a/resources/units/ground_units/Leopard-2.yaml b/resources/units/ground_units/Leopard-2.yaml new file mode 100644 index 00000000..6e33cace --- /dev/null +++ b/resources/units/ground_units/Leopard-2.yaml @@ -0,0 +1,18 @@ +class: Tank +description: The Leopard 2 is a main battle tank developed by Krauss-Maffei in the + 1970s for the West German Army. The tank first entered service in 1979 and succeeded + the earlier Leopard 1 as the main battle tank of the German Army. It is armed with + a 120 mm smoothbore cannon, and is powered by a V-12 twin-turbo diesel engine. Various + versions have served in the armed forces of Germany and 12 other European countries, + as well as several non-European nations, including Canada, Chile, Indonesia, Singapore, + and Turkey. The Leopard 2 was used in Kosovo with the German Army, and has seen + action in Afghanistan with the Dutch, Danish and Canadian contributions to the International + Security Assistance Force, as well as seeing action in Syria with the Turkish Armed + Forces. +introduced: 1985 +manufacturer: Krauss-Maffei +origin: Germany +price: 25 +role: Main Battle Tank +variants: + Leopard 2: {} diff --git a/resources/units/ground_units/Leopard-2A5.yaml b/resources/units/ground_units/Leopard-2A5.yaml new file mode 100644 index 00000000..586c1977 --- /dev/null +++ b/resources/units/ground_units/Leopard-2A5.yaml @@ -0,0 +1,18 @@ +class: Tank +description: The Leopard 2 is a main battle tank developed by Krauss-Maffei in the + 1970s for the West German Army. The tank first entered service in 1979 and succeeded + the earlier Leopard 1 as the main battle tank of the German Army. It is armed with + a 120 mm smoothbore cannon, and is powered by a V-12 twin-turbo diesel engine. Various + versions have served in the armed forces of Germany and 12 other European countries, + as well as several non-European nations, including Canada, Chile, Indonesia, Singapore, + and Turkey. The Leopard 2 was used in Kosovo with the German Army, and has seen + action in Afghanistan with the Dutch, Danish and Canadian contributions to the International + Security Assistance Force, as well as seeing action in Syria with the Turkish Armed + Forces. +introduced: 1995 +manufacturer: Krauss-Maffei +origin: Germany +price: 22 +role: Main Battle Tank +variants: + Leopard 2A5: {} diff --git a/resources/units/ground_units/Leopard1A3.yaml b/resources/units/ground_units/Leopard1A3.yaml new file mode 100644 index 00000000..a1a6e5b6 --- /dev/null +++ b/resources/units/ground_units/Leopard1A3.yaml @@ -0,0 +1,18 @@ +class: Tank +description: The Leopard (or Leopard 1) is a main battle tank designed and produced + by Porsche in West Germany that first entered service in 1965. Developed in an era + when HEAT warheads were thought to make conventional heavy armour of limited value, + the Leopard focused on firepower in the form of the German-built version of the + British L7 105-mm gun, and improved cross-country performance that was unmatched + by other designs of the era. The Leopard quickly became a standard of many European + militaries, and eventually served as the main battle tank in over a dozen countries + worldwide, with West Germany, Italy and the Netherlands being the largest operators + until their retirement. Currently, the largest operators are Greece, with 520 vehicles, + Turkey, with 397 vehicles and Brazil with 378 vehicles. +introduced: 1974 +manufacturer: Krauss-Maffei +origin: Germany +price: 18 +role: Main Battle Tank +variants: + Leopard 1A3: {} diff --git a/resources/units/ground_units/M 818.yaml b/resources/units/ground_units/M 818.yaml new file mode 100644 index 00000000..662c1415 --- /dev/null +++ b/resources/units/ground_units/M 818.yaml @@ -0,0 +1,3 @@ +price: 3 +variants: + Truck M818 6x6: null diff --git a/resources/units/ground_units/M-1 Abrams.yaml b/resources/units/ground_units/M-1 Abrams.yaml new file mode 100644 index 00000000..950ffd22 --- /dev/null +++ b/resources/units/ground_units/M-1 Abrams.yaml @@ -0,0 +1,18 @@ +class: Tank +description: The M1 Abrams is a third-generation American main battle tank designed + by Chrysler Defense (now General Dynamics Land Systems)[9] and named for General + Creighton Abrams. Conceived for modern armored ground warfare and now one of the + heaviest tanks in service at nearly 68 short tons. The M1 Abrams entered service + in 1980 and currently serves as the main battle tank of the United States Army and + Marine Corps. The export version is used by the armies of Egypt, Kuwait, Saudi Arabia, + Australia, and Iraq. The Abrams was first used in combat in the Persian Gulf War + and has seen combat in both the War in Afghanistan and Iraq War under U.S. service, + while Iraqi Abrams tanks have seen action in the war against ISIL and have seen + use by Saudi Arabia during the Yemeni Civil War. +introduced: 1992 +manufacturer: General Dynamics +origin: USA +price: 25 +role: Main Battle Tank +variants: + M1A2 Abrams: {} diff --git a/resources/units/ground_units/M-109.yaml b/resources/units/ground_units/M-109.yaml new file mode 100644 index 00000000..5df59ecd --- /dev/null +++ b/resources/units/ground_units/M-109.yaml @@ -0,0 +1,10 @@ +class: Artillery +description: The M109 is an American 155 mm turreted self-propelled howitzer, first + introduced in the early 1960s to replace the M44. +introduced: 1994 +manufacturer: United Defense +origin: USA +price: 25 +role: Self-Propelled Gun +variants: + M109A6 Paladin: {} diff --git a/resources/units/ground_units/M-113.yaml b/resources/units/ground_units/M-113.yaml new file mode 100644 index 00000000..2d0f0460 --- /dev/null +++ b/resources/units/ground_units/M-113.yaml @@ -0,0 +1,17 @@ +class: APC +description: The M113 is a fully tracked armored personnel carrier (APC) that was + developed and produced by the Food Machinery and Chemical Corporation (FMC). The + M113 was sent to United States Army Europe to replace the mechanized infantry's + M59 APCs from 1961. The M113 was first used in combat in April 1962 after the United + States provided the South Vietnamese Army (ARVN) with heavy weaponry such as the + M113, under the Military Assistance Command, Vietnam (MACV) program. Eventually, + the M113 was the most widely used armored vehicle of the U.S. Army in the Vietnam + War and was used to break through heavy thickets in the midst of the jungle to attack + and overrun enemy positions. About 80.000 have been build. +introduced: 1960 +manufacturer: Food Machinery Corp +origin: USA +price: 6 +role: Armoured Personnel Carrier +variants: + M113: {} diff --git a/resources/units/ground_units/M-2 Bradley.yaml b/resources/units/ground_units/M-2 Bradley.yaml new file mode 100644 index 00000000..fa6f5820 --- /dev/null +++ b/resources/units/ground_units/M-2 Bradley.yaml @@ -0,0 +1,20 @@ +class: IFV +description: 'The M2 Bradley, or Bradley IFV, is an American infantry fighting vehicle + that is a member of the Bradley Fighting Vehicle family. It is manufactured by BAE + Systems Land & Armaments, which was formerly United Defense. The Bradley is designed + for reconnaissance and to transport a squad of infantry, providing them protection + from small arms fire, while also providing firepower to both suppress and eliminate + most threats to friendly infantry. It is designed to be highly maneuverable and + to be fast enough to keep up with heavy armor during an advance. The M2 holds a + crew of three: a commander, a gunner and a driver, as well as six fully equipped + soldiers. In the year 2000 the total cost of the program was $5,664,100,000 for + 1602 units, giving an average unit cost of $3,166,000. If you want to know more + than you ever wanted about the Bradley, watch the film ''The Pentagon Wars'', its + great!' +introduced: 1988 +manufacturer: United Defense +origin: USA +price: 12 +role: Infantry Fighting Vehicle +variants: + M2A2 Bradley: {} diff --git a/resources/units/ground_units/M-60.yaml b/resources/units/ground_units/M-60.yaml new file mode 100644 index 00000000..b0506f8e --- /dev/null +++ b/resources/units/ground_units/M-60.yaml @@ -0,0 +1,25 @@ +class: Tank +description: "The M60 reached operational capability with fielding to US Army units\ + \ in Europe beginning in December 1960. The first combat usage of the M60 was with\ + \ Israel during the 1973 Yom Kippur War where it saw service under the \"Magach\ + \ 6\" designation, performing well in combat against comparable tanks such as the\ + \ T-62. In 1982 the Israelis once again used the M60 during the 1982 Lebanon War,\ + \ equipped with upgrades such as explosive reactive armor to defend against guided\ + \ missiles that proved very effective at destroying tanks. The M60 also saw use\ + \ in 1983 with Operation Urgent Fury, supporting US Marines in an amphibious assault\ + \ into Grenada. M60s delivered to Iran also served in the Iran\u2013Iraq War. The\ + \ United States' largest deployment of M60s was in the 1991 Gulf War, where the\ + \ US Marines equipped with M60A1s effectively defeated Iraqi armored forces, including\ + \ T-72 tanks. The United States readily retired the M60 from front-line combat after\ + \ Operation Desert Storm, with the last tanks being retired from National Guard\ + \ service in 1997.[16] M60-series vehicles continue in front-line service with a\ + \ number of countries' militaries, though most of these have been highly modified\ + \ and had their firepower, mobility and protection upgraded to increase their combat\ + \ effectiveness on the modern battlefield." +introduced: 1960 +manufacturer: General Dynamics +origin: USA +price: 16 +role: Main Battle Tank +variants: + M60A3 "Patton": {} diff --git a/resources/units/ground_units/M1043 HMMWV Armament.yaml b/resources/units/ground_units/M1043 HMMWV Armament.yaml new file mode 100644 index 00000000..9a53c0a9 --- /dev/null +++ b/resources/units/ground_units/M1043 HMMWV Armament.yaml @@ -0,0 +1,11 @@ +class: Recon +description: 'The High Mobility Multipurpose Wheeled Vehicle (HMMWV; colloquial: Humvee) + is a family of light, four-wheel drive, military trucks and utility vehicles produced + by AM General.' +introduced: 1983 +manufacturer: AM General +origin: USA +price: 2 +role: Recon +variants: + M1043 HMMWV (M2 HMG): {} diff --git a/resources/units/ground_units/M1045 HMMWV TOW.yaml b/resources/units/ground_units/M1045 HMMWV TOW.yaml new file mode 100644 index 00000000..2ba33606 --- /dev/null +++ b/resources/units/ground_units/M1045 HMMWV TOW.yaml @@ -0,0 +1,11 @@ +class: ATGM +description: 'The High Mobility Multipurpose Wheeled Vehicle (HMMWV; colloquial: Humvee) + is a family of light, four-wheel drive, military trucks and utility vehicles produced + by AM General. This verison carries a TOW for ATGM.' +introduced: 1983 +manufacturer: AM General +origin: USA +price: 8 +role: Armoured Car +variants: + M1045 HMMWV (BGM-71 TOW): {} diff --git a/resources/units/ground_units/M1097 Avenger.yaml b/resources/units/ground_units/M1097 Avenger.yaml new file mode 100644 index 00000000..aaaacf00 --- /dev/null +++ b/resources/units/ground_units/M1097 Avenger.yaml @@ -0,0 +1,12 @@ +class: SHORADS +description: The Avenger Air Defense System, designated AN/TWQ-1 under the Joint Electronics + Type Designation System, is an American self-propelled surface-to-air missile system + which provides mobile, short-range air defense protection for ground units against + cruise missiles, unmanned aerial vehicles, low-flying fixed-wing aircraft, and helicopters. +introduced: 1990 +manufacturer: Boeing +origin: USA +price: 20 +role: Self-Propelled Surface-to-Air Missile Launcher +variants: + M1097 Heavy HMMWV Avenger: {} diff --git a/resources/units/ground_units/M10_GMC.yaml b/resources/units/ground_units/M10_GMC.yaml new file mode 100644 index 00000000..7285cb16 --- /dev/null +++ b/resources/units/ground_units/M10_GMC.yaml @@ -0,0 +1,16 @@ +class: ATGM +description: The M10 tank destroyer was an American tank destroyer of World War II. + The M10 was numerically the most important U.S. tank destroyer of World War II. + It combined thin but sloped armor with the M4's reliable drivetrain and a reasonably + potent anti-tank weapon mounted in an open-topped turret. Despite its obsolescence + in the face of newer German tanks like the Panther and the introduction of more + powerful and better-designed types as replacements, the M10 remained in service + until the end of the war. +introduced: 1942 +manufacturer: Fisher/Ford Motor Company +origin: USA +price: 14 +role: Tank Destroyer +variants: + 3in SPM M10 Achilles Mk II: {} + M10 3-inch Gun Motor Carriage: {} diff --git a/resources/units/ground_units/M1126 Stryker ICV.yaml b/resources/units/ground_units/M1126 Stryker ICV.yaml new file mode 100644 index 00000000..4cfba805 --- /dev/null +++ b/resources/units/ground_units/M1126 Stryker ICV.yaml @@ -0,0 +1,10 @@ +class: APC +description: 'The ICV (Infantry Carrier Vehicle) Stryker is a family of eight-wheeled + armored fighting vehicles derived from the Canadian LAV III. ' +introduced: 2002 +manufacturer: General Dynamics +origin: USA +price: 10 +role: Armoured Personnel Carrier +variants: + M1126 Stryker ICV (M2 HMG): {} diff --git a/resources/units/ground_units/M1128 Stryker MGS.yaml b/resources/units/ground_units/M1128 Stryker MGS.yaml new file mode 100644 index 00000000..13171762 --- /dev/null +++ b/resources/units/ground_units/M1128 Stryker MGS.yaml @@ -0,0 +1,12 @@ +class: IFV +description: The M1128 Mobile Gun System is an eight-wheeled armored car of the Stryker + armored fighting vehicle family, mounting a 105 mm tank gun, based on the Canadian + LAV III light-armored vehicle manufactured by General Dynamics Land Systems. It + is in service with the United States Army but will be retired by the end of 2022. +introduced: 2006 +manufacturer: General Dynamics +origin: USA +price: 14 +role: Armoured Car +variants: + M1128 Stryker Mobile Gun System: {} diff --git a/resources/units/ground_units/M1134 Stryker ATGM.yaml b/resources/units/ground_units/M1134 Stryker ATGM.yaml new file mode 100644 index 00000000..1c0dbab3 --- /dev/null +++ b/resources/units/ground_units/M1134 Stryker ATGM.yaml @@ -0,0 +1,10 @@ +class: ATGM +description: The ICV (Infantry Carrier Vehicle) Stryker is a family of eight-wheeled + armored fighting vehicles derived from the Canadian LAV III. +introduced: 2002 +manufacturer: General Dynamics +origin: USA +price: 12 +role: Armoured Car +variants: + M1134 Stryker ATGM (BGM-71 TOW): {} diff --git a/resources/units/ground_units/M120.yaml b/resources/units/ground_units/M120.yaml new file mode 100644 index 00000000..e88f123e --- /dev/null +++ b/resources/units/ground_units/M120.yaml @@ -0,0 +1,3 @@ +price: 10 +variants: + MO 120 RT: null diff --git a/resources/units/ground_units/M12_GMC.yaml b/resources/units/ground_units/M12_GMC.yaml new file mode 100644 index 00000000..2f210cfa --- /dev/null +++ b/resources/units/ground_units/M12_GMC.yaml @@ -0,0 +1,11 @@ +class: Artillery +description: The 155 mm Gun Motor Carriage M12 was a U.S. self-propelled gun developed + during the Second World War. It mounted a 155 mm gun derived from the French Canon + de 155mm GPF field gun. +introduced: 1942 +manufacturer: Pressed Steel Car Company +origin: USA +price: 10 +role: Self-Propelled Gun +variants: + M12 Gun Motor Carriage: {} diff --git a/resources/units/ground_units/M1_37mm.yaml b/resources/units/ground_units/M1_37mm.yaml new file mode 100644 index 00000000..d2416613 --- /dev/null +++ b/resources/units/ground_units/M1_37mm.yaml @@ -0,0 +1,14 @@ +class: SHORADS +description: The 37 mm gun M1 was an anti-aircraft autocannon developed in the United + States. It was used by the US Army in World War II. In addition to the towed variant, + the gun was mounted, with two M2 machine guns, on the M2/M3 half-track, resulting + in the T28/T28E1/M15/M15A1 series of multiple gun motor carriages. In early World + War II, each Army Anti-Aircraft Artillery (AAA) Auto-Weapons battalion was authorized + a total of thirty-two 37 mm guns in its four firing batteries, plus other weapons. +introduced: 1939 +manufacturer: Colt +origin: USA +price: 7 +role: Anti-Aircraft Gun +variants: + M1 37mm Gun: {} diff --git a/resources/units/ground_units/M2A1_halftrack.yaml b/resources/units/ground_units/M2A1_halftrack.yaml new file mode 100644 index 00000000..6e72daa0 --- /dev/null +++ b/resources/units/ground_units/M2A1_halftrack.yaml @@ -0,0 +1,10 @@ +class: APC +description: 'The M2 half-track car is an armored half-track produced by the United + States during World War II. ' +introduced: 1940 +manufacturer: White Motor Company +origin: USA +price: 4 +role: Armoured Personnel Carrier +variants: + M2A1 Half-Track: {} diff --git a/resources/units/ground_units/M30_CC.yaml b/resources/units/ground_units/M30_CC.yaml new file mode 100644 index 00000000..67f6777f --- /dev/null +++ b/resources/units/ground_units/M30_CC.yaml @@ -0,0 +1,13 @@ +class: Logistics +description: The M30 Cargo carrier was a variant of the M12 Gun Motor Carriage (a + US self-propelled gun), which itself was derived from the M3 Lee tank. Neither vehicle + was extensively produced, around hundreds being manufactured. It was exclusively + used in the Normandy theatre and followed the Allied push into Germany. It was judged + obsolete after the war and retired from service. +introduced: 1942 +manufacturer: Pressed Steel Car Company +origin: USA +price: 2 +role: Tracked Cargo Transporter +variants: + M30 Cargo Carrier: {} diff --git a/resources/units/ground_units/M45_Quadmount.yaml b/resources/units/ground_units/M45_Quadmount.yaml new file mode 100644 index 00000000..eef90fde --- /dev/null +++ b/resources/units/ground_units/M45_Quadmount.yaml @@ -0,0 +1,14 @@ +description: The M45 Quadmount (nicknamed the "meat chopper" and "Krautmower" for + its high rate of fire) was a weapon mounting consisting of four of the "HB", or + "heavy barrel" .50 caliber M2 Browning machine guns mounted in pairs on each side + of an open, electrically powered turret. It was developed by the W. L. Maxson Corporation + to replace the earlier M33 twin mount (also from Maxson). Although designed as an + anti-aircraft weapon, it was also used against ground targets. Introduced in 1943 + during World War II, it remained in US service as late as the Vietnam War. +introduced: 1943 +manufacturer: W. L. Maxson Corporation +origin: USA +price: 4 +role: Anti-Aircraft Gun +variants: + M45 Quadmount: {} diff --git a/resources/units/ground_units/M48 Chaparral.yaml b/resources/units/ground_units/M48 Chaparral.yaml new file mode 100644 index 00000000..f2e1428e --- /dev/null +++ b/resources/units/ground_units/M48 Chaparral.yaml @@ -0,0 +1,12 @@ +class: SHORADS +description: The MIM-72A/M48 Chaparral is an American self-propelled surface-to-air + missile system based on the AIM-9 Sidewinder air-to-air missile system. The launcher + is based on the M113 family of vehicles. It entered service with the United States + Army in 1969 and was phased out between 1990 and 1998. +introduced: 1969 +manufacturer: Ford Motor Company +origin: USA +price: 16 +role: Self-Propelled Surface-to-Air Missile Launcher +variants: + M48 Chaparral: {} diff --git a/resources/units/ground_units/M4A4_Sherman_FF.yaml b/resources/units/ground_units/M4A4_Sherman_FF.yaml new file mode 100644 index 00000000..ab7f3417 --- /dev/null +++ b/resources/units/ground_units/M4A4_Sherman_FF.yaml @@ -0,0 +1,13 @@ +class: ATGM +description: The Sherman Firefly was a tank used by the United Kingdom and some Commonwealth + and Allied armoured formations in the Second World War. It was based on the US M4 + Sherman, but fitted with the more powerful 3-inch (76.2 mm) calibre British 17-pounder + anti-tank gun as its main weapon. +introduced: 1943 +manufacturer: Chrysler +origin: USA/UK +price: 16 +role: Medium Tank +variants: + M4A4 Sherman Firefly: {} + Sherman Firefly VC: {} diff --git a/resources/units/ground_units/M4_Sherman.yaml b/resources/units/ground_units/M4_Sherman.yaml new file mode 100644 index 00000000..ff412be7 --- /dev/null +++ b/resources/units/ground_units/M4_Sherman.yaml @@ -0,0 +1,15 @@ +class: Tank +description: The M4 Sherman, officially Medium Tank, M4, was the most widely used + medium tank by the United States and Western Allies in World War II. The M4 Sherman + proved to be reliable, relatively cheap to produce, and available in great numbers. + It was also the basis of several successful tank destroyers, such as the M10, 17pdr + SP Achilles and M36B1. Tens of thousands were distributed through the Lend-Lease + program to the British Commonwealth and Soviet Union. +introduced: 1942 +manufacturer: Fisher +origin: USA +price: 12 +role: Medium Tank +variants: + M4A2(75) Sherman: {} + Sherman III: {} diff --git a/resources/units/ground_units/M4_Tractor.yaml b/resources/units/ground_units/M4_Tractor.yaml new file mode 100644 index 00000000..6e05f8da --- /dev/null +++ b/resources/units/ground_units/M4_Tractor.yaml @@ -0,0 +1,9 @@ +description: The M4 High-Speed Tractor was an artillery tractor used by the US Army + from 1943. +introduced: 1943 +manufacturer: Allis-Chalmers +origin: USA +price: 2 +role: Tracked Cargo Transporter +variants: + M4 High-Speed Tractor: {} diff --git a/resources/units/ground_units/M6 Linebacker.yaml b/resources/units/ground_units/M6 Linebacker.yaml new file mode 100644 index 00000000..e3122702 --- /dev/null +++ b/resources/units/ground_units/M6 Linebacker.yaml @@ -0,0 +1,17 @@ +class: SHORADS +description: The M6 Linebacker short-range air defense system was developed by Boeing + to meet the US Army requirements. The new vehicle was intended to counter the threat + posed by low-flying aircraft, helicopters, cruise missiles and unmanned aerial vehicles + to forward armored formations. Initial production Linebackers entered service with + the US Army in 1997. A total of 99 Bradley Linebackers were ordered, however in + 2006 these were phased-out of service. The M6 is an all-weather system, capable + of operating in day/night and all weather conditions. It is based on the M2 Bradley + IFV and is equipped with a quadruple launcher with FIM-92 Stinger short-range surface-to-air + missiles instead of the TOW ATGW. +introduced: 1997 +manufacturer: United Defense +origin: USA +price: 18 +role: Self-Propelled Anti-Aircraft System +variants: + M6 Linebacker: {} diff --git a/resources/units/ground_units/M8_Greyhound.yaml b/resources/units/ground_units/M8_Greyhound.yaml new file mode 100644 index 00000000..56d5a449 --- /dev/null +++ b/resources/units/ground_units/M8_Greyhound.yaml @@ -0,0 +1,12 @@ +class: Recon +description: "The M8 Light Armored Car is a 6\xD76 armored car produced by the Ford\ + \ Motor Company during World War II. It was used from 1943 by United States and\ + \ British forces in Europe and the Pacific until the end of the war. The vehicle\ + \ was widely exported and as of 2006 still remained in service with some countries." +introduced: 1943 +manufacturer: Ford Motor Company +origin: USA +price: 8 +role: Light Armoured Car +variants: + M8 Greyhound Light Armored Car: {} diff --git a/resources/units/ground_units/MCV-80.yaml b/resources/units/ground_units/MCV-80.yaml new file mode 100644 index 00000000..34241815 --- /dev/null +++ b/resources/units/ground_units/MCV-80.yaml @@ -0,0 +1,15 @@ +class: IFV +description: "The Warrior tracked vehicle family is a series of British armoured vehicles,\ + \ originally developed to replace the older FV430 series of armoured vehicles. The\ + \ Warrior started life as the MCV-80, \"Mechanised Combat Vehicle for the 1980s\"\ + . One of the requirements of the new vehicle was a top speed able to keep up with\ + \ the projected new MBT, the MBT-80 \u2013 later cancelled and replaced by what\ + \ became the Challenger 1 \u2013 which the then-current FV432 armoured personnel\ + \ carrier could not. " +introduced: 1984 +manufacturer: GKN Sankey +origin: UK +price: 10 +role: Infantry Fighting Vehicle +variants: + FV510 Warrior: {} diff --git a/resources/units/ground_units/MLRS.yaml b/resources/units/ground_units/MLRS.yaml new file mode 100644 index 00000000..dc79014c --- /dev/null +++ b/resources/units/ground_units/MLRS.yaml @@ -0,0 +1,14 @@ +class: Artillery +description: The M270 Multiple Launch Rocket System (M270 MLRS) is an armored, self-propelled, + multiple rocket launcher (a type of rocket artillery). Since the first M270s were + delivered to the U.S. Army in 1983, the MLRS has been adopted by several NATO countries. + Some 1,300 M270 systems have been manufactured in the United States and in Europe, + along with more than 700,000 rockets. The production of the M270 ended in 2003, + when a last batch was delivered to the Egyptian Army. +introduced: 1983 +manufacturer: Vought +origin: USA +price: 55 +role: Multiple-Launch Rocket System +variants: + M270 Multiple Launch Rocket System: {} diff --git a/resources/units/ground_units/MTLB.yaml b/resources/units/ground_units/MTLB.yaml new file mode 100644 index 00000000..75037028 --- /dev/null +++ b/resources/units/ground_units/MTLB.yaml @@ -0,0 +1,16 @@ +class: APC +description: "The MT-LB (Russian: \u041C\u043D\u043E\u0433\u043E\u0446\u0435\u043B\ + \u0435\u0432\u043E\u0439 \u0422\u044F\u0433\u0430\u0447 \u041B\u0435\u0433\u043A\ + \u0438\u0439 \u0411\u0440\u043E\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\ + \u0439, romanized: Mnogotselevoy tyagach legky bronirovanny, literally \"multi-purpose\ + \ towing vehicle light armored\") is a Soviet multi-purpose fully amphibious auxiliary\ + \ armored tracked vehicle, which was introduced in the 1950s. It is also produced\ + \ in Poland, where (starting mid-1990s) its YaMZ engine was replaced by a Polish\ + \ version." +introduced: 1958 +manufacturer: Kharkiv +origin: USSR/Russia +price: 4 +role: Armoured Personnel Carrier +variants: + MT-LB: {} diff --git a/resources/units/ground_units/Marder.yaml b/resources/units/ground_units/Marder.yaml new file mode 100644 index 00000000..e61fb7af --- /dev/null +++ b/resources/units/ground_units/Marder.yaml @@ -0,0 +1,23 @@ +class: IFV +description: The Marder (German for "marten") is a German infantry fighting vehicle + operated by the German Army as the main weapon of the Panzergrenadiere (mechanized + infantry) from the 1970s through to the present day. Developed as part of the rebuilding + of Germany's armoured fighting vehicle industry, the Marder has proven to be a successful + and solid infantry fighting vehicle design. While it used to include a few unique + features, such as a fully remote machine gun on the rear deck and gun ports on the + sides for infantry to fire through, these features have been deleted or streamlined + in later upgrade packages to bring it more in line with modern IFV design. Around + 2,100 were taken into service by the German Army in the early 1970s, but the vehicle + in its German variant was not sold to any foreign militaries. As the German Army + began to retire older vehicles, the Chilean government agreed to acquire 200 Marders; + the government of Greece has considered the purchase of 450 retired vehicles in + the past. Argentina uses a simplified and locally produced variant, the VCTP, and + has a number of vehicles based on that platform constructed by Henschel and built + by TAMSE. +introduced: 1988 +manufacturer: Rheinmetall Landsysteme +origin: Germany +price: 10 +role: Infantry Fighting Vehicle +variants: + Marder 1A3: {} diff --git a/resources/units/ground_units/Maschinensatz_33.yaml b/resources/units/ground_units/Maschinensatz_33.yaml new file mode 100644 index 00000000..5ed7c98d --- /dev/null +++ b/resources/units/ground_units/Maschinensatz_33.yaml @@ -0,0 +1,3 @@ +price: 10 +variants: + PU Maschinensatz_33: null diff --git a/resources/units/ground_units/Merkava_Mk4.yaml b/resources/units/ground_units/Merkava_Mk4.yaml new file mode 100644 index 00000000..81147f1a --- /dev/null +++ b/resources/units/ground_units/Merkava_Mk4.yaml @@ -0,0 +1,14 @@ +class: Tank +description: 'The Merkava is a main battle tank used by the Israel Defense Forces. + The tank began development in 1970, and entered official service in 1979. Four main + variants of the tank have been deployed. It was first used extensively in the 1982 + Lebanon War. The name "Merkava" was derived from the IDF''s initial development + program name. Design criteria include rapid repair of battle damage, survivability, + cost-effectiveness and off-road performance. ' +introduced: 2004 +manufacturer: MANTAK +origin: Israel +price: 25 +role: Main Battle Tank +variants: + Merkava Mk IV: {} diff --git a/resources/units/ground_units/Osa 9A33 ln.yaml b/resources/units/ground_units/Osa 9A33 ln.yaml new file mode 100644 index 00000000..9149250d --- /dev/null +++ b/resources/units/ground_units/Osa 9A33 ln.yaml @@ -0,0 +1,3 @@ +price: 28 +variants: + SAM SA-8 Osa "Gecko" TEL: null diff --git a/resources/units/ground_units/PLZ05.yaml b/resources/units/ground_units/PLZ05.yaml new file mode 100644 index 00000000..575fab1c --- /dev/null +++ b/resources/units/ground_units/PLZ05.yaml @@ -0,0 +1,13 @@ +class: Artillery +description: The PLZ-05 or the Type 05 is a 155 mm self-propelled howitzer developed + by the People's Liberation Army of China to replace the Type 59-1 130mm. The PLZ-05 + was officially unveiled at the Military Museum of the Chinese People's Revolution + to mark the 80th anniversary of the PLA in July 2007, and first entered service + with the PLA in 2008. +introduced: 1999 +manufacturer: Norinco +origin: China +price: 25 +role: Self propelled artillery +variants: + PLZ-05: {} diff --git a/resources/units/ground_units/PT_76.yaml b/resources/units/ground_units/PT_76.yaml new file mode 100644 index 00000000..28ec304d --- /dev/null +++ b/resources/units/ground_units/PT_76.yaml @@ -0,0 +1,16 @@ +class: Recon +description: "The BRDM-2 (Boyevaya Razvedyvatelnaya Dozornaya Mashina, \u0411\u043E\ + \u0435\u0432\u0430\u044F \u0420\u0430\u0437\u0432\u0435\u0434\u044B\u0432\u0430\u0442\ + \u0435\u043B\u044C\u043D\u0430\u044F \u0414\u043E\u0437\u043E\u0440\u043D\u0430\u044F\ + \ \u041C\u0430\u0448\u0438\u043D\u0430, literally \"Combat Reconnaissance/Patrol\ + \ Vehicle\") is an amphibious armoured patrol car used by Russia and the former\ + \ Soviet Union. It was also known under the designations BTR-40PB, BTR-40P-2 and\ + \ GAZ 41-08. This vehicle, like many other Soviet designs, has been exported extensively\ + \ and is in use in at least 38 countries." +introduced: 1951 +manufacturer: VTZ, Kirov Factory +origin: USSR/Russia +price: 9 +role: Recon light tank +variants: + PT-76: {} diff --git a/resources/units/ground_units/Paratrooper AKS-74.yaml b/resources/units/ground_units/Paratrooper AKS-74.yaml new file mode 100644 index 00000000..e4ff2384 --- /dev/null +++ b/resources/units/ground_units/Paratrooper AKS-74.yaml @@ -0,0 +1,5 @@ +class: Infantry +price: 0 +spawn_weight: 5 +variants: + Paratrooper AKS: null diff --git a/resources/units/ground_units/Paratrooper RPG-16.yaml b/resources/units/ground_units/Paratrooper RPG-16.yaml new file mode 100644 index 00000000..cb766480 --- /dev/null +++ b/resources/units/ground_units/Paratrooper RPG-16.yaml @@ -0,0 +1,5 @@ +class: Infantry +price: 0 +spawn_weight: 1 +variants: + Paratrooper RPG-16: null diff --git a/resources/units/ground_units/Patriot AMG.yaml b/resources/units/ground_units/Patriot AMG.yaml new file mode 100644 index 00000000..0ae26a61 --- /dev/null +++ b/resources/units/ground_units/Patriot AMG.yaml @@ -0,0 +1,3 @@ +price: 35 +variants: + SAM Patriot CR (AMG AN/MRC-137): null diff --git a/resources/units/ground_units/Patriot ECS.yaml b/resources/units/ground_units/Patriot ECS.yaml new file mode 100644 index 00000000..b76682eb --- /dev/null +++ b/resources/units/ground_units/Patriot ECS.yaml @@ -0,0 +1,3 @@ +price: 30 +variants: + SAM Patriot ECS: null diff --git a/resources/units/ground_units/Patriot EPP.yaml b/resources/units/ground_units/Patriot EPP.yaml new file mode 100644 index 00000000..4dcedc91 --- /dev/null +++ b/resources/units/ground_units/Patriot EPP.yaml @@ -0,0 +1,3 @@ +price: 15 +variants: + SAM Patriot EPP-III: null diff --git a/resources/units/ground_units/Patriot cp.yaml b/resources/units/ground_units/Patriot cp.yaml new file mode 100644 index 00000000..65d27be7 --- /dev/null +++ b/resources/units/ground_units/Patriot cp.yaml @@ -0,0 +1,3 @@ +price: 18 +variants: + SAM Patriot C2 ICC: null diff --git a/resources/units/ground_units/Patriot ln.yaml b/resources/units/ground_units/Patriot ln.yaml new file mode 100644 index 00000000..3a181129 --- /dev/null +++ b/resources/units/ground_units/Patriot ln.yaml @@ -0,0 +1,3 @@ +price: 15 +variants: + SAM Patriot LN: null diff --git a/resources/units/ground_units/Patriot str.yaml b/resources/units/ground_units/Patriot str.yaml new file mode 100644 index 00000000..073df5a8 --- /dev/null +++ b/resources/units/ground_units/Patriot str.yaml @@ -0,0 +1,3 @@ +price: 22 +variants: + SAM Patriot STR: null diff --git a/resources/units/ground_units/Pz_IV_H.yaml b/resources/units/ground_units/Pz_IV_H.yaml new file mode 100644 index 00000000..29168625 --- /dev/null +++ b/resources/units/ground_units/Pz_IV_H.yaml @@ -0,0 +1,13 @@ +class: Tank +description: 'The Panzerkampfwagen IV (Pz.Kpfw. IV), commonly known as the Panzer + IV, was a German medium tank developed in the late 1930s and used extensively during + the Second World War. Its ordnance inventory designation was Sd.Kfz. 161. The Panzer + IV was the most numerous German tank and the second-most numerous German armored + fighting vehicle of the Second World War, with some 8,500 built. ' +introduced: 1943 +manufacturer: Krupp-Gruson/Vomag/Nibelungenwerke +origin: Germany +price: 16 +role: Medium Tank +variants: + Panzerkampfwagen IV Ausf. H: {} diff --git a/resources/units/ground_units/Pz_V_Panther_G.yaml b/resources/units/ground_units/Pz_V_Panther_G.yaml new file mode 100644 index 00000000..709dc060 --- /dev/null +++ b/resources/units/ground_units/Pz_V_Panther_G.yaml @@ -0,0 +1,15 @@ +class: Tank +description: The Panther is a German medium tank deployed during World War II on the + Eastern and Western Fronts in Europe from mid-1943 to the war's end in 1945. The + Panther was intended to counter the Soviet T-34 and to replace the Panzer III and + Panzer IV. Nevertheless, it served alongside the Panzer IV and the heavier Tiger + I until the end of the war. It is considered one of the best tanks of World War + II for its excellent firepower and protection, although its reliability was less + impressive. +introduced: 1944 +manufacturer: MAN/Daimler-Benz/MNH +origin: Germany +price: 24 +role: Medium Tank +variants: + Panzerkampfwagen V Panther Ausf. G: {} diff --git a/resources/units/ground_units/QF_37_AA.yaml b/resources/units/ground_units/QF_37_AA.yaml new file mode 100644 index 00000000..0805b4d0 --- /dev/null +++ b/resources/units/ground_units/QF_37_AA.yaml @@ -0,0 +1,14 @@ +class: SHORADS +description: The QF 3.7-inch AA was Britain's primary heavy anti-aircraft gun during + World War II. It was roughly the equivalent of the German 88 mm FlaK and American + 90 mm, but with a slightly larger calibre of 3.7 inches, approximately 94 mm. Production + began in 1937 and it was used throughout World War II in all theatres except the + Eastern Front. It remained in use after the war until AA guns were replaced by guided + missiles beginning in 1957. +introduced: 1937 +manufacturer: Vickers +origin: UK +price: 10 +role: Anti-Aircraft Gun +variants: + QF 3.7-inch AA Gun: {} diff --git a/resources/units/ground_units/Roland ADS.yaml b/resources/units/ground_units/Roland ADS.yaml new file mode 100644 index 00000000..800efe4c --- /dev/null +++ b/resources/units/ground_units/Roland ADS.yaml @@ -0,0 +1,10 @@ +class: SHORADS +description: 'he Roland is a Franco-German mobile short-range surface-to-air missile + (SAM) system. ' +introduced: 1981 +manufacturer: Euromissile +origin: France/Germany +price: 12 +role: Self-Propelled Surface-to-Air Missile Launcher +variants: + Roland 2 (Marder Chassis): {} diff --git a/resources/units/ground_units/Roland Radar.yaml b/resources/units/ground_units/Roland Radar.yaml new file mode 100644 index 00000000..f4b3f8d1 --- /dev/null +++ b/resources/units/ground_units/Roland Radar.yaml @@ -0,0 +1,3 @@ +price: 16 +variants: + SAM Roland EWR: null diff --git a/resources/units/ground_units/S-300PMU1 30N6E tr.yaml b/resources/units/ground_units/S-300PMU1 30N6E tr.yaml new file mode 100644 index 00000000..acc49f15 --- /dev/null +++ b/resources/units/ground_units/S-300PMU1 30N6E tr.yaml @@ -0,0 +1,3 @@ +price: 32 +variants: + SAM SA-20 S-300PMU1 TR 30N6E(truck): null diff --git a/resources/units/ground_units/S-300PMU1 40B6M tr.yaml b/resources/units/ground_units/S-300PMU1 40B6M tr.yaml new file mode 100644 index 00000000..b3de85bc --- /dev/null +++ b/resources/units/ground_units/S-300PMU1 40B6M tr.yaml @@ -0,0 +1,3 @@ +price: 30 +variants: + SAM SA-20 S-300PMU1 TR 30N6E: null diff --git a/resources/units/ground_units/S-300PMU1 40B6MD sr.yaml b/resources/units/ground_units/S-300PMU1 40B6MD sr.yaml new file mode 100644 index 00000000..6fbce5ee --- /dev/null +++ b/resources/units/ground_units/S-300PMU1 40B6MD sr.yaml @@ -0,0 +1,3 @@ +price: 38 +variants: + SAM SA-20 S-300PMU1 SR 5N66E: null diff --git a/resources/units/ground_units/S-300PMU1 54K6 cp.yaml b/resources/units/ground_units/S-300PMU1 54K6 cp.yaml new file mode 100644 index 00000000..966524ab --- /dev/null +++ b/resources/units/ground_units/S-300PMU1 54K6 cp.yaml @@ -0,0 +1,3 @@ +price: 26 +variants: + SAM SA-20 S-300PMU1 CP 54K6: null diff --git a/resources/units/ground_units/S-300PMU1 5P85CE ln.yaml b/resources/units/ground_units/S-300PMU1 5P85CE ln.yaml new file mode 100644 index 00000000..89efbf1a --- /dev/null +++ b/resources/units/ground_units/S-300PMU1 5P85CE ln.yaml @@ -0,0 +1,3 @@ +price: 28 +variants: + SAM SA-20 S-300PMU1 LN 5P85CE: null diff --git a/resources/units/ground_units/S-300PMU1 5P85DE ln.yaml b/resources/units/ground_units/S-300PMU1 5P85DE ln.yaml new file mode 100644 index 00000000..b3265749 --- /dev/null +++ b/resources/units/ground_units/S-300PMU1 5P85DE ln.yaml @@ -0,0 +1,3 @@ +price: 28 +variants: + SAM SA-20 S-300PMU1 LN 5P85DE: null diff --git a/resources/units/ground_units/S-300PMU1 64N6E sr.yaml b/resources/units/ground_units/S-300PMU1 64N6E sr.yaml new file mode 100644 index 00000000..fe3a4d21 --- /dev/null +++ b/resources/units/ground_units/S-300PMU1 64N6E sr.yaml @@ -0,0 +1,3 @@ +price: 38 +variants: + SAM SA-20 S-300PMU1 SR 64N6E: null diff --git a/resources/units/ground_units/S-300PMU2 54K6E2 cp.yaml b/resources/units/ground_units/S-300PMU2 54K6E2 cp.yaml new file mode 100644 index 00000000..d6be646d --- /dev/null +++ b/resources/units/ground_units/S-300PMU2 54K6E2 cp.yaml @@ -0,0 +1,3 @@ +price: 27 +variants: + SAM SA-20B S-300PMU2 CP 54K6E2: null diff --git a/resources/units/ground_units/S-300PMU2 5P85SE2 ln.yaml b/resources/units/ground_units/S-300PMU2 5P85SE2 ln.yaml new file mode 100644 index 00000000..6267e859 --- /dev/null +++ b/resources/units/ground_units/S-300PMU2 5P85SE2 ln.yaml @@ -0,0 +1,3 @@ +price: 30 +variants: + SAM SA-20B S-300PMU2 LN 5P85SE2: null diff --git a/resources/units/ground_units/S-300PMU2 64H6E2 sr.yaml b/resources/units/ground_units/S-300PMU2 64H6E2 sr.yaml new file mode 100644 index 00000000..27908e85 --- /dev/null +++ b/resources/units/ground_units/S-300PMU2 64H6E2 sr.yaml @@ -0,0 +1,3 @@ +price: 40 +variants: + SAM SA-20B S-300PMU2 SR 64N6E2: null diff --git a/resources/units/ground_units/S-300PMU2 92H6E tr.yaml b/resources/units/ground_units/S-300PMU2 92H6E tr.yaml new file mode 100644 index 00000000..a2307034 --- /dev/null +++ b/resources/units/ground_units/S-300PMU2 92H6E tr.yaml @@ -0,0 +1,3 @@ +price: 33 +variants: + SAM SA-20B S-300PMU2 TR 92H6E(truck): null diff --git a/resources/units/ground_units/S-300PS 30N6 TRAILER tr.yaml b/resources/units/ground_units/S-300PS 30N6 TRAILER tr.yaml new file mode 100644 index 00000000..f756de13 --- /dev/null +++ b/resources/units/ground_units/S-300PS 30N6 TRAILER tr.yaml @@ -0,0 +1,3 @@ +price: 26 +variants: + SAM SA-10B S-300PS 30N6 TR: null diff --git a/resources/units/ground_units/S-300PS 40B6M tr.yaml b/resources/units/ground_units/S-300PS 40B6M tr.yaml new file mode 100644 index 00000000..bd901e1e --- /dev/null +++ b/resources/units/ground_units/S-300PS 40B6M tr.yaml @@ -0,0 +1,3 @@ +price: 24 +variants: + 'SAM SA-10 S-300 "Grumble" Flap Lid TR ': null diff --git a/resources/units/ground_units/S-300PS 40B6MD sr.yaml b/resources/units/ground_units/S-300PS 40B6MD sr.yaml new file mode 100644 index 00000000..334d80a1 --- /dev/null +++ b/resources/units/ground_units/S-300PS 40B6MD sr.yaml @@ -0,0 +1,3 @@ +price: 30 +variants: + SAM SA-10 S-300 "Grumble" Clam Shell SR: null diff --git a/resources/units/ground_units/S-300PS 54K6 cp.yaml b/resources/units/ground_units/S-300PS 54K6 cp.yaml new file mode 100644 index 00000000..52adb681 --- /dev/null +++ b/resources/units/ground_units/S-300PS 54K6 cp.yaml @@ -0,0 +1,3 @@ +price: 18 +variants: + 'SAM SA-10 S-300 "Grumble" C2 ': null diff --git a/resources/units/ground_units/S-300PS 5P85C ln.yaml b/resources/units/ground_units/S-300PS 5P85C ln.yaml new file mode 100644 index 00000000..f6135846 --- /dev/null +++ b/resources/units/ground_units/S-300PS 5P85C ln.yaml @@ -0,0 +1,3 @@ +price: 22 +variants: + SAM SA-10 S-300 "Grumble" TEL D: null diff --git a/resources/units/ground_units/S-300PS 5P85CE ln.yaml b/resources/units/ground_units/S-300PS 5P85CE ln.yaml new file mode 100644 index 00000000..d8ce6c77 --- /dev/null +++ b/resources/units/ground_units/S-300PS 5P85CE ln.yaml @@ -0,0 +1,3 @@ +price: 24 +variants: + SAM SA-10 (5V55RUD) S-300PS LN 5P85CE: null diff --git a/resources/units/ground_units/S-300PS 5P85D ln.yaml b/resources/units/ground_units/S-300PS 5P85D ln.yaml new file mode 100644 index 00000000..31b67a7d --- /dev/null +++ b/resources/units/ground_units/S-300PS 5P85D ln.yaml @@ -0,0 +1,3 @@ +price: 22 +variants: + SAM SA-10 S-300 "Grumble" TEL C: null diff --git a/resources/units/ground_units/S-300PS 5P85DE ln.yaml b/resources/units/ground_units/S-300PS 5P85DE ln.yaml new file mode 100644 index 00000000..f4a501be --- /dev/null +++ b/resources/units/ground_units/S-300PS 5P85DE ln.yaml @@ -0,0 +1,3 @@ +price: 24 +variants: + SAM SA-10 (5V55RUD) S-300PS LN 5P85DE: null diff --git a/resources/units/ground_units/S-300PS 5P85SE_mod ln.yaml b/resources/units/ground_units/S-300PS 5P85SE_mod ln.yaml new file mode 100644 index 00000000..4ed6a9da --- /dev/null +++ b/resources/units/ground_units/S-300PS 5P85SE_mod ln.yaml @@ -0,0 +1,3 @@ +price: 24 +variants: + 'SAM SA-10B S-300PS 5P85SE LN ': null diff --git a/resources/units/ground_units/S-300PS 5P85SU_mod ln.yaml b/resources/units/ground_units/S-300PS 5P85SU_mod ln.yaml new file mode 100644 index 00000000..2e3015da --- /dev/null +++ b/resources/units/ground_units/S-300PS 5P85SU_mod ln.yaml @@ -0,0 +1,3 @@ +price: 24 +variants: + 'SAM SA-10B S-300PS 5P85SU LN ': null diff --git a/resources/units/ground_units/S-300PS 64H6E TRAILER sr.yaml b/resources/units/ground_units/S-300PS 64H6E TRAILER sr.yaml new file mode 100644 index 00000000..f89c2004 --- /dev/null +++ b/resources/units/ground_units/S-300PS 64H6E TRAILER sr.yaml @@ -0,0 +1,3 @@ +price: 32 +variants: + SAM SA-10B S-300PS 64H6E SR: null diff --git a/resources/units/ground_units/S-300PS 64H6E sr.yaml b/resources/units/ground_units/S-300PS 64H6E sr.yaml new file mode 100644 index 00000000..03413b86 --- /dev/null +++ b/resources/units/ground_units/S-300PS 64H6E sr.yaml @@ -0,0 +1,3 @@ +price: 30 +variants: + 'SAM SA-10 S-300 "Grumble" Big Bird SR ': null diff --git a/resources/units/ground_units/S-300PS SA-10B 40B6M MAST tr.yaml b/resources/units/ground_units/S-300PS SA-10B 40B6M MAST tr.yaml new file mode 100644 index 00000000..78ca3b22 --- /dev/null +++ b/resources/units/ground_units/S-300PS SA-10B 40B6M MAST tr.yaml @@ -0,0 +1,3 @@ +price: 26 +variants: + SAM SA-10B S-300PS 40B6M TR: null diff --git a/resources/units/ground_units/S-300PS SA-10B 40B6MD MAST sr.yaml b/resources/units/ground_units/S-300PS SA-10B 40B6MD MAST sr.yaml new file mode 100644 index 00000000..9bc85e3c --- /dev/null +++ b/resources/units/ground_units/S-300PS SA-10B 40B6MD MAST sr.yaml @@ -0,0 +1,3 @@ +price: 32 +variants: + SAM SA-10B S-300PS 40B6MD SR: null diff --git a/resources/units/ground_units/S-300PS SA-10B 54K6 cp.yaml b/resources/units/ground_units/S-300PS SA-10B 54K6 cp.yaml new file mode 100644 index 00000000..43914c62 --- /dev/null +++ b/resources/units/ground_units/S-300PS SA-10B 54K6 cp.yaml @@ -0,0 +1,3 @@ +price: 20 +variants: + SAM SA-10B S-300PS 54K6 CP: null diff --git a/resources/units/ground_units/S-300V 9A82 ln.yaml b/resources/units/ground_units/S-300V 9A82 ln.yaml new file mode 100644 index 00000000..dda03c0b --- /dev/null +++ b/resources/units/ground_units/S-300V 9A82 ln.yaml @@ -0,0 +1,3 @@ +price: 26 +variants: + SAM SA-12 S-300V 9A82 LN: null diff --git a/resources/units/ground_units/S-300V 9A83 ln.yaml b/resources/units/ground_units/S-300V 9A83 ln.yaml new file mode 100644 index 00000000..7f8cf75a --- /dev/null +++ b/resources/units/ground_units/S-300V 9A83 ln.yaml @@ -0,0 +1,3 @@ +price: 26 +variants: + SAM SA-12 S-300V 9A83 LN: null diff --git a/resources/units/ground_units/S-300V 9S15 sr.yaml b/resources/units/ground_units/S-300V 9S15 sr.yaml new file mode 100644 index 00000000..fa5cec6c --- /dev/null +++ b/resources/units/ground_units/S-300V 9S15 sr.yaml @@ -0,0 +1,3 @@ +price: 34 +variants: + SAM SA-12 S-300V 9S15 SR: null diff --git a/resources/units/ground_units/S-300V 9S19 sr.yaml b/resources/units/ground_units/S-300V 9S19 sr.yaml new file mode 100644 index 00000000..32e89491 --- /dev/null +++ b/resources/units/ground_units/S-300V 9S19 sr.yaml @@ -0,0 +1,3 @@ +price: 34 +variants: + SAM SA-12 S-300V 9S19 SR: null diff --git a/resources/units/ground_units/S-300V 9S32 tr.yaml b/resources/units/ground_units/S-300V 9S32 tr.yaml new file mode 100644 index 00000000..4b298ff6 --- /dev/null +++ b/resources/units/ground_units/S-300V 9S32 tr.yaml @@ -0,0 +1,3 @@ +price: 28 +variants: + SAM SA-12 S-300V 9S32 TR: null diff --git a/resources/units/ground_units/S-300V 9S457 cp.yaml b/resources/units/ground_units/S-300V 9S457 cp.yaml new file mode 100644 index 00000000..0f4a002e --- /dev/null +++ b/resources/units/ground_units/S-300V 9S457 cp.yaml @@ -0,0 +1,3 @@ +price: 22 +variants: + SAM SA-12 S-300V 9S457 CP: null diff --git a/resources/units/ground_units/S-300VM 9A82ME ln.yaml b/resources/units/ground_units/S-300VM 9A82ME ln.yaml new file mode 100644 index 00000000..ced299fb --- /dev/null +++ b/resources/units/ground_units/S-300VM 9A82ME ln.yaml @@ -0,0 +1,3 @@ +price: 32 +variants: + SAM SA-23 S-300VM 9A82ME LN: null diff --git a/resources/units/ground_units/S-300VM 9A83ME ln.yaml b/resources/units/ground_units/S-300VM 9A83ME ln.yaml new file mode 100644 index 00000000..bf0001bf --- /dev/null +++ b/resources/units/ground_units/S-300VM 9A83ME ln.yaml @@ -0,0 +1,3 @@ +price: 32 +variants: + SAM SA-23 S-300VM 9A83ME LN: null diff --git a/resources/units/ground_units/S-300VM 9S15M2 sr.yaml b/resources/units/ground_units/S-300VM 9S15M2 sr.yaml new file mode 100644 index 00000000..8454b310 --- /dev/null +++ b/resources/units/ground_units/S-300VM 9S15M2 sr.yaml @@ -0,0 +1,3 @@ +price: 45 +variants: + SAM SA-23 S-300VM 9S15M2 SR: null diff --git a/resources/units/ground_units/S-300VM 9S19M2 sr.yaml b/resources/units/ground_units/S-300VM 9S19M2 sr.yaml new file mode 100644 index 00000000..d68373c3 --- /dev/null +++ b/resources/units/ground_units/S-300VM 9S19M2 sr.yaml @@ -0,0 +1,3 @@ +price: 45 +variants: + SAM SA-23 S-300VM 9S19M2 SR: null diff --git a/resources/units/ground_units/S-300VM 9S32ME tr.yaml b/resources/units/ground_units/S-300VM 9S32ME tr.yaml new file mode 100644 index 00000000..8418e319 --- /dev/null +++ b/resources/units/ground_units/S-300VM 9S32ME tr.yaml @@ -0,0 +1,3 @@ +price: 35 +variants: + SAM SA-23 S-300VM 9S32ME TR: null diff --git a/resources/units/ground_units/S-300VM 9S457ME cp.yaml b/resources/units/ground_units/S-300VM 9S457ME cp.yaml new file mode 100644 index 00000000..1d8b2db0 --- /dev/null +++ b/resources/units/ground_units/S-300VM 9S457ME cp.yaml @@ -0,0 +1,3 @@ +price: 30 +variants: + SAM SA-23 S-300VM 9S457ME CP: null diff --git a/resources/units/ground_units/S-60_Type59_Artillery.yaml b/resources/units/ground_units/S-60_Type59_Artillery.yaml new file mode 100644 index 00000000..5a53198d --- /dev/null +++ b/resources/units/ground_units/S-60_Type59_Artillery.yaml @@ -0,0 +1,14 @@ +class: SHORADS +description: "57 mm AZP S-60 (Russian: \u0410\u0432\u0442\u043E\u043C\u0430\u0442\u0438\ + \u0447\u0435\u0441\u043A\u0430\u044F \u0437\u0435\u043D\u0438\u0442\u043D\u0430\u044F\ + \ \u043F\u0443\u0448\u043A\u0430 \u0421-60, abbrev. \u0410\u0417\u041F (AZP); literally:\ + \ Automatic anti-aircraft gun S-60) is a Soviet towed, road-transportable, short-\ + \ to medium-range, single-barrel anti-aircraft gun from the 1950s. The gun was extensively\ + \ used in Warsaw Pact, Middle Eastern and South-East Asian countries." +introduced: 1950 +manufacturer: TsAKB +origin: Soviet Union +price: 8 +role: Anti-Aircraft Gun/Anti-Tank Gun +variants: + S-60 57mm: {} diff --git a/resources/units/ground_units/SA-11 Buk CC 9S470M1.yaml b/resources/units/ground_units/SA-11 Buk CC 9S470M1.yaml new file mode 100644 index 00000000..0cd919b4 --- /dev/null +++ b/resources/units/ground_units/SA-11 Buk CC 9S470M1.yaml @@ -0,0 +1,3 @@ +price: 25 +variants: + 'SAM SA-11 Buk "Gadfly" C2 ': null diff --git a/resources/units/ground_units/SA-11 Buk LN 9A310M1.yaml b/resources/units/ground_units/SA-11 Buk LN 9A310M1.yaml new file mode 100644 index 00000000..6523e9b8 --- /dev/null +++ b/resources/units/ground_units/SA-11 Buk LN 9A310M1.yaml @@ -0,0 +1,3 @@ +price: 30 +variants: + SAM SA-11 Buk "Gadfly" Fire Dome TEL: null diff --git a/resources/units/ground_units/SA-11 Buk SR 9S18M1.yaml b/resources/units/ground_units/SA-11 Buk SR 9S18M1.yaml new file mode 100644 index 00000000..6ccc9b69 --- /dev/null +++ b/resources/units/ground_units/SA-11 Buk SR 9S18M1.yaml @@ -0,0 +1,3 @@ +price: 28 +variants: + SAM SA-11 Buk "Gadfly" Snow Drift SR: null diff --git a/resources/units/ground_units/SA-17 Buk M1-2 LN 9A310M1-2.yaml b/resources/units/ground_units/SA-17 Buk M1-2 LN 9A310M1-2.yaml new file mode 100644 index 00000000..17908128 --- /dev/null +++ b/resources/units/ground_units/SA-17 Buk M1-2 LN 9A310M1-2.yaml @@ -0,0 +1,3 @@ +price: 40 +variants: + SAM SA-17 Buk M1-2 LN 9A310M1-2: null diff --git a/resources/units/ground_units/SA-18 Igla comm.yaml b/resources/units/ground_units/SA-18 Igla comm.yaml new file mode 100644 index 00000000..761dd706 --- /dev/null +++ b/resources/units/ground_units/SA-18 Igla comm.yaml @@ -0,0 +1,3 @@ +price: 8 +variants: + MANPADS SA-18 Igla "Grouse" C2: null diff --git a/resources/units/ground_units/SA-18 Igla manpad.yaml b/resources/units/ground_units/SA-18 Igla manpad.yaml new file mode 100644 index 00000000..e0795266 --- /dev/null +++ b/resources/units/ground_units/SA-18 Igla manpad.yaml @@ -0,0 +1,5 @@ +class: MANPADS +spawn_weight: 1 +price: 0 +variants: + MANPADS SA-18 Igla "Grouse": null diff --git a/resources/units/ground_units/SA-18 Igla-S comm.yaml b/resources/units/ground_units/SA-18 Igla-S comm.yaml new file mode 100644 index 00000000..95254fa8 --- /dev/null +++ b/resources/units/ground_units/SA-18 Igla-S comm.yaml @@ -0,0 +1,3 @@ +price: 8 +variants: + MANPADS SA-18 Igla-S "Grouse" C2: null diff --git a/resources/units/ground_units/SA-18 Igla-S manpad.yaml b/resources/units/ground_units/SA-18 Igla-S manpad.yaml new file mode 100644 index 00000000..53271ec5 --- /dev/null +++ b/resources/units/ground_units/SA-18 Igla-S manpad.yaml @@ -0,0 +1,5 @@ +class: MANPADS +spawn_weight: 1 +price: 0 +variants: + MANPADS SA-18 Igla-S "Grouse": null diff --git a/resources/units/ground_units/SA-8 Osa LD 9T217.yaml b/resources/units/ground_units/SA-8 Osa LD 9T217.yaml new file mode 100644 index 00000000..64ecfab3 --- /dev/null +++ b/resources/units/ground_units/SA-8 Osa LD 9T217.yaml @@ -0,0 +1,11 @@ +description: "The 9K33 Osa (Russian: 9\u041A33 \xAB\u041E\u0441\u0430\xBB, literally\ + \ \"wasp\"; NATO reporting name SA-8 Gecko) is a highly mobile, low-altitude, short-range\ + \ tactical surface-to-air missile system developed in the Soviet Union in the 1960s\ + \ and fielded in 1972. Its export version name is Romb." +introduced: 1981 +manufacturer: Ulyanovsk +origin: USSR/Russia +price: 22 +role: Self-Propelled Surface-to-Air Missile Launcher +variants: + SA-13 Gopher (9K35 Strela-10M3): {} diff --git a/resources/units/ground_units/SAU 2-C9.yaml b/resources/units/ground_units/SAU 2-C9.yaml new file mode 100644 index 00000000..58cb5b0e --- /dev/null +++ b/resources/units/ground_units/SAU 2-C9.yaml @@ -0,0 +1,17 @@ +class: Artillery +description: "The 2S9 NONA (\u041D\u043E\u0432\u0435\u0439\u0448\u0435\u0435 \u041E\ + \u0440\u0443\u0434\u0438\u0435 \u041D\u0430\u0437\u0435\u043C\u043D\u043E\u0439\ + \ \u0410\u0440\u0442\u0438\u043B\u0435\u0440\u0438\u0438 - Newest Ordnance of Ground\ + \ Artillery) is an extremely light-weight self-propelled and air-droppable 120 mm\ + \ gun-mortar designed in the Soviet Union, which entered service in 1981. The 2S9\ + \ chassis is designated the S-120 and based on the aluminium hull of the BTR-D airborne\ + \ multi-purpose tracked armoured personnel carrier. More generally, the 120 mm mortar\ + \ is referred to as the Nona, with the 2S9 also known as the Nona-S. Although no\ + \ figures have been released, it is estimated that well over 1,000 2S9 were built." +introduced: 1981 +manufacturer: Motovilikha +origin: USSR/Russia +price: 12 +role: Self-Propelled Mortar +variants: + 2S9 Nona-S: {} diff --git a/resources/units/ground_units/SAU Akatsia.yaml b/resources/units/ground_units/SAU Akatsia.yaml new file mode 100644 index 00000000..5e538338 --- /dev/null +++ b/resources/units/ground_units/SAU Akatsia.yaml @@ -0,0 +1,10 @@ +class: Artillery +description: "The SO-152 (Russian: \u0421\u041E-152) is a Soviet 152.4 mm self-propelled\ + \ gun developed in 1968. It was a response to the American 155 mm M109. " +introduced: 1971 +manufacturer: Uraltransmash +origin: USSR/Russia +price: 24 +role: Self-Propelled Gun +variants: + 2S3 Akatsiya: {} diff --git a/resources/units/ground_units/SAU Gvozdika.yaml b/resources/units/ground_units/SAU Gvozdika.yaml new file mode 100644 index 00000000..f7498890 --- /dev/null +++ b/resources/units/ground_units/SAU Gvozdika.yaml @@ -0,0 +1,11 @@ +class: Artillery +description: "The 2S1 Gvozdika (Russian: 2\u04211 \xAB\u0413\u0432\u043E\u0437\u0434\ + \u0438\u043A\u0430\xBB, \"Carnation\") is a Soviet self-propelled howitzer based\ + \ on the MT-LBu multi-purpose chassis, mounting a 122 mm 2A18 howitzer. " +introduced: 1972 +manufacturer: Kharkiv +origin: USSR/Russia +price: 18 +role: Self-Propelled Gun +variants: + 2S1 Gvozdika: {} diff --git a/resources/units/ground_units/SAU Msta.yaml b/resources/units/ground_units/SAU Msta.yaml new file mode 100644 index 00000000..ab2d0e6f --- /dev/null +++ b/resources/units/ground_units/SAU Msta.yaml @@ -0,0 +1,12 @@ +class: Artillery +description: "The 2S19 \"Msta-S\" (Russian: \u041C\u0441\u0442\u0430, after the Msta\ + \ River) is a 152.4 mm self-propelled howitzer designed by Soviet Union, which entered\ + \ service in 1989 as the successor to the 2S3 Akatsiya. The vehicle is based on\ + \ the T-80 tank hull, but is powered by the T-72's diesel engine." +introduced: 1989 +manufacturer: Uraltransmash +origin: USSR/Russia +price: 30 +role: Self-Propelled Gun +variants: + 2S19 Msta-S: {} diff --git a/resources/units/ground_units/SEPAR.yaml b/resources/units/ground_units/SEPAR.yaml new file mode 100644 index 00000000..395f8c30 --- /dev/null +++ b/resources/units/ground_units/SEPAR.yaml @@ -0,0 +1,11 @@ +class: Recon +description: The AMX-10 RC is a reconnaissance vehicle built by GIAT. Over 240 are + in service in the French Army. In addition, 108 vehicles were sold to Morocco and + 12 to Qatar. RC stands for Roues-Canon, or wheeled gun. +introduced: 1970 +manufacturer: GIAT Industries +origin: France +price: 12 +role: Recon Vehicle +variants: + "Leclerc S\xE9ries 2": {} diff --git a/resources/units/ground_units/SNR_75V.yaml b/resources/units/ground_units/SNR_75V.yaml new file mode 100644 index 00000000..ee18aa0c --- /dev/null +++ b/resources/units/ground_units/SNR_75V.yaml @@ -0,0 +1,3 @@ +price: 12 +variants: + SAM SA-2 S-75 "Fan Song" TR: null diff --git a/resources/units/ground_units/S_75M_Volhov.yaml b/resources/units/ground_units/S_75M_Volhov.yaml new file mode 100644 index 00000000..8918bfe4 --- /dev/null +++ b/resources/units/ground_units/S_75M_Volhov.yaml @@ -0,0 +1,3 @@ +price: 8 +variants: + SAM SA-2 S-75 "Guideline" LN: null diff --git a/resources/units/ground_units/Sd_Kfz_2.yaml b/resources/units/ground_units/Sd_Kfz_2.yaml new file mode 100644 index 00000000..bff8556e --- /dev/null +++ b/resources/units/ground_units/Sd_Kfz_2.yaml @@ -0,0 +1,3 @@ +price: 1 +variants: + LUV Kettenrad: null diff --git a/resources/units/ground_units/Sd_Kfz_234_2_Puma.yaml b/resources/units/ground_units/Sd_Kfz_234_2_Puma.yaml new file mode 100644 index 00000000..ed52ad4c --- /dev/null +++ b/resources/units/ground_units/Sd_Kfz_234_2_Puma.yaml @@ -0,0 +1,12 @@ +class: Recon +description: The Sd.Kfz. 234 (Sonderkraftfahrzeug 234, Special Purpose Vehicle 234), + was a family of armoured cars designed and built in Germany during World War II. + The vehicles were lightly armoured, armed with a 20, 50 or 75 mm main gun, and powered + by a Tatra V12 diesel engine. +introduced: 1943 +manufacturer: "Tatra/B\xFCssing/Daimler-Benz/Schichau" +origin: Germany +price: 8 +role: Recon Vehicle +variants: + Sd.Kfz.234/2 Puma: {} diff --git a/resources/units/ground_units/Sd_Kfz_251.yaml b/resources/units/ground_units/Sd_Kfz_251.yaml new file mode 100644 index 00000000..07461356 --- /dev/null +++ b/resources/units/ground_units/Sd_Kfz_251.yaml @@ -0,0 +1,14 @@ +class: APC +description: The Sd.Kfz. 251 (Sonderkraftfahrzeug 251) half-track was a World War + II German armored personnel carrier designed by the Hanomag company, based on its + earlier, unarmored Sd.Kfz. 11 vehicle. The Sd.Kfz. 251 was designed to transport + the Panzergrenadier (German mechanized infantry) into battle. Sd.Kfz. 251s were + the most widely produced German half-tracks of the war, with at least 15,252 vehicles + and variants produced by seven manufacturers. +introduced: 1939 +manufacturer: Hanomag +origin: Germany +price: 4 +role: Armoured Personnel Carrier +variants: + Sd.Kfz.251 "Hanomag": {} diff --git a/resources/units/ground_units/Sd_Kfz_7.yaml b/resources/units/ground_units/Sd_Kfz_7.yaml new file mode 100644 index 00000000..c8a14dcd --- /dev/null +++ b/resources/units/ground_units/Sd_Kfz_7.yaml @@ -0,0 +1,9 @@ +class: Logistics +description: The Carrier Sd.Kfz.7 Tractor was a Artillery tow truck. +introduced: 1938 +manufacturer: Kraus Maffei +origin: Germany +price: 1 +role: Tracked Cargo Transporter +variants: + Sd.Kfz.7 Tractor: {} diff --git a/resources/units/ground_units/Smerch.yaml b/resources/units/ground_units/Smerch.yaml new file mode 100644 index 00000000..d37007e1 --- /dev/null +++ b/resources/units/ground_units/Smerch.yaml @@ -0,0 +1,12 @@ +class: Artillery +description: "The BM-30 Smerch (Russian: \u0421\u043C\u0435\u0440\u0447, \"tornado\"\ + , \"whirlwind\"), 9K58 Smerch or 9A52-2 Smerch-M is a Soviet heavy multiple rocket\ + \ launcher. The system is intended to defeat personnel, armored, and soft targets\ + \ in concentration areas, artillery batteries, command posts and ammunition depots." +introduced: 1989 +manufacturer: Splav +origin: USSR/Russia +price: 60 +role: Multiple-Launch Rocket System +variants: + BM-30 Smerch (9M55K Cluster Rockets): {} diff --git a/resources/units/ground_units/Smerch_HE.yaml b/resources/units/ground_units/Smerch_HE.yaml new file mode 100644 index 00000000..e8b25887 --- /dev/null +++ b/resources/units/ground_units/Smerch_HE.yaml @@ -0,0 +1,12 @@ +class: Artillery +description: "The BM-30 Smerch (Russian: \u0421\u043C\u0435\u0440\u0447, \"tornado\"\ + , \"whirlwind\"), 9K58 Smerch or 9A52-2 Smerch-M is a Soviet heavy multiple rocket\ + \ launcher. The system is intended to defeat personnel, armored, and soft targets\ + \ in concentration areas, artillery batteries, command posts and ammunition depots." +introduced: 1989 +manufacturer: Splav +origin: USSR/Russia +price: 40 +role: Multiple-Launch Rocket System +variants: + BM-30 Smerch (9M55K5 HE Rockets): {} diff --git a/resources/units/ground_units/Soldier AK.yaml b/resources/units/ground_units/Soldier AK.yaml new file mode 100644 index 00000000..3339d9c4 --- /dev/null +++ b/resources/units/ground_units/Soldier AK.yaml @@ -0,0 +1,5 @@ +class: Infantry +price: 0 +spawn_weight: 5 +variants: + Infantry AK-74: null diff --git a/resources/units/ground_units/Soldier M249.yaml b/resources/units/ground_units/Soldier M249.yaml new file mode 100644 index 00000000..d2966bf2 --- /dev/null +++ b/resources/units/ground_units/Soldier M249.yaml @@ -0,0 +1,5 @@ +class: Infantry +price: 0 +spawn_weight: 1 +variants: + Infantry M249: null diff --git a/resources/units/ground_units/Soldier M4 GRG.yaml b/resources/units/ground_units/Soldier M4 GRG.yaml new file mode 100644 index 00000000..8c13977e --- /dev/null +++ b/resources/units/ground_units/Soldier M4 GRG.yaml @@ -0,0 +1,5 @@ +class: Infantry +price: 0 +spawn_weight: 4 +variants: + Infantry M4 Georgia: null diff --git a/resources/units/ground_units/Soldier M4.yaml b/resources/units/ground_units/Soldier M4.yaml new file mode 100644 index 00000000..7d6f0d56 --- /dev/null +++ b/resources/units/ground_units/Soldier M4.yaml @@ -0,0 +1,5 @@ +class: Infantry +price: 0 +spawn_weight: 5 +variants: + Infantry M4: null diff --git a/resources/units/ground_units/Soldier RPG.yaml b/resources/units/ground_units/Soldier RPG.yaml new file mode 100644 index 00000000..dbceda20 --- /dev/null +++ b/resources/units/ground_units/Soldier RPG.yaml @@ -0,0 +1,5 @@ +class: Infantry +price: 0 +spawn_weight: 1 +variants: + Infantry RPG: null diff --git a/resources/units/ground_units/Soldier stinger.yaml b/resources/units/ground_units/Soldier stinger.yaml new file mode 100644 index 00000000..7fcd88e6 --- /dev/null +++ b/resources/units/ground_units/Soldier stinger.yaml @@ -0,0 +1,5 @@ +class: MANPADS +spawn_weight: 1 +price: 0 +variants: + MANPADS Stinger: null diff --git a/resources/units/ground_units/SpGH_Dana.yaml b/resources/units/ground_units/SpGH_Dana.yaml new file mode 100644 index 00000000..6b82892e --- /dev/null +++ b/resources/units/ground_units/SpGH_Dana.yaml @@ -0,0 +1,11 @@ +class: Artillery +description: "The DANA (the name being derived from \"d\u011Blo automobiln\xED nab\xED\ + jen\xE9 automaticky\" (gun on truck loaded automatically)) is a wheeled self-propelled\ + \ artillery piece." +introduced: 1980 +manufacturer: ZTS +origin: Czechoslovakia +price: 26 +role: Self-Propelled Gun +variants: + SpGH DANA: {} diff --git a/resources/units/ground_units/Stinger comm dsr.yaml b/resources/units/ground_units/Stinger comm dsr.yaml new file mode 100644 index 00000000..a5a2cecb --- /dev/null +++ b/resources/units/ground_units/Stinger comm dsr.yaml @@ -0,0 +1,3 @@ +price: 4 +variants: + MANPADS Stinger C2 Desert: null diff --git a/resources/units/ground_units/Stinger comm.yaml b/resources/units/ground_units/Stinger comm.yaml new file mode 100644 index 00000000..b09015b9 --- /dev/null +++ b/resources/units/ground_units/Stinger comm.yaml @@ -0,0 +1,3 @@ +price: 4 +variants: + MANPADS Stinger C2: null diff --git a/resources/units/ground_units/Strela-1 9P31.yaml b/resources/units/ground_units/Strela-1 9P31.yaml new file mode 100644 index 00000000..196a9694 --- /dev/null +++ b/resources/units/ground_units/Strela-1 9P31.yaml @@ -0,0 +1,14 @@ +class: SHORADS +description: "The 9K31 Strela-1 (Russian: 9\u041A31 \xAB\u0421\u0442\u0440\u0435\u043B\ + \u0430-1\xBB; English: arrow) is a highly mobile, short-range, low altitude infra-red\ + \ guided surface-to-air missile system. Originally developed by the Soviet Union\ + \ under the GRAU designation 9K31, it is commonly known by its NATO reporting name,\ + \ SA-9 \"Gaskin\". The system consists of a BRDM-2 amphibious vehicle, mounting\ + \ two pairs of ready-to-fire 9M31 missiles." +introduced: 1966 +manufacturer: Soviet state factories +origin: USSR/Russia +price: 12 +role: Self-Propelled Anti-Aircraft System +variants: + SA-9 Strela: {} diff --git a/resources/units/ground_units/Strela-10M3.yaml b/resources/units/ground_units/Strela-10M3.yaml new file mode 100644 index 00000000..153901b0 --- /dev/null +++ b/resources/units/ground_units/Strela-10M3.yaml @@ -0,0 +1,13 @@ +class: SHORADS +description: "The 9K35 Strela-10 (Russian: 9\u041A35 \xAB\u0421\u0442\u0440\u0435\u043B\ + \u0430-10\xBB; English: arrow) is a highly mobile, short-range surface-to-air missile\ + \ system. It is visually aimed, and utilizes optical/infrared-guidance. The system\ + \ is primarily intended to engage low-altitude threats, such as helicopters. \"\ + 9K35\" is its GRAU designation; its NATO reporting name is SA-13 \"Gopher\"." +introduced: 1981 +manufacturer: Ulyanovsk +origin: USSR/Russia +price: 16 +role: Self-Propelled Surface-to-Air Missile Launcher +variants: + SA-13 Gopher (9K35 Strela-10M3): {} diff --git a/resources/units/ground_units/Stug_III.yaml b/resources/units/ground_units/Stug_III.yaml new file mode 100644 index 00000000..8f4f0f10 --- /dev/null +++ b/resources/units/ground_units/Stug_III.yaml @@ -0,0 +1,16 @@ +class: ATGM +description: "The Sturmgesch\xFCtz III (StuG III) assault gun was Germany's most-produced\ + \ fully tracked armoured fighting vehicle during World War II, and second-most produced\ + \ German armored combat vehicle of any type after the Sd.Kfz. 251 half-track. It\ + \ was built on a slightly modified Panzer III chassis, replacing the turret with\ + \ an armored, fixed superstructure mounting a more powerful gun. Initially intended\ + \ as a mobile assault gun for direct-fire support for infantry, the StuG III was\ + \ continually modified, and much like the later Jagdpanzer vehicles, was employed\ + \ as a tank destroyer." +introduced: 1942 +manufacturer: Alkett/MIAG +origin: Germany +price: 12 +role: Assault Gun/Tank Destroyer +variants: + "Sturmgesch\xFCtz III Ausf. G": {} diff --git a/resources/units/ground_units/Stug_IV.yaml b/resources/units/ground_units/Stug_IV.yaml new file mode 100644 index 00000000..44414471 --- /dev/null +++ b/resources/units/ground_units/Stug_IV.yaml @@ -0,0 +1,15 @@ +class: ATGM +description: "The Sturmgesch\xFCtz IV (StuG IV) (Sd.Kfz. 167) was a German assault\ + \ gun variant of the Panzer IV used in the latter part of the Second World War.\ + \ It was identical in role and concept to the highly successful StuG III assault\ + \ gun variant of the Panzer III. Both StuG models were given an exclusively tank\ + \ destroyer role in German formations and tactical planning in the last two years\ + \ of the war, greatly augmenting the capability of the dwindling tank force available\ + \ to the German army on the Eastern and Western fronts." +introduced: 1943 +manufacturer: Krupp +origin: Germany +price: 14 +role: Assault Gun/Tank Destroyer +variants: + "Sturmgesch\xFCtz IV": {} diff --git a/resources/units/ground_units/SturmPzIV.yaml b/resources/units/ground_units/SturmPzIV.yaml new file mode 100644 index 00000000..9a9b88e7 --- /dev/null +++ b/resources/units/ground_units/SturmPzIV.yaml @@ -0,0 +1,15 @@ +class: Tank +description: "The Sturmpanzer (also known as Sturmpanzer 43 or Sd.Kfz. 166) was a\ + \ German armoured infantry support gun based on the Panzer IV chassis used in the\ + \ Second World War. It was used at the Battles of Kursk, Anzio, Normandy, and was\ + \ deployed in the Warsaw Uprising. It was known by the nickname Brummb\xE4r (German:\ + \ \"Grouch\") by Allied intelligence, a name which was not used by the Germans.\ + \ German soldiers nicknamed it the \"Stupa\", a contraction of the term Sturmpanzer.\ + \ Just over 300 vehicles were built and they were assigned to four independent battalions." +introduced: 1943 +manufacturer: Vienna Arsenal +origin: Germany +price: 10 +role: Self-Propelled Gun +variants: + "Sturmpanzer IV Brummb\xE4r": {} diff --git a/resources/units/ground_units/T-55.yaml b/resources/units/ground_units/T-55.yaml new file mode 100644 index 00000000..6d8af51e --- /dev/null +++ b/resources/units/ground_units/T-55.yaml @@ -0,0 +1,17 @@ +class: Tank +description: The T-54/55 series was the most-produced tank in history. Estimated production + numbers for the series range from 86,000 to 100,000. They were replaced by the T-62, + T-64, T-72, T-80 and T-90 tanks in the Soviet and Russian armies, but remain in + use by up to 50 other armies worldwide, some having received sophisticated retrofitting. + During the Cold War, Soviet tanks never directly faced their NATO adversaries in + combat in Europe. However, the T-54/55's first appearance in the West around the + period of the 1950s (then the beginning of the Cold War) spurred the United Kingdom + to develop a new tank gun, the Royal Ordnance L7, and the United States to develop + the M60 Patton. +introduced: 1963 +manufacturer: Kharkiv/UralVagonZavod +origin: USSR/Russia +price: 18 +role: Main Battle Tank +variants: + T-55A: {} diff --git a/resources/units/ground_units/T-72B.yaml b/resources/units/ground_units/T-72B.yaml new file mode 100644 index 00000000..e1de7126 --- /dev/null +++ b/resources/units/ground_units/T-72B.yaml @@ -0,0 +1,14 @@ +class: Tank +description: The T-72 is a family of Soviet/Russian main battle tanks that first entered + production in 1971. About 20,000 T-72 tanks have been built, and refurbishment has + enabled many to remain in service for decades. The T-72A version introduced in 1979 + is considered a second-generation main battle tank. It was widely exported and saw + service in 40 countries and in numerous conflicts. The T-72B3 version introduced + in 2010 is considered a third-generation main battle tank (MBT). +introduced: 1985 +manufacturer: UralVagonZavod +origin: USSR/Russia +price: 20 +role: Main Battle Tank +variants: + T-72B with Kontakt-1 ERA: {} diff --git a/resources/units/ground_units/T-72B3.yaml b/resources/units/ground_units/T-72B3.yaml new file mode 100644 index 00000000..2b84a81c --- /dev/null +++ b/resources/units/ground_units/T-72B3.yaml @@ -0,0 +1,14 @@ +class: Tank +description: The T-72 is a family of Soviet/Russian main battle tanks that first entered + production in 1971. About 20,000 T-72 tanks have been built, and refurbishment has + enabled many to remain in service for decades. The T-72A version introduced in 1979 + is considered a second-generation main battle tank. It was widely exported and saw + service in 40 countries and in numerous conflicts. The T-72B3 version introduced + in 2010 is considered a third-generation main battle tank (MBT). +introduced: 2010 +manufacturer: UralVagonZavod +origin: USSR/Russia +price: 25 +role: Main Battle Tank +variants: + T-72B3 model 2011: {} diff --git a/resources/units/ground_units/T-80UD.yaml b/resources/units/ground_units/T-80UD.yaml new file mode 100644 index 00000000..c286ab0d --- /dev/null +++ b/resources/units/ground_units/T-80UD.yaml @@ -0,0 +1,15 @@ +class: Tank +description: The T-80 is a main battle tank (MBT) designed and manufactured in the + Soviet Union. When it entered service in 1976, it was the second MBT in the world + to be equipped with a gas turbine engine after the Swedish Strv 103 and the first + to use it as a primary propulsion engine. The T-80U was last produced in a factory + in Omsk, Russia, while the T-80UD and further-developed T-84 continue to be produced + in Ukraine. The T-80 and its variants are in service in Belarus, Cyprus, Egypt, + Kazakhstan,[12] Pakistan, Russia, South Korea, and Ukraine. +introduced: 1985 +manufacturer: Omsk Transmash +origin: USSR/Russia +price: 25 +role: Main Battle Tank +variants: + T-80UD: {} diff --git a/resources/units/ground_units/T-90.yaml b/resources/units/ground_units/T-90.yaml new file mode 100644 index 00000000..7468adfb --- /dev/null +++ b/resources/units/ground_units/T-90.yaml @@ -0,0 +1,13 @@ +class: Tank +description: 'The T-90 is a third-generation Russian main battle tank that entered + service in 1993. The tank is a modern variation of the T-72B and incorporates many + features found on the T-80U. Originally called the T-72BU, but later renamed to + T-90, it is an advanced tank in service with Russian Ground Forces and the Naval + Infantry. ' +introduced: 2004 +manufacturer: UralVagonZavod +origin: Russia +price: 30 +role: Main Battle Tank +variants: + T-90A: {} diff --git a/resources/units/ground_units/T155_Firtina.yaml b/resources/units/ground_units/T155_Firtina.yaml new file mode 100644 index 00000000..383f814f --- /dev/null +++ b/resources/units/ground_units/T155_Firtina.yaml @@ -0,0 +1,10 @@ +class: Artillery +description: "T-155 F\u0131rt\u0131na (English: Storm) is a Turkish 155 mm self-propelled\ + \ howitzer." +introduced: 1998 +manufacturer: Turkey +origin: Turkey +price: 28 +role: Self-Propelled Gun +variants: + Firtina: {} diff --git a/resources/units/ground_units/TPZ.yaml b/resources/units/ground_units/TPZ.yaml new file mode 100644 index 00000000..ab79ab37 --- /dev/null +++ b/resources/units/ground_units/TPZ.yaml @@ -0,0 +1,15 @@ +class: APC +description: The TPz (Transportpanzer) Fuchs ("fox") is a German armoured personnel + carrier originally developed by Daimler-Benz but manufactured and further developed + by the now Rheinmetall MAN Military Vehicles (RMMV). Fuchs was the second wheeled + armoured vehicle to enter service with the Bundeswehr (West German Military) and + it can be used for tasks including troop transport, engineer transport, bomb disposal, + Nuclear, Biological and Chemical reconnaissance and electronic warfare. RMMV and + its predecessors manufactured 1,236 Fuchs 1, mostly for the German Army. +introduced: 1979 +manufacturer: Rheinstahl Wehrtechnik +origin: Germany +price: 5 +role: Armoured Personnel Carrier +variants: + TPz Fuchs: {} diff --git a/resources/units/ground_units/TRM2000.yaml b/resources/units/ground_units/TRM2000.yaml new file mode 100644 index 00000000..1d0b204d --- /dev/null +++ b/resources/units/ground_units/TRM2000.yaml @@ -0,0 +1,3 @@ +price: 4 +variants: + TRM-2000: null diff --git a/resources/units/ground_units/TRM2000_AA20.yaml b/resources/units/ground_units/TRM2000_AA20.yaml new file mode 100644 index 00000000..55b8b273 --- /dev/null +++ b/resources/units/ground_units/TRM2000_AA20.yaml @@ -0,0 +1,3 @@ +price: 8 +variants: + TRM-2000 53T2: null diff --git a/resources/units/ground_units/TRM2000_Citerne.yaml b/resources/units/ground_units/TRM2000_Citerne.yaml new file mode 100644 index 00000000..c4408fed --- /dev/null +++ b/resources/units/ground_units/TRM2000_Citerne.yaml @@ -0,0 +1,3 @@ +price: 4 +variants: + TRM-2000 Fuel: null diff --git a/resources/units/ground_units/TRMMISTRAL.yaml b/resources/units/ground_units/TRMMISTRAL.yaml new file mode 100644 index 00000000..0df6ee7e --- /dev/null +++ b/resources/units/ground_units/TRMMISTRAL.yaml @@ -0,0 +1,9 @@ +class: ATGM +description: WIP - Mistral Missile on a Truck. +introduced: 1993 +manufacturer: GIAT Industries +origin: France +price: 14 +role: Shorad +variants: + Pamela: {} diff --git a/resources/units/ground_units/Tetrarch.yaml b/resources/units/ground_units/Tetrarch.yaml new file mode 100644 index 00000000..487e27cc --- /dev/null +++ b/resources/units/ground_units/Tetrarch.yaml @@ -0,0 +1,12 @@ +class: Recon +description: The Light Tank Mk VII (A17), also known as the Tetrarch, was a British + light tank produced by Vickers-Armstrongs in the late 1930s and used during the + Second World War. The Tetrarch was the latest in the line of light tanks built by + the company for the British Army. They where declered obsolete in 1946. +introduced: 1938 +manufacturer: Vickers-Armstrongs +origin: UK +price: 8 +role: Airborne Light Tank +variants: + A17 Light Tank Mk VII Tetrarch: {} diff --git a/resources/units/ground_units/Tiger_I.yaml b/resources/units/ground_units/Tiger_I.yaml new file mode 100644 index 00000000..36af086f --- /dev/null +++ b/resources/units/ground_units/Tiger_I.yaml @@ -0,0 +1,16 @@ +class: Tank +description: The Tiger I was a German heavy tank of World War II that operated beginning + in 1942 in Africa and in the Soviet Union, usually in independent heavy tank battalions. + It was designated Panzerkampfwagen VI Ausf H during development but was changed + to Panzerkampfwagen VI Ausf E during production. The Tiger I gave the German Army + its first armoured fighting vehicle that mounted the 8.8 cm KwK 36 gun (derived + from the 8.8 cm Flak 36). 1,347 were built between August 1942 and August 1944. + After August 1944, production of the Tiger I was phased out in favour of the Tiger + II. 1347 have been build. +introduced: 1942 +manufacturer: Henschel +origin: Germany +price: 24 +role: Heavy Tank +variants: + Panzerkampfwagen VI Tiger Ausf. E: {} diff --git a/resources/units/ground_units/Tiger_II_H.yaml b/resources/units/ground_units/Tiger_II_H.yaml new file mode 100644 index 00000000..810a7143 --- /dev/null +++ b/resources/units/ground_units/Tiger_II_H.yaml @@ -0,0 +1,18 @@ +class: Tank +description: The Tiger II was the successor to the Tiger I, combining the latter's + thick armour with the armour sloping used on the Panther medium tank. The tank weighed + almost 70 tonnes, and was protected by 100 to 185 mm (3.9 to 7.3 in) of armour to + the front.It was armed with the long barrelled 8.8 cm KwK 43 L/71 anti-tank cannon. + The chassis was also the basis for the Jagdtiger turretless Jagdpanzer anti-tank + vehicle. The Tiger II was issued to heavy tank battalions of the Army and the Waffen-SS. + It was first used in combat by 503rd Heavy Panzer Battalion during the Allied invasion + of Normandy on 11 July 1944; on the Eastern Front, the first unit to be outfitted + with the Tiger II was the 501st Heavy Panzer Battalion, which by 1 September 1944 + listed 25 Tiger IIs operational. +introduced: 1944 +manufacturer: Henschel/Krupp +origin: Germany +price: 26 +role: Heavy Tank +variants: + Panzerkampfwagen Tiger Ausf. B Tiger II: {} diff --git a/resources/units/ground_units/Tor 9A331.yaml b/resources/units/ground_units/Tor 9A331.yaml new file mode 100644 index 00000000..2d628fc6 --- /dev/null +++ b/resources/units/ground_units/Tor 9A331.yaml @@ -0,0 +1,12 @@ +class: SHORADS +description: "The Tor missile system (Russian: \"\u0422\u043E\u0440\"; English: torus)\ + \ is an all-weather low to medium altitude, short-range surface-to-air missile system\ + \ designed for destroying airplanes, helicopters, cruise missiles, precision guided\ + \ munitions, unmanned aerial vehicles and short-range ballistic threats (anti-munitions)." +introduced: 1971 +manufacturer: Znamya Truda Plant +origin: USSR/Russia +price: 40 +role: Self-Propelled Anti-Aircraft System +variants: + SA-15 Tor: {} diff --git a/resources/units/ground_units/Toyota_bleu.yaml b/resources/units/ground_units/Toyota_bleu.yaml new file mode 100644 index 00000000..22feb2b8 --- /dev/null +++ b/resources/units/ground_units/Toyota_bleu.yaml @@ -0,0 +1,3 @@ +price: 2 +variants: + DIM' TOYOTA BLUE: null diff --git a/resources/units/ground_units/Toyota_desert.yaml b/resources/units/ground_units/Toyota_desert.yaml new file mode 100644 index 00000000..02bdac86 --- /dev/null +++ b/resources/units/ground_units/Toyota_desert.yaml @@ -0,0 +1,3 @@ +price: 2 +variants: + DIM' TOYOTA DESERT: null diff --git a/resources/units/ground_units/Toyota_vert.yaml b/resources/units/ground_units/Toyota_vert.yaml new file mode 100644 index 00000000..56e91372 --- /dev/null +++ b/resources/units/ground_units/Toyota_vert.yaml @@ -0,0 +1,3 @@ +price: 2 +variants: + DIM' TOYOTA GREEN: null diff --git a/resources/units/ground_units/Tracma.yaml b/resources/units/ground_units/Tracma.yaml new file mode 100644 index 00000000..bca41b82 --- /dev/null +++ b/resources/units/ground_units/Tracma.yaml @@ -0,0 +1,3 @@ +price: 2 +variants: + Tracma TD 1500: null diff --git a/resources/units/ground_units/UAZ-469.yaml b/resources/units/ground_units/UAZ-469.yaml new file mode 100644 index 00000000..3d3a35df --- /dev/null +++ b/resources/units/ground_units/UAZ-469.yaml @@ -0,0 +1,3 @@ +price: 3 +variants: + LUV UAZ-469 Jeep: null diff --git a/resources/units/ground_units/Uragan_BM-27.yaml b/resources/units/ground_units/Uragan_BM-27.yaml new file mode 100644 index 00000000..fa65c388 --- /dev/null +++ b/resources/units/ground_units/Uragan_BM-27.yaml @@ -0,0 +1,11 @@ +class: Artillery +description: "The BM-27 Uragan (Russian: \u0423\u0440\u0430\u0433\u0430\u043D, lit.\u2009\ + 'Hurricane'; GRAU index 9P140) is a self-propelled multiple rocket launcher system\ + \ designed in the Soviet Union." +introduced: 1975 +manufacturer: Splav +origin: USSR/Russia +price: 50 +role: Multiple-Launch Rocket System +variants: + BM-27 Uragan: {} diff --git a/resources/units/ground_units/Ural-375 ZU-23 Insurgent.yaml b/resources/units/ground_units/Ural-375 ZU-23 Insurgent.yaml new file mode 100644 index 00000000..3e068bd8 --- /dev/null +++ b/resources/units/ground_units/Ural-375 ZU-23 Insurgent.yaml @@ -0,0 +1,15 @@ +class: SHORADS +description: "The ZSU-57-2 Ob'yekt 500 is a Soviet self-propelled anti-aircraft gun\ + \ (SPAAG), armed with two 57 mm autocannons. 'ZSU' stands for Zenitnaya Samokhodnaya\ + \ Ustanovka (Russian: \u0417\u0435\u043D\u0438\u0442\u043D\u0430\u044F \u0421\u0430\ + \u043C\u043E\u0445\u043E\u0434\u043D\u0430\u044F \u0423\u0441\u0442\u0430\u043D\u043E\ + \u0432\u043A\u0430), meaning \"anti-aircraft self-propelled mount\", '57' stands\ + \ for the bore of the armament in millimetres and '2' stands for the number of gun\ + \ barrels. It was the first Soviet mass-produced tracked SPAAG." +introduced: 1961 +manufacturer: KBP/Ural +origin: USSR/Russia +price: 7 +role: Self-Propelled Anti-Aircraft Gun +variants: + ZU-23 on Ural-375: {} diff --git a/resources/units/ground_units/Ural-375 ZU-23.yaml b/resources/units/ground_units/Ural-375 ZU-23.yaml new file mode 100644 index 00000000..3e068bd8 --- /dev/null +++ b/resources/units/ground_units/Ural-375 ZU-23.yaml @@ -0,0 +1,15 @@ +class: SHORADS +description: "The ZSU-57-2 Ob'yekt 500 is a Soviet self-propelled anti-aircraft gun\ + \ (SPAAG), armed with two 57 mm autocannons. 'ZSU' stands for Zenitnaya Samokhodnaya\ + \ Ustanovka (Russian: \u0417\u0435\u043D\u0438\u0442\u043D\u0430\u044F \u0421\u0430\ + \u043C\u043E\u0445\u043E\u0434\u043D\u0430\u044F \u0423\u0441\u0442\u0430\u043D\u043E\ + \u0432\u043A\u0430), meaning \"anti-aircraft self-propelled mount\", '57' stands\ + \ for the bore of the armament in millimetres and '2' stands for the number of gun\ + \ barrels. It was the first Soviet mass-produced tracked SPAAG." +introduced: 1961 +manufacturer: KBP/Ural +origin: USSR/Russia +price: 7 +role: Self-Propelled Anti-Aircraft Gun +variants: + ZU-23 on Ural-375: {} diff --git a/resources/units/ground_units/Ural-375.yaml b/resources/units/ground_units/Ural-375.yaml new file mode 100644 index 00000000..e717210a --- /dev/null +++ b/resources/units/ground_units/Ural-375.yaml @@ -0,0 +1,3 @@ +price: 3 +variants: + Truck Ural-375: null diff --git a/resources/units/ground_units/Ural-4320-31.yaml b/resources/units/ground_units/Ural-4320-31.yaml new file mode 100644 index 00000000..0e8ec672 --- /dev/null +++ b/resources/units/ground_units/Ural-4320-31.yaml @@ -0,0 +1,3 @@ +price: 1 +variants: + Truck Ural-4320-31 Arm'd: null diff --git a/resources/units/ground_units/Ural-4320T.yaml b/resources/units/ground_units/Ural-4320T.yaml new file mode 100644 index 00000000..85e584c4 --- /dev/null +++ b/resources/units/ground_units/Ural-4320T.yaml @@ -0,0 +1,3 @@ +price: 1 +variants: + Truck Ural-4320T: null diff --git a/resources/units/ground_units/VABH.yaml b/resources/units/ground_units/VABH.yaml new file mode 100644 index 00000000..48f70948 --- /dev/null +++ b/resources/units/ground_units/VABH.yaml @@ -0,0 +1,3 @@ +price: 8 +variants: + VAB MEDICAL: null diff --git a/resources/units/ground_units/VAB_50.yaml b/resources/units/ground_units/VAB_50.yaml new file mode 100644 index 00000000..dcb0800d --- /dev/null +++ b/resources/units/ground_units/VAB_50.yaml @@ -0,0 +1,3 @@ +price: 4 +variants: + VAB .50: null diff --git a/resources/units/ground_units/VAB_HOT.yaml b/resources/units/ground_units/VAB_HOT.yaml new file mode 100644 index 00000000..2995601e --- /dev/null +++ b/resources/units/ground_units/VAB_HOT.yaml @@ -0,0 +1,10 @@ +class: ATGM +description: The VAB HOT Mephisto is a wheeled armoured vehicle personnel carrier + VAB fitted with anti-tank missile launcher turret. +introduced: 1990 +manufacturer: GIAT Industries +origin: France +price: 8 +role: ATGM Vehicle +variants: + VAB Mephisto: {} diff --git a/resources/units/ground_units/VAB_MORTIER.yaml b/resources/units/ground_units/VAB_MORTIER.yaml new file mode 100644 index 00000000..a479fdaf --- /dev/null +++ b/resources/units/ground_units/VAB_MORTIER.yaml @@ -0,0 +1,3 @@ +price: 10 +variants: + VAB MORTIER: null diff --git a/resources/units/ground_units/VAB_Mephisto.yaml b/resources/units/ground_units/VAB_Mephisto.yaml new file mode 100644 index 00000000..73431634 --- /dev/null +++ b/resources/units/ground_units/VAB_Mephisto.yaml @@ -0,0 +1,10 @@ +class: ATGM +description: The VAB HOT Mephisto is a wheeled armoured vehicle personnel carrier + VAB fitted with anti-tank missile launcher turret. +introduced: 1990 +manufacturer: GIAT Industries +origin: France +price: 12 +role: ATGM Vehicle +variants: + VAB Mephisto: {} diff --git a/resources/units/ground_units/VAB_RADIO.yaml b/resources/units/ground_units/VAB_RADIO.yaml new file mode 100644 index 00000000..8f96fe1d --- /dev/null +++ b/resources/units/ground_units/VAB_RADIO.yaml @@ -0,0 +1,3 @@ +price: 6 +variants: + VAB: null diff --git a/resources/units/ground_units/VBAE.yaml b/resources/units/ground_units/VBAE.yaml new file mode 100644 index 00000000..f804297a --- /dev/null +++ b/resources/units/ground_units/VBAE.yaml @@ -0,0 +1,3 @@ +price: 8 +variants: + VBAE CRAB: null diff --git a/resources/units/ground_units/VBAE_MMP.yaml b/resources/units/ground_units/VBAE_MMP.yaml new file mode 100644 index 00000000..304d2360 --- /dev/null +++ b/resources/units/ground_units/VBAE_MMP.yaml @@ -0,0 +1,3 @@ +price: 12 +variants: + VBAE CRAB MMP: null diff --git a/resources/units/ground_units/VBL-Radio.yaml b/resources/units/ground_units/VBL-Radio.yaml new file mode 100644 index 00000000..ce21a77e --- /dev/null +++ b/resources/units/ground_units/VBL-Radio.yaml @@ -0,0 +1,3 @@ +price: 1 +variants: + VBL: null diff --git a/resources/units/ground_units/VBL50.yaml b/resources/units/ground_units/VBL50.yaml new file mode 100644 index 00000000..fb73295e --- /dev/null +++ b/resources/units/ground_units/VBL50.yaml @@ -0,0 +1,3 @@ +price: 4 +variants: + VBL .50: null diff --git a/resources/units/ground_units/VBLANF1.yaml b/resources/units/ground_units/VBLANF1.yaml new file mode 100644 index 00000000..48b18b81 --- /dev/null +++ b/resources/units/ground_units/VBLANF1.yaml @@ -0,0 +1,3 @@ +price: 2 +variants: + VBL AANF1: null diff --git a/resources/units/ground_units/VIB_VBR.yaml b/resources/units/ground_units/VIB_VBR.yaml new file mode 100644 index 00000000..6da55303 --- /dev/null +++ b/resources/units/ground_units/VIB_VBR.yaml @@ -0,0 +1,3 @@ +price: 6 +variants: + VAB T20/13: null diff --git a/resources/units/ground_units/Vulcan.yaml b/resources/units/ground_units/Vulcan.yaml new file mode 100644 index 00000000..186b383f --- /dev/null +++ b/resources/units/ground_units/Vulcan.yaml @@ -0,0 +1,16 @@ +class: SHORADS +description: "The M163 had a fairly limited range from the start. Its 20x102mm round\ + \ gave it a low effective range of only 1,200 meters, and its standard air-defense\ + \ load of HEI-T rounds would self-destruct at approximately 1800 meters, a hard\ + \ limit on range. Additionally, the radar was a range-only set incapable of finding\ + \ targets. In US and Israeli service, the VADS has rarely been needed in its intended\ + \ purpose of providing defense against aerial threats\u2014consequently, the Vulcan\ + \ gun system was in use throughout the late 1980s and early 1990s primarily as a\ + \ ground support weapon." +introduced: 1989 +manufacturer: General Electric +origin: USA +price: 10 +role: Self-Propelled Anti-Aircraft Gun +variants: + M163 Vulcan Air Defense System: {} diff --git a/resources/units/ground_units/Willys_MB.yaml b/resources/units/ground_units/Willys_MB.yaml new file mode 100644 index 00000000..4e7a05e9 --- /dev/null +++ b/resources/units/ground_units/Willys_MB.yaml @@ -0,0 +1,11 @@ +class: Logistics +description: The jeep became the primary light wheeled transport vehicle of the United + States military and its allies, with President Eisenhower once calling it "one of + three decisive weapons the U.S. had during WWII." After WW2 it served in many conflicts. +introduced: 1997 +manufacturer: United Defense +origin: USA +price: 1 +role: Recon Vehicle +variants: + Willys Jeep: {} diff --git a/resources/units/ground_units/ZBD04A.yaml b/resources/units/ground_units/ZBD04A.yaml new file mode 100644 index 00000000..1e2a0c07 --- /dev/null +++ b/resources/units/ground_units/ZBD04A.yaml @@ -0,0 +1,12 @@ +class: IFV +description: The ZBD-04 or Type 04 (industrial designation WZ502) is a Chinese infantry + fighting vehicle. It bears some external resemblance to the BMP-3, particularly + with regards to its turret and main armament; however, the chassis and internal + subsystems possesses a different layout. +introduced: 1999 +manufacturer: Norinco +origin: China +price: 12 +role: Main Battle Tank +variants: + Type 04A (ZBD-04A): {} diff --git a/resources/units/ground_units/ZSU-23-4 Shilka.yaml b/resources/units/ground_units/ZSU-23-4 Shilka.yaml new file mode 100644 index 00000000..426109cf --- /dev/null +++ b/resources/units/ground_units/ZSU-23-4 Shilka.yaml @@ -0,0 +1,10 @@ +class: SHORADS +description: The ZSU-23-4 "Shilka" is a lightly armored Soviet self-propelled, radar + guided anti-aircraft weapon system (SPAAG). About 6500 have been build. +introduced: 1960 +manufacturer: MMZ +origin: USSR/Russia +price: 10 +role: Self-Propelled Anti-Aircraft Gun +variants: + ZSU-23-4 Shilka: {} diff --git a/resources/units/ground_units/ZSU_57_2.yaml b/resources/units/ground_units/ZSU_57_2.yaml new file mode 100644 index 00000000..d2b59e1c --- /dev/null +++ b/resources/units/ground_units/ZSU_57_2.yaml @@ -0,0 +1,15 @@ +class: SHORADS +description: "The ZSU-57-2 Ob'yekt 500 is a Soviet self-propelled anti-aircraft gun\ + \ (SPAAG), armed with two 57 mm autocannons. 'ZSU' stands for Zenitnaya Samokhodnaya\ + \ Ustanovka (Russian: \u0417\u0435\u043D\u0438\u0442\u043D\u0430\u044F \u0421\u0430\ + \u043C\u043E\u0445\u043E\u0434\u043D\u0430\u044F \u0423\u0441\u0442\u0430\u043D\u043E\ + \u0432\u043A\u0430), meaning \"anti-aircraft self-propelled mount\", '57' stands\ + \ for the bore of the armament in millimetres and '2' stands for the number of gun\ + \ barrels. It was the first Soviet mass-produced tracked SPAAG." +introduced: 1955 +manufacturer: Omsk Works +origin: USSR/Russia +price: 12 +role: Self-Propelled Anti-Aircraft Gun +variants: + ZSU-57-2 'Sparka': {} diff --git a/resources/units/ground_units/ZTZ96B.yaml b/resources/units/ground_units/ZTZ96B.yaml new file mode 100644 index 00000000..f7bab4ef --- /dev/null +++ b/resources/units/ground_units/ZTZ96B.yaml @@ -0,0 +1,12 @@ +class: Tank +description: The Type 96 or ZTZ96 is a Chinese second generation main battle tank + (MBT). The final evolution of the Type 88 design, the Type 96 entered service with + the People's Liberation Army (PLA) in 1997. The later variants of the Type 96 are + regarded as near-equivalents to China's third generation MBT. +introduced: 1979 +manufacturer: First Inner Mongolia Machinery Factory +origin: China +price: 30 +role: Main Battle Tank +variants: + Type 96B (ZTZ-96B): {} diff --git a/resources/units/ground_units/ZU-23 Closed Insurgent.yaml b/resources/units/ground_units/ZU-23 Closed Insurgent.yaml new file mode 100644 index 00000000..481a0d23 --- /dev/null +++ b/resources/units/ground_units/ZU-23 Closed Insurgent.yaml @@ -0,0 +1,3 @@ +price: 6 +variants: + AAA ZU-23 Insurgent Closed Emplacement: null diff --git a/resources/units/ground_units/ZU-23 Emplacement Closed.yaml b/resources/units/ground_units/ZU-23 Emplacement Closed.yaml new file mode 100644 index 00000000..adccdb77 --- /dev/null +++ b/resources/units/ground_units/ZU-23 Emplacement Closed.yaml @@ -0,0 +1,3 @@ +price: 6 +variants: + AAA ZU-23 Closed Emplacement: null diff --git a/resources/units/ground_units/ZU-23 Emplacement.yaml b/resources/units/ground_units/ZU-23 Emplacement.yaml new file mode 100644 index 00000000..9529594c --- /dev/null +++ b/resources/units/ground_units/ZU-23 Emplacement.yaml @@ -0,0 +1,3 @@ +price: 6 +variants: + AAA ZU-23 Emplacement: null diff --git a/resources/units/ground_units/ZU-23 Insurgent.yaml b/resources/units/ground_units/ZU-23 Insurgent.yaml new file mode 100644 index 00000000..182bfb0d --- /dev/null +++ b/resources/units/ground_units/ZU-23 Insurgent.yaml @@ -0,0 +1,3 @@ +price: 6 +variants: + AAA ZU-23 Insurgent Emplacement: null diff --git a/resources/units/ground_units/bofors40.yaml b/resources/units/ground_units/bofors40.yaml new file mode 100644 index 00000000..ca6c4b78 --- /dev/null +++ b/resources/units/ground_units/bofors40.yaml @@ -0,0 +1,16 @@ +class: SHORADS +description: The Bofors 40 mm gun, often referred to simply as the Bofors gun, is + an anti-aircraft autocannon designed in the 1930s by the Swedish arms manufacturer + AB Bofors. It was one of the most popular medium-weight anti-aircraft systems during + World War II, used by most of the western Allies as well as some captured systems + being used by the Axis powers. A small number of these weapons remain in service + to this day, and saw action as late as the Persian Gulf War. +introduced: 1934 +manufacturer: Bofors +origin: Sweden +price: 8 +role: Anti-Aircraft Gun +variants: + Bofors 40 mm Gun: {} + QF 40 mm Mark III: + introduced: 1939 diff --git a/resources/units/ground_units/flak18.yaml b/resources/units/ground_units/flak18.yaml new file mode 100644 index 00000000..e3bd7cfa --- /dev/null +++ b/resources/units/ground_units/flak18.yaml @@ -0,0 +1,17 @@ +class: SHORADS +description: "The 8.8 cm Flak 18/36/37/41 is a German 88 mm anti-aircraft and anti-tank\ + \ artillery gun, developed in the 1930s. It was widely used by Germany throughout\ + \ World War II and is one of the most recognized German weapons of that conflict.\ + \ Development of the original model led to a wide variety of guns. Air defense units\ + \ were usually deployed with either a Kommandoger\xE4t (\"command device\") fire\ + \ control computer or a portable W\xFCrzburg radar, which were responsible for its\ + \ high level of accuracy against aircraft. The versatile carriage allowed the 8.8\ + \ cm Flak to be fired in a limited anti-tank mode when still on its wheels; it could\ + \ be completely emplaced in only two and a half minutes." +introduced: 1936 +manufacturer: Krupp/Rheinmetall +origin: Germany +price: 6 +role: Anti-Aircraft Gun/Anti-Tank Gun +variants: + 8.8 cm Flak 18: {} diff --git a/resources/units/ground_units/flak30.yaml b/resources/units/ground_units/flak30.yaml new file mode 100644 index 00000000..3bd4d510 --- /dev/null +++ b/resources/units/ground_units/flak30.yaml @@ -0,0 +1,13 @@ +description: The Flak 38 (Flugzeugabwehrkanone 30) and improved Flak 38 were 20 mm + anti-aircraft guns used by various German forces throughout World War II. It was + not only the primary German light anti-aircraft gun, but by far the most numerously + produced German artillery piece throughout the war. It was produced in a variety + of models, notably the Flakvierling 38 which combined four Flak 38 autocannons onto + a single carriage. +introduced: 1934 +manufacturer: Mauser +origin: Germany +price: 6 +role: Anti-Aircraft Gun +variants: + 2 cm Flak 38: {} diff --git a/resources/units/ground_units/flak36.yaml b/resources/units/ground_units/flak36.yaml new file mode 100644 index 00000000..9fb65fef --- /dev/null +++ b/resources/units/ground_units/flak36.yaml @@ -0,0 +1,17 @@ +class: SHORADS +description: "The 8.8 cm Flak 18/36/37/41 is a German 88 mm anti-aircraft and anti-tank\ + \ artillery gun, developed in the 1930s. It was widely used by Germany throughout\ + \ World War II and is one of the most recognized German weapons of that conflict.\ + \ Development of the original model led to a wide variety of guns. Air defense units\ + \ were usually deployed with either a Kommandoger\xE4t (\"command device\") fire\ + \ control computer or a portable W\xFCrzburg radar, which were responsible for its\ + \ high level of accuracy against aircraft. The versatile carriage allowed the 8.8\ + \ cm Flak to be fired in a limited anti-tank mode when still on its wheels; it could\ + \ be completely emplaced in only two and a half minutes." +introduced: 1936 +manufacturer: Krupp/Rheinmetall +origin: Germany +price: 8 +role: Anti-Aircraft Gun/Anti-Tank Gun +variants: + 8.8 cm Flak 36: {} diff --git a/resources/units/ground_units/flak37.yaml b/resources/units/ground_units/flak37.yaml new file mode 100644 index 00000000..c0cc14c5 --- /dev/null +++ b/resources/units/ground_units/flak37.yaml @@ -0,0 +1,17 @@ +class: SHORADS +description: "The 8.8 cm Flak 18/36/37/41 is a German 88 mm anti-aircraft and anti-tank\ + \ artillery gun, developed in the 1930s. It was widely used by Germany throughout\ + \ World War II and is one of the most recognized German weapons of that conflict.\ + \ Development of the original model led to a wide variety of guns. Air defense units\ + \ were usually deployed with either a Kommandoger\xE4t (\"command device\") fire\ + \ control computer or a portable W\xFCrzburg radar, which were responsible for its\ + \ high level of accuracy against aircraft. The versatile carriage allowed the 8.8\ + \ cm Flak to be fired in a limited anti-tank mode when still on its wheels; it could\ + \ be completely emplaced in only two and a half minutes." +introduced: 1936 +manufacturer: Krupp/Rheinmetall +origin: Germany +price: 9 +role: Anti-Aircraft Gun/Anti-Tank Gun +variants: + 8.8 cm Flak 37: {} diff --git a/resources/units/ground_units/flak38.yaml b/resources/units/ground_units/flak38.yaml new file mode 100644 index 00000000..d339503d --- /dev/null +++ b/resources/units/ground_units/flak38.yaml @@ -0,0 +1,13 @@ +description: The Flak 30 (Flugzeugabwehrkanone 30) and improved Flak 38 were 20 mm + anti-aircraft guns used by various German forces throughout World War II. It was + not only the primary German light anti-aircraft gun, but by far the most numerously + produced German artillery piece throughout the war. It was produced in a variety + of models, notably the Flakvierling 38 which combined four Flak 38 autocannons onto + a single carriage. +introduced: 1934 +manufacturer: Mauser +origin: Germany +price: 5 +role: Anti-Aircraft Gun +variants: + 2 cm Flakvierling 38: {} diff --git a/resources/units/ground_units/flak41.yaml b/resources/units/ground_units/flak41.yaml new file mode 100644 index 00000000..eaf30301 --- /dev/null +++ b/resources/units/ground_units/flak41.yaml @@ -0,0 +1,17 @@ +class: SHORADS +description: "The 8.8 cm Flak 18/36/37/41 is a German 88 mm anti-aircraft and anti-tank\ + \ artillery gun, developed in the 1930s. It was widely used by Germany throughout\ + \ World War II and is one of the most recognized German weapons of that conflict.\ + \ Development of the original model led to a wide variety of guns. Air defense units\ + \ were usually deployed with either a Kommandoger\xE4t (\"command device\") fire\ + \ control computer or a portable W\xFCrzburg radar, which were responsible for its\ + \ high level of accuracy against aircraft. The versatile carriage allowed the 8.8\ + \ cm Flak to be fired in a limited anti-tank mode when still on its wheels; it could\ + \ be completely emplaced in only two and a half minutes." +introduced: 1943 +manufacturer: Krupp/Rheinmetall +origin: Germany +price: 10 +role: Anti-Aircraft Gun/Anti-Tank Gun +variants: + 8.8 cm Flak 41: {} diff --git a/resources/units/ground_units/leopard-2A4.yaml b/resources/units/ground_units/leopard-2A4.yaml new file mode 100644 index 00000000..674c98c1 --- /dev/null +++ b/resources/units/ground_units/leopard-2A4.yaml @@ -0,0 +1,18 @@ +class: Tank +description: The Leopard 2 is a main battle tank developed by Krauss-Maffei in the + 1970s for the West German Army. The tank first entered service in 1979 and succeeded + the earlier Leopard 1 as the main battle tank of the German Army. It is armed with + a 120 mm smoothbore cannon, and is powered by a V-12 twin-turbo diesel engine. Various + versions have served in the armed forces of Germany and 12 other European countries, + as well as several non-European nations, including Canada, Chile, Indonesia, Singapore, + and Turkey. The Leopard 2 was used in Kosovo with the German Army, and has seen + action in Afghanistan with the Dutch, Danish and Canadian contributions to the International + Security Assistance Force, as well as seeing action in Syria with the Turkish Armed + Forces. +introduced: 1991 +manufacturer: Krauss-Maffei +origin: Germany +price: 20 +role: Main Battle Tank +variants: + Leopard 2A4: {} diff --git a/resources/units/ground_units/leopard-2A4_trs.yaml b/resources/units/ground_units/leopard-2A4_trs.yaml new file mode 100644 index 00000000..3c5dccda --- /dev/null +++ b/resources/units/ground_units/leopard-2A4_trs.yaml @@ -0,0 +1,18 @@ +class: Tank +description: The Leopard 2 is a main battle tank developed by Krauss-Maffei in the + 1970s for the West German Army. The tank first entered service in 1979 and succeeded + the earlier Leopard 1 as the main battle tank of the German Army. It is armed with + a 120 mm smoothbore cannon, and is powered by a V-12 twin-turbo diesel engine. Various + versions have served in the armed forces of Germany and 12 other European countries, + as well as several non-European nations, including Canada, Chile, Indonesia, Singapore, + and Turkey. The Leopard 2 was used in Kosovo with the German Army, and has seen + action in Afghanistan with the Dutch, Danish and Canadian contributions to the International + Security Assistance Force, as well as seeing action in Syria with the Turkish Armed + Forces. +introduced: 1991 +manufacturer: Krauss-Maffei +origin: Germany +price: 20 +role: Main Battle Tank +variants: + Leopard 2A4 Trs: {} diff --git a/resources/units/ground_units/p-19 s-125 sr.yaml b/resources/units/ground_units/p-19 s-125 sr.yaml new file mode 100644 index 00000000..ad694795 --- /dev/null +++ b/resources/units/ground_units/p-19 s-125 sr.yaml @@ -0,0 +1,3 @@ +price: 14 +variants: + SAM P19 "Flat Face" SR (SA-2/3): null diff --git a/resources/units/ground_units/rapier_fsa_blindfire_radar.yaml b/resources/units/ground_units/rapier_fsa_blindfire_radar.yaml new file mode 100644 index 00000000..b5bc885b --- /dev/null +++ b/resources/units/ground_units/rapier_fsa_blindfire_radar.yaml @@ -0,0 +1,3 @@ +price: 8 +variants: + SAM Rapier Blindfire TR: null diff --git a/resources/units/ground_units/rapier_fsa_launcher.yaml b/resources/units/ground_units/rapier_fsa_launcher.yaml new file mode 100644 index 00000000..39ab9b41 --- /dev/null +++ b/resources/units/ground_units/rapier_fsa_launcher.yaml @@ -0,0 +1,3 @@ +price: 6 +variants: + SAM Rapier LN: null diff --git a/resources/units/ground_units/rapier_fsa_optical_tracker_unit.yaml b/resources/units/ground_units/rapier_fsa_optical_tracker_unit.yaml new file mode 100644 index 00000000..481bfaf1 --- /dev/null +++ b/resources/units/ground_units/rapier_fsa_optical_tracker_unit.yaml @@ -0,0 +1,3 @@ +price: 6 +variants: + SAM Rapier Tracker: null diff --git a/resources/units/ground_units/snr s-125 tr.yaml b/resources/units/ground_units/snr s-125 tr.yaml new file mode 100644 index 00000000..2a9923ab --- /dev/null +++ b/resources/units/ground_units/snr s-125 tr.yaml @@ -0,0 +1,3 @@ +price: 14 +variants: + SAM SA-3 S-125 "Low Blow" TR: null diff --git a/resources/units/ground_units/soldier_mauser98.yaml b/resources/units/ground_units/soldier_mauser98.yaml new file mode 100644 index 00000000..7a968d1a --- /dev/null +++ b/resources/units/ground_units/soldier_mauser98.yaml @@ -0,0 +1,5 @@ +class: Infantry +price: 0 +spawn_weight: 4 +variants: + Infantry Mauser 98: null diff --git a/resources/units/ground_units/soldier_wwii_br_01.yaml b/resources/units/ground_units/soldier_wwii_br_01.yaml new file mode 100644 index 00000000..4dafb35c --- /dev/null +++ b/resources/units/ground_units/soldier_wwii_br_01.yaml @@ -0,0 +1,5 @@ +class: Infantry +price: 0 +spawn_weight: 3 +variants: + Infantry SMLE No.4 Mk-1: null diff --git a/resources/units/ground_units/soldier_wwii_us.yaml b/resources/units/ground_units/soldier_wwii_us.yaml new file mode 100644 index 00000000..7dbaf964 --- /dev/null +++ b/resources/units/ground_units/soldier_wwii_us.yaml @@ -0,0 +1,5 @@ +class: Infantry +price: 0 +spawn_weight: 3 +variants: + Infantry M1 Garand: null diff --git a/resources/units/unit_info_text.json b/resources/units/unit_info_text.json deleted file mode 100644 index 812eb697..00000000 --- a/resources/units/unit_info_text.json +++ /dev/null @@ -1,2004 +0,0 @@ -{ - "A-10A": [{ - "default": { - "name": "A-10A Thunderbolt II", - "text": "The A-10A Thunderbolt II, also known as the Warthog, is a 'flying gun'. The aircraft was used extensively during Operation Desert Storm, in support of NATO operations in response to the Kosovo crisis, in Operation Enduring Freedom in Afghanistan and in Operation Iraqi Freedom. The A-10A is a high-survivability and versatile aircraft, popular with pilots for the 'get home' effectiveness.The mission of the aircraft is ground attack against tanks, armored vehicles and installations, and close air support of ground forces. The Warthog is famous for its massive 30mm cannon, but it can also be armed with Maverick guided missiles and several types of bombs and rockets.", - "country-of-origin": "USA", - "manufacturer": "Fairchild Republic", - "role": "Close Air Support/Attack", - "year-of-variant-introduction": "1977" - } - }], - "A-10C": [{ - "default": { - "name": "A-10C Thunderbolt II (Suite 3)", - "text": "The A-10C Thunderbolt II, also known as the Warthog, is a 'flying gun'. The A-10C is a high-survivability and versatile aircraft, popular with pilots for the 'get home' effectiveness.The mission of the aircraft is ground attack against tanks, armored vehicles and installations, and close air support of ground forces. The Warthog is famous for its massive 30mm cannon, but it can also be armed with Maverick guided missiles and several types of bombs and rockets.", - "country-of-origin": "USA", - "manufacturer": "Fairchild Republic", - "role": "Close Air Support/Attack", - "year-of-variant-introduction": "2005" - } - }], - "A-10C_2": [{ - "default": { - "name": "A-10C Thunderbolt II (Suite 7)", - "text": "The A-10C Thunderbolt II, also known as the Warthog, is a 'flying gun'. The A-10C is a high-survivability and versatile aircraft, popular with pilots for the 'get home' effectiveness.The mission of the aircraft is ground attack against tanks, armored vehicles and installations, and close air support of ground forces. The Warthog is famous for its massive 30mm cannon, but it can also be armed with Maverick guided missiles and several types of bombs and rockets.", - "country-of-origin": "USA", - "manufacturer": "Fairchild Republic", - "role": "Close Air Support/Attack", - "year-of-variant-introduction": "2012" - } - }], - "A-20G": [{ - "default": { - "name": "A-20G Havoc", - "text": "The Douglas A-20 Havoc (company designation DB-7) is an American medium bomber, attack aircraft, night intruder, night fighter, and reconnaissance aircraft of World War II. Designed to meet an Army Air Corps requirement for a bomber, it was ordered by France for their air force before the USAAC decided it would also meet their requirements. French DB-7s were the first to see combat; after the fall of France the bomber, under the service name Boston continued with the Royal Air Force. From 1941, night fighter and intruder versions were given the service name Havoc. In 1942 USAAF A-20s saw combat in North Africa.", - "country-of-origin": "USA", - "manufacturer": "Douglas", - "role": "Medium Bomber/Attack", - "year-of-variant-introduction": "1943" - }, - "UK": { - "name": "Boston Mk.III" - } - }], - "A-4E-C": [{ - "default": { - "name": "A-4E Skyhawk", - "text": "The Skyhawk is a relatively lightweight aircraft, with a maximum takeoff weight of 24,500 pounds (11,100 kg), and has a top speed of 670 miles per hour (1,080 km/h). The aircraft's five hardpoints support a variety of missiles, bombs, and other munitions. Skyhawks played key roles in the Vietnam War, the Yom Kippur War, and the Falklands War. Sixty years after the aircraft's first flight in 1954, some of the 2,960 produced (through February 1979)[1] remain in service with the Argentine Air Force and the Brazilian Naval Aviation.", - "country-of-origin": "USA", - "manufacturer": "Douglas", - "role": "Carrier-based Attack/Light Fighter", - "year-of-variant-introduction": "1962" - } - }], - "AH_1W": [{ - "default": { - "name": "AH-1W SuperCobra", - "text": "The AH-1 Cobra was developed in the mid-1960s as an interim gunship for the U.S. Army for use during the Vietnam War. The Cobra shared the proven transmission, rotor system, and the T53 turboshaft engine of the UH-1 'Huey'. By June 1967, the first AH-1G HueyCobras had been delivered. Bell built 1,116 AH-1Gs for the U.S. Army between 1967 and 1973, and the Cobras chalked up over a million operational hours in Vietnam.", - "country-of-origin": "USA", - "manufacturer": "Bell", - "role": "Attack", - "year-of-variant-introduction": "1986" - }, - "Iran": { - "name": "AH-1J SeaCobra" - } - }], - "AH-64A": [{ - "default": { - "name": "AH-64A Apache", - "text": "The legendary 'Apache' is an US twin-turboshaft attack helicopter for a crew of two. It features a nose-mounted sensor suite for target acquisition and night vision systems. It is armed with a 30 mm (1.18 in) M230 chain gun carried between the main landing gear, under the aircraft's forward fuselage, and four hardpoints mounted on stub-wing pylons for carrying armament and stores, typically a mixture of AGM-114 Hellfire missiles and Hydra 70 rocket pods. The AH-64 has significant systems redundancy to improve combat survivability. American AH-64s have served in conflicts in Panama, the Persian Gulf, Kosovo, Afghanistan, and Iraq. Israel used the Apache in its military conflicts in Lebanon and the Gaza Strip. British and Dutch Apaches have seen deployments in wars in Afghanistan and Iraq.", - "country-of-origin": "USA", - "manufacturer": "Boeing", - "role": "Attack", - "year-of-variant-introduction": "1986" - } - }], - "AH-64D": [{ - "default": { - "name": "AH-64D Apache Longbow", - "text": "The legendary 'Apache' is an US twin-turboshaft attack helicopter for a crew of two. It features a nose-mounted sensor suite for target acquisition and night vision systems. It is armed with a 30 mm (1.18 in) M230 chain gun carried between the main landing gear, under the aircraft's forward fuselage, and four hardpoints mounted on stub-wing pylons for carrying armament and stores, typically a mixture of AGM-114 Hellfire missiles and Hydra 70 rocket pods. The AH-64 has significant systems redundancy to improve combat survivability. American AH-64s have served in conflicts in Panama, the Persian Gulf, Kosovo, Afghanistan, and Iraq. Israel used the Apache in its military conflicts in Lebanon and the Gaza Strip. British and Dutch Apaches have seen deployments in wars in Afghanistan and Iraq.", - "country-of-origin": "USA", - "manufacturer": "Boeing", - "role": "Attack", - "year-of-variant-introduction": "2003" - } - }], - "AJS37": [{ - "default": { - "name": "AJS-37 Viggen", - "text": "The AJS-37 Viggen is a Swedish double-delta supersonic attack aircraft from the late Cold War. It was the backbone of the Swedish Air Force during the Cold war, serving as the main attack and anti-ship platform. The AJS is the 90’s upgrade of this 70's era aircraft, adding several advanced weapons and systems functionalities. The aircraft was designed around the pilot, with an excellent man-machine interface, supporting the pilot through the smart use of autopilot systems, radar and HUD symbology in order to deliver the ordnance onto targets from treetop level with high speed attack runs.\n\nThe aircraft is armed with multiple weapon systems ranging from programmable stand-off weapons such as the RB-15F antiship missile to the BK90 Cluster munitions dispenser to various bombs, rockets and missiles for a wide range of target types. The aircraft can also carry gun pods and the Sidewinder series of infrared-guided missiles for air defence and self-protection purposes.", - "country-of-origin": "Sweden", - "manufacturer": "Saab", - "role": "Attack/Reconnaissance", - "year-of-variant-introduction": "1993" - } - }], - "AV8BNA": [{ - "default": { - "name": "AV-8B Harrier II Night Attack", - "text": "The AV-8B project was born in the early 1970's as an effort to address the operational inadequacies of the AV-8A first generation Harrier, aimed to dramatically improve the capabilities and performance of the early AV-8A's. The AV-8B made its maiden flight in November 1981 and entered service with the United States Marine Corps in January 1985. It later evolved into the AV-8B N/A (Night Attack) and AV-8B Harrier II Plus.\n\nFirst flight of a modified AV-8B in the night attack configuration was on June 26th, 1987. Deliveries to the USMC began in September of 1989 to VMA-214 at Yuma, Arizona. Follow-up units based out of Yuma received their Night Attack AV-8Bs by the end of 1992.The AV-8B N/A variant (originally known as the AV-8D) had its first operational development in 1984 and included use of the NAVFLIR (Navigation Forward-Looking Infrared camera, consisting of a GEC-Marconi FLIR system mounted in the nose) for night operations. Additionally, GEC Cat's Eyes night vision goggles were provided to the pilot as well as a revised cockpit with color MFDs, a wider field-of-view HUD display, a color CRT digital moving map, and a complete \"heads-down\" operation capability. The AV-8B N/A also sports four Tracor ALE-39 countermeasures dispensers along the top of the rear fuselage, in addition to two ALE-39 dispensers along the lower rear of the fuselage. The AV-8B N/A also fields an updated version of the Rolls-Royce Pegasus 11-61 (F402-RR-408) vectored-thrust turbofan engine.", - "country-of-origin": "USA/UK", - "manufacturer": "McDonnell Douglas", - "role": "V/STOL Attack", - "year-of-variant-introduction": "1989" - } - }], - "B-1B": [{ - "default": { - "name": "B-1B Lancer", - "text": "The Rockwell B-1 Lancer is a supersonic variable-sweep wing, heavy bomber used by the United States Air Force. It is commonly called the 'Bone' (from 'B-One').It is one of three strategic bombers in the U.S. Air Force fleet as of 2021, the other two being the B-2 Spirit and the B-52 Stratofortress. It first served in combat during Operation Desert Fox in 1998 and again during the NATO action in Kosovo the following year. The B-1B has supported U.S. and NATO military forces in Afghanistan and Iraq. The Air Force had 62 B-1Bs in service as of 2016. The Northrop Grumman B-21 Raider is to begin replacing the B-1B after 2025; all B-1s are planned to be retired by 2036.", - "country-of-origin": "USA", - "manufacturer": "Rockwell", - "role": "Supersonic Strategic Bomber", - "year-of-variant-introduction": "1986" - } - }], - "B-17G": [{ - "default": { - "name": "B-17G Flying Fortress", - "text": "The B-17 was primarily employed by the USAAF in the daylight strategic bombing campaign of World War II against German industrial, military and civilian targets. The United States Eighth Air Force, based at many airfields in central, eastern and southern England, and the Fifteenth Air Force, based in Italy, complemented the RAF Bomber Command's night-time area bombing in the Combined Bomber Offensive to help secure air superiority over the cities, factories and battlefields of Western Europe in preparation for the invasion of France in 1944.it was a relatively fast, high-flying, long-range bomber with heavy defensive armament at the expense of bombload. It developed a reputation for toughness based upon stories and photos of badly damaged B-17s safely returning to base. The B-17 dropped more bombs than any other U.S. aircraft in World War II. Of approximately 1.5 million tons of bombs dropped on Nazi Germany and its occupied territories by U.S. aircraft, over 640,000 tons were dropped from B-17s.", - "country-of-origin": "USA", - "manufacturer": "Boeing", - "role": "Heavy Bomber", - "year-of-variant-introduction": "1943" - }, - "UK": { - "name": "Fortress Mk.III" - } - }], - "B-52H": [{ - "default": { - "name": "B-52H Stratofortress", - "text": "The Boeing B-52 Stratofortress is capable of carrying up to 70,000 pounds (32,000 kg) of weapons, and has a typical combat range of more than 8,800 miles (14,080 km) without aerial refueling. The B-52 completed sixty years of continuous service with its original operator in 2015. After being upgraded between 2013 and 2015, the last airplanes are expected to serve into the 2050s.", - "country-of-origin": "USA", - "manufacturer": "Boeing", - "role": "Strategic Bomber", - "year-of-variant-introduction": "1961" - } - }], - "Bf-109K-4": [{ - "default": { - "name": "Bf 109 K-4 Kurfürst", - "text": "The BF 109 series was, along with the Focke-Wulf Fw 190, the backbone of the Luftwaffe's fighter force. The Bf 109 first saw operational service in 1937 during the Spanish Civil War and was still in service at the dawn of the jet age at the end of World War II in 1945. The final production version of the Bf 109 was the K series or Kurfürst, introduced in late 1944, powered by the DB 605D engine with up to 2,000 PS (1,973 HP). Though externally akin to the late production Bf 109G series, a large number of internal changes and aerodynamic improvements were incorporated that improved its effectiveness and remedied flaws, keeping it competitive with the latest Allied and Soviet fighters. The Bf 109's outstanding rate of climb was superior to many Allied adversaries including the P-51D Mustang, Spitfire Mk. XIV and Hawker Tempest Mk. V.", - "manufacturer": "Messerschmitt", - "role": "Fighter", - "year-of-variant-introduction": "1944" - } - }], - "C-101CC": [{ - "default": { - "name": "C-101CC Aviojet", - "text": "The C-101CC Aviojet, with its 7 hard-points and uprated engine, is a versatile light attack aircraft that has seen combat with the Honduras Air Force against drug traffickers. It is also in service with the Jordanian and Chilean air forces.", - "country-of-origin": "Spain", - "manufacturer": "CASA", - "role": "Light Attack", - "year-of-variant-introduction": "1980" - } - }], - "C-101EB": [{ - "default": { - "name": "C-101EB Aviojet", - "text": "The C-101EB Aviojet is the primary jet trainer and aerobatic display aircraft of the Spanish Air Force.", - "country-of-origin": "Spain", - "manufacturer": "CASA", - "role": "Trainer", - "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", - "text": "Proving highly adaptable, the F-4 entered service with the Navy in 1961 before it was adopted by the United States Marine Corps and the United States Air Force, and by the mid-1960s it had become a major part of their air arms. Phantom production ran from 1958 to 1981 with a total of 5,195 aircraft built, making it the most produced American supersonic military aircraft in history, and cementing its position as an iconic combat aircraft of the Cold War. The F-4 was used extensively during the Vietnam War. It served as the principal air superiority fighter for the U.S. Air Force, Navy, and Marine Corps and became important in the ground-attack and aerial reconnaissance roles late in the war.", - "country-of-origin": "USA", - "manufacturer": "McDonnell Douglas", - "role": "Fighter-Bomber", - "year-of-variant-introduction": "1968" - }, - "Germany": { - "name": "F-4F Phantom II" - }, - "Japan": { - "name": "F-4EJ Kai Phantom II" - }, - "UK": { - "name": "Phantom F.3" - } - }], - "F-5E-3": [{ - "default": { - "name": "F-5E Tiger II", - "text": "The F-5E was developed by Northrop Corporation in early 1970s. The light tactical fighter is an upgraded version based on previous F-5A developments. The F-5s' combat role encompasses air superiority, ground support, and ground attack. Given its mission flexibility, ease of operation, and low cost, the Tiger II has, and continues to serve, air forces across the globe.\n\nThe F-5Е is armed with two 20-mm М39-А3 cannons with 280 rounds per each cannon. The cannons are located in the nose section, forward of the cockpit. Special deflectors are used to avoid compressor stall conditions caused by hot gas ingestion as a bi-product of operating the M-39-A3. Each cannon is capable of firing at a rate of 1500 to 1700 rounds per minute.\n\nEach wingtip incorporates a launcher rail capable of firing AIM-9 infrared-guided missiles.\n\nFive hard points (one centerline pylon and four underwing pylons) allow the aircraft to carry different types of air-to-ground weapons (bombs, cluster munitions, and rockets) 6,400 pounds (about 3000 kg) in total. In addition, illumination ammunition and cargo containers can be attached. To increase flight duration and range, external fuel tanks can be attached to three hard points (a centerline pylon and two inboard pylons). Maneuverability and speed can be maximized in combat by jettisoning all external stores.", - "country-of-origin": "USA", - "manufacturer": "Northrop", - "role": "Light Fighter", - "year-of-variant-introduction": "1975" - } - }], - "F-14A-135-GR": [{ - "default": { - "name": "F-14A Tomcat (Block 135-GR Late)", - "text": "The Grumman F-14 Tomcat is a two-crew, variable wing-geometry, maritime air superiority fighter that served with the US Navy for 32 years and continues to serve with the IRIAF in Iran. The F-14 was the US Navy's frontline fighter from the 1970s to the mid-2000s. Over the course of its long service it also became one of the US Navy’s premier precision ground-attack platform and its lone airborne reconnaissance asset.\n\nNoteworthy features of the Tomcat are its swing-wing configuration, two-man crew, and the powerful AN/AWG-9 Weapons Control System (WCS) and radar. The AWG-9 allows employment of the long-range AIM-54 Phoenix air-to-air missile, and the LANTIRN targeting pod allows precision ground strikes using laser-guided bombs. The F-14 Tomcat was present in several historic events that include the two Gulf of Sidra incidents, Operations Desert Storm Iraqi Freedom, the Yugoslavian conflict, and Operation Enduring Freedom over Afghanistan. It was also immortalized in the iconic motion picture, Top Gun, and starred in several other feature films including The Final Countdown, Executive Decision, and others.\n\nThe Tomcat was also played a vital role in the Iran-Iraq war of the 1980s, where is flew for the Islamic Republic of Iran Air Force.", - "country-of-origin": "USA", - "manufacturer": "Grumman", - "role": "Carrier-based Air-Superiority Fighter/Fighter Bomber", - "year-of-variant-introduction": "1984" - } - }], - "F-14B": [{ - "default": { - "name": "F-14B Tomcat", - "text": "The Grumman F-14 Tomcat is a two-crew, variable wing-geometry, maritime air superiority fighter that served with the US Navy for 32 years and continues to serve with the IRIAF in Iran. The F-14 was the US Navy's frontline fighter from the 1970s to the mid-2000s. Over the course of its long service it also became one of the US Navy’s premier precision ground-attack platform and its lone airborne reconnaissance asset.\n\nNoteworthy features of the Tomcat are its swing-wing configuration, two-man crew, and the powerful AN/AWG-9 Weapons Control System (WCS) and radar. The AWG-9 allows employment of the long-range AIM-54 Phoenix air-to-air missile, and the LANTIRN targeting pod allows precision ground strikes using laser-guided bombs. The F-14 Tomcat was present in several historic events that include the two Gulf of Sidra incidents, Operations Desert Storm Iraqi Freedom, the Yugoslavian conflict, and Operation Enduring Freedom over Afghanistan. It was also immortalized in the iconic motion picture, Top Gun, and starred in several other feature films including The Final Countdown, Executive Decision, and others.\n\nThe Tomcat was also played a vital role in the Iran-Iraq war of the 1980s, where is flew for the Islamic Republic of Iran Air Force.", - "country-of-origin": "USA", - "manufacturer": "Grumman", - "role": "Carrier-based Air-Superiority Fighter/Fighter Bomber", - "year-of-variant-introduction": "1987" - } - }], - "F-15C": [{ - "default": { - "name": "F-15C Eagle", - "text": "The F-15 has often been labeled as the greatest U.S. fighter aircraft from the 1970s until the early 21st century. The F-15C is a pure fighter with outstanding performance and has scored over 100 air-to-air victories without suffering any confirmed losses.", - "country-of-origin": "USA", - "manufacturer": "McDonnell Douglas", - "role": "Air-Superiority Fighter", - "year-of-variant-introduction": "1978" - }, - "Japan": { - "name": "F-15J Eagle" - } - }], - "F-15E": [{ - "default": { - "name": "F-15E Strike Eagle", - "text": "The F-15 has often been labeled as the greatest U.S. fighter aircraft from the 1970s until the early 21st century. The F-15E is a multirole fighter and exceeds in CAS operations. It served worldwide without suffering any confirmed losses.", - "country-of-origin": "USA", - "manufacturer": "McDonnell Douglas", - "role": "Multirole Strike Fighter", - "year-of-variant-introduction": "1988" - } - }], - "F-16C_50": [{ - "default": { - "name": "F-16CM Fighting Falcon (Block 50)", - "text": "The F-16C is a single seat, single engine multirole fighter that was developed in the 1970s. More than 4,500 units were manufactured and are operated today by 26 countries where the aircraft performs numerous missions that include air superiority, close air support, precision bombing, air defense suppression, reconnaissance and more. Few other aircraft can match its versatility, maneuverability, firepower, and huge production numbers.\n\nNicknamed the Viper by its pilots, the F-16 was designed with a reclined seating position for high G tolerance and a single-piece bubble canopy for exceptional visibility and comfort. Its lightweight and powerful F-110-GE-129 engines provide a greater than 1:1 thrust ratio.\n\nHoused in the nose of the Viper is a multifunction APG-68(V)5 radar. The aircraft can also be equipped with multiple sensors such as the LITENING targeting pod and HARM Targeting System (HTS).\n\nThe Viper is armed for air-to-air combat with Sidewinders, AMRAAMs, and an internal 20mm 6-barrel Gatling gun. It can also be loaded with a wide range of air-to-ground weapons that include general purpose bombs, rockets, canister munition, Mavericks, laser- and GPS-guided bombs, and more", - "country-of-origin": "USA", - "manufacturer": "General Dynamics", - "role": "Multirole Fighter", - "year-of-variant-introduction": "1991" - }, - "Japan": { - "name": "F-2A" - } - }], - "F-22A":[{ - "default": { - "name": "F-22A Raptor", - "text": "The F-22A is an American single-seat, twin-engine, all-weather stealth tactical fighter aircraft developed exclusively for the United States Air Force (USAF). The result of the USAF's Advanced Tactical Fighter (ATF) program, the aircraft was designed primarily as an air superiority fighter, but also has ground attack, electronic warfare, and signal intelligence capabilities. Currently it is viewed as the most advanced fighter in the world.", - "country-of-origin": "USA", - "manufacturer": "Lockheed Martin", - "role": "Stealth Air-Superiority Fighter", - "year-of-variant-introduction": "2005" - } - }], - "F-86F Sabre": [{ - "default": { - "name": "F-86F Sabre", - "text": "The North American F-86F Sabre was the most capable western fighter of the early- to mid-1950s. This swept wing, single engine jet was the most important western aircraft of the Korean War and often tangled with Russian-made MiG-15s over the infamous “MiG Alley”. It was a hard struggle not only for the Korean sky, but also between two excellent aircraft builders of the East and West. In addition to its primary role as an air-to-air fighter, the Sabre could also carry bombs and air-to-ground rockets to attack ground targets.", - "country-of-origin": "USA", - "manufacturer": "North American", - "role": "Fighter", - "year-of-variant-introduction": "1953" - } - }], - "F-111F": [{ - "default": { - "name": "F-111F Aardvark", - "text": "The General Dynamics F-111 Aardvark is a retired American supersonic, medium-range interdictor and tactical attack aircraft that also filled the roles of strategic nuclear bomber, aerial reconnaissance, and electronic-warfare aircraft in its various versions. The word 'aardvark' is Afrikaans for 'earth pig' and reflects the look of the long nose of the aircraft that might remind one of the nose of the aardvark.", - "country-of-origin": "USA", - "manufacturer": "General Dynamics", - "role": "Fighter-Bomber", - "year-of-variant-introduction": "1970" - } - }], - "F-117A": [{ - "default": { - "name": "F-117A Nighthawk", - "text": "The Lockheed F-117 Nighthawk is a semi-retired American single-seat, twin-engine stealth attack aircraft that was developed by Lockheed's secretive Skunk Works division and operated by the United States Air Force (USAF). It was the first operational aircraft to be designed around stealth technology. The F-117 was widely publicized for its role in the Persian Gulf War of 1991. Although it was commonly referred to as the 'Stealth Fighter', it was strictly a ground-attack aircraft. F-117s took part in the conflict in Yugoslavia, where one was shot down and another damaged by surface-to-air missiles (SAM) in 1999. The U.S. Air Force retired the F-117 in April 2008, primarily due to the fielding of the F-22 Raptor. Despite the type's retirement, a portion of the fleet has been kept in airworthy condition, and Nighthawks have been observed flying in 2020.", - "country-of-origin": "USA", - "manufacturer": "Lockheed", - "role": "Stealth Attack", - "year-of-variant-introduction": "1983" - } - }], - "FA-18C_hornet": [{ - "default": { - "name": "F/A-18C Hornet (Lot 20)", - "text": "The F/A-18C Hornet is twin engine, supersonic fighter that is flown by a single pilot in a \"glass cockpit\". It combines extreme maneuverability , a deadly arsenal of weapons, and the ability to operate from an aircraft carrier. Operated by several nations, this multi-role fighter has been instrumental in conflicts from 1986 to today.\n\nThe Hornet is equipped with a large suite of sensors that includes a radar, targeting pod, and a helmet mounted sight. In addition to its internal 20mm cannon, the Hornet can be armed with a large assortment of unguided bombs and rockets, laser and GPS-guided bombs, air-to-surface missiles of all sorts, and both radar and infrared-guided air-to-air missiles.\n\nThe Hornet is also known for its extreme, slow-speed maneuverability in a dogfight. Although incredibly deadly, the Hornet is also a very easy aircraft to fly.", - "country-of-origin": "USA", - "manufacturer": "McDonnell Douglas", - "role": "Carrier-based Multirole Fighter", - "year-of-variant-introduction": "1987" - }, - "Canada": { - "name": "CF-188 Hornet" - }, - "Spain": { - "name": "EF-18A+ Hornet" - } - }], - "FW-190A8": [{ - "default": { - "name": "Fw 190 A-8 Anton", - "text": "Designed for the German Luftwaffe by famed aircraft designer Kurt Tank in the late-1930s, the Fw 190 was the backbone of the Luftwaffe in both fighter and attack bomber roles. Powered by a large radial engine, the A version of the Focke-Wulf 190 was superior in many ways to the Bf 109s and Spitfires at the time of its introduction. In fact, this led to the development of the Mk.IX version of the Spitfire.\n\nMany of the Luftwaffe's aces racked up their impressive kill counts in the Fw 190 A due to its impressive fire power, excellent low to medium altitude performance, durability, and ease of flying. It saw action on both the eastern and western fronts where it was both respected and feared by allied pilots. Armament included two fuselage-mounted 13-mm MG 131 machine guns and four wing-mounted MG 151/20E 20mm cannons. The Anton could also be loaded with unguided rockets and bombs.\n\nThe A-8 version of the Fw 190 entered production in February 1944, and it was powered by a BMW 801 D-2 radial engine. In addition to excellent low- and medium-altitude performance, the engine was also very rugged. Along with the F-8 version, it also had thicker armor around the engine. The engine also received the C3 injection system that provided an emergency boost of 1,980 PS in short durations.", - "country-of-origin": "Germany", - "manufacturer": "Focke-Wulf", - "role": "Fighter", - "year-of-variant-introduction": "1944" - } - }], - "FW-190D9": [{ - "default": { - "name": "Fw 190 D-9 Dora", - "text": "The Focke-Wulf Fw 190 is widely regarded as Germany's best fighter aircraft of World War II. Its appearance in the skies over France in August 1941 was a rude shock to the Allies, as it was clearly superior to any other plane. For nearly a year, the Fw 190 was the unmatched champion of the air war in Europe. The Fw 190 had speed and high altitude performance as its two great assets.\n\nThe development of advanced allied fighters resulted in the Fw 190 D–9 variant which first saw service in September 1944. This variant had a larger nose that housed a more powerful Junkers Jumo engine that produced 2,100 hp with the MW-50 boost system. The D-9 was designed for high altitude aerial combat and is a worthy adversary to the P-51D Mustang.", - "country-of-origin": "Germany", - "manufacturer": "Focke-Wulf", - "role": "Fighter", - "year-of-variant-introduction": "1944" - } - }], - "Hercules": [{ - "default": { - "name": "C-130J-30 Super Hercules", - "text": "The Lockheed Martin C-130J Super Hercules is a four-engine turboprop military transport aircraft. The C-130J is a comprehensive update of the Lockheed C-130 Hercules, with new engines, flight deck, and other systems. As of February 2018, 400 C-130J aircraft have been delivered to 17 nations.", - "country-of-origin": "USA", - "manufacturer": "Lockheed", - "role": "Transport", - "year-of-variant-introduction": "1999" - } - }], - "I-16": [{ - "default": { - "name": "I-16 Ishak", - "text": "I-16 - Soviet single-engine monoplane fighter of 1930s created by aircraft designer Nikolai Polikarpov’s design bureau. It was the one of the world’s first fighters with landing gear retraction system. It was I-16 which stood the air fighting against famous Messerschmitt Bf 109.\n\nOver a period of its history I-16 was upgraded a lot. New modifications of aircraft were created and adopted almost every year. I-16 type 24 was further development of I-16 type 18.\n\nIt is one of the most famous fighters taking part in World War II. It was different from all its “contemporaries” in configuration and flight characteristics. Its uniqueness and distinction were defined by minimum size, dome-shaped fuselage, small wing, dorsal spine.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Polikarpov", - "role": "Fighter", - "year-of-variant-introduction": "1935" - } - }], - "J-11A": [{ - "default": { - "name": "J-11A Flanker-L", - "text": "The Shenyang J-11 (NATO reporting name Flanker-L) is a twin-engine jet fighter whose airframe is based on the Soviet-designed Sukhoi Su-27. It is manufactured by the Shenyang Aircraft Corporation (SAC). The aircraft is operated by the People's Liberation Army Air Force (PLAAF) and the People's Liberation Army Naval Air Force (PLANAF).", - "country-of-origin": "China", - "manufacturer": "Shenyang", - "role": "Air-Superiority Fighter", - "year-of-variant-introduction": "1998" - } - }], - "JAS39Gripen": [{ - "default": { - "name": "JAS 39 Gripen", - "text": "The Saab JAS 39 Gripen is a light single-engine multirole fighter aircraft manufactured by the Swedish aerospace company Saab AB. The Gripen has a delta wing and canard configuration with relaxed stability design and fly-by-wire flight controls. Various versions have been built, grouped as A-, C- and E-series. This is the AA Version, since the Mod for this aircraft splitted it in an AA and AG Version.", - "country-of-origin": "Sweden", - "manufacturer": "Saab AB", - "role": "Fighter", - "year-of-variant-introduction": "2002" - } - }], - "JAS39Gripen_AG": [{ - "default": { - "name": "JAS 39 Gripen A/G", - "text": "The Saab JAS 39 Gripen is a light single-engine multirole fighter aircraft manufactured by the Swedish aerospace company Saab AB. The Gripen has a delta wing and canard configuration with relaxed stability design and fly-by-wire flight controls. Various versions have been built, grouped as A-, C- and E-series. This is the AG Version, since the Mod for this aircraft splitted it in an AA and AG Version.", - "country-of-origin": "Sweden", - "manufacturer": "Saab AB", - "role": "Attack", - "year-of-variant-introduction": "2002" - } - }], - "JF-17": [{ - "default": { - "name": "JF-17 Thunder", - "text": "JF-17 is a single seat, single engine, multirole light fighter that was joint developed by AVIC Chengdu and Pakistan Aeronautical Complex (PAC). The design phase of JF-17 \"Thunder\" finished at May 31st, 2002, and the maiden flight was made on August 25th, 2003. The first plane delivered to PAF (Pakistan Air Force) in 2007. Currently several different blocks of JF-17s are in service in Pakistan and Myanmar air forces. There are also several countries interested in purchasing this fighter jet. On February 27th, 2019, \"Thunder\" has withstood the test of actual combat and helped PAF win an appreciable victory.\n\n\"Thunder\" is a type of fighter that specifically tailored for PAF. The development plan of her predecessor can even be traced back to 1985. At first, PAF was only looking for a fighter that can replace Shenyang J-6 (Chinese version of Mig-19), but they were not satisfied with Chengdu’s J-7M. After more than 20 years of development, the final product \"Thunder\" becomes completely different from J-7M.\n\n\"Thunder\" has a bubble canopy of great view, pretty strake-wing layout and advanced avionics. KLJ-7 radar provides excellent air to ground capability. WMD-7 targeting pod can help \"Thunder\" searching for targets in combat.", - "country-of-origin": "Pakistan/China", - "manufacturer": "PAC/CAC", - "role": "Multirole Fighter", - "year-of-variant-introduction": "2007" - }, - "China": { - "name": "FC-1 Fierce Dragon", - "year-of-variant-introduction": "N/A" - } - }], - "Ju-88A4": [{ - "default": { - "name": "Ju 88 A-4", - "text": "The Junkers Ju 88 is a German World War II Luftwaffe twin-engined multirole combat aircraft. Junkers Aircraft and Motor Works (JFM) designed the plane in the mid-1930s as a so-called Schnellbomber ('fast bomber') that would be too fast for fighters of its era to intercept. It suffered from technical problems during its development and early operational periods but became one of the most versatile combat aircraft of the war. Like a number of other Luftwaffe bombers, it served as a bomber, dive bomber, night fighter, torpedo bomber, reconnaissance aircraft, heavy fighter and at the end of the war, as a flying bomb. Despite a protracted development, it became one of the Luftwaffe's most important aircraft. The assembly line ran constantly from 1936 to 1945 and more than 15,000 Ju 88s were built in dozens of variants, more than any other twin-engine German aircraft of the period. Throughout production the basic structure of the aircraft remained unchanged.", - "country-of-origin": "Germany", - "manufacturer": "Junkers", - "role": "Tactical/Torpedo Bomber", - "year-of-variant-introduction": "1940" - } - }], - "Ka-50": [{ - "default": { - "name": "Ka-50 Hokum", - "text": "The Ka-50 Black Shark (NATO reporting name: Hokum) is a unique and deadly single-seat, Russian attack helicopter that has seen combat in the Northern Caucasus. It combines a high performance dual rotor system with a deadly weapons payload of guided missiles, rockets, bombs, and a 30mm cannon. The Ka-50 is also unique in that it has an ejection seat.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Kamov", - "role": "Attack", - "year-of-variant-introduction": "1995" - } - }], - "KC130": [{ - "default": { - "name": "KC-130", - "text": "The Lockheed Martin (previously Lockheed) KC-130 is a family of the extended-range tanker version of the C-130 Hercules transport aircraft modified for aerial refueling.", - "country-of-origin": "USA", - "manufacturer": "Lockheed Martin", - "role": "Tanker", - "year-of-variant-introduction": "1962" - } - }], - "KC-135": [{ - "default": { - "name": "KC-135 Stratotanker", - "text": "The Boeing KC-135 Stratotanker is a military aerial refueling aircraft that was developed from the Boeing 367-80 prototype, alongside the Boeing 707 airliner.", - "country-of-origin": "USA", - "manufacturer": "Beoing", - "role": "Tanker", - "year-of-variant-introduction": "1957" - } - }], - "KC135MPRS": [{ - "default": { - "name": "KC-135 Stratotanker MPRS", - "text": "The Boeing KC-135 Stratotanker is a military aerial refueling aircraft that was developed from the Boeing 367-80 prototype, alongside the Boeing 707 airliner. This model has the Multi-point Refueling System modification, allowing for probe and drogue refuelling.", - "country-of-origin": "USA", - "manufacturer": "Beoing", - "role": "Tanker", - "year-of-variant-introduction": "1994" - } - }], - "L-39C": [{ - "default": { - "name": "L-39C Albatros", - "text": "Two seat Jet trainer aircraft L-39C is intended for basic and advanced pilot training in visual and instrument flight rules weather conditions, day and night and also for combat use against air and ground targets. Its development started in the middle 60s of the last century by the Czech “Aero Vodochody”. In the 70s the aircraft has entered service and is still in the operational use in over 30 countries worldwide.", - "country-of-origin": "Czechoslovakia", - "manufacturer": "Aero", - "role": "Trainer", - "year-of-variant-introduction": "1972" - } - }], - "L-39ZA": [{ - "default": { - "name": "L-39ZA Albatros", - "text": "Two seat Jet trainer aircraft L-39C is intended for basic and advanced pilot training in visual and instrument flight rules weather conditions, day and night and also for combat use against air and ground targets. Its development started in the middle 60s of the last century by the Czech “Aero Vodochody”. In the 70s the aircraft has entered service and is still in the operational use in over 30 countries worldwide.", - "country-of-origin": "Czechoslovakia", - "manufacturer": "Aero", - "role": "Light Attack", - "year-of-variant-introduction": "1977" - } - }], - "M-2000C": [{ - "default": { - "name": "Mirage 2000C", - "text": "The M-2000C is a multi-role, French-designed, 4th generation fighter. It was designed in the 1970s as a lightweight fighter and in excess of 600 M-2000C aircraft have been built. The M2000C is a single-engine fighter will a low-set delta wing with no horizontal tail. It has excellent maneuverability given its relaxed stability and fly-by-wire flight control system. The M2000C also includes a multi-mode RDI radar that is capable tracking and engaging targets at beyond visual ranges. In addition to engaging other aircraft with cannon and missiles, the M2000C can also engage ground targets with cannon, rockets and bombs.", - "country-of-origin": "France", - "manufacturer": "Dassault", - "role": "Multirole Fighter", - "year-of-variant-introduction": "1983" - } - }], - "MB-339PAN":[{ - "default": { - "name": "MB-339PAN", - "text": "The Aermacchi MB-339 is a military jet trainer and light attack aircraft designed and manufactured by Italian aviation company Aermacchi.", - "country-of-origin": "Italy", - "manufacturer": "Aermacchi", - "role": "Aerobatic", - "year-of-variant-introduction": "1982" - } - }], - "Mirage 2000-5": [{ - "default": { - "name": "Mirage 2000-5", - "text": "The Dassault Mirage 2000 is a French multirole, single-engined, fourth-generation jet fighter manufactured by Dassault Aviation. It was designed in the late 1970s as a lightweight fighter to replace the Mirage III for the French Air Force (Armée de l'air). The Mirage 2000 evolved into a multirole aircraft with several variants developed, with sales to a number of nations. It was later developed into the Mirage 2000N and 2000D strike variants, the improved Mirage 2000-5, and several export variants. Over 600 aircraft were built and it has been in service with 9 nations.", - "country-of-origin": "France", - "manufacturer": "Dassault", - "role": "Multirole Fighter", - "year-of-variant-introduction": "1997" - } - }], - "Mi-24V": [{ - "default": { - "name": "Mi-24V Hind-E", - "text": "The Mil Mi-24 (Russian: Миль Ми-24; NATO reporting name: Hind) is a large helicopter gunship, attack helicopter and low-capacity troop transport with room for eight passengers. It is produced by Mil Moscow Helicopter Plant and has been operated since 1972 by the Soviet Air Force and its successors, along with 48 other nations. Soviet pilots called the Mi-24 the 'flying tank' (Russian: летающий танк, romanized: letayushchiy tank), a term used historically with the famous World War II Soviet Il-2 Shturmovik armored ground attack aircraft. More common unofficial nicknames were 'Galina' (or 'Galya'), 'Crocodile' (Russian: Крокодил, romanized: Krokodil), due to the helicopter's camouflage scheme, and 'Drinking Glass' (Russian: Стакан, romanized: Stakan), because of the flat glass plates that surround earlier Mi-24 variants' cockpits. It served to a great success in the Afghanistan war, until the Taliban where equiped with Stinger Misseles from the CIA.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Mil", - "role": "Attack/Transport", - "year-of-variant-introduction": "1976" - } - }], - "Mi-28N": [{ - "default": { - "name": "Mi-28N Havoc", - "text": "The Mil Mi-28 (NATO reporting name 'Havoc') is a Russian all-weather, day-night, military tandem, two-seat anti-armor attack helicopter. It is an attack helicopter with no intended secondary transport capability, better optimized than the Mil Mi-24 gunship for the role. It carries a single gun in an undernose barbette, plus external loads carried on pylons beneath stub wings.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Mil", - "role": "Attack", - "year-of-variant-introduction": "2009" - } - }], - "Mi-8MT": [{ - "default": { - "name": "Mi-8MTV2 Hip", - "text": "The Mil Mi-8MTV2 is an upgraded version of one of the most widely produced helicopters in history and a combat transport and fire support veteran of countless operations around the world.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Mil", - "role": "Transport/Light Attack", - "year-of-variant-introduction": "1981" - } - }], - "MiG-15bis": [{ - "default": { - "name": "MiG-15bis Fagot", - "text": "Developed in the years immediately following World War II, the MiG-15bis was a first-generation jet fighter designed by the Mikoyan-Gurevich design bureau of the Soviet Union. The MiG-15bis is a single engine, swept-wing jet that saw over 15,000 copies produced. The MiG-15 gained fame in the skies over Korea where it battled the F-86 Sabre and other allied aircraft. It proved an excellent match to the Sabre, and it often came down to the skill of the pilot that determined who made it home and who was left dangling from a parachute. Having an excellent thrust-to-weight ratio and good climbing characteristics, the MiG-15bis was also armed with two NR-23 23mm cannons and a single, powerful N-37 37mm cannon. Not surprisingly, it is considered by many as one of the deadliest fighters of the era.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Mikoyan-Gurevich", - "role": "Fighter", - "year-of-variant-introduction": "1950" - } - }], - "MiG-19P": [{ - "default": { - "name": "MiG-19P Farmer-B", - "text": "The MiG-19P Farmer was designed by the legendary Mikoyan Design Bureau in the Early 1950’s. The MiG-19 fighter was the Soviet Union’s first true supersonic Interceptor that could exceed Mach 1 in level flight.\n\nDesigned to take on enemy fighters and bombers at any time of day or night and in any weather condition, the Farmer was equipped with the RP-5 lzumrud radar in the nose and armed with two NR-30 30mm cannons in the wing roots. The Farmer is also able to carry an array of ground attack weapons that includes S-5M rockets and various general-purpose bombs. It is a lethal interceptor with conventional ground attack capabilities.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Mikoyan-Gurevich", - "role": "Fighter", - "year-of-variant-introduction": "1955" - }, - "China": { - "name": "J-6A", - "country-of-origin": "China", - "manufacturer": "Shenyang", - "year-of-variant-introduction": "1962" - } - }], - "MiG-21Bis": [{ - "default": { - "name": "MiG-21bis Fishbed-N", - "text": "The MiG-21bis is a delta wing, supersonic, fighter-interceptor jet aircraft. Much like the AK-47 became the everyman's rifle, the MiG-21 has been operated by more than 40 countries worldwide, and has enjoyed the longest production run of any modern jet fighter to date. The MiG-21, in all of its variants, has fought in wars stretching all the way from the Vietnam War in the 1960's to the modern day Syrian Civil War. Owing to its unique blend of versatility, ruggedness and maintainability, the MiG-21 remains in active service to this very day.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Mikoyan-Gurevich", - "role": "Fighter", - "year-of-variant-introduction": "1972" - }, - "China": { - "name": "J-7B", - "country-of-origin": "China", - "manufacturer": "Chengdu", - "year-of-variant-introduction": "1992" - } - }], - "MiG-23MLD": [{ - "default": { - "name": "MiG-23MLD Flogger-K", - "text": "The Mikoyan-Gurevich MiG-23 (Russian: Микоян и Гуревич МиГ-23; NATO reporting name: Flogger) is a variable-geometry fighter aircraft, designed by the Mikoyan-Gurevich design bureau in the Soviet Union. It is a third-generation jet fighter, the world's most-produced variable-geometry aircraft, along with similar Soviet aircraft such as the Su-17 'Fitter'. It was the first Soviet fighter to field a look-down/shoot-down radar, the RP-23 Sapfir, and one of the first to be armed with beyond-visual-range missiles. Production started in 1969 and reached large numbers with over 5,000 aircraft built, making it the most produced variable-sweep wing aircraft in history. Today the MiG-23 remains in limited service with some export customers.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Mikoyan-Gurevich", - "role": "Fighter", - "year-of-variant-introduction": "1982" - }, - "Iraq": { - "name": "MiG-23ML Flogger-G", - "year-of-variant-introduction": "1981" - } - }], - "MiG-25PD": [{ - "default": { - "name": "MiG-25PD Foxbat-E", - "text": "The Mikoyan-Gurevich MiG-25 (Russian: Микоян и Гуревич МиГ-25; NATO reporting name: Foxbat) is a supersonic interceptor and reconnaissance aircraft that was among the fastest military aircraft to enter service. It was designed by the Soviet Union's Mikoyan-Gurevich bureau and is one of the few combat aircraft built primarily using stainless steel. It was the last plane designed by Mikhail Gurevich before his retirement. The first prototype flew in 1964, and the aircraft entered service in 1970. The MiG-25 was theoretically capable of a maximum speed exceeding Mach 3 and a ceiling of 27 km (89,000 ft). Its high speed was problematic: although sufficient thrust was available to reach Mach 3.2, a limit of Mach 2.83 had to be imposed as the engines tended to overspeed and overheat at higher air speeds, possibly damaging them beyond repair. The MiG-25 features powerful radar and four air-to-air missiles. When first seen in reconnaissance photography, the large wings suggested an enormous and highly maneuverable fighter, at a time when U.S. design theories were also evolving towards higher maneuverability due to combat performance in the Vietnam War. The appearance of the MiG-25 sparked serious concern in the West and prompted dramatic increases in performance for the McDonnell Douglas F-15 Eagle, then under development in the late 1960s. The capabilities of the MiG-25 were better understood by the west in 1976 when Soviet pilot Viktor Belenko defected in a MiG-25 to the United States via Japan. It turned out that the aircraft's weight necessitated its large wings.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Mikoyan-Gurevich", - "role": "Interceptor", - "year-of-variant-introduction": "1979" - } - }], - "MiG-25RBT": [{ - "default": { - "name": "MiG-25RBT Foxbat-B", - "text": "The Mikoyan-Gurevich MiG-25 (Russian: Микоян и Гуревич МиГ-25; NATO reporting name: Foxbat) is a supersonic interceptor and reconnaissance aircraft that was among the fastest military aircraft to enter service. It was designed by the Soviet Union's Mikoyan-Gurevich bureau and is one of the few combat aircraft built primarily using stainless steel. It was the last plane designed by Mikhail Gurevich before his retirement. The first prototype flew in 1964, and the aircraft entered service in 1970. The MiG-25 was theoretically capable of a maximum speed exceeding Mach 3 and a ceiling of 27 km (89,000 ft). Its high speed was problematic: although sufficient thrust was available to reach Mach 3.2, a limit of Mach 2.83 had to be imposed as the engines tended to overspeed and overheat at higher air speeds, possibly damaging them beyond repair. The MiG-25 features powerful radar and four air-to-air missiles. When first seen in reconnaissance photography, the large wings suggested an enormous and highly maneuverable fighter, at a time when U.S. design theories were also evolving towards higher maneuverability due to combat performance in the Vietnam War. The appearance of the MiG-25 sparked serious concern in the West and prompted dramatic increases in performance for the McDonnell Douglas F-15 Eagle, then under development in the late 1960s. The capabilities of the MiG-25 were better understood by the west in 1976 when Soviet pilot Viktor Belenko defected in a MiG-25 to the United States via Japan. It turned out that the aircraft's weight necessitated its large wings.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Mikoyan-Gurevich", - "role": "Strike Fighter", - "year-of-variant-introduction": "1970" - } - }], - "MiG-27K": [{ - "default": { - "name": "MiG-27K Flogger-J2", - "text": "The Mikoyan MiG-27 (Russian: Микоян МиГ-27; NATO reporting name: Flogger-D/J) is a variable-sweep ground-attack aircraft, originally built by the Mikoyan-Gurevich design bureau in the Soviet Union and later licence-produced in India by Hindustan Aeronautics as the Bahadur ('Valiant'). It is based on the Mikoyan-Gurevich MiG-23 fighter aircraft, but optimised for air-to-ground attack. Unlike the MiG-23, the MiG-27 did not have widespread use outside Russia, as most countries opted for the Mikoyan-Gurevich MiG-23BN and Sukhoi Su-22 instead. It remains in service only with the Kazakh Air Forces in the ground attack role. All Russian, Indian and Ukrainian MiG-27s have been retired.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Mikoyan", - "role": "Attack", - "year-of-variant-introduction": "1975" - } - }], - "MiG-29A": [{ - "default": { - "name": "MiG-29A Fulcrum-A", - "text": "The MiG-29 \"Fulcrum\" is a Russian-designed, twin-engine, supersonic fighter. First operational in the early 1980s, the Fulcrum is a \"light weight\" fighter, comparable to the American F/A-18 Hornet and F-16. Designed to work in conjunction with the larger Su-27 Flanker, the MiG-29 is armed with an internal 30mm cannon and both infrared and radar guided air-to-air missiles. For air-to-ground tasks, the MiG-29 can be armed with a large array of unguided bombs and rockets.\n\nIn addition to a sophisticated pulse doppler radar, the MiG-29 is also equipped with a passive Infrared Search and Track (IRST) sensor that allows the Fulcrum to detect and target enemy aircraft just based on target infrared emissions. This allows the MiG-29 to make stealthy attacks with no warning!\n\nThe Fulcrum is a highly-maneuverable fighter in a dogfight, and when paired with the helmet mounted sight and the AA-11 \"Archer\" air-to-air missile, it is a very lethal adversary.\n\nThe MiG-29 has also been widely exported and has served in many countries that include Germany, Iran, Ukraine, and Poland.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Mikoyan", - "role": "Multirole Fighter", - "year-of-variant-introduction": "1983" - } - }], - "MiG-29G": [{ - "default": { - "name": "MiG-29G Fulcrum-A", - "text": "The MiG-29 \"Fulcrum\" is a Russian-designed, twin-engine, supersonic fighter. First operational in the early 1980s, the Fulcrum is a \"light weight\" fighter, comparable to the American F/A-18 Hornet and F-16. Designed to work in conjunction with the larger Su-27 Flanker, the MiG-29 is armed with an internal 30mm cannon and both infrared and radar guided air-to-air missiles. For air-to-ground tasks, the MiG-29 can be armed with a large array of unguided bombs and rockets.\n\nIn addition to a sophisticated pulse doppler radar, the MiG-29 is also equipped with a passive Infrared Search and Track (IRST) sensor that allows the Fulcrum to detect and target enemy aircraft just based on target infrared emissions. This allows the MiG-29 to make stealthy attacks with no warning!\n\nThe Fulcrum is a highly-maneuverable fighter in a dogfight, and when paired with the helmet mounted sight and the AA-11 \"Archer\" air-to-air missile, it is a very lethal adversary.\n\nThe MiG-29 has also been widely exported and has served in many countries that include Germany, Iran, Ukraine, and Poland.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Mikoyan", - "role": "Multirole Fighter", - "year-of-variant-introduction": "1993" - } - }], - "MiG-29S": [{ - "default": { - "name": "MiG-29S Fulcrum-C", - "text": "The MiG-29 \"Fulcrum\" is a Russian-designed, twin-engine, supersonic fighter. First operational in the early 1980s, the Fulcrum is a \"light weight\" fighter, comparable to the American F/A-18 Hornet and F-16. Designed to work in conjunction with the larger Su-27 Flanker, the MiG-29 is armed with an internal 30mm cannon and both infrared and radar guided air-to-air missiles. For air-to-ground tasks, the MiG-29 can be armed with a large array of unguided bombs and rockets.\n\nIn addition to a sophisticated pulse doppler radar, the MiG-29 is also equipped with a passive Infrared Search and Track (IRST) sensor that allows the Fulcrum to detect and target enemy aircraft just based on target infrared emissions. This allows the MiG-29 to make stealthy attacks with no warning!\n\nThe Fulcrum is a highly-maneuverable fighter in a dogfight, and when paired with the helmet mounted sight and the AA-11 \"Archer\" air-to-air missile, it is a very lethal adversary.\n\nThe MiG-29 has also been widely exported and has served in many countries that include Germany, Iran, Ukraine, and Poland.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Mikoyan", - "role": "Multirole Fighter", - "year-of-variant-introduction": "1983" - } - }], - "MiG-31": [{ - "default": { - "name": "MiG-31 Foxhound", - "text": "The Mikoyan MiG-31 (Russian: Микоян МиГ-31; NATO reporting name: Foxhound) is a supersonic interceptor aircraft that was developed for use by the Soviet Air Forces. The aircraft was designed by the Mikoyan design bureau as a replacement for the earlier MiG-25 \"Foxbat\"; the MiG-31 is based on and shares design elements with the MiG-25. The MiG-31 is among the fastest combat jets in the world. It continues to be operated by the Russian Air Force and the Kazakhstan Air Force following the end of the Cold War and the collapse of the Soviet Union in 1991. The Russian Defence Ministry expects the MiG-31 to remain in service until 2030 or beyond and was confirmed in 2020 when an announcement was made to extend the service lifetime from 2,500 to 3,500 hours on the existing airframes.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Mikoyan", - "role": "Interceptor", - "year-of-variant-introduction": "1981" - } - }], - "OH-58D": [{ - "default": { - "name": "OH-58D Kiowa Warrior", - "text": "The Bell OH-58 Kiowa is a family of single-engine, single-rotor, military helicopters used for observation, utility, and direct fire support. Bell Helicopter manufactured the OH-58 for the United States Army based on its Model 206A JetRanger helicopter. The OH-58 was in continuous U.S. Army service from 1969 to 2017, when it was replaced in these roles by the Boeing AH-64 Apache and Eurocopter UH-72 Lakota. The latest model, the OH-58D Kiowa Warrior, is primarily operated in an armed reconnaissance role in support of ground troops. The OH-58 has been exported to Austria, Canada, Croatia, the Dominican Republic, Taiwan, Saudi Arabia, and Greece. It has also been produced under license in Australia.", - "country-of-origin": "USA", - "manufacturer": "Bell", - "role": "Light Attack/Forward Air Control", - "year-of-variant-introduction": "1983" - } - }], - "P-47D-30": [{ - "default": { - "name": "P-47D-30 Thunderbolt (Late)", - "text": "The P-47 Thunderbolt, nicknamed the Jug, served the United States Army Air Forces (USAAF) in World War II with distinction. In total 15,636 were built between 1941 and 1945. France, the United Kingdom, the Soviet Union, Mexico and Brazil also operated the P-47. It was armed with an impressive eight .50-caliber machine guns with 425 rounds per gun. In addition the Jug was armed with bombs and rockets and it excelled in the ground attack role. The P-47 also served in the bomber escort role before the introduction of the P-51 Mustang which had longer range.\n\nPowered by an R-2800-59 Double Wasp turbocharged radial engine, the aircraft enjoyed exceptional power and durability. The Jug substantial weight gave it tremendous dive speed acceleration but the aircraft suffered from quite low Mach limits and hence the aircraft was equipped with dive flaps to avoid dangerous effects of compressibility. The bubble canopy of the D version of the P-47 provided excellent all round visibility.", - "country-of-origin": "USA", - "manufacturer": "Republic", - "role": "Fighter-Bomber", - "year-of-variant-introduction": "1944" - }, - "UK": { - "name": "Thunderbolt Mk.II (Mid)" - } - }], - "P-47D-30bl1": [{ - "default": { - "name": "P-47D-30 Thunderbolt (Early)", - "text": "The P-47 Thunderbolt, nicknamed the Jug, served the United States Army Air Forces (USAAF) in World War II with distinction. In total 15,636 were built between 1941 and 1945. France, the United Kingdom, the Soviet Union, Mexico and Brazil also operated the P-47. It was armed with an impressive eight .50-caliber machine guns with 425 rounds per gun. In addition the Jug was armed with bombs and rockets and it excelled in the ground attack role. The P-47 also served in the bomber escort role before the introduction of the P-51 Mustang which had longer range.\n\nPowered by an R-2800-59 Double Wasp turbocharged radial engine, the aircraft enjoyed exceptional power and durability. The Jug substantial weight gave it tremendous dive speed acceleration but the aircraft suffered from quite low Mach limits and hence the aircraft was equipped with dive flaps to avoid dangerous effects of compressibility. The bubble canopy of the D version of the P-47 provided excellent all round visibility.", - "country-of-origin": "USA", - "manufacturer": "Republic", - "role": "Fighter-Bomber", - "year-of-variant-introduction": "1944" - }, - "UK": { - "name": "Thunderbolt Mk.II (Early)" - } - }], - "P-47D-40": [{ - "default": { - "name": "P-47D-40 Thunderbolt", - "text": "The P-47 Thunderbolt, nicknamed the Jug, served the United States Army Air Forces (USAAF) in World War II with distinction. In total 15,636 were built between 1941 and 1945. France, the United Kingdom, the Soviet Union, Mexico and Brazil also operated the P-47. It was armed with an impressive eight .50-caliber machine guns with 425 rounds per gun. In addition the Jug was armed with bombs and rockets and it excelled in the ground attack role. The P-47 also served in the bomber escort role before the introduction of the P-51 Mustang which had longer range.\n\nPowered by an R-2800-59 Double Wasp turbocharged radial engine, the aircraft enjoyed exceptional power and durability. The Jug substantial weight gave it tremendous dive speed acceleration but the aircraft suffered from quite low Mach limits and hence the aircraft was equipped with dive flaps to avoid dangerous effects of compressibility. The bubble canopy of the D version of the P-47 provided excellent all round visibility.", - "country-of-origin": "USA", - "manufacturer": "Republic", - "role": "Fighter-Bomber", - "year-of-variant-introduction": "1944" - }, - "UK": { - "name": "Thunderbolt Mk.II (Late)" - } - }], - "P-51D": [{ - "default": { - "name": "P-51D-25-NA Mustang", - "text": "The North American Aviation P-51 Mustang is an American long-range, single-seat fighter and fighter-bomber used during World War II and the Korean War, among other conflicts. From late 1943, P-51Bs and P-51Cs (supplemented by P-51Ds from mid-1944) were used by the USAAF's Eighth Air Force to escort bombers in raids over Germany, while the RAF's Second Tactical Air Force and the USAAF's Ninth Air Force used the Merlin-powered Mustangs as fighter-bombers, roles in which the Mustang helped ensure Allied air superiority in 1944. The P-51 was also used by Allied air forces in the North African, Mediterranean, Italian, and Pacific theaters. During World War II, Mustang pilots claimed to have destroyed 4,950 enemy aircraft. At the start of the Korean War, the Mustang, by then redesignated F-51, was the main fighter of the United States until jet fighters, including North American's F-86, took over this role; the Mustang then became a specialized fighter-bomber. Despite the advent of jet fighters, the Mustang remained in service with some air forces until the early 1980s. After the Korean War, Mustangs became popular civilian warbirds and air racing aircraft.", - "country-of-origin": "USA", - "manufacturer": "North American", - "role": "Fighter", - "year-of-variant-introduction": "1944" - }, - "UK": { - "name": "Mustang Mk.IV (Early)" - } - }], - "P-51D-30-NA": [{ - "default": { - "name": "P-51D-30-NA Mustang", - "text": "The North American Aviation P-51 Mustang is an American long-range, single-seat fighter and fighter-bomber used during World War II and the Korean War, among other conflicts. From late 1943, P-51Bs and P-51Cs (supplemented by P-51Ds from mid-1944) were used by the USAAF's Eighth Air Force to escort bombers in raids over Germany, while the RAF's Second Tactical Air Force and the USAAF's Ninth Air Force used the Merlin-powered Mustangs as fighter-bombers, roles in which the Mustang helped ensure Allied air superiority in 1944. The P-51 was also used by Allied air forces in the North African, Mediterranean, Italian, and Pacific theaters. During World War II, Mustang pilots claimed to have destroyed 4,950 enemy aircraft. At the start of the Korean War, the Mustang, by then redesignated F-51, was the main fighter of the United States until jet fighters, including North American's F-86, took over this role; the Mustang then became a specialized fighter-bomber. Despite the advent of jet fighters, the Mustang remained in service with some air forces until the early 1980s. After the Korean War, Mustangs became popular civilian warbirds and air racing aircraft.", - "country-of-origin": "USA", - "manufacturer": "North American", - "role": "Fighter", - "year-of-variant-introduction": "1944" - }, - "UK": { - "name": "Mustang Mk.IV (Late)" - } - }], - "Rafale_A_S": [{ - "default": { - "name": "Rafale M (Air-to-Ground)", - "text": "The Dassault Rafale (French pronunciation: ​[ʁafal], literally meaning \"gust of wind\", and \"burst of fire\" in a more military sense) is a French twin-engine, canard delta wing, multirole fighter aircraft designed and built by Dassault Aviation. Equipped with a wide range of weapons, the Rafale is intended to perform air supremacy, interdiction, aerial reconnaissance, ground support, in-depth strike, anti-ship strike and nuclear deterrence missions. The Rafale is referred to as an \"omnirole\" aircraft by Dassault. The Rafale has been used in combat over Afghanistan, Libya, Mali, Iraq and Syria.", - "country-of-origin": "France", - "manufacturer": "Dassault", - "role": "Multirole Fighter", - "year-of-variant-introduction": "2001" - } - }], - "Rafale_B": [{ - "default": { - "name": "Rafale B", - "text": "The Dassault Rafale (French pronunciation: ​[ʁafal], literally meaning \"gust of wind\", and \"burst of fire\" in a more military sense) is a French twin-engine, canard delta wing, multirole fighter aircraft designed and built by Dassault Aviation. Equipped with a wide range of weapons, the Rafale is intended to perform air supremacy, interdiction, aerial reconnaissance, ground support, in-depth strike, anti-ship strike and nuclear deterrence missions. The Rafale is referred to as an \"omnirole\" aircraft by Dassault. The Rafale has been used in combat over Afghanistan, Libya, Mali, Iraq and Syria.", - "country-of-origin": "France", - "manufacturer": "Dassault", - "role": "Carrier-based Multirole Fighter", - "year-of-variant-introduction": "2006" - } - }], - "Rafale_M": [{ - "default": { - "name": "Rafale M (Air-to-Air)", - "text": "The Dassault Rafale (French pronunciation: ​[ʁafal], literally meaning \"gust of wind\", and \"burst of fire\" in a more military sense) is a French twin-engine, canard delta wing, multirole fighter aircraft designed and built by Dassault Aviation. Equipped with a wide range of weapons, the Rafale is intended to perform air supremacy, interdiction, aerial reconnaissance, ground support, in-depth strike, anti-ship strike and nuclear deterrence missions. The Rafale is referred to as an \"omnirole\" aircraft by Dassault. The Rafale has been used in combat over Afghanistan, Libya, Mali, Iraq and Syria.", - "country-of-origin": "France", - "manufacturer": "Dassault", - "role": "Multirole Fighter", - "year-of-variant-introduction": "2001" - } - }], - "S-3B": [{ - "default": { - "name": "S-3B Viking", - "text": "The Lockheed S-3 Viking is a 4-crew, twin-engine turbofan-powered jet aircraft that was used by the U.S. Navy (USN) primarily for anti-submarine warfare. In the late 1990s, the S-3B's mission focus shifted to surface warfare and aerial refueling. The Viking also provided electronic warfare and surface surveillance capabilities to a carrier battle group. A carrier-based, subsonic, all-weather, long-range, multi-mission aircraft, it carried automated weapon systems and was capable of extended missions with in-flight refueling. Because of its characteristic sound, it was nicknamed the \"War Hoover\" after the vacuum cleaner brand. The S-3 was phased out from front-line fleet service aboard aircraft carriers in January 2009, with its missions taken over by aircraft like the P-3C Orion, P-8 Poseidon, Sikorsky SH-60 Seahawk and Boeing F/A-18E/F Super Hornet", - "country-of-origin": "USA", - "manufacturer": "Lockheed", - "role": "Carrier-based Attack", - "year-of-variant-introduction": "1984" - } - }], - "S-3B Tanker": [{ - "default": { - "name": "S-3B Tanker", - "text": "The Lockheed S-3 Viking is a 4-crew, twin-engine turbofan-powered jet aircraft that was used by the U.S. Navy (USN) primarily for anti-submarine warfare. In the late 1990s, the S-3B's mission focus shifted to surface warfare and aerial refueling. The Viking also provided electronic warfare and surface surveillance capabilities to a carrier battle group. A carrier-based, subsonic, all-weather, long-range, multi-mission aircraft, it carried automated weapon systems and was capable of extended missions with in-flight refueling. Because of its characteristic sound, it was nicknamed the \"War Hoover\" after the vacuum cleaner brand. The S-3 was phased out from front-line fleet service aboard aircraft carriers in January 2009, with its missions taken over by aircraft like the P-3C Orion, P-8 Poseidon, Sikorsky SH-60 Seahawk and Boeing F/A-18E/F Super Hornet", - "country-of-origin": "USA", - "manufacturer": "Lockheed", - "role": "Carrier-based Tanker", - "year-of-variant-introduction": "1984" - } - }], - "SA342L": [{ - "default": { - "name": "SA 342L Gazelle", - "text": "The SA342 Gazelle is a light scout/attack and transport helicopter. It was introduced in 1968 as a result of cooperation between Aérospatiale and Westland Aircraft. Operated by 23 countries, the Gazelle has served in combat operations across the world including the 1991 Gulf War, 1982 Lebanon War, Syria, and other conflicts.\n\nThe Gazelle is powered by a single turbine engine that is connected to three glass-fiber reinforced plastic main rotor blades with a bearingless main rotor developed by Bölkow GmbH. It is also the first helicopter which features the famous Fenestron tail rotor.", - "country-of-origin": "France", - "manufacturer": "Aérospatiale", - "role": "Light Attack", - "year-of-variant-introduction": "1977" - } - }], - "SA342M": [{ - "default": { - "name": "SA 342M Gazelle", - "text": "The SA342 Gazelle is a light scout/attack and transport helicopter. It was introduced in 1968 as a result of cooperation between Aérospatiale and Westland Aircraft. Operated by 23 countries, the Gazelle has served in combat operations across the world including the 1991 Gulf War, 1982 Lebanon War, Syria, and other conflicts.\n\nThe Gazelle is powered by a single turbine engine that is connected to three glass-fiber reinforced plastic main rotor blades with a bearingless main rotor developed by Bölkow GmbH. It is also the first helicopter which features the famous Fenestron tail rotor.", - "country-of-origin": "France", - "manufacturer": "Aérospatiale", - "role": "Light Attack", - "year-of-variant-introduction": "1977" - }, - "UK": { - "name": "Gazelle AH.1", - "manufacturer": "Westland", - "year-of-variant-introduction": "1974" - } - }], - "SA342Mistral": [{ - "default": { - "name": "SA 342M Gazelle Mistral", - "text": "The SA342 Gazelle is a light scout/attack and transport helicopter. It was introduced in 1968 as a result of cooperation between Aérospatiale and Westland Aircraft. Operated by 23 countries, the Gazelle has served in combat operations across the world including the 1991 Gulf War, 1982 Lebanon War, Syria, and other conflicts.\n\nThe Gazelle is powered by a single turbine engine that is connected to three glass-fiber reinforced plastic main rotor blades with a bearingless main rotor developed by Bölkow GmbH. It is also the first helicopter which features the famous Fenestron tail rotor.", - "country-of-origin": "France", - "manufacturer": "Aérospatiale", - "role": "Light Attack", - "year-of-variant-introduction": "1977" - } - }], - "SH-60B": [{ - "default": { - "name": "SH-60B Seahawk", - "text": "The Sikorsky SH-60/MH-60 Seahawk (or Sea Hawk) is a twin turboshaft engine, multi-mission United States Navy helicopter based on the United States Army UH-60 Black Hawk and a member of the Sikorsky S-70 family. The most significant modifications are the folding main rotor and a hinged tail to reduce its footprint aboard ships. The U.S. Navy uses the H-60 airframe under the model designations SH-60B, SH-60F, HH-60H, MH-60R, and MH-60S. Able to deploy aboard any air-capable frigate, destroyer, cruiser, fast combat support ship, amphibious assault ship, Littoral combat ship or aircraft carrier, the Seahawk can handle anti-submarine warfare (ASW), anti-surface warfare (ASUW), naval special warfare (NSW) insertion, search and rescue (SAR), combat search and rescue (CSAR), vertical replenishment (VERTREP), and medical evacuation (MEDEVAC).", - "country-of-origin": "USA", - "manufacturer": "Sikorsky", - "role": "Transport/Anti-Ship", - "year-of-variant-introduction": "1984" - } - }], - "SpitfireLFMkIX": [{ - "default": { - "name": "Spitfire LF Mk IX", - "text": "The British Spitfire is one of the most iconic fighter aircraft of World War II. Most famous for its role in the Battle of Britain, the Spitfire served as Britain's primary fighter during the entirety of the war. The Spitfire combines graceful lines, eye-watering dogfight performance, and heavy firepower in its later variants.\n\nThe Spitfire Mk IX was originally developed as a stopgap measure as a response to the appearance of the Focke-Wulf FW 190A.\n\nThe Spitfire IX is powered by the Merlin 66. This engine produces its best performance at slightly lower altitudes than the older Merlin 61. Spitfires equipped with this engine were designated LF Mk IX. This was the most numerous version of the Mk IX, with 4,010 produced. The majority of Mk IXs of all types used the standard \"c\" wing, which would often carry two 20mm cannon and four .303in machine guns.\n\nThe Mk IX was a significant improvement on the Mk V. It had a top speed of 409 mph at 28,000 feet, an increase of 40 miles per hour. Its service ceiling rose from 36,200 feet to 43,000 feet. It could climb at 4,000 feet per minute. In July 1942, an early Mk IX was flown against a captured Fw 190A, and the two aircraft were discovered to have very similar capabilities. The RAF had its answer to the Fw 190 problem.\n\nThe Mk IX replaced the Mk V from June 1942. It allowed the RAF to go back onto the offensive in occupied Europe, and resume the \"circus\", \"ramrod\" and \"rodeo\" raids. Its first combat success came on 30 July 1942, when a Spitfire Mk IX shot down a Fw 190. Amongst other notable achievements, the Mk IX took part in the highest altitude combat of the Second World War, when it intercepted a Ju 86R at 43,000 feet over Southampton on 12 September 1942. On 5 October 1944 Spitfire Mk IXs of 401 Squadron were the first allied aircraft to shoot down an Me 262 Jet. The Mk IX remained in service until the end of the war, even after the appearance of the Griffon powered Mk XIV.", - "country-of-origin": "UK", - "manufacturer": "Supermarine", - "role": "Fighter", - "year-of-variant-introduction": "1943" - } - }], - "SpitfireLFMkIXCW": [{ - "default": { - "name": "Spitfire LF Mk IX (Clipped Wings)", - "text": "The British Spitfire is one of the most iconic fighter aircraft of World War II. Most famous for its role in the Battle of Britain, the Spitfire served as Britain's primary fighter during the entirety of the war. The Spitfire combines graceful lines, eye-watering dogfight performance, and heavy firepower in its later variants.\n\nThe Spitfire Mk IX was originally developed as a stopgap measure as a response to the appearance of the Focke-Wulf FW 190A.\n\nThe Spitfire IX is powered by the Merlin 66. This engine produces its best performance at slightly lower altitudes than the older Merlin 61. Spitfires equipped with this engine were designated LF Mk IX. This was the most numerous version of the Mk IX, with 4,010 produced. The majority of Mk IXs of all types used the standard \"c\" wing, which would often carry two 20mm cannon and four .303in machine guns.\n\nThe Mk IX was a significant improvement on the Mk V. It had a top speed of 409 mph at 28,000 feet, an increase of 40 miles per hour. Its service ceiling rose from 36,200 feet to 43,000 feet. It could climb at 4,000 feet per minute. In July 1942, an early Mk IX was flown against a captured Fw 190A, and the two aircraft were discovered to have very similar capabilities. The RAF had its answer to the Fw 190 problem.\n\nThe Mk IX replaced the Mk V from June 1942. It allowed the RAF to go back onto the offensive in occupied Europe, and resume the \"circus\", \"ramrod\" and \"rodeo\" raids. Its first combat success came on 30 July 1942, when a Spitfire Mk IX shot down a Fw 190. Amongst other notable achievements, the Mk IX took part in the highest altitude combat of the Second World War, when it intercepted a Ju 86R at 43,000 feet over Southampton on 12 September 1942. On 5 October 1944 Spitfire Mk IXs of 401 Squadron were the first allied aircraft to shoot down an Me 262 Jet. The Mk IX remained in service until the end of the war, even after the appearance of the Griffon powered Mk XIV.", - "country-of-origin": "UK", - "manufacturer": "Supermarine", - "role": "Fighter", - "year-of-variant-introduction": "1943" - } - }], - "Su-17M4": [{ - "default": { - "name": "Su-17M4 Fitter-K", - "text": "The Sukhoi Su-17 (izdeliye S-32) is a variable-sweep wing fighter-bomber developed for the Soviet military. Its NATO reporting name is \"Fitter\". Developed from the Sukhoi Su-7, the Su-17 was the first variable-sweep wing aircraft to enter Soviet service. Two subsequent Sukhoi aircraft, the Su-20 and Su-22, have usually been regarded as variants of the Su-17. The Su-17 has had a long career and has been operated by many other air forces of including the Russian Federation, other former Soviet republics, the former Warsaw Pact, countries in the Arab world, Angola and Peru.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Sukhoi", - "role": "Fighter-Bomber", - "year-of-variant-introduction": "1981" - }, - "Iran": { - "name": "Su-22M4 Fitter-K", - "year-of-variant-introduction": "1983" - }, - "Iraq": { - "name": "Su-22M4 Fitter-K", - "year-of-variant-introduction": "1983" - }, - "Poland": { - "name": "Su-22M4 Fitter-K", - "year-of-variant-introduction": "1983" - } - }], - "Su-24M": [{ - "default": { - "name": "Su-24M Fencer-D", - "text": "The Sukhoi Su-24 (NATO reporting name: Fencer) is a supersonic, all-weather attack aircraft developed in the Soviet Union. The aircraft has a variable-sweep wing, twin-engines and a side-by-side seating arrangement for its crew of two. It was the first of the USSR's aircraft to carry an integrated digital navigation/attack system. It remains in service with the Russian Air Force, Syrian Air Force, Ukrainian Air Force, Azerbaijan Air Force , Iraqi Air Force and various air forces to which it was exported.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Sukhoi", - "role": "Attack", - "year-of-variant-introduction": "1983" - }, - "Iran": { - "name": "Su-24MK Fencer-D", - "year-of-variant-introduction": "1988" - } - }], - "Su-25": [{ - "default": { - "name": "Su-25 Frogfoot", - "text": "The Su-25 'Grach' (Rook), NATO callsigned 'Frogfoot', is a dedicated strike attack aircraft designed for the close air support and anti-tank roles. The Su-25 has seen combat in several conflicts during its more than 30 years in service. The Su-25 combines excellent pilot protection and high speed compared to most dedicated attack aircraft. It can be armed with a variety of weapon systems including guided missiles, bombs, rockets, and its internal 30mm cannon.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Sukhoi", - "role": "Close Air Support/Attack", - "year-of-variant-introduction": "1981" - } - }], - "Su-25T": [{ - "default": { - "name": "Su-25T Frogfoot", - "text": "The Su-25 'Grach' (Rook), NATO callsigned 'Frogfoot', is a dedicated strike attack aircraft designed for the close air support and anti-tank roles. The Su-25 has seen combat in several conflicts during its more than 30 years in service. The Su-25 combines excellent pilot protection and high speed compared to most dedicated attack aircraft. It can be armed with a variety of weapon systems including guided missiles, bombs, rockets, and its internal 30mm cannon.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Sukhoi", - "role": "Close Air Support/Attack", - "year-of-variant-introduction": "1990" - } - }], - "Su-27": [{ - "default": { - "name": "Su-27 Flanker-B", - "text": "The Su-27, NATO codename Flanker, is one of the pillars of modern-day Russian combat aviation. Built to counter the American F-15 Eagle, the Flanker is a twin-engine, supersonic, highly manoeuvrable air superiority fighter. The Flanker is equally capable of engaging targets well beyond visual range as it is in a dogfight given its amazing slow speed and high angle attack manoeuvrability. Using its radar and stealthy infrared search and track system, the Flanker can employ a wide array of radar and infrared guided missiles. The Flanker also includes a helmet-mounted sight that allows you to simply look at a target to lock it up! In addition to its powerful air-to-air capabilities, the Flanker can also be armed with bombs and unguided rockets to fulfil a secondary ground attack role.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Sukhoi", - "role": "Air-Superiority Fighter", - "year-of-variant-introduction": "1985" - } - }], - "Su-30": [{ - "default": { - "name": "Su-30 Flanker-C", - "text": "The Sukhoi Su-30 (Russian: Сухой Су-30; NATO reporting name: Flanker-C/G/H) is a twin-engine, two-seat supermaneuverable fighter aircraft developed in the Soviet Union by Russia's Sukhoi Aviation Corporation. It is a multirole fighter for all-weather, air-to-air and air-to-surface deep interdiction missions. 630 numbers have been build.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Sukhoi", - "role": "Multirole Fighter", - "year-of-variant-introduction": "1996" - }, - "China": { - "name": "Su-30MKK Flanker-G", - "country-of-origin": "USSR/Russia", - "manufacturer": "Sukhoi", - "role": "Multirole Fighter", - "year-of-variant-introduction": "2000" - } - }], - "Su-33": [{ - "default": { - "name": "Su-33 Flanker-D", - "text": "The Su-33 has been the backbone of Russian aircraft carrier aviation since the late 1990s and is an all-weather fighter capable of engaging both air and surface targets. Based on the powerful Su-27 \"Flanker\", the Su-33 is a navalized version suited for operations aboard the Admiral Kuznetsov aircraft carrier. Changes to the Su-33 include strengthened landing gear, folding wings, more powerful engines, and the very visible canards.\n\nThe Su-33 is equipped with a powerful pulse doppler radar and an Infrared Search and Track (IRST) for engaging aerial targets with a wide range of radar- and infrared-guided missiles and its internal cannon. For air-to-surface attack, the Su-33 can be armed with many types of unguided bombs, rockets, and cluster munitions.\n\nDespite its large size, the Su-33 is very capable in a dogfight when combined with its integral helmet-mounted sight and off-boresight missiles.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Sukhoi", - "role": "Carrier-based Multirole Fighter", - "year-of-variant-introduction": "1998" - }, - "China": { - "name": "J-15 Flanker X-2", - "country-of-origin": "China", - "manufacturer": "Shenyang", - "role": "Carrier-based Multirole Fighter", - "year-of-variant-introduction": "2013" - } - }], - "Su-34": [{ - "default": { - "name": "Su-34 Fullback", - "text": "The Sukhoi Su-34 (Russian: Сухой Су-34; NATO reporting name: Fullback) is a Soviet-origin Russian twin-engine, twin-seat, all-weather supersonic medium-range fighter-bomber/strike aircraft. It first flew in 1990, intended for the Soviet Air Forces, and it entered service in 2014 with the Russian Air Force. Based on the Sukhoi Su-27 Flanker air superiority fighter, the Su-34 has an armored cockpit for side-by-side seating of its two-person crew. The Su-34 is designed primarily for tactical deployment against ground and naval targets (tactical bombing/attack/interdiction roles, including against small and mobile targets) on solo and group missions in daytime and at night, under favourable and adverse weather conditions and in a hostile environment with counter-fire and electronic Warfare (EW) counter-measures deployed, as well as for aerial reconnaissance. The Su-34 will eventually replace the Su-24 tactical strike fighter and the Tu-22M3 long-distance bomber.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Sukhoi", - "role": "Fighter-Bomber/Strike Fighter", - "year-of-variant-introduction": "2014" - } - }], - "Su-57": [{ - "default": { - "name": "Su-57 Felon", - "text": "The Sukhoi Su-57 (Russian: Сухой Су-57; NATO reporting name: Felon) is a single-seat, twin-engine stealth multirole fighter developed by Sukhoi for the Russian Aerospace Forces. According to Sukhoi, the multirole fighter is designed to have supercruise, supermaneuverability, stealth, and integrated avionics to overcome the previous generations fighter aircraft as well as ground and naval defences. The Su-57 is intended to succeed the MiG-29 and Su-27 in the Russian Air Force and entered service in December 2020.", - "country-of-origin": "Russia", - "manufacturer": "Sukhoi", - "role": "Stealth Air-Superiority Fighter", - "year-of-variant-introduction": "2020" - } - }], - "Tornado GR4": [{ - "default": { - "name": "Tornado GR4", - "text": "The Panavia Tornado is a family of twin-engine, variable-sweep wing multirole combat aircraft, jointly developed and manufactured by Italy, the United Kingdom and West Germany. There are three primary Tornado variants: the Tornado IDS (interdictor/strike) fighter-bomber, the suppression of enemy air defences Tornado ECR (electronic combat/reconnaissance) and the Tornado ADV (air defence variant) interceptor aircraft.", - "country-of-origin": "UK/Italy/West Germany", - "manufacturer": "Panavia", - "role": "Strike Fighter", - "year-of-variant-introduction": "1996" - } - }], - "Tornado IDS": [{ - "default": { - "name": "Tornado IDS", - "text": "The Panavia Tornado is a family of twin-engine, variable-sweep wing multirole combat aircraft, jointly developed and manufactured by Italy, the United Kingdom and West Germany. There are three primary Tornado variants: the Tornado IDS (interdictor/strike) fighter-bomber, the suppression of enemy air defences Tornado ECR (electronic combat/reconnaissance) and the Tornado ADV (air defence variant) interceptor aircraft.", - "country-of-origin": "UK/Italy/West Germany", - "manufacturer": "Panavia", - "role": "Strike Fighter", - "year-of-variant-introduction": "1979" - } - }], - "Tu-22M3": [{ - "default": { - "name": "Tu-22M3 Backfire-C", - "text": "The Tupolev Tu-22M (Russian: Туполев Ту-22М; NATO reporting name: Backfire) is a supersonic, variable-sweep wing, long-range strategic and maritime strike bomber developed by the Tupolev Design Bureau in the 1960s. According to some sources, the bomber was believed to be designated Tu-26 at one time. During the Cold War, the Tu-22M was operated by the Soviet Air Forces (VVS) in a missile carrier strategic bombing role, and by the Soviet Naval Aviation (Aviacija Vojenno-Morskogo Flota, AVMF) in a long-range maritime anti-shipping role. Significant numbers remain in service with the Russian Air Force, and as of 2014 more than 100 Tu-22Ms are in use.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Tupolev", - "role": "Strategic/Maritime Strike Bomber", - "year-of-variant-introduction": "1983" - } - }], - "Tu-95MS": [{ - "default": { - "name": "Tu-95MS Bear-H", - "text": "The Tupolev Tu-95 (Russian: Туполев Ту-95; NATO reporting name: \"Bear\") is a large, four-engine turboprop-powered strategic bomber and missile platform. First flown in 1952, the Tu-95 entered service with the Long-Range Aviation of the Soviet Air Forces in 1956 and is expected to serve the Russian Aerospace Forces until at least 2040. A development of the bomber for maritime patrol is designated Tu-142, while a passenger airliner derivative was called Tu-114. The aircraft has four Kuznetsov NK-12 engines with contra-rotating propellers. It is the only propeller-powered strategic bomber still in operational use today. The Tu-95 is one of the loudest military aircraft, particularly because the tips of the propeller blades move faster than the speed of sound", - "country-of-origin": "USSR/Russia", - "manufacturer": "Tupolev", - "role": "Strategic Bomber", - "year-of-variant-introduction": "1981" - } - }], - "Tu-142": [{ - "default": { - "name": "Tu-142 Bear-F", - "text": "The Tupolev Tu-142 (Russian: Туполев Ту-142; NATO reporting name: Bear F/J) is a Soviet/Russian maritime reconnaissance and anti-submarine warfare (ASW) aircraft derived from the Tu-95 turboprop strategic bomber. A specialised communications variant designated Tu-142MR was tasked with long-range communications duties with Soviet ballistic missile submarines. The Tu-142 was designed by the Tupolev design bureau, and manufactured by the Kuibyshev Aviation and Taganrog Machinery Plants from 1968 to 1994. Formerly operated by the Soviet Navy and Ukrainian Air Force, the Tu-142 currently serves with the Russian Navy.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Tupolev", - "role": "Maritime Patrol/Anti-Ship", - "year-of-variant-introduction": "1972" - } - }], - "Tu-160": [{ - "default": { - "name": "Tu-160 Blackjack", - "text": "The Tupolev Tu-160 (Russian: Туполев Ту-160 Белый лебедь, romanized: Belyj Lebeď, lit. 'White Swan'; NATO reporting name: Blackjack) is a supersonic, variable-sweep wing heavy strategic bomber designed by the Tupolev Design Bureau in the Soviet Union in the 1970s. It is the largest and heaviest Mach 2+ supersonic military aircraft ever built and next to the experimental XB-70 Valkyrie in overall length. As of 2021, it is the largest and heaviest combat aircraft, the fastest bomber in use and the largest and heaviest variable-sweep wing airplane ever flown.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Tupolev", - "role": "Supersonic Strategic Bomber", - "year-of-variant-introduction": "1987" - } - }], - "UH-1H": [{ - "default": { - "name": "UH-1H Iroquois", - "text": "The UH-1 Iroquois, better known as the Huey, is one of the most iconic helicopters in the world. Indispensable in the Vietnam War, the Huey continues to serve in both military and civilian roles around the globe today.", - "country-of-origin": "USA", - "manufacturer": "Bell", - "role": "Transport/Light Attack", - "year-of-variant-introduction": "1967" - }, - "Germany": { - "name": "UH-1D Iroquois" - } - }], - "AAA 8,8cm Flak 18": [{ - "default": { - "name": "8.8 cm Flak 18", - "text": "The 8.8 cm Flak 18/36/37/41 is a German 88 mm anti-aircraft and anti-tank artillery gun, developed in the 1930s. It was widely used by Germany throughout World War II and is one of the most recognized German weapons of that conflict. Development of the original model led to a wide variety of guns. Air defense units were usually deployed with either a Kommandogerät (\"command device\") fire control computer or a portable Würzburg radar, which were responsible for its high level of accuracy against aircraft. The versatile carriage allowed the 8.8 cm Flak to be fired in a limited anti-tank mode when still on its wheels; it could be completely emplaced in only two and a half minutes.", - "country-of-origin": "Germany", - "manufacturer": "Krupp/Rheinmetall", - "role": "Anti-Aircraft Gun/Anti-Tank Gun", - "year-of-variant-introduction": "1936" - } - }], - "AAA 8,8cm Flak 36": [{ - "default": { - "name": "8.8 cm Flak 36", - "text": "The 8.8 cm Flak 18/36/37/41 is a German 88 mm anti-aircraft and anti-tank artillery gun, developed in the 1930s. It was widely used by Germany throughout World War II and is one of the most recognized German weapons of that conflict. Development of the original model led to a wide variety of guns. Air defense units were usually deployed with either a Kommandogerät (\"command device\") fire control computer or a portable Würzburg radar, which were responsible for its high level of accuracy against aircraft. The versatile carriage allowed the 8.8 cm Flak to be fired in a limited anti-tank mode when still on its wheels; it could be completely emplaced in only two and a half minutes.", - "country-of-origin": "Germany", - "manufacturer": "Krupp/Rheinmetall", - "role": "Anti-Aircraft Gun/Anti-Tank Gun", - "year-of-variant-introduction": "1936" - } - }], - "AAA 8,8cm Flak 37": [{ - "default": { - "name": "8.8 cm Flak 37", - "text": "The 8.8 cm Flak 18/36/37/41 is a German 88 mm anti-aircraft and anti-tank artillery gun, developed in the 1930s. It was widely used by Germany throughout World War II and is one of the most recognized German weapons of that conflict. Development of the original model led to a wide variety of guns. Air defense units were usually deployed with either a Kommandogerät (\"command device\") fire control computer or a portable Würzburg radar, which were responsible for its high level of accuracy against aircraft. The versatile carriage allowed the 8.8 cm Flak to be fired in a limited anti-tank mode when still on its wheels; it could be completely emplaced in only two and a half minutes.", - "country-of-origin": "Germany", - "manufacturer": "Krupp/Rheinmetall", - "role": "Anti-Aircraft Gun/Anti-Tank Gun", - "year-of-variant-introduction": "1936" - } - }], - "AAA 8,8cm Flak 41": [{ - "default": { - "name": "8.8 cm Flak 41", - "text": "The 8.8 cm Flak 18/36/37/41 is a German 88 mm anti-aircraft and anti-tank artillery gun, developed in the 1930s. It was widely used by Germany throughout World War II and is one of the most recognized German weapons of that conflict. Development of the original model led to a wide variety of guns. Air defense units were usually deployed with either a Kommandogerät (\"command device\") fire control computer or a portable Würzburg radar, which were responsible for its high level of accuracy against aircraft. The versatile carriage allowed the 8.8 cm Flak to be fired in a limited anti-tank mode when still on its wheels; it could be completely emplaced in only two and a half minutes.", - "country-of-origin": "Germany", - "manufacturer": "Krupp/Rheinmetall", - "role": "Anti-Aircraft Gun/Anti-Tank Gun", - "year-of-variant-introduction": "1943" - } - }], - "AAA Bofors 40mm": [{ - "default": { - "name": "Bofors 40 mm Gun", - "text": "The Bofors 40 mm gun, often referred to simply as the Bofors gun, is an anti-aircraft autocannon designed in the 1930s by the Swedish arms manufacturer AB Bofors. It was one of the most popular medium-weight anti-aircraft systems during World War II, used by most of the western Allies as well as some captured systems being used by the Axis powers. A small number of these weapons remain in service to this day, and saw action as late as the Persian Gulf War.", - "country-of-origin": "Sweden", - "manufacturer": "Bofors", - "role": "Anti-Aircraft Gun", - "year-of-variant-introduction": "1934" - }, - "UK": { - "name": "QF 40 mm Mark III", - "year-of-variant-introduction": "1939" - } - }], - "AAA Flak 38": [{ - "default": { - "name": "2 cm Flak 38", - "text": "The Flak 30 (Flugzeugabwehrkanone 30) and improved Flak 38 were 20 mm anti-aircraft guns used by various German forces throughout World War II. It was not only the primary German light anti-aircraft gun, but by far the most numerously produced German artillery piece throughout the war. It was produced in a variety of models, notably the Flakvierling 38 which combined four Flak 38 autocannons onto a single carriage.", - "country-of-origin": "Germany", - "manufacturer": "Mauser", - "role": "Anti-Aircraft Gun", - "year-of-variant-introduction": "1934" - } - }], - "AAA Flak-Vierling 38": [{ - "default": { - "name": "2 cm Flakvierling 38", - "text": "The Flak 30 (Flugzeugabwehrkanone 30) and improved Flak 38 were 20 mm anti-aircraft guns used by various German forces throughout World War II. It was not only the primary German light anti-aircraft gun, but by far the most numerously produced German artillery piece throughout the war. It was produced in a variety of models, notably the Flakvierling 38 which combined four Flak 38 autocannons onto a single carriage.", - "country-of-origin": "Germany", - "manufacturer": "Mauser", - "role": "Anti-Aircraft Gun", - "year-of-variant-introduction": "1934" - } - }], - "AAA M45 Quadmount": [{ - "default": { - "name": "M45 Quadmount", - "text": "The M45 Quadmount (nicknamed the \"meat chopper\" and \"Krautmower\" for its high rate of fire) was a weapon mounting consisting of four of the \"HB\", or \"heavy barrel\" .50 caliber M2 Browning machine guns mounted in pairs on each side of an open, electrically powered turret. It was developed by the W. L. Maxson Corporation to replace the earlier M33 twin mount (also from Maxson). Although designed as an anti-aircraft weapon, it was also used against ground targets. Introduced in 1943 during World War II, it remained in US service as late as the Vietnam War.", - "country-of-origin": "USA", - "manufacturer": "W. L. Maxson Corporation", - "role": "Anti-Aircraft Gun", - "year-of-variant-introduction": "1943" - } - }], - "AAA M1 37mm": [{ - "default": { - "name": "M1 37mm Gun", - "text": "The 37 mm gun M1 was an anti-aircraft autocannon developed in the United States. It was used by the US Army in World War II. In addition to the towed variant, the gun was mounted, with two M2 machine guns, on the M2/M3 half-track, resulting in the T28/T28E1/M15/M15A1 series of multiple gun motor carriages. In early World War II, each Army Anti-Aircraft Artillery (AAA) Auto-Weapons battalion was authorized a total of thirty-two 37 mm guns in its four firing batteries, plus other weapons.", - "country-of-origin": "USA", - "manufacturer": "Colt", - "role": "Anti-Aircraft Gun", - "year-of-variant-introduction": "1939" - } - }], - "AAA Vulcan M163": [{ - "default": { - "name": "M163 Vulcan Air Defense System", - "text": "The M163 had a fairly limited range from the start. Its 20x102mm round gave it a low effective range of only 1,200 meters, and its standard air-defense load of HEI-T rounds would self-destruct at approximately 1800 meters, a hard limit on range. Additionally, the radar was a range-only set incapable of finding targets. In US and Israeli service, the VADS has rarely been needed in its intended purpose of providing defense against aerial threats—consequently, the Vulcan gun system was in use throughout the late 1980s and early 1990s primarily as a ground support weapon.", - "country-of-origin": "USA", - "manufacturer": "General Electric", - "role": "Self-Propelled Anti-Aircraft Gun", - "year-of-variant-introduction": "1989" - } - }], - "AAA ZSU-57-2": [{ - "default": { - "name": "ZSU-57-2 'Sparka'", - "text": "The ZSU-57-2 Ob'yekt 500 is a Soviet self-propelled anti-aircraft gun (SPAAG), armed with two 57 mm autocannons. 'ZSU' stands for Zenitnaya Samokhodnaya Ustanovka (Russian: Зенитная Самоходная Установка), meaning \"anti-aircraft self-propelled mount\", '57' stands for the bore of the armament in millimetres and '2' stands for the number of gun barrels. It was the first Soviet mass-produced tracked SPAAG.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Omsk Works", - "role": "Self-Propelled Anti-Aircraft Gun", - "year-of-variant-introduction": "1955" - } - }], - "AAA ZU-23 on Ural-375": [{ - "default": { - "name": "ZU-23 on Ural-375", - "text": "The ZSU-57-2 Ob'yekt 500 is a Soviet self-propelled anti-aircraft gun (SPAAG), armed with two 57 mm autocannons. 'ZSU' stands for Zenitnaya Samokhodnaya Ustanovka (Russian: Зенитная Самоходная Установка), meaning \"anti-aircraft self-propelled mount\", '57' stands for the bore of the armament in millimetres and '2' stands for the number of gun barrels. It was the first Soviet mass-produced tracked SPAAG.", - "country-of-origin": "USSR/Russia", - "manufacturer": "KBP/Ural", - "role": "Self-Propelled Anti-Aircraft Gun", - "year-of-variant-introduction": "1961" - } - }], - "AAA ZU-23 Insurgent on Ural-375": [{ - "default": { - "name": "ZU-23 on Ural-375", - "text": "The ZSU-57-2 Ob'yekt 500 is a Soviet self-propelled anti-aircraft gun (SPAAG), armed with two 57 mm autocannons. 'ZSU' stands for Zenitnaya Samokhodnaya Ustanovka (Russian: Зенитная Самоходная Установка), meaning \"anti-aircraft self-propelled mount\", '57' stands for the bore of the armament in millimetres and '2' stands for the number of gun barrels. It was the first Soviet mass-produced tracked SPAAG.", - "country-of-origin": "USSR/Russia", - "manufacturer": "KBP/Ural", - "role": "Self-Propelled Anti-Aircraft Gun", - "year-of-variant-introduction": "1961" - } - }], - "AA gun QF 3,7\"": [{ - "default": { - "name": "QF 3.7-inch AA Gun", - "text": "The QF 3.7-inch AA was Britain's primary heavy anti-aircraft gun during World War II. It was roughly the equivalent of the German 88 mm FlaK and American 90 mm, but with a slightly larger calibre of 3.7 inches, approximately 94 mm. Production began in 1937 and it was used throughout World War II in all theatres except the Eastern Front. It remained in use after the war until AA guns were replaced by guided missiles beginning in 1957.", - "country-of-origin": "UK", - "manufacturer": "Vickers", - "role": "Anti-Aircraft Gun", - "year-of-variant-introduction": "1937" - } - }], - "AC Sd.Kfz.234/2 Puma": [{ - "default": { - "name": "Sd.Kfz.234/2 Puma", - "text": "The Sd.Kfz. 234 (Sonderkraftfahrzeug 234, Special Purpose Vehicle 234), was a family of armoured cars designed and built in Germany during World War II. The vehicles were lightly armoured, armed with a 20, 50 or 75 mm main gun, and powered by a Tatra V12 diesel engine.", - "country-of-origin": "Germany", - "manufacturer": "Tatra/Büssing/Daimler-Benz/Schichau", - "role": "Amphibious Armoured Personnel Carrier", - "year-of-variant-introduction": "1943" - } - }], - "APC AAV-7": [{ - "default": { - "name": "AAVP-7A1 'Amtrac'", - "text": "The Assault Amphibious Vehicle (AAV)—official designation AAVP-7A1 (formerly known as Landing Vehicle, Tracked, Personnel-7 abbr. LVTP-7)—is a fully tracked amphibious landing vehicle manufactured by U.S. Combat Systems (previously by United Defense, a former division of FMC Corporation). The AAV-P7/A1 is the current amphibious troop transport of the United States Marine Corps. It is used by U.S. Marine Corps Assault Amphibian Battalions to land the surface assault elements of the landing force and their equipment in a single lift from assault shipping during amphibious operations to inland objectives and to conduct mechanized operations and related combat support in subsequent mechanized operations ashore. It is also operated by other forces.", - "country-of-origin": "USA", - "manufacturer": "United Defense", - "role": "Amphibious Armoured Personnel Carrier", - "year-of-variant-introduction": "1971" - } - }], - "APC BTR-80": [{ - "default": { - "name": "BTR-80", - "text": "The BTR-80 (Russian: бронетранспортёр, romanized: Bronyetransportyor, literally \"Armoured Transporter\") is an 8×8 wheeled amphibious armoured personnel carrier (APC) designed in the USSR. It was adopted in 1985 and replaced the previous vehicles, the BTR-60 and BTR-70, in the Soviet Army. It was first deployed during the Soviet–Afghan War.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Arzamas", - "role": "Amphibious Armoured Personnel Carrier", - "year-of-variant-introduction": "1986" - } - }], - "APC BTR-82A": [{ - "default": { - "name": "BTR-82A", - "text": "The BTR-80 (Russian: бронетранспортёр, romanized: Bronyetransportyor, literally \"Armoured Transporter\") is an 8×8 wheeled amphibious armoured personnel carrier (APC) designed in the USSR. It was adopted in 1985 and replaced the previous vehicles, the BTR-60 and BTR-70, in the Soviet Army. It was first deployed during the Soviet–Afghan War. This is a modernized Version of the BTR 80.", - "country-of-origin": "Russia", - "manufacturer": "Arzamas", - "role": "Amphibious Armoured Personnel Carrier", - "year-of-variant-introduction": "2013" - } - }], - "APC Cobra": [{ - "default": { - "name": "Cobra", - "text": "The Cobra (Turkish: Kobra) is an armoured tactical vehicle developed by Turkish firm Otokar.", - "country-of-origin": "Turkey", - "manufacturer": "Otokar", - "role": "Armoured Car", - "year-of-variant-introduction": "1997" - } - }], - "APC M2A1": [{ - "default": { - "name": "M2A1 Half-Track", - "text": "The M2 half-track car is an armored half-track produced by the United States during World War II. ", - "country-of-origin": "USA", - "manufacturer": "White Motor Company", - "role": "Armoured Personnel Carrier", - "year-of-variant-introduction": "1940" - } - }], - "APC M113": [{ - "default": { - "name": "M113", - "text": "The M113 is a fully tracked armored personnel carrier (APC) that was developed and produced by the Food Machinery and Chemical Corporation (FMC). The M113 was sent to United States Army Europe to replace the mechanized infantry's M59 APCs from 1961. The M113 was first used in combat in April 1962 after the United States provided the South Vietnamese Army (ARVN) with heavy weaponry such as the M113, under the Military Assistance Command, Vietnam (MACV) program. Eventually, the M113 was the most widely used armored vehicle of the U.S. Army in the Vietnam War and was used to break through heavy thickets in the midst of the jungle to attack and overrun enemy positions. About 80.000 have been build.", - "country-of-origin": "USA", - "manufacturer": "Food Machinery Corp", - "role": "Armoured Personnel Carrier", - "year-of-variant-introduction": "1960" - } - }], - "APC M1043 HMMWV Armament": [{ - "default": { - "name": "M1043 HMMWV (M2 HMG)", - "text": "The High Mobility Multipurpose Wheeled Vehicle (HMMWV; colloquial: Humvee) is a family of light, four-wheel drive, military trucks and utility vehicles produced by AM General.", - "country-of-origin": "USA", - "manufacturer": "AM General", - "role": "Armoured Car", - "year-of-variant-introduction": "1983" - } - }], - "APC M1126 Stryker ICV": [{ - "default": { - "name": "M1126 Stryker ICV (M2 HMG)", - "text": "The ICV (Infantry Carrier Vehicle) Stryker is a family of eight-wheeled armored fighting vehicles derived from the Canadian LAV III. ", - "country-of-origin": "USA", - "manufacturer": "General Dynamics", - "role": "Armoured Personnel Carrier", - "year-of-variant-introduction": "2002" - } - }], - "APC MTLB": [{ - "default": { - "name": "MT-LB", - "text": "The MT-LB (Russian: Многоцелевой Тягач Легкий Бронированный, romanized: Mnogotselevoy tyagach legky bronirovanny, literally \"multi-purpose towing vehicle light armored\") is a Soviet multi-purpose fully amphibious auxiliary armored tracked vehicle, which was introduced in the 1950s. It is also produced in Poland, where (starting mid-1990s) its YaMZ engine was replaced by a Polish version.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Kharkiv", - "role": "Armoured Personnel Carrier", - "year-of-variant-introduction": "1958" - } - }], - "APC Sd.Kfz.251": [{ - "default": { - "name": "Sd.Kfz.251 \"Hanomag\"", - "text": "The Sd.Kfz. 251 (Sonderkraftfahrzeug 251) half-track was a World War II German armored personnel carrier designed by the Hanomag company, based on its earlier, unarmored Sd.Kfz. 11 vehicle. The Sd.Kfz. 251 was designed to transport the Panzergrenadier (German mechanized infantry) into battle. Sd.Kfz. 251s were the most widely produced German half-tracks of the war, with at least 15,252 vehicles and variants produced by seven manufacturers.", - "country-of-origin": "Germany", - "manufacturer": "Hanomag", - "role": "Armoured Personnel Carrier", - "year-of-variant-introduction": "1939" - } - }], - "ARV BRDM-2": [{ - "default": { - "name": "BRDM-2", - "text": "The BRDM-2 (Boyevaya Razvedyvatelnaya Dozornaya Mashina, Боевая Разведывательная Дозорная Машина, literally \"Combat Reconnaissance/Patrol Vehicle\") is an amphibious armoured patrol car used by Russia and the former Soviet Union. It was also known under the designations BTR-40PB, BTR-40P-2 and GAZ 41-08. This vehicle, like many other Soviet designs, has been exported extensively and is in use in at least 38 countries.", - "country-of-origin": "USSR/Russia", - "manufacturer": "GAZ", - "role": "Amphibious Armoured Car", - "year-of-variant-introduction": "1962" - } - }], - "ARV BTR-RD": [{ - "default": { - "name": "BTR-D", - "text": "The BTR-D is a Soviet airborne multi-purpose tracked armoured personnel carrier which was introduced in 1974 and first seen by the West in 1979 during the Soviet–Afghan War. BTR-D stands for Bronetransportyor Desanta (БТР-Д, Бронетранспортер Десанта, literally \"armoured transporter of the Airborne\")", - "country-of-origin": "USSR/Russia", - "manufacturer": "Volgograd", - "role": "Airborne Amphibious Armoured Personnel Carrier", - "year-of-variant-introduction": "1974" - } - }], - "ATGM M1045 HMMWV TOW": [{ - "default": { - "name": "M1045 HMMWV (BGM-71 TOW)", - "text": "The High Mobility Multipurpose Wheeled Vehicle (HMMWV; colloquial: Humvee) is a family of light, four-wheel drive, military trucks and utility vehicles produced by AM General. This verison carries a TOW for ATGM.", - "country-of-origin": "USA", - "manufacturer": "AM General", - "role": "Armoured Car", - "year-of-variant-introduction": "1983" - } - }], - "ATGM M1134 Stryker": [{ - "default": { - "name": "M1134 Stryker ATGM (BGM-71 TOW)", - "text": "The ICV (Infantry Carrier Vehicle) Stryker is a family of eight-wheeled armored fighting vehicles derived from the Canadian LAV III.", - "country-of-origin": "USA", - "manufacturer": "General Dynamics", - "role": "Armoured Car", - "year-of-variant-introduction": "2002" - } - }], - "CT Centaur IV": [{ - "default": { - "name": "A27L Cruiser Tank MK VIII Centaur IV", - "text": "The Cromwell tank, officially Tank, Cruiser, Mk VIII, Cromwell (A27M), was one of the series of cruiser tanks fielded by Britain in the Second World War. Named after the English Civil War leader Oliver Cromwell, the Cromwell was the first tank put into service by the British to combine high speed from a powerful and reliable engine (the Rolls-Royce Meteor), and reasonable armour. ", - "country-of-origin": "UK", - "manufacturer": "Leyland", - "role": "Cruiser Tank", - "year-of-variant-introduction": "1944" - } - }], - "CT Cromwell IV": [{ - "default": { - "name": "A27M Cruiser Tank MK VIII Cromwell IV", - "text": "The Cromwell tank, officially Tank, Cruiser, Mk VIII, Cromwell (A27M), was one of the series of cruiser tanks fielded by Britain in the Second World War. Named after the English Civil War leader Oliver Cromwell, the Cromwell was the first tank put into service by the British to combine high speed from a powerful and reliable engine (the Rolls-Royce Meteor), and reasonable armour. ", - "country-of-origin": "UK", - "manufacturer": "Birmingham Railway Carriage and Wagon Company", - "role": "Cruiser Tank", - "year-of-variant-introduction": "1944" - } - }], - "Daimler Armoured Car": [{ - "default": { - "name": "Daimler Armoured Car Mk I", - "text": "The Daimler Armoured Car was a successful British armoured car design of the Second World War that continued in service into the 1950s. It was designed for armed reconnaissance and liaison purposes. During the postwar era, it doubled as an internal security vehicle in a number of countries. Former British Daimler armoured cars were exported to various Commonwealth of Nations member states throughout the 1950s and 1960s. In 2012, some were still being operated by the Qatari Army.", - "country-of-origin": "UK", - "manufacturer": "Daimler", - "role": "Armoured Car", - "year-of-variant-introduction": "1941" - } - }], - "HIT Churchill_VII": [{ - "default": { - "name": "A22 Infantry Tank MK IV Churchill VII", - "text": "The Tank, Infantry, Mk IV (A22) Churchill was a British heavy infantry tank used in the Second World War, best known for its heavy armour, large longitudinal chassis with all-around tracks with multiple bogies, its ability to climb steep slopes, and its use as the basis of many specialist vehicles. It was one of the heaviest Allied tanks of the war.", - "country-of-origin": "UK", - "manufacturer": "Vauxhall Motors", - "role": "Infantry Tank", - "year-of-variant-introduction": "1944" - } - }], - "HT Pz.Kpfw.VI Tiger I": [{ - "default": { - "name": "Panzerkampfwagen VI Tiger Ausf. E", - "text": "The Tiger I was a German heavy tank of World War II that operated beginning in 1942 in Africa and in the Soviet Union, usually in independent heavy tank battalions. It was designated Panzerkampfwagen VI Ausf H during development but was changed to Panzerkampfwagen VI Ausf E during production. The Tiger I gave the German Army its first armoured fighting vehicle that mounted the 8.8 cm KwK 36 gun (derived from the 8.8 cm Flak 36). 1,347 were built between August 1942 and August 1944. After August 1944, production of the Tiger I was phased out in favour of the Tiger II. 1347 have been build.", - "country-of-origin": "Germany", - "manufacturer": "Henschel", - "role": "Heavy Tank", - "year-of-variant-introduction": "1942" - } - }], - "HT Pz.Kpfw.VI Ausf. B Tiger II": [{ - "default": { - "name": "Panzerkampfwagen Tiger Ausf. B Tiger II", - "text": "The Tiger II was the successor to the Tiger I, combining the latter's thick armour with the armour sloping used on the Panther medium tank. The tank weighed almost 70 tonnes, and was protected by 100 to 185 mm (3.9 to 7.3 in) of armour to the front.It was armed with the long barrelled 8.8 cm KwK 43 L/71 anti-tank cannon. The chassis was also the basis for the Jagdtiger turretless Jagdpanzer anti-tank vehicle. The Tiger II was issued to heavy tank battalions of the Army and the Waffen-SS. It was first used in combat by 503rd Heavy Panzer Battalion during the Allied invasion of Normandy on 11 July 1944; on the Eastern Front, the first unit to be outfitted with the Tiger II was the 501st Heavy Panzer Battalion, which by 1 September 1944 listed 25 Tiger IIs operational.", - "country-of-origin": "Germany", - "manufacturer": "Henschel/Krupp", - "role": "Heavy Tank", - "year-of-variant-introduction": "1944" - } - }], - "IFV BMD-1": [{ - "default": { - "name": "BMD-1", - "country-of-origin": "USSR/Russia", - "manufacturer": "Volgograd", - "role": "Airborne Amphibious Infantry Fighting Vehicle", - "year-of-variant-introduction": "1969" - } - }], - "IFV BMP-1": [{ - "default": { - "name": "BMP-1", - "text": "The BMD-1 is a Soviet airborne amphibious tracked infantry fighting vehicle, which was introduced in 1969 and first seen by the West in 1970. BMD stands for Boyevaya Mashina Desanta (Боевая Машина Десанта, which literally translates to \"Combat Vehicle of the Airborne\"). It can be dropped by parachute and although it resembles the BMP-1 it is in fact much smaller. The BMD-1 was used as an IFV by the Soviet Army's airborne divisions. ", - "country-of-origin": "USSR/Russia", - "manufacturer": "Kurganmashzavod", - "role": "Amphibious Infantry Fighting Vehicle", - "year-of-variant-introduction": "1966" - } - }], - "IFV BMP-2": [{ - "default": { - "name": "BMP-2", - "text": "The BMP-2 (Boyevaya Mashina Pekhoty, Russian: Боевая Машина Пехоты, literally \"infantry combat vehicle\") is a second-generation, amphibious infantry fighting vehicle introduced in the 1980s in the Soviet Union, following on from the BMP-1 of the 1960s.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Kurganmashzavod", - "role": "Amphibious Infantry Fighting Vehicle", - "year-of-variant-introduction": "1980" - } - }], - "IFV BMP-3": [{ - "default": { - "name": "BMP-3", - "text": "The BMP-3 is a Soviet and Russian infantry fighting vehicle, successor to the BMP-1 and BMP-2. The abbreviation BMP stands for boevaya mashina pehoty (боевая машина пехоты, literally \"infantry combat vehicle\").", - "country-of-origin": "USSR/Russia", - "manufacturer": "Kurganmashzavod", - "role": "Amphibious Infantry Fighting Vehicle", - "year-of-variant-introduction": "1987" - } - }], - "IFV LAV-25": [{ - "default": { - "name": "LAV-25", - "text": "The LAV-25 (Light Armored Vehicle) is an eight-wheeled amphibious armored reconnaissance vehicle built by General Dynamics Land Systems and used by the United States Marine Corps and the United States Army.", - "country-of-origin": "USA", - "manufacturer": "General Dynamics", - "role": "Amphibious Armoured Car", - "year-of-variant-introduction": "1983" - } - }], - "IFV M2A2 Bradley": [{ - "default": { - "name": "M2A2 Bradley", - "text": "The M2 Bradley, or Bradley IFV, is an American infantry fighting vehicle that is a member of the Bradley Fighting Vehicle family. It is manufactured by BAE Systems Land & Armaments, which was formerly United Defense. The Bradley is designed for reconnaissance and to transport a squad of infantry, providing them protection from small arms fire, while also providing firepower to both suppress and eliminate most threats to friendly infantry. It is designed to be highly maneuverable and to be fast enough to keep up with heavy armor during an advance. The M2 holds a crew of three: a commander, a gunner and a driver, as well as six fully equipped soldiers. In the year 2000 the total cost of the program was $5,664,100,000 for 1602 units, giving an average unit cost of $3,166,000. If you want to know more than you ever wanted about the Bradley, watch the film 'The Pentagon Wars', its great!", - "country-of-origin": "USA", - "manufacturer": "United Defense", - "role": "Infantry Fighting Vehicle", - "year-of-variant-introduction": "1988" - } - }], - "IFV Marder": [{ - "default": { - "name": "Marder 1A3", - "text": "The Marder (German for \"marten\") is a German infantry fighting vehicle operated by the German Army as the main weapon of the Panzergrenadiere (mechanized infantry) from the 1970s through to the present day. Developed as part of the rebuilding of Germany's armoured fighting vehicle industry, the Marder has proven to be a successful and solid infantry fighting vehicle design. While it used to include a few unique features, such as a fully remote machine gun on the rear deck and gun ports on the sides for infantry to fire through, these features have been deleted or streamlined in later upgrade packages to bring it more in line with modern IFV design. Around 2,100 were taken into service by the German Army in the early 1970s, but the vehicle in its German variant was not sold to any foreign militaries. As the German Army began to retire older vehicles, the Chilean government agreed to acquire 200 Marders; the government of Greece has considered the purchase of 450 retired vehicles in the past. Argentina uses a simplified and locally produced variant, the VCTP, and has a number of vehicles based on that platform constructed by Henschel and built by TAMSE.", - "country-of-origin": "Germany", - "manufacturer": "Rheinmetall Landsysteme", - "role": "Infantry Fighting Vehicle", - "year-of-variant-introduction": "1988" - } - }], - "IFV MCV-80": [{ - "default": { - "name": "FV510 Warrior", - "text": "The Warrior tracked vehicle family is a series of British armoured vehicles, originally developed to replace the older FV430 series of armoured vehicles. The Warrior started life as the MCV-80, \"Mechanised Combat Vehicle for the 1980s\". One of the requirements of the new vehicle was a top speed able to keep up with the projected new MBT, the MBT-80 – later cancelled and replaced by what became the Challenger 1 – which the then-current FV432 armoured personnel carrier could not. ", - "country-of-origin": "UK", - "manufacturer": "GKN Sankey", - "role": "Infantry Fighting Vehicle", - "year-of-variant-introduction": "1984" - } - }], - "LAC M8 Greyhound": [{ - "default": { - "name": "M8 Greyhound Light Armored Car", - "text": "The M8 Light Armored Car is a 6×6 armored car produced by the Ford Motor Company during World War II. It was used from 1943 by United States and British forces in Europe and the Pacific until the end of the war. The vehicle was widely exported and as of 2006 still remained in service with some countries.", - "country-of-origin": "USA", - "manufacturer": "Ford Motor Company", - "role": "Light Armoured Car", - "year-of-variant-introduction": "1943" - } - }], - "LT Mk VII Tetrarch": [{ - "default": { - "name": "A17 Light Tank Mk VII Tetrarch", - "text": "The Light Tank Mk VII (A17), also known as the Tetrarch, was a British light tank produced by Vickers-Armstrongs in the late 1930s and used during the Second World War. The Tetrarch was the latest in the line of light tanks built by the company for the British Army. They where declered obsolete in 1946.", - "country-of-origin": "UK", - "manufacturer": "Vickers-Armstrongs", - "role": "Airborne Light Tank", - "year-of-variant-introduction": "1938" - } - }], - "M4 Tractor": [{ - "default": { - "name": "M4 High-Speed Tractor", - "text": "The M4 High-Speed Tractor was an artillery tractor used by the US Army from 1943.", - "country-of-origin": "USA", - "manufacturer": "Allis-Chalmers", - "role": "Tracked Cargo Transporter", - "year-of-variant-introduction": "1943" - } - }], - "M30 Cargo Carrier": [{ - "default": { - "name": "M30 Cargo Carrier", - "country-of-origin": "USA", - "manufacturer": "Pressed Steel Car Company", - "role": "Tracked Cargo Transporter", - "year-of-variant-introduction": "1942" - } - }], - "MBT Challenger II": [{ - "default": { - "name": "FV4034 Challenger 2", - "text": "The FV4034 Challenger 2 is a third generation British main battle tank (MBT) in service with the armies of the United Kingdom and Oman. It has seen operational service in Bosnia and Herzegovina, Kosovo and Iraq. To date, the only time the tank has been destroyed during operations was by another Challenger 2 in a \"blue on blue\" (friendly fire) incident at Basra in 2003 when the destroyed tank had its hatch open at the time of the incident.", - "country-of-origin": "UK", - "manufacturer": "Vickers Defence Systems", - "role": "Main Battle Tank", - "year-of-variant-introduction": "1998" - } - }], - "M12 GMC": [{ - "default": { - "name": "M12 Gun Motor Carriage", - "text": "The 155 mm Gun Motor Carriage M12 was a U.S. self-propelled gun developed during the Second World War. It mounted a 155 mm gun derived from the French Canon de 155mm GPF field gun.", - "country-of-origin": "USA", - "manufacturer": "Pressed Steel Car Company", - "role": "Self-Propelled Gun", - "year-of-variant-introduction": "1942" - } - }], - "MBT Leclerc": [{ - "default": { - "name": "Leclerc Séries 2", - "text": "The Leclerc tank (French: char Leclerc) is a main battle tank (MBT) built by GIAT, now Nexter of France. It was named in honour of General Philippe Leclerc de Hauteclocque, who led the French element of the drive towards Paris while in command of the Free French 2nd Armoured Division (2e DB) in World War II. The designation AMX-56 – while very popular – is incorrect. During the Iron spear exercise, October 2019, Leclerc tanks crewed by the Lynx 6 Tactical Inter-Service Sub-Group (S-GTIA) participated in an inter-alliance exercise and surpassed the American M1A2 Abrams, German, Spanish and Norwegian Leopard 2s, Italian Ariete C1 and Polish P91.", - "country-of-origin": "France", - "manufacturer": "GIAT Industries", - "role": "Main Battle Tank", - "year-of-variant-introduction": "1993" - } - }], - "MBT Leopard 1A3": [{ - "default": { - "name": "Leopard 1A3", - "text": "The Leopard (or Leopard 1) is a main battle tank designed and produced by Porsche in West Germany that first entered service in 1965. Developed in an era when HEAT warheads were thought to make conventional heavy armour of limited value, the Leopard focused on firepower in the form of the German-built version of the British L7 105-mm gun, and improved cross-country performance that was unmatched by other designs of the era. The Leopard quickly became a standard of many European militaries, and eventually served as the main battle tank in over a dozen countries worldwide, with West Germany, Italy and the Netherlands being the largest operators until their retirement. Currently, the largest operators are Greece, with 520 vehicles, Turkey, with 397 vehicles and Brazil with 378 vehicles.", - "country-of-origin": "Germany", - "manufacturer": "Krauss-Maffei", - "role": "Main Battle Tank", - "year-of-variant-introduction": "1974" - } - }], - "MBT Leopard-2": [{ - "default": { - "name": "Leopard 2A6", - "text": "The Leopard 2 is a main battle tank developed by Krauss-Maffei in the 1970s for the West German Army. The tank first entered service in 1979 and succeeded the earlier Leopard 1 as the main battle tank of the German Army. It is armed with a 120 mm smoothbore cannon, and is powered by a V-12 twin-turbo diesel engine. Various versions have served in the armed forces of Germany and 12 other European countries, as well as several non-European nations, including Canada, Chile, Indonesia, Singapore, and Turkey. The Leopard 2 was used in Kosovo with the German Army, and has seen action in Afghanistan with the Dutch, Danish and Canadian contributions to the International Security Assistance Force, as well as seeing action in Syria with the Turkish Armed Forces.", - "country-of-origin": "Germany", - "manufacturer": "Krauss-Maffei", - "role": "Main Battle Tank", - "year-of-variant-introduction": "2001" - } - }], - "MBT M1A2 Abrams": [{ - "default": { - "name": "M1A2 Abrams", - "text": "The M1 Abrams is a third-generation American main battle tank designed by Chrysler Defense (now General Dynamics Land Systems)[9] and named for General Creighton Abrams. Conceived for modern armored ground warfare and now one of the heaviest tanks in service at nearly 68 short tons. The M1 Abrams entered service in 1980 and currently serves as the main battle tank of the United States Army and Marine Corps. The export version is used by the armies of Egypt, Kuwait, Saudi Arabia, Australia, and Iraq. The Abrams was first used in combat in the Persian Gulf War and has seen combat in both the War in Afghanistan and Iraq War under U.S. service, while Iraqi Abrams tanks have seen action in the war against ISIL and have seen use by Saudi Arabia during the Yemeni Civil War.", - "country-of-origin": "USA", - "manufacturer": "General Dynamics", - "role": "Main Battle Tank", - "year-of-variant-introduction": "1992" - } - }], - "MBT M60A3 Patton": [{ - "default": { - "name": "M60A3 \"Patton\"", - "text": "The M60 reached operational capability with fielding to US Army units in Europe beginning in December 1960. The first combat usage of the M60 was with Israel during the 1973 Yom Kippur War where it saw service under the \"Magach 6\" designation, performing well in combat against comparable tanks such as the T-62. In 1982 the Israelis once again used the M60 during the 1982 Lebanon War, equipped with upgrades such as explosive reactive armor to defend against guided missiles that proved very effective at destroying tanks. The M60 also saw use in 1983 with Operation Urgent Fury, supporting US Marines in an amphibious assault into Grenada. M60s delivered to Iran also served in the Iran–Iraq War. The United States' largest deployment of M60s was in the 1991 Gulf War, where the US Marines equipped with M60A1s effectively defeated Iraqi armored forces, including T-72 tanks. The United States readily retired the M60 from front-line combat after Operation Desert Storm, with the last tanks being retired from National Guard service in 1997.[16] M60-series vehicles continue in front-line service with a number of countries' militaries, though most of these have been highly modified and had their firepower, mobility and protection upgraded to increase their combat effectiveness on the modern battlefield.", - "country-of-origin": "USA", - "manufacturer": "General Dynamics", - "role": "Main Battle Tank", - "year-of-variant-introduction": "1960" - } - }], - "MBT Merkava Mk. 4": [{ - "default": { - "name": "Merkava Mk IV", - "text": "The Merkava is a main battle tank used by the Israel Defense Forces. The tank began development in 1970, and entered official service in 1979. Four main variants of the tank have been deployed. It was first used extensively in the 1982 Lebanon War. The name \"Merkava\" was derived from the IDF's initial development program name. Design criteria include rapid repair of battle damage, survivability, cost-effectiveness and off-road performance. ", - "country-of-origin": "Israel", - "manufacturer": "MANTAK", - "role": "Main Battle Tank", - "year-of-variant-introduction": "2004" - } - }], - "MBT T-55": [{ - "default": { - "name": "T-55A", - "text": "The T-54/55 series was the most-produced tank in history. Estimated production numbers for the series range from 86,000 to 100,000. They were replaced by the T-62, T-64, T-72, T-80 and T-90 tanks in the Soviet and Russian armies, but remain in use by up to 50 other armies worldwide, some having received sophisticated retrofitting. During the Cold War, Soviet tanks never directly faced their NATO adversaries in combat in Europe. However, the T-54/55's first appearance in the West around the period of the 1950s (then the beginning of the Cold War) spurred the United Kingdom to develop a new tank gun, the Royal Ordnance L7, and the United States to develop the M60 Patton.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Kharkiv/UralVagonZavod", - "role": "Main Battle Tank", - "year-of-variant-introduction": "1963" - } - }], - "MBT T-72B": [{ - "default": { - "name": "T-72B with Kontakt-1 ERA", - "text": "The T-72 is a family of Soviet/Russian main battle tanks that first entered production in 1971. About 20,000 T-72 tanks have been built, and refurbishment has enabled many to remain in service for decades. The T-72A version introduced in 1979 is considered a second-generation main battle tank. It was widely exported and saw service in 40 countries and in numerous conflicts. The T-72B3 version introduced in 2010 is considered a third-generation main battle tank (MBT).", - "country-of-origin": "USSR/Russia", - "manufacturer": "UralVagonZavod", - "role": "Main Battle Tank", - "year-of-variant-introduction": "1985" - } - }], - "MBT T-72B3": [{ - "default": { - "name": "T-72B3 model 2011", - "text": "The T-72 is a family of Soviet/Russian main battle tanks that first entered production in 1971. About 20,000 T-72 tanks have been built, and refurbishment has enabled many to remain in service for decades. The T-72A version introduced in 1979 is considered a second-generation main battle tank. It was widely exported and saw service in 40 countries and in numerous conflicts. The T-72B3 version introduced in 2010 is considered a third-generation main battle tank (MBT).", - "country-of-origin": "USSR/Russia", - "manufacturer": "UralVagonZavod", - "role": "Main Battle Tank", - "year-of-variant-introduction": "2010" - } - }], - "MBT T-80U": [{ - "default": { - "name": "T-80U", - "text": "The T-80 is a main battle tank (MBT) designed and manufactured in the Soviet Union. When it entered service in 1976, it was the second MBT in the world to be equipped with a gas turbine engine after the Swedish Strv 103 and the first to use it as a primary propulsion engine. The T-80U was last produced in a factory in Omsk, Russia, while the T-80UD and further-developed T-84 continue to be produced in Ukraine. The T-80 and its variants are in service in Belarus, Cyprus, Egypt, Kazakhstan,[12] Pakistan, Russia, South Korea, and Ukraine.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Omsk Transmash", - "role": "Main Battle Tank", - "year-of-variant-introduction": "1985" - } - }], - "MBT T-90": [{ - "default": { - "name": "T-90A", - "text": "The T-90 is a third-generation Russian main battle tank that entered service in 1993. The tank is a modern variation of the T-72B and incorporates many features found on the T-80U. Originally called the T-72BU, but later renamed to T-90, it is an advanced tank in service with Russian Ground Forces and the Naval Infantry. ", - "country-of-origin": "Russia", - "manufacturer": "UralVagonZavod", - "role": "Main Battle Tank", - "year-of-variant-introduction": "2004" - } - }], - "MLRS 9A52 Smerch": [{ - "default": { - "name": "BM-30 Smerch (9M55K Cluster Rockets)", - "text": "The BM-30 Smerch (Russian: Смерч, \"tornado\", \"whirlwind\"), 9K58 Smerch or 9A52-2 Smerch-M is a Soviet heavy multiple rocket launcher. The system is intended to defeat personnel, armored, and soft targets in concentration areas, artillery batteries, command posts and ammunition depots.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Splav", - "role": "Multiple-Launch Rocket System", - "year-of-variant-introduction": "1989" - } - }], - "MLRS 9A52 Smerch HE": [{ - "default": { - "name": "BM-30 Smerch (9M55K5 HE Rockets)", - "text": "The BM-30 Smerch (Russian: Смерч, \"tornado\", \"whirlwind\"), 9K58 Smerch or 9A52-2 Smerch-M is a Soviet heavy multiple rocket launcher. The system is intended to defeat personnel, armored, and soft targets in concentration areas, artillery batteries, command posts and ammunition depots.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Splav", - "role": "Multiple-Launch Rocket System", - "year-of-variant-introduction": "1989" - } - }], - "MLRS 9K57 Uragan BM-27": [{ - "default": { - "name": "BM-27 Uragan", - "text": "The BM-27 Uragan (Russian: Ураган, lit. 'Hurricane'; GRAU index 9P140) is a self-propelled multiple rocket launcher system designed in the Soviet Union.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Splav", - "role": "Multiple-Launch Rocket System", - "year-of-variant-introduction": "1975" - } - }], - "MLRS BM-21 Grad": [{ - "default": { - "name": "BM-21 Grad", - "text": "The BM-21 \"Grad\" (Russian: БМ-21 \"Град\", lit. 'hail') is a Soviet truck-mounted 122 mm multiple rocket launcher.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Splav", - "role": "Multiple-Launch Rocket System", - "year-of-variant-introduction": "1963" - } - }], - "MLRS FDDM": [{ - "default": { - "name": "M1043 HMMWV with Fire Direction Data Manager", - "text": "The High Mobility Multipurpose Wheeled Vehicle with a Fire Direction Data Manager.", - "country-of-origin": "USA", - "role": "Fire Control Vehicle", - "year-of-variant-introduction": "1993" - } - }], - "MLRS M270": [{ - "default": { - "name": "M270 Multiple Launch Rocket System", - "text": "The M270 Multiple Launch Rocket System (M270 MLRS) is an armored, self-propelled, multiple rocket launcher (a type of rocket artillery). Since the first M270s were delivered to the U.S. Army in 1983, the MLRS has been adopted by several NATO countries. Some 1,300 M270 systems have been manufactured in the United States and in Europe, along with more than 700,000 rockets. The production of the M270 ended in 2003, when a last batch was delivered to the Egyptian Army.", - "country-of-origin": "USA", - "manufacturer": "Vought", - "role": "Multiple-Launch Rocket System", - "year-of-variant-introduction": "1983" - } - }], - "MT M4 Sherman": [{ - "default": { - "name": "M4A2(75) Sherman", - "text": "The M4 Sherman, officially Medium Tank, M4, was the most widely used medium tank by the United States and Western Allies in World War II. The M4 Sherman proved to be reliable, relatively cheap to produce, and available in great numbers. It was also the basis of several successful tank destroyers, such as the M10, 17pdr SP Achilles and M36B1. Tens of thousands were distributed through the Lend-Lease program to the British Commonwealth and Soviet Union.", - "country-of-origin": "USA", - "manufacturer": "Fisher", - "role": "Medium Tank", - "year-of-variant-introduction": "1942" - }, - "UK": { - "name": "Sherman III" - } - }], - "MT M4A4 Sherman Firefly": [{ - "default": { - "name": "M4A4 Sherman Firefly", - "text": "The Sherman Firefly was a tank used by the United Kingdom and some Commonwealth and Allied armoured formations in the Second World War. It was based on the US M4 Sherman, but fitted with the more powerful 3-inch (76.2 mm) calibre British 17-pounder anti-tank gun as its main weapon.", - "country-of-origin": "USA/UK", - "manufacturer": "Chrysler", - "role": "Medium Tank", - "year-of-variant-introduction": "1943" - }, - "UK": { - "name": "Sherman Firefly VC" - } - }], - "MT Pz.Kpfw.IV Ausf.H": [{ - "default": { - "name": "Panzerkampfwagen IV Ausf. H", - "text": "The Panzerkampfwagen IV (Pz.Kpfw. IV), commonly known as the Panzer IV, was a German medium tank developed in the late 1930s and used extensively during the Second World War. Its ordnance inventory designation was Sd.Kfz. 161. The Panzer IV was the most numerous German tank and the second-most numerous German armored fighting vehicle of the Second World War, with some 8,500 built. ", - "country-of-origin": "Germany", - "manufacturer": "Krupp-Gruson/Vomag/Nibelungenwerke", - "role": "Medium Tank", - "year-of-variant-introduction": "1943" - } - }], - "MT Pz.Kpfw.V Panther Ausf.G": [{ - "default": { - "name": "Panzerkampfwagen V Panther Ausf. G", - "text": "The Panther is a German medium tank deployed during World War II on the Eastern and Western Fronts in Europe from mid-1943 to the war's end in 1945. The Panther was intended to counter the Soviet T-34 and to replace the Panzer III and Panzer IV. Nevertheless, it served alongside the Panzer IV and the heavier Tiger I until the end of the war. It is considered one of the best tanks of World War II for its excellent firepower and protection, although its reliability was less impressive.", - "country-of-origin": "Germany", - "manufacturer": "MAN/Daimler-Benz/MNH", - "role": "Medium Tank", - "year-of-variant-introduction": "1944" - } - }], - "SAM Avenger M1097": [{ - "default": { - "name": "M1097 Heavy HMMWV Avenger", - "text": "The Avenger Air Defense System, designated AN/TWQ-1 under the Joint Electronics Type Designation System, is an American self-propelled surface-to-air missile system which provides mobile, short-range air defense protection for ground units against cruise missiles, unmanned aerial vehicles, low-flying fixed-wing aircraft, and helicopters.", - "country-of-origin": "USA", - "manufacturer": "Boeing", - "role": "Self-Propelled Surface-to-Air Missile Launcher", - "year-of-variant-introduction": "1990" - } - }], - "SAM Chaparral M48": [{ - "default": { - "name": "M48 Chaparral", - "text": "The MIM-72A/M48 Chaparral is an American self-propelled surface-to-air missile system based on the AIM-9 Sidewinder air-to-air missile system. The launcher is based on the M113 family of vehicles. It entered service with the United States Army in 1969 and was phased out between 1990 and 1998.", - "country-of-origin": "USA", - "manufacturer": "Ford Motor Company", - "role": "Self-Propelled Surface-to-Air Missile Launcher", - "year-of-variant-introduction": "1969" - } - }], - "SAM Linebacker M6": [{ - "default": { - "name": "M6 Linebacker", - "text": "The M6 Linebacker short-range air defense system was developed by Boeing to meet the US Army requirements. The new vehicle was intended to counter the threat posed by low-flying aircraft, helicopters, cruise missiles and unmanned aerial vehicles to forward armored formations. Initial production Linebackers entered service with the US Army in 1997. A total of 99 Bradley Linebackers were ordered, however in 2006 these were phased-out of service. The M6 is an all-weather system, capable of operating in day/night and all weather conditions. It is based on the M2 Bradley IFV and is equipped with a quadruple launcher with FIM-92 Stinger short-range surface-to-air missiles instead of the TOW ATGW.", - "country-of-origin": "USA", - "manufacturer": "United Defense", - "role": "Self-Propelled Anti-Aircraft System", - "year-of-variant-introduction": "1997" - } - }], - "SAM Roland ADS": [{ - "default": { - "name": "Roland 2 (Marder Chassis)", - "text": "he Roland is a Franco-German mobile short-range surface-to-air missile (SAM) system. ", - "country-of-origin": "France/Germany", - "manufacturer": "Euromissile", - "role": "Self-Propelled Surface-to-Air Missile Launcher", - "year-of-variant-introduction": "1981" - } - }], - "SAM SA-13 Strela-10M3 9A35M3": [{ - "default": { - "name": "SA-13 Gopher (9K35 Strela-10M3)", - "text": "The 9K35 Strela-10 (Russian: 9К35 «Стрела-10»; English: arrow) is a highly mobile, short-range surface-to-air missile system. It is visually aimed, and utilizes optical/infrared-guidance. The system is primarily intended to engage low-altitude threats, such as helicopters. \"9K35\" is its GRAU designation; its NATO reporting name is SA-13 \"Gopher\".", - "country-of-origin": "USSR/Russia", - "manufacturer": "Ulyanovsk", - "role": "Self-Propelled Surface-to-Air Missile Launcher", - "year-of-variant-introduction": "1981" - } - }], - "SAM SA-19 Tunguska 2S6": [{ - "default": { - "name": "SA-19 Grison (2K22 Tunguska)", - "text": "The 2K22 Tunguska (Russian: 2К22 'Тунгуска') is a Russian tracked self-propelled anti-aircraft weapon armed with a surface-to-air gun and missile system. It is designed to provide day and night protection for infantry and tank regiments against low-flying aircraft, helicopters, and cruise missiles in all weather conditions. The NATO reporting name for the missile used by the weapon system is SA-19 \"Grison\".", - "country-of-origin": "USSR/Russia", - "manufacturer": "Ulyanovsk", - "role": "Self-Propelled Anti-Aircraft System", - "year-of-variant-introduction": "1982" - } - }], - "Sd.Kfz.184 Elefant": [{ - "default": { - "name": "Sd.Kfz.184 Elefant", - "text": "The Elefant (German for \"elephant\") was a heavy tank destroyer used by German Wehrmacht Panzerjäger during World War II. Ninety-one units were built in 1943 under the name Ferdinand, after its designer Ferdinand Porsche, using tank hulls produced for the Tiger I tank design abandoned in favour of a Henschel design.", - "country-of-origin": "Germany", - "manufacturer": "Porsche/Nibelungenwerk", - "role": "Tank Destroyer", - "year-of-variant-introduction": "1944" - } - }], - "SPAAA Gepard": [{ - "default": { - "name": "Flakpanzer Gepard", - "text": "The Flugabwehrkanonenpanzer Gepard (\"anti-aircraft cannon tank Cheetah\", better known as the Flakpanzer Gepard) is an all-weather-capable German self-propelled anti-aircraft gun (SPAAG).[1] It was developed in the 1960s and fielded in the 1970s, and has been upgraded several times with the latest electronics. It constituted a cornerstone of the air defence of the German Army (Bundeswehr) and a number of other NATO countries. In Germany, the Gepard was phased out in late 2010 and replaced by Wiesel 2 Ozelot Leichtes Flugabwehrsystem (LeFlaSys) with four FIM-92 Stinger or LFK NG missile launchers.", - "country-of-origin": "West Germany", - "manufacturer": "Krauss-Maffei", - "role": "Self-Propelled Anti-Aircraft Gun", - "year-of-variant-introduction": "1976" - } - }], - "SPAAA ZSU-23-4 Shilka": [{ - "default": { - "name": "ZSU-23-4 Shilka", - "text": "The ZSU-23-4 \"Shilka\" is a lightly armored Soviet self-propelled, radar guided anti-aircraft weapon system (SPAAG). About 6500 have been build.", - "country-of-origin": "USSR/Russia", - "manufacturer": "MMZ", - "role": "Self-Propelled Anti-Aircraft Gun", - "year-of-variant-introduction": "1960" - } - }], - "SPG M1128 Stryker MGS": [{ - "default": { - "name": "M1128 Stryker Mobile Gun System", - "text": "The M1128 Mobile Gun System is an eight-wheeled armored car of the Stryker armored fighting vehicle family, mounting a 105 mm tank gun, based on the Canadian LAV III light-armored vehicle manufactured by General Dynamics Land Systems. It is in service with the United States Army but will be retired by the end of 2022.", - "country-of-origin": "USA", - "manufacturer": "General Dynamics", - "role": "Armoured Car", - "year-of-variant-introduction": "2006" - } - }], - "SpGH Dana": [{ - "default": { - "name": "SpGH DANA", - "text": "The DANA (the name being derived from \"dělo automobilní nabíjené automaticky\" (gun on truck loaded automatically)) is a wheeled self-propelled artillery piece.", - "country-of-origin": "Czechoslovakia", - "manufacturer": "ZTS", - "role": "Self-Propelled Gun", - "year-of-variant-introduction": "1980" - } - }], - "SPH 2S9 Nona": [{ - "default": { - "name": "2S9 Nona-S", - "text": "The 2S9 NONA (Новейшее Орудие Наземной Артилерии - Newest Ordnance of Ground Artillery) is an extremely light-weight self-propelled and air-droppable 120 mm gun-mortar designed in the Soviet Union, which entered service in 1981. The 2S9 chassis is designated the S-120 and based on the aluminium hull of the BTR-D airborne multi-purpose tracked armoured personnel carrier. More generally, the 120 mm mortar is referred to as the Nona, with the 2S9 also known as the Nona-S. Although no figures have been released, it is estimated that well over 1,000 2S9 were built.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Motovilikha", - "role": "Self-Propelled Mortar", - "year-of-variant-introduction": "1981" - } - }], - "SPH 2S3 Akatsia": [{ - "default": { - "name": "2S3 Akatsiya", - "text": "The SO-152 (Russian: СО-152) is a Soviet 152.4 mm self-propelled gun developed in 1968. It was a response to the American 155 mm M109. ", - "country-of-origin": "USSR/Russia", - "manufacturer": "Uraltransmash", - "role": "Self-Propelled Gun", - "year-of-variant-introduction": "1971" - } - }], - "SPH 2S1 Gvozdika": [{ - "default": { - "name": "2S1 Gvozdika", - "text": "The 2S1 Gvozdika (Russian: 2С1 «Гвоздика», \"Carnation\") is a Soviet self-propelled howitzer based on the MT-LBu multi-purpose chassis, mounting a 122 mm 2A18 howitzer. ", - "country-of-origin": "USSR/Russia", - "manufacturer": "Kharkiv", - "role": "Self-Propelled Gun", - "year-of-variant-introduction": "1972" - } - }], - "SPH 2S19 Msta": [{ - "default": { - "name": "2S19 Msta-S", - "text": "The 2S19 \"Msta-S\" (Russian: Мста, after the Msta River) is a 152.4 mm self-propelled howitzer designed by Soviet Union, which entered service in 1989 as the successor to the 2S3 Akatsiya. The vehicle is based on the T-80 tank hull, but is powered by the T-72's diesel engine.", - "country-of-origin": "USSR/Russia", - "manufacturer": "Uraltransmash", - "role": "Self-Propelled Gun", - "year-of-variant-introduction": "1989" - } - }], - "SPH M109 Paladin": [{ - "default": { - "name": "M109A6 Paladin", - "text": "The M109 is an American 155 mm turreted self-propelled howitzer, first introduced in the early 1960s to replace the M44.", - "country-of-origin": "USA", - "manufacturer": "United Defense", - "role": "Self-Propelled Gun", - "year-of-variant-introduction": "1994" - } - }], - "StuG III Ausf. G": [{ - "default": { - "name": "Sturmgeschütz III Ausf. G", - "text": "The Sturmgeschütz III (StuG III) assault gun was Germany's most-produced fully tracked armoured fighting vehicle during World War II, and second-most produced German armored combat vehicle of any type after the Sd.Kfz. 251 half-track. It was built on a slightly modified Panzer III chassis, replacing the turret with an armored, fixed superstructure mounting a more powerful gun. Initially intended as a mobile assault gun for direct-fire support for infantry, the StuG III was continually modified, and much like the later Jagdpanzer vehicles, was employed as a tank destroyer.", - "country-of-origin": "Germany", - "manufacturer": "Alkett/MIAG", - "role": "Assault Gun/Tank Destroyer", - "year-of-variant-introduction": "1942" - } - }], - "StuG IV": [{ - "default": { - "name": "Sturmgeschütz IV", - "text": "The Sturmgeschütz IV (StuG IV) (Sd.Kfz. 167) was a German assault gun variant of the Panzer IV used in the latter part of the Second World War. It was identical in role and concept to the highly successful StuG III assault gun variant of the Panzer III. Both StuG models were given an exclusively tank destroyer role in German formations and tactical planning in the last two years of the war, greatly augmenting the capability of the dwindling tank force available to the German army on the Eastern and Western fronts.", - "country-of-origin": "Germany", - "manufacturer": "Krupp", - "role": "Assault Gun/Tank Destroyer", - "year-of-variant-introduction": "1943" - } - }], - "Sturmpanzer IV Brummbär": [{ - "default": { - "name": "Sturmpanzer IV Brummbär", - "text": "The Sturmpanzer (also known as Sturmpanzer 43 or Sd.Kfz. 166) was a German armoured infantry support gun based on the Panzer IV chassis used in the Second World War. It was used at the Battles of Kursk, Anzio, Normandy, and was deployed in the Warsaw Uprising. It was known by the nickname Brummbär (German: \"Grouch\") by Allied intelligence, a name which was not used by the Germans. German soldiers nicknamed it the \"Stupa\", a contraction of the term Sturmpanzer. Just over 300 vehicles were built and they were assigned to four independent battalions.", - "country-of-origin": "Germany", - "manufacturer": "Vienna Arsenal", - "role": "Self-Propelled Gun", - "year-of-variant-introduction": "1943" - } - }], - "TD Jagdpanther G1": [{ - "default": { - "name": "Jagdpanther G1", - "text": "The Jagdpanther (German: \"hunting Panther\"), Sd.Kfz. 173, was a tank destroyer (Jagdpanzer, a self-propelled anti-tank gun) built by Germany during World War II. The Jagdpanther combined the 8.8 cm Pak 43 anti-tank gun, similar to the main gun of the Tiger II, and the armor and suspension of the Panther chassis.", - "country-of-origin": "Germany", - "manufacturer": "MIAG/MNH/MBA", - "role": "Tank Destroyer", - "year-of-variant-introduction": "1944" - } - }], - "TD Jagdpanzer IV": [{ - "default": { - "name": "Jagdpanzer IV", - "text": "The Jagdpanzer IV, Sd.Kfz. 162, was a German tank destroyer based on the Panzer IV chassis.", - "country-of-origin": "Germany", - "manufacturer": "Vomag", - "role": "Tank Destroyer", - "year-of-variant-introduction": "1944" - } - }], - "TD M10 GMC": [{ - "default": { - "name": "M10 3-inch Gun Motor Carriage", - "text": "The M10 tank destroyer was an American tank destroyer of World War II. The M10 was numerically the most important U.S. tank destroyer of World War II. It combined thin but sloped armor with the M4's reliable drivetrain and a reasonably potent anti-tank weapon mounted in an open-topped turret. Despite its obsolescence in the face of newer German tanks like the Panther and the introduction of more powerful and better-designed types as replacements, the M10 remained in service until the end of the war.", - "country-of-origin": "USA", - "manufacturer": "Fisher/Ford Motor Company", - "role": "Tank Destroyer", - "year-of-variant-introduction": "1942" - }, - "UK": { - "name": "3in SPM M10 Achilles Mk II" - } - }], - "TPz Fuchs": [{ - "default": { - "name": "TPz Fuchs", - "text": "The TPz (Transportpanzer) Fuchs (\"fox\") is a German armoured personnel carrier originally developed by Daimler-Benz but manufactured and further developed by the now Rheinmetall MAN Military Vehicles (RMMV). Fuchs was the second wheeled armoured vehicle to enter service with the Bundeswehr (West German Military) and it can be used for tasks including troop transport, engineer transport, bomb disposal, Nuclear, Biological and Chemical reconnaissance and electronic warfare. RMMV and its predecessors manufactured 1,236 Fuchs 1, mostly for the German Army.", - "country-of-origin": "Germany", - "manufacturer": "Rheinstahl Wehrtechnik", - "role": "Armoured Personnel Carrier", - "year-of-variant-introduction": "1979" - } - }], - "ZTZ-96B": [{ - "default": { - "name": "Type 96B (ZTZ-96B)", - "text": "The Type 96 or ZTZ96 is a Chinese second generation main battle tank (MBT). The final evolution of the Type 88 design, the Type 96 entered service with the People's Liberation Army (PLA) in 1997. The later variants of the Type 96 are regarded as near-equivalents to China's third generation MBT.", - "country-of-origin": "China", - "manufacturer": "First Inner Mongolia Machinery Factory", - "role": "Main Battle Tank", - "year-of-variant-introduction": "1979" - } - }], - "ZBD-04A": [{ - "default": { - "name": "Type 04A (ZBD-04A)", - "text": "The ZBD-04 or Type 04 (industrial designation WZ502) is a Chinese infantry fighting vehicle. It bears some external resemblance to the BMP-3, particularly with regards to its turret and main armament; however, the chassis and internal subsystems possesses a different layout.", - "country-of-origin": "China", - "manufacturer": "Norinco", - "role": "Main Battle Tank", - "year-of-variant-introduction": "1999" - } - }] -} diff --git a/tests/resources/invalid_faction_country.json b/tests/resources/invalid_faction_country.json index 50f3fe11..41255ff6 100644 --- a/tests/resources/invalid_faction_country.json +++ b/tests/resources/invalid_faction_country.json @@ -38,7 +38,7 @@ "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Truck_M818_6x6" + "M_818" ], "infantry_units": [ "Infantry_M4", @@ -51,17 +51,17 @@ "HawkGenerator" ], "aircraft_carrier": [ - "CVN_74_John_C__Stennis" + "Stennis" ], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "FFG_Oliver_Hazzard_Perry", - "DDG_Arleigh_Burke_IIa" + "PERRY", + "USS_Arleigh_Burke_IIa" ], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "requirements": {"mod": "Some mod is required"}, "carrier_names": [ diff --git a/tests/resources/valid_faction.json b/tests/resources/valid_faction.json index 1ee00e13..bec78164 100644 --- a/tests/resources/valid_faction.json +++ b/tests/resources/valid_faction.json @@ -40,7 +40,7 @@ "SPH_M109_Paladin_155mm" ], "logistics_units": [ - "Truck_M818_6x6" + "M_818" ], "infantry_units": [ "Infantry_M4", @@ -53,17 +53,17 @@ "HawkGenerator" ], "aircraft_carrier": [ - "CVN_74_John_C__Stennis" + "Stennis" ], "helicopter_carrier": [ - "LHA_1_Tarawa" + "LHA_Tarawa" ], "destroyers": [ - "FFG_Oliver_Hazzard_Perry", - "DDG_Arleigh_Burke_IIa" + "PERRY", + "USS_Arleigh_Burke_IIa" ], "cruisers": [ - "CG_Ticonderoga" + "TICONDEROG" ], "requirements": {"mod": "Some mod is required"}, "carrier_names": [ diff --git a/tests/test_factions.py b/tests/test_factions.py index 232786d4..677532c5 100644 --- a/tests/test_factions.py +++ b/tests/test_factions.py @@ -23,11 +23,11 @@ from dcs.planes import ( A_10C_2, ) from dcs.ships import ( - CVN_74_John_C__Stennis, - LHA_1_Tarawa, - FFG_Oliver_Hazzard_Perry, - DDG_Arleigh_Burke_IIa, - CG_Ticonderoga, + Stennis, + LHA_Tarawa, + PERRY, + USS_Arleigh_Burke_IIa, + TICONDEROG, ) from dcs.vehicles import Armor, Unarmed, Infantry, Artillery @@ -77,31 +77,31 @@ class TestFactionLoader(unittest.TestCase): self.assertTrue(faction.has_jtac) self.assertEqual(faction.jtac_unit, MQ_9_Reaper) - self.assertIn(Armor.MBT_M1A2_Abrams, 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.Scout_HMMWV, faction.frontline_units) - self.assertIn(Armor.ATGM_HMMWV, faction.frontline_units) + self.assertIn(Armor.M_1_Abrams, faction.frontline_units) + self.assertIn(Armor.M1134_Stryker_ATGM, faction.frontline_units) + self.assertIn(Armor.M1126_Stryker_ICV, faction.frontline_units) + self.assertIn(Armor.M_2_Bradley, faction.frontline_units) + self.assertIn(Armor.LAV_25, faction.frontline_units) + self.assertIn(Armor.M1043_HMMWV_Armament, faction.frontline_units) + self.assertIn(Armor.M1045_HMMWV_TOW, faction.frontline_units) - self.assertIn(Artillery.MLRS_M270_227mm, faction.artillery_units) - self.assertIn(Artillery.SPH_M109_Paladin_155mm, faction.artillery_units) + self.assertIn(Artillery.MLRS, faction.artillery_units) + self.assertIn(Artillery.M_109, faction.artillery_units) - self.assertIn(Unarmed.Truck_M818_6x6, faction.logistics_units) + self.assertIn(Unarmed.M_818, faction.logistics_units) - self.assertIn(Infantry.Infantry_M4, faction.infantry_units) - self.assertIn(Infantry.Infantry_M249, faction.infantry_units) + self.assertIn(Infantry.Soldier_M4, faction.infantry_units) + self.assertIn(Infantry.Soldier_M249, faction.infantry_units) self.assertIn("AvengerGenerator", faction.air_defenses) self.assertIn("HawkGenerator", faction.air_defenses) - self.assertIn(CVN_74_John_C__Stennis, faction.aircraft_carrier) - self.assertIn(LHA_1_Tarawa, faction.helicopter_carrier) - self.assertIn(FFG_Oliver_Hazzard_Perry, faction.destroyers) - self.assertIn(DDG_Arleigh_Burke_IIa, faction.destroyers) - self.assertIn(CG_Ticonderoga, faction.cruisers) + self.assertIn(Stennis, faction.aircraft_carrier) + self.assertIn(LHA_Tarawa, faction.helicopter_carrier) + self.assertIn(PERRY, faction.destroyers) + self.assertIn(USS_Arleigh_Burke_IIa, faction.destroyers) + self.assertIn(TICONDEROG, faction.cruisers) self.assertIn("mod", faction.requirements.keys()) self.assertIn("Some mod is required", faction.requirements.values())