Compare commits

...

74 Commits

Author SHA1 Message Date
Dan Albert
5037a5c9d7 Bump version to 5.2.1. 2022-10-31 13:21:29 -07:00
Dan Albert
fb734d4f09 Note hold point fix in the changelog.
Fixes https://github.com/dcs-liberation/dcs_liberation/issues/2494.

(cherry picked from commit 73b7be0606)
2022-10-31 13:21:29 -07:00
Raffson
173b99f610 Fix for orbit's broken stop condition
(cherry picked from commit 7e7c920816d384001ac1dbf1bcbcf8ccaad4a093)
(cherry picked from commit 73ee2ba4c0)
2022-10-31 13:21:29 -07:00
RndName
a87fa119aa Set unrestricted_satnav for NATO factions
cherry-pick from f7f565477c
2022-03-26 17:11:43 +01:00
MetalStormGhost
eb8859ebea Don't reject exact fits when transferring squadrons.
cherry-pick from a024be6b1d
2022-03-26 15:39:40 +01:00
RndName
7e54c8dea7 Update changelog for 5.2.0 2022-03-26 13:19:12 +01:00
RndName
e86bd4fa14 Capaign update: Task Force Thunder
Submission by sith1144

cherry-pick from 6a6df8936e
2022-03-26 13:15:27 +01:00
RndName
178ae3774e Support campaign version 10.0 for Liberation 5.2.0
- add a new const to the version.py to allow future campaign version to be backwards compatible
- Version 10.0 was only about orientation of ground objects which does not break the compatibility so we can give support for this specific version
2022-03-26 12:47:02 +01:00
RndName
1988836c61 Campaign updates & submission by Fuzzle
- new campaign: Tripoint Hostility
- updated other campaings and set 10.0 compat

Submission by sgtfuzzle17

cherry-pick from
7b0676025b
9050e705ff
d30701c1bb
2022-03-26 12:23:58 +01:00
RndName
e0ba2609b1 Update pyinstaller dependency to match develop 2022-03-25 10:14:52 +01:00
Benjamin Fischer
72050df5ff Make Apache LHA capable.
cherry-pick from 8eb97136b0
2022-03-25 09:19:29 +01:00
Benjamin Fischer
28c775af60 Fix can_operate for airfields without runways.
cherry-pick from e9c5cac20c
2022-03-25 09:19:18 +01:00
RndName
3d5f94db1f Support for the AH-64D radios
- Support for the AH-64D radios
- Mention missing Radio preset support for AH-64D

cherry-pick from 437fdd6d12
2022-03-23 17:18:21 +01:00
RndName
c93695ac36 Update pydcs to fix issues with syria map updates 2022-03-22 13:18:20 +01:00
RndName
0b33b0f9fb Update pydcs to fix save-compat issues
fixes #2103
2022-03-22 11:53:08 +01:00
Starfire13
e043e6073e Peace Spring, Vectron's Claw, Vegas Nerve updates.
cherry-pick from 46e220cecc
2022-03-21 21:37:32 +01:00
Dan Albert
c7d764da85 Scenic Route II update.
cherry-pick from 123a44fefc
2022-03-21 10:07:25 +01:00
Dan Albert
367a7f9829 Add Apache squadrons.
cherry-pick from b683246647
2022-03-21 10:06:07 +01:00
Dan Albert
4a99b59a38 Fix helicopters at airfields breaking generation.
Helipads at airfields don't work well right now because they are not
counted as additional parking, but we should still allow them to take
off from the airfield parking.

Follow up work would be to fix the parking problem and allow adding
helipads to airfields, or maybe to just "ground" start helicopters at
airfields so they take off from parking rather than the runway.

cherry-pick from 2499276b2a
2022-03-21 00:06:34 +01:00
RndName
9b125a644e Update Changelog 2022-03-20 21:10:57 +01:00
bbirchnz
5a037d8b75 Add windsocks to FARPs
cherry-pick from 39152eab3c
2022-03-20 20:52:52 +01:00
MetalStormGhost
30ac898aa9 Updated the Community A-4E-C mod support to version 2.0.0
cherry-pick from 11328ea241
2022-03-20 20:48:09 +01:00
MetalStormGhost
74fb390dcd Commit JAS-39-C support update for v1.8.0-beta again 2022-03-20 20:48:09 +01:00
RndName
6f0119731b Fix heli spawn & farp helipad creation
cherry-pick from
ad0d3412fb
6f8c30ec81
c88fa6d2af
a53812c0fb
2022-03-20 20:48:04 +01:00
Ben Birch
a6e1dc14c3 Add all helipads to single group per FARP allowing take off from parking behavour
cherry-pick from a70a951192 with adoptions
2022-03-20 20:23:55 +01:00
RndName
d23b1fbb2c Temporary Workaround for weapon save compat
Adds a temporary workaround for save game loading when weapon data got removed and can not be updated anymore.

This can lead to some unexpected behaviour especially when generating the next turn miz as pydcs will most likely crash. This could be solved by just changing the loadout (not tested yet)
2022-03-20 19:49:58 +01:00
RndName
26f3bf5827 Fix for removed units
Latest dcs data exports have some units removed which were used in two generators.
2022-03-20 13:54:54 +01:00
RndName
48945c1ce9 Update pydcs to develop-5.2 fork 2022-03-20 13:46:15 +01:00
RndName
a75a3af13d Add support for the flyable Apache. 2022-03-20 13:40:50 +01:00
Dan Albert
a88cd60f31 Update pydcs. 2022-03-20 13:40:37 +01:00
RndName
86b204883a Revert "Add support for AH-64D_BLK_II as PyDCS Extension"
This reverts commit 7d65e55665.
2022-03-20 13:28:29 +01:00
walterroach
4d2289ece9 Add Starfire's loadouts for AH-64D_BLK_II 2022-03-18 13:02:12 -05:00
RndName
7d65e55665 Add support for AH-64D_BLK_II as PyDCS Extension
The new human flyable Apache will be handled like a mod in 5.X to be save compat and to prevent switching to the newest version of pydcs. There will no checkbox on the newgame wizard like with other mods as it can be used by everyone.

- exported the AH-64D_BLK_II and the weapon data from the latest open beta
- added the needed ressources
- maked the AH-64D_BLK_II as flyable
2022-03-18 10:25:09 +01:00
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
RndName
7bb41d07b3 Revert "Remove front line minimum distance."
This reverts commit dbe9691d
2022-01-07 09:59:14 +01:00
RndName
8aca036bf0 Update pydcs
Latest version with the new terrain from 2.7.9.18080

cherry-pick from 82dfeb8a
2022-01-06 21:30:50 +01:00
RndName
878695b2c7 Update for the nevada map update
Conflicttheater and Airfields needed an update as nearly all Nevada Airports were renamed with the last map update

cherry-pick from 8df9f698
2022-01-06 21:30:35 +01:00
Starfire13
f57bd2f253 Update campaign Exercise Vegas Nerve by Starfire
cherry-pick from 19713e61
2022-01-06 18:07:54 +01:00
RndName
cf7330e938 Update SA-5 Generator for factions without the TinShield
- added an EarlySA5Generator with the P-19 FlatFace SR which is supported by all factions
- allows factions without access to the TinShield to have a working SA-5

cherry-pick from f526681f
2022-01-05 01:09:49 +01:00
RndName
e56abbe768 Add Igla manpad INS ground unit
cherry-pick from 77edeac9
2022-01-04 23:56:37 +01:00
RndName
b7a92a2ebf Campaign submission from Fuzzle
- new campaign Scenic Route 2 - Dust To Dust including NATO_OIF faction and 3 squadrons
- update for pacific repartee

cherry-pick from 2c0d7c8e
2022-01-04 23:56:37 +01:00
RndName
a17b8dac7f Update faction Iran 1988 & 2015
support for the latest pydcs export as some units were not usable by the country

cherry-pick from 5c0227b8
2022-01-04 21:31:31 +01:00
MetalStormGhost
dbe9691d9e Remove front line minimum distance.
This isn't what it says. It doesn't enforce a minimum distance between
points, but a minimum path length, which isn't useful and isn't a
documented requirement.

cherry-pick from c844c364
2022-01-02 23:59:45 +01:00
121 changed files with 4534 additions and 1049 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)

View File

@@ -1,3 +1,36 @@
# 5.2.1
## Fixes
* **[Mission Generation]** Work around DCS 2.8 bug preventing the AI from leaving their hold point.
# 5.2.0
Saves from 5.1.0 are compatible with 5.2.0
## Features/Improvements
* **[Engine]** Support for DCS DCS 2.7.11.21408, including the new Apache AH-64D and the Syria map extension
* **[Mission Generation]** Improved FARP Helipad handling and creation (now includes windsocks)
* **[Modding]** Add UH-60L mod support
* **[Modding]** Updated Community A-4E-C mod version support to 2.0.0 release. Version 1.4.2 is no longer compatible, unless the mod default loadouts are deleted/modified.
* **[Modding]** Updated JAS-39-C mod support for v1.8.0-beta
* **[Campaign]** Peace Spring, Vectron's Claw, Vegas Nerve, Scenic Route 2 campaign update
* **[Campaign]** Added Tripoint Hostility campaign by Fuzzle
* **[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
* **[Mission Planner]** Now allows squadron transfers to control points where the number of free slots matches exactly the expected size of the transferring squadron next turn.
* **[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
Saves from 5.0.0 are compatible with 5.1.0
@@ -9,7 +42,6 @@ Saves from 5.0.0 are compatible with 5.1.0
* **[Mission Generation]** Add Option to enforce the Easy Communication setting for the mission
* **[Mission Generation]** Add Option to select between only night missions, day missions or any time (default).
* **[Modding]** Add F-104 mod support
## Fixes
* **[Campaign]** Fixed some minor issues in campaigns which generated error messages in the log.
@@ -18,7 +50,9 @@ Saves from 5.0.0 are compatible with 5.1.0
* **[Mission Generation]** Fixed mission scripting error when using a dedicated server.
* **[Mission Generation]** Fixed an issue where empty convoys lead to an index error when a point capture made a pending transfer of units not completable anymore.
* **[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.
* **[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

View File

@@ -22,7 +22,7 @@ from game.theater import (
SyriaTheater,
MarianaIslandsTheater,
)
from game.version import CAMPAIGN_FORMAT_VERSION
from game.version import CAMPAIGN_FORMAT_VERSION, SUPPORTED_CAMPAIGN_VERSION
from .campaignairwingconfig import CampaignAirWingConfig
from .mizcampaignloader import MizCampaignLoader
from .. import persistency
@@ -147,7 +147,7 @@ class Campaign:
@property
def is_from_future(self) -> bool:
"""Returns True if this campaign is newer than the supported format."""
return self.version > CAMPAIGN_FORMAT_VERSION
return self.version > SUPPORTED_CAMPAIGN_VERSION
@property
def is_compatible(self) -> bool:

View File

@@ -25,7 +25,7 @@ from dcs.vehicles import AirDefence
TELARS = {
AirDefence._2S6_Tunguska,
AirDefence.SA_11_Buk_SR_9S18M1,
AirDefence.SA_11_Buk_LN_9A310M1,
AirDefence.Osa_9A33_ln,
AirDefence.Tor_9A331,
AirDefence.Roland_ADS,
@@ -38,8 +38,10 @@ TRACK_RADARS = {
AirDefence.Hawk_tr,
AirDefence.Patriot_str,
AirDefence.SNR_75V,
AirDefence.RPC_5N62V,
AirDefence.Rapier_fsa_blindfire_radar,
AirDefence.HQ_7_STR_SP,
AirDefence.NASAMS_Radar_MPQ64F1,
}
LAUNCHER_TRACKER_PAIRS = {
@@ -52,6 +54,9 @@ LAUNCHER_TRACKER_PAIRS = {
AirDefence.S_75M_Volhov: AirDefence.SNR_75V,
AirDefence.Rapier_fsa_launcher: AirDefence.Rapier_fsa_blindfire_radar,
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 = {
@@ -80,6 +85,8 @@ UNITS_WITH_RADAR = {
AirDefence.Roland_Radar,
AirDefence.Snr_s_125_tr,
AirDefence.SNR_75V,
AirDefence.RLS_19J6,
AirDefence.RPC_5N62V,
AirDefence.Rapier_fsa_blindfire_radar,
AirDefence.HQ_7_LN_SP,
AirDefence.HQ_7_STR_SP,

View File

@@ -52,8 +52,13 @@ class Weapon:
def __setstate__(self, state: dict[str, Any]) -> None:
# Update any existing models with new data on load.
updated = Weapon.with_clsid(state["clsid"])
state.update(updated.__dict__)
try:
updated = Weapon.with_clsid(state["clsid"])
state.update(updated.__dict__)
except KeyError:
logging.exception(
f'CLSID {state["clsid"]} is not available anymore. This could potentially lead to some unexpected results when generating the next turn miz. To solve this issue it is recommended to update the loadout of all affected flights.'
)
self.__dict__.update(state)
@classmethod

View File

@@ -47,17 +47,21 @@ from pydcs_extensions.f22a.f22a import F_22A
from pydcs_extensions.hercules.hercules import Hercules
from pydcs_extensions.jas39.jas39 import JAS39Gripen, JAS39Gripen_AG
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["F-22A"] = F_22A
plane_map["Su-57"] = Su_57
plane_map["Hercules"] = Hercules
plane_map["KC130J"] = KC130J
plane_map["JAS39Gripen"] = JAS39Gripen
plane_map["JAS39Gripen_AG"] = JAS39Gripen_AG
plane_map["VSN_F104G"] = VSN_F104G
plane_map["VSN_F104S"] = VSN_F104S
plane_map["VSN_F104S_AG"] = VSN_F104S_AG
helicopter_map["UH-60L"] = UH_60L
vehicle_map["FieldHL"] = frenchpack._FIELD_HIDE
vehicle_map["HARRIERH"] = frenchpack._FIELD_HIDE_SMALL
vehicle_map["SMOKESAM"] = frenchpack.SMOKE_SAM_IR

View File

@@ -14,6 +14,7 @@ from dcs.unittype import FlyingType
from game.dcs.unittype import UnitType
from game.radio.channels import (
ApacheChannelNamer,
ChannelNamer,
RadioChannelAllocator,
CommonRadioChannelAllocator,
@@ -95,6 +96,7 @@ class RadioConfig:
"tomcat": TomcatChannelNamer,
"viggen": ViggenChannelNamer,
"viper": ViperChannelNamer,
"apache": ApacheChannelNamer,
}[config.get("namer", "default")]

View File

@@ -266,6 +266,9 @@ class Faction:
self.remove_aircraft("A-4E-C")
if not mod_settings.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:
self.remove_aircraft("F-22A")
if not mod_settings.f104_starfighter:

View File

@@ -248,7 +248,7 @@ class Game:
naming.namegen = self.name_generator
LuaPluginManager.load_settings(self.settings)
ObjectiveDistanceCache.set_theater(self.theater)
self.compute_conflicts_position()
self.compute_unculled_zones()
if not game_still_initializing:
self.compute_threat_zones()
@@ -389,8 +389,6 @@ class Game:
return self.process_win_loss(turn_state)
# Plan flights & combat for next turn
with logged_duration("Computing conflict positions"):
self.compute_conflicts_position()
with logged_duration("Threat zone computation"):
self.compute_threat_zones()
@@ -408,6 +406,10 @@ class Game:
gplanner.plan_groundwar()
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:
self.informations.append(Information(title, text, turn=self.turn))
@@ -448,10 +450,9 @@ class Game:
def navmesh_for(self, player: bool) -> NavMesh:
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
:return: List of points of interests
Compute the current conflict position(s) used for culling calculation
"""
zones = []

View File

@@ -258,6 +258,27 @@ class MirageChannelNamer(ChannelNamer):
return "mirage"
class ApacheChannelNamer(ChannelNamer):
"""Channel namer for the AH-64D Apache"""
@staticmethod
def channel_name(radio_id: int, channel_id: int) -> str:
# From the manual: Radio identifier (“VHF” for ARC-186, “UHF” for ARC-164,
# “FM1” for first ARC-201D, “FM2” for second ARC-201D, or “HF” for ARC-220).
radio_name = [
"VHF", # ARC-186
"UHF", # ARC-164
"FM1", # first ARC-201D
"FM2", # second ARC-201D
"HF", # ARC-220
][radio_id - 1]
return f"{radio_name} Ch {channel_id}"
@classmethod
def name(cls) -> str:
return "apache"
class TomcatChannelNamer(ChannelNamer):
"""Channel namer for the F-14."""

View File

@@ -19,6 +19,7 @@ def bounded_int_option(
max: int,
detail: Optional[str] = None,
tooltip: Optional[str] = None,
causes_expensive_game_update: bool = False,
**kwargs: Any,
) -> int:
return field(
@@ -29,7 +30,7 @@ def bounded_int_option(
text,
detail,
tooltip,
causes_expensive_game_update=False,
causes_expensive_game_update,
min=min,
max=max,
)

View File

@@ -430,6 +430,7 @@ class Settings:
default=100,
min=10,
max=10000,
causes_expensive_game_update=True,
)
perf_do_not_cull_carrier: bool = boolean_option(
"Do not cull carrier's surroundings",

View File

@@ -340,7 +340,7 @@ class Squadron:
)
return
if self.expected_size_next_turn >= destination.unclaimed_parking():
if self.expected_size_next_turn > destination.unclaimed_parking():
raise RuntimeError(f"Not enough parking for {self} at {destination}.")
if not destination.can_operate(self.aircraft):
raise RuntimeError(f"{self} cannot operate at {destination}.")

View File

@@ -325,8 +325,8 @@ class NevadaTheater(ConflictTheater):
terrain = nevada.Nevada()
overview_image = "nevada.gif"
reference_points = (
ReferencePoint(nevada.Mina_Airport_3Q0.position, Point(252, 295)),
ReferencePoint(nevada.Laughlin_Airport.position, Point(844, 909)),
ReferencePoint(nevada.Mina.position, Point(252, 295)),
ReferencePoint(nevada.Laughlin.position, Point(844, 909)),
)
landmap = load_landmap(Path("resources/nevlandmap.p"))
daytime_map = {

View File

@@ -889,7 +889,12 @@ class Airfield(ControlPoint):
# TODO: Allow harrier.
# Needs ground spawns just like helos do, but also need to be able to
# limit takeoff weight to ~20500 lbs or it won't be able to take off.
return self.runway_is_operational()
# return false if aircraft is fixed wing and airport has no runways
if not aircraft.helicopter and not self.airport.runways:
return False
else:
return self.runway_is_operational()
def mission_types(self, for_player: bool) -> Iterator[FlightType]:
from gen.flights.flight import FlightType

View File

@@ -72,6 +72,7 @@ class ModSettings:
f22_raptor: bool = False
f104_starfighter: bool = False
hercules: bool = False
uh_60l: bool = False
jas39_gripen: bool = False
su57_felon: 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")
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:
return self._max_range_of_type(group, "threat_range")
@@ -527,7 +529,7 @@ class SamGroundObject(IadsGroundObject):
max_tel_range = meters(0)
for launcher in launchers:
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:
return max(max_tel_range, max_telar_range)
else:

View File

@@ -21,7 +21,7 @@ INHG_TO_HPA = 33.86389
INHG_TO_MMHG = 25.400002776728
@dataclass(frozen=True, order=True)
@dataclass(frozen=True)
class Distance:
distance_in_meters: float
@@ -73,6 +73,18 @@ class Distance:
def __bool__(self) -> bool:
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:
return Distance.from_feet(value)

View File

@@ -2,8 +2,8 @@ from pathlib import Path
MAJOR_VERSION = 5
MINOR_VERSION = 1
MICRO_VERSION = 0
MINOR_VERSION = 2
MICRO_VERSION = 1
def _build_version_string() -> str:
@@ -124,3 +124,6 @@ VERSION = _build_version_string()
#: * Campaign files can optionally define a start date with
#: `recommended_start_date: YYYY-MM-DD`.
CAMPAIGN_FORMAT_VERSION = (9, 1)
# Version 5.2.0 of DCS Liberation also supports Campaigns of Version 10.0
SUPPORTED_CAMPAIGN_VERSION = (10, 0)

View File

@@ -9,7 +9,7 @@ from functools import cached_property
from typing import Any, Dict, Iterable, List, Optional, TYPE_CHECKING, Type, Union
from dcs import helicopters
from dcs.action import AITaskPush, ActivateGroup
from dcs.action import AITaskPush, ActivateGroup, SetFlag
from dcs.condition import CoalitionHasAirdrome, TimeAfter
from dcs.country import Country
from dcs.flyingunit import FlyingUnit
@@ -76,6 +76,7 @@ from game.theater.controlpoint import (
Airfield,
ControlPoint,
ControlPointType,
Fob,
NavalControlPoint,
OffMapSpawn,
)
@@ -231,7 +232,7 @@ class AircraftConflictGenerator:
laser_code_registry: LaserCodeRegistry,
unit_map: UnitMap,
air_support: AirSupport,
helipads: dict[ControlPoint, list[StaticGroup]],
helipads: dict[ControlPoint, StaticGroup],
) -> None:
self.m = mission
self.game = game
@@ -576,9 +577,9 @@ class AircraftConflictGenerator:
)
try:
helipad = self.helipads[cp].pop()
except IndexError as ex:
raise RuntimeError(f"Not enough helipads available at {cp}") from ex
helipad = self.helipads[cp]
except IndexError:
raise NoParkingSlotError
group = self._generate_at_group(
name=name,
@@ -589,21 +590,12 @@ class AircraftConflictGenerator:
at=helipad,
)
# Note : A bit dirty, need better support in pydcs
group.points[0].action = PointAction.FromGroundArea
group.points[0].type = "TakeOffGround"
group.units[0].heading = helipad.units[0].heading
if start_type != "Cold":
group.points[0].action = PointAction.FromGroundAreaHot
group.points[0].type = "TakeOffGroundHot"
group.points[0].type = "TakeOffParkingHot"
for i in range(count - 1):
try:
helipad = self.helipads[cp].pop()
group.units[1 + i].position = Point(helipad.x, helipad.y)
group.units[1 + i].heading = helipad.units[0].heading
except IndexError as ex:
raise RuntimeError(f"Not enough helipads available at {cp}") from ex
group.units[i].position = helipad.units[i].position
group.units[i].heading = helipad.units[i].heading
return group
def _add_radio_waypoint(
@@ -787,22 +779,20 @@ class AircraftConflictGenerator:
start_type=flight.start_type,
at=carrier_group,
)
else:
# If the flight is an helicopter flight, then prioritize dedicated helipads
if flight.unit_type.helicopter:
return self._generate_at_cp_helipad(
name=name,
side=country,
unit_type=flight.unit_type.dcs_unit_type,
count=flight.count,
start_type=flight.start_type,
cp=cp,
)
if not isinstance(cp, Airfield):
elif isinstance(cp, Fob):
if not flight.unit_type.helicopter:
raise RuntimeError(
f"Attempted to spawn at airfield for non-airfield {cp}"
f"Cannot spawn fixed-wing aircraft at {cp} because it is a FOB"
)
return self._generate_at_cp_helipad(
name=name,
side=country,
unit_type=flight.unit_type.dcs_unit_type,
count=flight.count,
start_type=flight.start_type,
cp=cp,
)
elif isinstance(cp, Airfield):
return self._generate_at_airport(
name=name,
side=country,
@@ -811,6 +801,10 @@ class AircraftConflictGenerator:
start_type=flight.start_type,
airport=cp.airport,
)
else:
raise NotImplementedError(
f"Aircraft spawn behavior not implemented for {cp} ({cp.__class__})"
)
except Exception as e:
# Generated when there is no place on Runway or on Parking Slots
logging.error(e)
@@ -1496,6 +1490,24 @@ class DefaultWaypointBuilder(PydcsWaypointBuilder):
pass
def create_stop_orbit_trigger(
orbit: ControlledTask, package: Package, mission: Mission, stop_after: int
) -> None:
orbit.stop_if_user_flag(id(package), True)
orbits = [
x
for x in mission.triggerrules.triggers
if x.comment == f"StopOrbit{id(package)}"
]
if not any(orbits):
stop_trigger = TriggerOnce(Event.NoEvent, f"StopOrbit{id(package)}")
stop_condition = TimeAfter(stop_after)
stop_action = SetFlag(id(package))
stop_trigger.add_condition(stop_condition)
stop_trigger.add_action(stop_action)
mission.triggerrules.triggers.append(stop_trigger)
class HoldPointBuilder(PydcsWaypointBuilder):
def build(self) -> MovingPoint:
waypoint = super().build()
@@ -1512,7 +1524,11 @@ class HoldPointBuilder(PydcsWaypointBuilder):
return waypoint
push_time = self.flight.flight_plan.push_time
self.waypoint.departure_time = push_time
loiter.stop_after_time(int(push_time.total_seconds()))
stop_after = int(push_time.total_seconds())
loiter.stop_after_time(stop_after)
# What follows is some code to cope with the broken 'stop after time' condition
create_stop_orbit_trigger(loiter, self.package, self.mission, stop_after)
# end of hotfix
waypoint.add_task(loiter)
return waypoint
@@ -1881,7 +1897,11 @@ class RaceTrackBuilder(PydcsWaypointBuilder):
racetrack = ControlledTask(orbit)
self.set_waypoint_tot(waypoint, flight_plan.patrol_start_time)
racetrack.stop_after_time(int(flight_plan.patrol_end_time.total_seconds()))
stop_after = int(flight_plan.patrol_end_time.total_seconds())
racetrack.stop_after_time(stop_after)
# What follows is some code to cope with the broken 'stop after time' condition
create_stop_orbit_trigger(racetrack, self.package, self.mission, stop_after)
# end of hotfix
waypoint.add_task(racetrack)
return waypoint

View File

@@ -1058,20 +1058,20 @@ AIRFIELD_DATA = {
"8": ("IGZP", MHz(108, 500)),
},
),
# NTTR
"Mina Airport 3Q0": AirfieldData(
theater="NTTR",
# Nevada
"Mina": AirfieldData(
theater="Nevada",
elevation=4562,
runway_length=4222,
),
"Tonopah Airport": AirfieldData(
theater="NTTR",
"Tonopah": AirfieldData(
theater="Nevada",
icao="KTPH",
elevation=5394,
runway_length=6715,
),
"Tonopah Test Range Airfield": AirfieldData(
theater="NTTR",
"Tonopah Test Range": AirfieldData(
theater="Nevada",
icao="KTNX",
elevation=5534,
runway_length=11633,
@@ -1083,19 +1083,19 @@ AIRFIELD_DATA = {
"14": ("I-RVP", MHz(108, 300)),
},
),
"Beatty Airport": AirfieldData(
theater="NTTR",
"Beatty": AirfieldData(
theater="Nevada",
icao="KBTY",
elevation=3173,
runway_length=5380,
),
"Pahute Mesa Airstrip": AirfieldData(
theater="NTTR",
"Pahute Mesa": AirfieldData(
theater="Nevada",
elevation=5056,
runway_length=5420,
),
"Groom Lake AFB": AirfieldData(
theater="NTTR",
"Groom Lake": AirfieldData(
theater="Nevada",
icao="KXTA",
elevation=4494,
runway_length=11008,
@@ -1107,18 +1107,18 @@ AIRFIELD_DATA = {
},
),
"Lincoln County": AirfieldData(
theater="NTTR",
theater="Nevada",
elevation=4815,
runway_length=4408,
),
"Mesquite": AirfieldData(
theater="NTTR",
theater="Nevada",
icao="67L",
elevation=1858,
runway_length=4937,
),
"Creech AFB": AirfieldData(
theater="NTTR",
"Creech": AirfieldData(
theater="Nevada",
icao="KINS",
elevation=3126,
runway_length=6100,
@@ -1130,7 +1130,7 @@ AIRFIELD_DATA = {
},
),
"Echo Bay": AirfieldData(
theater="NTTR",
theater="Nevada",
icao="OL9",
elevation=3126,
runway_length=6100,
@@ -1138,8 +1138,8 @@ AIRFIELD_DATA = {
tacan_callsign="INS",
atc=AtcData(MHz(3, 825), MHz(118, 300), MHz(38, 550), MHz(360, 600)),
),
"Nellis AFB": AirfieldData(
theater="NTTR",
"Nellis": AirfieldData(
theater="Nevada",
icao="KLSV",
elevation=1841,
runway_length=9454,
@@ -1151,14 +1151,14 @@ AIRFIELD_DATA = {
},
),
"North Las Vegas": AirfieldData(
theater="NTTR",
theater="Nevada",
icao="KVGT",
elevation=2228,
runway_length=4734,
atc=AtcData(MHz(3, 775), MHz(125, 700), MHz(38, 450), MHz(360, 750)),
),
"McCarran International Airport": AirfieldData(
theater="NTTR",
"McCarran International": AirfieldData(
theater="Nevada",
icao="KLAS",
elevation=2169,
runway_length=10377,
@@ -1169,26 +1169,26 @@ AIRFIELD_DATA = {
"25": ("I-LAS", MHz(110, 300)),
},
),
"Henderson Executive Airport": AirfieldData(
theater="NTTR",
"Henderson Executive": AirfieldData(
theater="Nevada",
icao="KHND",
elevation=2491,
runway_length=5999,
atc=AtcData(MHz(3, 925), MHz(125, 100), MHz(38, 750), MHz(250, 100)),
),
"Boulder City Airport": AirfieldData(
theater="NTTR",
"Boulder City": AirfieldData(
theater="Nevada",
icao="KBVU",
elevation=2121,
runway_length=4612,
),
"Jean Airport": AirfieldData(
theater="NTTR",
"Jean": AirfieldData(
theater="Nevada",
elevation=2824,
runway_length=4053,
),
"Laughlin Airport": AirfieldData(
theater="NTTR",
"Laughlin": AirfieldData(
theater="Nevada",
icao="KIFP",
elevation=656,
runway_length=7139,

View File

@@ -6,6 +6,7 @@ from dcs.helicopters import (
AH_1W,
AH_64A,
AH_64D,
AH_64D_BLK_II,
CH_47D,
CH_53E,
Ka_50,
@@ -125,6 +126,8 @@ from pydcs_extensions.su57.su57 import Su_57
# factions that also have F-4s should not.
# 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 = [
Su_57,
F_22A,
@@ -208,6 +211,7 @@ CAS_CAPABLE = [
MiG_27K,
MiG_29A,
MiG_21Bis,
AH_64D_BLK_II,
AH_64D,
AH_64A,
AH_1W,
@@ -470,6 +474,7 @@ TRANSPORT_CAPABLE = [
Yak_40,
CH_53E,
CH_47D,
UH_60L,
SH_60B,
UH_60A,
UH_1H,
@@ -492,6 +497,7 @@ REFUELING_CAPABALE = [
KC_135,
KC135MPRS,
IL_78M,
KC130J,
KC130,
S_3B_Tanker,
]

View File

@@ -605,43 +605,56 @@ class HelipadGenerator:
self.game = game
self.radio_registry = radio_registry
self.tacan_registry = tacan_registry
self.helipads: list[StaticGroup] = []
self.helipads: Optional[StaticGroup] = None
def generate(self) -> None:
# Note : Helipad are generated as neutral object in order not to interfer with capture triggers
neutral_country = self.m.country(self.game.neutral_country.name)
# This gets called for every control point, so we don't want to add an empty group (causes DCS mission editor to crash)
if len(self.cp.helipads) == 0:
return
# Note: Helipad are generated as neutral object in order not to interfer with
# capture triggers
country = self.m.country(self.game.coalition_for(self.cp.captured).country_name)
for i, helipad in enumerate(self.cp.helipads):
name = self.cp.name + "_helipad_" + str(i)
logging.info("Generating helipad static : " + name)
pad = InvisibleFARP(unit_id=self.m.next_unit_id(), name=name)
pad.position = Point(helipad.x, helipad.y)
pad.heading = helipad.heading.degrees
sg = unitgroup.StaticGroup(self.m.next_group_id(), name)
sg.add_unit(pad)
sp = StaticPoint()
sp.position = pad.position
sg.add_point(sp)
neutral_country.add_static_group(sg)
self.helipads.append(sg)
heading = helipad.heading.degrees
name_i = self.cp.name + "_helipad" + "_" + str(i)
if self.helipads is None:
self.helipads = self.m.farp(
self.m.country(self.game.neutral_country.name),
name_i,
helipad,
farp_type="InvisibleFARP",
)
else:
# Create a new Helipad Unit
self.helipads.add_unit(InvisibleFARP(self.m.next_unit_id(), name_i))
pad = self.helipads.units[-1]
pad.position = helipad
pad.heading = heading
# Generate a FARP Ammo and Fuel stack for each pad
self.m.static_group(
country=country,
name=(name + "_fuel"),
name=(name_i + "_fuel"),
_type=Fortification.FARP_Fuel_Depot,
position=pad.position.point_from_heading(helipad.heading.degrees, 35),
heading=pad.heading,
position=helipad.point_from_heading(heading, 35),
heading=heading,
)
self.m.static_group(
country=country,
name=(name + "_ammo"),
name=(name_i + "_ammo"),
_type=Fortification.FARP_Ammo_Dump_Coating,
position=helipad.point_from_heading(heading, 35).point_from_heading(
heading + 90, 10
),
heading=heading,
)
self.m.static_group(
country=country,
name=(name_i + "_ws"),
_type=Fortification.Windsock,
position=pad.position.point_from_heading(
helipad.heading.degrees, 35
).point_from_heading(helipad.heading.degrees + 90, 10),
helipad.heading.degrees + 45, 35
),
heading=pad.heading,
)
@@ -670,7 +683,7 @@ class GroundObjectsGenerator:
self.unit_map = unit_map
self.icls_alloc = iter(range(1, 21))
self.runways: Dict[str, RunwayData] = {}
self.helipads: dict[ControlPoint, list[StaticGroup]] = defaultdict(list)
self.helipads: dict[ControlPoint, StaticGroup] = {}
def generate(self) -> None:
for cp in self.game.theater.controlpoints:
@@ -681,7 +694,8 @@ class GroundObjectsGenerator:
self.m, cp, self.game, self.radio_registry, self.tacan_registry
)
helipad_gen.generate()
self.helipads[cp] = helipad_gen.helipads
if helipad_gen.helipads is not None:
self.helipads[cp] = helipad_gen.helipads
for ground_object in cp.ground_objects:
generator: GenericGroundObjectGenerator[Any]

View File

@@ -63,13 +63,6 @@ class AllyWW2FlakGenerator(AirDefenseGroupGenerator):
self.position.y + 20,
Heading.random(),
)
self.add_unit(
Unarmed.M4_Tractor,
"LOG#2",
self.position.x + 20,
self.position.y,
Heading.random(),
)
self.add_unit(
Unarmed.Bedford_MWD,
"LOG#3",

View File

@@ -49,7 +49,7 @@ from gen.sam.sam_sa17 import SA17Generator
from gen.sam.sam_sa19 import SA19Generator
from gen.sam.sam_sa2 import SA2Generator
from gen.sam.sam_sa3 import SA3Generator
from gen.sam.sam_sa5 import SA5Generator
from gen.sam.sam_sa5 import SA5Generator, SA5FlatFaceGenerator
from gen.sam.sam_sa6 import SA6Generator
from gen.sam.sam_sa8 import SA8Generator
from gen.sam.sam_sa9 import SA9Generator
@@ -79,6 +79,7 @@ SAM_MAP: Dict[str, Type[AirDefenseGroupGenerator]] = {
"SA2Generator": SA2Generator,
"SA3Generator": SA3Generator,
"SA5Generator": SA5Generator,
"SA5FlatFaceGenerator": SA5FlatFaceGenerator,
"SA6Generator": SA6Generator,
"SA8Generator": SA8Generator,
"SA9Generator": SA9Generator,

View File

@@ -1,5 +1,10 @@
from typing import Type
from dcs.unittype import VehicleType
from dcs.vehicles import AirDefence, Unarmed
from game import Game
from game.theater import SamGroundObject
from gen.sam.airdefensegroupgenerator import (
AirDefenseRange,
AirDefenseGroupGenerator,
@@ -8,15 +13,18 @@ from gen.sam.airdefensegroupgenerator import (
class SA5Generator(AirDefenseGroupGenerator):
"""
This generate a SA-5 group
This generate a SA-5 group using the TinShield SR
"""
name = "SA-5/S-200 Site"
def generate(self) -> None:
def __init__(self, game: Game, ground_object: SamGroundObject):
super().__init__(game, ground_object)
self.sr: Type[VehicleType] = AirDefence.RLS_19J6
def generate(self) -> None:
self.add_unit(
AirDefence.RLS_19J6,
self.sr,
"SR",
self.position.x,
self.position.y,
@@ -54,3 +62,14 @@ class SA5Generator(AirDefenseGroupGenerator):
@classmethod
def range(cls) -> AirDefenseRange:
return AirDefenseRange.Long
# TODO Replace this legacy handling once the Generators can be faction sensitive #1903
class SA5FlatFaceGenerator(SA5Generator):
"""
This generate a SA-5 group using the P-19 FlatFace SR
"""
def __init__(self, game: Game, ground_object: SamGroundObject):
super().__init__(game, ground_object)
self.sr: Type[VehicleType] = AirDefence.P_19_s_125_sr

View File

@@ -27,13 +27,6 @@ class SA8Generator(AirDefenseGroupGenerator):
position[1],
position[2],
)
self.add_unit(
AirDefence.SA_8_Osa_LD_9T217,
"LD",
self.position.x + 20,
self.position.y,
self.heading,
)
@classmethod
def range(cls) -> AirDefenseRange:

File diff suppressed because it is too large Load Diff

View File

@@ -1500,10 +1500,6 @@ class VSN_F104G(PlaneType):
4,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M282__HEDP = (
4,
Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M282__HEDP,
)
AIM_9M_Sidewinder_IR_AAM = (4, Weapons.AIM_9M_Sidewinder_IR_AAM)
AIM_9L_Sidewinder_IR_AAM = (4, Weapons.AIM_9L_Sidewinder_IR_AAM)
AIM_9B_Sidewinder_IR_AAM = (4, Weapons.AIM_9B_Sidewinder_IR_AAM)
@@ -1576,10 +1572,6 @@ class VSN_F104G(PlaneType):
8,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M282__HEDP = (
8,
Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M282__HEDP,
)
AIM_9M_Sidewinder_IR_AAM = (8, Weapons.AIM_9M_Sidewinder_IR_AAM)
AIM_9L_Sidewinder_IR_AAM = (8, Weapons.AIM_9L_Sidewinder_IR_AAM)
AIM_9B_Sidewinder_IR_AAM = (8, Weapons.AIM_9B_Sidewinder_IR_AAM)
@@ -2348,10 +2340,6 @@ class VSN_F104S_AG(PlaneType):
4,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M282__HEDP = (
4,
Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M282__HEDP,
)
AIM_9M_Sidewinder_IR_AAM = (4, Weapons.AIM_9M_Sidewinder_IR_AAM)
AIM_9L_Sidewinder_IR_AAM = (4, Weapons.AIM_9L_Sidewinder_IR_AAM)
AIM_9B_Sidewinder_IR_AAM = (4, Weapons.AIM_9B_Sidewinder_IR_AAM)
@@ -2429,10 +2417,6 @@ class VSN_F104S_AG(PlaneType):
8,
Weapons.LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M151__HE,
)
BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M282__HEDP = (
8,
Weapons.BRU_33_with_2_x_LAU_61_pod___19_x_2_75_Hydra__UnGd_Rkts_M282__HEDP,
)
AIM_9M_Sidewinder_IR_AAM = (8, Weapons.AIM_9M_Sidewinder_IR_AAM)
AIM_9B_Sidewinder_IR_AAM = (8, Weapons.AIM_9B_Sidewinder_IR_AAM)
AIM_9L_Sidewinder_IR_AAM = (8, Weapons.AIM_9L_Sidewinder_IR_AAM)

File diff suppressed because it is too large Load Diff

View File

@@ -6,6 +6,7 @@ from pydcs_extensions.highdigitsams import highdigitsams
from pydcs_extensions.jas39.jas39 import JAS39Gripen, JAS39Gripen_AG
from pydcs_extensions.su57.su57 import Su_57
import pydcs_extensions.frenchpack.frenchpack as frenchpack
from pydcs_extensions.uh60l.uh60l import UH_60L, KC130J
MODDED_AIRPLANES = [
A_4E_C,
@@ -15,9 +16,13 @@ MODDED_AIRPLANES = [
VSN_F104S,
VSN_F104S_AG,
Hercules,
KC130J,
JAS39Gripen,
JAS39Gripen_AG,
]
MODDED_HELICOPTERS = [
UH_60L,
]
MODDED_VEHICLES = [
frenchpack._FIELD_HIDE,
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_installation_directory
global __last_save_file
global __ignore_empty_install_directory
if PREFERENCES_PATH.exists():
try:
@@ -31,14 +32,19 @@ def init():
__dcs_saved_game_directory = pref_data["saved_game_dir"]
__dcs_installation_directory = pref_data["dcs_install_dir"]
__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
except KeyError:
__dcs_saved_game_directory = ""
__dcs_installation_directory = ""
__last_save_file = ""
__ignore_empty_install_directory = False
is_first_start = True
else:
__last_save_file = ""
__ignore_empty_install_directory = False
try:
__dcs_saved_game_directory = (
dcs.installation.get_dcs_saved_games_directory()
@@ -76,10 +82,12 @@ def save_config():
global __dcs_saved_game_directory
global __dcs_installation_directory
global __last_save_file
global __ignore_empty_install_directory
pref_data = {
"saved_game_dir": __dcs_saved_game_directory,
"dcs_install_dir": __dcs_installation_directory,
"last_save_file": __last_save_file,
"ignore_empty_install_directory": __ignore_empty_install_directory,
}
PREFERENCES_PATH.parent.mkdir(exist_ok=True, parents=True)
with PREFERENCES_PATH.open("w") as prefs:
@@ -96,6 +104,16 @@ def get_saved_game_dir():
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():
global __last_save_file
print(__last_save_file)

View File

@@ -2,6 +2,7 @@ import argparse
import logging
import os
import sys
import time
from datetime import datetime
from pathlib import Path
from typing import Optional
@@ -9,7 +10,7 @@ from typing import Optional
from PySide2 import QtWidgets
from PySide2.QtCore import Qt
from PySide2.QtGui import QPixmap
from PySide2.QtWidgets import QApplication, QSplashScreen
from PySide2.QtWidgets import QApplication, QSplashScreen, QCheckBox
from dcs.payloads import PayloadDirectories
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:
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.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
liberation_theme.init()
@@ -89,6 +95,9 @@ def run_ui(game: Optional[Game]) -> None:
splash = QSplashScreen(pixmap)
splash.show()
# Give enough time to read splash screen
time.sleep(3)
# Once splash screen is up : load resources & setup stuff
uiconstants.load_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
if liberation_install.get_dcs_install_directory() == "":
QtWidgets.QMessageBox.warning(
splash,
"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,
logging.warning(
"DCS Installation directory is empty. MissionScripting file will not be replaced!"
)
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
try:
liberation_install.replace_mission_scripting_file()
@@ -274,6 +292,11 @@ def create_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:
for weapon in WeaponGroup.named("Unknown").weapons:
logging.warning(f"No weapon data for {weapon}: {weapon.clsid}")
@@ -294,6 +317,11 @@ def main():
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
args = parse_args()

View File

@@ -214,6 +214,7 @@ class AtoModel(QAbstractListModel):
PackageRole = Qt.UserRole
client_slots_changed = Signal()
packages_changed = Signal()
def __init__(self, game_model: GameModel, ato: AirTaskingOrder) -> None:
super().__init__()
@@ -245,6 +246,7 @@ class AtoModel(QAbstractListModel):
self.endInsertRows()
# noinspection PyUnresolvedReferences
self.client_slots_changed.emit()
self.on_packages_changed()
def delete_package_at_index(self, index: QModelIndex) -> None:
"""Removes the package at the given index from the ATO."""
@@ -263,6 +265,12 @@ class AtoModel(QAbstractListModel):
self.endRemoveRows()
# noinspection PyUnresolvedReferences
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:
"""Returns the package at the given index."""

View File

@@ -34,6 +34,7 @@ def load_icons():
ICONS["Github"] = QPixmap(
"./resources/ui/misc/" + get_theme_icons() + "/github.png"
)
ICONS["Ukraine"] = QPixmap("./resources/ui/misc/ukraine.png")
ICONS["Control Points"] = QPixmap(
"./resources/ui/misc/" + get_theme_icons() + "/circle.png"

View File

@@ -1057,6 +1057,12 @@ class MapModel(QObject):
GameUpdateSignal.get_instance().flight_selection_changed.connect(
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()
def clear(self) -> None:
@@ -1291,6 +1297,9 @@ class MapModel(QObject):
def mapZones(self) -> NavMeshJs:
return self._map_zones
def on_package_change(self) -> None:
self.reset_unculled_zones()
def reset_unculled_zones(self) -> None:
self._unculled_zones = list(UnculledZone.each_from_game(self.game))
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.triggered.connect(self.showLogsDialog)
@@ -192,6 +198,7 @@ class QLiberationWindow(QMainWindow):
self.links_bar = self.addToolBar("Links")
self.links_bar.addAction(self.openDiscordAction)
self.links_bar.addAction(self.openGithubAction)
self.links_bar.addAction(self.ukraineAction)
self.actions_bar = self.addToolBar("Actions")
self.actions_bar.addAction(self.openSettingsAction)
@@ -215,6 +222,7 @@ class QLiberationWindow(QMainWindow):
help_menu = self.menu.addMenu("&Help")
help_menu.addAction(self.openDiscordAction)
help_menu.addAction(self.openGithubAction)
help_menu.addAction(self.ukraineAction)
help_menu.addAction(
"&Releases",
lambda: webbrowser.open_new_tab(
@@ -360,6 +368,8 @@ class QLiberationWindow(QMainWindow):
"<b>Ciribob </b> <i>for the JTACAutoLase.lua 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/>"
+ "<h4>Splash Screen :</h4>"
+ "Artwork by Andriy Dankovych (CC BY-SA) [https://www.facebook.com/AndriyDankovych]"
)
about = QMessageBox()
about.setWindowTitle("About DCS Liberation")

View File

@@ -55,10 +55,10 @@ class FinancesLayout(QGridLayout):
def add_total(self, game, income, player):
self.add_row(
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
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)
def add_row(

View File

@@ -40,6 +40,9 @@ class QFlightCreator(QDialog):
self.custom_name_text = None
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.setWindowIcon(EVENT_ICONS["strike"])

View File

@@ -70,6 +70,8 @@ class NewGameWizard(QtWidgets.QWizard):
if campaign is None:
campaign = self.campaigns[0]
logging.info("New campaign selected: %s", campaign.name)
if self.field("usePreset"):
start_date = db.TIME_PERIODS[
list(db.TIME_PERIODS.keys())[self.field("timePeriod")]
@@ -77,6 +79,7 @@ class NewGameWizard(QtWidgets.QWizard):
else:
start_date = self.theater_page.calendar.selectedDate().toPython()
logging.info("New campaign start date: %s", start_date.strftime("%m/%d/%Y"))
settings = Settings(
player_income_multiplier=self.field("player_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"),
f104_starfighter=self.field("f104_starfighter"),
hercules=self.field("hercules"),
uh_60l=self.field("uh_60l"),
jas39_gripen=self.field("jas39_gripen"),
su57_felon=self.field("su57_felon"),
frenchpack=self.field("frenchpack"),
@@ -115,7 +119,14 @@ class NewGameWizard(QtWidgets.QWizard):
blue_faction = self.faction_selection_page.selected_blue_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()
logging.info("New campaign theater: %s", theater.terrain.name)
generator = GameGenerator(
blue_faction,
red_faction,
@@ -563,6 +574,8 @@ class GeneratorOptions(QtWidgets.QWizardPage):
self.registerField("a4_skyhawk", a4_skyhawk)
hercules = QtWidgets.QCheckBox()
self.registerField("hercules", hercules)
uh_60l = QtWidgets.QCheckBox()
self.registerField("uh_60l", uh_60l)
f22_raptor = QtWidgets.QCheckBox()
self.registerField("f22_raptor", f22_raptor)
f104_starfighter = QtWidgets.QCheckBox()
@@ -582,22 +595,38 @@ class GeneratorOptions(QtWidgets.QWizardPage):
modHelpText.setAlignment(Qt.AlignCenter)
modLayout = QtWidgets.QGridLayout()
modLayout.addWidget(QtWidgets.QLabel("A-4E Skyhawk"), 1, 0)
modLayout.addWidget(a4_skyhawk, 1, 1)
modLayout.addWidget(QtWidgets.QLabel("F-22A Raptor"), 2, 0)
modLayout.addWidget(f22_raptor, 2, 1)
modLayout.addWidget(QtWidgets.QLabel("F-104 Starfighter"), 3, 0)
modLayout.addWidget(f104_starfighter, 3, 1)
modLayout.addWidget(QtWidgets.QLabel("C-130J-30 Super Hercules"), 4, 0)
modLayout.addWidget(hercules, 4, 1)
modLayout.addWidget(QtWidgets.QLabel("JAS 39 Gripen"), 5, 0)
modLayout.addWidget(jas39_gripen, 5, 1)
modLayout.addWidget(QtWidgets.QLabel("Su-57 Felon"), 6, 0)
modLayout.addWidget(su57_felon, 6, 1)
modLayout.addWidget(QtWidgets.QLabel("Frenchpack"), 7, 0)
modLayout.addWidget(frenchpack, 7, 1)
modLayout.addWidget(QtWidgets.QLabel("High Digit SAMs"), 8, 0)
modLayout.addWidget(high_digit_sams, 8, 1)
modLayout_row = 1
modLayout.addWidget(QtWidgets.QLabel("A-4E Skyhawk"), modLayout_row, 0)
modLayout.addWidget(a4_skyhawk, modLayout_row, 1)
modLayout_row += 1
modLayout.addWidget(QtWidgets.QLabel("F-22A Raptor"), modLayout_row, 0)
modLayout.addWidget(f22_raptor, modLayout_row, 1)
modLayout_row += 1
modLayout.addWidget(QtWidgets.QLabel("F-104 Starfighter"), modLayout_row, 0)
modLayout.addWidget(f104_starfighter, modLayout_row, 1)
modLayout_row += 1
modLayout.addWidget(
QtWidgets.QLabel("C-130J-30 Super Hercules"), modLayout_row, 0
)
modLayout.addWidget(hercules, modLayout_row, 1)
modLayout_row += 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)
mlayout = QVBoxLayout()

View File

@@ -169,6 +169,8 @@ class AutoSettingsLayout(QGridLayout):
) -> None:
def on_changed(value: int) -> None:
self.settings.__dict__[name] = value
if description.causes_expensive_game_update:
self.write_full_settings()
spinner = QSpinBox()
spinner.setMinimum(description.min)
@@ -354,7 +356,7 @@ class QSettingsWindow(QDialog):
self.cheat_options.show_base_capture_cheat
)
self.game.compute_conflicts_position()
self.game.compute_unculled_zones()
GameUpdateSignal.get_instance().updateGame(self.game)
def onSelectionChanged(self):

View File

@@ -24,9 +24,9 @@ Pillow==8.3.2
pluggy==0.13.1
pre-commit==2.10.1
py==1.10.0
-e git://github.com/pydcs/dcs@92e3046d476781bd617a6c1abd6853cccf97d57c#egg=pydcs
pyinstaller==4.3
pyinstaller-hooks-contrib==2021.1
-e git+https://github.com/dcs-liberation/dcs@6bcad19cdf71c892806b04790d379fc81f88c58f#egg=pydcs
pyinstaller==4.9
pyinstaller-hooks-contrib==2022.1
pyparsing==2.4.7
pyproj==3.0.1
PySide2==5.15.2

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: Refueling
aircraft:
- KC-135 Stratotanker MPRS
#H3 airbase
53:
- 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
#H4 airbase
12:
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 3)
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
#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
- UH-1H Iroquois
# 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

@@ -4,7 +4,7 @@ theater: Nevada
authors: Starfire
recommended_player_faction: USA 2005
recommended_enemy_faction: Redfor (China) 2010
description: <p>This is an asymmetrical Red Flag Exercise scenario for the NTTR comprising 4 control points. You start off in control of the two Tonopah airports, and will push south to capture Groom Lake and Nellis AFBs. Taking down Nellis AFB's IADS and striking their resource sites ASAP once Groom Lake has been captured is recommended to offset their substantial resource advantage.</p>
description: <p>Welcome to Vegas Nerve, an asymmetrical Red Flag Exercise scenario. You are starting off in control of the two Tonopah airports, and will push south from there. For the duration of this exercise, Creech AFB has been cleared of all fixed wing aircraft and will function as a FARP for rotor ops. OPFOR has a substantial resource advantage and an extensive IADS. Reducing that resource advantage while degrading their IADS will be vital to a successful completion of this exercise. Good luck, Commander.</p>
miz: exercise_vegas_nerve.miz
performance: 1
recommended_start_date: 2011-04-24
@@ -12,12 +12,12 @@ version: "9.1"
squadrons:
# Tonopah Airport
17:
- primary: BARCAP
- primary: TARCAP
secondary: air-to-air
aircraft:
- F-15C Eagle
- primary: BARCAP
secondary: air-to-air
secondary: any
aircraft:
- F-14B Tomcat
- primary: AEW&C
@@ -42,12 +42,16 @@ squadrons:
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
- primary: SEAD
secondary: any
- primary: CAS
secondary: air-to-ground
aircraft:
- AH-64D Apache Longbow
- primary: DEAD
secondary: air-to-ground
aircraft:
- F/A-18C Hornet (Lot 20)
- primary: DEAD
secondary: any
- primary: SEAD
secondary: air-to-ground
aircraft:
- F-16CM Fighting Falcon (Block 50)
- primary: BAI
@@ -57,23 +61,31 @@ squadrons:
# Groom Lake
2:
- primary: BARCAP
secondary: any
secondary: air-to-air
aircraft:
- J-11A Flanker-L
- primary: BAI
secondary: air-to-ground
aircraft:
- Su-34 Fullback
# Creech
Creech FARP:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
# Nellis AFB
4:
- primary: DEAD
- primary: SEAD
secondary: any
aircraft:
- Su-30MKK Flanker-G
- FC-1 Fierce Dragon
- primary: Strike
secondary: air-to-ground
aircraft:
- H-6J Badger
# Boulder City Airport
6:
- primary: AEW&C
aircraft:
- KJ-2000

View File

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

View File

@@ -2,8 +2,8 @@
name: Syria - Operation Blackball
theater: Syria
authors: Fuzzle
description: <p>A lightweight fictional showcase of Cyprus for the Syria terrain. A US Navy force must deploy from a FOB and carrier group to push from the north-east down through the island. <strong>Note that the ground units purchased on turn zero must sustain you until you've taken the first hostile FOB. The starting point does not have a factory to simulate a Marine Expeditionary Force deploying from the carrier group.</strong></p><p><strong>Backstory:</strong> The world is at war. With the help of her eastern allies Russia has taken the Suez Canal and deployed a large naval force to the Mediterranean trapping a US carrier group near the Turkish-Syrian border. Now they must break out by taking Cyprus back.</p>
version: "9.1"
description: <p>A lightweight fictional showcase of Cyprus for the Syria terrain. A US Navy force must deploy from a FOB and carrier group to push from the north-east down through the island. <strong>Note that the ground units purchased on turn zero must sustain you until you've taken the first hostile FOB. The starting point does not have a factory to simulate a Marine Expeditionary Force deploying from the carrier group.</strong></p><p><strong>Backstory:</strong> The world is at war. With the help of her eastern allies Russia has taken the Suez Canal and deployed a large naval force to the Mediterranean, trapping a US carrier group near the Turkish-Syrian border. Now they must break out by taking Cyprus back.</p>
version: "10.0"
recommended_player_faction: US Navy 2005
recommended_enemy_faction: Russia 2010
miz: operation_blackball.miz
@@ -17,13 +17,9 @@ squadrons:
aircraft:
- VF-142
- primary: SEAD
secondary: any
secondary: air-to-ground
aircraft:
- VFA-106
- primary: BAI
secondary: any
aircraft:
- VMFA-122
- primary: AEW&C
aircraft:
- VAW-125

View File

@@ -4,7 +4,7 @@ theater: Syria
authors: Starfire
recommended_player_faction: Bluefor Modern
recommended_enemy_faction: Iraq 1991
description: <p>This is a semi-fictional what-if scenario for Operation Peace Spring, during which Turkish forces that crossed into Syria on an offensive against Kurdish militias were emboldened by early successes to continue pushing further southward. Attempts to broker a ceasefire have failed. Members of Operation Inherent Resolve have gathered at Ramat David Airbase in Israel to launch a counter-offensive.</p><p><strong>Note:</strong> The default faction is set as Iraq 1991 in order to provide an opponent with a wider variety of units. While Turkey 2005 would be the historical faction, you would be facing nothing in the air except F-4 Phantoms.</p>
description: <p>This is a semi-fictional what-if scenario for Operation Peace Spring, during which Turkish forces that crossed into Syria on an offensive against Kurdish militias were emboldened by early successes to continue pushing further southward. Attempts to broker a ceasefire have failed. Members of Operation Inherent Resolve have gathered at Ramat David Airbase in Israel to launch a counter-offensive.</p><p><strong>Note:</strong> The default faction is set as Iraq 1991 in order to provide an opponent with a wider variety of units. While Turkey 2005 would be the historical faction (and has preset squadrons included), they only have two jets available (F-4 and F-16).</p>
miz: operation_peace_spring.miz
performance: 1
recommended_start_date: 2019-12-23
@@ -16,33 +16,19 @@ squadrons:
secondary: air-to-air
aircraft:
- F-15C Eagle
- primary: BARCAP
secondary: air-to-air
aircraft:
- F-14B Tomcat
- primary: TARCAP
secondary: any
aircraft:
- Mirage 2000C
- F/A-18C Hornet (Lot 20)
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
- primary: SEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
- primary: DEAD
secondary: any
aircraft:
- F-16CM Fighting Falcon (Block 50)
- primary: BAI
- F/A-18C Hornet (Lot 20)
- primary: SEAD
secondary: any
aircraft:
- JF-17 Thunder
- F-16CM Fighting Falcon (Block 50)
- primary: BAI
- primary: Strike
secondary: air-to-ground
aircraft:
- AV-8B Harrier II Night Attack
@@ -50,19 +36,6 @@ squadrons:
secondary: air-to-ground
aircraft:
- F-15E Strike Eagle
- primary: Strike
secondary: air-to-ground
aircraft:
- AJS-37 Viggen
- F-117A Nighthawk
- primary: Strike
secondary: air-to-ground
aircraft:
- B-1B Lancer
- primary: Strike
secondary: air-to-ground
aircraft:
- B-52H Stratofortress
- primary: AEW&C
aircraft:
- E-3A
@@ -94,11 +67,6 @@ squadrons:
aircraft:
- F-16CM Fighting Falcon (Block 50)
- Su-24M Fencer-D
- primary: Transport
secondary: any
aircraft:
- UH-60A
- Mi-8MTV2 Hip
# Abu Al Duhur
# 1:
# Gaziantep
@@ -116,11 +84,6 @@ squadrons:
- F-16CM Fighting Falcon (Block 50)
- MiG-29A Fulcrum-A
- primary: Strike
secondary: air-to-ground
aircraft:
- F-4E Phantom II
- Tu-22M3 Backfire-C
- primary: BAI
secondary: air-to-ground
aircraft:
- F-4E Phantom II

View File

@@ -10,25 +10,15 @@ performance: 1
recommended_start_date: 2008-08-08
version: "9.1"
squadrons:
Blue CV:
Blue CV-1:
- primary: BARCAP
secondary: any
aircraft:
- F-14B Tomcat
- F-14A Tomcat (Block 135-GR Late)
- primary: TARCAP
secondary: any
aircraft:
- F-14B Tomcat
- F-14A Tomcat (Block 135-GR Late)
- primary: SEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
- primary: DEAD
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
- primary: AEW&C
aircraft:
- E-2C Hawkeye
@@ -40,9 +30,6 @@ squadrons:
secondary: air-to-ground
aircraft:
- AV-8B Harrier II Night Attack
- primary: Transport
aircraft:
- SH-60B Seahawk
From Incirlik:
- primary: BARCAP
secondary: air-to-air
@@ -52,6 +39,10 @@ squadrons:
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
- primary: CAS
secondary: air-to-ground
aircraft:
- AH-64D Apache Longbow
- primary: DEAD
secondary: any
aircraft:
@@ -66,9 +57,6 @@ squadrons:
- primary: Refueling
aircraft:
- KC-135 Stratotanker
- primary: Transport
aircraft:
- C-130
#FARPs
UNOMIG Sector HQ:
- primary: CAS
@@ -81,13 +69,13 @@ squadrons:
aircraft:
- Mi-24P Hind-F
#Sukhumi-Babushara
#20:
#Sochi-Adler
18:
20:
- primary: BARCAP
secondary: any
aircraft:
- MiG-29S Fulcrum-C
- MiG-29S Fulcrum-C
#Sochi-Adler
18:
- primary: CAS
secondary: air-to-ground
aircraft:
@@ -104,9 +92,6 @@ squadrons:
- primary: Refueling
aircraft:
- IL-78M
- primary: Transport
aircraft:
- IL-76MD
Red CV:
- primary: BARCAP
secondary: any
@@ -115,6 +100,5 @@ squadrons:
# I am aware there is no Russian LHA. This is just for campaign inversion.
Red LHA:
- primary: BAI
secondary: air-to-ground
aircraft:
- AV-8B Harrier II Night Attack
secondary: air-to-ground

View File

@@ -3,7 +3,7 @@ name: Marianas - Pacific Repartee
theater: MarianaIslands
authors: Fuzzle
description: <p>A naval campaign where a US carrier group must retake Guam, Saipan and the Marianas Islands from the Chinese. <strong>This is a purely offensive air campaign, with no frontline gameplay. Upon securing the area around a FOB, you may either ignore it, bomb it to dust or use the cheats to capture it.</strong></p><p><strong>Backstory:</strong> After an escalation in the South China Sea, the PLAN has taken the US by surprise and invaded Guam, setting up supporting positions throughout the Marianas island chain. With the rest of the US Navy engaged near Japan, a carrier task group must push through China's forces, assist a small Marine contingent holding out on Farallon de Pajaros and liberate Guam.</p>
version: "9.1"
version: "10.0"
recommended_player_faction: US Navy 2005
recommended_enemy_faction: China 2010
miz: pacific_repartee.miz
@@ -17,13 +17,9 @@ squadrons:
aircraft:
- VF-143
- primary: SEAD
secondary: any
secondary: air-to-ground
aircraft:
- VMFA-251
- primary: Strike
secondary: any
aircraft:
- VMFA-122
- primary: AEW&C
aircraft:
- VAW-125
@@ -102,9 +98,9 @@ squadrons:
- FC-1 Fierce Dragon
# Tinian Intl
3:
- primary: AEW&C
- primary: Refueling
aircraft:
- KJ-2000
- IL-78M
# Andersen AFB
6:
- primary: TARCAP
@@ -122,9 +118,6 @@ squadrons:
- primary: Transport
aircraft:
- IL-76MD
- primary: Refueling
aircraft:
- IL-78M
# Antonio B. Won Pat Intl
4:
- primary: TARCAP

Binary file not shown.

View File

@@ -0,0 +1,248 @@
---
name: Persian Gulf - Scenic Route 2 - Dust To Dust
theater: Persian Gulf
authors: Fuzzle
description: <p>A continuation of Scenic Route. A NATO coalition pushes inland along a protracted axis of advance. Built with helicopters/FOB-based gameplay in mind. <p><strong>Backstory:</strong> With Iran's coastal defences pacified and their forces pushed inland, a beleaguered US Navy is reinforced by a NATO coalition task force. The going will not be easy however; Iran has assembled the full might of its armoured and mechanized divisions alongside rotary support to defend their heartland. The conflict intensifies.</p>
version: "10.0"
advanced_iads: true
recommended_player_faction: NATO OIF
recommended_enemy_faction: Iran 2015
miz: scenic_inland.miz
performance: 2
recommended_start_date: 2005-06-29
squadrons:
# Bandar Abbas Intl
2:
- primary: TARCAP
secondary: air-to-air
aircraft:
- Escadron de chasse 1/30
#French Mirage2000C
- primary: SEAD
secondary: any
aircraft:
- 77th FS
#USAF F-16C
- primary: Strike
secondary: air-to-ground
aircraft:
- No. 12 Squadron
#RAF Tornado GR.4
- primary: Transport
secondary: air-to-ground
aircraft:
- 101st Combat Aviation Brigade
#US Army UH-60
# Havadarya
9:
- primary: BARCAP
secondary: any
aircraft:
- 493rd FS
#USAF F-15C
- primary: BAI
secondary: air-to-ground
aircraft:
- 81st FS
#USAF A-10CI
#BLUFOR CVN
BLUFOR CVN:
- primary: BARCAP
secondary: air-to-air
aircraft:
- VF-143
- primary: DEAD
secondary: any
aircraft:
- VMFA-251
- primary: AEW&C
aircraft:
- VAW-125
- primary: Refueling
aircraft:
- VS-35 (Tanker)
# BLUFOR LHA
BLUFOR LHA:
- primary: BAI
secondary: air-to-ground
aircraft:
- VMA-223
- primary: Transport
secondary: air-to-ground
aircraft:
- HMLA-169 (UH-1H)
# BLUFOR Start FOB
FOB Anguran:
- primary: CAS
secondary: air-to-ground
aircraft:
- SA 342M Gazelle
#French Gazelle
- primary: CAS
secondary: air-to-ground
aircraft:
- Wolfpack, 1-82 ARB
#US Army Apache AH-64D
# OPFOR L1F1
FOB Tang-e Dalan:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
# OPFOR L1F2
FOB Fars Border:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
# OPFOR L1F2 split
FOB Bikuyeh:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-28N Havoc
# Lar
11:
- primary: BARCAP
secondary: air-to-air
aircraft:
- MiG-21bis Fishbed-N
# OPFOR L2F1
FOB Mansurabad:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
# OPFOR L2F2
FOB Jahrom:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
# OPFOR L2F3
FOB Tower:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
# OPFOR L2F3 split
FOB Nouderan:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-28N Havoc
# Shiraz Intl
19:
- primary: AEW&C
aircraft:
- A-50
- primary: Refueling
aircraft:
- IL-78M
- primary: BARCAP
secondary: any
aircraft:
- F-4E Phantom II
- primary: TARCAP
secondary: air-to-air
aircraft:
- MiG-29A Fulcrum-A
- primary: Strike
secondary: air-to-ground
aircraft:
- Su-22M4 Fitter-K
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
- primary: SEAD
secondary: air-to-ground
aircraft:
- Su-25T Frogfoot
# OPFOR L3F1
FOB Kherameh:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
# OPFOR L3F2
FOB Tashk:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
# OPFOR L3F3
FOB Chahak:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
# OPFOR L3F4
FOB Plainhold:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
# OPFOR L3F4 split
FOB Robat:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
# OPFOR L3F5
FOB Plainguard:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
# OPFOR L3F6
FOB Hasanabad:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
# OPFOR L3F6 split
FOB Najafabad:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-28N Havoc
# OPFOR L3F7
FOB Kabutarkhan:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
# OPFOR L3F8
FOB Sa'di:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
# Kerman
18:
- primary: AEW&C
aircraft:
- A-50
- primary: Refueling
aircraft:
- IL-78M
- primary: Transport
aircraft:
- IL-78MD
- primary: BARCAP
secondary: any
aircraft:
- F-14A Tomcat (Block 135-GR Late)
- primary: TARCAP
secondary: air-to-air
aircraft:
- MiG-29A Fulcrum-A
- primary: Strike
secondary: air-to-ground
aircraft:
- Su-24MK Fencer-D
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F

Binary file not shown.

View File

@@ -3,7 +3,8 @@ name: Persian Gulf - Scenic Route
theater: Persian Gulf
authors: Fuzzle
description: <p>A lightweight naval campaign involving a US Navy carrier group pushing across the coast of Iran. <strong>Note that the ground units purchased on turn zero must sustain you until you've taken the first hostile FOB. The starting point does not have a factory to simulate a Marine Expeditionary Force deploying from the carrier group.</strong></p><p><strong>Backstory:</strong> Iran has declared war on all US forces in the Gulf resulting in all local allies withdrawing their support for American troops. A lone carrier group must pacify the southern coast of Iran and hold out until backup can arrive lest the US and her interests be ejected from the region permanently.</p>
version: "9.1"
version: "10.0"
advanced_iads: true
recommended_player_faction: US Navy 2005
recommended_enemy_faction: Iran 2015
miz: scenic_route.miz
@@ -17,13 +18,9 @@ squadrons:
aircraft:
- VF-143
- primary: SEAD
secondary: any
secondary: air-to-ground
aircraft:
- VFA-113
- primary: BAI
secondary: any
aircraft:
- VMFA-251
- primary: AEW&C
aircraft:
- VAW-125

Binary file not shown.

View File

@@ -0,0 +1,142 @@
---
name: Syria - Tripoint Hostility
theater: Syria
authors: Fuzzle
description: <p>A joint US Army/Air Force force must push Iraqi aggressors back through Jordan and Syria to the border, then pacify Iraq's nearby airbases. This campaign showcases the southeastern expansion to the Syria terrain, and incentivizes heavy usage of rotary from FARPs.</p><p><strong>Backstory:</strong> In an alternate 2006, Iraq has seen a coup place a hardline national fundamentalist movement in power, who have ejected US forces from the country under threat from newfound Iranian allies. With their confidence unchecked, Iraq has invaded their Jordanian and Syrian neighbours to the west, pushing nearly to the Israeli border. To keep the region from falling to chaos, the US has redeployed a task force from Europe to defend Jordan and bring down Iraq's west-facing air power.</p>
recommended_player_faction: USA 2005
recommended_enemy_faction: Iraq 1991
recommended_start_date: 2006-08-03
miz: tripoint_hostility.miz
performance: 2
version: "10.0"
squadrons:
# Off-theatre forces
From Turkey:
- primary: Strike
secondary: air-to-ground
aircraft:
- B-1B Lancer
- primary: AEW&C
aircraft:
- 960th AAC Squadron
#USAF E-3A
# King Hussein Air College, BLUFOR start
19:
- primary: BARCAP
secondary: air-to-air
aircraft:
- 493rd FS
#USAF F-15C
- primary: SEAD
secondary: any
aircraft:
- 23rd FS
#USAF F-16C
- primary: BAI
secondary: air-to-ground
aircraft:
- 81st FS
#USAF A-10CII
- primary: Transport
secondary: air-to-ground
aircraft:
- 101st Combat Aviation Brigade
#US Army UH-60
# FOB Tha'lah, BLUFOR 1st FOB north
FOB Tha'lah:
- primary: CAS
secondary: air-to-ground
aircraft:
- A Company, 1-227th ARB
#US Army AH-64D
# FOB Stalwart, first BLUFOR FOB south
FOB Stalwart:
- primary: CAS
secondary: air-to-ground
aircraft:
- C Company, 2-159th ARB
#US Army AH-64D
# FOB Qalea, first OPFOR FOB south
FOB Qalea:
- primary: CAS
secondary: air-to-ground
aircraft:
- SA 342M Gazelle
# H4 Airbase, 1st OPFOR airfield south
12:
- primary: BARCAP
secondary: any
aircraft:
- MiG-21bis Fishbed-N
# FOB Eadla, 2nd OPFOR FOB south
FOB Eadla:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
# Ruwayshid, 2nd OPFOR airfield south
57:
- primary: BAI
secondary: air-to-ground
aircraft:
- Su-22M4 Fitter-K
# H3 Southwest, 3rd OPFOR airfield south
55:
- primary: BARCAP
secondary: any
aircraft:
- MiG-29A Fulcrum-A
- primary: CAS
secondary: air-to-ground
aircraft:
- Su-25 Frogfoot
# H3 Airbase, 4th-last OPFOR airfield south
53:
- primary: TARCAP
secondary: air-to-air
aircraft:
- MiG-25PD Foxbat-E
- primary: Strike
secondary: air-to-ground
aircraft:
- Su-24M Fencer-D
# Khalkhalah, 1st OPFOR airfield north
18:
- primary: BARCAP
secondary: any
aircraft:
- MiG-19P Farmer-B
# FOB Dhirae, 1st OPFOR FOB north
FOB Dhirae:
- primary: CAS
secondary: air-to-ground
aircraft:
- SA 342M Gazelle
# FOB Kataf, 2nd OPFOR FOB north
FOB Kataf:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
# At Tanf, 3rd OPFOR heliport north
63:
- primary: CAS
secondary: air-to-ground
aircraft:
- SA 342M Gazelle
# FOB Qalb, 4th OPFOR FOB north
FOB Qalb:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
# H3 Northwest, 2nd OPFOR airfield north
54:
- primary: BARCAP
secondary: any
aircraft:
- MiG-21bis Fishbed-N
- primary: CAS
secondary: air-to-ground
aircraft:
- Su-22M4 Fitter-K

View File

@@ -0,0 +1,80 @@
local unitPayloads = {
["name"] = "AH-64D_BLK_II",
["payloads"] = {
[1] = {
["name"] = "Liberation CAS",
["pylons"] = {
[1] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 3,
},
[2] = {
["CLSID"] = "{M261_M282}",
["num"] = 4,
},
[3] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 2,
},
[4] = {
["CLSID"] = "{M261_M282}",
["num"] = 1,
},
},
["tasks"] = {
[1] = 31,
},
},
[2] = {
["displayName"] = "Liberation BAI",
["name"] = "Liberation BAI",
["pylons"] = {
[1] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 3,
},
[2] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 4,
},
[3] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 2,
},
[4] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 1,
},
},
["tasks"] = {
[1] = 31,
},
},
[3] = {
["name"] = "Liberation OCA/Aircraft",
["pylons"] = {
[1] = {
["CLSID"] = "{M261_M229}",
["num"] = 4,
},
[2] = {
["CLSID"] = "{M261_M229}",
["num"] = 1,
},
[3] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 3,
},
[4] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 2,
},
},
["tasks"] = {
[1] = 31,
},
},
},
["unitType"] = "AH-64D_BLK_II",
}
return unitPayloads

View File

@@ -294,6 +294,66 @@ local unitPayloads = {
[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",
}

View File

@@ -318,6 +318,54 @@ local unitPayloads = {
["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",
}

View File

@@ -6,7 +6,7 @@ local unitPayloads = {
["name"] = "CAP",
["pylons"] = {
[1] = {
["CLSID"] = "JAS39_IRIS-T",
["CLSID"] = "{JAS39_IRIS-T}",
["num"] = 8,
},
[2] = {
@@ -18,27 +18,27 @@ local unitPayloads = {
["num"] = 11,
},
[4] = {
["CLSID"] = "JAS39_IRIS-T",
["CLSID"] = "{JAS39_IRIS-T}",
["num"] = 1,
},
[5] = {
["CLSID"] = "JAS39_Meteor",
["CLSID"] = "{JAS39_Meteor}",
["num"] = 7,
},
[6] = {
["CLSID"] = "JAS39_Meteor",
["CLSID"] = "{JAS39_Meteor}",
["num"] = 6,
},
[7] = {
["CLSID"] = "JAS39_Meteor",
["CLSID"] = "{JAS39_Meteor}",
["num"] = 2,
},
[8] = {
["CLSID"] = "JAS39_Meteor",
["CLSID"] = "{JAS39_Meteor}",
["num"] = 3,
},
[9] = {
["CLSID"] = "JAS39_TANK1100",
["CLSID"] = "{JAS39_TANK1100}",
["num"] = 4,
},
},

View File

@@ -6,15 +6,15 @@ local unitPayloads = {
["name"] = "ANTISHIP",
["pylons"] = {
[1] = {
["CLSID"] = "JAS39_IRIS-T",
["CLSID"] = "{JAS39_IRIS-T}",
["num"] = 1,
},
[2] = {
["CLSID"] = "JAS39_IRIS-T",
["CLSID"] = "{JAS39_IRIS-T}",
["num"] = 8,
},
[3] = {
["CLSID"] = "JAS39_TANK1100",
["CLSID"] = "{JAS39_TANK1100}",
["num"] = 4,
},
[4] = {
@@ -26,19 +26,19 @@ local unitPayloads = {
["num"] = 11,
},
[6] = {
["CLSID"] = "JAS39_RBS15AI",
["CLSID"] = "{JAS39_RBS15AI}",
["num"] = 6,
},
[7] = {
["CLSID"] = "JAS39_RBS15AI",
["CLSID"] = "{JAS39_RBS15AI}",
["num"] = 7,
},
[8] = {
["CLSID"] = "JAS39_RBS15AI",
["CLSID"] = "{JAS39_RBS15AI}",
["num"] = 2,
},
[9] = {
["CLSID"] = "JAS39_RBS15AI",
["CLSID"] = "{JAS39_RBS15AI}",
["num"] = 3,
},
},
@@ -51,15 +51,15 @@ local unitPayloads = {
["name"] = "SEAD",
["pylons"] = {
[1] = {
["CLSID"] = "JAS39_IRIS-T",
["CLSID"] = "{JAS39_IRIS-T}",
["num"] = 1,
},
[2] = {
["CLSID"] = "JAS39_IRIS-T",
["CLSID"] = "{JAS39_IRIS-T}",
["num"] = 8,
},
[3] = {
["CLSID"] = "JAS39_TANK1100",
["CLSID"] = "{JAS39_TANK1100}",
["num"] = 4,
},
[4] = {
@@ -71,19 +71,19 @@ local unitPayloads = {
["num"] = 11,
},
[6] = {
["CLSID"] = "JAS39_MAR-1",
["CLSID"] = "{JAS39_MAR-1}",
["num"] = 2,
},
[7] = {
["CLSID"] = "JAS39_MAR-1",
["CLSID"] = "{JAS39_MAR-1}",
["num"] = 3,
},
[8] = {
["CLSID"] = "JAS39_MAR-1",
["CLSID"] = "{JAS39_MAR-1}",
["num"] = 6,
},
[9] = {
["CLSID"] = "JAS39_MAR-1",
["CLSID"] = "{JAS39_MAR-1}",
["num"] = 7,
},
},
@@ -96,15 +96,15 @@ local unitPayloads = {
["name"] = "DEAD",
["pylons"] = {
[1] = {
["CLSID"] = "JAS39_IRIS-T",
["CLSID"] = "{JAS39_IRIS-T}",
["num"] = 1,
},
[2] = {
["CLSID"] = "JAS39_IRIS-T",
["CLSID"] = "{JAS39_IRIS-T}",
["num"] = 8,
},
[3] = {
["CLSID"] = "JAS39_TANK1100",
["CLSID"] = "{JAS39_TANK1100}",
["num"] = 4,
},
[4] = {
@@ -116,19 +116,19 @@ local unitPayloads = {
["num"] = 11,
},
[6] = {
["CLSID"] = "JAS39_STORMSHADOW",
["CLSID"] = "{JAS39_STORMSHADOW_ARM}",
["num"] = 3,
},
[7] = {
["CLSID"] = "JAS39_STORMSHADOW",
["CLSID"] = "{JAS39_STORMSHADOW_ARM}",
["num"] = 6,
},
[8] = {
["CLSID"] = "JAS39_MAR-1",
["CLSID"] = "{JAS39_MAR-1}",
["num"] = 2,
},
[9] = {
["CLSID"] = "JAS39_MAR-1",
["CLSID"] = "{JAS39_MAR-1}",
["num"] = 7,
},
},
@@ -141,15 +141,15 @@ local unitPayloads = {
["name"] = "CAS",
["pylons"] = {
[1] = {
["CLSID"] = "JAS39_IRIS-T",
["CLSID"] = "{JAS39_IRIS-T}",
["num"] = 1,
},
[2] = {
["CLSID"] = "JAS39_IRIS-T",
["CLSID"] = "{JAS39_IRIS-T}",
["num"] = 8,
},
[3] = {
["CLSID"] = "JAS39_TANK1100",
["CLSID"] = "{JAS39_TANK1100}",
["num"] = 4,
},
[4] = {
@@ -161,23 +161,23 @@ local unitPayloads = {
["num"] = 11,
},
[6] = {
["CLSID"] = "JAS39_BRIMSTONE",
["CLSID"] = "{JAS39_BRIMSTONE}",
["num"] = 2,
},
[7] = {
["CLSID"] = "JAS39_BRIMSTONE",
["CLSID"] = "{JAS39_BRIMSTONE}",
["num"] = 3,
},
[8] = {
["CLSID"] = "JAS39_BRIMSTONE",
["CLSID"] = "{JAS39_BRIMSTONE}",
["num"] = 6,
},
[9] = {
["CLSID"] = "JAS39_BRIMSTONE",
["CLSID"] = "{JAS39_BRIMSTONE}",
["num"] = 7,
},
[10] = {
["CLSID"] = "JAS39_Litening",
["CLSID"] = "{JAS39_Litening}",
["num"] = 5,
},
[11] = {
@@ -194,15 +194,15 @@ local unitPayloads = {
["name"] = "STRIKE",
["pylons"] = {
[1] = {
["CLSID"] = "JAS39_IRIS-T",
["CLSID"] = "{JAS39_IRIS-T}",
["num"] = 1,
},
[2] = {
["CLSID"] = "JAS39_IRIS-T",
["CLSID"] = "{JAS39_IRIS-T}",
["num"] = 8,
},
[3] = {
["CLSID"] = "JAS39_TANK1100",
["CLSID"] = "{JAS39_TANK1100}",
["num"] = 4,
},
[4] = {
@@ -214,23 +214,23 @@ local unitPayloads = {
["num"] = 11,
},
[6] = {
["CLSID"] = "JAS39_GBU31",
["CLSID"] = "{JAS39_GBU31}",
["num"] = 2,
},
[7] = {
["CLSID"] = "JAS39_GBU31",
["CLSID"] = "{JAS39_GBU31}",
["num"] = 7,
},
[8] = {
["CLSID"] = "JAS39_GBU49",
["CLSID"] = "{JAS39_GBU49}",
["num"] = 3,
},
[9] = {
["CLSID"] = "JAS39_GBU49",
["CLSID"] = "{JAS39_GBU49}",
["num"] = 6,
},
[10] = {
["CLSID"] = "JAS39_Litening",
["CLSID"] = "{JAS39_Litening}",
["num"] = 5,
},
[11] = {
@@ -247,15 +247,15 @@ local unitPayloads = {
["name"] = "OCA",
["pylons"] = {
[1] = {
["CLSID"] = "JAS39_IRIS-T",
["CLSID"] = "{JAS39_IRIS-T}",
["num"] = 1,
},
[2] = {
["CLSID"] = "JAS39_IRIS-T",
["CLSID"] = "{JAS39_IRIS-T}",
["num"] = 8,
},
[3] = {
["CLSID"] = "JAS39_TANK1100",
["CLSID"] = "{JAS39_TANK1100}",
["num"] = 4,
},
[4] = {
@@ -267,23 +267,23 @@ local unitPayloads = {
["num"] = 11,
},
[6] = {
["CLSID"] = "JAS39_DWS39",
["CLSID"] = "{JAS39_DWS39_TV}",
["num"] = 2,
},
[7] = {
["CLSID"] = "JAS39_DWS39",
["CLSID"] = "{JAS39_DWS39_TV}",
["num"] = 7,
},
[8] = {
["CLSID"] = "JAS39_M70BHE",
["CLSID"] = "{JAS39_M70BHE}",
["num"] = 3,
},
[9] = {
["CLSID"] = "JAS39_M70BHE",
["CLSID"] = "{JAS39_M70BHE}",
["num"] = 6,
},
[10] = {
["CLSID"] = "JAS39_Litening",
["CLSID"] = "{JAS39_Litening}",
["num"] = 5,
},
[11] = {

View File

@@ -2,7 +2,8 @@ local unitPayloads = {
["name"] = "Tornado GR4",
["payloads"] = {
[1] = {
["name"] = "ANTISHIP",
["displayName"] = "Liberation CAS",
["name"] = "Liberation CAS",
["pylons"] = {
[1] = {
["CLSID"] = "{8C3F26A1-FA0F-11d5-9190-00A0249B6F00}",
@@ -17,32 +18,41 @@ local unitPayloads = {
["num"] = 10,
},
[4] = {
["CLSID"] = "{1461CD18-429A-42A9-A21F-4C621ECD4573}",
["num"] = 9,
["CLSID"] = "{08164777-5E9C-4B08-B48E-5AA7AFB246E2}",
["num"] = 8,
},
[5] = {
["CLSID"] = "{1461CD18-429A-42A9-A21F-4C621ECD4573}",
["num"] = 4,
["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,
},
[7] = {
[9] = {
["CLSID"] = "{EF124821-F9BB-4314-A153-E0E2FE1162C4}",
["num"] = 2,
},
[8] = {
[10] = {
["CLSID"] = "{8C3F26A2-FA0F-11d5-9190-00A0249B6F00}",
["num"] = 1,
},
},
["tasks"] = {
[1] = 30,
[1] = 32,
},
},
[2] = {
["name"] = "STRIKE",
["displayName"] = "Liberation Strike",
["name"] = "Liberation Strike",
["pylons"] = {
[1] = {
["CLSID"] = "{8C3F26A1-FA0F-11d5-9190-00A0249B6F00}",
@@ -65,32 +75,24 @@ local unitPayloads = {
["num"] = 7,
},
[6] = {
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
["num"] = 6,
},
[7] = {
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
["CLSID"] = "{A111396E-D3E8-4b9c-8AC9-2432489304D5}",
["num"] = 5,
},
[8] = {
[7] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["num"] = 3,
},
[9] = {
[8] = {
["CLSID"] = "{EF124821-F9BB-4314-A153-E0E2FE1162C4}",
["num"] = 2,
},
[10] = {
[9] = {
["CLSID"] = "{8C3F26A2-FA0F-11d5-9190-00A0249B6F00}",
["num"] = 1,
},
[11] = {
["CLSID"] = "{0D33DDAE-524F-4A4E-B5B8-621754FE3ADE}",
["num"] = 4,
},
[12] = {
["CLSID"] = "{0D33DDAE-524F-4A4E-B5B8-621754FE3ADE}",
["num"] = 9,
[10] = {
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
["num"] = 6,
},
},
["tasks"] = {
@@ -98,7 +100,8 @@ local unitPayloads = {
},
},
[3] = {
["name"] = "CAS",
["displayName"] = "Liberation Anti-ship",
["name"] = "Liberation Anti-ship",
["pylons"] = {
[1] = {
["CLSID"] = "{8C3F26A1-FA0F-11d5-9190-00A0249B6F00}",
@@ -113,48 +116,33 @@ local unitPayloads = {
["num"] = 10,
},
[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}",
["num"] = 3,
},
[9] = {
[5] = {
["CLSID"] = "{EF124821-F9BB-4314-A153-E0E2FE1162C4}",
["num"] = 2,
},
[10] = {
[6] = {
["CLSID"] = "{8C3F26A2-FA0F-11d5-9190-00A0249B6F00}",
["num"] = 1,
},
[11] = {
["CLSID"] = "{0D33DDAE-524F-4A4E-B5B8-621754FE3ADE}",
["num"] = 4,
},
[12] = {
["CLSID"] = "{0D33DDAE-524F-4A4E-B5B8-621754FE3ADE}",
[7] = {
["CLSID"] = "{1461CD18-429A-42A9-A21F-4C621ECD4573}",
["num"] = 9,
},
[8] = {
["CLSID"] = "{1461CD18-429A-42A9-A21F-4C621ECD4573}",
["num"] = 4,
},
},
["tasks"] = {
[1] = 32,
},
},
[4] = {
["name"] = "CAP",
["displayName"] = "Liberation SEAD",
["name"] = "Liberation SEAD",
["pylons"] = {
[1] = {
["CLSID"] = "{8C3F26A1-FA0F-11d5-9190-00A0249B6F00}",
@@ -165,11 +153,11 @@ local unitPayloads = {
["num"] = 11,
},
[3] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["CLSID"] = "{E6747967-B1F0-4C77-977B-AB2E6EB0C102}",
["num"] = 10,
},
[4] = {
["CLSID"] = "{6CEB49FC-DED8-4DED-B053-E1F033FF72D3}",
["CLSID"] = "{E6747967-B1F0-4C77-977B-AB2E6EB0C102}",
["num"] = 3,
},
[5] = {
@@ -180,13 +168,71 @@ local unitPayloads = {
["CLSID"] = "{8C3F26A2-FA0F-11d5-9190-00A0249B6F00}",
["num"] = 1,
},
[7] = {
["CLSID"] = "{E6747967-B1F0-4C77-977B-AB2E6EB0C102}",
["num"] = 9,
},
[8] = {
["CLSID"] = "{E6747967-B1F0-4C77-977B-AB2E6EB0C102}",
["num"] = 4,
},
},
["tasks"] = {
[1] = 17,
[1] = 32,
},
},
[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"] = {
[1] = {
["CLSID"] = "{8C3F26A1-FA0F-11d5-9190-00A0249B6F00}",
@@ -201,19 +247,19 @@ local unitPayloads = {
["num"] = 10,
},
[4] = {
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
["CLSID"] = "{08164777-5E9C-4B08-B48E-5AA7AFB246E2}",
["num"] = 8,
},
[5] = {
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
["CLSID"] = "{08164777-5E9C-4B08-B48E-5AA7AFB246E2}",
["num"] = 7,
},
[6] = {
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
["CLSID"] = "{08164777-5E9C-4B08-B48E-5AA7AFB246E2}",
["num"] = 6,
},
[7] = {
["CLSID"] = "{DB769D48-67D7-42ED-A2BE-108D566C8B1E}",
["CLSID"] = "{08164777-5E9C-4B08-B48E-5AA7AFB246E2}",
["num"] = 5,
},
[8] = {
@@ -228,14 +274,96 @@ local unitPayloads = {
["CLSID"] = "{8C3F26A2-FA0F-11d5-9190-00A0249B6F00}",
["num"] = 1,
},
[11] = {
["CLSID"] = "{0D33DDAE-524F-4A4E-B5B8-621754FE3ADE}",
["num"] = 4,
},
["tasks"] = {
[1] = 32,
},
},
[7] = {
["displayName"] = "Liberation OCA/Aircraft",
["name"] = "Liberation OCA/Aircraft",
["pylons"] = {
[1] = {
["CLSID"] = "{8C3F26A1-FA0F-11d5-9190-00A0249B6F00}",
["num"] = 12,
},
[12] = {
["CLSID"] = "{0D33DDAE-524F-4A4E-B5B8-621754FE3ADE}",
[2] = {
["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,
},
[8] = {
["CLSID"] = "{E6747967-B1F0-4C77-977B-AB2E6EB0C102}",
["num"] = 4,
},
},
["tasks"] = {
[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

@@ -16,6 +16,7 @@
"AV-8B Harrier II Night Attack",
"AH-1W SuperCobra",
"AH-64D Apache Longbow",
"AH-64D Apache Longbow (AI)",
"S-3B Viking",
"SH-60B Seahawk",
"UH-1H Iroquois"

View File

@@ -101,5 +101,6 @@
"OliverHazardPerryGroupGenerator"
],
"has_jtac": true,
"jtac_unit": "MQ-9 Reaper"
"jtac_unit": "MQ-9 Reaper",
"unrestricted_satnav": true
}

View File

@@ -0,0 +1,109 @@
{
"country": "Combined Joint Task Forces Blue",
"name": "NATO OIF",
"authors": "Fuzzle",
"description": "<p>A more modern NATO mixed faction reflecting the units involved in Operation Iraqi Freedom.</p>",
"aircrafts": [
"A-10C Thunderbolt II (Suite 3)",
"AH-64D Apache Longbow",
"AH-64D Apache Longbow (AI)",
"AV-8B Harrier II Night Attack",
"B-1B Lancer",
"B-52H Stratofortress",
"C-130",
"C-130J-30 Super Hercules",
"F-117A Nighthawk",
"F-14A Tomcat (Block 135-GR Late)",
"F-14B Tomcat",
"F-15C Eagle",
"F-15E Strike Eagle",
"F-16CM Fighting Falcon (Block 50)",
"F-22A Raptor",
"F/A-18C Hornet (Lot 20)",
"Mirage 2000C",
"OH-58D Kiowa Warrior",
"S-3B Viking",
"SA 342L Gazelle",
"SA 342M Gazelle",
"SA 342M Gazelle Mistral",
"Tornado GR4",
"UH-1H Iroquois",
"UH-60A",
"UH-60L"
],
"awacs": [
"E-2C Hawkeye",
"E-3A"
],
"tankers": [
"KC-130",
"KC-130J",
"KC-135 Stratotanker",
"S-3B Tanker"
],
"frontline_units": [
"FV4034 Challenger 2",
"FV510 Warrior",
"LAV-25",
"M1043 HMMWV (M2 HMG)",
"M1045 HMMWV (BGM-71 TOW)",
"M1097 Heavy HMMWV Avenger",
"M1134 Stryker ATGM (BGM-71 TOW)",
"M1A2 Abrams",
"M2A2 Bradley",
"M6 Linebacker",
"Marder 1A3",
"VAB Mephisto"
],
"artillery_units": [
"M109A6 Paladin",
"M270 Multiple Launch Rocket System"
],
"logistics_units": [
"Truck M818 6x6"
],
"infantry_units": [
"Infantry M249",
"Infantry M4",
"MANPADS Stinger"
],
"air_defenses": [
"AvengerGenerator",
"ChaparralGenerator",
"VulcanGenerator",
"RolandGenerator",
"HawkGenerator",
"PatriotGenerator",
"RapierGenerator"
],
"ewrs": [
"PatriotEwrGenerator"
],
"aircraft_carrier": [
"Stennis"
],
"helicopter_carrier": [
"LHA_Tarawa"
],
"destroyers": [
"USS_Arleigh_Burke_IIa"
],
"cruisers": [
"TICONDEROG"
],
"requirements": {},
"carrier_names": [
"CVN-71 Theodore Roosevelt"
],
"helicopter_carrier_names": [
"LHA-1 Tarawa",
"LHA-4 Nassau"
],
"navy_generators": [
"ArleighBurkeGroupGenerator",
"OliverHazardPerryGroupGenerator"
],
"has_jtac": true,
"jtac_unit": "MQ-9 Reaper",
"unrestricted_satnav": true
}

View File

@@ -8,6 +8,7 @@
"A-10C Thunderbolt II (Suite 3)",
"A-10C Thunderbolt II (Suite 7)",
"AH-64D Apache Longbow",
"AH-64D Apache Longbow (AI)",
"AJS-37 Viggen",
"AV-8B Harrier II Night Attack",
"B-1B Lancer",
@@ -71,7 +72,8 @@
"air_defenses": [
"AvengerGenerator",
"HawkGenerator",
"PatriotGenerator"
"PatriotGenerator",
"NasamCGenerator"
],
"ewrs": [
"PatriotEwrGenerator"
@@ -108,4 +110,4 @@
"has_jtac": true,
"jtac_unit": "MQ-9 Reaper",
"unrestricted_satnav": true
}
}

View File

@@ -8,8 +8,6 @@
],
"aircrafts": [
"Bf 109 K-4 Kurf\u00fcrst",
"Fw 190 A-8 Anton",
"Fw 190 D-9 Dora",
"Ju 88 A-4"
],
"frontline_units": [
@@ -48,4 +46,4 @@
"has_jtac": false,
"doctrine": "ww2",
"building_set": "ww2germany"
}
}

View File

@@ -8,8 +8,6 @@
],
"aircrafts": [
"Bf 109 K-4 Kurf\u00fcrst",
"Fw 190 A-8 Anton",
"Fw 190 D-9 Dora",
"Ju 88 A-4"
],
"frontline_units": [
@@ -51,4 +49,4 @@
"has_jtac": false,
"doctrine": "ww2",
"building_set": "ww2germany"
}
}

View File

@@ -26,11 +26,12 @@
"M113",
"M60A3 \"Patton\"",
"ZSU-23-4 Shilka",
"ZSU-57-2 'Sparka'",
"ZU-23 on Ural-375"
"ZU-23 on Ural-375",
"ZSU-57-2 'Sparka'"
],
"artillery_units": [
"2S1 Gvozdika",
"M109A6 Paladin",
"BM-21 Grad"
],
"logistics_units": [
@@ -40,21 +41,21 @@
"infantry_units": [
"Infantry RPG",
"Insurgent AK-74",
"MANPADS SA-18 Igla-S \"Grouse\"",
"Paratrooper AKS"
"MANPADS SA-18 Igla \"Grouse\" Ins"
],
"air_defenses": [
"HawkGenerator",
"RapierGenerator",
"SA2Generator",
"ZSU57Generator",
"ZSU23Generator",
"ZU23Generator",
"ZU23InsurgentGenerator",
"ZU23UralInsurgentGenerator",
"ZSU57Generator",
"ColdWarFlakGenerator"
],
"ewrs": [
"TallRackGenerator",
"TinShieldGenerator"
"FlatFaceGenerator",
"HawkEwrGenerator"
],
"aircraft_carrier": [],
"helicopter_carrier": [],

View File

@@ -30,6 +30,7 @@
"frontline_units": [
"Chieftain Mk.3",
"BMP-1",
"BMP-2",
"BTR-80",
"M113",
"M60A3 \"Patton\"",
@@ -38,7 +39,8 @@
"ZSU-57-2 'Sparka'"
],
"artillery_units": [
"2S19 Msta-S",
"2S1 Gvozdika",
"M109A6 Paladin",
"BM-21 Grad"
],
"logistics_units": [
@@ -46,28 +48,27 @@
"Truck Ural-375"
],
"infantry_units": [
"Infantry RPG",
"Insurgent AK-74",
"MANPADS SA-18 Igla-S \"Grouse\"",
"Paratrooper AKS",
"Paratrooper RPG-16"
"MANPADS SA-18 Igla \"Grouse\" Ins"
],
"air_defenses": [
"HawkGenerator",
"RapierGenerator",
"SA2Generator",
"SA5Generator",
"SA5FlatFaceGenerator",
"SA6Generator",
"SA11Generator",
"SA15Generator",
"SA17Generator",
"VulcanGenerator",
"ZSU23Generator",
"ZU23Generator",
"ZU23UralGenerator"
"ZU23InsurgentGenerator",
"ZU23UralInsurgentGenerator",
"ZSU57Generator"
],
"ewrs": [
"TallRackGenerator",
"TinShieldGenerator"
"FlatFaceGenerator",
"HawkEwrGenerator"
],
"aircraft_carrier": [],
"helicopter_carrier": [],

View File

@@ -9,6 +9,7 @@
"aircrafts": [
"AH-1W SuperCobra",
"AH-64D Apache Longbow",
"AH-64D Apache Longbow (AI)",
"C-130",
"C-130J-30 Super Hercules",
"F-15C Eagle",

View File

@@ -9,6 +9,7 @@
"aircrafts": [
"A-10C Thunderbolt II (Suite 3)",
"AH-64D Apache Longbow",
"AH-64D Apache Longbow (AI)",
"C-130",
"C-130J-30 Super Hercules",
"F-15C Eagle",

View File

@@ -9,6 +9,7 @@
"aircrafts": [
"AH-1W SuperCobra",
"AH-64D Apache Longbow",
"AH-64D Apache Longbow (AI)",
"C-130",
"C-130J-30 Super Hercules",
"F-15J Eagle",

View File

@@ -45,7 +45,7 @@
"RapierGenerator",
"SA2Generator",
"SA3Generator",
"SA5Generator",
"SA5FlatFaceGenerator",
"SA6Generator",
"SA8Generator",
"SA9Generator",

View File

@@ -44,7 +44,7 @@
"Paratrooper AKS"
],
"air_defenses": [
"SA5Generator",
"SA5FlatFaceGenerator",
"SA6Generator",
"SA8Generator",
"ZSU23Generator",

View File

@@ -14,7 +14,8 @@
"F-4E Phantom II",
"OH-58D Kiowa Warrior",
"UH-1H Iroquois",
"UH-60A"
"UH-60A",
"UH-60L"
],
"awacs": [
"E-3A"

View File

@@ -5,6 +5,7 @@
"description": "<p>UAR army in the 2000s.</p>",
"aircrafts": [
"AH-64D Apache Longbow",
"AH-64D Apache Longbow (AI)",
"C-130",
"F-16CM Fighting Falcon (Block 50)",
"Mirage 2000-5",

View File

@@ -5,6 +5,7 @@
"description": "<p>UAE army in the 2010s.</p>",
"aircrafts": [
"AH-64D Apache Longbow",
"AH-64D Apache Longbow (AI)",
"C-130",
"C-130J-30 Super Hercules",
"C-17A",
@@ -12,7 +13,8 @@
"F-16CM Fighting Falcon (Block 50)",
"Mirage 2000-5",
"Mirage 2000C",
"UH-60A"
"UH-60A",
"UH-60L"
],
"awacs": [
"E-3A"

View File

@@ -11,6 +11,7 @@
"A-10A Thunderbolt II",
"A-10C Thunderbolt II (Suite 3)",
"AH-64D Apache Longbow",
"AH-64D Apache Longbow (AI)",
"AV-8B Harrier II Night Attack",
"B-1B Lancer",
"B-52H Stratofortress",

View File

@@ -26,7 +26,8 @@
"S-3B Viking",
"SH-60B Seahawk",
"UH-1H Iroquois",
"UH-60A"
"UH-60A",
"UH-60L"
],
"awacs": [
"E-2C Hawkeye",
@@ -34,6 +35,7 @@
],
"tankers": [
"KC-130",
"KC-130J",
"KC-135 Stratotanker",
"S-3B Tanker"
],

View File

@@ -10,6 +10,7 @@
"A-10C Thunderbolt II (Suite 3)",
"A-10C Thunderbolt II (Suite 7)",
"AH-64D Apache Longbow",
"AH-64D Apache Longbow (AI)",
"AV-8B Harrier II Night Attack",
"B-1B Lancer",
"B-52H Stratofortress",
@@ -28,7 +29,8 @@
"S-3B Viking",
"SH-60B Seahawk",
"UH-1H Iroquois",
"UH-60A"
"UH-60A",
"UH-60L"
],
"awacs": [
"E-2C Hawkeye",
@@ -36,6 +38,7 @@
],
"tankers": [
"KC-130",
"KC-130J",
"KC-135 Stratotanker",
"KC-135 Stratotanker MPRS",
"S-3B Tanker"

View File

@@ -0,0 +1,12 @@
---
name: A Company, 1-211th ARB
nickname: Air Pirates
female_pilot_percentage: 10
country: USA
role: Attack Helicopter
aircraft: AH-64D Apache Longbow
livery: The Air Pirates 1-211th ARB
mission_types:
- CAS
- BAI
- OCA/Aircraft

View File

@@ -0,0 +1,12 @@
---
name: A Company, 1-227th ARB
nickname: Avengers
female_pilot_percentage: 10
country: USA
role: Attack Helicopter
aircraft: AH-64D Apache Longbow
livery: Avengers 1-227th ARB
mission_types:
- CAS
- BAI
- OCA/Aircraft

View File

@@ -0,0 +1,12 @@
---
name: C Company, 2-159th ARB
nickname: Gunslingers
female_pilot_percentage: 10
country: USA
role: Attack Helicopter
aircraft: AH-64D Apache Longbow
livery: Gunslingers 2-159th ARB
mission_types:
- CAS
- BAI
- OCA/Aircraft

View File

@@ -0,0 +1,11 @@
---
name: 229th Aviation Battalion
nickname: Serpents
country: USA
role: Attack Helicopter
aircraft: AH-64D Apache Longbow
livery: standard
mission_types:
- CAS
- BAI
- OCA/Aircraft

View File

@@ -0,0 +1,12 @@
---
name: Wolfpack, 1-82 ARB
nickname: Wolfpack
female_pilot_percentage: 10
country: USA
role: Attack Helicopter
aircraft: AH-64D Apache Longbow
livery: Wolfpack 1-82 ARB
mission_types:
- CAS
- BAI
- OCA/Aircraft

View File

@@ -0,0 +1,15 @@
---
name: No. 12 Squadron
nickname: Shiny Twelve
country: UK
role: Strike Fighter
aircraft: Tornado GR4
livery: HAF_341_Arrow
mission_types:
- BAI
- CAS
- DEAD
- OCA/Runway
- SEAD
- SEAD Escort
- Strike

View File

@@ -0,0 +1,11 @@
---
name: 101st Combat Aviation Brigade
nickname: Bearcats
country: USA
role: Transport/Light Attack
aircraft: UH-60A
livery: standard
mission_types:
- CAS
- OCA/Aircraft
- Transport

Some files were not shown because too many files have changed in this diff Show More