Compare commits

...

32 Commits

Author SHA1 Message Date
RndName
edb10f60fb Update Changelog 2022-03-18 10:19:09 +01:00
DillieKoe
a7a28205a9 Fix unit role of Type 04A (ZBD-04A).
Fixes https://github.com/dcs-liberation/dcs_liberation/issues/2072.
2022-03-18 10:16:19 +01:00
Dan Albert
a22452baca Add Sith1144's new campaigns.
Fixes https://github.com/dcs-liberation/dcs_liberation/issues/1833.
Fixes https://github.com/dcs-liberation/dcs_liberation/issues/1834.
Fixes https://github.com/dcs-liberation/dcs_liberation/issues/1835.
2022-03-18 10:16:14 +01:00
Benjamin Fischer
8422823921 another high dpi fix which fixes some resizing issues. 2022-03-18 10:15:27 +01:00
Benjamin Fischer
30fe1ca6af Round balance and income in the finance window.
Fixes https://github.com/dcs-liberation/dcs_liberation/issues/1983
2022-03-18 10:14:01 +01:00
Benjamin Fischer
faf70debce fixes #1987 by adding highdpi qt attributes. 2022-03-18 10:13:56 +01:00
Benjamin Fischer
42929b08d8 Fixes #1774 by adding a logmessage for non ascii install path. 2022-03-18 10:13:50 +01:00
Benjamin Fischer
91bb5acd04 Log information about the generated campaign.
Fixes https://github.com/dcs-liberation/dcs_liberation/issues/1735
2022-03-18 10:13:30 +01:00
Benjamin Fischer
d69841f261 Make the flight dialog modal to prevent inventory loss.
Fixes https://github.com/dcs-liberation/dcs_liberation/issues/1971.
2022-03-18 10:13:18 +01:00
RndName
dba8c26887 Bump Version to 5.2.0 2022-03-18 09:45:57 +01:00
MetalStormGhost
bef27ffb20 UH-60L mod support
Resolves #1964 but adding CTLD will require the use of Liberation plugins and thus are not included in this pull request.

- Implemented support for the UH-60L mod by =X51= Kinkkujuustovoileipa, Cubeboy, Jonas, JinxxDCS, Dorian, =X51= Parzival & =X51= Lawson.
- Because the standard DCS tankers will not fly below 160ish knots, the UH-60L mod team have included a modified version of the KC-130 tanker designed for refueling at speeds of 120-130kts.
2022-03-17 21:47:05 +01:00
C. Perreau
d9eac37766 Update README.md 2022-03-17 20:31:52 +01:00
Khopa
39a5d4e7c4 Properly credit CC artwork author. 2022-03-17 20:31:48 +01:00
Khopa
ce4d388e27 🇺🇦 Support for Ukraine 2022-03-17 20:31:43 +01:00
RndName
3a318fbbdf Add OCA/Runway loadouts for F-15E and F-16C.
Unguided bombs for the AI.

cherry-pick from ac5d20ff82
2022-03-17 20:28:12 +01:00
RndName
526d082020 Loaadouts for the Tornado GR4
cherry-pick from 9f7f391609
2022-03-17 20:23:34 +01:00
Hornet2041
3d68eabcaa Remove Fw A-8 and D-9 from Germany 1940/1942 faction
cherry-pick from 8a66bf2e09
2022-03-17 20:20:51 +01:00
RndName
409a099339 changelog 2022-02-02 21:31:38 +01:00
RndName
0ba86af4fd Add NASAM Radar and Launcher to radar_db
This will allow correct calculation of the threat range and prevent creating a threat zone when the SR is dead.

cherry-pick from 3afc6ba
2022-02-02 21:31:38 +01:00
MetalStormGhost
99d4cb7ad5 Tolerate empty TGOs in max_threat_range.
cherry-pick from 3231d00
2022-02-02 21:31:21 +01:00
SnappyComebacks
815849ae64 Typhoon GR4 and Typhoon IDS images (#1970)
* Add icons for Tornado GR4 and Tornado IDS.

cherry-pick from b3a3eb4
2022-02-02 21:31:07 +01:00
Starfire13
31efac53f4 Update bluefor_modern.json
cherry-pick from 0300b77
2022-02-02 21:30:51 +01:00
RndName
3ede2b5755 Add otion to ignore the empty install dir warning message
Adds a do not show again checkbox to the empty install dir warning popup on lib start. This only appears when the install dir is empty to prevent mission scripting replacement.

Also adds a warning message to the log when the dir is empty. Will help to identify this in bug reports.

cherry-pick from 93a0db3
2022-02-02 21:30:35 +01:00
leemarov
de43c0d621 Fix unculled zones not updating when needed.
cherry-pick from 5d29184
2022-02-02 21:30:18 +01:00
MetalStormGhost
7a6ec30368 Add missing HTTPS to pydcs URL.
cherry-pick from ecd2f2b
2022-02-02 21:29:51 +01:00
RndName
08c3da9502 Update Iran factions / Revert previous changes
readded ZSU-57 and SA-17 as they can be used from the country even if dcs mission editor leaves the type empty / does not have them for the country.

cherry-pick from 194b4df
2022-02-02 21:28:36 +01:00
RndName
6d389f7612 Fix the P-47D and P-51D radio definition
set the correct ChannelAllocator
from common to SCR-522)

cherry-pick from d9b4342
2022-02-02 21:28:15 +01:00
Starfire13
bc3b6c2a26 Update Vegas Nerve campaign
cherry-pick from eb6c1871
2022-01-07 18:02:11 +01:00
RndName
041cd0057a Fix threat range calculation
threat range calculation had a hidden bug which could possibly lead to wrong threat range calculation

cherry-pick from 808db05d
2022-01-07 15:47:26 +01:00
RndName
57ee611d06 Update Distance comparison operators
remove order=True and implement the comparison operators manually to fix typing error

cherry-pick from 795df1a9
2022-01-07 15:47:11 +01:00
RndName
f63fae2d4f Fix incorrect threat range of SA-5
The SA-5 was not part of the radar_db.py and therefore the threat_range calculation was wrong / ever LN counted as threat even when the TR was dead. Also fixed a wrong unit for the SA-11 TELAR.

cherry-pick from 54745e78
2022-01-07 14:49:02 +01:00
RndName
cd120047cb Update Version to 5.1.1 2022-01-07 14:44:50 +01:00
63 changed files with 2233 additions and 147 deletions

View File

@@ -1,4 +1,6 @@
![Logo](https://i.imgur.com/c2k18E1.png) [![Logo](https://i.imgur.com/HJBT4BL.png)](https://shdwp.github.io/ukraine/)
(Github Readme Banner and Splash screen Artwork by Andriy Dankovych, CC BY-SA 4.0)
[![Patreon](https://img.shields.io/badge/patreon-become%20a%20patron-orange?logo=patreon)](https://patreon.com/khopa) [![Patreon](https://img.shields.io/badge/patreon-become%20a%20patron-orange?logo=patreon)](https://patreon.com/khopa)

View File

@@ -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

View File

@@ -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,

View File

@@ -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

View File

@@ -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:

View File

@@ -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 = []

View File

@@ -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,
) )

View File

@@ -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",

View File

@@ -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

View File

@@ -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:

View File

@@ -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)

View File

@@ -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

View File

@@ -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,
] ]

View File

@@ -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,

File diff suppressed because it is too large Load Diff

View 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)

View 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>&lt;dcs_installation_directory&gt;/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 (&lt;dcs_liberation_installation&gt;/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>&lt;dcs_installation_directory&gt;/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 (&lt;dcs_liberation_installation&gt;/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()

View File

@@ -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."""

View File

@@ -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"

View File

@@ -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()

View File

@@ -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")

View File

@@ -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(

View File

@@ -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"])

View File

@@ -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()

View File

@@ -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):

View File

@@ -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

Binary file not shown.

View 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

Binary file not shown.

View 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

Binary file not shown.

View 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

View File

@@ -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",
} }

View File

@@ -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",
} }

View File

@@ -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,

View 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

View File

@@ -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"

View File

@@ -71,7 +71,8 @@
"air_defenses": [ "air_defenses": [
"AvengerGenerator", "AvengerGenerator",
"HawkGenerator", "HawkGenerator",
"PatriotGenerator" "PatriotGenerator",
"NasamCGenerator"
], ],
"ewrs": [ "ewrs": [
"PatriotEwrGenerator" "PatriotEwrGenerator"

View File

@@ -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": [

View File

@@ -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": [

View File

@@ -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": [

View File

@@ -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",

View File

@@ -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"

View File

@@ -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"

View File

@@ -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"
], ],

View File

@@ -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"

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 113 KiB

After

Width:  |  Height:  |  Size: 585 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View 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: {}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View 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: {}

View File

@@ -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): {}