diff --git a/changelog.md b/changelog.md index 92abf4df..5992abd5 100644 --- a/changelog.md +++ b/changelog.md @@ -7,6 +7,7 @@ * **[Modding]** Update Grinelli Designs F-22A Mod to 2.0.0 (May 2025) * **[Campaign Design]** Added support for Germany Cold War terrain by Ugra Media * **[Options]** New option to control EPLRS-task injection in mission generator +* **[Modding]** Add Tornado F3 ADV (v1.0, requires FC3 fix) ## Fixes * **[Flight Plans]** Fixed a bug when a package was created with only escort flights diff --git a/game/factions/faction.py b/game/factions/faction.py index 04a1870e..a86925a5 100644 --- a/game/factions/faction.py +++ b/game/factions/faction.py @@ -865,6 +865,9 @@ class Faction: # MiG-31BM if not mod_settings.mig31bm_foxhound: self.remove_aircraft("MiG-31BM") + # Tornado f.3 ADV (1.0) + if not mod_settings.tornado_adv: + self.remove_aircraft("Tornado_ADV") def remove_aircraft(self, name: str) -> None: for aircraft_set in [self.aircraft, self.awacs, self.tankers]: diff --git a/game/theater/start_generator.py b/game/theater/start_generator.py index f9e3bdb7..2894e0cb 100644 --- a/game/theater/start_generator.py +++ b/game/theater/start_generator.py @@ -95,6 +95,7 @@ class ModSettings: su15_flagon: bool = False su30_flanker_h: bool = False su57_felon: bool = False + tornado_adv: bool = False frenchpack: bool = False high_digit_sams: bool = False ov10a_bronco: bool = False diff --git a/pydcs_extensions/__init__.py b/pydcs_extensions/__init__.py index c8a47633..62dae4da 100644 --- a/pydcs_extensions/__init__.py +++ b/pydcs_extensions/__init__.py @@ -41,6 +41,7 @@ from .chinesemilitaryassetspack import * from .russianmilitaryassetspack import * from .usamilitaryassetspack import * from .ukrainemilitaryassetspack import * +from .tornado_adv import * def load_mods() -> None: diff --git a/pydcs_extensions/tornado_adv/__init__.py b/pydcs_extensions/tornado_adv/__init__.py new file mode 100644 index 00000000..263dc169 --- /dev/null +++ b/pydcs_extensions/tornado_adv/__init__.py @@ -0,0 +1 @@ +from .tornado_adv import * diff --git a/pydcs_extensions/tornado_adv/tornado_adv.py b/pydcs_extensions/tornado_adv/tornado_adv.py new file mode 100644 index 00000000..a851fb68 --- /dev/null +++ b/pydcs_extensions/tornado_adv/tornado_adv.py @@ -0,0 +1,143 @@ +from typing import Dict, List, Set, Any + +from dcs import task +from dcs.planes import PlaneType +from dcs.unitpropertydescription import UnitPropertyDescription +from dcs.weapons_data import Weapons +from dcs.unitpropertydescription import UnitPropertyDescription + + +from game.modsupport import planemod +from pydcs_extensions.weapon_injector import inject_weapons + + +class WeaponsTORNADO_ADV: + Skyflash__Semi_Active_Radar_AAM_ = { + "clsid": "{Skflash1}", + "name": "Skyflash (Semi-Active Radar AAM)", + "weight": 194, + } + + +inject_weapons(WeaponsTORNADO_ADV) + + +@planemod +class Tornado_ADV(PlaneType): + id = "Tornado_ADV" + flyable = True + height = 5.7 + width = 13.9 + length = 16.7 + fuel_max = 4660 + max_speed = 2649.996 + chaff = 90 + flare = 45 + charge_total = 180 + chaff_charge_size = 1 + flare_charge_size = 2 + category = "Interceptor" # {78EFB7A2-FD52-4b57-A6A6-3BF0E1D6555F} + radio_frequency = 127.5 + + livery_name = "TORNADO_ADV" # from type + + class Pylon1: + AIM_9P_Sidewinder_IR_AAM = (1, Weapons.AIM_9P_Sidewinder_IR_AAM) + AIM_9M_Sidewinder_IR_AAM = (1, Weapons.AIM_9M_Sidewinder_IR_AAM) + # ERRR {JAS39_ASRAAM} + AIM_9P5_Sidewinder_IR_AAM = (1, Weapons.AIM_9P5_Sidewinder_IR_AAM) + AIM_9L_Sidewinder_IR_AAM = (1, Weapons.AIM_9L_Sidewinder_IR_AAM) + + class Pylon2: + Fuel_Tank_800_L__21_ = (2, Weapons.Fuel_Tank_800_L__21_) + + class Pylon3: + AIM_9P_Sidewinder_IR_AAM = (3, Weapons.AIM_9P_Sidewinder_IR_AAM) + AIM_9M_Sidewinder_IR_AAM = (3, Weapons.AIM_9M_Sidewinder_IR_AAM) + # ERRR {JAS39_ASRAAM} + AIM_9P5_Sidewinder_IR_AAM = (3, Weapons.AIM_9P5_Sidewinder_IR_AAM) + AIM_9L_Sidewinder_IR_AAM = (3, Weapons.AIM_9L_Sidewinder_IR_AAM) + + class Pylon5: + AIM_120B_AMRAAM___Active_Radar_AAM = ( + 5, + Weapons.AIM_120B_AMRAAM___Active_Radar_AAM, + ) + AIM_120C_AMRAAM___Active_Radar_AAM = ( + 5, + Weapons.AIM_120C_AMRAAM___Active_Radar_AAM, + ) + Skyflash__Semi_Active_Radar_AAM_ = ( + 5, + WeaponsTORNADO_ADV.Skyflash__Semi_Active_Radar_AAM_, + ) + + class Pylon6: + AIM_120B_AMRAAM___Active_Radar_AAM = ( + 6, + Weapons.AIM_120B_AMRAAM___Active_Radar_AAM, + ) + AIM_120C_AMRAAM___Active_Radar_AAM = ( + 6, + Weapons.AIM_120C_AMRAAM___Active_Radar_AAM, + ) + Skyflash__Semi_Active_Radar_AAM_ = ( + 6, + WeaponsTORNADO_ADV.Skyflash__Semi_Active_Radar_AAM_, + ) + + class Pylon7: + AIM_120B_AMRAAM___Active_Radar_AAM = ( + 7, + Weapons.AIM_120B_AMRAAM___Active_Radar_AAM, + ) + AIM_120C_AMRAAM___Active_Radar_AAM = ( + 7, + Weapons.AIM_120C_AMRAAM___Active_Radar_AAM, + ) + Skyflash__Semi_Active_Radar_AAM_ = ( + 7, + WeaponsTORNADO_ADV.Skyflash__Semi_Active_Radar_AAM_, + ) + + class Pylon8: + AIM_120B_AMRAAM___Active_Radar_AAM = ( + 8, + Weapons.AIM_120B_AMRAAM___Active_Radar_AAM, + ) + AIM_120C_AMRAAM___Active_Radar_AAM = ( + 8, + Weapons.AIM_120C_AMRAAM___Active_Radar_AAM, + ) + Skyflash__Semi_Active_Radar_AAM_ = ( + 8, + WeaponsTORNADO_ADV.Skyflash__Semi_Active_Radar_AAM_, + ) + + class Pylon10: + AIM_9P_Sidewinder_IR_AAM = (10, Weapons.AIM_9P_Sidewinder_IR_AAM) + AIM_9M_Sidewinder_IR_AAM = (10, Weapons.AIM_9M_Sidewinder_IR_AAM) + # ERRR {JAS39_ASRAAM} + AIM_9P5_Sidewinder_IR_AAM = (10, Weapons.AIM_9P5_Sidewinder_IR_AAM) + AIM_9L_Sidewinder_IR_AAM = (10, Weapons.AIM_9L_Sidewinder_IR_AAM) + + class Pylon11: + Fuel_Tank_800_L__21_ = (11, Weapons.Fuel_Tank_800_L__21_) + + class Pylon12: + AIM_9P_Sidewinder_IR_AAM = (12, Weapons.AIM_9P_Sidewinder_IR_AAM) + AIM_9M_Sidewinder_IR_AAM = (12, Weapons.AIM_9M_Sidewinder_IR_AAM) + # ERRR {JAS39_ASRAAM} + AIM_9P5_Sidewinder_IR_AAM = (12, Weapons.AIM_9P5_Sidewinder_IR_AAM) + AIM_9L_Sidewinder_IR_AAM = (12, Weapons.AIM_9L_Sidewinder_IR_AAM) + + pylons: Set[int] = {1, 2, 3, 5, 6, 7, 8, 10, 11, 12} + + tasks = [ + task.CAP, + task.Escort, + task.FighterSweep, + task.Intercept, + task.Reconnaissance, + ] + task_default = task.CAP diff --git a/qt_ui/windows/newgame/QNewGameWizard.py b/qt_ui/windows/newgame/QNewGameWizard.py index 7f4f1575..2f9485f7 100644 --- a/qt_ui/windows/newgame/QNewGameWizard.py +++ b/qt_ui/windows/newgame/QNewGameWizard.py @@ -131,6 +131,7 @@ class NewGameWizard(QtWidgets.QWizard): usamilitaryassetspack=self.field("usamilitaryassetspack"), ukrainemilitaryassetspack=self.field("ukrainemilitaryassetspack"), mig31bm_foxhound=self.field("mig31bm_foxhound"), + tornado_adv=self.field("tornado_adv"), ) blue_faction = self.faction_selection_page.selected_blue_faction diff --git a/qt_ui/windows/newgame/WizardPages/QGeneratorSettings.py b/qt_ui/windows/newgame/WizardPages/QGeneratorSettings.py index 57502ada..a6f03b0c 100644 --- a/qt_ui/windows/newgame/WizardPages/QGeneratorSettings.py +++ b/qt_ui/windows/newgame/WizardPages/QGeneratorSettings.py @@ -174,6 +174,8 @@ class GeneratorOptions(QtWidgets.QWizardPage): self.registerField("ukrainemilitaryassetspack", self.ukrainemilitaryassetspack) self.mig31bm_foxhound = QtWidgets.QCheckBox() self.registerField("mig31bm_foxhound", self.mig31bm_foxhound) + self.tornado_adv = QtWidgets.QCheckBox() + self.registerField("tornado_adv", self.tornado_adv) modHelpText = QtWidgets.QLabel( "

Select the mods you have installed. If your chosen factions support them, you'll be able to use these mods in your campaign.

" @@ -240,6 +242,7 @@ class GeneratorOptions(QtWidgets.QWizardPage): ("Su-30 Flanker-H (V2.7.73b)", self.su30_flanker_h), ("Su-57 Felon (build-04)", self.su57_felon), ("Super Étendard (v2.5.5)", self.super_etendard), + ("Tornado F3 ADV (1.0)", self.tornado_adv), ("UH-60L Black Hawk (v1.3.1)", self.uh_60l), ("Vietnam War Vessels (v0.9.0 by TeTeT)", self.vietnamwarvessels), ] @@ -323,3 +326,4 @@ class GeneratorOptions(QtWidgets.QWizardPage): self.ukrainemilitaryassetspack.setChecked( s.get("ukrainemilitaryassetspack", False) ) + self.tornado_adv.setChecked(s.get("tornado_adv", False)) diff --git a/resources/customized_payloads/Tornado_ADV.lua b/resources/customized_payloads/Tornado_ADV.lua new file mode 100644 index 00000000..74b52354 --- /dev/null +++ b/resources/customized_payloads/Tornado_ADV.lua @@ -0,0 +1,107 @@ +local unitPayloads = { + ["name"] = "Tornado_ADV", + ["payloads"] = { + [1] = { + ["name"] = "Retribution Escort", + ["pylons"] = { + [1] = { + ["CLSID"] = "{AIM-9P5}", + ["num"] = 1, + }, + [2] = { + ["CLSID"] = "{PTB_800_MIG21}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{AIM-9P5}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}", + ["num"] = 5, + }, + [5] = { + ["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}", + ["num"] = 6, + }, + [6] = { + ["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}", + ["num"] = 7, + }, + [7] = { + ["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}", + ["num"] = 8, + }, + [8] = { + ["CLSID"] = "{AIM-9P5}", + ["num"] = 10, + }, + [9] = { + ["CLSID"] = "{PTB_800_MIG21}", + ["num"] = 11, + }, + [10] = { + ["CLSID"] = "{AIM-9P5}", + ["num"] = 12, + }, + }, + ["tasks"] = { + [1] = 18, + [2] = 11, + [3] = 10, + }, + }, + [2] = { + ["name"] = "Retribution BARCAP", + ["pylons"] = { + [1] = { + ["CLSID"] = "{AIM-9P5}", + ["num"] = 1, + }, + [2] = { + ["CLSID"] = "{PTB_800_MIG21}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{AIM-9P5}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}", + ["num"] = 5, + }, + [5] = { + ["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}", + ["num"] = 6, + }, + [6] = { + ["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}", + ["num"] = 7, + }, + [7] = { + ["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}", + ["num"] = 8, + }, + [8] = { + ["CLSID"] = "{AIM-9P5}", + ["num"] = 10, + }, + [9] = { + ["CLSID"] = "{PTB_800_MIG21}", + ["num"] = 11, + }, + [10] = { + ["CLSID"] = "{AIM-9P5}", + ["num"] = 12, + }, + }, + ["tasks"] = { + [1] = 18, + [2] = 11, + [3] = 10, + }, + }, + }, + ["unitType"] = "Tornado_ADV", +} +return unitPayloads diff --git a/resources/ui/units/aircrafts/banners/Tornado_ADV.jpg b/resources/ui/units/aircrafts/banners/Tornado_ADV.jpg new file mode 100644 index 00000000..b0544880 Binary files /dev/null and b/resources/ui/units/aircrafts/banners/Tornado_ADV.jpg differ diff --git a/resources/ui/units/aircrafts/icons/Tornado_ADV_24.jpg b/resources/ui/units/aircrafts/icons/Tornado_ADV_24.jpg new file mode 100644 index 00000000..38cce364 Binary files /dev/null and b/resources/ui/units/aircrafts/icons/Tornado_ADV_24.jpg differ diff --git a/resources/units/aircraft/Tornado_ADV.yaml b/resources/units/aircraft/Tornado_ADV.yaml new file mode 100644 index 00000000..07267e93 --- /dev/null +++ b/resources/units/aircraft/Tornado_ADV.yaml @@ -0,0 +1,40 @@ +description: + "The Tornado ADV (Air Defence Variant) is an advanced interceptor aircraft developed by British + Aerospace, now part of BAE Systems. This aircraft was designed primarily for air defense and is + equipped with sophisticated radar and missile systems to detect and engage enemy aircraft at + long ranges. The Tornado ADV is equipped with the AI.24 Foxhunter radar, which provides long-range + detection and tracking capabilities. It can carry a variety of air-to-air missiles, + including the AMRAAM (Advanced Medium-Range Air-to-Air Missile) and the Skyflash missile. The + aircraft is capable of high-speed intercepts and has excellent maneuverability, making it + effective in air-to-air combat." +introduced: 1985 +manufacturer: Panavia +origin: UK/Italy/West Germany +price: 17 +role: Interceptor +max_range: 350 +fuel: + # Parking 44 to RWY 06L at Anderson AFB. + taxi: 200 + # AB takeoff to 350/0.75, reduce to MIL and maintain 350/0.75 to 25k ft. + climb_ppm: 28.33 + # 0.85 mach for 100NM. + cruise_ppm: 12 + # MIL for 100NM. Occasional AB use. + combat_ppm: 26 + min_safe: 1000 +variants: + Tornado F3 ADV: {} +#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 +tasks: + BARCAP: 500 + Escort: 500