Compare commits
32 Commits
5.1.0
...
develop-5.
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
edb10f60fb | ||
|
|
a7a28205a9 | ||
|
|
a22452baca | ||
|
|
8422823921 | ||
|
|
30fe1ca6af | ||
|
|
faf70debce | ||
|
|
42929b08d8 | ||
|
|
91bb5acd04 | ||
|
|
d69841f261 | ||
|
|
dba8c26887 | ||
|
|
bef27ffb20 | ||
|
|
d9eac37766 | ||
|
|
39a5d4e7c4 | ||
|
|
ce4d388e27 | ||
|
|
3a318fbbdf | ||
|
|
526d082020 | ||
|
|
3d68eabcaa | ||
|
|
409a099339 | ||
|
|
0ba86af4fd | ||
|
|
99d4cb7ad5 | ||
|
|
815849ae64 | ||
|
|
31efac53f4 | ||
|
|
3ede2b5755 | ||
|
|
de43c0d621 | ||
|
|
7a6ec30368 | ||
|
|
08c3da9502 | ||
|
|
6d389f7612 | ||
|
|
bc3b6c2a26 | ||
|
|
041cd0057a | ||
|
|
57ee611d06 | ||
|
|
f63fae2d4f | ||
|
|
cd120047cb |
@@ -1,4 +1,6 @@
|
|||||||

|
[](https://shdwp.github.io/ukraine/)
|
||||||
|
|
||||||
|
(Github Readme Banner and Splash screen Artwork by Andriy Dankovych, CC BY-SA 4.0)
|
||||||
|
|
||||||
[](https://patreon.com/khopa)
|
[](https://patreon.com/khopa)
|
||||||
|
|
||||||
|
|||||||
22
changelog.md
@@ -1,3 +1,24 @@
|
|||||||
|
# 5.2.0
|
||||||
|
|
||||||
|
Saves from 5.1.0 are compatible with 5.2.0
|
||||||
|
|
||||||
|
## Features/Improvements
|
||||||
|
|
||||||
|
* **[Modding]** Add UH-60L mod support
|
||||||
|
* **[Campaign]** Vegas Nerve campaign update
|
||||||
|
* **[Campaign]** Add 3 new campaigns from Sith1144
|
||||||
|
## Fixes
|
||||||
|
|
||||||
|
* **[Mission Generation]** Fixed incorrect SA-5 and NASAMS threat range when TR destroyed. It will not count as threat anymore when the TR is dead.
|
||||||
|
* **[Mission Generation]** Fixed "Max Threat Range" error
|
||||||
|
* **[Mission Generation]** Fix unculled zones not updating when needed
|
||||||
|
* **[Data]** Removed Fw 190 A-8 and D-9 from Germany 1940 and 1942 faction list for historical accuracy.
|
||||||
|
* **[Data]** Updated Loadouts for Tornado GR4, F-15E and F-16C
|
||||||
|
* **[Data]** Corrected some unit data
|
||||||
|
* **[UI]** Fixed various UI issues (for example Scaling and HighDPI)
|
||||||
|
* **[UI]** Typhoon GR4 and IDS images
|
||||||
|
|
||||||
|
|
||||||
# 5.1.0
|
# 5.1.0
|
||||||
|
|
||||||
Saves from 5.0.0 are compatible with 5.1.0
|
Saves from 5.0.0 are compatible with 5.1.0
|
||||||
@@ -20,6 +41,7 @@ Saves from 5.0.0 are compatible with 5.1.0
|
|||||||
* **[Mission Generation]** Corrected Viggen FR22 & FR24 preset channels for the DCS 2.7.9 update
|
* **[Mission Generation]** Corrected Viggen FR22 & FR24 preset channels for the DCS 2.7.9 update
|
||||||
* **[Mission Generation]** Fixed the SA-5 Generator to use the P-19 FlatFace SR as a Fallback radar if the faction does not have access to the TinShield SR.
|
* **[Mission Generation]** Fixed the SA-5 Generator to use the P-19 FlatFace SR as a Fallback radar if the faction does not have access to the TinShield SR.
|
||||||
* **[UI]** Enable / Disable the settings, save and stats actions if no game is loaded to prevent an error as these functions can only be used on a valid game.
|
* **[UI]** Enable / Disable the settings, save and stats actions if no game is loaded to prevent an error as these functions can only be used on a valid game.
|
||||||
|
* **[UI]** Added missing icons for Tornado GR4, and Tornado IDS.
|
||||||
|
|
||||||
# 5.0.0
|
# 5.0.0
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ from dcs.vehicles import AirDefence
|
|||||||
|
|
||||||
TELARS = {
|
TELARS = {
|
||||||
AirDefence._2S6_Tunguska,
|
AirDefence._2S6_Tunguska,
|
||||||
AirDefence.SA_11_Buk_SR_9S18M1,
|
AirDefence.SA_11_Buk_LN_9A310M1,
|
||||||
AirDefence.Osa_9A33_ln,
|
AirDefence.Osa_9A33_ln,
|
||||||
AirDefence.Tor_9A331,
|
AirDefence.Tor_9A331,
|
||||||
AirDefence.Roland_ADS,
|
AirDefence.Roland_ADS,
|
||||||
@@ -38,8 +38,10 @@ TRACK_RADARS = {
|
|||||||
AirDefence.Hawk_tr,
|
AirDefence.Hawk_tr,
|
||||||
AirDefence.Patriot_str,
|
AirDefence.Patriot_str,
|
||||||
AirDefence.SNR_75V,
|
AirDefence.SNR_75V,
|
||||||
|
AirDefence.RPC_5N62V,
|
||||||
AirDefence.Rapier_fsa_blindfire_radar,
|
AirDefence.Rapier_fsa_blindfire_radar,
|
||||||
AirDefence.HQ_7_STR_SP,
|
AirDefence.HQ_7_STR_SP,
|
||||||
|
AirDefence.NASAMS_Radar_MPQ64F1,
|
||||||
}
|
}
|
||||||
|
|
||||||
LAUNCHER_TRACKER_PAIRS = {
|
LAUNCHER_TRACKER_PAIRS = {
|
||||||
@@ -52,6 +54,9 @@ LAUNCHER_TRACKER_PAIRS = {
|
|||||||
AirDefence.S_75M_Volhov: AirDefence.SNR_75V,
|
AirDefence.S_75M_Volhov: AirDefence.SNR_75V,
|
||||||
AirDefence.Rapier_fsa_launcher: AirDefence.Rapier_fsa_blindfire_radar,
|
AirDefence.Rapier_fsa_launcher: AirDefence.Rapier_fsa_blindfire_radar,
|
||||||
AirDefence.HQ_7_LN_SP: AirDefence.HQ_7_STR_SP,
|
AirDefence.HQ_7_LN_SP: AirDefence.HQ_7_STR_SP,
|
||||||
|
AirDefence.S_200_Launcher: AirDefence.RPC_5N62V,
|
||||||
|
AirDefence.NASAMS_LN_B: AirDefence.NASAMS_Radar_MPQ64F1,
|
||||||
|
AirDefence.NASAMS_LN_C: AirDefence.NASAMS_Radar_MPQ64F1,
|
||||||
}
|
}
|
||||||
|
|
||||||
UNITS_WITH_RADAR = {
|
UNITS_WITH_RADAR = {
|
||||||
@@ -80,6 +85,8 @@ UNITS_WITH_RADAR = {
|
|||||||
AirDefence.Roland_Radar,
|
AirDefence.Roland_Radar,
|
||||||
AirDefence.Snr_s_125_tr,
|
AirDefence.Snr_s_125_tr,
|
||||||
AirDefence.SNR_75V,
|
AirDefence.SNR_75V,
|
||||||
|
AirDefence.RLS_19J6,
|
||||||
|
AirDefence.RPC_5N62V,
|
||||||
AirDefence.Rapier_fsa_blindfire_radar,
|
AirDefence.Rapier_fsa_blindfire_radar,
|
||||||
AirDefence.HQ_7_LN_SP,
|
AirDefence.HQ_7_LN_SP,
|
||||||
AirDefence.HQ_7_STR_SP,
|
AirDefence.HQ_7_STR_SP,
|
||||||
|
|||||||
@@ -47,17 +47,21 @@ 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.jas39.jas39 import JAS39Gripen, JAS39Gripen_AG
|
||||||
from pydcs_extensions.su57.su57 import Su_57
|
from pydcs_extensions.su57.su57 import Su_57
|
||||||
|
from pydcs_extensions.uh60l.uh60l import UH_60L, KC130J
|
||||||
|
|
||||||
plane_map["A-4E-C"] = A_4E_C
|
plane_map["A-4E-C"] = A_4E_C
|
||||||
plane_map["F-22A"] = F_22A
|
plane_map["F-22A"] = F_22A
|
||||||
plane_map["Su-57"] = Su_57
|
plane_map["Su-57"] = Su_57
|
||||||
plane_map["Hercules"] = Hercules
|
plane_map["Hercules"] = Hercules
|
||||||
|
plane_map["KC130J"] = KC130J
|
||||||
plane_map["JAS39Gripen"] = JAS39Gripen
|
plane_map["JAS39Gripen"] = JAS39Gripen
|
||||||
plane_map["JAS39Gripen_AG"] = JAS39Gripen_AG
|
plane_map["JAS39Gripen_AG"] = JAS39Gripen_AG
|
||||||
plane_map["VSN_F104G"] = VSN_F104G
|
plane_map["VSN_F104G"] = VSN_F104G
|
||||||
plane_map["VSN_F104S"] = VSN_F104S
|
plane_map["VSN_F104S"] = VSN_F104S
|
||||||
plane_map["VSN_F104S_AG"] = VSN_F104S_AG
|
plane_map["VSN_F104S_AG"] = VSN_F104S_AG
|
||||||
|
|
||||||
|
helicopter_map["UH-60L"] = UH_60L
|
||||||
|
|
||||||
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
|
||||||
vehicle_map["SMOKESAM"] = frenchpack.SMOKE_SAM_IR
|
vehicle_map["SMOKESAM"] = frenchpack.SMOKE_SAM_IR
|
||||||
|
|||||||
@@ -266,6 +266,9 @@ class Faction:
|
|||||||
self.remove_aircraft("A-4E-C")
|
self.remove_aircraft("A-4E-C")
|
||||||
if not mod_settings.hercules:
|
if not mod_settings.hercules:
|
||||||
self.remove_aircraft("Hercules")
|
self.remove_aircraft("Hercules")
|
||||||
|
if not mod_settings.uh_60l:
|
||||||
|
self.remove_aircraft("UH-60L")
|
||||||
|
self.remove_aircraft("KC130J")
|
||||||
if not mod_settings.f22_raptor:
|
if not mod_settings.f22_raptor:
|
||||||
self.remove_aircraft("F-22A")
|
self.remove_aircraft("F-22A")
|
||||||
if not mod_settings.f104_starfighter:
|
if not mod_settings.f104_starfighter:
|
||||||
|
|||||||
13
game/game.py
@@ -248,7 +248,7 @@ class Game:
|
|||||||
naming.namegen = self.name_generator
|
naming.namegen = self.name_generator
|
||||||
LuaPluginManager.load_settings(self.settings)
|
LuaPluginManager.load_settings(self.settings)
|
||||||
ObjectiveDistanceCache.set_theater(self.theater)
|
ObjectiveDistanceCache.set_theater(self.theater)
|
||||||
self.compute_conflicts_position()
|
self.compute_unculled_zones()
|
||||||
if not game_still_initializing:
|
if not game_still_initializing:
|
||||||
self.compute_threat_zones()
|
self.compute_threat_zones()
|
||||||
|
|
||||||
@@ -389,8 +389,6 @@ class Game:
|
|||||||
return self.process_win_loss(turn_state)
|
return self.process_win_loss(turn_state)
|
||||||
|
|
||||||
# Plan flights & combat for next turn
|
# Plan flights & combat for next turn
|
||||||
with logged_duration("Computing conflict positions"):
|
|
||||||
self.compute_conflicts_position()
|
|
||||||
with logged_duration("Threat zone computation"):
|
with logged_duration("Threat zone computation"):
|
||||||
self.compute_threat_zones()
|
self.compute_threat_zones()
|
||||||
|
|
||||||
@@ -408,6 +406,10 @@ class Game:
|
|||||||
gplanner.plan_groundwar()
|
gplanner.plan_groundwar()
|
||||||
self.ground_planners[cp.id] = gplanner
|
self.ground_planners[cp.id] = gplanner
|
||||||
|
|
||||||
|
# Update cull zones
|
||||||
|
with logged_duration("Computing culling positions"):
|
||||||
|
self.compute_unculled_zones()
|
||||||
|
|
||||||
def message(self, title: str, text: str = "") -> None:
|
def message(self, title: str, text: str = "") -> None:
|
||||||
self.informations.append(Information(title, text, turn=self.turn))
|
self.informations.append(Information(title, text, turn=self.turn))
|
||||||
|
|
||||||
@@ -448,10 +450,9 @@ class Game:
|
|||||||
def navmesh_for(self, player: bool) -> NavMesh:
|
def navmesh_for(self, player: bool) -> NavMesh:
|
||||||
return self.coalition_for(player).nav_mesh
|
return self.coalition_for(player).nav_mesh
|
||||||
|
|
||||||
def compute_conflicts_position(self) -> None:
|
def compute_unculled_zones(self) -> None:
|
||||||
"""
|
"""
|
||||||
Compute the current conflict center position(s), mainly used for culling calculation
|
Compute the current conflict position(s) used for culling calculation
|
||||||
:return: List of points of interests
|
|
||||||
"""
|
"""
|
||||||
zones = []
|
zones = []
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ def bounded_int_option(
|
|||||||
max: int,
|
max: int,
|
||||||
detail: Optional[str] = None,
|
detail: Optional[str] = None,
|
||||||
tooltip: Optional[str] = None,
|
tooltip: Optional[str] = None,
|
||||||
|
causes_expensive_game_update: bool = False,
|
||||||
**kwargs: Any,
|
**kwargs: Any,
|
||||||
) -> int:
|
) -> int:
|
||||||
return field(
|
return field(
|
||||||
@@ -29,7 +30,7 @@ def bounded_int_option(
|
|||||||
text,
|
text,
|
||||||
detail,
|
detail,
|
||||||
tooltip,
|
tooltip,
|
||||||
causes_expensive_game_update=False,
|
causes_expensive_game_update,
|
||||||
min=min,
|
min=min,
|
||||||
max=max,
|
max=max,
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -430,6 +430,7 @@ class Settings:
|
|||||||
default=100,
|
default=100,
|
||||||
min=10,
|
min=10,
|
||||||
max=10000,
|
max=10000,
|
||||||
|
causes_expensive_game_update=True,
|
||||||
)
|
)
|
||||||
perf_do_not_cull_carrier: bool = boolean_option(
|
perf_do_not_cull_carrier: bool = boolean_option(
|
||||||
"Do not cull carrier's surroundings",
|
"Do not cull carrier's surroundings",
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ class ModSettings:
|
|||||||
f22_raptor: bool = False
|
f22_raptor: bool = False
|
||||||
f104_starfighter: bool = False
|
f104_starfighter: bool = False
|
||||||
hercules: bool = False
|
hercules: bool = False
|
||||||
|
uh_60l: bool = False
|
||||||
jas39_gripen: bool = False
|
jas39_gripen: bool = False
|
||||||
su57_felon: bool = False
|
su57_felon: bool = False
|
||||||
frenchpack: bool = False
|
frenchpack: bool = False
|
||||||
|
|||||||
@@ -176,7 +176,9 @@ class TheaterGroundObject(MissionTarget, Generic[GroupT]):
|
|||||||
return self._max_range_of_type(group, "detection_range")
|
return self._max_range_of_type(group, "detection_range")
|
||||||
|
|
||||||
def max_threat_range(self) -> Distance:
|
def max_threat_range(self) -> Distance:
|
||||||
return max(self.threat_range(g) for g in self.groups)
|
return (
|
||||||
|
max(self.threat_range(g) for g in self.groups) if self.groups else meters(0)
|
||||||
|
)
|
||||||
|
|
||||||
def threat_range(self, group: GroupT, radar_only: bool = False) -> Distance:
|
def threat_range(self, group: GroupT, radar_only: bool = False) -> Distance:
|
||||||
return self._max_range_of_type(group, "threat_range")
|
return self._max_range_of_type(group, "threat_range")
|
||||||
@@ -527,7 +529,7 @@ class SamGroundObject(IadsGroundObject):
|
|||||||
max_tel_range = meters(0)
|
max_tel_range = meters(0)
|
||||||
for launcher in launchers:
|
for launcher in launchers:
|
||||||
if LAUNCHER_TRACKER_PAIRS[launcher] in live_trs:
|
if LAUNCHER_TRACKER_PAIRS[launcher] in live_trs:
|
||||||
max_tel_range = max(max_tel_range, meters(unit_type.threat_range))
|
max_tel_range = max(max_tel_range, meters(launcher.threat_range))
|
||||||
if radar_only:
|
if radar_only:
|
||||||
return max(max_tel_range, max_telar_range)
|
return max(max_tel_range, max_telar_range)
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ INHG_TO_HPA = 33.86389
|
|||||||
INHG_TO_MMHG = 25.400002776728
|
INHG_TO_MMHG = 25.400002776728
|
||||||
|
|
||||||
|
|
||||||
@dataclass(frozen=True, order=True)
|
@dataclass(frozen=True)
|
||||||
class Distance:
|
class Distance:
|
||||||
distance_in_meters: float
|
distance_in_meters: float
|
||||||
|
|
||||||
@@ -73,6 +73,18 @@ class Distance:
|
|||||||
def __bool__(self) -> bool:
|
def __bool__(self) -> bool:
|
||||||
return not math.isclose(self.meters, 0.0)
|
return not math.isclose(self.meters, 0.0)
|
||||||
|
|
||||||
|
def __lt__(self, other: Distance) -> bool:
|
||||||
|
return self.meters < other.meters
|
||||||
|
|
||||||
|
def __le__(self, other: Distance) -> bool:
|
||||||
|
return self.meters <= other.meters
|
||||||
|
|
||||||
|
def __gt__(self, other: Distance) -> bool:
|
||||||
|
return self.meters > other.meters
|
||||||
|
|
||||||
|
def __ge__(self, other: Distance) -> bool:
|
||||||
|
return self.meters >= other.meters
|
||||||
|
|
||||||
|
|
||||||
def feet(value: float) -> Distance:
|
def feet(value: float) -> Distance:
|
||||||
return Distance.from_feet(value)
|
return Distance.from_feet(value)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ from pathlib import Path
|
|||||||
|
|
||||||
|
|
||||||
MAJOR_VERSION = 5
|
MAJOR_VERSION = 5
|
||||||
MINOR_VERSION = 1
|
MINOR_VERSION = 2
|
||||||
MICRO_VERSION = 0
|
MICRO_VERSION = 0
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -125,6 +125,8 @@ from pydcs_extensions.su57.su57 import Su_57
|
|||||||
# factions that also have F-4s should not.
|
# factions that also have F-4s should not.
|
||||||
|
|
||||||
# Used for CAP, Escort, and intercept if there is not a specialised aircraft available
|
# Used for CAP, Escort, and intercept if there is not a specialised aircraft available
|
||||||
|
from pydcs_extensions.uh60l.uh60l import UH_60L, KC130J
|
||||||
|
|
||||||
CAP_CAPABLE = [
|
CAP_CAPABLE = [
|
||||||
Su_57,
|
Su_57,
|
||||||
F_22A,
|
F_22A,
|
||||||
@@ -470,6 +472,7 @@ TRANSPORT_CAPABLE = [
|
|||||||
Yak_40,
|
Yak_40,
|
||||||
CH_53E,
|
CH_53E,
|
||||||
CH_47D,
|
CH_47D,
|
||||||
|
UH_60L,
|
||||||
SH_60B,
|
SH_60B,
|
||||||
UH_60A,
|
UH_60A,
|
||||||
UH_1H,
|
UH_1H,
|
||||||
@@ -492,6 +495,7 @@ REFUELING_CAPABALE = [
|
|||||||
KC_135,
|
KC_135,
|
||||||
KC135MPRS,
|
KC135MPRS,
|
||||||
IL_78M,
|
IL_78M,
|
||||||
|
KC130J,
|
||||||
KC130,
|
KC130,
|
||||||
S_3B_Tanker,
|
S_3B_Tanker,
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from pydcs_extensions.highdigitsams import highdigitsams
|
|||||||
from pydcs_extensions.jas39.jas39 import JAS39Gripen, JAS39Gripen_AG
|
from pydcs_extensions.jas39.jas39 import JAS39Gripen, JAS39Gripen_AG
|
||||||
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
|
||||||
|
from pydcs_extensions.uh60l.uh60l import UH_60L, KC130J
|
||||||
|
|
||||||
MODDED_AIRPLANES = [
|
MODDED_AIRPLANES = [
|
||||||
A_4E_C,
|
A_4E_C,
|
||||||
@@ -15,9 +16,13 @@ MODDED_AIRPLANES = [
|
|||||||
VSN_F104S,
|
VSN_F104S,
|
||||||
VSN_F104S_AG,
|
VSN_F104S_AG,
|
||||||
Hercules,
|
Hercules,
|
||||||
|
KC130J,
|
||||||
JAS39Gripen,
|
JAS39Gripen,
|
||||||
JAS39Gripen_AG,
|
JAS39Gripen_AG,
|
||||||
]
|
]
|
||||||
|
MODDED_HELICOPTERS = [
|
||||||
|
UH_60L,
|
||||||
|
]
|
||||||
MODDED_VEHICLES = [
|
MODDED_VEHICLES = [
|
||||||
frenchpack._FIELD_HIDE,
|
frenchpack._FIELD_HIDE,
|
||||||
frenchpack._FIELD_HIDE_SMALL,
|
frenchpack._FIELD_HIDE_SMALL,
|
||||||
|
|||||||
1292
pydcs_extensions/uh60l/uh60l.py
Normal file
@@ -22,6 +22,7 @@ def init():
|
|||||||
global __dcs_saved_game_directory
|
global __dcs_saved_game_directory
|
||||||
global __dcs_installation_directory
|
global __dcs_installation_directory
|
||||||
global __last_save_file
|
global __last_save_file
|
||||||
|
global __ignore_empty_install_directory
|
||||||
|
|
||||||
if PREFERENCES_PATH.exists():
|
if PREFERENCES_PATH.exists():
|
||||||
try:
|
try:
|
||||||
@@ -31,14 +32,19 @@ def init():
|
|||||||
__dcs_saved_game_directory = pref_data["saved_game_dir"]
|
__dcs_saved_game_directory = pref_data["saved_game_dir"]
|
||||||
__dcs_installation_directory = pref_data["dcs_install_dir"]
|
__dcs_installation_directory = pref_data["dcs_install_dir"]
|
||||||
__last_save_file = pref_data.get("last_save_file", "")
|
__last_save_file = pref_data.get("last_save_file", "")
|
||||||
|
__ignore_empty_install_directory = pref_data.get(
|
||||||
|
"ignore_empty_install_directory", False
|
||||||
|
)
|
||||||
is_first_start = False
|
is_first_start = False
|
||||||
except KeyError:
|
except KeyError:
|
||||||
__dcs_saved_game_directory = ""
|
__dcs_saved_game_directory = ""
|
||||||
__dcs_installation_directory = ""
|
__dcs_installation_directory = ""
|
||||||
__last_save_file = ""
|
__last_save_file = ""
|
||||||
|
__ignore_empty_install_directory = False
|
||||||
is_first_start = True
|
is_first_start = True
|
||||||
else:
|
else:
|
||||||
__last_save_file = ""
|
__last_save_file = ""
|
||||||
|
__ignore_empty_install_directory = False
|
||||||
try:
|
try:
|
||||||
__dcs_saved_game_directory = (
|
__dcs_saved_game_directory = (
|
||||||
dcs.installation.get_dcs_saved_games_directory()
|
dcs.installation.get_dcs_saved_games_directory()
|
||||||
@@ -76,10 +82,12 @@ def save_config():
|
|||||||
global __dcs_saved_game_directory
|
global __dcs_saved_game_directory
|
||||||
global __dcs_installation_directory
|
global __dcs_installation_directory
|
||||||
global __last_save_file
|
global __last_save_file
|
||||||
|
global __ignore_empty_install_directory
|
||||||
pref_data = {
|
pref_data = {
|
||||||
"saved_game_dir": __dcs_saved_game_directory,
|
"saved_game_dir": __dcs_saved_game_directory,
|
||||||
"dcs_install_dir": __dcs_installation_directory,
|
"dcs_install_dir": __dcs_installation_directory,
|
||||||
"last_save_file": __last_save_file,
|
"last_save_file": __last_save_file,
|
||||||
|
"ignore_empty_install_directory": __ignore_empty_install_directory,
|
||||||
}
|
}
|
||||||
PREFERENCES_PATH.parent.mkdir(exist_ok=True, parents=True)
|
PREFERENCES_PATH.parent.mkdir(exist_ok=True, parents=True)
|
||||||
with PREFERENCES_PATH.open("w") as prefs:
|
with PREFERENCES_PATH.open("w") as prefs:
|
||||||
@@ -96,6 +104,16 @@ def get_saved_game_dir():
|
|||||||
return __dcs_saved_game_directory
|
return __dcs_saved_game_directory
|
||||||
|
|
||||||
|
|
||||||
|
def ignore_empty_install_directory():
|
||||||
|
global __ignore_empty_install_directory
|
||||||
|
return __ignore_empty_install_directory
|
||||||
|
|
||||||
|
|
||||||
|
def set_ignore_empty_install_directory(value: bool):
|
||||||
|
global __ignore_empty_install_directory
|
||||||
|
__ignore_empty_install_directory = value
|
||||||
|
|
||||||
|
|
||||||
def get_last_save_file():
|
def get_last_save_file():
|
||||||
global __last_save_file
|
global __last_save_file
|
||||||
print(__last_save_file)
|
print(__last_save_file)
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import argparse
|
|||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
import time
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from typing import Optional
|
from typing import Optional
|
||||||
@@ -9,7 +10,7 @@ from typing import Optional
|
|||||||
from PySide2 import QtWidgets
|
from PySide2 import QtWidgets
|
||||||
from PySide2.QtCore import Qt
|
from PySide2.QtCore import Qt
|
||||||
from PySide2.QtGui import QPixmap
|
from PySide2.QtGui import QPixmap
|
||||||
from PySide2.QtWidgets import QApplication, QSplashScreen
|
from PySide2.QtWidgets import QApplication, QSplashScreen, QCheckBox
|
||||||
from dcs.payloads import PayloadDirectories
|
from dcs.payloads import PayloadDirectories
|
||||||
|
|
||||||
from game import Game, VERSION, persistency
|
from game import Game, VERSION, persistency
|
||||||
@@ -56,10 +57,15 @@ def inject_custom_payloads(user_path: Path) -> None:
|
|||||||
|
|
||||||
|
|
||||||
def run_ui(game: Optional[Game]) -> None:
|
def run_ui(game: Optional[Game]) -> None:
|
||||||
os.environ["QT_AUTO_SCREEN_SCALE_FACTOR"] = "1" # Potential fix for 4K screens
|
os.environ["QT_ENABLE_HIGHDPI_SCALING"] = "1" # Potential fix for 4K screens
|
||||||
|
QApplication.setHighDpiScaleFactorRoundingPolicy(
|
||||||
|
Qt.HighDpiScaleFactorRoundingPolicy.PassThrough
|
||||||
|
)
|
||||||
app = QApplication(sys.argv)
|
app = QApplication(sys.argv)
|
||||||
|
|
||||||
app.setAttribute(Qt.AA_DisableWindowContextHelpButton)
|
app.setAttribute(Qt.AA_DisableWindowContextHelpButton)
|
||||||
|
app.setAttribute(Qt.AA_EnableHighDpiScaling, True) # enable highdpi scaling
|
||||||
|
app.setAttribute(Qt.AA_UseHighDpiPixmaps, True) # use highdpi icons
|
||||||
|
|
||||||
# init the theme and load the stylesheet based on the theme index
|
# init the theme and load the stylesheet based on the theme index
|
||||||
liberation_theme.init()
|
liberation_theme.init()
|
||||||
@@ -89,6 +95,9 @@ def run_ui(game: Optional[Game]) -> None:
|
|||||||
splash = QSplashScreen(pixmap)
|
splash = QSplashScreen(pixmap)
|
||||||
splash.show()
|
splash.show()
|
||||||
|
|
||||||
|
# Give enough time to read splash screen
|
||||||
|
time.sleep(3)
|
||||||
|
|
||||||
# Once splash screen is up : load resources & setup stuff
|
# Once splash screen is up : load resources & setup stuff
|
||||||
uiconstants.load_icons()
|
uiconstants.load_icons()
|
||||||
uiconstants.load_event_icons()
|
uiconstants.load_event_icons()
|
||||||
@@ -99,20 +108,29 @@ def run_ui(game: Optional[Game]) -> None:
|
|||||||
|
|
||||||
# Show warning if no DCS Installation directory was set
|
# Show warning if no DCS Installation directory was set
|
||||||
if liberation_install.get_dcs_install_directory() == "":
|
if liberation_install.get_dcs_install_directory() == "":
|
||||||
QtWidgets.QMessageBox.warning(
|
logging.warning(
|
||||||
splash,
|
"DCS Installation directory is empty. MissionScripting file will not be replaced!"
|
||||||
"No DCS installation directory.",
|
|
||||||
"The DCS Installation directory is not set correctly. "
|
|
||||||
"This will prevent DCS Liberation to work properly as the MissionScripting "
|
|
||||||
"file will not be modified."
|
|
||||||
"<br/><br/>To solve this problem, you can set the Installation directory "
|
|
||||||
"within the preferences menu. You can also manually edit or replace the "
|
|
||||||
"following file:"
|
|
||||||
"<br/><br/><strong><dcs_installation_directory>/Scripts/MissionScripting.lua</strong>"
|
|
||||||
"<br/><br/>The easiest way to do it is to replace the original file with the file in dcs-liberation distribution (<dcs_liberation_installation>/resources/scripts/MissionScripting.lua)."
|
|
||||||
"<br/><br/>You can find more information on how to manually change this file in the Liberation Wiki (Page: Dedicated Server Guide) on GitHub.</p>",
|
|
||||||
QtWidgets.QMessageBox.StandardButton.Ok,
|
|
||||||
)
|
)
|
||||||
|
if not liberation_install.ignore_empty_install_directory():
|
||||||
|
ignore_checkbox = QCheckBox("Do not show again")
|
||||||
|
ignore_checkbox.stateChanged.connect(set_ignore_empty_install_directory)
|
||||||
|
message_box = QtWidgets.QMessageBox(parent=splash)
|
||||||
|
message_box.setIcon(QtWidgets.QMessageBox.Icon.Warning)
|
||||||
|
message_box.setWindowTitle("No DCS installation directory.")
|
||||||
|
message_box.setText(
|
||||||
|
"The DCS Installation directory is not set correctly. "
|
||||||
|
"This will prevent DCS Liberation to work properly as the MissionScripting "
|
||||||
|
"file will not be modified."
|
||||||
|
"<br/><br/>To solve this problem, you can set the Installation directory "
|
||||||
|
"within the preferences menu. You can also manually edit or replace the "
|
||||||
|
"following file:"
|
||||||
|
"<br/><br/><strong><dcs_installation_directory>/Scripts/MissionScripting.lua</strong>"
|
||||||
|
"<br/><br/>The easiest way to do it is to replace the original file with the file in dcs-liberation distribution (<dcs_liberation_installation>/resources/scripts/MissionScripting.lua)."
|
||||||
|
"<br/><br/>You can find more information on how to manually change this file in the Liberation Wiki (Page: Dedicated Server Guide) on GitHub.</p>"
|
||||||
|
)
|
||||||
|
message_box.setDefaultButton(QtWidgets.QMessageBox.StandardButton.Ok)
|
||||||
|
message_box.setCheckBox(ignore_checkbox)
|
||||||
|
message_box.exec_()
|
||||||
# Replace DCS Mission scripting file to allow DCS Liberation to work
|
# Replace DCS Mission scripting file to allow DCS Liberation to work
|
||||||
try:
|
try:
|
||||||
liberation_install.replace_mission_scripting_file()
|
liberation_install.replace_mission_scripting_file()
|
||||||
@@ -274,6 +292,11 @@ def create_game(
|
|||||||
return game
|
return game
|
||||||
|
|
||||||
|
|
||||||
|
def set_ignore_empty_install_directory(value: bool) -> None:
|
||||||
|
liberation_install.set_ignore_empty_install_directory(value)
|
||||||
|
liberation_install.save_config()
|
||||||
|
|
||||||
|
|
||||||
def lint_all_weapon_data() -> None:
|
def lint_all_weapon_data() -> None:
|
||||||
for weapon in WeaponGroup.named("Unknown").weapons:
|
for weapon in WeaponGroup.named("Unknown").weapons:
|
||||||
logging.warning(f"No weapon data for {weapon}: {weapon.clsid}")
|
logging.warning(f"No weapon data for {weapon}: {weapon.clsid}")
|
||||||
@@ -294,6 +317,11 @@ def main():
|
|||||||
|
|
||||||
logging.debug("Python version %s", sys.version)
|
logging.debug("Python version %s", sys.version)
|
||||||
|
|
||||||
|
if not str(Path(__file__)).isascii():
|
||||||
|
logging.warning(
|
||||||
|
"Installation path contains non-ASCII characters. This is known to cause problems."
|
||||||
|
)
|
||||||
|
|
||||||
game: Optional[Game] = None
|
game: Optional[Game] = None
|
||||||
|
|
||||||
args = parse_args()
|
args = parse_args()
|
||||||
|
|||||||
@@ -214,6 +214,7 @@ class AtoModel(QAbstractListModel):
|
|||||||
PackageRole = Qt.UserRole
|
PackageRole = Qt.UserRole
|
||||||
|
|
||||||
client_slots_changed = Signal()
|
client_slots_changed = Signal()
|
||||||
|
packages_changed = Signal()
|
||||||
|
|
||||||
def __init__(self, game_model: GameModel, ato: AirTaskingOrder) -> None:
|
def __init__(self, game_model: GameModel, ato: AirTaskingOrder) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
@@ -245,6 +246,7 @@ class AtoModel(QAbstractListModel):
|
|||||||
self.endInsertRows()
|
self.endInsertRows()
|
||||||
# noinspection PyUnresolvedReferences
|
# noinspection PyUnresolvedReferences
|
||||||
self.client_slots_changed.emit()
|
self.client_slots_changed.emit()
|
||||||
|
self.on_packages_changed()
|
||||||
|
|
||||||
def delete_package_at_index(self, index: QModelIndex) -> None:
|
def delete_package_at_index(self, index: QModelIndex) -> None:
|
||||||
"""Removes the package at the given index from the ATO."""
|
"""Removes the package at the given index from the ATO."""
|
||||||
@@ -263,6 +265,12 @@ class AtoModel(QAbstractListModel):
|
|||||||
self.endRemoveRows()
|
self.endRemoveRows()
|
||||||
# noinspection PyUnresolvedReferences
|
# noinspection PyUnresolvedReferences
|
||||||
self.client_slots_changed.emit()
|
self.client_slots_changed.emit()
|
||||||
|
self.on_packages_changed()
|
||||||
|
|
||||||
|
def on_packages_changed(self) -> None:
|
||||||
|
if self.game is not None:
|
||||||
|
self.game.compute_unculled_zones()
|
||||||
|
self.packages_changed.emit()
|
||||||
|
|
||||||
def package_at_index(self, index: QModelIndex) -> Package:
|
def package_at_index(self, index: QModelIndex) -> Package:
|
||||||
"""Returns the package at the given index."""
|
"""Returns the package at the given index."""
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ def load_icons():
|
|||||||
ICONS["Github"] = QPixmap(
|
ICONS["Github"] = QPixmap(
|
||||||
"./resources/ui/misc/" + get_theme_icons() + "/github.png"
|
"./resources/ui/misc/" + get_theme_icons() + "/github.png"
|
||||||
)
|
)
|
||||||
|
ICONS["Ukraine"] = QPixmap("./resources/ui/misc/ukraine.png")
|
||||||
|
|
||||||
ICONS["Control Points"] = QPixmap(
|
ICONS["Control Points"] = QPixmap(
|
||||||
"./resources/ui/misc/" + get_theme_icons() + "/circle.png"
|
"./resources/ui/misc/" + get_theme_icons() + "/circle.png"
|
||||||
|
|||||||
@@ -1057,6 +1057,12 @@ class MapModel(QObject):
|
|||||||
GameUpdateSignal.get_instance().flight_selection_changed.connect(
|
GameUpdateSignal.get_instance().flight_selection_changed.connect(
|
||||||
self.set_flight_selection
|
self.set_flight_selection
|
||||||
)
|
)
|
||||||
|
self.game_model.ato_model_for(True).packages_changed.connect(
|
||||||
|
self.on_package_change
|
||||||
|
)
|
||||||
|
self.game_model.ato_model_for(False).packages_changed.connect(
|
||||||
|
self.on_package_change
|
||||||
|
)
|
||||||
self.reset()
|
self.reset()
|
||||||
|
|
||||||
def clear(self) -> None:
|
def clear(self) -> None:
|
||||||
@@ -1291,6 +1297,9 @@ class MapModel(QObject):
|
|||||||
def mapZones(self) -> NavMeshJs:
|
def mapZones(self) -> NavMeshJs:
|
||||||
return self._map_zones
|
return self._map_zones
|
||||||
|
|
||||||
|
def on_package_change(self) -> None:
|
||||||
|
self.reset_unculled_zones()
|
||||||
|
|
||||||
def reset_unculled_zones(self) -> None:
|
def reset_unculled_zones(self) -> None:
|
||||||
self._unculled_zones = list(UnculledZone.each_from_game(self.game))
|
self._unculled_zones = list(UnculledZone.each_from_game(self.game))
|
||||||
self.unculledZonesChanged.emit()
|
self.unculledZonesChanged.emit()
|
||||||
|
|||||||
@@ -155,6 +155,12 @@ class QLiberationWindow(QMainWindow):
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
self.ukraineAction = QAction("&Ukraine", self)
|
||||||
|
self.ukraineAction.setIcon(CONST.ICONS["Ukraine"])
|
||||||
|
self.ukraineAction.triggered.connect(
|
||||||
|
lambda: webbrowser.open_new_tab("https://shdwp.github.io/ukraine/")
|
||||||
|
)
|
||||||
|
|
||||||
self.openLogsAction = QAction("Show &logs", self)
|
self.openLogsAction = QAction("Show &logs", self)
|
||||||
self.openLogsAction.triggered.connect(self.showLogsDialog)
|
self.openLogsAction.triggered.connect(self.showLogsDialog)
|
||||||
|
|
||||||
@@ -192,6 +198,7 @@ class QLiberationWindow(QMainWindow):
|
|||||||
self.links_bar = self.addToolBar("Links")
|
self.links_bar = self.addToolBar("Links")
|
||||||
self.links_bar.addAction(self.openDiscordAction)
|
self.links_bar.addAction(self.openDiscordAction)
|
||||||
self.links_bar.addAction(self.openGithubAction)
|
self.links_bar.addAction(self.openGithubAction)
|
||||||
|
self.links_bar.addAction(self.ukraineAction)
|
||||||
|
|
||||||
self.actions_bar = self.addToolBar("Actions")
|
self.actions_bar = self.addToolBar("Actions")
|
||||||
self.actions_bar.addAction(self.openSettingsAction)
|
self.actions_bar.addAction(self.openSettingsAction)
|
||||||
@@ -215,6 +222,7 @@ class QLiberationWindow(QMainWindow):
|
|||||||
help_menu = self.menu.addMenu("&Help")
|
help_menu = self.menu.addMenu("&Help")
|
||||||
help_menu.addAction(self.openDiscordAction)
|
help_menu.addAction(self.openDiscordAction)
|
||||||
help_menu.addAction(self.openGithubAction)
|
help_menu.addAction(self.openGithubAction)
|
||||||
|
help_menu.addAction(self.ukraineAction)
|
||||||
help_menu.addAction(
|
help_menu.addAction(
|
||||||
"&Releases",
|
"&Releases",
|
||||||
lambda: webbrowser.open_new_tab(
|
lambda: webbrowser.open_new_tab(
|
||||||
@@ -360,6 +368,8 @@ class QLiberationWindow(QMainWindow):
|
|||||||
"<b>Ciribob </b> <i>for the JTACAutoLase.lua script</i><br/>"
|
"<b>Ciribob </b> <i>for the JTACAutoLase.lua script</i><br/>"
|
||||||
"<b>Walder </b> <i>for the Skynet-IADS script</i><br/>"
|
"<b>Walder </b> <i>for the Skynet-IADS script</i><br/>"
|
||||||
"<b>Anubis Yinepu </b> <i>for the Hercules Cargo script</i><br/>"
|
"<b>Anubis Yinepu </b> <i>for the Hercules Cargo script</i><br/>"
|
||||||
|
+ "<h4>Splash Screen :</h4>"
|
||||||
|
+ "Artwork by Andriy Dankovych (CC BY-SA) [https://www.facebook.com/AndriyDankovych]"
|
||||||
)
|
)
|
||||||
about = QMessageBox()
|
about = QMessageBox()
|
||||||
about.setWindowTitle("About DCS Liberation")
|
about.setWindowTitle("About DCS Liberation")
|
||||||
|
|||||||
@@ -55,10 +55,10 @@ class FinancesLayout(QGridLayout):
|
|||||||
def add_total(self, game, income, player):
|
def add_total(self, game, income, player):
|
||||||
self.add_row(
|
self.add_row(
|
||||||
middle=f"Income multiplier: {income.multiplier:.1f}",
|
middle=f"Income multiplier: {income.multiplier:.1f}",
|
||||||
right=f"<b>{income.total}M</b>",
|
right=f"<b>{income.total:.1f}M</b>",
|
||||||
)
|
)
|
||||||
budget = game.coalition_for(player).budget
|
budget = game.coalition_for(player).budget
|
||||||
self.add_row(middle="Balance", right=f"<b>{budget}M</b>")
|
self.add_row(middle="Balance", right=f"<b>{budget:.1f}M</b>")
|
||||||
self.setRowStretch(next(self.row), 1)
|
self.setRowStretch(next(self.row), 1)
|
||||||
|
|
||||||
def add_row(
|
def add_row(
|
||||||
|
|||||||
@@ -40,6 +40,9 @@ class QFlightCreator(QDialog):
|
|||||||
self.custom_name_text = None
|
self.custom_name_text = None
|
||||||
self.country = self.game.blue.country_name
|
self.country = self.game.blue.country_name
|
||||||
|
|
||||||
|
# Make dialog modal to prevent background windows to close unexpectedly.
|
||||||
|
self.setModal(True)
|
||||||
|
|
||||||
self.setWindowTitle("Create flight")
|
self.setWindowTitle("Create flight")
|
||||||
self.setWindowIcon(EVENT_ICONS["strike"])
|
self.setWindowIcon(EVENT_ICONS["strike"])
|
||||||
|
|
||||||
|
|||||||
@@ -70,6 +70,8 @@ class NewGameWizard(QtWidgets.QWizard):
|
|||||||
if campaign is None:
|
if campaign is None:
|
||||||
campaign = self.campaigns[0]
|
campaign = self.campaigns[0]
|
||||||
|
|
||||||
|
logging.info("New campaign selected: %s", campaign.name)
|
||||||
|
|
||||||
if self.field("usePreset"):
|
if self.field("usePreset"):
|
||||||
start_date = db.TIME_PERIODS[
|
start_date = db.TIME_PERIODS[
|
||||||
list(db.TIME_PERIODS.keys())[self.field("timePeriod")]
|
list(db.TIME_PERIODS.keys())[self.field("timePeriod")]
|
||||||
@@ -77,6 +79,7 @@ class NewGameWizard(QtWidgets.QWizard):
|
|||||||
else:
|
else:
|
||||||
start_date = self.theater_page.calendar.selectedDate().toPython()
|
start_date = self.theater_page.calendar.selectedDate().toPython()
|
||||||
|
|
||||||
|
logging.info("New campaign start date: %s", start_date.strftime("%m/%d/%Y"))
|
||||||
settings = Settings(
|
settings = Settings(
|
||||||
player_income_multiplier=self.field("player_income_multiplier") / 10,
|
player_income_multiplier=self.field("player_income_multiplier") / 10,
|
||||||
enemy_income_multiplier=self.field("enemy_income_multiplier") / 10,
|
enemy_income_multiplier=self.field("enemy_income_multiplier") / 10,
|
||||||
@@ -107,6 +110,7 @@ class NewGameWizard(QtWidgets.QWizard):
|
|||||||
f22_raptor=self.field("f22_raptor"),
|
f22_raptor=self.field("f22_raptor"),
|
||||||
f104_starfighter=self.field("f104_starfighter"),
|
f104_starfighter=self.field("f104_starfighter"),
|
||||||
hercules=self.field("hercules"),
|
hercules=self.field("hercules"),
|
||||||
|
uh_60l=self.field("uh_60l"),
|
||||||
jas39_gripen=self.field("jas39_gripen"),
|
jas39_gripen=self.field("jas39_gripen"),
|
||||||
su57_felon=self.field("su57_felon"),
|
su57_felon=self.field("su57_felon"),
|
||||||
frenchpack=self.field("frenchpack"),
|
frenchpack=self.field("frenchpack"),
|
||||||
@@ -115,7 +119,14 @@ class NewGameWizard(QtWidgets.QWizard):
|
|||||||
|
|
||||||
blue_faction = self.faction_selection_page.selected_blue_faction
|
blue_faction = self.faction_selection_page.selected_blue_faction
|
||||||
red_faction = self.faction_selection_page.selected_red_faction
|
red_faction = self.faction_selection_page.selected_red_faction
|
||||||
|
|
||||||
|
logging.info("New campaign blue faction: %s", blue_faction.name)
|
||||||
|
logging.info("New campaign red faction: %s", red_faction.name)
|
||||||
|
|
||||||
theater = campaign.load_theater()
|
theater = campaign.load_theater()
|
||||||
|
|
||||||
|
logging.info("New campaign theater: %s", theater.terrain.name)
|
||||||
|
|
||||||
generator = GameGenerator(
|
generator = GameGenerator(
|
||||||
blue_faction,
|
blue_faction,
|
||||||
red_faction,
|
red_faction,
|
||||||
@@ -563,6 +574,8 @@ class GeneratorOptions(QtWidgets.QWizardPage):
|
|||||||
self.registerField("a4_skyhawk", a4_skyhawk)
|
self.registerField("a4_skyhawk", a4_skyhawk)
|
||||||
hercules = QtWidgets.QCheckBox()
|
hercules = QtWidgets.QCheckBox()
|
||||||
self.registerField("hercules", hercules)
|
self.registerField("hercules", hercules)
|
||||||
|
uh_60l = QtWidgets.QCheckBox()
|
||||||
|
self.registerField("uh_60l", uh_60l)
|
||||||
f22_raptor = QtWidgets.QCheckBox()
|
f22_raptor = QtWidgets.QCheckBox()
|
||||||
self.registerField("f22_raptor", f22_raptor)
|
self.registerField("f22_raptor", f22_raptor)
|
||||||
f104_starfighter = QtWidgets.QCheckBox()
|
f104_starfighter = QtWidgets.QCheckBox()
|
||||||
@@ -582,22 +595,38 @@ class GeneratorOptions(QtWidgets.QWizardPage):
|
|||||||
modHelpText.setAlignment(Qt.AlignCenter)
|
modHelpText.setAlignment(Qt.AlignCenter)
|
||||||
|
|
||||||
modLayout = QtWidgets.QGridLayout()
|
modLayout = QtWidgets.QGridLayout()
|
||||||
modLayout.addWidget(QtWidgets.QLabel("A-4E Skyhawk"), 1, 0)
|
modLayout_row = 1
|
||||||
modLayout.addWidget(a4_skyhawk, 1, 1)
|
modLayout.addWidget(QtWidgets.QLabel("A-4E Skyhawk"), modLayout_row, 0)
|
||||||
modLayout.addWidget(QtWidgets.QLabel("F-22A Raptor"), 2, 0)
|
modLayout.addWidget(a4_skyhawk, modLayout_row, 1)
|
||||||
modLayout.addWidget(f22_raptor, 2, 1)
|
modLayout_row += 1
|
||||||
modLayout.addWidget(QtWidgets.QLabel("F-104 Starfighter"), 3, 0)
|
modLayout.addWidget(QtWidgets.QLabel("F-22A Raptor"), modLayout_row, 0)
|
||||||
modLayout.addWidget(f104_starfighter, 3, 1)
|
modLayout.addWidget(f22_raptor, modLayout_row, 1)
|
||||||
modLayout.addWidget(QtWidgets.QLabel("C-130J-30 Super Hercules"), 4, 0)
|
modLayout_row += 1
|
||||||
modLayout.addWidget(hercules, 4, 1)
|
modLayout.addWidget(QtWidgets.QLabel("F-104 Starfighter"), modLayout_row, 0)
|
||||||
modLayout.addWidget(QtWidgets.QLabel("JAS 39 Gripen"), 5, 0)
|
modLayout.addWidget(f104_starfighter, modLayout_row, 1)
|
||||||
modLayout.addWidget(jas39_gripen, 5, 1)
|
modLayout_row += 1
|
||||||
modLayout.addWidget(QtWidgets.QLabel("Su-57 Felon"), 6, 0)
|
modLayout.addWidget(
|
||||||
modLayout.addWidget(su57_felon, 6, 1)
|
QtWidgets.QLabel("C-130J-30 Super Hercules"), modLayout_row, 0
|
||||||
modLayout.addWidget(QtWidgets.QLabel("Frenchpack"), 7, 0)
|
)
|
||||||
modLayout.addWidget(frenchpack, 7, 1)
|
modLayout.addWidget(hercules, modLayout_row, 1)
|
||||||
modLayout.addWidget(QtWidgets.QLabel("High Digit SAMs"), 8, 0)
|
modLayout_row += 1
|
||||||
modLayout.addWidget(high_digit_sams, 8, 1)
|
modLayout.addWidget(QtWidgets.QLabel("UH-60L Black Hawk"), modLayout_row, 0)
|
||||||
|
modLayout.addWidget(uh_60l, modLayout_row, 1)
|
||||||
|
modLayout_row += 1
|
||||||
|
# Section break here for readability
|
||||||
|
modLayout.addWidget(QtWidgets.QWidget(), modLayout_row, 0)
|
||||||
|
modLayout_row += 1
|
||||||
|
modLayout.addWidget(QtWidgets.QLabel("JAS 39 Gripen"), modLayout_row, 0)
|
||||||
|
modLayout.addWidget(jas39_gripen, modLayout_row, 1)
|
||||||
|
modLayout_row += 1
|
||||||
|
modLayout.addWidget(QtWidgets.QLabel("Su-57 Felon"), modLayout_row, 0)
|
||||||
|
modLayout.addWidget(su57_felon, modLayout_row, 1)
|
||||||
|
modLayout_row += 1
|
||||||
|
modLayout.addWidget(QtWidgets.QLabel("Frenchpack"), modLayout_row, 0)
|
||||||
|
modLayout.addWidget(frenchpack, modLayout_row, 1)
|
||||||
|
modLayout_row += 1
|
||||||
|
modLayout.addWidget(QtWidgets.QLabel("High Digit SAMs"), modLayout_row, 0)
|
||||||
|
modLayout.addWidget(high_digit_sams, modLayout_row, 1)
|
||||||
modSettingsGroup.setLayout(modLayout)
|
modSettingsGroup.setLayout(modLayout)
|
||||||
|
|
||||||
mlayout = QVBoxLayout()
|
mlayout = QVBoxLayout()
|
||||||
|
|||||||
@@ -169,6 +169,8 @@ class AutoSettingsLayout(QGridLayout):
|
|||||||
) -> None:
|
) -> None:
|
||||||
def on_changed(value: int) -> None:
|
def on_changed(value: int) -> None:
|
||||||
self.settings.__dict__[name] = value
|
self.settings.__dict__[name] = value
|
||||||
|
if description.causes_expensive_game_update:
|
||||||
|
self.write_full_settings()
|
||||||
|
|
||||||
spinner = QSpinBox()
|
spinner = QSpinBox()
|
||||||
spinner.setMinimum(description.min)
|
spinner.setMinimum(description.min)
|
||||||
@@ -354,7 +356,7 @@ class QSettingsWindow(QDialog):
|
|||||||
self.cheat_options.show_base_capture_cheat
|
self.cheat_options.show_base_capture_cheat
|
||||||
)
|
)
|
||||||
|
|
||||||
self.game.compute_conflicts_position()
|
self.game.compute_unculled_zones()
|
||||||
GameUpdateSignal.get_instance().updateGame(self.game)
|
GameUpdateSignal.get_instance().updateGame(self.game)
|
||||||
|
|
||||||
def onSelectionChanged(self):
|
def onSelectionChanged(self):
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ Pillow==8.3.2
|
|||||||
pluggy==0.13.1
|
pluggy==0.13.1
|
||||||
pre-commit==2.10.1
|
pre-commit==2.10.1
|
||||||
py==1.10.0
|
py==1.10.0
|
||||||
-e git://github.com/pydcs/dcs@5d1f581b260fdc6091744ab927a58cdee586e681#egg=pydcs
|
-e git+https://github.com/pydcs/dcs@5d1f581b260fdc6091744ab927a58cdee586e681#egg=pydcs
|
||||||
pyinstaller==4.3
|
pyinstaller==4.3
|
||||||
pyinstaller-hooks-contrib==2021.1
|
pyinstaller-hooks-contrib==2021.1
|
||||||
pyparsing==2.4.7
|
pyparsing==2.4.7
|
||||||
|
|||||||
BIN
resources/campaigns/Task Force Thunder.miz
Normal file
162
resources/campaigns/Task Force Thunder.yaml
Normal file
@@ -0,0 +1,162 @@
|
|||||||
|
---
|
||||||
|
name: Syria - Task Force Thunder
|
||||||
|
theater: Syria
|
||||||
|
authors: Sith1144
|
||||||
|
description: <p>A campaign based on the campaign from Combat Mission Shock Force. US forces attempt to bisect the country by advancing towards Homs from Iraq in the east and an amphibious landing near Tartus in the west. Recommended starting budge 3000-4000M for REDFOR, 2000-5000M for BLUFOR. Cannot be inverted. NOTE; the marine landing in the west does NOT have a workshop and cannot produce new units, nor does the first enemy airfield in the area. How many resources you pour into it is up to you.</p>
|
||||||
|
recommended_player_faction: USA 2005
|
||||||
|
recommended_enemy_faction: Syria 2011
|
||||||
|
recommended_start_date: 2009-06-19
|
||||||
|
miz: Task Force Thunder.miz
|
||||||
|
performance: 3
|
||||||
|
version: "9.1"
|
||||||
|
squadrons:
|
||||||
|
# Airspawn from Iraq
|
||||||
|
Al Asad Airbase:
|
||||||
|
- primary: AEW&C
|
||||||
|
aircraft:
|
||||||
|
- E-3A
|
||||||
|
- primary: BARCAP
|
||||||
|
secondary: air-to-air
|
||||||
|
aircraft:
|
||||||
|
- F-15C Eagle
|
||||||
|
- primary: Strike
|
||||||
|
secondary: air-to-ground
|
||||||
|
aircraft:
|
||||||
|
- B-1B Lancer
|
||||||
|
- B-52H Stratofortress
|
||||||
|
- F-117A Nighthawk
|
||||||
|
- primary: CAS
|
||||||
|
secondary: air-to-ground
|
||||||
|
aircraft:
|
||||||
|
- A-10C Thunderbolt II (Suite 7)
|
||||||
|
- primary: SEAD
|
||||||
|
secondary: any
|
||||||
|
aircraft:
|
||||||
|
- F-16CM Fighting Falcon (Block 50)
|
||||||
|
- primary: DEAD
|
||||||
|
secondary: any
|
||||||
|
aircraft:
|
||||||
|
- F-16CM Fighting Falcon (Block 50)
|
||||||
|
- primary: BAI
|
||||||
|
secondary: air-to-ground
|
||||||
|
aircraft: F-15E Strike Eagle
|
||||||
|
- primary: Refueling
|
||||||
|
aircraft:
|
||||||
|
- KC-135 Stratotanker MPRS
|
||||||
|
#H4 airbase
|
||||||
|
12:
|
||||||
|
- primary: BARCAP
|
||||||
|
secondary: any
|
||||||
|
aircraft:
|
||||||
|
- F-16CM Fighting Falcon (Block 50)
|
||||||
|
- primary: CAS
|
||||||
|
secondary: air-to-ground
|
||||||
|
aircraft:
|
||||||
|
- A-10C Thunderbolt II (Suite 3)
|
||||||
|
#Northern FOB
|
||||||
|
Staging Point Alpha:
|
||||||
|
- primary: CAS
|
||||||
|
aircraft:
|
||||||
|
- AH-64D Apache Longbow
|
||||||
|
#Carrier is called Naval-1
|
||||||
|
Naval-1:
|
||||||
|
- primary: BARCAP
|
||||||
|
secondary: air-to-air
|
||||||
|
aircraft:
|
||||||
|
- F-14B Tomcat
|
||||||
|
- primary: BARCAP
|
||||||
|
secondary: air-to-air
|
||||||
|
aircraft:
|
||||||
|
- F-14B Tomcat
|
||||||
|
- primary: Strike
|
||||||
|
secondary: any
|
||||||
|
aircraft:
|
||||||
|
- F/A-18C Hornet (Lot 20)
|
||||||
|
- primary: SEAD
|
||||||
|
secondary: any
|
||||||
|
aircraft:
|
||||||
|
- F/A-18C Hornet (Lot 20)
|
||||||
|
- primary: Refueling
|
||||||
|
aircraft:
|
||||||
|
- S-3B Tanker
|
||||||
|
- primary: AEW&C
|
||||||
|
aircraft:
|
||||||
|
- E-2C Hawkeye
|
||||||
|
#LHA is called Naval-2
|
||||||
|
Naval-2:
|
||||||
|
- primary: CAS
|
||||||
|
secondary: air-to-ground
|
||||||
|
aircraft:
|
||||||
|
- AV-8B Harrier II Night Attack
|
||||||
|
- primary: CAS
|
||||||
|
aircraft:
|
||||||
|
- AH-1W SuperCobra
|
||||||
|
# Al Qusayr - opposing the beach landing with old fighters (mig-23), CAS (su-17), helicopters (mi-24)
|
||||||
|
3:
|
||||||
|
- primary: BARCAP
|
||||||
|
secondary: any
|
||||||
|
aircraft:
|
||||||
|
- MiG-23MLD Flogger-K
|
||||||
|
- primary: CAS
|
||||||
|
secondary: air-to-ground
|
||||||
|
aircraft:
|
||||||
|
- Mi-24V Hind-E
|
||||||
|
- primary: CAS
|
||||||
|
secondary: air-to-ground
|
||||||
|
aircraft:
|
||||||
|
- Su-17M4 Fitter-K
|
||||||
|
# Tiyas - secondary base for good fighters (mig-25) and trainers (L-39)
|
||||||
|
39:
|
||||||
|
- primary: BARCAP
|
||||||
|
secondary: air-to-air
|
||||||
|
aircraft:
|
||||||
|
- MiG-25PD Foxbat-E
|
||||||
|
- primary: Strike
|
||||||
|
secondary: air-to-ground
|
||||||
|
aircraft:
|
||||||
|
- L-39ZA Albatros
|
||||||
|
- primary: BARCAP
|
||||||
|
secondary: air-to-air
|
||||||
|
aircraft:
|
||||||
|
- MiG-29S Fulcrum-C
|
||||||
|
# Palmyra - forward base, helicopters (mi-24, mi-8), old fighters (mig-21) and cas (su-17)
|
||||||
|
28:
|
||||||
|
- primary: BARCAP
|
||||||
|
secondary: any
|
||||||
|
aircraft:
|
||||||
|
- MiG-21bis Fishbed-N
|
||||||
|
- primary: CAS
|
||||||
|
secondary: air-to-ground
|
||||||
|
aircraft:
|
||||||
|
- Mi-24P Hind-F
|
||||||
|
- Su-17M4 Fitter-K
|
||||||
|
- primary: CAS
|
||||||
|
secondary: air-to-ground
|
||||||
|
aircraft:
|
||||||
|
- Su-17M4 Fitter-K
|
||||||
|
- primary: Transport
|
||||||
|
secondary: air-to-ground
|
||||||
|
aircraft:
|
||||||
|
- Mi-8MTV2 Hip
|
||||||
|
# Shayrat - main base for support planes (A-50, transport, tanker), strike craft (su-24) and modern fighters (mig-29)
|
||||||
|
36:
|
||||||
|
- primary: BARCAP
|
||||||
|
secondary: air-to-air
|
||||||
|
aircraft:
|
||||||
|
- MiG-29S Fulcrum-C
|
||||||
|
- primary: Strike
|
||||||
|
secondary: air-to-ground
|
||||||
|
aircraft:
|
||||||
|
- Su-24M Fencer-D
|
||||||
|
- primary: Refueling
|
||||||
|
aircraft:
|
||||||
|
- IL-78M
|
||||||
|
- primary: Transport
|
||||||
|
aircraft:
|
||||||
|
- IL-76MD
|
||||||
|
|
||||||
|
# Defensive Line FARP for gazelles
|
||||||
|
Defensive Line:
|
||||||
|
- primary: CAS
|
||||||
|
aircraft:
|
||||||
|
- SA 342M Gazelle
|
||||||
BIN
resources/campaigns/TblisiGap.miz
Normal file
86
resources/campaigns/TblisiGap.yaml
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
---
|
||||||
|
name: Caucasus - The Tblisi Gap
|
||||||
|
theater: Caucasus
|
||||||
|
authors: Sith1144
|
||||||
|
description: <p>A 1980 Cold-war-gone-hot campaign set in the hilly terrain between Tblisi and Kutaisi. Made for the Hind and Hip with a narrow front with lots of targets. Can also be played as Blufor Cold War vs GDR 1985 or as Blufor Modern vs a modern opfor faction. Recommended way to play is focusing on helicopters, with aggressive culling (50-60km is workable, maybe even lower)</p>
|
||||||
|
recommended_player_faction: Russia 1975 (Mi-24P)
|
||||||
|
recommended_enemy_faction: Germany 1990
|
||||||
|
recommended_start_date: 1980-09-21
|
||||||
|
miz: TblisiGap.miz
|
||||||
|
performance: 2
|
||||||
|
version: "9.1"
|
||||||
|
squadrons:
|
||||||
|
#Vaziani, blufor jet base
|
||||||
|
31:
|
||||||
|
- primary: BARCAP
|
||||||
|
secondary: air-to-air
|
||||||
|
aircraft:
|
||||||
|
- MiG-23MLD Flogger-K
|
||||||
|
- F-14A Tomcat (Block 135-GR Late)
|
||||||
|
- F/A-18C Hornet (Lot 20)
|
||||||
|
- primary: TARCAP
|
||||||
|
secondary: any
|
||||||
|
aircraft:
|
||||||
|
- MiG-21bis Fishbed-N
|
||||||
|
- F-16CM Fighting Falcon (Block 50)
|
||||||
|
- F-5E Tiger II
|
||||||
|
- primary: Strike
|
||||||
|
secondary: air-to-ground
|
||||||
|
aircraft:
|
||||||
|
- Su-17M4 Fitter-K
|
||||||
|
- AJS-37 Viggen
|
||||||
|
- primary: BAI
|
||||||
|
secondary: air-to-ground
|
||||||
|
aircraft:
|
||||||
|
- Su-25 Frogfoot
|
||||||
|
- A-10C Thunderbolt II (Suite 3)
|
||||||
|
- A-4E Skyhawk
|
||||||
|
- A-10A Thunderbolt II
|
||||||
|
- primary: Refueling
|
||||||
|
- primary: AEW&C
|
||||||
|
#Tbilisi-Lochini, blue helicopter base
|
||||||
|
29:
|
||||||
|
- primary: CAS
|
||||||
|
aircraft:
|
||||||
|
- Mi-24P Hind-F
|
||||||
|
- AV-8B Harrier II Night Attack
|
||||||
|
- Ka-50 Hokum
|
||||||
|
- AH-64D Apache Longbow
|
||||||
|
- primary: CAS
|
||||||
|
aircraft:
|
||||||
|
- Ka-50 Hokum
|
||||||
|
- SA 342M Gazelle
|
||||||
|
- Mi-24V Hind-E
|
||||||
|
- primary: Transport
|
||||||
|
aircraft:
|
||||||
|
- Mi-8MTV2 Hip
|
||||||
|
- UH-1H Iroquois
|
||||||
|
#frontline FARP, called "FARP Mayhem"
|
||||||
|
FARP Mayhem:
|
||||||
|
- primary: CAS
|
||||||
|
aircraft:
|
||||||
|
- AH-1W SuperCobra
|
||||||
|
- AH-64D Apache Longbow
|
||||||
|
- SA 342M Gazelle
|
||||||
|
- Ka-50 Hokum
|
||||||
|
- Mi-24V Hind-E
|
||||||
|
#Kutaisi, primary opfor base
|
||||||
|
25:
|
||||||
|
- primary: BAI
|
||||||
|
aircraft:
|
||||||
|
- Tornado IDS
|
||||||
|
- Su-17M4 Fitter-K
|
||||||
|
- Su-24M Fencer-D
|
||||||
|
- primary: BARCAP
|
||||||
|
aircraft:
|
||||||
|
- F-16CM Fighting Falcon (Block 50)
|
||||||
|
- F-4F Phantom II
|
||||||
|
- F-5E Tiger II
|
||||||
|
- MiG-23MLD Flogger-K
|
||||||
|
- FC-1 Fierce Dragon
|
||||||
|
- JF-17 Thunder
|
||||||
|
- Su-27 Flanker-B
|
||||||
|
#Senaki, secondary opfor base
|
||||||
|
23:
|
||||||
|
- primary: Transport
|
||||||
|
- primary: AEW&C
|
||||||
BIN
resources/campaigns/TheValleyOfRotary.miz
Normal file
65
resources/campaigns/TheValleyOfRotary.yaml
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
---
|
||||||
|
name: Persian Gulf - Valley of Rotary
|
||||||
|
theater: Persian Gulf
|
||||||
|
authors: Sith1144
|
||||||
|
description: <p>Helicopter counterinsurgency campaign set in Southern Iran</p>
|
||||||
|
recommended_player_faction: Iran 2015
|
||||||
|
recommended_enemy_faction: Insurgents (Hard)
|
||||||
|
recommended_start_date: 2022-06-13
|
||||||
|
miz: TheValleyOfRotary.miz
|
||||||
|
performance: 2
|
||||||
|
version: "9.1"
|
||||||
|
squadrons:
|
||||||
|
# Shiraz International, BLUFOR start
|
||||||
|
19:
|
||||||
|
- primary: CAS
|
||||||
|
aircraft:
|
||||||
|
- Mi-24P Hind-F
|
||||||
|
- AH-64D Apache Longbow
|
||||||
|
- AH-1J SeaCobra
|
||||||
|
- AH-1W SuperCobra
|
||||||
|
- primary: CAS
|
||||||
|
aircraft:
|
||||||
|
- Mi-24V Hind-E
|
||||||
|
- UH-1H Iroquois
|
||||||
|
- A-4E Skyhawk
|
||||||
|
- AV-8B Harrier II Night Attack
|
||||||
|
- L-39ZA Albatros
|
||||||
|
- C-101CC Aviojet
|
||||||
|
- primary: BAI
|
||||||
|
aircraft:
|
||||||
|
- Ka-50 Hokum
|
||||||
|
- SA 342M Gazelle
|
||||||
|
- AH-64D Apache Longbow
|
||||||
|
- Mi-28N Havoc
|
||||||
|
- primary: Transport
|
||||||
|
aircraft:
|
||||||
|
- Mi-8MTV2 Hip
|
||||||
|
- UH-1H Iroquois
|
||||||
|
- primary: CAS
|
||||||
|
secondary: air-to-ground
|
||||||
|
aircraft:
|
||||||
|
- A-10C Thunderbolt II (Suite 3)
|
||||||
|
- Su-25 Frogfoot
|
||||||
|
- Su-25T Frogfoot
|
||||||
|
- A-10A Thunderbolt II
|
||||||
|
# Jowkan FARP, REDFOR frontline.
|
||||||
|
Jowkan:
|
||||||
|
- primary: CAS
|
||||||
|
# Lar, REDFOR airbase + inverted start
|
||||||
|
11:
|
||||||
|
- primary: CAS
|
||||||
|
aircraft:
|
||||||
|
- Mi-24P Hind-F
|
||||||
|
- Mi-24V Hind-E
|
||||||
|
- UH-1H Iroquois
|
||||||
|
- A-4E Skyhawk
|
||||||
|
- AV-8B Harrier II Night Attack
|
||||||
|
- L-39ZA Albatros
|
||||||
|
- C-101CC Aviojet
|
||||||
|
# Mansurabad, inverted start frontline north
|
||||||
|
Mansurabad:
|
||||||
|
- primary: CAS
|
||||||
|
# Bagh, inverted start frontline south
|
||||||
|
Bagh:
|
||||||
|
- primary: Transport
|
||||||
@@ -294,6 +294,66 @@ local unitPayloads = {
|
|||||||
[1] = 32,
|
[1] = 32,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
[6] = {
|
||||||
|
["name"] = "Liberation OCA/Runway",
|
||||||
|
["pylons"] = {
|
||||||
|
[1] = {
|
||||||
|
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
|
||||||
|
["num"] = 1,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
||||||
|
["num"] = 3,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
|
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
|
||||||
|
["num"] = 4,
|
||||||
|
},
|
||||||
|
[4] = {
|
||||||
|
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
|
||||||
|
["num"] = 6,
|
||||||
|
},
|
||||||
|
[5] = {
|
||||||
|
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
|
||||||
|
["num"] = 7,
|
||||||
|
},
|
||||||
|
[6] = {
|
||||||
|
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
|
||||||
|
["num"] = 9,
|
||||||
|
},
|
||||||
|
[7] = {
|
||||||
|
["CLSID"] = "{E1F29B21-F291-4589-9FD8-3272EEC69506}",
|
||||||
|
["num"] = 10,
|
||||||
|
},
|
||||||
|
[8] = {
|
||||||
|
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
|
||||||
|
["num"] = 11,
|
||||||
|
},
|
||||||
|
[9] = {
|
||||||
|
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
|
||||||
|
["num"] = 13,
|
||||||
|
},
|
||||||
|
[10] = {
|
||||||
|
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
|
||||||
|
["num"] = 14,
|
||||||
|
},
|
||||||
|
[11] = {
|
||||||
|
["CLSID"] = "{BCE4E030-38E9-423E-98ED-24BE3DA87C32}",
|
||||||
|
["num"] = 16,
|
||||||
|
},
|
||||||
|
[12] = {
|
||||||
|
["CLSID"] = "{C8E06185-7CD6-4C90-959F-044679E90751}",
|
||||||
|
["num"] = 19,
|
||||||
|
},
|
||||||
|
[13] = {
|
||||||
|
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
||||||
|
["num"] = 17,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
["tasks"] = {
|
||||||
|
[1] = 11,
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
["unitType"] = "F-15E",
|
["unitType"] = "F-15E",
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -318,6 +318,54 @@ local unitPayloads = {
|
|||||||
["tasks"] = {
|
["tasks"] = {
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
[8] = {
|
||||||
|
["name"] = "Liberation OCA/Runway",
|
||||||
|
["pylons"] = {
|
||||||
|
[1] = {
|
||||||
|
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
||||||
|
["num"] = 1,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
["CLSID"] = "{5CE2FF2A-645A-4197-B48D-8720AC69394F}",
|
||||||
|
["num"] = 2,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
|
["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}",
|
||||||
|
["num"] = 3,
|
||||||
|
},
|
||||||
|
[4] = {
|
||||||
|
["CLSID"] = "{F376DBEE-4CAE-41BA-ADD9-B2910AC95DEC}",
|
||||||
|
["num"] = 4,
|
||||||
|
},
|
||||||
|
[5] = {
|
||||||
|
["CLSID"] = "ALQ_184",
|
||||||
|
["num"] = 5,
|
||||||
|
},
|
||||||
|
[6] = {
|
||||||
|
["CLSID"] = "{F376DBEE-4CAE-41BA-ADD9-B2910AC95DEC}",
|
||||||
|
["num"] = 6,
|
||||||
|
},
|
||||||
|
[7] = {
|
||||||
|
["CLSID"] = "{AB8B8299-F1CC-4359-89B5-2172E0CF4A5A}",
|
||||||
|
["num"] = 7,
|
||||||
|
},
|
||||||
|
[8] = {
|
||||||
|
["CLSID"] = "{5CE2FF2A-645A-4197-B48D-8720AC69394F}",
|
||||||
|
["num"] = 8,
|
||||||
|
},
|
||||||
|
[9] = {
|
||||||
|
["CLSID"] = "{40EF17B7-F508-45de-8566-6FFECC0C1AB8}",
|
||||||
|
["num"] = 9,
|
||||||
|
},
|
||||||
|
[10] = {
|
||||||
|
["CLSID"] = "{A111396E-D3E8-4b9c-8AC9-2432489304D5}",
|
||||||
|
["num"] = 11,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
["tasks"] = {
|
||||||
|
[1] = 11,
|
||||||
|
},
|
||||||
|
},
|
||||||
},
|
},
|
||||||
["unitType"] = "F-16C_50",
|
["unitType"] = "F-16C_50",
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,8 @@ local unitPayloads = {
|
|||||||
["name"] = "Tornado GR4",
|
["name"] = "Tornado GR4",
|
||||||
["payloads"] = {
|
["payloads"] = {
|
||||||
[1] = {
|
[1] = {
|
||||||
["name"] = "ANTISHIP",
|
["displayName"] = "Liberation CAS",
|
||||||
|
["name"] = "Liberation CAS",
|
||||||
["pylons"] = {
|
["pylons"] = {
|
||||||
[1] = {
|
[1] = {
|
||||||
["CLSID"] = "{8C3F26A1-FA0F-11d5-9190-00A0249B6F00}",
|
["CLSID"] = "{8C3F26A1-FA0F-11d5-9190-00A0249B6F00}",
|
||||||
@@ -17,32 +18,41 @@ local unitPayloads = {
|
|||||||
["num"] = 10,
|
["num"] = 10,
|
||||||
},
|
},
|
||||||
[4] = {
|
[4] = {
|
||||||
["CLSID"] = "{1461CD18-429A-42A9-A21F-4C621ECD4573}",
|
["CLSID"] = "{08164777-5E9C-4B08-B48E-5AA7AFB246E2}",
|
||||||
["num"] = 9,
|
["num"] = 8,
|
||||||
},
|
},
|
||||||
[5] = {
|
[5] = {
|
||||||
["CLSID"] = "{1461CD18-429A-42A9-A21F-4C621ECD4573}",
|
["CLSID"] = "{08164777-5E9C-4B08-B48E-5AA7AFB246E2}",
|
||||||
["num"] = 4,
|
["num"] = 7,
|
||||||
},
|
},
|
||||||
[6] = {
|
[6] = {
|
||||||
|
["CLSID"] = "{08164777-5E9C-4B08-B48E-5AA7AFB246E2}",
|
||||||
|
["num"] = 6,
|
||||||
|
},
|
||||||
|
[7] = {
|
||||||
|
["CLSID"] = "{08164777-5E9C-4B08-B48E-5AA7AFB246E2}",
|
||||||
|
["num"] = 5,
|
||||||
|
},
|
||||||
|
[8] = {
|
||||||
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
||||||
["num"] = 3,
|
["num"] = 3,
|
||||||
},
|
},
|
||||||
[7] = {
|
[9] = {
|
||||||
["CLSID"] = "{EF124821-F9BB-4314-A153-E0E2FE1162C4}",
|
["CLSID"] = "{EF124821-F9BB-4314-A153-E0E2FE1162C4}",
|
||||||
["num"] = 2,
|
["num"] = 2,
|
||||||
},
|
},
|
||||||
[8] = {
|
[10] = {
|
||||||
["CLSID"] = "{8C3F26A2-FA0F-11d5-9190-00A0249B6F00}",
|
["CLSID"] = "{8C3F26A2-FA0F-11d5-9190-00A0249B6F00}",
|
||||||
["num"] = 1,
|
["num"] = 1,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
["tasks"] = {
|
["tasks"] = {
|
||||||
[1] = 30,
|
[1] = 32,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
[2] = {
|
[2] = {
|
||||||
["name"] = "STRIKE",
|
["displayName"] = "Liberation Strike",
|
||||||
|
["name"] = "Liberation Strike",
|
||||||
["pylons"] = {
|
["pylons"] = {
|
||||||
[1] = {
|
[1] = {
|
||||||
["CLSID"] = "{8C3F26A1-FA0F-11d5-9190-00A0249B6F00}",
|
["CLSID"] = "{8C3F26A1-FA0F-11d5-9190-00A0249B6F00}",
|
||||||
@@ -65,32 +75,24 @@ local unitPayloads = {
|
|||||||
["num"] = 7,
|
["num"] = 7,
|
||||||
},
|
},
|
||||||
[6] = {
|
[6] = {
|
||||||
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
["CLSID"] = "{A111396E-D3E8-4b9c-8AC9-2432489304D5}",
|
||||||
["num"] = 6,
|
|
||||||
},
|
|
||||||
[7] = {
|
|
||||||
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
|
||||||
["num"] = 5,
|
["num"] = 5,
|
||||||
},
|
},
|
||||||
[8] = {
|
[7] = {
|
||||||
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
||||||
["num"] = 3,
|
["num"] = 3,
|
||||||
},
|
},
|
||||||
[9] = {
|
[8] = {
|
||||||
["CLSID"] = "{EF124821-F9BB-4314-A153-E0E2FE1162C4}",
|
["CLSID"] = "{EF124821-F9BB-4314-A153-E0E2FE1162C4}",
|
||||||
["num"] = 2,
|
["num"] = 2,
|
||||||
},
|
},
|
||||||
[10] = {
|
[9] = {
|
||||||
["CLSID"] = "{8C3F26A2-FA0F-11d5-9190-00A0249B6F00}",
|
["CLSID"] = "{8C3F26A2-FA0F-11d5-9190-00A0249B6F00}",
|
||||||
["num"] = 1,
|
["num"] = 1,
|
||||||
},
|
},
|
||||||
[11] = {
|
[10] = {
|
||||||
["CLSID"] = "{0D33DDAE-524F-4A4E-B5B8-621754FE3ADE}",
|
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
||||||
["num"] = 4,
|
["num"] = 6,
|
||||||
},
|
|
||||||
[12] = {
|
|
||||||
["CLSID"] = "{0D33DDAE-524F-4A4E-B5B8-621754FE3ADE}",
|
|
||||||
["num"] = 9,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
["tasks"] = {
|
["tasks"] = {
|
||||||
@@ -98,7 +100,8 @@ local unitPayloads = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
[3] = {
|
[3] = {
|
||||||
["name"] = "CAS",
|
["displayName"] = "Liberation Anti-ship",
|
||||||
|
["name"] = "Liberation Anti-ship",
|
||||||
["pylons"] = {
|
["pylons"] = {
|
||||||
[1] = {
|
[1] = {
|
||||||
["CLSID"] = "{8C3F26A1-FA0F-11d5-9190-00A0249B6F00}",
|
["CLSID"] = "{8C3F26A1-FA0F-11d5-9190-00A0249B6F00}",
|
||||||
@@ -113,48 +116,33 @@ local unitPayloads = {
|
|||||||
["num"] = 10,
|
["num"] = 10,
|
||||||
},
|
},
|
||||||
[4] = {
|
[4] = {
|
||||||
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
|
||||||
["num"] = 8,
|
|
||||||
},
|
|
||||||
[5] = {
|
|
||||||
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
|
||||||
["num"] = 7,
|
|
||||||
},
|
|
||||||
[6] = {
|
|
||||||
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
|
||||||
["num"] = 6,
|
|
||||||
},
|
|
||||||
[7] = {
|
|
||||||
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
|
||||||
["num"] = 5,
|
|
||||||
},
|
|
||||||
[8] = {
|
|
||||||
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
||||||
["num"] = 3,
|
["num"] = 3,
|
||||||
},
|
},
|
||||||
[9] = {
|
[5] = {
|
||||||
["CLSID"] = "{EF124821-F9BB-4314-A153-E0E2FE1162C4}",
|
["CLSID"] = "{EF124821-F9BB-4314-A153-E0E2FE1162C4}",
|
||||||
["num"] = 2,
|
["num"] = 2,
|
||||||
},
|
},
|
||||||
[10] = {
|
[6] = {
|
||||||
["CLSID"] = "{8C3F26A2-FA0F-11d5-9190-00A0249B6F00}",
|
["CLSID"] = "{8C3F26A2-FA0F-11d5-9190-00A0249B6F00}",
|
||||||
["num"] = 1,
|
["num"] = 1,
|
||||||
},
|
},
|
||||||
[11] = {
|
[7] = {
|
||||||
["CLSID"] = "{0D33DDAE-524F-4A4E-B5B8-621754FE3ADE}",
|
["CLSID"] = "{1461CD18-429A-42A9-A21F-4C621ECD4573}",
|
||||||
["num"] = 4,
|
|
||||||
},
|
|
||||||
[12] = {
|
|
||||||
["CLSID"] = "{0D33DDAE-524F-4A4E-B5B8-621754FE3ADE}",
|
|
||||||
["num"] = 9,
|
["num"] = 9,
|
||||||
},
|
},
|
||||||
|
[8] = {
|
||||||
|
["CLSID"] = "{1461CD18-429A-42A9-A21F-4C621ECD4573}",
|
||||||
|
["num"] = 4,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
["tasks"] = {
|
["tasks"] = {
|
||||||
[1] = 32,
|
[1] = 32,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
[4] = {
|
[4] = {
|
||||||
["name"] = "CAP",
|
["displayName"] = "Liberation SEAD",
|
||||||
|
["name"] = "Liberation SEAD",
|
||||||
["pylons"] = {
|
["pylons"] = {
|
||||||
[1] = {
|
[1] = {
|
||||||
["CLSID"] = "{8C3F26A1-FA0F-11d5-9190-00A0249B6F00}",
|
["CLSID"] = "{8C3F26A1-FA0F-11d5-9190-00A0249B6F00}",
|
||||||
@@ -165,11 +153,11 @@ local unitPayloads = {
|
|||||||
["num"] = 11,
|
["num"] = 11,
|
||||||
},
|
},
|
||||||
[3] = {
|
[3] = {
|
||||||
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
["CLSID"] = "{E6747967-B1F0-4C77-977B-AB2E6EB0C102}",
|
||||||
["num"] = 10,
|
["num"] = 10,
|
||||||
},
|
},
|
||||||
[4] = {
|
[4] = {
|
||||||
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
["CLSID"] = "{E6747967-B1F0-4C77-977B-AB2E6EB0C102}",
|
||||||
["num"] = 3,
|
["num"] = 3,
|
||||||
},
|
},
|
||||||
[5] = {
|
[5] = {
|
||||||
@@ -180,13 +168,71 @@ local unitPayloads = {
|
|||||||
["CLSID"] = "{8C3F26A2-FA0F-11d5-9190-00A0249B6F00}",
|
["CLSID"] = "{8C3F26A2-FA0F-11d5-9190-00A0249B6F00}",
|
||||||
["num"] = 1,
|
["num"] = 1,
|
||||||
},
|
},
|
||||||
|
[7] = {
|
||||||
|
["CLSID"] = "{E6747967-B1F0-4C77-977B-AB2E6EB0C102}",
|
||||||
|
["num"] = 9,
|
||||||
|
},
|
||||||
|
[8] = {
|
||||||
|
["CLSID"] = "{E6747967-B1F0-4C77-977B-AB2E6EB0C102}",
|
||||||
|
["num"] = 4,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
["tasks"] = {
|
["tasks"] = {
|
||||||
[1] = 17,
|
[1] = 32,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
[5] = {
|
[5] = {
|
||||||
["name"] = "SEAD",
|
["displayName"] = "Liberation DEAD",
|
||||||
|
["name"] = "Liberation DEAD",
|
||||||
|
["pylons"] = {
|
||||||
|
[1] = {
|
||||||
|
["CLSID"] = "{8C3F26A1-FA0F-11d5-9190-00A0249B6F00}",
|
||||||
|
["num"] = 12,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
["CLSID"] = "{EF124821-F9BB-4314-A153-E0E2FE1162C4}",
|
||||||
|
["num"] = 11,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
|
["CLSID"] = "{E6747967-B1F0-4C77-977B-AB2E6EB0C102}",
|
||||||
|
["num"] = 10,
|
||||||
|
},
|
||||||
|
[4] = {
|
||||||
|
["CLSID"] = "{E6747967-B1F0-4C77-977B-AB2E6EB0C102}",
|
||||||
|
["num"] = 3,
|
||||||
|
},
|
||||||
|
[5] = {
|
||||||
|
["CLSID"] = "{EF124821-F9BB-4314-A153-E0E2FE1162C4}",
|
||||||
|
["num"] = 2,
|
||||||
|
},
|
||||||
|
[6] = {
|
||||||
|
["CLSID"] = "{8C3F26A2-FA0F-11d5-9190-00A0249B6F00}",
|
||||||
|
["num"] = 1,
|
||||||
|
},
|
||||||
|
[7] = {
|
||||||
|
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
||||||
|
["num"] = 8,
|
||||||
|
},
|
||||||
|
[8] = {
|
||||||
|
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
||||||
|
["num"] = 7,
|
||||||
|
},
|
||||||
|
[9] = {
|
||||||
|
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
||||||
|
["num"] = 6,
|
||||||
|
},
|
||||||
|
[10] = {
|
||||||
|
["CLSID"] = "{A111396E-D3E8-4b9c-8AC9-2432489304D5}",
|
||||||
|
["num"] = 5,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
["tasks"] = {
|
||||||
|
[1] = 32,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
[6] = {
|
||||||
|
["displayName"] = "Liberation BAI",
|
||||||
|
["name"] = "Liberation BAI",
|
||||||
["pylons"] = {
|
["pylons"] = {
|
||||||
[1] = {
|
[1] = {
|
||||||
["CLSID"] = "{8C3F26A1-FA0F-11d5-9190-00A0249B6F00}",
|
["CLSID"] = "{8C3F26A1-FA0F-11d5-9190-00A0249B6F00}",
|
||||||
@@ -201,19 +247,19 @@ local unitPayloads = {
|
|||||||
["num"] = 10,
|
["num"] = 10,
|
||||||
},
|
},
|
||||||
[4] = {
|
[4] = {
|
||||||
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
["CLSID"] = "{08164777-5E9C-4B08-B48E-5AA7AFB246E2}",
|
||||||
["num"] = 8,
|
["num"] = 8,
|
||||||
},
|
},
|
||||||
[5] = {
|
[5] = {
|
||||||
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
["CLSID"] = "{08164777-5E9C-4B08-B48E-5AA7AFB246E2}",
|
||||||
["num"] = 7,
|
["num"] = 7,
|
||||||
},
|
},
|
||||||
[6] = {
|
[6] = {
|
||||||
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
["CLSID"] = "{08164777-5E9C-4B08-B48E-5AA7AFB246E2}",
|
||||||
["num"] = 6,
|
["num"] = 6,
|
||||||
},
|
},
|
||||||
[7] = {
|
[7] = {
|
||||||
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
|
["CLSID"] = "{08164777-5E9C-4B08-B48E-5AA7AFB246E2}",
|
||||||
["num"] = 5,
|
["num"] = 5,
|
||||||
},
|
},
|
||||||
[8] = {
|
[8] = {
|
||||||
@@ -228,14 +274,96 @@ local unitPayloads = {
|
|||||||
["CLSID"] = "{8C3F26A2-FA0F-11d5-9190-00A0249B6F00}",
|
["CLSID"] = "{8C3F26A2-FA0F-11d5-9190-00A0249B6F00}",
|
||||||
["num"] = 1,
|
["num"] = 1,
|
||||||
},
|
},
|
||||||
[11] = {
|
},
|
||||||
["CLSID"] = "{0D33DDAE-524F-4A4E-B5B8-621754FE3ADE}",
|
["tasks"] = {
|
||||||
["num"] = 4,
|
[1] = 32,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
[7] = {
|
||||||
|
["displayName"] = "Liberation OCA/Aircraft",
|
||||||
|
["name"] = "Liberation OCA/Aircraft",
|
||||||
|
["pylons"] = {
|
||||||
|
[1] = {
|
||||||
|
["CLSID"] = "{8C3F26A1-FA0F-11d5-9190-00A0249B6F00}",
|
||||||
|
["num"] = 12,
|
||||||
},
|
},
|
||||||
[12] = {
|
[2] = {
|
||||||
["CLSID"] = "{0D33DDAE-524F-4A4E-B5B8-621754FE3ADE}",
|
["CLSID"] = "{EF124821-F9BB-4314-A153-E0E2FE1162C4}",
|
||||||
|
["num"] = 11,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
|
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
||||||
|
["num"] = 10,
|
||||||
|
},
|
||||||
|
[4] = {
|
||||||
|
["CLSID"] = "{08164777-5E9C-4B08-B48E-5AA7AFB246E2}",
|
||||||
|
["num"] = 8,
|
||||||
|
},
|
||||||
|
[5] = {
|
||||||
|
["CLSID"] = "{08164777-5E9C-4B08-B48E-5AA7AFB246E2}",
|
||||||
|
["num"] = 7,
|
||||||
|
},
|
||||||
|
[6] = {
|
||||||
|
["CLSID"] = "{08164777-5E9C-4B08-B48E-5AA7AFB246E2}",
|
||||||
|
["num"] = 6,
|
||||||
|
},
|
||||||
|
[7] = {
|
||||||
|
["CLSID"] = "{08164777-5E9C-4B08-B48E-5AA7AFB246E2}",
|
||||||
|
["num"] = 5,
|
||||||
|
},
|
||||||
|
[8] = {
|
||||||
|
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
|
||||||
|
["num"] = 3,
|
||||||
|
},
|
||||||
|
[9] = {
|
||||||
|
["CLSID"] = "{EF124821-F9BB-4314-A153-E0E2FE1162C4}",
|
||||||
|
["num"] = 2,
|
||||||
|
},
|
||||||
|
[10] = {
|
||||||
|
["CLSID"] = "{8C3F26A2-FA0F-11d5-9190-00A0249B6F00}",
|
||||||
|
["num"] = 1,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
["tasks"] = {
|
||||||
|
[1] = 32,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
[8] = {
|
||||||
|
["displayName"] = "Liberation SEAD Escort",
|
||||||
|
["name"] = "Liberation SEAD Escort",
|
||||||
|
["pylons"] = {
|
||||||
|
[1] = {
|
||||||
|
["CLSID"] = "{8C3F26A1-FA0F-11d5-9190-00A0249B6F00}",
|
||||||
|
["num"] = 12,
|
||||||
|
},
|
||||||
|
[2] = {
|
||||||
|
["CLSID"] = "{EF124821-F9BB-4314-A153-E0E2FE1162C4}",
|
||||||
|
["num"] = 11,
|
||||||
|
},
|
||||||
|
[3] = {
|
||||||
|
["CLSID"] = "{E6747967-B1F0-4C77-977B-AB2E6EB0C102}",
|
||||||
|
["num"] = 10,
|
||||||
|
},
|
||||||
|
[4] = {
|
||||||
|
["CLSID"] = "{E6747967-B1F0-4C77-977B-AB2E6EB0C102}",
|
||||||
|
["num"] = 3,
|
||||||
|
},
|
||||||
|
[5] = {
|
||||||
|
["CLSID"] = "{EF124821-F9BB-4314-A153-E0E2FE1162C4}",
|
||||||
|
["num"] = 2,
|
||||||
|
},
|
||||||
|
[6] = {
|
||||||
|
["CLSID"] = "{8C3F26A2-FA0F-11d5-9190-00A0249B6F00}",
|
||||||
|
["num"] = 1,
|
||||||
|
},
|
||||||
|
[7] = {
|
||||||
|
["CLSID"] = "{E6747967-B1F0-4C77-977B-AB2E6EB0C102}",
|
||||||
["num"] = 9,
|
["num"] = 9,
|
||||||
},
|
},
|
||||||
|
[8] = {
|
||||||
|
["CLSID"] = "{E6747967-B1F0-4C77-977B-AB2E6EB0C102}",
|
||||||
|
["num"] = 4,
|
||||||
|
},
|
||||||
},
|
},
|
||||||
["tasks"] = {
|
["tasks"] = {
|
||||||
[1] = 32,
|
[1] = 32,
|
||||||
|
|||||||
42
resources/customized_payloads/UH-60L.lua
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
local unitPayloads =
|
||||||
|
{
|
||||||
|
["name"] = "UH-60L",
|
||||||
|
["payloads"] =
|
||||||
|
{
|
||||||
|
[1] =
|
||||||
|
{
|
||||||
|
["name"] = "Liberation Ferry",
|
||||||
|
["pylons"] =
|
||||||
|
{
|
||||||
|
[1] =
|
||||||
|
{
|
||||||
|
["CLSID"] = "{UH60_FUEL_TANK_230}",
|
||||||
|
["num"] = 1,
|
||||||
|
},
|
||||||
|
[2] =
|
||||||
|
{
|
||||||
|
["CLSID"] = "{UH60_FUEL_TANK_230}",
|
||||||
|
["num"] = 2,
|
||||||
|
},
|
||||||
|
[3] =
|
||||||
|
{
|
||||||
|
["CLSID"] = "{UH60_FUEL_TANK_230}",
|
||||||
|
["num"] = 3,
|
||||||
|
},
|
||||||
|
[4] =
|
||||||
|
{
|
||||||
|
["CLSID"] = "{UH60_FUEL_TANK_230}",
|
||||||
|
["num"] = 4,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
["tasks"] =
|
||||||
|
{
|
||||||
|
[1] = 35,
|
||||||
|
[2] = 17,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
["tasks"] = {},
|
||||||
|
["unitType"] = "UH-60L",
|
||||||
|
}
|
||||||
|
return unitPayloads
|
||||||
@@ -17,7 +17,7 @@
|
|||||||
"F-15C Eagle",
|
"F-15C Eagle",
|
||||||
"F-15E Strike Eagle",
|
"F-15E Strike Eagle",
|
||||||
"F-16CM Fighting Falcon (Block 50)",
|
"F-16CM Fighting Falcon (Block 50)",
|
||||||
"F-22A Raptor",
|
"F-22A Raptor",
|
||||||
"F/A-18C Hornet (Lot 20)",
|
"F/A-18C Hornet (Lot 20)",
|
||||||
"Mirage 2000C",
|
"Mirage 2000C",
|
||||||
"OH-58D Kiowa Warrior",
|
"OH-58D Kiowa Warrior",
|
||||||
@@ -27,7 +27,8 @@
|
|||||||
"SA 342M Gazelle Mistral",
|
"SA 342M Gazelle Mistral",
|
||||||
"Tornado GR4",
|
"Tornado GR4",
|
||||||
"UH-1H Iroquois",
|
"UH-1H Iroquois",
|
||||||
"UH-60A"
|
"UH-60A",
|
||||||
|
"UH-60L"
|
||||||
],
|
],
|
||||||
"awacs": [
|
"awacs": [
|
||||||
"E-2C Hawkeye",
|
"E-2C Hawkeye",
|
||||||
@@ -35,6 +36,7 @@
|
|||||||
],
|
],
|
||||||
"tankers": [
|
"tankers": [
|
||||||
"KC-130",
|
"KC-130",
|
||||||
|
"KC-130J",
|
||||||
"KC-135 Stratotanker",
|
"KC-135 Stratotanker",
|
||||||
"S-3B Tanker"
|
"S-3B Tanker"
|
||||||
],
|
],
|
||||||
@@ -48,7 +50,7 @@
|
|||||||
"M1134 Stryker ATGM (BGM-71 TOW)",
|
"M1134 Stryker ATGM (BGM-71 TOW)",
|
||||||
"M1A2 Abrams",
|
"M1A2 Abrams",
|
||||||
"M2A2 Bradley",
|
"M2A2 Bradley",
|
||||||
"M6 Linebacker",
|
"M6 Linebacker",
|
||||||
"Marder 1A3",
|
"Marder 1A3",
|
||||||
"VAB Mephisto"
|
"VAB Mephisto"
|
||||||
],
|
],
|
||||||
@@ -98,7 +100,7 @@
|
|||||||
],
|
],
|
||||||
"navy_generators": [
|
"navy_generators": [
|
||||||
"ArleighBurkeGroupGenerator",
|
"ArleighBurkeGroupGenerator",
|
||||||
"OliverHazardPerryGroupGenerator"
|
"OliverHazardPerryGroupGenerator"
|
||||||
],
|
],
|
||||||
"has_jtac": true,
|
"has_jtac": true,
|
||||||
"jtac_unit": "MQ-9 Reaper"
|
"jtac_unit": "MQ-9 Reaper"
|
||||||
|
|||||||
@@ -71,7 +71,8 @@
|
|||||||
"air_defenses": [
|
"air_defenses": [
|
||||||
"AvengerGenerator",
|
"AvengerGenerator",
|
||||||
"HawkGenerator",
|
"HawkGenerator",
|
||||||
"PatriotGenerator"
|
"PatriotGenerator",
|
||||||
|
"NasamCGenerator"
|
||||||
],
|
],
|
||||||
"ewrs": [
|
"ewrs": [
|
||||||
"PatriotEwrGenerator"
|
"PatriotEwrGenerator"
|
||||||
@@ -108,4 +109,4 @@
|
|||||||
"has_jtac": true,
|
"has_jtac": true,
|
||||||
"jtac_unit": "MQ-9 Reaper",
|
"jtac_unit": "MQ-9 Reaper",
|
||||||
"unrestricted_satnav": true
|
"unrestricted_satnav": true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,6 @@
|
|||||||
],
|
],
|
||||||
"aircrafts": [
|
"aircrafts": [
|
||||||
"Bf 109 K-4 Kurf\u00fcrst",
|
"Bf 109 K-4 Kurf\u00fcrst",
|
||||||
"Fw 190 A-8 Anton",
|
|
||||||
"Fw 190 D-9 Dora",
|
|
||||||
"Ju 88 A-4"
|
"Ju 88 A-4"
|
||||||
],
|
],
|
||||||
"frontline_units": [
|
"frontline_units": [
|
||||||
@@ -48,4 +46,4 @@
|
|||||||
"has_jtac": false,
|
"has_jtac": false,
|
||||||
"doctrine": "ww2",
|
"doctrine": "ww2",
|
||||||
"building_set": "ww2germany"
|
"building_set": "ww2germany"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,8 +8,6 @@
|
|||||||
],
|
],
|
||||||
"aircrafts": [
|
"aircrafts": [
|
||||||
"Bf 109 K-4 Kurf\u00fcrst",
|
"Bf 109 K-4 Kurf\u00fcrst",
|
||||||
"Fw 190 A-8 Anton",
|
|
||||||
"Fw 190 D-9 Dora",
|
|
||||||
"Ju 88 A-4"
|
"Ju 88 A-4"
|
||||||
],
|
],
|
||||||
"frontline_units": [
|
"frontline_units": [
|
||||||
@@ -51,4 +49,4 @@
|
|||||||
"has_jtac": false,
|
"has_jtac": false,
|
||||||
"doctrine": "ww2",
|
"doctrine": "ww2",
|
||||||
"building_set": "ww2germany"
|
"building_set": "ww2germany"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,7 +26,8 @@
|
|||||||
"M113",
|
"M113",
|
||||||
"M60A3 \"Patton\"",
|
"M60A3 \"Patton\"",
|
||||||
"ZSU-23-4 Shilka",
|
"ZSU-23-4 Shilka",
|
||||||
"ZU-23 on Ural-375"
|
"ZU-23 on Ural-375",
|
||||||
|
"ZSU-57-2 'Sparka'"
|
||||||
],
|
],
|
||||||
"artillery_units": [
|
"artillery_units": [
|
||||||
"2S1 Gvozdika",
|
"2S1 Gvozdika",
|
||||||
@@ -49,6 +50,7 @@
|
|||||||
"ZSU23Generator",
|
"ZSU23Generator",
|
||||||
"ZU23InsurgentGenerator",
|
"ZU23InsurgentGenerator",
|
||||||
"ZU23UralInsurgentGenerator",
|
"ZU23UralInsurgentGenerator",
|
||||||
|
"ZSU57Generator",
|
||||||
"ColdWarFlakGenerator"
|
"ColdWarFlakGenerator"
|
||||||
],
|
],
|
||||||
"ewrs": [
|
"ewrs": [
|
||||||
|
|||||||
@@ -35,7 +35,8 @@
|
|||||||
"M113",
|
"M113",
|
||||||
"M60A3 \"Patton\"",
|
"M60A3 \"Patton\"",
|
||||||
"T-72B with Kontakt-1 ERA",
|
"T-72B with Kontakt-1 ERA",
|
||||||
"ZSU-23-4 Shilka"
|
"ZSU-23-4 Shilka",
|
||||||
|
"ZSU-57-2 'Sparka'"
|
||||||
],
|
],
|
||||||
"artillery_units": [
|
"artillery_units": [
|
||||||
"2S1 Gvozdika",
|
"2S1 Gvozdika",
|
||||||
@@ -59,9 +60,11 @@
|
|||||||
"SA6Generator",
|
"SA6Generator",
|
||||||
"SA11Generator",
|
"SA11Generator",
|
||||||
"SA15Generator",
|
"SA15Generator",
|
||||||
|
"SA17Generator",
|
||||||
"ZSU23Generator",
|
"ZSU23Generator",
|
||||||
"ZU23InsurgentGenerator",
|
"ZU23InsurgentGenerator",
|
||||||
"ZU23UralInsurgentGenerator"
|
"ZU23UralInsurgentGenerator",
|
||||||
|
"ZSU57Generator"
|
||||||
],
|
],
|
||||||
"ewrs": [
|
"ewrs": [
|
||||||
"FlatFaceGenerator",
|
"FlatFaceGenerator",
|
||||||
|
|||||||
@@ -14,7 +14,8 @@
|
|||||||
"F-4E Phantom II",
|
"F-4E Phantom II",
|
||||||
"OH-58D Kiowa Warrior",
|
"OH-58D Kiowa Warrior",
|
||||||
"UH-1H Iroquois",
|
"UH-1H Iroquois",
|
||||||
"UH-60A"
|
"UH-60A",
|
||||||
|
"UH-60L"
|
||||||
],
|
],
|
||||||
"awacs": [
|
"awacs": [
|
||||||
"E-3A"
|
"E-3A"
|
||||||
|
|||||||
@@ -12,7 +12,8 @@
|
|||||||
"F-16CM Fighting Falcon (Block 50)",
|
"F-16CM Fighting Falcon (Block 50)",
|
||||||
"Mirage 2000-5",
|
"Mirage 2000-5",
|
||||||
"Mirage 2000C",
|
"Mirage 2000C",
|
||||||
"UH-60A"
|
"UH-60A",
|
||||||
|
"UH-60L"
|
||||||
],
|
],
|
||||||
"awacs": [
|
"awacs": [
|
||||||
"E-3A"
|
"E-3A"
|
||||||
|
|||||||
@@ -26,7 +26,8 @@
|
|||||||
"S-3B Viking",
|
"S-3B Viking",
|
||||||
"SH-60B Seahawk",
|
"SH-60B Seahawk",
|
||||||
"UH-1H Iroquois",
|
"UH-1H Iroquois",
|
||||||
"UH-60A"
|
"UH-60A",
|
||||||
|
"UH-60L"
|
||||||
],
|
],
|
||||||
"awacs": [
|
"awacs": [
|
||||||
"E-2C Hawkeye",
|
"E-2C Hawkeye",
|
||||||
@@ -34,6 +35,7 @@
|
|||||||
],
|
],
|
||||||
"tankers": [
|
"tankers": [
|
||||||
"KC-130",
|
"KC-130",
|
||||||
|
"KC-130J",
|
||||||
"KC-135 Stratotanker",
|
"KC-135 Stratotanker",
|
||||||
"S-3B Tanker"
|
"S-3B Tanker"
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -28,7 +28,8 @@
|
|||||||
"S-3B Viking",
|
"S-3B Viking",
|
||||||
"SH-60B Seahawk",
|
"SH-60B Seahawk",
|
||||||
"UH-1H Iroquois",
|
"UH-1H Iroquois",
|
||||||
"UH-60A"
|
"UH-60A",
|
||||||
|
"UH-60L"
|
||||||
],
|
],
|
||||||
"awacs": [
|
"awacs": [
|
||||||
"E-2C Hawkeye",
|
"E-2C Hawkeye",
|
||||||
@@ -36,6 +37,7 @@
|
|||||||
],
|
],
|
||||||
"tankers": [
|
"tankers": [
|
||||||
"KC-130",
|
"KC-130",
|
||||||
|
"KC-130J",
|
||||||
"KC-135 Stratotanker",
|
"KC-135 Stratotanker",
|
||||||
"KC-135 Stratotanker MPRS",
|
"KC-135 Stratotanker MPRS",
|
||||||
"S-3B Tanker"
|
"S-3B Tanker"
|
||||||
|
|||||||
BIN
resources/ui/misc/ukraine.png
Normal file
|
After Width: | Height: | Size: 7.5 KiB |
|
Before Width: | Height: | Size: 113 KiB After Width: | Height: | Size: 585 KiB |
BIN
resources/ui/units/aircrafts/banners/KC130J_24.jpg
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
resources/ui/units/aircrafts/banners/UH-60L_24.jpg
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
resources/ui/units/aircrafts/icons/KC130J_24.jpg
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
resources/ui/units/aircrafts/icons/Tornado GR4_24.jpg
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
BIN
resources/ui/units/aircrafts/icons/Tornado IDS_24.jpg
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
resources/ui/units/aircrafts/icons/UH-60L_24.jpg
Normal file
|
After Width: | Height: | Size: 1.8 KiB |
17
resources/units/aircraft/KC130J.yaml
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
description:
|
||||||
|
The Lockheed Martin (previously Lockheed) KC-130 is a family of the extended-range
|
||||||
|
tanker version of the C-130 Hercules transport aircraft modified for aerial refueling.
|
||||||
|
This version of the KC-130 tanker is designed for refueling at speeds of 120-130kts,
|
||||||
|
enabling refueling of helicopters such as the UH-60L.
|
||||||
|
introduced: 2004
|
||||||
|
manufacturer: Lockheed Martin
|
||||||
|
origin: USA
|
||||||
|
price: 25
|
||||||
|
role: Tanker
|
||||||
|
max_range: 1000
|
||||||
|
patrol:
|
||||||
|
# ~125 knots IAS
|
||||||
|
speed: 180
|
||||||
|
altitude: 22000
|
||||||
|
variants:
|
||||||
|
KC-130J: {}
|
||||||
@@ -27,7 +27,5 @@ radios:
|
|||||||
intra_flight: SCR522
|
intra_flight: SCR522
|
||||||
inter_flight: SCR522
|
inter_flight: SCR522
|
||||||
channels:
|
channels:
|
||||||
type: common
|
type: SCR-522
|
||||||
namer: SCR-522
|
namer: SCR-522
|
||||||
intra_flight_radio_index: 1
|
|
||||||
inter_flight_radio_index: 1
|
|
||||||
|
|||||||
@@ -27,7 +27,5 @@ radios:
|
|||||||
intra_flight: SCR522
|
intra_flight: SCR522
|
||||||
inter_flight: SCR522
|
inter_flight: SCR522
|
||||||
channels:
|
channels:
|
||||||
type: common
|
type: SCR-522
|
||||||
namer: SCR-522
|
namer: SCR-522
|
||||||
intra_flight_radio_index: 1
|
|
||||||
inter_flight_radio_index: 1
|
|
||||||
|
|||||||
@@ -27,7 +27,5 @@ radios:
|
|||||||
intra_flight: SCR522
|
intra_flight: SCR522
|
||||||
inter_flight: SCR522
|
inter_flight: SCR522
|
||||||
channels:
|
channels:
|
||||||
type: common
|
type: SCR-522
|
||||||
namer: SCR-522
|
namer: SCR-522
|
||||||
intra_flight_radio_index: 1
|
|
||||||
inter_flight_radio_index: 1
|
|
||||||
@@ -28,7 +28,5 @@ radios:
|
|||||||
intra_flight: SCR522
|
intra_flight: SCR522
|
||||||
inter_flight: SCR522
|
inter_flight: SCR522
|
||||||
channels:
|
channels:
|
||||||
type: common
|
type: SCR-522
|
||||||
namer: SCR-522
|
namer: SCR-522
|
||||||
intra_flight_radio_index: 1
|
|
||||||
inter_flight_radio_index: 1
|
|
||||||
|
|||||||
@@ -28,7 +28,5 @@ radios:
|
|||||||
intra_flight: SCR522
|
intra_flight: SCR522
|
||||||
inter_flight: SCR522
|
inter_flight: SCR522
|
||||||
channels:
|
channels:
|
||||||
type: common
|
type: SCR-522
|
||||||
namer: SCR-522
|
namer: SCR-522
|
||||||
intra_flight_radio_index: 1
|
|
||||||
inter_flight_radio_index: 1
|
|
||||||
|
|||||||
13
resources/units/aircraft/UH-60L.yaml
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
description:
|
||||||
|
The Sikorsky UH-60 Black Hawk is a four-blade, twin-engine, medium-lift utility helicopter manufactured by Sikorsky Aircraft.
|
||||||
|
The UH-60A entered service with the U.S. Army in 1979, to replace the Bell UH-1 Iroquois as the Army's tactical transport helicopter.
|
||||||
|
The UH-60L is an improved utility variant.
|
||||||
|
introduced: 1989
|
||||||
|
carrier_capable: true
|
||||||
|
lha_capable: true
|
||||||
|
manufacturer: Sikorsky
|
||||||
|
origin: USA
|
||||||
|
price: 4
|
||||||
|
role: Transport
|
||||||
|
variants:
|
||||||
|
UH-60L: {}
|
||||||
@@ -7,6 +7,6 @@ introduced: 1999
|
|||||||
manufacturer: Norinco
|
manufacturer: Norinco
|
||||||
origin: China
|
origin: China
|
||||||
price: 12
|
price: 12
|
||||||
role: Main Battle Tank
|
role: Infantry Fighting Vehicle
|
||||||
variants:
|
variants:
|
||||||
Type 04A (ZBD-04A): {}
|
Type 04A (ZBD-04A): {}
|
||||||
|
|||||||