diff --git a/changelog.md b/changelog.md index df7f38cc..15856865 100644 --- a/changelog.md +++ b/changelog.md @@ -22,6 +22,7 @@ * **[UI/UX]** Allow changing conditions such as Time, Date & Weather * **[Modding]** Added support for Su-15 Flagon mod (v1.0) * **[Plugins]** Support for Carsten's Arty Spotter script +* **[Modding]** Added support for SK-60 mod (v1.2.1) ## Fixes * **[UI/UX]** A-10A flights can be edited again diff --git a/game/factions/faction.py b/game/factions/faction.py index 22a1d115..227face3 100644 --- a/game/factions/faction.py +++ b/game/factions/faction.py @@ -410,6 +410,8 @@ class Faction: self.remove_aircraft("JAS39Gripen_AG") if not mod_settings.super_etendard: self.remove_aircraft("VSN_SEM") + if not mod_settings.sk_60: + self.remove_aircraft("SK-60") if not mod_settings.su15_flagon: self.remove_aircraft("Su_15") self.remove_aircraft("Su_15TM") diff --git a/game/theater/start_generator.py b/game/theater/start_generator.py index 9a0b2ef4..ac78996c 100644 --- a/game/theater/start_generator.py +++ b/game/theater/start_generator.py @@ -86,6 +86,7 @@ class ModSettings: irondome: bool = False uh_60l: bool = False jas39_gripen: bool = False + sk_60: bool = False super_etendard: bool = False su15_flagon: bool = False su30_flanker_h: bool = False diff --git a/pydcs_extensions/__init__.py b/pydcs_extensions/__init__.py index c5c4071e..97a3235a 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 .sk60 import * from .su15 import * from .su30 import * from .su57 import * diff --git a/pydcs_extensions/sk60/__init__.py b/pydcs_extensions/sk60/__init__.py new file mode 100644 index 00000000..12403a82 --- /dev/null +++ b/pydcs_extensions/sk60/__init__.py @@ -0,0 +1 @@ +from .sk60 import * diff --git a/pydcs_extensions/sk60/sk60.py b/pydcs_extensions/sk60/sk60.py new file mode 100644 index 00000000..f5d167c9 --- /dev/null +++ b/pydcs_extensions/sk60/sk60.py @@ -0,0 +1,101 @@ +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 WeaponsSK_60: + _1x_13_5cm_HE_rocket = { + "clsid": "{d694b359-e7a8-4909-88d4-7100b77afd13}", + "name": "1x 13,5cm HE rocket", + "weight": 50, + } + _1x_14_5cm_HEAT_rocket = { + "clsid": "{d694b359-e7a8-4909-88d4-7100b77afd12}", + "name": "1x 14,5cm HEAT rocket", + "weight": 50, + } + _2x_13_5cm_HE_rocket = { + "clsid": "{d694b359-e7a8-4909-88d4-7100b77afd11}", + "name": "2x 13,5cm HE rocket", + "weight": 95, + } + AKAN_m_55_Gunpod = { + "clsid": "{5d5aa063-a002-4de8-8a89-6eda1e80ee7b}", + "name": "AKAN m/55 Gunpod", + "weight": 196, + } + + +inject_weapons(WeaponsSK_60) + + +@planemod +class SK_60(PlaneType): + id = "SK-60" + flyable = True + height = 2.7 + width = 9.5 + length = 10.8 + fuel_max = 1640 + max_speed = 879.9984 + chaff = 0 + flare = 0 + charge_total = 0 + chaff_charge_size = 0 + flare_charge_size = 0 + eplrs = True + category = "Interceptor" # {78EFB7A2-FD52-4b57-A6A6-3BF0E1D6555F} + radio_frequency = 243 + + livery_name = "SK-60" # from type + + class Pylon1: + _2x_13_5cm_HE_rocket = (1, Weapons._2x_13_5cm_HE_rocket) + _1x_14_5cm_HEAT_rocket = (1, Weapons._1x_14_5cm_HEAT_rocket) + _1x_13_5cm_HE_rocket = (1, Weapons._1x_13_5cm_HE_rocket) + + class Pylon2: + AKAN_m_55_Gunpod = (2, Weapons.AKAN_m_55_Gunpod) + _2x_13_5cm_HE_rocket = (2, Weapons._2x_13_5cm_HE_rocket) + _1x_14_5cm_HEAT_rocket = (2, Weapons._1x_14_5cm_HEAT_rocket) + _1x_13_5cm_HE_rocket = (2, Weapons._1x_13_5cm_HE_rocket) + + class Pylon3: + _2x_13_5cm_HE_rocket = (3, Weapons._2x_13_5cm_HE_rocket) + _1x_14_5cm_HEAT_rocket = (3, Weapons._1x_14_5cm_HEAT_rocket) + _1x_13_5cm_HE_rocket = (3, Weapons._1x_13_5cm_HE_rocket) + + class Pylon4: + _2x_13_5cm_HE_rocket = (4, Weapons._2x_13_5cm_HE_rocket) + _1x_14_5cm_HEAT_rocket = (4, Weapons._1x_14_5cm_HEAT_rocket) + _1x_13_5cm_HE_rocket = (4, Weapons._1x_13_5cm_HE_rocket) + + class Pylon5: + AKAN_m_55_Gunpod = (5, Weapons.AKAN_m_55_Gunpod) + _2x_13_5cm_HE_rocket = (5, Weapons._2x_13_5cm_HE_rocket) + _1x_14_5cm_HEAT_rocket = (5, Weapons._1x_14_5cm_HEAT_rocket) + _1x_13_5cm_HE_rocket = (5, Weapons._1x_13_5cm_HE_rocket) + + class Pylon6: + _2x_13_5cm_HE_rocket = (6, Weapons._2x_13_5cm_HE_rocket) + _1x_14_5cm_HEAT_rocket = (6, Weapons._1x_14_5cm_HEAT_rocket) + _1x_13_5cm_HE_rocket = (6, Weapons._1x_13_5cm_HE_rocket) + + pylons: Set[int] = {1, 2, 3, 4, 5, 6, 7, 8} + + tasks = [ + task.GroundAttack, + task.PinpointStrike, + task.CAS, + task.AFAC, + task.RunwayAttack, + task.SEAD, + task.Escort, + task.Reconnaissance, + ] + task_default = task.GroundAttack diff --git a/qt_ui/main.py b/qt_ui/main.py index d7063af6..bcf99a15 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, + sk60_saab105=False, su15_flagon=False, su30_flanker_h=False, su57_felon=False, diff --git a/qt_ui/windows/newgame/QNewGameWizard.py b/qt_ui/windows/newgame/QNewGameWizard.py index 0948079c..e4ee75a7 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"), + sk_60=self.field("sk_60"), su15_flagon=self.field("su15_flagon"), su30_flanker_h=self.field("su30_flanker_h"), su57_felon=self.field("su57_felon"), diff --git a/qt_ui/windows/newgame/WizardPages/QGeneratorSettings.py b/qt_ui/windows/newgame/WizardPages/QGeneratorSettings.py index bf1b8c12..a115e1ed 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.sk_60 = QtWidgets.QCheckBox() + self.registerField("sk_60", self.sk_60) self.su15_flagon = QtWidgets.QCheckBox() self.registerField("su15_flagon", self.su15_flagon) self.su30_flanker_h = QtWidgets.QCheckBox() @@ -185,6 +187,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), + ("Saab 105/SK-60B (v1.2.1)", self.sk_60), ("Su-15 Flagon (v1.0)", self.su15_flagon), ("Su-30 Flanker-H (V2.7.73b)", self.su30_flanker_h), ("Su-57 Felon (build-04)", self.su57_felon), @@ -246,6 +249,7 @@ class GeneratorOptions(QtWidgets.QWizardPage): self.f105_thunderchief.setChecked(s.get("f105_thunderchief", False)) self.f106_deltadart.setChecked(s.get("f106_deltadart", False)) self.jas39_gripen.setChecked(s.get("jas39_gripen", False)) + self.sk_60.setChecked(s.get("sk_60", False)) self.super_etendard.setChecked(s.get("super_etendard", False)) self.su30_flanker_h.setChecked(s.get("su30_flanker_h", False)) self.su57_felon.setChecked(s.get("su57_felon", False)) diff --git a/resources/customized_payloads/SK-60.lua b/resources/customized_payloads/SK-60.lua new file mode 100644 index 00000000..7c379f99 --- /dev/null +++ b/resources/customized_payloads/SK-60.lua @@ -0,0 +1,192 @@ +local unitPayloads = { + ["name"] = "SK-60", + ["payloads"] = { + [1] = { + ["name"] = "Retribution DEAD", + ["pylons"] = { + [1] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 1, + }, + [2] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 4, + }, + [5] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 5, + }, + [6] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 6, + }, + }, + ["tasks"] = { + [1] = 15, + }, + }, + [2] = { + ["name"] = "Retribution OCA/Aircraft", + ["pylons"] = { + [1] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd11}", + ["num"] = 1, + }, + [2] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd11}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd11}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd11}", + ["num"] = 4, + }, + [5] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd11}", + ["num"] = 5, + }, + [6] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd11}", + ["num"] = 6, + }, + }, + ["tasks"] = { + [1] = 15, + }, + }, + [3] = { + ["displayName"] = "Retribution Strike", + ["name"] = "Retribution Strike", + ["pylons"] = { + [1] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 1, + }, + [2] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 4, + }, + [5] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 5, + }, + [6] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 6, + }, + }, + ["tasks"] = { + [1] = 15, + }, + }, + [4] = { + ["displayName"] = "Retribution CAS", + ["name"] = "Retribution CAS", + ["pylons"] = { + [1] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 1, + }, + [2] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 4, + }, + [5] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 5, + }, + [6] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 6, + }, + }, + ["tasks"] = { + [1] = 15, + }, + }, + [5] = { + ["name"] = "Retribution BAI", + ["pylons"] = { + [1] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd11}", + ["num"] = 3, + }, + [2] = { + ["CLSID"] = "{5d5aa063-a002-4de8-8a89-6eda1e80ee7b}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{5d5aa063-a002-4de8-8a89-6eda1e80ee7b}", + ["num"] = 5, + }, + }, + ["tasks"] = { + [1] = 15, + }, + }, + [6] = { + ["displayName"] = "Retribution OCA/Runway", + ["name"] = "Retribution OCA/Runway", + ["pylons"] = { + [1] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 1, + }, + [2] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 2, + }, + [3] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 3, + }, + [4] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 4, + }, + [5] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 5, + }, + [6] = { + ["CLSID"] = "{d694b359-e7a8-4909-88d4-7100b77afd12}", + ["num"] = 6, + }, + }, + ["tasks"] = { + [1] = 15, + }, + }, + }, + ["tasks"] = { + }, + ["unitType"] = "SK-60", +} +return unitPayloads diff --git a/resources/factions/sweden_1980.json b/resources/factions/sweden_1980.json new file mode 100644 index 00000000..1f8e7228 --- /dev/null +++ b/resources/factions/sweden_1980.json @@ -0,0 +1,51 @@ +{ + "country": "Sweden", + "name": "Sweden 1980", + "authors": "Turbolious", + "description": "
Sweden in the 80s.
Note : Limited A2A capabilities.
", + "locales": [ + "sv_SE" + ], + "aircrafts": [ + "AJS-37 Viggen", + "SK-60", + "UH-1H Iroquois" + ], + "awacs": [ + "E-3A" + ], + "tankers": [ + "KC-130", + "KC-135 Stratotanker" + ], + "frontline_units": [ + "FV510 Warrior", + "Leopard 2A4", + "M1097 Heavy HMMWV Avenger", + "M1126 Stryker ICV (M2 HMG)", + "M48 Chaparral" + ], + "artillery_units": [], + "logistics_units": [ + "Truck M818 6x6" + ], + "infantry_units": [ + "Infantry M249", + "Infantry M4", + "MANPADS Stinger" + ], + "preset_groups": [ + "Hawk" + ], + "naval_units": [ + "FFG Oliver Hazard Perry" + ], + "missiles": [], + "air_defense_units": [ + "SAM Hawk SR (AN/MPQ-50)", + "M1097 Heavy HMMWV Avenger", + "M48 Chaparral" + ], + "has_jtac": true, + "jtac_unit": "SK-60" +} \ No newline at end of file diff --git a/resources/ui/units/aircrafts/banners/SK-60.jpg b/resources/ui/units/aircrafts/banners/SK-60.jpg new file mode 100644 index 00000000..407b4dce Binary files /dev/null and b/resources/ui/units/aircrafts/banners/SK-60.jpg differ diff --git a/resources/ui/units/aircrafts/icons/SK-60_24.jpg b/resources/ui/units/aircrafts/icons/SK-60_24.jpg new file mode 100644 index 00000000..2f8ec327 Binary files /dev/null and b/resources/ui/units/aircrafts/icons/SK-60_24.jpg differ diff --git a/resources/units/aircraft/SK-60.yaml b/resources/units/aircraft/SK-60.yaml new file mode 100644 index 00000000..fe322a4f --- /dev/null +++ b/resources/units/aircraft/SK-60.yaml @@ -0,0 +1,24 @@ +carrier_capable: false +description: + The Saab 105 is a Swedish high-wing, twinjet trainer aircraft developed in the early 1960s + as a private venture by Saab AB.[2] The Swedish Air Force, which had opted to procure the type + for various roles, issued the aircraft with the designation Sk 60. The Sk 60 entered service in 1967, + replacing the ageing De Havilland Vampire fleet. + SK-60B is a two-seat attack version for the Swedish Air Force, modified from Sk 60A with new weapons sight. + This version entered service in 1968. + +introduced: 1968 +manufacturer: Saab AB +origin: Sweden +price: 4 +role: COIN / FAC /Light Attack +gunfighter: true +variants: + SK-60: {} +tasks: + BAI: 650 + CAS: 650 + DEAD: 60 + OCA/Aircraft: 650 + OCA/Runway: 330 + Strike: 330