From 4762b490c061d7675b31eb55587cc57b438e38c7 Mon Sep 17 00:00:00 2001 From: MetalStormGhost <89945461+MetalStormGhost@users.noreply.github.com> Date: Sun, 30 Jun 2024 23:05:45 +0300 Subject: [PATCH] Su-15 Flagon mod v1.0 support (#345) * Su-15 Flagon mod v1.0 support Implemented support for Su-15 Flagon mod version 1.0 by Marco1985_IT. * Replaced the external fuel tanks with gunpods in Su-15 loadouts and added gunfighter: true --- game/factions/faction.py | 3 + game/theater/start_generator.py | 1 + pydcs_extensions/__init__.py | 1 + pydcs_extensions/su15/__init__.py | 1 + pydcs_extensions/su15/su15.py | 203 ++++++++++++++++++ qt_ui/main.py | 1 + qt_ui/windows/newgame/QNewGameWizard.py | 1 + .../newgame/WizardPages/QGeneratorSettings.py | 3 + resources/customized_payloads/Su_15.lua | 33 +++ resources/customized_payloads/Su_15TM.lua | 43 ++++ resources/factions/russia_1965.json | 1 + resources/factions/russia_1975 (Mi-24P).json | 1 + resources/factions/russia_1975.json | 1 + resources/factions/russia_1980.json | 1 + .../ui/units/aircrafts/icons/Su_15TM_24.jpg | Bin 0 -> 8272 bytes .../ui/units/aircrafts/icons/Su_15_24.jpg | Bin 0 -> 8134 bytes resources/units/aircraft/Su_15.yaml | 20 ++ resources/units/aircraft/Su_15TM.yaml | 23 ++ 18 files changed, 337 insertions(+) create mode 100644 pydcs_extensions/su15/__init__.py create mode 100644 pydcs_extensions/su15/su15.py create mode 100644 resources/customized_payloads/Su_15.lua create mode 100644 resources/customized_payloads/Su_15TM.lua create mode 100644 resources/ui/units/aircrafts/icons/Su_15TM_24.jpg create mode 100644 resources/ui/units/aircrafts/icons/Su_15_24.jpg create mode 100644 resources/units/aircraft/Su_15.yaml create mode 100644 resources/units/aircraft/Su_15TM.yaml diff --git a/game/factions/faction.py b/game/factions/faction.py index 1675abf3..22a1d115 100644 --- a/game/factions/faction.py +++ b/game/factions/faction.py @@ -410,6 +410,9 @@ class Faction: self.remove_aircraft("JAS39Gripen_AG") if not mod_settings.super_etendard: self.remove_aircraft("VSN_SEM") + if not mod_settings.su15_flagon: + self.remove_aircraft("Su_15") + self.remove_aircraft("Su_15TM") if not mod_settings.su30_flanker_h: self.remove_aircraft("Su-30MKA") self.remove_aircraft("Su-30MKI") diff --git a/game/theater/start_generator.py b/game/theater/start_generator.py index 66bcb295..9a0b2ef4 100644 --- a/game/theater/start_generator.py +++ b/game/theater/start_generator.py @@ -87,6 +87,7 @@ class ModSettings: uh_60l: bool = False jas39_gripen: bool = False super_etendard: bool = False + su15_flagon: bool = False su30_flanker_h: bool = False su57_felon: bool = False frenchpack: bool = False diff --git a/pydcs_extensions/__init__.py b/pydcs_extensions/__init__.py index b1f5b193..c5c4071e 100644 --- a/pydcs_extensions/__init__.py +++ b/pydcs_extensions/__init__.py @@ -24,6 +24,7 @@ from .jas39 import * from .ov10a import * from .spanishnavypack import * from .super_etendard import * +from .su15 import * from .su30 import * from .su57 import * from .swedishmilitaryassetspack import * diff --git a/pydcs_extensions/su15/__init__.py b/pydcs_extensions/su15/__init__.py new file mode 100644 index 00000000..f70df111 --- /dev/null +++ b/pydcs_extensions/su15/__init__.py @@ -0,0 +1 @@ +from .su15 import * diff --git a/pydcs_extensions/su15/su15.py b/pydcs_extensions/su15/su15.py new file mode 100644 index 00000000..aa74087f --- /dev/null +++ b/pydcs_extensions/su15/su15.py @@ -0,0 +1,203 @@ +from typing import Any, Dict, Set + +from dcs import task +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 WeaponsSu15: + PTB_600 = {"clsid": "{Su_15_PTB-600}", "name": "PTB-600", "weight": 535} + R_8M1R = {"clsid": "{R-8M1R}", "name": "R-8M1R", "weight": 285} + R_8M1T = {"clsid": "{R-8M1T}", "name": "R-8M1T", "weight": 265} + R_8R_Inert = {"clsid": "{R-8RInert}", "name": "R-8R Inert", "weight": 285} + R_8T_Inert = {"clsid": "{R-8TInert}", "name": "R-8T Inert", "weight": 265} + R_98MR = {"clsid": "{R-98MR}", "name": "R-98MR", "weight": 292} + R_98MT = {"clsid": "{R-98MT}", "name": "R-98MT", "weight": 272} + + +inject_weapons(WeaponsSu15) + + +@planemod +class Su_15TM(PlaneType): + id = "Su_15TM" + height = 5 + width = 9.34 + length = 21.41 + fuel_max = 5550 + max_speed = 2229.984 + chaff = 30 + flare = 15 + charge_total = 60 + chaff_charge_size = 1 + flare_charge_size = 2 + category = "Interceptor" # {78EFB7A2-FD52-4b57-A6A6-3BF0E1D6555F} + radio_frequency = 127.5 + + livery_name = "SU_15TM" # from type + + class Pylon1: + R_98MR = (1, WeaponsSu15.R_98MR) + R_98MT = (1, WeaponsSu15.R_98MT) + R_8M1R = (1, WeaponsSu15.R_8M1R) + R_8M1T = (1, WeaponsSu15.R_8M1T) + UB_32A_pod___32_x_S_5KO__57mm_UnGd_Rkts__HEAT_Frag = ( + 1, + Weapons.UB_32A_pod___32_x_S_5KO__57mm_UnGd_Rkts__HEAT_Frag, + ) + UB_16UM_pod___16_x_S_5KO__57mm_UnGd_Rkts__HEAT_Frag = ( + 1, + Weapons.UB_16UM_pod___16_x_S_5KO__57mm_UnGd_Rkts__HEAT_Frag, + ) + S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk_ = ( + 1, + Weapons.S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk_, + ) + FAB_100___100kg_GP_Bomb_LD = (1, Weapons.FAB_100___100kg_GP_Bomb_LD) + FAB_250___250kg_GP_Bomb_LD = (1, Weapons.FAB_250___250kg_GP_Bomb_LD) + FAB_500_M_62___500kg_GP_Bomb_LD = (1, Weapons.FAB_500_M_62___500kg_GP_Bomb_LD) + + class Pylon2: + APU_60_1M_with_R_60__AA_8_Aphid____IR_AAM = ( + 2, + Weapons.APU_60_1M_with_R_60__AA_8_Aphid____IR_AAM, + ) + APU_60_1M_with_R_60M__AA_8_Aphid_B____IR_AAM = ( + 2, + Weapons.APU_60_1M_with_R_60M__AA_8_Aphid_B____IR_AAM, + ) + + class Pylon3: + SPPU_22_1___2_x_23mm__GSh_23L_Autocannon_Pod = ( + 3, + Weapons.SPPU_22_1___2_x_23mm__GSh_23L_Autocannon_Pod, + ) + PTB_600 = (3, WeaponsSu15.PTB_600) + UB_32A_pod___32_x_S_5KO__57mm_UnGd_Rkts__HEAT_Frag = ( + 3, + Weapons.UB_32A_pod___32_x_S_5KO__57mm_UnGd_Rkts__HEAT_Frag, + ) + UB_16UM_pod___16_x_S_5KO__57mm_UnGd_Rkts__HEAT_Frag = ( + 3, + Weapons.UB_16UM_pod___16_x_S_5KO__57mm_UnGd_Rkts__HEAT_Frag, + ) + S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk_ = ( + 3, + Weapons.S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk_, + ) + FAB_100___100kg_GP_Bomb_LD = (3, Weapons.FAB_100___100kg_GP_Bomb_LD) + FAB_250___250kg_GP_Bomb_LD = (3, Weapons.FAB_250___250kg_GP_Bomb_LD) + FAB_500_M_62___500kg_GP_Bomb_LD = (3, Weapons.FAB_500_M_62___500kg_GP_Bomb_LD) + + class Pylon4: + SPPU_22_1___2_x_23mm__GSh_23L_Autocannon_Pod = ( + 4, + Weapons.SPPU_22_1___2_x_23mm__GSh_23L_Autocannon_Pod, + ) + PTB_600 = (4, WeaponsSu15.PTB_600) + UB_32A_pod___32_x_S_5KO__57mm_UnGd_Rkts__HEAT_Frag = ( + 4, + Weapons.UB_32A_pod___32_x_S_5KO__57mm_UnGd_Rkts__HEAT_Frag, + ) + UB_16UM_pod___16_x_S_5KO__57mm_UnGd_Rkts__HEAT_Frag = ( + 4, + Weapons.UB_16UM_pod___16_x_S_5KO__57mm_UnGd_Rkts__HEAT_Frag, + ) + S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk_ = ( + 4, + Weapons.S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk_, + ) + FAB_100___100kg_GP_Bomb_LD = (4, Weapons.FAB_100___100kg_GP_Bomb_LD) + FAB_250___250kg_GP_Bomb_LD = (4, Weapons.FAB_250___250kg_GP_Bomb_LD) + FAB_500_M_62___500kg_GP_Bomb_LD = (4, Weapons.FAB_500_M_62___500kg_GP_Bomb_LD) + + class Pylon5: + APU_60_1M_with_R_60__AA_8_Aphid____IR_AAM = ( + 5, + Weapons.APU_60_1M_with_R_60__AA_8_Aphid____IR_AAM, + ) + APU_60_1M_with_R_60M__AA_8_Aphid_B____IR_AAM = ( + 5, + Weapons.APU_60_1M_with_R_60M__AA_8_Aphid_B____IR_AAM, + ) + + class Pylon6: + R_98MR = (6, WeaponsSu15.R_98MR) + R_98MT = (6, WeaponsSu15.R_98MT) + R_8M1R = (6, WeaponsSu15.R_8M1R) + R_8M1T = (6, WeaponsSu15.R_8M1T) + UB_32A_pod___32_x_S_5KO__57mm_UnGd_Rkts__HEAT_Frag = ( + 6, + Weapons.UB_32A_pod___32_x_S_5KO__57mm_UnGd_Rkts__HEAT_Frag, + ) + UB_16UM_pod___16_x_S_5KO__57mm_UnGd_Rkts__HEAT_Frag = ( + 6, + Weapons.UB_16UM_pod___16_x_S_5KO__57mm_UnGd_Rkts__HEAT_Frag, + ) + S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk_ = ( + 6, + Weapons.S_24B___240mm_UnGd_Rkt__235kg__HE_Frag___Low_Smk_, + ) + FAB_100___100kg_GP_Bomb_LD = (6, Weapons.FAB_100___100kg_GP_Bomb_LD) + FAB_250___250kg_GP_Bomb_LD = (6, Weapons.FAB_250___250kg_GP_Bomb_LD) + FAB_500_M_62___500kg_GP_Bomb_LD = (6, Weapons.FAB_500_M_62___500kg_GP_Bomb_LD) + + pylons: Set[int] = {1, 2, 3, 4, 5, 6} + + tasks = [ + task.GroundAttack, + task.CAS, + task.CAP, + task.Escort, + task.FighterSweep, + task.Intercept, + ] + task_default = task.Intercept + + +@planemod +class Su_15(PlaneType): + id = "Su_15" + height = 5 + width = 9.34 + length = 21.41 + fuel_max = 5600 + max_speed = 2229.984 + category = "Interceptor" # {78EFB7A2-FD52-4b57-A6A6-3BF0E1D6555F} + radio_frequency = 127.5 + + livery_name = "SU_15" # from type + + class Pylon1: + R_8M1R = (1, WeaponsSu15.R_8M1R) + R_8R_Inert = (1, WeaponsSu15.R_8R_Inert) + R_8M1T = (1, WeaponsSu15.R_8M1T) + R_8T_Inert = (1, WeaponsSu15.R_8T_Inert) + + class Pylon2: + SPPU_22_1___2_x_23mm__GSh_23L_Autocannon_Pod = ( + 2, + Weapons.SPPU_22_1___2_x_23mm__GSh_23L_Autocannon_Pod, + ) + PTB_600 = (2, WeaponsSu15.PTB_600) + + class Pylon3: + SPPU_22_1___2_x_23mm__GSh_23L_Autocannon_Pod = ( + 3, + Weapons.SPPU_22_1___2_x_23mm__GSh_23L_Autocannon_Pod, + ) + PTB_600 = (3, WeaponsSu15.PTB_600) + + class Pylon4: + R_8M1R = (4, WeaponsSu15.R_8M1R) + R_8R_Inert = (4, WeaponsSu15.R_8R_Inert) + R_8M1T = (4, WeaponsSu15.R_8M1T) + R_8T_Inert = (4, WeaponsSu15.R_8T_Inert) + + pylons: Set[int] = {1, 2, 3, 4} + + tasks = [task.CAP, task.Escort, task.FighterSweep, task.Intercept] + task_default = task.Intercept diff --git a/qt_ui/main.py b/qt_ui/main.py index 7f4b6e78..d7063af6 100644 --- a/qt_ui/main.py +++ b/qt_ui/main.py @@ -336,6 +336,7 @@ def create_game( f105_thunderchief=False, hercules=False, jas39_gripen=False, + su15_flagon=False, su30_flanker_h=False, su57_felon=False, frenchpack=False, diff --git a/qt_ui/windows/newgame/QNewGameWizard.py b/qt_ui/windows/newgame/QNewGameWizard.py index 0ecccbf1..0948079c 100644 --- a/qt_ui/windows/newgame/QNewGameWizard.py +++ b/qt_ui/windows/newgame/QNewGameWizard.py @@ -110,6 +110,7 @@ class NewGameWizard(QtWidgets.QWizard): uh_60l=self.field("uh_60l"), jas39_gripen=self.field("jas39_gripen"), super_etendard=self.field("super_etendard"), + su15_flagon=self.field("su15_flagon"), su30_flanker_h=self.field("su30_flanker_h"), su57_felon=self.field("su57_felon"), ov10a_bronco=self.field("ov10a_bronco"), diff --git a/qt_ui/windows/newgame/WizardPages/QGeneratorSettings.py b/qt_ui/windows/newgame/WizardPages/QGeneratorSettings.py index 926bb923..cf153da8 100644 --- a/qt_ui/windows/newgame/WizardPages/QGeneratorSettings.py +++ b/qt_ui/windows/newgame/WizardPages/QGeneratorSettings.py @@ -130,6 +130,8 @@ class GeneratorOptions(QtWidgets.QWizardPage): self.registerField("jas39_gripen", self.jas39_gripen) self.super_etendard = QtWidgets.QCheckBox() self.registerField("super_etendard", self.super_etendard) + self.su15_flagon = QtWidgets.QCheckBox() + self.registerField("su15_flagon", self.su15_flagon) self.su30_flanker_h = QtWidgets.QCheckBox() self.registerField("su30_flanker_h", self.su30_flanker_h) self.su57_felon = QtWidgets.QCheckBox() @@ -183,6 +185,7 @@ class GeneratorOptions(QtWidgets.QWizardPage): ("OV-10A Bronco", self.ov10a_bronco), ("Spanish Naval Assets pack (desdemicabina 3.2.0)", self.spanishnavypack), ("Star Wars Modpack 2.54+", self.SWPack), + ("Su-15 Flagon (v1.0)", self.su15_flagon), ("Su-30 Flanker-H (V2.7.3 beta)", self.su30_flanker_h), ("Su-57 Felon (build-04)", self.su57_felon), ("Super Étendard (v2.5.5)", self.super_etendard), diff --git a/resources/customized_payloads/Su_15.lua b/resources/customized_payloads/Su_15.lua new file mode 100644 index 00000000..cc7628e6 --- /dev/null +++ b/resources/customized_payloads/Su_15.lua @@ -0,0 +1,33 @@ +local unitPayloads = { + ["name"] = "Su_15", + ["payloads"] = { + [1] = { + ["name"] = "BARCAP", + ["pylons"] = { + [1] = { + ["CLSID"] = "{R-8M1R}", + ["num"] = 4, + }, + [2] = { + ["CLSID"] = "{R-8M1T}", + ["num"] = 1, + }, + [3] = { + ["CLSID"] = "{E92CBFE5-C153-11d8-9897-000476191836}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{E92CBFE5-C153-11d8-9897-000476191836}", + ["num"] = 2, + }, + }, + ["tasks"] = { + [1] = 10, + }, + }, + }, + ["tasks"] = { + }, + ["unitType"] = "Su_15", +} +return unitPayloads diff --git a/resources/customized_payloads/Su_15TM.lua b/resources/customized_payloads/Su_15TM.lua new file mode 100644 index 00000000..acec4d15 --- /dev/null +++ b/resources/customized_payloads/Su_15TM.lua @@ -0,0 +1,43 @@ +local unitPayloads = { + ["name"] = "Su_15TM", + ["payloads"] = { + [1] = { + ["displayName"] = "BARCAP", + ["name"] = "BARCAP", + ["pylons"] = { + [1] = { + ["CLSID"] = "{R-98MR}", + ["num"] = 6, + }, + [2] = { + ["CLSID"] = "{R-98MT}", + ["num"] = 1, + }, + [3] = { + ["CLSID"] = "{R-60M}", + ["num"] = 5, + }, + [4] = { + ["CLSID"] = "{R-60M}", + ["num"] = 2, + }, + [5] = { + ["CLSID"] = "{E92CBFE5-C153-11d8-9897-000476191836}", + ["num"] = 4, + }, + [6] = { + ["CLSID"] = "{E92CBFE5-C153-11d8-9897-000476191836}", + ["num"] = 3, + }, + }, + ["tasks"] = { + [1] = 11, + [2] = 10, + }, + }, + }, + ["tasks"] = { + }, + ["unitType"] = "Su_15TM", +} +return unitPayloads diff --git a/resources/factions/russia_1965.json b/resources/factions/russia_1965.json index e1f5c8dd..cc308298 100644 --- a/resources/factions/russia_1965.json +++ b/resources/factions/russia_1965.json @@ -11,6 +11,7 @@ "MiG-15bis Fagot", "MiG-19P Farmer-B", "MiG-21bis Fishbed-N", + "Su-15 Flagon-A", "Tu-95MS Bear-H" ], "awacs": [ diff --git a/resources/factions/russia_1975 (Mi-24P).json b/resources/factions/russia_1975 (Mi-24P).json index 52966176..bcc1da4e 100644 --- a/resources/factions/russia_1975 (Mi-24P).json +++ b/resources/factions/russia_1975 (Mi-24P).json @@ -14,6 +14,7 @@ "MiG-23MLD Flogger-K", "MiG-25PD Foxbat-E", "MiG-29A Fulcrum-A", + "Su-15TM Flagon-E", "Su-17M4 Fitter-K", "Su-24M Fencer-D", "Su-25 Frogfoot", diff --git a/resources/factions/russia_1975.json b/resources/factions/russia_1975.json index e38ef47f..7f7ed2cd 100644 --- a/resources/factions/russia_1975.json +++ b/resources/factions/russia_1975.json @@ -14,6 +14,7 @@ "MiG-23MLD Flogger-K", "MiG-25PD Foxbat-E", "MiG-29A Fulcrum-A", + "Su-15TM Flagon-E", "Su-17M4 Fitter-K", "Su-24M Fencer-D", "Su-25 Frogfoot", diff --git a/resources/factions/russia_1980.json b/resources/factions/russia_1980.json index 526b232b..bf81f1ad 100644 --- a/resources/factions/russia_1980.json +++ b/resources/factions/russia_1980.json @@ -17,6 +17,7 @@ "MiG-27K Flogger-J2", "MiG-29A Fulcrum-A", "MiG-31 Foxhound", + "Su-15TM Flagon-E", "Su-17M4 Fitter-K", "Su-24M Fencer-D", "Su-25 Frogfoot", diff --git a/resources/ui/units/aircrafts/icons/Su_15TM_24.jpg b/resources/ui/units/aircrafts/icons/Su_15TM_24.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6e96d9b4e11f7a79d32eb7a18db1b2d34540e24f GIT binary patch literal 8272 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 Di+r?X literal 0 HcmV?d00001 diff --git a/resources/ui/units/aircrafts/icons/Su_15_24.jpg b/resources/ui/units/aircrafts/icons/Su_15_24.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c744e798b3e29040749112f2deee26f603164447 GIT binary patch literal 8134 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 R5PiE)XXQ^