Compare commits

...

16 Commits

Author SHA1 Message Date
zhexu14
ef8eeeb1f1 Update README.md due to changes in URLs 2024-03-05 21:45:23 +11:00
Starfire13
e42a7b9a59 Remove squadrons from Nevatim in Exercise Bright Star (#3345)
This is a (potentially) temporary modification for Exercise Bright Star
that moves one of its squadrons to Hatzerim and disables the other two.
The reason is because Nevatim is currently bugged and only 11 out of its
120 airfield parking spots are usable. You can place aircraft into the
other parking spots in the mission editor but they will all explode upon
entering the mission.
2024-02-28 20:35:03 +11:00
Starfire13
24c9ca5d12 Add FCR to the Apache Blk II's new loadout slot (#3343)
The Apache Blk II now has a dedicated loadout slot for the CFR, rather
than it being set by a checkbox in the mission editor. This PR updates
the loadouts for that new slot.

This PR should not be merged until Liberation/pydcs has been updated to
support the change.
2024-02-24 16:25:25 +11:00
zhexu14
678dd58e7d Update pydcs version for DCS 2.9.3.51704 (#3344)
- Updates pydcs version for DCS 2.9.3.51704
- Removes AH-64 FCR/RFI default override, which does not exist any more.
- Update custom payloads for SA342L/M due to changes to CLSIDs. SA342
Minigun payloads also updated but not tested as the unit type does not
have any tasks assigned.

This PR is missing updates to the AH-64 payloads, so this PR complements
#3343
2024-02-24 16:22:54 +11:00
zhexu14
d6879040ad Fix syntax error in tripoint_hostility.yaml campaign definition (#3341)
This PR fixes a minor syntax error in tripoint_hostility.yaml that was
preventing the New Game Wizard from opening successfully.
2024-02-21 20:47:40 +11:00
Starfire13
d0be4b6a29 Update Vectron's Claw (#3339)
Modernises Vectron's Claw, which is my oldest campaign and is getting a
little outdated.
2024-02-21 20:47:10 +11:00
dependabot[bot]
0d71372377 Bump jinja2 from 3.1.2 to 3.1.3 (#3327)
Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.2 to 3.1.3.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/pallets/jinja/releases">jinja2's
releases</a>.</em></p>
<blockquote>
<h2>3.1.3</h2>
<p>This is a fix release for the 3.1.x feature branch.</p>
<ul>
<li>Fix for <a
href="https://github.com/pallets/jinja/security/advisories/GHSA-h5c8-rqwp-cp95">GHSA-h5c8-rqwp-cp95</a>.
You are affected if you are using <code>xmlattr</code> and passing user
input as attribute keys.</li>
<li>Changes: <a
href="https://jinja.palletsprojects.com/en/3.1.x/changes/#version-3-1-3">https://jinja.palletsprojects.com/en/3.1.x/changes/#version-3-1-3</a></li>
<li>Milestone: <a
href="https://github.com/pallets/jinja/milestone/15?closed=1">https://github.com/pallets/jinja/milestone/15?closed=1</a></li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/pallets/jinja/blob/main/CHANGES.rst">jinja2's
changelog</a>.</em></p>
<blockquote>
<h2>Version 3.1.3</h2>
<p>Released 2024-01-10</p>
<ul>
<li>Fix compiler error when checking if required blocks in parent
templates are
empty. :pr:<code>1858</code></li>
<li><code>xmlattr</code> filter does not allow keys with spaces.
GHSA-h5c8-rqwp-cp95</li>
<li>Make error messages stemming from invalid nesting of <code>{% trans
%}</code> blocks
more helpful. :pr:<code>1918</code></li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="d9de4bb215"><code>d9de4bb</code></a>
release version 3.1.3</li>
<li><a
href="50124e1656"><code>50124e1</code></a>
skip test pypi</li>
<li><a
href="9ea7222ef3"><code>9ea7222</code></a>
use trusted publishing</li>
<li><a
href="da703f7aae"><code>da703f7</code></a>
use trusted publishing</li>
<li><a
href="bce1746925"><code>bce1746</code></a>
use trusted publishing</li>
<li><a
href="7277d8068b"><code>7277d80</code></a>
update pre-commit hooks</li>
<li><a
href="5c8a105224"><code>5c8a105</code></a>
Make nested-trans-block exceptions nicer (<a
href="https://redirect.github.com/pallets/jinja/issues/1918">#1918</a>)</li>
<li><a
href="19a55db3b4"><code>19a55db</code></a>
Make nested-trans-block exceptions nicer</li>
<li><a
href="716795349a"><code>7167953</code></a>
Merge pull request from GHSA-h5c8-rqwp-cp95</li>
<li><a
href="7dd3680e6e"><code>7dd3680</code></a>
xmlattr filter disallows keys with spaces</li>
<li>Additional commits viewable in <a
href="https://github.com/pallets/jinja/compare/3.1.2...3.1.3">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=jinja2&package-manager=pip&previous-version=3.1.2&new-version=3.1.3)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

You can trigger a rebase of this PR by commenting `@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/dcs-liberation/dcs_liberation/network/alerts).

</details>

> **Note**
> Automatic rebases have been disabled on this pull request as it has
been open for over 30 days.

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-20 22:55:03 +11:00
dependabot[bot]
86de5df21e Bump pillow from 10.0.1 to 10.2.0 (#3330)
Bumps [pillow](https://github.com/python-pillow/Pillow) from 10.0.1 to
10.2.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/python-pillow/Pillow/releases">pillow's
releases</a>.</em></p>
<blockquote>
<h2>10.2.0</h2>
<p><a
href="https://pillow.readthedocs.io/en/stable/releasenotes/10.2.0.html">https://pillow.readthedocs.io/en/stable/releasenotes/10.2.0.html</a></p>
<h2>Changes</h2>
<ul>
<li>Add <code>keep_rgb</code> option when saving JPEG to prevent
conversion of RGB colorspace <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7553">#7553</a>
[<a href="https://github.com/bgilbert"><code>@​bgilbert</code></a>]</li>
<li>Trim negative glyph offsets in ImageFont.getmask() <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7672">#7672</a>
[<a href="https://github.com/nulano"><code>@​nulano</code></a>]</li>
<li>Removed unnecessary &quot;pragma: no cover&quot; <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7668">#7668</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Trim glyph size in ImageFont.getmask() <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7669">#7669</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Fix loading IPTC images and update test <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7667">#7667</a>
[<a href="https://github.com/nulano"><code>@​nulano</code></a>]</li>
<li>Allow uncompressed TIFF images to be saved in chunks <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7650">#7650</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Concatenate multiple JPEG EXIF markers <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7496">#7496</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Changed IPTC tile tuple to match other plugins <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7661">#7661</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Do not assign new fp attribute when exiting context manager <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7566">#7566</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Support arbitrary masks for uncompressed RGB DDS images <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7589">#7589</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Support setting ROWSPERSTRIP tag <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7654">#7654</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Apply ImageFont.MAX_STRING_LENGTH to ImageFont.getmask() <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7662">#7662</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Optimise <code>ImageColor</code> using
<code>functools.lru_cache</code> <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7657">#7657</a>
[<a href="https://github.com/hugovk"><code>@​hugovk</code></a>]</li>
<li>Restricted environment keys for ImageMath.eval() <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7655">#7655</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Optimise <code>ImageMode.getmode</code> using
<code>functools.lru_cache</code> <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7641">#7641</a>
[<a href="https://github.com/hugovk"><code>@​hugovk</code></a>]</li>
<li>Added trusted PyPI publishing <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7616">#7616</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Compile FriBiDi for Windows ARM64 <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7629">#7629</a>
[<a href="https://github.com/nulano"><code>@​nulano</code></a>]</li>
<li>Fix incorrect color blending for overlapping glyphs <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7497">#7497</a>
[<a
href="https://github.com/ZachNagengast"><code>@​ZachNagengast</code></a>]</li>
<li>Add .git-blame-ignore-revs file <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7528">#7528</a>
[<a href="https://github.com/akx"><code>@​akx</code></a>]</li>
<li>Attempt memory mapping when tile args is a string <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7565">#7565</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Fill identical pixels with transparency in subsequent frames when
saving GIF <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7568">#7568</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Removed unnecessary string length check <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7560">#7560</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Determine mask mode in Python instead of C <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7548">#7548</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Corrected duration when combining multiple GIF frames into single
frame <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7521">#7521</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Handle disposing GIF background from outside palette <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7515">#7515</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Seek past the data when skipping a PSD layer <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7483">#7483</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>ImageMath: Inline <code>isinstance</code> check <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7623">#7623</a>
[<a href="https://github.com/hugovk"><code>@​hugovk</code></a>]</li>
<li>Update actions/upload-artifact action to v4 <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7619">#7619</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Import plugins relative to the module <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7576">#7576</a>
[<a
href="https://github.com/deliangyang"><code>@​deliangyang</code></a>]</li>
<li>Translate encoder error codes to strings; deprecate
<code>ImageFile.raise_oserror()</code> <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7609">#7609</a>
[<a href="https://github.com/bgilbert"><code>@​bgilbert</code></a>]</li>
<li>Updated readthedocs to latest version of Python <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7611">#7611</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Support reading BC4U and DX10 BC1 images <a
href="https://redirect.github.com/python-pillow/Pillow/issues/6486">#6486</a>
[<a href="https://github.com/REDxEYE"><code>@​REDxEYE</code></a>]</li>
<li>Optimize ImageStat.Stat.extrema <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7593">#7593</a>
[<a href="https://github.com/florath"><code>@​florath</code></a>]</li>
<li>Handle pathlib.Path in FreeTypeFont <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7578">#7578</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Use list comprehensions to create transformed lists <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7597">#7597</a>
[<a href="https://github.com/hugovk"><code>@​hugovk</code></a>]</li>
<li>Added support for reading DX10 BC4 DDS images <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7603">#7603</a>
[<a href="https://github.com/sambvfx"><code>@​sambvfx</code></a>]</li>
<li>Optimized ImageStat.Stat.count <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7599">#7599</a>
[<a href="https://github.com/florath"><code>@​florath</code></a>]</li>
<li>Moved error from truetype() to FreeTypeFont <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7587">#7587</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Correct PDF palette size when saving <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7555">#7555</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>Fixed closing file pointer with olefile 0.47 <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7594">#7594</a>
[<a
href="https://github.com/radarhere"><code>@​radarhere</code></a>]</li>
<li>ruff: Minor optimizations of list comprehensions, x in set, etc. <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7524">#7524</a>
[<a href="https://github.com/cclauss"><code>@​cclauss</code></a>]</li>
<li>Build Windows wheels using cibuildwheel <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7580">#7580</a>
[<a href="https://github.com/nulano"><code>@​nulano</code></a>]</li>
<li>Raise ValueError when TrueType font size is zero or less <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7584">#7584</a>
[<a href="https://github.com/akx"><code>@​akx</code></a>]</li>
<li>Install cibuildwheel from requirements file <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7581">#7581</a>
[<a href="https://github.com/hugovk"><code>@​hugovk</code></a>]</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst">pillow's
changelog</a>.</em></p>
<blockquote>
<h2>10.2.0 (2024-01-02)</h2>
<ul>
<li>
<p>Add <code>keep_rgb</code> option when saving JPEG to prevent
conversion of RGB colorspace <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7553">#7553</a>
[bgilbert, radarhere]</p>
</li>
<li>
<p>Trim glyph size in ImageFont.getmask() <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7669">#7669</a>,
<a
href="https://redirect.github.com/python-pillow/Pillow/issues/7672">#7672</a>
[radarhere, nulano]</p>
</li>
<li>
<p>Deprecate IptcImagePlugin helpers <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7664">#7664</a>
[nulano, hugovk, radarhere]</p>
</li>
<li>
<p>Allow uncompressed TIFF images to be saved in chunks <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7650">#7650</a>
[radarhere]</p>
</li>
<li>
<p>Concatenate multiple JPEG EXIF markers <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7496">#7496</a>
[radarhere]</p>
</li>
<li>
<p>Changed IPTC tile tuple to match other plugins <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7661">#7661</a>
[radarhere]</p>
</li>
<li>
<p>Do not assign new fp attribute when exiting context manager <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7566">#7566</a>
[radarhere]</p>
</li>
<li>
<p>Support arbitrary masks for uncompressed RGB DDS images <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7589">#7589</a>
[radarhere, akx]</p>
</li>
<li>
<p>Support setting ROWSPERSTRIP tag <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7654">#7654</a>
[radarhere]</p>
</li>
<li>
<p>Apply ImageFont.MAX_STRING_LENGTH to ImageFont.getmask() <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7662">#7662</a>
[radarhere]</p>
</li>
<li>
<p>Optimise <code>ImageColor</code> using
<code>functools.lru_cache</code> <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7657">#7657</a>
[hugovk]</p>
</li>
<li>
<p>Restricted environment keys for ImageMath.eval() <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7655">#7655</a>
[wiredfool, radarhere]</p>
</li>
<li>
<p>Optimise <code>ImageMode.getmode</code> using
<code>functools.lru_cache</code> <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7641">#7641</a>
[hugovk, radarhere]</p>
</li>
<li>
<p>Fix incorrect color blending for overlapping glyphs <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7497">#7497</a>
[ZachNagengast, nulano, radarhere]</p>
</li>
<li>
<p>Attempt memory mapping when tile args is a string <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7565">#7565</a>
[radarhere]</p>
</li>
<li>
<p>Fill identical pixels with transparency in subsequent frames when
saving GIF <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7568">#7568</a>
[radarhere]</p>
</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="6956d0b285"><code>6956d0b</code></a>
10.2.0 version bump</li>
<li><a
href="31c8dacdc7"><code>31c8dac</code></a>
Merge pull request <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7675">#7675</a>
from python-pillow/pre-commit-ci-update-config</li>
<li><a
href="40a3f91af2"><code>40a3f91</code></a>
Merge pull request <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7674">#7674</a>
from nulano/url-example</li>
<li><a
href="cb41b0cc78"><code>cb41b0c</code></a>
[pre-commit.ci] pre-commit autoupdate</li>
<li><a
href="de62b25ed3"><code>de62b25</code></a>
fix image url in &quot;Reading from URL&quot; example</li>
<li><a
href="7c526a6c6b"><code>7c526a6</code></a>
Update CHANGES.rst [ci skip]</li>
<li><a
href="d93a5ad70b"><code>d93a5ad</code></a>
Merge pull request <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7553">#7553</a>
from bgilbert/jpeg-rgb</li>
<li><a
href="aed764fe84"><code>aed764f</code></a>
Update CHANGES.rst [ci skip]</li>
<li><a
href="f8df5303fa"><code>f8df530</code></a>
Merge pull request <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7672">#7672</a>
from nulano/imagefont-negative-crop</li>
<li><a
href="24e9485e6b"><code>24e9485</code></a>
Merge pull request <a
href="https://redirect.github.com/python-pillow/Pillow/issues/7671">#7671</a>
from radarhere/imagetransform</li>
<li>Additional commits viewable in <a
href="https://github.com/python-pillow/Pillow/compare/10.0.1...10.2.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=pillow&package-manager=pip&previous-version=10.0.1&new-version=10.2.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot merge` will merge this PR after your CI passes on it
- `@dependabot squash and merge` will squash and merge this PR after
your CI passes on it
- `@dependabot cancel merge` will cancel a previously requested merge
and block automerging
- `@dependabot reopen` will reopen this PR if it is closed
- `@dependabot close` will close this PR and stop Dependabot recreating
it. You can achieve the same result by closing it manually
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/dcs-liberation/dcs_liberation/network/alerts).

</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-02-20 22:54:52 +11:00
tmz42
d1daa0521c Tripoint correction for max A-10C size 2024-02-08 20:44:46 -08:00
tmz42
ffa88688dc Added new merged campaign of both Scenic Routes, Scenic Merge. 2024-02-08 20:44:46 -08:00
tmz42
5ecaeca910 Campaign corrections : A-10C II instead of A-10CI, From Incirlik is actually from Incirlik in Tripoint 2024-02-08 20:44:46 -08:00
Chilli935
e1d443b697 Super Hornet mod support (#3331)
F/A-18E and F/A-18F are added to their factions, Growler is currently in
its respective factions but was released in 2009, this will be changed
if needed.
2024-01-27 23:14:57 +00:00
zhexu14
5af4e56f30 Add hit points to unit yamls.
This PR:

- Introduces a new member of UnitType, hit_points, which is an abstract
representation of the durability of a unit, and loads it in from the
YAML files in the various subclasses (Ship, Ground etc).
- Adds scripts for populating/updating the unit YAML files with hit
point data from DCS. This script also gets the data for static objects,
but I'll leave the plugging in of static object data into Liberation for
another PR.
- Updates the unit YAML files by running the above scripts.

I did toy with the idea of adding this data to the unit definitions in
pydcs via an export from DCS, but it would be a more involved change,
since the current pydcs export script runs in the Hooks Lua environment
in DCS and AFAICT the hit points (via Unit.getLife()) is run in the
mission scripting environment.
2024-01-04 00:49:33 -08:00
zhexu14
5b858886c0 Doctrine cleanup (#3318)
This PR:

- Refactors the doctrine class to have a bit more structure, in
anticipation of adding more elements to Doctrine.
- Moves previously hard coded helo-specific altitudes into the Doctrine
class, aligning a bunch of altitudes ~200ft in the process.
- Refactors ingress_altitude to combat_altitude to clarify that the
altitude is applied to multiple waypoint types, not just the ingress
altitude.
2024-01-01 13:31:26 -08:00
Dan Albert
c695e7724a Update bug templates for 10.0.0. 2023-12-31 12:57:12 -08:00
Dan Albert
2fb22e4e17 Bump develop to 11.0.0. 2023-12-30 16:05:45 -08:00
432 changed files with 1751 additions and 634 deletions

View File

@@ -31,7 +31,7 @@ body:
If the bug was found in a development build, select "Development build" If the bug was found in a development build, select "Development build"
and provide a link to the build in the field below. and provide a link to the build in the field below.
options: options:
- 9.0.0 - 10.0.0
- Development build - Development build
- type: textarea - type: textarea
attributes: attributes:

View File

@@ -39,7 +39,7 @@ body:
If the bug was found in a development build, select "Development build" If the bug was found in a development build, select "Development build"
and provide a link to the build in the field below. and provide a link to the build in the field below.
options: options:
- 9.0.0 - 10.0.0
- Development build - Development build
- type: textarea - type: textarea
attributes: attributes:

View File

@@ -2,7 +2,7 @@
(Github Readme Banner and Splash screen Artwork by Andriy Dankovych, CC BY-SA 4.0) (Github Readme Banner and Splash screen Artwork by Andriy Dankovych, CC BY-SA 4.0)
[![Patreon](https://img.shields.io/badge/patreon-become%20a%20patron-orange?logo=patreon)](https://patreon.com/khopa) [![Patreon](https://img.shields.io/badge/patreon-become%20a%20patron-orange?logo=patreon)](https://patreon.com/dcsliberation)
[![Download](https://img.shields.io/github/downloads/dcs-liberation/dcs_liberation/total?label=Download)](https://github.com/dcs-liberation/dcs_liberation/releases) [![Download](https://img.shields.io/github/downloads/dcs-liberation/dcs_liberation/total?label=Download)](https://github.com/dcs-liberation/dcs_liberation/releases)

View File

@@ -1,3 +1,13 @@
# 11.0.0
Saves from 10.x are not compatible with 11.0.0.
## Features/Improvements
* **[Engine]** Support for DCS 2.9.3.51704 Open Beta.
## Fixes
# 10.0.0 # 10.0.0
Saves from 9.x are not compatible with 10.0.0. Saves from 9.x are not compatible with 10.0.0.

View File

@@ -9,7 +9,7 @@
project = "DCS Liberation" project = "DCS Liberation"
copyright = "2023, DCS Liberation Team" copyright = "2023, DCS Liberation Team"
author = "DCS Liberation Team" author = "DCS Liberation Team"
release = "10.0.0" release = "11.0.0"
# -- General configuration --------------------------------------------------- # -- General configuration ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration # https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration

View File

@@ -88,7 +88,7 @@ class Builder(IBuilder[AirAssaultFlightPlan, AirAssaultLayout]):
raise PlanningError("Air assault is only usable by helicopters") raise PlanningError("Air assault is only usable by helicopters")
assert self.package.waypoints is not None assert self.package.waypoints is not None
altitude = feet(1500) if self.flight.is_helo else self.doctrine.ingress_altitude altitude = self.doctrine.helicopter.air_assault_nav_altitude
altitude_is_agl = self.flight.is_helo altitude_is_agl = self.flight.is_helo
builder = WaypointBuilder(self.flight, self.coalition) builder = WaypointBuilder(self.flight, self.coalition)

View File

@@ -19,7 +19,7 @@ class BarCapFlightPlan(PatrollingFlightPlan[PatrollingLayout]):
@property @property
def patrol_duration(self) -> timedelta: def patrol_duration(self) -> timedelta:
return self.flight.coalition.doctrine.cap_duration return self.flight.coalition.doctrine.cap.duration
@property @property
def patrol_speed(self) -> Speed: def patrol_speed(self) -> Speed:
@@ -29,7 +29,7 @@ class BarCapFlightPlan(PatrollingFlightPlan[PatrollingLayout]):
@property @property
def engagement_distance(self) -> Distance: def engagement_distance(self) -> Distance:
return self.flight.coalition.doctrine.cap_engagement_range return self.flight.coalition.doctrine.cap.engagement_range
class Builder(CapBuilder[BarCapFlightPlan, PatrollingLayout]): class Builder(CapBuilder[BarCapFlightPlan, PatrollingLayout]):
@@ -44,8 +44,8 @@ class Builder(CapBuilder[BarCapFlightPlan, PatrollingLayout]):
preferred_alt = self.flight.unit_type.preferred_patrol_altitude preferred_alt = self.flight.unit_type.preferred_patrol_altitude
randomized_alt = preferred_alt + feet(random.randint(-2, 1) * 1000) randomized_alt = preferred_alt + feet(random.randint(-2, 1) * 1000)
patrol_alt = max( patrol_alt = max(
self.doctrine.min_patrol_altitude, self.doctrine.cap.min_patrol_altitude,
min(self.doctrine.max_patrol_altitude, randomized_alt), min(self.doctrine.cap.max_patrol_altitude, randomized_alt),
) )
builder = WaypointBuilder(self.flight, self.coalition) builder = WaypointBuilder(self.flight, self.coalition)

View File

@@ -90,10 +90,10 @@ class CapBuilder(IBuilder[FlightPlanT, LayoutT], ABC):
# buffer. # buffer.
distance_to_no_fly = ( distance_to_no_fly = (
meters(position.distance(self.threat_zones.all)) meters(position.distance(self.threat_zones.all))
- self.doctrine.cap_engagement_range - self.doctrine.cap.engagement_range
- nautical_miles(5) - nautical_miles(5)
) )
max_track_length = self.doctrine.cap_max_track_length max_track_length = self.doctrine.cap.max_track_length
else: else:
# Other race tracks (TARCAPs, currently) just try to keep some # Other race tracks (TARCAPs, currently) just try to keep some
# distance from the nearest enemy airbase, but since they are by # distance from the nearest enemy airbase, but since they are by
@@ -108,15 +108,15 @@ class CapBuilder(IBuilder[FlightPlanT, LayoutT], ABC):
distance_to_no_fly = distance_to_airfield - min_distance_from_enemy distance_to_no_fly = distance_to_airfield - min_distance_from_enemy
# TARCAPs fly short racetracks because they need to react faster. # TARCAPs fly short racetracks because they need to react faster.
max_track_length = self.doctrine.cap_min_track_length + 0.3 * ( max_track_length = self.doctrine.cap.min_track_length + 0.3 * (
self.doctrine.cap_max_track_length - self.doctrine.cap_min_track_length self.doctrine.cap.max_track_length - self.doctrine.cap.min_track_length
) )
min_cap_distance = min( min_cap_distance = min(
self.doctrine.cap_min_distance_from_cp, distance_to_no_fly self.doctrine.cap.min_distance_from_cp, distance_to_no_fly
) )
max_cap_distance = min( max_cap_distance = min(
self.doctrine.cap_max_distance_from_cp, distance_to_no_fly self.doctrine.cap.max_distance_from_cp, distance_to_no_fly
) )
end = location.position.point_from_heading( end = location.position.point_from_heading(
@@ -125,7 +125,7 @@ class CapBuilder(IBuilder[FlightPlanT, LayoutT], ABC):
) )
track_length = random.randint( track_length = random.randint(
int(self.doctrine.cap_min_track_length.meters), int(self.doctrine.cap.min_track_length.meters),
int(max_track_length.meters), int(max_track_length.meters),
) )
start = end.point_from_heading(heading.opposite.degrees, track_length) start = end.point_from_heading(heading.opposite.degrees, track_length)

View File

@@ -44,7 +44,7 @@ class CasFlightPlan(PatrollingFlightPlan[CasLayout], UiZoneDisplay):
@property @property
def patrol_duration(self) -> timedelta: def patrol_duration(self) -> timedelta:
return self.flight.coalition.doctrine.cas_duration return self.flight.coalition.doctrine.cas.duration
@property @property
def patrol_speed(self) -> Speed: def patrol_speed(self) -> Speed:
@@ -96,7 +96,7 @@ class Builder(IBuilder[CasFlightPlan, CasLayout]):
builder = WaypointBuilder(self.flight, self.coalition) builder = WaypointBuilder(self.flight, self.coalition)
is_helo = self.flight.unit_type.dcs_unit_type.helicopter is_helo = self.flight.unit_type.dcs_unit_type.helicopter
patrol_altitude = self.doctrine.ingress_altitude if not is_helo else meters(50) patrol_altitude = self.doctrine.resolve_combat_altitude(is_helo)
use_agl_patrol_altitude = is_helo use_agl_patrol_altitude = is_helo
ip_solver = IpSolver( ip_solver = IpSolver(

View File

@@ -33,7 +33,7 @@ class Builder(FormationAttackBuilder[EscortFlightPlan, FormationAttackLayout]):
departure=builder.takeoff(self.flight.departure), departure=builder.takeoff(self.flight.departure),
hold=hold, hold=hold,
nav_to=builder.nav_path( nav_to=builder.nav_path(
hold.position, join.position, self.doctrine.ingress_altitude hold.position, join.position, self.doctrine.combat_altitude
), ),
join=join, join=join,
ingress=ingress, ingress=ingress,
@@ -43,7 +43,7 @@ class Builder(FormationAttackBuilder[EscortFlightPlan, FormationAttackLayout]):
nav_from=builder.nav_path( nav_from=builder.nav_path(
refuel.position, refuel.position,
self.flight.arrival.position, self.flight.arrival.position,
self.doctrine.ingress_altitude, self.doctrine.combat_altitude,
), ),
arrival=builder.land(self.flight.arrival), arrival=builder.land(self.flight.arrival),
divert=builder.divert(self.flight.divert), divert=builder.divert(self.flight.divert),

View File

@@ -163,7 +163,7 @@ class FormationAttackBuilder(IBuilder[FlightPlanT, LayoutT], ABC):
departure=builder.takeoff(self.flight.departure), departure=builder.takeoff(self.flight.departure),
hold=hold, hold=hold,
nav_to=builder.nav_path( nav_to=builder.nav_path(
hold.position, join.position, self.doctrine.ingress_altitude hold.position, join.position, self.doctrine.combat_altitude
), ),
join=join, join=join,
ingress=ingress, ingress=ingress,
@@ -173,7 +173,7 @@ class FormationAttackBuilder(IBuilder[FlightPlanT, LayoutT], ABC):
nav_from=builder.nav_path( nav_from=builder.nav_path(
refuel.position, refuel.position,
self.flight.arrival.position, self.flight.arrival.position,
self.doctrine.ingress_altitude, self.doctrine.combat_altitude,
), ),
arrival=builder.land(self.flight.arrival), arrival=builder.land(self.flight.arrival),
divert=builder.divert(self.flight.divert), divert=builder.divert(self.flight.divert),

View File

@@ -114,11 +114,11 @@ class Builder(IBuilder[SweepFlightPlan, SweepLayout]):
self.package.waypoints.join.heading_between_point(target) self.package.waypoints.join.heading_between_point(target)
) )
start_pos = target.point_from_heading( start_pos = target.point_from_heading(
heading.degrees, -self.doctrine.sweep_distance.meters heading.degrees, -self.doctrine.sweep.distance.meters
) )
builder = WaypointBuilder(self.flight, self.coalition) builder = WaypointBuilder(self.flight, self.coalition)
start, end = builder.sweep(start_pos, target, self.doctrine.ingress_altitude) start, end = builder.sweep(start_pos, target, self.doctrine.combat_altitude)
hold = builder.hold(self._hold_point()) hold = builder.hold(self._hold_point())
@@ -126,12 +126,12 @@ class Builder(IBuilder[SweepFlightPlan, SweepLayout]):
departure=builder.takeoff(self.flight.departure), departure=builder.takeoff(self.flight.departure),
hold=hold, hold=hold,
nav_to=builder.nav_path( nav_to=builder.nav_path(
hold.position, start.position, self.doctrine.ingress_altitude hold.position, start.position, self.doctrine.combat_altitude
), ),
nav_from=builder.nav_path( nav_from=builder.nav_path(
end.position, end.position,
self.flight.arrival.position, self.flight.arrival.position,
self.doctrine.ingress_altitude, self.doctrine.combat_altitude,
), ),
sweep_start=start, sweep_start=start,
sweep_end=end, sweep_end=end,

View File

@@ -40,7 +40,7 @@ class TarCapFlightPlan(PatrollingFlightPlan[TarCapLayout]):
# flights in the package that have requested escort. If the package # flights in the package that have requested escort. If the package
# requests an escort the CAP self.flight will remain on station for the # requests an escort the CAP self.flight will remain on station for the
# duration of the escorted mission, or until it is winchester/bingo. # duration of the escorted mission, or until it is winchester/bingo.
return self.flight.coalition.doctrine.cap_duration return self.flight.coalition.doctrine.cap.duration
@property @property
def patrol_speed(self) -> Speed: def patrol_speed(self) -> Speed:
@@ -50,7 +50,7 @@ class TarCapFlightPlan(PatrollingFlightPlan[TarCapLayout]):
@property @property
def engagement_distance(self) -> Distance: def engagement_distance(self) -> Distance:
return self.flight.coalition.doctrine.cap_engagement_range return self.flight.coalition.doctrine.cap.engagement_range
@staticmethod @staticmethod
def builder_type() -> Type[Builder]: def builder_type() -> Type[Builder]:
@@ -90,8 +90,8 @@ class Builder(CapBuilder[TarCapFlightPlan, TarCapLayout]):
preferred_alt = self.flight.unit_type.preferred_patrol_altitude preferred_alt = self.flight.unit_type.preferred_patrol_altitude
randomized_alt = preferred_alt + feet(random.randint(-2, 1) * 1000) randomized_alt = preferred_alt + feet(random.randint(-2, 1) * 1000)
patrol_alt = max( patrol_alt = max(
self.doctrine.min_patrol_altitude, self.doctrine.cap.min_patrol_altitude,
min(self.doctrine.max_patrol_altitude, randomized_alt), min(self.doctrine.cap.max_patrol_altitude, randomized_alt),
) )
builder = WaypointBuilder(self.flight, self.coalition) builder = WaypointBuilder(self.flight, self.coalition)

View File

@@ -72,7 +72,7 @@ class WaypointBuilder:
"NAV", "NAV",
FlightWaypointType.NAV, FlightWaypointType.NAV,
position, position,
meters(500) if self.is_helo else self.doctrine.rendezvous_altitude, self.doctrine.resolve_rendezvous_altitude(self.is_helo),
description="Enter theater", description="Enter theater",
pretty_name="Enter theater", pretty_name="Enter theater",
) )
@@ -99,7 +99,7 @@ class WaypointBuilder:
"NAV", "NAV",
FlightWaypointType.NAV, FlightWaypointType.NAV,
position, position,
meters(500) if self.is_helo else self.doctrine.rendezvous_altitude, self.doctrine.resolve_rendezvous_altitude(self.is_helo),
description="Exit theater", description="Exit theater",
pretty_name="Exit theater", pretty_name="Exit theater",
) )
@@ -127,10 +127,7 @@ class WaypointBuilder:
position = divert.position position = divert.position
altitude_type: AltitudeReference altitude_type: AltitudeReference
if isinstance(divert, OffMapSpawn): if isinstance(divert, OffMapSpawn):
if self.is_helo: altitude = self.doctrine.resolve_rendezvous_altitude(self.is_helo)
altitude = meters(500)
else:
altitude = self.doctrine.rendezvous_altitude
altitude_type = "BARO" altitude_type = "BARO"
else: else:
altitude = meters(0) altitude = meters(0)
@@ -168,10 +165,7 @@ class WaypointBuilder:
"HOLD", "HOLD",
FlightWaypointType.LOITER, FlightWaypointType.LOITER,
position, position,
# Bug: DCS only accepts MSL altitudes for the orbit task and 500 meters is self.doctrine.resolve_rendezvous_altitude(self.is_helo),
# below the ground for most if not all of NTTR (and lots of places in other
# maps).
meters(500) if self.is_helo else self.doctrine.rendezvous_altitude,
alt_type, alt_type,
description="Wait until push time", description="Wait until push time",
pretty_name="Hold", pretty_name="Hold",
@@ -186,7 +180,7 @@ class WaypointBuilder:
"JOIN", "JOIN",
FlightWaypointType.JOIN, FlightWaypointType.JOIN,
position, position,
meters(80) if self.is_helo else self.doctrine.ingress_altitude, self.doctrine.resolve_combat_altitude(self.is_helo),
alt_type, alt_type,
description="Rendezvous with package", description="Rendezvous with package",
pretty_name="Join", pretty_name="Join",
@@ -201,7 +195,7 @@ class WaypointBuilder:
"REFUEL", "REFUEL",
FlightWaypointType.REFUEL, FlightWaypointType.REFUEL,
position, position,
meters(80) if self.is_helo else self.doctrine.ingress_altitude, self.doctrine.resolve_combat_altitude(self.is_helo),
alt_type, alt_type,
description="Refuel from tanker", description="Refuel from tanker",
pretty_name="Refuel", pretty_name="Refuel",
@@ -229,7 +223,7 @@ class WaypointBuilder:
"SPLIT", "SPLIT",
FlightWaypointType.SPLIT, FlightWaypointType.SPLIT,
position, position,
meters(80) if self.is_helo else self.doctrine.ingress_altitude, self.doctrine.resolve_combat_altitude(self.is_helo),
alt_type, alt_type,
description="Depart from package", description="Depart from package",
pretty_name="Split", pretty_name="Split",
@@ -249,7 +243,7 @@ class WaypointBuilder:
"INGRESS", "INGRESS",
ingress_type, ingress_type,
position, position,
meters(60) if self.is_helo else self.doctrine.ingress_altitude, self.doctrine.resolve_combat_altitude(self.is_helo),
alt_type, alt_type,
description=f"INGRESS on {objective.name}", description=f"INGRESS on {objective.name}",
pretty_name=f"INGRESS on {objective.name}", pretty_name=f"INGRESS on {objective.name}",
@@ -294,7 +288,7 @@ class WaypointBuilder:
f"SEAD on {target.name}", f"SEAD on {target.name}",
target, target,
flyover=True, flyover=True,
altitude=self.doctrine.ingress_altitude, altitude=self.doctrine.combat_altitude,
alt_type="BARO", alt_type="BARO",
) )
@@ -484,7 +478,7 @@ class WaypointBuilder:
"TARGET", "TARGET",
FlightWaypointType.TARGET_GROUP_LOC, FlightWaypointType.TARGET_GROUP_LOC,
target.position, target.position,
meters(60) if self.is_helo else self.doctrine.ingress_altitude, self.doctrine.resolve_combat_altitude(self.is_helo),
alt_type, alt_type,
description="Escort the package", description="Escort the package",
pretty_name="Target area", pretty_name="Target area",

View File

@@ -158,7 +158,7 @@ class TheaterState(WorldState["TheaterState"]):
# Plan enough rounds of CAP that the target has coverage over the expected # Plan enough rounds of CAP that the target has coverage over the expected
# mission duration. # mission duration.
mission_duration = game.settings.desired_player_mission_duration.total_seconds() mission_duration = game.settings.desired_player_mission_duration.total_seconds()
barcap_duration = coalition.doctrine.cap_duration.total_seconds() barcap_duration = coalition.doctrine.cap.duration.total_seconds()
barcap_rounds = math.ceil(mission_duration / barcap_duration) barcap_rounds = math.ceil(mission_duration / barcap_duration)
refueling_targets: list[MissionTarget] = [] refueling_targets: list[MissionTarget] = []

View File

@@ -2,7 +2,7 @@ from __future__ import annotations
from pathlib import Path from pathlib import Path
import yaml import yaml
from typing import ClassVar from typing import Any, ClassVar
from dataclasses import dataclass from dataclasses import dataclass
from datetime import timedelta from datetime import timedelta
@@ -32,18 +32,94 @@ class GroundUnitProcurementRatios:
return GroundUnitProcurementRatios(r) return GroundUnitProcurementRatios(r)
@dataclass
class Helicopter:
#: The altitude used for combat section of a flight, overrides the base combat_altitude parameter for helos
combat_altitude: Distance
#: The altitude used for forming up a pacakge. Overrides the base rendezvous_altitude parameter for helos
rendezvous_altitude: Distance
#: Altitude of the nav points (cruise section) of air assault missions.
air_assault_nav_altitude: Distance
@staticmethod
def from_dict(data: dict[str, Any]) -> Helicopter:
return Helicopter(
combat_altitude=feet(data["combat_altitude_ft_agl"]),
rendezvous_altitude=feet(data["rendezvous_altitude_ft_agl"]),
air_assault_nav_altitude=feet(data["air_assault_nav_altitude_ft_agl"]),
)
@dataclass
class Cas:
#: The duration that CAP flights will remain on-station.
duration: timedelta
@staticmethod
def from_dict(data: dict[str, Any]) -> Cas:
return Cas(duration=timedelta(minutes=data["duration_minutes"]))
@dataclass
class Sweep:
#: Length of the sweep / patrol leg
distance: Distance
@staticmethod
def from_dict(data: dict[str, Any]) -> Sweep:
return Sweep(
distance=nautical_miles(data["distance_nm"]),
)
@dataclass
class Cap:
#: The duration that CAP flights will remain on-station.
duration: timedelta
#: The minimum length of the CAP race track.
min_track_length: Distance
#: The maximum length of the CAP race track.
max_track_length: Distance
#: The minimum distance between the defended position and the *end* of the
#: CAP race track.
min_distance_from_cp: Distance
#: The maximum distance between the defended position and the *end* of the
#: CAP race track.
max_distance_from_cp: Distance
#: The engagement range of CAP flights. Any enemy aircraft within this range
#: of the CAP's current position will be engaged by the CAP.
engagement_range: Distance
#: Defines the range of altitudes CAP racetracks are planned at.
min_patrol_altitude: Distance
max_patrol_altitude: Distance
@staticmethod
def from_dict(data: dict[str, Any]) -> Cap:
return Cap(
duration=timedelta(minutes=data["duration_minutes"]),
min_track_length=nautical_miles(data["min_track_length_nm"]),
max_track_length=nautical_miles(data["max_track_length_nm"]),
min_distance_from_cp=nautical_miles(data["min_distance_from_cp_nm"]),
max_distance_from_cp=nautical_miles(data["max_distance_from_cp_nm"]),
engagement_range=nautical_miles(data["engagement_range_nm"]),
min_patrol_altitude=feet(data["min_patrol_altitude_ft_msl"]),
max_patrol_altitude=feet(data["max_patrol_altitude_ft_msl"]),
)
@dataclass(frozen=True) @dataclass(frozen=True)
class Doctrine: class Doctrine:
#: Name of the doctrine, used to assign a doctrine in a faction.
name: str name: str
cas: bool
cap: bool
sead: bool
strike: bool
antiship: bool
rendezvous_altitude: Distance
#: The minimum distance between the departure airfield and the hold point. #: The minimum distance between the departure airfield and the hold point.
hold_distance: Distance hold_distance: Distance
@@ -62,42 +138,40 @@ class Doctrine:
#: target. #: target.
min_ingress_distance: Distance min_ingress_distance: Distance
ingress_altitude: Distance #: The altitude used for combat section of a flight.
combat_altitude: Distance
min_patrol_altitude: Distance #: The altitude used for forming up a pacakge.
max_patrol_altitude: Distance rendezvous_altitude: Distance
pattern_altitude: Distance
#: The duration that CAP flights will remain on-station.
cap_duration: timedelta
#: The minimum length of the CAP race track.
cap_min_track_length: Distance
#: The maximum length of the CAP race track.
cap_max_track_length: Distance
#: The minimum distance between the defended position and the *end* of the
#: CAP race track.
cap_min_distance_from_cp: Distance
#: The maximum distance between the defended position and the *end* of the
#: CAP race track.
cap_max_distance_from_cp: Distance
#: The engagement range of CAP flights. Any enemy aircraft within this range
#: of the CAP's current position will be engaged by the CAP.
cap_engagement_range: Distance
cas_duration: timedelta
sweep_distance: Distance
#: Defines prioritization of ground unit purchases.
ground_unit_procurement_ratios: GroundUnitProcurementRatios ground_unit_procurement_ratios: GroundUnitProcurementRatios
#: Helicopter specific doctrines.
helicopter: Helicopter
#: Doctrine for CAS missions.
cas: Cas
#: Doctrine for CAP missions.
cap: Cap
#: Doctrine for Fighter Sweep missions.
sweep: Sweep
_by_name: ClassVar[dict[str, Doctrine]] = {} _by_name: ClassVar[dict[str, Doctrine]] = {}
_loaded: ClassVar[bool] = False _loaded: ClassVar[bool] = False
def resolve_combat_altitude(self, is_helo: bool = False) -> Distance:
if is_helo:
return self.helicopter.combat_altitude
return self.combat_altitude
def resolve_rendezvous_altitude(self, is_helo: bool = False) -> Distance:
if is_helo:
return self.helicopter.rendezvous_altitude
return self.rendezvous_altitude
@classmethod @classmethod
def register(cls, doctrine: Doctrine) -> None: def register(cls, doctrine: Doctrine) -> None:
if doctrine.name in cls._by_name: if doctrine.name in cls._by_name:
@@ -127,11 +201,6 @@ class Doctrine:
cls.register( cls.register(
Doctrine( Doctrine(
name=data["name"], name=data["name"],
cap=data["cap"],
cas=data["cas"],
sead=data["sead"],
strike=data["strike"],
antiship=data["antiship"],
rendezvous_altitude=feet(data["rendezvous_altitude_ft_msl"]), rendezvous_altitude=feet(data["rendezvous_altitude_ft_msl"]),
hold_distance=nautical_miles(data["hold_distance_nm"]), hold_distance=nautical_miles(data["hold_distance_nm"]),
push_distance=nautical_miles(data["push_distance_nm"]), push_distance=nautical_miles(data["push_distance_nm"]),
@@ -142,31 +211,14 @@ class Doctrine:
min_ingress_distance=nautical_miles( min_ingress_distance=nautical_miles(
data["min_ingress_distance_nm"] data["min_ingress_distance_nm"]
), ),
ingress_altitude=feet(data["ingress_altitude_ft_msl"]), combat_altitude=feet(data["combat_altitude_ft_msl"]),
min_patrol_altitude=feet(data["min_patrol_altitude_ft_msl"]),
max_patrol_altitude=feet(data["max_patrol_altitude_ft_msl"]),
pattern_altitude=feet(data["pattern_altitude_ft_msl"]),
cap_duration=timedelta(minutes=data["cap_duration_minutes"]),
cap_min_track_length=nautical_miles(
data["cap_min_track_length_nm"]
),
cap_max_track_length=nautical_miles(
data["cap_max_track_length_nm"]
),
cap_min_distance_from_cp=nautical_miles(
data["cap_min_distance_from_cp_nm"]
),
cap_max_distance_from_cp=nautical_miles(
data["cap_max_distance_from_cp_nm"]
),
cap_engagement_range=nautical_miles(
data["cap_engagement_range_nm"]
),
cas_duration=timedelta(minutes=data["cas_duration_minutes"]),
sweep_distance=nautical_miles(data["sweep_distance_nm"]),
ground_unit_procurement_ratios=GroundUnitProcurementRatios.from_dict( ground_unit_procurement_ratios=GroundUnitProcurementRatios.from_dict(
data["ground_unit_procurement_ratios"] data["ground_unit_procurement_ratios"]
), ),
helicopter=Helicopter.from_dict(data["helicopter"]),
cas=Cas.from_dict(data["cas"]),
cap=Cap.from_dict(data["cap"]),
sweep=Sweep.from_dict(data["sweep"]),
) )
) )
cls._loaded = True cls._loaded = True

View File

@@ -517,6 +517,7 @@ class AircraftType(UnitType[Type[FlyingType]]):
LaserCodeConfig.from_yaml(d) for d in data.get("laser_codes", []) LaserCodeConfig.from_yaml(d) for d in data.get("laser_codes", [])
], ],
use_f15e_waypoint_names=data.get("use_f15e_waypoint_names", False), use_f15e_waypoint_names=data.get("use_f15e_waypoint_names", False),
hit_points=data.get("hit_points", 1),
) )
def __hash__(self) -> int: def __hash__(self) -> int:

View File

@@ -133,4 +133,5 @@ class GroundUnitType(UnitType[Type[VehicleType]]):
data.get("skynet_properties", {}) data.get("skynet_properties", {})
), ),
reversed_heading=data.get("reversed_heading", False), reversed_heading=data.get("reversed_heading", False),
hit_points=data.get("hit_points", 1),
) )

View File

@@ -79,4 +79,5 @@ class ShipUnitType(UnitType[Type[ShipType]]):
manufacturer=data.get("manufacturer", "No data."), manufacturer=data.get("manufacturer", "No data."),
role=data.get("role", "No data."), role=data.get("role", "No data."),
price=data["price"], price=data["price"],
hit_points=data.get("hit_points", 1),
) )

View File

@@ -27,6 +27,7 @@ class UnitType(ABC, Generic[DcsUnitTypeT]):
role: str role: str
price: int price: int
unit_class: UnitClass unit_class: UnitClass
hit_points: int
_loaded: ClassVar[bool] = False _loaded: ClassVar[bool] = False

View File

@@ -300,6 +300,8 @@ class Faction:
self.remove_aircraft("Su-57") self.remove_aircraft("Su-57")
if not mod_settings.ov10a_bronco: if not mod_settings.ov10a_bronco:
self.remove_aircraft("Bronco-OV-10A") self.remove_aircraft("Bronco-OV-10A")
if not mod_settings.superhornet:
self.remove_aircraft("Super-Hornet")
# frenchpack # frenchpack
if not mod_settings.frenchpack: if not mod_settings.frenchpack:
self.remove_vehicle("AMX10RCR") self.remove_vehicle("AMX10RCR")

View File

@@ -66,6 +66,7 @@ class ModSettings:
frenchpack: bool = False frenchpack: bool = False
high_digit_sams: bool = False high_digit_sams: bool = False
ov10a_bronco: bool = False ov10a_bronco: bool = False
superhornet: bool = False
def save_player_settings(self) -> None: def save_player_settings(self) -> None:
"""Saves the player's global settings to the user directory.""" """Saves the player's global settings to the user directory."""

View File

@@ -165,7 +165,7 @@ class ThreatZones:
cls, doctrine: Doctrine, control_point: ControlPoint cls, doctrine: Doctrine, control_point: ControlPoint
) -> Distance: ) -> Distance:
cap_threat_range = ( cap_threat_range = (
doctrine.cap_max_distance_from_cp + doctrine.cap_engagement_range doctrine.cap.max_distance_from_cp + doctrine.cap.engagement_range
) )
opposing_airfield = cls.closest_enemy_airbase( opposing_airfield = cls.closest_enemy_airbase(
control_point, cap_threat_range * 2 control_point, cap_threat_range * 2

View File

@@ -1,7 +1,7 @@
from pathlib import Path from pathlib import Path
MAJOR_VERSION = 10 MAJOR_VERSION = 11
MINOR_VERSION = 0 MINOR_VERSION = 0
MICRO_VERSION = 0 MICRO_VERSION = 0
VERSION_NUMBER = ".".join(str(v) for v in (MAJOR_VERSION, MINOR_VERSION, MICRO_VERSION)) VERSION_NUMBER = ".".join(str(v) for v in (MAJOR_VERSION, MINOR_VERSION, MICRO_VERSION))

View File

@@ -204,6 +204,7 @@ class NewGameWizard(QtWidgets.QWizard):
ov10a_bronco=self.field("ov10a_bronco"), ov10a_bronco=self.field("ov10a_bronco"),
frenchpack=self.field("frenchpack"), frenchpack=self.field("frenchpack"),
high_digit_sams=self.field("high_digit_sams"), high_digit_sams=self.field("high_digit_sams"),
superhornet=self.field("superhornet"),
) )
mod_settings.save_player_settings() mod_settings.save_player_settings()
@@ -826,6 +827,10 @@ class GeneratorOptions(QtWidgets.QWizardPage):
high_digit_sams.setChecked(mod_settings.high_digit_sams) high_digit_sams.setChecked(mod_settings.high_digit_sams)
self.registerField("high_digit_sams", high_digit_sams) self.registerField("high_digit_sams", high_digit_sams)
superhornet = QtWidgets.QCheckBox()
superhornet.setChecked(mod_settings.superhornet)
self.registerField("superhornet", superhornet)
modHelpText = QtWidgets.QLabel( modHelpText = QtWidgets.QLabel(
"<p>Select the mods you have installed. If your chosen factions support them, you'll be able to use these mods in your campaign.</p>" "<p>Select the mods you have installed. If your chosen factions support them, you'll be able to use these mods in your campaign.</p>"
) )
@@ -877,6 +882,11 @@ class GeneratorOptions(QtWidgets.QWizardPage):
modLayout.addWidget(QtWidgets.QLabel("High Digit SAMs"), modLayout_row, 0) modLayout.addWidget(QtWidgets.QLabel("High Digit SAMs"), modLayout_row, 0)
modLayout.addWidget(high_digit_sams, modLayout_row, 1) modLayout.addWidget(high_digit_sams, modLayout_row, 1)
modSettingsGroup.setLayout(modLayout) modSettingsGroup.setLayout(modLayout)
modLayout_row += 1
modLayout.addWidget(QtWidgets.QLabel("Super Hornet"), modLayout_row, 0)
modLayout.addWidget(superhornet, modLayout_row, 1)
modSettingsGroup.setLayout(modLayout)
modLayout_row += 1
mlayout = QVBoxLayout() mlayout = QVBoxLayout()
mlayout.addWidget(generatorSettingsGroup) mlayout.addWidget(generatorSettingsGroup)

View File

@@ -20,7 +20,7 @@ httptools==0.6.1
identify==2.5.32 identify==2.5.32
idna==3.6 idna==3.6
iniconfig==2.0.0 iniconfig==2.0.0
Jinja2==3.1.2 Jinja2==3.1.3
MarkupSafe==2.1.3 MarkupSafe==2.1.3
mypy==1.7.1 mypy==1.7.1
mypy-extensions==1.0.0 mypy-extensions==1.0.0
@@ -29,14 +29,14 @@ numpy==1.26.2
packaging==23.2 packaging==23.2
pathspec==0.11.2 pathspec==0.11.2
pefile==2023.2.7 pefile==2023.2.7
Pillow==10.0.1 Pillow==10.2.0
platformdirs==4.0.0 platformdirs==4.0.0
pluggy==1.3.0 pluggy==1.3.0
pre-commit==3.5.0 pre-commit==3.5.0
pydantic==2.5.2 pydantic==2.5.2
pydantic-settings==2.1.0 pydantic-settings==2.1.0
pydantic_core==2.14.5 pydantic_core==2.14.5
pydcs @ git+https://github.com/pydcs/dcs@1092fc419d3f879e8e7951b25e15d8b7c9938627 pydcs @ git+https://github.com/pydcs/dcs@7eeec23ea428846ebbbd0ea4c746f8eafea04e0d
pyinstaller==5.13.1 pyinstaller==5.13.1
pyinstaller-hooks-contrib==2023.6 pyinstaller-hooks-contrib==2023.6
pyproj==3.6.1 pyproj==3.6.1

View File

@@ -1,155 +1,155 @@
--- ---
name: Sinai - Exercise Bright Star name: Sinai - Exercise Bright Star
theater: Sinai theater: Sinai
authors: Starfire authors: Starfire
recommended_player_faction: Bluefor Modern recommended_player_faction: Bluefor Modern
recommended_enemy_faction: Egypt 2000s recommended_enemy_faction: Egypt 2000s
description: description:
<p>For over 4 decades, the United States and Egypt have run a series of <p>For over 4 decades, the United States and Egypt have run a series of
biannual joint military exercises called Bright Star. Over the years, the biannual joint military exercises called Bright Star. Over the years, the
number of participating countries has grown substantially. Exercise Bright number of participating countries has grown substantially. Exercise Bright
Star 2025 boasts 8 participant nations and 14 observer nations. The United Star 2025 boasts 8 participant nations and 14 observer nations. The United
States and a portion of the exercise coalition will play the part of a States and a portion of the exercise coalition will play the part of a
fictional hostile nation dubbed Orangeland, staging a mock invasion against fictional hostile nation dubbed Orangeland, staging a mock invasion against
Cairo. Israel, having for the first time accepted the invitation to observe, Cairo. Israel, having for the first time accepted the invitation to observe,
is hosting the aggressor faction of the exercise coalition at its is hosting the aggressor faction of the exercise coalition at its
airfields.</p> airfields.</p>
miz: exercise_bright_star.miz miz: exercise_bright_star.miz
performance: 1 performance: 1
recommended_start_date: 2025-09-01 recommended_start_date: 2025-09-01
version: "11.0" version: "11.0"
squadrons: squadrons:
Blue CV-1: Blue CV-1:
- primary: SEAD - primary: SEAD
secondary: any secondary: any
aircraft: aircraft:
- F/A-18C Hornet (Lot 20) - F/A-18C Hornet (Lot 20)
size: 24 size: 24
- primary: AEW&C - primary: AEW&C
aircraft: aircraft:
- E-2D Advanced Hawkeye - E-2D Advanced Hawkeye
size: 2 size: 2
- primary: Refueling - primary: Refueling
aircraft: aircraft:
- S-3B Tanker - S-3B Tanker
size: 4 size: 4
Bombers from RAF Fairford: Bombers from RAF Fairford:
- primary: Anti-ship - primary: Anti-ship
secondary: air-to-ground secondary: air-to-ground
aircraft: aircraft:
- B-52H Stratofortress - B-52H Stratofortress
size: 8 size: 8
- primary: Strike - primary: Strike
secondary: air-to-ground secondary: air-to-ground
aircraft: aircraft:
- B-1B Lancer - B-1B Lancer
size: 8 size: 8
# Hatzerim (141) # Hatzerim (141)
7: 7:
- primary: Escort - primary: CAS
secondary: any secondary: air-to-ground
aircraft: aircraft:
- F-15C Eagle - A-10C Thunderbolt II (Suite 7)
size: 20 size: 6
- primary: OCA/Runway - primary: Escort
secondary: any secondary: any
aircraft: aircraft:
- F-15E Strike Eagle (Suite 4+) - F-15C Eagle
size: 16 size: 20
- primary: DEAD - primary: OCA/Runway
secondary: any secondary: any
aircraft: aircraft:
- F-16CM Fighting Falcon (Block 50) - F-15E Strike Eagle (Suite 4+)
size: 20 size: 16
- primary: BAI - primary: DEAD
secondary: any secondary: any
aircraft: aircraft:
- JF-17 Thunder - F-16CM Fighting Falcon (Block 50)
size: 16 size: 20
- primary: BARCAP - primary: BAI
secondary: any secondary: any
aircraft: aircraft:
- Mirage 2000C - JF-17 Thunder
size: 12 size: 16
# Kedem - primary: BARCAP
12: secondary: any
- primary: Transport aircraft:
secondary: any - Mirage 2000C
aircraft: size: 12
- CH-47D # Kedem
size: 20 12:
- primary: Air Assault - primary: Transport
secondary: any secondary: any
aircraft: aircraft:
- UH-60L - CH-47D
- UH-60A size: 20
size: 4 - primary: Air Assault
# Nevatim (106) secondary: any
8: aircraft:
- primary: AEW&C - UH-60L
aircraft: - UH-60A
- E-3A size: 4
size: 2 # Nevatim (106)
- primary: Refueling # 8:
aircraft: # - primary: AEW&C
- KC-135 Stratotanker # aircraft:
size: 2 # - E-3A
- primary: CAS # size: 2
secondary: air-to-ground # - primary: Refueling
aircraft: # aircraft:
- A-10C Thunderbolt II (Suite 7) # - KC-135 Stratotanker
size: 8 # size: 2
# Melez (30) # Melez (30)
5: 5:
- primary: CAS - primary: CAS
secondary: air-to-ground secondary: air-to-ground
aircraft: aircraft:
- Ka-50 Hokum (Blackshark 3) - Ka-50 Hokum (Blackshark 3)
size: 4 size: 4
- primary: BAI - primary: BAI
secondary: any secondary: any
aircraft: aircraft:
- Mirage 2000C - Mirage 2000C
size: 12 size: 12
- primary: Escort - primary: Escort
secondary: any secondary: any
aircraft: aircraft:
- MiG-21bis Fishbed-N - MiG-21bis Fishbed-N
size: 12 size: 12
# Wadi al Jandali (72) # Wadi al Jandali (72)
13: 13:
- primary: AEW&C - primary: AEW&C
aircraft: aircraft:
- E-2C Hawkeye - E-2C Hawkeye
size: 2 size: 2
- primary: SEAD - primary: SEAD
secondary: any secondary: any
aircraft: aircraft:
- F-4E Phantom II - F-4E Phantom II
size: 20 size: 20
- primary: DEAD - primary: DEAD
secondary: any secondary: any
aircraft: aircraft:
- F-16CM Fighting Falcon (Block 50) - F-16CM Fighting Falcon (Block 50)
size: 20 size: 20
- primary: Air Assault - primary: Air Assault
secondary: any secondary: any
aircraft: aircraft:
- Mi-24P Hind-F - Mi-24P Hind-F
size: 4 size: 4
- primary: OCA/Aircraft - primary: OCA/Aircraft
secondary: any secondary: any
aircraft: aircraft:
- SA 342L Gazelle - SA 342L Gazelle
size: 4 size: 4
# Cairo West (95) # Cairo West (95)
18: 18:
- primary: Transport - primary: Transport
aircraft: aircraft:
- C-130 - C-130
size: 8 size: 8
- primary: BARCAP - primary: BARCAP
secondary: air-to-air secondary: air-to-air
aircraft: aircraft:
- MiG-29S Fulcrum-C - MiG-29S Fulcrum-C
size: 20 size: 20

View File

@@ -1,155 +1,169 @@
--- ---
name: Caucasus - Operation Vectron's Claw name: Caucasus - Operation Vectron's Claw
theater: Caucasus theater: Caucasus
authors: Starfire authors: Starfire
recommended_player_faction: USA 2005 recommended_player_faction: USA 2005
recommended_enemy_faction: Russia 2010 recommended_enemy_faction: Russia 2010
description: description:
<p>United Nations Observer Mission in Georgia (UNOMIG) observers stationed in <p>United Nations Observer Mission in Georgia (UNOMIG) observers stationed in
Georgia to monitor the ceasefire between Georgia and Abkhazia have been cut Georgia to monitor the ceasefire between Georgia and Abkhazia have been cut
off from friendly forces by Russian troops backing the separatist state. The off from friendly forces by Russian troops backing the separatist state. The
UNOMIG HQ at Sukhumi has been taken, and a small contingent of observers and UNOMIG HQ at Sukhumi has been taken, and a small contingent of observers and
troops at the Zugdidi Sector HQ will have to make a run for the coast, troops at the Zugdidi Sector HQ will have to make a run for the coast,
supported by offshore US naval aircraft. The contingent is aware that their supported by offshore US naval aircraft. The contingent is aware that their
best shot at survival is to swiftly retake Sukhumi before Russian forces have best shot at survival is to swiftly retake Sukhumi before Russian forces have
a chance to dig in, so that friendly ground forces can land and reinforce a chance to dig in, so that friendly ground forces can land and reinforce
them.</p><p><strong>Note:</strong> Ground unit purchase will not be available them.</p><p><strong>Note:</strong> Ground unit purchase will not be available
past Turn 0 until Sukhumi is retaken, so it is imperative you reach Sukhumi past Turn 0 until Sukhumi is retaken, so it is imperative you reach Sukhumi
with at least one surviving ground unit to capture it. Two Hueys are available with at least one surviving ground unit to capture it. Two Hueys are available
at Zugdidi for some close air support. The player can either play the first at Zugdidi for some close air support. The player can either play the first
leg of the scenario as an evacuation with a couple of light vehicles (e.g. leg of the scenario as an evacuation with a couple of light vehicles (e.g.
Humvees) set on breakthrough (modifying waypoints in the mission editor so Humvees) set on breakthrough (modifying waypoints in the mission editor so
they are not charging head-on into enemy ground forces is suggested), or they are not charging head-on into enemy ground forces is suggested), or
purchase heavier ground units if they wish to experience a more traditional purchase heavier ground units if they wish to experience a more traditional
frontline ground war. Once Sukhumi has been captured, squadrons based in frontline ground war. Once Sukhumi has been captured, squadrons based in
Incirlik Turkey can be ferried in via the "From Incirlik" off-map spawn Incirlik Turkey can be ferried in via the "From Incirlik" off-map spawn
point.</p> point.</p>
miz: operation_vectrons_claw.miz miz: operation_vectrons_claw.miz
performance: 1 performance: 1
recommended_start_date: 2008-08-08 recommended_start_date: 2008-08-08
version: "11.0" version: "11.0"
control_points: control_points:
From Incirlik: Squadrons from Incirlik:
ferry_only: true ferry_only: true
squadrons: squadrons:
Blue CV-1: Blue CV-1:
- primary: BARCAP - primary: BARCAP
secondary: any secondary: any
aircraft: aircraft:
- F-14B Tomcat - F-14B Tomcat
size: 16 size: 16
- primary: SEAD - primary: SEAD
secondary: any secondary: any
aircraft: aircraft:
- F/A-18C Hornet (Lot 20) - F/A-18C Hornet (Lot 20)
size: 60 size: 60
- primary: CAS - primary: CAS
secondary: air-to-ground secondary: air-to-ground
aircraft: aircraft:
- S-3B Viking - S-3B Viking
size: 8 size: 8
- primary: AEW&C - primary: AEW&C
aircraft: aircraft:
- E-2C Hawkeye - E-2C Hawkeye
size: 2 size: 2
- primary: Refueling - primary: Refueling
aircraft: aircraft:
- S-3B Tanker - S-3B Tanker
size: 2 size: 2
- primary: Air Assault - primary: Air Assault
secondary: any secondary: any
aircraft: aircraft:
- UH-60L - UH-60L
- UH-60A - UH-60A
size: 2 size: 2
Blue LHA: Blue LHA:
- primary: BAI - primary: BAI
secondary: air-to-ground secondary: air-to-ground
aircraft: aircraft:
- AV-8B Harrier II Night Attack - AV-8B Harrier II Night Attack
size: 20 size: 20
From Incirlik: Squadrons from Incirlik:
- primary: CAS - primary: CAS
secondary: air-to-ground secondary: air-to-ground
aircraft: aircraft:
- AH-64D Apache Longbow - AH-64D Apache Longbow
size: 8 size: 4
- primary: CAS - primary: CAS
secondary: air-to-ground secondary: air-to-ground
aircraft: aircraft:
- A-10C Thunderbolt II (Suite 7) - A-10C Thunderbolt II (Suite 7)
size: 8 size: 6
- primary: DEAD - primary: DEAD
secondary: any secondary: any
aircraft: aircraft:
- F-16CM Fighting Falcon (Block 50) - F-16CM Fighting Falcon (Block 50)
size: 16 size: 16
- primary: BAI - primary: BAI
secondary: any secondary: any
aircraft: aircraft:
- F-15E Strike Eagle (Suite 4+) - F-15E Strike Eagle (Suite 4+)
size: 8 size: 8
- primary: Refueling - primary: Refueling
aircraft: aircraft:
- KC-135 Stratotanker - KC-135 Stratotanker
size: 1 size: 1
#FARPs Bombers from RAF Fairford:
UNOMIG Sector HQ: - primary: Anti-ship
- primary: Transport secondary: air-to-ground
secondary: any aircraft:
aircraft: - B-52H Stratofortress
- UH-1H Iroquois size: 4
size: 2 Bombers from Base Aérea de Morón:
Dzhugba: - primary: OCA/Runway
- primary: CAS secondary: air-to-ground
secondary: any aircraft:
aircraft: - B-1B Lancer
- Mi-24P Hind-F size: 4
size: 8 #FARPs
#Sukhumi-Babushara UNOMIG Sector HQ:
20: - primary: Transport
- primary: TARCAP secondary: any
secondary: air-to-air aircraft:
aircraft: - UH-1H Iroquois
- MiG-29S Fulcrum-C size: 2
size: 8 Dzhugba:
- primary: BAI - primary: CAS
secondary: air-to-ground secondary: any
aircraft: aircraft:
- Su-25T Frogfoot - Mi-24P Hind-F
size: 12 size: 4
#Sochi-Adler #Sukhumi-Babushara
18: 20:
- primary: Escort - primary: TARCAP
secondary: air-to-air secondary: air-to-air
aircraft: aircraft:
- Su-27 Flanker-B - MiG-29S Fulcrum-C
size: 8 size: 8
- primary: SEAD - primary: BAI
secondary: air-to-ground secondary: air-to-ground
aircraft: aircraft:
- Su-24M Fencer-D - Su-25T Frogfoot
size: 20 size: 12
- primary: DEAD #Sochi-Adler
secondary: air-to-ground 18:
aircraft: - primary: Escort
- Su-34 Fullback secondary: air-to-air
size: 20 aircraft:
#Anapa-Vityazevo - Su-27 Flanker-B
12: size: 8
- primary: Strike - primary: SEAD
secondary: air-to-ground secondary: air-to-ground
aircraft: aircraft:
- Tu-95MS Bear-H - Su-24M Fencer-D
size: 16 size: 20
Red CV: - primary: DEAD
- primary: BARCAP secondary: air-to-ground
secondary: any aircraft:
aircraft: - Su-34 Fullback
- SU-33 Flanker-D size: 20
size: 18 #Maykop-Khanskaya
#I am aware there is no Russian LHA. This is just for campaign inversion. 16:
Red LHA: - primary: Anti-ship
- primary: BAI secondary: air-to-ground
secondary: air-to-ground aircraft:
size: 20 - Tu-22M3 Backfire-C
size: 20
#Anapa-Vityazevo
12:
- primary: Strike
secondary: air-to-ground
aircraft:
- Tu-95MS Bear-H
size: 16
Red CV:
- primary: BARCAP
secondary: any
aircraft:
- SU-33 Flanker-D
size: 16

View File

@@ -49,7 +49,7 @@ squadrons:
- primary: BAI - primary: BAI
secondary: air-to-ground secondary: air-to-ground
aircraft: aircraft:
- 81st FS - A-10C Thunderbolt II (Suite 7)
size: 10 size: 10
#USAF A-10CI #USAF A-10CI
#BLUFOR CVN #BLUFOR CVN

Binary file not shown.

View File

@@ -0,0 +1,387 @@
---
name: Persian Gulf - Scenic Route Merged
theater: Persian Gulf
authors: Fuzzle, merged by tmz42
description: <p>A merge of the two Scenic Route campaigns. <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 carrier group, aided by USAF units stationed on the south bank must pacify Iran's coastal defences and push inland. Iran has assembled the full might of its air and ground divisions to defend their heartland.</p>
version: "11.0"
advanced_iads: true
recommended_player_faction: USA 2005
recommended_enemy_faction: Iran 2015
miz: scenic_merge.miz
performance: 3
recommended_start_date: 2005-06-29
recommended_player_money: 2000
recommended_enemy_money: 1000
recommended_player_income_multiplier: 1.5
recommended_enemy_income_multiplier: 0.7
squadrons:
#BLUFOR CVN
Naval-3:
# Pukin' Dogs F-14
- primary: BARCAP
secondary: air-to-air
aircraft:
- VF-143
size: 14
# Golden Dragons F/A-18
- primary: SEAD
secondary: any
aircraft:
- VFA-192
size: 12
# Thunderbolts F/A-18C
- primary: DEAD
secondary: any
aircraft:
- VMFA-251
size: 12
# Hawkeye
- primary: AEW&C
aircraft:
- VAW-125
size: 2
# S-3 Tankers
- primary: Refueling
aircraft:
- VS-35 (Tanker)
size: 4
# BLUFOR LHA
Naval-4:
- primary: BAI
secondary: air-to-ground
aircraft:
- VMA-223
size: 12
- primary: Transport
secondary: air-to-ground
aircraft:
- HMLA-169 (UH-1H)
size: 8
# Al-Dhafra AFB
4:
#USAF F-16C Gamblers
- primary: SEAD
secondary: any
aircraft:
- 77th FS
size: 12
- primary: Strike
secondary: air-to-ground
aircraft:
- B-1B Lancer
size: 6
- primary: Refueling
size: 2
aircraft:
- 18th Air Refueling Squadron
- primary: Transport
secondary: air-to-ground
aircraft:
- HMLA-169 (UH-1H)
size: 4
- primary: AEW&C
aircraft:
- E-3
size: 2
- primary: BARCAP
secondary: any
aircraft:
- 493rd FS
#USAF F-15C
# Al-Minhab AFB
12:
- primary: Transport
secondary: air-to-ground
aircraft:
- 101st Combat Aviation Brigade
#US Army UH-60
size: 6
- primary: SEAD
secondary: any
aircraft:
- 480th FS
#USAF F-16C
- primary: Strike
secondary: air-to-ground
aircraft:
- F-15E Strike Eagle (Suite 4+)
# Strike Eagle (Chiefs?)
- primary: BAI
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
#USAF A-10CII
- primary: Transport
aircraft:
- C-130
size: 8
# Kish Intl
24:
- primary: AEW&C
aircraft:
- A-50
size: 1
- primary: BARCAP
secondary: any
aircraft:
- F-14A Tomcat (Block 135-GR Late)
size: 12
- primary: Strike
secondary: air-to-ground
aircraft:
- Su-24MK Fencer-D
size: 12
# Havadarya
9:
- primary: BARCAP
secondary: any
aircraft:
- F-4E Phantom II
size: 6
- primary: CAS
secondary: air-to-ground
aircraft:
- Su-25 Frogfoot
size: 6
# Bandar Abbas Intl
2:
- primary: TARCAP
secondary: any
aircraft:
- F-5E Tiger II
size: 6
- primary: BARCAP
secondary: air-to-ground
aircraft:
- MiG-29A Fulcrum-A
size: 6
- primary: Strike
secondary: air-to-ground
aircraft:
- Su-24MK
size: 6
# OPFOR First FOB
FOB Seerik:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24V Hind-E
size: 2
# OPFOR Second FOB
FOB Kohnehshahr:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24V Hind-F
size: 2
# OPFOR Third FOB
FOB Khvosh:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-28N Havoc
size: 2
# OPFOR Last FOB
FOB Charak:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-28N Havoc
size: 2
# BLUFOR Start FOB
FOB Anguran:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24V Hind-F
size: 2
# OPFOR L1F1
FOB Tang-e Dalan:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 2
# OPFOR L1F2
FOB Fars Border:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 2
# OPFOR L1F2 split
FOB Bikuyeh:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-28N Havoc
size: 2
# Lar
11:
- primary: BARCAP
secondary: air-to-air
aircraft:
- MiG-21bis Fishbed-N
size: 4
# OPFOR L2F1
FOB Mansurabad:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 2
# OPFOR L2F2
FOB Jahrom:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 2
# OPFOR L2F3
FOB Tower:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 2
# OPFOR L2F3 split
FOB Nouderan:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-28N Havoc
size: 2
# Shiraz Intl
19:
- primary: AEW&C
aircraft:
- A-50
size: 2
- primary: Refueling
aircraft:
- IL-78M
size: 2
- primary: TARCAP
secondary: air-to-air
aircraft:
- MiG-29A Fulcrum-A
size: 12
- primary: Strike
secondary: air-to-ground
aircraft:
- Su-22M4 Fitter-K
size: 6
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 4
- primary: SEAD
secondary: air-to-ground
aircraft:
- Su-25T Frogfoot
size: 6
# OPFOR L3F1
FOB Kherameh:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 2
# OPFOR L3F2
FOB Tashk:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 2
# OPFOR L3F3
FOB Chahak:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 2
# OPFOR L3F4
FOB Plainhold:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 2
# OPFOR L3F4 split
FOB Robat:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 2
# OPFOR L3F5
FOB Plainguard:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 2
# OPFOR L3F6
FOB Hasanabad:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 2
# OPFOR L3F6 split
FOB Najafabad:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-28N Havoc
size: 2
# OPFOR L3F7
FOB Kabutarkhan:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 2
# OPFOR L3F8
FOB Sa'di:
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 2
# Kerman
18:
- primary: AEW&C
aircraft:
- A-50
size: 2
- primary: Refueling
aircraft:
- IL-78M
size: 2
- primary: Transport
aircraft:
- IL-78MD
size: 2
- primary: BARCAP
secondary: any
aircraft:
- F-14A Tomcat (Block 135-GR Late)
size: 12
- primary: TARCAP
secondary: air-to-air
aircraft:
- MiG-29A Fulcrum-A
size: 12
- primary: Strike
secondary: air-to-ground
aircraft:
- Su-24MK Fencer-D
size: 6
- primary: CAS
secondary: air-to-ground
aircraft:
- Mi-24P Hind-F
size: 2

View File

@@ -13,9 +13,6 @@ recommended_player_money: 900
recommended_enemy_money: 1200 recommended_enemy_money: 1200
recommended_player_income_multiplier: 1.0 recommended_player_income_multiplier: 1.0
recommended_enemy_income_multiplier: 0.6 recommended_enemy_income_multiplier: 0.6
control_points:
From Turkey:
ferry_only: true
squadrons: squadrons:
#BLUFOR CVN #BLUFOR CVN
Naval-1: Naval-1:
@@ -62,8 +59,8 @@ squadrons:
aircraft: aircraft:
- HMLA-169 (AH-1W) - HMLA-169 (AH-1W)
size: 6 size: 6
# Off-theatre forces # Incirlik
From Turkey: 16:
- primary: Strike - primary: Strike
secondary: air-to-ground secondary: air-to-ground
aircraft: aircraft:
@@ -73,8 +70,25 @@ squadrons:
- 960th AAC Squadron - 960th AAC Squadron
#USAF E-3A #USAF E-3A
size: 2 size: 2
- primary: Strike
secondary: air-to-ground
aircraft:
- F-15E Strike Eagle (Suite 4+)
size: 12
- primary: SEAD
secondary: any
aircraft:
- 77th FS
#USAF F-16C
size: 12
# King Hussein Air College, BLUFOR start # King Hussein Air College, BLUFOR start
19: 19:
- primary: BAI
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
#USAF A-10CII
size: 8
- primary: BARCAP - primary: BARCAP
secondary: air-to-air secondary: air-to-air
aircraft: aircraft:
@@ -85,11 +99,6 @@ squadrons:
aircraft: aircraft:
- 23rd FS - 23rd FS
#USAF F-16C #USAF F-16C
- primary: BAI
secondary: air-to-ground
aircraft:
- 81st FS
#USAF A-10CII
- primary: Transport - primary: Transport
secondary: air-to-ground secondary: air-to-ground
aircraft: aircraft:

View File

@@ -2,30 +2,6 @@ local unitPayloads = {
["name"] = "AH-64D_BLK_II", ["name"] = "AH-64D_BLK_II",
["payloads"] = { ["payloads"] = {
[1] = { [1] = {
["name"] = "Liberation CAS",
["pylons"] = {
[1] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 3,
},
[2] = {
["CLSID"] = "{M299_4xAGM_114L}",
["num"] = 4,
},
[3] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 2,
},
[4] = {
["CLSID"] = "{M299_4xAGM_114L}",
["num"] = 1,
},
},
["tasks"] = {
[1] = 31,
},
},
[2] = {
["displayName"] = "Liberation BAI", ["displayName"] = "Liberation BAI",
["name"] = "Liberation BAI", ["name"] = "Liberation BAI",
["pylons"] = { ["pylons"] = {
@@ -45,12 +21,72 @@ local unitPayloads = {
["CLSID"] = "{M299_4xAGM_114L}", ["CLSID"] = "{M299_4xAGM_114L}",
["num"] = 1, ["num"] = 1,
}, },
[5] = {
["CLSID"] = "{AN_APG_78}",
["num"] = 6,
},
},
["tasks"] = {
[1] = 31,
},
},
[2] = {
["name"] = "Liberation OCA/Aircraft",
["pylons"] = {
[1] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 3,
},
[2] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 2,
},
[3] = {
["CLSID"] = "{M261_M229}",
["num"] = 4,
},
[4] = {
["CLSID"] = "{M261_M229}",
["num"] = 1,
},
[5] = {
["CLSID"] = "{AN_APG_78}",
["num"] = 6,
},
}, },
["tasks"] = { ["tasks"] = {
[1] = 31, [1] = 31,
}, },
}, },
[3] = { [3] = {
["name"] = "Liberation CAS",
["pylons"] = {
[1] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 3,
},
[2] = {
["CLSID"] = "{M299_4xAGM_114L}",
["num"] = 4,
},
[3] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 2,
},
[4] = {
["CLSID"] = "{M299_4xAGM_114L}",
["num"] = 1,
},
[5] = {
["CLSID"] = "{AN_APG_78}",
["num"] = 6,
},
},
["tasks"] = {
[1] = 31,
},
},
[4] = {
["displayName"] = "Liberation DEAD", ["displayName"] = "Liberation DEAD",
["name"] = "Liberation DEAD", ["name"] = "Liberation DEAD",
["pylons"] = { ["pylons"] = {
@@ -70,30 +106,39 @@ local unitPayloads = {
["CLSID"] = "{M299_4xAGM_114L}", ["CLSID"] = "{M299_4xAGM_114L}",
["num"] = 1, ["num"] = 1,
}, },
[5] = {
["CLSID"] = "{AN_APG_78}",
["num"] = 6,
},
}, },
["tasks"] = { ["tasks"] = {
[1] = 31, [1] = 31,
}, },
}, },
[4] = { [5] = {
["name"] = "Liberation OCA/Aircraft", ["displayName"] = "Liberation Escort",
["name"] = "Liberation Escort",
["pylons"] = { ["pylons"] = {
[1] = { [1] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}", ["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 3, ["num"] = 3,
}, },
[2] = { [2] = {
["CLSID"] = "{M299_4xAGM_114L}",
["num"] = 4,
},
[3] = {
["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}", ["CLSID"] = "{88D18A5E-99C8-4B04-B40B-1C02F2018B6E}",
["num"] = 2, ["num"] = 2,
}, },
[3] = {
["CLSID"] = "{M261_M229}",
["num"] = 4,
},
[4] = { [4] = {
["CLSID"] = "{M261_M229}", ["CLSID"] = "{M299_4xAGM_114L}",
["num"] = 1, ["num"] = 1,
}, },
[5] = {
["CLSID"] = "{AN_APG_78}",
["num"] = 6,
},
}, },
["tasks"] = { ["tasks"] = {
[1] = 31, [1] = 31,

View File

@@ -10,11 +10,11 @@ local unitPayloads = {
}, },
[2] = { [2] = {
["CLSID"] = "{IR_Deflector}", ["CLSID"] = "{IR_Deflector}",
["num"] = 6, ["num"] = 4,
}, },
[3] = { [3] = {
["CLSID"] = "{FAS}", ["CLSID"] = "{FAS}",
["num"] = 5, ["num"] = 3,
}, },
}, },
["tasks"] = { ["tasks"] = {
@@ -30,11 +30,11 @@ local unitPayloads = {
}, },
[2] = { [2] = {
["CLSID"] = "{IR_Deflector}", ["CLSID"] = "{IR_Deflector}",
["num"] = 6, ["num"] = 4,
}, },
[3] = { [3] = {
["CLSID"] = "{FAS}", ["CLSID"] = "{FAS}",
["num"] = 5, ["num"] = 3,
}, },
}, },
["tasks"] = { ["tasks"] = {
@@ -50,11 +50,11 @@ local unitPayloads = {
}, },
[2] = { [2] = {
["CLSID"] = "{IR_Deflector}", ["CLSID"] = "{IR_Deflector}",
["num"] = 6, ["num"] = 4,
}, },
[3] = { [3] = {
["CLSID"] = "{FAS}", ["CLSID"] = "{FAS}",
["num"] = 5, ["num"] = 3,
}, },
}, },
["tasks"] = { ["tasks"] = {
@@ -70,11 +70,11 @@ local unitPayloads = {
}, },
[2] = { [2] = {
["CLSID"] = "{IR_Deflector}", ["CLSID"] = "{IR_Deflector}",
["num"] = 6, ["num"] = 4,
}, },
[3] = { [3] = {
["CLSID"] = "{FAS}", ["CLSID"] = "{FAS}",
["num"] = 5, ["num"] = 3,
}, },
}, },
["tasks"] = { ["tasks"] = {
@@ -90,11 +90,11 @@ local unitPayloads = {
}, },
[2] = { [2] = {
["CLSID"] = "{IR_Deflector}", ["CLSID"] = "{IR_Deflector}",
["num"] = 6, ["num"] = 4,
}, },
[3] = { [3] = {
["CLSID"] = "{FAS}", ["CLSID"] = "{FAS}",
["num"] = 5, ["num"] = 3,
}, },
}, },
["tasks"] = { ["tasks"] = {

View File

@@ -5,28 +5,20 @@ local unitPayloads = {
["name"] = "CAS", ["name"] = "CAS",
["pylons"] = { ["pylons"] = {
[1] = { [1] = {
["CLSID"] = "{HOT3D}", ["CLSID"] = "{HOT3_R2_M}",
["num"] = 1, ["num"] = 1,
}, },
[2] = { [2] = {
["CLSID"] = "{HOT3G}", ["CLSID"] = "{HOT3_L2_M}",
["num"] = 2, ["num"] = 2,
}, },
[3] = { [3] = {
["CLSID"] = "{HOT3D}", ["CLSID"] = "{FAS}",
["num"] = 3, ["num"] = 3,
}, },
[4] = { [4] = {
["CLSID"] = "{HOT3G}",
["num"] = 4,
},
[5] = {
["CLSID"] = "{FAS}",
["num"] = 5,
},
[6] = {
["CLSID"] = "{IR_Deflector}", ["CLSID"] = "{IR_Deflector}",
["num"] = 6, ["num"] = 4,
}, },
}, },
["tasks"] = { ["tasks"] = {
@@ -37,28 +29,20 @@ local unitPayloads = {
["name"] = "CAP", ["name"] = "CAP",
["pylons"] = { ["pylons"] = {
[1] = { [1] = {
["CLSID"] = "{HOT3D}", ["CLSID"] = "{HOT3_R2_M}",
["num"] = 1, ["num"] = 1,
}, },
[2] = { [2] = {
["CLSID"] = "{HOT3G}", ["CLSID"] = "{HOT3_L2_M}",
["num"] = 2, ["num"] = 2,
}, },
[3] = { [3] = {
["CLSID"] = "{HOT3D}", ["CLSID"] = "{FAS}",
["num"] = 3, ["num"] = 3,
}, },
[4] = { [4] = {
["CLSID"] = "{HOT3G}",
["num"] = 4,
},
[5] = {
["CLSID"] = "{FAS}",
["num"] = 5,
},
[6] = {
["CLSID"] = "{IR_Deflector}", ["CLSID"] = "{IR_Deflector}",
["num"] = 6, ["num"] = 4,
}, },
}, },
["tasks"] = { ["tasks"] = {
@@ -69,28 +53,20 @@ local unitPayloads = {
["name"] = "STRIKE", ["name"] = "STRIKE",
["pylons"] = { ["pylons"] = {
[1] = { [1] = {
["CLSID"] = "{HOT3D}", ["CLSID"] = "{HOT3_R2_M}",
["num"] = 1, ["num"] = 1,
}, },
[2] = { [2] = {
["CLSID"] = "{HOT3G}", ["CLSID"] = "{HOT3_L2_M}",
["num"] = 2, ["num"] = 2,
}, },
[3] = { [3] = {
["CLSID"] = "{HOT3D}", ["CLSID"] = "{FAS}",
["num"] = 3, ["num"] = 3,
}, },
[4] = { [4] = {
["CLSID"] = "{HOT3G}",
["num"] = 4,
},
[5] = {
["CLSID"] = "{FAS}",
["num"] = 5,
},
[6] = {
["CLSID"] = "{IR_Deflector}", ["CLSID"] = "{IR_Deflector}",
["num"] = 6, ["num"] = 4,
}, },
}, },
["tasks"] = { ["tasks"] = {
@@ -101,28 +77,20 @@ local unitPayloads = {
["name"] = "SEAD", ["name"] = "SEAD",
["pylons"] = { ["pylons"] = {
[1] = { [1] = {
["CLSID"] = "{HOT3D}", ["CLSID"] = "{HOT3_R2_M}",
["num"] = 1, ["num"] = 1,
}, },
[2] = { [2] = {
["CLSID"] = "{HOT3G}", ["CLSID"] = "{HOT3_L2_M}",
["num"] = 2, ["num"] = 2,
}, },
[3] = { [3] = {
["CLSID"] = "{HOT3D}", ["CLSID"] = "{FAS}",
["num"] = 3, ["num"] = 3,
}, },
[4] = { [4] = {
["CLSID"] = "{HOT3G}",
["num"] = 4,
},
[5] = {
["CLSID"] = "{FAS}",
["num"] = 5,
},
[6] = {
["CLSID"] = "{IR_Deflector}", ["CLSID"] = "{IR_Deflector}",
["num"] = 6, ["num"] = 4,
}, },
}, },
["tasks"] = { ["tasks"] = {
@@ -133,28 +101,20 @@ local unitPayloads = {
["name"] = "ANTISHIP", ["name"] = "ANTISHIP",
["pylons"] = { ["pylons"] = {
[1] = { [1] = {
["CLSID"] = "{HOT3D}", ["CLSID"] = "{HOT3_R2_M}",
["num"] = 1, ["num"] = 1,
}, },
[2] = { [2] = {
["CLSID"] = "{HOT3G}", ["CLSID"] = "{HOT3_L2_M}",
["num"] = 2, ["num"] = 2,
}, },
[3] = { [3] = {
["CLSID"] = "{HOT3D}", ["CLSID"] = "{FAS}",
["num"] = 3, ["num"] = 3,
}, },
[4] = { [4] = {
["CLSID"] = "{HOT3G}",
["num"] = 4,
},
[5] = {
["CLSID"] = "{FAS}",
["num"] = 5,
},
[6] = {
["CLSID"] = "{IR_Deflector}", ["CLSID"] = "{IR_Deflector}",
["num"] = 6, ["num"] = 4,
}, },
}, },
["tasks"] = { ["tasks"] = {

View File

@@ -6,7 +6,7 @@ local unitPayloads = {
["pylons"] = { ["pylons"] = {
[1] = { [1] = {
["CLSID"] = "{IR_Deflector}", ["CLSID"] = "{IR_Deflector}",
["num"] = 6, ["num"] = 4,
}, },
}, },
["tasks"] = { ["tasks"] = {
@@ -19,7 +19,7 @@ local unitPayloads = {
["pylons"] = { ["pylons"] = {
[1] = { [1] = {
["CLSID"] = "{IR_Deflector}", ["CLSID"] = "{IR_Deflector}",
["num"] = 6, ["num"] = 4,
}, },
}, },
["tasks"] = { ["tasks"] = {

View File

@@ -1,27 +1,24 @@
name: coldwar name: coldwar
cap: true
cas: true
sead: true
strike: true
antiship: true
rendezvous_altitude_ft_msl: 22000
hold_distance_nm: 15 hold_distance_nm: 15
push_distance_nm: 10 push_distance_nm: 10
join_distance_nm: 10 join_distance_nm: 10
max_ingress_distance_nm: 30 max_ingress_distance_nm: 30
min_ingress_distance_nm: 10 min_ingress_distance_nm: 10
ingress_altitude_ft_msl: 18000 rendezvous_altitude_ft_msl: 22000
min_patrol_altitude_ft_msl: 10000 combat_altitude_ft_msl: 18000
max_patrol_altitude_ft_msl: 24000 cap:
pattern_altitude_ft_msl: 5000 duration_minutes: 30
cap_duration_minutes: 30 min_track_length_nm: 12
cap_min_track_length_nm: 12 max_track_length_nm: 24
cap_max_track_length_nm: 24 min_distance_from_cp_nm: 8
cap_min_distance_from_cp_nm: 8 max_distance_from_cp_nm: 25
cap_max_distance_from_cp_nm: 25 engagement_range_nm: 35
cap_engagement_range_nm: 35 min_patrol_altitude_ft_msl: 10000
cas_duration_minutes: 30 max_patrol_altitude_ft_msl: 24000
sweep_distance_nm: 40 cas:
duration_minutes: 30
sweep:
distance_nm: 40
ground_unit_procurement_ratios: ground_unit_procurement_ratios:
Tank: 4 Tank: 4
ATGM: 2 ATGM: 2
@@ -30,3 +27,8 @@ ground_unit_procurement_ratios:
Artillery: 1 Artillery: 1
SHORAD: 2 SHORAD: 2
Recon: 1 Recon: 1
helicopter:
combat_altitude_ft_agl: 200
rendezvous_altitude_ft_agl: 1500
air_assault_nav_altitude_ft_agl: 1500

View File

@@ -1,27 +1,24 @@
name: modern name: modern
cap: true
cas: true
sead: true
strike: true
antiship: true
rendezvous_altitude_ft_msl: 25000
hold_distance_nm: 25 hold_distance_nm: 25
push_distance_nm: 20 push_distance_nm: 20
join_distance_nm: 20 join_distance_nm: 20
max_ingress_distance_nm: 45 max_ingress_distance_nm: 45
min_ingress_distance_nm: 10 min_ingress_distance_nm: 10
ingress_altitude_ft_msl: 20000 rendezvous_altitude_ft_msl: 25000
min_patrol_altitude_ft_msl: 15000 combat_altitude_ft_msl: 20000
max_patrol_altitude_ft_msl: 33000 cap:
pattern_altitude_ft_msl: 5000 duration_minutes: 30
cap_duration_minutes: 30 min_track_length_nm: 15
cap_min_track_length_nm: 15 max_track_length_nm: 40
cap_max_track_length_nm: 40 min_distance_from_cp_nm: 10
cap_min_distance_from_cp_nm: 10 max_distance_from_cp_nm: 40
cap_max_distance_from_cp_nm: 40 engagement_range_nm: 50
cap_engagement_range_nm: 50 min_patrol_altitude_ft_msl: 15000
cas_duration_minutes: 30 max_patrol_altitude_ft_msl: 33000
sweep_distance_nm: 60 cas:
duration_minutes: 30
sweep:
distance_nm: 60
ground_unit_procurement_ratios: ground_unit_procurement_ratios:
Tank: 3 Tank: 3
ATGM: 2 ATGM: 2
@@ -30,3 +27,7 @@ ground_unit_procurement_ratios:
Artillery: 1 Artillery: 1
SHORAD: 2 SHORAD: 2
Recon: 1 Recon: 1
helicopter:
combat_altitude_ft_agl: 200
rendezvous_altitude_ft_agl: 1500
air_assault_nav_altitude_ft_agl: 1500

View File

@@ -1,27 +1,24 @@
name: ww2 name: ww2
cap: true
cas: true
sead: false
strike: true
antiship: true
hold_distance_nm: 10 hold_distance_nm: 10
push_distance_nm: 5 push_distance_nm: 5
join_distance_nm: 5 join_distance_nm: 5
rendezvous_altitude_ft_msl: 10000
max_ingress_distance_nm: 7 max_ingress_distance_nm: 7
min_ingress_distance_nm: 5 min_ingress_distance_nm: 5
ingress_altitude_ft_msl: 8000 rendezvous_altitude_ft_msl: 10000
min_patrol_altitude_ft_msl: 4000 combat_altitude_ft_msl: 8000
max_patrol_altitude_ft_msl: 15000 cap:
pattern_altitude_ft_msl: 5000 duration_minutes: 30
cap_duration_minutes: 30 min_track_length_nm: 8
cap_min_track_length_nm: 8 max_track_length_nm: 18
cap_max_track_length_nm: 18 min_distance_from_cp_nm: 0
cap_min_distance_from_cp_nm: 0 max_distance_from_cp_nm: 5
cap_max_distance_from_cp_nm: 5 engagement_range_nm: 20
cap_engagement_range_nm: 20 min_patrol_altitude_ft_msl: 4000
cas_duration_minutes: 30 max_patrol_altitude_ft_msl: 15000
sweep_distance_nm: 10 cas:
duration_minutes: 30
sweep:
distance_nm: 10
ground_unit_procurement_ratios: ground_unit_procurement_ratios:
Tank: 3 Tank: 3
ATGM: 3 ATGM: 3
@@ -29,3 +26,7 @@ ground_unit_procurement_ratios:
Artillery: 1 Artillery: 1
SHORAD: 3 SHORAD: 3
Recon: 1 Recon: 1
helicopter:
combat_altitude_ft_agl: 200
rendezvous_altitude_ft_agl: 1500
air_assault_nav_altitude_ft_agl: 1500

View File

@@ -11,6 +11,9 @@ aircrafts:
- F/A-18C Hornet (Lot 20) - F/A-18C Hornet (Lot 20)
- SH-60B Seahawk - SH-60B Seahawk
- UH-1H Iroquois - UH-1H Iroquois
- F/A-18E Super Hornet
- F/A-18F Super Hornet
- EA-18G Growler
awacs: awacs:
- E-3A - E-3A
tankers: tankers:

View File

@@ -13,6 +13,9 @@ aircrafts:
- S-3B Viking - S-3B Viking
- SH-60B Seahawk - SH-60B Seahawk
- UH-1H Iroquois - UH-1H Iroquois
- F/A-18E Super Hornet
- F/A-18F Super Hornet
- EA-18G Growler
awacs: awacs:
- E-2C Hawkeye - E-2C Hawkeye
tankers: tankers:

Binary file not shown.

After

Width:  |  Height:  |  Size: 989 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 226 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -20,3 +20,4 @@ tasks:
BAI: 680 BAI: 680
CAS: 680 CAS: 680
OCA/Aircraft: 680 OCA/Aircraft: 680
hit_points: 32

View File

@@ -30,3 +30,4 @@ tasks:
OCA/Aircraft: 820 OCA/Aircraft: 820
OCA/Runway: 380 OCA/Runway: 380
Strike: 380 Strike: 380
hit_points: 32

View File

@@ -34,3 +34,4 @@ tasks:
OCA/Aircraft: 830 OCA/Aircraft: 830
OCA/Runway: 390 OCA/Runway: 390
Strike: 390 Strike: 390
hit_points: 32

View File

@@ -24,3 +24,4 @@ tasks:
OCA/Aircraft: 160 OCA/Aircraft: 160
OCA/Runway: 140 OCA/Runway: 140
Strike: 140 Strike: 140
hit_points: 18

View File

@@ -8,3 +8,4 @@ variants:
A-50: null A-50: null
tasks: tasks:
AEW&C: 10 AEW&C: 10
hit_points: 60

View File

@@ -23,3 +23,4 @@ tasks:
BAI: 480 BAI: 480
CAS: 480 CAS: 480
OCA/Aircraft: 480 OCA/Aircraft: 480
hit_points: 14

View File

@@ -24,3 +24,4 @@ tasks:
BAI: 490 BAI: 490
CAS: 490 CAS: 490
OCA/Aircraft: 490 OCA/Aircraft: 490
hit_points: 14

View File

@@ -25,3 +25,4 @@ tasks:
BAI: 500 BAI: 500
CAS: 500 CAS: 500
OCA/Aircraft: 500 OCA/Aircraft: 500
hit_points: 14

View File

@@ -40,5 +40,4 @@ tasks:
CAS: 510 CAS: 510
DEAD: 115 DEAD: 115
OCA/Aircraft: 510 OCA/Aircraft: 510
default_overrides: hit_points: 20
FCR_RFI_removed: false

View File

@@ -43,3 +43,4 @@ tasks:
OCA/Aircraft: 620 OCA/Aircraft: 620
OCA/Runway: 620 OCA/Runway: 620
Strike: 630 Strike: 630
hit_points: 18

View File

@@ -63,3 +63,4 @@ tasks:
SEAD: 70 SEAD: 70
SEAD Escort: 70 SEAD Escort: 70
Strike: 590 Strike: 590
hit_points: 18

View File

@@ -5,3 +5,4 @@ variants:
An-26B: null An-26B: null
tasks: tasks:
Transport: 110 Transport: 110
hit_points: 45

View File

@@ -3,3 +3,4 @@ price: 15
variants: variants:
An-30M: null An-30M: null
tasks: {} tasks: {}
hit_points: 45

View File

@@ -23,3 +23,4 @@ variants:
tasks: tasks:
OCA/Runway: 150 OCA/Runway: 150
Strike: 150 Strike: 150
hit_points: 18

View File

@@ -23,3 +23,4 @@ tasks:
OCA/Aircraft: 670 OCA/Aircraft: 670
OCA/Runway: 670 OCA/Runway: 670
Strike: 700 Strike: 700
hit_points: 60

View File

@@ -17,3 +17,4 @@ tasks:
DEAD: 210 DEAD: 210
OCA/Runway: 660 OCA/Runway: 660
Strike: 690 Strike: 690
hit_points: 60

View File

@@ -34,3 +34,4 @@ tasks:
OCA/Runway: 20 OCA/Runway: 20
Strike: 20 Strike: 20
TARCAP: 60 TARCAP: 60
hit_points: 18

View File

@@ -30,3 +30,4 @@ tasks:
OCA/Runway: 170 OCA/Runway: 170
Strike: 170 Strike: 170
TARCAP: 130 TARCAP: 130
hit_points: 18

View File

@@ -5,3 +5,4 @@ variants:
C-130: null C-130: null
tasks: tasks:
Transport: 130 Transport: 130
hit_points: 45

View File

@@ -5,3 +5,4 @@ variants:
C-17A: null C-17A: null
tasks: tasks:
Transport: 150 Transport: 150
hit_points: 45

View File

@@ -13,3 +13,4 @@ variants:
C-47 Dakota: null C-47 Dakota: null
tasks: tasks:
Transport: 90 Transport: 90
hit_points: 18

View File

@@ -10,3 +10,4 @@ variants:
tasks: tasks:
Air Assault: 90 Air Assault: 90
Transport: 70 Transport: 70
hit_points: 20

View File

@@ -10,3 +10,4 @@ variants:
tasks: tasks:
Air Assault: 100 Air Assault: 100
Transport: 80 Transport: 80
hit_points: 20

View File

@@ -16,3 +16,4 @@ variants:
E-2D Advanced Hawkeye: {} E-2D Advanced Hawkeye: {}
tasks: tasks:
AEW&C: 20 AEW&C: 20
hit_points: 25

View File

@@ -8,3 +8,4 @@ variants:
E-3A: null E-3A: null
tasks: tasks:
AEW&C: 30 AEW&C: 30
hit_points: 60

View File

@@ -0,0 +1,47 @@
carrier_capable: true
description:
'The EA-18G Growler is twin engine, supersonic Electronic Warfare Aircraft that is flown
by a pilot and a WSO (Weapon Systems Officer) in a "glass cockpit". It combines extreme maneuverability , a
deadly arsenal of weapons, and the ability to operate from an aircraft carrier.
Operated by several nations, this multi-role fighter has been instrumental in conflicts
from 2009 to today.
The flight capabilities of the Growler closely mirror those of the F/A-18E/F.
This characteristic allows the Growler to excel in both escort jamming and the conventional standoff jamming mission,
which involves radar jamming and deception. Growlers can seamlessly accompany F/A-18s throughout
all stages of an attack mission. To enhance the Growler's stability during electronic warfare operations,
Boeing made modifications to the leading edge fairings and wing fold hinge fairings, incorporating wing fences and
aileron "tripper strips".'
introduced: 1999
manufacturer: Boeing Defense, Space & Security
origin: USA
price: 32
role: Carrier-based Electronic Warfare Aircraft
default_livery: "VAQ-139"
fuel:
variants:
radios:
intra_flight: AN/ARC-210
inter_flight: AN/ARC-210
channels:
type: common
# DCS will clobber channel 1 of the first radio compatible with the flight's
# assigned frequency. Since the EA-18's two radios are both AN/ARC-210s,
# radio 1 will be compatible regardless of which frequency is assigned, so
# we must use radio 1 for the intra-flight radio.
intra_flight_radio_index: 1
inter_flight_radio_index: 2
utc_kneeboard: true
# default_overrides:
# HelmetMountedDevice: 1
# InnerBoard: 0
# OuterBoard: 0
tasks:
DEAD: 600
SEAD: 500
EA: 750
hit_points: 20

View File

@@ -20,3 +20,4 @@ variants:
tasks: tasks:
Strike: 710 Strike: 710
has_built_in_target_pod: true has_built_in_target_pod: true
hit_points: 20

View File

@@ -59,3 +59,4 @@ tasks:
SEAD Escort: 90 SEAD Escort: 90
Strike: 550 Strike: 550
TARCAP: 520 TARCAP: 520
hit_points: 20

View File

@@ -59,3 +59,4 @@ tasks:
SEAD Escort: 100 SEAD Escort: 100
Strike: 560 Strike: 560
TARCAP: 530 TARCAP: 530
hit_points: 20

View File

@@ -18,3 +18,4 @@ tasks:
Fighter sweep: 540 Fighter sweep: 540
Intercept: 540 Intercept: 540
TARCAP: 540 TARCAP: 540
hit_points: 20

View File

@@ -25,3 +25,4 @@ tasks:
Strike: 640 Strike: 640
TARCAP: 240 TARCAP: 240
has_built_in_target_pod: true has_built_in_target_pod: true
hit_points: 20

View File

@@ -51,3 +51,4 @@ laser_codes:
- property: - property:
id: Sta8LaserCode id: Sta8LaserCode
digits: 3 digits: 3
hit_points: 18

View File

@@ -16,3 +16,4 @@ tasks:
OCA/Runway: 570 OCA/Runway: 570
Strike: 570 Strike: 570
TARCAP: 420 TARCAP: 420
hit_points: 14

View File

@@ -78,3 +78,4 @@ laser_codes:
digit: 1 digit: 1
- id: LaserCode1 - id: LaserCode1
digit: 0 digit: 0
hit_points: 20

View File

@@ -33,3 +33,4 @@ tasks:
SEAD Escort: 120 SEAD Escort: 120
Strike: 400 Strike: 400
TARCAP: 410 TARCAP: 410
hit_points: 20

View File

@@ -48,3 +48,4 @@ tasks:
OCA/Runway: 190 OCA/Runway: 190
Strike: 200 Strike: 200
TARCAP: 200 TARCAP: 200
hit_points: 16

View File

@@ -26,3 +26,4 @@ tasks:
OCA/Runway: 180 OCA/Runway: 180
Strike: 190 Strike: 190
TARCAP: 150 TARCAP: 150
hit_points: 15

View File

@@ -68,3 +68,4 @@ tasks:
SEAD Escort: 160 SEAD Escort: 160
Strike: 600 Strike: 600
TARCAP: 450 TARCAP: 450
hit_points: 20

View File

@@ -44,3 +44,4 @@ tasks:
OCA/Runway: 0 OCA/Runway: 0
Strike: 0 Strike: 0
TARCAP: 40 TARCAP: 40
hit_points: 18

View File

@@ -33,3 +33,4 @@ tasks:
OCA/Runway: 10 OCA/Runway: 10
Strike: 10 Strike: 10
TARCAP: 50 TARCAP: 50
hit_points: 18

View File

@@ -24,3 +24,4 @@ tasks:
OCA/Aircraft: 380 OCA/Aircraft: 380
OCA/Runway: 640 OCA/Runway: 640
Strike: 650 Strike: 650
hit_points: 18

View File

@@ -28,3 +28,4 @@ tasks:
Intercept: 0 Intercept: 0
OCA/Aircraft: 60 OCA/Aircraft: 60
TARCAP: 0 TARCAP: 0
hit_points: 15

View File

@@ -4,3 +4,4 @@ variants:
IL-76MD: null IL-76MD: null
tasks: tasks:
Transport: 120 Transport: 120
hit_points: 60

View File

@@ -9,3 +9,4 @@ variants:
IL-78M: null IL-78M: null
tasks: tasks:
Refueling: 30 Refueling: 30
hit_points: 60

View File

@@ -18,3 +18,4 @@ tasks:
Fighter sweep: 500 Fighter sweep: 500
Intercept: 500 Intercept: 500
TARCAP: 500 TARCAP: 500
hit_points: 18

View File

@@ -53,3 +53,4 @@ tasks:
SEAD Escort: 180 SEAD Escort: 180
Strike: 580 Strike: 580
TARCAP: 440 TARCAP: 440
hit_points: 18

View File

@@ -27,3 +27,4 @@ tasks:
OCA/Aircraft: 150 OCA/Aircraft: 150
OCA/Runway: 130 OCA/Runway: 130
Strike: 130 Strike: 130
hit_points: 18

View File

@@ -17,3 +17,4 @@ variants:
KC-135 Stratotanker: {} KC-135 Stratotanker: {}
tasks: tasks:
Refueling: 50 Refueling: 50
hit_points: 60

View File

@@ -15,3 +15,4 @@ variants:
KC-130: {} KC-130: {}
tasks: tasks:
Refueling: 10 Refueling: 10
hit_points: 18

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