diff --git a/game/ato/ai_flight_planner_db.py b/game/ato/ai_flight_planner_db.py index 4c49b3f7..1c515337 100644 --- a/game/ato/ai_flight_planner_db.py +++ b/game/ato/ai_flight_planner_db.py @@ -125,6 +125,7 @@ from pydcs_extensions.f22a.f22a import F_22A from pydcs_extensions.hercules.hercules import Hercules from pydcs_extensions.jas39.jas39 import JAS39Gripen, JAS39Gripen_AG from pydcs_extensions.su57.su57 import Su_57 +from pydcs_extensions.ov10a.ov10a import Bronco_OV_10A from pydcs_extensions.uh60l.uh60l import KC130J, UH_60L from .flighttype import FlightType @@ -214,6 +215,7 @@ CAS_CAPABLE = [ A_10A, B_1B, A_4E_C, + Bronco_OV_10A, F_14B, F_14A_135_GR, AJS37, @@ -321,6 +323,7 @@ DEAD_CAPABLE = SEAD_CAPABLE + [ P_47D_30, P_51D_30_NA, P_51D, + Bronco_OV_10A, SpitfireLFMkIXCW, SpitfireLFMkIX, MosquitoFBMkVI, @@ -368,6 +371,7 @@ STRIKE_CAPABLE = [ A_10C, S_3B, A_4E_C, + Bronco_OV_10A, M_2000C, Mirage_F1B, Mirage_F1BE, @@ -469,6 +473,7 @@ RUNWAY_ATTACK_CAPABLE = [ A_10C, S_3B, A_4E_C, + Bronco_OV_10A, M_2000C, Mirage_F1B, Mirage_F1BE, diff --git a/game/factions/faction.py b/game/factions/faction.py index d584dd89..fbe7fc64 100644 --- a/game/factions/faction.py +++ b/game/factions/faction.py @@ -302,6 +302,8 @@ class Faction: self.remove_aircraft("JAS39Gripen_AG") if not mod_settings.su57_felon: self.remove_aircraft("Su-57") + if not mod_settings.ov10a_bronco: + self.remove_aircraft("Bronco-OV-10A") # frenchpack if not mod_settings.frenchpack: self.remove_vehicle("AMX10RCR") diff --git a/game/theater/start_generator.py b/game/theater/start_generator.py index 7b69f678..52978792 100644 --- a/game/theater/start_generator.py +++ b/game/theater/start_generator.py @@ -60,6 +60,7 @@ class ModSettings: su57_felon: bool = False frenchpack: bool = False high_digit_sams: bool = False + ov10a_bronco: bool = False class GameGenerator: diff --git a/pydcs_extensions/__init__.py b/pydcs_extensions/__init__.py index 3bf436e2..acf2d7f5 100644 --- a/pydcs_extensions/__init__.py +++ b/pydcs_extensions/__init__.py @@ -7,6 +7,7 @@ from .highdigitsams import * from .jas39 import * from .su57 import * from .uh60l import * +from .ov10a import * def load_mods() -> None: diff --git a/pydcs_extensions/ov10a/ov10a.py b/pydcs_extensions/ov10a/ov10a.py new file mode 100644 index 00000000..e870d1b9 --- /dev/null +++ b/pydcs_extensions/ov10a/ov10a.py @@ -0,0 +1,174 @@ +from typing import Any, Dict, Set + +from dcs import task +from dcs.liveries_scanner import Liveries +from dcs.planes import PlaneType +from dcs.weapons_data import Weapons + +from game.modsupport import planemod +from pydcs_extensions.weapon_injector import inject_weapons + + +class WeaponsOV10A: + OV10_SMOKE = {"clsid": "{OV10_SMOKE}", "name": "OV10_SMOKE", "weight": 1} + ParaTrooper = {"clsid": "{PARA}", "name": "ParaTrooper", "weight": 80} + Fuel_Tank_150_gallons_ = { + "clsid": "{150gal}", + "name": "Fuel Tank 150 gallons", + "weight": 499.5592, + } + + +inject_weapons(WeaponsOV10A) + + +@planemod +class Bronco_OV_10A(PlaneType): + id = "Bronco-OV-10A" + flyable = True + height = 4.62 + width = 12.9 + length = 12.76 + fuel_max = 940 + max_speed = 684 + eplrs = True + category = "Interceptor" # {78EFB7A2-FD52-4b57-A6A6-3BF0E1D6555F} + radio_frequency = 127.5 + + panel_radio = { + 1: { + "channels": {6: 41, 2: 31, 8: 50, 3: 32, 1: 30, 4: 33, 5: 40, 7: 42}, + }, + } + + livery_name = "BRONCO-OV-10A" # from type + Liveries = Liveries()[livery_name] + + class Pylon1: + LAU_7_with_AIM_9P_Sidewinder_IR_AAM = ( + 1, + Weapons.LAU_7_with_AIM_9P_Sidewinder_IR_AAM, + ) + + # ERRR {MK-81} + + class Pylon2: + Mk_82___500lb_GP_Bomb_LD = (2, Weapons.Mk_82___500lb_GP_Bomb_LD) + Mk_82_Snakeye___500lb_GP_Bomb_HD = (2, Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD) + Mk_83___1000lb_GP_Bomb_LD = (2, Weapons.Mk_83___1000lb_GP_Bomb_LD) + M117___750lb_GP_Bomb_LD = (2, Weapons.M117___750lb_GP_Bomb_LD) + LAU3_WP156 = (2, Weapons.LAU3_WP156) + LAU3_WP1B = (2, Weapons.LAU3_WP1B) + LAU3_WP61 = (2, Weapons.LAU3_WP61) + LAU3_HE5 = (2, Weapons.LAU3_HE5) + LAU3_HE151 = (2, Weapons.LAU3_HE151) + M260_HYDRA = (2, Weapons.M260_HYDRA) + LAU_10R_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = ( + 2, + Weapons.LAU_10R_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG, + ) + LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = ( + 2, + Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG, + ) + + # ERRR {MK-81} + + class Pylon3: + Mk_82___500lb_GP_Bomb_LD = (3, Weapons.Mk_82___500lb_GP_Bomb_LD) + Mk_82_Snakeye___500lb_GP_Bomb_HD = (3, Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD) + Mk_83___1000lb_GP_Bomb_LD = (3, Weapons.Mk_83___1000lb_GP_Bomb_LD) + M117___750lb_GP_Bomb_LD = (3, Weapons.M117___750lb_GP_Bomb_LD) + LAU3_WP156 = (3, Weapons.LAU3_WP156) + LAU3_WP1B = (3, Weapons.LAU3_WP1B) + LAU3_WP61 = (3, Weapons.LAU3_WP61) + LAU3_HE5 = (3, Weapons.LAU3_HE5) + LAU3_HE151 = (3, Weapons.LAU3_HE151) + M260_HYDRA = (3, Weapons.M260_HYDRA) + LAU_10R_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = ( + 3, + Weapons.LAU_10R_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG, + ) + LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = ( + 3, + Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG, + ) + + class Pylon4: + Fuel_Tank_150_gallons_ = (4, Weapons.Fuel_Tank_150_gallons_) + # ERRR {MK-81} + Mk_82___500lb_GP_Bomb_LD = (4, Weapons.Mk_82___500lb_GP_Bomb_LD) + Mk_82_Snakeye___500lb_GP_Bomb_HD = (4, Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD) + Mk_83___1000lb_GP_Bomb_LD = (4, Weapons.Mk_83___1000lb_GP_Bomb_LD) + M117___750lb_GP_Bomb_LD = (4, Weapons.M117___750lb_GP_Bomb_LD) + + # ERRR {MK-81} + + class Pylon5: + Mk_82___500lb_GP_Bomb_LD = (5, Weapons.Mk_82___500lb_GP_Bomb_LD) + Mk_82_Snakeye___500lb_GP_Bomb_HD = (5, Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD) + Mk_83___1000lb_GP_Bomb_LD = (5, Weapons.Mk_83___1000lb_GP_Bomb_LD) + M117___750lb_GP_Bomb_LD = (5, Weapons.M117___750lb_GP_Bomb_LD) + LAU3_WP156 = (5, Weapons.LAU3_WP156) + LAU3_WP1B = (5, Weapons.LAU3_WP1B) + LAU3_WP61 = (5, Weapons.LAU3_WP61) + LAU3_HE5 = (5, Weapons.LAU3_HE5) + LAU3_HE151 = (5, Weapons.LAU3_HE151) + M260_HYDRA = (5, Weapons.M260_HYDRA) + LAU_10R_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = ( + 5, + Weapons.LAU_10R_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG, + ) + LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = ( + 5, + Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG, + ) + + # ERRR {MK-81} + + class Pylon6: + Mk_82___500lb_GP_Bomb_LD = (6, Weapons.Mk_82___500lb_GP_Bomb_LD) + Mk_82_Snakeye___500lb_GP_Bomb_HD = (6, Weapons.Mk_82_Snakeye___500lb_GP_Bomb_HD) + Mk_83___1000lb_GP_Bomb_LD = (6, Weapons.Mk_83___1000lb_GP_Bomb_LD) + M117___750lb_GP_Bomb_LD = (6, Weapons.M117___750lb_GP_Bomb_LD) + LAU3_WP156 = (6, Weapons.LAU3_WP156) + LAU3_WP1B = (6, Weapons.LAU3_WP1B) + LAU3_WP61 = (6, Weapons.LAU3_WP61) + LAU3_HE5 = (6, Weapons.LAU3_HE5) + LAU3_HE151 = (6, Weapons.LAU3_HE151) + M260_HYDRA = (6, Weapons.M260_HYDRA) + LAU_10R_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = ( + 6, + Weapons.LAU_10R_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG, + ) + LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG = ( + 6, + Weapons.LAU_10_pod___4_x_127mm_ZUNI__UnGd_Rkts_Mk71__HE_FRAG, + ) + + class Pylon7: + LAU_7_with_AIM_9P_Sidewinder_IR_AAM = ( + 7, + Weapons.LAU_7_with_AIM_9P_Sidewinder_IR_AAM, + ) + + class Pylon8: + ParaTrooper = (8, Weapons.ParaTrooper) + + class Pylon9: + OV10_SMOKE = (9, Weapons.OV10_SMOKE) + + pylons: Set[int] = {1, 2, 3, 4, 5, 6, 7, 8, 9} + + tasks = [ + task.GroundAttack, + task.RunwayAttack, + task.PinpointStrike, + task.CAS, + task.AFAC, + task.CAP, + task.Escort, + task.FighterSweep, + task.Intercept, + ] + task_default = task.CAS diff --git a/qt_ui/windows/newgame/QNewGameWizard.py b/qt_ui/windows/newgame/QNewGameWizard.py index ed91caa7..b82f4a4d 100644 --- a/qt_ui/windows/newgame/QNewGameWizard.py +++ b/qt_ui/windows/newgame/QNewGameWizard.py @@ -165,6 +165,7 @@ class NewGameWizard(QtWidgets.QWizard): uh_60l=self.field("uh_60l"), jas39_gripen=self.field("jas39_gripen"), su57_felon=self.field("su57_felon"), + ov10a_bronco=self.field("ov10a_bronco"), frenchpack=self.field("frenchpack"), high_digit_sams=self.field("high_digit_sams"), ) @@ -663,6 +664,8 @@ class GeneratorOptions(QtWidgets.QWizardPage): self.registerField("jas39_gripen", jas39_gripen) su57_felon = QtWidgets.QCheckBox() self.registerField("su57_felon", su57_felon) + ov10a_bronco = QtWidgets.QCheckBox() + self.registerField("ov10a_bronco", ov10a_bronco) frenchpack = QtWidgets.QCheckBox() self.registerField("frenchpack", frenchpack) high_digit_sams = QtWidgets.QCheckBox() @@ -707,6 +710,9 @@ class GeneratorOptions(QtWidgets.QWizardPage): modLayout.addWidget(QtWidgets.QLabel("Su-57 Felon"), modLayout_row, 0) modLayout.addWidget(su57_felon, modLayout_row, 1) modLayout_row += 1 + modLayout.addWidget(QtWidgets.QLabel("OV-10A Bronco"), modLayout_row, 0) + modLayout.addWidget(ov10a_bronco, modLayout_row, 1) + modLayout_row += 1 modLayout.addWidget(QtWidgets.QLabel("Frenchpack"), modLayout_row, 0) modLayout.addWidget(frenchpack, modLayout_row, 1) modLayout_row += 1 diff --git a/resources/customized_payloads/Bronco-OV-10A.lua b/resources/customized_payloads/Bronco-OV-10A.lua new file mode 100644 index 00000000..b53a77f3 --- /dev/null +++ b/resources/customized_payloads/Bronco-OV-10A.lua @@ -0,0 +1,173 @@ +local unitPayloads = { + ["name"] = "A-4E-C", + ["payloads"] = { + [1] = { + ["name"] = "CAP", + ["pylons"] = { + [1] = { + ["CLSID"] = "{AIM-9P-ON-ADAPTER}", + ["num"] = 1, + }, + [2] = { + ["CLSID"] = "{AIM-9P-ON-ADAPTER}", + ["num"] = 7, + }, + [3] = { + ["CLSID"] = "{150gal}", + ["num"] = 4, + }, + }, + ["tasks"] = { + [1] = 31, + }, + }, + [2] = { + ["name"] = "CAS", + ["pylons"] = { + [1] = { + ["CLSID"] = "LAU3_HE5", + ["num"] = 2, + }, + [2] = { + ["CLSID"] = "{AIM-9P-ON-ADAPTER}", + ["num"] = 1, + }, + [3] = { + ["CLSID"] = "{F3EFE0AB-E91A-42D8-9CA2-B63C91ED570A}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{F3EFE0AB-E91A-42D8-9CA2-B63C91ED570A}", + ["num"] = 5, + }, + [5] = { + ["CLSID"] = "{150gal}", + ["num"] = 4, + }, + [6] = { + ["CLSID"] = "{AIM-9P-ON-ADAPTER}", + ["num"] = 7, + }, + [7] = { + ["CLSID"] = "LAU3_HE5", + ["num"] = 6, + }, + }, + ["tasks"] = { + [1] = 31, + }, + }, + [3] = { + ["name"] = "STRIKE", + ["pylons"] = { + [1] = { + ["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}", + ["num"] = 2, + }, + [2] = { + ["CLSID"] = "{AIM-9P-ON-ADAPTER}", + ["num"] = 1, + }, + [3] = { + ["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}", + ["num"] = 5, + }, + [5] = { + ["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}", + ["num"] = 4, + }, + [6] = { + ["CLSID"] = "{AIM-9P-ON-ADAPTER}", + ["num"] = 7, + }, + [7] = { + ["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}", + ["num"] = 6, + }, + }, + ["tasks"] = { + [1] = 31, + }, + }, + [4] = { + ["name"] = "SEAD", + ["pylons"] = { + [1] = { + ["CLSID"] = "LAU3_HE5", + ["num"] = 2, + }, + [2] = { + ["CLSID"] = "{AIM-9P-ON-ADAPTER}", + ["num"] = 1, + }, + [3] = { + ["CLSID"] = "{F3EFE0AB-E91A-42D8-9CA2-B63C91ED570A}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{F3EFE0AB-E91A-42D8-9CA2-B63C91ED570A}", + ["num"] = 5, + }, + [5] = { + ["CLSID"] = "{150gal}", + ["num"] = 4, + }, + [6] = { + ["CLSID"] = "{AIM-9P-ON-ADAPTER}", + ["num"] = 7, + }, + [7] = { + ["CLSID"] = "LAU3_HE5", + ["num"] = 6, + }, + }, + ["tasks"] = { + [1] = 31, + }, + }, + [5] = { + ["name"] = "ANTISHIP", + ["pylons"] = { + [1] = { + ["CLSID"] = "LAU3_HE5", + ["num"] = 2, + }, + [2] = { + ["CLSID"] = "{AIM-9P-ON-ADAPTER}", + ["num"] = 1, + }, + [3] = { + ["CLSID"] = "{F3EFE0AB-E91A-42D8-9CA2-B63C91ED570A}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{F3EFE0AB-E91A-42D8-9CA2-B63C91ED570A}", + ["num"] = 5, + }, + [5] = { + ["CLSID"] = "{150gal}", + ["num"] = 4, + }, + [6] = { + ["CLSID"] = "{AIM-9P-ON-ADAPTER}", + ["num"] = 7, + }, + [7] = { + ["CLSID"] = "LAU3_HE5", + ["num"] = 6, + }, + }, + ["tasks"] = { + [1] = 31, + }, + }, + }, + ["tasks"] = { + }, + ["unitType"] = "Bronco-OV-10A", +} +return unitPayloads diff --git a/resources/factions/usa_1975.json b/resources/factions/usa_1975.json index 191d7c90..275226e9 100644 --- a/resources/factions/usa_1975.json +++ b/resources/factions/usa_1975.json @@ -15,6 +15,7 @@ "F-4E Phantom II", "F-5E Tiger II", "S-3B Viking", + "OV-10A Bronco", "UH-1H Iroquois" ], "awacs": [ diff --git a/resources/ui/units/aircrafts/banners/Bronco-OV-10A_24.jpg b/resources/ui/units/aircrafts/banners/Bronco-OV-10A_24.jpg new file mode 100644 index 00000000..3abece86 Binary files /dev/null and b/resources/ui/units/aircrafts/banners/Bronco-OV-10A_24.jpg differ diff --git a/resources/ui/units/aircrafts/icons/Bronco-OV-10A_24.jpg b/resources/ui/units/aircrafts/icons/Bronco-OV-10A_24.jpg new file mode 100644 index 00000000..2407cf51 Binary files /dev/null and b/resources/ui/units/aircrafts/icons/Bronco-OV-10A_24.jpg differ diff --git a/resources/units/aircraft/Bronco-OV-10A.yaml b/resources/units/aircraft/Bronco-OV-10A.yaml new file mode 100644 index 00000000..ad340583 --- /dev/null +++ b/resources/units/aircraft/Bronco-OV-10A.yaml @@ -0,0 +1,14 @@ +carrier_capable: false +description: The North American Rockwell OV-10 Bronco is an American twin-turboprop + light attack and observation aircraft. It was developed in the 1960s as a special aircraft + for counter-insurgency (COIN) combat, and one of its primary missions was as a forward air control (FAC) aircraft. + It can carry up to 3,200 lb (1,450 kg) of external munitions and internal loads such as paratroopers or stretchers, + and can loiter for three or more hours. +introduced: 1969 +manufacturer: North American Rockwell +origin: USA +price: 4 +role: COIN / FAC /Light Attack +gunfighter: true +variants: + OV-10A Bronco: {}