Compare commits

...

46 Commits

Author SHA1 Message Date
Dan Albert
00ca7d0b4d Merge pull request #1208 from dcs-liberation/develop-3.x
Release 3.0.0.
2021-06-10 23:58:41 -07:00
Dan Albert
64c426653c Merge branch 'master' into develop-3.x 2021-06-10 23:46:18 -07:00
Mustang-25
a8960c9bbe Add the First Lebanon War Historical Campaign.
(cherry picked from commit 75e3b4cc84)
2021-06-10 17:39:00 -07:00
Florian
72282845e8 added missing units
(cherry picked from commit 78cd17e279)
2021-06-10 17:37:26 -07:00
Khopa
e64aff4e91 Removed helipad from golan heights campaign to avoid capture trigger error 2021-06-10 23:27:19 +02:00
Dan Albert
e192e54c90 Fix CAS commit range display.
CAS commits around the target, not its flight plan.

(cherry picked from commit 40aa7734e1)
2021-06-09 21:52:02 -07:00
Dan Albert
39b0599b7b Fix engagement distance display.
(cherry picked from commit a9dacf4a29)
2021-06-09 21:45:20 -07:00
Dan Albert
45b40e4aa3 Update Operation Mole Cricket.
https://github.com/dcs-liberation/dcs_liberation/issues/1203
(cherry picked from commit 0594e1148e)
2021-06-09 21:27:22 -07:00
Dan Albert
9887a8ff83 Add Northern Russia campaign.
https://github.com/dcs-liberation/dcs_liberation/issues/1202
(cherry picked from commit 9eacd1563f)
2021-06-09 21:27:21 -07:00
Dan Albert
8d3556aa4b Update mission start guidance.
(cherry picked from commit 66f82b6ff9)
2021-06-09 19:21:18 -07:00
Florian
a59c01bcfe added texts for all units
(cherry picked from commit eb6206ea57)
2021-06-09 19:10:02 -07:00
Brock Greman
fb72962f74 Fixing display of "sunny" during clear conditions at night.
(cherry picked from commit 3ad51cafa8)
2021-06-09 19:09:40 -07:00
Dan Albert
ed1dacfe7c Remove incompatible campaigns.
We have quite a few campaigns now, so removing the broken ones.

Fixes https://github.com/dcs-liberation/dcs_liberation/issues/1178

(cherry picked from commit 0e68884493)
2021-06-09 19:09:12 -07:00
Florian
794de0fcbb added missing units to price table
(cherry picked from commit 366190ee99)
2021-06-09 19:04:32 -07:00
Dan Albert
9d71b2e727 Make campaign names consistent.
(cherry picked from commit 42d56a324f)
2021-06-09 18:59:05 -07:00
docofmur
5b8f626651 Campaigns for 3.0
4 campaigns updated for 3.0 1 small PG 3 for Caucasus 1 full and 2 parts based on the full

(cherry picked from commit 7d1f1ea2f7)
2021-06-09 18:59:04 -07:00
Dan Albert
461f4b82a9 Add Around the Mountain campaign.
https://github.com/dcs-liberation/dcs_liberation/issues/1199
(cherry picked from commit 30cab8e3a7)
2021-06-09 18:54:15 -07:00
Dan Albert
15653d0628 Add Operation Allied Sword campaign and factions.
https://github.com/dcs-liberation/dcs_liberation/issues/1196
(cherry picked from commit e0e2162c6d)
2021-06-09 18:54:14 -07:00
Dan Albert
dffc631b87 Add Humble Helper campaign and factions.
https://github.com/dcs-liberation/dcs_liberation/issues/1197
(cherry picked from commit f1582fcc10)
2021-06-09 18:54:12 -07:00
Dan Albert
17efb48b2e Make enable_and_reset not half lie.
https://github.com/dcs-liberation/dcs_liberation/issues/1185
(cherry picked from commit b8c14d69c3)
2021-06-08 21:20:15 -07:00
Dan Albert
7e85825d2b Fix typo in Incirlik runway data.
Fixes https://github.com/dcs-liberation/dcs_liberation/issues/1188

(cherry picked from commit 725b5083c7)
2021-06-08 21:15:04 -07:00
Dan Albert
798591b980 Fix repeated JTACs after multiple generations.
Fixes https://github.com/dcs-liberation/dcs_liberation/issues/1191

(cherry picked from commit 87dd6b19bf)
2021-06-08 20:56:41 -07:00
Schneefl0cke
4a52af298c Add Recon combat role.
(cherry picked from commit e4c9d8799e)
2021-06-08 20:47:41 -07:00
dependabot[bot]
fe886a754e Bump pillow from 8.1.1 to 8.2.0
Bumps [pillow](https://github.com/python-pillow/Pillow) from 8.1.1 to 8.2.0.
- [Release notes](https://github.com/python-pillow/Pillow/releases)
- [Changelog](https://github.com/python-pillow/Pillow/blob/master/CHANGES.rst)
- [Commits](https://github.com/python-pillow/Pillow/compare/8.1.1...8.2.0)

---
updated-dependencies:
- dependency-name: pillow
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
(cherry picked from commit bc938db7f9)
2021-06-08 20:47:31 -07:00
bgreman
0220fa4ff6 Gripen mod support. 2021-06-08 19:47:44 -07:00
Dan Albert
e7336d8608 Fix hangar status display.
(cherry picked from commit d8881e2734)
2021-06-06 17:13:00 -07:00
Dan Albert
d77a174ac1 Label the player checkbox in the roster editor.
(cherry picked from commit 45869c428e)
2021-06-06 13:43:55 -07:00
Khopa
6348317893 Added a small WW2 campaign on Normandy map (Replacing the former Normandy Small campaign). 2021-06-06 18:49:11 +02:00
Khopa
a516cd2f80 Added a small WW2 campaign on Normandy map (Replacing the former Normandy Small campaign). 2021-06-06 18:45:02 +02:00
Dan Albert
e1aa3e9d0e Suppress events fired while rebuilding model.
(cherry picked from commit d316e13fa6)
2021-06-05 15:21:58 -07:00
Dan Albert
d1d1acf6e0 Hide incompatible campaigns by default.
https://github.com/dcs-liberation/dcs_liberation/issues/1178
(cherry picked from commit 1ea98a6ed1)
2021-06-05 15:15:53 -07:00
Dan Albert
a0e5a707fb Merge pull request #1053 from Khopa/develop_2_5_x
Release 2.5.1.
2021-05-02 13:28:45 -07:00
Dan Albert
4555a4968d Update changelog for 2.5.1. 2021-05-02 13:17:35 -07:00
SnappyComebacks
ae34e4749b Move base EWRs into their own category.
Without this we're sometimes spawning base EWRs at points far outside the base perimeter.
2021-04-28 21:07:22 -07:00
Khopa
635eee9590 Fixed ai_flight_planner for maps lacking frontlines (such as battle of britain on The Channel map) 2021-04-24 00:11:53 +02:00
Khopa
f0558c4c1e Fixed ai_flight_planner for maps lacking frontlines (such as battle of britain on The Channel map) 2021-04-23 23:45:14 +02:00
Dan Albert
637ca8fbca Stop projecting threat zones from front lines.
This is an interim improvement since we should probably be pushing the
BARCAPs into TARCAP roles when the front line is so close. This does
regress flight pathing for anything that should route around the front
(to avoid getting shot at by SHORADS and TARCAPs), but for now it's one
or the other and this is the one everyone's complaining about.

(cherry picked from commit e474748f4d)
2021-04-22 18:23:12 -07:00
Dan Albert
e4e65df976 Generalize commit range display for all patrols.
Fixes https://github.com/Khopa/dcs_liberation/issues/890

(cherry picked from commit 132ba905c7)
2021-04-22 17:55:49 -07:00
Dan Albert
29579a2aec Remove missed merge conflict marker. 2021-04-22 17:49:34 -07:00
Dan Albert
e32b43cffb Show BARCAP commit ranges by default.
BARCAP placement confuses a lot of people but this should make it more
clear.

(cherry picked from commit 208d1b82b5)
2021-04-22 17:46:29 -07:00
C. Perreau
de2e5f861b Merge pull request #1007 from Khopa/develop_2_5_x
Release 2.5.0
2021-04-22 00:08:42 +02:00
Khopa
b27a7fc71b Fixed Lint issue 2021-04-21 22:54:48 +02:00
Khopa
5861ce6146 Fixed error with Ramat David frequency (typo) 2021-04-21 22:38:08 +02:00
Khopa
c732ed556f Fixed airfields frequency on Persian Gulf 2021-04-21 22:30:08 +02:00
Khopa
be1a75e520 Fixed airfields frequency on Syria 2021-04-21 22:14:18 +02:00
Khopa
c41d10c581 Pydcs update to latest version 2021-04-21 12:57:19 +02:00
78 changed files with 1682 additions and 204 deletions

View File

@@ -173,6 +173,7 @@ from game.factions.faction_loader import FactionLoader
from pydcs_extensions.a4ec.a4ec import A_4E_C from pydcs_extensions.a4ec.a4ec import A_4E_C
from pydcs_extensions.f22a.f22a import F_22A from pydcs_extensions.f22a.f22a import F_22A
from pydcs_extensions.hercules.hercules import Hercules from pydcs_extensions.hercules.hercules import Hercules
from pydcs_extensions.jas39.jas39 import JAS39Gripen, JAS39Gripen_AG
from pydcs_extensions.mb339.mb339 import MB_339PAN from pydcs_extensions.mb339.mb339 import MB_339PAN
from pydcs_extensions.su57.su57 import Su_57 from pydcs_extensions.su57.su57 import Su_57
@@ -183,6 +184,8 @@ plane_map["F-22A"] = F_22A
plane_map["MB-339PAN"] = MB_339PAN plane_map["MB-339PAN"] = MB_339PAN
plane_map["Su-57"] = Su_57 plane_map["Su-57"] = Su_57
plane_map["Hercules"] = Hercules plane_map["Hercules"] = Hercules
plane_map["JAS39Gripen"] = JAS39Gripen
plane_map["JAS39Gripen_AG"] = JAS39Gripen_AG
vehicle_map["FieldHL"] = frenchpack._FIELD_HIDE vehicle_map["FieldHL"] = frenchpack._FIELD_HIDE
vehicle_map["HARRIERH"] = frenchpack._FIELD_HIDE_SMALL vehicle_map["HARRIERH"] = frenchpack._FIELD_HIDE_SMALL
@@ -414,6 +417,7 @@ PRICES = {
F_22A: 40, F_22A: 40,
Tornado_IDS: 20, Tornado_IDS: 20,
Tornado_GR4: 20, Tornado_GR4: 20,
JAS39Gripen: 26,
# bomber # bomber
Su_17M4: 10, Su_17M4: 10,
Su_25: 15, Su_25: 15,
@@ -427,6 +431,7 @@ PRICES = {
A_10C: 22, A_10C: 22,
A_10C_2: 24, A_10C_2: 24,
S_3B: 10, S_3B: 10,
JAS39Gripen_AG: 26,
# heli # heli
Ka_50: 13, Ka_50: 13,
SA342M: 8, SA342M: 8,
@@ -525,6 +530,7 @@ PRICES = {
Armor.IFV_Marder: 10, Armor.IFV_Marder: 10,
Armor.IFV_Warrior: 10, Armor.IFV_Warrior: 10,
Armor.IFV_LAV_25: 7, Armor.IFV_LAV_25: 7,
Armor.APC_AAV_7_Amphibious: 10,
Artillery.MLRS_M270_227mm: 55, Artillery.MLRS_M270_227mm: 55,
Artillery.SPH_M109_Paladin_155mm: 25, Artillery.SPH_M109_Paladin_155mm: 25,
Artillery.SPM_2S9_Nona_120mm_M: 12, Artillery.SPM_2S9_Nona_120mm_M: 12,
@@ -538,11 +544,20 @@ PRICES = {
Artillery.SPH_Dana_vz77_152mm: 26, Artillery.SPH_Dana_vz77_152mm: 26,
Artillery.PLZ_05: 25, Artillery.PLZ_05: 25,
Artillery.SPH_T155_Firtina_155mm: 28, Artillery.SPH_T155_Firtina_155mm: 28,
Artillery.MLRS_9A52_Smerch_CM_300mm: 60,
Unarmed.LUV_UAZ_469_Jeep: 3, Unarmed.LUV_UAZ_469_Jeep: 3,
Unarmed.Truck_Ural_375: 3, Unarmed.Truck_Ural_375: 3,
Unarmed.Truck_GAZ_3307: 2,
Infantry.Infantry_M4: 1, Infantry.Infantry_M4: 1,
Infantry.Infantry_AK_74: 1, Infantry.Infantry_AK_74: 1,
Unarmed.Truck_M818_6x6: 3, Unarmed.Truck_M818_6x6: 3,
Unarmed.LUV_Land_Rover_109: 1,
Unarmed.Truck_GAZ_3308: 1,
Unarmed.Truck_GAZ_66: 1,
Unarmed.Truck_KAMAZ_43101: 1,
Unarmed.Truck_Land_Rover_101_FC: 1,
Unarmed.Truck_Ural_4320_31_Arm_d: 1,
Unarmed.Truck_Ural_4320T: 1,
# WW2 # WW2
Armor.MT_Pz_Kpfw_V_Panther_Ausf_G: 24, Armor.MT_Pz_Kpfw_V_Panther_Ausf_G: 24,
Armor.Tk_PzIV_H: 16, Armor.Tk_PzIV_H: 16,
@@ -569,6 +584,13 @@ PRICES = {
Armor.Car_Daimler_Armored: 8, Armor.Car_Daimler_Armored: 8,
Armor.LT_Mk_VII_Tetrarch: 8, Armor.LT_Mk_VII_Tetrarch: 8,
Unarmed.Tractor_M4_Hi_Speed: 2, Unarmed.Tractor_M4_Hi_Speed: 2,
Unarmed.Carrier_Sd_Kfz_7_Tractor: 1,
Unarmed.LUV_Kettenrad: 1,
Unarmed.LUV_Kubelwagen_82: 1,
Unarmed.Truck_Opel_Blitz: 1,
Unarmed.Truck_Bedford: 1,
Unarmed.Truck_GMC_Jimmy_6x6_Truck: 1,
Unarmed.Car_Willys_Jeep: 1,
# ship # ship
CV_1143_5_Admiral_Kuznetsov: 100, CV_1143_5_Admiral_Kuznetsov: 100,
CVN_74_John_C__Stennis: 100, CVN_74_John_C__Stennis: 100,
@@ -758,6 +780,7 @@ UNIT_BY_TASK = {
F_4E, F_4E,
F_5E_3, F_5E_3,
I_16, I_16,
JAS39Gripen,
JF_17, JF_17,
J_11A, J_11A,
M_2000C, M_2000C,
@@ -797,6 +820,7 @@ UNIT_BY_TASK = {
F_15E, F_15E,
F_86F_Sabre, F_86F_Sabre,
Hercules, Hercules,
JAS39Gripen_AG,
Ju_88A4, Ju_88A4,
Ka_50, Ka_50,
L_39ZA, L_39ZA,

View File

@@ -399,6 +399,7 @@ class Operation:
@classmethod @classmethod
def _generate_ground_conflicts(cls) -> None: def _generate_ground_conflicts(cls) -> None:
"""For each frontline in the Operation, generate the ground conflicts and JTACs""" """For each frontline in the Operation, generate the ground conflicts and JTACs"""
cls.jtacs = []
for front_line in cls.game.theater.conflicts(): for front_line in cls.game.theater.conflicts():
player_cp = front_line.blue_cp player_cp = front_line.blue_cp
enemy_cp = front_line.red_cp enemy_cp = front_line.red_cp

View File

@@ -665,10 +665,16 @@ AIRCRAFT_DATA: Dict[str, AircraftData] = {
channel_allocator=None, channel_allocator=None,
channel_namer=SCR522ChannelNamer, channel_namer=SCR522ChannelNamer,
), ),
"JAS39Gripen": AircraftData(
inter_flight_radio=get_radio("R&S Series 6000"),
intra_flight_radio=get_radio("R&S Series 6000"),
channel_allocator=None,
),
} }
AIRCRAFT_DATA["A-10C_2"] = AIRCRAFT_DATA["A-10C"] AIRCRAFT_DATA["A-10C_2"] = AIRCRAFT_DATA["A-10C"]
AIRCRAFT_DATA["P-51D-30-NA"] = AIRCRAFT_DATA["P-51D"] AIRCRAFT_DATA["P-51D-30-NA"] = AIRCRAFT_DATA["P-51D"]
AIRCRAFT_DATA["P-47D-30"] = AIRCRAFT_DATA["P-51D"] AIRCRAFT_DATA["P-47D-30"] = AIRCRAFT_DATA["P-51D"]
AIRCRAFT_DATA["JAS39Gripen_AG"] = AIRCRAFT_DATA["JAS39Gripen"]
class AircraftConflictGenerator: class AircraftConflictGenerator:

View File

@@ -674,7 +674,7 @@ AIRFIELD_DATA = {
vor=("DAN", MHz(108, 400)), vor=("DAN", MHz(108, 400)),
atc=AtcData(MHz(3, 900), MHz(38, 700), MHz(122, 100), MHz(360, 100)), atc=AtcData(MHz(3, 900), MHz(38, 700), MHz(122, 100), MHz(360, 100)),
ils={ ils={
"50": ("IDAN", MHz(109, 300)), "05": ("IDAN", MHz(109, 300)),
"23": ("DANM", MHz(111, 700)), "23": ("DANM", MHz(111, 700)),
}, },
), ),

View File

@@ -103,6 +103,7 @@ from dcs.unittype import FlyingType
from gen.flights.flight import FlightType from gen.flights.flight import FlightType
from pydcs_extensions.a4ec.a4ec import A_4E_C from pydcs_extensions.a4ec.a4ec import A_4E_C
from pydcs_extensions.f22a.f22a import F_22A from pydcs_extensions.f22a.f22a import F_22A
from pydcs_extensions.jas39.jas39 import JAS39Gripen, JAS39Gripen_AG
from pydcs_extensions.hercules.hercules import Hercules from pydcs_extensions.hercules.hercules import Hercules
from pydcs_extensions.mb339.mb339 import MB_339PAN from pydcs_extensions.mb339.mb339 import MB_339PAN
from pydcs_extensions.su57.su57 import Su_57 from pydcs_extensions.su57.su57 import Su_57
@@ -134,6 +135,7 @@ CAP_CAPABLE = [
FA_18C_hornet, FA_18C_hornet,
F_16A, F_16A,
F_4E, F_4E,
JAS39Gripen,
JF_17, JF_17,
MiG_23MLD, MiG_23MLD,
MiG_21Bis, MiG_21Bis,
@@ -174,6 +176,7 @@ CAS_CAPABLE = [
FA_18C_hornet, FA_18C_hornet,
Tornado_GR4, Tornado_GR4,
Tornado_IDS, Tornado_IDS,
JAS39Gripen_AG,
JF_17, JF_17,
AV8BNA, AV8BNA,
A_10A, A_10A,
@@ -242,6 +245,7 @@ SEAD_CAPABLE = [
A_4E_C, A_4E_C,
F_14B, F_14B,
F_14A_135_GR, F_14A_135_GR,
JAS39Gripen_AG,
AV8BNA, AV8BNA,
Su_24M, Su_24M,
Su_17M4, Su_17M4,
@@ -257,6 +261,7 @@ DEAD_CAPABLE = [
AJS37, AJS37,
F_14B, F_14B,
F_14A_135_GR, F_14A_135_GR,
JAS39Gripen_AG,
B_1B, B_1B,
B_52H, B_52H,
Tu_160, Tu_160,
@@ -292,6 +297,7 @@ STRIKE_CAPABLE = [
F_16A, F_16A,
F_14B, F_14B,
F_14A_135_GR, F_14A_135_GR,
JAS39Gripen_AG,
Tornado_IDS, Tornado_IDS,
Su_17M4, Su_17M4,
Su_24MR, Su_24MR,
@@ -342,6 +348,7 @@ ANTISHIP_CAPABLE = [
AJS37, AJS37,
Tu_22M3, Tu_22M3,
FA_18C_hornet, FA_18C_hornet,
JAS39Gripen_AG,
Su_24M, Su_24M,
Su_17M4, Su_17M4,
JF_17, JF_17,

View File

@@ -22,17 +22,19 @@ class CombatGroupRole(Enum):
LOGI = 6 LOGI = 6
INFANTRY = 7 INFANTRY = 7
ATGM = 8 ATGM = 8
RECON = 9
DISTANCE_FROM_FRONTLINE = { DISTANCE_FROM_FRONTLINE = {
CombatGroupRole.TANK: (2200, 3200), CombatGroupRole.TANK: (2200, 3200),
CombatGroupRole.APC: (7500, 8500), CombatGroupRole.APC: (2700, 3700),
CombatGroupRole.IFV: (2700, 3700), CombatGroupRole.IFV: (2700, 3700),
CombatGroupRole.ARTILLERY: (16000, 18000), CombatGroupRole.ARTILLERY: (16000, 18000),
CombatGroupRole.SHORAD: (12000, 13000), CombatGroupRole.SHORAD: (5000, 8000),
CombatGroupRole.LOGI: (18000, 20000), CombatGroupRole.LOGI: (18000, 20000),
CombatGroupRole.INFANTRY: (2800, 3300), CombatGroupRole.INFANTRY: (2800, 3300),
CombatGroupRole.ATGM: (5200, 6200), CombatGroupRole.ATGM: (5200, 6200),
CombatGroupRole.RECON: (2000, 3000),
} }
GROUP_SIZES_BY_COMBAT_STANCE = { GROUP_SIZES_BY_COMBAT_STANCE = {
@@ -74,6 +76,7 @@ class GroundPlanner:
self.atgm_group: List[CombatGroup] = [] self.atgm_group: List[CombatGroup] = []
self.logi_groups: List[CombatGroup] = [] self.logi_groups: List[CombatGroup] = []
self.shorad_groups: List[CombatGroup] = [] self.shorad_groups: List[CombatGroup] = []
self.recon_groups: List[CombatGroup] = []
self.units_per_cp: Dict[int, List[CombatGroup]] = {} self.units_per_cp: Dict[int, List[CombatGroup]] = {}
for cp in self.connected_enemy_cp: for cp in self.connected_enemy_cp:
@@ -115,6 +118,9 @@ class GroundPlanner:
elif unit_type in GroundUnitClass.Shorads: elif unit_type in GroundUnitClass.Shorads:
collection = self.shorad_groups collection = self.shorad_groups
role = CombatGroupRole.SHORAD role = CombatGroupRole.SHORAD
elif unit_type in GroundUnitClass.Recon:
collection = self.recon_groups
role = CombatGroupRole.RECON
else: else:
logging.warning( logging.warning(
f"Unused front line vehicle at base {unit_type}: unknown unit class" f"Unused front line vehicle at base {unit_type}: unknown unit class"

View File

@@ -134,6 +134,7 @@ RADIOS: List[Radio] = [
Radio("AN/ARC-51BX", MHz(225), MHz(400), step=kHz(50)), Radio("AN/ARC-51BX", MHz(225), MHz(400), step=kHz(50)),
Radio("AN/ARC-131", MHz(30), MHz(76), step=kHz(50)), Radio("AN/ARC-131", MHz(30), MHz(76), step=kHz(50)),
Radio("AN/ARC-134", MHz(116), MHz(150), step=kHz(25)), Radio("AN/ARC-134", MHz(116), MHz(150), step=kHz(25)),
Radio("R&S Series 6000", MHz(100), MHz(156), step=kHz(25)),
] ]

View File

@@ -0,0 +1,476 @@
from dcs import task
from dcs.planes import PlaneType
from dcs.weapons_data import Weapons
from pydcs_extensions.weapon_injector import inject_weapons
class JAS39GripenWeapons:
JAS_ARAKM70BAP = {
"clsid": "JAS_ARAKM70BAP",
"name": "ARAK M70B AP",
"weight": 372.2,
}
JAS_ARAKM70BHE = {
"clsid": "JAS_ARAKM70BHE",
"name": "ARAK M70B HE",
"weight": 372.2,
}
JAS_BK90 = {
"clsid": "JAS_BK90",
"name": "BK-90 Unguided Cluster Munition",
"weight": 605,
}
JAS_BRIMSTONE = {
"clsid": "JAS_BRIMSTONE",
"name": "Brimstone Laser Guided Missile",
"weight": 195.5,
}
JAS_GBU10_TV = {
"clsid": "JAS_GBU10_TV",
"name": "GBU-10 2000 lb TV-guided Bomb",
"weight": 934,
}
JAS_GBU12 = {
"clsid": "JAS_GBU12",
"name": "GBU-12 500 lb Laser-guided Bomb",
"weight": 275,
}
JAS_GBU16_TV = {
"clsid": "JAS_GBU16_TV",
"name": "GBU-16 1000lb TV Guided Bomb",
"weight": 934,
}
JAS_GBU31 = {
"clsid": "JAS_GBU31",
"name": "GBU-31 2000lb TV Guided Glide-Bomb",
"weight": 934,
}
JAS_GBU49_TV = {
"clsid": "JAS_GBU49_TV",
"name": "GBU-49 500lb TV Guided Bomb",
"weight": 275,
}
JAS_IRIS_T = {
"clsid": "JAS_IRIS-T",
"name": "Rb98 IRIS-T Sidewinder IR AAM",
"weight": 88.4,
}
JAS_Litening = {
"clsid": "JAS_Litening",
"name": "Litening III POD (LLTV)",
"weight": 295,
}
JAS_MAR_1 = {
"clsid": "JAS_MAR-1",
"name": "MAR-1 High Speed Anti-Radiation Missile",
"weight": 350,
}
JAS_Meteor = {
"clsid": "JAS_Meteor",
"name": "Rb101 Meteor BVRAAM Active Rdr AAM",
"weight": 191,
}
JAS_RB15F = {
"clsid": "JAS_RB15F",
"name": "RBS-15 Mk. IV Gungnir Radiation Seeking Anti-ship Missile ",
"weight": None,
}
JAS_RB75T = {
"clsid": "JAS_RB75T",
"name": "Rb-75T (AGM-65E Maverick) (Laser ASM Lg Whd)",
"weight": 210,
}
JAS_Rb74 = {
"clsid": "JAS_Rb74",
"name": "Rb74 AIM-9L Sidewinder IR AAM",
"weight": 90,
}
JAS_Rb99 = {
"clsid": "JAS_Rb99",
"name": "Rb99 AIM-120B AMRAAM Active Rdr AAM",
"weight": 157,
}
JAS_Rb99_DUAL = {
"clsid": "JAS_Rb99_DUAL",
"name": "Rb99 AIM-120B AMRAAM Active Rdr AAM x 2",
"weight": 313,
}
JAS_Stormshadow = {
"clsid": "JAS_Stormshadow",
"name": "Storm Shadow Long Range Anti-Radiation Cruise-missile",
"weight": None,
}
JAS_TANK1100 = {
"clsid": "JAS_TANK1100",
"name": "External drop tank 1100 litre",
"weight": 1019,
}
JAS_TANK1700 = {
"clsid": "JAS_TANK1700",
"name": "External drop tank 1700 litre",
"weight": 1533,
}
inject_weapons(JAS39GripenWeapons)
class JAS39Gripen(PlaneType):
id = "JAS39Gripen"
flyable = True
height = 4.5
width = 8.4
length = 14.1
fuel_max = 2550
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
class Pylon1:
JAS_IRIS_T = (1, JAS39GripenWeapons.JAS_IRIS_T)
JAS_Rb74 = (1, JAS39GripenWeapons.JAS_Rb74)
AN_ASQ_T50_TCTS_Pod___ACMI_Pod = (1, Weapons.AN_ASQ_T50_TCTS_Pod___ACMI_Pod)
Smokewinder___red = (1, Weapons.Smokewinder___red)
Smokewinder___green = (1, Weapons.Smokewinder___green)
Smokewinder___blue = (1, Weapons.Smokewinder___blue)
Smokewinder___white = (1, Weapons.Smokewinder___white)
Smokewinder___yellow = (1, Weapons.Smokewinder___yellow)
Smokewinder___orange = (1, Weapons.Smokewinder___orange)
class Pylon2:
JAS_IRIS_T = (2, JAS39GripenWeapons.JAS_IRIS_T)
JAS_Rb74 = (2, JAS39GripenWeapons.JAS_Rb74)
JAS_Meteor = (2, JAS39GripenWeapons.JAS_Meteor)
JAS_Rb99 = (2, JAS39GripenWeapons.JAS_Rb99)
JAS_Rb99_DUAL = (2, JAS39GripenWeapons.JAS_Rb99_DUAL)
LAU_115_2_LAU_127_AIM_120C = (2, Weapons.LAU_115_2_LAU_127_AIM_120C)
AIM_120C_5_AMRAAM___Active_Rdr_AAM = (
2,
Weapons.AIM_120C_5_AMRAAM___Active_Rdr_AAM,
)
# ERRR <CLEAN>
class Pylon3:
JAS_Meteor = (3, JAS39GripenWeapons.JAS_Meteor)
JAS_Rb99 = (3, JAS39GripenWeapons.JAS_Rb99)
AIM_120C_5_AMRAAM___Active_Rdr_AAM = (
3,
Weapons.AIM_120C_5_AMRAAM___Active_Rdr_AAM,
)
JAS_TANK1100 = (3, JAS39GripenWeapons.JAS_TANK1100)
JAS_TANK1700 = (3, JAS39GripenWeapons.JAS_TANK1700)
# ERRR <CLEAN>
class Pylon4:
L_081_Fantasmagoria_ELINT_pod = (4, Weapons.L_081_Fantasmagoria_ELINT_pod)
class Pylon5:
JAS_TANK1100 = (5, JAS39GripenWeapons.JAS_TANK1100)
JAS_Meteor = (5, JAS39GripenWeapons.JAS_Meteor)
AIM_120C_5_AMRAAM___Active_Rdr_AAM = (
5,
Weapons.AIM_120C_5_AMRAAM___Active_Rdr_AAM,
)
JAS_Rb99 = (5, JAS39GripenWeapons.JAS_Rb99)
JAS_Rb99_DUAL = (5, JAS39GripenWeapons.JAS_Rb99_DUAL)
# ERRR <CLEAN>
class Pylon6:
L005_Sorbtsiya_ECM_pod__left_ = (6, Weapons.L005_Sorbtsiya_ECM_pod__left_)
class Pylon7:
JAS_Litening = (7, JAS39GripenWeapons.JAS_Litening)
# ERRR <CLEAN>
class Pylon8:
JAS_Meteor = (8, JAS39GripenWeapons.JAS_Meteor)
JAS_Rb99 = (8, JAS39GripenWeapons.JAS_Rb99)
AIM_120C_5_AMRAAM___Active_Rdr_AAM = (
8,
Weapons.AIM_120C_5_AMRAAM___Active_Rdr_AAM,
)
JAS_TANK1100 = (8, JAS39GripenWeapons.JAS_TANK1100)
JAS_TANK1700 = (8, JAS39GripenWeapons.JAS_TANK1700)
# ERRR <CLEAN>
class Pylon9:
JAS_IRIS_T = (9, JAS39GripenWeapons.JAS_IRIS_T)
JAS_Rb74 = (9, JAS39GripenWeapons.JAS_Rb74)
JAS_Meteor = (9, JAS39GripenWeapons.JAS_Meteor)
JAS_Rb99 = (9, JAS39GripenWeapons.JAS_Rb99)
JAS_Rb99_DUAL = (9, JAS39GripenWeapons.JAS_Rb99_DUAL)
LAU_115_2_LAU_127_AIM_120C = (9, Weapons.LAU_115_2_LAU_127_AIM_120C)
AIM_120C_5_AMRAAM___Active_Rdr_AAM = (
9,
Weapons.AIM_120C_5_AMRAAM___Active_Rdr_AAM,
)
# ERRR <CLEAN>
class Pylon10:
JAS_IRIS_T = (10, JAS39GripenWeapons.JAS_IRIS_T)
JAS_Rb74 = (10, JAS39GripenWeapons.JAS_Rb74)
AN_ASQ_T50_TCTS_Pod___ACMI_Pod = (10, Weapons.AN_ASQ_T50_TCTS_Pod___ACMI_Pod)
Smokewinder___red = (10, Weapons.Smokewinder___red)
Smokewinder___green = (10, Weapons.Smokewinder___green)
Smokewinder___blue = (10, Weapons.Smokewinder___blue)
Smokewinder___white = (10, Weapons.Smokewinder___white)
Smokewinder___yellow = (10, Weapons.Smokewinder___yellow)
Smokewinder___orange = (10, Weapons.Smokewinder___orange)
pylons = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
tasks = [
task.Intercept,
task.CAP,
task.Reconnaissance,
task.Escort,
task.FighterSweep,
]
task_default = task.FighterSweep
class JAS39Gripen_AG(PlaneType):
id = "JAS39Gripen_AG"
flyable = True
height = 4.5
width = 8.4
length = 14.1
fuel_max = 2550
max_speed = 2649.996
chaff = 90
flare = 45
charge_total = 180
chaff_charge_size = 1
flare_charge_size = 1
category = "Interceptor" # {78EFB7A2-FD52-4b57-A6A6-3BF0E1D6555F}
radio_frequency = 127.5
class Pylon1:
JAS_IRIS_T = (1, JAS39GripenWeapons.JAS_IRIS_T)
JAS_Rb74 = (1, JAS39GripenWeapons.JAS_Rb74)
AN_ASQ_T50_TCTS_Pod___ACMI_Pod = (1, Weapons.AN_ASQ_T50_TCTS_Pod___ACMI_Pod)
Smokewinder___red = (1, Weapons.Smokewinder___red)
Smokewinder___green = (1, Weapons.Smokewinder___green)
Smokewinder___blue = (1, Weapons.Smokewinder___blue)
Smokewinder___white = (1, Weapons.Smokewinder___white)
Smokewinder___yellow = (1, Weapons.Smokewinder___yellow)
Smokewinder___orange = (1, Weapons.Smokewinder___orange)
class Pylon2:
JAS_IRIS_T = (2, JAS39GripenWeapons.JAS_IRIS_T)
JAS_Rb74 = (2, JAS39GripenWeapons.JAS_Rb74)
JAS_RB75T = (2, JAS39GripenWeapons.JAS_RB75T)
AGM_65K___Maverick_K__CCD_Imp_ASM_ = (
2,
Weapons.AGM_65K___Maverick_K__CCD_Imp_ASM_,
)
JAS_BK90 = (2, JAS39GripenWeapons.JAS_BK90)
JAS_RB15F = (2, JAS39GripenWeapons.JAS_RB15F)
JAS_MAR_1 = (2, JAS39GripenWeapons.JAS_MAR_1)
JAS_GBU12 = (2, JAS39GripenWeapons.JAS_GBU12)
JAS_GBU49_TV = (2, JAS39GripenWeapons.JAS_GBU49_TV)
# ERRR JAS_GBU16
JAS_GBU16_TV = (2, JAS39GripenWeapons.JAS_GBU16_TV)
# ERRR GBU12_TEST
Mk_82___500lb_GP_Bomb_LD = (2, Weapons.Mk_82___500lb_GP_Bomb_LD)
Mk_83___1000lb_GP_Bomb_LD = (2, Weapons.Mk_83___1000lb_GP_Bomb_LD)
BRU_33_with_2_x_Mk_82___500lb_GP_Bomb_LD_ = (
2,
Weapons.BRU_33_with_2_x_Mk_82___500lb_GP_Bomb_LD_,
)
_4x_SB_M_71_120kg_GP_Bomb_Low_drag = (
2,
Weapons._4x_SB_M_71_120kg_GP_Bomb_Low_drag,
)
JAS_ARAKM70BHE = (2, JAS39GripenWeapons.JAS_ARAKM70BHE)
JAS_ARAKM70BAP = (2, JAS39GripenWeapons.JAS_ARAKM70BAP)
JAS_BRIMSTONE = (2, JAS39GripenWeapons.JAS_BRIMSTONE)
# ERRR <CLEAN>
class Pylon3:
JAS_RB75T = (3, JAS39GripenWeapons.JAS_RB75T)
AGM_65K___Maverick_K__CCD_Imp_ASM_ = (
3,
Weapons.AGM_65K___Maverick_K__CCD_Imp_ASM_,
)
JAS_Stormshadow = (3, JAS39GripenWeapons.JAS_Stormshadow)
JAS_BK90 = (3, JAS39GripenWeapons.JAS_BK90)
JAS_GBU31 = (3, JAS39GripenWeapons.JAS_GBU31)
JAS_RB15F = (3, JAS39GripenWeapons.JAS_RB15F)
JAS_MAR_1 = (3, JAS39GripenWeapons.JAS_MAR_1)
JAS_GBU12 = (3, JAS39GripenWeapons.JAS_GBU12)
JAS_GBU49_TV = (3, JAS39GripenWeapons.JAS_GBU49_TV)
# ERRR JAS_GBU16
JAS_GBU16_TV = (3, JAS39GripenWeapons.JAS_GBU16_TV)
GBU_10___2000lb_Laser_Guided_Bomb = (
3,
Weapons.GBU_10___2000lb_Laser_Guided_Bomb,
)
Mk_82___500lb_GP_Bomb_LD = (3, Weapons.Mk_82___500lb_GP_Bomb_LD)
Mk_83___1000lb_GP_Bomb_LD = (3, Weapons.Mk_83___1000lb_GP_Bomb_LD)
Mk_84___2000lb_GP_Bomb_LD = (3, Weapons.Mk_84___2000lb_GP_Bomb_LD)
BRU_33_with_2_x_Mk_82___500lb_GP_Bomb_LD_ = (
3,
Weapons.BRU_33_with_2_x_Mk_82___500lb_GP_Bomb_LD_,
)
_4x_SB_M_71_120kg_GP_Bomb_Low_drag = (
3,
Weapons._4x_SB_M_71_120kg_GP_Bomb_Low_drag,
)
JAS_TANK1100 = (3, JAS39GripenWeapons.JAS_TANK1100)
JAS_TANK1700 = (3, JAS39GripenWeapons.JAS_TANK1700)
JAS_ARAKM70BHE = (3, JAS39GripenWeapons.JAS_ARAKM70BHE)
JAS_ARAKM70BAP = (3, JAS39GripenWeapons.JAS_ARAKM70BAP)
JAS_BRIMSTONE = (3, JAS39GripenWeapons.JAS_BRIMSTONE)
# ERRR <CLEAN>
class Pylon4:
L_081_Fantasmagoria_ELINT_pod = (4, Weapons.L_081_Fantasmagoria_ELINT_pod)
class Pylon5:
JAS_Stormshadow = (5, JAS39GripenWeapons.JAS_Stormshadow)
JAS_GBU12 = (5, JAS39GripenWeapons.JAS_GBU12)
JAS_GBU49_TV = (5, JAS39GripenWeapons.JAS_GBU49_TV)
# ERRR JAS_GBU16
JAS_GBU16_TV = (5, JAS39GripenWeapons.JAS_GBU16_TV)
GBU_10___2000lb_Laser_Guided_Bomb = (
5,
Weapons.GBU_10___2000lb_Laser_Guided_Bomb,
)
Mk_82___500lb_GP_Bomb_LD = (5, Weapons.Mk_82___500lb_GP_Bomb_LD)
Mk_83___1000lb_GP_Bomb_LD = (5, Weapons.Mk_83___1000lb_GP_Bomb_LD)
Mk_84___2000lb_GP_Bomb_LD = (5, Weapons.Mk_84___2000lb_GP_Bomb_LD)
BRU_33_with_2_x_Mk_82___500lb_GP_Bomb_LD_ = (
5,
Weapons.BRU_33_with_2_x_Mk_82___500lb_GP_Bomb_LD_,
)
_4x_SB_M_71_120kg_GP_Bomb_Low_drag = (
5,
Weapons._4x_SB_M_71_120kg_GP_Bomb_Low_drag,
)
JAS_TANK1100 = (5, JAS39GripenWeapons.JAS_TANK1100)
# ERRR JAS_WMD7
JAS_BRIMSTONE = (5, JAS39GripenWeapons.JAS_BRIMSTONE)
# ERRR {INV-SMOKE-RED}
# ERRR {INV-SMOKE-GREEN}
# ERRR {INV-SMOKE-BLUE}
# ERRR {INV-SMOKE-WHITE}
# ERRR {INV-SMOKE-YELLOW}
# ERRR {INV-SMOKE-ORANGE}
# ERRR <CLEAN>
class Pylon6:
L005_Sorbtsiya_ECM_pod__left_ = (6, Weapons.L005_Sorbtsiya_ECM_pod__left_)
class Pylon7:
JAS_Litening = (7, JAS39GripenWeapons.JAS_Litening)
# ERRR <CLEAN>
class Pylon8:
JAS_RB75T = (8, JAS39GripenWeapons.JAS_RB75T)
AGM_65K___Maverick_K__CCD_Imp_ASM_ = (
8,
Weapons.AGM_65K___Maverick_K__CCD_Imp_ASM_,
)
JAS_Stormshadow = (8, JAS39GripenWeapons.JAS_Stormshadow)
JAS_BK90 = (8, JAS39GripenWeapons.JAS_BK90)
JAS_GBU31 = (8, JAS39GripenWeapons.JAS_GBU31)
JAS_RB15F = (8, JAS39GripenWeapons.JAS_RB15F)
JAS_MAR_1 = (8, JAS39GripenWeapons.JAS_MAR_1)
JAS_GBU12 = (8, JAS39GripenWeapons.JAS_GBU12)
JAS_GBU49_TV = (8, JAS39GripenWeapons.JAS_GBU49_TV)
# ERRR JAS_GBU16
JAS_GBU16_TV = (8, JAS39GripenWeapons.JAS_GBU16_TV)
GBU_10___2000lb_Laser_Guided_Bomb = (
8,
Weapons.GBU_10___2000lb_Laser_Guided_Bomb,
)
Mk_82___500lb_GP_Bomb_LD = (8, Weapons.Mk_82___500lb_GP_Bomb_LD)
Mk_83___1000lb_GP_Bomb_LD = (8, Weapons.Mk_83___1000lb_GP_Bomb_LD)
Mk_84___2000lb_GP_Bomb_LD = (8, Weapons.Mk_84___2000lb_GP_Bomb_LD)
BRU_33_with_2_x_Mk_82___500lb_GP_Bomb_LD_ = (
8,
Weapons.BRU_33_with_2_x_Mk_82___500lb_GP_Bomb_LD_,
)
_4x_SB_M_71_120kg_GP_Bomb_Low_drag = (
8,
Weapons._4x_SB_M_71_120kg_GP_Bomb_Low_drag,
)
JAS_TANK1100 = (8, JAS39GripenWeapons.JAS_TANK1100)
JAS_TANK1700 = (8, JAS39GripenWeapons.JAS_TANK1700)
JAS_ARAKM70BHE = (8, JAS39GripenWeapons.JAS_ARAKM70BHE)
JAS_ARAKM70BAP = (8, JAS39GripenWeapons.JAS_ARAKM70BAP)
JAS_BRIMSTONE = (8, JAS39GripenWeapons.JAS_BRIMSTONE)
# ERRR <CLEAN>
class Pylon9:
JAS_IRIS_T = (9, JAS39GripenWeapons.JAS_IRIS_T)
JAS_Rb74 = (9, JAS39GripenWeapons.JAS_Rb74)
JAS_RB75T = (9, JAS39GripenWeapons.JAS_RB75T)
AGM_65K___Maverick_K__CCD_Imp_ASM_ = (
9,
Weapons.AGM_65K___Maverick_K__CCD_Imp_ASM_,
)
JAS_BK90 = (9, JAS39GripenWeapons.JAS_BK90)
JAS_RB15F = (9, JAS39GripenWeapons.JAS_RB15F)
JAS_MAR_1 = (9, JAS39GripenWeapons.JAS_MAR_1)
JAS_GBU12 = (9, JAS39GripenWeapons.JAS_GBU12)
JAS_GBU49_TV = (9, JAS39GripenWeapons.JAS_GBU49_TV)
# ERRR JAS_GBU16
JAS_GBU16_TV = (9, JAS39GripenWeapons.JAS_GBU16_TV)
# ERRR GBU12_TEST
Mk_82___500lb_GP_Bomb_LD = (9, Weapons.Mk_82___500lb_GP_Bomb_LD)
Mk_83___1000lb_GP_Bomb_LD = (9, Weapons.Mk_83___1000lb_GP_Bomb_LD)
BRU_33_with_2_x_Mk_82___500lb_GP_Bomb_LD_ = (
9,
Weapons.BRU_33_with_2_x_Mk_82___500lb_GP_Bomb_LD_,
)
_4x_SB_M_71_120kg_GP_Bomb_Low_drag = (
9,
Weapons._4x_SB_M_71_120kg_GP_Bomb_Low_drag,
)
JAS_ARAKM70BHE = (9, JAS39GripenWeapons.JAS_ARAKM70BHE)
JAS_ARAKM70BAP = (9, JAS39GripenWeapons.JAS_ARAKM70BAP)
JAS_BRIMSTONE = (9, JAS39GripenWeapons.JAS_BRIMSTONE)
# ERRR <CLEAN>
class Pylon10:
JAS_IRIS_T = (10, JAS39GripenWeapons.JAS_IRIS_T)
JAS_Rb74 = (10, JAS39GripenWeapons.JAS_Rb74)
AN_ASQ_T50_TCTS_Pod___ACMI_Pod = (10, Weapons.AN_ASQ_T50_TCTS_Pod___ACMI_Pod)
Smokewinder___red = (10, Weapons.Smokewinder___red)
Smokewinder___green = (10, Weapons.Smokewinder___green)
Smokewinder___blue = (10, Weapons.Smokewinder___blue)
Smokewinder___white = (10, Weapons.Smokewinder___white)
Smokewinder___yellow = (10, Weapons.Smokewinder___yellow)
Smokewinder___orange = (10, Weapons.Smokewinder___orange)
pylons = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
tasks = [
task.SEAD,
task.AntishipStrike,
task.CAS,
task.GroundAttack,
task.PinpointStrike,
task.RunwayAttack,
]
task_default = task.CAS

View File

@@ -2,6 +2,7 @@ from pydcs_extensions.a4ec.a4ec import A_4E_C
from pydcs_extensions.f22a.f22a import F_22A from pydcs_extensions.f22a.f22a import F_22A
from pydcs_extensions.hercules.hercules import Hercules from pydcs_extensions.hercules.hercules import Hercules
from pydcs_extensions.highdigitsams import highdigitsams from pydcs_extensions.highdigitsams import highdigitsams
from pydcs_extensions.jas39.jas39 import JAS39Gripen, JAS39Gripen_AG
from pydcs_extensions.mb339.mb339 import MB_339PAN from pydcs_extensions.mb339.mb339 import MB_339PAN
from pydcs_extensions.su57.su57 import Su_57 from pydcs_extensions.su57.su57 import Su_57
import pydcs_extensions.frenchpack.frenchpack as frenchpack import pydcs_extensions.frenchpack.frenchpack as frenchpack
@@ -12,6 +13,8 @@ MODDED_AIRPLANES = [
Su_57, Su_57,
F_22A, F_22A,
Hercules, Hercules,
JAS39Gripen,
JAS39Gripen_AG,
] ]
MODDED_VEHICLES = [ MODDED_VEHICLES = [
frenchpack._FIELD_HIDE, frenchpack._FIELD_HIDE,

View File

@@ -220,7 +220,7 @@ class QWeatherWidget(QGroupBox):
precipitation = self.conditions.weather.clouds.precipitation precipitation = self.conditions.weather.clouds.precipitation
if not cloud_density: if not cloud_density:
self.forecastClouds.setText("Sunny") self.forecastClouds.setText("Clear")
weather_type = "clear" weather_type = "clear"
elif cloud_density < 3: elif cloud_density < 3:
self.forecastClouds.setText("Partly Cloudy") self.forecastClouds.setText("Partly Cloudy")

View File

@@ -11,7 +11,6 @@ from dcs.vehicles import vehicle_map
from shapely.geometry import LineString, Point as ShapelyPoint, Polygon, MultiPolygon from shapely.geometry import LineString, Point as ShapelyPoint, Polygon, MultiPolygon
from game import Game, db from game import Game, db
from game.factions.faction import Faction
from game.navmesh import NavMesh from game.navmesh import NavMesh
from game.profiling import logged_duration from game.profiling import logged_duration
from game.theater import ( from game.theater import (
@@ -27,7 +26,7 @@ from game.transfers import MultiGroupTransport, TransportMap
from game.utils import meters, nautical_miles from game.utils import meters, nautical_miles
from gen.ato import AirTaskingOrder from gen.ato import AirTaskingOrder
from gen.flights.flight import Flight, FlightWaypoint, FlightWaypointType from gen.flights.flight import Flight, FlightWaypoint, FlightWaypointType
from gen.flights.flightplan import FlightPlan, PatrollingFlightPlan from gen.flights.flightplan import FlightPlan, PatrollingFlightPlan, CasFlightPlan
from qt_ui.dialogs import Dialog from qt_ui.dialogs import Dialog
from qt_ui.models import GameModel, AtoModel from qt_ui.models import GameModel, AtoModel
from qt_ui.windows.GameUpdateSignal import GameUpdateSignal from qt_ui.windows.GameUpdateSignal import GameUpdateSignal
@@ -508,14 +507,12 @@ class FlightJs(QObject):
flight: Flight, flight: Flight,
selected: bool, selected: bool,
theater: ConflictTheater, theater: ConflictTheater,
faction: Faction,
ato_model: AtoModel, ato_model: AtoModel,
) -> None: ) -> None:
super().__init__() super().__init__()
self.flight = flight self.flight = flight
self._selected = selected self._selected = selected
self.theater = theater self.theater = theater
self.faction = faction
self.ato_model = ato_model self.ato_model = ato_model
self._waypoints = self.make_waypoints() self._waypoints = self.make_waypoints()
@@ -556,14 +553,19 @@ class FlightJs(QObject):
return [] return []
start = self.flight.flight_plan.patrol_start start = self.flight.flight_plan.patrol_start
end = self.flight.flight_plan.patrol_end end = self.flight.flight_plan.patrol_end
line = LineString( if isinstance(self.flight.flight_plan, CasFlightPlan):
[ center = self.flight.flight_plan.target.position
ShapelyPoint(start.x, start.y), commit_center = ShapelyPoint(center.x, center.y)
ShapelyPoint(end.x, end.y), else:
] commit_center = LineString(
[
ShapelyPoint(start.x, start.y),
ShapelyPoint(end.x, end.y),
]
)
bubble = commit_center.buffer(
self.flight.flight_plan.engagement_distance.meters
) )
doctrine = self.faction.doctrine
bubble = line.buffer(doctrine.cap_engagement_range.meters)
return shapely_poly_to_leaflet_points(bubble, self.theater) return shapely_poly_to_leaflet_points(bubble, self.theater)
@@ -855,7 +857,6 @@ class MapModel(QObject):
flight, flight,
selected=blue and (p_idx, f_idx) == self._selected_flight_index, selected=blue and (p_idx, f_idx) == self._selected_flight_index,
theater=self.game.theater, theater=self.game.theater,
faction=self.game.faction_for(blue),
ato_model=self.game_model.ato_model_for(blue), ato_model=self.game_model.ato_model_for(blue),
) )
) )

View File

@@ -167,7 +167,7 @@ class QHangarStatus(QHBoxLayout):
next_turn = self.control_point.allocated_aircraft(self.game_model.game) next_turn = self.control_point.allocated_aircraft(self.game_model.game)
max_amount = self.control_point.total_aircraft_parking max_amount = self.control_point.total_aircraft_parking
components = [f"{next_turn.present} present"] components = [f"{next_turn.total_present} present"]
if next_turn.total_ordered > 0: if next_turn.total_ordered > 0:
components.append(f"{next_turn.total_ordered} purchased") components.append(f"{next_turn.total_ordered} purchased")
elif next_turn.total_ordered < 0: elif next_turn.total_ordered < 0:

View File

@@ -90,7 +90,7 @@ class PilotControls(QHBoxLayout):
self.selector.currentIndexChanged.connect(self.on_pilot_changed) self.selector.currentIndexChanged.connect(self.on_pilot_changed)
self.addWidget(self.selector) self.addWidget(self.selector)
self.player_checkbox = QCheckBox() self.player_checkbox = QCheckBox(text="Player")
self.player_checkbox.setToolTip("Checked if this pilot is a player.") self.player_checkbox.setToolTip("Checked if this pilot is a player.")
self.on_pilot_changed(self.selector.currentIndex()) self.on_pilot_changed(self.selector.currentIndex())
self.addWidget(self.player_checkbox) self.addWidget(self.player_checkbox)
@@ -123,6 +123,7 @@ class PilotControls(QHBoxLayout):
def enable_and_reset(self) -> None: def enable_and_reset(self) -> None:
self.selector.rebuild() self.selector.rebuild()
self.player_checkbox.setEnabled(True)
self.on_pilot_changed(self.selector.currentIndex()) self.on_pilot_changed(self.selector.currentIndex())
def disable_and_clear(self) -> None: def disable_and_clear(self) -> None:

View File

@@ -8,7 +8,7 @@ from typing import Any, Dict, List, Union, Tuple
import packaging.version import packaging.version
from PySide2 import QtGui from PySide2 import QtGui
from PySide2.QtCore import QItemSelectionModel from PySide2.QtCore import QItemSelectionModel, QModelIndex, Qt
from PySide2.QtGui import QStandardItem, QStandardItemModel from PySide2.QtGui import QStandardItem, QStandardItemModel
from PySide2.QtWidgets import QAbstractItemView, QListView from PySide2.QtWidgets import QAbstractItemView, QListView
@@ -116,6 +116,7 @@ def load_campaigns() -> List[Campaign]:
class QCampaignItem(QStandardItem): class QCampaignItem(QStandardItem):
def __init__(self, campaign: Campaign) -> None: def __init__(self, campaign: Campaign) -> None:
super(QCampaignItem, self).__init__() super(QCampaignItem, self).__init__()
self.setData(campaign, QCampaignList.CampaignRole)
self.setIcon(QtGui.QIcon(CONST.ICONS[campaign.icon_name])) self.setIcon(QtGui.QIcon(CONST.ICONS[campaign.icon_name]))
self.setEditable(False) self.setEditable(False)
if campaign.is_compatible: if campaign.is_compatible:
@@ -126,31 +127,33 @@ class QCampaignItem(QStandardItem):
class QCampaignList(QListView): class QCampaignList(QListView):
def __init__(self, campaigns: List[Campaign]) -> None: CampaignRole = Qt.UserRole
def __init__(self, campaigns: list[Campaign], show_incompatible: bool) -> None:
super(QCampaignList, self).__init__() super(QCampaignList, self).__init__()
self.model = QStandardItemModel(self) self.campaign_model = QStandardItemModel(self)
self.setModel(self.model) self.setModel(self.campaign_model)
self.setMinimumWidth(250) self.setMinimumWidth(250)
self.setMinimumHeight(350) self.setMinimumHeight(350)
self.campaigns = [] self.campaigns = campaigns
self.setSelectionBehavior(QAbstractItemView.SelectItems) self.setSelectionBehavior(QAbstractItemView.SelectItems)
self.setup_content(campaigns) self.setup_content(show_incompatible)
def setup_content(self, campaigns: List[Campaign]) -> None: @property
for campaign in campaigns: def selected_campaign(self) -> Campaign:
self.campaigns.append(campaign) return self.currentIndex().data(QCampaignList.CampaignRole)
item = QCampaignItem(campaign)
self.model.appendRow(item)
self.setSelectedCampaign(0)
self.repaint()
def setSelectedCampaign(self, row): def setup_content(self, show_incompatible: bool) -> None:
self.selectionModel().clearSelection() self.selectionModel().blockSignals(True)
index = self.model.index(row, 0) try:
if not index.isValid(): self.campaign_model.clear()
index = self.model.index(0, 0) for campaign in self.campaigns:
self.selectionModel().setCurrentIndex(index, QItemSelectionModel.Select) if show_incompatible or campaign.is_compatible:
self.repaint() item = QCampaignItem(campaign)
self.campaign_model.appendRow(item)
finally:
self.selectionModel().blockSignals(False)
def clear_layout(self): self.selectionModel().setCurrentIndex(
self.model.removeRows(0, self.model.rowCount()) self.campaign_model.index(0, 0, QModelIndex()), QItemSelectionModel.Select
)

View File

@@ -6,7 +6,7 @@ from typing import List
from PySide2 import QtGui, QtWidgets from PySide2 import QtGui, QtWidgets
from PySide2.QtCore import QItemSelectionModel, QPoint, Qt, QDate from PySide2.QtCore import QItemSelectionModel, QPoint, Qt, QDate
from PySide2.QtWidgets import QVBoxLayout, QTextEdit, QLabel from PySide2.QtWidgets import QVBoxLayout, QTextEdit, QLabel, QCheckBox
from jinja2 import Environment, FileSystemLoader, select_autoescape from jinja2 import Environment, FileSystemLoader, select_autoescape
from game import db from game import db
@@ -319,7 +319,16 @@ class TheaterConfiguration(QtWidgets.QWizardPage):
) )
# List of campaigns # List of campaigns
campaignList = QCampaignList(campaigns) show_incompatible_campaigns_checkbox = QCheckBox(
text="Show incompatible campaigns"
)
show_incompatible_campaigns_checkbox.setChecked(False)
campaignList = QCampaignList(
campaigns, show_incompatible_campaigns_checkbox.isChecked()
)
show_incompatible_campaigns_checkbox.toggled.connect(
lambda checked: campaignList.setup_content(show_incompatible=checked)
)
self.registerField("selectedCampaign", campaignList) self.registerField("selectedCampaign", campaignList)
# Faction description # Faction description
@@ -380,8 +389,7 @@ class TheaterConfiguration(QtWidgets.QWizardPage):
template_perf = jinja_env.get_template( template_perf = jinja_env.get_template(
"campaign_performance_template_EN.j2" "campaign_performance_template_EN.j2"
) )
index = campaignList.selectionModel().currentIndex().row() campaign = campaignList.selected_campaign
campaign = campaignList.campaigns[index]
self.setField("selectedCampaign", campaign) self.setField("selectedCampaign", campaign)
self.campaignMapDescription.setText(template.render({"campaign": campaign})) self.campaignMapDescription.setText(template.render({"campaign": campaign}))
self.faction_selection.setDefaultFactions(campaign) self.faction_selection.setDefaultFactions(campaign)
@@ -396,9 +404,12 @@ class TheaterConfiguration(QtWidgets.QWizardPage):
campaignList.selectionModel().selectionChanged.connect(on_campaign_selected) campaignList.selectionModel().selectionChanged.connect(on_campaign_selected)
on_campaign_selected() on_campaign_selected()
# Docs Link
docsText = QtWidgets.QLabel( docsText = QtWidgets.QLabel(
'<a href="https://github.com/dcs-liberation/dcs_liberation/wiki/Custom-Campaigns"><span style="color:#FFFFFF;">How to create your own theater</span></a>' "<p>Want more campaigns? You can "
'<a href="https://github.com/dcs-liberation/dcs_liberation/wiki/Campaign-maintenance"><span style="color:#FFFFFF;">offer to help</span></a>, '
'<a href="https://github.com/dcs-liberation/dcs_liberation/wiki/Community-campaigns"><span style="color:#FFFFFF;">play a community campaign</span></a>, '
'or <a href="https://github.com/dcs-liberation/dcs_liberation/wiki/Custom-Campaigns"><span style="color:#FFFFFF;">create your own</span></a>.'
"</p>"
) )
docsText.setAlignment(Qt.AlignCenter) docsText.setAlignment(Qt.AlignCenter)
docsText.setOpenExternalLinks(True) docsText.setOpenExternalLinks(True)
@@ -418,7 +429,8 @@ class TheaterConfiguration(QtWidgets.QWizardPage):
layout = QtWidgets.QGridLayout() layout = QtWidgets.QGridLayout()
layout.setColumnMinimumWidth(0, 20) layout.setColumnMinimumWidth(0, 20)
layout.addWidget(campaignList, 0, 0, 5, 1) layout.addWidget(campaignList, 0, 0, 5, 1)
layout.addWidget(docsText, 5, 0, 1, 1) layout.addWidget(show_incompatible_campaigns_checkbox, 5, 0, 1, 1)
layout.addWidget(docsText, 6, 0, 1, 1)
layout.addWidget(self.campaignMapDescription, 0, 1, 1, 1) layout.addWidget(self.campaignMapDescription, 0, 1, 1, 1)
layout.addWidget(self.performanceText, 1, 1, 1, 1) layout.addWidget(self.performanceText, 1, 1, 1, 1)
layout.addWidget(mapSettingsGroup, 2, 1, 1, 1) layout.addWidget(mapSettingsGroup, 2, 1, 1, 1)

View File

@@ -17,7 +17,7 @@ nodeenv==1.5.0
packaging==20.9 packaging==20.9
pathspec==0.8.1 pathspec==0.8.1
pefile==2019.4.18 pefile==2019.4.18
Pillow==8.1.1 Pillow==8.2.0
pre-commit==2.10.1 pre-commit==2.10.1
pyinstaller==4.3 pyinstaller==4.3
pyinstaller-hooks-contrib==2021.1 pyinstaller-hooks-contrib==2021.1

View File

@@ -0,0 +1,11 @@
{
"name": "Caucasus - Full",
"theater": "Caucasus",
"authors": "Doc_of_Mur",
"recommended_player_faction": "Bluefor Modern",
"recommended_enemy_faction": "Russia 2010",
"description": "<p>This is a complete map of every airbase in the Caucasus Region, all bases are fully defended by Air, Land and/or Sea. The player starts by invading southern Georgia and works their way through Russia. The Strike and SAM targets are limited for performance reasons. If this Scenario is too taxing for your computer you may use the Multi-Part Scenarios. They are copied from this Campaign and are catered toward less powerful machines.</p>",
"version": "6.0",
"miz": "Caucasus_Multi_Full.miz",
"performance": 3
}

Binary file not shown.

View File

@@ -0,0 +1,11 @@
{
"name": "Caucasus - Multi-Part Georgia",
"theater": "Caucasus",
"authors": "Doc_of_Mur",
"recommended_player_faction": "Bluefor Modern",
"recommended_enemy_faction": "Georgia 2008",
"description": "<p>This is Part 1 of the Caucasus Multi-Part Campaign. This is the invasion of Georgia starting from the southwest (Batumi) and ending in both Gudauta and Tiblisi. This is a straightforward campaign that is smaller and simpler than most. However, it acts great as either a stand alone campaign for beginners, or as a lead into the Caucasus Multi-Part Russia campaign.</p>",
"version": "6.0",
"miz": "Caucasus_Multi_Georgia.miz",
"performance": 1
}

Binary file not shown.

View File

@@ -0,0 +1,11 @@
{
"name": "Caucasus - Multi-Part Russia",
"theater": "Caucasus",
"authors": "Doc_of_Mur",
"recommended_player_faction": "Bluefor Modern",
"recommended_enemy_faction": "Russia 2010",
"description": "<p>This is part 2 of the Caucasus Multi-part campaign. After completing Multi-Part Georgia, play this campaign to invade Russia and finish the theater. As this is now Russia the recommended enemy faction has changed. To simulate still owning Georgia the player income has been supplemented through an increased number of blue strike targets at the starting bases. This is a more difficult scenario with a higher concentration of Redfor SAMs and Strike targets than usual.</p>",
"version": "6.0",
"miz": "Caucasus_Multi_Russia.miz",
"performance": 2
}

Binary file not shown.

View File

@@ -0,0 +1,11 @@
{
"name": "Syria - First Lebanon War",
"theater": "Syria",
"authors": "Mustang25",
"recommended_player_faction": "Israel 1982",
"recommended_enemy_faction": "Syria 1982",
"description": "<p> 1100HRS, 06 June 1982: H-hour for Operation Peace for Galilee. </p><p>Objective: Push North towards Beirut and into the Bekaa Valley, eliminating or displacing any PLO and Syrian resistance. Airbases and their surrounding infrastructure in Syria are not the main objective but are still viable strategic targets.</p> <p>Background: Years of PLO encroachment into the UN neutral zone and their resulting terror attacks against Israelis have pushed tension along the border to a breaking point. On June 3, the attempted assassination of Israeli Ambassador, Shlomo Argov by gunmen with ties to the PLO have finally pushed the Israelis to action.</p><p>Recommended Starting Budget:</p><p>$1500m for recommended factions, $$2000m for modern scenarios</p><p>Income Multiplier:</p><p>Blue: 1.0x</p><p>Red: 0.7x-1.0x</p>",
"miz": "First_Lebanon_War_v3.0.2.miz",
"version": "6.0",
"performance": 2
}

Binary file not shown.

View File

@@ -0,0 +1,11 @@
{
"name": "Persian Gulf - Road To Dubai",
"theater": "Persian Gulf",
"authors": "Doc_of_Mur",
"description": "<p>Small beginner friendly map</p><p><strong>Note:</strong> This scenario is based around Iran invading the UAE and you are trying to take it back. It is small and beginner friendly.</p>",
"version": "6.0",
"recommended_player_faction": "USA 2005",
"recommended_enemy_faction": "Iran 2015",
"miz": "Road_to_Dubai.miz",
"performance": 1
}

Binary file not shown.

View File

@@ -0,0 +1,11 @@
{
"name": "Caucasus - Around The Mountain",
"theater": "Caucasus",
"authors": "Dillie",
"recommended_player_faction": "Russia 2010",
"recommended_enemy_faction": "USA 1990",
"description": "<p>Scenario from Russia to Georgia in two Frontlines.</p>",
"version": "6.0",
"miz": "around_the_mountain.miz",
"performance": 2
}

Binary file not shown.

View File

@@ -1,10 +0,0 @@
{
"name": "The Channel - Battle of Britain",
"theater": "The Channel",
"authors": "Khopa",
"recommended_player_faction": "United Kingdom 1944",
"recommended_enemy_faction": "Germany 1942",
"description": "<p>Experience the Battle of Britain on the Channel map !<br/></p><p><strong>Note:</strong> It is not possible to cross the channel to capture enemy bases yet, but you can consider you won if you manage to destroy all the ennemy targets</p>",
"miz": "battle_of_britain.miz",
"performance": 1
}

View File

@@ -1,8 +0,0 @@
{
"name": "Caucasus - Black Sea Lite",
"theater": "Caucasus",
"authors": "Starfire",
"description": "<p>A Small sized theater with bases along the coast of the Black Sea, lite version of ColonelPanic's Black Sea campaign scenario.</p>",
"miz": "black_sea_lite.miz",
"performance": 1
}

View File

@@ -0,0 +1,11 @@
{
"name": "Normandy - From Caen to Evreux",
"theater": "Normandy",
"authors": "Khopa",
"recommended_player_faction": "Allies 1944",
"recommended_enemy_faction": "Germany 1944",
"description": "<p>This is a light scenario on the Normandy map.</p><p>August 1944, allied forces are pushing from Caen/Carpiquet to the cities of Lisieux and Evreux.<p>Lisieux is an important logistic hub for the Werhmacht, and Evreux airbase is hosting most of the Luftwaffe forces in the region.</p>",
"miz": "caen_to_evreux.miz",
"performance": 1,
"version": "6.0"
}

Binary file not shown.

View File

@@ -1,10 +0,0 @@
{
"name": "Persian Gulf - Desert War",
"theater": "Persian Gulf",
"authors": "Khopa",
"recommended_player_faction": "USA 2005",
"recommended_enemy_faction": "Iran 2015",
"description": "<p>This is a simple scenario in the Desert near Dubai and Abu-Dhabi. Progress from Liwa airbase to Al-Minhad.</p><p>This scenario shouldn't require too much performance.</p>",
"miz": "desert_war.miz",
"performance": 1
}

Binary file not shown.

View File

@@ -1,10 +0,0 @@
{
"name": "The Channel - Dunkirk",
"theater": "The Channel",
"authors": "Khopa",
"recommended_player_faction": "Allies 1944",
"recommended_enemy_faction": "Germany 1942",
"description": "<p>In this scenario, your forces starts in Dunkirk and can be supported by the airfields on the other side of the Channel.</p><p>If you select the inverted configuration, you can play a German invasion of England.</p><p><strong>Note:</strong> B-17 should be operated from Manston airfield</p>",
"miz": "dunkirk.miz",
"performance": 1
}

Binary file not shown.

View File

@@ -1,10 +0,0 @@
{
"name": "Persian Gulf - Emirates",
"theater": "Persian Gulf",
"authors": "Khopa",
"recommended_player_faction": "USA 2005",
"recommended_enemy_faction": "Iran 2015",
"description": "<p>In this scenario, you can play an invasion of the Emirates and Oman, where your forces starts in Fujairah.</p><p><strong>Note:</strong> Fujairah airfield has very few slots for aircrafts, so it recommended to operate from carriers at the start of the campaign. Thus, a carrier-capable faction is recommended.</p>",
"miz": "emirates.miz",
"performance": 1
}

Binary file not shown.

View File

@@ -1,8 +0,0 @@
{
"name": "Caucasus - Full Map",
"theater": "Caucasus",
"authors": "george",
"description": "<p>Full map of the Caucasus</p><p><strong>Note:</strong> This scenario is heavy on performance, enabling \"culling\" in settings is highly recommended.</p>",
"miz": "full_caucasus.miz",
"performance": 3
}

View File

@@ -0,0 +1,11 @@
{
"name": "Syria - Humble Helper",
"theater": "Syria",
"authors": "Headiii",
"recommended_player_faction": "Israel 2012'ish",
"recommended_enemy_faction": "Syria 2012'ish",
"description": "<p>In this scenario, you start in Israel in an high intensity conflict with Syria, backed by a Russian Expeditiary Force. Your goal is to take the heavily fortified city of Damascus, as fast as you can. The longer you wait, the more resources the enemy can pump into the defense of the city or even might try to take chunks of Israel. ATTENTION: CAMPAIGN INVERTING IS NOT YET IMPLEMENTED!!! Feedback: @Headiii in the DCSLiberation Discord</p>",
"miz": "humble_helper.miz",
"performance": 1,
"version": "6.0"
}

Binary file not shown.

View File

@@ -1,10 +0,0 @@
{
"name": "Syria - Invasion from Turkey",
"theater": "Syria",
"authors": "Khopa",
"recommended_player_faction": "Turkey 2005",
"recommended_enemy_faction": "Insurgents (Hard)",
"description": "<p>In this scenario, you start from Turkey and have to invade territories in northern Syria.</p>",
"miz": "invasion_from_turkey.miz",
"performance": 1
}

View File

@@ -1,10 +0,0 @@
{
"name": "Persian Gulf - Invasion of Iran",
"theater": "Persian Gulf",
"authors": "Khopa",
"recommended_player_faction": "USA 2005",
"recommended_enemy_faction": "Iran 2015",
"description": "<p>In this scenario, you start in Bandar Abbas, and must invade Iran.</p>",
"miz": "invasion_of_iran.miz",
"performance": 3
}

View File

@@ -1,10 +0,0 @@
{
"name": "Persian Gulf - Invasion of Iran [Lite]",
"theater": "Persian Gulf",
"authors": "Khopa",
"recommended_player_faction": "USA 2005",
"recommended_enemy_faction": "Iran 2015",
"description": "<p>This is lighter version of the invasion of Iran scenario.</p>",
"miz": "invasion_of_iran_lite.miz",
"performance": 1
}

View File

@@ -1,10 +0,0 @@
{
"name": "Normandy - Normandy",
"theater": "Normandy",
"authors": "Khopa",
"recommended_player_faction": "Allies 1944",
"recommended_enemy_faction": "Germany 1944",
"description": "<p>Normandy 1944 D-Day scenario.</p>",
"miz":"normandy.miz",
"performance": 3
}

Binary file not shown.

View File

@@ -1,10 +0,0 @@
{
"name": "Normandy - Normandy Small",
"theater": "Normandy",
"authors": "Khopa",
"recommended_player_faction": "Allies 1944",
"recommended_enemy_faction": "Germany 1944",
"description": "<p>A lighter version of the Normandy 1944 D-Day scenario.</p>",
"miz": "normandy_small.miz",
"performance": 2
}

View File

@@ -0,0 +1,11 @@
{
"name": "Caucasus - Northern Russia",
"theater": "Caucasus",
"authors": "Plob",
"recommended_player_faction": "USA 2005",
"recommended_enemy_faction": "Russia 1990",
"description": "<p>A medium campaign through the north eastern part of the Caucasus map.</p><p>Russia has invaded Georgia through the eastern mountains. Mount a counter offense and push them back!",
"miz": "northern_russia.miz",
"performance": 2,
"version": "6.0"
}

Binary file not shown.

View File

@@ -0,0 +1,11 @@
{
"name": "Syria - Operation Allied Sword",
"theater": "Syria",
"authors": "Fuzzle",
"recommended_player_faction": "Israel-USN 2005 (Allied Sword)",
"recommended_enemy_faction": "Syria-Lebanon 2005 (Allied Sword)",
"description": "<p>In this fictional scenario, a US/Israeli coalition must push north from the Israeli border, through Syria and Lebanon to Aleppo.</p><p><strong>Backstory:</strong> A Syrian-Lebanese joint force (with Russian materiel support) has attacked Israel, attmepting to cross the northern border. With the arrival of a US carrier group, Israel prepares its counterattack. The US Navy will handle the Beirut region's coastal arena, while the IAF will push through Damascus and the inland mountain ranges.</p>",
"version": "6.0",
"miz": "operation_allied_sword.miz",
"performance": 2
}

Binary file not shown.

View File

@@ -1,11 +0,0 @@
{
"name": "The Channel - Operation Dynamo",
"theater": "The Channel",
"authors": "Khopa",
"recommended_player_faction": "Allies 1940",
"recommended_enemy_faction": "Germany 1940",
"description": "<p>The Battle of Dunkirk (French: Bataille de Dunkerque) was fought around the French port of Dunkirk (Dunkerque) during the Second World War, between the Allies and Nazi Germany. As the Allies were losing the Battle of France on the Western Front, the Battle of Dunkirk was the defence and evacuation of British and other Allied forces to Britain from 26 May to 4 June 1940..</p>",
"version": 4.2,
"miz": "operation_dynamo.miz",
"performance": 1
}

View File

@@ -1,8 +0,0 @@
{
"name": "Persian Gulf - Full Map",
"theater": "Persian Gulf",
"authors": "Plob",
"description": "<p>Full map of the Persian Gulf</p><p><strong>Note:</strong> This scenario is heavy on performance, enabling \"culling\" in settings is highly recommended.</p>",
"miz": "persian_gulf_full_map.miz",
"performance": 3
}

View File

@@ -1,10 +0,0 @@
{
"name": "Syria - Syrian Civil War",
"theater": "Syria",
"authors": "Khopa",
"recommended_player_faction": "Russia 2010",
"recommended_enemy_faction": "Insurgents (Hard)",
"description": "<p>This scenario can be used to simulate parts of the Syrian Civil War.<br/><br/>You start on the coast with an airbase in Latakia, and ground forces in Tartus.<br/><br/>This scenario can also be used to simulate a western invasion of Syria.<br/><br/>In inverted configuration you start in Aleppo.</p>",
"miz": "syrian_civil_war.miz",
"performance": 2
}

View File

@@ -0,0 +1,54 @@
local unitPayloads = {
["name"] = "JAS39Gripen",
["payloads"] = {
[1] = {
["displayName"] = "CAP",
["name"] = "CAP",
["pylons"] = {
[1] = {
["CLSID"] = "JAS_IRIS-T",
["num"] = 10,
},
[2] = {
["CLSID"] = "JAS_IRIS-T",
["num"] = 1,
},
[3] = {
["CLSID"] = "JAS_Meteor",
["num"] = 2,
},
[4] = {
["CLSID"] = "JAS_Meteor",
["num"] = 9,
},
[5] = {
["CLSID"] = "JAS_Meteor",
["num"] = 8,
},
[6] = {
["CLSID"] = "JAS_Meteor",
["num"] = 3,
},
[7] = {
["CLSID"] = "JAS_TANK1100",
["num"] = 5,
},
[8] = {
["CLSID"] = "{44EE8698-89F9-48EE-AF36-5FD31896A82F}",
["num"] = 6,
},
[9] = {
["CLSID"] = "{0519A264-0AB6-11d6-9193-00A0249B6F00}",
["num"] = 4,
},
},
["tasks"] = {
[1] = 11,
},
},
},
["tasks"] = {
},
["unitType"] = "JAS39Gripen",
}
return unitPayloads

View File

@@ -0,0 +1,291 @@
local unitPayloads = {
["name"] = "JAS39Gripen_AG",
["payloads"] = {
[1] = {
["displayName"] = "ANTISHIP",
["name"] = "ANTISHIP",
["pylons"] = {
[1] = {
["CLSID"] = "JAS_IRIS-T",
["num"] = 10,
},
[2] = {
["CLSID"] = "JAS_IRIS-T",
["num"] = 1,
},
[3] = {
["CLSID"] = "JAS_TANK1100",
["num"] = 5,
},
[4] = {
["CLSID"] = "{0519A264-0AB6-11d6-9193-00A0249B6F00}",
["num"] = 4,
},
[5] = {
["CLSID"] = "{44EE8698-89F9-48EE-AF36-5FD31896A82F}",
["num"] = 6,
},
[6] = {
["CLSID"] = "JAS_RB15F",
["num"] = 3,
},
[7] = {
["CLSID"] = "JAS_RB15F",
["num"] = 8,
},
[8] = {
["CLSID"] = "JAS_RB15F",
["num"] = 2,
},
[9] = {
["CLSID"] = "JAS_RB15F",
["num"] = 9,
},
},
["tasks"] = {
[1] = 19,
},
},
[2] = {
["displayName"] = "SEAD",
["name"] = "SEAD",
["pylons"] = {
[1] = {
["CLSID"] = "JAS_IRIS-T",
["num"] = 10,
},
[2] = {
["CLSID"] = "JAS_IRIS-T",
["num"] = 1,
},
[3] = {
["CLSID"] = "JAS_TANK1100",
["num"] = 5,
},
[4] = {
["CLSID"] = "{0519A264-0AB6-11d6-9193-00A0249B6F00}",
["num"] = 4,
},
[5] = {
["CLSID"] = "{44EE8698-89F9-48EE-AF36-5FD31896A82F}",
["num"] = 6,
},
[6] = {
["CLSID"] = "JAS_MAR-1",
["num"] = 3,
},
[7] = {
["CLSID"] = "JAS_MAR-1",
["num"] = 8,
},
[8] = {
["CLSID"] = "JAS_MAR-1",
["num"] = 2,
},
[9] = {
["CLSID"] = "JAS_MAR-1",
["num"] = 9,
},
},
["tasks"] = {
[1] = 19,
},
},
[3] = {
["displayName"] = "DEAD",
["name"] = "DEAD",
["pylons"] = {
[1] = {
["CLSID"] = "JAS_IRIS-T",
["num"] = 10,
},
[2] = {
["CLSID"] = "JAS_IRIS-T",
["num"] = 1,
},
[3] = {
["CLSID"] = "JAS_TANK1100",
["num"] = 5,
},
[4] = {
["CLSID"] = "{0519A264-0AB6-11d6-9193-00A0249B6F00}",
["num"] = 4,
},
[5] = {
["CLSID"] = "{44EE8698-89F9-48EE-AF36-5FD31896A82F}",
["num"] = 6,
},
[6] = {
["CLSID"] = "JAS_Stormshadow",
["num"] = 3,
},
[7] = {
["CLSID"] = "JAS_Stormshadow",
["num"] = 8,
},
[8] = {
["CLSID"] = "JAS_MAR-1",
["num"] = 2,
},
[9] = {
["CLSID"] = "JAS_MAR-1",
["num"] = 9,
},
},
["tasks"] = {
[1] = 19,
},
},
[4] = {
["displayName"] = "CAS",
["name"] = "CAS",
["pylons"] = {
[1] = {
["CLSID"] = "JAS_IRIS-T",
["num"] = 10,
},
[2] = {
["CLSID"] = "JAS_IRIS-T",
["num"] = 1,
},
[3] = {
["CLSID"] = "JAS_TANK1100",
["num"] = 5,
},
[4] = {
["CLSID"] = "{0519A264-0AB6-11d6-9193-00A0249B6F00}",
["num"] = 4,
},
[5] = {
["CLSID"] = "{44EE8698-89F9-48EE-AF36-5FD31896A82F}",
["num"] = 6,
},
[6] = {
["CLSID"] = "JAS_BRIMSTONE",
["num"] = 3,
},
[7] = {
["CLSID"] = "JAS_BRIMSTONE",
["num"] = 8,
},
[8] = {
["CLSID"] = "JAS_BRIMSTONE",
["num"] = 2,
},
[9] = {
["CLSID"] = "JAS_BRIMSTONE",
["num"] = 9,
},
[10] = {
["CLSID"] = "JAS_Litening",
["num"] = 7,
},
},
["tasks"] = {
[1] = 19,
},
},
[5] = {
["displayName"] = "STRIKE",
["name"] = "STRIKE",
["pylons"] = {
[1] = {
["CLSID"] = "JAS_IRIS-T",
["num"] = 10,
},
[2] = {
["CLSID"] = "JAS_IRIS-T",
["num"] = 1,
},
[3] = {
["CLSID"] = "JAS_TANK1100",
["num"] = 5,
},
[4] = {
["CLSID"] = "{0519A264-0AB6-11d6-9193-00A0249B6F00}",
["num"] = 4,
},
[5] = {
["CLSID"] = "{44EE8698-89F9-48EE-AF36-5FD31896A82F}",
["num"] = 6,
},
[6] = {
["CLSID"] = "JAS_GBU31",
["num"] = 3,
},
[7] = {
["CLSID"] = "JAS_GBU31",
["num"] = 8,
},
[8] = {
["CLSID"] = "JAS_GBU49_TV",
["num"] = 2,
},
[9] = {
["CLSID"] = "JAS_GBU49_TV",
["num"] = 9,
},
[10] = {
["CLSID"] = "JAS_Litening",
["num"] = 7,
},
},
["tasks"] = {
[1] = 19,
},
},
[6] = {
["displayName"] = "OCA",
["name"] = "OCA",
["pylons"] = {
[1] = {
["CLSID"] = "JAS_IRIS-T",
["num"] = 10,
},
[2] = {
["CLSID"] = "JAS_IRIS-T",
["num"] = 1,
},
[3] = {
["CLSID"] = "JAS_TANK1100",
["num"] = 5,
},
[4] = {
["CLSID"] = "{0519A264-0AB6-11d6-9193-00A0249B6F00}",
["num"] = 4,
},
[5] = {
["CLSID"] = "{44EE8698-89F9-48EE-AF36-5FD31896A82F}",
["num"] = 6,
},
[6] = {
["CLSID"] = "JAS_BK90",
["num"] = 3,
},
[7] = {
["CLSID"] = "JAS_BK90",
["num"] = 8,
},
[8] = {
["CLSID"] = "JAS_ARAKM70BHE",
["num"] = 2,
},
[9] = {
["CLSID"] = "JAS_ARAKM70BHE",
["num"] = 9,
},
[10] = {
["CLSID"] = "JAS_Litening",
["num"] = 7,
},
},
["tasks"] = {
[1] = 19,
},
},
},
["tasks"] = {
},
["unitType"] = "JAS39Gripen_AG",
}
return unitPayloads

View File

@@ -0,0 +1,109 @@
{
"country": "Israel",
"name": "Israel-USN 2005 (Allied Sword)",
"authors": "Fuzzle",
"description": "<p>A joint US Navy/Israeli modern faction for use with the Operation Allied Sword scenario.</p>",
"aircrafts": [
"F_4E",
"F_15C",
"F_15E",
"F_16C_50",
"F_14B",
"FA_18C_hornet",
"AV8BNA",
"AH_1W",
"AH_64D",
"S_3B",
"SH_60B",
"UH_1H"
],
"awacs": [
"E_2C"
],
"tankers": [
"KC_135",
"KC130",
"S_3B_Tanker"
],
"frontline_units": [
"APC_M113",
"APC_HMMWV__Scout",
"ATGM_HMMWV",
"MBT_Merkava_IV",
"SPAAA_Vulcan_M163"
],
"artillery_units": [
"SPH_M109_Paladin_155mm",
"MLRS_M270_227mm"
],
"logistics_units": [
"Truck_M818_6x6"
],
"infantry_units": [
"Infantry_M4",
"Infantry_M249",
"MANPADS_Stinger"
],
"air_defenses": [
"ChaparralGenerator",
"HawkGenerator",
"VulcanGenerator",
"PatriotGenerator"
],
"ewrs": [
"HawkEwrGenerator"
],
"aircraft_carrier": [
"CVN_74_John_C__Stennis"
],
"helicopter_carrier": [
"LHA_1_Tarawa"
],
"destroyers": [
"DDG_Arleigh_Burke_IIa"
],
"cruisers": [
"CG_Ticonderoga"
],
"requirements": {
},
"carrier_names": [
"CVN-71 Theodore Roosevelt",
"CVN-72 Abraham Lincoln",
"CVN-73 George Washington",
"CVN-74 John C. Stennis",
"CVN-75 Harry S. Truman"
],
"helicopter_carrier_names": [
"LHA-1 Tarawa",
"LHA-2 Saipan",
"LHA-3 Belleau Wood",
"LHA-4 Nassau",
"LHA-5 Peleliu"
],
"navy_generators": [
"ArleighBurkeGroupGenerator",
"OliverHazardPerryGroupGenerator"
],
"has_jtac": true,
"jtac_unit": "MQ_9_Reaper",
"doctrine": "modern",
"liveries_overrides": {
"F_14B": [
"VF-142 Ghostriders"
],
"FA_18C_hornet": [
"VMFA-251 high visibility"
],
"AV8BNA": [
"VMAT-542"
],
"AH_1W": [
"Marines"
],
"UH_1H": [
"US NAVY"
]
}
}

View File

@@ -0,0 +1,105 @@
{
"country": "Combined Joint Task Forces Red",
"name": "Syria-Lebanon 2005 (Allied Sword)",
"authors": "Fuzzle",
"description": "<p>Syria-Lebanon alliance in a modern setting with several imported Russian assets. Designed for use with the Allied Sword scenario.</p>",
"aircrafts": [
"MiG_23MLD",
"MiG_25PD",
"MiG_29S",
"Su_17M4",
"Su_24M",
"Su_30",
"Su_34",
"L_39ZA",
"Tu_22M3",
"Mi_24V",
"Mi_8MT",
"SA342M",
"SA342L"
],
"awacs": [
"A_50"
],
"tankers": [
"IL_78M"
],
"frontline_units": [
"IFV_BMP_1",
"IFV_BMP_2",
"APC_BTR_80",
"IFV_BRDM_2",
"APC_MTLB",
"APC_Cobra__Scout",
"MBT_T_55",
"MBT_T_72B",
"MBT_T_90",
"SPAAA_ZSU_57_2"
],
"artillery_units": [
"MLRS_BM_27_Uragan_220mm",
"SPH_2S9_Nona_120mm_M",
"MLRS_BM_21_Grad_122mm",
"SPH_2S1_Gvozdika_122mm"
],
"logistics_units": [
"Truck_Ural_375",
"LUV_UAZ_469_Jeep"
],
"infantry_units": [
"Paratrooper_AKS",
"Infantry_AK_74_Rus",
"Paratrooper_RPG_16",
"MANPADS_SA_18_Igla_S_Grouse"
],
"air_defenses": [
"ColdWarFlakGenerator",
"SA2Generator",
"SA3Generator",
"SA6Generator",
"SA8Generator",
"SA9Generator",
"SA10Generator",
"SA11Generator",
"SA13Generator",
"SA19Generator",
"ZSU23Generator",
"ZU23Generator",
"ZU23UralGenerator",
"ZSU57Generator"
],
"ewrs": [
"BoxSpringGenerator",
"TallRackGenerator"
],
"missiles": [
"ScudGenerator"
],
"missiles_group_count": 2,
"coastal_defenses": [
"SilkwormGenerator"
],
"coastal_group_count": 4,
"aircraft_carrier": [
],
"helicopter_carrier": [
],
"helicopter_carrier_names": [
],
"destroyers": [
"Frigate_1135M_Rezky",
"Corvette_1241_1_Molniya"
],
"cruisers": [
],
"requirements": {},
"carrier_names": [
],
"coastal_group_count": 8,
"navy_generators": [
"GrishaGroupGenerator",
"MolniyaGroupGenerator",
"RussianNavyGroupGenerator",
"LaCombattanteIIGroupGenerator"
]
}

View File

@@ -0,0 +1,100 @@
{
"country": "Israel",
"name": "Israel 2012'ish",
"authors": "Headiii",
"description": "<p>A more modern Israeli faction with fictional Imports.</p>",
"locales": ["he_IL"],
"aircrafts": [
"A_10C",
"F_15C",
"F_15E",
"F_16C_50",
"FA_18C_hornet",
"M_2000C",
"UH_1H",
"AH_64D"
],
"awacs": [
"E_2C"
],
"tankers": [
"KC_135",
"KC130"
],
"frontline_units": [
"APC_M113",
"Scout_HMMWV",
"ATGM_HMMWV",
"MBT_Merkava_IV",
"SPAAA_Vulcan_M163"
],
"artillery_units": [
"SPH_M109_Paladin_155mm",
"MLRS_M270_227mm"
],
"logistics_units": [
"Truck_M818_6x6"
],
"infantry_units": [
"Infantry_M4",
"Infantry_M249",
"MANPADS_Stinger"
],
"air_defenses": [
"ChaparralGenerator",
"HawkGenerator",
"PatriotGenerator",
"VulcanGenerator"
],
"ewrs": [
"HawkEwrGenerator"
],
"aircraft_carrier": [
],
"helicopter_carrier": [
],
"destroyers": [
],
"cruisers": [
],
"requirements": {
},
"carrier_names": [
],
"helicopter_carrier_names": [
],
"navy_generators": [
"ArleighBurkeGroupGenerator"
],
"has_jtac": true,
"jtac_unit": "MQ_9_Reaper",
"liveries_overrides": {
"A_10C": [
"Fictional Israel 115 Sqn Flying Dragon"
],
"F_15C": [
"390th Fighter SQN"
],
"F_15E":[
"IDF No 69 Hammers Squadron"
],
"F_16C_50": [
"IAF_101st_squadron",
"IAF_110th_Squadron",
"IAF_115th_Aggressors_Squadron",
"IAF_117th_Squadron"
],
"UH_1H": [
"Israel Army"
],
"AH_64D":[
"ah-64_d_isr"
],
"FA_18C_hornet": [
"Fictional Israel Air Force"
],
"M_2000C": [
"UAE Air Force"
]
}
}

View File

@@ -0,0 +1,51 @@
{
"country": "Sweden",
"name": "Sweden 2002",
"authors": "Khopa (updated with Gripen by bgreman)",
"description": "<p>Sweden in 2002 after the addition of the Gripen-C.</p>",
"locales": ["sv_SE"],
"aircrafts": [
"AJS37",
"JAS39Gripen",
"JAS39Gripen_AG",
"UH_1H"
],
"awacs": [
"E_3A"
],
"tankers": [
"KC_135",
"KC130"
],
"frontline_units": [
"IFV_Warrior",
"MBT_Leopard_2A4",
"IFV_M1126_Stryker_ICV",
"SAM_Avenger__Stinger"
],
"artillery_units": [
],
"logistics_units": [
"Truck_M818_6x6"
],
"infantry_units": [
"Infantry_M4",
"Infantry_M249",
"MANPADS_Stinger"
],
"air_defenses": [
"AvengerGenerator",
"HawkGenerator"
],
"ewrs": [
"HawkEwrGenerator"
],
"navy_generators": [
"OliverHazardPerryGroupGenerator"
],
"requirements": {
"JAS39 Gripen Mod by Community": "https://github.com/whisky-actual/Community-JAS-39-C"
},
"has_jtac": true,
"jtac_unit": "MQ_9_Reaper"
}

View File

@@ -0,0 +1,96 @@
{
"country": "Combined Joint Task Forces Red",
"name": "Syria 2012'ish",
"authors": "Headiii",
"description": "<p>Syrian Army with more modern Imports and supported by a Russian Expeditionary Force.</p>",
"aircrafts": [
"MiG_23MLD",
"MiG_25PD",
"MiG_29S",
"Su_24M",
"Su_25",
"Su_30",
"Su_34",
"L_39ZA",
"Mi_24V",
"Mi_8MT",
"SA342M",
"SA342L"
],
"awacs": [
"A_50"
],
"tankers": [
"IL_78M"
],
"frontline_units": [
"IFV_BMP_1",
"IFV_BMP_2",
"APC_BTR_80",
"Scout_BRDM_2",
"LT_PT_76",
"APC_MTLB",
"Scout_Cobra",
"MBT_T_55",
"MBT_T_72B",
"MBT_T_90",
"SPAAA_ZSU_57_2"
],
"artillery_units": [
"MLRS_9K57_Uragan_BM_27_220mm",
"SPM_2S9_Nona_120mm_M",
"MLRS_BM_21_Grad_122mm",
"SPH_2S1_Gvozdika_122mm"
],
"logistics_units": [
"Truck_Ural_375",
"LUV_UAZ_469_Jeep"
],
"infantry_units": [
"Paratrooper_AKS",
"Infantry_AK_74_Rus",
"Paratrooper_RPG_16",
"MANPADS_SA_18_Igla_S_Grouse"
],
"air_defenses": [
"ColdWarFlakGenerator",
"SA2Generator",
"SA3Generator",
"SA6Generator",
"SA8Generator",
"SA8Generator",
"SA9Generator",
"SA10Generator",
"SA11Generator",
"SA13Generator",
"SA19Generator",
"ZSU23Generator",
"ZU23Generator",
"ZU23UralGenerator"
],
"ewrs": [
"BoxSpringGenerator",
"TallRackGenerator"
],
"missiles": [
"ScudGenerator"
],
"missiles_group_count": 1,
"aircraft_carrier": [
],
"helicopter_carrier": [
],
"helicopter_carrier_names": [
],
"destroyers": [
],
"cruisers": [
],
"requirements": {},
"carrier_names": [
],
"navy_generators": [
"GrishaGroupGenerator",
"MolniyaGroupGenerator"
]
}

View File

@@ -2,8 +2,8 @@
<p> <p>
Some player flights may be delayed to start. For such flights, it will not be Some player flights may be delayed to start. For such flights, it will not be
possible to enter the cockpit for a delayed flight until its mission start possible to enter the cockpit until its mission start time, shown in the flight
time, shown in the flight information window. information window.
</p> </p>
<p> <p>
@@ -20,34 +20,30 @@
</p> </p>
<p> <p>
For more information, see the mission planning documentation on For more information, see the
<a href="https://github.com/dcs-liberation/dcs_liberation/wiki/Mission-planning"> <a
the wiki</a>. href="https://github.com/dcs-liberation/dcs_liberation/wiki/Mission-planning"
style="color: #ffffff"
>mission planning documentation</a> on our wiki.
</p> </p>
<h2>For Singleplayer:</h2> <h2>Launching the mission:</h2>
<p> <p>
In DCS, open the Mission Editor and load the file: <i>liberation_nextturn</i>. Launch the <code>liberation_nextturn</code> mission as you normally would for single-
or multi-player. Note that even for single-player, running the mission with the
dedicated server, <em>even on the same machine</em>, can significantly improve frame
rates, but may cause AI wingmen to behave strangely during taxi.
</p> </p>
<p> <p>
Once the mission is loaded in the ME, use the "FLY" option in the "Flight" For advice on using a dedicated server to play DCS Liberation, see
menu to launch. <a
style="color: #ffffff"
href="https://github.com/dcs-liberation/dcs_liberation/wiki/Dedicated-Server-Guide"
>the guide</a> on our wiki.
</p> </p>
<h2>For Multiplayer:</h2>
<p>
In DCS, open the Mission Editor, and load the file: <i>liberation_nextturn</i>
</p>
<p>Select File/Save, exit the mission editor, and then select Multiplayer.</p>
<p>Then host a server with the mission, and tell your friends to join!</p>
<i>(The step in the mission editor is important, and fix a game breaking bug.)</i>
<h2>Finishing</h2> <h2>Finishing</h2>
<p>Once you have played the mission, click on the \"Accept Results\" button.</p> <p>Once you have played the mission, click on the \"Accept Results\" button.</p>

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

File diff suppressed because it is too large Load Diff