diff --git a/changelog.md b/changelog.md index 6a29b85f..1c872a1e 100644 --- a/changelog.md +++ b/changelog.md @@ -53,6 +53,7 @@ * **[Flight Plans]** Added "SEAD Sweep" flight plan, which basically reintroduces the legacy "SEAD Escort" flight plan where the flight will engage whatever it can find without actually escorting the primary flight. * **[Flight Plans]** Added SEAD capability to F-16A MLU and SEAD Escort & SEAD to F-16A. * **[Mission Generation]** Spawn unused helicopters or LHA-capable aircraft at helipads at FOBs +* **[Modding]** Support for F-15I Ra'am v1.0 by IDF Mods Project ## Fixes * **[New Game Wizard]** Settings would not persist when going back to a previous page (obsolete due to overhaul). diff --git a/game/ato/flight.py b/game/ato/flight.py index a7670f76..f06bcc15 100644 --- a/game/ato/flight.py +++ b/game/ato/flight.py @@ -70,6 +70,10 @@ class Flight(SidcDescribable, RadioFrequencyContainer, TacanContainer): self.divert = divert self.flight_type = flight_type self.loadout = Loadout.default_for(self) + if self.squadron.aircraft.name == "F-15I Ra'am": + self.loadout.pylons[16] = Weapon.with_clsid( + "{IDF_MODS_PROJECT_F-15I_Raam_Dome}" + ) self.start_type = start_type self.use_custom_loadout = False self.custom_name = custom_name diff --git a/game/factions/faction.py b/game/factions/faction.py index 50a95c39..07775926 100644 --- a/game/factions/faction.py +++ b/game/factions/faction.py @@ -32,6 +32,7 @@ from game.dcs.countries import country_with_name from game.dcs.groundunittype import GroundUnitType from game.dcs.shipunittype import ShipUnitType from game.dcs.unittype import UnitType +from pydcs_extensions import inject_F15I, eject_F15I from pydcs_extensions.f16i_idf.f16i_idf import inject_F16I, eject_F16I if TYPE_CHECKING: @@ -328,6 +329,14 @@ class Faction: self.remove_aircraft("VSN_F4C") if not mod_settings.f15d_baz: self.remove_aircraft("F-15D") + if not mod_settings.f_15_idf: + eject_F15I() + if AircraftType.named("F-15I Ra'am") in self.aircraft: + self.aircraft.remove(AircraftType.named("F-15I Ra'am")) + else: + inject_F15I() + if AircraftType.named("F-15E Strike Eagle (Suite 4+)") in self.aircraft: + self.aircraft.add(AircraftType.named("F-15I Ra'am")) if not mod_settings.f_16_idf: self.remove_aircraft("F-16I") self.remove_aircraft("F-16D_52") diff --git a/game/theater/start_generator.py b/game/theater/start_generator.py index 512e6f8f..fdcc0c5f 100644 --- a/game/theater/start_generator.py +++ b/game/theater/start_generator.py @@ -59,6 +59,7 @@ class ModSettings: a7e_corsair2: bool = False f4bc_phantom: bool = False f15d_baz: bool = False + f_15_idf: bool = False f_16_idf: bool = False fa_18efg: bool = False f22_raptor: bool = False diff --git a/pydcs_extensions/__init__.py b/pydcs_extensions/__init__.py index 92599826..5c0b1a18 100644 --- a/pydcs_extensions/__init__.py +++ b/pydcs_extensions/__init__.py @@ -6,6 +6,7 @@ from .f100 import * from .f104 import * from .f105 import * from .f15d import * +from .f15i_idf import * from .f16i_idf import * from .f22a import * from .f4b import * diff --git a/pydcs_extensions/f15i_idf/__init__.py b/pydcs_extensions/f15i_idf/__init__.py new file mode 100644 index 00000000..fc0b9f0b --- /dev/null +++ b/pydcs_extensions/f15i_idf/__init__.py @@ -0,0 +1 @@ +from .f15i_idf import * diff --git a/pydcs_extensions/f15i_idf/f15i_idf.py b/pydcs_extensions/f15i_idf/f15i_idf.py new file mode 100644 index 00000000..ec386e9f --- /dev/null +++ b/pydcs_extensions/f15i_idf/f15i_idf.py @@ -0,0 +1,71 @@ +from dcs.planes import F_15ESE + +from pydcs_extensions.pylon_injector import inject_pylon, eject_pylon +from pydcs_extensions.weapon_injector import inject_weapons + + +class WeaponsF15I: + Python_4_ = { + "clsid": "{5CE2FF2A-645A-4197-B48D-8720AC69394F}", + "name": "Python-4 ", + "weight": 103.6, + } + F_15I_Ra_am_Dome = { + "clsid": "{IDF_MODS_PROJECT_F-15I_Raam_Dome}", + "name": "F-15I Ra'am Dome", + "weight": 0, + } + + +inject_weapons(WeaponsF15I) + + +class F15IPylon1: + Python_4_ = (1, WeaponsF15I.Python_4_) + # ERRR {Python-4 Training} + + +class F15IPylon3: + Python_4_ = (3, WeaponsF15I.Python_4_) + # ERRR {Python-4 Training} + + +class F15IPylon13: + Python_4_ = (13, WeaponsF15I.Python_4_) + # ERRR {Python-4 Training} + + +class F15IPylon15: + Python_4_ = (15, WeaponsF15I.Python_4_) + # ERRR {Python-4 Training} + + +class Pylon16: + F_15I_Ra_am_Dome = (16, WeaponsF15I.F_15I_Ra_am_Dome) + + +def inject_F15I() -> None: + F_15ESE.pylons = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16} + + # Injects modified weapons from the IDF Mods Project F-16I Sufa + # into pydcs databases via introspection. + inject_pylon(F_15ESE.Pylon1, F15IPylon1) + inject_pylon(F_15ESE.Pylon3, F15IPylon3) + inject_pylon(F_15ESE.Pylon13, F15IPylon13) + inject_pylon(F_15ESE.Pylon15, F15IPylon15) + + F_15ESE.Pylon16 = Pylon16 + + +def eject_F15I() -> None: + F_15ESE.pylons = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15} + + # Injects modified weapons from the IDF Mods Project F-16I Sufa + # into pydcs databases via introspection. + eject_pylon(F_15ESE.Pylon1, F15IPylon1) + eject_pylon(F_15ESE.Pylon3, F15IPylon3) + eject_pylon(F_15ESE.Pylon13, F15IPylon13) + eject_pylon(F_15ESE.Pylon15, F15IPylon15) + + if hasattr(F_15ESE, "Pylon16"): + delattr(F_15ESE, "Pylon16") diff --git a/qt_ui/windows/newgame/QNewGameWizard.py b/qt_ui/windows/newgame/QNewGameWizard.py index 1f5d1ba8..cc8f2fc9 100644 --- a/qt_ui/windows/newgame/QNewGameWizard.py +++ b/qt_ui/windows/newgame/QNewGameWizard.py @@ -92,6 +92,7 @@ class NewGameWizard(QtWidgets.QWizard): a7e_corsair2=self.field("a7e_corsair2"), f4bc_phantom=self.field("f4bc_phantom"), f15d_baz=self.field("f15d_baz"), + f_15_idf=self.field("f_15_idf"), f_16_idf=self.field("f_16_idf"), fa_18efg=self.field("fa_18efg"), f22_raptor=self.field("f22_raptor"), diff --git a/qt_ui/windows/newgame/WizardPages/QGeneratorSettings.py b/qt_ui/windows/newgame/WizardPages/QGeneratorSettings.py index d8055048..9a029e75 100644 --- a/qt_ui/windows/newgame/WizardPages/QGeneratorSettings.py +++ b/qt_ui/windows/newgame/WizardPages/QGeneratorSettings.py @@ -102,6 +102,8 @@ class GeneratorOptions(QtWidgets.QWizardPage): self.registerField("f4bc_phantom", self.f4bc_phantom) self.f15d_baz = QtWidgets.QCheckBox() self.registerField("f15d_baz", self.f15d_baz) + self.f_15_idf = QtWidgets.QCheckBox() + self.registerField("f_15_idf", self.f_15_idf) self.f_16_idf = QtWidgets.QCheckBox() self.registerField("f_16_idf", self.f_16_idf) self.fa_18efg = QtWidgets.QCheckBox() @@ -155,6 +157,7 @@ class GeneratorOptions(QtWidgets.QWizardPage): self.f4bc_phantom, ), ("F-15D Baz (v1.0)", self.f15d_baz), + ("F-15I Ra'am (v1.0 by IDF Mods Project)", self.f_15_idf), ("F-16I Sufa & F-16D (v3.6 by IDF Mods Project)", self.f_16_idf), ("F/A-18E/F/G Super Hornet (version 2.1)", self.fa_18efg), ("F-22A Raptor", self.f22_raptor), @@ -216,6 +219,7 @@ class GeneratorOptions(QtWidgets.QWizardPage): self.uh_60l.setChecked(s.get("uh_60l", False)) self.f4bc_phantom.setChecked(s.get("f4bc_phantom", False)) self.f15d_baz.setChecked(s.get("f15d_baz", False)) + self.f_15_idf.setChecked(s.get("f_15_idf", False)) self.f_16_idf.setChecked(s.get("f_16_idf", False)) self.fa_18efg.setChecked(s.get("fa_18efg", False)) self.f22_raptor.setChecked(s.get("f22_raptor", False)) diff --git a/resources/units/aircraft/F-15ESE.yaml b/resources/units/aircraft/F-15ESE.yaml index 07eaacf7..9138472d 100644 --- a/resources/units/aircraft/F-15ESE.yaml +++ b/resources/units/aircraft/F-15ESE.yaml @@ -11,6 +11,7 @@ role: Multirole Strike Fighter max_range: 300 variants: F-15E Strike Eagle (Suite 4+): {} + F-15I Ra'am: {} radios: intra_flight: AN/ARC-210 inter_flight: AN/ARC-164