Compare commits

...

30 Commits

Author SHA1 Message Date
dependabot[bot]
dfe0c0b315 Bump black from 23.11.0 to 24.3.0 (#3361)
Bumps [black](https://github.com/psf/black) from 23.11.0 to 24.3.0.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/psf/black/releases">black's
releases</a>.</em></p>
<blockquote>
<h2>24.3.0</h2>
<h3>Highlights</h3>
<p>This release is a milestone: it fixes Black's first CVE security
vulnerability. If you
run Black on untrusted input, or if you habitually put thousands of
leading tab
characters in your docstrings, you are strongly encouraged to upgrade
immediately to fix
<a
href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-21503">CVE-2024-21503</a>.</p>
<p>This release also fixes a bug in Black's AST safety check that
allowed Black to make
incorrect changes to certain f-strings that are valid in Python 3.12 and
higher.</p>
<h3>Stable style</h3>
<ul>
<li>Don't move comments along with delimiters, which could cause crashes
(<a
href="https://redirect.github.com/psf/black/issues/4248">#4248</a>)</li>
<li>Strengthen AST safety check to catch more unsafe changes to strings.
Previous versions
of Black would incorrectly format the contents of certain unusual
f-strings containing
nested strings with the same quote type. Now, Black will crash on such
strings until
support for the new f-string syntax is implemented. (<a
href="https://redirect.github.com/psf/black/issues/4270">#4270</a>)</li>
<li>Fix a bug where line-ranges exceeding the last code line would not
work as expected
(<a
href="https://redirect.github.com/psf/black/issues/4273">#4273</a>)</li>
</ul>
<h3>Performance</h3>
<ul>
<li>Fix catastrophic performance on docstrings that contain large
numbers of leading tab
characters. This fixes
<a
href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-21503">CVE-2024-21503</a>.
(<a
href="https://redirect.github.com/psf/black/issues/4278">#4278</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Note what happens when <code>--check</code> is used with
<code>--quiet</code> (<a
href="https://redirect.github.com/psf/black/issues/4236">#4236</a>)</li>
</ul>
<h2>24.2.0</h2>
<h3>Stable style</h3>
<ul>
<li>Fixed a bug where comments where mistakenly removed along with
redundant parentheses
(<a
href="https://redirect.github.com/psf/black/issues/4218">#4218</a>)</li>
</ul>
<h3>Preview style</h3>
<ul>
<li>Move the <code>hug_parens_with_braces_and_square_brackets</code>
feature to the unstable style
due to an outstanding crash and proposed formatting tweaks (<a
href="https://redirect.github.com/psf/black/issues/4198">#4198</a>)</li>
<li>Fixed a bug where base expressions caused inconsistent formatting of
** in tenary
expression (<a
href="https://redirect.github.com/psf/black/issues/4154">#4154</a>)</li>
<li>Checking for newline before adding one on docstring that is almost
at the line limit
(<a
href="https://redirect.github.com/psf/black/issues/4185">#4185</a>)</li>
<li>Remove redundant parentheses in <code>case</code> statement
<code>if</code> guards (<a
href="https://redirect.github.com/psf/black/issues/4214">#4214</a>).</li>
</ul>
<h3>Configuration</h3>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/psf/black/blob/main/CHANGES.md">black's
changelog</a>.</em></p>
<blockquote>
<h2>24.3.0</h2>
<h3>Highlights</h3>
<p>This release is a milestone: it fixes Black's first CVE security
vulnerability. If you
run Black on untrusted input, or if you habitually put thousands of
leading tab
characters in your docstrings, you are strongly encouraged to upgrade
immediately to fix
<a
href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-21503">CVE-2024-21503</a>.</p>
<p>This release also fixes a bug in Black's AST safety check that
allowed Black to make
incorrect changes to certain f-strings that are valid in Python 3.12 and
higher.</p>
<h3>Stable style</h3>
<ul>
<li>Don't move comments along with delimiters, which could cause crashes
(<a
href="https://redirect.github.com/psf/black/issues/4248">#4248</a>)</li>
<li>Strengthen AST safety check to catch more unsafe changes to strings.
Previous versions
of Black would incorrectly format the contents of certain unusual
f-strings containing
nested strings with the same quote type. Now, Black will crash on such
strings until
support for the new f-string syntax is implemented. (<a
href="https://redirect.github.com/psf/black/issues/4270">#4270</a>)</li>
<li>Fix a bug where line-ranges exceeding the last code line would not
work as expected
(<a
href="https://redirect.github.com/psf/black/issues/4273">#4273</a>)</li>
</ul>
<h3>Performance</h3>
<ul>
<li>Fix catastrophic performance on docstrings that contain large
numbers of leading tab
characters. This fixes
<a
href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-21503">CVE-2024-21503</a>.
(<a
href="https://redirect.github.com/psf/black/issues/4278">#4278</a>)</li>
</ul>
<h3>Documentation</h3>
<ul>
<li>Note what happens when <code>--check</code> is used with
<code>--quiet</code> (<a
href="https://redirect.github.com/psf/black/issues/4236">#4236</a>)</li>
</ul>
<h2>24.2.0</h2>
<h3>Stable style</h3>
<ul>
<li>Fixed a bug where comments where mistakenly removed along with
redundant parentheses
(<a
href="https://redirect.github.com/psf/black/issues/4218">#4218</a>)</li>
</ul>
<h3>Preview style</h3>
<ul>
<li>Move the <code>hug_parens_with_braces_and_square_brackets</code>
feature to the unstable style
due to an outstanding crash and proposed formatting tweaks (<a
href="https://redirect.github.com/psf/black/issues/4198">#4198</a>)</li>
<li>Fixed a bug where base expressions caused inconsistent formatting of
** in tenary
expression (<a
href="https://redirect.github.com/psf/black/issues/4154">#4154</a>)</li>
<li>Checking for newline before adding one on docstring that is almost
at the line limit
(<a
href="https://redirect.github.com/psf/black/issues/4185">#4185</a>)</li>
<li>Remove redundant parentheses in <code>case</code> statement
<code>if</code> guards (<a
href="https://redirect.github.com/psf/black/issues/4214">#4214</a>).</li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="552baf8229"><code>552baf8</code></a>
Prepare release 24.3.0 (<a
href="https://redirect.github.com/psf/black/issues/4279">#4279</a>)</li>
<li><a
href="f000936726"><code>f000936</code></a>
Fix catastrophic performance in lines_with_leading_tabs_expanded() (<a
href="https://redirect.github.com/psf/black/issues/4278">#4278</a>)</li>
<li><a
href="7b5a657285"><code>7b5a657</code></a>
Fix --line-ranges behavior when ranges are at EOF (<a
href="https://redirect.github.com/psf/black/issues/4273">#4273</a>)</li>
<li><a
href="1abcffc818"><code>1abcffc</code></a>
Use regex where we ignore case on windows (<a
href="https://redirect.github.com/psf/black/issues/4252">#4252</a>)</li>
<li><a
href="719e67462c"><code>719e674</code></a>
Fix 4227: Improve documentation for --quiet --check (<a
href="https://redirect.github.com/psf/black/issues/4236">#4236</a>)</li>
<li><a
href="e5510afc06"><code>e5510af</code></a>
update plugin url for Thonny (<a
href="https://redirect.github.com/psf/black/issues/4259">#4259</a>)</li>
<li><a
href="6af7d11096"><code>6af7d11</code></a>
Fix AST safety check false negative (<a
href="https://redirect.github.com/psf/black/issues/4270">#4270</a>)</li>
<li><a
href="f03ee113c9"><code>f03ee11</code></a>
Ensure <code>blib2to3.pygram</code> is initialized before use (<a
href="https://redirect.github.com/psf/black/issues/4224">#4224</a>)</li>
<li><a
href="e4bfedbec2"><code>e4bfedb</code></a>
fix: Don't move comments while splitting delimiters (<a
href="https://redirect.github.com/psf/black/issues/4248">#4248</a>)</li>
<li><a
href="d0287e1f75"><code>d0287e1</code></a>
Make trailing comma logic more concise (<a
href="https://redirect.github.com/psf/black/issues/4202">#4202</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/psf/black/compare/23.11.0...24.3.0">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=black&package-manager=pip&previous-version=23.11.0&new-version=24.3.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-03-21 22:05:57 +11:00
zhexu14
bd5087b3c7 Update changelog, contributors list for Superhornet mod support (#3362)
Update changelog, contributors list for Superhornet mod support
2024-03-21 22:05:33 +11:00
Chilli935
88ebb8b612 FA18EFG mod support Patch 4 (#3340)
- Corrected banner file types.
- Corrected australia_2005.yaml and usn_2005.yaml
- Added australia_2009.yaml and usn_2009.yaml
2024-03-21 21:52:34 +11:00
dependabot[bot]
63702f859d Bump follow-redirects from 1.15.4 to 1.15.6 in /client (#3359)
Bumps
[follow-redirects](https://github.com/follow-redirects/follow-redirects)
from 1.15.4 to 1.15.6.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="35a517c586"><code>35a517c</code></a>
Release version 1.15.6 of the npm package.</li>
<li><a
href="c4f847f851"><code>c4f847f</code></a>
Drop Proxy-Authorization across hosts.</li>
<li><a
href="8526b4a1b2"><code>8526b4a</code></a>
Use GitHub for disclosure.</li>
<li><a
href="b1677ce001"><code>b1677ce</code></a>
Release version 1.15.5 of the npm package.</li>
<li><a
href="d8914f7982"><code>d8914f7</code></a>
Preserve fragment in responseUrl.</li>
<li>See full diff in <a
href="https://github.com/follow-redirects/follow-redirects/compare/v1.15.4...v1.15.6">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=follow-redirects&package-manager=npm_and_yarn&previous-version=1.15.4&new-version=1.15.6)](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-03-17 22:29:19 +11:00
zhexu14
cc5e2ba26c Update pydcs (#3360)
This PR updates pydcs version to fix issues from the DCS 2.9.3.51704
export.
2024-03-17 20:52:36 +11:00
zhexu14
b0a8d53fa6 Beacon update (#3357)
This PR cherry-picks some DCS-update related changes from Retribution
fork:
- Updates to beacon information 
- Fixes to script used to import beacons.

---------

Authored-by: Raffson <Raffson@users.noreply.github.com>
2024-03-16 10:51:41 +11:00
zhexu14
77b7f777f6 Issue 3337 (#3356)
This PR addresses #3337 by:
- Updating the UI to identify that a destroyed carrier/LHA as "Sunk"
- Fall back on targeting other groups in the NavalControlPoint (e.g.
escorts if present) if the carrier/LHA is sunk.
2024-03-15 22:33:25 +11:00
zhexu14
e59da610e9 resources: reformat yaml files to be friendly to git (#3354)
This PR reformats some yaml files to be more friendly to Git. No
contents have been changed.
2024-03-09 17:31:31 +11:00
Starfire13
b61310d229 Update Starfire's campaigns (#3352)
This updates all ten of my campaigns with the improvements I made for
the Retribution versions. There are Retribution-specific units and
trigger zones in the miz templates, but I've tested them and they don't
appear to cause any issues (since Liberation will just ignore the
unknown units and trigger zones). This will make things easier for me in
the future, because then I don't have to maintain two separate sets of
the same campaign files.

The changes include a total redo of supply routes for better convoy
on-road pathing, as well as a balance pass for squadron distribution and
strength.

I have also made a slight edit to one of my faction files to fix a typo.
2024-03-09 15:19:38 +11:00
zhexu14
6550400604 Track damage (#3351)
This PR partially addresses #3313 by:
- Tracking DCS hit events and storing the unit hit point updates in
state.json
- Adding logic to kill aircraft when the hit points is reduced to 1, as
opposed to the DCS logic of hit points to 0. This behavior allows
Liberation to track deaths to parked aircraft, which are uncontrolled
and seem to have different damage logic in DCS.
- Tracking damage to TheaterGroundObjects across turns and killing the
unit when the unit's hitpoints reduces to 1 or lower.

Intention is to build on this PR by also tracking front line objects and
statics (buildings). However, larger refactoring is required and so
splitting those into a separate PR.
2024-03-09 15:07:38 +11:00
zhexu14
1ee1113e48 Bump starlette and fastapi versions (#3350)
Bump starlette to 0.35.1 and fastapi to 0.109.1 in one commit as they
depend on each other.
2024-03-08 22:30:02 +11:00
dependabot[bot]
01f22d6da7 Bump follow-redirects from 1.15.2 to 1.15.4 in /client (#3326)
Bumps
[follow-redirects](https://github.com/follow-redirects/follow-redirects)
from 1.15.2 to 1.15.4.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="65858205e5"><code>6585820</code></a>
Release version 1.15.4 of the npm package.</li>
<li><a
href="7a6567e16d"><code>7a6567e</code></a>
Disallow bracketed hostnames.</li>
<li><a
href="05629af696"><code>05629af</code></a>
Prefer native URL instead of deprecated url.parse.</li>
<li><a
href="1cba8e85fa"><code>1cba8e8</code></a>
Prefer native URL instead of legacy url.resolve.</li>
<li><a
href="72bc2a4229"><code>72bc2a4</code></a>
Simplify _processResponse error handling.</li>
<li><a
href="3d42aecdca"><code>3d42aec</code></a>
Add bracket tests.</li>
<li><a
href="bcbb096b32"><code>bcbb096</code></a>
Do not directly set Error properties.</li>
<li><a
href="192dbe7ce6"><code>192dbe7</code></a>
Release version 1.15.3 of the npm package.</li>
<li><a
href="bd8c81e4f3"><code>bd8c81e</code></a>
Fix resource leak on destroy.</li>
<li><a
href="9c728c314b"><code>9c728c3</code></a>
Split linting and testing.</li>
<li>Additional commits viewable in <a
href="https://github.com/follow-redirects/follow-redirects/compare/v1.15.2...v1.15.4">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=follow-redirects&package-manager=npm_and_yarn&previous-version=1.15.2&new-version=1.15.4)](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-03-08 22:00:36 +11:00
dependabot[bot]
8e6893d550 Bump ip from 1.1.5 to 1.1.9 in /client (#3342)
Bumps [ip](https://github.com/indutny/node-ip) from 1.1.5 to 1.1.9.
<details>
<summary>Commits</summary>
<ul>
<li><a
href="1ecbf2fd8c"><code>1ecbf2f</code></a>
1.1.9</li>
<li><a
href="6a3ada9b47"><code>6a3ada9</code></a>
lib: fixed CVE-2023-42282 and added unit test</li>
<li><a
href="5dc3b2f3f4"><code>5dc3b2f</code></a>
1.1.8</li>
<li><a
href="8e6f28b23a"><code>8e6f28b</code></a>
lib: even better node 6 support</li>
<li><a
href="088c9e5664"><code>088c9e5</code></a>
1.1.7</li>
<li><a
href="1a4ca35ddc"><code>1a4ca35</code></a>
lib: add back support for Node.js 6</li>
<li><a
href="af82ef42ad"><code>af82ef4</code></a>
1.1.6</li>
<li><a
href="dba19f6c0c"><code>dba19f6</code></a>
package: exclude test folder from publishing</li>
<li><a
href="7cd7f30991"><code>7cd7f30</code></a>
ci: use github workflows</li>
<li><a
href="4de50aec87"><code>4de50ae</code></a>
lib: node 18 support</li>
<li>See full diff in <a
href="https://github.com/indutny/node-ip/compare/v1.1.5...v1.1.9">compare
view</a></li>
</ul>
</details>
<br />


[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ip&package-manager=npm_and_yarn&previous-version=1.1.5&new-version=1.1.9)](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-03-08 22:00:26 +11:00
zhexu14
fa9d5525c0 Update requirements.txt to point to a temporary build of pydcs that f… (#3349)
…ixes a bug with loading legacy missions like what Liberation ships with
for layouts
2024-03-07 22:01:40 +11:00
zhexu14
5127022910 Update README.md due to changes in URLs (#3348)
This PR updates a link in README.md.
2024-03-06 22:24:38 +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
466 changed files with 4699 additions and 533 deletions

View File

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

View File

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

View File

@@ -2,7 +2,7 @@
(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)

View File

@@ -1,3 +1,19 @@
# 11.0.0
Saves from 10.x are not compatible with 11.0.0.
## Features/Improvements
* **[Engine]** Support for DCS 2.9.3.51704.
* **[Campaign]** Improved tracking of parked aircraft deaths. Parked aircraft are now considered dead once sufficient damage is done, meaning guns, rockets and AGMs are viable weapons for OCA/Aircraft missions. Previously Liberation relied on DCS death tracking which required parked aircraft to be hit with more powerful weapons e.g. 2000lb bombs as they were uncontrolled.
* **[Campaign]** Track damage to theater ground objects across turns. Damage can accumulate across turns leading to death of the unit. This behavior only applies to SAMs, ships and other units that appear on the Liberation map. Frontline units and buildings are not tracked (yet).
* **[Mods]** F/A-18 E/F/G Super Hornet mod (v2.2.5) support added.
## Fixes
* **[Mission Generation]** When planning anti-ship missions against carriers or LHAs, target escorts (if present) if the carrier/LHA is sunk.
* **[UI]** Identify that a carrier or LHA is sunk instead of "damaged".
# 10.0.0
Saves from 9.x are not compatible with 10.0.0.

View File

@@ -9883,9 +9883,9 @@
"dev": true
},
"node_modules/follow-redirects": {
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
"integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
"version": "1.15.6",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
"integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
"funding": [
{
"type": "individual",
@@ -11161,9 +11161,9 @@
}
},
"node_modules/ip": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
"integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
"version": "1.1.9",
"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz",
"integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==",
"dev": true
},
"node_modules/ipaddr.js": {
@@ -28743,9 +28743,9 @@
"dev": true
},
"follow-redirects": {
"version": "1.15.2",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
"integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
"version": "1.15.6",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
"integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA=="
},
"for-each": {
"version": "0.3.3",
@@ -29680,9 +29680,9 @@
}
},
"ip": {
"version": "1.1.5",
"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz",
"integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=",
"version": "1.1.9",
"resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz",
"integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==",
"dev": true
},
"ipaddr.js": {

View File

@@ -9,7 +9,7 @@
project = "DCS Liberation"
copyright = "2023, DCS Liberation Team"
author = "DCS Liberation Team"
release = "10.0.0"
release = "11.0.0"
# -- 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")
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
builder = WaypointBuilder(self.flight, self.coalition)

View File

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

View File

@@ -90,10 +90,10 @@ class CapBuilder(IBuilder[FlightPlanT, LayoutT], ABC):
# buffer.
distance_to_no_fly = (
meters(position.distance(self.threat_zones.all))
- self.doctrine.cap_engagement_range
- self.doctrine.cap.engagement_range
- nautical_miles(5)
)
max_track_length = self.doctrine.cap_max_track_length
max_track_length = self.doctrine.cap.max_track_length
else:
# Other race tracks (TARCAPs, currently) just try to keep some
# 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
# TARCAPs fly short racetracks because they need to react faster.
max_track_length = self.doctrine.cap_min_track_length + 0.3 * (
self.doctrine.cap_max_track_length - self.doctrine.cap_min_track_length
max_track_length = self.doctrine.cap.min_track_length + 0.3 * (
self.doctrine.cap.max_track_length - self.doctrine.cap.min_track_length
)
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(
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(
@@ -125,7 +125,7 @@ class CapBuilder(IBuilder[FlightPlanT, LayoutT], ABC):
)
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),
)
start = end.point_from_heading(heading.opposite.degrees, track_length)

View File

@@ -44,7 +44,7 @@ class CasFlightPlan(PatrollingFlightPlan[CasLayout], UiZoneDisplay):
@property
def patrol_duration(self) -> timedelta:
return self.flight.coalition.doctrine.cas_duration
return self.flight.coalition.doctrine.cas.duration
@property
def patrol_speed(self) -> Speed:
@@ -96,7 +96,7 @@ class Builder(IBuilder[CasFlightPlan, CasLayout]):
builder = WaypointBuilder(self.flight, self.coalition)
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
ip_solver = IpSolver(

View File

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

View File

@@ -163,7 +163,7 @@ class FormationAttackBuilder(IBuilder[FlightPlanT, LayoutT], ABC):
departure=builder.takeoff(self.flight.departure),
hold=hold,
nav_to=builder.nav_path(
hold.position, join.position, self.doctrine.ingress_altitude
hold.position, join.position, self.doctrine.combat_altitude
),
join=join,
ingress=ingress,
@@ -173,7 +173,7 @@ class FormationAttackBuilder(IBuilder[FlightPlanT, LayoutT], ABC):
nav_from=builder.nav_path(
refuel.position,
self.flight.arrival.position,
self.doctrine.ingress_altitude,
self.doctrine.combat_altitude,
),
arrival=builder.land(self.flight.arrival),
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)
)
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)
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())
@@ -126,12 +126,12 @@ class Builder(IBuilder[SweepFlightPlan, SweepLayout]):
departure=builder.takeoff(self.flight.departure),
hold=hold,
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(
end.position,
self.flight.arrival.position,
self.doctrine.ingress_altitude,
self.doctrine.combat_altitude,
),
sweep_start=start,
sweep_end=end,

View File

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

View File

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

View File

@@ -2,7 +2,7 @@ from __future__ import annotations
from pathlib import Path
import yaml
from typing import ClassVar
from typing import Any, ClassVar
from dataclasses import dataclass
from datetime import timedelta
@@ -32,18 +32,94 @@ class GroundUnitProcurementRatios:
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)
class Doctrine:
#: Name of the doctrine, used to assign a doctrine in a faction.
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.
hold_distance: Distance
@@ -62,42 +138,40 @@ class Doctrine:
#: target.
min_ingress_distance: Distance
ingress_altitude: Distance
#: The altitude used for combat section of a flight.
combat_altitude: Distance
min_patrol_altitude: Distance
max_patrol_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
#: The altitude used for forming up a pacakge.
rendezvous_altitude: Distance
#: Defines prioritization of ground unit purchases.
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]] = {}
_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
def register(cls, doctrine: Doctrine) -> None:
if doctrine.name in cls._by_name:
@@ -127,11 +201,6 @@ class Doctrine:
cls.register(
Doctrine(
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"]),
hold_distance=nautical_miles(data["hold_distance_nm"]),
push_distance=nautical_miles(data["push_distance_nm"]),
@@ -142,31 +211,14 @@ class Doctrine:
min_ingress_distance=nautical_miles(
data["min_ingress_distance_nm"]
),
ingress_altitude=feet(data["ingress_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"]),
combat_altitude=feet(data["combat_altitude_ft_msl"]),
ground_unit_procurement_ratios=GroundUnitProcurementRatios.from_dict(
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

View File

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

View File

@@ -133,4 +133,5 @@ class GroundUnitType(UnitType[Type[VehicleType]]):
data.get("skynet_properties", {})
),
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."),
role=data.get("role", "No data."),
price=data["price"],
hit_points=data.get("hit_points", 1),
)

View File

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

View File

@@ -1,5 +1,5 @@
from __future__ import annotations
from abc import ABC
import itertools
import logging
from collections import defaultdict
@@ -9,7 +9,9 @@ from typing import (
Dict,
Iterator,
List,
Optional,
TYPE_CHECKING,
TypeVar,
Union,
)
from uuid import UUID
@@ -21,8 +23,10 @@ from game.theater import Airfield, ControlPoint
if TYPE_CHECKING:
from game import Game
from game.ato.flight import Flight
from game.dcs.unittype import UnitType
from game.sim.simulationresults import SimulationResults
from game.transfers import CargoShip
from game.theater import TheaterUnit
from game.unitmap import (
AirliftUnits,
ConvoyUnit,
@@ -90,6 +94,103 @@ class BaseCaptureEvent:
captured_by_player: bool
@dataclass
class UnitHitpointUpdate(ABC):
unit: Any
hit_points: int
@classmethod
def from_json(
cls, data: dict[str, Any], unit_map: UnitMap
) -> Optional[UnitHitpointUpdate]:
raise NotImplementedError()
def is_dead(self) -> bool:
# Use hit_points > 1 to indicate unit is alive, rather than >=1 (DCS logic) to account for uncontrolled units which often have a
# health floor of 1
if self.hit_points > 1:
return False
return True
def is_friendly(self, to_player: bool) -> bool:
raise NotImplementedError()
@dataclass
class FlyingUnitHitPointUpdate(UnitHitpointUpdate):
unit: FlyingUnit
@classmethod
def from_json(
cls, data: dict[str, Any], unit_map: UnitMap
) -> Optional[FlyingUnitHitPointUpdate]:
unit = unit_map.flight(data["name"])
if unit is None:
return None
return cls(unit, int(float(data["hit_points"])))
def is_friendly(self, to_player: bool) -> bool:
if to_player:
return self.unit.flight.departure.captured
return not self.unit.flight.departure.captured
@dataclass
class TheaterUnitHitPointUpdate(UnitHitpointUpdate):
unit: TheaterUnitMapping
@classmethod
def from_json(
cls, data: dict[str, Any], unit_map: UnitMap
) -> Optional[TheaterUnitHitPointUpdate]:
unit = unit_map.theater_units(data["name"])
if unit is None:
return None
if unit.theater_unit.unit_type is None:
logging.debug(
f"Ground unit {data['name']} does not have a valid unit type."
)
return None
if unit.theater_unit.hit_points is None:
logging.debug(f"Ground unit {data['name']} does not have hit_points set.")
return None
sim_hit_points = int(
float(data["hit_points"])
) # Hit points out of the sim i.e. new unit hit points - damage in this turn
previous_turn_hit_points = (
unit.theater_unit.hit_points
) # Hit points at the end of the previous turn
full_health_hit_points = (
unit.theater_unit.unit_type.hit_points
) # Hit points of a new unit
# Hit points left after damage this turn is subtracted from hit points at the end of the previous turn
new_hit_points = previous_turn_hit_points - (
full_health_hit_points - sim_hit_points
)
return cls(unit, new_hit_points)
def is_dead(self) -> bool:
# Some TheaterUnits can start with low health of around 1, make sure we don't always kill them off.
if (
self.unit.theater_unit.unit_type is not None
and self.unit.theater_unit.unit_type.hit_points is not None
and self.unit.theater_unit.unit_type.hit_points <= 1
):
return False
return super().is_dead()
def is_friendly(self, to_player: bool) -> bool:
return self.unit.theater_unit.ground_object.is_friendly(to_player)
def commit(self) -> None:
self.unit.theater_unit.hit_points = self.hit_points
@dataclass(frozen=True)
class StateData:
#: True if the mission ended. If False, the mission exited abnormally.
@@ -108,6 +209,10 @@ class StateData:
#: Mangled names of bases that were captured during the mission.
base_capture_events: List[str]
# List of descriptions of damage done to units. Each list element is a dict like the following
# {"name": "<damaged unit name>", "hit_points": <hit points as float>}
unit_hit_point_updates: List[dict[str, Any]]
@classmethod
def from_json(cls, data: Dict[str, Any], unit_map: UnitMap) -> StateData:
def clean_unit_list(unit_list: List[Any]) -> List[str]:
@@ -147,6 +252,7 @@ class StateData:
killed_ground_units=killed_ground_units,
destroyed_statics=data["destroyed_objects_positions"],
base_capture_events=data["base_capture_events"],
unit_hit_point_updates=data["unit_hit_point_updates"],
)
@@ -284,6 +390,19 @@ class Debriefing:
player_losses.append(aircraft)
else:
enemy_losses.append(aircraft)
for unit_data in self.state_data.unit_hit_point_updates:
damaged_unit = FlyingUnitHitPointUpdate.from_json(unit_data, self.unit_map)
if damaged_unit is None:
continue
if damaged_unit.is_dead():
# If unit already killed, nothing to do.
if unit_data["name"] in self.state_data.killed_aircraft:
continue
if damaged_unit.is_friendly(to_player=True):
player_losses.append(damaged_unit.unit)
else:
enemy_losses.append(damaged_unit.unit)
return AirLosses(player_losses, enemy_losses)
def dead_ground_units(self) -> GroundLosses:
@@ -356,8 +475,29 @@ class Debriefing:
losses.enemy_airlifts.append(airlift_unit)
continue
for unit_data in self.state_data.unit_hit_point_updates:
damaged_unit = TheaterUnitHitPointUpdate.from_json(unit_data, self.unit_map)
if damaged_unit is None:
continue
if damaged_unit.is_dead():
if unit_data["name"] in self.state_data.killed_ground_units:
continue
if damaged_unit.is_friendly(to_player=True):
losses.player_ground_objects.append(damaged_unit.unit)
else:
losses.enemy_ground_objects.append(damaged_unit.unit)
return losses
def unit_hit_point_update_events(self) -> List[TheaterUnitHitPointUpdate]:
damaged_units = []
for unit_data in self.state_data.unit_hit_point_updates:
unit = TheaterUnitHitPointUpdate.from_json(unit_data, self.unit_map)
if unit is None:
continue
damaged_units.append(unit)
return damaged_units
def base_capture_events(self) -> List[BaseCaptureEvent]:
"""Keeps only the last instance of a base capture event for each base ID."""
blue_coalition_id = 2

View File

@@ -300,6 +300,11 @@ class Faction:
self.remove_aircraft("Su-57")
if not mod_settings.ov10a_bronco:
self.remove_aircraft("Bronco-OV-10A")
if not mod_settings.fa18efg:
self.remove_aircraft("FA_18E")
self.remove_aircraft("FA_18F")
self.remove_aircraft("EA_18G")
# frenchpack
if not mod_settings.frenchpack:
self.remove_vehicle("AMX10RCR")

View File

@@ -20,8 +20,14 @@ class AntiShipIngressBuilder(PydcsWaypointBuilder):
group_names.append(target.name)
elif isinstance(target, NavalControlPoint):
carrier_name = target.get_carrier_group_name()
if carrier_name:
if carrier_name and self.mission.find_group(
carrier_name
): # Found a carrier, target it.
group_names.append(carrier_name)
else: # Could not find carrier/LHA, indicating it was sunk. Target other groups if present e.g. escorts.
for ground_object in target.ground_objects:
for group in ground_object.groups:
group_names.append(group.group_name)
else:
logging.error(
"Unexpected target type for anti-ship mission: %s",

View File

@@ -34,6 +34,7 @@ class MissionResultsProcessor:
self.commit_damaged_runways(debriefing)
self.commit_captures(debriefing, events)
self.commit_front_line_battle_impact(debriefing, events)
self.commit_unit_damage(debriefing)
self.record_carcasses(debriefing)
def commit_air_losses(self, debriefing: Debriefing) -> None:
@@ -307,6 +308,14 @@ class MissionResultsProcessor:
f"{enemy_cp.name}. {status_msg}",
)
@staticmethod
def commit_unit_damage(debriefing: Debriefing) -> None:
for damaged_unit in debriefing.unit_hit_point_update_events():
logging.info(
f"{damaged_unit.unit.theater_unit.name} damaged, setting hit points to {damaged_unit.hit_points}"
)
damaged_unit.commit()
def redeploy_units(self, cp: ControlPoint) -> None:
""" "
Auto redeploy units to newly captured base

View File

@@ -1283,7 +1283,10 @@ class NavalControlPoint(ControlPoint, ABC):
return RunwayStatus(damaged=not self.runway_is_operational())
def describe_runway_status(self) -> str:
return f"Flight deck {self.runway_status.describe()}"
if self.runway_is_operational():
return f"Flight deck {self.runway_status.describe()}"
# Special handling for not operational carriers/LHAs
return f"Sunk"
@property
def runway_can_be_repaired(self) -> bool:

View File

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

View File

@@ -35,6 +35,8 @@ class TheaterUnit:
position: PointWithHeading
# The parent ground object
ground_object: TheaterGroundObject
# Number of hit points the unit has
hit_points: Optional[int] = None
# State of the unit, dead or alive
alive: bool = True
@@ -42,13 +44,17 @@ class TheaterUnit:
def from_template(
id: int, dcs_type: Type[DcsUnitType], t: LayoutUnit, go: TheaterGroundObject
) -> TheaterUnit:
return TheaterUnit(
unit = TheaterUnit(
id,
t.name,
dcs_type,
PointWithHeading.from_point(t.position, Heading.from_degrees(t.heading)),
go,
)
# if the TheaterUnit represents a GroundUnitType or ShipUnitType, initialize health to full hit points
if unit.unit_type is not None:
unit.hit_points = unit.unit_type.hit_points
return unit
@property
def unit_type(self) -> Optional[UnitType[Any]]:
@@ -70,14 +76,12 @@ class TheaterUnit:
@property
def display_name(self) -> str:
dead_label = " [DEAD]" if not self.alive else ""
unit_label = self.unit_type or self.type.name or self.name
return f"{str(self.id).zfill(4)} | {unit_label}{dead_label}"
return f"{str(self.id).zfill(4)} | {unit_label}{self._status_label()}"
@property
def short_name(self) -> str:
dead_label = " [DEAD]" if not self.alive else ""
return f"<b>{self.type.id[0:18]}</b> {dead_label}"
return f"<b>{self.type.id[0:18]}</b> {self._status_label()}"
@property
def is_static(self) -> bool:
@@ -117,6 +121,18 @@ class TheaterUnit:
unit_range = getattr(self.type, "threat_range", None)
return meters(unit_range if unit_range is not None and self.alive else 0)
def _status_label(self) -> str:
if not self.alive:
return " [DEAD]"
if self.unit_type is None:
return ""
if self.hit_points is None:
return ""
if self.unit_type.hit_points == self.hit_points:
return ""
damage_percentage = 100 - int(100 * self.hit_points / self.unit_type.hit_points)
return f" [DAMAGED {damage_percentage}%]"
class SceneryUnit(TheaterUnit):
"""Special TheaterUnit for handling scenery ground objects"""

View File

@@ -165,7 +165,7 @@ class ThreatZones:
cls, doctrine: Doctrine, control_point: ControlPoint
) -> Distance:
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(
control_point, cap_threat_range * 2

View File

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

View File

@@ -9,6 +9,7 @@ from .jas39 import *
from .ov10a import *
from .su57 import *
from .uh60l import *
from .fa18efg import *
def load_mods() -> None:

View File

@@ -0,0 +1 @@
from .fa18efg import *

File diff suppressed because it is too large Load Diff

View File

@@ -493,6 +493,7 @@ class QLiberationWindow(QMainWindow):
"ColonelAkirNakesh",
"Nosajthedevil",
"kivipe",
"Chilli935",
]
text = (
"<h3>DCS Liberation "

View File

@@ -204,6 +204,7 @@ class NewGameWizard(QtWidgets.QWizard):
ov10a_bronco=self.field("ov10a_bronco"),
frenchpack=self.field("frenchpack"),
high_digit_sams=self.field("high_digit_sams"),
fa18efg=self.field("fa18efg"),
)
mod_settings.save_player_settings()
@@ -826,6 +827,10 @@ class GeneratorOptions(QtWidgets.QWizardPage):
high_digit_sams.setChecked(mod_settings.high_digit_sams)
self.registerField("high_digit_sams", high_digit_sams)
fa18efg = QtWidgets.QCheckBox()
fa18efg.setChecked(mod_settings.fa18efg)
self.registerField("fa18efg", fa18efg)
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>"
)
@@ -877,6 +882,13 @@ class GeneratorOptions(QtWidgets.QWizardPage):
modLayout.addWidget(QtWidgets.QLabel("High Digit SAMs"), modLayout_row, 0)
modLayout.addWidget(high_digit_sams, modLayout_row, 1)
modSettingsGroup.setLayout(modLayout)
modLayout_row += 1
modLayout.addWidget(
QtWidgets.QLabel("F/A-18EFG Super Hornet (version 2.2.5)"), modLayout_row, 0
)
modLayout.addWidget(fa18efg, modLayout_row, 1)
modSettingsGroup.setLayout(modLayout)
modLayout_row += 1
mlayout = QVBoxLayout()
mlayout.addWidget(generatorSettingsGroup)

View File

@@ -3,7 +3,7 @@ annotated-types==0.6.0
anyio==3.7.1
asgiref==3.7.2
attrs==23.1.0
black==23.11.0
black==24.3.0
certifi==2023.11.17
cfgv==3.4.0
click==8.1.7
@@ -12,7 +12,7 @@ coverage==7.3.2
distlib==0.3.7
exceptiongroup==1.2.0
Faker==20.1.0
fastapi==0.104.1
fastapi==0.109.1
filelock==3.13.1
future==0.18.3
h11==0.14.0
@@ -20,7 +20,7 @@ httptools==0.6.1
identify==2.5.32
idna==3.6
iniconfig==2.0.0
Jinja2==3.1.2
Jinja2==3.1.3
MarkupSafe==2.1.3
mypy==1.7.1
mypy-extensions==1.0.0
@@ -29,14 +29,14 @@ numpy==1.26.2
packaging==23.2
pathspec==0.11.2
pefile==2023.2.7
Pillow==10.0.1
Pillow==10.2.0
platformdirs==4.0.0
pluggy==1.3.0
pre-commit==3.5.0
pydantic==2.5.2
pydantic-settings==2.1.0
pydantic_core==2.14.5
pydcs @ git+https://github.com/pydcs/dcs@1092fc419d3f879e8e7951b25e15d8b7c9938627
pydcs @ git+https://github.com/zhexu14/dcs@bb41fa849e718fee1b97d5d7a7c2e417f78de3d8
pyinstaller==5.13.1
pyinstaller-hooks-contrib==2023.6
pyproj==3.6.1
@@ -54,7 +54,7 @@ shapely==2.0.2
shiboken6==6.4.1
six==1.16.0
sniffio==1.3.0
starlette==0.27.0
starlette==0.35.1
tabulate==0.9.0
tomli==2.0.1
types-Jinja2==2.11.9

View File

@@ -6,29 +6,29 @@ recommended_player_faction: USA 2005
recommended_enemy_faction: Private Military Company - Russian (Hard)
description:
<p><strong>Note:</strong> This campaign was designed for helicopters.</p><p>
Set against the rugged and windswept backdrop of the Falkland Islands,
this fictional campaign scenario unfolds with a dramatic dawn sneak attack
on RAF Mount Pleasant Airbase. Orchestrated by a Russia-backed private
military company, the deadly offensive with helicopter gunships and ground troops
has left the airbase's runways in ruins and its defences obliterated. This brutal
incursion resulted in significant casualties among the RAF personnel, with many
killed or wounded in the unexpected onslaught. The carrier HMS Queen Elizabeth and
its task force are on their way to evacuate the survivors and retake Mount Pleasant.
Set against the rugged and windswept backdrop of the Falkland Islands,
this fictional campaign scenario unfolds with a dramatic dawn sneak attack
on RAF Mount Pleasant Airbase. Orchestrated by a Russia-backed private
military company, the deadly offensive with helicopter gunships and ground troops
has left the airbase's runways in ruins and its defences obliterated. This brutal
incursion resulted in significant casualties among the RAF personnel, with many
killed or wounded in the unexpected onslaught. The carrier HMS Queen Elizabeth and
its task force are on their way to evacuate the survivors and retake Mount Pleasant.
However, they are eight days away at full steam.</p><p>
Amidst this chaos, a beacon of hope emerges in the heart of the Falklands. At Port
Stanley, a small detachment of US military personnel, including helicopter pilots
and armor units, find themselves inadvertently thrust into the fray. Originally at
Port Stanley for some R&R following a training exercise, these soldiers now face
an unexpected and urgent call to action. Their mission is daunting but clear - to
prevent the capture of Port Stanley and liberate East Falkland from the clutches
Amidst this chaos, a beacon of hope emerges in the heart of the Falklands. At Port
Stanley, a small detachment of US military personnel, including helicopter pilots
and armor units, find themselves inadvertently thrust into the fray. Originally at
Port Stanley for some R&R following a training exercise, these soldiers now face
an unexpected and urgent call to action. Their mission is daunting but clear - to
prevent the capture of Port Stanley and liberate East Falkland from the clutches
of the PMC forces.</p><p>
This small group must strategically push the PMC forces back through the treacherous
valley lying between Wickham Heights and the Onion Ranges, an area ominously known
as No Man's Land. Their plan involves a daring assault to destroy the enemy's
helicopter gunships stationed at San Carlos FOB. Following this, they aim to force
the PMC ground forces into a strategic retreat southward, along the 1.6 mile wide
isthmus into Lafonia. This calculated offensive is designed to create a defensible
position at Goose Green on the narrow isthmus, which can be held against a numerically
This small group must strategically destroy the PMC forces deployed around the treacherous
valley lying between Wickham Heights and the Onion Ranges, an area ominously known
as No Man's Land. Their plan involves a daring assault to destroy the enemy's
helicopter gunships stationed at San Carlos FOB. Following this, they aim to force
the PMC ground forces into a strategic retreat southward, along the 1.6 mile wide
isthmus into Lafonia. This offensive is designed to create a defensible position
at Goose Green on the narrow isthmus, which can be held against a numerically
superior force until the arrival of Big Lizzie.</p>
miz: battle_for_no_mans_land.miz
performance: 1
@@ -38,12 +38,12 @@ squadrons:
#Port Stanley
1:
- primary: DEAD
secondary: air-to-ground
secondary: any
aircraft:
- AH-64D Apache Longbow
size: 6
- primary: BAI
secondary: air-to-ground
secondary: any
aircraft:
- AH-64D Apache Longbow
size: 6
@@ -56,14 +56,15 @@ squadrons:
#San Carlos FOB
3:
- primary: BAI
secondary: air-to-ground
secondary: any
aircraft:
- Mi-24P Hind-F
size: 6
#Goose Green
24:
- primary: DEAD
secondary: air-to-ground
secondary: any
aircraft:
- Ka-50 Hokum III
- Ka-50 Hokum (Blackshark 3)
size: 6
size: 6

View File

@@ -3,17 +3,29 @@ name: Sinai - Exercise Bright Star
theater: Sinai
authors: Starfire
recommended_player_faction: Bluefor Modern
recommended_enemy_faction: Egypt 2000s
recommended_enemy_faction: Egypt 2000
description:
<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
number of participating countries has grown substantially. Exercise Bright
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
fictional hostile nation dubbed Orangeland, staging a mock invasion against
Cairo. Israel, having for the first time accepted the invitation to observe,
is hosting the aggressor faction of the exercise coalition at its
airfields.</p>
<p>For over four decades, the United States and Egypt have conducted a series
of biannual joint military exercises known as Bright Star. As the
geopolitical landscape has transformed, so too has the scope and scale of
Exercise Bright Star. The exercise has grown over the years to incorporate
a wide array of international participants. The 2025 iteration of
Exercise Bright Star features eight participating nations alongside
fourteen observer nations.</p><p>
For the 2025 exercises, the United States, along with a select contingent
from the exercise coalition, will take on the role of a hypothetical
adversarial nation, dubbed Orangeland. This scenario is designed to
simulate a mock invasion against Cairo, and presents a valuable
opportunity for participating nations to refine their joint operational
capabilities and improve logistical and tactical interoperability</p><p>
A historic addition to Exercise Bright Star 2025 is the participation of
Israel as an observer nation. This marks a significant milestone, given
the complex historical relations in the region, and symbolises a step
forward in regional collaboration and military diplomacy. Israel's role,
hosting the aggressor faction of the exercise coalition at its airfields,
not only demonstrates the broadening scope of the exercise but also highlights
the value of fostering an environment of mutual cooperation and shared
security objectives.</p>
miz: exercise_bright_star.miz
performance: 1
recommended_start_date: 2025-09-01
@@ -46,6 +58,11 @@ squadrons:
size: 8
# Hatzerim (141)
7:
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
size: 6
- primary: Escort
secondary: any
aircraft:
@@ -78,6 +95,11 @@ squadrons:
aircraft:
- CH-47D
size: 20
- primary: BAI
secondary: any
aircraft:
- AH-64D Apache Longbow
size: 8
- primary: Air Assault
secondary: any
aircraft:
@@ -85,25 +107,22 @@ squadrons:
- UH-60A
size: 4
# Nevatim (106)
8:
- primary: AEW&C
aircraft:
- E-3A
size: 2
- primary: Refueling
aircraft:
- KC-135 Stratotanker
size: 2
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
size: 8
# Nevatim temporarilly disabled because airfield is borked
# 8:
# - primary: AEW&C
# aircraft:
# - E-3A
# size: 2
# - primary: Refueling
# aircraft:
# - KC-135 Stratotanker
# size: 2
# Melez (30)
5:
- primary: CAS
secondary: air-to-ground
secondary: any
aircraft:
- Ka-50 Hokum III
- Ka-50 Hokum (Blackshark 3)
size: 4
- primary: BAI

View File

@@ -53,7 +53,7 @@ squadrons:
- A-10C Thunderbolt II (Suite 7)
size: 8
- primary: CAS
secondary: air-to-ground
secondary: any
aircraft:
- AH-64D Apache Longbow
size: 10
@@ -86,14 +86,15 @@ squadrons:
- Su-25T Frogfoot
size: 20
# Creech
Creech FARP:
1:
- primary: CAS
secondary: air-to-ground
secondary: any
aircraft:
- Ka-50 Hokum III
- Ka-50 Hokum (Blackshark 3)
size: 8
- primary: Air Assault
secondary: air-to-ground
secondary: any
aircraft:
- Mi-24P Hind-F
size: 4

View File

@@ -2,65 +2,7 @@
name: Normandy - The Final Countdown II
theater: Normandy
authors: Starfire
recommended_player_faction:
country: Combined Joint Task Forces Blue
name: D-Day Allied Forces 1944 and 1990
authors: Starfire
description: <p>Faction for Final Countdown II</p>
locales:
- en_US
aircrafts:
- Boston Mk.III
- Fortress Mk.III
- Mustang Mk.IV (Late)
- Spitfire LF Mk IX
- Thunderbolt Mk.II (Late)
- MosquitoFBMkVI
- F-14B Tomcat
- F/A-18C Hornet (Lot 20)
- S-3B Viking
- UH-60L
- UH-60A
awacs:
- E-2C Hawkeye
tankers:
- S-3B Tanker
frontline_units:
- A17 Light Tank Mk VII Tetrarch
- A22 Infantry Tank MK IV Churchill VII
- A27L Cruiser Tank MK VIII Centaur IV
- A27M Cruiser Tank MK VIII Cromwell IV
- Daimler Armoured Car Mk I
- M2A1 Half-Track
- QF 40 mm Mark III
- Sherman Firefly VC
- Sherman III
artillery_units:
- M12 Gun Motor Carriage
logistics_units:
- Truck Bedford
- Truck GMC "Jimmy" 6x6 Truck
infantry_units:
- Infantry M1 Garand
naval_units:
- DDG Arleigh Burke IIa
- CG Ticonderoga
- CVN-74 John C. Stennis
missiles: []
air_defense_units:
- Bofors 40 mm Gun
preset_groups:
- Ally Flak
requirements:
WW2 Asset Pack: https://www.digitalcombatsimulator.com/en/products/other/wwii_assets_pack/
carrier_names:
- CVN-71 Theodore Roosevelt
has_jtac: true
jtac_unit: MQ-9 Reaper
unrestricted_satnav: true
doctrine: ww2
building_set: ww2ally
cargo_ship: LST Mk.II
recommended_player_faction: D-Day Allied Forces 1944 and 1990
recommended_enemy_faction: Germany 1944
description:
<p>While enroute to the Persian Gulf for Operation Desert Shield, the USS
@@ -191,4 +133,4 @@ squadrons:
secondary: any
aircraft:
- Fw 190 A-8 Anton
size: 20
size: 20

View File

@@ -8,10 +8,10 @@ description:
<p>An Argentinean extremist group has contracted the Sons of Warvan (SoW), an
unusually well-equipped PMC with close ties to the Russian government, to
construct a beryllium bomb at the secret Omega 13 production facility in
Ushaia for use in its ongoing conflict with Chile. United States military
Ushuaia for use in its ongoing conflict with Chile. United States military
forces have established a foothold at San Julian. While the SoW are distracted
up north, it is up to the Marines to launch an assault upon Ushaia from an LHA
in order to disable the bomb production facility. Fortunately, Ushaia is
up north, it is up to the Marines to launch an assault upon Ushuaia from an LHA
in order to disable the bomb production facility. Fortunately, Ushuaia is
lightly defended as the SoW are trying to avoid unwanted attention.</p>
miz: grabthars_hammer.miz
performance: 2
@@ -35,6 +35,11 @@ squadrons:
aircraft:
- F-15C Eagle
size: 8
- primary: CAS
secondary: any
aircraft:
- AH-64D Apache Longbow
size: 8
- primary: Refueling
aircraft:
- KC-135 Stratotanker
@@ -57,7 +62,7 @@ squadrons:
secondary: any
aircraft:
- F/A-18C Hornet (Lot 20)
size: 20
size: 40
- primary: DEAD
secondary: air-to-ground
aircraft:
@@ -142,14 +147,15 @@ squadrons:
#Ushuaia
7:
- primary: CAS
secondary: air-to-ground
secondary: any
aircraft:
- Ka-50 Hokum III
- Ka-50 Hokum (Blackshark 3)
size: 8
#Ushuaia Helo Port
8:
- primary: Air Assault
secondary: air-to-ground
secondary: any
aircraft:
- Mi-24P Hind-F
size: 8

View File

@@ -48,7 +48,7 @@ squadrons:
#Tarawa Class LHA
Blue-LHA:
- primary: DEAD
secondary: air-to-ground
secondary: any
aircraft:
- AH-64D Apache Longbow
size: 12
@@ -72,7 +72,7 @@ squadrons:
#Akrotiri
44:
- primary: BAI
secondary: air-to-ground
secondary: any
aircraft:
- AH-1W SuperCobra
size: 4
@@ -81,8 +81,8 @@ squadrons:
aircraft:
- OH-58D Kiowa Warrior
size: 4
- primary: Air Assault
secondary: air-to-ground
- primary: Transport
secondary: any
aircraft:
- UH-60A
size: 4
@@ -95,6 +95,7 @@ squadrons:
#Ercan
49:
- primary: Transport
secondary: any
aircraft:
- CH-47D
size: 6

View File

@@ -100,7 +100,7 @@ squadrons:
#Qeshm Island (12)
13:
- primary: Air Assault
secondary: air-to-ground
secondary: any
aircraft:
- Mi-24P Hind-F
size: 12

View File

@@ -80,7 +80,7 @@ squadrons:
- F-16CM Fighting Falcon (Block 50)
size: 28
- primary: CAS
secondary: air-to-ground
secondary: any
aircraft:
- AH-64D Apache Longbow
size: 4
@@ -93,13 +93,13 @@ squadrons:
- H-6J Badger
size: 16
- primary: BAI
secondary: air-to-ground
secondary: any
aircraft:
- AH-1W SuperCobra
- Su-25 Frogfoot
size: 16
- primary: CAS
secondary: air-to-ground
secondary: any
aircraft:
- OH-58D Kiowa Warrior
- Mi-24P Hind-F

View File

@@ -5,31 +5,18 @@ authors: Starfire
recommended_player_faction: USA 2005
recommended_enemy_faction: Russia 2010
description:
<p>United Nations Observer Mission in Georgia (UNOMIG) observers stationed in
Georgia to monitor the ceasefire between Georgia and Abkhazia have been cut
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
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
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
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
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
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
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
frontline ground war. Once Sukhumi has been captured, squadrons based in
Incirlik Turkey can be ferried in via the "From Incirlik" off-map spawn
point.</p>
<p><strong>Background</strong> - The United Nations Observer Mission in Georgia (UNOMIG) has been actively monitoring the ceasefire agreement between Georgia and its breakaway region of Abkhazia. Recent developments have escalated tensions in the area, leading to a precarious situation for UN observers and affiliated personnel.
</p><p><strong>Current Situation</strong> - UNOMIG observers, along with a contingent of international troops, have found themselves isolated due to the intervention of Russian forces supporting the separatist ambitions of Abkhazia. The UNOMIG headquarters located in Sukhumi has fallen into enemy hands. A smaller group based at the Zugdidi Sector Headquarters now faces the daunting task of navigating to safety with the aid of offshore naval air support.
</p><p><strong>Objective</strong> - The immediate goal is to orchestrate a strategic withdrawal of UN forces to the coastline, leveraging support from US naval aircraft positioned offshore. The critical mission objective is the rapid recapture of Sukhumi. This action is essential to enable the landing of friendly ground forces and the ferrying in of land-based sqwuadrons from Incirlik.
</p><p><strong>Operational Constraints</strong> - It is crucial to note that reinforcement of ground units will not be possible until Sukhumi is successfully recaptured. This recapture can either be performed using existing UN personnel and ground vehicles, or via heliborne assault troop insertion.
</p><p><strong>Assets & Support</strong> - Available assets include two Huey helicopters for close air support. Commanders may opt to initiate the operation with light vehicles, such as Humvees, employing breakthrough tactics to avoid direct confrontations with enemy forces. Alternatively, the use of heavier ground units is an option for commanders seeking a more conventional combat engagement. Upon the recapture of Sukhumi, additional squadrons from Incirlik, Turkey, will become operational.
</p><p><strong>Secondary Objective</strong> - Consider prioritising the capture of the Batumi airfield, located to the south, for its strategic value as a forward operating base. Commanders should be aware of the inherent risks, as the airfield is relatively small and lacks air defence systems, posing a significant threat to any stationed aircraft.</p>
miz: operation_vectrons_claw.miz
performance: 1
recommended_start_date: 2008-08-08
version: "11.0"
control_points:
From Incirlik:
Squadrons from Incirlik:
ferry_only: true
squadrons:
Blue CV-1:
@@ -68,17 +55,17 @@ squadrons:
aircraft:
- AV-8B Harrier II Night Attack
size: 20
From Incirlik:
Squadrons from Incirlik:
- primary: CAS
secondary: air-to-ground
secondary: any
aircraft:
- AH-64D Apache Longbow
size: 8
size: 4
- primary: CAS
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
size: 8
size: 6
- primary: DEAD
secondary: any
aircraft:
@@ -93,6 +80,18 @@ squadrons:
aircraft:
- KC-135 Stratotanker
size: 1
Bombers from RAF Fairford:
- primary: Anti-ship
secondary: air-to-ground
aircraft:
- B-52H Stratofortress
size: 4
Bombers from Base Aérea de Morón:
- primary: OCA/Runway
secondary: air-to-ground
aircraft:
- B-1B Lancer
size: 4
#FARPs
UNOMIG Sector HQ:
- primary: Transport
@@ -105,7 +104,7 @@ squadrons:
secondary: any
aircraft:
- Mi-24P Hind-F
size: 8
size: 4
#Sukhumi-Babushara
20:
- primary: TARCAP
@@ -135,6 +134,13 @@ squadrons:
aircraft:
- Su-34 Fullback
size: 20
#Maykop-Khanskaya
16:
- primary: Strike
secondary: air-to-ground
aircraft:
- Tu-22M3 Backfire-C
size: 20
#Anapa-Vityazevo
12:
- primary: Strike
@@ -147,9 +153,4 @@ squadrons:
secondary: any
aircraft:
- SU-33 Flanker-D
size: 18
#I am aware there is no Russian LHA. This is just for campaign inversion.
Red LHA:
- primary: BAI
secondary: air-to-ground
size: 20
size: 16

View File

@@ -5,23 +5,27 @@ authors: Starfire
recommended_player_faction: USA 1970
recommended_enemy_faction: NVA 1970
description:
<p>Operation Velvet Thunder is a high-intensity training exercise designed to
prepare fresh troops for the challenges they will face in Vietnam. The dense
jungle and rugged terrain of the Mariana Islands will provide a realistic
backdrop, allowing our forces to hone essential skills in jungle warfare,
unconventional tactics, and counterinsurgency operations. There are multiple
checkpoints scattered across the area of operations that will have to be
captured by Air Assault. Due to the limited size and availability of LZs, it
<p>Operation Velvet Thunder is a high-intensity training exercise designed to
prepare fresh troops for the challenges they will face in Vietnam. The dense
jungle and rugged terrain of the Mariana Islands will provide a realistic
backdrop, allowing our forces to hone essential skills in jungle warfare,
unconventional tactics, and counterinsurgency operations. There are multiple
checkpoints scattered across the area of operations that will have to be
captured by Air Assault. Due to the limited size and availability of LZs, it
is vital to pay close attention to where you designate troop drop off zones.
</p><p><strong>Note:</strong> This campaign is intended to be played with the
A-4 Skyhawk and OV-10a aircraft mods active. The C-101CC has also been included
as a stand-in for the Cessna A-37 Dragonfly in order to provide a CAS platform
of roughly equivalent combat capability. This campaign will be updated to use
</p><p><strong>Note:</strong> This campaign is intended to be played with the
A-4 Skyhawk and OV-10a aircraft mods active. The C-101CC has also been included
as a stand-in for the Cessna A-37 Dragonfly in order to provide a CAS platform
of roughly equivalent combat capability. This campaign will be updated to use
Heatblur's F-4 Phantom II once it is in early access.</p>
miz: operation_velvet_thunder.miz
performance: 1
recommended_start_date: 1970-11-29
version: "11.0"
settings:
a4_skyhawk: true
f4bc_phantom: true
ov10a_bronco: true
squadrons:
#Andersen AFB
6:
@@ -43,8 +47,9 @@ squadrons:
- primary: SEAD
secondary: any
aircraft:
- F-4C Phantom II
- F-4E Phantom II
size: 16
size: 8
- primary: Strike
secondary: any
aircraft:
@@ -91,4 +96,4 @@ squadrons:
secondary: any
aircraft:
- MiG-21bis Fishbed-N
size: 8
size: 8

View File

@@ -49,7 +49,7 @@ squadrons:
- primary: BAI
secondary: air-to-ground
aircraft:
- 81st FS
- A-10C Thunderbolt II (Suite 7)
size: 10
#USAF A-10CI
#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_player_income_multiplier: 1.0
recommended_enemy_income_multiplier: 0.6
control_points:
From Turkey:
ferry_only: true
squadrons:
#BLUFOR CVN
Naval-1:
@@ -62,8 +59,8 @@ squadrons:
aircraft:
- HMLA-169 (AH-1W)
size: 6
# Off-theatre forces
From Turkey:
# Incirlik
16:
- primary: Strike
secondary: air-to-ground
aircraft:
@@ -73,8 +70,25 @@ squadrons:
- 960th AAC Squadron
#USAF E-3A
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
19:
- primary: BAI
secondary: air-to-ground
aircraft:
- A-10C Thunderbolt II (Suite 7)
#USAF A-10CII
size: 8
- primary: BARCAP
secondary: air-to-air
aircraft:
@@ -85,11 +99,6 @@ squadrons:
aircraft:
- 23rd FS
#USAF F-16C
- primary: BAI
secondary: air-to-ground
aircraft:
- 81st FS
#USAF A-10CII
- primary: Transport
secondary: air-to-ground
aircraft:

View File

@@ -2,30 +2,6 @@ local unitPayloads = {
["name"] = "AH-64D_BLK_II",
["payloads"] = {
[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",
["name"] = "Liberation BAI",
["pylons"] = {
@@ -45,12 +21,72 @@ local unitPayloads = {
["CLSID"] = "{M299_4xAGM_114L}",
["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"] = {
[1] = 31,
},
},
[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",
["name"] = "Liberation DEAD",
["pylons"] = {
@@ -70,30 +106,39 @@ local unitPayloads = {
["CLSID"] = "{M299_4xAGM_114L}",
["num"] = 1,
},
[5] = {
["CLSID"] = "{AN_APG_78}",
["num"] = 6,
},
},
["tasks"] = {
[1] = 31,
},
},
[4] = {
["name"] = "Liberation OCA/Aircraft",
[5] = {
["displayName"] = "Liberation Escort",
["name"] = "Liberation Escort",
["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,
},
[3] = {
["CLSID"] = "{M261_M229}",
["num"] = 4,
},
[4] = {
["CLSID"] = "{M261_M229}",
["CLSID"] = "{M299_4xAGM_114L}",
["num"] = 1,
},
[5] = {
["CLSID"] = "{AN_APG_78}",
["num"] = 6,
},
},
["tasks"] = {
[1] = 31,

View File

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

View File

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

View File

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

View File

@@ -90,6 +90,13 @@
"hertz": 343000,
"channel": null
},
"world_13": {
"name": "GHI",
"callsign": "GHI",
"beacon_type": 5,
"hertz": 113800000,
"channel": 85
},
"airfield2_0": {
"name": "",
"callsign": "IADA",
@@ -146,6 +153,20 @@
"hertz": 365000,
"channel": null
},
"airfield67_0": {
"name": "",
"callsign": "IAMN",
"beacon_type": 13,
"hertz": 109500000,
"channel": null
},
"airfield67_1": {
"name": "",
"callsign": "IAMN",
"beacon_type": 14,
"hertz": 109500000,
"channel": null
},
"airfield6_0": {
"name": "KALDE",
"callsign": "KAD",
@@ -233,8 +254,8 @@
"airfield7_4": {
"name": "DAMASCUS",
"callsign": "DAL",
"beacon_type": 10,
"hertz": 342000000,
"beacon_type": 9,
"hertz": 342000,
"channel": null
},
"airfield7_5": {
@@ -317,8 +338,8 @@
"airfield41_1": {
"name": "ALANYA/GAZIPASA",
"callsign": "GZP",
"beacon_type": 2,
"hertz": 0,
"beacon_type": 3,
"hertz": 114200000,
"channel": 89
},
"airfield41_2": {
@@ -405,6 +426,20 @@
"hertz": 111700000,
"channel": null
},
"airfield65_0": {
"name": "",
"callsign": "",
"beacon_type": 14,
"hertz": 109100000,
"channel": null
},
"airfield65_1": {
"name": "",
"callsign": "",
"beacon_type": 13,
"hertz": 109100000,
"channel": null
},
"airfield47_0": {
"name": "",
"callsign": "ILC",
@@ -468,6 +503,34 @@
"hertz": 358000,
"channel": null
},
"airfield68_0": {
"name": "",
"callsign": "",
"beacon_type": 13,
"hertz": 112910000,
"channel": null
},
"airfield68_1": {
"name": "",
"callsign": "",
"beacon_type": 13,
"hertz": 112900000,
"channel": null
},
"airfield68_2": {
"name": "",
"callsign": "",
"beacon_type": 14,
"hertz": 112910000,
"channel": null
},
"airfield68_3": {
"name": "",
"callsign": "",
"beacon_type": 14,
"hertz": 112900000,
"channel": null
},
"airfield27_0": {
"name": "ALEPPO",
"callsign": "ALE",
@@ -545,6 +608,27 @@
"hertz": null,
"channel": 79
},
"airfield64_0": {
"name": "PrinceHussein",
"callsign": "ABC",
"beacon_type": 4,
"hertz": 0,
"channel": 106
},
"airfield64_1": {
"name": "",
"callsign": "ABC",
"beacon_type": 13,
"hertz": 111400000,
"channel": null
},
"airfield64_2": {
"name": "",
"callsign": "ABC",
"beacon_type": 14,
"hertz": 111400000,
"channel": null
},
"airfield30_0": {
"name": "RAMATDAVID",
"callsign": "RMD",
@@ -580,6 +664,20 @@
"hertz": 115300000,
"channel": null
},
"airfield58_0": {
"name": "Sanliurfa",
"callsign": "GAP",
"beacon_type": 3,
"hertz": 113200000,
"channel": 79
},
"airfield58_1": {
"name": "Sanliurfa",
"callsign": "GAP",
"beacon_type": 9,
"hertz": 391000,
"channel": null
},
"airfield40_0": {
"name": "Cheka",
"callsign": "CAK",

View File

@@ -1,27 +1,24 @@
name: coldwar
cap: true
cas: true
sead: true
strike: true
antiship: true
rendezvous_altitude_ft_msl: 22000
hold_distance_nm: 15
push_distance_nm: 10
join_distance_nm: 10
max_ingress_distance_nm: 30
min_ingress_distance_nm: 10
ingress_altitude_ft_msl: 18000
min_patrol_altitude_ft_msl: 10000
max_patrol_altitude_ft_msl: 24000
pattern_altitude_ft_msl: 5000
cap_duration_minutes: 30
cap_min_track_length_nm: 12
cap_max_track_length_nm: 24
cap_min_distance_from_cp_nm: 8
cap_max_distance_from_cp_nm: 25
cap_engagement_range_nm: 35
cas_duration_minutes: 30
sweep_distance_nm: 40
rendezvous_altitude_ft_msl: 22000
combat_altitude_ft_msl: 18000
cap:
duration_minutes: 30
min_track_length_nm: 12
max_track_length_nm: 24
min_distance_from_cp_nm: 8
max_distance_from_cp_nm: 25
engagement_range_nm: 35
min_patrol_altitude_ft_msl: 10000
max_patrol_altitude_ft_msl: 24000
cas:
duration_minutes: 30
sweep:
distance_nm: 40
ground_unit_procurement_ratios:
Tank: 4
ATGM: 2
@@ -30,3 +27,8 @@ ground_unit_procurement_ratios:
Artillery: 1
SHORAD: 2
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
cap: true
cas: true
sead: true
strike: true
antiship: true
rendezvous_altitude_ft_msl: 25000
hold_distance_nm: 25
push_distance_nm: 20
join_distance_nm: 20
max_ingress_distance_nm: 45
min_ingress_distance_nm: 10
ingress_altitude_ft_msl: 20000
min_patrol_altitude_ft_msl: 15000
max_patrol_altitude_ft_msl: 33000
pattern_altitude_ft_msl: 5000
cap_duration_minutes: 30
cap_min_track_length_nm: 15
cap_max_track_length_nm: 40
cap_min_distance_from_cp_nm: 10
cap_max_distance_from_cp_nm: 40
cap_engagement_range_nm: 50
cas_duration_minutes: 30
sweep_distance_nm: 60
rendezvous_altitude_ft_msl: 25000
combat_altitude_ft_msl: 20000
cap:
duration_minutes: 30
min_track_length_nm: 15
max_track_length_nm: 40
min_distance_from_cp_nm: 10
max_distance_from_cp_nm: 40
engagement_range_nm: 50
min_patrol_altitude_ft_msl: 15000
max_patrol_altitude_ft_msl: 33000
cas:
duration_minutes: 30
sweep:
distance_nm: 60
ground_unit_procurement_ratios:
Tank: 3
ATGM: 2
@@ -30,3 +27,7 @@ ground_unit_procurement_ratios:
Artillery: 1
SHORAD: 2
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
cap: true
cas: true
sead: false
strike: true
antiship: true
hold_distance_nm: 10
push_distance_nm: 5
join_distance_nm: 5
rendezvous_altitude_ft_msl: 10000
max_ingress_distance_nm: 7
min_ingress_distance_nm: 5
ingress_altitude_ft_msl: 8000
min_patrol_altitude_ft_msl: 4000
max_patrol_altitude_ft_msl: 15000
pattern_altitude_ft_msl: 5000
cap_duration_minutes: 30
cap_min_track_length_nm: 8
cap_max_track_length_nm: 18
cap_min_distance_from_cp_nm: 0
cap_max_distance_from_cp_nm: 5
cap_engagement_range_nm: 20
cas_duration_minutes: 30
sweep_distance_nm: 10
rendezvous_altitude_ft_msl: 10000
combat_altitude_ft_msl: 8000
cap:
duration_minutes: 30
min_track_length_nm: 8
max_track_length_nm: 18
min_distance_from_cp_nm: 0
max_distance_from_cp_nm: 5
engagement_range_nm: 20
min_patrol_altitude_ft_msl: 4000
max_patrol_altitude_ft_msl: 15000
cas:
duration_minutes: 30
sweep:
distance_nm: 10
ground_unit_procurement_ratios:
Tank: 3
ATGM: 3
@@ -29,3 +26,7 @@ ground_unit_procurement_ratios:
Artillery: 1
SHORAD: 3
Recon: 1
helicopter:
combat_altitude_ft_agl: 200
rendezvous_altitude_ft_agl: 1500
air_assault_nav_altitude_ft_agl: 1500

View File

@@ -1,10 +1,9 @@
---
country: Australia
name: Australia 2005
authors: Khopa, SpaceEnthusiast
description:
<p>The Australian army in 2005.</p><p>Some units might not be accurate,
but were picked to represent at best this army.</p>
authors: 'Khopa, SpaceEnthusiast'
description: >-
<p>The Australian army in 2005.</p><p>Some units might not be accurate, but
were picked to represent at best this army.</p>
aircrafts:
- AH-1W SuperCobra
- C-130J-30 Super Hercules
@@ -39,7 +38,7 @@ missiles: []
air_defense_units:
- SAM Hawk SR (AN/MPQ-50)
requirements:
C-130J-30 Super Hercules Mod by Anubis: https://forums.eagle.ru/topic/252075-dcs-super-hercules-mod-by-anubis/
C-130J-30 Super Hercules Mod by Anubis: 'https://forums.eagle.ru/topic/252075-dcs-super-hercules-mod-by-anubis/'
carrier_names: []
helicopter_carrier_names:
- HMAS Canberra

View File

@@ -0,0 +1,54 @@
country: Australia
name: Australia 2009
authors: 'Khopa, SpaceEnthusiast, Chilli'
description: >-
<p>The Australian army in 2005.</p><p>Some units might not be accurate, but
were picked to represent at best this army.</p>
aircrafts:
- AH-1W SuperCobra
- C-130J-30 Super Hercules
- F/A-18C Hornet (Lot 20)
- F/A-18F Super Hornet
- EA-18G Growler
- SH-60B Seahawk
- UH-1H Iroquois
awacs:
- E-3A
tankers:
- KC-130
- KC-135 Stratotanker
frontline_units:
- FV510 Warrior
- LAV-25
- Leopard 1A3
- M113
- M1A2 Abrams
artillery_units: []
logistics_units:
- Truck M818 6x6
infantry_units:
- Infantry M249
- Infantry M4
- MANPADS Stinger
preset_groups:
- Hawk
- Rapier
naval_units:
- DDG Arleigh Burke IIa
- LHA-1 Tarawa
missiles: []
air_defense_units:
- SAM Hawk SR (AN/MPQ-50)
requirements:
C-130J-30 Super Hercules Mod by Anubis: 'https://forums.eagle.ru/topic/252075-dcs-super-hercules-mod-by-anubis/'
carrier_names: []
helicopter_carrier_names:
- HMAS Canberra
- HMAS Adelaide
has_jtac: true
jtac_unit: MQ-9 Reaper
liveries_overrides:
F/A-18C Hornet (Lot 20):
- Australian 75th Squadron
- Australian 77th Squadron
unrestricted_satnav: true

View File

@@ -1,6 +1,6 @@
---
country: Egypt
name: Egypt 2000s
name: Egypt 2000
authors: Starfire
description: <p>Egyptian military in the 21st century.</p>
locales:

View File

@@ -1,4 +1,3 @@
---
country: USA
name: US Navy 2005
authors: Fuzzle
@@ -8,6 +7,8 @@ locales:
aircrafts:
- F-14B Tomcat
- F/A-18C Hornet (Lot 20)
- F/A-18E Super Hornet
- F/A-18F Super Hornet
- AV-8B Harrier II Night Attack
- AH-1W SuperCobra
- S-3B Viking

View File

@@ -0,0 +1,76 @@
country: USA
name: US Navy 2009
authors: Fuzzle, Chili
description: <p>A modern representation of the US Navy/Marine Corps.</p>
locales:
- en_US
aircrafts:
- F/A-18C Hornet (Lot 20)
- F/A-18E Super Hornet
- F/A-18F Super Hornet
- EA-18G Growler
- AV-8B Harrier II Night Attack
- AH-1W SuperCobra
- S-3B Viking
- SH-60B Seahawk
- UH-1H Iroquois
awacs:
- E-2C Hawkeye
tankers:
- S-3B Tanker
frontline_units:
- M113
- M1043 HMMWV (M2 HMG)
- M1045 HMMWV (BGM-71 TOW)
- M1A2 Abrams
- LAV-25
- M163 Vulcan Air Defense System
artillery_units:
- M270 Multiple Launch Rocket System
logistics_units:
- Truck M818 6x6
infantry_units:
- Infantry M4
- Infantry M249
- MANPADS Stinger
preset_groups:
- Hawk
- Patriot
naval_units:
- FFG Oliver Hazard Perry
- DDG Arleigh Burke IIa
- CG Ticonderoga
- LHA-1 Tarawa
- CVN-74 John C. Stennis
missiles: []
air_defense_units:
- SAM Hawk SR (AN/MPQ-50)
- M163 Vulcan Air Defense System
- M48 Chaparral
requirements: {}
carrier_names:
- CVN-71 Theodore Roosevelt
- CVN-72 Abraham Lincoln
- CVN-73 George Washington
- CVN-74 John C. Stennis
- CVN-75 Harry S. Truman
helicopter_carrier_names:
- LHA-1 Tarawa
- LHA-2 Saipan
- LHA-3 Belleau Wood
- LHA-4 Nassau
- LHA-5 Peleliu
has_jtac: true
jtac_unit: MQ-9 Reaper
doctrine: modern
liveries_overrides:
F-14B Tomcat:
- VF-142 Ghostriders
F/A-18C Hornet (Lot 20):
- VMFA-251 high visibility
AV-8B Harrier II Night Attack:
- VMAT-542
AH-1W SuperCobra:
- Marines
UH-1H Iroquois:
- US NAVY

View File

@@ -11,6 +11,7 @@ kill_events = {} -- killed units will be added via S_EVENT_KILL
base_capture_events = {}
destroyed_objects_positions = {} -- will be added via S_EVENT_DEAD event
killed_ground_units = {} -- keep track of static ground object deaths
unit_hit_point_updates = {} -- stores updates to unit hit points, triggered by S_EVENT_HIT
mission_ended = false
local function ends_with(str, ending)
@@ -41,6 +42,7 @@ function write_state()
["mission_ended"] = mission_ended,
["destroyed_objects_positions"] = destroyed_objects_positions,
["killed_ground_units"] = killed_ground_units,
["unit_hit_point_updates"] = unit_hit_point_updates,
}
if not json then
local message = string.format("Unable to save DCS Liberation state to %s, JSON library is not loaded !", _debriefing_file_location)
@@ -146,6 +148,14 @@ write_state_error_handling = function()
mist.scheduleFunction(write_state_error_handling, {}, timer.getTime() + WRITESTATE_SCHEDULE_IN_SECONDS)
end
function update_hit_points(event)
local update = {}
update.name = event.target:getName()
update.hit_points = event.target:getLife()
unit_hit_point_updates[#unit_hit_point_updates + 1] = update
write_state()
end
activeWeapons = {}
local function onEvent(event)
if event.id == world.event.S_EVENT_CRASH and event.initiator then
@@ -175,6 +185,15 @@ local function onEvent(event)
destroyed_objects_positions[#destroyed_objects_positions + 1] = destruction
write_state()
end
if event.id == world.event.S_EVENT_HIT then
target_category = event.target:getCategory()
if target_category == Object.Category.UNIT then
-- check on the health of the target 1 second after as the life value is sometimes not updated
-- at the time of the event
timer.scheduleFunction(update_hit_points, event, timer.getTime() + 1)
end
end
if event.id == world.event.S_EVENT_MISSION_END then
mission_ended = true

View File

@@ -1 +0,0 @@
../../submodules/dcs/dcs

1
resources/tools/dcs Normal file
View File

@@ -0,0 +1 @@
../../submodules/dcs/dcs

View File

@@ -80,6 +80,14 @@ def beacons_from_terrain(dcs_path: Path, path: Path) -> Iterable[tuple[str, Beac
)
)
lua.execute(
textwrap.dedent(
"""
function math.pow(x,y) return x^y end
"""
)
)
bind_gettext = lua.eval(
textwrap.dedent(
"""\

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

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